# Billing Source: https://docs.coreweave.com/billing Learn how to manage your billing in the Cloud Console Monitoring your usage and costs helps you understand and manage your CoreWeave spending. If you administer CoreWeave Infrastructure and Forge together, see [CoreWeave Infrastructure and Forge billing](/billing/coreweave-and-forge-billing) for which types of charges belong in which billing system and where each billing task belongs. If you have the required permissions, you can access the following billing resources in the Cloud Console: * [Billing insights](/billing/billing-insights): View billable resource usage and consumption breakdowns by resource type. You can also [export usage programmatically with the FOCUS API](/billing/focus-export-api) (Public Preview), or [find your usage and costs in the Managed Grafana Cost and Usage product zone](/observability/managed-grafana/cost-usage/usage-product-zone). If you need help with billing, you can contact the support team at `support@coreweave.com`. # Billing insights Source: https://docs.coreweave.com/billing/billing-insights View billable usage, measured usage, and exclusions by resource type and capacity plan in the Cloud Console The **Billing insights** page in the Cloud Console is a built-in view that helps you understand billable usage, how it compares to total measured usage, and where exclusions apply across your workloads. Use it to audit your invoice, verify how exclusions affect your charges, or identify usage trends across clusters and zones. To open the page, go directly to [Billing insights](https://console.coreweave.com/billing/insights), or log in to the Cloud Console and navigate to **Administration** > **Billing** > **Billing insights**. The page organizes the same billable usage into two tabs: * **Usage by resource type** breaks usage down by GPU, CPU, storage, and network. * **Usage by capacity plan** breaks GPU and CPU usage down by [capacity plan](/platform/capacity-plans): Reserved Instances, On-Demand, Spot, and Flex. Both tabs share the same date range. The **Cluster** and **Zone** filters apply only to the **Usage by resource type** tab. ## Permissions The Cloud Console only displays the **Billing insights** page if you have the required role. The following role or legacy group allows access: * The `Billing Viewer` role in an [IAM Access Policy](/security/iam/access-policies) * The legacy `billing_viewer` group An organization administrator can assign roles to other users. To manage permissions, see [User Permissions](/security/authn-authz/manage-users). ## Filters and date range At the top of the page you can scope and filter the data: * **Cluster** and **Zone** dropdowns to limit usage to specific infrastructure. Both dropdowns are available only on the **Usage by resource type** tab. The date range applies to both tabs. * **Date range picker** with quick options: **MTD** (Month to date), **Last 7 days**, **Last 30 days**, and **Last month** (the previous calendar month). * A note showing the billing day window (for example, "Billing day runs from 5:00 PM to 5:00 PM ET"). ## Usage by resource type On the **Usage by resource type** tab, usage is grouped into four resource categories, each displayed as a collapsible card: | Resource type | Unit | | - | - | | **GPUs** | instance-hours | | **CPUs** | instance-hours | | **Storage** | GiB-hours | | **Network** | address-hours | ### Resource cards Expanding a resource card reveals three metrics for the selected time period: * **Billable usage**: The amount that appears on your invoice, after exclusions. * **Measured usage**: Total metered usage before any exclusions are applied. * **Excluded**: The portion of measured usage removed from billing, shown in both absolute units and as a percentage of measured usage. Below the metrics, a stacked bar chart shows billable usage over time, broken down by SKU. A dotted trend line shows total measured usage for comparison. The legend lists each SKU and zone combination. Select **View full summary** within a card to see a detailed breakdown for that resource type. ![An expanded GPU resource usage card showing billable, measured, and excluded metrics alongside a stacked bar chart](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/billing/_media/billing-insights-resource-card-gpu.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=7d2b8bbe15894fb73b4a7889f5eaa51f) Hover over the chart to see per-day, per-SKU breakdowns and which portion of usage was excluded versus billable. ![An expanded CPU resource usage card showing billable, measured, and excluded metrics alongside a stacked bar chart with hover details on one date](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/billing/_media/billing-insights-resource-card-cpu-hover.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=5aa54e9731d5c3102f1185c85dac0dea) ### Product exclusions summary The **Product exclusions summary** table at the bottom of the page shows a row for each exclusion applied during the selected time range: | Column | Description | | - | - | | **Product** | The SKU or product to which the exclusion applies | | **Type** | The resource category (GPU, CPU, Storage, or Network) | | **Measured** | Total measured usage for that product in the selected period | | **Excluded** | The amount of measured usage excluded from billing | | **Billable** | The remaining usage that is billable after exclusions | | **Exclusion reason** | Why the exclusion was applied | | **Percent excluded** | The fraction of measured usage that was excluded | > [!NOTE] > > All values are scoped to the currently selected environment, clusters, zones, and time range. Changing any filter recalculates the totals and charts. > > Exclusions are visible only after they have been configured and applied by CoreWeave. If you expect an exclusion and don't see it, contact support or your account team. ## Usage by capacity plan The **Usage by capacity plan** tab groups your billable GPU and CPU usage by capacity plan instead of by resource type. Use it to see how your consumption is distributed across Reserved Instances, On-Demand, Spot, and Flex for the selected period. This tab uses the same date range as the Usage by resource type tab. The **Cluster** and **Zone** filters don't apply here. The tab has three sections: summary cards, usage charts, and a breakdown by product. ### Summary cards The tab shows one card per capacity plan: **Reserved instance**, **On-demand**, **Spot**, and **Flex**. Each card reports, for the selected period: * **GPU** billable hours and their percentage of the GPU total across all plans. * **CPU** billable hours and their percentage of the CPU total across all plans. The **Reserved instance** and **On-demand** cards always show metrics, even at zero hours. The **Spot** and **Flex** cards instead show an empty state when you have no GPU or CPU usage under that plan. Each empty state includes a short description of the plan and a **Learn more in the docs** link: the **Spot** card links to [Spot Node Pools](/platform/capacity-plans/spot-node-pools), and the **Flex** card links to [Flex Reservations](/platform/capacity-plans#flex-reservations). The **Spot** card also links to [Capacity Finder](/platform/capacity-plans/capacity-finder) to search for Spot capacity, and the **Flex** card prompts you to contact your Account Executive or Solutions Architect to add Flex to your capacity plan. ### Usage charts Two stacked bar charts show daily billable instance-hours, broken down by capacity plan: * **GPU usage by capacity plan**: daily billable GPU instance-hours stacked by plan. * **CPU usage by capacity plan**: daily billable CPU instance-hours stacked by plan. The legend is interactive. Select a plan name to toggle its series on or off in the chart. ### Breakdown by product The **Breakdown by product** table lists total billable hours per SKU across all capacity plans for the selected period: | Column | Description | | - | - | | **Product** | The SKU or product | | **Type** | The resource category (GPU, CPU, Storage, or Network) | | **Reserved instance** | Billable hours attributed to a Reserved Instance | | **On-demand** | Billable hours attributed to On-Demand | | **Spot** | Billable hours attributed to Spot | | **Flex** | Billable hours attributed to a Flex Reservation | | **Total** | The sum of billable hours across all plans for that SKU | You can sort the table by any column. For details on how usage is attributed across plans, including the order in which Reserved Instance, Flex, and On-Demand capacity is filled, see [About capacity plans](/platform/capacity-plans). ## Key concepts The following concepts describe the metrics used throughout this page. **Measured usage** is the raw metered consumption for a given resource and SKU over the selected time window. This is the **Total measured** series shown in the charts. **Billable usage** is the portion of measured usage that appears on your invoice. It equals measured usage minus any exclusions. **Excluded usage** is usage that was measured but explicitly removed from billing, for example for a proof of concept, a credit, or a make-good. The Product exclusions summary table shows the line-item details for each exclusion, including the reason and the percentage of measured usage that was excluded. ## Related resources The following resources provide additional context for billing and access management: * [Export usage with the FOCUS API](/billing/focus-export-api) (Public Preview) to pull the same billable usage programmatically in FOCUS JSON or CSV format. * The Grafana dashboard [Usage by Product and Zone](/observability/managed-grafana/cost-usage/usage-product-zone) shows detailed resource consumption metrics. * The [IAM Access Policies](/security/iam/access-policies) page covers managing user roles and permissions. # CoreWeave Infrastructure and Forge billing Source: https://docs.coreweave.com/billing/coreweave-and-forge-billing How Infrastructure and Forge billing relate and where you manage each one Use this page to understand the CoreWeave Infrastructure and CoreWeave Forge billing systems, what each covers, and where each billing task belongs. This page is for administrators who manage spend on either platform or both. The two systems stay separate. Each has its own billing page, permissions, usage views, and invoices, so a Forge invoice doesn't include CoreWeave Infrastructure usage. To understand which access system governs a given resource, see [Forge and CoreWeave identity](/security/forge-identity-and-access). ## Where to manage billing Use the following table to find where each billing task belongs: | Task | Where | | - | - | | Review CoreWeave Infrastructure usage and costs | [Billing](/billing) and [Billing insights](/billing/billing-insights) | | Export CoreWeave Infrastructure usage programmatically | [FOCUS usage export API](/billing/focus-export-api) | | Grant permission to view CoreWeave billing | [CoreWeave IAM Access Policies](/security/iam/access-policies) ([Billing Viewer](/security/iam/access-policies/roles#billing) role) | | Review Forge plan, usage, and spending alerts | [Forge billing settings](/products/wandb/platform/app/settings-page/billing-settings) | | Manage Forge payment methods, billing admin, and invoices | [Forge billing settings](/products/wandb/platform/app/settings-page/billing-settings) | | Ask about CoreWeave Infrastructure billing | `support@coreweave.com` | | Ask about Forge billing | `forge-support@coreweave.com` | ## What each billing system covers The following list describes what each billing system covers: * **CoreWeave Infrastructure** bills for Cloud Console resources: CKS compute, capacity plans, Object Storage, and network usage. Review those charges in the [Cloud Console](/billing). * **CoreWeave Forge** bills for the Forge organization plan and the Forge usage categories shown in billing settings. Those categories can include storage, Weights & Biases tracked hours, Weave, Serverless Inference, Training, ARIA, and Sandboxes when the usage is billed to the Forge organization. Some products can bill through either system, depending on how you run them. The following sections cover those cases. ### Sandboxes Serverless sandboxes accept two credentials. Which account the sandbox belongs to and bills to depends on the credential you present: | Credential | Billed through | | - | - | | CoreWeave API access token | CoreWeave Infrastructure | | Forge API key | Forge | For details, see [Choose a credential](/products/sandboxes/get-started#choose-a-credential). ### Inference Inference billing depends on the deployment option: | Deployment option | Billed through | | - | - | | Serverless Inference | Forge (pay-per-token) | | Dedicated Inference | CoreWeave Infrastructure (GPU-hour or node-based, depending on your contract) | | Inference on CKS | CoreWeave Infrastructure (standard CKS billing) | For details, see [Inference pricing](/products/inference#pricing) and [Dedicated Inference billing](/products/inference/billing). ## Manage billing across both platforms If your organization uses both platforms, review billing separately in each one. CoreWeave Infrastructure and Forge don't share invoices, payment methods, usage alerts, or billing permissions. * **Permissions.** CoreWeave uses the [Billing Viewer](/security/iam/access-policies/roles#billing) IAM role and related legacy groups. Forge uses [organization admin](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-users) and [billing admin](/products/wandb/platform/app/settings-page/billing-settings#billing-admin) roles inside Forge. Holding one role doesn't grant the other. * **Usage and alerts.** CoreWeave billing insights cover infrastructure usage. Forge usage and spending alerts cover Forge plan categories. Configure and review each set of alerts in its own system. * **Payment methods.** Add and update payment methods in each platform's billing page. A payment method on file for Forge doesn't apply to CoreWeave Infrastructure, and vice versa. * **Invoices.** A Forge invoice doesn't include CoreWeave Infrastructure usage, and a CoreWeave Infrastructure invoice doesn't include Forge plan charges. Reconcile spend by checking both billing pages when you use both platforms. > [!NOTE] > > Invoice separation, payment methods, usage alerts, and billing permissions are subject to change. ### Multi-tenant Forge deployments The guidance on this page applies to multi-tenant Forge. W\&B Dedicated Cloud and W\&B Self-Managed deployments keep their existing billing configuration. See [Deployment options](/products/wandb/platform/hosting/hosting-options). ## Related resources The following pages cover related billing and access topics: * [Billing](/billing): Manage CoreWeave Infrastructure usage and costs in the Cloud Console. * [Forge billing settings](/products/wandb/platform/app/settings-page/billing-settings): Review the Forge plan, usage, alerts, payment methods, and invoices. * [Forge and CoreWeave identity](/security/forge-identity-and-access): Understand how the two identity systems relate and where each administrative task belongs. * [Get started with CoreWeave Sandboxes](/products/sandboxes/get-started): Choose the credential that determines which account a serverless sandbox bills to. * [What moved in CoreWeave Forge](/forge-whats-moved): Find projects, settings, and account locations in Forge if you already use Weights & Biases. # Export usage with the FOCUS API Source: https://docs.coreweave.com/billing/focus-export-api Pull hourly CoreWeave usage in FOCUS JSON or CSV format (Public Preview) The FOCUS Billing Export API lets you pull your CoreWeave usage data in [FinOps Open Cost and Usage Specification (FOCUS)](https://focus.finops.org/) format. Use it to load CoreWeave usage into a data warehouse or FinOps tool alongside exports from other cloud providers. This page shows you how to make a request, set query parameters, and interpret the JSON or CSV response. The API returns the same billable usage you see in [Billing insights](/billing/billing-insights), at hourly grain, as JSON or CSV. > [!WARNING] > > The FOCUS Billing Export API is in public preview. Schema details and behavior may change before general availability. If you receive unexpected values, numbers that don't reconcile with [Billing insights](/billing/billing-insights), errors, or slow responses, [contact Support](/support). > > In this public preview, the FOCUS Billing Export API returns usage for [CoreWeave Kubernetes Service (CKS)](/products/cks) only. ## Scope This public preview includes the following: * Usage quantities at hourly grain (for example, GPU-hours, GiB-hours, and IP-hours) * Filters for time range, product family, cluster, and zone * JSON and CSV response formats * Pagination for large results This public preview doesn't include the following: * Cost or dollar amounts. This release returns usage quantities only. Cost fields such as billed or effective cost are planned for a later release on the same schema. * Project-level attribution or resource tags. * Per-resource or per-node rows. Usage is aggregated. See [Data grain](#data-grain). The following FOCUS fields are `null` in this release: `ChargeClass`, `ChargeDescription`, and `ResourceType`. ## Prerequisites Before you call the API, make sure you have the following: * A [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens#create-a-new-api-access-token) associated with a user or service account that has the [Billing Viewer](/security/iam/access-policies/roles#billing) role. Store the token securely. * FOCUS export enabled for your organization. If you receive a `403 Forbidden` response after assigning the Billing Viewer role, [contact Support](/support) to request access. The token is scoped to your organization, so you don't pass an organization identifier in the request. The API returns results for the account associated with the token. ## Make your first request The export endpoint is: ```text theme={"system"} GET https://api.coreweave.com/v1/billing/focus ``` To confirm access and inspect the response shape, send a request to the export endpoint. This default example without any parameters returns the last seven days of usage grouped by location, as JSON. In the `Authorization` header, pass your token. Replace `[API-ACCESS-TOKEN]` with your CoreWeave API access token: ```bash theme={"system"} export CW_FOCUS_TOKEN="[API-ACCESS-TOKEN]" curl -sS \ -H "Authorization: Bearer $CW_FOCUS_TOKEN" \ "https://api.coreweave.com/v1/billing/focus" ``` The following example requests a specific month, groups by capacity plan, and saves CSV output to a file: ```bash theme={"system"} curl -sS -G "https://api.coreweave.com/v1/billing/focus" \ -H "Authorization: Bearer $CW_FOCUS_TOKEN" \ --data-urlencode "start_time=2026-07-01T00:00:00Z" \ --data-urlencode "end_time=2026-08-01T00:00:00Z" \ --data-urlencode "group_by=capacity_plan" \ --data-urlencode "format=csv" \ -o coreweave-focus-2026-07.csv ``` A successful request returns FOCUS usage rows for the window you requested. ## Query parameters All parameters are optional. Times use ISO 8601 in UTC. | Parameter | Type | Default | Notes | | - | - | - | - | | `start_time` | ISO 8601 (UTC) | Now minus 7 days, top of the hour | Inclusive lower bound for `ChargePeriodStart`. | | `end_time` | ISO 8601 (UTC) | Now, top of the hour | Exclusive upper bound for `ChargePeriodStart`. Must be after `start_time`. | | `group_by` | `enum` | `location` | `location` or `capacity_plan`. See [Data grain](#data-grain). | | `product_family` | `enum` | all | One of `GPU Compute`, `CPU Compute`, `Storage`, `Network`, or `Other`. | | `cluster` | `string` | all | Matches `x_ClusterId`. Valid only with `group_by=location`. | | `zone` | `string` | all | Matches `AvailabilityZone` case-insensitively (for example, `us-east-01a`). Valid only with `group_by=location`. | | `format` | `enum` | `json` | `json` or `csv`. | | `page_size` | `integer` (1 to 1,000) | `100` | Rows per page. The API clamps values outside the range to `[1, 1000]`. | | `page_token` | `string` | (first page) | Cursor for the next page. See [Pagination](#pagination). | The following constraints apply: * The time range can't exceed 90 days per request. * Historical data begins with the January 2026 invoice month, at `2025-12-31T22:00:00Z` (5:00 PM ET). Earlier window bounds are clamped to that timestamp. A window entirely before it returns an empty page. ## Response A successful response includes metadata and usage rows as JSON. When you set `format=csv`, the response is a CSV file. The following sections describe the JSON envelope, the row schema, data grain, and pagination. ### JSON envelope A successful JSON response has this shape: ```json theme={"system"} { "data_as_of": "2026-08-25T15:00:00Z", "query": { "start_time": "2026-07-01T00:00:00Z", "end_time": "2026-08-01T00:00:00Z", "group_by": "capacity_plan", "product_family": null, "cluster": null, "zone": null, "format": "json" }, "next_page_token": "", "data_generator": { "DataGenerator": "CoreWeave" }, "schema": { "SchemaId": "25388bec-b197-406f-ba22-b13e3afd9495", "FocusVersion": "1.0", "CreationDate": "2026-09-24T00:00:00Z", "ColumnDefinition": [ {"ColumnName": "AvailabilityZone", "DataType": "STRING"}, {"ColumnName": "BillingAccountId", "DataType": "STRING"}, {"ColumnName": "BillingAccountName", "DataType": "STRING"}, {"ColumnName": "BillingPeriodEnd", "DataType": "DATETIME"}, {"ColumnName": "BillingPeriodStart", "DataType": "DATETIME"}, {"ColumnName": "ChargeCategory", "DataType": "STRING"}, {"ColumnName": "ChargeClass", "DataType": "STRING"}, {"ColumnName": "ChargeDescription", "DataType": "STRING"}, {"ColumnName": "ChargeFrequency", "DataType": "STRING"}, {"ColumnName": "ChargePeriodEnd", "DataType": "DATETIME"}, {"ColumnName": "ChargePeriodStart", "DataType": "DATETIME"}, {"ColumnName": "ConsumedQuantity", "DataType": "DECIMAL"}, {"ColumnName": "ConsumedUnit", "DataType": "STRING"}, {"ColumnName": "InvoiceIssuerName", "DataType": "STRING"}, {"ColumnName": "PricingCategory", "DataType": "STRING"}, {"ColumnName": "PricingQuantity", "DataType": "DECIMAL"}, {"ColumnName": "PricingUnit", "DataType": "STRING"}, {"ColumnName": "ProviderName", "DataType": "STRING"}, {"ColumnName": "PublisherName", "DataType": "STRING"}, {"ColumnName": "RegionId", "DataType": "STRING"}, {"ColumnName": "RegionName", "DataType": "STRING"}, {"ColumnName": "ResourceType", "DataType": "STRING"}, {"ColumnName": "ServiceCategory", "DataType": "STRING"}, {"ColumnName": "ServiceName", "DataType": "STRING"}, {"ColumnName": "SkuId", "DataType": "STRING"}, {"ColumnName": "x_CapacityPlan", "DataType": "STRING"}, {"ColumnName": "x_ClusterId", "DataType": "STRING"}, {"ColumnName": "x_ClusterName", "DataType": "STRING"}, {"ColumnName": "x_ProductFamily", "DataType": "STRING"} ] }, "data": [] } ``` | Field | Description | | - | - | | `data_generator` | Producer metadata. `DataGenerator` is `CoreWeave`. | | `schema` | Row-schema metadata: `SchemaId`, `FocusVersion`, `CreationDate`, and `ColumnDefinition`. Each column definition has `ColumnName` and `DataType`. The schema ID and creation date change when the row structure changes. | | `data_as_of` | The timestamp through which data is complete. Hourly aggregates lag the underlying data slightly. If you pull the same recent window twice, you may get small differences until the data settles. | | `query` | The effective parameters after defaults and validation. Unset filters echo as `null`. `group_by` always shows the active view. | | `next_page_token` | Non-empty when more pages exist. An empty string on the final page. See [Pagination](#pagination). | | `data` | The usage rows. | ### Row schema Each row is one hourly usage bucket. Columns follow FOCUS 1.0 naming. CoreWeave-specific columns use the `x_` prefix per the FOCUS convention. The `schema` object identifies the row schema and column types. | Column | Meaning | | - | - | | `BillingAccountId` / `BillingAccountName` | Your CoreWeave organization ID / name. | | `BillingPeriodStart` / `BillingPeriodEnd` | The monthly invoice period this usage falls in (UTC). CoreWeave's invoice boundary is 5:00 PM ET on the last day of the month. | | `ChargePeriodStart` / `ChargePeriodEnd` | The hourly usage window, `[start, end)`, aligned to the top of the hour in UTC. | | `ChargeCategory` | `Usage` for all rows in this release. | | `ChargeClass` | `null` in this release. | | `ChargeDescription` | `null` in this release. | | `ChargeFrequency` | `Usage-Based` for all rows in this release. | | `ConsumedQuantity` | Measured usage before exclusions in the location view. In the capacity-plan view, this equals `PricingQuantity`. | | `ConsumedUnit` | The unit for `ConsumedQuantity`, which is the same as `PricingUnit`. | | `PricingQuantity` | Billable usage in this bucket for the hour, summed across all nodes and resources, after exclusions. | | `PricingUnit` | The unit for `PricingQuantity`: `GPU-Hours`, `vCPU-Hours`, `GiB-Hours`, `IP-Hours`, or `Instance-Hours`, based on the SKU unit type. | | `PricingCategory` | Rate class derived from capacity plan: `Standard` (`On-Demand`), `Committed` (`Reservation` and `Flex-Usage`), or `Dynamic` (`Spot`). `null` in the location view. | | `ServiceCategory` / `ServiceName` | For example, `Compute` / `GPU Compute`, or `Storage` / `Object Storage`. | | `SkuId` | The CoreWeave SKU (for example, `gd-8xh100ib-i128`). | | `AvailabilityZone` | Availability Zone identifier, such as `us-east-04a`. `null` in the `capacity_plan` view. | | `RegionId` | Region identifier, such as `us-east-04`. `null` in the `capacity_plan` view. | | `RegionName` | Region display name, such as `United States (us-east-04)`. May contain only the region identifier. `null` in the `capacity_plan` view. | | `ResourceType` | `null` in this release. | | `InvoiceIssuerName` / `ProviderName` / `PublisherName` | Constants: `CoreWeave, Inc.` / `CoreWeave` / `CoreWeave`. | | `x_CapacityPlan` | CoreWeave extension: `On-Demand`, `Reservation`, `Spot`, or `Flex-Usage`. `null` in the location view. | | `x_ClusterId` / `x_ClusterName` | CoreWeave extension: cluster identifier / name. `null` in the `capacity_plan` view. | | `x_ProductFamily` | CoreWeave extension: `GPU Compute`, `CPU Compute`, `Storage`, `Network`, or `Other`. | Some fields may be `null` during the public preview. If a field you need is empty, [contact Support](/support). ### Data grain The API offers the following mutually exclusive views. Use `group_by` to select one: * `group_by=location` (default): one row per `(hour, zone, cluster, SKU)`. Location is a physical property of the usage. `x_CapacityPlan` and `PricingCategory` are `null` in this view. * `group_by=capacity_plan`: one row per `(hour, SKU, capacity plan)`. Capacity plan (`On-Demand`, `Reservation`, `Spot`, or `Flex-Usage`) is a rating-time property of your organization's usage. It can't be tied to a specific location, so `AvailabilityZone`, `RegionId`, `RegionName`, `x_ClusterId`, and `x_ClusterName` are `null` in this view. Usage quantities are summed across all nodes and resources in the bucket. The API never emits per-node rows. The two views are pivots of the same underlying usage. For any given hour and SKU, the total `PricingQuantity` is identical across both views. ### Pagination The API paginates results (default 100 rows per page, maximum 1,000). A non-empty `next_page_token` means more data exists. Pass that value back as `page_token` until the token is empty. Keep the original time range, grouping, and filters unchanged between pages. You can change `page_size` or `format`. Use explicit timestamps while paging so the default time window doesn't move between requests. To fetch the next page: * Replace `[PAGE-TOKEN]` with the `next_page_token` value from the previous response. ```bash theme={"system"} curl -sS -G "https://api.coreweave.com/v1/billing/focus" \ -H "Authorization: Bearer $CW_FOCUS_TOKEN" \ --data-urlencode "start_time=2026-07-01T00:00:00Z" \ --data-urlencode "end_time=2026-08-01T00:00:00Z" \ --data-urlencode "group_by=capacity_plan" \ --data-urlencode "format=json" \ --data-urlencode "page_size=1000" \ --data-urlencode "page_token=[PAGE-TOKEN]" ``` The API returns response metadata in different locations for JSON and CSV: | Metadata | JSON | CSV | | - | - | - | | Next page token | `next_page_token` in the response body. An empty string indicates the final page. | `X-Next-Page-Token` response header. | | Page size | Not returned separately. | `X-Page-Size` response header. | | Schema ID | `schema.SchemaId` in the response body and the `X-FOCUS-Schema-Id` response header. | `X-FOCUS-Schema-Id` response header. | | Data completeness | `data_as_of` in the response body. | `X-Data-As-Of` response header. The header is omitted when freshness is unavailable. | ## CSV format When you set `format=csv`, the API returns the following: * The response `Content-Type` is `text/csv; charset=utf-8`, delivered as a file attachment. * The first row is a header that uses exact FOCUS column names. All columns appear in both views. Columns that don't apply to the active view are left empty (not omitted), so the layout is stable. * Fields that contain commas, quotes, or newlines are double-quoted per RFC 4180. ## Errors The following example shows a JSON error response: ```json theme={"system"} { "error": "[ERROR-CODE]", "message": "[HUMAN-READABLE-EXPLANATION]" } ``` | HTTP status | `error` | When | | - | - | - | | `400 Bad Request` | `invalid_parameter` | Unparseable dates, `start_time` greater than or equal to `end_time`, range greater than 90 days, invalid `group_by`, or a `cluster` or `zone` filter used with `group_by=capacity_plan`. | | `401 Unauthorized` | `unauthorized` | Missing or invalid API token. | | `403 Forbidden` | `forbidden` | The user or service account associated with the token doesn't have the [Billing Viewer](/security/iam/access-policies/roles#billing) role, or FOCUS isn't enabled for your organization. If you receive this response after assigning the role, [contact Support](/support) to request access. The response may be plain text. | | `405 Method Not Allowed` | `method_not_allowed` | The API supports only `GET`. | | `429 Too Many Requests` | `rate_limited` | Per-organization rate limit exceeded. Wait for the interval in the `Retry-After` header before retrying. | ## Related resources For more information about billing usage and API access, see the following resources: * [Billing insights](/billing/billing-insights): View the same billable usage in the Cloud Console. * [Manage API access tokens](/security/authn-authz/manage-api-access-tokens): Create and manage tokens for API authentication. * [Usage by Product and Zone](/observability/managed-grafana/cost-usage/usage-product-zone): Grafana dashboards for cost and usage monitoring. * [FOCUS](https://focus.finops.org/): The FinOps Open Cost and Usage Specification. # Get started with CoreWeave Source: https://docs.coreweave.com/get-started Find your setup path and the right documentation for your CoreWeave workload. CoreWeave is a cloud platform purpose-built for AI and high-performance compute. CoreWeave Kubernetes Service (CKS) runs bare-metal clusters on our GPU and CPU fleet, enabling model training and inference at scale. SUNK is CoreWeave's solution for running Slurm on Kubernetes, providing Slurm-based job scheduling on top of CKS for distributed training workloads. This page orients you to the key concepts, tools, and setup paths, with links to full instructions for each. ## Start here Here's how to get started with CoreWeave. Each step jumps to the details further down this page. 1. **Set up your account and team.** Activate your account, invite users, and grant access with IAM Access Policies. See [Account setup](#account-setup). 2. **Set up your tools.** Install `kubectl` and Helm for CKS, or Git and SSH for SUNK. See [Environment setup](#environment-setup). 3. **Run a workload.** Deploy a model for inference on CKS, or run distributed training on SUNK. See [Run workloads](#run-workloads). 4. **Secure and connect.** Add VPCs, network policies, and private connectivity as you scale. See [Security and networking](#security-and-networking). 5. **Automate it.** Manage your infrastructure with the REST APIs, the Terraform provider, and CoreWeave Skills. See [Automate your solution](#automate-your-solution). ## Where common tasks live in the Console Use this table as a quick lookup for the most common tasks. Each row links to the page with full instructions. The [Cloud Console](https://console.coreweave.com) navigation evolves over time, so follow the linked pages rather than memorize menu positions. | Task | Where it lives | Reference | | :- | :- | :- | | Invite a teammate | Console: Organization, Users | [Invite users](#invite-users-and-manage-your-org) | | Grant or restrict access | IAM Access Policies | [IAM Access Policies](/security/iam/access-policies) | | Create an API token and kubeconfig | Console: Tokens | [Manage API access tokens](/security/authn-authz/manage-api-access-tokens) | | Create your first cluster | Console: Compute | [Create a CKS cluster](/products/cks/clusters/create) | | View resource quotas | Console: Organization, Quotas | [Quota self-service](/products/cks/clusters/quotas) | | Request more capacity | Account Executive or support | [About capacity plans](/platform/capacity-plans) | | View invoices and usage | Console: Billing | [Billing insights](/billing/billing-insights) | | Monitor workloads | CoreWeave Grafana | [CoreWeave Observe](/observability) | | Subscribe to platform incidents | `status.coreweave.com` | [Status page and incidents](/support/status-and-incidents) | | Open a support ticket | Console: Help | [Contact support](/support/contact) | ## Account setup Account activation and user invitation apply to all CoreWeave users. If your team uses SUNK, admins must also complete a separate [user provisioning step](#provision-users-for-sunk) before you can connect to Slurm login nodes over SSH. ### Activate your account When CoreWeave approves your organization, the CoreWeave Sales team sends an invitation email. Click **Activate** to access the [Cloud Console](https://console.coreweave.com). > [!NOTE] > > The first user invited becomes an administrator by default and can invite others. For more details, see [Activate and sign in to your CoreWeave organization](/security/authn-authz/activate-org). ### Invite users and manage your org Admins invite users from the [Users](https://console.coreweave.com/organization/users) page. New users click the invitation link and sign in with the same email used for the invite. To sync users and groups from your IdP (Okta, Microsoft Entra, and others) instead of inviting manually, use [Automated User Provisioning (AUP)](/security/automated-user-provisioning) with SCIM. This keeps your organization in sync with your identity provider. See the following guides for setup instructions: * [Configure AUP with Okta](/security/automated-user-provisioning/configure-okta) * [Configure AUP with Microsoft Entra](/security/automated-user-provisioning/configure-microsoft-entra) ### IAM and access policies Identity and Access Management (IAM) Access Policies define which users and groups can perform actions on platform services, such as creating and managing CKS clusters, managing IAM users and groups, and viewing billing. Admins create policies in the Cloud Console and assign roles to principals. The following services use their own separate authorization systems rather than IAM Access Policies: * [CoreWeave AI Object Storage](/products/storage/object-storage), which uses organization and bucket access policies. * [CKS clusters](/products/cks), which use Kubernetes RBAC. * [SUNK clusters](/products/sunk), which use [SUNK User Provisioning (SUP)](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning) rather than IAM Access Policies directly. See [IAM Access Policies](/security/iam/access-policies) for the full reference. ### Provision users for SUNK Users who need access to SUNK require additional provisioning beyond the standard Cloud Console invite: * An admin must enable SCIM API and SUNK User Provisioning in the Cloud Console. * Each user must add an SSH public key before they can connect to Slurm login nodes. See [Provision users in SUNK](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning) for the full setup, including IdP-based provisioning with AUP and `nsscache` configuration. ## Environment setup The tools you need depend on your path: * CKS users need `kubectl` and Helm. * SUNK end users need Git and SSH. * AI Object Storage is optional and works with both CKS and SUNK workloads. ### Kubernetes and kubectl (CKS) `kubectl` is the command-line tool for interacting with CKS clusters. To use it, you first need a cluster (see [Create a CKS cluster](/products/cks/clusters/create)). Once a cluster exists, install [kubectl](https://kubernetes.io/docs/tasks/tools/), then create an API access token and download the kubeconfig file from the [Tokens](https://console.coreweave.com/tokens) page in the Cloud Console. See [Manage API access tokens and kubeconfig files](/security/authn-authz/manage-api-access-tokens) for setup instructions. ### Helm (CKS) Helm is an admin and infrastructure tool that deploys CoreWeave-provided charts, including Traefik, cert-manager, and container registries. If you're an admin, [install Helm](https://helm.sh/docs/intro/install/) (3.8+). End users running workloads on CKS don't need Helm installed locally. See [CoreWeave Charts](/products/cks/clusters/coreweave-charts/introduction) for the available charts and how to add the repository to Helm. ### AI Object Storage AI Object Storage has an [S3-compatible API](/products/storage/object-storage/reference/object-storage-s3) that you can use with any S3-compatible client, such as the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [s3cmd](https://s3tools.org/download), or [Boto3](https://docs.aws.amazon.com/boto3/latest/guide/quickstart.html#installation). [LOTA](/products/storage/object-storage/improving-performance/about-lota) is an intelligent caching proxy installed on every Node that improves data transfer rates for training and inference workloads. When running workloads inside a CoreWeave cluster, use the LOTA endpoint (`http://cwlota.com`) instead of the primary endpoint (`https://cwobject.com`). Before creating buckets and objects, admins must configure access policies and authentication: * Create at least one organization access policy before any S3-compatible request can succeed. See [About policies](/products/storage/object-storage/auth-access/policies) for more information. * Choose how workloads authenticate: static access keys for simplicity and quick testing, or [Workload Identity Federation](/products/storage/object-storage/auth-access/workload-identity-federation/about) for production workloads that shouldn't rely on long-lived credentials. See [Get started with AI Object Storage](/products/storage/object-storage/get-started-caios) for authentication, policies, and full setup instructions. ### Git and SSH (SUNK) Use Git to clone training code and job scripts onto the login node or shared storage. SUNK end users connect to Slurm login nodes over SSH. SSH is typically pre-installed on macOS and Linux. On Windows, use [OpenSSH](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse) or enable it in **Settings**. See [Connect to the Slurm login node](/products/sunk/access_sunk/connect-to-slurm-login-node) for setup instructions. ### Documentation MCP server The CoreWeave documentation site exposes a Model Context Protocol (MCP) server endpoint that lets AI coding assistants query the docs directly in your development environment. (This is a separate control from the **Ask AI** button at the top of the page.) To connect your assistant, do the following: 1. Expand the **Copy MCP Server** menu at the top of any documentation page, to the right of the page title: ![Documentation MCP server menu](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/get-started/_media/docs-mcp-menu.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=571e09121103723fe20fca7cbca5e391) 2. Copy the MCP server URL to configure tools manually. Alternatively, you can install the MCP server on an IDE or install it locally. You can also copy or view the page content as Markdown, and launch the AI assistant chat window in your browser. ## Run workloads Choose your path based on your use case. ### Inference Deploy a model for inference on CKS. See [Deploy an open source LLM on CKS](/products/cks/deploy-model) for a complete walkthrough covering cluster setup and Open WebUI. ### Training Run multi-node, multi-GPU distributed training with Slurm on SUNK. See [Train on SUNK](/products/sunk/tutorials/train-on-sunk) for a complete walkthrough covering cluster setup, job submission, and monitoring. ## Security and networking Explore the following recommended functionality as you scale: * **VPCs**: [Virtual Private Clouds](/products/networking/vpc/about-vpcs) isolate clusters and control traffic. Use custom VPCs for multi-cluster communication, peering, or on-premises connectivity. * **Network policies**: [Deploy network policies](/security/tutorials/deploying-network-policies) to enforce Layer 4 and Layer 7 traffic rules at the DPU level. * **Direct Connect**: [Direct Connect](/products/networking/direct-connect/about-direct-connect) provides private, dedicated links to CoreWeave from Equinix or Megaport. * **HPC interconnect**: [GPUDirect RDMA with InfiniBand](/products/networking/hpc-interconnect/about-hpc-interconnect) enables low-latency, high-throughput multi-node training. See [Security](/security) and [Networking](/products/networking) for the full picture. ## Automate your solution CoreWeave exposes REST APIs, infrastructure-as-code options, and agent-driven workflows for managing resources programmatically. ### REST APIs CoreWeave provides the following REST APIs: * **CKS API**: Create, list, update, and delete clusters programmatically. See [CKS API Reference](/products/cks/reference/cks-api). * **VPC API**: Manage VPCs through REST. See [VPC API](/products/networking/vpc/vpc-api). * **Object Storage API**: Manage access keys, policies, and organization settings programmatically. See [AI Object Storage API Reference](/products/storage/object-storage/reference/object-storage-api-ref). ### Infrastructure-as-code The [CoreWeave Terraform Provider](/platform/terraform) lets you manage your CoreWeave infrastructure as code, including CKS clusters, VPCs, Object Storage buckets, and Object Storage access policies. Declare your infrastructure in configuration files and apply changes consistently across environments. See [Terraform reference architecture](/platform/reference-architecture) for a complete example. ### Agent-driven workflows [CoreWeave Skills](/platform/coreweave-skills) are Agent Skills that let Claude Code and other compatible agents carry out CoreWeave workflows for you, such as creating a cluster and Node Pool or loading a model into a bucket. Install them from the official `coreweave/skills` repository. ## For more information Explore these resources to plan and scale your CoreWeave deployment: * **Instances**: [GPU and CPU specifications](/platform/instances/about-instances) help you [choose the right instance](/platform/instances/selecting-an-instance) for your workload. * **Node lifecycle**: See [how CKS Nodes are validated and maintained](/platform/fleet-management/node-lifecycle), from [Day 1](/platform/fleet-management/node-lifecycle/day1) setup through [Day 2+](/platform/fleet-management/node-lifecycle/day2) operations. * **Observability**: [CoreWeave Observe](/observability) covers Grafana dashboards, logs, metrics, telemetry, and alerts. * **Regions**: [Regions and availability zones](/platform/regions/about-regions-and-azs) covers global infrastructure and how CoreWeave delivers reliability and connectivity. * **Pricing**: [Instance pricing](https://www.coreweave.com/pricing) provides guidance on costs and how to optimize them for your workload. # CoreWeave Documentation Source: https://docs.coreweave.com/index Learn how to deploy, manage, and observe your workloads on CoreWeave. # Build on the world's most powerful AI cloud Deploy, manage, and observe AI training and inference workloads on purpose-built GPU infrastructure, from a single node to the largest clusters in the world. ## Infrastructure [Platform Get started, then choose instances and capacity, regions and Availability Zones, billing, and policies.](/get-started) [Mission Control Mission Control Agent and the Mission Control MCP server for investigating your environment and making supported changes.](/observability/mission-control-agent) [Infra Control CoreWeave Kubernetes Service (CKS) and the storage and networking products your clusters use.](/products/infra-control-home) [Observability Grafana dashboards, logs, metrics, telemetry, and alerts for monitoring fleet hardware and workloads.](/observability) [Workloads SUNK for Slurm on Kubernetes and CoreWeave Inference for serving models.](/products/workloads-home) [Access Control Accounts and authentication, IAM access policies, automated user provisioning, and trust and compliance.](/security) ## Forge ### Develop and evaluate Track experiments, evaluate and improve agents and LLM applications, prototype in notebooks, and manage models across their lifecycle. [Weights & Biases Experiment tracking, hyperparameter sweeps, artifacts, reports, and automations, with W\&B Weave alongside for LLM and agent evaluation. Explore Weights & Biases](/products/wandb) [ARIA AI research agent that analyzes experiments, explains results, and builds visualizations and reports.](/products/aria) [Agent Lens Intelligent agent observability and improvement.](/products/agent-lens) [Notebooks Reactive Python notebooks for exploring data, prototyping model workflows, and analyzing runs and artifacts. Preview.](/products/notebooks) [Registry Versioned hub for models and datasets with lineage and deployment handoff.](/products/registry) ### Compute services Serve, fine-tune, and run models on CoreWeave infrastructure. [Post-Training Post-train and fine-tune LLMs with Serverless RL and SFT, and distill specialized models from real application traffic.](/products/post-training) [Serverless Inference Open-source foundation models through an OpenAI-compatible API, integrated with Weave.](/products/inference/serverless) [Sandboxes Isolated compute environments on serverless capacity or your own CKS cluster.](/products/sandboxes) ## Resources [Builder Resource Center Explore demos, guides, code, and events for building across CoreWeave products.](https://www.coreweave.com/builder) # Introduction to Mission Control Agent Source: https://docs.coreweave.com/observability/mission-control-agent Understand how Mission Control Agent investigates your environment and performs supported changes. > [!NOTE] > > CoreWeave Mission Control Agent is in public preview. Availability, behavior, and tool coverage > might change during the preview. Responses are AI-generated and can be incomplete or inaccurate, > so verify them before you act. Mission Control Agent is a conversational interface in the CoreWeave Cloud Console. Ask a question in plain language, and the agent gathers evidence from your metrics, logs, dashboards, resource state, and CoreWeave documentation. In organizations where CoreWeave has enabled write tools, the agent can also perform a limited set of supported resource changes with your permissions. The agent returns an answer with supporting evidence, such as charts, tables, log excerpts, and resource details. This evidence helps you verify the answer and continue an investigation without manually correlating several observability views. ## When to use Mission Control Agent Use Mission Control Agent when you are working in the Cloud Console and want to investigate an operational question or request a supported write action without configuring a separate client. For example, you can ask about the following areas: * Cluster, Node, and GPU health. * Workload scheduling and utilization. * CoreWeave SUNK clusters and Slurm jobs. * CoreWeave AI Object Storage buckets. * Usage and CoreWeave product documentation. * Supported resource changes, when write tools are enabled for your organization. For details, see [Request a supported change](/observability/mission-control-agent/use#request-a-supported-change). ## How Mission Control Agent works Mission Control Agent runs as the signed-in user. Every request uses your identity and permissions, so the agent can access only the resources available to you in your organization. It doesn't use a separate service account or grant itself additional permissions. The agent uses Mission Control tools to connect questions to CoreWeave observability data, resource state, and documentation. The Cloud Console also provides the current page and any resources that you reference as context for the conversation. ## Capabilities and limits Mission Control Agent can gather evidence and explain what it finds. In organizations where CoreWeave has enabled write tools, you can also request supported resource changes, such as applying a Kubernetes manifest or updating selected Inference deployment fields. Write tools use the signed-in user's permissions and aren't self-serve. For instructions and safety considerations, see [Request a supported change](/observability/mission-control-agent/use#request-a-supported-change). The agent can access only data exposed through its supported tools and any context that you provide in the conversation. ## Mission Control Agent and Mission Control MCP Mission Control Agent and Mission Control MCP provide access to CoreWeave operational capabilities through different interfaces. Choose the interface that matches your workflow: * **Mission Control Agent** runs in the Cloud Console and uses your signed-in identity. Use it when you want to investigate while working in the Cloud Console without additional setup. * **Mission Control MCP** is a hosted Model Context Protocol (MCP) server that you connect to an MCP-compatible client with a CoreWeave API token. Use it to bring CoreWeave data into tools such as Claude Code, Cursor, or the ChatGPT desktop app. For an overview, see [Introduction to Mission Control MCP](/observability/mission-control-mcp). For MCP setup instructions, see [Configure Mission Control MCP](/observability/mission-control-mcp/configure). ## Next steps Use the following resources to continue with Mission Control: * [Use Mission Control Agent](/observability/mission-control-agent/use): Open the agent, ask a question, provide resource context, and verify the answer. * [Manage Mission Control Agent settings](/observability/mission-control-agent/manage-settings): Control organization access and available data-sharing preferences. * [Introduction to Mission Control MCP](/observability/mission-control-mcp): Connect an MCP client when you want CoreWeave tools outside the Cloud Console. * [Mission Control MCP tool reference](/observability/mission-control-mcp/reference/tools): Review the operational tools and their inputs. # Manage Mission Control Agent settings Source: https://docs.coreweave.com/observability/mission-control-agent/manage-settings Control organization access to Mission Control Agent and manage available data-sharing preferences. Organization administrators can manage CoreWeave Mission Control Agent access and data-sharing preferences from the **Privacy and data** page in the Cloud Console. These settings apply to the whole organization. After a setting update succeeds, the Cloud Console displays the saved state. If an update fails, the control returns to its previous state and the Cloud Console displays an error. ## Prerequisites You need the **IAM Admin** role to change Mission Control Agent settings. Users without this role can view the page, but the controls are unavailable. For information about assigning roles, see [Manage IAM access policies](/security/iam/access-policies/manage). ## Turn Mission Control Agent on or off To change access to Mission Control Agent, follow these steps: 1. In the Cloud Console, go to **Permissions > Privacy and data**. 2. Turn **Enable AI experiences** on or off. When the **Enable AI experiences** setting is off, users who open **Ask Mission Control** see **Mission Control is off**, with a message that their organization administrator has turned it off. Turning the setting off also prevents users from continuing existing conversations. The Cloud Console clears a conversation when it detects that the setting is off. To restore access, turn **Enable AI experiences** on. Users can then start new conversations, but cleared conversations don't return. ## Manage data sharing The **Privacy and data** page can display the following organization-wide controls: * **Enable data collection**: Lets Mission Control collect your organization's data for model training. This control appears only when CoreWeave has enabled the data-consent setting for your organization. * **Enable data anonymization**: Sets your organization's anonymization preference for collected data. This control is unavailable when data collection is turned off, and turning off data collection also turns off anonymization. To change data-sharing preferences, follow these steps: 1. In the Cloud Console, go to **Permissions > Privacy and data**. 2. If **Enable data collection** is available, turn it on or off. 3. Optional: Turn **Enable data anonymization** on or off. This control is unavailable while data collection is off. > [!NOTE] > > The controls available to your organization can differ based on your organization's terms and > Mission Control rollout configuration. ## Related resources Use the following resources to learn more about Mission Control Agent settings: * [Introduction to Mission Control Agent](/observability/mission-control-agent): Understand how the agent works and how it uses your permissions. * [Use Mission Control Agent](/observability/mission-control-agent/use): Ask questions and verify responses in the Cloud Console. * [CoreWeave privacy policy](/policies/terms-of-service/privacy-policy): Review the policy that governs personal data. # Use Mission Control Agent Source: https://docs.coreweave.com/observability/mission-control-agent/use Ask questions, verify evidence, and request supported resource changes in the Cloud Console. Use CoreWeave Mission Control Agent to investigate and interact with your CoreWeave environment from the Cloud Console. The agent uses the page and resources in your conversation as context, then returns an answer with supporting evidence. In organizations where CoreWeave has enabled write tools, you can also request supported resource changes. ## Prerequisites You need the following: * Access to a CoreWeave organization where Mission Control Agent is available. * Cloud Console permissions for the agent activity that you want to perform, including permission to view or change the resources involved. ## Open Mission Control Agent In the top navigation of the Cloud Console, select **Ask Mission Control**. The agent opens in a panel next to the current page. You can also start a conversation from the **Ask Mission Control** message box on the Cloud Console home page. Sending a message from the home page starts a new conversation and opens Mission Control as a full page. If the panel shows **Mission Control is off**, your organization administrator has turned off Mission Control Agent. For more information, see [Turn Mission Control Agent on or off](/observability/mission-control-agent/manage-settings#turn-mission-control-agent-on-or-off). Use the panel controls as needed: * To give the conversation more room, select **Expand panel**. * To return to the side panel, select **Collapse to dock**. * To clear the current conversation, select **New chat**. The conversation remains open as you navigate between Cloud Console pages. > [!WARNING] > > Mission Control Agent supports one active conversation at a time. Selecting **New chat**, > sending a message from the home page message box, or reloading the Cloud Console clears the > current conversation. The Cloud Console doesn't provide a way to save or restore a cleared > conversation. ## Ask a question In the message box, enter an operational question. When possible, provide a specific resource and symptom. For example, ask one of the following questions: * "Why is my job pending?" * "Which Nodes in this cluster need attention?" * "Which jobs have low GPU utilization?" * "How much data is stored in this bucket?" To add resource context, type `@` in the message box and select an available resource. The agent can use the referenced resource and the current Cloud Console page to scope its investigation. Review the evidence included with the response before you act. Evidence might include charts, tables, log excerpts, resource details, or links to relevant CoreWeave documentation. If the answer is incomplete or the evidence doesn't support it, refine the question with a specific resource, symptom, and time range. Don't rely on an unverified response for an operational decision. ## Request a supported change > [!NOTE] > > Write tools are available only to organizations where CoreWeave has enabled them. They aren't > controlled from **Privacy and data**. Mission Control Agent can perform a limited set of changes with your permissions. Supported changes include applying a Kubernetes manifest to a named CoreWeave Kubernetes Service (CKS) cluster and updating selected fields on a CoreWeave Inference deployment. > [!WARNING] > > Mission Control Agent doesn't ask for confirmation before it runs a write tool, and it can't > automatically undo a completed change. The agent can use any write tool that your permissions > allow. Request only the specific fields or manifest that you intend to apply. Request a change explicitly only when you intend Mission Control Agent to perform it. A diagnostic question isn't a request to change a resource. For example, you might ask: "On Inference deployment `[DEPLOYMENT-ID]`, set `autoscaling.max` to `4`." To request a supported change, follow these steps: 1. Name the resource and request the exact change. For a manifest, provide the complete manifest that you intend to apply. 2. In the agent's response, confirm which resource it changed and which values it applied. 3. Open the affected resource in the Cloud Console and confirm that its state matches your request. ## Related resources Use the following resources to learn more about Mission Control: * [Introduction to Mission Control Agent](/observability/mission-control-agent): Understand the agent's trust and capability boundaries. * [Manage Mission Control Agent settings](/observability/mission-control-agent/manage-settings): Control organization access and data-sharing preferences. * [Introduction to Mission Control MCP](/observability/mission-control-mcp): Connect an MCP client when you want CoreWeave tools outside the Cloud Console. * [Mission Control MCP tool reference](/observability/mission-control-mcp/reference/tools): Review available tool inputs and outputs. # Introduction to Mission Control MCP Source: https://docs.coreweave.com/observability/mission-control-mcp Connect AI agents to CoreWeave observability data and supported write actions through MCP. CoreWeave Mission Control MCP is a hosted [Model Context Protocol](https://modelcontextprotocol.io/docs/getting-started/intro) (MCP) server for CoreWeave infrastructure. It connects MCP-compatible clients, such as Claude Code, Cursor, and the ChatGPT desktop app, to tools for observing, triaging, optimizing, and performing supported changes in CoreWeave environments. With a CoreWeave API token, you can ask natural-language questions about your infrastructure and let an agent gather current evidence from metrics, logs, dashboards, documentation, cluster state, Node details, and object storage context. The agent works inside the same visibility boundary as your token, so it can access only resources available to your token. CoreWeave hosts the server, so you don't need to deploy or operate it. Point your client at the endpoint and authenticate with a token. Most tools are read-only. CoreWeave can enable limited write tools for an organization, and those tools can change supported resources. ## Mission Control MCP capabilities Mission Control MCP combines tool families in one connection so an agent can perform a multi-step investigation. It coordinates access to dashboards, command-line interfaces (CLIs), and documentation. It doesn't replace them. Mission Control MCP provides the following capabilities: * **Observability**: query metrics, search logs, inspect dashboards and the queries behind their panels, and discover datasources, backed by Grafana-compatible systems. * **CoreWeave documentation**: search and read CoreWeave public documentation so an agent answers product and API questions from documentation rather than model memory. * **CoreWeave resources**: inspect clusters, Nodes, CoreWeave SUNK resources, and CoreWeave AI Object Storage buckets, then connect that state to observability data. * **Write actions**: apply a Kubernetes manifest to a CoreWeave Kubernetes Service (CKS) cluster and update supported CoreWeave Inference deployment fields, where enabled for your organization. For documented tool inputs and outputs, see the [Mission Control MCP tool reference](/observability/mission-control-mcp/reference/tools). ## How teams use Mission Control MCP Mission Control MCP supports the following roles: * **AI researchers and ML engineers** can stay in their editor while they ask for GPU health signals, Node status, workload logs, or relevant dashboards, then follow up with further questions. * **Platform and infrastructure teams** can assemble an evidence chain that shows what is affected, which metrics changed, which errors appear in the logs, and which dashboards are relevant. * **Application teams and operators** can answer operational questions that cross product surfaces, such as combining workload logs, metrics, and object storage state to investigate performance issues in training jobs. * **Domain experts** can frame an investigation while the agent coordinates tool calls and turns operational telemetry into tables, prototypes, and next steps. ## Set up Mission Control MCP To connect a client and start calling the tools, see [Configure Mission Control MCP](/observability/mission-control-mcp/configure). Setup requires a CoreWeave API token and an MCP-compatible client, such as Claude Code, Cursor, or the ChatGPT desktop app. ## Related resources Use the following resources to learn more about Mission Control: > **[Mission Control Agent](/observability/mission-control-agent)** > > Use CoreWeave's conversational interface in the Cloud Console. > **[Configure Mission Control MCP](/observability/mission-control-mcp/configure)** > > Connect Claude Code, Cursor, the ChatGPT desktop app, or another MCP client to the hosted > server. > **[Tool reference](/observability/mission-control-mcp/reference/tools)** > > Mission Control MCP tools, grouped by family, with inputs and outputs. > **[CoreWeave Grafana](/observability/managed-grafana)** > > Managed Grafana dashboards, metrics, and logs that Mission Control MCP tools observe. > **[CoreWeave AI Object Storage](/products/storage/object-storage)** > > S3-compatible object storage that the object storage tools inspect. > **[CoreWeave Skills](/platform/coreweave-skills)** > > Agent Skills that let your coding agent carry out CoreWeave tasks. # Configure Mission Control MCP Source: https://docs.coreweave.com/observability/mission-control-mcp/configure Connect an MCP client to the hosted Mission Control MCP server with a CoreWeave API token. Configure your MCP-compatible client to connect to the hosted Mission Control MCP server and authenticate with a CoreWeave API token. For an overview of the server and its use cases, see [Introduction to Mission Control MCP](/observability/mission-control-mcp). For documented tool inputs and outputs, see the [Mission Control MCP tool reference](/observability/mission-control-mcp/reference/tools). ## Before you begin You need the following: * A CoreWeave account and a CoreWeave API token. Creating a token requires the **Access Token User** role. See [API access tokens](/security/authn-authz/managed-auth/api-access). * An MCP-compatible client, such as Claude Code, Cursor, or the ChatGPT desktop app. ## Connect a client **1. Create an API token** Open the [CoreWeave Cloud Console tokens page](https://console.coreweave.com/tokens) and create a new API token. Copy the token value. Your MCP client sends it as a bearer token when it calls Mission Control MCP. Treat the token like a password. It grants the same access that your account has, including any organization-gated write tools that CoreWeave has enabled. **2. Add the server to your client** Configure your MCP client to connect to the Mission Control MCP endpoint and send your token as a bearer token. Replace `[YOUR-COREWEAVE-API-TOKEN]` with the token from the previous step. **Claude Code** Run the following command: ```bash theme={"system"} claude mcp add --transport http mission-control \ https://mc.coreweave.com/mcp \ --header "Authorization: Bearer [YOUR-COREWEAVE-API-TOKEN]" ``` Start a new Claude Code session after adding the server. **Cursor** Add the following to `~/.cursor/mcp.json`. Create the file if it does not exist. ```json theme={"system"} { "mcpServers": { "mission-control": { "url": "https://mc.coreweave.com/mcp", "headers": { "Authorization": "Bearer [YOUR-COREWEAVE-API-TOKEN]" } } } } ``` Restart Cursor after saving the file. **ChatGPT desktop app** The ChatGPT desktop app shares its MCP configuration with Codex CLI. Export your token to an environment variable, then add the server. Replace `[YOUR-COREWEAVE-API-TOKEN]` with the token from the previous step. ```bash theme={"system"} export CW_TOKEN="[YOUR-COREWEAVE-API-TOKEN]" codex mcp add mission-control --url https://mc.coreweave.com/mcp --bearer-token-env-var CW_TOKEN ``` Confirm the server is registered: ```bash theme={"system"} codex mcp list ``` The `mission-control` server appears in the list without errors. **Other clients** Any MCP-compatible client can connect using the streamable HTTP transport. Refer to your client's documentation for where to place the server configuration, then use these values: * **URL**: `https://mc.coreweave.com/mcp` * **Header**: `Authorization: Bearer [YOUR-COREWEAVE-API-TOKEN]` Restart or reload your client after saving the configuration. **3. Verify the connection** Ask your agent a question and confirm it calls a Mission Control MCP tool: * "List my CoreWeave clusters." * "Search the CoreWeave docs for object storage authentication." * "Find dashboards related to my cluster." Look for a Mission Control MCP tool call, such as `list_datasources` or `cw_cluster_get`, in your client's tool-use display. Seeing the tool call confirms the connection works. If your client shows a 401 error instead, your token is missing or incorrect. Return to the first step and create a new token. The server resolves your organization and identity from the bearer token and scopes the response to what your token can access. ## Next steps * [Introduction to Mission Control MCP](/observability/mission-control-mcp): Review capabilities and how Mission Control MCP relates to Mission Control Agent. * [Mission Control MCP tool reference](/observability/mission-control-mcp/reference/tools): See the documented tools, inputs, and outputs. # Mission Control MCP tool reference Source: https://docs.coreweave.com/observability/mission-control-mcp/reference/tools Mission Control MCP tools for observability, resources, and supported write actions. [CoreWeave Mission Control MCP](/observability/mission-control-mcp) is a hosted Model Context Protocol (MCP) server. This page lists its tools by family. Each tool entry describes what the tool does, its inputs, and its output. For setup instructions, see [Configure Mission Control MCP](/observability/mission-control-mcp/configure). ## Capabilities and caveats A few conventions apply across the catalog: * **Most tools are read-only.** CoreWeave can enable the tools in [Write actions](#write-actions) for an organization. Those tools can modify supported resources and run with the caller's identity and permissions. * **Many observability tools require a `datasourceUid`.** Discover datasources and their UIDs with [`list_datasources`](#list_datasources). To find which datasource a dashboard panel uses, call [`get_dashboard_panel_queries`](#get_dashboard_panel_queries). * **Time formats vary by tool** and are noted in each tool's inputs. Metric query tools accept RFC3339 timestamps or expressions relative to now, such as `now`, `now-1h`, or `now-2h45m`. Log query tools accept RFC3339 timestamps. ClickHouse tools and `search_logs` accept relative expressions, RFC3339 timestamps, or Unix milliseconds. * **Every tool also accepts an optional `user_prompt` string.** It carries the prompt that led to the call and is used only for server-side observability. It does not affect results and is omitted from the following tables. * **One tool takes no parameters.** [`cw_cluster_get`](#cw_cluster_get) notes this in prose in place of an input table. ## Tool families The following table lists the documented tools by family. | Family | Tools | | - | - | | [Datasources](#datasources) | `list_datasources`, `get_datasource` | | [Metrics](#metrics) | `list_metric_names`, `list_metric_metadata`, `list_metric_label_names`, `list_metric_label_values`, `query_metrics`, `query_metric_histogram` | | [Logs](#logs) | `list_logs_label_names`, `list_logs_label_values`, `query_logs_stats`, `query_logs_patterns`, `query_logs`, `list_clickhouse_tables`, `describe_clickhouse_table`, `query_clickhouse`, `search_logs` | | [Dashboards and folders](#dashboards-and-folders) | `search_dashboards`, `get_dashboard_summary`, `get_dashboard_property`, `get_dashboard_panel_queries`, `get_dashboard_by_uid`, `search_folders`, `generate_deeplink` | | [Documentation](#documentation) | `search_coreweave_docs`, `query_filesystem_coreweave_docs` | | [Billing](#billing) | `coreweave_billing_get_focus_usage` | | [Clusters and Nodes](#clusters-and-nodes) | `cw_cluster_get`, `cw_cluster_describe`, `cw_node_list`, `cw_node_describe`, `cw_node_view` | | [CoreWeave SUNK](#coreweave-sunk) | `cw_sunk_describe`, `cw_sunk_view` | | [CoreWeave AI Object Storage](#coreweave-ai-object-storage) | `cw_cwobject_list`, `cw_cwobject_bucket_describe` | | [Write actions](#write-actions) | `coreweave_kubectl_apply`, `coreweave_inference_update_deployment` | ## Datasources Use these tools to discover the datasources available to your organization and the UIDs that the metrics, logs, and dashboard tools need. ### `list_datasources` List all configured datasources in Grafana. Use it to discover available datasources and their UIDs. Supports filtering by type and pagination. | Parameter | Type | Required | Description | | - | - | - | - | | `type` | `string` | No | Filter by datasource type. | | `limit` | `integer` | No | Maximum number of datasources to return. Default `50`, maximum `100`. | | `offset` | `integer` | No | Number of datasources to skip, for pagination. Default `0`. | **Output:** a list of datasources, each with its name, type, and UID. ### `get_datasource` Retrieve detailed information about a single datasource by UID or name. Provide either `uid` or `name`. If both are given, `uid` takes priority. | Parameter | Type | Required | Description | | - | - | - | - | | `uid` | `string` | No | The UID of the datasource. Takes priority over `name` if both are provided. | | `name` | `string` | No | The name of the datasource. Used if `uid` is not provided. | **Output:** the full datasource model, including name, type, URL, access settings, JSON data, and secure field status. ## Metrics Query metric datasources. The typical workflow is to discover metric names, narrow with label values, then query: run `list_metric_names`, then `list_metric_label_values`, then `query_metrics`. ### `list_metric_names` List metric names in a metric datasource, filtered by a regular expression. Call this first to find available metrics before querying. Supports pagination. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `regex` | `string` | No | Regular expression to match against metric names. | | `limit` | `integer` | No | Maximum number of results to return. Default `10`. | | `page` | `integer` | No | Page number to return. Default `1`. | **Output:** a list of metric names that match the regular expression. ### `list_metric_metadata` List metadata about metrics scraped from targets, such as type, help text, and unit. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `metric` | `string` | No | The metric to query metadata for. | | `limit` | `integer` | No | Maximum number of metrics to return. Default `10`. | | `limitPerMetric` | `integer` | No | Maximum number of metadata entries to return per metric. | **Output:** metric metadata entries. ### `list_metric_label_names` List label names in a metric datasource. Supports filtering by series selectors and a time range. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `matches` | `array` | No | Label matchers to filter results. Each entry holds a list of `filters`, where a filter has a `name`, a `value`, and a `type` of `=`, `!=`, `=~`, or `!~`. | | `startRfc3339` | `string` | No | Start of the time range to filter by, in RFC3339. | | `endRfc3339` | `string` | No | End of the time range to filter by, in RFC3339. | | `limit` | `integer` | No | Maximum number of results to return. Default `100`. | **Output:** a list of label names. ### `list_metric_label_values` Get the values for a specific label name in a metric datasource. Use it after `list_metric_names` to find values for filtering queries. Supports filtering by series selectors and a time range. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `labelName` | `string` | Yes | The name of the label to query values for. | | `matches` | `array` | No | Selectors to filter results, in the same shape as `list_metric_label_names`. | | `startRfc3339` | `string` | No | Start of the time range, in RFC3339. | | `endRfc3339` | `string` | No | End of the time range, in RFC3339. | | `limit` | `integer` | No | Maximum number of results to return. Default `100`. | **Output:** a list of values for the requested label. ### `query_metrics` Run a PromQL (Prometheus Query Language) query against a metric datasource. Supports instant queries, which return a single point, and range queries, which return a series over a time range. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `expr` | `string` | Yes | The expression to query. | | `endTime` | `string` | Yes | End time. RFC3339 or relative to now, such as `now`, `now-1.5h`, or `now-2h45m`. | | `queryType` | `string` | No | `range` or `instant`. Default `range`. | | `startTime` | `string` | No | Start time. Required when `queryType` is `range`, ignored when `instant`. | | `stepSeconds` | `integer` | No | Step size in seconds. Required when `queryType` is `range`, ignored when `instant`. | **Output:** the query result, either a single value for an instant query or a time series for a range query. ### `query_metric_histogram` Compute histogram percentiles for a histogram metric. The tool generates the `histogram_quantile` expression for you. Discover histograms first by running `list_metric_names` with the regex `.*_bucket$`. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the metric datasource. | | `metric` | `string` | Yes | Base histogram metric name, without the `_bucket` suffix. | | `percentile` | `number` | Yes | Percentile to calculate, such as `50`, `90`, `95`, or `99`. | | `labels` | `string` | No | Label selector, such as `job="api", service="gateway"`. | | `startTime` | `string` | No | Start time. RFC3339, relative, or Unix milliseconds. Default `now-1h`. | | `endTime` | `string` | No | End time. RFC3339, relative, or Unix milliseconds. Default `now`. | | `stepSeconds` | `integer` | No | Step size in seconds for a range query. Default `60`. | | `rateInterval` | `string` | No | Rate interval for the query. Default `5m`. | **Output:** the percentile time series produced by the generated `histogram_quantile` query. ## Logs Mission Control MCP reads logs from multiple backends. ClickHouse tools use SQL over OpenTelemetry-style log tables. The `search_logs` tool works across either backend and generates the right query for you. ### `list_logs_label_names` List all label names found in logs within a log datasource and time range. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `startRfc3339` | `string` | No | Start of the time range, in RFC3339. Default one hour ago. | | `endRfc3339` | `string` | No | End of the time range, in RFC3339. Default now. | **Output:** a list of unique label names, such as `["app", "env", "pod"]`. ### `list_logs_label_values` Get all unique values for a specific label within a log datasource and time range. Useful for discovering filter options. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `labelName` | `string` | Yes | The name of the label to retrieve values for, such as `app`, `env`, or `pod`. | | `startRfc3339` | `string` | No | Start of the time range, in RFC3339. Default one hour ago. | | `endRfc3339` | `string` | No | End of the time range, in RFC3339. Default now. | **Output:** a list of values for the requested label. ### `query_logs_stats` Retrieve statistics about the log streams matching a selector. Use it to check stream size before retrieving logs. The selector must be a simple label matcher, such as `{app="nginx", env="prod"}`. It does not support line filters, parsers, or aggregations. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `logql` | `string` | Yes | A label-matcher selector. Line filters and aggregations are not supported. | | `startRfc3339` | `string` | No | Start of the time range, in RFC3339. Default one hour ago. | | `endRfc3339` | `string` | No | End of the time range, in RFC3339. Default now. | **Output:** an object with the count of streams, chunks, entries, and total bytes, such as `{"streams": 5, "chunks": 50, "entries": 10000, "bytes": 512000}`. ### `query_logs_patterns` Retrieve detected log patterns for a stream selector and time range. Patterns help identify common log structures and anomalies. The selector must be a stream selector, such as `{job="nginx"}`, and does not support line filters or aggregations. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `logql` | `string` | Yes | A stream selector, such as `{job="foo", namespace="bar"}`. | | `startRfc3339` | `string` | No | Start of the time range, in RFC3339. Default one hour ago. | | `endRfc3339` | `string` | No | End of the time range, in RFC3339. Default now. | | `step` | `string` | No | Query resolution step, such as `5m`. | **Output:** a list of patterns, each with a pattern string and a total count of occurrences. ### `query_logs` Run a LogQL (Loki's Query Language) query against a log datasource to retrieve log entries or metric values. Supports label matchers, line filters, parsers, and pipeline operations. Check stream size with `query_logs_stats` and verify labels with the label tools first. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the datasource to query. | | `logql` | `string` | Yes | The query to execute, such as `{app="foo"} \|= "error"` or `rate({app="bar"}[1m])`. | | `queryType` | `string` | No | `range` (default) or `instant`. Use `instant` for the current value of a metric query. | | `startRfc3339` | `string` | No | Start of the time range, in RFC3339. | | `endRfc3339` | `string` | No | End of the time range, in RFC3339. | | `limit` | `integer` | No | Maximum number of log lines to return. Default `10`, maximum `100`. | | `direction` | `string` | No | `forward` for oldest first, or `backward` for newest first. Default `backward`. | | `stepSeconds` | `integer` | No | Resolution step in seconds for range metric queries. | **Output:** a list of results, each with a timestamp, labels, and either a log line (`line`) or a numeric metric value (`value`). ### `list_clickhouse_tables` List the available tables in a ClickHouse datasource. Start here for ClickHouse, then use `describe_clickhouse_table` to see column schemas. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the ClickHouse datasource. | | `database` | `string` | No | Database name to filter tables. Lists all non-system databases if not specified. | **Output:** a list of tables, each with its name, database, engine, row count, and size. ### `describe_clickhouse_table` Get the column schema for a ClickHouse table. Pass the database from `list_clickhouse_tables`. Then query with `query_clickhouse` using the discovered column names. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the ClickHouse datasource. | | `table` | `string` | Yes | The table to describe. | | `database` | `string` | No | Database name. Default `default`. | **Output:** the column schema for the table. ### `query_clickhouse` Run a SQL query against a ClickHouse datasource through Grafana. Discover tables and schemas first with `list_clickhouse_tables` and `describe_clickhouse_table`. Supports ClickHouse macros, including `$__timeFilter(column)`, `$__from`, `$__to`, `$__interval`, and `${varname}`. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of the ClickHouse datasource to query. | | `query` | `string` | Yes | Raw SQL query. Supports ClickHouse macros for time filtering and variable substitution. | | `start` | `string` | No | Start time. Relative, RFC3339, or Unix milliseconds. Default one hour ago. | | `end` | `string` | No | End time. Relative, RFC3339, or Unix milliseconds. Default now. | | `limit` | `integer` | No | Maximum number of rows to return. Default `100`, maximum `1000`. A `LIMIT` is appended if the query does not contain one. | | `variables` | `object` | No | Template variable substitutions as key-value pairs, referenced as `${varname}` or `$varname`. | **Output:** the result rows from the SQL query. ### `search_logs` Search for log entries matching a text pattern across ClickHouse and log datasources. The tool generates a backend-specific query based on the datasource type. For ClickHouse, run `list_clickhouse_tables` first, because the default table may not exist, and the tool expects an OpenTelemetry log schema with `Timestamp` and `Body` columns. | Parameter | Type | Required | Description | | - | - | - | - | | `datasourceUid` | `string` | Yes | The UID of a ClickHouse or log datasource. | | `pattern` | `string` | Yes | Text pattern or regular expression to search for in log messages. | | `start` | `string` | No | Start time. Relative, RFC3339, or Unix milliseconds. Default `now-1h`. | | `end` | `string` | No | End time. Relative, RFC3339, or Unix milliseconds. Default `now`. | | `limit` | `integer` | No | Maximum number of log entries to return. Default `100`, maximum `1000`. | | `table` | `string` | No | Table name for ClickHouse queries. Ignored for log datasources. | **Output:** a list of matching log entries. ## Dashboards and folders Find dashboards, inspect them without retrieving the full JSON, read the queries behind their panels, and build shareable links. ### `search_dashboards` Search for Grafana dashboards by a query string. | Parameter | Type | Required | Description | | - | - | - | - | | `query` | `string` | No | The query to search for. | | `limit` | `integer` | No | Maximum number of results to return. Default `50`, maximum `100`. | | `page` | `integer` | No | Page number, one-indexed. Default `1`. | **Output:** a list of matching dashboards, each with its title, UID, folder, tags, and URL. ### `get_dashboard_summary` Get a compact summary of a dashboard without the full JSON. Use it for an overview and to plan follow-up calls without consuming large amounts of context. | Parameter | Type | Required | Description | | - | - | - | - | | `uid` | `string` | Yes | The UID of the dashboard. | **Output:** a summary including the title, panel count, panel types, variables, and other metadata. ### `get_dashboard_property` Get specific parts of a dashboard using a JSONPath expression, to minimize context usage. Common paths include `$.title`, `$.panels[*].title`, `$.templating.list`, and `$.panels[*].targets[*].expr`. | Parameter | Type | Required | Description | | - | - | - | - | | `uid` | `string` | Yes | The UID of the dashboard. | | `jsonPath` | `string` | Yes | JSONPath expression to extract specific data. | **Output:** the values extracted by the JSONPath expression. ### `get_dashboard_panel_queries` Retrieve the queries behind a dashboard's panels. Supports all datasource types and row-nested panels. Optionally filter to one panel, and optionally substitute template variables. | Parameter | Type | Required | Description | | - | - | - | - | | `uid` | `string` | Yes | The UID of the dashboard. | | `panelId` | `integer` | No | Filter to a specific panel by ID. | | `variables` | `object` | No | Template variable substitutions, such as `{"job": "api-server"}`. Populates `processedQuery` and `requiredVariables`. | **Output:** an array of objects with `title`, `query` (the raw expression), and `datasource` (an object with `uid` and `type`). When variables are provided, each object also includes `processedQuery`, `refId`, and `requiredVariables`. ### `get_dashboard_by_uid` Retrieve the complete dashboard, including panels, variables, and settings, by UID. > [!NOTE] > > Large dashboards can consume significant context. Prefer `get_dashboard_summary` for an overview > or `get_dashboard_property` for specific data. | Parameter | Type | Required | Description | | - | - | - | - | | `uid` | `string` | Yes | The UID of the dashboard. | **Output:** the full dashboard JSON. ### `search_folders` Search for Grafana folders by a query string. | Parameter | Type | Required | Description | | - | - | - | - | | `query` | `string` | No | The query to search for. | **Output:** a list of matching folders, each with its title, UID, and URL. ### `generate_deeplink` Generate a deeplink URL for a Grafana resource. Supports dashboards, panels, and Explore queries. | Parameter | Type | Required | Description | | - | - | - | - | | `resourceType` | `string` | Yes | The type of resource: `dashboard`, `panel`, or `explore`. | | `dashboardUid` | `string` | No | Dashboard UID. Required for `dashboard` and `panel` types. | | `panelId` | `integer` | No | Panel ID. Required for the `panel` type. | | `datasourceUid` | `string` | No | Datasource UID. Required for the `explore` type. | | `queries` | `array` | No | Query objects for Explore links, such as `[{"refId":"A","expr":"up"}]`. | | `queryParams` | `object` | No | Additional URL query parameters, for `dashboard` and `panel` types. | | `timeRange` | `object` | No | Time range with `from` and `to` fields, such as `{"from": "now-1h", "to": "now"}`. | **Output:** the deeplink URL. ## Documentation Search and read CoreWeave public documentation so an agent answers product and API questions from current docs. ### `search_coreweave_docs` Search the CoreWeave Docs knowledge base for relevant information, code examples, API references, and guides. Start here for broad or conceptual questions. To read a specific page in full, pass its path to `query_filesystem_coreweave_docs`. | Parameter | Type | Required | Description | | - | - | - | - | | `query` | `string` | Yes | The query to search the documentation with. | **Output:** contextual content with titles and direct links to the documentation pages. ### `query_filesystem_coreweave_docs` Run a read-only, shell-like query against a virtual, in-memory filesystem that contains the CoreWeave Docs pages and OpenAPI specs. This is a sandbox, not a real shell. It is how you read a page in full: pass a page's `.mdx` path to `head` or `cat`. Supported commands include `rg`, `grep`, `find`, `tree`, `ls`, `cat`, `head`, `tail`, `stat`, `wc`, `sort`, `uniq`, `cut`, `sed`, `awk`, and `jq`. Each call is stateless and starts at the root path. | Parameter | Type | Required | Description | | - | - | - | - | | `command` | `string` | Yes | A shell-like command to run against the documentation filesystem, such as `rg -il "keyword" /`, `tree / -L 2`, or `head -80 /path/file.mdx`. | **Output:** the command output, truncated to 30 KB per call. ## Billing Read hourly measured and billable usage for the organization associated with your CoreWeave API access token. The billing tool requires access to FOCUS export for your organization. The user or service account associated with your token must have the [Billing Viewer](/security/iam/access-policies/roles#billing) role. For the row schema and API behavior, see [Export usage with the FOCUS API](/billing/focus-export-api). ### `coreweave_billing_get_focus_usage` Retrieve one page of usage from `GET /v1/billing/focus` as JSON. This read-only tool returns usage quantities. It doesn't return cost or dollar amounts. Unlike the raw API, the MCP tool requires explicit start and end timestamps. | Parameter | Type | Required | Description | | - | - | - | - | | `start_time` | `string` | Yes | Inclusive lower bound for `ChargePeriodStart`, in RFC3339, such as `2026-08-01T00:00:00Z`. | | `end_time` | `string` | Yes | Exclusive upper bound for `ChargePeriodStart`, in RFC3339. The range can't exceed 90 days. | | `group_by` | `string` | No | `location` (default) or `capacity_plan`. Location rows are grouped by hour, Availability Zone, cluster, and SKU. Capacity-plan rows are grouped by hour, SKU, and capacity plan. | | `product_family` | `string` | No | `GPU Compute`, `CPU Compute`, `Storage`, `Network`, or `Other`. | | `cluster` | `string` | No | Exact `x_ClusterId` to return. Valid only with `group_by=location`. | | `zone` | `string` | No | `AvailabilityZone` to return, matched case-insensitively. Valid only with `group_by=location`. | | `page_size` | `integer` | No | Maximum rows per page. Default `100`, range `1` to `1000`. | | `page_token` | `string` | No | Non-empty `next_page_token` from the preceding call. Repeat the original time range, `group_by`, `product_family`, `cluster`, and `zone`. You can change `page_size`. | **Output:** a JSON object with `data_generator`, `schema`, `data_as_of`, `query`, `row_count`, and `data`. `ConsumedQuantity` is measured usage before exclusions in the location view. `PricingQuantity` is billable usage after exclusions. In the capacity-plan view, the quantities are equal. When more rows match, the result includes `next_page_token` and a `note` explaining how to fetch the next page. On the final page, `next_page_token` is omitted. An empty page includes a `note` about the window and filters. `data_as_of` is the timestamp through which data is complete. Hourly aggregates lag the underlying data slightly. If you pull the same recent window twice, you may get small differences until the data settles. Rate limit errors use the `upstream_error` code. The error message includes `Retry-After` when the API supplies it. ## Clusters and Nodes Inspect CoreWeave Kubernetes Service (CKS) clusters and their Nodes. These tools are scoped to what your CoreWeave API token can access. ### `cw_cluster_get` List all CoreWeave clusters the caller can see. This tool takes no parameters. **Output:** a tabular list of clusters. ### `cw_cluster_describe` Describe a CoreWeave (CKS) cluster, including its Nodes, Node Pools, data-plane components, networking, and observability. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | The CKS cluster name. | **Output:** the cluster description, as tabular text. ### `cw_node_list` List the Nodes in a CoreWeave (CKS) cluster. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | The CKS cluster name. | **Output:** a tabular list of Nodes. ### `cw_node_describe` Describe a Node in a CoreWeave (CKS) cluster, including its instance type, GPU information, conditions, HPC-verification status, and events. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | The CKS cluster name. | | `node_id` | `string` | Yes | The Node identifier. | **Output:** the Node description, as tabular text. ### `cw_node_view` Return the Grafana dashboard URL for a Node in a CoreWeave (CKS) cluster. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | The CKS cluster name. | | `node_id` | `string` | Yes | The Node identifier. | **Output:** the dashboard URL, as plain text. ## CoreWeave SUNK Inspect CoreWeave SUNK clusters, which run Slurm on Kubernetes on top of a CKS cluster. ### `cw_sunk_describe` Describe a SUNK cluster running on top of a CoreWeave (CKS) cluster. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | The underlying CKS cluster name, used to select the right access. | | `sunk_cluster` | `string` | Yes | The SUNK cluster name. | **Output:** the SUNK cluster description, as tabular text. ### `cw_sunk_view` Return the Grafana dashboard URL for a SUNK cluster. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | The underlying CKS cluster name, used to select the right access. | | `sunk_cluster` | `string` | Yes | The SUNK cluster name. | **Output:** the dashboard URL, as plain text. ## CoreWeave AI Object Storage Inspect CoreWeave AI Object Storage buckets and the objects within them. ### `cw_cwobject_list` List CoreWeave AI Object Storage buckets, or list the objects under an `s3://` path. | Parameter | Type | Required | Description | | - | - | - | - | | `s3_path` | `string` | No | An `s3://bucket/prefix` path to list under. Omit to list buckets. | **Output:** a tabular list of buckets, or of objects under the given path. ### `cw_cwobject_bucket_describe` Describe a CoreWeave AI Object Storage bucket, including its organization, location, usage, and audit-logging status. | Parameter | Type | Required | Description | | - | - | - | - | | `bucket_name` | `string` | Yes | The bucket name. | **Output:** the bucket description, as tabular text. ## Write actions Write actions run with the authenticated caller's identity and permissions. Unlike the other tool families, these tools can change CoreWeave resources. > [!WARNING] > > These tools modify resources and can cause destructive changes. They are available only to > organizations where CoreWeave has enabled write tools. Verify every input before calling them. ### `coreweave_kubectl_apply` Apply a Kubernetes YAML or JSON manifest to a named CKS cluster by using `kubectl apply` in an identity-isolated CoreWeave sandbox. | Parameter | Type | Required | Description | | - | - | - | - | | `cluster_name` | `string` | Yes | Exact CKS cluster name. | | `manifest` | `string` | Yes | Kubernetes YAML or JSON manifest to apply. | | `dry_run` | `boolean` | No | The tool ignores this parameter and still applies the manifest. | | `plan_token` | `string` | No | The tool ignores this parameter and still applies the manifest. | **Output:** a JSON object containing the command exit code, standard output, standard error, and truncation details. ### `coreweave_inference_update_deployment` Update selected runtime, instance type, or autoscaling fields on a CoreWeave Inference deployment. The tool preserves fields that you omit. It reads the current deployment before sending the complete writable specification to the Inference API. Parameter names that contain a dot are literal top-level keys, not nested objects. For example, send `{"id": "[DEPLOYMENT-ID]", "autoscaling.max": 4}`. Supply `id` and at least one field to update. | Parameter | Type | Required | Description | | - | - | - | - | | `id` | `string` | Yes | Inference deployment ID. | | `runtime.engine` | `string` | No | Inference runtime engine, such as `vllm`. | | `runtime.version` | `string` | No | Inference runtime version. | | `runtime.engineConfig` | `object` | No | Replacement engine-configuration map with `string` values. Include every flag to keep. An empty object clears all engine flags. Omit this parameter to keep the current flags. | | `resources.instanceType` | `string` | No | CoreWeave instance type used by each deployment replica. | | `autoscaling.max` | `number` | No | Maximum replica count, expressed as a positive whole number. | | `autoscaling.concurrency` | `number` | No | Target request concurrency per replica, expressed as a positive whole number. | **Output:** a JSON object that describes the updated deployment. # About capacity plans Source: https://docs.coreweave.com/platform/capacity-plans Learn about the different capacity plans available for CoreWeave Kubernetes Service (CKS) A capacity plan defines how you secure and pay for compute capacity on the CoreWeave platform. It governs your commitment level, billing structure, and capacity guarantees. The right choice affects your costs, availability, and flexibility. This page explains the capacity plans available on CoreWeave Kubernetes Service (CKS), compares their trade-offs, and describes how usage from each plan appears on your invoice. Use it to decide which plan or combination of plans fits your workload before you configure clusters or contact your Account Executive. CoreWeave Kubernetes Service (CKS) offers four capacity plans: * [Flex Reservations](#flex-reservations) * [Reserved Instances](#reserved-instances) * [Spot Instances](#spot-instances) * [On-Demand](#on-demand) The following table compares them by capacity, commitment, and pricing: | | Flex Reservations | Reserved Instances | Spot Instances | On-Demand | | :- | :- | :- | :- | :- | | **Capacity guarantee** | Yes | Yes | No | No | | **Commitment** | Term duration | Term duration | None | None | | **Preemptible** | No | No | Yes | No | | **Pay-as-you-go** | Yes for usage rate No for holding rate | No | Yes | Yes | | **Ideal for** | Variable usage curves | Fixed workloads | Ad-hoc, interruptible workloads | Ad-hoc workloads | Each capacity plan balances cost and flexibility differently. Workloads with uneven capacity demands benefit from the **Flex** model. Fixed workloads work best with the low flat rate of a **Reserved Instance**. ## Flex Reservations Flex Reservations provide guaranteed peak capacity while reducing the cost of idle capacity. This model suits critical workloads that need guaranteed capacity but have low enough utilization to make full-time Reserved Instances cost-prohibitive. ### Dual-rate billing structure Flex uses two rates: a **Holding** rate for reserved capacity and a **Usage** rate when instances are active. * **Holding rate:** A baseline fee that guarantees capacity is held for you. This rate applies to all reserved capacity throughout the billing cycle. * **Usage rate:** An incremental fee applied only when instances are active in your cluster. With Flex Reservations, **reserved** Nodes are billed at the Holding rate throughout the billing cycle, while **used** Nodes are billed at the Usage rate. The following graphic illustrates Node usage over the course of a month versus a constant peak capacity line. ![Area chart of Node usage over the course of a month versus a constant peak capacity line. Usage varies. The peak line is the committed capacity ceiling.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/platform/capacity-plans/_media/holding-rate-vs-usage-rate.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=8317ae28dbeed65dbf8a7167f385e0ba) ## Reserved Instances Reserved Instances (RI) provide a guaranteed capacity reservation. During your term commitment, the reserved instances are available in your chosen region regardless of platform-wide demand. You pay a flat rate for every hour in the billing period, regardless of whether instances are running or idle. ## Spot Instances Spot Instances provide access to unused CoreWeave capacity at reduced rates. Spot Instances are preemptible, so CoreWeave can reclaim them at any time if the capacity is required elsewhere. They work well for fault-tolerant or stateless workloads like AI inference. Spot Instances are managed through [Spot Node Pools](/platform/capacity-plans/spot-node-pools). To find a Zone most likely to fulfill a Spot request, use [Capacity Finder](/platform/capacity-plans/capacity-finder) in the Cloud Console. ## On-Demand On-Demand instances provide burst capacity for unpredictable workloads, where you need to scale up to meet demand. These instances are billed based on actual use without a long-term commitment. They have no capacity guarantees. During peak demand periods, On-Demand instances may not be available. ## Understand billing and usage attribution Combining capacity plans lets you reserve a "floor" of capacity for steady-state workloads while keeping headroom for spikes. The billing pipeline attributes usage at the **SKU level** and produces an itemized invoice from your contract terms and real-time usage with separate line items for Reserved Instances, Flex holding fees, and Flex usage rates. The following sections describe what appears on your invoice, the order in which usage is attributed across plans, and how each line item is calculated. ### What appears on your invoice Billing reconciles all consumption into one invoice. Each line item shows the SKU, quantity (hours), and the applied rate type. The following table illustrates how a typical month might be broken out for a customer with a B200 Flex Reservation who also used On-Demand, plus RTX PRO 6000 Spot capacity. | Line item | Quantity | Rate type | How usage is attributed | | :- | :- | :- | :- | | B200 (Flex reservation) | 720 hours | Holding rate | Applied to every hour in the billing period to hold the reserved capacity. | | B200 (Active usage) | 300 hours | Usage rate | Applied only to hours when Flex Nodes are active in your cluster. | | B200 (On-Demand) | 12 hours | Standard rate | Usage exceeded Flex capacity during a peak, attributed as On-Demand overage. | | RTX PRO 6000 (Spot node pool) | 100 hours | Spot rate | Separate compute class, attributed outside the RI, Flex, and On-Demand filling logic. | ### Order of attribution Attribution runs every 30 seconds. For each SKU, usage is applied in this order: 1. **Reserved Instances:** Usage fills all available Reserved Instance capacity first. 2. **Flex:** Remaining usage is applied to the Flex capacity band. 3. **On-Demand:** Usage beyond the sum of Reserved Instance and Flex capacity is billed as On-Demand overage. Nodes with Spot compute class are handled separately and appear as their own line items on the invoice. ### How each line item is applied The following list describes how each rate type contributes to your invoice: * **Flex (Holding + Usage):** The Holding rate applies to every hour in the period (for example, 720 hours in a 30-day month) to guarantee the reservation. The Usage rate applies only to the hours when Flex Nodes are active in the cluster. Total Flex cost is the sum of those two components. * **On-Demand:** When usage for a SKU exceeds your Reserved Instance and Flex capacity, the excess is attributed at the standard On-Demand rate. In the preceding table, the 12 On-Demand hours represent a peak that goes beyond the Flex ceiling. * **Spot:** Workloads scheduled on [Spot Node Pools](/platform/capacity-plans/spot-node-pools) are billed at the Spot rate for that SKU and region. Spot is tracked as a separate compute class, so it doesn't consume or affect your RI or Flex capacity. For SKU-specific pricing or to convert a Flex Reservation to a Reserved Instance, contact your CoreWeave Account Executive. ## Request more capacity When you need more hardware than you've provisioned, the path depends on the plan. Reserved Instances and Flex Reservations are set up commercially through your Account Executive, quota increases go through a support ticket, and Spot capacity is self-serve through [Spot Node Pools](/platform/capacity-plans/spot-node-pools). Keep capacity, quota, and capacity plans distinct: capacity is whether the hardware physically exists in an Availability Zone, quota is the ceiling your organization is allowed to provision (see [Quota self-service](/products/cks/clusters/quotas)), and a capacity plan is how you commit to and pay for it over time. Provide all of the following on the first message so the request can be evaluated without follow-up questions: * **Organization name** and the relevant namespace. * **Instance type or GPU SKU**, named exactly. See [About instances](/platform/instances/about-instances). * **Node count** you need, and whether that's a firm number or a range. * **Region or Availability Zone**, or a short list of acceptable Zones if you're flexible. * **Capacity plan preference**: Spot, On-Demand, Flex Reservation, or Reserved Instance. * **Timeframe**: when you need it and for how long. * **Workload summary**: training, inference, or batch, and whether it's interruptible. Lead time varies with what you ask for. Spot capacity is available immediately when a Zone has room but is preemptible, On-Demand is available when the platform has spare capacity for that SKU, and Reserved or Flex capacity for constrained GPU SKUs can require planning ahead. Your Account Executive gives you the authoritative timeline for a specific request. For a reusable per-domain checklist, see [Ticket templates](/support/ticket-templates). # Capacity Finder Source: https://docs.coreweave.com/platform/capacity-plans/capacity-finder Find which Availability Zones are most likely to support your capacity needs before you create a Spot Node Pool **This documentation describes CoreWeave's ("CW") Capacity Finder product (delivered via console or API). Data, content, images, links and other information generated by or accessed in relation to Capacity Finder constitutes CW's property and confidential information ("Capacity Data"). Do not share such Capacity Data, including without limitation screenshots, exports, API responses, or related links outside your company.** To the extent your company's agreement(s) with CW include confidentiality obligations, the Capacity Data is confidential thereunder; otherwise, you agree to keep it confidential and not disclose it without CW's prior written consent. The Capacity Data is provided for general informational purposes only, without warranty, and to the maximum extent permitted by law, CW disclaims liability arising from its use, including any reliance on it for capacity planning, purchasing, or other business decisions. Any agreement(s) between your company and CW shall govern in the event of any conflict with this notice. Capacity Finder is a tool in the Cloud Console that compares Spot capacity across Availability Zones for one or more GPU and CPU instance types. Use it before you create a [Spot Node Pool](/platform/capacity-plans/spot-node-pools) to find a Zone and instance type where your request is likely to fit. To check capacity programmatically, use the [Capacity Finder API](/platform/capacity-plans/capacity-finder-api). Spot Node Pools draw from unreserved CoreWeave capacity, so a given Zone might not have room for the instances you want. Capacity Finder helps you target Zones with available capacity in the following ways: * Compare GPU and CPU capacity in the same search or search for GPU or CPU instances separately. * Search every eligible Zone or limit the search to selected Zones. * Compare multiple instance types at once and size the request by Node count or, for CPU instances, minimum virtual CPUs (vCPUs). * Continue from a result to provision capacity, create a cluster, or request cluster quota. ## Limitations Before you rely on Capacity Finder results, review the following constraints on what it evaluates and how its data is refreshed. * Capacity Finder only evaluates [General Access Zones](/platform/regions/about-regions-and-azs). Single-tenant or reserved Zones aren't included in results. * Capacity Finder does not consider Superchip-powered instance types (for example, GH200, GB200, GB300), which are [not supported by Spot Node Pools](/platform/capacity-plans/spot-node-pools#availability). * Capacity Finder uses cached capacity samples that CoreWeave refreshes on a fixed cadence. Results reflect the most recent refresh, not live inventory. * Capacity Finder is informational. Results don't guarantee a reservation. Capacity can shift between the query and provisioning, and Spot Node Pools remain [preemptible](/platform/capacity-plans/spot-node-pools#instance-preemption) after you create them. ## Use Capacity Finder in the Cloud Console To compare Spot capacity, choose the instance types, requested capacity, and Zones that Capacity Finder evaluates. Capacity Finder evaluates Spot capacity only. 1. In the Cloud Console, open the **Compute** page and select the **Capacity finder** tab. 2. Select **GPU only**, **CPU only**, or **Both GPU and CPU**. **GPU only** is selected by default. 3. Under **Zones**, select one of the following options: * **All zones** searches every eligible Zone. * **Choose zones** searches one or more Zones that you select. 4. Configure the GPU or CPU instance types in the search: * **GPU instance types**: Select one or more GPU instance types, then enter the **Node count** to evaluate for each type. * **CPU instance types**: Select one or more CPU instance types, or select **Any CPU instance** to compare all eligible CPU instance types. Enter the **Node count**, or click **Use minimum vCPUs** and enter the minimum number of vCPUs that your workload requires. Click **Use node count** to switch back. 5. Click **Find capacity**. Capacity Finder displays a results table for the request. Click **Reset** to clear the search and its results. ![The Capacity Finder search form with GPU only, All zones, L40, and L40S selected, with a Node count of 1.](https://mintcdn.com/coreweave-dbfa0e8d/YBD2LfRP8C5NhLrH/platform/capacity-plans/_media/capacity-finder-form.png?fit=max\&auto=format\&n=YBD2LfRP8C5NhLrH\&q=85\&s=c84a4a3f634e5a65dff8dd9c79e420c3) ## Review Capacity Finder results The results table reports how many Zones match your request. For a combined GPU and CPU search, review the GPU and CPU availability groups in each Zone to compare alternatives. Each row shows: * The Zone name and, when applicable, a **Recommended**, **Cluster required**, or **Quota required** status. * A **Spot GPU** column, a **Spot CPU** column, or both, depending on the selected instance types. * Instance types grouped by their availability label. When a group contains more instance types than the table initially shows, click its **+N** control to expand the group. * An action for the next step in that Zone. ![Results for a GPU-only search with Zone, Spot GPU, and Actions columns. US-EAST-04A is recommended, with likely available GPU instances and a Provision action.](https://mintcdn.com/coreweave-dbfa0e8d/YBD2LfRP8C5NhLrH/platform/capacity-plans/_media/capacity-finder-results.png?fit=max\&auto=format\&n=YBD2LfRP8C5NhLrH\&q=85\&s=f8d80ee79b14a9fe0e94a6a7aa6dff0c) ## Result ranking By default, **Recommended** Zones appear first. A Zone is recommended when you already operate a cluster there and the requested capacity is likely to be available. Select the **Zone**, **Spot GPU**, or **Spot CPU** table heading to change the sort order. ## Availability labels Capacity Finder groups instance types under one of five labels derived from a placement score. Use this table to interpret what each label means for your provisioning decision. | Label | Meaning | | :- | :- | | Likely available | Comfortable or abundant capacity for the requested capacity. The request is most likely to fit. | | Possibly available | Capacity is close to the requested capacity. Full or partial fulfillment is possible. | | Limited availability | Capacity is well below the requested capacity. The request is unlikely to fit at the requested capacity. | | Not available | The Zone has zero allocatable Nodes of the requested instance type. | | SKU not available | This instance type is not available in this Zone. Check a different Zone if you need this specific SKU. | ## Act on a Capacity Finder result The action in each result depends on your cluster and quota access in that Zone: * **Provision**: You already operate a cluster in the Zone. Open the **Provision capacity** drawer to configure one or more Spot Node Pools. * **Create cluster**: Your organization has cluster quota in the Zone, but you don't operate a cluster there. Create a cluster, then return to Capacity Finder or use the **Node pools** tab to provision the Spot Node Pool. * **Request cluster quota**: Your organization needs cluster quota in the Zone. Review the pre-filled quota request, enter any additional context, and click **Send Request**. Some requests are approved automatically without a notification. Refresh the page to check whether the action has changed to **Create cluster**, which indicates that cluster quota is granted. After approval, create a cluster before you provision the Spot Node Pool. ## Provision Spot Node Pools from a result Capacity Finder can pre-fill GPU and CPU Spot Node Pool forms from a result where you already operate a cluster. If your organization has no Spot quota for an instance type in the selected cluster's Zone, the drawer shows **Limit Reached** and prompts you to [contact Support](/support/contact) before provisioning. 1. In the result row, click **Provision**. 2. In **1. Choose a CKS cluster**, select a cluster in the result's Zone. 3. Under **2. Configure capacity**, review the Node Pool forms for your search. If you searched for both GPU and CPU instances, **Node pools to provision** lets you choose to provision either type or both. 4. For each Node Pool that you want to provision, configure the fields: * **Node pool name**: Enter a name for the Node Pool. * **Instance type**: Confirm or change the pre-filled instance type. * **Node count**: Confirm or change the request size. For a CPU Node Pool, you can click **Use minimum vCPUs** to enter a vCPU requirement instead. 5. Optional: Click **Edit YAML** to review or edit the generated Node Pool manifest. 6. Click **Provision capacity**. The new Node Pools appear in the selected cluster and follow the standard Spot Node Pool lifecycle, including instance preemption. The following example shows the GPU Node Pool form for the GPU-only search shown earlier. ![The Provision capacity drawer for a GPU-only search, with a GPU Node Pool form, L40 availability and quota indicators, Node count, Edit YAML, and the Provision capacity button.](https://mintcdn.com/coreweave-dbfa0e8d/YBD2LfRP8C5NhLrH/platform/capacity-plans/_media/capacity-finder-provision-drawer.png?fit=max\&auto=format\&n=YBD2LfRP8C5NhLrH\&q=85\&s=4fe59b1aa6659f3900ffee77e52cf95d) ## Next steps * Review [Spot Node Pools](/platform/capacity-plans/spot-node-pools) to prepare your workloads for preemption. * Check [Node Pool status](/products/cks/nodes/nodepool-status) to diagnose capacity or quota issues after provisioning. # Capacity Finder API Source: https://docs.coreweave.com/platform/capacity-plans/capacity-finder-api Find which Availability Zones are most likely to support your capacity needs before you create a Spot Node Pool **This documentation describes CoreWeave's ("CW") Capacity Finder product (delivered via console or API). Data, content, images, links and other information generated by or accessed in relation to Capacity Finder constitutes CW's property and confidential information ("Capacity Data"). Do not share such Capacity Data, including without limitation screenshots, exports, API responses, or related links outside your company.** To the extent your company's agreement(s) with CW include confidentiality obligations, the Capacity Data is confidential thereunder; otherwise, you agree to keep it confidential and not disclose it without CW's prior written consent. The Capacity Data is provided for general informational purposes only, without warranty, and to the maximum extent permitted by law, CW disclaims liability arising from its use, including any reliance on it for capacity planning, purchasing, or other business decisions. Any agreement(s) between your company and CW shall govern in the event of any conflict with this notice. > [!WARNING] > > The Capacity Finder API is in beta. Its request and response behavior can change, including in ways that are not backward compatible. Capacity Finder helps you find Availability Zones where your GPU or CPU capacity request is likely to fit before you provision Nodes. It evaluates [Spot capacity](/platform/capacity-plans/spot-node-pools) only. Spot Node Pools provide preemptible, pay-as-you-go compute with no long-term commitments. Use the Capacity Finder API to compare capacity programmatically. Send the instance types and Node counts you need, then use the ranked results to choose a Zone. To check capacity in the Cloud Console, see [Capacity Finder](/platform/capacity-plans/capacity-finder). Capacity Finder returns guidance from cached capacity data. Results do not reserve Nodes or guarantee that provisioning succeeds. ## Authentication Use a [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens) for your organization. Send the token in the `Authorization` header with the `Bearer` scheme. Capacity Finder requires an authenticated organization. It does not require an additional Capacity Finder-specific role or permission. Permissions to create and manage API access tokens are separate. See [Manage API access tokens](/security/authn-authz/manage-api-access-tokens). ## Request capacity availability Send a JSON request to `POST https://api.coreweave.com/v1beta1/capacity/availability:get` with the following fields: * `selections`: One or more instance types, each paired with a `requestedCount`. Find the instance type identifier in the [instance documentation](/platform/instances/about-instances). Use each instance type at most once. The Node count must be a positive whole number from `1` to `2147483647`, encoded as a JSON integer, such as `8`. Fractional Node counts are not supported. * `capacityPlans`: An array containing exactly one value, `CAPACITY_PLAN_SPOT`, the only supported capacity plan. * `zones`: Optional [Availability Zone identifiers](/platform/regions/all-availability-zones). Omit this field or send an empty array to evaluate all eligible Zones. Ineligible Zones are ignored. Replace `[API-ACCESS-TOKEN]` with your token. Choose an instance type and Zone supported by the service for your request. ```bash title="Request capacity availability" theme={"system"} export COREWEAVE_API_TOKEN='[API-ACCESS-TOKEN]' curl --request POST \ 'https://api.coreweave.com/v1beta1/capacity/availability:get' \ --header "Authorization: Bearer ${COREWEAVE_API_TOKEN}" \ --header 'Content-Type: application/json' \ --data '{ "selections": [ { "instanceType": "gd-8xh100ib-i128", "requestedCount": 8 } ], "capacityPlans": ["CAPACITY_PLAN_SPOT"], "zones": ["US-EAST-04A"] }' ``` For the request and response schemas, see [Get capacity availability](/platform/capacity-plans/capacity-finder-api/capacityservice/get-capacity-availability). ## Interpret the results The response contains a flat `results` array. Each result identifies an Availability Zone, an instance type, a capacity plan, and a `score`. Results are sorted by descending score. Ordering for results with the same score is alphabetical by instance type and Zone. The score indicates how favorable capacity is for your requested Node count, based on cached data. Scores go up to `0.95`, the highest availability score. Use higher scores to prioritize Zones where your request is more likely to fit. A score of `0.8` does not mean an 80% chance of successful provisioning, and even the highest score does not guarantee success. Results include only Zones with available capacity for the instance type. A selection with no available capacity in any evaluated Zone contributes no results. A successful response can have no results. In that case, the response is `{}` with the `results` field omitted. Treat an absent `results` field as an empty result. You should not expect a result for every requested Zone and instance type. An unknown instance type fails the request instead of returning an empty result. The following response illustrates the result shape, not current capacity: ```json title="Example response" theme={"system"} { "results": [ { "zone": "US-EAST-04A", "score": 0.8, "instanceType": "gd-8xh100ib-i128", "capacityPlan": "CAPACITY_PLAN_SPOT" } ] } ``` After you choose a Zone, [create a Spot Node Pool](/platform/capacity-plans/spot-node-pools#create-a-spot-node-pool) to request capacity. Capacity can change between the query and provisioning. # Get capacity availability Source: https://docs.coreweave.com/platform/capacity-plans/capacity-finder-api/capacityservice/get-capacity-availability /openapi/capacity-finder/openapi.yaml post /v1beta1/capacity/availability:get Find which Availability Zones are most likely to support the instance types and Node counts you request. **This documentation describes CoreWeave's ("CW") Capacity Finder product (delivered via console or API). Data, content, images, links and other information generated by or accessed in relation to Capacity Finder constitutes CW's property and confidential information ("Capacity Data"). Do not share such Capacity Data, including without limitation screenshots, exports, API responses, or related links outside your company.** To the extent your company's agreement(s) with CW include confidentiality obligations, the Capacity Data is confidential thereunder; otherwise, you agree to keep it confidential and not disclose it without CW's prior written consent. The Capacity Data is provided for general informational purposes only, without warranty, and to the maximum extent permitted by law, CW disclaims liability arising from its use, including any reliance on it for capacity planning, purchasing, or other business decisions. Any agreement(s) between your company and CW shall govern in the event of any conflict with this notice. > [!WARNING] > > The Capacity Finder API is in beta. Its request and response behavior can change, including in ways that are not backward compatible. For request guidance and result interpretation, see the [Capacity Finder API overview](/platform/capacity-plans/capacity-finder-api). Authenticate with a [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens) in the `Authorization: Bearer [API-ACCESS-TOKEN]` header. Capacity Finder requires an authenticated organization but no additional Capacity Finder-specific role or permission. Send at least one selection and exactly one capacity plan, `CAPACITY_PLAN_SPOT`, the only supported plan. Each selection must use a distinct instance type and a positive whole-number Node count. Encode `requestedCount` as a JSON integer, such as `8`, up to `2147483647`. Scores reflect cached capacity and go up to `0.95`. Higher scores indicate more favorable availability. They do not reserve Nodes or guarantee provisioning. Results include only Zones with available capacity for the instance type. # Spot Node Pools Source: https://docs.coreweave.com/platform/capacity-plans/spot-node-pools Preemptible, pay-as-you-go bare-metal compute resources in CKS with no long-term commitments Spot Node Pools provide pay-as-you-go access to high-performance bare-metal compute resources without long-term commitments or reservations. They are suited for fault-tolerant, interruptible workloads where flexibility on capacity matters more than guaranteed availability. Instances in a Spot Node Pool are identical to instances in standard Node Pools. The key difference is that instances in Spot Node Pools operate on a preemptible basis, meaning CoreWeave can reclaim them when capacity is needed elsewhere. You can manage Spot Node Pools using the [same tools and methods](/products/cks/nodes/manage) as standard Node Pools. The instances themselves have no special configuration. An instance becomes a Spot instance by being part of a Node Pool created with `computeClass: spot`. ## Key characteristics * **Availability**: Capacity for Spot Node Pools is not guaranteed and depends on current availability in the region. * **Preemptible**: Unlike instances in on-demand Node Pools, CoreWeave can reclaim instances in Spot Node Pools at any time if the capacity is required elsewhere. * **Automatic scaling**: When all instances are preempted, the Spot Node Pool remains active and automatically scales back up when capacity becomes available again. ## Availability Spot Node Pools are supported in all [General Access](/platform/regions/about-regions-and-azs#general-access) Availability Zones, and for all [instance types](/platform/instances/about-instances) except Superchip-powered instances (for example, GH200, GB200, GB300). ## Check Spot capacity before you provision Spot capacity is not guaranteed and varies by Availability Zone. Before you create a Spot Node Pool, use [Capacity Finder](/platform/capacity-plans/capacity-finder) in the Cloud Console to compare placement availability across Zones for one or more GPU and CPU instance types and your requested size. Capacity Finder can also pre-fill Spot Node Pools from a recommended Zone. ## Create a Spot Node Pool Create a Spot Node Pool by setting the `computeClass` field to `spot` in your Node Pool configuration in either a Kubernetes manifest or the Cloud Console. See [Create a Node Pool](/products/cks/nodes/create) for more information. ### Use Kubernetes To create a Spot Node Pool using Kubernetes, set the `spec.computeClass` field to `spot` in your Node Pool manifest. ```yaml theme={"system"} apiVersion: v1 kind: NodePool metadata: name: my-spot-pool spec: region: EU-SOUTH-04A computeClass: spot # ... other configuration ... ``` ### Use the Cloud Console To create a Spot Node Pool using the Cloud Console, set the **Compute Class** to `spot` in the configuration settings. 1. Navigate to the **Node Pools** dashboard. 2. Click **Create Node Pool**. 3. In the configuration settings, enter `spot` as the **Compute Class** string (`spec.computeClass`). ## Instance preemption Because instances in Spot Node Pools are preemptible, CoreWeave may reclaim them when capacity is needed elsewhere. When this happens, a controlled preemption process removes instances from the pool. When CoreWeave selects an instance for preemption, the process provides a seven-minute window (maximum) to gracefully stop running jobs and save state before the instance leaves the pool. The following timeline describes each phase of that window and the signals your workloads receive at each stage. ### Detailed timeline #### Warning and cordon (T=0:00) When CoreWeave designates an instance for preemption, it immediately [cordons](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/) the Node to prevent scheduling new jobs. Running jobs continue executing normally at this stage. The system sends a [Kubernetes warning event](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_events/) with the reason `Preemption pending` and applies the label `qos.coreweave.cloud/pending-preemption: true` to the Node. This is your application's initial signal that preemption is imminent. #### Drain and signal (T=0:02) Two minutes after the initial warning, CoreWeave automatically initiates a [Node drain](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/) to terminate workloads. The system sends another Kubernetes warning event with the reason `Preemption in progress` and applies the label `qos.coreweave.cloud/evicted-at: [timestamp]` to track when the drain started. At this point the normal [Kubernetes Pod termination process](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination) starts. 1. Kubernetes triggers any [Pod PreStop lifecycle hooks](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks). 2. Kubernetes sends a Linux [`SIGTERM` signal](https://en.wikipedia.org/wiki/Signal_\(IPC\)#SIGTERM) to all running processes to indicate that the Pod is terminating. This gives processes an opportunity to perform graceful shutdown procedures that the PreStop lifecycle hooks didn't trigger. 3. The system waits for 30 seconds, or the length of time specified in the Pod's [`terminationGracePeriodSeconds`](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution). 4. After the grace period, Kubernetes sends a [`SIGKILL` signal](https://en.wikipedia.org/wiki/Signal_\(IPC\)#SIGKILL) to any remaining running processes in the Pod. Processes can't catch or ignore this signal, and the receiving process can't perform any cleanup. The process terminates immediately. #### Removal from pool (T=0:07) When the Node fully drains or when the seven-minute window expires (whichever comes first), CoreWeave removes the instance from your cluster and Spot Node Pool. The system sends a final Kubernetes warning event with the reason `Deleted for preemption` to confirm the removal is complete. ### Sequence diagram ```mermaid theme={"system"} sequenceDiagram autonumber participant CW as CoreWeave Control Plane participant K8s as Kubernetes Node participant App as User Workload Note over CW, App: Preemption Sequence (Approx. 7 Minute Window) Note right of CW: Phase 1: Warning (T=0:00) CW->>K8s: Designate for Preemption CW->>K8s: Cordon Node (Block Scheduling) CW->>K8s: Apply Label: qos.coreweave.cloud/pending-preemption: true K8s->>App: Event: Preemption pending Note over App: App continues running.
Can detect event to start save/exit. Note right of CW: Phase 2: Drain (T=0:02) CW->>K8s: Initiate Drain (2 mins after Warning) CW->>K8s: Apply Label: qos.coreweave.cloud/evicted-at: [timestamp] K8s->>App: Event: Preemption in progress K8s->>App: Send SIGTERM Note over App: App receives SIGTERM.
Executes graceful shutdown or preStop hook. Note right of CW: Phase 3: Removal (T~0:07) opt Cleanup Finishes Early App-->>K8s: Process Exits end CW->>K8s: Force Remove Node (Max 7 mins) K8s->>CW: Node Deleted CW->>CW: Event: Deleted for preemption ``` ## Fully preempted Spot Node Pools If all instances in a Spot Node Pool are preempted, the pool itself remains active but effectively scales to zero instances. The Spot Node Pool continues to exist in your cluster configuration and automatically attempts to provision new instances when capacity becomes available again in the region. Your workloads remain in a pending state until instances rejoin the pool. ## Handle preemption events Your application must handle preemption events gracefully and tolerate preemption without causing data loss or downtime. If your application doesn't natively handle [`SIGTERM` signals](https://en.wikipedia.org/wiki/Signal_\(IPC\)#SIGTERM) for graceful shutdown, use a [Kubernetes PreStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks) in your Pod definition to trigger the necessary cleanup steps before the container terminates. CKS-initiated scale-down doesn't wait for DaemonSets unless they carry `qos.coreweave.com/graceful-interruptible: "true"` and don't tolerate eviction taints. If a DaemonSet on a Spot Node must finish work before the Node leaves, label it accordingly. ## Mix Spot and on-demand capacity A common pattern runs the resilient majority of a workload on Spot and keeps a smaller on-demand Node Pool for the parts that can't be interrupted. Schedule interruptible replicas onto the Spot pool, and pin critical singletons to an on-demand pool with a `nodeSelector`. To target Pods to a specific pool, see [Workload scheduling on CKS](/products/cks/clusters/scheduling/workload-scheduling). ## Monitor preemption events You can watch for preemption warnings using [`kubectl events`](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_events/): ```bash theme={"system"} kubectl events --types=Warning --watch | grep "Reason: Preemption pending" ``` ### Search for preempted Nodes in Grafana To check whether CoreWeave preempted any of your Nodes, use Grafana Explore with the preconfigured preemption query. The query returns Nodes that CoreWeave removed due to preemption. Preemption logs are retained for 1 week. [Open preemption query in Grafana Explore](https://grafana.int.coreweave.com/explore?schemaVersion=1\&panes=%7B%223vx%22%3A%7B%22data%22%3A%7B%22datasource%22%3A%22loki%22%2C%22queries%22%3A%5B%7B%22refId%22%3A%22A%22%2C%22expr%22%3A%22%7Bapp%3D%5C%22node-lifecycle%5C%22%7D%20%7C%3D%20%5C%22preempt%5C%22%22%7D%5D%2C%22range%22%3A%7B%22from%22%3A%22now-24h%22%2C%22to%22%3A%22now%22%7D%7D%7D%7D%7D\&orgId=1) For more information about Pod termination, see [Termination of Pods](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination) in the Kubernetes documentation. ## Monitor Spot usage To track Spot instance usage and estimate costs, use Grafana with the `billing:instance:total` metric and filter by `compute_class="spot"`. This example groups Spot usage by instance type: ```text theme={"system"} sum by (label_node_kubernetes_io_instance_type) ( billing:instance:total{compute_class="spot"} ) ``` For the full list of labels on this metric, more query examples, and cost-estimation techniques, see [Cost and usage monitoring](/observability/usage-monitoring). For a Cloud Console view of Spot usage alongside your other capacity plans, see [Billing insights](/billing/billing-insights). ## Next steps * Use [Capacity Finder](/platform/capacity-plans/capacity-finder) to compare Spot capacity across Availability Zones. * Configure [workload scheduling on CKS](/products/cks/clusters/scheduling/workload-scheduling) to target Pods to the appropriate Node Pools. # Introduction to CoreWeave Skills Source: https://docs.coreweave.com/platform/coreweave-skills Agent Skills that let your coding agent carry out CoreWeave workflows on your behalf. > [!NOTE] > > CoreWeave Skills are in public preview. The skills available and their behavior may change while > the collection is in preview. To report a problem with a skill or request a new one, open an issue > in the [coreweave/skills](https://github.com/coreweave/skills) repository or > [contact support](/support/contact). CoreWeave Skills are [Agent Skills](https://agentskills.io), an open format for packaging the instructions an AI coding agent needs to carry out a task. Each skill is a guided workflow for one CoreWeave operation: it covers the prerequisites, the commands to run, and the checks that confirm the result. You install the skills once, then describe what you want in plain language. Your agent selects the skill that matches your request and runs it. Skills are content, not a hosted CoreWeave service. Each one is a directory of Markdown instructions, and sometimes supporting scripts and reference files, that stays inert until your own coding agent loads it. From that point on, the agent runs on your machine with the tools and credentials you have given it. Any CoreWeave resources it creates or changes belong to your organization and bill to your account. ## Prerequisites Before you install the skills, make sure you have the following: * [Claude Code](https://docs.claude.com/en/docs/claude-code/overview) or another agent that supports Agent Skills. CoreWeave publishes and tests the skills for Claude Code, and the install steps on this page use Claude Code's plugin marketplace. Other agents that read the format, such as Cursor and Codex, can load the same skill files, but CoreWeave does not document or test those install paths. * A CoreWeave account. Individual skills have their own requirements, such as a CoreWeave API token, `kubectl`, Terraform, a Hugging Face account, or available quota. Skills that provision or change resources check their prerequisites before they start and report anything that is missing. ## Install the skills The [coreweave/skills](https://github.com/coreweave/skills) repository is the only official distribution channel for CoreWeave Skills. Claude Code installs them from a plugin marketplace served directly from the repository, so you don't need to clone it. > [!WARNING] > > CoreWeave does not publish these skills through third-party marketplaces or skill directories. > Treat forks, modified copies, and any other source as untrusted until you have reviewed them. 1. Add the CoreWeave marketplace. You do this once per machine. ```text theme={"system"} /plugin marketplace add coreweave/skills ``` 2. Install each plugin you want, replacing `[PLUGIN]` with a plugin name. CoreWeave recommends `coreweave-platform-skills` alongside the plugins for the product lines you use. ```text theme={"system"} /plugin install [PLUGIN]@coreweave-skills ``` 3. Load the new skills into your current session. ```text theme={"system"} /reload-plugins ``` The skills in the plugins you installed are now available in your session, and you can start one by describing what you want in plain language. For the full install and upgrade procedure, including how to trigger a skill by name, see the [coreweave/skills README](https://github.com/coreweave/skills#install-the-skills). ### Install with the `skills` CLI To install the skills with the [`skills` CLI](https://www.npmjs.com/package/skills), run `npx skills add coreweave/skills`. The skills are then pulled from the `dist` branch of the [coreweave/skills](https://github.com/coreweave/skills) repository. Start a new session with your agent to load them. To update the skills you installed with the CLI, run `npx skills update`. > Note that `npx skills update` will not pull new skills. You will need to rerun the `add` command to see the latest skills that were published to the > [coreweave/skills](https://github.com/coreweave/skills) repository. By contrast, managing your skills by [using the plugin](#install-the-skills) will always pull the latest skills when the plugin is updated. ## Find the available skills Skills are grouped into plugins: one plugin of cross-cutting platform skills, plus one plugin per CoreWeave product line, so that you install only the skills your sessions require. For the plugins available and the skills in each, see [What's available](https://github.com/coreweave/skills#whats-available) in the repository. The collection changes over time. CoreWeave adds skills, revises existing ones, and withdraws skills that a newer workflow replaces. Each plugin is versioned and released independently and has its own changelog. For what changed and when, see the [releases](https://github.com/coreweave/skills/releases) in the repository. To list the skills you have installed, ask your agent which CoreWeave skills are available. ## Run skills safely A skill's prompts, checkpoints, and verification steps are guidance, not technical access controls. The agent acts with whatever permissions you have given it. The decisions that keep a session safe are yours: which credentials the agent can reach, which account and region it acts on, and which actions you approve. Before you load or run a skill, take the following precautions: * Read the skill's `SKILL.md` file, which holds its instructions, and review any scripts it uses. * Use the least-privileged credentials available. * Prefer a non-production account or organization. * Check the expected costs of anything the skill provisions. Prompt injection can also affect skills and other content an agent processes. For the full guidance, including your responsibilities for the resources and charges a skill produces, see [License, safety, and responsibilities](https://github.com/coreweave/skills#license-safety-and-responsibilities) in the repository. ## Licensing CoreWeave Skills are proprietary and licensed only for use with CoreWeave products and services. The repository is publicly viewable, but the skills are not open source. CoreWeave and the CoreWeave logo are trademarks of CoreWeave, Inc. For the complete terms, including the restrictions on redistribution and on use of CoreWeave's trademarks, see the [LICENSE](https://github.com/coreweave/skills/blob/main/LICENSE) in the repository. ## Related resources > **[coreweave/skills](https://github.com/coreweave/skills)** > > The official repository: install instructions, the skill inventory, and safety guidance. > **[Mission Control MCP](/observability/mission-control-mcp)** > > Hosted read-only observability, cluster, and documentation tools for agents that support the > Model Context Protocol (MCP). > **[CoreWeave Terraform Provider](/platform/terraform)** > > Manage the same infrastructure declaratively as code instead of through an agent. > **[Get started with CoreWeave](/get-started)** > > Account setup, environment setup, and the onboarding paths the skills automate. # Developer tools Source: https://docs.coreweave.com/platform/developer-tools Automate CoreWeave with agents, the CLI, Terraform, and REST APIs. CoreWeave provides tools for working with your infrastructure from a terminal, a script, a CI pipeline, or an AI agent. Choose the tool that fits how you work. You can combine them: for example, define infrastructure in Terraform and investigate it with Mission Control. ## Choose a tool > **[CoreWeave Skills](/platform/coreweave-skills)** > > Agent Skills that let Claude Code and other compatible agents carry out CoreWeave workflows for you. > **[Mission Control Agent](/observability/mission-control-agent)** > > Investigate your environment through a conversational interface in the Cloud Console. > **[Mission Control MCP](/observability/mission-control-mcp)** > > Connect MCP-compatible AI clients to CoreWeave observability data and supported write actions. > **[CoreWeave Intelligent CLI](https://github.com/coreweave/cwic)** > > Manage clusters, Nodes, and other resources from the command line with `cwic`. > **[Terraform provider](/platform/terraform)** > > Manage CoreWeave Infrastructure as code. > **[REST APIs](/reference-home#infrastructure)** > > Browse the API references for CoreWeave Infrastructure. # About instances Source: https://docs.coreweave.com/platform/instances/about-instances Learn about CoreWeave compute instances and how to choose the right hardware for your workloads CoreWeave offers a range of compute instances for cloud workloads. Instances are the physical machines that run on CoreWeave's infrastructure. Each instance provides dedicated GPUs, CPUs, memory, storage, and networking resources used by CKS Nodes, LLM inference workloads, and other high-performance computing (HPC) workloads. > **[Selecting an instance](/platform/instances/selecting-an-instance)** > > Key considerations when selecting the right instance for your LLM workload > **[About NVL72-powered instances](/platform/instances/nvl72)** > > NVL72-powered instances deliver high performance, efficiency, and scalability > **[GPU instance details](/platform/instances/gpu-instances)** > > Detailed specifications and use cases for GPU instances > **[CPU instance details](/platform/instances/cpu-instances)** > > CPU instance options and performance characteristics > **[Instance pricing](https://www.coreweave.com/pricing)** > > Pricing for all instance types > **[Regional availability](/platform/instances/availability-matrix)** > > Regional availability for all instance types # Instance availability matrix Source: https://docs.coreweave.com/platform/instances/availability-matrix View which GPU and CPU instance types are available in each CoreWeave Availability Zone Use the tables below to find which instances are deployed in CoreWeave's General Access Availability Zones (AZs). Availability is subject to capacity. Dedicated Access AZs are not included. ## GPU instances | | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) | [EU-SOUTH-03B](/platform/regions/eu-south#eu-south-03b) | [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) | [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) | [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) | [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) | [US-EAST-01A](/platform/regions/us-east#us-east-01a) | [US-EAST-02A](/platform/regions/us-east#us-east-02a) | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | [US-EAST-06A](/platform/regions/us-east#us-east-06a) | [US-EAST-08A](/platform/regions/us-east#us-east-08a) | [US-EAST-13A](/platform/regions/us-east#us-east-13a) | [US-EAST-14A](/platform/regions/us-east#us-east-14a) | [US-EAST-15A](/platform/regions/us-east#us-east-15a) | [US-EAST-17A](/platform/regions/us-east#us-east-17a) | [RNO2A](/platform/regions/us-west#rno2a) | [US-WEST-01A](/platform/regions/us-west#us-west-01a) | [US-WEST-02B](/platform/regions/us-west#us-west-02b) | [US-WEST-04A](/platform/regions/us-west#us-west-04a) | [US-WEST-09B](/platform/regions/us-west#us-west-09b) | [US-WEST-10A](/platform/regions/us-west#us-west-10a) | | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | [Vera Rubin NVL72 Spectrum-X RoCE](/platform/instances/gpu/verarubin-4x-e) | | | | | | Yes | | | | | | | | | | | | | | | | | [GB300 NVL72 Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) | Yes | | | | Yes | Yes | | | | | | | | | | | Yes | | | | | | [GB300 NVL72 Spectrum-X RoCE](/platform/instances/gpu/gb300-4x-e) | | | | | | | | | | | | | | | | | | | | | | | [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) | Yes | | | | | | Yes | Yes | | | Yes | Yes | | | | | Yes | | | | | | [B300 (InfiniBand)](/platform/instances/gpu/b300-8x) | | | | Yes | | | | | | | | Yes | | | | | Yes | | | | Yes | | [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) | | | Yes | | Yes | | | | | | | Yes | | Yes | | | | | | Yes | | | [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) | | Yes | | | | | Yes | Yes | Yes | | Yes | | | | | | | | Yes | | | | [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) | | | | Yes | | | Yes | Yes | Yes | Yes | | | | | | Yes | Yes | Yes | Yes | Yes | | | [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | | | Yes | | | | Yes | | Yes | Yes | | Yes | Yes | | | | Yes | | Yes | Yes | Yes | | [RTX PRO 6000 Blackwell Server Edition (Standard Memory)](/platform/instances/gpu/rtxp6000-8x-v2) | | | | | | | | | | | | | | Yes | | | | | | | | | [L40S](/platform/instances/gpu/gd-8xl40s-i128) | | | | | | | | | Yes | | | | | | | | | | | | | | [L40](/platform/instances/gpu/gd-8xl40-i128) | | | | | | | | Yes | Yes | | | | | | | Yes | | | | | | | [GH200](/platform/instances/gpu/gd-1xgh200) | | | | | | | | | Yes | | | | | | | Yes | | | | | | | [A100](/platform/instances/gpu/gd-8xa100-i128) | | | | | | | | | Yes | | | | | | | Yes | | | | | | ## CPU instances | | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) | [EU-SOUTH-03B](/platform/regions/eu-south#eu-south-03b) | [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) | [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) | [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) | [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) | [US-EAST-01A](/platform/regions/us-east#us-east-01a) | [US-EAST-02A](/platform/regions/us-east#us-east-02a) | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | [US-EAST-06A](/platform/regions/us-east#us-east-06a) | [US-EAST-08A](/platform/regions/us-east#us-east-08a) | [US-EAST-13A](/platform/regions/us-east#us-east-13a) | [US-EAST-14A](/platform/regions/us-east#us-east-14a) | [US-EAST-15A](/platform/regions/us-east#us-east-15a) | [US-EAST-17A](/platform/regions/us-east#us-east-17a) | [RNO2A](/platform/regions/us-west#rno2a) | [US-WEST-01A](/platform/regions/us-west#us-west-01a) | [US-WEST-02B](/platform/regions/us-west#us-west-02b) | [US-WEST-04A](/platform/regions/us-west#us-west-04a) | [US-WEST-09B](/platform/regions/us-west#us-west-09b) | [US-WEST-10A](/platform/regions/us-west#us-west-10a) | | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | [High Performance AMD Genoa](/platform/instances/cpu/cd-hp-a96-genoa) | | | | | | | | | Yes | | | | | | | | | | | | | | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) | | | | | | | | Yes | | Yes | | | | | | Yes | Yes | | Yes | | | | [General Purpose AMD Genoa (High Storage)](/platform/instances/cpu/cd-gp-l-a192-genoa) | | | | | | | | | | | Yes | | | | | | | | | | | | [High Core AMD Genoa](/platform/instances/cpu/cd-hc-a384-genoa) | | | | | | | | | Yes | | | | | | | | | | | | | | [High Core AMD Genoa (InfiniBand)](/platform/instances/cpu/cd-hc-a384ib-genoa) | | | | | | | | | Yes | | | | | | | | | | | | | | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | Yes | Yes | Yes | | Yes | | | | Yes | Yes | | [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) | | | | | | Yes | | Yes | Yes | | | | | Yes | Yes | Yes | | | | | | | [General Purpose AMD Turin (Standard Memory)](/platform/instances/cpu/turin-gp-v2) | | | | | | | | | | | | | | | | | | | | | | | [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | Yes | Yes | Yes | Yes | | Yes | | Yes | Yes | Yes | | Yes | Yes | | | Yes | | Yes | Yes | Yes | | [General Purpose Intel Emerald Rapids (Standard Memory)](/platform/instances/cpu/cd-gp-i64-erapids-v2) | | | | | | | | | | | | | | | | | | | | | | | [General Purpose Intel Ice Lake](/platform/instances/cpu/cd-gp-i96-icelake) | | | | | | | | | | | | | | | | Yes | | | | | | # Bare Metal as a Service (BMaaS) Source: https://docs.coreweave.com/platform/instances/bare-metal-as-a-service ## BMaaS Definition "Bare Metal as a Service (BMaaS)" means CoreWeave's provision to a customer of dedicated physical servers (each, a "Node") with direct hardware access and no CoreWeave virtualization layer, together with the physical infrastructure and network on which those Nodes operate. Under BMaaS, CoreWeave: (a) provides and operates the data center facilities, including physical security, liquid cooling, power and racks; (b) provides and operates all frontend, backend and management networking, including provisioning, monitoring and break/fix; (c) performs hardware lifecycle management, including firmware management, BIOS, burn-in testing, RMA triage and replacement, and storage media sanitization; (d) administers the BlueField data processing unit ("DPU") and enforces VPC isolation through it; and (e) performs out-of-band monitoring and forwards telemetry to customer-designated endpoints. Customer retains sole responsibility for each Node from the host operating system upward, including the node boot image and bootloader; host OS security, patching and configuration hardening; drivers and containers; cluster orchestration, scheduling and workload management; node health monitoring, GPU fault detection and continuous active testing; encryption of customer data in transit and at rest; and application security and use of the BMC console via the Serial over LAN ("SOL") API. Note that use of the SOL API does not provide direct access to the Node's BMC device, it provides a console to the Node, not to the BMC itself. Supply chain governance for third-party agents is a shared responsibility of CoreWeave and the customer. BMaaS does not include CoreWeave visibility into customer workloads, any CoreWeave in-band agent on the host, or the automated health detection and remediation provided under CoreWeave Kubernetes Service ("CKS"). # About CPU instances Source: https://docs.coreweave.com/platform/instances/cpu-instances Compare CoreWeave CPU instance types by processor and core counts, vCPUs, RAM, and storage ## CPU comparison Use the following tables to compare CoreWeave's CPU compute instances: * [Processor details](#processor-details): CPU model, speed, processor and core counts, and vCPU count. * [Instance details](#instance-details): RAM, storage, and availability. Click an instance type to view full specifications. **Processor details** | Instance | CPU Model | Speed | Processor Count | Core Count Per Processor | Total Core Count | vCPUs1 | | :- | :- | :- | :- | :- | :- | :- | | [High Performance AMD Genoa](/platform/instances/cpu/cd-hp-a96-genoa) | AMD Genoa 9274F | 4.05 GHz | 2 | 24 | 48 | 96 | | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) | AMD Genoa 9454 | 2.75 GHz | 2 | 48 | 96 | 192 | | [General Purpose AMD Genoa (High Storage)](/platform/instances/cpu/cd-gp-l-a192-genoa) | AMD Genoa 9454 | 2.75 GHz | 2 | 48 | 96 | 192 | | [High Core AMD Genoa](/platform/instances/cpu/cd-hc-a384-genoa) | AMD Genoa 9654 | 2.40 GHz | 2 | 96 | 192 | 384 | | [High Core AMD Genoa (InfiniBand)](/platform/instances/cpu/cd-hc-a384ib-genoa) | AMD Genoa 9654 | 2.40 GHz | 2 | 96 | 192 | 384 | | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) | AMD Turin 9655P | 2.60 GHz | 1 | 96 | 96 | 192 | | [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) | AMD Turin 9655P | 2.60 GHz | 1 | 96 | 96 | 192 | | [General Purpose AMD Turin (Standard Memory)](/platform/instances/cpu/turin-gp-v2) | AMD Turin 9655P | 2.60 GHz | 1 | 96 | 96 | 192 | | [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Intel Emerald Rapids 8562Y+ | 2.80 GHz | 1 | 32 | 32 | 64 | | [General Purpose Intel Emerald Rapids (Standard Memory)](/platform/instances/cpu/cd-gp-i64-erapids-v2) | Intel Emerald Rapids 8562Y+ | 2.80 GHz | 1 | 32 | 32 | 64 | | [General Purpose Intel Ice Lake](/platform/instances/cpu/cd-gp-i96-icelake) | Intel Ice Lake 6342 | 2.80 GHz | 2 | 24 | 48 | 96 | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. **Instance details** | Instance | CPU Model | RAM | Usable Storage1 | Availability | | :- | :- | :- | :- | :- | | [High Performance AMD Genoa](/platform/instances/cpu/cd-hp-a96-genoa) | AMD Genoa 9274F | 768 GB | 7.68 TB | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) | AMD Genoa 9454 | 1536 GB | 7.68 TB | [RNO2A](/platform/regions/us-west#rno2a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-06A](/platform/regions/us-east#us-east-06a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) [US-WEST-04A](/platform/regions/us-west#us-west-04a) | | [General Purpose AMD Genoa (High Storage)](/platform/instances/cpu/cd-gp-l-a192-genoa) | AMD Genoa 9454 | 1536 GB | 30.72 TB | [US-EAST-08A](/platform/regions/us-east#us-east-08a) | | [High Core AMD Genoa](/platform/instances/cpu/cd-hc-a384-genoa) | AMD Genoa 9654 | 1536 GB | 30.72 TB | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | | [High Core AMD Genoa (InfiniBand)](/platform/instances/cpu/cd-hc-a384ib-genoa) | AMD Genoa 9654 | 1536 GB | 7.68 TB | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) | AMD Turin 9655P | 1536 GB | 7.68 TB | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) [EU-SOUTH-03B](/platform/regions/eu-south#eu-south-03b) [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) [RNO2A](/platform/regions/us-west#rno2a) [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) [US-EAST-01A](/platform/regions/us-east#us-east-01a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) [US-EAST-06A](/platform/regions/us-east#us-east-06a) [US-EAST-13A](/platform/regions/us-east#us-east-13a) [US-EAST-14A](/platform/regions/us-east#us-east-14a) [US-EAST-15A](/platform/regions/us-east#us-east-15a) [US-WEST-09B](/platform/regions/us-west#us-west-09b) [US-WEST-10A](/platform/regions/us-west#us-west-10a) | | [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) | AMD Turin 9655P | 1536 GB | 30.72 TB | [RNO2A](/platform/regions/us-west#rno2a) [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) [US-EAST-15A](/platform/regions/us-east#us-east-15a) [US-EAST-17A](/platform/regions/us-east#us-east-17a) | | [General Purpose AMD Turin (Standard Memory)](/platform/instances/cpu/turin-gp-v2) | AMD Turin 9655P | 768 GB | 7.68 TB | Contact sales for availability | | [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Intel Emerald Rapids 8562Y+ | 512 GB | 7.68 TB | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) [EU-SOUTH-03B](/platform/regions/eu-south#eu-south-03b) [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) [US-EAST-01A](/platform/regions/us-east#us-east-01a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) [US-EAST-06A](/platform/regions/us-east#us-east-06a) [US-EAST-08A](/platform/regions/us-east#us-east-08a) [US-EAST-14A](/platform/regions/us-east#us-east-14a) [US-EAST-15A](/platform/regions/us-east#us-east-15a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) [US-WEST-04A](/platform/regions/us-west#us-west-04a) [US-WEST-09B](/platform/regions/us-west#us-west-09b) [US-WEST-10A](/platform/regions/us-west#us-west-10a) | | [General Purpose Intel Emerald Rapids (Standard Memory)](/platform/instances/cpu/cd-gp-i64-erapids-v2) | Intel Emerald Rapids 8562Y+ | 256 GB | 7.68 TB | Contact sales for availability | | [General Purpose Intel Ice Lake](/platform/instances/cpu/cd-gp-i96-icelake) | Intel Ice Lake 6342 | 384 GB | 6.40 TB | [RNO2A](/platform/regions/us-west#rno2a) | > [!NOTE] > > 1 Total usable storage is shown. See each instance's details for its physical configuration. # General Purpose AMD Genoa Source: https://docs.coreweave.com/platform/instances/cpu/cd-gp-a192-genoa Specifications, pricing, and availability for the General Purpose AMD Genoa CPU instance This instance type is powered by an AMD Genoa CPU with a balance of core count and clock speed. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance. The large RAM capacity provides ample memory for running large datasets. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `cd-gp-a192-genoa` | | **CPU model** | AMD Genoa 9454 (2.75 GHz) | | **Processor count** | 2 | | **Core count per processor** | 48 | | **Total core count** | 96 | | **vCPUs**1 | 192 | | **RAM** | 1536 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-06A**](/platform/regions/us-east#us-east-06a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) [**US-WEST-04A**](/platform/regions/us-west#us-west-04a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance. # General Purpose Intel Emerald Rapids (High Memory) Source: https://docs.coreweave.com/platform/instances/cpu/cd-gp-i64-erapids Specifications, pricing, and availability for the General Purpose Intel Emerald Rapids (High Memory) CPU instance This instance type is powered by an Intel Emerald Rapids CPU with a balance of core count and clock speed. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance. The large RAM capacity provides ample memory for running large datasets. This instance was previously called "General Purpose Intel Emerald Rapids" and has been renamed "General Purpose Intel Emerald Rapids (High Memory)" to better reflect the memory capacity. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `cd-gp-i64-erapids` | | **CPU model** | Intel Emerald Rapids 8562Y+ (2.80 GHz) | | **Processor count** | 1 | | **Core count per processor** | 32 | | **Total core count** | 32 | | **vCPUs**1 | 64 | | **RAM** | 512 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**CA-EAST-01A**](/platform/regions/ca-east#ca-east-01a) [**EU-SOUTH-03B**](/platform/regions/eu-south#eu-south-03b) [**EU-SOUTH-04A**](/platform/regions/eu-south#eu-south-04a) [**US-CENTRAL-06A**](/platform/regions/us-central#us-central-06a) [**US-CENTRAL-07A**](/platform/regions/us-central#us-central-07a) [**US-EAST-01A**](/platform/regions/us-east#us-east-01a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) [**US-EAST-06A**](/platform/regions/us-east#us-east-06a) [**US-EAST-08A**](/platform/regions/us-east#us-east-08a) [**US-EAST-14A**](/platform/regions/us-east#us-east-14a) [**US-EAST-15A**](/platform/regions/us-east#us-east-15a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) [**US-WEST-04A**](/platform/regions/us-west#us-west-04a) [**US-WEST-09B**](/platform/regions/us-west#us-west-09b) [**US-WEST-10A**](/platform/regions/us-west#us-west-10a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance. # General Purpose Intel Emerald Rapids (Standard Memory) Source: https://docs.coreweave.com/platform/instances/cpu/cd-gp-i64-erapids-v2 Specifications, pricing, and availability for the General Purpose Intel Emerald Rapids (Standard Memory) CPU instance This instance type is powered by an Intel Emerald Rapids CPU with a balance of core count and clock speed. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `cd-gp-i64-erapids-v2` | | **CPU model** | Intel Emerald Rapids 8562Y+ (2.80 GHz) | | **Processor count** | 1 | | **Core count per processor** | 32 | | **Total core count** | 32 | | **vCPUs**1 | 64 | | **RAM** | 256 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | Contact sales for availability | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance. # General Purpose Intel Ice Lake Source: https://docs.coreweave.com/platform/instances/cpu/cd-gp-i96-icelake Specifications, pricing, and availability for the General Purpose Intel Ice Lake CPU instance This instance type is powered by an Intel Ice Lake CPU with a balance of core count and clock speed. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance. The large RAM capacity provides ample memory for running large datasets. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `cd-gp-i96-icelake` | | **CPU model** | Intel Ice Lake 6342 (2.80 GHz) | | **Processor count** | 2 | | **Core count per processor** | 24 | | **Total core count** | 48 | | **vCPUs**1 | 96 | | **RAM** | 384 GB | | **Usable storage**2 | 6.40 TB | | **Storage configuration** | 3x 6.4 TB RAID 1 (3-way mirror) | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance. # General Purpose AMD Genoa (High Storage) Source: https://docs.coreweave.com/platform/instances/cpu/cd-gp-l-a192-genoa Specifications, pricing, and availability for the General Purpose AMD Genoa (High Storage) CPU instance This is a variant of the General Purpose AMD Genoa instance with larger storage capacity. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance when larger storage is needed. The large RAM capacity provides ample memory for running large datasets. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `cd-gp-l-a192-genoa` | | **CPU model** | AMD Genoa 9454 (2.75 GHz) | | **Processor count** | 2 | | **Core count per processor** | 48 | | **Total core count** | 96 | | **vCPUs**1 | 192 | | **RAM** | 1536 GB | | **Usable storage**2 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**US-EAST-08A**](/platform/regions/us-east#us-east-08a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance with larger storage needs. # High Core AMD Genoa Source: https://docs.coreweave.com/platform/instances/cpu/cd-hc-a384-genoa Specifications, pricing, and availability for the High Core AMD Genoa CPU instance This instance type is powered by an AMD Genoa CPU with a high core count. It's best for workloads that require good multi-threaded CPU performance. The large RAM capacity provides ample memory for running large datasets. ## Specifications | Feature | Detail | | :- | :- | | **Category** | High Core | | **Instance ID** | `cd-hc-a384-genoa` | | **CPU model** | AMD Genoa 9654 (2.40 GHz) | | **Processor count** | 2 | | **Core count per processor** | 96 | | **Total core count** | 192 | | **vCPUs**1 | 384 | | **RAM** | 1536 GB | | **Usable storage**2 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Workloads that require good multi-threaded CPU performance and large memory capacity. # High Core AMD Genoa (InfiniBand) Source: https://docs.coreweave.com/platform/instances/cpu/cd-hc-a384ib-genoa Specifications, pricing, and availability for the High Core AMD Genoa (InfiniBand) CPU instance This instance type is an InfiniBand-enabled variant of the standard High Core AMD Genoa CPU instance, based on the same AMD Genoa 9654 platform with a very high vCPU count and large RAM capacity. It is intended for HPC and tightly coupled multi-node workloads that require strong multi-threaded CPU performance and access to an InfiniBand fabric for low-latency, high-throughput inter-node communication (for example, MPI-based simulations or CPU-heavy components of hybrid GPU/CPU HPC pipelines). ## Specifications | Feature | Detail | | :- | :- | | **Category** | High Core | | **Instance ID** | `cd-hc-a384ib-genoa` | | **CPU model** | AMD Genoa 9654 (2.40 GHz) | | **Processor count** | 2 | | **Core count per processor** | 96 | | **Total core count** | 192 | | **vCPUs**1 | 384 | | **RAM** | 1536 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE & InfiniBand | | **Availability** | [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases HPC workloads that need good multi-threaded CPU performance and large memory capacity, and access to an InfiniBand-based fabric for tightly coupled, latency-sensitive communication across Nodes. # High Performance AMD Genoa Source: https://docs.coreweave.com/platform/instances/cpu/cd-hp-a96-genoa Specifications, pricing, and availability for the High Performance AMD Genoa CPU instance This instance type is powered by an AMD Genoa CPU with a high clock speed. It's best for workloads that benefit from high single-threaded CPU performance. ## Specifications | Feature | Detail | | :- | :- | | **Category** | High Performance | | **Instance ID** | `cd-hp-a96-genoa` | | **CPU model** | AMD Genoa 9274F (4.05 GHz) | | **Processor count** | 2 | | **Core count per processor** | 24 | | **Total core count** | 48 | | **vCPUs**1 | 96 | | **RAM** | 768 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 1x 7.68, or 2x 7.68 RAID 1 (depending on SKU) | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases High-performance computing workloads that benefit from high single-threaded CPU performance. # General Purpose AMD Turin (High Memory) Source: https://docs.coreweave.com/platform/instances/cpu/turin-gp Specifications, pricing, and availability for the General Purpose AMD Turin (High Memory) CPU instance This instance type is powered by an AMD Turin CPU with a balance of core count and clock speed. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance. The large RAM capacity provides ample memory for running large datasets. This instance was previously called "General Purpose AMD Turin" and has been renamed "General Purpose AMD Turin (High Memory)" to better reflect the memory capacity. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `turin-gp` | | **CPU model** | AMD Turin 9655P (2.60 GHz) | | **Processor count** | 1 | | **Core count per processor** | 96 | | **Total core count** | 96 | | **vCPUs**1 | 192 | | **RAM** | 1536 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**CA-EAST-01A**](/platform/regions/ca-east#ca-east-01a) [**EU-SOUTH-03B**](/platform/regions/eu-south#eu-south-03b) [**EU-SOUTH-04A**](/platform/regions/eu-south#eu-south-04a) [**RNO2A**](/platform/regions/us-west#rno2a) [**US-CENTRAL-06A**](/platform/regions/us-central#us-central-06a) [**US-CENTRAL-07A**](/platform/regions/us-central#us-central-07a) [**US-CENTRAL-09A**](/platform/regions/us-central#us-central-09a) [**US-EAST-01A**](/platform/regions/us-east#us-east-01a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) [**US-EAST-06A**](/platform/regions/us-east#us-east-06a) [**US-EAST-13A**](/platform/regions/us-east#us-east-13a) [**US-EAST-14A**](/platform/regions/us-east#us-east-14a) [**US-EAST-15A**](/platform/regions/us-east#us-east-15a) [**US-WEST-09B**](/platform/regions/us-west#us-west-09b) [**US-WEST-10A**](/platform/regions/us-west#us-west-10a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance. # General Purpose AMD Turin (High Storage) Source: https://docs.coreweave.com/platform/instances/cpu/turin-gp-l Specifications, pricing, and availability for the General Purpose AMD Turin (High Storage) CPU instance This is a variant of the General Purpose AMD Turin instance with larger storage capacity. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance when larger storage is needed. The large RAM capacity provides ample memory for running large datasets. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `turin-gp-l` | | **CPU model** | AMD Turin 9655P (2.60 GHz) | | **Processor count** | 1 | | **Core count per processor** | 96 | | **Total core count** | 96 | | **vCPUs**1 | 192 | | **RAM** | 1536 GB | | **Usable storage**2 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) [**US-CENTRAL-09A**](/platform/regions/us-central#us-central-09a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) [**US-EAST-15A**](/platform/regions/us-east#us-east-15a) [**US-EAST-17A**](/platform/regions/us-east#us-east-17a) | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance with larger storage needs. # General Purpose AMD Turin (Standard Memory) Source: https://docs.coreweave.com/platform/instances/cpu/turin-gp-v2 Specifications, pricing, and availability for the General Purpose AMD Turin (Standard Memory) CPU instance This instance type is powered by an AMD Turin CPU with a balance of core count and clock speed. It's a good choice for general compute workloads that require a mix of single-threaded and multi-threaded performance. ## Specifications | Feature | Detail | | :- | :- | | **Category** | General Purpose | | **Instance ID** | `turin-gp-v2` | | **CPU model** | AMD Turin 9655P (2.60 GHz) | | **Processor count** | 1 | | **Core count per processor** | 96 | | **Total core count** | 96 | | **vCPUs**1 | 192 | | **RAM** | 768 GB | | **Usable storage**2 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Availability** | Contact sales for availability | > [!NOTE] > > 1 vCPUs are logical CPU threads, not physical cores; in most CoreWeave CPU instances, vCPU count is typically 2× the physical core count due to SMT/hyper-threading. > > 2 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General compute workloads that require a mix of single-threaded and multi-threaded performance. # About GPU instances Source: https://docs.coreweave.com/platform/instances/gpu-instances Compare CoreWeave GPU instance types by GPU count, GPU memory, vCPUs, RAM, and storage ## GPU comparison Use the following table to compare the number of GPUs, RAM, and storage installed in CoreWeave's GPU compute instances. Select an instance type to view full specifications. | Instance | GPUs | GPU RAM | vCPUs | RAM | Usable Storage1 | Availability | | :- | :- | :- | :- | :- | :- | :- | | [Vera Rubin NVL72 Spectrum-X RoCE](/platform/instances/gpu/verarubin-4x-e) | 4 | Up to 288 GB HBM4 | 352 | Up to 1.5 TB LPDDR5 | 30.72 TB | [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) | | [GB300 NVL72 Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) | 4 | 279 GB | 144 | 960 GB | 30.72 TB | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) | | [GB300 NVL72 Spectrum-X RoCE](/platform/instances/gpu/gb300-4x-e) | 4 | 279 GB | 144 | 960 GB | 30.72 TB | - | | [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) | 4 | 186 GB | 144 | 960 GB | 15.36 TB | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) [US-EAST-01A](/platform/regions/us-east#us-east-01a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-08A](/platform/regions/us-east#us-east-08a) [US-EAST-13A](/platform/regions/us-east#us-east-13a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) | | [B300 (InfiniBand)](/platform/instances/gpu/b300-8x) | 8 | 270 GB | 192 | 4096 GB | 30.72 TB | [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) [US-EAST-13A](/platform/regions/us-east#us-east-13a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) [US-WEST-10A](/platform/regions/us-west#us-west-10a) | | [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) | 8 | 180 GB | 128 | 2048 GB | 30.72 TB | [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) [US-EAST-13A](/platform/regions/us-east#us-east-13a) [US-EAST-15A](/platform/regions/us-east#us-east-15a) [US-WEST-09B](/platform/regions/us-west#us-west-09b) | | [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) | 8 | 141 GB | 128 | 2048 GB | 30.72 TB | [EU-SOUTH-03B](/platform/regions/eu-south#eu-south-03b) [US-EAST-01A](/platform/regions/us-east#us-east-01a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) [US-EAST-08A](/platform/regions/us-east#us-east-08a) [US-WEST-04A](/platform/regions/us-west#us-west-04a) | | [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) | 8 | 80 GB | 128 | 2048 GB | 30.72 TB | [RNO2A](/platform/regions/us-west#rno2a) [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) [US-EAST-01A](/platform/regions/us-east#us-east-01a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) [US-EAST-06A](/platform/regions/us-east#us-east-06a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) [US-WEST-02B](/platform/regions/us-west#us-west-02b) [US-WEST-04A](/platform/regions/us-west#us-west-04a) [US-WEST-09B](/platform/regions/us-west#us-west-09b) | | [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | 8 | 96 GB | 128 | 1024 GB | 7.68 TB | [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) [US-EAST-01A](/platform/regions/us-east#us-east-01a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) [US-EAST-06A](/platform/regions/us-east#us-east-06a) [US-EAST-13A](/platform/regions/us-east#us-east-13a) [US-EAST-14A](/platform/regions/us-east#us-east-14a) [US-WEST-01A](/platform/regions/us-west#us-west-01a) [US-WEST-04A](/platform/regions/us-west#us-west-04a) [US-WEST-09B](/platform/regions/us-west#us-west-09b) [US-WEST-10A](/platform/regions/us-west#us-west-10a) | | [RTX PRO 6000 Blackwell Server Edition (Standard Memory)](/platform/instances/gpu/rtxp6000-8x-v2) | 8 | 96 GB | 128 | 512 GB | 7.68 TB | [US-EAST-15A](/platform/regions/us-east#us-east-15a) | | [L40S](/platform/instances/gpu/gd-8xl40s-i128) | 8 | 48 GB | 128 | 1024 GB | 7.68 TB | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | | [L40](/platform/instances/gpu/gd-8xl40-i128) | 8 | 48 GB | 128 | 1024 GB | 7.68 TB | [RNO2A](/platform/regions/us-west#rno2a) [US-EAST-02A](/platform/regions/us-east#us-east-02a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) | | [GH200](/platform/instances/gpu/gd-1xgh200) | 1 | 96 GB | 72 | 480 GB | 7.68 TB | [RNO2A](/platform/regions/us-west#rno2a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) | | [A100](/platform/instances/gpu/gd-8xa100-i128) | 8 | 80 GB | 128 | 2048 GB | 7.68 TB | [RNO2A](/platform/regions/us-west#rno2a) [US-EAST-04A](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 Total usable storage is shown. See each instance's details for its physical configuration. ## Choose the right GPU for your workload Not sure which GPU type fits your model? See [Select an instance](/platform/instances/selecting-an-instance) for a decision guide that covers: * GPU memory estimation by model size and precision (FP16, INT8, INT4) * How inference memory overhead compares with training and fine-tuning * Choosing between NVLink and InfiniBand for multi-GPU workloads * Example models that fit each GPU type To check which instances are offered in each region, see the [Instance availability matrix](/platform/instances/availability-matrix). # B200 (InfiniBand) Source: https://docs.coreweave.com/platform/instances/gpu/b200-8x Specifications and availability for the B200 (InfiniBand) GPU instance Powered by eight NVIDIA B200 Blackwell GPUs, each with 180 GB of HBM3e memory, these instances deliver outstanding performance for enterprise AI workloads, including training and real-time inference. They offer more than twice the performance per GPU compared to previous-generation NVIDIA Hopper GPUs. The GPUs are interconnected using NVIDIA NVLink and NVLink Switch to enable fast data transfer. For networking, B200 instances feature an NVIDIA BlueField-3 DPU and eight NVIDIA ConnectX-7 InfiniBand host channel adapters (HCAs), supporting high throughput and lossless scaling. A 400G NDR non-blocking NVIDIA Quantum-2 InfiniBand fabric ensures seamless, high-speed connectivity. ## Specifications | Feature | Detail | | :- | :- | | **Category** | State-of-the-Art Compute | | **Instance ID** | `b200-8x` | | **GPU** | 8x NVIDIA B200 | | **GPU RAM** | 180 GB | | **GPU connectivity** | InfiniBand & NVLink | | **CPU model** | Intel Emerald Rapids 8562Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 2048 GB | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**EU-SOUTH-04A**](/platform/regions/eu-south#eu-south-04a) [**US-CENTRAL-07A**](/platform/regions/us-central#us-central-07a) [**US-EAST-13A**](/platform/regions/us-east#us-east-13a) [**US-EAST-15A**](/platform/regions/us-east#us-east-15a) [**US-WEST-09B**](/platform/regions/us-west#us-west-09b) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training foundation models from scratch (100B+ parameters), massive-scale inference, and developing frontier AI systems. ## Recommended models Deepseek V4 Pro, Kimi K2.6, GLM 5.1, and other future advanced GPT-5 class models, complex Mixture-of-Experts (MoE) models, and large multimodal systems built for coding and agentic workflows. # B300 (InfiniBand) Source: https://docs.coreweave.com/platform/instances/gpu/b300-8x Specifications and availability for the B300 (InfiniBand) GPU instance Powered by eight NVIDIA B300 Blackwell GPUs, these instances deliver outstanding performance for enterprise AI workloads, including training and real-time inference. Compared to B200 systems, they offer more performance per GPU, 50% greater GPU memory, and double the InfiniBand speed with 800G XDR non-blocking NVIDIA Quantum-X800 fabric. ## Specifications | Feature | Detail | | :- | :- | | **Category** | State-of-the-Art Compute | | **Instance ID** | `b300-8x` | | **GPU** | 8x NVIDIA B300 | | **GPU RAM** | 270 GB | | **GPU connectivity** | Quantum-X800 InfiniBand & NVLink | | **CPU model** | 2 x Intel Granite Rapids (6747P) (2.70 GHz) | | **vCPUs** | 192 | | **RAM** | 4096 GB | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 200GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**US-CENTRAL-06A**](/platform/regions/us-central#us-central-06a) [**US-EAST-13A**](/platform/regions/us-east#us-east-13a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) [**US-WEST-10A**](/platform/regions/us-west#us-west-10a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training foundation models from scratch (130B+ parameters), massive-scale inference, and developing frontier AI systems. ## Recommended models DeepSeek V4 Pro, Kimi K2.6, GLM 5.1, and other future advanced GPT-5 class models, complex Mixture-of-Experts (MoE) models, and large multimodal systems built for coding and agentic workflows. # GB200 NVL72-powered instances Source: https://docs.coreweave.com/platform/instances/gpu/gb200-4x Specifications and availability for the GB200 NVL72-powered instances GPU instance Powered by NVIDIA GB200 GPUs with InfiniBand connectivity, these instances deliver a monumental leap in performance over the previous generation, setting the new standard for large-scale AI and high-performance computing. The GB200 instances are equipped with 13.4 TB of high-bandwidth GPU memory per rack and fifth-generation NVLink with up to 130 TB/s total bandwidth. Blackwell GPUs feature a second-generation Transformer Engine with new FP4 and FP6 precision, drastically accelerating LLM inference and training. The NVL72 architecture provides unprecedented memory capacity and ultra-fast GPU-to-GPU communication for distributed computing at the largest scale. ## Specifications | Feature | Detail | | :- | :- | | **Category** | State-of-the-Art Compute | | **Instance ID** | `gb200-4x` | | **GPU** | 4x NVIDIA GB200 | | **GPU RAM** | 186 GB | | **GPU connectivity** | InfiniBand & NVLink | | **CPU model** | 2x NVIDIA Grace Arm v9 (3.10 GHz) | | **vCPUs** | 144 | | **RAM** | 960 GB | | **Usable storage**1 | 15.36 TB | | **Storage configuration** | 4x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**CA-EAST-01A**](/platform/regions/ca-east#ca-east-01a) [**US-EAST-01A**](/platform/regions/us-east#us-east-01a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-08A**](/platform/regions/us-east#us-east-08a) [**US-EAST-13A**](/platform/regions/us-east#us-east-13a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training foundation models from scratch (500B+ parameters), massive-scale inference, and developing frontier AI systems. ## Recommended models DeepSeek V4 Pro, Kimi K2.6, GLM 5.1, and other future advanced GPT-5 class models, complex Mixture-of-Experts (MoE) models, and large multimodal systems built for coding and agentic workflows. # GB300 NVL72 Quantum-X InfiniBand Source: https://docs.coreweave.com/platform/instances/gpu/gb300-4x Specifications and availability for the GB300 NVL72 Quantum-X InfiniBand GPU instance Powered by two NVIDIA GB300 Grace Blackwell Ultra Superchips (four Blackwell Ultra GPUs, each with an unprecedented 279 GB of memory), these instances represent the absolute pinnacle of our high-performance computing offerings. These instances form part of a larger NVL72 rack architecture which boasts 20.1 TB of total GPU memory, interconnected by 5th-generation NVLink for a seamless, rack-scale memory fabric. For clustering, they are equipped with next-generation NVIDIA Quantum-X800 InfiniBand and ConnectX-8 SuperNICs, delivering a groundbreaking 800 Gbps of network bandwidth, double that of the previous generation. ## Specifications | Feature | Detail | | :- | :- | | **Category** | State-of-the-Art Compute | | **Instance ID** | `gb300-4x` | | **GPU** | 4x NVIDIA GB300 | | **GPU RAM** | 279 GB | | **GPU connectivity** | Quantum-X800 InfiniBand & NVLink | | **CPU model** | 2x NVIDIA Grace Arm v9 (3.10 GHz) | | **vCPUs** | 144 | | **RAM** | 960 GB | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 200GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**CA-EAST-01A**](/platform/regions/ca-east#ca-east-01a) [**US-CENTRAL-07A**](/platform/regions/us-central#us-central-07a) [**US-CENTRAL-09A**](/platform/regions/us-central#us-central-09a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training next-generation foundation models in the trillion-parameter class, massive-scale and high-fidelity inference on the most complex AI models, and scientific simulations requiring maximum memory capacity and the fastest data throughput. ## Recommended models Next-generation frontier models (multi-trillion parameters), state-of-the-art multimodal systems, and large-scale scientific discovery models. # GB300 NVL72 Spectrum-X RoCE Source: https://docs.coreweave.com/platform/instances/gpu/gb300-4x-e Specifications and availability for the GB300 NVL72 Spectrum-X RoCE GPU instance Powered by two NVIDIA GB300 Grace Blackwell Ultra Superchips (four Blackwell Ultra GPUs, each with an unprecedented 279 GB of memory), these instances represent the absolute pinnacle of our high-performance computing offerings. These instances form part of a larger NVL72 rack architecture which boasts 20.1 TB of total GPU memory, interconnected by 5th-generation NVLink for a seamless, rack-scale memory fabric. For clustering, they are equipped with next-generation NVIDIA Spectrum-X RoCE (RDMA over Converged Ethernet), leveraging BlueField-3 and ConnectX-8 SuperNICs for large scale AI in Ethernet-based cloud environments. ## Specifications | Feature | Detail | | :- | :- | | **Category** | State-of-the-Art Compute | | **Instance ID** | `gb300-4x-e` | | **GPU** | 4x NVIDIA GB300 | | **GPU RAM** | 279 GB | | **GPU connectivity** | Spectrum-X RoCE & NVLink | | **CPU model** | 2x NVIDIA Grace Arm v9 (3.10 GHz) | | **vCPUs** | 144 | | **RAM** | 960 GB | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 200GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | Contact sales for availability | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training next-generation foundation models in the trillion-parameter class, massive-scale and high-fidelity inference on the most complex AI models, and scientific simulations requiring maximum memory capacity and the fastest data throughput. ## Recommended models Next-generation frontier models (multi-trillion parameters), state-of-the-art multimodal systems, and large-scale scientific discovery models. # GH200 Source: https://docs.coreweave.com/platform/instances/gpu/gd-1xgh200 Specifications and availability for the GH200 GPU instance Powered by a single NVIDIA GH200 Grace Hopper Superchip, this instance offers a unique architecture that combines a 72-core Grace CPU with a Hopper GPU. Its defining feature is the 576 GB unified memory pool (96 GB HBM3 + 480 GB LPDDR5X) connected via the high-speed NVLink-C2C interconnect. This design eliminates traditional PCIe bottlenecks and allows the GPU to access a massive memory space, making it unparalleled for running extremely large models on a single machine. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Professional AI & Graphics | | **Instance ID** | `gd-1xgh200` | | **GPU** | 1x NVIDIA GH200 Grace Hopper | | **GPU RAM** | 96 GB | | **GPU connectivity** | N/A - NVLink-C2C to CPU | | **CPU model** | NVIDIA Grace Arm v9 (3.10 GHz) | | **vCPUs** | 72 | | **RAM** | 480 GB | | **Usable storage**1 | 7.68 TB | | **Storage configuration** | Single drive, no RAID | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Low-latency inference for models that are too large to fit in the memory of a standard GPU, large-scale graph analytics, and memory-intensive data science. ## Recommended models Inference on heavily quantized versions of modern state-of-the-art models (500B - 1T parameters) like Kimi K2.6, GLM 5.1, as well as moderately quantized versions of other large models such as DeepSeek V4 Flash and MiniMax-M2.7 in the 100B-500B parameter range. # A100 Source: https://docs.coreweave.com/platform/instances/gpu/gd-8xa100-i128 Specifications and availability for the A100 GPU instance These instances are powered by eight NVIDIA A100 Tensor Core GPUs, each providing 80 GB of high-bandwidth HBM2e memory. As a foundational accelerator for the previous generation of AI, these are versatile instances that deliver excellent performance for mixed-precision workloads. The GPUs are interconnected with NVIDIA NVLink, making them a powerful and proven choice for distributed training. Their configuration offers a cost-effective solution for a wide range of demanding AI and data analytics tasks. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Professional AI & Graphics | | **Instance ID** | `gd-8xa100-i128` | | **GPU** | 8x NVIDIA A100 | | **GPU RAM** | 80 GB | | **GPU connectivity** | NVLink | | **CPU model** | Intel Ice Lake 8358 (2.60 GHz) | | **vCPUs** | 128 | | **RAM** | 2048 GB | | **Usable storage**1 | 7.68 TB | | **Storage configuration** | Single drive, no RAID | | **NIC configuration** | Single-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases AI model training, high-performance inference, and various HPC applications including scientific simulations. ## Recommended models Training models up to 40B parameters such as Gemma 4 31B; a standard choice for fine-tuning most mid-sized open-source models. For inference, they can handle models up to 40B, such as Qwen 3.6 35B-A3B, on a per-GPU basis or a single instance of a quantized larger model such as Qwen 3.5 397B-A17B utilizing tensor parallelism. # H100 (InfiniBand) Source: https://docs.coreweave.com/platform/instances/gpu/gd-8xh100ib-i128 Specifications and availability for the H100 (InfiniBand) GPU instance These instances are powered by eight NVIDIA H100 Hopper GPUs, each with 80 GB of HBM3 memory. As the industry-defining accelerator of the previous generation, the H100 remains a powerful and reliable workhorse for a wide range of large-scale AI workloads. GPUs are fully connected with NVLink, and Nodes are linked with a 400G NDR InfiniBand fabric, providing a robust architecture for distributed training and inference. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Mid-large Size Model Training & Inference | | **Instance ID** | `gd-8xh100ib-i128` | | **GPU** | 8x NVIDIA H100 | | **GPU RAM** | 80 GB | | **GPU connectivity** | InfiniBand & NVLink | | **CPU model** | Intel Sapphire Rapids 8462Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 2048 GB | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) [**US-CENTRAL-06A**](/platform/regions/us-central#us-central-06a) [**US-EAST-01A**](/platform/regions/us-east#us-east-01a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) [**US-EAST-06A**](/platform/regions/us-east#us-east-06a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) [**US-WEST-02B**](/platform/regions/us-west#us-west-02b) [**US-WEST-04A**](/platform/regions/us-west#us-west-04a) [**US-WEST-09B**](/platform/regions/us-west#us-west-09b) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Large-scale AI training, high-performance inference serving, and a wide variety of HPC simulations. ## Recommended models Quantized versions of the latest open-source models such as DeepSeek V4 Flash, Qwen 3.5 397B-A17B, Kimi K2.6, MiniMax M2.7 and other large models requiring substantial GPU memory for a single Node through the use of tensor parallelism. # H200 (InfiniBand) Source: https://docs.coreweave.com/platform/instances/gpu/gd-8xh200ib-i128 Specifications and availability for the H200 (InfiniBand) GPU instance Powered by eight NVIDIA H200 Hopper GPUs, each equipped with 141 GB of ultra-fast HBM3e memory, these instances are purpose-built for memory-intensive AI and HPC workloads. The significant memory per GPU allows for training larger models with bigger batch sizes and longer context windows compared to its predecessor. The GPUs are interconnected with NVIDIA NVLink for a high-speed, unified memory pool within the server. For clustering, they feature NVIDIA ConnectX-7 adapters providing a 400G NDR InfiniBand fabric, making them ideal for large, distributed training jobs that are memory-bound. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Mid-large Size Model Training & Inference | | **Instance ID** | `gd-8xh200ib-i128` | | **GPU** | 8x NVIDIA H200 | | **GPU RAM** | 141 GB | | **GPU connectivity** | InfiniBand & NVLink | | **CPU model** | Intel Emerald Rapids 8562Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 2048 GB | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 8x 7.68 TB RAID 10 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**EU-SOUTH-03B**](/platform/regions/eu-south#eu-south-03b) [**US-EAST-01A**](/platform/regions/us-east#us-east-01a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) [**US-EAST-08A**](/platform/regions/us-east#us-east-08a) [**US-WEST-04A**](/platform/regions/us-west#us-west-04a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training and fine-tuning large models (\~70B parameters) with high precision, high-throughput inference with long context lengths, and memory-intensive scientific computing. ## Recommended models Full precision versions of the latest open-source models such as DeepSeek V4 Flash, Qwen 3.5 397B-A17B, Kimi K2.6, MiniMax M2.7 and other large models requiring substantial GPU memory for a single Node. # L40 Source: https://docs.coreweave.com/platform/instances/gpu/gd-8xl40-i128 Specifications and availability for the L40 GPU instance Powered by eight NVIDIA L40 GPUs, each with 48 GB of GDDR6 memory, these instances are designed for exceptional versatility across AI and visual computing. Connected via PCIe, they offer a balanced profile for workloads that include AI inference, rendering, and video processing. They are an ideal entry point for deploying AI-powered services that also have a significant graphics component. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Professional AI & Graphics | | **Instance ID** | `gd-8xl40-i128` | | **GPU** | 8x NVIDIA L40 | | **GPU RAM** | 48 GB | | **GPU connectivity** | PCIe | | **CPU model** | Intel Sapphire Rapids 8462Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 1024 GB | | **Usable storage**1 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**RNO2A**](/platform/regions/us-west#rno2a) [**US-EAST-02A**](/platform/regions/us-east#us-east-02a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases General-purpose AI inference, small-scale model fine-tuning, high-resolution rendering, and virtual desktop infrastructure (VDI). ## Recommended models Inference for models up to \~40B parameters like Gemma 4 26B or Qwen 3.6 27B; efficient fine-tuning of smaller sub-15B models. # L40S Source: https://docs.coreweave.com/platform/instances/gpu/gd-8xl40s-i128 Specifications and availability for the L40S GPU instance These instances feature eight NVIDIA L40S GPUs, each with 48 GB of GDDR6 memory. The L40S is a compute-optimized version of the L40, specifically tuned to deliver higher performance for AI and data science workloads. Connected via PCIe, these GPUs are a cost-effective choice for scaling out inference and for fine-tuning mainstream models. They provide a strong balance of performance and value for enterprise AI deployment. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Professional AI & Graphics | | **Instance ID** | `gd-8xl40s-i128` | | **GPU** | 8x NVIDIA L40S | | **GPU RAM** | 48 GB | | **GPU connectivity** | PCIe | | **CPU model** | Intel Sapphire Rapids 8462Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 1024 GB | | **Usable storage**1 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases High-throughput inference, efficient fine-tuning, video analytics, and other compute-focused AI tasks. ## Recommended models Inference for models up to \~40B parameters like Gemma 4 26B or Qwen 3.6 27B; efficient fine-tuning of smaller sub-15B models. # RTX PRO 6000 Blackwell Server Edition (High Memory) Source: https://docs.coreweave.com/platform/instances/gpu/rtxp6000-8x Specifications and availability for the RTX PRO 6000 Blackwell Server Edition (High Memory) GPU instance Powered by eight NVIDIA RTX PRO 6000 GPUs based on the Blackwell architecture, these instances provide a versatile and efficient solution for a mix of AI and professional graphics workloads. Each GPU has 96 GB of GDDR7 memory and connects via a high-speed PCIe interface. While they lack NVLink for memory pooling across GPUs, their large individual GPU memory makes them excellent for running multiple inference jobs in parallel or handling high-resolution rendering tasks. This instance was previously called RTX PRO 6000 Blackwell. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Professional AI & Graphics | | **Instance ID** | `rtxp6000-8x` | | **GPU** | 8x NVIDIA RTX PRO 6000 | | **GPU RAM** | 96 GB | | **GPU connectivity** | PCIe | | **CPU model** | Intel Emerald Rapids 8562Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 1024 GB | | **Usable storage**1 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**EU-SOUTH-04A**](/platform/regions/eu-south#eu-south-04a) [**US-EAST-01A**](/platform/regions/us-east#us-east-01a) [**US-EAST-04A**](/platform/regions/us-east#us-east-04a) [**US-EAST-06A**](/platform/regions/us-east#us-east-06a) [**US-EAST-13A**](/platform/regions/us-east#us-east-13a) [**US-EAST-14A**](/platform/regions/us-east#us-east-14a) [**US-WEST-01A**](/platform/regions/us-west#us-west-01a) [**US-WEST-04A**](/platform/regions/us-west#us-west-04a) [**US-WEST-09B**](/platform/regions/us-west#us-west-09b) [**US-WEST-10A**](/platform/regions/us-west#us-west-10a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases High-performance inference and fine-tuning for mid-sized models and high-fidelity rendering. ## Recommended models Inference and fine-tuning of mid-sized models up to 70B, such as Gemma 4 31B and Qwen 3.6 35B-A3B, on a per-GPU basis. # RTX PRO 6000 Blackwell Server Edition (Standard Memory) Source: https://docs.coreweave.com/platform/instances/gpu/rtxp6000-8x-v2 Specifications, pricing, and availability for the RTX PRO 6000 Blackwell Server Edition (Standard Memory) GPU instance Powered by eight NVIDIA RTX PRO 6000 GPUs based on the Blackwell architecture, these instances provide a versatile and efficient solution for a mix of AI and professional graphics workloads. Each GPU has 96 GB of GDDR7 memory and connects via a high-speed PCIe interface. While they lack NVLink for memory pooling across GPUs, their large individual GPU memory makes them excellent for running multiple inference jobs in parallel or handling high-resolution rendering tasks. ## Specifications | Feature | Detail | | :- | :- | | **Category** | Professional AI & Graphics | | **Instance ID** | `rtxp6000-8x-v2` | | **GPU** | 8x NVIDIA RTX PRO 6000 | | **GPU RAM** | 96 GB | | **GPU connectivity** | PCIe | | **CPU model** | Intel Emerald Rapids 8562Y+ (2.80 GHz) | | **vCPUs** | 128 | | **RAM** | 512 GB | | **Usable storage**1 | 7.68 TB | | **Storage configuration** | 2x 7.68 TB RAID 1 | | **NIC configuration** | Dual-port 100GbE | | **Default GPU driver** | `580` | | **Compatible GPU driver** | `580`, `595`, `615` | | **Availability** | [**US-EAST-15A**](/platform/regions/us-east#us-east-15a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases High-performance inference and fine-tuning for mid-sized models and high-fidelity rendering. ## Recommended models Inference and fine-tuning of mid-sized models up to 70B, such as Gemma 4 31B and Qwen 3.6 35B-A3B, on a per-GPU basis. # Vera Rubin NVL72 Spectrum-X RoCE Source: https://docs.coreweave.com/platform/instances/gpu/verarubin-4x-e Specifications and availability for the Vera Rubin NVL72 Spectrum-X RoCE GPU instance Powered by four NVIDIA Rubin GPUs paired with NVIDIA Vera Arm CPUs, these instances target the most demanding AI training and inference workloads. Each Rubin GPU provides up to 288 GB of next-generation HBM4 memory and connects over sixth-generation NVLink (NVLink 6) for a rack-scale, high-bandwidth memory fabric. These instances form part of a larger NVL72 rack architecture with 20.7 TB of total GPU memory. Compared to GB200, Vera Rubin delivers up to 5x inference and 3.5x training performance. For clustering, these instances use next-generation NVIDIA Spectrum-X RoCE (RDMA over Converged Ethernet) with BlueField-4 and ConnectX-9 SuperNICs for large-scale AI in Ethernet-based cloud environments. ## Specifications | Feature | Detail | | :- | :- | | **Category** | State-of-the-Art Compute | | **Instance ID** | `verarubin-4x-e` | | **GPU** | 4x NVIDIA Rubin | | **GPU RAM** | Up to 288 GB HBM4 | | **GPU connectivity** | Spectrum-X RoCE & NVLink 6 | | **CPU model** | 2x NVIDIA 88-core Vera | | **vCPUs** | 352 | | **RAM** | Up to 1.5 TB LPDDR5 | | **Usable storage**1 | 30.72 TB | | **Storage configuration** | 4x 15.36 TB RAID 10 | | **NIC configuration** | Dual-port 200GbE | | **Default GPU driver** | `620` | | **Compatible GPU driver** | `620` | | **Availability** | [**US-CENTRAL-09A**](/platform/regions/us-central#us-central-09a) | > [!NOTE] > > 1 Usable storage is less than the raw capacity when configured as RAID. See [RAID layout and throughput](/products/storage/local-storage#raid-layout-and-throughput) to learn about RAID configurations and their performance characteristics. ## Primary use cases Training next-generation foundation models in the trillion-parameter class, massive-scale and high-fidelity inference on the most complex AI models, and memory-intensive scientific simulations that require maximum throughput. ## Recommended models Next-generation frontier models (multi-trillion parameters), state-of-the-art multimodal systems, and large-scale scientific discovery models. # About NVL72-powered instances Source: https://docs.coreweave.com/platform/instances/nvl72 Learn how NVL72-powered instances deliver efficient, high-performance, energy-conscious AI compute power AI models with trillions of parameters are increasingly common, and the demand for computational power is surging. Traditional GPU solutions struggle to meet these demands, which leads to development bottlenecks, high energy consumption, and escalating costs. CoreWeave's NVL72-powered instances address these challenges by harnessing the architecture of NVIDIA's Vera Rubin and Grace Blackwell superchips and the NVLink Switch System. Liquid cooling improves efficiency by consuming less energy than traditional air-cooled systems. Choose these instances when you need high performance for large-scale AI training and inference, large memory capacity for massive datasets, and fast GPU-to-GPU communication for distributed computing. ## Vera Rubin instances CoreWeave's [Vera Rubin instances](/platform/instances/gpu/verarubin-4x-e) pair NVIDIA Rubin GPUs with NVIDIA Vera Arm CPUs and connect over sixth-generation NVLink. They use NVIDIA Spectrum-X RoCE (RDMA over Converged Ethernet) with BlueField-4 and ConnectX-9 SuperNICs for large-scale AI in Ethernet-based cloud environments. For detailed specifications, see the [Vera Rubin NVL72 instance page](/platform/instances/gpu/verarubin-4x-e). ## GB300 instances CoreWeave's GB300 instances are offered in two specialized networking configurations that deliver 800 Gbps of bandwidth: * [GB300 instances with Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) are optimized for low latency in traditional HPC and large-scale AI training. * [GB300 instances with Spectrum-X RoCE (RDMA over Converged Ethernet)](/platform/instances/gpu/gb300-4x-e) use BlueField-3 and ConnectX-8 SuperNICs for large-scale AI in Ethernet-based cloud environments. ## GB200 instances CoreWeave's [GB200 instances](/platform/instances/gpu/gb200-4x) are powered by 4x NVIDIA GB200 GPUs and connected with 400 Gb/s NDR InfiniBand, built on the NVIDIA Quantum-2 InfiniBand fabric. ## Deploy NVL72-powered instances as full racks NVL72-powered instances must be deployed as **full racks of 18 Nodes** to ensure optimal performance. CKS enforces full-rack deployment and won't allow requesting partial racks. When deploying Node Pools for rack-based instances, use `targetRacks` to request Nodes at the rack level. You can still use `targetNodes`, but the value must be a multiple of 18, such as 36 or 54. Use `targetRacks` to specify the number of racks directly, where each rack contains 18 Nodes: ```yaml title="NodePool using targetRacks" {8} theme={"system"} apiVersion: compute.coreweave.com/v1alpha1 kind: NodePool metadata: name: example-nodepool spec: computeClass: default instanceType: gb200-4x targetRacks: 1 ``` Alternatively, use `targetNodes` set to a multiple of **18**, such as **18**, **36**, or **54**: ```yaml title="NodePool using targetNodes" {8} theme={"system"} apiVersion: compute.coreweave.com/v1alpha1 kind: NodePool metadata: name: example-nodepool spec: computeClass: default instanceType: gb200-4x targetNodes: 18 ``` > [!NOTE] > > Autoscaling is not supported for rack-based instance types. Setting `autoscaling: true` on a Node Pool with a GB200, GB300, or Vera Rubin instance type is rejected by CKS. Because NVL72-powered instances must be deployed as full racks, [CoreWeave's Day 2+ automation](/platform/fleet-management/node-lifecycle/day2) can't automatically replace a malfunctioning Node with one from a different rack. Instead, NVL72-powered Nodes must be physically exchanged within the same rack. As a best practice, workloads should tolerate up to two unavailable Nodes per rack for maintenance purposes. If a rack has more than two unavailable Nodes, the entire rack is cordoned and drained for service. ## Manage Pod affinity To take full advantage of the NVL72 architecture's shared NVLink fabric, all Nodes from the same job must be scheduled onto the same rack with the same NVLink domain for optimal performance. This is especially important for large-scale distributed computing tasks, where efficient communication between GPUs reduces processing times. > [!NOTE] > > Slurm users should use the [Topology/Block Plugin for Slurm](/products/sunk/optimize_workloads/topology-scheduling) to control job placement. The following sections describe how to control Pod placement using NVLink domain labels and, when needed, InfiniBand or RoCE network labels. ### Control placement with NVLink domain Kubernetes controls Pod placement with affinity rules that steer Pods toward Nodes with specific labels. In CKS, all Nodes are labeled with their NVLink domain, allowing precise control over Pod placement. To ensure multiple Pods are scheduled onto the same NVL72 rack, set their affinity toward Nodes within the same NVLink domain. In the NVL72 architecture, all Nodes within the same rack share the same unique `ds.coreweave.com/nvlink.domain` label. If a Node Pool spans multiple racks, Pods can reference multiple NVLink domains in `matchExpressions.values`. For example, this Pod affinity rule targets a single NVLink domain. Replace `[NVLINK-DOMAIN]` with the value of the `ds.coreweave.com/nvlink.domain` label for your target rack. To find it, run `kubectl get nodes -L ds.coreweave.com/nvlink.domain`: ```yaml theme={"system"} affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ds.coreweave.com/nvlink.domain operator: In values: - [NVLINK-DOMAIN] ``` ### Control placement with InfiniBand labels In some cases, it's useful to deploy Pods on Nodes in different NVLink domains while controlling the InfiniBand or RoCE network location. See [InfiniBand and RoCE labels](/products/networking/hpc-interconnect/infiniband-roce-labels) for more information. ## More resources To learn more about our platform, see the following resources: * [Node lifecycle](/platform/fleet-management/node-lifecycle) * [GPU instances](/platform/instances/gpu-instances) * [CPU instances](/platform/instances/cpu-instances) * [Regions and Availability Zones](/platform/regions/about-regions-and-azs) * [Pricing information](https://www.coreweave.com/pricing) # Select an instance: key considerations for LLMs Source: https://docs.coreweave.com/platform/instances/selecting-an-instance Learn about the key considerations for selecting the right instance for your LLM workload The primary technical constraint for running any large language model (LLM) is the available GPU memory. For a model to operate efficiently, all of its components, including its parameters, the data being processed, and intermediate calculation states, must fit into the memory of one or more GPUs. Understanding how these components consume memory is crucial for selecting the right hardware for your task, whether it's training, fine-tuning, or inference. ## Model parameters (weights) At its core, an LLM consists of billions of numerical values, known as parameters or weights. These parameters are the learned knowledge of the model. The total memory required to store them is a direct function of the number of parameters and the numerical precision used. ## Precision and quantization Precision refers to the data type used to store the model's parameters. Using lower precision reduces the memory footprint and can increase computation speed on supported hardware. * **FP16/BF16 (half precision):** The standard for model training and fine-tuning. It provides a good balance between numerical accuracy and memory usage. * **Quantization (FP8, INT8, FP4, and INT4):** This technique, primarily used for inference, converts the model's FP16/BF16 weights into lower-precision formats. Integer formats (INT8, INT4) map weights to 8-bit or 4-bit integers, while floating-point formats (FP8, FP4) retain an exponent and mantissa, which typically preserves accuracy better at the same memory footprint. FP8 is hardware-accelerated on NVIDIA Hopper and newer GPUs, and FP4 (NVFP4) on Blackwell and newer. Quantization compresses the model, letting you run a larger model on the same hardware or the same model on less expensive hardware. The trade-off is a minor, often imperceptible, reduction in accuracy, which is generally acceptable for production inference workloads. Use the following formulas to estimate the GPU memory required to load the model's weights: * **For FP16/BF16:** Model size (in billions) × 2 GB. * **For FP8 or INT8:** Model size (in billions) × 1 GB. * **For FP4 or INT4:** Model size (in billions) × 0.5 GB. These estimates cover weights only. Total memory at runtime also includes the KV cache, activations, and framework overhead, so plan for additional headroom. Sub-byte formats also store per-block scaling factors that add a small amount (roughly 5 percent) to the weight footprint. ## The impact of the KV cache (for inference) During inference, the key-value (KV) cache consumes a sizable portion of GPU memory. To generate new text, an LLM must pay attention to the preceding tokens. The KV cache stores these intermediate attention calculations so they don't have to be recomputed for every new word generated. While this speeds up inference, the cache's memory footprint is dynamic and grows with the complexity of the request. Its size scales linearly with both the sequence length (the size of the input prompt plus the generated text) and the batch size (the number of concurrent requests the system processes). Managing the KV cache is a critical aspect of optimizing for high-throughput inference with long context windows. ## GPU memory for training Optimizer states and gradients make training or fine-tuning a model far more memory-intensive than inference. In addition to the model weights and data batches, the GPU must also store: * **Optimizer states:** Most modern optimizers, like Adam or AdamW, maintain momentum and variance states for each parameter to stabilize and accelerate training. This can consume twice as much memory as the model's parameters themselves. * **Gradients:** The calculated directions for updating each model weight. The memory required is typically equal to the size of the model parameters in FP16. As a result, fine-tuning a model can require 3x to 4x more GPU memory than running it for inference. ## The role of NVLink and InfiniBand Running models larger than a single GPU's memory requires high-speed interconnects to link GPUs together, a practice known as model parallelism. The performance of this approach depends on a two-level fabric: * **The GPU fabric (NVLink):** A high-speed, direct link between GPUs. In standard servers like our B200 or H100 instances, NVLink connects the 8 GPUs within the server chassis. Our Grace Blackwell NVL72 instances (`gb200-4x`) extend this design by using an NVLink Switch fabric to span the memory domain across all 72 GPUs in an entire rack, turning the rack into a single GPU. * **The system fabric (InfiniBand):** The high-performance network that scales your workload further. For standard servers, InfiniBand connects multiple Nodes together. For Grace Blackwell NVL72 systems, its role expands to connecting multiple racks, which lets you build large AI supercomputers from these rack-scale units. ## Instance comparison Vera Rubin NVL72 instances offer up to 5x inference throughput and 3.5x training performance over GB200 NVL72. For detailed specifications, see the [Vera Rubin instance page](/platform/instances/gpu/verarubin-4x-e). The following table summarizes the available GPU instances, their total memory, and the model sizes each configuration can support, to help you match an instance to your workload. | GPU | System Config | Total GPU Memory | Max Inference Model Size (FP8)\* | Max Training Model Size (BF16) | Examples of Models That Fit | | - | - | - | - | - | - | | [Vera Rubin NVL72](/platform/instances/gpu/verarubin-4x-e) | NVL72 (72 GPUs) | 20.7 TB | \~20.7 Trillion | \~1.3 Trillion | **Inference:** Next-generation, multi-trillion parameter models at high fidelity **Training:** Foundation models in the multi-trillion parameter range | | [GB300](/platform/instances/gpu/gb300-4x) | NVL72 (72 GPUs) | 20.1 TB | \~20.1 Trillion | \~1.3 Trillion | **Inference:** Next-generation, multi-trillion parameter models at high fidelity **Training:** Foundation models in the multi-trillion parameter range | | [GB200](/platform/instances/gpu/gb200-4x) | NVL72 (72 GPUs) | 13.4 TB | \~13.4 Trillion | \~840 Billion | **Inference:** GPT-5, Claude Opus, Gemini Ultra, other large proprietary models **Training:** GLM-5.2 max with 744B parameters, Nemotron 3 Ultra | | [B300](/platform/instances/gpu/b300-8x) | 8-GPU system (NVLink) | 2.16 TB | \~2.16 Trillion | \~135 Billion | **Inference:** DeepSeek V4 Pro, MiMo-V2.5-Pro, Kimi K2.7 Code **Training:** Mistral Medium 3.5, Qwen 3.5 122B A10B | | [B200](/platform/instances/gpu/b200-8x) | 8-GPU system (NVLink) | 1.44 TB | \~1.44 Trillion | \~90 Billion | **Inference:** MiMo-V2.5-Pro, Kimi K2.7 Code, GLM-5.2 (max) **Training:** Qwen 3 Next 80B A3B, K2 Think V2 | | [H200](/platform/instances/gpu/gd-8xh200ib-i128) | 8-GPU system (NVLink) | 1.13 TB | \~1.13 Trillion | \~70 Billion | **Inference:** MiMo-V2.5-Pro, Kimi K2.7 Code, GLM-5.2 (max) **Training:** Qwen 3.6 27B and 35B A3B, Gemma 4 31B and 26B A4B | | [H100](/platform/instances/gpu/gd-8xh100ib-i128) | 8-GPU system (NVLink) | 640 GB | \~640 Billion | \~40 Billion | **Inference:** Nemotron 3 Ultra, MiniMax-M3, DeepSeek V4 Flash **Training:** Qwen 3.6 27B and 35B A3B, Gemma 4 31B and 26B A4B, fine-tuning large models | | [RTX PRO 6000 Blackwell Server Edition](/platform/instances/gpu/rtxp6000-8x) | 8-GPU system (No NVLink) | 96 GB per GPU | \~86 Billion | \~6 Billion | **Inference:** Qwen 3.6 27B and 35B A3B, Gemma 4 31B and 26B A4B **Training:** Models up to \~6B from scratch, fine-tuning larger models | | [L40S](/platform/instances/gpu/gd-8xl40s-i128) | 8-GPU system (No NVLink) | 48 GB per GPU | \~43 Billion | \~3 Billion | **Inference:** Qwen2 32B, LLaVA 34B **Training:** Small custom models (\~2B), efficient fine-tuning | | [L40](/platform/instances/gpu/gd-8xl40-i128) | 8-GPU system (No NVLink) | 48 GB per GPU | \~43 Billion | \~3 Billion | **Inference:** Qwen2 32B, LLaVA 34B **Training:** Small custom models (\~2B), fine-tuning | | [GH200](/platform/instances/gpu/gd-1xgh200) | 1 GPU | 576 GB | \~576 Billion | \~6 Billion | **Inference:** Llama 3.1 405B, Nemotron-4 340B **Training:** Small custom models (\~6B) | | [A100](/platform/instances/gpu/gd-8xa100-i128) | 8-GPU system (NVLink) | 640 GB | \~640 Billion | \~40 Billion | **Inference:** Llama 3.1 405B, Falcon-180B **Training:** Qwen2 32B, fine-tuning large models | \*Figures represent theoretical estimates for a single model. A typical production scenario often involves running multiple smaller models concurrently. > [!NOTE] > > Learn more about our [GPU instances](/platform/instances/gpu-instances), [CPU instances](/platform/instances/cpu-instances), and [NVL72-powered instances](/platform/instances/nvl72). # CoreWeave Omni Source: https://docs.coreweave.com/platform/omni Run the CoreWeave Cloud Platform in your data center with CoreWeave-managed operations and full hardware control CoreWeave Omni is a cloud-as-a-service model. CoreWeave deploys and operates the full CoreWeave cloud stack inside your data center. You keep ownership of the facility and hardware. CoreWeave delivers a managed region, the CoreWeave Cloud Platform, and day-to-day operational management. ## What CoreWeave provides CoreWeave Omni includes the following: * **Managed cloud region:** The CoreWeave cloud stack runs in your data center as a dedicated region. * **CoreWeave Cloud Platform:** Kubernetes orchestration, the control plane, networking, storage, and observability. * **Operational management:** CoreWeave runs the environment. You own the data center facility and the hardware. ## The Omni stack Omni is organized as layers, from infrastructure through AI development: | Layer | Role | | - | - | | **Foundational infrastructure** | Base compute, power, and facilities integration. | | **Data and storage** | Data services and storage aligned with CoreWeave patterns. | | **Infrastructure control** | Provisioning and lifecycle for underlying resources. | | **Runtime acceleration** | Performance-oriented runtime for demanding workloads. | | **Model and agent development** | Environments for models, agents, and supporting tools. | **Mission Control** spans the stack with shared platform capabilities: security, talent services, and observability. ## For more information For Omni availability, sizing, and pricing, contact your CoreWeave account team. # About Regions and Availability Zones (AZs) Source: https://docs.coreweave.com/platform/regions/about-regions-and-azs Learn about CoreWeave Regions and Availability Zones, including General Access and Dedicated Access options CoreWeave offers compute in multiple geographically diverse locations to ensure high availability, resilience, global coverage, and low-latency access for your applications. CoreWeave organizes these locations into Geos, Super Regions, Regions, and Availability Zones (AZs). Regions and Availability Zones (AZs) are the core concepts to understand when you deploy applications on CoreWeave. These are located within Super Regions and Geos, which are explained in more detail in the [Geographical hierarchy](#geographical-hierarchy) section. Regions contain one or more AZs. CoreWeave categorizes AZs as General Access or Dedicated Access. For a list of every AZ and its access type, see [All Availability Zones](/platform/regions/all-availability-zones). ## General access General Access AZs are available to all CoreWeave customers, subject to capacity. [VPCs](/products/networking/vpc/about-vpcs) isolate tenant workloads, with per-tenant network segmentation enforced at the hardware layer by [DPUs](/products/networking/nimbus). ## Dedicated access CoreWeave manages Dedicated Access AZs and reserves them for select customers. Infrastructure in a Dedicated Access AZ is single-tenant: no other customer's workloads run in the AZ, and no other tenant shares the underlying network fabric. This provides full network isolation in addition to the platform-wide [VPC](/products/networking/vpc/about-vpcs) and [DPU-based](/products/networking/nimbus) tenant segmentation. ## Region features All CoreWeave Regions offer these features: * **Free data transfer**: move data between Regions without incurring additional costs. * **Fast and reliable internet access**: each Region has redundant, 200 Gbps+ public internet connectivity from Tier 1 global carriers. * **High-speed, private dark fiber backbone**: all Regions connect through 400 Gbps+ of dark fiber to enable rapid data movement and synchronization. * [**Distributed File Storage**](/products/storage/distributed-file-storage/create-volumes): each Region offers high-performance shared filesystems for your applications. * [**Virtual Private Clouds**](/products/networking/vpc/about-vpcs): all Regions provide VPCs for network isolation and security. * [**CoreWeave AI Object Storage**](/products/storage/object-storage): available in select Availability Zones. ## Geographical hierarchy The following terms describe how CoreWeave structures its global infrastructure: | Term | Description | Example | | - | - | - | | **Geo** | A large geographic area, such as a continent or a large country. CoreWeave uses Geos to manage global infrastructure, ensure compliance with regulatory requirements, and optimize for large-scale redundancy and disaster recovery. | All locations in the United States reside in the `US` Geo. | | **Super Region** | A large section of a Geo that typically contains multiple Regions. Super Regions group Regions together for administrative purposes and provide a high-level view of the infrastructure in a geographic area. | All locations in the eastern United States are part of the `US-EAST` Super Region. | | **Region** | An area within a Geo that contains multiple Availability Zones (AZs). Regions provide the infrastructure foundation for resiliency. When you deploy across multiple AZs within a Region, you can design failover-ready workloads that minimize downtime. CoreWeave places Regions to offer low latency, high-performance connectivity, and to meet data residency requirements. | Region `US-EAST-05` resides in the `US-EAST` Super Region. | | **Availability Zone (AZ)** | A partition within a Region that hosts one or more data halls. AZs are physically and operationally independent from each other to prevent failures from propagating across them. | Availability Zone `A` in the `US-EAST-05` Region is named `US-EAST-05A`. | Together, these concepts provide the foundation for high availability, fault tolerance, and disaster recovery for your applications and workloads. ## Region and AZ labels CoreWeave exposes Region and AZ information through two different sets of labels depending on the context: Kubernetes Node labels for scheduling, and metrics labels for queries, APIs, and CRDs. ### Kubernetes Node labels Use these labels in `nodeSelector`, affinity rules, and topology spread constraints: | Label | Value | Example | | :- | :- | :- | | `topology.kubernetes.io/region` | Region name | `US-EAST-04` | > [!NOTE] > > The standard Kubernetes label `topology.kubernetes.io/zone` is present on CoreWeave Nodes but doesn't hold the AZ name. It holds a rack number for use by topology-aware schedulers. No AZ-level Kubernetes Node label exists. Because CKS clusters are single-AZ, AZ affinity within a cluster isn't needed. ### Metrics and API labels Use these labels in metrics queries, API calls, and CRDs. They appear on `kube_node_info` and in CoreWeave CRDs, but aren't Kubernetes Node labels. | Label | Value | Example | | :- | :- | :- | | `region` | Region name | `US-EAST-04` | | `zone` | AZ name | `US-EAST-04A` | ### Single-AZ CKS clusters CoreWeave Kubernetes Service (CKS) clusters are zonal. CoreWeave provisions each cluster within a single AZ. All Nodes in a cluster belong to the same AZ, so you don't need AZ affinity rules within a cluster. If you need rack-level placement within an AZ (for example, to co-locate Nodes on the same NVLink fabric), use the `node.coreweave.cloud/rack` label in a `nodeSelector` or affinity rule. The following Pod schedules only onto Nodes in rack `12`, which keeps tightly coupled multi-Node jobs on the same fabric segment: ```yaml title="rack-pinned-pod.yaml" highlight={6-13} theme={"system"} apiVersion: v1 kind: Pod metadata: name: example-rack-pinned spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node.coreweave.cloud/rack operator: In values: - "12" # Replace with your rack number containers: - name: example image: [IMAGE] # Replace with your container image resources: limits: nvidia.com/gpu: 8 ``` To discover the rack and instance type label values present in your cluster before you pin to them, list them with `kubectl`: ```bash theme={"system"} # List each Node with its rack number. Read-only; safe to run anytime. kubectl get nodes -L node.coreweave.cloud/rack # List each Node's rack and instance type together. Read-only; safe to run anytime. kubectl get nodes -L node.coreweave.cloud/rack -L node.coreweave.cloud/type ``` A `nodeSelector` or affinity that targets a value not shown by these commands leaves the Pod Pending, because no Node matches. For multi-rack fabric locality (keeping a large job within one InfiniBand or RoCE fabric), use the leafgroup and superpod labels instead. See [InfiniBand and RoCE node labels](/products/networking/hpc-interconnect/infiniband-roce-labels) for details. ## Choose a Region and Zone for your GPU quota CKS clusters are single-AZ. Confirm your target AZ supports the instance types you need before creating a cluster. To check which instance types an AZ offers, use the [Instance availability matrix](/platform/instances/availability-matrix). The matrix lists each instance type and where it's deployed. The matrix shows where instance types are deployed, not current availability. Actual provisioning depends on availability and your [resource quota](/products/cks/clusters/quotas). ## What to do when capacity is unavailable If your instance type isn't available in your target AZ, choose a different instance type or AZ, or [contact CoreWeave support](/support) to discuss your options. ## Speedtest To verify network performance for a Region or AZ before you deploy workloads, run speed tests with `ping`, `curl`, or another method of your choice. Each Availability Zone in the [All Availability Zones](/platform/regions/all-availability-zones) table lists speed and latency test endpoints in its Network information section. For example, to measure name lookup, connect, and total transfer times with `curl`, replace `[SPEEDTEST-URL]` with one of those endpoints and run: ```bash title="Example curl command" theme={"system"} curl [SPEEDTEST-URL] \ --write-out '\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTotal: %{time_total}s\n' \ --output /dev/null ``` ```text title="Result" theme={"system"} % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1024M 100 1024M 0 0 37.2M 0 0:00:27 0:00:27 --:--:-- 38.9M DNS: 0.001822s Connect: 0.091322s Total: 27.465658s ``` # All Availability Zones Source: https://docs.coreweave.com/platform/regions/all-availability-zones View all CoreWeave Availability Zones, grouped by Super Region ### CA-EAST | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [CA-EAST-01A](/platform/regions/ca-east#ca-east-01a) | Ontario, Canada | General Access | Yes | ### EU-NORTH | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [EU-NORTH-01A](/platform/regions/eu-north#eu-north-01a) | Falun, Sweden | Dedicated Access | | | [EU-NORTH-02A](/platform/regions/eu-north#eu-north-02a) | Kristiansand, Norway | Dedicated Access | | | [EU-NORTH-04A](/platform/regions/eu-north#eu-north-04a) | Stockholm, Sweden | Dedicated Access | | | [EU-NORTH-05A](/platform/regions/eu-north#eu-north-05a) | Skovlunde, Denmark | Dedicated Access | Yes | ### EU-SOUTH | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [EU-SOUTH-01A](/platform/regions/eu-south#eu-south-01a) | Barcelona, Spain | Dedicated Access | | | [EU-SOUTH-03B](/platform/regions/eu-south#eu-south-03b) | Barcelona, Spain | General Access | Yes | | [EU-SOUTH-04A](/platform/regions/eu-south#eu-south-04a) | Alava, Spain | General Access | Yes | ### EU-WEST | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [EU-WEST-01A](/platform/regions/eu-west#eu-west-01a) | Crawley, UK | Dedicated Access | | | [EU-WEST-02A](/platform/regions/eu-west#eu-west-02a) | London, UK | Dedicated Access | | ### US-CENTRAL | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [AUS1A](/platform/regions/us-central#aus1a) | Texas, USA | Dedicated Access | | | [DFW1A](/platform/regions/us-central#dfw1a) | Texas, USA | Dedicated Access | | | [SBN1A](/platform/regions/us-central#sbn1a) | Indiana, USA | Dedicated Access | | | [US-CENTRAL-01A](/platform/regions/us-central#us-central-01a) | Illinois, USA | Dedicated Access | | | [US-CENTRAL-02A](/platform/regions/us-central#us-central-02a) | Texas, USA | Dedicated Access | | | [US-CENTRAL-03A](/platform/regions/us-central#us-central-03a) | Texas, USA | Dedicated Access | | | [US-CENTRAL-04A](/platform/regions/us-central#us-central-04a) | Texas, USA | Dedicated Access | | | [US-CENTRAL-05A](/platform/regions/us-central#us-central-05a) | Texas, USA | Dedicated Access | Yes | | [US-CENTRAL-06A](/platform/regions/us-central#us-central-06a) | Texas, USA | General Access | Yes | | [US-CENTRAL-07A](/platform/regions/us-central#us-central-07a) | Illinois, USA | General Access | Yes | | [US-CENTRAL-08A](/platform/regions/us-central#us-central-08a) | North Dakota, USA | Dedicated Access | Yes | | [US-CENTRAL-08B](/platform/regions/us-central#us-central-08b) | North Dakota, USA | Dedicated Access | Yes | | [US-CENTRAL-09A](/platform/regions/us-central#us-central-09a) | Texas, USA | General Access | | | [US-CENTRAL-10A](/platform/regions/us-central#us-central-10a) | Oklahoma, USA | Dedicated Access | | | [US-CENTRAL-11A](/platform/regions/us-central#us-central-11a) | Ohio, USA | Dedicated Access | | ### US-EAST | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [ATL2A](/platform/regions/us-east#atl2a) | Georgia, USA | Dedicated Access | | | [ATL4A](/platform/regions/us-east#atl4a) | Georgia, USA | Dedicated Access | | | [RDU1A](/platform/regions/us-east#rdu1a) | Virginia, USA | Dedicated Access | | | [US-EAST-01A](/platform/regions/us-east#us-east-01a) | New York, USA | General Access | Yes | | [US-EAST-02A](/platform/regions/us-east#us-east-02a) | New Jersey, USA | General Access | Yes | | [US-EAST-02B](/platform/regions/us-east#us-east-02b) | New Jersey, USA | Dedicated Access | | | [US-EAST-03A](/platform/regions/us-east#us-east-03a) | Pennsylvania, USA | Dedicated Access | Yes | | [US-EAST-04A](/platform/regions/us-east#us-east-04a) | Virginia, USA | General Access | Yes | | [US-EAST-04B](/platform/regions/us-east#us-east-04b) | Virginia, USA | Dedicated Access | Yes | | [US-EAST-05A](/platform/regions/us-east#us-east-05a) | Georgia, USA | Dedicated Access | | | [US-EAST-06A](/platform/regions/us-east#us-east-06a) | Ohio, USA | General Access | Yes | | [US-EAST-07A](/platform/regions/us-east#us-east-07a) | Ohio, USA | Dedicated Access | | | [US-EAST-08A](/platform/regions/us-east#us-east-08a) | Ohio, USA | General Access | Yes | | [US-EAST-09A](/platform/regions/us-east#us-east-09a) | Georgia, USA | Dedicated Access | | | [US-EAST-10A](/platform/regions/us-east#us-east-10a) | Massachusetts, USA | Dedicated Access | | | [US-EAST-11A](/platform/regions/us-east#us-east-11a) | North Carolina, USA | Dedicated Access | | | [US-EAST-12A](/platform/regions/us-east#us-east-12a) | Georgia, USA | Dedicated Access | | | [US-EAST-13A](/platform/regions/us-east#us-east-13a) | Michigan, USA | General Access | Yes | | [US-EAST-14A](/platform/regions/us-east#us-east-14a) | New Jersey, USA | General Access | Yes | | [US-EAST-15A](/platform/regions/us-east#us-east-15a) | Virginia, USA | General Access | Yes | | [US-EAST-17A](/platform/regions/us-east#us-east-17a) | New Jersey, USA | General Access | Yes | ### US-WEST | Availability Zone | Location | Access Type | AI Object Storage | | :- | :- | :- | :- | | [PDX2A](/platform/regions/us-west#pdx2a) | Oregon, USA | Dedicated Access | | | [RNO2A](/platform/regions/us-west#rno2a) | Nevada, USA | General Access | Yes | | [US-WEST-01A](/platform/regions/us-west#us-west-01a) | Nevada, USA | General Access | Yes | | [US-WEST-02A](/platform/regions/us-west#us-west-02a) | Arizona, USA | Dedicated Access | | | [US-WEST-02B](/platform/regions/us-west#us-west-02b) | Arizona, USA | General Access | | | [US-WEST-03A](/platform/regions/us-west#us-west-03a) | Oregon, USA | Dedicated Access | | | [US-WEST-04A](/platform/regions/us-west#us-west-04a) | Arizona, USA | General Access | Yes | | [US-WEST-05A](/platform/regions/us-west#us-west-05a) | Washington, USA | Dedicated Access | | | [US-WEST-06A](/platform/regions/us-west#us-west-06a) | Oregon, USA | Dedicated Access | | | [US-WEST-07A](/platform/regions/us-west#us-west-07a) | Colorado, USA | Dedicated Access | | | [US-WEST-08A](/platform/regions/us-west#us-west-08a) | California, USA | Dedicated Access | | | [US-WEST-09B](/platform/regions/us-west#us-west-09b) | Washington, USA | General Access | Yes | | [US-WEST-10A](/platform/regions/us-west#us-west-10a) | Nevada, USA | General Access | Yes | # CA-EAST Source: https://docs.coreweave.com/platform/regions/ca-east Availability Zones in the CoreWeave CA-EAST super region, including locations in Ontario, Canada, and access tiers. ## CA-EAST-01A This is a General Access zone located in Ontario, Canada. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB300 NVL72 Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.72.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.72.0/24`, `166.19.73.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.219.128.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.ca-east-01.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.ca-east-01.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.ca-east-01.coreweave.com` | ICMP latency test address | # EU-NORTH Source: https://docs.coreweave.com/platform/regions/eu-north Availability Zones in the CoreWeave EU-NORTH super region, including locations in Sweden and Norway, and access tiers. ## EU-NORTH-01A This is a Dedicated Access zone located in Falun, Sweden. It is reserved for select customers. ## EU-NORTH-02A This is a Dedicated Access zone located in Kristiansand, Norway. It is reserved for select customers. ## EU-NORTH-04A This is a Dedicated Access zone located in Stockholm, Sweden. It is reserved for select customers. ## EU-NORTH-05A This is a Dedicated Access zone located in Skovlunde, Denmark. It is reserved for select customers. AI Object Storage is available. # EU-SOUTH Source: https://docs.coreweave.com/platform/regions/eu-south Availability Zones in the CoreWeave EU-SOUTH super region, including Barcelona, Spain locations and access tiers. ## EU-SOUTH-01A This is a Dedicated Access zone located in Barcelona, Spain. It is reserved for select customers. ## EU-SOUTH-03B This is a General Access zone located in Barcelona, Spain. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `83.228.136.0/22` | Public IP address range for this AZ | | **NAT Egress** | `83.228.136.0/24`, `83.228.137.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.206.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.eu-south-03.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.eu-south-03.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.eu-south-03.coreweave.com` | ICMP latency test address | ## EU-SOUTH-04A This is a General Access zone located in Alava, Spain. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `83.228.144.0/22` | Public IP address range for this AZ | | **NAT Egress** | `83.228.144.0/24`, `83.228.145.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.104.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.eu-south-04.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.eu-south-04.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.eu-south-04.coreweave.com` | ICMP latency test address | # EU-WEST Source: https://docs.coreweave.com/platform/regions/eu-west Availability Zones in the CoreWeave EU-WEST super region, including locations in Crawley and London, UK. ## EU-WEST-01A This is a Dedicated Access zone located in Crawley, UK. It is reserved for select customers. ## EU-WEST-02A This is a Dedicated Access zone located in London, UK. It is reserved for select customers. # US-CENTRAL Source: https://docs.coreweave.com/platform/regions/us-central Availability Zones in the CoreWeave US-CENTRAL super region, including locations in Texas, Indiana, and Illinois. ## AUS1A This is a Dedicated Access zone located in Texas, USA. It is reserved for select customers. ## DFW1A This is a Dedicated Access zone located in Texas, USA. It is reserved for select customers. ## SBN1A This is a Dedicated Access zone located in Indiana, USA. It is reserved for select customers. ## US-CENTRAL-01A This is a Dedicated Access zone located in Illinois, USA. It is reserved for select customers. ## US-CENTRAL-02A This is a Dedicated Access zone located in Texas, USA. It is reserved for select customers. ## US-CENTRAL-03A This is a Dedicated Access zone located in Texas, USA. It is reserved for select customers. ## US-CENTRAL-04A This is a Dedicated Access zone located in Texas, USA. It is reserved for select customers. ## US-CENTRAL-05A This is a Dedicated Access zone located in Texas, USA. It is reserved for select customers. AI Object Storage is available. ## US-CENTRAL-06A This is a General Access zone located in Texas, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [B300 (InfiniBand)](/platform/instances/gpu/b300-8x) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.152.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.152.0/24`, `166.19.153.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.51.128.0/17` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-central-06.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-central-06.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-central-06.coreweave.com` | ICMP latency test address | ## US-CENTRAL-07A This is a General Access zone located in Illinois, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB300 NVL72 Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.112.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.112.0/24`, `166.19.113.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.109.128.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-central-07.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-central-07.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-central-07.coreweave.com` | ICMP latency test address | ## US-CENTRAL-08A This is a Dedicated Access zone located in North Dakota, USA. It is reserved for select customers. AI Object Storage is available. ## US-CENTRAL-08B This is a Dedicated Access zone located in North Dakota, USA. It is reserved for select customers. AI Object Storage is available. ## US-CENTRAL-09A This is a General Access zone located in Texas, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [Vera Rubin NVL72 Spectrum-X RoCE](/platform/instances/gpu/verarubin-4x-e) [GB300 NVL72 Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) | | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.128.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.128.0/24`, `166.19.129.0/24` | Subset of the Public Range used for Service egress | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-central-09.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-central-09.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-central-09.coreweave.com` | ICMP latency test address | ## US-CENTRAL-10A This is a Dedicated Access zone located in Oklahoma, USA. It is reserved for select customers. ## US-CENTRAL-11A This is a Dedicated Access zone located in Ohio, USA. It is reserved for select customers. # US-EAST Source: https://docs.coreweave.com/platform/regions/us-east Availability Zones in the CoreWeave US-EAST super region, including locations in Georgia, Virginia, and New York. ## ATL2A This is a Dedicated Access zone located in Georgia, USA. It is reserved for select customers. ## ATL4A This is a Dedicated Access zone located in Georgia, USA. It is reserved for select customers. ## RDU1A This is a Dedicated Access zone located in Virginia, USA. It is reserved for select customers. ## US-EAST-01A This is a General Access zone located in New York, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.48.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.48.0/24`, `166.19.49.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.202.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-01.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-01.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-01.coreweave.com` | ICMP latency test address | ## US-EAST-02A This is a General Access zone located in New Jersey, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [L40](/platform/instances/gpu/gd-8xl40-i128) | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.8.0/23` | Public IP address range for this AZ | | **NAT Egress** | `166.19.8.192/26` | Subset of the Public Range used for Service egress | | **Node Range** | `10.184.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-02.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-02.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-02.coreweave.com` | ICMP latency test address | ## US-EAST-02B This is a Dedicated Access zone located in New Jersey, USA. It is reserved for select customers. ## US-EAST-03A This is a Dedicated Access zone located in Pennsylvania, USA. It is reserved for select customers. AI Object Storage is available. ## US-EAST-04A This is a General Access zone located in Virginia, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) [L40S](/platform/instances/gpu/gd-8xl40s-i128) [L40](/platform/instances/gpu/gd-8xl40-i128) [GH200](/platform/instances/gpu/gd-1xgh200) [A100](/platform/instances/gpu/gd-8xa100-i128) | [High Performance AMD Genoa](/platform/instances/cpu/cd-hp-a96-genoa) [High Core AMD Genoa](/platform/instances/cpu/cd-hc-a384-genoa) [High Core AMD Genoa (InfiniBand)](/platform/instances/cpu/cd-hc-a384ib-genoa) [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.10.0/23`, `166.19.16.0/21` | Public IP address range for this AZ | | **NAT Egress** | `166.19.10.192/26`, `166.19.19.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.176.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-04.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-04.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-04.coreweave.com` | ICMP latency test address | ## US-EAST-04B This is a Dedicated Access zone located in Virginia, USA. It is reserved for select customers. AI Object Storage is available. ## US-EAST-05A This is a Dedicated Access zone located in Georgia, USA. It is reserved for select customers. ## US-EAST-06A This is a General Access zone located in Ohio, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.36.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.36.0/24`, `166.19.37.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.192.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-06.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-06.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-06.coreweave.com` | ICMP latency test address | ## US-EAST-07A This is a Dedicated Access zone located in Ohio, USA. It is reserved for select customers. ## US-EAST-08A This is a General Access zone located in Ohio, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) | [General Purpose AMD Genoa (High Storage)](/platform/instances/cpu/cd-gp-l-a192-genoa) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.12.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.12.0/24`, `166.19.13.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.186.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-08.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-08.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-08.coreweave.com` | ICMP latency test address | ## US-EAST-09A This is a Dedicated Access zone located in Georgia, USA. It is reserved for select customers. ## US-EAST-10A This is a Dedicated Access zone located in Massachusetts, USA. It is reserved for select customers. ## US-EAST-11A This is a Dedicated Access zone located in North Carolina, USA. It is reserved for select customers. ## US-EAST-12A This is a Dedicated Access zone located in Georgia, USA. It is reserved for select customers. ## US-EAST-13A This is a General Access zone located in Michigan, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) [B300 (InfiniBand)](/platform/instances/gpu/b300-8x) [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.88.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.88.0/24`, `166.19.89.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.221.128.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-13.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-13.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-13.coreweave.com` | ICMP latency test address | ## US-EAST-14A This is a General Access zone located in New Jersey, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.116.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.116.0/24`, `166.19.117.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.213.128.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-14.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-14.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-14.coreweave.com` | ICMP latency test address | ## US-EAST-15A This is a General Access zone located in Virginia, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) [RTX PRO 6000 Blackwell Server Edition (Standard Memory)](/platform/instances/gpu/rtxp6000-8x-v2) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.160.0/22` | Public IP address range for this AZ | | **Node Range** | `10.125.128.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-15.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-15.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-15.coreweave.com` | ICMP latency test address | ## US-EAST-17A This is a General Access zone located in New Jersey, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | | [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.136.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.136.0/24`, `166.19.137.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.59.128.0/17` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-17.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-east-17.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-east-17.coreweave.com` | ICMP latency test address | # US-WEST Source: https://docs.coreweave.com/platform/regions/us-west Availability Zones in the CoreWeave US-WEST super region, including locations in Oregon and Nevada and access tiers. ## PDX2A This is a Dedicated Access zone located in Oregon, USA. It is reserved for select customers. ## RNO2A This is a General Access zone located in Nevada, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [L40](/platform/instances/gpu/gd-8xl40-i128) [GH200](/platform/instances/gpu/gd-1xgh200) [A100](/platform/instances/gpu/gd-8xa100-i128) | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) [General Purpose AMD Turin (High Storage)](/platform/instances/cpu/turin-gp-l) [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Ice Lake](/platform/instances/cpu/cd-gp-i96-icelake) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `192.112.164.0/23` | Public IP address range for this AZ | | **NAT Egress** | `192.112.165.128/25` | Subset of the Public Range used for Service egress | | **Node Range** | `10.168.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.rno2.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.rno2.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.rno2.coreweave.com` | ICMP latency test address | ## US-WEST-01A This is a General Access zone located in Nevada, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [GB300 NVL72 Quantum-X InfiniBand](/platform/instances/gpu/gb300-4x) [GB200 NVL72-powered instances](/platform/instances/gpu/gb200-4x) [B300 (InfiniBand)](/platform/instances/gpu/b300-8x) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.28.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.28.0/23` | Subset of the Public Range used for Service egress | | **Node Range** | `10.188.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-01.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-01.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-west-01.coreweave.com` | ICMP latency test address | ## US-WEST-02A This is a Dedicated Access zone located in Arizona, USA. It is reserved for select customers. ## US-WEST-02B This is a General Access zone located in Arizona, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) | | | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.96.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.96.0/24`, `166.19.97.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.112.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-02.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-02.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-west-02.coreweave.com` | ICMP latency test address | ## US-WEST-03A This is a Dedicated Access zone located in Oregon, USA. It is reserved for select customers. ## US-WEST-04A This is a General Access zone located in Arizona, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [H200 (InfiniBand)](/platform/instances/gpu/gd-8xh200ib-i128) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.32.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.32.0/24`, `166.19.33.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.190.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-04.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-04.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-west-04.coreweave.com` | ICMP latency test address | ## US-WEST-05A This is a Dedicated Access zone located in Washington, USA. It is reserved for select customers. ## US-WEST-06A This is a Dedicated Access zone located in Oregon, USA. It is reserved for select customers. ## US-WEST-07A This is a Dedicated Access zone located in Colorado, USA. It is reserved for select customers. ## US-WEST-08A This is a Dedicated Access zone located in California, USA. It is reserved for select customers. ## US-WEST-09B This is a General Access zone located in Washington, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [B200 (InfiniBand)](/platform/instances/gpu/b200-8x) [H100 (InfiniBand)](/platform/instances/gpu/gd-8xh100ib-i128) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.80.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.80.0/24`, `166.19.81.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.210.192.0/18` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-09.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-09.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-west-09.coreweave.com` | ICMP latency test address | ## US-WEST-10A This is a General Access zone located in Nevada, USA. It is available to all customers. Instances and AI Object Storage | GPU Instances | CPU Instances | AI Object Storage | | :- | :- | :- | | [B300 (InfiniBand)](/platform/instances/gpu/b300-8x) [RTX PRO 6000 Blackwell Server Edition (High Memory)](/platform/instances/gpu/rtxp6000-8x) | [General Purpose AMD Turin (High Memory)](/platform/instances/cpu/turin-gp) [General Purpose Intel Emerald Rapids (High Memory)](/platform/instances/cpu/cd-gp-i64-erapids) | Yes | | Network information | | | | Type | Address Range | Description | | :- | :- | :- | | **Public IP** | `166.19.132.0/22` | Public IP address range for this AZ | | **NAT Egress** | `166.19.132.0/24`, `166.19.133.0/24` | Subset of the Public Range used for Service egress | | **Node Range** | `10.57.128.0/17` | RFC 1918 private range used exclusively by this AZ | | **Pods** | `10.0.0.0/13` | RFC 1918 space dedicated to all Pods | | **Services** | `10.16.0.0/22` | Subset of Pod RFC 1918 space dedicated to Services | | **Load Balancers** | `10.16.4.0/22` | Subset of Services RFC 1918 space dedicated to Load Balancers | | [**Speedtest 1GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-10.coreweave.com/1G` | 1 GB test file for bandwidth testing | | [**Speedtest 10GB**](/platform/regions/about-regions-and-azs#speedtest) | `http://http.speedtest.us-west-10.coreweave.com/10G` | 10 GB test file for bandwidth testing | | [**ICMP Latency**](/platform/regions/about-regions-and-azs#speedtest) | `ping.speedtest.us-west-10.coreweave.com` | ICMP latency test address | # CoreWeave ARENA Terms of Service Source: https://docs.coreweave.com/policies/coreweave-arena-tos Terms of service governing customer access to and use of CoreWeave's ARENA evaluation program SUBMITTING AN APPLICATION TO ACCESS COREWEAVE ARENA DOES NOT GUARANTEE THAT CUSTOMER WILL BE GRANTED ACCESS, AND COREWEAVE MAY ACCEPT OR REJECT ANY APPLICATION IN ITS SOLE DISCRETION. IF COREWEAVE APPROVES CUSTOMER'S APPLICATION AND PROVIDES CUSTOMER WITH ACCESS TO THE COREWEAVE ARENA SERVICES, CUSTOMER'S ACCESS TO AND USE OF THE COREWEAVE ARENA SERVICES WILL BE GOVERNED BY THE TERMS OF THIS AGREEMENT. PLEASE READ THEM CAREFULLY. CUSTOMER AGREES TO THE TERMS OF THIS AGREEMENT AS OF THE DATE CUSTOMER (A) CLICKS TO ACCEPT OR AGREE WHERE SUCH OPTION IS MADE AVAILABLE TO CUSTOMER OR (B) ACTUALLY USES OR ACCESSES ANY OF THE COREWEAVE ARENA SERVICES. **For the avoidance of doubt, this Agreement will solely govern the CoreWeave ARENA Services, and notwithstanding any other terms to the contrary, the parties will not be bound by any other terms, conditions or other provision with respect to the CoreWeave ARENA Services, including without limitation the [CoreWeave Terms of Service](/policies/terms-of-service).** These CoreWeave ARENA Terms of Service constitute an agreement ("**Agreement**") by and between CoreWeave, Inc., a Delaware corporation ("**CoreWeave**"), and the corporation, LLC, partnership, sole proprietorship, other business entity, or individual ("**Customer**") agreeing to this Agreement. This Agreement governs Customer's limited trial or evaluation access to CoreWeave's infrastructure-as-a-service or platform-as-a-service, products, solutions, and other deliverables provided or made available directly or indirectly by CoreWeave (including through an Affiliate) to Customer under or in connection with CoreWeave's ARENA program (collectively, the "**CoreWeave ARENA Services"**). 1. **COREWEAVE ARENA SERVICES.** CoreWeave grants to Customer and Customer accepts from CoreWeave a limited, revocable, non-exclusive, non-transferable right to access and use the CoreWeave ARENA Services solely for Customer's internal evaluation purposes during the period specified in the applicable online sign-up, order form, or account configuration, or otherwise communicated by CoreWeave to Customer (the "**CoreWeave ARENA Term**"). Customer will ensure it has or maintains any system requirements for use of the CoreWeave ARENA Services. CoreWeave is not responsible for Customer's system requirements necessary to enable Customer to use the CoreWeave ARENA Services. CoreWeave reserves the right, in its sole and exclusive discretion, to update, suspend access to, remove the features, functionality, or other aspects of, or otherwise modify, the CoreWeave ARENA Services at any time. 2. **CUSTOMER RESPONSIBILITIES & RESTRICTIONS.** a. Restrictions. Customer shall not (directly or indirectly) and shall not permit, assist or allow any End User to (i) disassemble, reverse engineer, or otherwise attempt to derive any source code or underlying ideas or algorithms of any part of the CoreWeave ARENA Services, (ii) modify, translate, or otherwise create derivative works of any part of the CoreWeave ARENA Services; (iii) use the CoreWeave ARENA Services in a manner that compromises the security or integrity of the CoreWeave ARENA Services or the confidentiality of other users of the CoreWeave ARENA Service; (v) input, upload, transmit, or otherwise provide to or through the CoreWeave ARENA Services, any information or materials that are unlawful or injurious, or contain, transmit, or activate any malicious code; (vi) use the CoreWeave ARENA Service or related documentation in any manner or for any purpose that infringes, misappropriates, or otherwise violates any Intellectual Property Right or other right of any Person; or (vii) use the CoreWeave ARENA Services in any manner that violates any Applicable Laws. Customer shall not distribute, copy, reproduce, modify, sell, transfer, sublicense, disclose or otherwise provide access to the CoreWeave ARENA Services to any third party. Customer acknowledges and agrees that all CoreWeave ARENA Services provided under this Agreement are provided for the sole benefit and use of Customer and are not provided to or for the benefit of any government agency or employee. b. Account Usage. Customer is solely responsible for all activity occurring under its accounts, whether authorized or unauthorized, and for maintaining the confidentiality and security of its credentials. Customer shall not, and shall not permit any End User to use the CoreWeave ARENA Services in violation of CoreWeave's [Acceptable Use Policy](/policies/terms-of-service/acceptable-use-policy), Applicable Laws, or third-party rights. Customer acknowledges that active engagement with CoreWeave is a requirement for access to the CoreWeave ARENA Services and agrees to participate in periodic account check-ins to discuss usage, performance, and other topics pertinent to the CoreWeave ARENA Services. Customer shall employ all reasonable physical, administrative, and technical controls, screening and security procedures and other safeguards as necessary to securely administer the distribution and use of all account access credentials and protect against any unauthorized access to or use of the CoreWeave ARENA Services, as required by Applicable Laws and pursuant to industry standards. c. Customer Data. Customer is solely responsible for providing Customer Data to use the CoreWeave ARENA Services. Customer represents and warrants that Customer shall not use the CoreWeave ARENA Services in a production environment or for any other purpose. Subject to this Agreement, by providing Customer Data to or via the CoreWeave ARENA Services or CoreWeave Systems, Customer hereby grants CoreWeave a license during the CoreWeave ARENA Term to host, store, transfer, display, perform, reproduce, modify for the purpose of formatting for display, distribute, and otherwise use Customer Data for the purpose of providing the CoreWeave ARENA Services to Customer and as otherwise necessary or useful for CoreWeave in providing the CoreWeave ARENA Services. CoreWeave has no obligation to assess Customer Data in order to identify information subject to any specific legal requirements. To the extent Customer Data includes Personal Data (as defined in the [Data Processing Agreement](/policies/terms-of-service/data-processing-agreement)), the parties agree to abide by the terms of the Data Processing Agreement, which shall solely govern the parties' rights and obligations with respect to any such Personal Data. Customer is solely responsible for its Customer Data and agrees that CoreWeave is not and will not in any way be liable for Customer Data. By providing Customer Data, Customer affirms, represents and warrants that its Customer Data and use thereof will not violate this Agreement or any Applicable Laws, regulation, rule or third party rights. d. Trade Laws; Representations and Warranties. By accessing the CoreWeave ARENA Services, Customer agrees to comply with all applicable import, re-import, sanctions, anti-boycott, export, and re-export control laws and regulations, including the U.S. Export Administration Regulations, the International Traffic in Arms Regulations, economic sanctions programs implemented by the Office of Foreign Assets Control, and any other applicable trade and customs laws, sanctions, and regulations of the U.S., the European Union, the United Nations, and any other jurisdiction relevant to the performance of this Agreement (collectively, "**Trade Laws**"). Customer agrees to inform CoreWeave immediately if it becomes aware of any violation or potential violation of any Trade Laws related to this Agreement or the CoreWeave ARENA Services. Customer represents and warrants to CoreWeave that: (i) it has the full right and authority to enter into, execute, and perform its obligations under this Agreement; (ii) the execution and performance of this Agreement by Customer shall not result in the breach of, or constitute a default under, any contract or other instrument or obligation to which Customer is bound, (iii) it does and will continue to comply with Applicable Laws; (iv) the information Customer provides in registering for the CoreWeave ARENA Services, including with respect to any End User, is accurate, complete, and Customer has the right to use and disclose such information to CoreWeave; (v) Customer, its affiliates, directors, officers, and employees are not listed on any restricted party list, including but not limited to the U.S. Department of the Treasury's OFAC Specially Designated Nationals and Blocked Persons List, the U.S. Department of Commerce's Entity List, the U.S. Department of State's Debarred List, or any other relevant sanctions lists; (vi) Customer will not directly or indirectly export, re-export, transfer, or disclose any products, technology, or data provided under this Agreement to any destination, entity, or individual that is prohibited under any applicable Trade Laws, including those of the U.S. or any other jurisdiction; and (vii) upon request, Customer will provide the necessary documentation or certifications to ensure compliance with applicable Trade Laws. 3. **INTELLECTUAL PROPERTY RIGHTS**. CoreWeave owns and shall retain all right, title, and interest in and to the CoreWeave Systems and the CoreWeave ARENA Services (including all software used to provide the CoreWeave ARENA Services and all graphics, user interfaces, logos, and trademarks reproduced through the CoreWeave ARENA Services, but excluding any third-party marks), CoreWeave's Confidential Information, and the Feedback, including all Intellectual Property Rights contained therein. Except for the limited right to use the CoreWeave ARENA Services, as expressly provided herein, this Agreement does not grant to Customer or any other person any rights to, or in, any Intellectual Property Rights (whether registered or unregistered) or any other rights or licenses with respect to the CoreWeave ARENA Services, including any software. In the course of providing the CoreWeave ARENA Services, CoreWeave may monitor Customer's use of the CoreWeave ARENA Services and collect and compile statistical data and performance information, analytics, meta-data, or similar information, generated through instrumentation and logging systems, regarding the operation of the CoreWeave ARENA Services, including Customer's use of the CoreWeave ARENA Services ("**Aggregated Statistics**"). All rights, title, and interest in Aggregated Statistics, and all Intellectual Property Rights therein, belong to and are retained solely by CoreWeave. Nothing in this Agreement shall restrict CoreWeave's right to collect and use Aggregated Statistics for its performance obligations and to improve its delivery of CoreWeave ARENA Services. 4. **CONFIDENTIALITY**. "**Confidential Information**" shall include confidential or proprietary technical, business or financial information and materials disclosed or made available by CoreWeave, whether orally or in writing, that is designated or identified as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances surrounding the disclosure. Customer agrees to hold Confidential Information in confidence and protect such Confidential Information from disclosure to or access by any third party, other than as expressly set forth in this Agreement and to limit access to the Confidential Information to such of its directors, officers, employees and consultants (collectively, "**Representatives**"), if any, who have a need to access such information in accordance with the terms of this Agreement and who are bound by duties of confidentiality at least as restrictive as this Agreement. Customer agrees that all Confidential Information is proprietary to CoreWeave and shall remain the sole property of CoreWeave. Confidential Information shall not include any information that: (i) is or becomes generally known to the public without breach of any obligation owed to CoreWeave; (ii) was known to Customer prior to its disclosure by CoreWeave without restriction on use or disclosure; (iii) was independently developed by Customer without breach of any obligation owed to CoreWeave; or (iv) is rightfully received from a third party without restriction on use or disclosure. 5. **DISCLAIMER; LIMITATION OF LIABILITY**. Customer acknowledges and agrees that it is not entitled to any support or service level related credits for the CoreWeave ARENA Services. Any support that CoreWeave decides in its sole discretion to provide Customer to assist Customer's trial and evaluation of the CoreWeave ARENA Services shall be provided 'as is' and without any warranty, whether express or implied. THE COREWEAVE ARENA SERVICES ARE PROVIDED "AS IS" AND COREWEAVE MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE REGARDING THE COREWEAVE ARENA SERVICES, INCLUDING ANY WARRANTY THAT THE COREWEAVE ARENA SERVICES WILL BE UNINTERRUPTED, ERROR FREE OR FREE OF HARMFUL COMPONENTS, OR THAT ANY CONTENT, INCLUDING CUSTOMER DATA OR THIRD PARTY CONTENT, WILL BE SECURE OR NOT OTHERWISE LOST OR DAMAGED. TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAWS, COREWEAVE, ITS AFFILIATES, OFFICERS, EMPLOYEES, AGENTS, SUPPLIERS OR LICENSORS (COLLECTIVELY, "**COREWEAVE PARTIES**") SHALL NOT BE LIABLE TO CUSTOMER, CUSTOMER'S END USERS, OFFICERS, EMPLOYEES, AGENTS, SUPPLIERS, CLIENTS, OR ANY PARTY CLAIMING THROUGH CUSTOMER (COLLECTIVELY, "**CUSTOMER PARTIES**") FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, PUNITIVE, EXEMPLARY OR SPECIAL DAMAGES, ARISING OUT OR OF RELATED TO THE COREWEAVE ARENA SERVICES, INCLUDING, WITHOUT LIMITATION, LOST PROFITS, REVENUE, OR GOODWILL, INTERRUPTION OR LOSS OF USE OF THE COREWEAVE ARENA SERVICES EVEN IF COREWEAVE OR THE COREWEAVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ANY AGREED OR OTHER REMEDY OF ITS ESSENTIAL PURPOSE. THE TERMS ON ANY PURCHASE ORDER OR OTHER FORM SUBMITTED BY CUSTOMER SHALL NOT APPLY. 6. **INDEMNIFICATION.** Customer will indemnify, defend, and hold harmless CoreWeave, its subcontractors, its Affiliates and its and their respective officers, directors, employees, agents, contractors and assigns from and against all claims, demands, suits, proceedings, liabilities, losses, damages, costs and expenses (including, but not limited to, reasonable attorneys' fees), arising out of, related to, or in connection with Customer's breach of this Agreement, the Customer Data, or Customer's use of, or access to, the CoreWeave ARENA Services. CoreWeave reserves the right to assume sole control of the defense and settlement of any such indemnified claim. 7. **TERM AND TERMINATION.** CoreWeave may terminate this Agreement for cause or convenience at any time. Upon any termination or expiration of this Agreement, Customer shall immediately cease using, and promptly delete, destroy, or return all copies of the CoreWeave ARENA Services and certify the same in writing to CoreWeave. CoreWeave will enable Customer to delete, from the CoreWeave Systems, Customer Data during the CoreWeave ARENA Term in a manner consistent with the functionality of the CoreWeave ARENA Services. Customer is responsible for exporting, before the CoreWeave ARENA Term expires, any Customer Data it wishes to retain. 8. **DEFINITIONS**. The following capitalized terms will have the following meanings whenever used in this Agreement: a. "**Acceptable Use Policy**" means CoreWeave's acceptable use policy found at [https://docs.coreweave.com/policies/terms-of-service/acceptable-use-policy](/policies/terms-of-service/acceptable-use-policy), as updated from time to time. b. "**Affiliate**" means any entity that directly or indirectly controls, is controlled by, or is under common control with the subject entity. "**Control**," for purposes of this definition, means the power to direct or cause the direction of the management and policies of an entity, whether through ownership of voting securities, by contract or otherwise. c. "**Applicable Laws**" means any applicable law, regulation, directive, or other binding requirements (each as may be implemented, amended, extended, superseded or re-enacted from time to time). d. "**CoreWeave Systems**" means the equipment, hardware, software, infrastructure and other systems utilized by CoreWeave to provide the CoreWeave ARENA Services. e. "**Customer Data**" means information, documents, images, files or materials uploaded, created, modified, or stored in the CoreWeave ARENA Services, or otherwise provided to or made available or accessible to CoreWeave, by Customer or Customer's End User. f. **"Data Processing Agreement"** means CoreWeave's data processing agreement found at [https://docs.coreweave.com/policies/terms-of-service/data-processing-agreement](/policies/terms-of-service/data-processing-agreement), as updated from time to time. g. "**End User**" means any Person (including any employees, subcontractors or agents) who, directly or indirectly, accesses the CoreWeave ARENA Services, in any case whether authorized or not. h. "**Feedback**" means any suggestion, enhancement request, recommendation, correction or other feedback provided by Customer or its End Users. i. "**Intellectual Property Rights**" means any and all registered or unregistered intellectual property and other proprietary rights throughout the world, whether statutory common law or otherwise, including rights in all copyrights, patents, designs, trade secrets, trademarks, service marks, rights in domain names, rights with respect to databases and other compilations and collections of data or information, publicity and privacy rights, moral rights, rights with respect to personal information, including any applications for the foregoing. j. "**Person**" means an individual, corporation, partnership, joint venture, limited liability company, governmental entity, unincorporated organization, trust, association or other entity. k. "**Privacy Policy**" means CoreWeave's Privacy Policy found at [https://docs.coreweave.com/policies/terms-of-service/privacy-policy](/policies/terms-of-service/privacy-policy). 9. **GENERAL.** This Agreement shall be governed by and interpreted in accordance with the laws of the State of New York, without regard to its principles regarding conflicts of law. Each party hereby irrevocably submits to, and waives any objection to, the exclusive personal jurisdiction and venue of the courts located within the city and county of New York County, New York. CUSTOMER, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAWS, IRREVOCABLY AND UNCONDITIONALLY WAIVES ANY RIGHT CUSTOMER MAY HAVE TO A TRIAL BY JURY IN RESPECT OF ANY LITIGATION DIRECTLY OR INDIRECTLY ARISING OUT OF OR RELATING HERETO. This Agreement (which shall be deemed to include all documents, policies, agreements and addendums referenced or defined in this Agreement, which are incorporated herein by reference) is the entire agreement between the parties regarding Customer's use of the CoreWeave ARENA Services and supersedes all prior and contemporaneous agreements, proposals or representations, written or oral, concerning its subject matter, and contains the only terms that govern the CoreWeave ARENA Services. This Agreement shall govern in the event of any conflict with such documents, policies, agreements and addendums. Upon termination or expiration of this Agreement, each term that by its nature shall survive such termination or expiration will survive. CoreWeave may send notices pursuant to this Agreement to the email designated in Customer's account or otherwise provided to CoreWeave (which Customer shall keep updated), which shall be effective upon receipt. Any notices to be provided to CoreWeave or questions with respect to the terms of this Agreement shall be sent to [legalnotices@coreweave.com](mailto:legalnotices@coreweave.com), and such notices will be deemed received seventy-two (72) hours after they are sent. Customer may not assign any of its rights or obligations under this Agreement, whether by operation of law or otherwise, without CoreWeave's prior written consent. No waiver of any breach of any provision of the Agreement will constitute a waiver of any prior, concurrent, or subsequent breach of the same of any other provision hereof. Failure to exercise or enforce any right or provision of this Agreement shall not constitute a waiver of such right or provision. No waiver will be effective unless made in writing and signed by an authorized representative of the waiving party. The parties are independent contractors and shall so represent themselves in all regards. Neither party is the agent of the other, and neither may make commitments on the other's behalf. In the event any one or more of the provisions of this Agreement shall for any reason be held to be invalid, illegal or unenforceable, the same shall not affect the validity or enforceability of any other provisions of the Agreement. CoreWeave may amend this Agreement from time to time without notice to Customer, provided that CoreWeave may at its sole option post an amended version on its website or send Customer written notice thereof. Customer's continued use of the CoreWeave ARENA Services following the effective date of an amended Agreement will confirm Customer's consent thereto. # CoreWeave Customer Asset Penetration Testing Policy Source: https://docs.coreweave.com/policies/coreweave-customer-asset-penetration-testing-policy Guidelines for customers conducting penetration testing on their own CoreWeave-hosted infrastructure At CoreWeave, the security and integrity of our cloud infrastructure and services are critical to our customers and we take that responsibility seriously. We recognize that our customers may wish to conduct penetration testing on their own cloud environment and systems or services hosted on the CoreWeave platform. To facilitate these activities CoreWeave's Platform Security team has established this Penetration Testing Policy to outline the guidelines for conducting such tests safely and in adherence with [CoreWeave's ​terms of service](/policies/terms-of-service). ### Conducting a Penetration Test on CoreWeave infrastructure CoreWeave customers **may perform penetration testing on their own cloud infrastructure without prior authorization from CoreWeave**, as long as the testing is within the scope of their own cloud environment and such testing does not impact CoreWeave systems or services. **Customers may not conduct stress-testing or any disruptive testing** that could potentially affect the confidentiality, integrity, or availability of CoreWeave systems, or other CoreWeave clients' infrastructure or data, **without obtaining written permission from CoreWeave Platform Security.** Customers who wish to perform potentially intrusive or disruptive testing must request permission to do so by emailing [security@coreweave.com](mailto:security@coreweave.com) at least 14 calendar days before testing is scheduled to commence, and the permission must be granted before any testing can begin. We strongly encourage our customers to use industry-recognized methodologies, such as the Penetration Testing Execution Standard (PTES), to conduct application and system-level penetration testing. Vendors who adhere to these standards are preferred. If requested by the customer, CoreWeave may provide a list of pre-approved vendors who meet our standards. CoreWeave customers must abide by our Acceptable Use Policy and other Terms of Service during penetration testing. Any violation of these policies may result in the immediate suspension of testing and/or termination of services. ### Responsible Disclosure In the event that a vulnerability is discovered during the course of testing, we encourage our customers to responsibly disclose such vulnerabilities to CoreWeave's security team. We request that the results of any vulnerability reports, responsible disclosure discussions, or other interactions related to vulnerability discovery be kept private unless both parties agree in writing to a mutual public disclosure. ​[CoreWeave's responsible disclosure policy](/policies/terms-of-service) must be followed at all times during the vulnerability disclosure process. CoreWeave reserves the right to suspend or terminate access to our services for any customer who violates this policy or engages in any behavior that could potentially harm our platform, systems, or clients. We appreciate our customers' cooperation in maintaining the security and integrity of our platform and services. If you have any questions or concerns regarding this policy, please contact us at [security@coreweave.com](mailto:security@coreweave.com). # CoreWeave UK Modern Slavery and Human Trafficking Statement Source: https://docs.coreweave.com/policies/coreweave-modern-slavery-statement ## 1. Introduction CoreWeave UK Limited ("CoreWeave" or the "Company") is committed to ensuring that modern slavery, human trafficking and the use of child labour do not take place within our business operations or supply chains. This statement is made pursuant to section 54(1) of the Modern Slavery Act 2015 and constitutes our slavery and human trafficking statement for the financial year ending 31 December 2025. ## 2. Organisational Structure and Supply Chains CoreWeave is a company incorporated in England and Wales. We are a subsidiary of CoreWeave, Inc., a leading cloud service provider specialising in purpose-built cloud infrastructure services to support AI workloads. Our operations primarily involve the provision of cloud computing services to customers across the United Kingdom and Europe. Our supply chains include vendors and partners in hardware manufacturing and procurement, software development and data centre operations. ## 3. Our Policies We are committed to acting ethically and with integrity in all our business dealings and relationships. The following policies reflect our commitment to preventing slavery and human trafficking, including: * Forced Labor and Child Labour policy establishes our zero-tolerance approach to modern slavery, child labor and human trafficking. This policy is approved by the General Counsel on behalf of CoreWeave and applies to all employees, officers, consultants and contractors. Adherence to this policy is a shared responsibility across all business functions and levels within the organisation. * Membership with the Responsible Business Alliance (RBA), an industry coalition focused on advancing responsible business conduct in supply chains. We utilise our RBA membership to support risk identification, supplier engagement, and continuous improvement in labour standards across its supply chain, where relevant to its operations. * We require our suppliers to adhere to our Supplier [Code of Conduct](https://cdn.prod.website-files.com/62ba1fb86485b6d5029975c4/69371755a36799d85e299655_CoreWeave_Supplier_Code_of_Conduct.pdf), which sets out minimum standards relating to labour rights, ethical conduct, health and safety, and environmental responsibility. The Supplier Code of Conduct includes requirements aligned with internationally recognised labour standards, including the prohibition of forced labour, human trafficking, and child labour. * Our Code of Business Conduct and Ethics and Whistleblowing Policies encourage employees and stakeholders to report concerns related to unethical practices, including suspected modern slavery, without fear of retaliation. ## 4. Due Diligence Processes We are implementing due diligence processes to identify, assess, and mitigate risks of modern slavery and human trafficking in our operations and supply chains, in accordance with section 54(5)(c) of the Modern Slavery Act 2015: * Supplier Risk Assessments: We conduct risk assessments of suppliers based on geographic and industry-specific risks using RBA's Risk Assessment Platform to identify suppliers operating in higher-risk jurisdictions or sectors. * Contractual Obligations: We include compliance clauses in supplier contracts mandating adherence to ethical labour practices. Supplier Auditing and Monitoring: We audit and monitor, as appropriate, higher-risk suppliers to verify compliance with our standards. ## 5. Effectiveness We maintain the effectiveness of our modern slavery policies to ensure relevance and effectiveness. ## 6. Continuous Improvement CoreWeave is committed to continuous improvement in our efforts to combat modern slavery. To ensure an understanding of the risks of forced labour and human trafficking we offer training for all employees on modern slavery awareness and ethical business practices. ## 7. Approval and Publication This statement has been approved by the Board of CoreWeave UK Limited and is signed by a director of the Company, in accordance with section 54(6) of the Modern Slavery Act 2015. Date: 5/6/2026 Signed, ![Signature](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/policies/_media/coreweave-modern-slavery-statement-signature.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=af92b76251a1d72f9607ee81c8e3e382) Ben Richardson\ Director\ CoreWeave UK Limited # CoreWeave Vulnerability Disclosure Policy Source: https://docs.coreweave.com/policies/coreweave-vulnerability-disclosure-policy How to disclose discovered vulnerabilities to CoreWeave ## Purpose To allow for the reporting and disclosure of vulnerabilities discovered by external entities, and anonymous reporting of information security policy violations by internal entities. ## Scope CoreWeave's Responsible Disclosure Policy applies to CoreWeave's core platform and its information security infrastructure, and to internal and external employees or third parties. ## Introduction CoreWeave, Inc. (CoreWeave) welcomes feedback from security researchers and the general public to help improve our security. If you believe you have discovered a vulnerability, privacy issue, exposed data, or other security issues in any of our assets, we want to hear from you. This policy outlines steps for reporting vulnerabilities to us, what we expect, what you can expect from us. ## Applicability This policy applies to any digital assets owned, operated, or maintained by CoreWeave, Inc. (CoreWeave). ## Out of scope Assets or other equipment not owned by parties participating in this policy. Vulnerabilities discovered or suspected in out-of-scope systems should be reported to the appropriate vendor or applicable authority. Vulnerabilities which do not meet CoreWeave's reporting standards or where no clearly articulable risk is present (i.e. Click-jacking with no security impact). ### What you can expect from CoreWeave When working with us, according to this policy, you can expect us to: * Respond to your report promptly, and work with you to understand and validate your report * Strive to keep you informed about the progress of a vulnerability as it is processed * Work to remediate discovered and validated vulnerabilities in a timely manner, within our operational constraints * Extend [Safe Harbor](#safe-harbor) for your vulnerability research that is related to this policy * Credit after the vulnerability has been validated and fixed. ### What we would like to see from you In participating in our vulnerability disclosure program in good faith, we ask that you: * Play by the rules, including following this policy and any other relevant agreements. If there is any inconsistency between this policy and any other applicable terms, the terms of this policy will prevail. * Report any vulnerability you've discovered promptly. * Take all precautions to avoid violating the privacy of others, disrupting our systems, destroying data, and/or harming user experience; should any of these occur, report the incident to CoreWeave immediately. * Use only the Official Channels to discuss vulnerability information with us. * Provide us a reasonable amount of time (at least 90 days from the initial report) to resolve the issue before you disclose it publicly. * Perform testing only on in-scope systems, and respect systems and activities which are out-of scope. * If a vulnerability provides unintended access to data: * Limit the amount of data you access to the minimum required for effectively demonstrating a Proof of Concept; * cease testing and submit a report immediately if you encounter any user data during testing, such as Personally Identifiable Information (PII), Personal Healthcare Information (PHI), credit card data, or proprietary information. * You should only interact with test accounts you own or with explicit permission from the account holder. * Do not engage in extortion. If, during the course of participating in our program, you do not or are unable to perform the aforementioned precautions, you must report this to us immediately. ## Official Channels ### How to submit a vulnerability To submit a vulnerability report to CoreWeave's Product Security Team, please utilize the following email: [security@coreweave.com](mailto:security@coreweave.com), and provide all relevant information. The more details you provide, the easier it will be for us to triage and fix the issue. ## Vulnerability report and disclosure ### Preference, prioritization, and acceptance criteria We will use the criteria from the next sections to prioritize and triage submissions. ### What we would like to see from you * Well-written reports in English will have a higher probability of resolution. * Reports that include proof-of-concept code equip us to better triage. * Reports that include only crash dumps or other automated tool output may receive lower priority. * Reports that include products not on the initial scope list may receive lower priority. * Please include how you found the bug, the impact, and any potential remediation. * Please include any plans or intentions for public disclosure. ## Safe Harbor When conducting vulnerability research, according to this policy, we consider this research conducted under this policy to be: * Authorized concerning any applicable anti-hacking laws, and we will not initiate or support legal action against you for accidental, good-faith violations of this policy; * Authorized concerning any relevant anti-circumvention laws, and we will not bring a claim against you for circumvention of technology controls; * Exempt from restrictions in our Terms of Service (TOS) and/or Acceptable Usage Policy (AUP) that would interfere with conducting security research, and we waive those restrictions on a limited basis * Lawful, helpful to the overall security of the Internet, and conducted in good faith. You are expected, as always, to comply with all applicable laws. If legal action is initiated by a third party against you and you have complied with this policy, we will take steps to make it known that your actions were conducted in compliance with this policy. If at any time you have concerns, or are uncertain whether your security research is consistent with this policy, please submit a report through one of our [Official Channels](#official-channels) before going any further. > [!WARNING] > > [Safe Harbor](#safe-harbor) applies only to legal claims under the control of the organization participating in this policy, and that the policy does not bind independent third parties. # EU Data Act Addendum Source: https://docs.coreweave.com/policies/eu-data-act-addendum Addendum for EEA customers covering CoreWeave's compliance with the EU Data Act requirements ## Scope and application 1. This addendum applies to Order Forms entered into between CoreWeave and a customer within the European Economic Area on or after 12 September 2025 (**Data Act Addendum**). 2. This Data Act Addendum shall be interpreted as follows: a. Any capitalized terms used but not defined herein shall have the meaning given to them in the Agreement; b. This Data Act Addendum sets out how CoreWeave complies with the EU Data Act (*Regulation (EU) 2023/2854*) (**The Act**). CoreWeave reserves the right to amend this Data Act Addendum from time to time to comply with Applicable Law; c. This Data Act Addendum shall control in the event of any inconsistency between the provisions set out herein and the terms and conditions of the Agreement; d. Unless specifically referenced in this Data Act Addendum, the terms and conditions of the Agreement remain unaffected and in full force and effect. ## Termination in accordance with Article 25 of the EU Data Act 3. Where this Data Act Addendum applies, Customer may exercise its right to terminate the Services pursuant to Article 25 of The Act at any time during the Order Term by providing CoreWeave two (2) months' written notice to [legalnotices@coreweave.com](mailto:legalnotices@coreweave.com) (**Early Termination**). 4. Early Termination shall not relieve Customer of its obligation to pay all fees payable pursuant to any and all Order Forms active at the date Customer provides notice of Early Termination. 5. Customer acknowledges that the pricing offered to Customer at the Effective Date included discounts which were offered to Customer based on Customer using the Services for the Order Term, such that, notwithstanding Customer's rights under the EU Data Act, Customer's obligation to pay the Total Purchase Price, including but not limited to any pre-paid amounts, is reasonable, proportionate, and non-cancellable. 6. Prior to the date of Early Termination, Customer shall ensure that it exports or deletes all Customer Data it has uploaded to or otherwise hosts or processes using the Services, as set out in the Agreement. ## Exclusions 7. This Data Act Addendum does not apply to: (i) any trial or beta services provided by CoreWeave, (ii) any instance of CoreWeave's services which have been made available to a customer for trial and evaluation purposes, or (iii) any services provided by CoreWeave which have been customized by CoreWeave for Customer. *Last updated: 11 December 2025* # Information Security Advisories Source: https://docs.coreweave.com/policies/information-security-advisories Information on relevant CVEs and security issues for clients ## July 2024 ### [CVE-2024-6387](https://www.cve.org/CVERecord?id=CVE-2024-6387) - [Qualys Security Advisory](https://www.qualys.com/2024/07/01/cve-2024-6387/regresshion.txt) - Update Advisory | Item | Description | | - | - | | **Description** | OpenSSH Remote Code Execution due to Race Condition in Signal Handling (CVE-2024-6387) | | **Severity** | 8.1 | | **Impact to CoreWeave Platform** | The CoreWeave platform and supporting infrastructure have been upgraded to prevent exploitation of this issue. | | **Potentially Affected Clients** | Clients running vulnerable versions of OpenSSH server are vulnerable to this CVE. Clients running an OpenSSH server version equal to or greater than "8.5p1" and less than "9.8p1" are vulnerable to this issue and should take steps to remediate. In particular, clients using VirtualServers and Slurm may need to take action to upgrade their SSH servers to a patched version or use workarounds which prevent exploitation. | | **Actions Taken** | **Patching and Updates:** Updates have been deployed inside of the CoreWeave platform and its supporting infrastructure. **System Status:** As of July 2nd, 2024 CoreWeave systems are operational and no outages to support upgrade operations are planned. **Recommended Client Actions:** Clients which run a VirtualServer, container, or Slurm login Pod that uses a version of OpenSSH server should upgrade their VirtualServer, container image, or Slurm login/compute Pod images in order to obtain a patched version. Alternatively, clients may apply workarounds to their SSH server configuration to limit or prevent exploitability. Clients running an OpenSSH server version equal to or greater than "8.5p1" and less than "9.8p1" are vulnerable to this issue and should take steps to remediate. | ### Additional information * For clients running an **Ubuntu Linux distribution**, see [the Ubuntu Security Notice for this issue.](https://ubuntu.com/security/notices/USN-6859-1) * For clients running a **Rocky Linux distribution**, see [the Rocky Linux news page discussing this issue.](https://rockylinux.org/news/2024-07-01-openssh-sigalrm-regression) * For clients running a **CentOS Linux distribution**, see [the CentOS documentation for this issue.](https://access.redhat.com/security/cve/cve-2024-6387) * **Windows** is not known to be affected by this issue at time of publishing. Further technical details about this issue may be found in [the Qualys writeup of this issue.](https://www.qualys.com/2024/07/01/cve-2024-6387/regresshion.txt) #### SUNK/Slurm User Guidance Clients who are **not** on a CoreWeave-managed instance of SUNK and who meet the criteria below should take action to ensure that SUNK is patched against `CVE-2024-6387`: * Are using SUNK versions `3.20.0` through `4.3.0` * Are using Ubuntu images in SUNK of `22.04` or higher If the criteria above are met, clients should take the following actions: * Add the following items to the `s6` configuration for both login and compute Nodes in the chart `values.yaml` being used to deploy CoreWeave's Slurm chart: ```yaml theme={"system"} login: s6: ssh-patch: type: oneshot script: | #!/usr/bin/env bash groupadd messagebus apt update && apt install --only-upgrade openssh-server -y compute: s6: ssh-patch: type: oneshot script: | #!/usr/bin/env bash groupadd messagebus apt update && apt install --only-upgrade openssh-server -y ``` * Deploy these changes (if using ArgoCD, sync the changes with the cluster). > [!WARNING] > > This will roll the NodeSet Pods for the compute Nodes. If login StatefulSets are set to use the `OnDelete` update strategy, then the login Pods to all that will be upgraded with these changes will need to be manually deleted. See [the official Kubernetes documentation on StatefulSet update strategies](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies) for more information. > [!NOTE] > > If using custom build images for SUNK, these commands can be integrated into the image build instead. ## November 2023 ### [CVE-2023-23583](https://www.cve.org/CVERecord?id=CVE-2023-23583) - [INTEL-SA-00950](https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/redundant-prefix-issue.html) Update Advisory | Item | Description | | - | - | | **Description** | In response to Intel's Platform Update advisory [INTEL-SA-00950](https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/redundant-prefix-issue.html) ([CVE-2023-23583](https://www.cve.org/CVERecord?id=CVE-2023-23583)), CoreWeave Engineering has proactively updated our systems to address the identified vulnerabilities within the named Intel products. | | **Severity** | 8.8 | | **Impact to CoreWeave Platform** | No impact has been observed as of this posting. CoreWeave systems have been upgraded and operational prior to public disclosure. | | **Potentially Affected Clients** | No client impact as remediation has occurred prior to public disclosure. (**Note:** Intel components are used within our services, however, our proactive updates have ensured no client impact.) | | **Actions Taken** | **Patching and Updates:** Updates have been implemented for [INTEL-SA-00950](https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/redundant-prefix-issue.html) ([CVE-2023-23583](https://www.cve.org/CVERecord?id=CVE-2023-23583)), ensuring compatibility and system integrity. **System Status:** As of November 14th, 2023, CoreWeave in-scope systems have been upgraded and are operational. **Recommended Client Actions:** No action is required. This advisory is informational only, to assure you of CoreWeave's commitment to infrastructure security. | CoreWeave's Vulnerability Management Team is closely monitoring the situation and is dedicated to providing timely updates if deemed necessary. If required, updates to this page will be posted. ## December 2022 ### [CVE-2022-42475](https://www.cve.org/CVERecord?id=CVE-2022-42475) | Item | Description | | - | - | | **Description** | A heap-based buffer overflow vulnerability \[[CWE-122](https://cwe.mitre.org/data/definitions/122.html)] in FortiOS SSL-VPN may allow a remote unauthenticated attacker to execute arbitrary code or commands via specifically crafted requests. | | **Severity** | 9.3 | | **Impact to CoreWeave Platform** | Currently no known impact to CoreWeave Platform | | **Potentially Affected Clients** | Clients using FortiOS | | **Recommended Actions** | [Vendor-recommended mitigations](https://www.fortiguard.com/psirt/FG-IR-22-398) | [FortiGuard Labs](https://www.fortiguard.com/psirt/FG-IR-22-398) has confirmed at least one instance of vulnerability [**CVE-2022-42475**](https://www.cve.org/CVERecord?id=CVE-2022-42475) being exploited in the wild. Given the high value (CVE critical severity rating **9.3**) and relatively low complexity of this vulnerability, CoreWeave strongly recommends upgrading to an unaffected version of FortiOS on an accelerated patch schedule, according to [vendor recommendations](https://www.fortiguard.com/psirt/FG-IR-22-398). Vulnerability checks for **CVE-2022-42475** are available from a variety of sources. Please use caution when running any script or application to ensure it is safe. **At this time there is no impact to CoreWeave's platform**, however customers who have FortiOS running within their environment are advised to review the [vendor-recommended mitigations](https://www.fortiguard.com/psirt/FG-IR-22-398), and take appropriate self measures to upgrade their deployments and evaluate their systems for any indicators of compromise. Our cyber security team is closely monitoring the situation, and will provide important updates should more information become available. # Limits Source: https://docs.coreweave.com/policies/limits Physical limits and customer quotas for CoreWeave Kubernetes Service CoreWeave Kubernetes Service (CKS) manages physical limits and customer quotas to ensure the stability and performance of the platform. CoreWeave limits the number of clusters, instances, and storage you can provision. To learn about your account's limits and request an upgrade, [please submit a support ticket](/support). ## Physical limits CoreWeave Kubernetes Service (CKS) has certain physical limits that are enforced to ensure the stability and performance of the platform. These limits are based on the underlying infrastructure, and are subject to change based on the availability of resources. ## Customer quotas CoreWeave Kubernetes Service (CKS) enforces customer quotas to ensure fair usage of resources and to prevent abuse. These quotas are set based on the customer's subscription plan and can be adjusted upon request. # Spot Services Terms Source: https://docs.coreweave.com/policies/spot-tos Terms of service specific to CoreWeave's Spot Services, covering on-demand usage, preemption, and pricing PLEASE READ THESE SPOT TERMS OF SERVICE CAREFULLY. CUSTOMER AGREES TO THE TERMS OF THIS AGREEMENT ON THE EARLIER OF (A) THE DATE CUSTOMER CLICKS TO ACCEPT OR AGREE WHERE SUCH OPTION IS MADE AVAILABLE TO CUSTOMER, (B) THE DATE CUSTOMER ACTUALLY USES OR ACCESSES ANY COMPUTE PROVIDED BY COREWEAVE THROUGH ITS SPOT SERVICES ("**SPOT SERVICES**"), OR (C) WITH RESPECT TO AN ORDER FORM, THE EFFECTIVE DATE OF THE APPLICABLE ORDER FORM ("**EFFECTIVE DATE**"). These Spot Services Terms constitute an agreement ("**Spot Services Terms**") by and between CoreWeave, Inc., a Delaware corporation ("**CoreWeave**"), and the corporation, LLC, partnership, sole proprietorship, other business entity, or individual ("**Customer**") agreeing to these Spot Services Terms. CoreWeave and Customer may be referred to individually as a "**Party**" and together as the "**Parties**." This Spot TOS is effective as of the Effective Date. Customer's use of and CoreWeave's provision of the Spot Services are governed by these Spot Services Terms. These Spot Services Terms are deemed incorporated into each applicable Order Form. This "**Agreement**" refers collectively to the applicable Order Form, if any, and the Spot Services Terms incorporated therein. The Parties agree as follows: 1. The [CoreWeave Terms of Service](/policies/terms-of-service) ("**CoreWeave TOS**") shall apply to Customer's use of Spot Services, and are incorporated herein by this reference. The Spot Services shall be considered "CoreWeave Services" defined under the CoreWeave TOS. Where the terms of the CoreWeave TOS conflict with those of this Agreement, the terms of this Agreement shall control. Capitalized terms used herein and not otherwise defined shall have the respective meanings set forth in the CoreWeave TOS. 2. Customer may use the Spot Services available to Customer on an on-demand basis, provided that CoreWeave may remove Customer's access to instances in any node pools under the Spot Services in accordance with the [Documentation](/platform/capacity-plans/spot-node-pools) ("**Preemption Process**"). 3. Customer acknowledges that the Preemption Process and the fees for Spot Services are subject to change at any time, in CoreWeave's sole discretion, and shall be as set forth on CoreWeave's website and the [Documentation](/index). For the avoidance of doubt, the SLO defined in the CoreWeave TOS does not apply to the Spot Services. 4. This Agreement constitutes the entire agreement, and supersedes all proposals, oral or written, all negotiations, conversations, or discussions between or among parties relating to the subject matter of this Agreement and all past dealing or industry custom. # Terms of Service Source: https://docs.coreweave.com/policies/terms-of-service CoreWeave's binding Terms of Service, including service level objectives and financial credit structures **For the avoidance of doubt**, by using or accessing the following services, you agree to the linked terms: * **Spot Services** - [Spot Services Terms](https://docs.coreweave.com/policies/spot-tos) * **CoreWeave ARENA** - [CoreWeave ARENA Terms of Service](https://docs.coreweave.com/policies/coreweave-arena-tos). Any limited trial, evaluation, or proof-of-concept access to CoreWeave services is deemed provided in connection with the ARENA program and constitutes CoreWeave ARENA Services. * **CoreWeave AI Object Storage** - this [Service Level Agreement](https://docs.coreweave.com/policies/terms-of-service/coreweave-ai-object-storage-policy) solely governs service levels for such service, and not the SLO in the below Terms of Service. * **CoreWeave Sandbox** - [CoreWeave Sandbox Terms](/policies/terms-of-service/sandbox-terms) **Last modified**: June 30, 2022 This page contains CoreWeave's key Terms of Service and is a binding contract between CoreWeave and the Customer as of the creation of the Customer's account on the CoreWeave Cloud Platform as a Covered Service, which also includes all of CoreWeave's websites, services, products and solutions (the "CoreWeave Services"). The TOS is a binding legal contract; the Customer's acceptance of it is required to use CoreWeave Services. As such, the Customer may only use CoreWeave Services if the Customer agrees that it has read, understood, and consented to be bound by the TOS. By creating an Account and using CoreWeave Services, the Customer is representing to CoreWeave that: * The creation of an Account and use of CoreWeave Services is in compliance with all laws, rules and regulations applicable to the Customer. * In the case where the Customer is a natural person, they are (a) 18 years of age or older; and (b) have sufficient legal consent, permission and capacity to use CoreWeave Services in applicable jurisdiction(s) as determined by the Customer. * In the case where a natural person is creating an Account and using CoreWeave Services on behalf of a company, organization, or other entity, in those cases, they have the authority to bind that company, organization or other entity to this TOS and they agree to be legally bound by this TOS on behalf of such entity. There are other contractual documents that apply to the Customer's use of the CoreWeave Cloud Platform as a Covered Service, and the terms contained in those documents are incorporated in these TOS. The Customer should review these other documents, which can be found by clicking at the links below: * [Data Processing Agreement (DPA)](/policies/terms-of-service/data-processing-agreement), which contains the applicable terms for CoreWeave processing certain types of data on the Customer's behalf. The Customer is responsible to determine and must alert CoreWeave immediately if the Customer is subject to any Data Protection Laws that require the Customer and CoreWeave to effectuate a DPA. * [Acceptable Use Policy](/policies/terms-of-service/acceptable-use-policy) (AUP), which sets out prohibited uses of the CoreWeave Cloud Platform as a Covered Service, and which is effective at the time the Customer creates an Account. * [Privacy Policy](/policies/terms-of-service/privacy-policy), which outlines how CoreWeave may collect, use and/or share Customer Data in connection with performing services. ### Service Level Objectives CoreWeave provides the CoreWeave Cloud Platform as a Covered Service to the Customer at the following service level objectives (the "Service Level Objective" or "SLO") | Covered Service | Monthly Uptime Percentage | | - | - | | Instances in Multiple Regions | >= 99.9% | | Instances in a Single Region | >= 99% | If CoreWeave does not meet the SLO, and if Customer is otherwise in good standing and meeting its obligations, Customer will be eligible to receive the Financial Credits described below. This TOS states Customer's sole and exclusive remedy for any failure by CoreWeave to meet the SLO. If CoreWeave authorizes the resale or supply of the CoreWeave Cloud Platform as a Covered Service under a CoreWeave Cloud partner or reseller program, then all references to Customer in this TOS shall mean Partner or Reseller (as applicable), and any Financial Credit(s) will only apply for impacted Partner or Reseller order(s). Pursuant to the notice of deprecation posted on [status.coreweave.com](https://status.coreweave.com/) and communicated via email on June 30, 2022, there are no Financial Credits available as of August 1, 2022 for SLO failures in our EWR1 data center. ### Definitions The following definitions apply to the TOS: * **"Customer Data"** means: * All data uploaded by the Customer to CoreWeave infrastructure and; * All data created by the Customer on CoreWeave infrastructure. * **"Covered Service"** means: * Instances in Multiple Regions. * A Single Instance. * **"Downtime"** means: * For container instances: loss of external connectivity or persistent disk access for the Single Instance or, with respect to Instances in Multiple Regions, all applicable running instances. * Downtime does not include loss of external connectivity as a result of outages in upstream transit provider networks if the Customer is acquiring connectivity on a pass-through basis from CoreWeave. If so, the respective Carrier terms of service will apply. * **"Downtime Period"** means a period of one or more consecutive minutes of Downtime. Partial minutes or intermittent Downtime for a period of less than one minute will not be counted towards any Downtime Periods. * **"Financial Credit"** means the following for Instances in Multiple Regions: | Monthly Uptime Percentage | Percentage of monthly bill for the respective Covered Service in the Region affected which did not meet SLO that will be credited to future monthly bills of Customer | | - | - | | 99% - 99.9% | 10% | | 95% - 98.999% | 25% | | \< 94.999% | 50% | * **"Financial Credit"** means the following for a Single Region: | Monthly Uptime Percentage | Percentage of monthly bill for a Single Instance in the Region affected which did not meet SLO that will be credited to future monthly bills of Customer | | - | - | | 95% - 99% | 10% | | 90% - 94.999% | 25% | | \< 89.999% | 50% | * **"Instances in Multiple Regions"** means container instances hosted as part of the Cloud Service where instances are placed across two or more Regions. * **"Monthly Uptime Percentage"** means total number of minutes in a month, minus the number of minutes of Downtime suffered from all Downtime Periods in a month, divided by the total number of minutes in a month. * **"Region"** means the applicable region described in the CoreWeave Cloud Platform Service documentation provided to Customer, denoted by physical location, such as NJ1, NY1 as may be updated by CoreWeave from time to time. * **"Single Instance"** means a single container instance hosted as part of the CoreWeave Cloud Platform Service. * **"Gigabyte"**, abbreviated **"GB"**, means a binary gigabyte, which is 2³⁰ bytes. This unit of measurement is also known as a gibibyte (GiB), defined by the International Electrotechnical Commission (IEC). Similarly, 1 TB is 2⁴⁰ bytes, i.e. 1024 GBs. ### Default Payment Terms and Billing All on-demand compute usage fees are subject to change. For both prepaid rendering services and all other batch compute services performed on the CoreWeave Cloud Platform as a Covered Service, CoreWeave uses third-party payment processors (the "Payment Processors") to credit or bill Customer through the payment account(s) linked to the Customer's account ("Billing Information"). The processing of credits or payments may be subject to the terms, conditions and policies of the Payment Processors in addition to this TOS. CoreWeave is not responsible for the acts or omissions of the Payment Processors. Customer agrees to purchase credits or pay all sums for services Customer uses at applicable prices in accordance with these pricing and billing policies and Customer authorizes CoreWeave and Payment Processors to deduct or charge all such sums (including all applicable taxes) based on the payment method(s) specified in or linked to the Customer's account ("Payment Methods"). The Customer must provide current, valid, complete and accurate Billing Information for all Payment Methods linked to the Customer's account, and must promptly update all such information in the event of changes (such as a change in billing address, credit card number, credit card expiration date or bank transfer and autopay information). Customer must promptly notify CoreWeave or the Payment Processors if a payment method is canceled (e.g., for loss or theft) or otherwise inoperable. CoreWeave services other than prepaid rendering services will be billed monthly in arrears based on the Customer's prior month's usage, and unless agreed to otherwise with CoreWeave, all cloud services fees are due and payable upon receipt of invoice, which will be billed at the then current on-demand usage rates. All invoices under \$20,000 will be automatically charged to the Customer's credit card using the Payment Methods. All invoices for \$20,000 or more must be paid by bank transfer (ACH or Wire) using the Payment Methods linked to a Customer's account, payable on Net 15 days. CoreWeave reserves the right to deactivate, terminate, prevent access to, disable services for, and/or suspend or delete a Customer's account or access to any CoreWeave Services at any time for nonpayment, late payment (if applicable), or failure to maintain at all times current, valid, complete and accurate Payment Methods. Fees for either Reserved Compute Instances or Bulk Credits are due and payable in accordance with the Order Forms therefore. All fees for CoreWeave Services that are unpaid or past due for any reason are subject to a finance charge of 1.5% of the unpaid balance per month (or the highest rate permitted by law, whichever is lower) from the date such payment was due until the date paid. Customer will be responsible for all reasonable expenses (including attorneys' fees) incurred by CoreWeave in collecting past due amounts. If any amount of your Fees are past due, we may suspend your API access after we provide you written notice of late payment. Any amounts due under this Agreement shall not be withheld or offset by you against amounts due to you for any reason. Customer is responsible for any duties, customs fees, taxes, and related penalties, fines, audits, interest and back-payments relating to Customer's purchase of any CoreWeave services, including but not limited to national, state or local sales taxes, use taxes, value-added taxes (VAT) and goods and services taxes (GST) (collectively, "Taxes"). Unless otherwise stated, CoreWeave's pricing policies do not include and are not discounted or enhanced for any such Taxes. If CoreWeave becomes obligated to collect or pay Taxes in connection with the purchase of services, those Taxes will be invoiced as part of a billing process or collected at the time of purchase. In certain states, countries and territories, the purchase of CoreWeave services may be subject to certain Taxes, and if so, CoreWeave may collect such Taxes and remit them to the appropriate taxing authority. Customer must also provide any tax identification information that is necessary for compliance with these tax obligations. Customer is solely responsible for any misrepresentations made or non-compliance caused with respect to Taxes. With respect to prepaid rendering credits, all credits are revocable or subject to early expiration for violations, including for abuse, misrepresentation of Billing Information, unauthorized transfer, or illegal conduct by the Customer. With respect to either Reserved Compute Instances or Bulk Credits purchased by the Customer pursuant to an Order Form, if, at any time during the Term of the Order Form, Customer's use thereof materially violates the TOS, CoreWeave may cancel the Order Form upon written notice to the Customer, such cancellation to be effective as of the last day of the month in which Customer's violation occurred (the "Cancellation Date"), and CoreWeave may suspend Client's use of the Reserved Compute Instances or Bulk Credits, as the case may be, immediately upon Client's violation or CoreWeave's discovery thereof. In the event that CoreWeave cancels an Order Form pursuant to the paragraph above, then Customer will be entitled to a refund equal to the prorated balance of the Purchase Price from the Cancellation Date through the end of the Term of the Order Form; provided, however, that Client's committed utilization of Reserved Compute Instances or use of Bulk Credits, as the case may be, from the Effective Date through the Cancellation Date will be charged at CoreWeave's on-demand rates then in effect and will offset any refund issued. ### Customer Must Request Financial Credit In order to receive any of the Financial Credits described above, Customer must notify CoreWeave technical support within ten (10) days from the time Customer becomes eligible to receive a Financial Credit. Customer must also provide CoreWeave with server log files showing loss of external connectivity errors and the date and time those errors occurred. If Customer does not comply with these requirements, Customer will forfeit its right to receive a Financial Credit. If a dispute arises with respect to this TOS, CoreWeave will make a determination in good faith based on its system logs, monitoring reports, configuration records, and other available information, which CoreWeave will make available for auditing by Customer at Customer's request. ### Maximum Financial Credit The aggregate maximum number of Financial Credits to be issued by CoreWeave to Customer for any and all Downtime Periods that occur in a single billing month will not exceed 50% of the amount due from Customer for the Covered Service for the applicable month. Financial Credits will be made in the form of a monetary credit applied to future use of the Covered Service and will be applied within sixty (60) days after the Financial Credit was requested. Customer acknowledges and agrees that any Financial Credits for loss or interruption of compute power, constituting a Downtime Period, shall be ratably calculated based on the Term of an Order Form and granted in accordance with the TOS. ### Exclusions The Financial Credits do not apply to any: (a) features designated pre-general availability (unless otherwise set forth in the associated Documentation), (b) features excluded from the TOS (in the associated documentation), or (c) errors: (i) caused by factors outside of CoreWeave's reasonable control; (ii) that resulted from Customer's software or hardware or third party software or hardware, or both; (iii) that resulted from abuses or other behaviors that violate the TOS; or (iv) that resulted from quotas applied by the system, or (d) downtime caused by in-advance communicated maintenance. As applicable, Customer will only be entitled to Financial Credit for Downtime of a particular instance as either a Single Instance or Instances in Multiple Regions, but not both. ### Intellectual Property Rights This TOS does not grant either party any rights, implied or otherwise, to the other's content or any of the other's intellectual property. As between the parties, Customer owns all rights in Customer Data (including all object and source code contained therein), and CoreWeave owns all rights in the CoreWeave Cloud Platform as a Covered Service and all CoreWeave Services and related software (including third party software). If Customer chooses to provide input and suggestions regarding problems with or proposed modifications or improvements to any of CoreWeave's products and services ("Feedback") then Customer hereby grants to CoreWeave an unrestricted, perpetual, irrevocable, non-exclusive, fully-paid, royalty-free right to exploit the Feedback in any manner and for any purpose, including to improve the CoreWeave Cloud Platform as a Covered Service and create other products and services. Customer grants CoreWeave permission to include Customer's name, logos, and trademarks in its promotional and marketing materials and communications. Subject to Customer's strict compliance with this TOS, CoreWeave grants Customer a limited, non-exclusive, non-transferable, non-sublicensable, revocable license to access and use the CoreWeave Cloud Platform as a Covered Service as described in and subject to this TOS. ### Use of Customer Data CoreWeave will only access or use or share Customer Data in accordance with its then current [Privacy Policy](/policies/terms-of-service/privacy-policy) in effect. Subject to this TOS, by providing Customer Data to or via the CoreWeave Cloud Platform, Customer grants CoreWeave a license to host, store, transfer, display, perform, reproduce, modify for the purpose of formatting for display, and distribute Customer Data solely and exclusively for the purpose of providing the CoreWeave services to Customer. Customer is solely responsible for its Customer Data and agrees that CoreWeave is not and will not in any way be liable for Customer Data. By providing Customer Data, Customer affirms, represents and warrants that: (1) its Customer Data and use thereof will not violate this TOS (including the AUP) or any applicable law, regulation, rule or third party rights; (2) Customer is solely responsible for the development, moderation, operation, maintenance, support and use of Customer Data, including when Customer Data is provided by Customer's end users; (3) Customer's Customer Data and its use thereof does not and will not: (i) infringe, violate, or misappropriate any third party right, including any copyright, trademark, patent, trade secret, moral right, privacy right, right of publicity, or any other intellectual property or proprietary right; (ii) slander, defame, libel, or invade a right of privacy, publicity or other property rights of any other person; or (iii) cause us to violate any law, regulation, rule, or rights of third parties; and (4) except for the specific CoreWeave services provided under this TOS or other express contract, Customer is solely responsible for the technical operation of Customer Data, including on behalf of Customer's end users. ### Rules of Conduct Customer must use the CoreWeave services in accordance with the AUP, which is incorporated by reference. Accordingly, any usage in violation of the AUP shall constitute a breach of this TOS. Customer is solely responsible for the activity that occurs on its Account, regardless of whether the activities are undertaken by Customer, its employees, any third party (including Customer's contractors or agents), Customer's end users, licensees, or customers. Customer is responsible for notifying its employees, agents, and others related to Customer's usage of the provisions of this TOS, including where the terms of the TOS are binding on them. Customer shall not (directly or indirectly): (i) decipher, decompile, disassemble, reverse engineer or otherwise attempt to derive any source code or underlying ideas or algorithms of any part of the CoreWeave Cloud Platform (including without limitation any application), except to the limited extent applicable laws specifically prohibit such restriction; (ii) modify, translate, or otherwise create derivative works of any part of the CoreWeave Cloud Platform and Covered Services; or (iii) copy, rent, lease, distribute, or otherwise transfer any of the rights that Customer receives hereunder. Customer shall abide by all applicable local, state, national and international laws and regulations. CoreWeave reserves the right to access, read, preserve, and disclose any information as it reasonably believes is necessary to (i) respond to any applicable law, regulation, legal process or valid governmental request; (ii) enforce this TOS, including investigation of potential violations hereof; (iii) detect, prevent, or otherwise address fraud, security or technical issues; (iv) respond to user support requests; or (v) protect the rights, property or safety of CoreWeave's personnel, its other customers and the public. The CoreWeave Cloud Platform as a Covered Service is subject to the trade and economic sanctions maintained by the Office of Foreign Assets Control ("OFAC"). By accessing the Services, Customer agrees to comply with these laws and regulations. Specifically, Customer represents and warrants that it is not (a) located in any country that is subject to OFAC's trade and economic sanctions, currently Cuba, Iran, North Korea, Syria, and the Crimea region of the Ukraine; or (b) an individual or entity included on any U.S. lists of prohibited parties including: the Treasury Department's List of Specially Designated Nationals List ("SDN List") and Sectoral Sanctions List ("SSI List"). Additionally, Customer agrees not to - directly or indirectly - sell, export, reexport, transfer, divert, or otherwise dispose of any service received from CoreWeave in contradiction with these laws and regulations. Customer must utilize proper security protocols, such as setting strong passwords and access control mechanisms, safeguarding access to all logins and passwords, and verifying the trustworthiness of persons who are entrusted with account access information. Customer is solely responsible for any unauthorized access to the Customer's Account, and must notify CoreWeave immediately of any such unauthorized access upon becoming aware of it. Customer will notify CoreWeave if and when Customer learns of any security incidents or breaches affecting the CoreWeave Cloud Platform and Services, including unauthorized access to Customer's Account or Account credentials, and shall aid in any investigation or legal action that is taken by authorities and/or CoreWeave to investigate and cure the security incident or breach to the extent caused by the Customer Account or use of the Services. The DPA includes more information about security incidents as they pertain to certain personal data. ### Deletion by Customer CoreWeave will enable Customer to delete Customer Data during the Term in a manner consistent with the functionality of the Covered Services. If Customer uses the Covered Services to delete any Customer Data and that Customer Data cannot be recovered by Customer, this use will constitute an instruction to CoreWeave to delete the relevant Customer Data from CoreWeave's systems in accordance with applicable law. CoreWeave will comply with this instruction as soon as reasonably practicable and within a maximum period of one hundred eighty (180) days. ### Deletion on Termination On expiry of the Term of an Order Form or the closing of a Customer account, Customer may instruct CoreWeave to delete all Customer Data (including existing copies) from CoreWeave's systems in accordance with applicable law. CoreWeave will, after a recovery period of up to thirty (30) days following such expiry, comply with this instruction as soon as reasonably practicable and within a maximum period of one hundred eighty (180) days. Customer is responsible for exporting, before the Term expires or its Customer Account is closed, any Customer Data it wishes to retain. ### Data Security Customer should refer to CoreWeave's [Security and Compliance Datasheet](/policies/terms-of-service/security-and-compliance) for CoreWeave's data and privacy policies with respect to the CoreWeave Cloud Platform. ### Data Incidents Incident Notification. CoreWeave will notify Customer promptly and without undue delay after becoming aware of a data security incident, and promptly take all commercially reasonable steps to minimize harm and secure Customer Data. Details of Data Security Incident. CoreWeave's notification of a data security incident will describe, to the extent possible, the nature of the incident, the measures taken to mitigate the potential risks and the measures CoreWeave recommends Customer take to address the data security incident. Delivery of Notification. Notification(s) of any data security incident(s) will be delivered to the email address provided by Customer. No Assessment of Customer Data by CoreWeave. CoreWeave has no obligation to assess Customer Data in order to identify information subject to any specific legal requirements. No Acknowledgement of Fault by CoreWeave. CoreWeave's notification of or response to a data security incident under this section will not be construed as an acknowledgement by CoreWeave of any fault or liability with respect to said incident. ### No Warranty The CoreWeave Cloud Platform as a Covered Service and all CoreWeave Services, including without limitation, the services and products that CoreWeave provides to integrate a Customer's workflows with the CoreWeave Cloud Platform as a Covered Service, are provided "as is" and on an "as available" basis (subject to the SLO). CoreWeave disclaims all warranties of any kind, whether express or implied, relating to the CoreWeave Cloud Platform as a Covered Service and all content delivered in connection thereto, including but not limited to: (a) any implied warranty of merchantability, fitness for a particular purpose, title, quiet enjoyment, or non-infringement; (b) any warranty arising out of course of dealing, usage, or trade; or (c) any warranty or guaranty relating to availability, accuracy, error rate, system integrity, or uninterrupted access. CoreWeave does not warrant that: (i) the CoreWeave Services will be secure or available at any particular time or location; (ii) any defects or errors will be corrected; (iii) any content or software available at or through the CoreWeave Services is free of viruses or other harmful components; or (iv) the results of using the CoreWeave Services will meet Customer's requirements. The Customer is responsible for ensuring the security of the Customer's environment that is using the CoreWeave Cloud Platform as a Covered Service. The limitations, exclusions, and disclaimers in this section apply to the fullest extent permitted by law. CoreWeave does not disclaim any warranty or other right that CoreWeave is prohibited from disclaiming under applicable law. ### Indemnification You agree to defend, indemnify and hold harmless CoreWeave and its licensee and licensors, and their employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, and expenses (including but not limited to attorney's fees), resulting from or arising out of (a) your use and access of the CoreWeave Cloud Platform as a Covered Service and the CoreWeave Services, by you or any person using your Account; (b) a breach of these TOS; or (c) your Customer Data. ### Limitation of Liability EXCEPT AS PROHIBITED BY LAW, YOU WILL HOLD US AND OUR OFFICERS, DIRECTORS, EMPLOYEES, AND AGENTS HARMLESS FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGE, HOWEVER IT ARISES (INCLUDING ATTORNEYS' FEES AND ALL RELATED COSTS AND EXPENSES OF LITIGATION AND ARBITRATION, OR AT TRIAL OR ON APPEAL, IF ANY, WHETHER OR NOT LITIGATION OR ARBITRATION IS INSTITUTED), WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, OR ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, INCLUDING WITHOUT LIMITATION ANY CLAIM FOR PERSONAL INJURY OR PROPERTY DAMAGE, ARISING FROM THIS AGREEMENT AND ANY VIOLATION BY YOU OF ANY FEDERAL, STATE, OR LOCAL LAWS, STATUTES, RULES, OR REGULATIONS, EVEN IF COMPANY HAS BEEN PREVIOUSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. EXCEPT AS PROHIBITED BY LAW, IF THERE IS LIABILITY FOUND ON THE PART OF COMPANY, IT WILL BE LIMITED TO THE AMOUNT PAID FOR THE PRODUCTS AND/OR SERVICES DURING THE PRECEDING 12 MONTHS, AND UNDER NO CIRCUMSTANCES WILL THERE BE CONSEQUENTIAL OR PUNITIVE DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF PUNITIVE, INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE PRIOR LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. ### Governing Law and Jurisdiction Governing Law. The TOS and any dispute related thereto is governed by the laws of the State of New York without regard to conflict of law principles. Jurisdiction. The Customer and CoreWeave each submit to the personal and exclusive jurisdiction of the state courts and federal courts located within New York County, New York for resolution of any lawsuit or court proceeding permitted under the TOS. ### Changes to Terms of Service The TOS for the CoreWeave Cloud Platform as a Covered Service may be amended and/or modified from time to time by CoreWeave, without notice to Customer. The Customer's use of CoreWeave Services will always be subject to the TOS that is in effect from time to time. Accordingly, the Customer is responsible, and strongly encouraged, to revisit this page regularly in order to learn of any updates to the TOS. # Acceptable Use Policy Source: https://docs.coreweave.com/policies/terms-of-service/acceptable-use-policy CoreWeave's Acceptable Use Policy defining prohibited activities and usage restrictions for all services ### Last updated September 17, 2021 This Acceptable Use Policy (this "AUP") describes material and activities that are not allowed in connection with a Customer's use of CoreWeave Services. This AUP is not exhaustive, and CoreWeave reserves the right to take remedial action in connection with content or uses that CoreWeave determines fall within the scope of this AUP, irrespective of whether the content or uses are specifically described below. The Customer is responsible for violations of this AUP by anyone using Customer's Account, with or without Customer's permission or authorization. The Customer is also responsible for violations of this AUP by its end users. The Customer's use of CoreWeave Services to assist another person in an activity that would violate this AUP if performed by the Customer is also a violation of this AUP. CoreWeave may modify this AUP at any time by posting a revised version on the CoreWeave websites and/or its Terms of Service (the "TOS"). All capitalized and formally defined terms in this AUP have the same meaning as in the TOS. ### Illegal or Abusive Activity or Content The Customer may not use CoreWeave Services for any unlawful or abusive purpose. Prohibited activities include but are not limited to: * **Illegal Activities**: Any use of CoreWeave Services to engage in, further, promote, encourage, or obfuscate illegal conduct or activities, including the dissemination of content that has been determined by a court of competent jurisdiction to be unlawful; * **Fraudulent or Harmful Activities**: Engaging in activities that are deceptive or harmful to others, or that would harm CoreWeave's operations or reputation, including offering or disseminating fraudulent goods, services, schemes, or promotions (e.g., Ponzi and pyramid schemes, phishing, or pharming), deceptively impersonating another person or entity, or engaging in other fraudulent or misleading practices; * **Violation of Intellectual Property Rights**: Using CoreWeave Services in a manner that violates, infringes upon, or misappropriates the intellectual property or proprietary rights of any third party, including without limitation any rights in or to copyright, patent, trademark, trade secret, privacy or publicity, and publishing content intended to assist others in unlawfully circumventing technical measures intended to protect any such rights; * **Unlawful Pornography**: Disseminating child pornography or depictions of nudity or sexual activity obtained or disseminated without the consent of those depicted (e.g., "revenge pornography") * **Violent, Harassing, or Abusive Content**: Content that incites or threatens violence against any person, promotes terrorism, is intended to harass, abuse or invade the privacy of any individual, creates a risk to the physical safety or health of any individual or to public safety or health, or that threatens or encourages harm on the basis of race, ethnicity, national origin, religion, caste, sexual orientation, sex, gender, gender identity, serious disease or disability, or immigration status; and * **Controlled Substances**: Unlawfully selling or distributing controlled substances, including but not limited to any illegal or prescription drugs. ### Security Violations The Customer may not use CoreWeave Services to violate the security or integrity of any network, computer or communications system, software application, or network or computing device (each, a "System"). Prohibited activities include but are not limited to: * **Harmful Software**: Content, software, or any other technology that may damage, interfere with, surreptitiously intercept, or expropriate any computer system, program, or data, including any viruses, malware, spyware, adware, Trojan horses, worms, or time bombs; * **Unauthorized Access**: Accessing or using any System without permission, including attempting to probe, scan, or test the vulnerability of a System or to breach any security or authentication measures used by a System; * **Interception**: Monitoring of data or traffic on a System without permission; and * **Falsification of Origin**: Using fake or misleading TCP-IP packet headers, e-mail headers, or any part of a message describing its origin or route. This prohibition does not include the use of aliases or anonymous remailers. ### Network Abuse The Customer may not make network connections to any users, hosts, or networks unless the Customer has express permission to communicate with them. Prohibited activities include but are not limited to: * **Monitoring or Crawling**: Monitoring or crawling of a System (as defined above) that impairs or disrupts the System being monitored or crawled, or other harvesting or scraping of any content of CoreWeave Services; * **Deceitful Actions**: Introducing intentionally, knowingly, or recklessly, any virus or other contaminating code into the CoreWeave Cloud Platform as a Covered Service, or collecting, transmitting, or using information, including email addresses, screen names or other identifiers, by deceit or covert means (such as phishing, Internet scamming, password robbery, spidering, and harvesting); * **Intentional Interference**: Interfering with the proper functioning of any System, including any deliberate attempt to overload a System by mail bombing, news bombing, broadcast attacks, flooding techniques, or conducting a denial of service ("DoS") attack; * **Operation of Certain Network Services**: Operating open proxies, open mail relays, open recursive domain name servers, Tor exit nodes, or other similar network services; * **Avoiding System Restrictions**: Using manual or electronic means to avoid any use limitations placed on a System, such as access limits and storage restrictions; * **Retaliation Against CoreWeave**: Any conduct that results in or is likely to result in retaliation against CoreWeave, including CoreWeave Services, or CoreWeave's employees, officers or other agents, including engaging in behavior that results in or is likely to result in any CoreWeave server being the target of a DoS attack; * **Withholding Identity**: Any activity intended to withhold or cloak identity or contact information, including the omission, deletion, forgery or misreporting of any transmission or identification information, such as return mailing and IP addresses; and * **Mining of Cryptocurrencies**: Mining any cryptocurrency without explicit written permission. ### Vulnerability Testing The Customer may not attempt to probe, scan, penetrate, or test the vulnerability of a CoreWeave system or network, or to breach the CoreWeave security or authentication measures, whether by passive or intrusive techniques, or conduct any security or malware research on or using CoreWeave Services, without CoreWeave's prior written consent. ### CoreWeave Monitoring and Enforcement CoreWeave reserves the right, but has no obligation, to investigate any suspected violation of this AUP or misuse of CoreWeave Services by the Customer about which CoreWeave has actual knowledge. In connection with such investigations, CoreWeave may report any activity that it reasonably suspects may violate any law or regulation to appropriate law enforcement officials, regulators, or other appropriate third parties. Such reporting may include disclosing, reviewing and preserving appropriate customer information consistent with applicable law. CoreWeave may also cooperate with appropriate law enforcement agencies, regulators, or other appropriate third parties to help with the investigation and prosecution of illegal conduct by providing network and systems information related to alleged violations of this AUP. ### Consequences of Violation of AUP If CoreWeave determines, in its good faith discretion, that the Customer has violated this AUP, CoreWeave may remove, disable access to, or modify any content or resource and/or suspend or terminate Customer's use of CoreWeave Services. CoreWeave may also intercept or block any content or traffic belonging to the Customer or its end users in instances where CoreWeave Services are being used unlawfully or not in accordance with this AUP. CoreWeave's right to suspend or terminate the Customer's use of CoreWeave Services applies even if a violation is committed unintentionally or without the Customer's authorization. Nothing in this AUP may be construed as an obligation on CoreWeave to act at any given time or with respect to any given instance, and CoreWeave may exercise such right at any time within its sole discretion. ### Reporting of Violations of this AUP If Customer becomes, or should reasonably become, aware of any suspected violation of this AUP, Customer must notify CoreWeave by providing a full explanation of the bases for the violation. CoreWeave can request Customer's assistance to help stop or remedy the violation. # CoreWeave AI Object Storage Service Level Agreement Source: https://docs.coreweave.com/policies/terms-of-service/coreweave-ai-object-storage-policy Service level agreement for CoreWeave AI Object Storage, including uptime targets and financial credit tiers This CoreWeave AI Object Storage Service Level Agreement ("Storage SLA") applies solely to **CoreWeave AI Object Storage**, which is considered CoreWeave Services. This Storage SLA is hereby incorporated into the [CoreWeave Terms of Service ("TOS")](/policies/terms-of-service). For the avoidance of doubt, this Storage SLA applies only to data accessed at the `cwobject.com` endpoint, and does not apply to data accessed at the `cwlota.com` endpoint. Capitalized terms not defined herein shall have the meaning ascribed to them in the TOS. 1. CoreWeave shall use commercially reasonable efforts to provide CoreWeave AI Object Storage to Customer at the Storage Monthly Uptime Percentage of >= 99.9%. If CoreWeave does not meet such Storage Monthly Uptime Percentage, and if Customer is otherwise in good standing and meeting its obligations under the TOS, Customer will be eligible to receive the Storage Financial Credits set forth in the below table. Storage Financial Credits will be made in the form of a monetary credit applied to future use of CoreWeave AI Object Storage and will be applied within sixty (60) days after the Storage Financial Credit was requested. Storage Financial Credits will not entitle you to any refund or other payment from CoreWeave. Storage Financial Credits may not be transferred or applied to any other account. This Storage SLA states Customer's sole and exclusive remedy for any failure by CoreWeave to meet the Storage Monthly Uptime Percentage. **"Storage Financial Credits"** means the below table: | Storage Monthly Uptime Percentage | Percentage of monthly bill for the CoreWeave Availability Zone affected which did not meet the Storage Monthly Uptime Percentage that will be credited to future monthly bills of Customer | | - | - | | 99% - 99.9% | 10% | | 95% - 98.999% | 25% | | \< 94.999% | 100% | **"Storage Monthly Uptime Percentage"** means for the applicable monthly billing period: 100% minus the average Error Percentage for each five minute interval of such monthly billing period. **"Error Percentage"** means, for each request type to CoreWeave AI Object Storage at the `cwobject.com` endpoint during a given five minute interval of the monthly billing period: the total number of internal server errors returned by CoreWeave AI Object Storage for such request type as error status "InternalError" or "ServiceUnavailable" (each, an "Error"), divided by the total number of requests for such request type. For the avoidance of doubt, (a) the Error Percentage shall not include any internal server errors arising directly or indirectly from the exclusions set forth in Section 3 of this Storage SLA, and (b) the Error Percentage for a given five minute interval shall be 0% if no requests were made during such interval. 2. **Customer Must Request Storage Financial Credit.** In order to receive any of the Storage Financial Credits described above, Customer must notify CoreWeave technical support at [support@coreweave.com](mailto:support@coreweave.com) within thirty (30) days from the time Customer becomes eligible to receive a Storage Financial Credit. Customer must also provide CoreWeave with the applicable CoreWeave Availability Zone, and the request logs documenting the dates and times of each Error. If Customer does not comply with these requirements, Customer will forfeit its right to receive a Storage Financial Credit. If a dispute arises with respect to this Storage SLA, CoreWeave will make a determination in good faith based on its system logs, monitoring reports, configuration records, and other available information, which CoreWeave will make available for auditing by Customer at Customer's request. 3. **Exclusions.** The Storage Financial Credits do not apply to any: (a) features designated pre-general availability (unless otherwise set forth in the associated Documentation), (b) features excluded from the TOS (in the associated documentation), or (c) any unavailability, suspension or termination of CoreWeave AI Object Storage, performance issues or other errors: (i) caused by factors outside of CoreWeave's reasonable control, including internet access or related problems beyond the demarcation point of CoreWeave AI Object Storage; (ii) that resulted from Customer's actions or inactions, or Customer's and/or third party software, hardware, equipment or other technology; (iii) that resulted from abuses or other behaviors that violate the TOS or any other suspension or termination of Customer's right to use CoreWeave AI Object Storage; or (iv) that resulted from quotas applied by the system, or (d) downtime caused by in-advance communicated maintenance. # CoreWeave Data Processing Agreement Source: https://docs.coreweave.com/policies/terms-of-service/data-processing-agreement CoreWeave's Data Processing Addendum covering GDPR compliance, personal data handling, and EU contractual clauses **Revised as of Nov 25, 2024** This Data Processing Addendum ("**DPA**") is subject to, incorporated with, and part of, the CoreWeave Terms of Service ("**TOS**") entered into between CoreWeave, Inc. ("**CoreWeave**") and the customer agreeing to be bound by them ("**Customer**"). CoreWeave and Customer shall be collectively referred to herein as "**Parties**" and individually as a "**Party**". Capitalized terms not defined herein shall have the meaning ascribed to them in the TOS. The parties agree as follows: ## 1. Definitions. a. "**Authorized Affiliate**" means any of Customer's affiliate(s) permitted to or otherwise receiving the benefit of CoreWeave Services. b. "**Controller**" as defined in the GDPR. c. "**Controller-to-Processor Clauses**" means the standard contractual clauses between controllers and processors in connection with the transfer of Personal Data, as approved by the Commission Decision (EU) 2021/914, attached to this DPA as Attachment I. d. "**CoreWeave Services**" means any product or service provided by CoreWeave to Customer or its Authorized Affiliates pursuant to and as more particularly described in the TOS, including the CoreWeave Cloud Platform. e. "**Data Protection Laws**" means all laws and regulations that are applicable to and binding, including, as applicable, the GDPR, the United Kingdom's Data Protection Act 2018 ("UK GDPR") and the Switzerland's Federal Act on Data Protection 2020 ("Swiss GDPR"). f. "**Data Subject**" means the identified or identifiable person to whom Personal Data relates. g. "**EU Standard Contractual Clauses**" means, where applicable and as the same may be amended and modified, (1) the Controller-to-Processor Clauses; or (2) the Processor-to-Processor Clauses. h. "**GDPR**" means Regulation (EU) 2016/679 of the European Parliament and of the Council of 27 April 2016 on the protection of natural persons with regard to the processing of personal data and on the free movement of such data, and repealing Directive 95/46/EC (General Data Protection Regulation). i. "**Personal Data**" means "personal information," "personal data," or "personally identifiable information," as each such term or equivalent term is defined in the applicable Data Protection Laws. j. "**Process**" or "**Processing**" as defined in the GDPR. k. "**Processed Customer Data**" means any Personal Data that is uploaded to the CoreWeave Services. l. "**Processor**" as defined in the GDPR. m. "**Processor-to-Processor Clauses**" means the standard contractual clauses between processors in connection with the transfer of Personal Data, as approved by the Commission Decision (EU) 2021/914, attached to this DPA as Attachment II. n. "**Security Incident**" means any act or omission that compromises the security, confidentiality or integrity of Processed Customer Data or the physical, technical, administrative or organizational safeguards put in place to protect it that rises to the level of a security breach or incident under the applicable Data Protection Laws. o. "**Standard Contractual Clauses**" means, where applicable and as the same may be amended and modified, (1) the EU Standard Contractual Clauses, (2) the Swiss Standard Contractual Clauses and (3) UK Standard Contractual Clauses. p. "**Sub-processor**" means any Processor engaged by CoreWeave or its affiliates to assist in fulfilling its obligations with respect to providing CoreWeave Services. q. "**Swiss Standard Contractual Clauses**" means the EU Standard Contractual Clauses as supplemented and modified as required by the guidance titled "transfer of personal data to a country with an inadequate level of data protection based on recognised standard contractual clauses and model contracts", published by the Swiss Federal Data Protection and Information Commissioner and found at [https://www.edoeb.admin.ch/en/cross-border-transfer-of-personal-data](https://www.edoeb.admin.ch/en/cross-border-transfer-of-personal-data) as amended and modified and which are incorporated herein by reference as applicable. r. "**UK Standard Contractual Clauses**" means the EU Standard Contractual Clauses as supplemented and modified as required by the international data transfer addendum provided by the United Kingdom's Information Commissioner's Office found at [https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/international-transfers/a-guide-to-international-transfers/](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/international-transfers/a-guide-to-international-transfers/), as amended and modified and which are incorporated herein by reference as applicable. ## 2. Applicability. This DPA applies where and only to the extent that CoreWeave processes Processed Customer Data on behalf of the Customer or its Authorized Affiliates in the course of providing CoreWeave Services that is subject to protection under Data Protection Laws. ## 3. Processing of Processed Customer Data. a. **Role of the Parties**. The Parties agree that in regard to the Processing of Processed Customer Data under Data Protection Laws that define the Parties' relationship as one between a Controller and a Processor, Customer is the Controller and CoreWeave is the Processor, except where CoreWeave and Customer jointly determine the purposes and means of Processing, in which case CoreWeave and Customer shall both be considered a Controller. Nothing in this DPA or in the TOS shall be construed as to state or imply that CoreWeave has a direct relationship with the individual customers or users of Customer or its Authorized Affiliates or that CoreWeave is acting as a Controller under Data Protection Laws. b. **Customer Obligations**. Customer may act either as a "controller" or "processor" (as each such term is defined in the applicable Data Protection Law) with respect to Processed Customer Data and shall, comply with all applicable laws, including without limitation, Data Protection Laws. Customer's instructions provided to CoreWeave with respect to the Processing of Personal Data shall at all times comply with Data Protection Laws. Customer shall have sole responsibility for the accuracy, quality and legality of Personal Data and the means by which Customer acquired any Personal Data, including, without limitation, receiving all necessary consents of each Data Subject and ensuring the accuracy of all Personal Data. c. **CoreWeave Processing of Processed Customer Data**. CoreWeave agrees to Process Processed Customer Data on behalf of and in accordance with Customer's documented written instructions in connection with: (i) Processing in accordance with this DPA and the TOS; (ii) Processing in relation to the providing the CoreWeave Services; or (iii) Processing otherwise required pursuant to applicable Data Protections Laws. The Parties agree that this DPA and the TOS set out Customer's complete and final instructions to CoreWeave in relation to the Processing of Processed Customer Data and any processing outside the scope of such instructions (if any) shall require prior written agreement between Customer and CoreWeave. ## 4. Sub-processing. a. **Authorized Sub-processors**. Customer understands and agrees that CoreWeave may engage Sub-processors from time to time to process Personal Data on Customer's or its Authorized Affiliates' behalf. Customer consents to the use of CoreWeave's current Sub-processors as listed on CoreWeave's page (currently at [https://docs.coreweave.com/policies/terms-of-service/sub-processors](/policies/terms-of-service/sub-processors)). In the event that CoreWeave intends to engage a new Sub-processor with respect to the CoreWeave Services, CoreWeave will update the applicable website and send a notice to Customer at least 30 days in advance. Customer agrees that it will, at all times, maintain up-to-date and accurate contact information with CoreWeave, and will inform CoreWeave immediately in the event that such contact information becomes outdated or otherwise inaccurate. b. **Sub-processor Obligations**. When applicable, CoreWeave shall: (i) enter into a written agreement with the Sub-processor imposing data protection terms that require the Sub-processor to protect the Processed Customer Data to the standard required by Data Protection Laws; and (ii) remain responsible for its compliance with the obligations of this DPA and for any acts or omissions of the Sub-processor that cause CoreWeave to breach any of its obligations under this DPA. c. **Objection to Sub-processors**. Customer may object in writing to CoreWeave's appointment of a Sub-processor on reasonable grounds relating to data protection by notifying CoreWeave promptly in writing within fifteen (15) days of receipt of CoreWeave's notice in accordance with this DPA. Such notice shall explain the reasonable grounds for the objection. In such event, the Parties shall discuss such concerns in good faith with a view to achieving commercially reasonable resolution. If this is not possible, either Party may terminate the applicable CoreWeave Services that cannot be provided by CoreWeave without the use of the objected-to-new Sub-processor. ## 5. Security. a. **Security Measures**. CoreWeave shall implement and maintain appropriate technical and organizational security measures to protect Processed Customer Data from Security Incidents and to preserve the security and confidentiality of the Processed Customer Data, in accordance with CoreWeave's security standards ("**Security Measures**"). b. **Confidentiality of Processing**. CoreWeave shall ensure that any person who is authorized by CoreWeave to process Processed Customer Data (including its staff, agents and subcontractors) shall be under an appropriate obligation of confidentiality (whether a contractual or statutory duty). c. **Security Incident Response**. Upon becoming aware of a Security Incident, CoreWeave shall notify Customer without undue delay and shall provide timely information relating to the Security Incident as it becomes known or as is reasonably requested by Customer. d. **Updates to Security Measures**. Customer acknowledges that the Security Measures are subject to technical progress and development and that CoreWeave may update or modify the Security Measures from time to time. ## 6. Security Reports and Audits. Upon Customer's written request, CoreWeave shall provide (on a confidential basis) copies of relevant external certifications, audit report summaries and/or other documentation reasonably required by Customer to verify CoreWeave's compliance with this DPA. CoreWeave shall further provide written responses (on a confidential basis) to all reasonable requests for information made by Customer, including responses to information security and audit questionnaires, that Customer (acting reasonably) considers necessary to confirm CoreWeave's compliance with this DPA, provided that Customer shall not exercise this right more than once per year. ## 7. International Transfers. If Data Protection Laws restrict cross-border Personal Data transfers, Customer will, and will cause its Authorized Affiliates to, only transfer that Personal Data to CoreWeave under the following conditions: (i) CoreWeave, either through its location or participation in a valid cross-border transfer mechanism under Data Protection Laws, may legally receive that Personal Data, or (ii) the transfer otherwise complies with Data Protection Laws. In the event any proposed or actual Personal Data transfer between Customer and CoreWeave does not fall under any legitimate cross border transfer mechanism or otherwise complies with Data Protection Laws, Customer agrees that it shall, at CoreWeave's direction, take all actions required to legitimize the transfer. In the event of a conflict or inconsistency between this DPA and the Standard Contractual Clauses, the Standard Contractual Clauses shall prevail.\ \ The Standard Contractual Clauses will only apply to Personal Data that is (1) transferred to any country outside of the European Economic Area, (2) such country is not recognized by the European Commission as providing an adequate level of protection for personal data, and (3) such Personal Data is not otherwise transferred pursuant to any other legal basis granting adequate protection per the Data Protection Laws. When Customer is acting as a controller, the Controller-to-Processor Clauses will apply to such data transfer and when Customer is acting as a processor, the Processor-to-Processor Clauses will apply to such data transfer. ## 8. Return or Deletion of Data. Upon deactivation of CoreWeave Services, all Processed Customer Data shall be deleted pursuant to CoreWeave's retention and deletion policies. Notwithstanding the foregoing, CoreWeave reserves the right to retain relevant data and information when required by applicable law; when under court order, subpoena, or other legal order; or when preserving evidence following or in anticipation of a civil or criminal lawsuit. ## 9. Cooperation. a. **Cooperation**. CoreWeave shall (at Customer's expense), taking into account the nature of the processing, provide reasonable cooperation to assist Customer in responding to a Data Subject request made under applicable Data Protection Laws relating to the processing of Processed Customer Data. In the event that any such Data Subject request is made directly to CoreWeave, CoreWeave shall not respond to such request directly without Customer's prior authorization, unless legally compelled to do so (as determine in CoreWeave's good faith discretion). If CoreWeave is required to respond to a Data Subject request, CoreWeave shall promptly notify Customer and provide Customer with a copy of such Data Subject Request (to the extent legally permitted). b. **Data Impact Assessment**. To the extent CoreWeave is required under applicable Data Protection Laws, CoreWeave shall (at Customer's expense) provide reasonably requested information regarding CoreWeave's Processing of Processed Customer Data to enable Customer to carry out data protection impact assessments or prior consultations with data protection authorities as required by law. ## 10. Sale of Processed Customer Data. CoreWeave shall: (a) not sell the Processed Customer Data; (b) not retain, use or disclose Processed Customer Data for any purpose other than for performing the CoreWeave Services, or as otherwise permitted by applicable Data Protection Laws; (c) not retain, use or disclose the Processed Customer Data for a commercial purpose other than the agreed purposes set forth in the TOS; and (d) not retain, use, or disclose Processed Customer Data outside of the direct business relationship between CoreWeave and Customer, except as may otherwise be provided in this DPA. CoreWeave is prohibited from combining the Processed Customer Data with personal data that it receives from or on behalf of another person or persons or collects from its own interaction with the relevant Data Subject(s). CoreWeave hereby certifies that it understands and is willing to abide by the restrictions in this Section. ## 11. Miscellaneous. a. **Notice Requirements**. CoreWeave agrees that it will notify Customer if it determines that it cannot or will no longer meet the obligations set forth in this DPA or applicable Data Protection Laws with respect to the provisions of CoreWeave Services; and upon such notice, CoreWeave will take reasonable and necessary steps, without undue delay, to stop Processing any impacted Processed Customer Data. Any notices required to be delivered by CoreWeave to Customer shall be sent to the email which Customer has provided to CoreWeave. Any notices required to be delivered by Customer to CoreWeave hereunder shall be sent to [support@coreweave.com](mailto:support@coreweave.com). b. **Term**. This DPA will remain in effect until the termination of the TOS. c. **Severability**. If one or more provisions of this DPA are held to be unenforceable under applicable law, the Parties agree to renegotiate such provision in good faith. In the event that such provision was not required by the Data Protection Laws and the Parties cannot reach a mutually agreeable and enforceable replacement, then (a) such provision shall be excluded from this DPA, (b) the balance of this DPA shall be interpreted as if such provision were so excluded, and (c) the balance of this DPA shall be enforceable in accordance with its terms. d. **Limitation of Liability**. Each Party's liability arising out of or related to this DPA, whether in contract, tort or under any other theory of liability, is subject to those limitations of liability set forth in the TOS and any reference in the TOS limiting a Party's liability means the aggregate liability of that Party under the TOS and this DPA. e. **Headings**. The headings and subheadings within this DPA are for convenience only and do not define, limit, or enlarge the scope or meaning of this DPA or any of its provisions. f. **Amendment and Waiver**. Any term of this DPA may be amended with the written consent of the Parties. Any amendment or waiver effected in accordance with this Section shall be binding upon the Parties and their respective successors and assigns. Failure to enforce any provision of this DPA by a Party shall not constitute a waiver of any term hereof by such Party. Without limiting the foregoing, the Parties acknowledge that the Data Protection Laws and Standard Contractual Clauses have been incorporated into this DPA as amended and modified and include all implementing regulations enacted thereunder, as applicable. The Parties acknowledge and agree that amendments and modifications to the Data Protection Laws and Standard Contractual Clauses shall be automatically incorporated into this DPA; such amendments and modifications to the Data Protection Laws and Standard Contractual Clauses may change the Parties' obligations under this DPA, but shall not be considered an amendment or modification of this DPA necessitating written consent of the Parties. g. **Entire Agreement**. This DPA is the product of both of the Parties and constitutes the entire agreement between the Parties with respect to the subject matter hereof and supersedes all other prior agreements and understandings, both written and oral, between the Parties with respect to the subject matter hereof. In the case of conflict or ambiguity between any provision in this DPA and the TOS, the provisions of this DPA will prevail. ## Attachment I -- Controller to Processor SCCs Standard Contractual Clauses Controller to Processor SECTION I Clause 1 Purpose and scope (a) The purpose of these standard contractual clauses is to ensure compliance with the requirements of Regulation (EU) 2016/679 of the European Parliament and of the Council of 27 April 2016 on the protection of natural persons with regard to the processing of personal data and on the free movement of such data (General Data Protection Regulation) for the transfer of data to a third country. (b) The Parties: (i) the natural or legal person(s), public authority/ies, agency/ies or other body/ies (hereinafter 'entity/ies') transferring the personal data, as listed in Annex I.A (hereinafter each 'data exporter'), and (ii) the entity/ies in a third country receiving the personal data from the data exporter, directly or indirectly via another entity also Party to these Clauses, as listed in Annex I.A (hereinafter each 'data importer') have agreed to these standard contractual clauses (hereinafter: 'Clauses'). (c) These Clauses apply with respect to the transfer of personal data as specified in Annex I.B. (d) The Appendix to these Clauses containing the Annexes referred to therein forms an integral part of these Clauses. Clause 2 Effect and invariability of the Clauses (a) These Clauses set out appropriate safeguards, including enforceable data subject rights and effective legal remedies, pursuant to Article 46(1) and Article 46(2)(c) of Regulation (EU) 2016/679 and, with respect to data transfers from controllers to processors and/or processors to processors, standard contractual clauses pursuant to Article 28(7) of Regulation (EU) 2016/679, provided they are not modified, except to select the appropriate Module(s) or to add or update information in the Appendix. This does not prevent the Parties from including the standard contractual clauses laid down in these Clauses in a wider contract and/or to add other clauses or additional safeguards, provided that they do not contradict, directly or indirectly, these Clauses or prejudice the fundamental rights or freedoms of data subjects. (b) These Clauses are without prejudice to obligations to which the data exporter is subject by virtue of Regulation (EU) 2016/679. Clause 3 Third-party beneficiaries (a) Data subjects may invoke and enforce these Clauses, as third-party beneficiaries, against the data exporter and/or data importer, with the following exceptions:\ (i) Clause 1, Clause 2, Clause 3, Clause 6, Clause 7;\ (ii) Clause 8.1(b), 8.9(a), (c), (d) and (e);\ (iii) Clause 9(a), (c), (d) and (e);\ (iv) Clause 12(a), (d) and (f);\ (v) Clause 13;\ (vi) Clause 15.1(c), (d) and (e);\ (vii) Clause 16(e);\ (viii) Clause 18(a) and (b).\ (b) Paragraph (a) is without prejudice to rights of data subjects under Regulation (EU) 2016/679. Clause 4 Interpretation (a) Where these Clauses use terms that are defined in Regulation (EU) 2016/679, those terms shall have the same meaning as in that Regulation. (b) These Clauses shall be read and interpreted in the light of the provisions of Regulation (EU) 2016/679. (c) These Clauses shall not be interpreted in a way that conflicts with rights and obligations provided for in Regulation (EU) 2016/679. Clause 5 Hierarchy In the event of a contradiction between these Clauses and the provisions of related agreements between the Parties, existing at the time these Clauses are agreed or entered into thereafter, these Clauses shall prevail. Clause 6 Description of the transfer(s) The details of the transfer(s), and in particular the categories of personal data that are transferred and the purpose(s) for which they are transferred, are specified in Annex I.B. Clause 7 Docking clause (a) An entity that is not a Party to these Clauses may, with the agreement of the Parties, accede to these Clauses at any time, either as a data exporter or as a data importer, by completing the Appendix and signing Annex I.A. (b) Once it has completed the Appendix and signed Annex I.A, the acceding entity shall become a Party to these Clauses and have the rights and obligations of a data exporter or data importer in accordance with its designation in Annex I.A. (c) The acceding entity shall have no rights or obligations arising under these Clauses from the period prior to becoming a Party. SECTION II - OBLIGATIONS OF THE PARTIES Clause 8 Data protection safeguards The data exporter warrants that it has used reasonable efforts to determine that the data importer is able, through the implementation of appropriate technical and organisational measures, to satisfy its obligations under these Clauses. 8.1 Instructions (a) The data importer shall process the personal data only on documented instructions from the data exporter. The data exporter may give such instructions throughout the duration of the contract. (b) The data importer shall immediately inform the data exporter if it is unable to follow those instructions. 8.2 Purpose limitation The data importer shall process the personal data only for the specific purpose(s) of the transfer, as set out in Annex I.B, unless on further instructions from the data exporter. 8.3 Transparency On request, the data exporter shall make a copy of these Clauses, including the Appendix as completed by the Parties, available to the data subject free of charge. To the extent necessary to protect business secrets or other confidential information, including the measures described in Annex II and personal data, the data exporter may redact part of the text of the Appendix to these Clauses prior to sharing a copy, but shall provide a meaningful summary where the data subject would otherwise not be able to understand the its content or exercise his/her rights. On request, the Parties shall provide the data subject with the reasons for the redactions, to the extent possible without revealing the redacted information. This Clause is without prejudice to the obligations of the data exporter under Articles 13 and 14 of Regulation (EU) 2016/679. 8.4 Accuracy If the data importer becomes aware that the personal data it has received is inaccurate, or has become outdated, it shall inform the data exporter without undue delay. In this case, the data importer shall cooperate with the data exporter to erase or rectify the data. 8.5 Duration of processing and erasure or return of data Processing by the data importer shall only take place for the duration specified in Annex I.B. After the end of the provision of the processing services, the data importer shall, at the choice of the data exporter, delete all personal data processed on behalf of the data exporter and certify to the data exporter that it has done so, or return to the data exporter all personal data processed on its behalf and delete existing copies. Until the data is deleted or returned, the data importer shall continue to ensure compliance with these Clauses. In case of local laws applicable to the data importer that prohibit return or deletion of the personal data, the data importer warrants that it will continue to ensure compliance with these Clauses and will only process it to the extent and for as long as required under that local law. This is without prejudice to Clause 14, in particular the requirement for the data importer under Clause 14(e) to notify the data exporter throughout the duration of the contract if it has reason to believe that it is or has become subject to laws or practices not in line with the requirements under Clause 14(a). 8.6 Security of processing (a) The data importer and, during transmission, also the data exporter shall implement appropriate technical and organisational measures to ensure the security of the data, including protection against a breach of security leading to accidental or unlawful destruction, loss, alteration, unauthorised disclosure or access to that data (hereinafter 'personal data breach'). In assessing the appropriate level of security, the Parties shall take due account of the state of the art, the costs of implementation, the nature, scope, context and purpose(s) of processing and the risks involved in the processing for the data subjects. The Parties shall in particular consider having recourse to encryption or pseudonymisation, including during transmission, where the purpose of processing can be fulfilled in that manner. In case of pseudonymisation, the additional information for attributing the personal data to a specific data subject shall, where possible, remain under the exclusive control of the data exporter. In complying with its obligations under this paragraph, the data importer shall at least implement the technical and organisational measures specified in Annex II. The data importer shall carry out regular checks to ensure that these measures continue to provide an appropriate level of security. (b) The data importer shall grant access to the personal data to members of its personnel only to the extent strictly necessary for the implementation, management and monitoring of the contract. It shall ensure that persons authorised to process the personal data have committed themselves to confidentiality or are under an appropriate statutory obligation of confidentiality. (c) In the event of a personal data breach concerning personal data processed by the data importer under these Clauses, the data importer shall take appropriate measures to address the breach, including measures to mitigate its adverse effects. The data importer shall also notify the data exporter without undue delay after having become aware of the breach. Such notification shall contain the details of a contact point where more information can be obtained, a description of the nature of the breach (including, where possible, categories and approximate number of data subjects and personal data records concerned), its likely consequences and the measures taken or proposed to address the breach including, where appropriate, measures to mitigate its possible adverse effects. Where, and in so far as, it is not possible to provide all information at the same time, the initial notification shall contain the information then available and further information shall, as it becomes available, subsequently be provided without undue delay. (d) The data importer shall cooperate with and assist the data exporter to enable the data exporter to comply with its obligations under Regulation (EU) 2016/679, in particular to notify the competent supervisory authority and the affected data subjects, taking into account the nature of processing and the information available to the data importer. 8.7 Sensitive data Where the transfer involves personal data revealing racial or ethnic origin, political opinions, religious or philosophical beliefs, or trade union membership, genetic data, or biometric data for the purpose of uniquely identifying a natural person, data concerning health or a person's sex life or sexual orientation, or data relating to criminal convictions and offences (hereinafter 'sensitive data'), the data importer shall apply the specific restrictions and/or additional safeguards described in Annex I.B. 8.8 Onward transfers The data importer shall only disclose the personal data to a third party on documented instructions from the data exporter. In addition, the data may only be disclosed to a third party located outside the European Union (in the same country as the data importer or in another third country, hereinafter 'onward transfer') if the third party is or agrees to be bound by these Clauses, under the appropriate Module, or if: (i) the onward transfer is to a country benefitting from an adequacy decision pursuant to Article 45 of Regulation (EU) 2016/679 that covers the onward transfer; (ii) the third party otherwise ensures appropriate safeguards pursuant to Articles 46 or 47 Regulation of (EU) 2016/679 with respect to the processing in question; (iii) the onward transfer is necessary for the establishment, exercise or defence of legal claims in the context of specific administrative, regulatory or judicial proceedings; or (iv) the onward transfer is necessary in order to protect the vital interests of the data subject or of another natural person. Any onward transfer is subject to compliance by the data importer with all the other safeguards under these Clauses, in particular purpose limitation. 8.9 Documentation and compliance (a) The data importer shall promptly and adequately deal with enquiries from the data exporter that relate to the processing under these Clauses. (b) The Parties shall be able to demonstrate compliance with these Clauses. In particular, the data importer shall keep appropriate documentation on the processing activities carried out on behalf of the data exporter. (c) The data importer shall make available to the data exporter all information necessary to demonstrate compliance with the obligations set out in these Clauses and at the data exporter's request, allow for and contribute to audits of the processing activities covered by these Clauses, at reasonable intervals or if there are indications of non-compliance. In deciding on a review or audit, the data exporter may take into account relevant certifications held by the data importer. (d) The data exporter may choose to conduct the audit by itself or mandate an independent auditor. Audits may include inspections at the premises or physical facilities of the data importer and shall, where appropriate, be carried out with reasonable notice. (e) The Parties shall make the information referred to in paragraphs (b) and (c), including the results of any audits, available to the competent supervisory authority on request. Clause 9 Use of sub-processors (a) The data importer has the data exporter's general authorisation for the engagement of sub-processor(s) from an agreed list. The data importer shall specifically inform the data exporter in writing of any intended changes to that list through the addition or replacement of sub-processors at least 30 days in advance, thereby giving the data exporter sufficient time to be able to object to such changes prior to the engagement of the sub-processor(s). The data importer shall provide the data exporter with the information necessary to enable the data exporter to exercise its right to object. (b) Where the data importer engages a sub-processor to carry out specific processing activities (on behalf of the data exporter), it shall do so by way of a written contract that provides for, in substance, the same data protection obligations as those binding the data importer under these Clauses, including in terms of third-party beneficiary rights for data subjects. The Parties agree that, by complying with this Clause, the data importer fulfils its obligations under Clause 8.8. The data importer shall ensure that the sub-processor complies with the obligations to which the data importer is subject pursuant to these Clauses. (c) The data importer shall provide, at the data exporter's request, a copy of such a sub-processor agreement and any subsequent amendments to the data exporter. To the extent necessary to protect business secrets or other confidential information, including personal data, the data importer may redact the text of the agreement prior to sharing a copy. (d) The data importer shall remain fully responsible to the data exporter for the performance of the sub-processor's obligations under its contract with the data importer. The data importer shall notify the data exporter of any failure by the sub-processor to fulfil its obligations under that contract. (e) The data importer shall agree a third-party beneficiary clause with the sub-processor whereby - in the event the data importer has factually disappeared, ceased to exist in law or has become insolvent - the data exporter shall have the right to terminate the sub-processor contract and to instruct the sub-processor to erase or return the personal data. Clause 10 Data subject rights (a) The data importer shall promptly notify the data exporter of any request it has received from a data subject. It shall not respond to that request itself unless it has been authorised to do so by the data exporter. (b) The data importer shall assist the data exporter in fulfilling its obligations to respond to data subjects' requests for the exercise of their rights under Regulation (EU) 2016/679. In this regard, the Parties shall set out in Annex II the appropriate technical and organisational measures, taking into account the nature of the processing, by which the assistance shall be provided, as well as the scope and the extent of the assistance required. (c) In fulfilling its obligations under paragraphs (a) and (b), the data importer shall comply with the instructions from the data exporter. Clause 11 Redress (a) The data importer shall inform data subjects in a transparent and easily accessible format, through individual notice or on its website, of a contact point authorised to handle complaints. It shall deal promptly with any complaints it receives from a data subject. (b) In case of a dispute between a data subject and one of the Parties as regards compliance with these Clauses, that Party shall use its best efforts to resolve the issue amicably in a timely fashion. The Parties shall keep each other informed about such disputes and, where appropriate, cooperate in resolving them. (c) Where the data subject invokes a third-party beneficiary right pursuant to Clause 3, the data importer shall accept the decision of the data subject to: (i) lodge a complaint with the supervisory authority in the Member State of his/her habitual residence or place of work, or the competent supervisory authority pursuant to Clause 13; (ii) refer the dispute to the competent courts within the meaning of Clause 18. (d) The Parties accept that the data subject may be represented by a not-for-profit body, organisation or association under the conditions set out in Article 80(1) of Regulation (EU) 2016/679. (e) The data importer shall abide by a decision that is binding under the applicable EU or Member State law. (f) The data importer agrees that the choice made by the data subject will not prejudice his/her substantive and procedural rights to seek remedies in accordance with applicable laws. Clause 12 Liability (a) Each Party shall be liable to the other Party/ies for any damages it causes the other Party/ies by any breach of these Clauses. (b) The data importer shall be liable to the data subject, and the data subject shall be entitled to receive compensation, for any material or non-material damages the data importer or its sub-processor causes the data subject by breaching the third-party beneficiary rights under these Clauses. (c) Notwithstanding paragraph (b), the data exporter shall be liable to the data subject, and the data subject shall be entitled to receive compensation, for any material or non-material damages the data exporter or the data importer (or its sub-processor) causes the data subject by breaching the third-party beneficiary rights under these Clauses. This is without prejudice to the liability of the data exporter and, where the data exporter is a processor acting on behalf of a controller, to the liability of the controller under Regulation (EU) 2016/679 or Regulation (EU) 2018/1725, as applicable. (d) The Parties agree that if the data exporter is held liable under paragraph (c) for damages caused by the data importer (or its sub-processor), it shall be entitled to claim back from the data importer that part of the compensation corresponding to the data importer's responsibility for the damage. (e) Where more than one Party is responsible for any damage caused to the data subject as a result of a breach of these Clauses, all responsible Parties shall be jointly and severally liable and the data subject is entitled to bring an action in court against any of these Parties. (f) The Parties agree that if one Party is held liable under paragraph (e), it shall be entitled to claim back from the other Party/ies that part of the compensation corresponding to its/their responsibility for the damage. (g) The data importer may not invoke the conduct of a sub-processor to avoid its own liability. Clause 13 Supervision (a) Where the data exporter is established in an EU Member State: The supervisory authority with responsibility for ensuring compliance by the data exporter with Regulation (EU) 2016/679 as regards the data transfer, as indicated in Annex I.C, shall act as competent supervisory authority. Where the data exporter is not established in an EU Member State, but falls within the territorial scope of application of Regulation (EU) 2016/679 in accordance with its Article 3(2) and has appointed a representative pursuant to Article 27(1) of Regulation (EU) 2016/679: The supervisory authority of the Member State in which the representative within the meaning of Article 27(1) of Regulation (EU) 2016/679 is established, as indicated in Annex I.C, shall act as competent supervisory authority. Where the data exporter is not established in an EU Member State, but falls within the territorial scope of application of Regulation (EU) 2016/679 in accordance with its Article 3(2) without however having to appoint a representative pursuant to Article 27(2) of Regulation (EU) 2016/679: The supervisory authority of one of the Member States in which the data subjects whose personal data is transferred under these Clauses in relation to the offering of goods or services to them, or whose behaviour is monitored, are located, as indicated in Annex I.C, shall act as competent supervisory authority. (b) The data importer agrees to submit itself to the jurisdiction of and cooperate with the competent supervisory authority in any procedures aimed at ensuring compliance with these Clauses. In particular, the data importer agrees to respond to enquiries, submit to audits and comply with the measures adopted by the supervisory authority, including remedial and compensatory measures. It shall provide the supervisory authority with written confirmation that the necessary actions have been taken. SECTION III - LOCAL LAWS AND OBLIGATIONS IN CASE OF ACCESS BY PUBLIC AUTHORITIES Clause 14 Local laws and practices affecting compliance with the Clauses (a) The Parties warrant that they have no reason to believe that the laws and practices in the third country of destination applicable to the processing of the personal data by the data importer, including any requirements to disclose personal data or measures authorising access by public authorities, prevent the data importer from fulfilling its obligations under these Clauses. This is based on the understanding that laws and practices that respect the essence of the fundamental rights and freedoms and do not exceed what is necessary and proportionate in a democratic society to safeguard one of the objectives listed in Article 23(1) of Regulation (EU) 2016/679, are not in contradiction with these Clauses. (b) The Parties declare that in providing the warranty in paragraph (a), they have taken due account in particular of the following elements: (i) the specific circumstances of the transfer, including the length of the processing chain, the number of actors involved and the transmission channels used; intended onward transfers; the type of recipient; the purpose of processing; the categories and format of the transferred personal data; the economic sector in which the transfer occurs; the storage location of the data transferred; (ii) the laws and practices of the third country of destination- including those requiring the disclosure of data to public authorities or authorising access by such authorities - relevant in light of the specific circumstances of the transfer, and the applicable limitations and safeguards; (iii) any relevant contractual, technical or organisational safeguards put in place to supplement the safeguards under these Clauses, including measures applied during transmission and to the processing of the personal data in the country of destination. (c) The data importer warrants that, in carrying out the assessment under paragraph (b), it has made its best efforts to provide the data exporter with relevant information and agrees that it will continue to cooperate with the data exporter in ensuring compliance with these Clauses. (d) The Parties agree to document the assessment under paragraph (b) and make it available to the competent supervisory authority on request. (e) The data importer agrees to notify the data exporter promptly if, after having agreed to these Clauses and for the duration of the contract, it has reason to believe that it is or has become subject to laws or practices not in line with the requirements under paragraph (a), including following a change in the laws of the third country or a measure (such as a disclosure request) indicating an application of such laws in practice that is not in line with the requirements in paragraph (a). (f) Following a notification pursuant to paragraph (e), or if the data exporter otherwise has reason to believe that the data importer can no longer fulfil its obligations under these Clauses, the data exporter shall promptly identify appropriate measures (e.g. technical or organisational measures to ensure security and confidentiality) to be adopted by the data exporter and/or data importer to address the situation. The data exporter shall suspend the data transfer if it considers that no appropriate safeguards for such transfer can be ensured, or if instructed by the competent supervisory authority to do so. In this case, the data exporter shall be entitled to terminate the contract, insofar as it concerns the processing of personal data under these Clauses. If the contract involves more than two Parties, the data exporter may exercise this right to termination only with respect to the relevant Party, unless the Parties have agreed otherwise. Where the contract is terminated pursuant to this Clause, Clause 16(d) and (e) shall apply. Clause 15 Obligations of the data importer in case of access by public authorities 15.1 Notification (a) The data importer agrees to notify the data exporter and, where possible, the data subject promptly (if necessary with the help of the data exporter) if it: (i) receives a legally binding request from a public authority, including judicial authorities, under the laws of the country of destination for the disclosure of personal data transferred pursuant to these Clauses; such notification shall include information about the personal data requested, the requesting authority, the legal basis for the request and the response provided; or (ii) becomes aware of any direct access by public authorities to personal data transferred pursuant to these Clauses in accordance with the laws of the country of destination; such notification shall include all information available to the importer. (b) If the data importer is prohibited from notifying the data exporter and/or the data subject under the laws of the country of destination, the data importer agrees to use its best efforts to obtain a waiver of the prohibition, with a view to communicating as much information as possible, as soon as possible. The data importer agrees to document its best efforts in order to be able to demonstrate them on request of the data exporter. (c) Where permissible under the laws of the country of destination, the data importer agrees to provide the data exporter, at regular intervals for the duration of the contract, with as much relevant information as possible on the requests received (in particular, number of requests, type of data requested, requesting authority/ies, whether requests have been challenged and the outcome of such challenges, etc.). (d) The data importer agrees to preserve the information pursuant to paragraphs (a) to (c) for the duration of the contract and make it available to the competent supervisory authority on request. (e) Paragraphs (a) to (c) are without prejudice to the obligation of the data importer pursuant to Clause 14(e) and Clause 16 to inform the data exporter promptly where it is unable to comply with these Clauses. 15.2 Review of legality and data minimisation (a) The data importer agrees to review the legality of the request for disclosure, in particular whether it remains within the powers granted to the requesting public authority, and to challenge the request if, after careful assessment, it concludes that there are reasonable grounds to consider that the request is unlawful under the laws of the country of destination, applicable obligations under international law and principles of international comity. The data importer shall, under the same conditions, pursue possibilities of appeal. When challenging a request, the data importer shall seek interim measures with a view to suspending the effects of the request until the competent judicial authority has decided on its merits. It shall not disclose the personal data requested until required to do so under the applicable procedural rules. These requirements are without prejudice to the obligations of the data importer under Clause 14(e). (b) The data importer agrees to document its legal assessment and any challenge to the request for disclosure and, to the extent permissible under the laws of the country of destination, make the documentation available to the data exporter. It shall also make it available to the competent supervisory authority on request. (c) The data importer agrees to provide the minimum amount of information permissible when responding to a request for disclosure, based on a reasonable interpretation of the request. SECTION IV - FINAL PROVISIONS Clause 16 Non-compliance with the Clauses and termination (a) The data importer shall promptly inform the data exporter if it is unable to comply with these Clauses, for whatever reason. (b) In the event that the data importer is in breach of these Clauses or unable to comply with these Clauses, the data exporter shall suspend the transfer of personal data to the data importer until compliance is again ensured or the contract is terminated. This is without prejudice to Clause 14(f). (c) The data exporter shall be entitled to terminate the contract, insofar as it concerns the processing of personal data under these Clauses, where: (i) the data exporter has suspended the transfer of personal data to the data importer pursuant to paragraph (b) and compliance with these Clauses is not restored within a reasonable time and in any event within one month of suspension; (ii) the data importer is in substantial or persistent breach of these Clauses; or (iii) the data importer fails to comply with a binding decision of a competent court or supervisory authority regarding its obligations under these Clauses. In these cases, it shall inform the competent supervisory authority of such non-compliance. Where the contract involves more than two Parties, the data exporter may exercise this right to termination only with respect to the relevant Party, unless the Parties have agreed otherwise. (d) Personal data that has been transferred prior to the termination of the contract pursuant to paragraph (c) shall at the choice of the data exporter immediately be returned to the data exporter or deleted in its entirety. The same shall apply to any copies of the data. The data importer shall certify the deletion of the data to the data exporter. Until the data is deleted or returned, the data importer shall continue to ensure compliance with these Clauses. In case of local laws applicable to the data importer that prohibit the return or deletion of the transferred personal data, the data importer warrants that it will continue to ensure compliance with these Clauses and will only process the data to the extent and for as long as required under that local law. (e) Either Party may revoke its agreement to be bound by these Clauses where (i) the European Commission adopts a decision pursuant to Article 45(3) of Regulation (EU) 2016/679 that covers the transfer of personal data to which these Clauses apply; or (ii) Regulation (EU) 2016/679 becomes part of the legal framework of the country to which the personal data is transferred. This is without prejudice to other obligations applying to the processing in question under Regulation (EU) 2016/679. Clause 17 Governing law These Clauses shall be governed by the law of one of the EU Member States, provided such law allows for third-party beneficiary rights. The Parties agree that this shall be the law of Ireland. Clause 18 Choice of forum and jurisdiction (a) Any dispute arising from these Clauses shall be resolved by the courts of an EU Member State. (b) The Parties agree that those shall be the courts of Dublin, Ireland. (c) A data subject may also bring legal proceedings against the data exporter and/or data importer before the courts of the Member State in which he/she has his/her habitual residence. (d) The Parties agree to submit themselves to the jurisdiction of such courts. APPENDIX ANNEX I A. LIST OF PARTIES **Data exporter(s):** **Name**: The entity identified as "Customer" in the DPA. **Address**: The address associated with the Customer. **Contact person's name, position and contact details**: The contact information associated with the Customer. **Activities relevant to the data transferred under these Clauses:** The activities specified in Section 3 of the DPA. **Signature and date**: By using the CoreWeave Services to transfer Processed Customer Data to a third country, the data exporter will be deemed to have assigned this Annex I. **Role (Controller/Processor)**: Controller **Data importer(s):** **Name:** "CoreWeave" as identified in the DPA. **Address**: The address associated with CoreWeave. **Contact person's name, position and contact details**: The contact information associated with CoreWeave. **Activities relevant to the data transferred under these Clauses:** The activities specified in Section 3 of the DPA. **Signature and date**: By transferring Processed Customer Data to a third country based on Customer's instructions, the data importer will be deemed to have assigned this Annex I. **Role (Controller/Processor)**: Processor B. DESCRIPTION OF TRANSFER **Categories of data subjects:** As described in Section 3 of the DPA. **Categories of personal data:** As described in Section 3 of the DPA. **Sensitive data transferred (if applicable) and applied restrictions or safeguards:** The data exporter might include sensitive personal data in the Processed Customer Data. **The frequency of the transfer:** In accordance with Customer's instructions. **Nature of the processing:** As described in Section 3 of the DPA. **Purpose(s) of the data transfer and further processing:** To provide the CoreWeave Services. **The period for which the personal data will be retained:** The data exporter determines the duration of processing in accordance with the terms of Section 3 of the DPA. **Sub-processor transfer details:** As described in Section 4 of the DPA. C. COMPETENT SUPERVISORY AUTHORITY **Identify the competent supervisory authority/ies:** Determined in accordance with the GDPR. ANNEX II TECHNICAL AND ORGANISATIONAL MEASURES INCLUDING TECHNICAL AND ORGANISATIONAL MEASURES TO ENSURE THE SECURITY OF THE DATA **Description of the technical and organisational measures implemented by the data importer(s) (including any relevant certifications) to ensure an appropriate level of security, taking into account the nature, scope, context and purpose of the processing, and the risks for the rights and freedoms of natural persons.** Upon Customer's written request, documentation outlining CoreWeave's technical and organizational measures and copies of relevant certifications are provided to Customer, as described in the DPA. **For transfers to (sub-) processors, also describe the specific technical and organisational measures to be taken by the (sub-) processor to be able to provide assistance to the controller and, for transfers from a processor to a sub-processor, to the data exporter**. The technical and organisational measures that CoreWeave imposes on sub-processors are described in the DPA. ## Attachment II -- Processor to Processor SCCs Standard Contractual ClausesProcessor to Processor SECTION I Clause 1 Purpose and scope (a) The purpose of these standard contractual clauses is to ensure compliance with the requirements of Regulation (EU) 2016/679 of the European Parliament and of the Council of 27 April 2016 on the protection of natural persons with regard to the processing of personal data and on the free movement of such data (General Data Protection Regulation) for the transfer of personal data to a third country. (b) The Parties: (i) the natural or legal person(s), public authority/ies, agency/ies or other body/ies (hereinafter 'entity/ies') transferring the personal data, as listed in Annex I.A (hereinafter each 'data exporter'), and (ii) the entity/ies in a third country receiving the personal data from the data exporter, directly or indirectly via another entity also Party to these Clauses, as listed in Annex I.A (hereinafter each 'data importer') have agreed to these standard contractual clauses (hereinafter: 'Clauses'). (c) These Clauses apply with respect to the transfer of personal data as specified in Annex I.B. (d) The Appendix to these Clauses containing the Annexes referred to therein forms an integral part of these Clauses. Clause 2 Effect and invariability of the Clauses (a) These Clauses set out appropriate safeguards, including enforceable data subject rights and effective legal remedies, pursuant to Article 46(1) and Article 46(2)(c) of Regulation (EU) 2016/679 and, with respect to data transfers from controllers to processors and/or processors to processors, standard contractual clauses pursuant to Article 28(7) of Regulation (EU) 2016/679, provided they are not modified, except to select the appropriate Module(s) or to add or update information in the Appendix. This does not prevent the Parties from including the standard contractual clauses laid down in these Clauses in a wider contract and/or to add other clauses or additional safeguards, provided that they do not contradict, directly or indirectly, these Clauses or prejudice the fundamental rights or freedoms of data subjects. (b) These Clauses are without prejudice to obligations to which the data exporter is subject by virtue of Regulation (EU) 2016/679. Clause 3 Third-party beneficiaries (a) Data subjects may invoke and enforce these Clauses, as third-party beneficiaries, against the data exporter and/or data importer, with the following exceptions:\ (i) Clause 1, Clause 2, Clause 3, Clause 6, Clause 7;\ (ii) Clause 8.1(a), (c) and (d) and Clause 8.9(a), (c), (d), (e), (f) and (g);\ (iii) Clause 9(a), (c), (d) and (e);\ (iv) Clause 12(a), (d) and (f);\ (v) Clause 13;\ (vi) Clause 15.1(e), (d) and (e);\ (vii) Clause 16(e);\ (viii) Clause 18(a) and (b).\ (b) Paragraph (a) is without prejudice to rights of data subjects under Regulation (EU) 2016/679. Clause 4 Interpretation (a) Where these Clauses use terms that are defined in Regulation (EU) 2016/679, those terms shall have the same meaning as in that Regulation. (b) These Clauses shall be read and interpreted in the light of the provisions of Regulation (EU) 2016/679. (c) These Clauses shall not be interpreted in a way that conflicts with rights and obligations provided for in Regulation (EU) 2016/679. Clause 5 Hierarchy In the event of a contradiction between these Clauses and the provisions of related agreements between the Parties, existing at the time these Clauses are agreed or entered into thereafter, these Clauses shall prevail. Clause 6 Description of the transfer(s) The details of the transfer(s), and in particular the categories of personal data that are transferred and the purpose(s) for which they are transferred, are specified in Annex I.B. Clause 7 Docking clause (a) An entity that is not a Party to these Clauses may, with the agreement of the Parties, accede to these Clauses at any time, either as a data exporter or as a data importer, by completing the Appendix and signing Annex I.A. (b) Once it has completed the Appendix and signed Annex I.A, the acceding entity shall become a Party to these Clauses and have the rights and obligations of a data exporter or data importer in accordance with its designation in Annex I.A. (c) The acceding entity shall have no rights or obligations arising under these Clauses from the period prior to becoming a Party. SECTION II - OBLIGATIONS OF THE PARTIES Clause 8 Data protection safeguards The data exporter warrants that it has used reasonable efforts to determine that the data importer is able, through the implementation of appropriate technical and organisational measures, to satisfy its obligations under these Clauses. 8.1 Instructions (a) The data exporter has informed the data importer that it acts as processor under the instructions of its controller(s), which the data exporter shall make available to the data importer prior to processing. (b) The data importer shall process the personal data only on documented instructions from the controller, as communicated to the data importer by the data exporter, and any additional documented instructions from the data exporter. Such additional instructions shall not conflict with the instructions from the controller. The controller or data exporter may give further documented instructions regarding the data processing throughout the duration of the contract. (c) The data importer shall immediately inform the data exporter if it is unable to follow those instructions. Where the data importer is unable to follow the instructions from the controller, the data exporter shall immediately notify the controller. (d) The data exporter warrants that it has imposed the same data protection obligations on the data importer as set out in the contract or other legal act under Union or Member State law between the controller and the data exporter. 8.2 Purpose limitation The data importer shall process the personal data only for the specific purpose(s) of the transfer, as set out in Annex I.B., unless on further instructions from the controller, as communicated to the data importer by the data exporter, or from the data exporter. 8.3 Transparency On request, the data exporter shall make a copy of these Clauses, including the Appendix as completed by the Parties, available to the data subject free of charge. To the extent necessary to protect business secrets or other confidential information, including personal data, the data exporter may redact part of the text of the Appendix prior to sharing a copy, but shall provide a meaningful summary where the data subject would otherwise not be able to understand its content or exercise his/her rights. On request, the Parties shall provide the data subject with the reasons for the redactions, to the extent possible without revealing the redacted information. 8.4 Accuracy If the data importer becomes aware that the personal data it has received is inaccurate, or has become outdated, it shall inform the data exporter without undue delay. In this case, the data importer shall cooperate with the data exporter to rectify or erase the data. 8.5 Duration of processing and erasure or return of data Processing by the data importer shall only take place for the duration specified in Annex I.B. After the end of the provision of the processing services, the data importer shall, at the choice of the data exporter, delete all personal data processed on behalf of the controller and certify to the data exporter that it has done so, or return to the data exporter all personal data processed on its behalf and delete existing copies. Until the data is deleted or returned, the data importer shall continue to ensure compliance with these Clauses. In case of local laws applicable to the data importer that prohibit return or deletion of the personal data, the data importer warrants that it will continue to ensure compliance with these Clauses and will only process it to the extent and for as long as required under that local law. This is without prejudice to Clause 14, in particular the requirement for the data importer under Clause 14(e) to notify the data exporter throughout the duration of the contract if it has reason to believe that it is or has become subject to laws or practices not in line with the requirements under Clause 14(a). 8.6 Security of processing (a) The data importer and, during transmission, also the data exporter shall implement appropriate technical and organisational measures to ensure the security of the data, including protection against a breach of security leading to accidental or unlawful destruction, loss, alteration, unauthorised disclosure or access to that data (hereinafter 'personal data breach'). In assessing the appropriate level of security, they shall take due account of the state of the art, the costs of implementation, the nature, scope, context and purpose(s) of processing and the risks involved in the processing for the data subject. The Parties shall in particular consider having recourse to encryption or pseudonymisation, including during transmission, where the purpose of processing can be fulfilled in that manner. In case of pseudonymisation, the additional information for attributing the personal data to a specific data subject shall, where possible, remain under the exclusive control of the data exporter or the controller. In complying with its obligations under this paragraph, the data importer shall at least implement the technical and organisational measures specified in Annex II. The data importer shall carry out regular checks to ensure that these measures continue to provide an appropriate level of security. (b) The data importer shall grant access to the data to members of its personnel only to the extent strictly necessary for the implementation, management and monitoring of the contract. It shall ensure that persons authorised to process the personal data have committed themselves to confidentiality or are under an appropriate statutory obligation of confidentiality. (c) In the event of a personal data breach concerning personal data processed by the data importer under these Clauses, the data importer shall take appropriate measures to address the breach, including measures to mitigate its adverse effects. The data importer shall also notify, without undue delay, the data exporter and, where appropriate and feasible, the controller after having become aware of the breach. Such notification shall contain the details of a contact point where more information can be obtained, a description of the nature of the breach (including, where possible, categories and approximate number of data subjects and personal data records concerned), its likely consequences and the measures taken or proposed to address the data breach, including measures to mitigate its possible adverse effects. Where, and in so far as, it is not possible to provide all information at the same time, the initial notification shall contain the information then available and further information shall, as it becomes available, subsequently be provided without undue delay. (d) The data importer shall cooperate with and assist the data exporter to enable the data exporter to comply with its obligations under Regulation (EU) 2016/679, in particular to notify its controller so that the latter may in turn notify the competent supervisory authority and the affected data subjects, taking into account the nature of processing and the information available to the data importer. 8.7 Sensitive data Where the transfer involves personal data revealing racial or ethnic origin, political opinions, religious or philosophical beliefs, or trade union membership, genetic data, or biometric data for the purpose of uniquely identifying a natural person, data concerning health or a person's sex life or sexual orientation, or data relating to criminal convictions and offences (hereinafter 'sensitive data'), the data importer shall apply the specific restrictions and/or additional safeguards set out in Annex I.B. 8.8 Onward transfers The data importer shall only disclose the personal data to a third party on documented instructions from the controller, as communicated to the data importer by the data exporter. In addition, the data may only be disclosed to a third party located outside the European Union (in the same country as the data importer or in another third country, hereinafter 'onward transfer') if the third party is or agrees to be bound by these Clauses, under the appropriate Module, or if: (i) the onward transfer is to a country benefitting from an adequacy decision pursuant to Article 45 of Regulation (EU) 2016/679 that covers the onward transfer; (ii) the third party otherwise ensures appropriate safeguards pursuant to Articles 46 or 47 of Regulation (EU) 2016/679; (iii) the onward transfer is necessary for the establishment, exercise or defence of legal claims in the context of specific administrative, regulatory or judicial proceedings; or (iv) the onward transfer is necessary in order to protect the vital interests of the data subject or of another natural person. Any onward transfer is subject to compliance by the data importer with all the other safeguards under these Clauses, in particular purpose limitation. 8.9 Documentation and compliance (a) The data importer shall promptly and adequately deal with enquiries from the data exporter or the controller that relate to the processing under these Clauses. (b) The Parties shall be able to demonstrate compliance with these Clauses. In particular, the data importer shall keep appropriate documentation on the processing activities carried out on behalf of the controller. (c) The data importer shall make all information necessary to demonstrate compliance with the obligations set out in these Clauses available to the data exporter, which shall provide it to the controller. (d) The data importer shall allow for and contribute to audits by the data exporter of the processing activities covered by these Clauses, at reasonable intervals or if there are indications of non-compliance. The same shall apply where the data exporter requests an audit on instructions of the controller. In deciding on an audit, the data exporter may take into account relevant certifications held by the data importer. (e) Where the audit is carried out on the instructions of the controller, the data exporter shall make the results available to the controller. (f) The data exporter may choose to conduct the audit by itself or mandate an independent auditor. Audits may include inspections at the premises or physical facilities of the data importer and shall, where appropriate, be carried out with reasonable notice. (g) The Parties shall make the information referred to in paragraphs (b) and (c), including the results of any audits, available to the competent supervisory authority on request. Clause 9 Use of sub-processors (a) The data importer has the controller's general authorisation for the engagement of sub-processor(s) from an agreed list. The data importer shall specifically inform the controller in writing of any intended changes to that list through the addition or replacement of sub-processors at least 30 days in advance, thereby giving the controller sufficient time to be able to object to such changes prior to the engagement of the sub-processor(s). The data importer shall provide the controller with the information necessary to enable the controller to exercise its right to object. The data importer shall inform the data exporter of the engagement of the sub-processor(s). (b) Where the data importer engages a sub-processor to carry out specific processing activities (on behalf of the controller), it shall do so by way of a written contract that provides for, in substance, the same data protection obligations as those binding the data importer under these Clauses, including in terms of third-party beneficiary rights for data subjects. The Parties agree that, by complying with this Clause, the data importer fulfils its obligations under Clause 8.8. The data importer shall ensure that the sub-processor complies with the obligations to which the data importer is subject pursuant to these Clauses. (c) The data importer shall provide, at the data exporter's or controller's request, a copy of such a sub-processor agreement and any subsequent amendments. To the extent necessary to protect business secrets or other confidential information, including personal data, the data importer may redact the text of the agreement prior to sharing a copy. (d) The data importer shall remain fully responsible to the data exporter for the performance of the sub-processor's obligations under its contract with the data importer. The data importer shall notify the data exporter of any failure by the sub-processor to fulfil its obligations under that contract. (e) The data importer shall agree a third-party beneficiary clause with the sub-processor whereby - in the event the data importer has factually disappeared, ceased to exist in law or has become insolvent - the data exporter shall have the right to terminate the sub-processor contract and to instruct the sub-processor to erase or return the personal data. Clause 10 Data subject rights (a) The data importer shall promptly notify the data exporter and, where appropriate, the controller of any request it has received from a data subject, without responding to that request unless it has been authorised to do so by the controller. (b) The data importer shall assist, where appropriate in cooperation with the data exporter, the controller in fulfilling its obligations to respond to data subjects' requests for the exercise of their rights under Regulation (EU) 2016/679 or Regulation (EU) 2018/1725, as applicable. In this regard, the Parties shall set out in Annex II the appropriate technical and organisational measures, taking into account the nature of the processing, by which the assistance shall be provided, as well as the scope and the extent of the assistance required. (c) In fulfilling its obligations under paragraphs (a) and (b), the data importer shall comply with the instructions from the controller, as communicated by the data exporter. Clause 11 Redress (a) The data importer shall inform data subjects in a transparent and easily accessible format, through individual notice or on its website, of a contact point authorised to handle complaints. It shall deal promptly with any complaints it receives from a data subject. (b) In case of a dispute between a data subject and one of the Parties as regards compliance with these Clauses, that Party shall use its best efforts to resolve the issue amicably in a timely fashion. The Parties shall keep each other informed about such disputes and, where appropriate, cooperate in resolving them. (c) Where the data subject invokes a third-party beneficiary right pursuant to Clause 3, the data importer shall accept the decision of the data subject to: (i) lodge a complaint with the supervisory authority in the Member State of his/her habitual residence or place of work, or the competent supervisory authority pursuant to Clause 13; (ii) refer the dispute to the competent courts within the meaning of Clause 18. (d) The Parties accept that the data subject may be represented by a not-for-profit body, organisation or association under the conditions set out in Article 80(1) of Regulation (EU) 2016/679. (e) The data importer shall abide by a decision that is binding under the applicable EU or Member State law. (f) The data importer agrees that the choice made by the data subject will not prejudice his/her substantive and procedural rights to seek remedies in accordance with applicable laws. Clause 12 Liability (a) Each Party shall be liable to the other Party/ies for any damages it causes the other Party/ies by any breach of these Clauses. (b) The data importer shall be liable to the data subject, and the data subject shall be entitled to receive compensation, for any material or non-material damages the data importer or its sub-processor causes the data subject by breaching the third-party beneficiary rights under these Clauses. (c) Notwithstanding paragraph (b), the data exporter shall be liable to the data subject, and the data subject shall be entitled to receive compensation, for any material or non-material damages the data exporter or the data importer (or its sub-processor) causes the data subject by breaching the third-party beneficiary rights under these Clauses. This is without prejudice to the liability of the data exporter and, where the data exporter is a processor acting on behalf of a controller, to the liability of the controller under Regulation (EU) 2016/679 or Regulation (EU) 2018/1725, as applicable. (d) The Parties agree that if the data exporter is held liable under paragraph (c) for damages caused by the data importer (or its sub-processor), it shall be entitled to claim back from the data importer that part of the compensation corresponding to the data importer's responsibility for the damage. (e) Where more than one Party is responsible for any damage caused to the data subject as a result of a breach of these Clauses, all responsible Parties shall be jointly and severally liable and the data subject is entitled to bring an action in court against any of these Parties. (f) The Parties agree that if one Party is held liable under paragraph (e), it shall be entitled to claim back from the other Party/ies that part of the compensation corresponding to its/their responsibility for the damage. (g) The data importer may not invoke the conduct of a sub-processor to avoid its own liability. Clause 13 Supervision (a) Where the data exporter is established in an EU Member State: The supervisory authority with responsibility for ensuring compliance by the data exporter with Regulation (EU) 2016/679 as regards the data transfer, as indicated in Annex I.C, shall act as competent supervisory authority. Where the data exporter is not established in an EU Member State, but falls within the territorial scope of application of Regulation (EU) 2016/679 in accordance with its Article 3(2) and has appointed a representative pursuant to Article 27(1) of Regulation (EU) 2016/679: The supervisory authority of the Member State in which the representative within the meaning of Article 27(1) of Regulation (EU) 2016/679 is established, as indicated in Annex I.C, shall act as competent supervisory authority. Where the data exporter is not established in an EU Member State, but falls within the territorial scope of application of Regulation (EU) 2016/679 in accordance with its Article 3(2) without however having to appoint a representative pursuant to Article 27(2) of Regulation (EU) 2016/679: The supervisory authority of one of the Member States in which the data subjects whose personal data is transferred under these Clauses in relation to the offering of goods or services to them, or whose behaviour is monitored, are located, as indicated in Annex I.C, shall act as competent supervisory authority. (b) The data importer agrees to submit itself to the jurisdiction of and cooperate with the competent supervisory authority in any procedures aimed at ensuring compliance with these Clauses. In particular, the data importer agrees to respond to enquiries, submit to audits and comply with the measures adopted by the supervisory authority, including remedial and compensatory measures. It shall provide the supervisory authority with written confirmation that the necessary actions have been taken. SECTION III - LOCAL LAWS AND OBLIGATIONS IN CASE OF ACCESS BY PUBLIC AUTHORITIES Clause 14 Local laws and practices affecting compliance with the Clauses (a) The Parties warrant that they have no reason to believe that the laws and practices in the third country of destination applicable to the processing of the personal data by the data importer, including any requirements to disclose personal data or measures authorising access by public authorities, prevent the data importer from fulfilling its obligations under these Clauses. This is based on the understanding that laws and practices that respect the essence of the fundamental rights and freedoms and do not exceed what is necessary and proportionate in a democratic society to safeguard one of the objectives listed in Article 23(1) of Regulation (EU) 2016/679, are not in contradiction with these Clauses. (b) The Parties declare that in providing the warranty in paragraph (a), they have taken due account in particular of the following elements: (i) the specific circumstances of the transfer, including the length of the processing chain, the number of actors involved and the transmission channels used; intended onward transfers; the type of recipient; the purpose of processing; the categories and format of the transferred personal data; the economic sector in which the transfer occurs; the storage location of the data transferred; (ii) the laws and practices of the third country of destination- including those requiring the disclosure of data to public authorities or authorising access by such authorities - relevant in light of the specific circumstances of the transfer, and the applicable limitations and safeguards; (iii) any relevant contractual, technical or organisational safeguards put in place to supplement the safeguards under these Clauses, including measures applied during transmission and to the processing of the personal data in the country of destination. (c) The data importer warrants that, in carrying out the assessment under paragraph (b), it has made its best efforts to provide the data exporter with relevant information and agrees that it will continue to cooperate with the data exporter in ensuring compliance with these Clauses. (d) The Parties agree to document the assessment under paragraph (b) and make it available to the competent supervisory authority on request. (e) The data importer agrees to notify the data exporter promptly if, after having agreed to these Clauses and for the duration of the contract, it has reason to believe that it is or has become subject to laws or practices not in line with the requirements under paragraph (a), including following a change in the laws of the third country or a measure (such as a disclosure request) indicating an application of such laws in practice that is not in line with the requirements in paragraph (a). The data exporter shall forward the notification to the controller. (f) Following a notification pursuant to paragraph (e), or if the data exporter otherwise has reason to believe that the data importer can no longer fulfil its obligations under these Clauses, the data exporter shall promptly identify appropriate measures (e.g. technical or organisational measures to ensure security and confidentiality) to be adopted by the data exporter and/or data importer to address the situation, if appropriate in consultation with the controller. The data exporter shall suspend the data transfer if it considers that no appropriate safeguards for such transfer can be ensured, or if instructed by the controller or the competent supervisory authority to do so. In this case, the data exporter shall be entitled to terminate the contract, insofar as it concerns the processing of personal data under these Clauses. If the contract involves more than two Parties, the data exporter may exercise this right to termination only with respect to the relevant Party, unless the Parties have agreed otherwise. Where the contract is terminated pursuant to this Clause, Clause 16(d) and (e) shall apply. Clause 15 Obligations of the data importer in case of access by public authorities 15.1 Notification (a) The data importer agrees to notify the data exporter and, where possible, the data subject promptly (if necessary with the help of the data exporter) if it: (i) receives a legally binding request from a public authority, including judicial authorities, under the laws of the country of destination for the disclosure of personal data transferred pursuant to these Clauses; such notification shall include information about the personal data requested, the requesting authority, the legal basis for the request and the response provided; or (ii) becomes aware of any direct access by public authorities to personal data transferred pursuant to these Clauses in accordance with the laws of the country of destination; such notification shall include all information available to the importer. The data exporter shall forward the notification to the controller. (b) If the data importer is prohibited from notifying the data exporter and/or the data subject under the laws of the country of destination, the data importer agrees to use its best efforts to obtain a waiver of the prohibition, with a view to communicating as much information as possible, as soon as possible. The data importer agrees to document its best efforts in order to be able to demonstrate them on request of the data exporter. (c) Where permissible under the laws of the country of destination, the data importer agrees to provide the data exporter, at regular intervals for the duration of the contract, with as much relevant information as possible on the requests received (in particular, number of requests, type of data requested, requesting authority/ies, whether requests have been challenged and the outcome of such challenges, etc.). The data exporter shall forward the information to the controller. (d) The data importer agrees to preserve the information pursuant to paragraphs (a) to (c) for the duration of the contract and make it available to the competent supervisory authority on request. (e) Paragraphs (a) to (c) are without prejudice to the obligation of the data importer pursuant to Clause 14(e) and Clause 16 to inform the data exporter promptly where it is unable to comply with these Clauses. 15.2 Review of legality and data minimization (a) The data importer agrees to review the legality of the request for disclosure, in particular whether it remains within the powers granted to the requesting public authority, and to challenge the request if, after careful assessment, it concludes that there are reasonable grounds to consider that the request is unlawful under the laws of the country of destination, applicable obligations under international law and principles of international comity. The data importer shall, under the same conditions, pursue possibilities of appeal. When challenging a request, the data importer shall seek interim measures with a view to suspending the effects of the request until the competent judicial authority has decided on its merits. It shall not disclose the personal data requested until required to do so under the applicable procedural rules. These requirements are without prejudice to the obligations of the data importer under Clause 14(e). (b) The data importer agrees to document its legal assessment and any challenge to the request for disclosure and, to the extent permissible under the laws of the country of destination, make the documentation available to the data exporter. It shall also make it available to the competent supervisory authority on request. The data exporter shall make the assessment available to the controller. (c) The data importer agrees to provide the minimum amount of information permissible when responding to a request for disclosure, based on a reasonable interpretation of the request. SECTION IV - FINAL PROVISIONS Clause 16 Non-compliance with the Clauses and termination (a) The data importer shall promptly inform the data exporter if it is unable to comply with these Clauses, for whatever reason. (b) In the event that the data importer is in breach of these Clauses or unable to comply with these Clauses, the data exporter shall suspend the transfer of personal data to the data importer until compliance is again ensured or the contract is terminated. This is without prejudice to Clause 14(f). (c) The data exporter shall be entitled to terminate the contract, insofar as it concerns the processing of personal data under these Clauses, where: (i) the data exporter has suspended the transfer of personal data to the data importer pursuant to paragraph (b) and compliance with these Clauses is not restored within a reasonable time and in any event within one month of suspension; (ii) the data importer is in substantial or persistent breach of these Clauses; or (iii) the data importer fails to comply with a binding decision of a competent court or supervisory authority regarding its obligations under these Clauses. In these cases, it shall inform the competent supervisory authority and the controller of such non-compliance. Where the contract involves more than two Parties, the data exporter may exercise this right to termination only with respect to the relevant Party, unless the Parties have agreed otherwise. (d) Personal data that has been transferred prior to the termination of the contract pursuant to paragraph (c) shall at the choice of the data exporter immediately be returned to the data exporter or deleted in its entirety. The same shall apply to any copies of the data. The data importer shall certify the deletion of the data to the data exporter. Until the data is deleted or returned, the data importer shall continue to ensure compliance with these Clauses. In case of local laws applicable to the data importer that prohibit the return or deletion of the transferred personal data, the data importer warrants that it will continue to ensure compliance with these Clauses and will only process the data to the extent and for as long as required under that local law. (e) Either Party may revoke its agreement to be bound by these Clauses where (i) the European Commission adopts a decision pursuant to Article 45(3) of Regulation (EU) 2016/679 that covers the transfer of personal data to which these Clauses apply; or (ii) Regulation (EU) 2016/679 becomes part of the legal framework of the country to which the personal data is transferred. This is without prejudice to other obligations applying to the processing in question under Regulation (EU) 2016/679. Clause 17 Governing law These Clauses shall be governed by the law of one of the EU Member States, provided such law allows for third-party beneficiary rights. The Parties agree that this shall be the law of Ireland. Clause 18 Choice of forum and jurisdiction (a) Any dispute arising from these Clauses shall be resolved by the courts of an EU Member State. (b) The Parties agree that those shall be the courts of Dublin, Ireland. (c) A data subject may also bring legal proceedings against the data exporter and/or data importer before the courts of the Member State in which he/she has his/her habitual residence. (d) The Parties agree to submit themselves to the jurisdiction of such courts. APPENDIX ANNEX I A. LIST OF PARTIES **Data exporter(s):** **Name**: The entity identified as "Customer" in the DPA. **Address**: The address associated with the Customer. **Contact person's name, position and contact details**: The contact information associated with the Customer. **Activities relevant to the data transferred under these Clauses:** The activities specified in Section 3 of the DPA. **Signature and date**: By using the CoreWeave Services to transfer Processed Customer Data to a third country, the data exporter will be deemed to have assigned this Annex I. **Role (Controller/Processor)**: Processor **Data importer(s):** **Name:** "CoreWeave" as identified in the DPA. **Address**: The address associated with CoreWeave. **Contact person's name, position and contact details**: The contact information associated with CoreWeave. **Activities relevant to the data transferred under these Clauses:** The activities specified in Section 3 of the DPA. **Signature and date**: By transferring Processed Customer Data to a third country based on Customer's instructions, the data importer will be deemed to have assigned this Annex I. **Role (Controller/Processor)**: Processor B. DESCRIPTION OF TRANSFER **Categories of data subjects:** As described in Section 3 of the DPA. **Categories of personal data:** As described in Section 3 of the DPA. **Sensitive data transferred (if applicable) and applied restrictions or safeguards:** The data exporter might include sensitive personal data in the Processed Customer Data. **The frequency of the transfer:** In accordance with Customer's instructions. **Nature of the processing:** As described in Section 3 of the DPA. **Purpose(s) of the data transfer and further processing:** To provide the CoreWeave Services. **The period for which the personal data will be retained:** The data exporter determines the duration of processing in accordance with the terms of Section 3 of the DPA. **Sub-processor transfer details:** As described in Section 4 of the DPA. C. COMPETENT SUPERVISORY AUTHORITY **Identify the competent supervisory authority/ies:** Determined in accordance with the GDPR. ANNEX II TECHNICAL AND ORGANISATIONAL MEASURES INCLUDING TECHNICAL AND ORGANISATIONAL MEASURES TO ENSURE THE SECURITY OF THE DATA **Description of the technical and organisational measures implemented by the data importer(s) (including any relevant certifications) to ensure an appropriate level of security, taking into account the nature, scope, context and purpose of the processing, and the risks for the rights and freedoms of natural persons.** Upon Customer's written request, documentation outlining CoreWeave's technical and organizational measures and copies of relevant certifications are provided to Customer, as described in the DPA. **For transfers to (sub-) processors, also describe the specific technical and organisational measures to be taken by the (sub-) processor to be able to provide assistance to the controller and, for transfers from a processor to a sub-processor, to the data exporter**. The technical and organisational measures that CoreWeave imposes on sub-processors are described in the DPA. # Maintenance Policy Source: https://docs.coreweave.com/policies/terms-of-service/maintenance-policy CoreWeave Cloud Maintenance and Notification Policy In our mission to provide reliable, resilient service while continuously adding new features and functionality to the CoreWeave Cloud platform, we adhere to the following policy to manage our platform upgrade and maintenance programs. This policy regarding both planned and unplanned upgrade and maintenance programs form a part of the CoreWeave Terms of Service (TOS). To be clear, CoreWeave may perform unplanned maintenance or service to the CoreWeave Cloud platform, at any time, in its sole discretion, without notice to CoreWeave Cloud users or public notifications. Circumstances that may require unplanned maintenance or service to the platform include, but are not limited to, service outages (internal or external) or identified issues or vulnerabilities that may put the platform service or our customers' services and/or data at risk. ## Notifications CoreWeave will take commercially reasonable efforts to make planned maintenance events known via its [https://status.coreweave.com](https://status.coreweave.com) dashboard. It is a user's responsibility to ensure they are subscribed to the status notifications relevant to their CoreWeave Cloud deployments. ## Critical Infrastructure Maintenance When performing planned maintenance that is deemed by CoreWeave as "critical" in nature, CoreWeave will provide, at a minimum, 24 hours' notice with a description of the event and any potential or expected impacts. For "critical" infrastructure maintenance events, notice will be posted to both the CoreWeave Cloud [https://status.coreweave.com](https://status.coreweave.com) dashboard, as well as via email to all users subscribed to receive CoreWeave Cloud status email alerts. For purposes of this notification policy, "critical" maintenance will generally be deemed to be any planned changes to components that substantially impact: * Kubernetes orchestration layer (API Servers, Scheduler, Storage) * CoreWeave Cloud API Gateway * Software Defined Networking (SDN) * Virtual Server orchestration These listed areas are deemed by CoreWeave to be critical to the general availability and operation of the CoreWeave Cloud platform. ## Course of Business Maintenance and Service Changes CoreWeave strives to continuously add new functionality, hardware, and reliability features to the CoreWeave Cloud platform to support our customers' ability to push the limits of technical creativity. With this continuously flowing pipeline of enhancements and upgrades, we take all appropriate precautions when deploying changes to the CoreWeave Cloud production environment, including, but not limited to, senior engineering architecture and code reviews and approvals, end-to-end test pipelines, and live-quality assurance testing in pre-production environments. CoreWeave will not provide notification for those enhancements and related maintenance that CoreWeave deems to be in the normal course of business of running the CoreWeave Cloud platform, but NOT "critical" under its Critical Infrastructure Maintenance policy. ## Subject to Change This Cloud Maintenance and Notification Policy is subject to change at any time without notice, in CoreWeave's sole discretion. # Privacy Policy Source: https://docs.coreweave.com/policies/terms-of-service/privacy-policy How CoreWeave collects, uses, discloses, and processes personal information across its platforms and services > [!NOTE] > > Last updated on February 24, 2026 This Privacy Policy describes how CoreWeave, Inc. and its affiliated entities ("**CoreWeave**," "**we**," "**our**" or "**us**") collect, use, disclose, and otherwise process information in connection with a customer's or user's use of or access to our websites ("**Sites**"), platforms, applications, services, and solutions (collectively, "**Services**"), or any other disclosure by an individual of information to CoreWeave through other means (for example, in person or through email or phone communications). When you access or use our Services or otherwise provide information to CoreWeave, we process your information in accordance with this Privacy Policy. By using any of our Services or otherwise providing information to CoreWeave, you acknowledge that you have read, understood, and agree to this Privacy Policy and our Terms of Use located at [https://docs.coreweave.com/policies/terms-of-service/terms-of-use](/policies/terms-of-service/terms-of-use). We recommend that you read this Privacy Policy in full to ensure you are fully informed. If you have any questions about this Privacy Policy or our privacy practices or CoreWeave's collection, use, and disclosure practices, please contact us at [privacy@coreweave.com](mailto:privacy@coreweave.com). ### Scope of This Privacy Policy This Privacy Policy applies to personal data that CoreWeave processes as a controller. It does not apply to the extent CoreWeave processes personal data solely as a processor or service provider on behalf of its customers. "Customer Data" means data processed by CoreWeave on behalf of a customer in connection with that customer's use of the Services. Each customer acts as the controller of such data and is responsible for the collection, use, and disclosure of its Customer Data. ## 1. Information We Collect, Purposes, and Legal Bases We collect information you provide directly to us when you, for example: * interact with CoreWeave through our Sites; * register for an account; * participate in any interactive features of the Services; * request customer support; or * otherwise communicate with us. We may combine this information with information collected automatically or obtained from other lawful sources. Our legal basis for collecting and using personal data depends on the context and the type of information involved. We generally rely on one or more of the following: * **Contractual necessity** (GDPR, Article 6(1)(b) GDPR), such as providing Services pursuant to a purchase order or Terms of Service; * **Legitimate interests** (GDPR, Article 6(1)(f)), such as operating, improving, and securing our Services, provided those interests are not overridden by your rights; * **Consent** (GDPR, Article 6(1)(a)), where required by law; or * **Legal obligation** (GDPR, Article 6(1)(c)). For transparency purposes, we have provided in a table below the information we collect, the purposes, and the legal bases for such processing.
Information We Collect Purpose for Processing Legal Basis for Processing
**Account Registration**\ \ When you create an account, we may collect certain contact information, including your name, company name, address, email address, telephone number, and related account details. \ \ To create, administer, and manage your account and provide the Services. \ \ GDPR Article 6(1)(b) - performance of a contract.
**Payment Information**\ \ We collect information related to Services you purchase. Payment details are processed directly by our third-party payment processors; CoreWeave does not store full financial account information. \ \ To manage accounts, process transactions and provide our Services. \ \ GDPR Article 6(1)(b) - performance of a contract.\ \ GDPR Article 6(1)(f) - legitimate interests in operating the Services, provided such interests are not overridden by your fundamental rights and freedoms.
**Communications**\ \ If you contact us, we may collect your name, contact details, message contents, any attachments, and any other information you may choose to provide. \ \ To respond to inquiries, provide support, and communicate with you. \ \ GDPR Article 6(1)(f) - legitimate interest in customer communications, provided such interests are not overridden by your fundamental rights and freedoms.
**Content You Submit as a Customer**\ \ We collect the content you submit through the Services and our Sites, including messages, posts, comments, support communications, customer-facing Slack interactions, and inputs and outputs from service tools and offerings. \ \ To understand and analyze how you use our Services.\ \ To provide and operate the Services, analyze usage, perform debugging and evaluation, and develop, improve, and optimize products, services, features, and overall functionality. \ \ GDPR Article 6(1)(f) - legitimate interest in operating and improving our Services, provided such interests are not overridden by your fundamental rights and freedoms.
**Cookies, Tokens and Other Tracking Technologies**\ \ We use cookies and similar technologies to recognize users, analyze usage, and operate our Services. You can manage cookies through your browser settings, though disabling them may impact functionality. This Privacy Policy applies only to CoreWeave's use of cookies and does not cover third-party cookies. \ \ To provide our Services to you.\ \ To understand and analyze how you use our Services.\ \ To develop new products, services, features, and functionality.\ \ To market our Services.\ \ To monitor and analyze trends, usage, and activities in connection with our Services.\ \ To link or combine with information we get from others to help us understand your needs and provide you with a better experience. \ \ GDPR Article 6(1)(f) - legitimate interest in operating and improving our Services, provided such interests are not overridden by your fundamental rights and freedoms.\ \ GDPR Article 6(1)(a) - consent.\ \ Strictly necessary cookies are processed based on our legitimate interests and are exempt from consent requirements under EU ePrivacy rules.\ \ All other cookies are used only where permitted by law and, where required, based on your consent.
**Usage, Log, and Device Information**\ \ We may automatically collect:\
  • Usage metrics (e.g., system performance, feature usage);
  • Log data (e.g., Internet Protocol ("IP") address, operating system, browser type and language, referring URLs, access times, pages viewed, links clicked);
  • Mobile device information (e.g., hardware model, operating system, device model, mobile network information, information about your use of our mobile applications);
  • Location information, where necessary for fraud prevention and security, (e.g., GPS, wireless networks, cell towers, Wi-Fi access points).
\ \ To operate, secure, maintain, analyze, and improve the Services.\ \ We may collect limited precise location information where strictly necessary for fraud prevention and security purposes only. \ \ GDPR Article 6(1)(f) - legitimate interest in operating, improving and securing our Services, provided such interests are not overridden by your fundamental rights and freedoms.
**Content You Submit as a Job Applicant**\ \ We collect information you submit through job applications or the "Careers" section of our Sites, as well as other data related to your application. This may include your name, contact information, address, employment and education history, resumes, references, and interview-related materials, such as interview notes, screenshots, or audio and video recordings captured during the interview process. \ \ To evaluate and manage recruitment and hiring and comply with applicable employment laws. \ \ GDPR Article 6(1)(f) - legitimate recruitment, hiring and employment interests, provided such interests are not overridden by your fundamental rights and freedoms.
**Content We Collect at Our Events, including Marketing, Recruiting, and Networking Events**\ \ We may collect information when you attend or participate in our events, including your name, contact details, employer or affiliation, job title, registration information, communications with us, and, where applicable, photographs, audio, or video recordings. \ \ To plan, host, and administer events.\ \ To communicate with attendees before and after events.\ \ To conduct marketing, recruiting, relationship-building, and business development activities.\ \ To improve future events and experiences. \ \ GDPR Article 6(1)(f) - legitimate interest in organizing and promoting events and engaging with customers, partners, and prospective employees, provided such interests are not overridden by your fundamental rights and freedoms.\ \ GDPR Article 6(1)(a) - consent where required by law (e.g., for certain recordings or marketing uses).
**Content You Submit When You Access Our Locations, including Offices and Data Centers**\ \ When you visit our offices or data centers, we may collect identification and access-related information, such as your name, contact details, company affiliation, visitor logs, badge or credential information, access times, and, where applicable, biometric information and video surveillance. \ \ To manage visitor access and maintain physical security.\ \ To protect the safety of personnel, visitors, and infrastructure.\ \ To prevent unauthorized access, fraud, or security incidents.\ \ To comply with legal, regulatory, and contractual security obligations. \ \ GDPR Article 6(1)(f) - legitimate interest in ensuring the security and integrity of our premises, personnel, and operations, provided such interests are not overridden by your fundamental rights and freedoms.
In addition to the above-mentioned purposes, and depending on the specific circumstances, we may also process your personal data to: * develop new ways to partner with our potential and registered customers; * to provide you with updates and other information relating to the Services, and for our marketing and promotional purposes, including targeted marketing and/or cross-context behavioral marketing; * send you notices, text messages and push notifications in connection with the Services; * protect the rights and property of CoreWeave and others; * perform operational functions in connection with our business; * carry out any other purpose described to you at the time the information was collected; * maintain appropriate records for internal administrative purposes; * comply with legal and regulatory requirements, required disclosures and choices and controls that may be available; * find and prevent fraud and other illegal activity; and * for compliance purposes, including enforcing our Terms of Use or Terms of Service located at [https://docs.coreweave.com/policies/terms-of-service](/policies/terms-of-service), or other legal rights, or as may be required by applicable laws and regulations or requested by any judicial process or governmental agency. We also may use aggregated or de-identified information, which cannot reasonably be used to identify you. Once de-identified and aggregated so that data does not personally identify you (for example, we may aggregate data in order to improve our automation), it is no longer personal data. Such de-identified and/or aggregated information which does not identify individuals is not subject to this Privacy Policy. ### Information We Receive from Third Parties We may receive information that third parties provide to us, which may include information about you. This Privacy Policy does not apply to information collected through or by any third party. If you have any questions about such third parties' privacy practices, you should review their privacy policies. ## 2. How We Share Information We may share personal data with: * **Vendors and Service Providers.** We may share personal data with third-party vendors and service providers that perform services on our behalf, such as supporting our Services, conducting promotional and/or marketing activities, and providing you with relevant information, including product announcements, software updates, special offers, or other communications. * **Aggregated or Anonymized Information.** Where legally permissible, we may use and share aggregated or anonymized information with our partners. This information cannot reasonably be used to identify you. * **Third-Party Partners.** We may share information with third-party partners to obtain additional publicly available information about you. * **Referrals.** If you create an account or access our Services through a referral, we may share limited information with the referrer to notify them that you have registered or engaged with the Services. * **Analytics Providers.** We may use analytics providers, such as Google Analytics, which use cookies and similar technologies to collect non-identifying information about usage of our Sites and Services. Google provides additional information about its data practices and privacy options at [https://www.google.com/policies/privacy/partners/](https://www.google.com/policies/privacy/partners/). * **Business Transfers.** We may disclose or transfer personal data to a potential acquirer, successor, or assignee as part of any proposed or actual merger, acquisition, debt financing, sale of assets, or similar transaction, or in connection with bankruptcy, insolvency, or receivership, where personal data is transferred as a business asset. * **Legal Obligations and Protection.** We may share information as necessary to: (i) comply with applicable laws, regulations, legal processes, or governmental requests; (ii) enforce this Privacy Policy or any agreement we may have with you, including, without limitation, our Terms of Service, including investigating potential violations; (iii) detect, prevent, or address fraud, security, or technical issues; (iv) respond to your requests; or (v) protect our rights, property, or safety, as well as those of our users or the public. This may include sharing information with other companies and organizations for fraud prevention and spam or malware protection. * **Affiliates.** We may share information between and among CoreWeave and any current or future parent, subsidiary, and/or affiliated company, including for cross-context behavioral advertising purposes. * **With Your Consent.** **We may share information with your consent.** We do not sell personal data. ## 3. Cookie Notice We use cookies and other related technologies (including, but not limited to pixels, web beacons, embedded scripts, mobile SDKs, local storage, and tokens) when you visit our Sites or use our Services. Cookies are small text files placed on a user's device when visiting a website or using an online service. They enable the collection of information that allows a website to recognize a device, support functionality and security, analyze usage, and facilitate marketing activities. Types of Cookies We Use: * **Strictly Necessary Cookies**: Required for the operation, security, and accessibility of the Sites and Services (e.g., authentication, fraud prevention, load balancing). These cookies cannot be disabled and do not require consent under EU ePrivacy laws. * **Functional Cookies**: Enable enhanced functionality and personalization, such as remembering preferences. * **Analytics Cookies**: Help us understand how users interact with our Sites and Services so we can improve performance and usability (e.g., Google Analytics). * **Marketing Cookies**: Used to measure the effectiveness of marketing campaigns and, where permitted, to provide relevant advertising. You may manage or withdraw your cookie preferences at any time through your browser settings or, where available, our cookie preference tools. Please note that disabling certain cookies may affect the functionality of the Services. This Cookie Notice applies only to CoreWeave's use of cookies and does not cover cookies placed by third parties. ## 4. Third-party Services You may access other third-party services through our Sites or your use of the Services, for example by clicking on links to those third-party services from within our Sites or if a third-party service has been integrated with the Services. CoreWeave is not responsible for the privacy policies or practices of third-party services, and this Privacy Policy does not apply to information collected by third parties. We encourage you to review the privacy policies of any third-party services you access. Links or integrations with third-party services do not constitute an endorsement, affiliation, or representation regarding their privacy or information security practices. ## 5. Security CoreWeave is committed to protecting your information. We employ administrative, technical, and organizational security measures designed to protect personal data from unauthorized access, use, alteration, or disclosure. We follow industry-recognized information security standards appropriate to the nature and risk of the processing involved. However, no system or method of transmission over the Internet is completely secure, and we cannot guarantee absolute security of your personal data. ## 6. Data Retention We retain personal data only for as long as necessary to fulfill the purposes described in this Privacy Policy, unless a longer retention period is required or permitted by law. When we no longer have a legitimate business need or legal obligation to process personal data, we will delete, anonymize, or securely isolate such data. If deletion is not immediately possible (for example, due to backup systems), the data will be securely stored and isolated until deletion is feasible. If you have questions about data retention, please contact [privacy@coreweave.com](mailto:privacy@coreweave.com). ## 7. Use of Emerging Tech Such as Artificial Intelligence and Machine Learning CoreWeave may use technologies such as artificial intelligence (AI) and machine learning (ML) when processing your data to operate, maintain, improve, and develop our Services. Where required by applicable law, we will provide notice or obtain consent before using such technologies to process your data. AI and ML technologies may also be used to improve system performance, security, and customer experience. ## 8. International Data Transfers CoreWeave operates globally and may transfer personal data to countries that may not provide the same level of data protection as your country of residence. Where required, we use appropriate safeguards, such as Standard Contractual Clauses. ## 9. EEA and UK Residents Data Protection Rights Data protection laws distinguish between a "controller" and a "processor." Customers are controllers of Customer Data uploaded to the Services. CoreWeave is the controller of personal data collected directly through the Sites or outside of Customer Data. If you are located in the European Economic Area (EEA) or the United Kingdom, you have the right to: * Access, correct, or delete your personal data * Object to or restrict certain processing * Request data portability * Withdraw consent, where processing is based on consent * Lodge a complaint with a supervisory authority Requests may be submitted to [privacy@coreweave.com](mailto:privacy@coreweave.com), and we will respond in accordance with applicable law. Where CoreWeave processes personal data on behalf of a customer, requests should be directed to the relevant customer as data controller. Data protection law in certain jurisdictions differentiates between the "controller" and "processor" of information. In general, you are the controller of the "Customer Data" (described above in this Privacy Policy) that you upload to the Services and CoreWeave is the processor of such disclosed information. ## 10. Consumer Data Protection Rights The law of your jurisdiction may provide you with certain rights regarding our use of your personal data. Subject to any exceptions and/or exemptions under applicable law, you may, for example, have the following rights with respect to your personal data collected by us: ### I. Categories of Personal Data We may collect and share the following categories of personal data: * Identifiers (e.g., name, email address, IP address, social security number, state identification number, signature, personal photograph) * Customer records information (e.g., contact details, billing information) * Internet or network activity (e.g., usage data, log data) * Geolocation data (limited and used for security and fraud prevention) * Professional or employment-related information (e.g., job application data) * Demographic information (e.g., age, gender, marital status, military or veteran status, financial information, insurance information, medical or health information) * Personal information categories listed in the California Customer Records statute (Cal. Civ. Code § 1798.80(e)) Personal data may be collected directly from you, automatically through your use of the Services, or from third-party sources. We may disclose, and may have disclosed, or may share or may have shared, in the preceding 12 months, the foregoing categories of personal data for one or more of the purposes set forth herein, which constitute business purposes. ### II. Consumer Privacy Rights Subject to certain exceptions, you may have the right to: * Know the categories and specific pieces of personal data we collect, use, disclose, or share * Delete personal data we have collected * Correct inaccurate personal data * Portability of your personal data that we collected * Limit the use and disclosure of sensitive personal data * Opt-out of the sharing of your personal data * Withdraw your consent to our processing of certain personal data * File a complaint with the appropriate state's attorney general's office * Not be discriminated against for exercising your privacy rights Please note that the scope of these rights and their applicability vary by jurisdiction. There may also be exceptions and/or exemptions where we may not have an obligation to fulfill your request. ### III. Exercising Your Rights You may submit a verifiable consumer request by emailing [privacy@coreweave.com](mailto:privacy@coreweave.com) or by calling 1-888-349-5038. We will verify your identity before responding and may request additional information as permitted by law. When submitting a request, you must (i) provide the following information: name, email address, phone number, and address; and (ii) specify the type of request you are making. You may designate an authorized agent to make a request on your behalf. We may require proof of authorization and verification of your identity. CoreWeave cannot respond to a request or provide personal data if we cannot verify the identity or authority to make the request. In addition, if CoreWeave receives data through a third party or a customer of its Services, CoreWeave has no direct relationship with the individual whose personal data it processes. An individual who seeks access, or who seeks to correct or delete data, should direct their query to the third party or CoreWeave customer within whose account such individual's data exists (the data controller). If we deny a request, we will provide a response explaining the reasons we cannot comply with a request, if applicable. ### IV. Sale and Sharing of Personal Data CoreWeave does not sell personal data. We may share personal data with affiliated companies for cross-context behavioral advertising, which means targeted advertising based on your activity across different websites, applications, or services over time. To opt out of targeted advertising cookies, you have several options. You may click the "Do Not Sell or Share My Personal Information" link in the website footer to adjust your targeting cookie preferences. You may also use the Global Privacy Control setting in your web browser or a browser extension (as described in our Cookie Notice). Depending on your location, we may present a cookie banner when you first visit our Site, where you can manage your preferences. ### V. Global Privacy Control and Do Not Track We recognize and honor Global Privacy Control ("GPC") signals as a valid request to opt out of the sale or sharing of personal information where required by applicable law. Where technically feasible, and as configured through our consent management platform, we treat a GPC signal as a request to restrict certain non-essential tracking technologies on the device and browser from which the signal is sent. The Services do not respond to "Do Not Track" ("DNT") browser signals. Our practices regarding data collection and use are described in this Privacy Policy. ### VI. "Shine the Light" Law California's "Shine the Light" law (Civil Code Section § 1798.83) permits users of our Services that are California residents to request certain information regarding our disclosure of personal data to third parties for their direct marketing purposes. To make such a request, please send an email to [privacy@coreweave.com](mailto:privacy@coreweave.com). ## 11. Other Disclosures We do not use your sensitive personal information for the purpose of inferring characteristics about you. We do not perform processing of your information which constitutes automated decision making or profiling in furtherance of decisions that produce legal effects or similarly significant effects concerning you. ## 12. Email Opt Out You may opt out of receiving general emails from CoreWeave by following the unsubscribe instructions in any email we send you. ## 13. Children's Privacy CoreWeave does not knowingly collect information from children under the age of 18, and children under 18 are prohibited from using our Services. If you're under 18, you may use CoreWeave's offerings only with the involvement of a parent or guardian. If you learn that a child has provided us with personal data in violation of this Privacy Policy, you can alert us at [privacy@coreweave.com](mailto:privacy@coreweave.com). If we become aware that such data has been collected, we will take appropriate steps to delete it. ## 14. Changes to this Privacy Policy We may update this Privacy Policy from time to time. Changes will be posted on the Sites, and material changes will be communicated as required by law. To the extent permitted under applicable law, all changes to this Privacy Policy shall be effective upon posting. ## 15. Accessibility We are committed to facilitating the accessibility of our Services for all people with disabilities. To access this Privacy Policy or any other portion of the Services in an alternative format, please contact us at [privacy@coreweave.com](mailto:privacy@coreweave.com). ## 16. Contact Us If you have questions or concerns about this Privacy Policy or our data practices, please email us at [privacy@coreweave.com](mailto:privacy@coreweave.com). # CoreWeave Sandbox Terms Source: https://docs.coreweave.com/policies/terms-of-service/sandbox-terms Terms governing customer access to and use of CoreWeave Sandbox These terms (the "Sandbox Terms") supplement and are hereby incorporated into the [CoreWeave Terms of Service](/policies/terms-of-service) ("TOS") and govern Customer's use of, or access to, CoreWeave Sandbox (the "Sandbox Service") which is considered "CoreWeave Services" as defined under the TOS. In event of a conflict or inconsistency with the TOS, these Sandbox Terms control solely with respect to the Sandbox Service. Capitalized terms not defined here have the meanings given in the TOS. ## Sandbox Service 1. **Sandbox Service.** The Sandbox Service enables Customer to create and manage isolated compute environments (each, a "Sandbox"), which Customer may use to run Agents, models, software, code, scripts, processes, and other workloads provided, selected, or controlled by Customer or a third party (collectively, "Customer Workloads"). Customer is responsible for all activity undertaken through or initiated by a Customer Workload in connection with the Sandbox Service as if undertaken directly by Customer. "Agent" means any artificial intelligence model, system, or workflow capable of taking actions or performing tasks on behalf of Customer autonomously or with human supervision. 2. **Customer Workloads.** Customer is solely responsible for selecting, configuring, instructing, and operating Customer Workloads, including all credentials, secrets, permissions, network destinations, data, and external systems it makes available to Customer Workloads. Customer will not, and will not permit any Customer Workload to attempt to escape a Sandbox; defeat isolation or security controls; obtain unauthorized access to CoreWeave's or its affiliates', or any third party's infrastructure or resources; or interfere with the operation or security of the Sandbox Service or CoreWeave Services. Customer will use commercially reasonable measures to limit Customer Workloads' access to credentials, data, networks, and systems to what is necessary for the intended task, and will promptly revoke or rotate any credential used with the Sandbox Service that it knows or reasonably suspects has been compromised. Customer will obtain CoreWeave's prior written consent before conducting any security or malware research on or using the Sandbox Service, including testing its isolation boundary or CoreWeave's or its service providers' systems. Customer will promptly notify CoreWeave if it becomes aware of any actual or reasonably suspected escape by a Customer Workload from a Sandbox, attempted defeat of the Sandbox Service's isolation controls, or material vulnerability in the Sandbox Service. 3. **Sandbox Operations.** Customer is solely responsible for: (i) determining whether the Sandbox Service and its selected configurations are appropriate for its intended use case; (ii) evaluating results before relying on them or using them outside the Sandbox; (iii) configuring, monitoring, stopping, and decommissioning its Sandboxes and workloads, including all usage initiated or continued automatically through a Customer Workload; and (iv) exporting content it wishes to retain before a Sandbox becomes unavailable, subject to the functionality described in the [Documentation](https://docs.coreweave.com/). # Security & Compliance Source: https://docs.coreweave.com/policies/terms-of-service/security-and-compliance How CoreWeave, Inc. keeps its infrastructure and customer service data secure ## About CoreWeave security Customer data privacy is built into the foundation of CoreWeave's platform. From the physical data center through the software layer, customer data is tracked, access controlled, and protected using industry best practices. Below is an outline of our general security and privacy standards. ### Multiple-layer physical security at data centers All of CoreWeave's data centers are limited-access buildings, with no visible signage. All data centers are protected by security personnel, 24 hours a day, 7 days a week, 365 days a year. In order to enter data center sites, all visitors must provide photo identification and sign in and out. Automatic background checks are performed prior to allowing access to any visitor. Additionally, all guests and vendors must be accompanied by a staff member during their visit. Access for data center employees is granted via biometric identification, and all employees are required to sign non-disclosure agreements (NDAs). ### Access monitoring and data safeguarding All paper documents at any data center location are shredded on-site. All infrastructure hardware is contained within locked and secured cabinets, with cameras positioned at each cage, aisle, and door access point. Access tracking is performed in real time, which includes an ongoing digital door access log. ### Logical access controls CoreWeave ensures a comprehensive logical separation of all its customers in storage, network and execution layers. All CoreWeave employees are under NDA, and can only access customer data as needed for critical operations. Logging and access control is applied to all infrastructure. CoreWeave employs a comprehensive response plan for security events, and firewalls restrict inbound Internet connections. # Shared Responsibility Model Source: https://docs.coreweave.com/policies/terms-of-service/shared-responsibility-model How CoreWeave and its clients platform use responsibilities ## What is a Shared Responsibility Model? A Shared Responsibility Model is a tool to help communicate the distinction between the responsibilities held by CoreWeave and the responsibilities held by our clients when using the CoreWeave Cloud platform. The table below illustrates the basic aspects of CoreWeave Cloud for which the client is ultimately responsible, as well as those for which CoreWeave itself is ultimately responsible. You can read more about each listed aspect under the table. **Security and compliance** on CoreWeave operates as a **shared responsibility** between CoreWeave and our customers. This shared model relieves the operational burden of customers while CoreWeave operates, manages, and controls the infrastructure components that support our services. The Shared Responsibility Model below delineates the responsibilities that CoreWeave customers ("Client") maintain, versus those that CoreWeave itself maintains. ### Terms * **Client:** A CoreWeave Cloud customer * **End user:** A user connecting to the Client's services; the Client's customers ## The CoreWeave Shared Responsibility Model | Client responsibilities | CoreWeave responsibilities | | - | - | | **1. Customer Layer** Customer Data Access Collection, Protection and Use; Legal, Acceptable Use, Privacy Policy Requirements | **1. Platform Layer** Kubernetes Container Orchestration; API Services; Identity and Access Management Platform; Cloud Console; Virtual Private Cloud | | **2. Application Layer** Application Performance; Reliability; Security and Management; Application Code | **2. Compute Layer** Operating System; Container Support; Hardware Drivers; Health Checking and Node Lifecycle; Endpoint Detection and Response | | **3. Access Layer** Identity and Access Management Policy Definitions; Third-Party Identity Providers Network Policies | **3. Network Layer** Internal and External Connectivity; Network Encapsulation; VPC Isolation; Direct Connect | | **4. Data Layer** Data Classification; Data Protection; Encryption; Disaster Recovery Plans; Backups | **4. Physical Layer** Data Center Security; Power and Cooling; IT Inventory and Asset Management; Physical | ## Client responsibilities Any aspects of using CoreWeave Cloud that are within the Client's absolute control are the responsibility of the Client. The following are elements that fall under the Client's responsibility. * **Client software and applications and client-side data:** the software and applications Clients choose to run within their containers, as well as all client-side data, is the sole responsibility of the Client * **Any guest Operating System used on Virtual Servers:** Clients are responsible for guest Operating Systems and network configurations, including firewall configurations The following are all **Client responsibilities** described in depth. ### Customer layer | Responsibility | Description | | - | - | | **Customer Data Access Collection, Protection and Use** | The method by which end users normally access hosted data is the Client's responsibility. The methods by which any data is collected from or about end users is the Client's responsibility. | | **Legal, Acceptable Use, Privacy Policy Requirements** | It is the Client's responsibility to adhere to all legal, acceptable use, and requirements as stipulated in [the CoreWeave Privacy Policy](/policies/terms-of-service/privacy-policy) and [Terms of Service](/policies/terms-of-service). | ### Application layer | Responsibility | Description | | - | - | | **Application Performance** | The performance of applications deployed by the Client are the responsibility of the Client with regard to performance of the underlying application code. | | **Reliability** | Reliability of applications deployed by the Client are the responsibility of the Client for any type of service level reliability they must meet. | | **Security and Management** | Clients are responsible for the security of their applications, including configuration and application security for all applications deployed by the Client onto CoreWeave Products. | | **Application Code** | The performance, reliability, security, and management of the Client's application is the Client's responsibility. | ### Access layer | Responsibility | Description | | - | - | | **Identity and Access Management Policy Definitions** | All identity-based access management (IAM) configurations are the Client's responsibility that serve authentication and authorization for CoreWeave Cloud services. | | **Third Party Identity Providers** | Secure configuration and management of third-party identity providers (IdP's) are the Client's responsibility to maintain for SAML/SSO or OIDC based connections | | **Network Policies** | Secure configuration of the Client's network policies in CKS clusters are the Client's responsibility within CoreWeave Cloud products such as utilizing Kubernetes resources such as Kubernetes Network Policies. | ### Data layer | Responsibility | Description | | - | - | | **Data Classification** | It is the responsibility of the Client to properly classify data used within CoreWeave Cloud products and data collected from or about end users. | | **Data Protection** | It is the responsibility of the Client to ensure that classified data is adequately secured. | | **Encryption** | It is the responsibility of the Client to ensure that any data determined to require encryption at rest or in transit utilizes the required protocols for securing data. | | **Disaster Recovery Plans** | It is the responsibility of the Client to construct any disaster recovery plans for use of CoreWeave Products. | | **Backups** | It is the responsibility of the Client to construct any backup systems for data recovery purposes. | | **Metadata** | It is the responsibility of the Client to ensure that confidential information is not stored in metadata fields. | | **Resource Identifiers** | It is the responsibility of the Client to ensure that confidential information is not stored in resource identifiers. | ## CoreWeave responsibilities CoreWeave's responsibilities **begin at the physical level** spanning across data centers in the United States and European regions that contain CoreWeave assets. It is our responsibility to ensure that our physical data centers are always secure, and that power is always on and flowing to where it is needed with redundant mechanisms in place. **Storage, compute, network infrastructure, and software services** are the responsibilities of CoreWeave. Our high-performance NVIDIA GPUs and CPUs all fall under the care of our dedicated teams, to include all services and software provisioned for our clients to use. The following are all **CoreWeave responsibilities** described in depth from our Shared Responsibility Model. ### Platform layer | Responsibility | Description | | - | - | | **Kubernetes Container Orchestration** | The proper functionality, security, and operations of CoreWeave's Kubernetes cluster is the responsibility of CoreWeave. | | **API Services** | The functionality and availability of all API services pertaining to CoreWeave Cloud is the responsibility of CoreWeave. | | **Identity and Access Management Platform** | The functionality and security of the Identity and Access Management Platform offered to Clients through CoreWeave Cloud platform services is the responsibility of CoreWeave. | | **Cloud Console** | The reliability, accessibility, serviceability and security of the CoreWeave Cloud Console is the responsibility of CoreWeave. | | **Virtual Private Cloud** | The reliability, accessibility, serviceability and security of [CoreWeave VPCs](/products/networking#virtual-private-clouds) is the responsibility of CoreWeave. | ### Compute layer | Responsibility | Description | | - | - | | **Operating System** | The integrity of all native Operating Systems offered directly through CoreWeave Cloud Console (but not guest OSes through container images, which [fall under the responsibility of the Client](#client-responsibilities)) is the responsibility of CoreWeave. | | **Container Support** | The health and functionality of CoreWeave deployed software within the CoreWeave Kubernetes cluster is the responsibility of CoreWeave, noted by "cw-" prefixed namespaces. | | **Hardware Drivers** | The integrity of any drivers installed on CoreWeave hardware is the responsibility of CoreWeave. | | **Health Checking and Node Lifecycle** | The availability and serviceability of CoreWeave infrastructure is the responsibility of CoreWeave. | | **Endpoint Detection and Response** | The monitoring of all CoreWeave endpoints to ensure security and functionality is the responsibility of CoreWeave. | ### Network layer | Responsibility | Description | | - | - | | **Internal and External Connectivity** | CoreWeave leverages BlueField DPUs for access to one or multiple VPCs, with optional internet access. CoreWeave maintains the security of these connections made by Clients. | | **Network Encapsulation** | VPCs are encapsulated as industry standard Layer 3 EVPN VXLAN which is secured and the responsibility of CoreWeave | | **VPC Isolation** | Tenant isolation inside of all VPCs provisioned by Clients are secured through the configuration of DPUs and hosts which are the responsibility of CoreWeave. | | **Direct Connect** | The security of all Direct Connects is maintained by CoreWeave through the use of industry standard MACsec protection for securing Client data | ### Physical layer | Responsibility | Description | | - | - | | **Data Center Security** | The security of all data centers internal and external, to include CoreWeave hardware assets within them are the responsibility of CoreWeave. | | **Power and Cooling** | The availability and proper flow of power, as well as the availability and proper flow of data center cooling, is the responsibility of CoreWeave. | | **IT Inventory and Asset Management** | Processing hardware inventory and access to CoreWeave hardware is the responsibility of CoreWeave. | | **Physical** | The integrity and serviceability of the physical networking infrastructure for CoreWeave is the responsibility of CoreWeave. | # CoreWeave Sub-processors Source: https://docs.coreweave.com/policies/terms-of-service/sub-processors List of sub-processors engaged by CoreWeave in accordance with the Data Processing Agreement > [!NOTE] > > This list applies to CoreWeave Infrastructure only. Forge products, including Weights & Biases, use a different set of sub-processors. See the [Forge sub-processor list](https://wandb.ai/site/security/). This page lists the sub-processors that CoreWeave has engaged for CoreWeave Infrastructure, in accordance with CoreWeave's [Data Processing Agreement](/policies/terms-of-service/data-processing-agreement) (DPA). CoreWeave will update this page at least 30 days before engaging a new sub-processor. | Sub-processor | Location | | - | - | | Backblaze, Inc. | United States | | Microsoft Corporation | United States | # Terms of Use Source: https://docs.coreweave.com/policies/terms-of-service/terms-of-use Terms governing user access to CoreWeave websites, covering content ownership and permitted usage > [!NOTE] > > **Last Updated** > > The Terms of Use was last updated on **July 8, 2024.** By using our CoreWeave Sites, you agree to these Terms of Use. Please read them carefully. ## Introduction Your use of CoreWeave.com and Cloud.CoreWeave.com and any other website owned or operated by the Company, and the features and applications at them (collectively, the "CoreWeave Sites") are subject to these Terms of Use entered into between you and CoreWeave, Inc. (collectively "Company", "we", "us" or "our"), together with any documents these Terms of Use expressly incorporate by reference (collectively, these "Terms"). These Terms govern your access and use of the CoreWeave Sites, including any content, functionality and services offered on or through the CoreWeave Sites; please read these Terms carefully before using the CoreWeave Sites. By accessing and using the CoreWeave Sites you accept and agree to be bound by these Terms and our Privacy Policy and incorporated herein by reference. If you do not want to agree to these Terms or the Privacy Policy, you must not access or use the CoreWeave Sites. From time to time we may update the CoreWeave Sites and these Terms in our sole discretion. All changes are effective immediately when we post them and apply to all access to and use of the CoreWeave Sites thereafter. Your use of the CoreWeave Sites after we post any changes to these Terms constitutes your agreement to those changes. You agree to review these Terms periodically to ensure that you are familiar with the most recent version. ## CoreWeave Sites' Content The CoreWeave Sites and their entire content, features and functionality (including, but not limited to, certain graphics, photographs, images, screen shots, text, digitally downloadable files, trademarks, software, names, designs, displays, video and audio, logos, product and program names, slogans, and the compilation, design, selection and arrangement of the foregoing ("CoreWeave Sites' Content") is the property of the Company, its licensors and other providers of such material and is protected in the U.S. and internationally under trademark, copyright, patent, trade secret or other intellectual property or proprietary laws. You agree not to download, display or use any CoreWeave Sites' Content in connection with products or services that are not those of the Company, in any other manner that is likely to cause confusion among consumers, that dilutes the strength of the Company's, its licensors' or its other providers' property, or that otherwise infringes the Company's, its licensors' or its other providers' intellectual property rights. You further agree to in no other way misuse any CoreWeave Site' Content or third-party content that appears on the CoreWeave Sites. If you print, copy, modify, download or otherwise use or provide any other person with access to any part of the CoreWeave Sites in breach of these Terms, your right to use the CoreWeave Sites will cease immediately and you must, at our option, return or destroy any copies of the materials you have made. No right, title or interest in or to the CoreWeave Sites or any CoreWeave Sites' Content is transferred to you, and all rights not expressly granted are reserved by the Company. Any use of the CoreWeave Sites not expressly permitted by these Terms is a breach of these Terms and may violate copyright, trademark and other laws. If you are a trademark or copyright owner and you believe that your trademark or copyright rights have been violated, please refer to the Section entitled "Intellectual Property and DMCA". ## Account Registration We reserve the right to withdraw or amend the CoreWeave Sites, and any CoreWeave Sites' Content or other service or material we provide on the CoreWeave Sites, in our sole discretion without notice. We will not be liable if for any reason all or any part of the CoreWeave Sites is unavailable at any time or for any period. From time to time, we may restrict access to some parts of the CoreWeave Sites, or an entire CoreWeave Site, to users, including registered users. You are responsible for making all arrangements necessary for you to have access to the CoreWeave Sites and ensuring that all persons who access the CoreWeave Sites through your internet connection are aware of these Terms and comply with them. To access the CoreWeave Sites or some of the products, resources and services they offer, you will be asked to provide certain registration details or other information in order to create your own account to use these products, resources and services. It is a condition of your use of the CoreWeave Sites that all the information you provide on the CoreWeave Sites is correct, current and complete. You agree that all information you provide to register an account with the CoreWeave Sites or otherwise, including, but not limited to, through the use of any interactive features on the CoreWeave Sites, is governed by our Privacy Policy, and you consent to all actions we take with respect to your information consistent with our Privacy Policy. You are responsible for maintaining the confidentiality of your username, password and API token(s) or any other piece of information provided through use of or access to the CoreWeave Sites and for restricting access to and disclosure of such information. You also acknowledge that your account is personal to you and agree to not provide any other person with access to the CoreWeave Sites or portions of them using your username, password or other security information. You agree to accept responsibility for all activities that occur under your account, including, without limitation, unauthorized usage of your account. You agree to notify us immediately of any unauthorized access to or use of your username or password or any other breach of security. ## Use of the CoreWeave Sites You may use the CoreWeave Sites only for lawful purposes and in accordance with these Terms. You agree not to use the CoreWeave Sites or any feature thereon: (a) for any purpose that is unlawful, tortious, intrusive on another's privacy, harassing, exploiting, libelous, defamatory, obscene, or threatening; (b) to upload, post, reproduce, or distribute any content, information, software, or other material that infringes on the intellectual property rights or other rights of any third party; (c) for any commercial purpose not expressly approved by the Company in writing; (d) in any way that violates any applicable federal, state, local or international law or regulation (including, without limitation, any laws regarding the export of data or software to and from the US or other countries; (e) to send, knowingly receive, upload, download, use or re-use any material which does not comply with these Terms; (f) to engage in any other conduct that restricts or inhibits anyone's use or enjoyment of the CoreWeave Sites, or which, as determined by us, may harm the Company or users of the CoreWeave Sites, or expose them to liability; (g) in any manner that could disable, overburden, damage, or impair the site or interfere with any other party's use of the CoreWeave Sites, including their ability to engage in real time activities through the CoreWeave Sites; (h) to introduce any viruses, trojan horses, worms, logic bombs or other material which is malicious or technologically harmful; (i) to attempt to gain unauthorized access to, interfere with, damage or disrupt any parts of the CoreWeave Sites, the servers on which the CoreWeave Sites are stored, or any servers, computers or databases connected to the CoreWeave Sites; (j) to attack the CoreWeave Sites via a denial-of-service attack or a distributed denial-of-service attack; or (k) to otherwise attempt to interfere with the proper working of the CoreWeave Sites). ## Indemnification You agree to indemnify, defend and hold the Company, its affiliates, parents, subsidiaries, suppliers, contractors, licensees and service providers and each of its and their officers, employees, directors, licensors, agents, representatives, successors and assigns harmless from any claims, damages, liabilities, losses, judgments, awards, costs and expenses, including reasonable attorneys' fees and costs, arising out of or relating to your violation of these Terms, your use of the CoreWeave Sites, including any use of the CoreWeave Sites content, resources, services and products other than as expressly authorized in these Terms, or your use of any information obtained from the CoreWeave Sites. ## Disclaimer of Warranties CoreWeave Sites' Content is made available solely for general information purposes. We do not warrant the accuracy, completeness or usefulness of this information. Any reliance you place on such CoreWeave Sites' Content is strictly at your own risk. We disclaim all liability and responsibility arising from any reliance placed on such materials by you or any other visitor to the CoreWeave Sites, or by anyone who may be informed of any of its contents. The Company does not endorse, verify, evaluate or guarantee any information provided by users. THE COREWEAVE SITES ARE PROVIDED ON AN "AS IS, AS AVAILABLE" BASIS. TO THE FULLEST EXTENT PERMISSIBLE BY LAW, THE COMPANY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE COMPANY DOES NOT WARRANT THAT ANY CONTENT, MATERIALS OR OTHER INFORMATION INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH THE COMPANY OR THE COREWEAVE SITES, THE COMPANY'S SERVERS OR ELECTRONIC COMMUNICATIONS SENT FROM THE COMPANY ARE FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS. THE COMPANY WILL NOT BE LIABLE FOR ANY LOSS OR DAMAGE CAUSED BY A DISTRIBUTED DENIAL-OF-SERVICE ATTACK, VIRUSES OR OTHER TECHNOLOGICALLY HARMFUL MATERIAL THAT MAY INFECT YOUR COMPUTER EQUIPMENT, COMPUTER PROGRAMS, DATA OR OTHER PROPRIETARY MATERIAL DUE TO YOUR USE OF THE COREWEAVE SITES, OBTAINED THROUGH THE COREWEAVE SITES OR TO YOUR DOWNLOADING OF ANY MATERIAL POSTED ON IT, OR ON ANY WEBSITE LINKED TO IT. YOUR USE OF THE COREWEAVE SITES AND THEIR CONTENT IS AT YOUR OWN RISK. THE COREWEAVE SITES AND THEIR CONTENT ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS, WITHOUT ANY WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. NEITHER THE COMPANY NOR ANY PERSON ASSOCIATED WITH THE COMPANY MAKES ANY WARRANTY OR REPRESENTATION WITH RESPECT TO THE COMPLETENESS, SECURITY, RELIABILITY, QUALITY, ACCURACY OR AVAILABILITY OF THE COREWEAVE SITES. WITHOUT LIMITING THE FOREGOING, NEITHER THE COMPANY NOR ANYONE ASSOCIATED WITH THE COMPANY REPRESENTS OR WARRANTS THAT THE COREWEAVE SITES AND THEIR CONTENT WILL BE ACCURATE, RELIABLE, ERROR-FREE OR UNINTERRUPTED, THAT DEFECTS WILL BE CORRECTED, THAT THE COREWEAVE SITES OR THE SERVERS THAT MAKES THEM AVAILABLE ARE FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS OR THAT THE COREWEAVE SITES WILL OTHERWISE MEET YOUR NEEDS OR EXPECTATIONS. ## Limitations on Liability TO THE FULL EXTENT PERMISSIBLE BY LAW, THE COMPANY WILL NOT BE LIABLE FOR ANY DAMAGES OF ANY KIND ARISING FROM THE USE OF ANY CONTENT, MATERIALS OR ANY INFORMATION INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH ANY COREWEAVE SITES. UNDER NO CIRCUMSTANCES, INCLUDING NEGLIGENCE, SHALL THE COMPANY, ITS AFFILIATES OR THEIR LICENSORS, SERVICE PROVIDERS, EMPLOYEES, AGENTS, OFFICERS OR DIRECTORS BE LIABLE FOR ANY DAMAGES OF ANY KIND, INCLUDING, BUT NOT LIMITED TO, DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES, PERSONAL INJURY, PAIN AND SUFFERING, EMOTIONAL DISTRESS, LOSS OF REVENUE, LOSS OF PROFITS, LOSS OF BUSINESS OR ANTICIPATED SAVINGS, LOSS OF USE, LOSS OF GOODWILL, LOSS OF DATA, AND WHETHER CAUSED BY TORT (INCLUDING NEGLIGENCE), BREACH OF CONTRACT OR OTHERWISE, EVEN IF FORESEEABLE, THAT RESULT FROM THE USE OF OR INABILITY TO USE THE COREWEAVE SITES, NOR SHALL THE COMPANY BE RESPONSIBLE FOR ANY DAMAGES WHATSOEVER THAT RESULT FROM MISTAKES, OMISSIONS, INTERRUPTIONS, DELETION OF FILES, ERRORS, DEFECTS, DELAYS IN OPERATION OR TRANSMISSION, OR ANY FAILURE OF PERFORMANCE WHETHER OR NOT CAUSED BY EVENTS BEYOND THE COMPANY'S REASONABLE CONTROL, INCLUDING BUT NOT LIMITED TO ACTS OF GOD, COMMUNICATIONS LINE FAILURE, THEFT, DESTRUCTION, OR UNAUTHORIZED ACCESS TO THE COREWEAVE SITES' RECORDS, PROGRAMS, OR INFORMATION. UNDER NO CIRCUMSTANCES, INCLUDING BUT NOT LIMITED TO A NEGLIGENT ACT, WILL THE COMPANY OR ITS AFFILIATES, LICENSORS, SERVICE PROVIDERS OR AGENTS BE LIABLE FOR ANY DAMAGE OF ANY KIND THAT RESULTS FROM THE USE OF, OR THE INABILITY TO USE, THE COREWEAVE SITES, EVEN IF THE COMPANY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## Third Party Websites and Applications The CoreWeave Sites may hyperlink to sites or webpages not maintained by or related to the Company. Hyperlinks are provided as a service to users and are not sponsored by or affiliated with the CoreWeave Sites or the Company, and the Company makes no representations or warranties about the content, completeness, or accuracy of those third party sites or webpages. Information you submit at a third party site accessible from the CoreWeave Sites is subject to the terms of that site's privacy policy, and the Company has no control over how your information is collected, used, or otherwise handled. We are not responsible, or liable to you or any third party, for the content or accuracy of any materials provided by any third parties. ## Payment and Billing Information By providing a credit card or other payment method that we accept, you represent and warrant that you are authorized to use the designated payment method and that you authorize us (or our third-party payment processor) to charge your payment method for the total amount of your purchase (including any applicable taxes and other charges) (each, a "Transaction"). If the payment method cannot be verified, is invalid or is otherwise not acceptable, your Transaction may be suspended or cancelled. You must resolve any payment method problems before we proceed with your Transaction. If you want to change or update your payment method information, you can do so at any time by logging into your account. You agree to be responsible for all charges resulting from the use of your account, including charges resulting from unauthorized use of your account prior to your notification of such unauthorized use to the Company. The Company will collect applicable sales, use and other tax (collectively, "Tax") on services for which we determine we have a duty to collect Tax. If a service is subject to Tax, you agree that the amount of Tax shown at checkout may be adjusted. Several factors may cause this, such as variances between processor programs and changes in applicable Tax rates. Use of Services on the CoreWeave Sites All use through the CoreWeave Sites of our products, resources and services is governed by our Terms of Service, which are hereby incorporated into these Terms. In the event of a conflict between these Terms and our Terms of Service, the Terms of Service shall govern. Additional terms and conditions may also apply to specific products, resources and services of the CoreWeave Sites. All such additional terms and conditions are hereby incorporated by this reference into these Terms. All prices on our CoreWeave Sites are shown in U.S. dollars and, unless expressly stated, all applicable Taxes and other charges, if any, are additional. We reserve the right to adjust prices as we may determine in our sole discretion, at any time and without notice, including without limitation, as based on geographic or other criteria as we may establish from time to time. You are not permitted to resell or otherwise use our products for commercial purposes without the prior written consent of Company. ## Our Communications to You The Company may send electronic mail or contact you through live chat for the purpose of advising you about our products or services, including changes or additions to our products or services, or for such other purpose(s) as the Company deems appropriate. Upon the receipt of these communications, you will have the option to opt-out or unsubscribe from future electronic mail notifications. You agree that any notices, agreements, disclosures or other communications that we send to you electronically will satisfy any legal communication requirements, including, but not limited to, that such communications be in writing. ## Intellectual Property and DMCA The Company takes claims of copyright infringement seriously. The Company will respond to clear notices of alleged copyright infringement that comply with the Online Copyright Infringement Liability Limitation Act of the Digital Millennium Copyright Act (17 U.S.C. § 512) ("DMCA"). If you believe any materials accessible on or from the CoreWeave Sites infringe your intellectual property, you may request removal of those materials from the CoreWeave Sites by submitting written notification to our Designated Agent listed below. As part of our response, we may remove or disable access to material residing on a CoreWeave Site that is controlled or operated by the Company that is claimed to be infringing. Your written notification must include the following: * A physical or electronic signature of a person authorized to act on behalf of the copyright owner. Identification of the copyright claimed to have been infringed or, if the claim involves multiple pieces of copyrightable material, a representative list of such pieces of copyrights. * Identification of the material that is claimed to be infringing or to be the subject of the infringing activity, and that is to be removed or access to which is to be disabled, as well as information reasonably sufficient to permit the Company to locate the material. Information reasonably sufficient to permit the Company to contact the copyright owner, such as the name of the copyright owner, an address, telephone number, and, if available, an electronic mail address. A statement that the information in the notification is accurate, and that you have a good faith belief that use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the laws. For example: * "I have a good faith belief that use of the copyrighted materials described above as allegedly infringing is not authorized by the copyright owner, its agent, or the law." * "I swear, under penalty of perjury, that the information in the notification is accurate and that I am the copyright owner or am authorized to act on behalf of the owner of an exclusive right that is allegedly infringed.". The Company's Designated Agent to receive such written notifications is: * **Designated Agent:** CoreWeave, Inc. * **By Mail:** 101 Eisenhower Pkwy Suite 106, Roseland, NJ 07068 * **By Phone:** (973) 270-9737 * **By Email:** `DMCArequests@coreweave.com` Please note that a copy of this legal notice will be forwarded to the person who provided the allegedly infringing content. Failure to comply with all of the requirements of Section 512(c)(3) of the DMCA may result in such non-compliant notifications being ineffective. For more details on the information required for valid notification of copyright under the Digital Millennium Copyright Act, see 17 U.S.C. 512(c)(3). You should be aware that, under the Digital Millennium Copyright Act, claimants who make misrepresentations concerning copyright infringement may be liable for damages (including costs and attorneys' fees) under Section 512(f) of the DMCA. ## Arbitration At Company's sole discretion, it may require you to submit any disputes arising from these Terms or use of the CoreWeave Sites, including disputes arising from or concerning their interpretation, violation, invalidity, non-performance, or termination, to final and binding arbitration under the Rules of Arbitration of the American Arbitration Association applying New York law. ## Geographic Restrictions We make no claims that the CoreWeave Sites or any of their content is accessible or appropriate outside of the United States. Access to the CoreWeave Sites may not be legal by certain persons or in certain countries. If you access the CoreWeave Sites from outside the United States, you do so on your own initiative and are responsible for compliance with local laws. ## Miscellaneous No waiver by the Company of any term or condition set forth in these Terms shall be deemed a further or continuing waiver of such term or condition or a waiver of any other term or condition, and any failure of the Company to assert a right or provision under these Terms shall not constitute a waiver of such right or provision. If any provision of these Terms shall be unlawful, void or for any reason unenforceable, then that provision shall be deemed severable from these terms of use and shall not affect the validity and enforceability of any remaining provisions. These Terms constitute a binding agreement between you and the Company, and are accepted by you upon your use of the CoreWeave Sites. These Terms and the agreements incorporated by reference, including, without limitation, our Privacy Policy, constitute the entire agreement between you and the Company regarding the use of the CoreWeave Sites. By using the CoreWeave Sites you represent that you are capable of entering into a binding agreement, and that you agree to be bound by these Terms. These Terms are governed by the laws of the state of New York, in the United States of America, and are subject to all applicable federal, state and local laws and regulations. All issues and questions concerning the construction, validity, interpretation and enforceability of these Terms shall be governed by, and construed in accordance with, the laws of New York, without giving effect to the conflict of laws rules thereof, and any matters or proceedings which are not subject to arbitration as set forth herein and/or for entering any judgment on an arbitration award, shall take place in the State of New York. By using the CoreWeave Sites, you hereby agree that any and all disputes regarding these Terms will be subject to the courts located in New York, New York. These Terms operate to the fullest extent permissible by law. YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, ANY AND ALL DISPUTES, CLAIMS AND CAUSES OF ACTION ARISING OUT OF OR CONNECTED WITH THE COREWEAVE SITES, THESE TERMS, AND/OR THE SUBMISSION OF AND/OR OUR USE OR DISTRIBUTION OF CONTENT, WILL BE RESOLVED INDIVIDUALLY, WITHOUT RESORT TO ANY FORM OF CLASS ACTION. ANY CAUSE OF ACTION OR CLAIM YOU MAY HAVE ARISING OUT OF OR RELATING TO THESE TERMS OF USE OR THE COREWEAVE SITES MUST BE COMMENCED WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES; OTHERWISE, SUCH CAUSE OF ACTION OR CLAIM IS PERMANENTLY BARRED. All other feedback, comments, requests for technical support and other communications relating to the CoreWeave Sites should be directed to `support@coreweave.com`. # Infra Control Source: https://docs.coreweave.com/products/infra-control-home Overview of CoreWeave Kubernetes Service (CKS) and the CoreWeave storage and networking products # Clusters, storage, and networking for AI at scale Infra Control brings together CoreWeave Kubernetes Service (CKS) and the storage and networking products your clusters use, from S3-compatible object storage to InfiniBand interconnect. Choose a product to get started. ## Kubernetes CoreWeave Kubernetes Service runs managed Kubernetes clusters on bare-metal GPU and CPU Nodes. [CoreWeave Kubernetes Service Managed Kubernetes on bare metal, purpose-built for training, inference, and HPC at scale. Explore CKS](/products/cks) ## Networking CoreWeave networking products create secure, high-performance connections between your resources and services. [Nimbus Control and data-plane software built into each Node's BlueField DPU.](/products/networking/nimbus) [Virtual Private Clouds (VPCs) Isolated networks for CKS clusters.](/products/networking/vpc/about-vpcs) [HPC Interconnect GPUDirect RDMA over InfiniBand or Spectrum-X for GPU-to-GPU communication.](/products/networking/hpc-interconnect/about-hpc-interconnect) [Direct Connect Dedicated cross-connects, or virtual links through Equinix and Megaport.](/products/networking/direct-connect/about-direct-connect) [IP addresses Public IPv4 and Bring Your Own IP.](/products/networking/ip/public-ipv4) [Ingress Service Public IPv4 addresses and DNS names for LoadBalancer Services.](/products/networking/ingress-service/expose-service-dns) ## Storage CoreWeave storage solutions support the data requirements of AI and ML workloads. [CoreWeave AI Object Storage S3-compatible storage for datasets, model weights, and checkpoints.](/products/storage/object-storage) [Distributed File Storage POSIX shared filesystem for multi-Node access and distributed training.](/products/storage/distributed-file-storage/about) [Dedicated VAST Storage Single-tenant VAST clusters with multi-protocol access at petabyte scale.](/products/storage/dedicated-vast) [Local Storage Ephemeral NVMe storage on GPU and CPU Nodes for scratch space and caching.](/products/storage/local-storage) [CoreWeave Database Managed, PostgreSQL-compatible database that runs in your CKS cluster.](/products/storage/cwdb) # Pricing Source: https://docs.coreweave.com/redirects/billing/pricing Redirect to the CoreWeave pricing page on coreweave.com for current GPU, CPU, storage, and network pricing details. # CoreWeave Kubernetes Service (CKS) Source: https://docs.coreweave.com/redirects/compute/cks Overview of CoreWeave Kubernetes Service (CKS) for running managed Kubernetes on bare-metal infrastructure # Agent Lens Source: https://docs.coreweave.com/redirects/forge/agent-lens Overview of Agent Lens on CoreWeave # ARIA Source: https://docs.coreweave.com/redirects/forge/aria AI research agent that analyzes experiments, explains results, and builds reports # Serverless Inference Source: https://docs.coreweave.com/redirects/forge/inference Open-source foundation models through an OpenAI-compatible API # Notebooks Source: https://docs.coreweave.com/redirects/forge/notebooks Overview of Notebooks on CoreWeave # Platform Source: https://docs.coreweave.com/redirects/forge/platform Forge platform documentation: configuration, security and access, monitoring and usage, deployment options, and Launch # Registry Source: https://docs.coreweave.com/redirects/forge/registry Centralized, versioned hub for models and datasets with lineage and deployment handoff # Sandboxes Source: https://docs.coreweave.com/redirects/forge/sandboxes Isolated compute environments on serverless capacity or your own CKS cluster # Post-Training Source: https://docs.coreweave.com/redirects/forge/training Post-train and fine-tune LLMs with Serverless RL and SFT, and distill specialized models from real traffic # Weights & Biases Source: https://docs.coreweave.com/redirects/forge/wandb W&B Models for experiment tracking, sweeps, artifacts, and reports; W&B Weave for tracing and evaluating LLM apps # Access Control Source: https://docs.coreweave.com/redirects/infrastructure/access-control Accounts and authentication, IAM, trust and compliance # Infra Control Source: https://docs.coreweave.com/redirects/infrastructure/infra-control Compute, storage, and networking # Mission Control Source: https://docs.coreweave.com/redirects/infrastructure/mission-control Mission Control Agent and the Mission Control MCP server # Observability Source: https://docs.coreweave.com/redirects/infrastructure/observability Grafana dashboards, logs, metrics, telemetry, and alerts # Workloads Source: https://docs.coreweave.com/redirects/infrastructure/workloads SUNK and CoreWeave Inference # Networking Source: https://docs.coreweave.com/redirects/networking/networking Overview of CoreWeave networking products, including VPCs, HPC Interconnect, Direct Connect, IP addresses, and Ingress Service # Platform Source: https://docs.coreweave.com/redirects/platform/platform CoreWeave platform documentation: security and admin, instances and capacity, regions, observability, billing, and policies # Storage Source: https://docs.coreweave.com/redirects/storage/storage Overview of CoreWeave AI Object Storage, Distributed File Storage, Dedicated VAST Storage, Local Storage, and CoreWeave Database # CoreWeave Observe™ Source: https://docs.coreweave.com/observability Learn about observability solutions from CoreWeave Observe™ Observability is critical to monitoring and maintaining the health and performance of a CoreWeave Cloud environment. The collection and visualization of metrics, logs, and events can help to identify potential issues and optimize future workloads. CoreWeave provides a corpus of telemetry data, collecting and indexing over 200 million metrics samples per second across all customer environments. You can select the observability solutions that best fit your needs. ## Observability solutions CoreWeave Observe™ offers the following solutions for investigating and operating your CoreWeave environment and for collecting, monitoring, and visualizing logs and metrics: * **CoreWeave Grafana**: CoreWeave's fully managed Grafana instance provides an immediate observability solution at no cost to customers. Explore performance metrics and preconfigured dashboards optimized to visualize complex workloads. This option requires no setup or maintenance, but doesn't allow for customization of the provided dashboards. See [Introduction to CoreWeave Grafana](/observability/managed-grafana) for more information. * **Weights & Biases**: Weights & Biases (W\&B) enables AI developers to build AI agents, applications, and models with confidence. When you build models on CoreWeave Kubernetes Service (CKS), you can integrate CoreWeave infrastructure alerts such as GPU failures, thermal violations, and more into your W\&B dashboards. See the [Weights & Biases documentation](/products/wandb/runs/infrastructure-alerts) for more information. * **CoreWeave Metrics**: Query metrics with PromQL, the Prometheus Query Language. PromQL is the flexible, expressive language built for querying metrics stored in Prometheus-compatible backends. See [Introduction to CoreWeave Logs and Metrics](/observability/logs-metrics/introduction) for more information. * **CoreWeave Logs**: Query logs with LogQL, the Grafana Loki querying language. See [Introduction to CoreWeave Logs and Metrics](/observability/logs-metrics/introduction) for more information. * **CoreWeave Telemetry Relay and telemetry forwarding**: Forward telemetry data to endpoints outside of CoreWeave. See [CoreWeave Telemetry Relay](/observability/telemetry-forwarding/relay) for more information. * **CoreWeave Mission Control Agent**: Investigate your CoreWeave environment through a conversational interface in the Cloud Console. The agent uses the current page and referenced resources as context and returns answers with supporting evidence. Mission Control Agent is in public preview. In organizations where CoreWeave has enabled write tools, it can also perform supported resource changes. For more information, see [Mission Control Agent](/observability/mission-control-agent). * **CoreWeave Mission Control MCP**: Connect a Model Context Protocol (MCP)-compatible AI client to CoreWeave APIs and observability data through a hosted server. Available tools inherit your existing CoreWeave permissions, and organization-gated write tools can modify supported resources. For more information, see [Mission Control MCP](/observability/mission-control-mcp). * **Self-hosted Grafana**: Self-host a Grafana instance to create and customize dashboards, including those provided with CoreWeave Grafana, without limitation. This option requires more setup and configuration than the managed option, but grants the freedom to create fully customized dashboards that can be tuned to display unique workloads. See [Self-hosted Grafana](/observability/self-hosted-grafana) for more information. * **Resource Usage**: Monitor compute, storage, and networking usage in Grafana to manage costs and optimize performance. See [Cost and Usage Monitoring](/observability/usage-monitoring) for more information. * **CoreWeave Alerts**: Real-time notifications about your clusters, deployments, and operations, delivered through Slack or a webhook. See [CoreWeave Alerts](/platform/coreweave-alerts) for more information. # Backfill historical logs with LogCLI Source: https://docs.coreweave.com/observability/logs-metrics/backfill-historical-logs Download historical logs with LogCLI for archiving and backfilling Use [LogCLI](https://grafana.com/docs/loki/latest/query/logcli/getting-started/), the command-line client for Grafana Loki, to download retained historical logs as a set of part files for archiving or offline analysis. LogCLI splits a time range into smaller queries and downloads them concurrently, which helps with large exports. > [!NOTE] > > On this page, backfill means exporting logs that CoreWeave already stores, not ingesting logs into Loki. You can export only logs that are still retained in the selected data source. CoreWeave retains CKS audit logs for 3 months, and platform and application logs for 14 days. For the full list, see [Retention limits](/observability/service-levels-and-limits#retention-limits). ## Prerequisites Complete the following before you export logs: * [Install LogCLI](https://grafana.com/docs/loki/latest/query/logcli/getting-started/#install-logcli) version 2.8.0 or later. The examples on this page use the parallel-download flags, which are available in LogCLI 2.8.0 and later. On macOS, you can also install LogCLI with `brew install logcli`. * Create a [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens). For read-only access to logs, principals typically need the **Observability Viewer** [IAM role](/security/iam/access-policies/roles). Assign it to the principal associated with the token. * Choose the endpoint that stores your logs. For application, platform, and CKS audit log endpoints, see [Logs data locations](/observability/logs-metrics/data-sources#logs-data-locations). * Choose a start time and end time in RFC 3339 format, such as `2026-07-16T00:00:00Z`. The start time must be earlier than the end time. ## Configure LogCLI Set `LOKI_BEARER_TOKEN`, which LogCLI uses to authenticate, and `LOG_EXPORT_DIR`, which the examples use to construct each part-file path. Replace `[API-ACCESS-TOKEN]` with your CoreWeave API access token secret. Replace `[OUTPUT-DIRECTORY]` with the directory where you want LogCLI to save the downloaded part files. ```bash theme={"system"} export LOKI_BEARER_TOKEN="[API-ACCESS-TOKEN]" export LOG_EXPORT_DIR="[OUTPUT-DIRECTORY]" mkdir -p "${LOG_EXPORT_DIR}" ``` The following examples set `LOKI_ADDR` to a Super Regional endpoint. To query another location or log type, select the corresponding endpoint from [Logs data locations](/observability/logs-metrics/data-sources#logs-data-locations). ## Export CKS audit logs The following example downloads CKS audit logs for Region `US-EAST-04` from the dedicated US East audit logs endpoint. Replace `[START-TIME]` and `[END-TIME]` with the RFC 3339 boundaries of the time range you want to export. ```bash theme={"system"} export LOKI_ADDR="https://observe-audit.us-east.coreweave.com" logcli query \ --timezone=UTC \ --from="[START-TIME]" \ --to="[END-TIME]" \ --forward \ --output=raw \ --part-path-prefix="${LOG_EXPORT_DIR}/us-east-04-audit-logs" \ --parallel-duration="1m" \ --parallel-max-workers="4" \ '{region="US-EAST-04", app="kube-apiserver", stream=""}' ``` This command does the following: * Splits the requested time range into one-minute jobs. * Runs up to four download workers concurrently. * Scans each job forward from older to newer entries. * Writes each completed job to a separate part file under the specified prefix. * Writes each audit event as the raw JSON that Loki stores. ## Choose an output format LogCLI applies `--output` to the part files it writes, so the format you choose is the format you archive. The default output prefixes each line with its labels and timestamp, which isn't machine readable without further processing. The following table describes the values that `--output` accepts: | Value | Result | Use for | | - | - | - | | `default` | Labels and timestamp, then the log line | Reading logs directly | | `raw` | The log line only, with no labels or timestamp | Audit logs, which Loki already stores as JSON | | `jsonl` | One JSON object per line, wrapping labels, timestamp, and the log line | Application logs, when you want to keep metadata | > [!NOTE] > > When you run LogCLI in a terminal, `--output=default` also writes color codes into the part files. To suppress them, redirect LogCLI's output or set the `NO_COLOR` environment variable. Choose between `raw` and `jsonl` based on whether the log line already carries its own timestamp and identifying fields: * Use `--output=raw` for audit logs. Each audit event is already JSON and records its own timestamps and request details, so `--output=jsonl` would nest that JSON inside another JSON object. * Use `--output=jsonl` for application and container logs. These lines are opaque text with no reliable embedded timestamp. The JSON wrapper therefore preserves when each line was written and which pod it came from. `--output=raw` discards the Loki stream labels, and an audit event doesn't repeat them in its body. The exported events therefore don't record which Region, cluster, or pod they came from. Use `--output=jsonl` when you need to keep that context, or give each export a `--part-path-prefix` that identifies the source. ## Export application logs for a container The following example downloads logs from a specific container in Region `US-EAST-04`. Replace `[CONTAINER-NAME]`, `[START-TIME]`, and `[END-TIME]` with your container name and time range. Container names aren't unique across the Region, so this selector matches every container with that name in any cluster or namespace. To export logs from one workload, add `cluster` and `namespace` to the selector. ```bash theme={"system"} export LOKI_ADDR="https://observe.us-east.coreweave.com" logcli query \ --timezone=UTC \ --from="[START-TIME]" \ --to="[END-TIME]" \ --forward \ --output=jsonl \ --part-path-prefix="${LOG_EXPORT_DIR}/us-east-04-container-logs-[CONTAINER-NAME]" \ --parallel-duration="1m" \ --parallel-max-workers="4" \ '{region="US-EAST-04", container="[CONTAINER-NAME]"}' ``` This command uses the same parallel-download flags as the audit log example and writes matching container logs to separate part files. It uses `--output=jsonl` rather than `--output=raw` so that each line keeps its labels and timestamp. If your workload already writes structured JSON logs that carry their own timestamp, use `--output=raw` instead to avoid nesting that JSON inside another JSON object. ## Resume an interrupted export LogCLI skips a time range when it finds the completed part file for that range. If an export stops before it finishes, rerun the same command to download only the missing parts. > [!WARNING] > > Use a unique `--part-path-prefix` for each query. LogCLI names completed part files from the prefix and each job's time range, and it skips matching files without checking the LogQL selector. If you reuse a prefix and time range for a different query, the export omits the new query results for those completed parts. To intentionally download all parts again, add the `--overwrite-completed-parts` flag. For more information, see the [LogCLI query command reference](https://grafana.com/docs/loki/latest/query/logcli/getting-started/#query-command-reference). ## Handle query series limits A broad audit log query can exceed the limit on the number of unique series a single query may return, which fails the query with an HTTP 400 response. If that happens, divide the query into separate queries by pod. To list pod names, run the following LogCLI command. It reads the label index instead of scanning logs, so it's faster than a log query and doesn't risk the same series limit: ```bash theme={"system"} logcli labels pod --from="[START-TIME]" --to="[END-TIME]" ``` This returns every `pod` value on the endpoint for that time range. `logcli labels` doesn't accept a stream selector, so the list isn't restricted to a single Region. For more information, see the [LogCLI labels command reference](https://grafana.com/docs/loki/latest/query/logcli/getting-started/#labels-command-reference). To list only the pods that produced matching audit logs, run this LogQL metric query in [Grafana Explore](/observability/logs-metrics/introduction#grafana-explore) instead: ```logql theme={"system"} sum by (pod) ( count_over_time( {app="kube-apiserver", region="US-EAST-04", stream=""}[7d] ) ) ``` Then add the `pod` label to the audit log selector. Replace `[POD-NAME]` with one of the pod names returned by the preceding query. Use a unique `--part-path-prefix` for that pod. Run the audit log export once for each pod. The following example sets `LOKI_ADDR` again, but still requires the `LOKI_BEARER_TOKEN` you set in [Configure LogCLI](#configure-logcli): ```bash theme={"system"} export LOKI_ADDR="https://observe-audit.us-east.coreweave.com" logcli query \ --timezone=UTC \ --from="[START-TIME]" \ --to="[END-TIME]" \ --forward \ --output=raw \ --part-path-prefix="${LOG_EXPORT_DIR}/us-east-04-audit-logs-[POD-NAME]" \ --parallel-duration="1m" \ --parallel-max-workers="4" \ '{app="kube-apiserver", region="US-EAST-04", stream="", pod="[POD-NAME]"}' ``` Running the export once per pod writes a separate set of part files for each pod. ## See also * [Retention limits](/observability/service-levels-and-limits#retention-limits): how long CoreWeave keeps each telemetry type, which determines what you can still export. * [Configure Telemetry Relay](/observability/telemetry-forwarding/configure): how to forward telemetry to an external destination when you need retention beyond those limits. * [Logs data locations](/observability/logs-metrics/data-sources#logs-data-locations): the full endpoint matrix for application, platform, and CKS audit logs. # Data sources Source: https://docs.coreweave.com/observability/logs-metrics/data-sources Understand the Global and Super Regional data source locations for querying CoreWeave metrics and logs CoreWeave captures and stores metrics and logs to help you monitor the health of your systems and troubleshoot issues. This page describes the Global and Super Regional data sources available for querying that data, and helps you choose the right data source for your use case. CoreWeave stores logs and metrics in the location where they're generated. For example, the metrics and logs for a cluster in the Availability Zone `US-EAST-04A` are stored in the `US-EAST` Super Region. For more information about Regions and Availability Zones, see [About Regions and Availability Zones](../../platform/regions/about-regions-and-azs). ## Data locations and queries CoreWeave provides two main locations to query data from: * **Global location**. A single data source for all logs and metrics in all locations. The Global location lets you query and visualize metrics and logs data across clusters from multiple geographical locations. * **Super Regional location**. The Super Regional data source for your metrics and logs. Super Regional locations are useful for highly latency-sensitive use cases and for issues that require deeper investigation. Super Regional-bound queries return more data because they don't reach the limits sometimes imposed by global queries. Use the following table to help determine when to use Global or Super Regional data: | Data source | When to use | | - | - | | **Global** | Building dashboards spanning multiple regions. Investigating issues affecting multiple clusters. Performing high-level observability analysis. | | **Super Regional** | Troubleshooting a specific cluster. Running large or detailed log queries. Investigating incidents where query result limits may apply. | For more information about Super Regions, see [CoreWeave's geographical hierarchy](/platform/regions/about-regions-and-azs#geographical-hierarchy). ## Metrics data locations CoreWeave provides the following data sources for metrics: | Location | Address | Grafana data source name | Default data source | | - | - | - | - | | Global | `observe.coreweave.com` | CoreWeave Metrics | Yes | | US-EAST | `observe.us-east.coreweave.com` | CoreWeave Metrics US-EAST | No | | US-WEST | `observe.us-west.coreweave.com` | CoreWeave Metrics US-WEST | No | | EU-SOUTH | `observe.eu-south.coreweave.com` | CoreWeave Metrics EU-SOUTH | No | ## Logs data locations [Logs](#log-content) are available from both Global and Super Regional data sources. Audit logs are available through dedicated audit logs data sources in each Super Region. In the Global data source, the CoreWeave logs dataset also includes audit logs to support cross-region observability queries. For more targeted investigation or security analysis, use the regional CoreWeave audit logs data sources. The location-specific log sources contain all logs except CKS audit logs, and the location-specific audit log data sources only contain CKS audit logs. CoreWeave provides the following data sources for application and audit logs: | Location | Addresses | Grafana data source name | Default data source | | - | - | - | - | | Global | `observe.coreweave.com` | CoreWeave Logs (includes audit logs) | Yes | | US-EAST | `observe.us-east.coreweave.com` `observe-audit.us-east.coreweave.com` | CoreWeave Logs US-EAST CoreWeave Audit Logs US-EAST | No No | | US-WEST | `observe.us-west.coreweave.com` `observe-audit.us-west.coreweave.com` | CoreWeave Logs US-WEST CoreWeave Audit Logs US-WEST | No No | | EU-SOUTH | `observe.eu-south.coreweave.com` `observe-audit.eu-south.coreweave.com` | CoreWeave Logs EU-SOUTH CoreWeave Audit Logs EU-SOUTH | No No | ### Log content | Log type | Contents | | - | - | | **Application and platform logs** | Customer workload and pod logs from CKS (for example, container `stdout` and `stderr` and application output). | | **CKS audit logs** | Tracking and recording system events and user activities for security analysis and compliance. | The Global location provides a single unified query interface across all locations and types of logs. ## Query latency Latency is already low when querying metrics and logs from the Global location. However, for the lowest latency, query from the location where the metrics or logs are stored. To find where CoreWeave stores your metrics or logs, use the Cloud Console or API to get the location of your clusters, and then refer to the following table to discover where CoreWeave stores your cluster's metrics or logs: | Metrics and logs location | Cluster locations | | - | - | | US-EAST | All clusters in the US-EAST and CA-EAST Super Regions | | US-WEST | All clusters in the US-WEST and US-CENTRAL Super Regions | | EU-SOUTH | All clusters in the EU | # Forward application metrics Source: https://docs.coreweave.com/observability/logs-metrics/forward-metrics Deploy a Prometheus Agent in a CKS cluster to forward application metrics to an external system To forward CoreWeave Kubernetes Service (CKS) metrics to an external system, deploy the [Prometheus Agent](https://prometheus-operator.dev/docs/platform/prometheus-agent/) inside your CKS cluster and configure it to use remote-write. > [!NOTE] > > CKS clusters deployed **before** July 7, 2025 have Prometheus Operator pre-installed. > > CKS clusters deployed **after** July 7, 2025 don't have Prometheus Operator pre-installed. Clusters deployed after this date must [install Prometheus Operator](https://prometheus-operator.dev/docs/getting-started/installation/) before proceeding with the following steps. To deploy the Prometheus Agent in your CKS cluster, complete the following steps: 1. Choose a namespace to deploy the Prometheus Agent in. You can deploy the Prometheus Agent to an existing namespace, or create a new namespace with `kubectl`. To create a new namespace, replace `[NAMESPACE-NAME]` with your chosen namespace and run: ```bash theme={"system"} kubectl create namespace "[NAMESPACE-NAME]" ``` 2. Configure the [Prometheus Agent CustomResource YAML file](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/getting-started/design.md#prometheus-agent) with your remote-write destination, as in the following example: ```yaml title="sample-prometheus-agent.yaml" theme={"system"} apiVersion: monitoring.coreos.com/v1alpha1 kind: PrometheusAgent metadata: name: my-prom-agent namespace: "[NAMESPACE-NAME]" spec: remoteWrite: - url: "https://example-url/api/v1/write" ... ``` For more information about `remoteWrite` configurations, see the [Prometheus Operator API reference](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.RemoteWriteSpec). 3. To deploy the Prometheus Agent to your CKS cluster, replace `sample-prometheus-agent.yaml` with the appropriate filename and run: ```bash theme={"system"} kubectl apply -f sample-prometheus-agent.yaml ``` Metrics generated within your CKS cluster now remote-write to your specified destination. # Query logs and metrics Source: https://docs.coreweave.com/observability/logs-metrics/introduction Call the metrics and logs HTTP APIs with a CoreWeave access token, including regional hosts and historical metrics endpoints Programmatic access to metrics and logs lets you integrate CoreWeave observability data into custom dashboards, alerting pipelines, and automation workflows. Query the Prometheus-compatible and Loki-compatible HTTP APIs directly when you need capabilities beyond what [CoreWeave Grafana](/observability/managed-grafana) or [self-hosted Grafana](/observability/self-hosted-grafana) provide. To efficiently export metrics and logs at scale, consider setting up telemetry forwarding to an external system with [CoreWeave Telemetry Relay](/observability/telemetry-forwarding/relay). For more information about metric and log data sources, see [Data sources](/observability/logs-metrics/data-sources). ## Authentication and access Use a [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens) for HTTP requests to the observability query endpoints. Pass the token in the `Authorization` header as a Bearer token. Replace **`[API-ACCESS-TOKEN]`** in the following examples with your API access token secret from the [Access Tokens](https://console.coreweave.com/tokens) page in the Cloud Console. CoreWeave evaluates authorization for observability data through [IAM Access Policies](/security/iam/access-policies). For read-only access to metrics and logs through the APIs and CoreWeave Grafana, principals typically need the **Observability Viewer** role. In the legacy group-based model, membership in the `metrics` group granted equivalent access. See [Legacy User Permissions](/security/iam/access-policies/legacy-permissions) for details. > [!NOTE] > > The secret for a [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens) is the same value whether you pass it in `Authorization` headers or embed it in a [kubeconfig](/security/authn-authz/manage-api-access-tokens) as `users[].user.token` for `kubectl`. The difference is which service you call: use observability hostnames such as `observe.coreweave.com` for metrics and logs APIs, and use your cluster Kubernetes API server URL from the kubeconfig for the Kubernetes API. ## Query metrics You can query metrics through the Prometheus-compatible HTTP API. The following sections describe the available endpoints, the supported request paths, and example queries for both instant and range data. ### Global and Super Regional endpoints Metrics are available from the Global hostname and from Super Regional hostnames. The endpoint you choose affects both query performance and the completeness of results. Super Regional endpoints can return more complete results for large or detailed queries and offer lower latency when your data is stored in that Super Region. For the authoritative list of metrics hostnames, see [Metrics data locations](/observability/logs-metrics/data-sources#metrics-data-locations) on the Data sources page. The following examples use the Global hostname `observe.coreweave.com`. To send the same request to a Super Regional endpoint, swap the hostname and keep the path (for example, `https://observe.us-east.coreweave.com/api/v1/query`). The following paths are supported: | Supported paths | | - | | `/api/v1/query` | | `/api/v1/labels` | | `/api/v1/query_range` | | `/api/v1/series` | | `/api/v1/label//values` | | `/api/v1/query_exemplars` | | `/api/v1/metadata` | | `/api/v1/rules` | #### Instant metric query The following example uses `curl` to run an instant query that returns the total time GPUs spent in idle mode (in seconds): ```bash theme={"system"} curl -G "https://observe.coreweave.com/api/v1/query" \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ --data-urlencode 'query=node_gpu_seconds_total{mode="idle"}' ``` #### Range metric query For a time range, use `query_range` with `start`, `end`, and `step` as Unix timestamps in seconds: ```bash theme={"system"} curl -G "https://observe.coreweave.com/api/v1/query_range" \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ --data-urlencode 'query=node_gpu_seconds_total{mode="idle"}' \ --data-urlencode 'start=[START-TIMESTAMP]' \ --data-urlencode 'end=[END-TIMESTAMP]' \ --data-urlencode 'step=60' ``` Replace **`[START-TIMESTAMP]`** and **`[END-TIMESTAMP]`** with the range you need. For more information about querying Prometheus metrics, see the Prometheus [HTTP API documentation](https://prometheus.io/docs/prometheus/latest/querying/api/). > [!NOTE] > > CoreWeave does not support the [Prometheus Federation API](https://prometheus.io/docs/prometheus/latest/federation/). ### Legacy metrics If your queries cover dates before the October 2024 backend migration, query the Legacy Prometheus host to retrieve that historical data. CoreWeave migrated its metrics backend in October 2024, and the new backend reliably contains data from **October 21, 2024** onward. For metrics collected before that date, query the Legacy Prometheus host in addition to the preceding primary endpoints. The Legacy service exposes the same Prometheus HTTP API paths (for example, `/api/v1/query` and `/api/v1/query_range`). | Host | Use | | - | - | | `prometheus-legacy.ord1.coreweave.com` | Historical metrics data collected before October 21, 2024 | > [!WARNING] > > Query the current endpoint first (for example, `observe.coreweave.com`), because it's faster. If the result has gaps for dates before October 21, 2024, run the same PromQL query against `https://prometheus-legacy.ord1.coreweave.com` with the same `Authorization: Bearer [API-ACCESS-TOKEN]` header. ## Query logs You can query logs through the Loki-compatible HTTP API. The following sections cover the host matrix for each log type, the supported paths, and an example query. ### Global and Super Regional log endpoints At the Global host, application, platform, and audit logs share one Loki-compatible API. In Super Regions, application and platform logs use `observe..coreweave.com`, and **CKS audit logs** use the dedicated audit host `observe-audit..coreweave.com` in that Super Region. For the full matrix and Grafana data source names, see [Logs data locations](/observability/logs-metrics/data-sources#logs-data-locations). Some log types expire after two weeks. | Location | Application and platform logs | CKS audit logs | | - | - | - | | Global | `observe.coreweave.com` | `observe.coreweave.com` (audit logs are included in the same dataset) | | US East | `observe.us-east.coreweave.com` | `observe-audit.us-east.coreweave.com` | | US West | `observe.us-west.coreweave.com` | `observe-audit.us-west.coreweave.com` | | EU South | `observe.eu-south.coreweave.com` | `observe-audit.eu-south.coreweave.com` | The following paths are supported: | Supported paths | | - | | `/loki/api/v1/query` | | `/loki/api/v1/query_range` | | `/loki/api/v1/labels` | | `/loki/api/v1/label//values` | | `/loki/api/v1/series` | | `/loki/api/v1/index/stats` | | `/loki/api/v1/index/volume` | | `/loki/api/v1/index/volume_range` | | `/loki/api/v1/format_query` | #### Log query format The following example returns Kubernetes audit logs for a cluster: ```bash theme={"system"} curl -G "https://observe.coreweave.com/loki/api/v1/query_range" \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ --data-urlencode 'query={logging_component="unicaster", app="kube-apiserver", stream="", cluster="[CLUSTER-NAME]"} | json | apiVersion="audit.k8s.io/v1" | json sourceIPs="sourceIPs" | json user_groups="user.groups"' ``` Replace `[CLUSTER-NAME]` with your cluster name. To download retained logs over a large time range, see [Backfill historical logs with LogCLI](/observability/logs-metrics/backfill-historical-logs). ## Grafana Explore If you prefer an interactive UI to direct API calls, you can run the same kinds of ad hoc queries in Grafana. **[Grafana Explore](https://grafana.com/docs/grafana/latest/visualizations/explore/)** is available in CoreWeave Grafana and supports the full range of PromQL and LogQL for ad hoc queries on metrics and logs. You can also view metadata such as which metrics are available or which labels you can use to filter PromQL queries. CoreWeave's default dashboards offer curated views of specific logs and metrics, and you can use the **Explore** tab to investigate metrics in more detail. ![Grafana Explore tab showing the query interface and metric metadata](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-explore-tab.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=1bcd17f9b11e67fb5581692157fb16e3) > [!NOTE] > > For more information, see [Get started with Grafana Explore](https://grafana.com/docs/grafana/latest/visualizations/explore/get-started-with-explore/). # Introduction to CoreWeave Grafana Source: https://docs.coreweave.com/observability/managed-grafana Learn about CoreWeave Grafana's preconfigured dashboards and custom dashboards (preview) CoreWeave Kubernetes Service (CKS) provides a managed Grafana instance with preconfigured dashboards that display the metrics, events, and logs most relevant to your workloads. With dashboard editing access, you can also create and save [custom dashboards](#custom-dashboards), currently in preview, in your organization's root folder. CoreWeave-provided dashboards remain read-only. For custom alerting, see [Self-hosted Grafana](/observability/self-hosted-grafana) and [Custom GPU utilization alerts](/observability/self-hosted-grafana/custom-alerts). ## Where to start If you're new to CoreWeave Grafana, the following table lists the first dashboards to check for common tasks. For the full catalog, see [Available dashboards](#available-dashboards). To open any dashboard, see [Access CoreWeave Grafana](/observability/managed-grafana/access). | If you want to | Open this dashboard | | - | - | | Debug a single Pod or container, including GPU usage, events, and logs | [Pod Inspector](/observability/managed-grafana/cks/pod-inspector) | | Check Node and GPU hardware health | [Node Details](/observability/managed-grafana/fleet/node-details) | | Review Kubernetes training workload efficiency and active GPUs | [Kubernetes Training Workloads](/observability/managed-grafana/kubernetes/training-jobs) | | See Slurm job trends by partition, account, and user | [Slurm Cluster](/observability/managed-grafana/sunk/slurm-cluster) | | Debug a specific Slurm job | [Slurm Job Metrics](/observability/managed-grafana/sunk/slurm-job-metrics) | | Monitor AI Object Storage performance and cache | [CAIOS Usage](/observability/managed-grafana/storage/caios-usage) and [CAIOS LOTA](/observability/managed-grafana/storage/caios-lota) | | Monitor request rate, latency, and scaling for a Dedicated Inference deployment | [Inference Model Overview](/observability/managed-grafana/dedicated-inference/inference-model-overview) | | Build and save your own view of Pod metrics | [Create a custom dashboard](/observability/managed-grafana/custom-dashboards) (preview) | ## Available dashboards CoreWeave provides a suite of preconfigured dashboards, available by default in CoreWeave Grafana. The following sections describe the available dashboard categories. ### CoreWeave The CoreWeave home dashboard provides an overview of your CoreWeave environment, including announcements, environment-wide metrics, and live service status. | Dashboard | Description | Dashboard link | | - | - | - | | Home | Displays platform announcements, top-level GPU, Pod, and storage metrics, links to key dashboards, and CoreWeave service status. To learn more, read the [Grafana Home documentation](/observability/managed-grafana/coreweave/home). | [Home dashboard in Grafana](https://cks-grafana.coreweave.com/d/a400d6f5-96a9-4454-9cc8-3b15a746e09e/home) | ### CoreWeave Kubernetes Service (CKS) CKS dashboards provide insights into Control Plane, Kubernetes, and Pod-level logs and metrics. | Dashboard | Description | Dashboard link | | - | - | - | | Control Plane Logs | Displays logs for Control Plane components, including the API server, etcd, controller manager, and scheduler to monitor their health and status. To learn more, go to [Control Plane Logs](/observability/managed-grafana/cks/control-plane-logs). | [Control Plane Logs](https://cks-grafana.coreweave.com/d/cluster-health-logs/control-plane-logs) | | Control Plane Metrics | Provides a detailed view of your cluster's health. To learn more, go to [Control Plane Metrics](/observability/managed-grafana/cks/control-plane-metrics). | [Control Plane Metrics](https://cks-grafana.coreweave.com/d/cluster-health/control-plane-metrics) | | Kubernetes Audit Logs | Displays Kubernetes audit logs, showing details of user activities and requests made to the Kubernetes API. To learn more, go to [Kubernetes Audit Logs](/observability/managed-grafana/cks/kubernetes-audit-logs). | [Kubernetes Audit Logs](https://cks-grafana.coreweave.com/d/k8s-audit-logs/kubernetes-audit-logs) | | Pod Inspector | Provides a combined view of common Pod metrics, Kubernetes events, and Pod logs, filtered to a specific Pod or container in any namespace. To learn more, go to [Pod Inspector](/observability/managed-grafana/cks/pod-inspector). | [Pod Inspector](https://cks-grafana.coreweave.com/d/G8-j827Mk/pod-inspector) | ### Dedicated Inference The Inference Model Overview dashboard provides request, queueing, latency, and scaling metrics for your [Dedicated Inference](/products/inference/dedicated) deployments. | Dashboard | Description | Dashboard link | | - | - | - | | Inference Model Overview | Displays request rate and success rate, queueing and load balancing, inference runtime latency, autoscaling, and per-Pod metrics for a deployment. To learn more, go to [Inference Model Overview](/observability/managed-grafana/dedicated-inference/inference-model-overview). | [Inference Model Overview](https://cks-grafana.coreweave.com/d/dep76910f3im8h/inference-model-overview) | ### Fleet management Fleet management dashboards provide insight into trends in resource consumption, state, and events for the Nodes and Pods in your clusters. | Dashboard | Description | Dashboard link | | - | - | - | | Cabinet Visualizer | Provides statistics and historical information about each cabinet, its cooling system, and the rack it contains. From here you can monitor the overall health of the cabinet and see important details about each Node in the enclosed rack to identify issues and track historical trends. To learn more, go to [Cabinet Visualizer](/observability/managed-grafana/fleet/cabinet-visualizer). | [Cabinet Visualizer](https://cks-grafana.coreweave.com/d/de3qwk31ucpvkf/cabinet-visualizer) | | Cabinet Wrangler | Provides an overview of the available GPUs and racks with production-schedulable Nodes. To learn more, go to [Cabinet Wrangler](/observability/managed-grafana/fleet/cabinet-wrangler). | [Cabinet Wrangler](https://cks-grafana.coreweave.com/d/ceif6c5udzytca/cabinet-wrangler) | | Node Details | Provides a detailed breakdown of Node and GPU health, both at the physical hardware level and in Kubernetes. This dashboard contains additional log panels to allow simultaneous viewing of metrics along with the log and event types commonly needed to debug or analyze a Node. To learn more, go to [Node Details](/observability/managed-grafana/fleet/node-details). | [Node Details](https://cks-grafana.coreweave.com/d/ddbdicm9sw7c5x/node-details) | | Node Wrangler | Provides visibility into the overall health and state of all Nodes in your clusters, along with their specs and hardware architectures. To learn more, go to [Node Wrangler](/observability/managed-grafana/fleet/node-wrangler). | [Node Wrangler](https://cks-grafana.coreweave.com/d/FWuqvUH4z/node-wrangler) | ### Kubernetes training Kubernetes dashboards provide detailed information about Kubernetes training workloads and the Kueue scheduling that places them. | Dashboard | Description | Dashboard link | | - | - | - | | Kubernetes Training Workloads | Provides a combined view of a training workload's hardware metrics and placement topology, including Nodes, Pods, job efficiency, and active GPUs. To learn more, go to [Kubernetes Training Workloads](/observability/managed-grafana/kubernetes/training-jobs). | [Kubernetes Training Workloads](https://cks-grafana.coreweave.com/d/0e4589d5-97fc-4d60-8c5c-301d43f57edd/kubernetes-training-workloads) | | Kueue Scheduling Dashboard | Displays Kueue scheduling metrics, including admissions, queue status, preemptions, and GPU topology capacity. To learn more, go to [Kueue Scheduling Dashboard](/observability/managed-grafana/kubernetes/kueue-metrics). | [Kueue Scheduling Dashboard](https://cks-grafana.coreweave.com/d/amwdvqq/kueue-scheduling-dashboard) | ### Network backbone The network backbone dashboards provide insight into the state of your network, including traffic metrics, connection counts, and latency. | Dashboard | Description | Dashboard link | | - | - | - | | Internet Transit | Provides a near-real-time view into how much traffic flows through your backbone ingress and egress points, how that traffic is distributed across internal services, and how well the network is performing from an end-user perspective. To learn more, go to [Internet Transit](/observability/managed-grafana/network-backbone/internet-transit). | [Internet Transit](https://cks-grafana.coreweave.com/d/ce3pbkpbkhn9cd/internet-transit) | ### Storage The storage dashboards provide performance and operational metrics for CoreWeave AI Object Storage, distributed file, VAST, and WEKA storage systems. | Dashboard | Description | Dashboard link | | - | - | - | | CAIOS LOTA | Displays metrics for the CAIOS LOTA storage system, focusing on requests, cache hit rates, and range requests. To learn more, go to [CAIOS LOTA](/observability/managed-grafana/storage/caios-lota). | [CAIOS LOTA](https://cks-grafana.coreweave.com/d/eeff523hiaewwc/caios-lota) | | CAIOS Usage | Displays metrics to assist with monitoring and troubleshooting Object Storage performance. To learn more, go to [CAIOS Usage](/observability/managed-grafana/storage/caios-usage). | [CAIOS Usage](https://cks-grafana.coreweave.com/d/bebi5t788t6v4c/caios-usage) | | Distributed File Storage Usage | Displays information about distributed file storage usage, including storage volume metrics and persistent volume claims status. To learn more, go to [Distributed File Storage Usage](/observability/managed-grafana/storage/distributed-storage). | [Distributed File Storage Usage](https://cks-grafana.coreweave.com/d/felwdhehb6ewwa/distributed-file-storage-usage) | | VAST Actors | Displays metrics related to VAST storage performance, including NFS bandwidth, requests per second, metadata IOPS response time, and Node response times. To learn more, go to [VAST Actors](/observability/managed-grafana/storage/vast-actors). | [VAST Actors](https://cks-grafana.coreweave.com/d/ddq5gg6gi5lvke/vast-actors) | | WEKA | Provides information about the WEKA storage system, including cluster-wide info, protection status, cluster capacities, and performance metrics. To learn more, go to [WEKA](/observability/managed-grafana/storage/weka). | [WEKA](https://cks-grafana.coreweave.com/d/feg6mkz6mg934d/weka) | ### SUNK The SUNK dashboards provide insight into the state of your Slurm cluster, including job metrics, Node health, and resource consumption. | Dashboard | Description | Dashboard link | | - | - | - | | Slurm Block Topology | Provides an overview of the availability, allocation, and status of compute Nodes, specifically organized by a block topology. To learn more, go to [Slurm Block Topology](/observability/managed-grafana/sunk/slurm-block-topology). | [Slurm Block Topology](https://cks-grafana.coreweave.com/d/6d5afc99-124d-4ab4-9914-fde3bf8c581e/slurm-block-topology) | | Slurm Cluster | Provides an overview of the state of SUNK jobs within your clusters, with less focus on the specifics of a given job. It aggregates metrics by relevant properties, such as job state, resource type, and user, to illustrate trends in jobs. To learn more, go to [Slurm Cluster](/observability/managed-grafana/sunk/slurm-cluster). | [Slurm Cluster](https://cks-grafana.coreweave.com/d/bX7jn6dZk/slurm-cluster) | | Slurm Job Metrics | Displays metrics used for debugging and analyzing the performance of specific jobs within your cluster. It provides detailed information about the Nodes running a given job, including alerts and states. To learn more, go to [Slurm Job Metrics](/observability/managed-grafana/sunk/slurm-job-metrics). | [Slurm Job Metrics](https://cks-grafana.coreweave.com/d/slurm-job-metrics/slurm-job-metrics) | | SUNK Global | Provides a high-level overview of SUNK infrastructure across all regions, cluster organizations, and clusters. To learn more, go to [SUNK Global](/observability/managed-grafana/sunk/sunk-global). | [SUNK Global](https://cks-grafana.coreweave.com/d/sunk-global/sunk-global) | > [!NOTE] > > To access these dashboards in a self-hosted Grafana instance, [install the Helm Chart in the CoreWeave Charts repository](/products/cks/clusters/coreweave-charts/introduction). ## Custom dashboards > [!NOTE] > > Custom dashboards in CoreWeave Grafana are in preview. Custom dashboards let you save visualizations of queries against the data sources available in CoreWeave Grafana. Use them to organize the metrics and logs relevant to your workloads in dashboards that other authorized users in your organization can view. For a step-by-step example, see [Create a custom dashboard](/observability/managed-grafana/custom-dashboards). ### Organization folders CoreWeave provides a root folder named after your organization's display name followed by **Dashboards**, for example **\[Example Corp] Dashboards**. All custom dashboards and subfolders belong inside this folder. Users with dashboard editing access can rename the root folder and use subfolders to organize dashboards. Content created by your organization is visible only to authorized users in your organization. > [!WARNING] > > Deleting your organization's root folder deletes all dashboards and subfolders inside it. If this happens, [open a support ticket](/support/contact) to restore access to custom dashboards. ### Dashboard access You manage dashboard access through [Identity and Access Management (IAM) access policies](/security/iam/access-policies) in the Cloud Console. The **Administrator** and **User** [default access policies](/security/iam/access-policies#default-access-policies) grant read and write access to your organization's custom dashboards. The **Viewer** default policy grants read access. All three default policies also include **Observability Viewer**. For custom policies, use the following roles: | Role | Access | | - | - | | Grafana Dashboard Viewer | Read custom dashboards in your organization. | | Grafana Dashboard Editor | Edit custom dashboards in your organization. | | Observability Viewer | Access metrics and logs used by dashboards. | To edit custom dashboards, you need both **Grafana Dashboard Viewer** and **Grafana Dashboard Editor**. Dashboard permissions and data access are separate. The Grafana Dashboard roles control access to your organization's custom dashboards, not to the metrics and logs that dashboards query. To see data in a dashboard, you also need **Observability Viewer**. The Grafana Dashboard roles don't control access to CoreWeave-provided dashboards. # Access and use CoreWeave Grafana dashboards Source: https://docs.coreweave.com/observability/managed-grafana/access Learn how to access and use CoreWeave Grafana dashboards CoreWeave Grafana dashboards provide visibility into the performance, usage, and cost of your CoreWeave resources. This page explains how to sign in, locate available dashboards, and navigate their panels. For the relationship between identity, credentials, and IAM roles across CoreWeave, see the [CoreWeave authorization model](/security/iam#authorization-model). ## Prerequisites Before you begin, check these access requirements: * You must sign in to the [Cloud Console](https://console.coreweave.com/) to access CoreWeave Grafana. * You need the [Observability Viewer](/security/iam/access-policies/roles#observability-and-telemetry) role in an [IAM access policy](/security/iam/access-policies) to access the metrics and logs used by dashboards. In the legacy CoreWeave permissions model, membership in the [`metrics` group](/security/iam/access-policies/legacy-permissions) grants equivalent access. * To access the [Usage by Product and Zone dashboard](/observability/managed-grafana/cost-usage/usage-product-zone), you need both the **Observability Viewer** and **Billing Viewer** roles in an [IAM access policy](/security/iam/access-policies). In the legacy CoreWeave permissions model, membership in the [`metrics` and `billing_viewer` groups](/security/iam/access-policies/legacy-permissions) also grants this access. Custom dashboards are in preview. To view, create, or edit your organization's custom dashboards, you also need [dashboard access](/observability/managed-grafana#dashboard-access). ## Access CoreWeave Grafana dashboards CoreWeave Grafana is hosted at [cks-grafana.coreweave.com](https://cks-grafana.coreweave.com). To open a dashboard: 1. Sign in to the [Cloud Console](https://console.coreweave.com/) to authenticate, then go to the [Grafana](https://cks-grafana.coreweave.com) page. The dashboard is also linked in the left sidebar of the Cloud Console. 2. On the Grafana dashboard page, select **Home** and then **Dashboards**. ![CoreWeave Grafana dashboard example.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-home.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=73471586cbf760cb1dc148aa9c1e2a25) 3. From the dashboard menu, expand a folder and select a dashboard. ![CoreWeave Grafana dashboard example.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-dashboards.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=27296c1f7db651c44a837f6af125a0d9) After you select a dashboard, it opens in the main view so you can explore its panels. ## Use CoreWeave Grafana dashboards CoreWeave Grafana dashboards have three main areas: * **Variables**: Variables let you select from options to refine your queries. * **Panel group**: A panel group organizes related panels into a section. * **Panels**: Panels visualize or list the data described in the panel name. ![CoreWeave Grafana dashboard example.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/dashboard-example.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=440318e34ebdfa769cb9dc050af8232a) CoreWeave Grafana dashboard example. For more information about Grafana dashboards, see the [Grafana documentation](https://grafana.com/docs/grafana/latest/). # Cluster Resource Overview Source: https://docs.coreweave.com/observability/managed-grafana/cks/cluster-resource Grafana dashboard for monitoring cluster-wide CPU, memory, GPU, and network utilization in CKS To view the dashboard, go to the [Cluster Resource Overview dashboard](https://cks-grafana.coreweave.com/d/edy70efsd7qpsf/cluster-resource-overview). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Cluster Resource Overview dashboard summarizes your cluster resource utilization and workload health. It gives you a high-level view of your Kubernetes cluster and lets you investigate specific components in detail. ## Overview The Overview section shows cluster-wide CPU usage, memory usage, network transit throughput, and a summary of workload health. Use it to quickly assess the overall state of your cluster. ![Overview section showing a typical panel.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/overview.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=17c8186c6296de5ae4c1cd3107b8bd01) | Panel Title | Description | | - | - | | **Global CPU Usage** | Displays CPU usage, requests, and limits across the entire cluster. | | **Global Memory Usage** | Displays memory usage, requests, and limits across the entire cluster. | | **Kubernetes Resource Count** | Shows the count of Kubernetes resources such as ConfigMaps, Running Containers, and Namespaces. | | **Network Transit by Namespace** | Displays the network traffic (received and transmitted) broken down by namespace. | | **Unhealthy Pods by Namespace** | Shows the count of unhealthy Pods over time, grouped by namespace. | | **Pods Phase Count** | Shows the number of Pods in different phases (Running, Pending, Failed, Succeeded, and Unknown). | ## GPU Info The GPU Info section provides insights into GPU usage, availability, and the status of idle Slurm Nodes. ![GPU Info section showing a typical panel.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/gpu-info.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=ea84401e0f62c72e5828d290cfc84c1b) | Panel Title | Description | | - | - | | **GPUs In Cluster** | Displays the total number of GPUs available in the cluster. | | **GPUs Allocated by Namespace** | Shows how GPUs are distributed and allocated across different namespaces. | | **GPU Accelerated Pods** | Lists all Pods that are currently using GPUs. | | **Idle Slurm Nodes/Pods** | A graph showing the number of idle Slurm Nodes or Pods over time. | ## Pod Info The Pod Info section details CPU and memory limits, requests, and usage for each individual Pod. Use it to understand resource consumption at the Pod level. ![Pod Info section showing a typical panel.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/pod-info.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=78c650c5b50a71e4c754bbb0be5ec874) | Panel Title | Description | | - | - | | **Container Usage** | Lists Pods with their namespace, RAM usage, RAM requests, RAM limits, and CPU usage. | | **Pod Readiness** | Shows the readiness status of each Pod. | ## Node Info The Node Info section displays CPU and memory capacity, requests, and limits for Pods running on each Node. It also shows the percentage of utilization for each Node based on Pod requests. | Panel Title | Description | | - | - | | **Node Requests vs Capacity** | A table detailing each Node's Cores Capacity, CPU Requests, CPU Limits, CPU Requests percent, Memory Capacity, Memory Request, Memory Limits, and Memory Requests. | ## Deployment, StatefulSet, and DaemonSet Info This section provides basic scheduled and ready replica counts for each workload, including Deployments, StatefulSets, and DaemonSets. Use it to verify that your applications are scaled correctly. | Panel Title | Description | | - | - | | **Deployments** | Lists deployments with their current and desired replica counts. | | **StatefulSets** | Lists StatefulSets with their current and desired replica counts. | | **DaemonSets** | Lists DaemonSets with the number of scheduled and ready daemon Pods. | ## Image Info The Image Info section shows all container images currently in use throughout the cluster. Use it to track image versions and verify compliance. | Panel Title | Description | | - | - | | **Images In Use** | A table listing image names, the number of containers using the image, and the container tag. | # Control plane logs Source: https://docs.coreweave.com/observability/managed-grafana/cks/control-plane-logs Grafana dashboard for viewing Kubernetes control plane component logs in CKS clusters To view the dashboard, go to the [Control Plane Logs dashboard](https://cks-grafana.coreweave.com/d/cluster-health-logs/control-plane-logs). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Control Plane Logs dashboard shows logs from control plane components, including the API server, etcd, controller manager, and scheduler, to help you monitor their health and status. The Control Plane Logs dashboard contains the following panels: | Panel | Description | | - | - | | **API Server Error Logs** | Shows error logs from the API server. | | **etcd Logs** | Shows logs from etcd. | | **Controller Manager Logs** | Shows logs from the controller manager. | | **Scheduler Logs** | Shows logs from the scheduler. | | **Konnectivity Server Logs** | Shows logs from the Konnectivity server. | # Control plane metrics Source: https://docs.coreweave.com/observability/managed-grafana/cks/control-plane-metrics Grafana dashboard for monitoring CKS control plane performance across API server, etcd, and scheduler To view the dashboard, go to the [Control plane metrics dashboard](https://cks-grafana.coreweave.com/d/cluster-health/control-plane-metrics). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Control plane metrics dashboard provides insights into your CKS control planes, with panel groups for the API server, etcd, controller manager, scheduler, and Konnectivity. The following sections describe each panel group. ## API server The API server panels provide real-time monitoring of your API server's performance and health. The panels show metrics related to request rates, latencies, CPU usage, and memory usage. ![First panels in the API server panel group](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/api-server-panel-group.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=abb2381e160360203d81870909e728d2) ## etcd The etcd panels show the performance and health of the etcd cluster. The panels show metrics such as put rates, range rates, synchronization durations, CPU usage, and memory usage. ![Panels in the etcd panel group](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/etcd-panel-group.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=d95535ebb029ce905f65129667c8834c) ## Controller manager The controller manager panels show the performance and resource utilization of the Kubernetes controller manager. The panels display metrics such as request rates and durations, CPU usage, and memory usage. ![Panels in the controller manager panel group](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/control-manager-panel-group.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=402355f2138349280541d1072234f493) ## Scheduler The scheduler panels show metrics related to request rates, scheduling durations, and resource usage such as CPU and memory. ![Panels in the scheduler panel group](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/scheduler-panel-group.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=ccecafa81efd23b1a1d762a7f7303be5) ## Konnectivity The Konnectivity panels show metrics related to network connectivity and communication within the cluster, such as the number of established connections, stream packets, dial durations, and CPU and memory usage for connectivity-related components. ![Panels in the Konnectivity panel group](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/konnectivity-panel-group.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=5abebdd74bb632ac73bd71c4034bb702) # Kubernetes Audit Logs Source: https://docs.coreweave.com/observability/managed-grafana/cks/kubernetes-audit-logs Grafana dashboard for viewing Kubernetes audit logs for security and troubleshooting in CKS To view the dashboard, go to the [Kubernetes Audit Logs dashboard](https://cks-grafana.coreweave.com/d/k8s-audit-logs/kubernetes-audit-logs). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Kubernetes Audit Logs dashboard provides detailed information about cluster events and supports security, auditing, and troubleshooting. Use column filters to query for specific logs. ![Grafana Audit Logs dashboard with column filters and a filter values panel](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/grafana-filters.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b4f699d923d0fe406ca67af7094c7acb) # NodePools and Cluster Autoscaler Source: https://docs.coreweave.com/observability/managed-grafana/cks/nodepools-and-cluster-autoscaler Grafana dashboard for monitoring CKS Node Pools, scaling conditions, and Cluster Autoscaler metrics and logs To view the dashboard, go to the [NodePools and Cluster Autoscaler dashboard](https://cks-grafana.coreweave.com/d/7d7027d7-5f6d-4687-b566-6f8bd001d994/nodepools-and-cluster-autoscaler). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The NodePools and Cluster Autoscaler dashboard gives you a single place to inspect the state of your CKS Node Pools and the [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler) that scales them. Use it to review Node Pool capacity and conditions, read Node Pool events, and track autoscaler scaling activity, errors, and logs without querying metrics or logs directly. For background on how autoscaling works and how to configure it, see [Autoscale Node Pools](/products/cks/nodes/autoscaling). ## Node Pools overview The **NodePools Overview** table provides a global view of all your Node Pools. It renders the spec fields, status fields, and conditions for each Node Pool in one place. For details about what each column represents, see the [Node Pool reference documentation](/products/cks/reference/node-pool). | Column | Description | | - | - | | **NodePool** | The name of the Node Pool. | | **Org ID** | The organization that owns the Node Pool. | | **Cluster** | The cluster the Node Pool belongs to. | | **Zone** | The availability zone where the Node Pool runs. | | **Instance Type** | The instance type provisioned by the Node Pool. | | **Compute Class** | The compute class assigned to the Node Pool. | | **Target Nodes** | The number of Nodes the Node Pool is requesting. | | **Current Nodes** | The number of Nodes present in the cluster for the Node Pool. | | **Progressing Nodes** | The number of Nodes that have been assigned but have not yet fully booted into the cluster. | | **Queued Nodes** | The number of queued Nodes waiting to be assigned. | | **Prefill Nodes** | The number of Nodes in the Node Pool [prefill](/products/cks/reference/node-pool#node-conditions) flow. | | **Autoscaling** | Whether autoscaling is enabled on the Node Pool. | | **Validated** | The [`Validated`](/products/cks/reference/node-pool#condition-validated) condition, which reports whether the Node Pool spec passed validation. | | **AtTarget** | The [`AtTarget`](/products/cks/reference/node-pool#condition-attarget) condition, which reports whether the Node Pool has reached its target Node count. | | **Capacity** | The [`Capacity`](/products/cks/reference/node-pool#condition-capacity) condition, which reports whether the zone has capacity to provision the requested Nodes. | | **Quota** | The [`Quota`](/products/cks/reference/node-pool#condition-quota) condition, which reports whether the request is within the organization's quota. | | **ReconfigRequired** | The [`NodeReconfigurationRequired`](/products/cks/reference/node-pool#condition-nodereconfigurationrequired) condition, which reports whether Nodes need to be reconfigured to match the spec. | ## Node Pool events The **NodePool Events** table renders the events recorded for your Node Pools, such as scaling decisions and quota warnings. Filter the table by [event type](#dashboard-variables) (`Normal` or `Warning`) and event reason to focus on specific activity. Because events come from exported logs, set the **Log Source** variable to a source that matches the **Region** and **Zone** you have selected. Otherwise, the table cannot render events. ## Cluster autoscaler The **Cluster Autoscaler** section reports the activity and health of the Cluster Autoscaler. To drill into a single cluster, set the **Org ID** and **Cluster** variables at the top of the dashboard. ### Cluster autoscaler metrics These panels summarize how the autoscaler is scaling your cluster and how its main loop is performing. The metrics panels use the **Data Source**, **Region**, **Zone**, **Org ID**, and **Cluster** variables. | Panel | Description | | - | - | | **Safe to Autoscale** | Whether the cluster is healthy enough for autoscaling. | | **Autoscaled NodePools Count** | The number of Node Pools managed by the Cluster Autoscaler. | | **Autoscale Max Nodes Count** | The maximum number of Nodes aggregated across all autoscaled Node Pools. | | **Autoscaled Nodes Count** | The number of Nodes in the cluster managed by the autoscaler. | | **Cluster Autoscaler Duration p95 By Function** | The time taken by various parts of the autoscaler main loop. | | **Errors** | The number of autoscaler loops that failed due to an error. | | **Failed Scale Ups** | The number of times a scale-up operation has failed. | | **Unneeded Nodes** | The number of Nodes currently considered unneeded by the autoscaler. | | **Scaled Down Nodes** | The number of Nodes removed by the autoscaler. | | **Unschedulable Pods Count** | The number of unschedulable (`Pending`) Pods in the cluster. | | **Scaled Up Nodes** | The number of Nodes added by the autoscaler. | ### Cluster autoscaler logs The **Logs** panel shows exported logs from the Cluster Autoscaler. The logs panel uses the **Log Source**, **Region**, **Zone**, **Org ID**, and **Cluster** variables. As with Node Pool events, set the **Log Source** variable to a source that matches the **Region** and **Zone** you have selected so the logs render correctly. ## Dashboard variables The variables at the top of the dashboard filter the panels below them. Not every panel uses every variable. | Variable | Description | | - | - | | **Data Source** | The metrics data source for the metric panels. | | **Log Source** | The log data source for the events and logs panels. Match this to your selected region and zone. | | **Region** | Filter to a specific region. | | **Zone** | Filter to a specific availability zone. | | **Org ID** | Filter to a specific organization. | | **Cluster** | Filter to a specific cluster. | | **Instance Type** | Filter to Node Pools of a specific instance type. | | **Compute Class** | Filter to Node Pools of a specific compute class. | | **NodePool** | Filter to a specific Node Pool. | | **Event Type** | Filter Node Pool events by type (`Normal` or `Warning`). | | **Event Reason** | Filter Node Pool events by reason. | # Pod Inspector Source: https://docs.coreweave.com/observability/managed-grafana/cks/pod-inspector Grafana dashboard for viewing combined Pod metrics, events, logs, and resource usage in CKS The Pod Inspector dashboard provides a combined view of common Pod metrics, Kubernetes events, and Pod logs, filtered to a specific Pod or container in any namespace. Use it to investigate the runtime behavior of a single Pod or container when troubleshooting issues such as restarts, resource pressure, or scheduling problems. To view the dashboard, go to the [Pod Inspector dashboard](https://cks-grafana.coreweave.com/d/G8-j827Mk/pod-inspector). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The following table describes each panel available in the dashboard. | Panel title | Description | | - | - | | **Node History** | Shows the history of the Node's status or events. | | **Type** | Displays the type of the monitored resource. | | **Node** | Shows Node information. | | **Network Throughput** | Shows the network throughput of the Node. | | **Container Waiting History** | Shows the history of containers in a `Waiting` state. | | **CPU Percentage Usage** | Shows the CPU utilization as a percentage of the total available. | | **CGNAT Traffic Classification** | Shows the Carrier-Grade NAT (CGNAT) traffic. | | **CPU Usage (Cores)** | Displays CPU usage as the number of cores in use. | | **Memory Percentage Usage** | Shows the memory utilization as a percentage of the total available. | | **CPU Throttle Rate** | Shows the rate at which the CPU is being throttled. | | **Memory Usage (RSS)** | Displays the resident set size (RSS) memory usage. | | **OOM History** | Shows the history of out-of-memory (OOM) events. | | **InfiniBand Bandwidth on Node (Active)** | Shows the active bandwidth on the Node's InfiniBand network interface. | | **Container Restarts** | Shows the number of container restarts over time. | | **GPU Usage** | Shows the utilization of the Node's GPU. | | **GPU Memory Usage** | Shows the memory usage of the Node's GPU. | | **Logs** | Displays log entries from the Node or its containers. | | **Kubernetes Events** | Displays the Kubernetes events related to the monitored resource. | # Home Source: https://docs.coreweave.com/observability/managed-grafana/coreweave/home The Grafana Home dashboard shows an overview of your CoreWeave environment, with key metrics, announcements, and status. This page describes the **Home** dashboard in CoreWeave Grafana. It explains what each panel shows so you can interpret the environment overview and status information at a glance. To view the dashboard, go to the [Home dashboard](https://cks-grafana.coreweave.com/d/a400d6f5-96a9-4454-9cc8-3b15a746e09e/home). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The **Home** dashboard is the default landing experience when you open CoreWeave Grafana. It provides a real-time snapshot of your CoreWeave environment across CoreWeave Kubernetes Service (CKS), SUNK, and storage. The dashboard also shows the latest platform announcements and live CoreWeave service status. Use this information to determine whether a platform issue affects your workloads. You can use this dashboard in the following ways: * Check the current state of your GPU fleet, Pods, and storage at a glance. * Stay informed about platform announcements and changes. * Navigate to frequently used dashboards. * Determine whether an active CoreWeave incident affects your workloads. ![CoreWeave Grafana home page showing announcements, environment metrics, top dashboards, and CoreWeave status](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/grafana-home.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=3c5726c07f58e3c85349b5e1c3eabd65) ## Panel descriptions The following sections describe the main panel groups on the Home dashboard, from the announcement and metrics area through quick links and service status. ### Announcement The **Announcement** panel highlights the latest platform announcement at the top of the dashboard. It can include new feature availability, data source or logging changes, and other updates that affect how you monitor or navigate your environment. ### Environment overview The environment overview panels provide top-level metrics across your CKS environments and workloads. The following table describes each panel in this group. | Panel | Description | | - | - | | **CKS Clusters by Super Region** | A world map showing the geographic locations of your CKS clusters, grouped by Super Region. | | **GPU Nodes** | A breakdown of available GPU Nodes by instance type, showing the current Node count for each GPU model. | | **GPUs Allocated to Workloads** | A bar chart comparing the number of GPUs currently allocated to workloads against the total unallocated count. | | **Average GPU Utilization** | A time-series graph showing the average GPU utilization percentage across all active workloads. | | **CKS Pods** | Pod counts broken down by status: Failed, Pending, Running, Succeeded, and Unknown. | | **SUNK Jobs** | The count of currently running and pending SUNK jobs across all clusters. | | **AI Object Storage Quota Usage** | The percentage of your AI Object Storage quota currently in use. | | **AI Object Storage Usage** | The total amount of data stored in AI Object Storage, in TiB. | ### Top dashboards The **Top dashboards** panel groups quick links to frequently used dashboards by product area. Each entry includes a short description so you can open the right dashboard without browsing the full library. ### CoreWeave status The **CoreWeave Status** panel displays a live feed of recent incidents and maintenance events from the CoreWeave status page. Each entry shows the date, incident title, and status updates. Use this panel to determine whether an active platform issue affects your environment. # Usage by product and zone Source: https://docs.coreweave.com/observability/managed-grafana/cost-usage/usage-product-zone Grafana dashboard for tracking resource consumption by product and zone with measured and net usage View the dashboard: [Usage by Product and Zone](https://cks-grafana.coreweave.com/d/depy94jcpvgu8f/usage-by-product-and-zone) > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Usage by Product and Zone dashboard shows resource consumption categorized by product and zone. It displays metrics such as GPU and CPU usage, storage consumption, and IP address allocation to help you understand both your measured usage and the net usage that forms the basis for billing. The dashboard shows consumption metrics as daily aggregates, up to the end of the last full billing day ending at 5 PM US and Canadian Eastern Time. By default, the dashboard shows the current billing month to date. Billing months span from 5 PM US and Canadian Eastern Time the day before the start of a month to 5 PM US and Canadian Eastern Time on the last day of the month. For example, billing for September 2025 spans from August 31, 2025 at 5 PM to September 30, 2025 at 5 PM. ## View the dashboard This section explains the permissions you need and how to open the dashboard in Grafana. > [!NOTE] > > To see data in the Usage by Product and Zone dashboard, you need both the **Observability Viewer** and **Billing Viewer** roles in an [IAM Access Policy](/security/iam/access-policies). (In the legacy CoreWeave permissions model, membership in the [`metrics` and `billing_viewer` groups](/security/iam/access-policies/legacy-permissions) also grants this access.) To view the dashboard, go to the [Usage by Product and Zone](https://cks-grafana.coreweave.com/d/depy94jcpvgu8f/usage-by-product-and-zone) dashboard in Grafana, or go to **Dashboards** > **Cost and Usage** > **Usage by Product and Zone** in Grafana. For instructions on accessing CoreWeave Grafana dashboards, see [Access and Use CoreWeave Grafana Dashboards](/observability/managed-grafana/access). ## Measured usage versus net usage Before reviewing the individual panels, it helps to understand the two usage values that the dashboard reports for each resource type. The dashboard shows two sets of cards for each resource type (GPUs, CPUs, Storage, IP Addresses): * **Measured usage** (all metered usage): All usage metered by CoreWeave before any exclusions, adjustments, or special programs are applied. * **Net usage** (after exclusions): Usage remaining after CoreWeave-level exclusions and adjustments are applied. This net usage is what CoreWeave uses as the basis for your billing, subject to your contract terms (for example, rates, discounts, and credits). The dashboard reports both measured and net usage in the same units and over the same time window so you can compare them directly. ## Panels The following sections describe each panel on the dashboard, including the metric it displays and how measured and net usage relate to it. The Usage by Product and Zone dashboard contains the following panels: | Panel | Description | | - | - | | **GPUs** | Displays daily aggregate `instance-hours` by product and zone. | | **CPUs** | Displays daily aggregate `instance-hours` by product and zone. | | **Storage** | Displays daily aggregate `GiB-hours` for Distributed File Storage (POSIX). | | **IP Addresses** | Displays daily aggregate `address-hours` by IP addresses. | | **Summary** | Displays the product, its zone, and its aggregate consumption over the full time period. | ### GPUs panel The GPUs panel displays daily aggregate instance-hours by product and zone: * **GPUs - Measured usage**: Shows all GPU instance-hours metered by CoreWeave, grouped by product and zone, before any exclusions, adjustments, or special programs are applied. * **GPUs - Net usage**: Shows GPU instance-hours after CoreWeave-level exclusions and adjustments have been applied. This net usage is used as the basis for your billing, subject to your contract terms. Both panels use the same daily granularity and time range, so you can compare total measured GPU usage against the net amount counted toward billing. ![GPUs panel showing daily aggregate instance-hours by product and zone](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/usage-gpus.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=a30c5b877288cbe90c800663ec0f39e1) ### CPUs panel The CPUs panel displays daily aggregate instance-hours by product and zone: * **CPUs - Measured usage**: Shows all CPU instance-hours metered by CoreWeave, grouped by product and zone, before any exclusions, adjustments, or special programs are applied. * **CPUs - Net usage**: Shows CPU instance-hours after CoreWeave-level exclusions and adjustments have been applied. This net usage is used as the basis for your billing, subject to your contract terms. As with GPUs, both CPU panels share the same time range and aggregation so you can see the impact of exclusions over time. ![CPUs panel showing daily aggregate instance-hours by product and zone](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/usage-cpus.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=ab49d0bea38c0852dde8704050735049) ### Storage panel The Storage section contains two panels that show Distributed File Storage (POSIX) usage by product and zone: * **Storage - Measured usage**: Shows daily aggregate GiB-hours of provisioned Distributed File Storage, grouped by product and zone, before any exclusions or adjustments. * **Storage - Net usage**: Shows daily aggregate GiB-hours of storage after CoreWeave-level exclusions and adjustments have been applied. This net storage usage is used as part of the basis for your billing, subject to your contract terms. Use these panels to understand how much storage you have provisioned and how much of that usage is counted toward billing. ![Storage panel showing daily aggregate GiB-hours for Distributed File Storage (POSIX)](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/usage-storage.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=918aebcb191c59d729e497db33a0aa7f) ### IP addresses panel The IP Addresses section contains two panels that show IP address allocation by product and zone: * **IP Addresses - Measured usage**: Shows daily aggregate address-hours allocated, grouped by IP address, product, and zone, before any exclusions or adjustments. * **IP Addresses - Net usage**: Shows daily aggregate address-hours after CoreWeave-level exclusions and adjustments have been applied. This net IP usage is used as part of the basis for your billing, subject to your contract terms. These panels help you see how IP address allocation translates into the usage that CoreWeave ultimately counts toward billing. ![IP Addresses panel showing daily aggregate address-hours allocated by IP address, product, and zone](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/usage-ip-addresses.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=df0bcae0961999c9f8c2d5296537bf8d) # Create a custom dashboard Source: https://docs.coreweave.com/observability/managed-grafana/custom-dashboards Build and save a dashboard that shows CPU and memory usage for one Pod > [!NOTE] > > Custom dashboards in CoreWeave Grafana are in preview. This tutorial shows how to create and save a custom dashboard in CoreWeave Grafana. The example dashboard tracks CPU and memory usage for one Pod on CoreWeave Kubernetes Service (CKS). You build a **My workload** dashboard with two time-series panels using an existing Pod's metrics. You then save the dashboard in your organization's root folder and reopen it to verify that the configuration persists. ## Prerequisites Before you begin, you need the following: * Access to [CoreWeave Grafana](/observability/managed-grafana/access). * The **Administrator** or **User** policy, which grants read and write access to your organization's custom dashboards and includes access to metrics. If your organization uses custom policies, have an administrator assign the **Grafana Dashboard Viewer**, **Grafana Dashboard Editor**, and **Observability Viewer** roles. See [Observability and telemetry roles](/security/iam/access-policies/roles#observability-and-telemetry). * A running Pod on a CKS cluster. ## Find your Pod's metrics Confirm that Grafana has CPU and memory data for your Pod, and record the values that the queries use: 1. In CoreWeave Grafana, open the [Pod Inspector dashboard](https://cks-grafana.coreweave.com/d/G8-j827Mk/pod-inspector), in the **CoreWeave Kubernetes Service** folder. For a description of its panels, see [Pod Inspector](/observability/managed-grafana/cks/pod-inspector). 2. In the time picker, select **Last 1 hour**. Then select your Pod's **cluster**, **namespace**, and **Pod Name**. 3. Confirm that the **CPU Usage (Cores)** and **Memory: RSS vs WSS vs Usage** panels display data. 4. Record the selected **Data Source**, and the cluster, namespace, and Pod name values. ## Create the dashboard Start with a dashboard in your organization's root folder: 1. In CoreWeave Grafana, open **Dashboards** and select your organization's root folder. 2. In the folder, select **New** > **New dashboard**, then **Add visualization**. 3. Select the data source that you recorded in Pod Inspector. 4. In the time picker above the panel, select **Last 1 hour**. Grafana opens the panel editor, where you enter a query and choose how to display its results. ## Add CPU usage CPU usage in cores shows how much processor time the Pod consumes. A value of 0.1 represents one-tenth of a CPU core. 1. In the panel's query editor, confirm that **Code** is selected, and enter the following PromQL query. Replace `[CLUSTER]`, `[NAMESPACE]`, and `[POD]` with the values that you recorded. ```promql theme={"system"} sum( rate(container_cpu_usage_seconds_total{ cluster="[CLUSTER]", namespace="[NAMESPACE]", pod="[POD]", container!="", container!="POD" }[$__rate_interval]) ) ``` The query calculates the rate of CPU time consumed by each container and adds the results for the Pod. 2. Expand the query **Options**. Confirm that **Type** is set to **Range**, then set **Legend** to **Custom** and replace the prefilled text with `CPU cores`. 3. Select **Run queries** and confirm that the query returns data. 4. Select the **Time series** visualization and set **Title** to `CPU usage (cores)`. 5. Select **Back to dashboard** to return with the panel changes applied. The dashboard now has a CPU usage panel. ## Add memory usage Resident set size (RSS) measures resident memory in bytes. This panel shows RSS, rather than a percentage of a memory limit. 1. Select **Add** > **Visualization**. The new panel uses the same data source as the CPU panel. 2. Confirm that **Code** is selected, and enter the following query, replacing the placeholders with the same values: ```promql theme={"system"} sum(container_memory_rss{ cluster="[CLUSTER]", namespace="[NAMESPACE]", pod="[POD]", container!="", container!="POD" }) ``` 3. Expand the query **Options**. Confirm that **Type** is set to **Range**, then set **Legend** to **Custom** and replace the prefilled text with `Memory RSS`. 4. Select **Run queries** and confirm that the query returns data. 5. Select **Time series** and set **Title** to `Memory usage (RSS)`. 6. Under **Standard options**, set **Unit** to **Data** > **bytes(IEC)** and set **Min** to `0`. 7. Select **Back to dashboard**. Grafana places the new panel above the CPU panel. Drag the **CPU usage (cores)** panel by its title to the right of the memory panel. Both panels now show resource usage for the same Pod and time range. ## Save and reopen the dashboard Save the dashboard and verify its configuration: 1. Select **Save dashboard** and enter `My workload` as the title. 2. Confirm that **Folder** is set to your organization's root folder, then select **Save**. 3. Return to **Dashboards**, open that folder, and select **My workload**. 4. Confirm that both panels retain their titles, legends, and queries and display data for the last hour. The following image shows the completed dashboard with both panels displaying data: ![Saved My workload dashboard in the organization folder, showing memory RSS near 680 MiB and CPU usage near 0.013 cores over the last hour.](https://mintcdn.com/coreweave-dbfa0e8d/5arlR8KHrJwOn9bl/observability/_media/custom-dashboard-my-workload.png?fit=max\&auto=format\&n=5arlR8KHrJwOn9bl\&q=85\&s=ab30e09147b116a747186a614df84610) The My workload dashboard with memory RSS and CPU usage panels. Reopening the dashboard verifies that you saved its configuration. If a panel is empty, the save might still have succeeded. Check the time range, data source, label values, and metrics access. ## Next steps To share and organize your dashboards: * Share the dashboard link with colleagues who have access to both the dashboard and its metrics. For the required permissions, see [Dashboard access](/observability/managed-grafana#dashboard-access). By default, **Share** > **Share internally** locks the link to the current time range. To share a link that follows a relative range such as **Last 1 hour**, turn off **Lock time range** before you select **Copy link**. * Group related dashboards in subfolders. For more information, see [Organization folders](/observability/managed-grafana#organization-folders). # Inference Model Overview Source: https://docs.coreweave.com/observability/managed-grafana/dedicated-inference/inference-model-overview Grafana dashboard for monitoring Dedicated Inference request rates, queueing, runtime latency, and scaling The **Inference Model Overview** dashboard provides metrics for [Dedicated Inference](/products/inference/dedicated) deployments. Use it to track request throughput and success rate, diagnose queueing and load balancing behavior, inspect inference runtime latency, and confirm that autoscaling responds to load. The dashboard covers only Dedicated Inference. It doesn't include Serverless Inference or Inference on CKS workloads. To view the dashboard, go to the [Inference Model Overview dashboard](https://cks-grafana.coreweave.com/d/dep76910f3im8h/inference-model-overview). In Grafana, it's in the **Inference** folder. > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). To see data in this dashboard, you need the **Observability Viewer** role in an [IAM access policy](/security/iam/access-policies/roles#observability-and-telemetry). For the step-by-step procedure to open the dashboard and read your deployment logs, go to [Observability](/products/inference/getting-started#observability) in the Dedicated Inference getting started guide. ## Dashboard variables To choose the deployment you want to inspect, set the variables at the top of the dashboard. Most panels follow the **Deployment** selection. For the exceptions, see [Overview](#overview). | Variable | Description | | - | - | | **Metric Source** | Selects the data source that supplies the dashboard metrics. | | **Log Source** | Selects the data source that the **vLLM Logs** link opens in **Explore**. | | **Cluster Org** | Shows your organization ID. CoreWeave fills it in and limits it to your own organization, so you don't need to change it. | | **Zone** | Selects the Availability Zone that serves the deployment. | | **Gateway** | Selects the inference gateway. | | **Model** | Selects the model. | | **Deployment** | Selects the deployment. Panels in the **Per Pod** row break this deployment out by Pod. | | **hist\_interval** | Sets the time window that the **Model Success Rate**, **Request Duration**, **Completed Request Rate**, **First Response Duration**, and **Cache Hit** panels, and every panel in the **VLLM** row, use to calculate rates and percentiles. Options range from `1m` to `24h`. | The dashboard also provides a **vLLM Logs** link that opens **Explore** with a log query already scoped to your current **Deployment** selection. ## Panel rows The dashboard groups its panels into five rows. The following sections describe each row. ### Overview These panels summarize the health and throughput of the selected deployment. Start here to determine whether the deployment is serving traffic successfully. The **RPS**, **Model Success Rate**, **Request Duration**, **Completed Request Rate**, and **First Response Duration** panels measure requests at the gateway and filter by **Model**, **Gateway**, and **Zone** only. If more than one deployment serves the selected model through the selected gateway, these panels include all of them. | Panel | Description | | - | - | | **RPS** | Shows the request rate in requests per second. | | **Model Success Rate** | Shows the model success rate, calculated as 1 minus the 5xx error rate over the **hist\_interval** window. | | **Instances Active** | Shows the percentage of replicas with at least one request running. | | **Output Tok/s** | Shows output tokens per second across all Pods of the selected deployment. | | **AVG Cache Usage** | Shows average KV cache usage. | | **Request Duration** | Shows P90 and P50 request duration, broken down by response status. | | **Completed Request Rate** | Shows the rate of completed requests, broken down by status code. | | **Running Requests** | Shows the requests currently running, as the delta between requests received and completed. | | **First Response Duration** | Shows P90 and P50 time to first response. Requests that never return a response aren't tracked here. | ### Queue & Load Balancing These panels show how requests move through the queue before a backend accepts them. Use them to distinguish a capacity shortfall from a load balancing failure. | Panel | Description | | - | - | | **Queue Success Rate** | Shows the success rate of queue processing. | | **Expired Requests (rate)** | Shows the rate of requests that expired while waiting for capacity. | | **Failed Requests (rate)** | Shows the rate of requests that failed load balancer selection. | | **Cancelled Requests (rate)** | Shows the rate of requests that were canceled. | | **Enqueue vs Completion Rates** | Compares the rate of enqueued requests against the rate of completions by result type. | | **Cumulative Queue Backlog** | Shows the number of requests currently waiting in the queue, by zone. | ![Cumulative Queue Backlog panel from 03:40 to 06:55 UTC. Waiting requests stay below about 90, except for a spike to about 380 between 04:55 and 05:05.](https://mintcdn.com/coreweave-dbfa0e8d/O1_LlD5D9eySNpVH/observability/managed-grafana/_media/inference-model-overview-queue-backlog.png?fit=max\&auto=format\&n=O1_LlD5D9eySNpVH\&q=85\&s=3de8bc68730cc421bdfeb6bc93bfc2c3) The Cumulative Queue Backlog panel for one model over about three hours. Just before 05:00, the backlog rises from under 60 to about 380 waiting requests, then falls back. The values are scaled example data. ### VLLM These panels report metrics published by the vLLM inference runtime. They break request latency into its runtime stages and report token counts per request, so you can find which stage dominates end-to-end latency. | Panel | Description | | - | - | | **Request Queue Time** | Shows P90 and P75 time that requests spend waiting in the vLLM engine's queue before processing starts. | | **Prefill Time** | Shows P90 and P75 prefill time. | | **Decode Time** | Shows P90 and P75 decode time. | | **E2E Latency** | Shows P90 and P75 end-to-end latency. | | **TTFT** | Shows P90 and P75 time to first token. | | **TPOT** | Shows P90 and P75 time per output token. | | **Prompt Tokens** | Shows P90 and P75 prompt tokens per request. | | **Requested generation tokens** | Shows P90 and P75 of the maximum generation tokens requested per request. | | **Speculative Decoding** | Shows the **Acceptance Rate** and **Mean Acceptance Length** series for deployments that use speculative decoding. | ### Scaling These panels show how the deployment's replica count responds to load. You can read them alongside [Scaling](/products/inference/scaling), which describes the autoscaling behavior they reflect. | Panel | Description | | - | - | | **Replicas** | Shows the current and ready replica counts against the configured minimum and maximum. | | **Instances Active (Count)** | Shows the number of replicas with at least one request running. | | **Instances Active (Percent)** | Shows the percentage of replicas with at least one request running. | ![Replicas panel from 03:40 to 06:55 UTC. Ready replicas rise from about 225 to 540 between 05:00 and 05:30, then step down to about 420 after 06:00. The dashed minimum and maximum lines stay flat at 126 and 618.](https://mintcdn.com/coreweave-dbfa0e8d/O1_LlD5D9eySNpVH/observability/managed-grafana/_media/inference-model-overview-replicas.png?fit=max\&auto=format\&n=O1_LlD5D9eySNpVH\&q=85\&s=74156754bec351f001541c9f05b3e8e2) The Replicas panel for the same model and time range. As the backlog grows, the autoscaler adds replicas within the configured minimum and maximum, then removes replicas after demand falls. The values are scaled example data. ### Per Pod Each replica of a deployment runs as one or more Kubernetes Pods. These panels break the selected deployment out by Pod, so you can distinguish an evenly loaded deployment from one where a single Pod is saturated. | Panel | Description | | - | - | | **Requests Running per Pod** | Shows the requests currently running in each backend Pod, as reported by the runtime, with a Pod average. | | **Requests Waiting by Pod** | Shows the requests waiting in the backend for each Pod, with a Pod average and a fixed **Scaling Threshold** reference line. The autoscaler doesn't scale on this per-Pod count. | | **Request StdDev** | Shows the standard deviation of running requests across Pods. | | **Request Waiting StdDev** | Shows the standard deviation of waiting requests across Pods. | | **Cache Usage** | Shows average and maximum KV cache usage for each Pod. | | **Cache Hit** | Shows the average prefix cache hit percentage for each Pod over the **hist\_interval** window. | | **GPU Utilization** | Shows the maximum GPU utilization across all GPUs in each Pod, with a Pod average. | | **GPU Memory Utilization** | Shows the maximum GPU memory utilization across all GPUs in each Pod, with a Pod average. | > [!NOTE] > > The **Per Pod** panels cover only the Pods belonging to your own deployments. The dashboard doesn't include Node-level metrics or a Pod-to-Node mapping. ## See also * [Dedicated Inference](/products/inference/dedicated): Learn about deployments, gateways, and the observability role requirement. * [Scaling](/products/inference/scaling): Configure the autoscaling behavior shown in the **Scaling** row. * [Speculative decoding](/products/inference/speculative-decoding): Configure the feature measured by the **Speculative Decoding** panel. # Cabinet Visualizer Source: https://docs.coreweave.com/observability/managed-grafana/fleet/cabinet-visualizer Monitor the aggregate statistics of full cabinets with Grafana To view the dashboard, go to the [Cabinet Visualizer dashboard](https://cks-grafana.coreweave.com/d/de3qwk31ucpvkf/cabinet-visualizer). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Cabinet Visualizer dashboard displays statistics and historical data for each cabinet, including its cooling system and enclosed rack. You can monitor overall cabinet health and view detailed information about each Node to identify issues and track performance trends over time. > [!WARNING] > > This dashboard is useful for monitoring the health of [GB200 and GB300 NVL72-powered](/platform/instances/nvl72) Node Pools and their individual Nodes, since they're deployed only as full racks in dedicated cabinets. ## Dashboard panel overview The Cabinet Visualizer dashboard includes sections for aggregate statistics, GPU tray visualization, time-series graphs, and rack details. Each section provides different insights into the cabinet's performance and health. ![Cabinet Visualizer dashboard showing aggregate statistics, GPU tray visualization, time-series graphs, and rack details](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/cabinet-visualizer-overview.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=deb4a40b44fcfc4dc97752c4317935b3) ### Aggregate statistics These panels on the upper left show the most recent high-level metrics for all Nodes in the cabinet. | **Metric** | **Description** | | - | - | | **Current Average GPU Utilization** | Average percentage of GPU resources currently in use. | | **Current Average NVLink Utilization** | Average percentage of NVLink bandwidth currently in use. | | **Total FP8 FLOP/s** | Total FP8-format floating-point operations per second. | | **Current Average GPU Temperature** | Average GPU temperature across all Nodes, in degrees Celsius. | ### GPU tray visualization This panel on the lower left shows a visual layout of the enclosed rack, with each Node labeled by name. Color coding indicates the Node's [NLCC state](/platform/fleet-management/node-lifecycle), Kubernetes state, and GPU temperature. Hover over any indicator for more details, or click a Node to view its full status. Refer to the legend at the bottom of the panel to interpret the color codes. ### Time-series graphs These panels on the upper right show time-series graphs for aggregate NVLink bandwidth and GPU utilization across the cabinet. Use them to monitor performance trends and detect anomalies. Hover over any graph to view detailed data points. Use the list of Nodes beside each graph to filter the data by individual Node. ### Rack details This panel on the lower right provides detailed information about each Node in the rack. | **Column** | **Description** | **Values** | | - | - | - | | **Node** | The name of the Node. | | | **Deviceslot** | The Deviceslot where the Node is installed. | | | **RU** | The Rack Unit where the Node is physically located in the cabinet. | | | **NLCC State** | The current [Node lifecycle](/platform/fleet-management/node-lifecycle) state. | Any valid Node lifecycle state. | | **Reserved** | The organization ID for this Node. | | | **K8s ready** | Whether the Node is online in Kubernetes. |
  • **True**: online
  • **False**: not online
| | **Avg GPU Temp** | Average temperature of all GPUs on the Node. | | | **GPU P2P** | GPU P2P shows the peer-to-peer communication status between GPUs on the Node. This is required for any form of NVLink communication, both intra- and inter-tray. |
  • **OK**: The GPUs peer correctly.
  • **X**: The GPU peers with itself. This is ignored.
  • **NS**: not supported
| | **HPC Verification** | Result of the most recent HPC (High Performance Computing) validation checks run on the Node. |
  • **Passed**: The most recent run completed successfully.
  • **Failed**: The most recent run failed.
  • **Not Run**: A check hasn't run yet. This is common for newly delivered Nodes in a CKS cluster, since the verification data is stored on the Kubernetes host, not the Node itself.
| | **Alerts** | Alert status for the Node. |
  • **None**
  • **Pending**
  • **Firing**
| | **Active** | Whether the Node is currently running a workload Pod that is neither interruptible nor part of a DaemonSet. |
  • **Yes**: The Node is running a workload.
  • **No**: The Node isn't running a workload.
| # Cabinet Wrangler Source: https://docs.coreweave.com/observability/managed-grafana/fleet/cabinet-wrangler Grafana dashboard for monitoring cabinet details, GPU data, and Node information across racks To view the dashboard, go to the [Cabinet Wrangler dashboard](https://cks-grafana.coreweave.com/d/ceif6c5udzytca/cabinet-wrangler). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Cabinet Wrangler dashboard provides an overview of cabinet details and status, including GPU data and Node information across racks. ![Cabinet Wrangler dashboard](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/cabinet-wrangler.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=a518e98cdd00229f095536a4e24999b2) The dashboard contains the following panels. | Panel | Description | | - | - | | **Any Production GPUs** | Total count of nodes in racks with any number of healthy nodes. | | **NVL64 Production GPUs** | Baseline count of nodes based on the number of racks with at least 16 healthy nodes (Rack Count \* Threshold (16)). | | **NVL64+ Production GPUs** | Total count of nodes in racks with at least 16 healthy nodes. | | **NVL72 Production GPUs** | Total count of nodes in racks with 18 healthy nodes. | | **NVL64+ Active Production Percentage** | Percentage of active production GPUs of type NVL64 or higher. | | **Production GPUs** | Distribution of the classes of Production GPUs. | | **Number of Racks with Production Schedulable Nodes** | Number of racks with schedulable Nodes for production workloads. | | **Number of Racks with Production Nodes (stacked)** | Stacked chart of the data in the **Number of Racks with Production Nodes** panel. | | **GPU Utilization (max by `rack_name`)** | Time-series graph of maximum GPU utilization aggregated by rack name. | | **Cabinet Details** | Detailed table with **Summary** and **NLCC State Counts** tabs. Shows metrics such as rack name, Active status, Health rollup, and Kubernetes schedulable status. | | **Node Messages** | Messages or logs related to the system's Nodes. | # Node Details Source: https://docs.coreweave.com/observability/managed-grafana/fleet/node-details Grafana dashboard for viewing an individual Node's telemetry, GPUs, network, and Slurm metrics To view the dashboard, go to the [Node Details dashboard](https://cks-grafana.coreweave.com/d/ddbdicm9sw7c5x/node-details). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The **Node Details** dashboard is your single-pane view for everything happening on a specific compute Node in your cluster, from kernel-level events and GPU thermals to Slurm queue metrics and Kubernetes Pod allocations. Use it to troubleshoot anomalies, validate hardware, and verify that each Node meets workload expectations. ## Example view The following example shows what you see when you first open the dashboard, so you know what to expect before exploring the other panel groups. When the dashboard first loads, the **Summary** panel group expands by default. This example shows the **Summary** section. ![Node Details Summary](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/node-details-summary.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=dffe28cdf56993d0bd0ca47d73f4da3b) ## Panel groups The dashboard has several expandable panel groups. Each focuses on a different aspect of Node telemetry. When you view the dashboard, click these group headings to collapse or expand that section. Use the following reference to decide which groups to expand for the kind of troubleshooting or validation you're doing. | Section | What you'll find | | - | - | | **Summary** | High-level "at-a-glance" cards for host identity, CPU and GPU utilization, network traffic, active alerts, and HPC Verification status. | | **Logs** | A rolling log view that merges Kubernetes events, kernel messages, Node Problem Detector findings, and recent alert annotations. Ideal for pinpointing the root cause of spikes or failures. | | **Network** | End-to-end connectivity metrics, including ICMP loss from the Ping Exporter, conntrack table usage, interface throughput, packet error rates, and more. | | **Resources** | Capacity and utilization for CPU, GPU, memory, NFS mounts, and local disk I/O, plus historical usage charts to identify resource pressure. | | **GPUs** | Everything GPU-related, including ECC errors, power draw, clock speeds, memory usage, thermal headroom, fan RPM, and NVSwitch and NVLink health. | | **Temperatures** | Real-time thermal data for GPU cores, HBM memory, motherboard sensors, and per-Pod thermal impact. Helpful for identifying cooling hot spots. | | **InfiniBand** | Port state, link speed, retransmit counts, and congestion indicators for Nodes equipped with InfiniBand adapters. | | **Slurm Info** | Node state within your Slurm cluster (idle, alloc, drain), running jobs, and allocation timelines. Useful for mixed Kubernetes and Slurm environments. | | **Kubernetes** | Pod allocation breakdowns, taints, Reservation status, CPU-hours per job, memory by namespace, and Calico network policy statistics. | | **Verification** | Results from the latest HPC Verification suite, including GPU compute benchmarks, stress tests, and smoke tests. | | **Hardware** | Low-level chassis data, including IPMI power readings, fan speeds, serial numbers, PCIe link status, and NVLink bandwidth graphs. | | **Unsorted** | Additional metrics that do not yet belong to a dedicated group. Check here for new or experimental panels. | ## When to use this dashboard The **Node Details** dashboard lets you correlate sections quickly. For example, expand multiple groups at a time to observe how a GPU thermal event in **Temperatures** aligns with throttling in **GPUs** and related alerts in **Logs**. Grafana's time-range controls also enable time-shift analysis, so you can rewind and inspect historical Node behavior during an incident window. # Node Wrangler Source: https://docs.coreweave.com/observability/managed-grafana/fleet/node-wrangler View aggregated Node information across your clusters The **Node Wrangler** dashboard displays aggregated information about the Nodes in your fleet, helping you monitor fleet-wide health and quickly identify Nodes that need attention. It provides a summary of Node status, power utilization, and SM utilization over time, as well as detailed information about each Node's condition and alerts. The dashboard is divided into several panel groups, each providing different information about the Nodes in your fleet. You can filter the data displayed in the dashboard by selecting specific data sources, regions, clusters, or organizations. To view the dashboard, go to the [Node Wrangler dashboard](https://cks-grafana.coreweave.com/d/FWuqvUH4z/node-wrangler). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). ## Example view When the dashboard first loads, the Summary panel group is expanded by default. ![Node Wrangler Summary](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/node-wrangler-summary.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=44976de4da49efeb0b74da9c92c2e89b) ## Panel groups Each panel group focuses on a different aspect of your fleet. Click a group heading to collapse or expand that section. | Section | What you find | | - | - | | **Summary** | Overview of Nodes and their status, power utilization and SM utilization over time. | | **Alert History** | Nodes alert status over the selected time range. | | **Condition History** | Nodes condition status over the selected time range. | | **Verification History** | Nodes verification status over the selected time range. | | **Node Details** | Detailed table of Node information, including uptime, InfiniBand status, IP addresses, serial numbers, and current verification messages. | | **Alert Details** | Detailed table of current alert information, including state, severity, and Node and Pod information. | # Kueue Scheduling Source: https://docs.coreweave.com/observability/managed-grafana/kubernetes/kueue-metrics Grafana dashboard for monitoring Kueue admissions, queue status, preemptions, and GPU topology capacity To view the dashboard, go to the [Kueue Scheduling Dashboard](https://cks-grafana.coreweave.com/d/amwdvqq/kueue-scheduling-dashboard). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Kueue Scheduling Dashboard provides an overview of [Kueue](/products/cks/clusters/coreweave-charts/kueue) scheduling activity in your cluster, including workload admissions, ClusterQueue and cohort status, preemptions, evictions, and admission wait times. It also shows the GPU topology segments available for scheduling, so you can see how much contiguous capacity is available for workloads of different sizes. Use this dashboard to monitor queue health, diagnose admission delays, and understand how workloads move through your cluster's queues. Filter the panels with the dashboard variables, such as **accelerator**, **org**, **cluster**, **Cluster Queue**, and **resource**. Most panels are built on Kueue's Prometheus metrics. For the full list of metrics and their meanings, see the [Kueue metrics reference](https://kueue.sigs.k8s.io/docs/reference/metrics/). The following sections describe the panels available in the Kueue Scheduling Dashboard. ## Cluster topology The following panels show GPU capacity as topology segments. A segment means free GPUs in the same topology domain that a workload can be scheduled into. Segment sizes of 8 or fewer count free GPUs per Node, and larger segment sizes count free GPUs per NVLink domain. For more about segments and topology domains, see [Topology and block scheduling in Slurm](/products/sunk/optimize_workloads/topology-scheduling). | Panel | Description | | - | - | | **Available Segments Snapshot** | Shows the currently healthy segments available at each topology size, counting only free GPUs on Ready, schedulable Nodes. | | **K8s-Scheduler Topology Segment Sizes** | Shows the Kubernetes scheduler's view of GPU segments at the selected size: total allocatable capacity, plus currently free segments partitioned into healthy and unhealthy by Node state. This view reflects Pods that actually exist on the cluster. It does not include capacity that Kueue has reserved for workloads whose Pods have not been created yet. | | **Preemption-Adjusted Topology Segment Sizes** | Shows current healthy segments plus the capacity that would become free if Kueue preempted lower-priority admitted workloads in the selected ClusterQueue. | ## Kueue health The following panels show the health of the Kueue controller manager and its admission activity: | Panel | Description | | - | - | | **Kueue Version** | Shows build and version information for the Kueue controller manager, from `kueue_build_info`. | | **Kueue Controller Manager Logs** | Displays logs from the Kueue controller manager in the `kueue-system` namespace. | | **Admission Attempts (rate/min)** | Shows the per-minute rate of workload admission attempts, partitioned by result (success or inadmissible), from `kueue_admission_attempts_total`. | | **Admission Attempt Latency (p50/p95/p99)** | Shows how long Kueue's admission cycle takes per attempt, from `kueue_admission_attempt_duration_seconds`. Spikes indicate scheduler slowdown. | ## ClusterQueue The following panels show workload activity, quotas, and wait times for the selected ClusterQueues: | Panel | Description | | - | - | | **CQ Preemption/Admission Rate** | Shows the per-minute rate of workload admissions and preemptions per ClusterQueue. | | **Preemption Rate by Reason** | Shows the per-minute preemption rate broken down by reason, such as preemption within the same ClusterQueue or cohort reclamation, from `kueue_preempted_workloads_total`. | | **Admitted Workload Priority by ClusterQueue** | Lists the priority and GPU request of each workload admitted to the selected ClusterQueues. | | **Pending Workloads (by status)** | Shows workloads pending admission, split by status (active or inadmissible), from `kueue_pending_workloads`. | | **Admitted Active Workloads** | Shows admitted workloads that are currently active, per ClusterQueue, from `kueue_admitted_active_workloads`. | | **Quota-Reserving Active Workloads** | Shows workloads that are reserving quota, including admitted workloads, from `kueue_reserving_active_workloads`. | | **Workloads in Finished State** | Shows the current count of workloads in the Finished state per ClusterQueue, before Kueue's TTL cleanup deletes them, from `kueue_finished_workloads`. | | **Workloads Entering Finished State (rate/min)** | Shows the per-minute rate of workloads transitioning into the Finished state, a measure of completion throughput, from `kueue_finished_workloads_total`. | | **Quota Reservations (rate/min)** | Shows the per-minute rate of workloads obtaining quota reservation, from `kueue_quota_reserved_workloads_total`. | | **Evictions (rate/min, by reason)** | Shows the per-minute rate of eviction events by reason, from `kueue_evicted_workloads_total`. A workload evicted, re-admitted, and evicted again counts twice. | | **Unique Evictions (rate/min)** | Shows the per-minute rate of distinct workloads being evicted for the first time, from `kueue_evicted_workloads_once_total`. Compare with **Evictions** to detect re-eviction churn. | | **Replaced Workload Slices (rate/min)** | Shows the per-minute rate of workload slice replacements, from `kueue_replaced_workload_slices_total`. | | **Preemption Skips (per cycle)** | Shows workloads whose preemption was skipped during an admission cycle due to resource contention, from `kueue_admission_cycle_preemption_skips`. | | **Creation→Admission Wait (p50/p95/p99)** | Shows the time from workload creation to Kueue granting admission, from `kueue_admission_wait_time_seconds`. | | **Creation→Quota Reservation Wait (p50/p95/p99)** | Shows the time from workload creation to obtaining quota reservation, before admission checks, from `kueue_quota_reserved_wait_time_seconds`. | | **Quota→Admission Wait (p50/p95/p99)** | Shows the time from quota reservation to full admission, the admission-check phase, from `kueue_admission_checks_wait_time_seconds`. | | **ClusterQueue Status** | Shows the current lifecycle status of each ClusterQueue (active, pending, or terminated), from `kueue_cluster_queue_status`. | | **Nominal Quota (by resource)** | Shows the configured nominal quota per ClusterQueue, flavor, and resource, from `kueue_cluster_queue_nominal_quota`. | | **Borrowing Limit (by resource)** | Shows how much each ClusterQueue can borrow from its cohort, from `kueue_cluster_queue_borrowing_limit`. | | **Lending Limit (by resource)** | Shows how much of its quota each ClusterQueue may lend to other ClusterQueues, from `kueue_cluster_queue_lending_limit`. | | **Resource Reservation** | Shows the total resources reserved per ClusterQueue across all flavors, from `kueue_cluster_queue_resource_reservation`. | | **Resource Usage** | Shows resources currently in use by admitted workloads, from `kueue_cluster_queue_resource_usage`. | | **ClusterQueue Weighted Share** | Shows the fair-share ratio used in borrowing decisions, from `kueue_cluster_queue_weighted_share`. | ## Cohort The following panels aggregate workload and quota metrics across each cohort subtree: | Panel | Description | | - | - | | **Cohort Admitted Active Workloads** | Shows admitted active workloads across the entire cohort subtree, from `kueue_cohort_subtree_admitted_active_workloads`. | | **Cohort Admissions (rate/min)** | Shows the per-minute admission rate across the cohort subtree, from `kueue_cohort_subtree_admitted_workloads_total`. | | **Cohort Subtree Quota (by resource)** | Shows the aggregated nominal quota across the cohort subtree, from `kueue_cohort_subtree_quota`. | | **Cohort Subtree Reservations (by resource)** | Shows the aggregated reservations across the cohort subtree, from `kueue_cohort_subtree_resource_reservations`. | | **Cohort Weighted Share** | Shows the fair-share ratio for cohort-level borrowing decisions, from `kueue_cohort_weighted_share`. | ## Workloads pending ready The following panels track how long workloads take to have ready Pods, measured from workload creation and from admission. They appear in the dashboard's **Workloads Pending Ready** row, which requires the [`waitForPodsReady`](https://kueue.sigs.k8s.io/docs/tasks/manage/setup_wait_for_pods_ready/) setting in your Kueue configuration. | Panel | Description | | - | - | | **Workload Creation→Ready Wait (p50/p95/p99)** | Shows the time from workload creation until its Pods are ready, from `kueue_ready_wait_time_seconds`. | | **Workload Admission→Ready Wait (p50/p95/p99)** | Shows the time from admission until the workload's Pods are ready, from `kueue_admitted_until_ready_wait_time_seconds`. | | **Pods Ready→Eviction Duration (p50/p95/p99)** | Shows how long workloads run after their Pods become ready before being evicted, by eviction reason, from `kueue_pods_ready_to_evicted_time_seconds`. | # Kubernetes Training Workloads Source: https://docs.coreweave.com/observability/managed-grafana/kubernetes/training-jobs Grafana dashboard for monitoring training workload hardware, placement topology, and Node health To view the dashboard, go to the [Kubernetes Training Workloads dashboard](https://cks-grafana.coreweave.com/d/0e4589d5-97fc-4d60-8c5c-301d43f57edd/kubernetes-training-workloads). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Kubernetes Training Workloads dashboard helps you monitor a training workload end to end. It combines hardware metrics for GPU utilization, network bandwidth (such as InfiniBand), and storage I/O (both local and NFS) with a topology view of where the workload's Pods are placed across Nodes, NVLink domains, leaf groups, SuperPods, and cabinets. Use it to diagnose performance bottlenecks, spot unhealthy Nodes, and understand how placement affects your workload. Select a workload with the dashboard variables, such as **Org**, **Cluster**, **Namespace**, **Kind**, **Workload**, and **Pod**. The dashboard resolves parent workloads, such as a JobSet, MPIJob, CronJob, or Deployment, down to their child Pods. The following sections describe the panels available on the dashboard. ## Workload overview The following panels summarize the selected workload: | Panel | Description | | - | - | | **Kind** | Shows the Kubernetes object kind. | | **Name** | Shows the name of the resource. | | **Nodes** | Shows the total number of Nodes. | | **Pods** | Shows the total number of Pods. | | **Uptime** | Shows the overall uptime. | | **Pod Readiness Timeline (per pod)** | Shows one row per Pod, colored by phase over time: green for Running, yellow for Pending, red for Failed, blue for Succeeded, and purple for Unknown. | | **Active GPUs** | Shows the total GPUs actively computing across all Nodes the workload occupies. On a shared Node, this count also includes another workload's busy GPUs. | | **Job Efficiency** | Shows the average share of the workload's Nodes that are fully busy over the selected time range. A Node counts as busy only when every GPU on it is at least 50% active. Dips indicate checkpoint writes, restarts, stragglers, data-loader stalls, or communication bottlenecks. This is not a Model FLOPs Utilization (MFU) metric. | | **Current FP8 FLOPS** | Shows the current floating-point operations per second in FP8 precision, scaled per GPU type. | | **Topology Churn** | Shows the number of Pods in the workload and the distinct Nodes they run on. A repeated sawtooth pattern indicates Pods crash-looping or repeatedly rescheduling across Nodes. | ## GPU metrics The following panels show GPU utilization and hardware metrics for the workload: | Panel | Description | | - | - | | **GPU Temperatures for Workload** | Shows the GPU temperatures for the workload as a heatmap. | | **GPU Core Utilization for Workload** | Shows GPU core usage as a heatmap. Black streaks mean the Node had no job at that time. Green means the GPU was idle. | | **SM Utilization for Workload** | Shows the fraction of time at least one warp was active on a streaming multiprocessor, averaged over all multiprocessors. A value of 0.8 or greater is necessary, but not sufficient, for effective use of the GPU. A value less than 0.5 likely indicates ineffective GPU usage. | | **GPU Mem Copy Utilization for Workload** | Shows GPU memory copy utilization as a heatmap. | | **Tensor Core Utilization for Workload** | Shows the utilization of Tensor Cores as a heatmap. | | **Current FP8 FLOPS** | Shows the current FP8 performance, scaled per GPU type. | | **VRAM Usage** | Displays the video RAM usage. | | **GPUs Temperature** | Displays the temperature of the GPUs. | | **InfiniBand Aggregate Bandwidth** | Shows the total network bandwidth over the InfiniBand interconnect. | | **GPUs Power Usage** | Displays the power consumption of the GPUs. | ## Filesystem and NFS The following panels show local disk and NFS storage I/O for the workload's Nodes: | Panel | Description | | - | - | | **Local Max Disk I/O Utilization (Min 1m)** | Shows the worst disk I/O utilization among the workload's Nodes, sampled at a minimum 1-minute interval. | | **Local Avg Bytes Read / Written Per Node (2m)** | Shows the average bytes read/written per Node on the local disk. | | **Local Total Bytes Read / Written (2m)** | Shows the total bytes read/written on the local disk over 2 minutes. | | **Local Total Read / Write Rate (2m)** | Shows the total read/write rate on the local disk over 2 minutes. | | **NFS Average Request Time by Operation** | Shows duration requests took from when a request was enqueued to when it was completely handled for a given operation, in seconds. | | **NFS Avg Bytes Read / Written Per Node (2m)** | Shows the average bytes read/written per Node on the NFS. | | **NFS Total Bytes Read / Written (2m)** | Shows the total bytes read/written on the NFS over 2 minutes. | | **NFS Total Read / Write Rate (2m)** | Shows the total read/write rate on the NFS over 2 minutes. | | **NFS Average Response Time by Operation** | Shows duration requests took to get a reply back after a request for a given operation was transmitted, in seconds. | | **NFS Avg Write Rate Per Active Node (2m)** | Shows the average NFS write rate per active Node. Only includes Nodes reading/writing over 10 KB/s. | | **NFS Avg Read Rate Per Active Node (2m)** | Shows the average NFS read rate per active Node. Only includes Nodes reading/writing over 10 KB/s. | | **NFS Nodes with Retransmissions** | Shows the count of NFS Nodes experiencing network retransmissions, which indicate packet loss, congestion, or faulty equipment or cabling. | ## NVLink domain overview The dashboard shows a gauge for each NVLink domain, displaying the number of Nodes in the domain with GPUs in use. ## Node health and conditions The following panels show the health of the Nodes running the workload: | Panel | Description | | - | - | | **Node Condition Events (last 10m)** | Shows Node conditions that newly fired in the last 10 minutes on the workload's Nodes. Routine conditions are excluded. Empty is the normal, quiet state. | | **Alerts** | Displays active alerts related to this resource. | | **Nodes (Range)** | Shows the individual Pods, their running status, and uptime on each Node. | | **Node States** | Shows the state of each Node running the workload. | | **Active Node Conditions** | Shows Node conditions that are currently active on the workload's Nodes, regardless of when the condition started. Routine conditions are excluded. | ## Workload placement The following panels show where the workload's Pods are placed in the cluster's physical topology: | Panel | Description | | - | - | | **Pods**, **Nodes**, **NVLink Domains**, **Leaf Groups**, **SuperPods** (stats) | Stat panels that show the count of each topology level the workload spans. | | **Nodes**, **NVLink Domains**, **Leaf Groups**, **SuperPods** (tables) | Tables that list the Nodes, NVLink domains, leaf groups, and SuperPods the workload occupies. | | **Pod → Node → NVLink Domain → Leafgroup → Superpod** | Maps each Pod through every level of the placement hierarchy. | | **Pod → Node Assignment Over Time** | Shows which Node each Pod was assigned to over time, to reveal rescheduling. | | **Workload Pods** | Lists the Pods in the NVLink domain selected with the **NVLink Domain (with pods)** variable. | ## Cabinet visualization The cabinet visualization shows a physical rack view, where each column is a rack. Nodes appear as slots with Pod circles inside, and each Node is colored green when healthy or red when it has active Node conditions. # Internet Transit Source: https://docs.coreweave.com/observability/managed-grafana/network-backbone/internet-transit Monitor your Node and service-level traffic and connection statistics. The **Internet Transit** dashboard provides a near-real-time view into how much traffic flows through your backbone egress and ingress points, how that traffic is distributed across internal services, and how well the network is performing from an end-user perspective. Use this dashboard to monitor Node and service-level traffic and connection statistics so you can detect incidents, plan capacity, and troubleshoot network issues. To view the dashboard, go to the [Internet Transit dashboard](https://cks-grafana.coreweave.com/d/ce3pbkpbkhn9cd/internet-transit). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). ![Internet Transit overview](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/internet-transit.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=84249017cbaebbe7ab60d0ded422aa31) You can use this dashboard to: * Spot spikes or drops in throughput that may indicate an incident or a saturation event. * Correlate traffic behavior with latency (RTT) and connection counts to understand user impact. * Drill into per-Node or per-service views for focused troubleshooting. * Identify which Nodes or services carry the most load so you can plan capacity. * Monitor how much traffic flows to and from third-party clouds. ## Filters and parameters Use these filters at the top-left of the page to choose the data you want to view: * **Data Source**: The Prometheus data source selector. * **Zone**: The Availability Zone (AZ) (An Availability Zone (AZ) is a partition within a region that hosts one or more data halls. AZs are physically and operationally independent from each other.) to view. * **Cluster Org**: The organization that owns the cluster. * **Cluster**: The specific cluster in the organization to view. Set the time range and refresh rate parameters at the top-right of the page. The default time range is 5 minutes, and the default refresh rate is 1 minute. ## Panel descriptions The dashboard has several panels with views into the network traffic and connection statistics. | Panel | Description | | - | - | | **Traffic - Inbound Per Node** | A sortable table where each row represents a Node. The **Throughput** column is rendered as a horizontal gauge, making it easy to see relative utilization at a glance. Click a Node to open the [**Node Details**](/observability/managed-grafana/fleet/node-details) dashboard for deep-dive analysis. | | **Traffic - Outbound Per Node** | The complement to **Inbound Per Node**, but for egress traffic. This panel is useful for determining which Nodes may require additional bandwidth or rate-limiting. | | **Traffic - Inbound Total** | A single card showing the aggregate inbound rate (Gb/s). | | **Traffic - Outbound Total** | The complement to **Inbound Total**, showing the aggregate outbound rate (Gb/s). | | **Average RTT per Service** | A time-series graph showing the rolling 5-minute average round-trip time (RTT) for both internal and external paths, grouped by service signature. This panel helps identify latency trends and potential congestion points. | | **Traffic - Inbound Per Service** | A stacked-area time-series chart that breaks down inbound traffic by service and categorized by third-party cloud vendors. The legend is interactive, letting you toggle visibility and sort by current throughput, minimum, or maximum. **Note**: New traffic is labeled **(Being analyzed)** until it's processed and categorized. | | **Traffic - Outbound Per Service** | The complement to **Inbound Per Service**, but for egress traffic. This panel is useful for determining which services are generating the most outbound traffic. | | **Traffic - Total** | A time-series graph showing the total inbound and outbound traffic. Inbound is shown in green above the X-axis, and outbound is shown in yellow below. Helps visualize the net traffic balance and identify asymmetric patterns. | | **Connections - Total** | A time-series graph showing the total number of concurrent connections across all hosts. Helps identify connection flood or drop-off events. | | **Connections - Per Node** | A stacked-area time-series chart that breaks down the number of concurrent connections by Node. This helps to identify connection hot spots and potential load-balancing issues. | | **Connections - Per Service** | A stacked-area time-series chart that breaks down the number of concurrent connections by service object. This helps to identify which services are holding the most active connections. | # CAIOS LOTA Source: https://docs.coreweave.com/observability/managed-grafana/storage/caios-lota Grafana dashboard for monitoring CAIOS LOTA storage events, S3 gateway requests, and proxy metrics The CAIOS LOTA dashboard helps you monitor storage events, S3 gateway request volume, and proxy and cache performance for CoreWeave AI Object Storage [Local Object Transport Accelerator (LOTA)](/products/storage/object-storage/improving-performance/about-lota). Use it to track request rates, cache effectiveness, and error trends so you can verify that LOTA-backed workloads are performing as expected. To view the dashboard, go to the [CAIOS LOTA dashboard](https://cks-grafana.coreweave.com/d/eeff523hiaewwc/caios-lota). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The CAIOS LOTA dashboard provides metrics about CAIOS LOTA storage events. The following panels are available: | Panel | Description | | - | - | | **Total LOTA: S3 Gateway Requests** | Shows a single, aggregated count of requests. | | **Proxy requests** | Shows the rate of requests the gateway proxies. | | **Cache requests** | Shows the rate of requests the cache serves. | | **Cache hit %** | Shows the cache hit percentage. | | **Cache hit status** | Breaks down cache requests into hits, misses, and in-progress states. | | **Range requests** | Shows the rate of HTTP Range requests. | | **Active LOTA count** | Shows the number of active LOTA instances or connections. | | **Proxy errors** | Shows the number of errors in the proxy component. | | **Cache errors** | Shows the number of errors in the cache component. | # CAIOS Usage Source: https://docs.coreweave.com/observability/managed-grafana/storage/caios-usage Monitor detailed usage metrics and quotas for your CoreWeave AI Object Storage. The **CAIOS Usage** dashboard shows the performance, resource utilization, and quotas of your CoreWeave AI Object Storage. Use this dashboard to understand how your storage is consumed, spot latency issues in object operations, and confirm you're operating within allocated quotas. This dashboard lets you: * Monitor request rates and bandwidth usage. * Track response and request durations for different object sizes. * Evaluate storage quotas and actual usage. To view the dashboard, go to the [CAIOS Usage dashboard](https://cks-grafana.coreweave.com/d/bebi5t788t6v4c/caios-usage). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). ![CAIOS Usage dashboard showing bandwidth panels.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/caios-1.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=1a08ce820c0785cae7fbd1610ebf8ae8) CAIOS usage dashboard showing bandwidth. ![CAIOS Usage dashboard showing response duration panels.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/caios-2.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b8cd486411f675c8e7a9b097fbcc44eb) CAIOS usage dashboard showing response duration. ## Filters and parameters Use the following filters at the top of the dashboard to customize your data view: | Field | Description | | - | - | | **Data Source** | Prometheus data source selector. | | **Zone** | Availability zone for data viewing. | | **User** | Cloud user or principal accessing the storage. | | **Bucket** | Specific storage bucket to monitor. | | **Operation** | Type of storage operation (for example, read, write). | | **Response Code** | HTTP response code filter. | | **Response Flags** | HTTP response flags filter. | Set the time range and refresh rate parameters at the top-right corner of the dashboard. The default time range is 24 hours. ## Panel descriptions The CAIOS Usage dashboard contains the following panels, grouped into logical sections. The following sections describe the usage metrics, quota metrics, and notes on the `UNKNOWN` storage class. ### Usage metrics | Panel | Description | | - | - | | **Total Requests per Second** | Shows the rate of HTTP requests to AI Object Storage. | | **Bandwidth** | Visualizes incoming (downloads) and outgoing (uploads) bandwidth. | | **Response Duration - Small Objects** | Time between "Time to First Byte" and "Time to Last Byte" for responses up to 100 KiB. | | **Response Duration - Small Reads** | Same as the previous row, specifically for read operations up to 100 KiB. | | **Request Duration - Small Objects** | Duration from client request initiation to completion for requests up to 100 KiB. | | **Request Duration - Small Reads** | Same as the previous row, but for read requests up to 100 KiB. | The panels related to response and request durations help you monitor latency in data transfers and identify potential bottlenecks or performance issues in object storage operations. * **P50**: Median duration, representing typical performance. * **P99**: 99th percentile duration, indicating peak latency that 1% of requests experience. These duration panels show the latency your workload is experiencing. CoreWeave does not publish a fixed per-operation latency target. To establish a baseline for your object sizes and request patterns, see [Benchmarking with Warp](/products/storage/object-storage/improving-performance/benchmarking-warp). Regular monitoring can help optimize your storage performance and efficiently manage storage quotas and resources. ### Quota metrics The following panels help you track storage consumption against allocated quotas so you can plan capacity and avoid hitting limits. | Panel | Description | | - | - | | **Total stored bytes quota & usage** | Tracks storage quota versus actual usage in bytes, broken down by storage class and zone. | | **Bucket count quota & usage** | Shows the number of buckets used versus quota allocated. | | **Stored bytes usage per bucket** | Displays total stored bytes for each bucket, categorized by storage class and zone. | ### `UNKNOWN` storage class You may occasionally see an `UNKNOWN` storage class on the **CAIOS Usage** dashboard or in custom Grafana queries. This indicates versioned objects contain "deleted" versions. In other words, delete markers haven't been permanently removed from the objects. These markers are reported, but don't have a storage class associated with them. # Distributed File Storage Usage Source: https://docs.coreweave.com/observability/managed-grafana/storage/distributed-storage Grafana dashboard for monitoring Distributed File Storage usage, capacity, and Persistent Volume Claims To view the dashboard, go to the [Distributed File Storage Usage dashboard](https://cks-grafana.coreweave.com/d/felwdhehb6ewwa/distributed-file-storage-usage). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The Distributed File Storage Usage dashboard provides metrics about storage usage and capacity. ![Distributed file storage dashboard.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/dfs-dashboard.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=13ad7108e7c491c18448572362514999) The dashboard contains the following panels: | Panel | Description | | - | - | | **Storage Volume Usage** | Displays the total storage volume in use. | | **Storage Volume Capacity** | Displays the total available storage volume capacity. | | **Storage Volume Usage vs Capacity (Last 7 days)** | Shows the storage volume usage over the last 7 days. | | **Number of PVCs by Storage Class** | Shows a breakdown of Persistent Volume Claims (PVCs) by their assigned Storage Class. | | **Persistent Volume Claims** | Shows Persistent Volume Claims with their size, used space, percentage used, and current status. | # VAST Actors Source: https://docs.coreweave.com/observability/managed-grafana/storage/vast-actors Grafana dashboard for monitoring VAST Actor instance NFS bandwidth, IOPS, and read/write statistics To view the dashboard, go to the [VAST Actors dashboard](https://cks-grafana.coreweave.com/d/ddq5gg6gi5lvke/vast-actors). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The VAST Actors dashboard provides metrics related to VAST Actor instances. It contains the following panels: | Panel | Description | | - | - | | **NFS Bandwidth** | Shows overall network bandwidth usage for the NFS service. | | **NFS Requests per Second** | Shows the rate of NFS requests processed each second. | | **Metadata IOPS Response Time** | Shows the response time for metadata Input/Output Operations Per Second (IOPS). | | **Nodes with High RPC Response Times** | Shows Nodes experiencing high response times for Remote Procedure Calls (RPC). | | **Vast Write Bandwidth per User** | Shows write bandwidth by user. | | **Vast Write IOPS per User** | Shows write IOPS by user. | | **Vast Read Bandwidth per User** | Shows read bandwidth by user. | | **Vast Read IOPS per User** | Shows read IOPS by user. | | **Replication Bandwidth** | Shows replication bandwidth. | | **Replication IOPS** | Shows replication IOPS. | # WEKA Source: https://docs.coreweave.com/observability/managed-grafana/storage/weka Grafana dashboard for monitoring WEKA storage cluster alerts, capacity, protection status, and IOPS The **WEKA** dashboard provides metrics for WEKA storage clusters. Use this dashboard to monitor cluster health and alerts, capacity, data protection status, IOPS, and per-filesystem performance. To view the dashboard, go to the [WEKA dashboard](https://cks-grafana.coreweave.com/d/feg6mkz6mg934d/weka). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The following sections describe each panel group on the dashboard. ## Cluster-wide info These panels summarize the overall state of the cluster, including alerts, capacity, throughput, and IOPS. | Panel | Description | | - | - | | **Alerts Counter** | Displays the total count of active alerts. | | **Failure domain** | Displays information about the failure domain configuration or status. | | **Protection (Stripe width + Redundancy level)** | Shows details about the data protection scheme, including stripe width and redundancy level. | | **Status** | Shows the overall operational status. | | **Protection Status** | Shows the current data protection status. | | **Protection Status Over Time** | Shows data protection status. | | **Containers** | Shows metrics related to running containers, such as their count or state. | | **Cluster Capacities** | Displays the various capacity metrics of the cluster. | | **Processes** | Displays metrics about running processes on the cluster Nodes. | | **Cluster drives** | Displays information or status about the drives in the cluster. | | **Max Cpu Utilization** | Tracks the maximum CPU utilization across the cluster. | | **Iops** | Shows the total Input/Output Operations Per Second (IOPS) of the cluster. | | **Throughput** | Shows the total data throughput of the cluster. | | **Drive Read/Write Requests/Sec** | Shows the rate of read and write requests per second to the storage drives. | | **NIC Data rate per container type** | Shows the Network Interface Card (NIC) data rate, categorized by the type of container. | | **AVG Drive Read/Write Latency** | Shows the average latency for drive read and write operations. | | **Drive Read/Write Throughput** | Shows the data throughput for drive read and write operations. | ## Per-filesystem info These panels show read and write latency, request rates, and throughput broken down by filesystem. | Panel | Description | | - | - | | **Average Read Latency by FS** | Shows the average latency of read operations, broken down by individual filesystem (FS). | | **Average Write Latency by FS** | Shows the average latency of write operations, broken down by individual filesystem (FS). | | **AVG Read Requests/Sec by FS** | Shows the average number of read requests per second, with data grouped by filesystem (FS). | | **AVG Write Requests/Sec by FS** | Shows the average number of write requests per second, with data grouped by filesystem (FS). | | **Read Throughput by FS** | Shows the data read throughput, broken down by filesystem (FS). | | **Write Throughput by FS** | Shows the data write throughput, broken down by filesystem (FS). | ## Top drives info These panels surface drive health metrics, including S.M.A.R.T. errors, critical warnings, temperature, and failed or inactive drives. | Panel | Description | | - | - | | **Drive Smart Media Errors** | Shows the count of media-related errors (such as bad sectors) reported by the drive's S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology) system. | | **Drive Smart Critical Warnings** | Shows any critical warnings issued by the drive's S.M.A.R.T. system, which can be indicators of impending drive failure. | | **Drive Smart Composite Temp** | Shows the composite temperature of the drives, a key health metric reported by S.M.A.R.T. | | **Failed / Inactive Drives** | Shows any drives that are currently in a failed state or are otherwise inactive in the system. | ## Top processes info These panels show per-process network traffic and drive request rates. | Panel | Description | | - | - | | **Network Received** | Displays the amount of incoming network traffic. | | **Network Transmitted** | Displays the amount of outgoing network traffic. | | **Drive Read Requests** | Displays the number or rate of read requests being made to the storage drives. | | **Drive Write Requests** | Displays the number or rate of write requests being made to the storage drives. | # Slurm Block Topology Source: https://docs.coreweave.com/observability/managed-grafana/sunk/slurm-block-topology Grafana dashboard for visualizing Slurm compute Node availability and allocation by block topology To view the dashboard, go to the [Slurm Block Topology dashboard](https://cks-grafana.coreweave.com/d/6d5afc99-124d-4ab4-9914-fde3bf8c581e/slurm-block-topology). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). ![Slurm Block Topology Dashboard](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/slurm-topology-dashboard.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=908488a686687666e428514ad69aa383) The **Slurm Block Topology** dashboard shows the availability, allocation, and status of compute Nodes, specifically organized by a block topology. The Slurm Block Topology dashboard is especially helpful for visualizing and understanding metrics for GPUs connected through rack-level [NVLink](/platform/instances/selecting-an-instance#the-role-of-nvlink-and-infiniband) fabrics like the GB200 and GB300 instance types. For documentation related to segment size, see the [segments section in Topology/Block Scheduling in Slurm](/products/sunk/optimize_workloads/topology-scheduling#segments). | Panel | Description | | - | - | | **Idle Nodes by Segment Size** | Displays how many idle Nodes are available for jobs at a certain segment size. | | **Idle Nodes by all Segment Sizes** | Shows a breakdown of all idle Node counts categorized by different segment sizes. | | **Idle Segments by Segment Size** | Shows the number of segments at a given size that can be allocated to each of the blocks. This panel is useful to see the potential scheduling targets by listing all the segments across blocks that have the required number of Nodes. **How to use**: Select the segment size you want to use for your job. The recommended max segment size is 16. Then check this panel to see how your job's segments can be allocated across the different blocks in your cluster. | | **Idle Nodes Per Block by Segment Size** | Shows the number of Nodes that can be allocated to each of the blocks. Helps determine whether to attempt a larger segment size for single-rack or multi-rack jobs. **How to use**: Start by selecting a segment size, for example, 7, in the selector. The dashboard updates to show all blocks that have at least 7 idle Nodes, and for each block, it displays the total number of Nodes available in that block. For example, if you need 30 Nodes total and expect to use 5 blocks, you can quickly see whether blocks with 10 or more Nodes are available. This lets you change to segment size 10 and use 3 racks instead of 5. Using fewer racks is recommended because communication overhead increases as the number of racks increases, which reduces performance. | | **Idle Nodes per Block** | Shows the count of all idle Nodes within each block, regardless of their segment size. | | **Allocated Nodes per Block** | Displays the number of Nodes that are currently allocated or in use, aggregated per block. | | **Slurm Nodes Status** | Shows the status of all Slurm Nodes. | ## Per-job allocation panels The dashboard also includes two panels that break down per-job allocation across blocks. These panels help you understand how running jobs are distributed across the cluster's block topology. | Panel | Description | | - | - | | **Nodes Allocated by Job per Block** | Shows the count of Nodes allocated within each block for each running job in the cluster. | The following screenshot shows the **Nodes Allocated by Job per Block** panel: ![Nodes Allocated by Job per Block panel.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/nodes-per-job-per-block.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=03065521a23ad9a70fc89d4ec8f06720) | Panel | Description | | - | - | | **Nodes Allocated by Block per Job** | Shows the number of Nodes used by different running jobs for each block in the cluster. | The following screenshot shows the **Nodes Allocated by Block per Job** panel: ![Nodes Allocated by Block per Job panel.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/nodes-by-block-per-job.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=4c63588d813cf6f469d5b07500d19d64) # Slurm Cluster Source: https://docs.coreweave.com/observability/managed-grafana/sunk/slurm-cluster Grafana dashboard for monitoring SUNK jobs, resource usage, and per-user breakdowns within a namespace To view the dashboard, go to the [Slurm Cluster dashboard](https://cks-grafana.coreweave.com/d/bX7jn6dZk/slurm-cluster). > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The **Slurm Cluster** dashboard provides an overview of all the SUNK jobs within a specific Namespace. It aggregates metrics by relevant properties, such as job state, resource type, and user, to illustrate trends in jobs. You can use this dashboard to: * Monitor the resource usage of SUNK jobs across all clusters. * Track the rate of filesystem operations of SUNK jobs across all clusters. * View information about SUNK jobs on a per-user or per-partition basis. ## Filters and parameters Use these filters at the top of the page to choose the data you want to view: | Field | Value | | - | - | | **Data Source** | The Prometheus data source selector. | | **Logs Source** | The Loki logs source selector. | | **Org** | The organization that owns the cluster. | | **Cluster** | The specific Kubernetes cluster in the organization to view. | | **Namespace** | The Kubernetes namespace where the Slurm cluster is located. | | **slurm\_cluster** | The Slurm cluster containing the job to view. | | **nodeset** | | | **Node Conditions** | Toggled on by default. Click to disable. | | **Pending Node Alerts** | Toggled off by default. Click to enable. | | **Firing Node Alerts** | Toggled off by default. Click to enable. | | **InfiniBand Fabric Flaps** | Toggled off by default. Click to enable. | | **MaxJobCount Limit Reached** | Toggled on by default. Click to disable. | The dashboard also includes a button with a link to the **Slurm Job Metrics** dashboard. Set the time range and refresh rate parameters at the top-right of the page. The default time range is 5 minutes, and the default refresh rate is 1 minute. ## Panel descriptions The following sections describe the dashboard panels, grouped by category. ## Slurm jobs The **Slurm Jobs** section lists information about the Slurm jobs running in the selected Namespace. It includes panels that display the jobs according to status. | Panel | Description | | - | - | | Running jobs | A sortable table that lists the currently running Slurm jobs along with quick-reference utilization statistics. | | Largest Job by Nodes | A pie chart that shows how many nodes each job is using. Click a section of the pie chart to open the **Slurm / Job Metrics** dashboard for that job. | | Pending jobs | A table that lists jobs currently in the `Pending` state. | | Completing/Completed jobs | A table that lists jobs currently in the `Completing` or `Completed` state. | | Failed/Suspended/Cancelled/Pre-empted/Timeout/Node-Fail jobs | A table that lists jobs currently in the following states: `Failed`, `Suspended`, `Cancelled`, `Preempted`, `Timeout`, `Node-Fail` | | RUNNING/COMPL/PEND Jobs | A graph that plots all jobs in the following states: `Completing` (green line), `Running` (yellow line), `Pending` (blue line), `Completed` (orange line). | | FAIL/SUSP/CANC/PREEMPT/TIMEDOUT Jobs | A graph that plots all jobs in the following states: `Timed out` (dark red), `Failed` (yellow), `Failed` due to NodeFail (light blue), `Suspended` (orange), `Preempted` (red) | ### Slurm jobs: Running jobs ![The Running Jobs table in Grafana](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/slurm-running-jobs-table.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=d5e67d1e45d39354314a97c186aabd34) The **Running jobs** table in the **Slurm Jobs** section displays all the currently running jobs, along with relevant hardware utilization metrics in a quick-reference format. Click the icon next to the column title to open the **Filter by values** menu. The data in each column is filterable by the relevant values held within. ![Filter by value menu in Grafana](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/grafana-filter-by-value.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=200d36ba3ee0759a10c07a91143b9cd0) You may need to use the horizontal scroll bar to view all the available fields. | Field | Description | | - | - | | Job Id | The Slurm job ID. | | Job | The name of the Slurm job. | | Uptime | The Slurm job uptime in seconds. | | User | The user who created the Slurm job. | | Account | The user account running the Slurm job. | | Partition | The partition where the Slurm job is running. | | Nodes | The number of nodes allocated to the Slurm job. | | GPU Util | Measures GPU utilization over a 1-hour period. | | SM Util | The fraction of time at least one warp was active on a multiprocessor, averaged over all multiprocessors. "Active" does not necessarily mean the warp is computing. For example, warps waiting on memory requests are considered active. The value represents an average over a time interval, not an instantaneous value. A value of 0.8 or greater is necessary, but not sufficient, for effective use of the GPU. A value less than 0.5 likely indicates ineffective GPU usage. | | NFS Total W 1h | The total volume of NFS `write` operations over a 1-hour period, in bytes. | | NFS Total R 1h | The total volume of NFS `read` operations over a 1-hour period, in bytes. | | NFS Avg W 1h | The average NFS `write` operations over a 1-hour period, in bytes. | | NFS Avg R 1h | The average NFS `read` operations over a 1-hour period, in bytes. | | NFS Peak W 1h | Maximum NFS `write` operations during a 1-hour period. | | NFS Peak R 1h | Maximum NFS `read` operations during a 1-hour period. | | NFS Retrans 1h | The number of NFS retransmissions over a 1-hour period. Retransmissions indicate packet loss on the network, due to congestion, faulty equipment, or faulty cabling. | The `Count` field at the bottom of the table displays the total number of running jobs. ## Control plane health The **Control Plane Health** section displays status information about the Control Plane components. | Panel | Description | | - | - | | Control Plane Restart Counters | Counts the number of times the Control Plane has restarted. | | Control Plane Readiness Timeline | Displays the status of Control Plane components over time. Green indicates that the component is ready. Red indicates that the component is not ready. | | Control Plane Readiness Timeline (Instant) | Displays the current status of Control Plane components, sorted by Container and Pod. Includes links to the logs for each entry. | ## Slurm-Login info The **Slurm-Login Info** section includes three panels: | Panel | Description | | - | - | | Slurm-Login Pod Status | A table that lists the status of the Slurm-Login Pods and a link to the corresponding Loki logs. | | Slurm-Login SSHD Memory Percentage Usage | A graph that displays memory usage over time relative to pod memory limit, or node memory limit as fallback. | | Slurm-Login SSHD CPU Percentage Usage | A graph that displays CPU usage over time relative to pod CPU limit, or node CPU limit as fallback. | ## Nodeset status The **Nodeset Status** panel displays pods by availability. The graph is color-coded with the following scheme: | Color | Meaning | | - | - | | Green | Current. | | Yellow | Desired. | | Blue | Feasible. | | Red | Ready. | ## Cluster nodes ![The Nodes graph in the Cluster Nodes section of Grafana](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/slurm-cluster-nodes-graph.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=104cbb4325fbc5090e03983cc4e2a251) | Panel | Description | | - | - | | Nodes | A time-series graph that displays the Total number of nodes in the cluster (purple), along with nodes in the following states: Idle (light blue), Allocated or complete (green), and Mixed (yellow). | | Fail/Down/Drain/Err Nodes | A time-series graph that displays all nodes in the cluster with the following states: `Down` (red), `Draining` (yellow), `Error` (light blue), and `Fail` (purple). | | Drain Reasons (TS) | A time-series graph that displays all node drain events. | | Drain Reasons | A table showing all the nodes that are in a drain state and the reason for the drain. Alerting reasons are highlighted in red. Timestamp available only on clusters running SUNK v6.2.0 or later. | ## GPU metrics The **GPU Metrics** section has four panels: ![The Current FP8 FLOPs and GPUs Allocated graphs in Grafana](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/gpu-metrics-graphs.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=7cf84dbb5a855c20c2d25fc9a603cfee) | Panel | Description | | - | - | | Current FP8 FLOPS (Gauge) | This number assumes FP8 training. | | Current FP8 FLOPS (Graph) | A graph that displays the FP8 FLOPS over time. This number assumes FP8 training. | | Active GPUs (Gauge) | A gauge that displays the number of active GPUs. | | GPUs Allocated | A graph that displays GPUs allocated (green line, left y-axis) and GPU Watts (yellow line, right y-axis). | ## Filesystem The **Filesystem** section includes information about `read` and `write` operations on the Network File System (NFS) and local files. | Panel | Description | | - | - | | Local Max Disk IO Utilization (Min 1m) | The green line indicates `write` operations and the yellow line indicates `read` operations. | | Local Avg Bytes Read / Written Per Node (2m) | The red line indicates `write` operations and the blue line indicates `read` operations. | | Local Total bytes Read / Written (2m) | The red line indicates `write` operations and the blue line indicates `read` operations. | | Local Total Read / Write Rate (2m) | The red line indicates `write` operations and the blue line indicates `read` operations. | | NFS Average Request Time by Operation | The duration each request takes from when it is enqueued to when it is handled for a given operation, in seconds. The green line indicates `write` operations and the yellow line indicates `read` operations. | | NFS Avg Bytes Read / Written Per Node (2m) | The red line indicates `write` operations and the blue line indicates `read` operations. | | NFS Total Bytes Read / Written (2m) | The red line indicates `write` operations and the blue line indicates `read` operations. | | NFS Total Read / Write Rate | The red line indicates `write` operations and the blue line indicates `read` operations. | | NFS Average Response Time by Operation | The duration from when a request is transmitted to when a reply is received for a given operation, in seconds. The green line indicates `write` operations and the yellow line indicates `read` operations. | | NFS Avg Write Rate Per Active Node (2m) | The red line indicates `write` operations and the dashed green line displays **active nodes**. Only includes nodes writing over 10 KB/s. | | NFS Avg Read Rate Per Active Node (2m) | The blue line indicates `read` operations and the dashed green line displays **active nodes**. Only includes nodes reading over 10 KB/s. | | NFS Nodes with Retransmissions | Retransmissions indicate packet loss on the network, due to congestion, faulty equipment, or faulty cabling. | ### Filesystem: NFS average response and request The **NFS Average Response and Request** graphs describe the performance of the filesystem. A slowdown or spike could indicate that the storage is too slow, and that the job might perform better with faster or a different type of storage, such as object storage. ### Filesystem: NFS total read / write The **NFS Total Read / Write** graphs typically display a large red spike when a job starts, as the model and data are read in. While the job runs, the graph shows smaller write spikes at regular intervals as the checkpoints are written out. Compare these graphs with the panels in the [**GPU Metrics**](#gpu-metrics) section to confirm that running jobs behave as expected. ## Users and accounts The **Users and Accounts** section contains graphs that display information about Slurm jobs by associated user, account, and partition. | Panel | Description | | - | - | | Pending Jobs per Partition | Displays the number of jobs in the `Pending` state in a given partition. | | Running Jobs per Account | Displays the number of jobs in the `Running` state per Account. | | Pending Jobs per Account | Displays the number of jobs in the `Pending` state per Account. | | Running Jobs per Users | Displays the number of jobs in the `Running` state per individual user. | | Pending Jobs per Users | Displays the number of jobs in the `Pending` state per individual user. | | Utilized CPUs per Account | Displays the number of CPUs utilized per Account. | | Utilized CPUs per user | Displays the number of CPUs utilized per individual user. | ## CPU cores allocation The **CPU cores allocation** section contains graphs that display information about CPU and GPU core allocation, according to status. | Panel | Description | | - | - | | CPU Allocation | Displays the following: Total number of CPU cores (green), Allocated CPU cores (yellow), and Idle CPU cores (light blue). | | CPUs Allocated per Partition | Displays all CPUs allocated, by partition. | | CPUs Idle per Partition | Displays all CPU cores in an `Idle` state, by partition. | | GPUs Allocated per Partition | Displays all GPUs allocated, by partition. | | GPUs Idle per Partition | Displays all GPU cores in an `Idle` state, by partition. | ## RPC traffic The **RPC Traffic** section contains graphs that display Remote Procedure Calls (RPC) traffic. | Panel | Description | | - | - | | Request Rate | Displays the rate of RPC requests sent, in requests per second. | | Mean Request Duration | Displays the mean duration of all RPC requests, in milliseconds. | ## Total backfilled jobs The **Total Backfilled Jobs** section has three panels: | Panel | Description | | - | - | | Total Backfilled Jobs (since last slurm start) | Number of jobs started due to backfilling since last Slurm start. | | Total Backfilled Jobs (since last stats cycle start) | Number of jobs started due to backfilling since last time stats were reset. | | Fair Share per Account | Note: The REST API does not expose this information. | ## PVC info The **PVC Info** section contains the **MySQL PVC Usage** graph, which displays the percentage of total capacity used over time. ## SUNK info The **SUNK Info** section contains details about the versions of SUNK, Ubuntu, and CUDA in use. ## SUNK image info The **SUNK Image Info** section contains the **SUNK Control Plane, Compute and Login Pod Images** panel. This panel lists the images used for the SUNK Control Plane, Compute, and Login Pods, sorted by container. # Slurm Job Metrics Source: https://docs.coreweave.com/observability/managed-grafana/sunk/slurm-job-metrics View detailed metrics about a Slurm job with Grafana > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The **Slurm Job Metrics** dashboard displays detailed information about the performance and hardware utilization of a selected Slurm job. Use this page to understand which panels the dashboard provides, how to filter the data it shows, and how to interpret the metrics when investigating job performance. To open the dashboard, go to the [Slurm Job Metrics dashboard](https://cks-grafana.coreweave.com/d/slurm-job-metrics/slurm-job-metrics). You can use this dashboard to: * Monitor the GPU and CPU utilization of a given Slurm job. * Track the rate of filesystem operations related to the Slurm job. * View Node conditions and alerts that may impact the performance of the Slurm job. * Inspect NVIDIA Collective Communications Library (NCCL) bandwidth and latency per collective, and identify GPU ranks that fall behind the rest of the job. The following sections describe the filters available at the top of the dashboard and the panels grouped under each section. ## Filters and parameters Use these filters at the top of the page to choose the data you want to view: | Field | Value | | - | - | | **Data Source** | The Prometheus data source selector. | | **Logs Source** | The Loki logs source selector. | | **Org** | The organization that owns the cluster. | | **Cluster** | The specific Kubernetes cluster in the organization to view. | | **Namespace** | The Kubernetes namespace where the Slurm cluster is located. | | **Slurm Cluster** | The Slurm cluster containing the job to view. | | **Job Name** | The name of the Slurm job to view. Select "All" to view all the Slurm jobs in the Slurm Cluster. | | **Job ID** | The Slurm Job ID to view. Select "All" to view all the Slurm jobs in the Slurm Cluster. | | **Node Conditions** | Toggled on by default. Click to disable. | | **Pending Node Alerts** | Toggled on by default. Click to disable. | | **Firing Node Alerts** | Toggled off by default. Click to enable. | | **InfiniBand Fabric Flaps** | Toggled off by default. Click to enable. | | **GPU Straggler** | Toggled on by default. Click to disable. Overlays detected stragglers as red markers on the **Job State Timeline** and **Current FP8 FLOPS** panels. | | **Slow NCCL Operations** | Toggled on by default. Click to disable. Overlays slow collective operations as yellow markers on the **NCCL BusBW** panels. | The dashboard also includes buttons with links to the **Slurm Cluster** dashboard and `slurmctld` logs. Set the time range and refresh rate parameters at the top-right of the page. The default time range is 5 minutes, and the default refresh rate is 1 minute. ## Panel descriptions The following sections describe each group of panels on the dashboard, starting with **Job Info** and continuing through **GPU Metrics**, **Filesystem**, **Node Resources**, and **NCCL Metrics**. ### Job Info The **Job Info** section displays identifying information about the selected Slurm job, including: | Panel | Displays | | - | - | | **Job Id** | The Slurm job ID. | | **Name** | The name of the Slurm job. | | **Last State** | Displays the most recently reported [state of the Slurm job](/observability/managed-grafana). | | **User** | The user who created the Slurm job. | | **Account** | The user account running the Slurm job. | | **Nodes** | The number of nodes allocated to the Slurm job. | | **Partition** | The partition where the selected job is running. | | **Job State Timeline** | A chart that shows the [Slurm job's states over time](/observability/managed-grafana). | | **Uptime** | The Slurm job uptime in seconds. | | **Active GPUs** | The number of GPUs allocated to the Slurm job that are currently running. | | **Job Efficiency** | Indicates how active the GPUs were while working on the selected job. This value is estimated based on idle time, defined as a node with at least 1 GPU under 50% utilization. The estimate excludes restarts and checkpointing. This is not a model FLOPs utilization (MFU) metric. | | **Current FP8 FLOPS** | Graphs the Compute rate over the job run. The graph typically displays peaks and valleys in a regular pattern. Points with lower Compute values often correspond with loading data or saving checkpoints. This number assumes FP8 training. | | **Node conditions** | Lists nodes that have been assigned a condition, along with timestamps indicating when the condition was noticed and addressed. | | **Alerts** | Displays all alerts with a severity level higher than **Informational**, over a 10-minute interval. Alerts may have a `PENDING` or `FIRING` state. | | **Nodes (Range)** | Lists all nodes with their state and uptime. **Node ID** links to the Node Details dashboard, **Node Name** to the Pod Inspector dashboard, and **slurmd log** to the node's `slurmd` logs in Loki. | #### Estimate model FLOPs utilization (MFU) from tensor core utilization Use the **Tensor Core Utilization Running Jobs** panel in the **GPU Metrics** section to get a rough estimate of MFU. ![Graph showing tensor core utilization.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/tensor-core.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=3f29a66f00365e27786f41738b8edb8d) Although tensor core utilization is a hardware-level metric and MFU is an application-level metric, the **Tensor Core Utilization Running Jobs** panel acts as an upper bound for MFU. Your model's actual mathematical efficiency can't exceed the percentage of time the hardware's tensor cores are actively processing instructions. Use tensor core utilization as a hard upper bound and diagnostic resource. The **Current FP8 FLOPS** panel isn't a good indicator of actual model FLOPS. It provides an idealized estimate based on tensor core utilization across all GPUs on the nodes allocated to the job. The panel scales its TFLOPS-per-GPU assumption to the detected GPU model: 1979 for H100 or H200, 5000 for GB200 or GB300, 4500 for B200 or B300, 1000 for B40, 624 for A100, and 362 for L40. Unrecognized GPU models default to 1979. #### Job Info: Job State Timeline and Last State The **Job Info** section contains panels that display information about the state of the selected Slurm job. **Last State** displays the most recent reported state, while the **Job State Timeline** displays the job's status over time. ![Slurm Job State Timeline panel](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/slurm-job-state-timeline.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=28d6be857e9c936a5af5ced15a971287) A Slurm job can be in the following states: | State | Meaning | | - | - | | `RUNNING` | Actively executing on allocated resources. | | `PENDING` | Queued to run when resources are available. | | `CANCELLED` | Canceled by a user. | | `COMPLETING` | Finished or canceled, and currently performing cleanup tasks, such as an Epilog script. | | `PREEMPTED` | Preempted by another job. | | `COMPLETED` | Successfully completed execution. | #### Job Info: Node alerts Job alerts in the Slurm Job Metrics dashboard are generated by CoreWeave's Mission Control, an automated system that continuously monitors and manages the underlying compute infrastructure to maintain high cluster reliability and availability. These alerts target hardware and system-level issues, such as GPU errors, networking failures, and endpoint timeouts. These conditions aren't typically observable through application-layer metrics such as training metrics or standard logs. ##### Understanding Node alerts and conditions The following image shows an interruption caused by a Node alert, namely `GPUContainedECCError`. * Blue lines: Indicate Node conditions. * Red lines: Indicate Node alerts. ![Grafana dashboard showing Node alerts and conditions.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/node-alerts.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=17696957de0f442ff829f7f83f5c0988) The Node alert indicated by the red line, `GPUContainedECCError`, appears before the drop in compute, while the Node conditions indicated by the blue lines delineate the window the drop in compute occurred within. The image shows that the H100 cluster experienced a hard fault around 15:15. Throughput dropped from 500 PFLOPS to 0 because the Slurm scheduler pulled a Node out of the pool due to a `GPUContainedECCError`. Understanding how Node alerts and conditions are overlaid on Node metrics can help you diagnose and troubleshoot problems with a running job. ### GPU Metrics The **GPU Metrics** section displays detailed information related to hardware utilization. In this section, red lines correspond with higher temperature or utilization of the measured value, while green lines indicate a lower value or idle state. Whether these values suggest "good" or "bad" performance depends on the expected behavior and resource utilization of the job. | Panel | Description | | - | - | | **GPU Temperatures Running Jobs** | Displays the temperature of the GPUs over time. Generally, an increase in temperature corresponds with a job run, indicating that the GPUs are busy. | | **GPU Core Utilization Running Jobs** | Displays the utilization of GPU cores over time. Red indicates high utilization. | | **SM Utilization Running Jobs** | The fraction of time at least one warp was active on a multiprocessor, averaged over all multiprocessors. "Active" does not necessarily mean that a warp is actively computing. For example, warps waiting on memory requests are considered active. The value represents an average over a time interval and is not an instantaneous value. A value of 0.8 or greater is necessary, but not sufficient, for effective use of the GPU. A value less than 0.5 likely indicates ineffective GPU usage. | | **GPU Mem Copy Utilization Running Jobs** | Displays the utilization of GPU memory. | | **Tensor Core Utilization Running Jobs** | Displays the utilization of Tensor cores over time. | | **VRAM Usage** | Plots the amount of VRAM used by the GPU over time. | | **GPUs Temperature** | Displays the temperatures of the GPUs over time. | | **GPUs Power Usage** | Plots the power usage of the GPUs, in watts. | #### GPU Metrics: Color coding | Color | Meaning | | - | - | | Red | High utilization. | | Orange-Yellow | Medium-low utilization. | | Green | Low utilization or idle. | | Black | No job running at this time. | ![GPU Metrics panels](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/slurm-gpu-metrics.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=a631abc029e2d1065ed0e26c6b61dde0) This example shows a high (red) value in the **GPU Core Utilization** panel, a medium (yellow) value in the **GPU Temperatures** panel, and low (green) values in the **GPU Mem Copy Utilization** panel. This indicates that the tracked Slurm job had high utilization of GPU Cores and low utilization of GPU memory, which may be expected for a small model size. When you compare the fluctuations in GPU Temperature with the charts in the [**Filesystem**](#filesystem) section, you can see that drops in the GPU temperature may correspond with spikes in NFS `write` operations. ![NFS Average Request and Response panels](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/slurm-nfs-average-request-response.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=6355d87ef12e1e620ff13895145a7d13) ### Filesystem The **Filesystem** section includes information about `read` and `write` operations on the Network File System (NFS) and local files. | Panel | Description | | - | - | | **Local Max Disk IO Utilization (Min 1m)** | The green line indicates `write` operations and the yellow line indicates `read` operations. | | **Local Avg Bytes Read / Written Per Node (2m)** | The red line indicates `write` operations and the blue line indicates `read` operations. | | **Local Total bytes Read / Written (2m)** | The red line indicates `write` operations and the blue line indicates `read` operations. | | **Local Total Read / Write Rate (2m)** | The red line indicates `write` operations and the blue line indicates `read` operations. | | **NFS Average Request Time by Operation** | Duration requests took from when a request was enqueued to when it was completely handled for a given operation, in seconds. The green line indicates `write` operations and the yellow line indicates `read` operations. | | **NFS Avg Bytes Read / Written Per Node (2m)** | The red line indicates `write` operations and the blue line indicates `read` operations. | | **NFS Total Bytes Read / Written (2m)** | The red line indicates `write` operations and the blue line indicates `read` operations. | | **NFS Total Read / Write Rate** | The red line indicates `write` operations and the blue line indicates `read` operations. | | **NFS Average Response Time by Operation** | Duration requests took to get a reply back after a request for a given operation was transmitted, in seconds. The green line indicates `write` operations and the yellow line indicates `read` operations. | | **NFS Avg Write Rate Per Active Node (2m)** | The red line indicates `write` operations and the dashed green line displays **active nodes**. Only includes nodes writing over 10 KB/s. | | **NFS Avg Read Rate Per Active Node (2m)** | The blue line indicates `read` operations and the dashed green line displays **active nodes**. Only includes nodes reading over 10 KB/s. | | **NFS Nodes with Retransmissions** | Retransmissions indicate packet loss on the network, either due to congestion or faulty equipment or cabling. | ![NFS Read and Write panels](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/slurm-nfs-average-read-write.jpeg?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=f7603ba030a10a83c99d12365a871297) #### Filesystem: NFS Average Response and Request The **NFS Average Response and Request** graphs describe the performance of the filesystem. A slowdown or spike could indicate that the storage is too slow, and that the job might perform better with faster or a different type of storage, such as object storage. #### Filesystem: NFS Total Read / Write The **NFS Total Read / Write** graphs typically display a large red spike when a job starts, as the model and data are read in. While the job runs, the graph shows smaller write spikes at regular intervals, which occur as the checkpoints are written out. Compare these graphs with the panels in the [**GPU Metrics**](#gpu-metrics) section to help confirm that running jobs are behaving as expected. ### Node Resources The **Node Resources** section includes the **CPU Allocation** panel, which displays the total number of CPU cores utilized over the job runtime. ### NCCL Metrics The **NCCL Metrics** section reports how the GPUs allocated to the job communicate with each other, using telemetry from the NCCL profiler plugin. These panels populate only when GPU Straggler Detection runs on the cluster. They sample at one-minute intervals. Jobs that run for less than about two minutes produce empty or sparse panels. The **NCCL BusBW** and **NCCL Latency** panels each appear once per process-group size, and the 32+ and 512+ panels include every group at or above that size. A job populates only the panels whose sizes its communicators match, and the remaining panels read "This job does not contain NCCL groups of this size". | Panel | Description | | - | - | | **NCCL BusBW (Process Groups w/ 2, 4, 8, 16, 32+, or 512+ GPUs)** | Bus bandwidth in GB/s for collective operations running in process groups of the given size, averaged by collective and communicator. | | **NCCL Latency (Process Groups w/ 2, 4, 8, 16, 32+, or 512+ GPUs)** | Collective execution time in microseconds for process groups of the given size, averaged by collective and communicator. The 32+ and 512+ panels also break the series out by Pod, so you can compare Nodes directly, though only the 32+ legend names the Pod. The legend sorts by mean in descending order, so the slowest collectives appear first. | | **NCCL Message Size** | The average payload size per collective operation, in bytes. Small messages are latency-bound and don't reach the bandwidth that large messages do, so read the bandwidth panels against this one. | | **GPU Straggler** | Identifies the GPU rank that fell behind the rest of the job in collective operations, with the start and end of the interval, the Node, and the `slurmd` Pod. The detection isolates the single furthest-behind rank, so this table normally shows one row per interval. The **Node** and **Slurmd Pod** values link to the Node Details and Pod Inspector dashboards. | | **Slow NCCL Operations** | Lists each GPU rank whose algorithmic bandwidth dropped well below that rank's own average over the previous 24 hours, along with the **NCCL Function** affected. The remaining columns and drill-down links match **GPU Straggler**. | For an introduction to the feature that produces these metrics, along with worked examples, see [Introduction to GPU Straggler Detection](/products/sunk/discover_sunk/straggler-detection). To turn it on for a SUNK cluster, see [Enable GPU Straggler Detection](/products/sunk/optimize_workloads/enable-gpu-straggler-detection). # SUNK Global Source: https://docs.coreweave.com/observability/managed-grafana/sunk/sunk-global Monitor SUNK infrastructure and resources across all regions and clusters > [!NOTE] > > For instructions about accessing CoreWeave Grafana dashboards, see [Access and use CoreWeave Grafana dashboards](/observability/managed-grafana/access). The **SUNK Global** dashboard provides a high-level overview of SUNK infrastructure across all regions, cluster organizations, and clusters. It shows alerts, job distribution, software version information, and control plane health metrics. To open the dashboard, go to the [SUNK Global dashboard](https://cks-grafana.coreweave.com/d/sunk-global/sunk-global). The following sections describe the filters available at the top of the dashboard and the panels grouped under each section. ## Filters and parameters Use these filters at the top of the page to choose the data you want to view: | Field | Value | | - | - | | **Data Source** | The Prometheus data source selector. | | **Region** | The regions to view. Supports multi-select. | | **Org** | The cluster organizations to view. Supports multi-select. | | **Cluster** | The specific Kubernetes clusters to view. Supports multi-select. | Set the time range and refresh rate parameters at the top-right of the page. The default time range is 1 hour. ## Panel descriptions ### SUNK alerts The **SUNK Alerts** section displays active alerts across all monitored SUNK infrastructure. | Panel | Description | | - | - | | **SUNK Alerts Timeline** | A time-series graph showing when alerts fired. Each line represents an alert grouped by `alertname`, `region`, `cluster_org`, and `cluster`. | | **SUNK Alerts Table (Instant)** | A table showing all firing SUNK alerts. Includes `alertname`, severity, team, `region`, `cluster_org`, `cluster`, `namespace`, `node`, `nodeset`, and `pod` information. Namespace, node, and pod values link to detailed dashboards. | ![SUNK Alerts section showing timeline and table of firing alerts](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/sunk_alerts.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=f5b6c550337075c2bc874cad5b3db351) The **SUNK Alerts Table** provides clickable links to drill down into the Slurm Cluster Dashboard view for each alert so you can investigate the context around firing alerts. You can also click node values to view Node Details or pod values to access the Pod Inspector for detailed troubleshooting. ### Slurm jobs The **Slurm Jobs** section displays running Slurm job distribution. | Panel | Description | | - | - | | **Largest Job by Nodes** | A donut chart showing the top 10 largest running jobs by node count. Click a slice to navigate to the Slurm Job Metrics dashboard. | ### Software versions The **Software Versions** section displays version distribution across the SUNK infrastructure. | Panel | Description | | - | - | | **SUNK Versions Piechart** | A donut chart showing SUNK version distribution across Syncer containers. | | **SUNK Versions Table** | A table listing SUNK versions by `region`, `cluster_org`, `cluster`, and `namespace` with node counts. | | **SUNK Operator Versions** | A donut chart showing SUNK Operator (controller-manager) version distribution. | | **SUNK Operator Versions Table** | A table listing SUNK Operator (controller-manager) versions by `region`, `cluster_org`, and `cluster` with node counts. | | **CUDA Versions Piechart** | A donut chart showing CUDA version distribution across `slurmd` containers. | | **CUDA Versions Table** | A table listing CUDA versions by `region`, `cluster_org`, `cluster`, and `namespace` with node counts. | | **OS Versions Piechart** | A donut chart showing Ubuntu OS version distribution across SUNK daemon containers. | | **OS Versions Table** | A table listing OS versions by `region`, `cluster_org`, `cluster`, and `namespace` with node counts. | ![SUNK Versions showing piechart and table of versions across infrastructure](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/sunk_versions.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b59e1aa443e0aad259ae5227cd518f3a) The **SUNK Versions** panels show which version each cluster uses across your infrastructure. The piechart shows the distribution at a glance, and the table shows exactly which clusters run each version. Use this to plan and coordinate upgrades. ![CUDA Versions showing distribution across infrastructure](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/cuda_versions.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=606a0c0167f32c0a773e6dbb29097d43) The **CUDA Versions** panels show CUDA version distribution across all `slurmd` containers. Use these panels to track which CUDA versions your clusters run and to plan upgrades across your infrastructure. ### Control plane health The **Control Plane Health** section displays SUNK control plane component status. | Panel | Description | | - | - | | **Control Plane Restart Counters** | A time-series graph showing restart count increases for control plane containers (`scheduler`, `slurmctld`, `slurmdbd`, `slurmrestd`, `syncer`, `mysql`) over time. | | **Control Plane Readiness Status (Instant)** | A table showing the current ready state of control plane pods. Includes Container, Pod, Status (Ready or Not Ready), `region`, `cluster_org`, `cluster`, `namespace`, and a link to view pod logs in Loki. | ![Control Plane Readiness Status table showing pod status across infrastructure](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/managed-grafana/_media/control_plane_readiness.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=d3c3f150bdd5c2f14a91353c5cd0d027) The **Control Plane Readiness Status** table displays the current ready state of all control plane components. You can drill down into individual pods through the Pod Inspector or open Loki logs directly from the table to troubleshoot any control plane components. # Self-hosted Grafana Source: https://docs.coreweave.com/observability/self-hosted-grafana Setting up a self-hosted Grafana instance inside CKS This guide shows you how to deploy and configure a self-hosted Grafana instance inside a CoreWeave Kubernetes Service (CKS) cluster. If you need more customization and control than [CoreWeave Grafana](/observability/managed-grafana) provides, you can deploy a self-hosted Grafana instance. CoreWeave Grafana supports [custom dashboards](/observability/managed-grafana#custom-dashboards) in preview, but CoreWeave-provided dashboards are read-only and CoreWeave Grafana doesn't support custom alerting. With self-hosting, you can edit or export CoreWeave-provided dashboards, create custom alerts, and freely explore all available metrics in your environment. [CoreWeave Charts](/products/cks/clusters/coreweave-charts/introduction) deploys self-hosted Grafana instances. This handles most of the process of configuring data sources, but [authentication](#configure-coreweave-metrics-data-source-credentials) requires some manual configuration. By the end of this guide, you have a running self-hosted Grafana instance connected to CoreWeave Metrics and CoreWeave Logs data sources. ## Prerequisites To set up a self-hosted Grafana instance, you need the following: * A [CoreWeave API access token](/security/authn-authz/managed-auth/api-access) for an active CKS account. The token's user needs the [**Observability Viewer**](/security/iam/access-policies/roles#observability-and-telemetry) role to read metrics and logs data. * A CKS cluster where you intend to self-host (deploy and manage) Grafana. * [`kubectl`](https://kubernetes.io/docs/tasks/tools/) installed. * [`helm`](https://helm.sh/docs/intro/install/) installed. > [!WARNING] > > Customers who self-host a Grafana instance are responsible for all setup, maintenance, and resource costs associated with hosting. CoreWeave recommends using [CoreWeave Grafana](/observability/managed-grafana). ## Install Grafana with CoreWeave Charts This section installs the Grafana Helm chart into your cluster so the application is running and ready to configure. 1. Add the CoreWeave Charts repository: ```bash theme={"system"} helm repo add coreweave https://charts.core-services.ingress.coreweave.com ``` 2. Install the `grafana` chart, pinning the chart version: ```bash theme={"system"} helm install -n "[MY-NAMESPACE]" grafana coreweave/grafana --version 1.61.0 ``` > [!NOTE] > > The version pin is required. Versions 1.62.0 and later of the `grafana` chart fail to install with the error `Secret "sh.helm.release.v1.grafana.v1" is invalid: data: Too long: may not be more than 1048576 bytes`, because the Helm release record for the chart exceeds the Kubernetes Secret size limit. Version 1.61.0 is the latest version that installs successfully. > [!TIP] > > The `grafana-dashboards` chart is a dependency of `grafana`, so it does not need to be installed independently. ## Log in to Grafana with admin credentials With Grafana installed, the next step is to reach the application in your browser and sign in as the administrator so you can finish configuration. Before you log in to Grafana, you must port forward your Grafana service. 1. Port forward your Grafana service: ```bash theme={"system"} kubectl port-forward svc/grafana -n "[MY-NAMESPACE]" 8900:80 ``` 2. Navigate to `localhost:8900`. You see a login page similar to the following: ![Grafana login page.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-login.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=70480975f161d88ecbb07b47a2844560) 3. Obtain the admin password, which is required to log in to Grafana for the first time. This password is stored as a Kubernetes Secret. Retrieve the Secret value, replacing `[MY-NAMESPACE]` with your namespace ID: ```bash theme={"system"} kubectl get secret grafana -n "[MY-NAMESPACE]" -o=jsonpath='{.data.admin-password}' | base64 --decode ``` Note: If you use a Mac, you might need to remove the trailing `%`. 4. Use the returned value as your password when you log in to Grafana with the following credentials: | Field | Value | | - | - | | Username | `admin` | | Password | `[MY-SECRET]` | ## Configure CoreWeave Metrics data source credentials After you log in to Grafana with your admin credentials, you must configure credentials for the CoreWeave-provided data sources so Grafana can authenticate to the CoreWeave observability backend. First, configure the CoreWeave Metrics data source. ### Configure the data source HTTP headers The following HTTP header values are required to connect to CoreWeave's data sources, where `[MY-TOKEN]` is your CoreWeave [API access token](/security/authn-authz/managed-auth/api-access). | Field | Value | | - | - | | Header | `Authorization` | | Value | `Bearer [MY-TOKEN]` | To configure these headers, navigate to **Connections** from Grafana's left-hand menu to display the dropdown options. Then, click **Data sources** to proceed to the **Data sources** page. Select **CoreWeave Metrics** from the options listed to proceed to the **Settings** menu for the new data source. ![Grafana menu with data sources item indicated](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-connections-data-sources.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b10aaffa81369d37a4e06d6bef134c25) Next, navigate to the **Authentication** section. This is the only section that requires editing. ![Authentication section of Grafana data sources screen](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-authentication-http-header.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=aca6fdb003ea8dac7df918021c8d5a67) Then, click the dropdown arrow on the right-hand side of the **HTTP headers** subsection to display the **+ Add header** button. ![HTTP headers section of Grafana data sources screen](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-authentication-add-http-header.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=c5a2ad79c682ea935953567b7b136dc9) In the **Header** field, enter `Authorization`. ![Custom header section of Grafana data sources screen](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/grafana-http-header-fields.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=0e1a66ad66cd5b019bd27eb1f512f606) In the **Value** field, provide the value `Bearer [MY-TOKEN]`, where `[MY-TOKEN]` is your CoreWeave [API access token](/security/authn-authz/managed-auth/api-access). Configure the HTTP method to use `GET` by changing the HTTP dropdown method in the **Other** subsection to `GET`: ![Configure the HTTP method to use GET.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/configure-get.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=f5f9b5a25fd0a3b2602d30d0bc2b7d30) ## Configure the CoreWeave Logs data source After the configuration for the **CoreWeave Metrics** data source is complete, repeat the preceding steps for the **CoreWeave Logs** data source. With both data sources configured, your self-hosted Grafana instance can query CoreWeave metrics and logs. ## Learn more For more information, explore the following resources: * [Custom GPU utilization alerts](/observability/self-hosted-grafana/custom-alerts) to create Grafana-managed alert rules that monitor GPU utilization across your cluster. * [Grafana documentation](https://grafana.com/docs/grafana/latest/) for guidance on tasks such as building dashboards, working with data sources, and exploring metrics. * [Prometheus Query Language (PromQL) documentation](https://prometheus.io/docs/prometheus/latest/querying/basics/) to learn how to query the **CoreWeave Metrics** data in both ad-hoc Explore queries and advanced dashboard panels. # Custom GPU utilization alerts Source: https://docs.coreweave.com/observability/self-hosted-grafana/custom-alerts Create Grafana-managed alert rules to monitor GPU utilization across your cluster You can create custom alert rules for conditions such as low GPU utilization in a [self-hosted Grafana](/observability/self-hosted-grafana) instance with CoreWeave Metrics configured as a data source. [CoreWeave Grafana](/observability/managed-grafana) does not support custom alert rules. This page walks through two example alert rules that monitor GPU utilization using the `DCGM_FI_DEV_GPU_UTIL` metric from NVIDIA Data Center GPU Manager (DCGM). ## Prerequisites Before you create these alert rules, you need the following: * A [self-hosted Grafana](/observability/self-hosted-grafana) instance with the CoreWeave Metrics data source configured * A [contact point](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/) to receive alert notifications ## About the DCGM GPU utilization metric `DCGM_FI_DEV_GPU_UTIL` is a gauge metric from the NVIDIA driver that measures overall GPU utilization as a percentage (0 to 100) per device. CoreWeave exposes this metric through the CoreWeave Metrics data source. > [!NOTE] > > The examples on this page exclude activity in the `cw-hpc-verification` namespace. CoreWeave runs [HPC Verification](/platform/fleet-management/hpc-verification) tests in this namespace when GPUs are idle. Customer workloads normally preempt these tests, and they don't represent real utilization. ## Alert on average cluster GPU utilization This alert fires when the average GPU utilization across all GPUs in a cluster falls below a threshold for a sustained period. To create this alert rule: 1. In Grafana, navigate to **Alerting** > **Alert rules**, then select **New alert rule**. 2. Select **Grafana-managed rule** as the rule type. 3. In the query editor, switch to **Code** mode and enter the following PromQL expression. Replace `[CLUSTER-NAME]` with the name of your cluster. ```text theme={"system"} avg( avg_over_time( DCGM_FI_DEV_GPU_UTIL{cluster="[CLUSTER-NAME]", namespace!~"cw-hpc-verification"}[24h] ) ) ``` This expression calculates the average GPU utilization across all GPUs in the cluster over a 24-hour window. 4. Under **Expressions**, configure the threshold condition. For example, set the condition to fire when the value is less than `50`. 5. Configure the **evaluation interval** and **pending period** to control how frequently the rule is evaluated and how long the condition must persist before the alert fires. 6. Select the contact point you created in the [prerequisites](#prerequisites) to receive notifications. 7. Select **Save rule and exit**. Adjust the threshold (`50`), the time window (`24h`), and the cluster name to match your requirements. ## Alert on the proportion of idle GPUs Instead of tracking overall average utilization, this alert fires when a certain proportion of individual GPUs in a cluster are completely idle. This approach uses two queries and a math expression: 1. In Grafana, navigate to **Alerting** > **Alert rules**, then select **New alert rule**. 2. Select **Grafana-managed rule** as the rule type. 3. In the query editor, add two queries in **Code** mode. Replace `[CLUSTER-NAME]` with the name of your cluster. **Query A** counts the number of idle GPUs in the cluster, where a GPU is idle if its average utilization over the past 24 hours is zero. The `sum by (node, gpu)` clause isolates each individual GPU before the count: ```text theme={"system"} count( sum by (node, gpu) ( avg_over_time( DCGM_FI_DEV_GPU_UTIL{cluster="[CLUSTER-NAME]", namespace!~"cw-hpc-verification"}[24h] ) ) == 0 ) ``` **Query B** counts the total number of GPUs in the cluster: ```text theme={"system"} count( sum by (node, gpu) ( DCGM_FI_DEV_GPU_UTIL{cluster="[CLUSTER-NAME]"} ) ) ``` 4. Add a **Math** expression that divides Query A by Query B to calculate the proportion of idle GPUs: ```text theme={"system"} $A / $B ``` 5. Under **Expressions**, set the threshold condition. For example, set the condition to fire when the math expression result is greater than `0.5` (meaning more than 50% of GPUs are idle). 6. Configure the **evaluation interval** and **pending period**. 7. Select the contact point you created in the [prerequisites](#prerequisites) to receive notifications. 8. Select **Save rule and exit**. ## Learn more For more information, explore the following resources: * [Create Grafana-managed alert rules](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/create-grafana-managed-rule/) in the Grafana documentation * [PromQL documentation](https://prometheus.io/docs/prometheus/latest/querying/basics/) for building custom metric queries * [CoreWeave Alerts](/platform/coreweave-alerts) for built-in alert integrations that do not require self-hosted Grafana # Self-hosted Prometheus Source: https://docs.coreweave.com/observability/self-hosted-prometheus Deploy Prometheus in CKS to collect custom application metrics and visualize them in self-hosted Grafana CoreWeave's observability platform provides infrastructure metrics and logs for your clusters, but it does not collect metrics from your own applications. To collect custom application metrics and visualize them alongside CoreWeave's metrics, you can deploy a self-hosted Prometheus instance in your CKS cluster. This guide covers: * Deploying Prometheus in a CKS cluster using Helm * Adding Prometheus as a data source in your self-hosted Grafana instance * Configuring Prometheus to scrape custom metrics from your application pods > [!WARNING] > > Customers who self-host Prometheus are responsible for all setup, maintenance, and resource costs associated with hosting. See [CoreWeave Grafana](/observability/managed-grafana) for the fully-managed observability option. ## Prerequisites * A CKS cluster with at least one CPU Node available for Prometheus * [`kubectl`](https://kubernetes.io/docs/tasks/tools/) installed and configured for your cluster * [`helm`](https://helm.sh/docs/intro/install/) installed * A self-hosted Grafana instance. If you haven't set one up yet, see [Self-hosted Grafana](/observability/self-hosted-grafana) first. ## Deploy Prometheus Prometheus is available via the `prometheus-community` Helm chart repository. Install it using the `kube-prometheus-stack` chart, which includes Prometheus and the Prometheus Operator. This tutorial uses ephemeral storage. Prometheus stores its metrics in an `emptyDir` volume, so collected history is lost when the Prometheus Pod is deleted or replaced. For a durable deployment, configure persistent storage with `prometheus.prometheusSpec.storageSpec` before installing the chart. 1. Add the `prometheus-community` Helm chart repository: ```bash theme={"system"} helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update ``` 2. Create a values file named `prometheus-values.yaml` with the following content: ```yaml title="prometheus-values.yaml" theme={"system"} grafana: enabled: false alertmanager: enabled: false nodeExporter: enabled: false kubeStateMetrics: enabled: false defaultRules: create: false ``` These settings disable components that this tutorial does not use: * `grafana.enabled: false` skips the bundled Grafana instance because you use the CoreWeave self-hosted Grafana chart instead. * `alertmanager.enabled: false` skips Alertmanager. * `nodeExporter.enabled: false` skips the bundled node exporter. CoreWeave already runs a node exporter on each CKS Node. The bundled exporter cannot bind host port `9100` because that port is already in use. * `kubeStateMetrics.enabled: false` skips a second copy of kube-state-metrics, which watches Kubernetes API objects. CoreWeave runs kube-state-metrics on the managed control plane, rather than on each Node. * `defaultRules.create: false` skips the chart's default alerting and recording rules. Those rules include checks for components that this configuration does not deploy or scrape, which can produce firing alerts even when your application metrics are available. With the bundled collectors disabled, this Prometheus instance does not collect their metrics, such as `kube_pod_info` and `node_cpu_seconds_total`. Imported dashboards that depend on those metrics show no data. Use CoreWeave Grafana for the infrastructure metrics collected by CoreWeave. Kubelet and cAdvisor scraping remain enabled in this configuration. 3. Install Prometheus in a dedicated `monitoring` namespace: ```bash theme={"system"} helm install prometheus prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --create-namespace \ --values prometheus-values.yaml ``` You should see output similar to the following: ```text theme={"system"} NAME: prometheus LAST DEPLOYED: ... NAMESPACE: monitoring STATUS: deployed REVISION: 1 ``` ## Verify the Prometheus deployment Run the following command to confirm Prometheus is running: ```bash theme={"system"} kubectl get pods -n monitoring ``` Wait until both Pods show `Running` and all containers are ready (`1/1` for the Operator and `2/2` for Prometheus). If they are still starting, rerun the command after a short wait. You should see output similar to the following: ```text theme={"system"} NAME READY STATUS RESTARTS AGE prometheus-kube-prometheus-operator-6d4f9c8b9d-xxxx 1/1 Running 0 2m prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 0 90s ``` To confirm the Prometheus service is available, run: ```bash theme={"system"} kubectl get svc -n monitoring ``` Copy the name of the Prometheus Service that exposes port `9090` from the command output. Use this exact name for `[PROMETHEUS-SERVICE]` in the URL and port-forward command below. The chart can truncate generated names, so do not infer the Service name from the Helm release name. ## Add Prometheus as a data source in Grafana To query your custom application metrics from Grafana, add Prometheus as a data source. 1. Open your self-hosted Grafana instance and log in. If you need to access it, first find the namespace of its Service: ```bash theme={"system"} kubectl get svc --all-namespaces --field-selector metadata.name=grafana ``` Copy the value in the `NAMESPACE` column for your Grafana instance. Then run the following port-forward command, replacing `[GRAFANA-NAMESPACE]` with that value: ```bash theme={"system"} kubectl port-forward svc/grafana -n [GRAFANA-NAMESPACE] 8900:80 ``` 2. In the Grafana left-hand menu, navigate to **Connections** > **Data sources**, then click **+ Add new data source**. 3. Select **Prometheus** from the list of available data sources. 4. In the **Connection** section, set the **Prometheus server URL** to the Prometheus service address. If Grafana and Prometheus are deployed in different namespaces, use the fully qualified service URL. Replace `[PROMETHEUS-SERVICE]` with the Service name you copied in [Verify the Prometheus deployment](#verify-the-prometheus-deployment). Replace `[PROMETHEUS-NAMESPACE]` with `monitoring`, the namespace specified in the Helm install command. This is the Prometheus namespace, which can differ from `[GRAFANA-NAMESPACE]`: ```text theme={"system"} http://[PROMETHEUS-SERVICE].[PROMETHEUS-NAMESPACE].svc.cluster.local:9090 ``` For example, the Service `prometheus-kube-prometheus-prometheus` in the `monitoring` namespace has the URL `http://prometheus-kube-prometheus-prometheus.monitoring.svc.cluster.local:9090`. 5. Leave the remaining settings at their defaults, including **Authentication method** set to **No Authentication**. This tutorial connects to the in-cluster Prometheus Service without authentication or TLS. 6. Scroll to the bottom of the page and click **Save & test**. You should see a confirmation that the data source is working. ## Configure Prometheus to scrape custom metrics Prometheus Operator uses `ServiceMonitor` resources to configure which services to scrape. Create a `ServiceMonitor` that targets your application. ### Expose metrics from your application Your application must expose a Prometheus-compatible metrics endpoint, typically at `/metrics` on a designated port. Many frameworks provide this out of the box, including: * Python: [`prometheus_client`](https://github.com/prometheus/client_python) * Go: [`prometheus/client_golang`](https://github.com/prometheus/client_golang) * Java: [Micrometer](https://micrometer.io/) For example, a Python application using `prometheus_client` might expose metrics at port `8000`: ```python theme={"system"} from prometheus_client import start_http_server, Counter REQUEST_COUNT = Counter('app_requests_total', 'Total number of requests') start_http_server(8000) ``` Integrate this snippet into your running application. It is not a standalone server script. The metrics server runs in a background thread, so your application must keep running to serve `/metrics`. Call `REQUEST_COUNT.inc()` in your application's request handler once per request you want to count. Creating the counter alone does not increment it. ### Create a Service for your application Create a Kubernetes Service that exposes the metrics port with a named port. Prometheus uses the port name to identify which port to scrape. This example assumes your application is already deployed in the cluster, its Pods have the label `app: my-app`, and its metrics endpoint listens on port `8000`. Adjust `spec.selector` and `targetPort` to match your application. ```yaml title="app-service.yaml" theme={"system"} apiVersion: v1 kind: Service metadata: name: my-app namespace: [APP-NAMESPACE] labels: app: my-app spec: selector: app: my-app ports: - name: metrics port: 8000 targetPort: 8000 ``` Replace `[APP-NAMESPACE]` with your application's namespace. Apply the Service: ```bash theme={"system"} kubectl apply -f app-service.yaml ``` ### Create a ServiceMonitor Create a `ServiceMonitor` resource that tells Prometheus to scrape the Service you just created: ```yaml title="app-servicemonitor.yaml" theme={"system"} apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: my-app namespace: monitoring labels: release: prometheus spec: namespaceSelector: matchNames: - [APP-NAMESPACE] selector: matchLabels: app: my-app endpoints: - port: metrics interval: 30s ``` Replace `[APP-NAMESPACE]` with your application's namespace. > [!NOTE] > > The `release: prometheus` label on the `ServiceMonitor` must match the Helm release name used when installing `kube-prometheus-stack`. If you used a different release name, update this label accordingly. Apply the `ServiceMonitor`: ```bash theme={"system"} kubectl apply -f app-servicemonitor.yaml ``` ### Verify Prometheus is scraping your application To confirm Prometheus is scraping your application, port-forward to the Prometheus Service. Replace `[PROMETHEUS-SERVICE]` with the name you copied in [Verify the Prometheus deployment](#verify-the-prometheus-deployment) and `[PROMETHEUS-NAMESPACE]` with `monitoring`: ```bash theme={"system"} kubectl port-forward svc/[PROMETHEUS-SERVICE] -n [PROMETHEUS-NAMESPACE] 9090:9090 ``` Open `http://localhost:9090/targets` in your browser. Allow time for Prometheus to discover the ServiceMonitor and complete its first scrape. The configuration above scrapes every 30 seconds. Refresh the page until your application appears in the list of scrape targets with a status of **UP**. > [!NOTE] > > These custom metrics appear only in your self-hosted Prometheus and Grafana. CoreWeave's managed observability collects infrastructure metrics and does not surface your application metrics in CoreWeave Grafana. ## Query custom metrics in Grafana With Prometheus configured as a data source in Grafana, you can now query your custom metrics. 1. In Grafana, navigate to **Explore** from the left-hand menu. 2. Select your data source, such as **prometheus**, from the dropdown at the top of the page. 3. Select **Code** to enter a PromQL query using one of your application's metric names. For example: ```text theme={"system"} app_requests_total ``` 4. Click **Run query**. Your custom metric data should appear in the query results. If you see **No data**, confirm that the target is **UP**, allow time for a scrape, and run the query again. The counter increases only when your application increments it. The following image shows `app_requests_total` in Grafana Explore for a sample application that increments the counter. Your values depend on your application's activity. ![Grafana Explore in Code mode showing the app\_requests\_total query and a rising time series.](https://mintcdn.com/coreweave-dbfa0e8d/4YEA9kxRWWOhsPKV/observability/_media/self-hosted-prometheus-explore.png?fit=max\&auto=format\&n=4YEA9kxRWWOhsPKV\&q=85\&s=f850c8e8fc2e24bc59b670bcea1b201a) You can build dashboards with your custom metrics by navigating to **Dashboards** > **New** > **New dashboard** and adding panels that reference your Prometheus data source. ## Learn more * [Prometheus documentation](https://prometheus.io/docs/) on configuring scraping, alerting rules, and PromQL * [Prometheus Operator documentation](https://prometheus-operator.dev/docs/getting-started/introduction/) on `ServiceMonitor`, `PodMonitor`, and other custom resources * [Self-hosted Grafana](/observability/self-hosted-grafana) for setup instructions and configuring CoreWeave data sources * [Forward application metrics](/observability/logs-metrics/forward-metrics) to send CKS metrics to an external Prometheus instance # Service levels and limits Source: https://docs.coreweave.com/observability/service-levels-and-limits Service level objectives, retention limits, and log size limits for CoreWeave Observe [CoreWeave Observe™](/observability) sets best-effort service level objectives (SLOs) for the availability, latency, and durability of its observability services, and applies limits to telemetry retention and log line size. This page lists those service levels and limits. Service level objectives are the targets that CoreWeave aims to meet for each service, covering the availability and latency of your queries and the durability of your stored logs and metrics. > [!NOTE] > > These service levels and limits are best-effort product performance guidelines. ## Service level objectives The following table lists the service level objectives for CoreWeave observability services. Availability targets apply to real customer traffic, and query endpoints are reached through `observe.coreweave.com`. | Service | SLO measurement | | - | - | | CoreWeave Grafana | 99.9% of all requests to CoreWeave Grafana complete successfully. | | Logs query | **Availability**: 99.9% of all requests through `observe.coreweave.com` complete successfully. **Response latency**: 99% of log queries return results within 1 minute. **Retention**: 99.999% of audit logs are retained for 3 months. 99.999% of other logs are retained for 14 days. | | Metrics query | **Availability**: 99.9% of all requests through `observe.coreweave.com` complete successfully. **Response latency**: 99% of metric queries spanning 7 days at a 1-minute step return within 5 seconds. **Retention**: 99.999% of metrics are retained for 3 months. | For information about querying logs and metrics through these endpoints, see [Query Logs and Metrics](/observability/logs-metrics/introduction). ## Retention limits CoreWeave retains telemetry based on the limits described below. Data older than its retention limit might no longer be queryable, and CoreWeave deletes it within 1 to 2 days after the limit. | Telemetry type | Retention limit | | - | - | | Audit logs | 3 months | | Other logs (platform and application logs) | 14 days | | Metrics | 3 months | To download logs that are still within the retention limit, see [Backfill historical logs with LogCLI](/observability/logs-metrics/backfill-historical-logs). For use cases that require longer retention, such as audit logs, see [Configure Telemetry Relay](/observability/telemetry-forwarding/configure) to forward telemetry to an external destination. ## Log size limits Individual log lines are subject to a maximum size. Log lines that exceed the limit may be dropped or truncated. | Limit | Size | | - | - | | Log line size limit | 256 KB | | Telemetry Relay log line size limit | 100 KB | # Configure Telemetry Relay Source: https://docs.coreweave.com/observability/telemetry-forwarding/configure Forward CoreWeave audit logs to HTTPS endpoints or AWS S3 destinations You can configure CoreWeave Telemetry Relay through the CoreWeave Cloud Console or the [Telemetry Relay API](/observability/telemetry-forwarding/telemetry-relay-api). This guide shows you how to use the Cloud Console to forward supported audit logs to HTTPS endpoints or AWS S3 destinations. It also shows you how to view the resulting Telemetry Relay resources. > [!NOTE] > > With self-service, you can forward only supported audit logs to HTTPS endpoints or AWS S3 destinations. [Contact Support](/support) if you want to forward other telemetry or use a different destination type. To configure Telemetry Relay, you define the following: * **Destinations**: Where Telemetry Relay forwards telemetry, such as an HTTPS endpoint. * **Streams**: Predefined telemetry categories, such as audit logs. * **Pipelines**: A configuration that links a stream to a destination. ![Telemetry streams connect to endpoints through pipelines, with secrets for endpoint access.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/telemetry-relay.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b8dfa553ab7c642bc3c76009c4d406c7) For more information, see [Introduction to Telemetry Relay](/observability/telemetry-forwarding/relay). ## Prerequisites To configure Telemetry Relay or view destinations and pipelines, you need one of the following [CoreWeave roles](/security/iam/access-policies/roles): | Role | Permissions | | :- | :- | | Telemetry Relay Admin | Create, read, update, and delete Telemetry Relay components. | | Telemetry Relay Reader | Read Telemetry Relay components. | ## Create a destination Use the Cloud Console to create a destination: 1. In the Cloud Console, navigate to [Telemetry Relay](https://console.coreweave.com/telemetry-relay/pipelines) > **Destinations** > **Create destination**. 2. On the **Create destination** page, enter a **Display name** for the destination. The display name appears in the **Destinations** table and in the **Destination** dropdown when you create a pipeline. 3. For **Endpoint type**, select **HTTPS** or **AWS S3**. The following image shows **AWS S3** selected as the endpoint type: ![Create destination page with AWS S3 selected as the endpoint type.](https://mintcdn.com/coreweave-dbfa0e8d/YEjb_m5CbDiBlhjX/observability/_media/create-aws-s3-destination.png?fit=max\&auto=format\&n=YEjb_m5CbDiBlhjX\&q=85\&s=1b30fd7e59c9fd925a5441424a11a722) 4. Configure the fields for the selected endpoint type: * **HTTPS**: * For **Endpoint URL**, enter the URL where Telemetry Relay sends telemetry. * For **Authentication type**, select the credential scheme Telemetry Relay uses when it connects to the endpoint. * **AWS S3**: * For **S3 URI**, enter the AWS S3 bucket and optional prefix where Telemetry Relay writes logs. The `[BUCKET-NAME]` placeholder is the bucket name, and `[PREFIX]` is the optional prefix, as in `s3://[BUCKET-NAME]/[PREFIX]/`. You can also enter the Amazon Resource Name (ARN) for an AWS S3 bucket. The Cloud Console converts it to an S3 URI. * For **Region**, enter the bucket's AWS region. * Enter an **Access key ID** and **Secret access key**. * Optional: For temporary credentials, enter a **Session token (optional)**. 5. Click **Submit**. The new destination appears in the **Destinations** table. ## Create a pipeline Use the Cloud Console to create a pipeline: 1. In the Cloud Console, navigate to **Telemetry Relay** > **Create pipeline**. 2. On the **Create pipeline** page, fill in the following fields: * **Source**: The telemetry stream to forward, such as **CoreWeave API Audit Logs** or **Kubernetes Events**. * **Destination**: An existing HTTPS endpoint or AWS S3 destination to receive the stream. The dropdown lists compatible destinations that you created in the **Destinations** tab. After you fill in both fields, the read-only **Generated Pipeline Name** field shows the resulting slug. The slug combines the source and destination names (for example, `logs-audit-console-my-endpoint`). You don't enter a name yourself. 3. Click **Submit**. The new pipeline appears in the **Pipelines** table. To leave the **Create pipeline** page without saving, click **Back to Pipelines**. ## List destinations To view destinations: * In the Cloud Console, navigate to **Telemetry Relay** > **Destinations**. The table lists the **Name**, **Type**, **Region**, and **Endpoint** for each destination. ## List streams To view available telemetry streams: * In the Cloud Console, navigate to **Telemetry Relay** > **Create pipeline** > **Source**. The following image shows the supported streams in the **Source** dropdown: ![List of available telemetry streams in the Create pipeline source dropdown.](https://mintcdn.com/coreweave-dbfa0e8d/YEjb_m5CbDiBlhjX/observability/_media/list-streams.png?fit=max\&auto=format\&n=YEjb_m5CbDiBlhjX\&q=85\&s=c762980e5bb76d7d033bf8cd7abe47ec) Self-service supports the following streams: | Display name | API slug | | :- | :- | | Console Audit Logs | `logs-audit-console` | | CoreWeave API Audit Logs | `logs-audit-cw-api` | | Kubernetes API Audit Logs | `logs-audit-kube-api` | | Kubernetes Events | `logs-events` | The Telemetry Relay API exposes the same streams through slug identifiers. To leave the **Create pipeline** page without creating a pipeline, click **Back to Pipelines**. ## List pipelines To view pipelines: * In the Cloud Console, navigate to **Telemetry Relay**. The **Pipelines** tab opens by default. Each row shows the autogenerated pipeline name, source stream, and destination. ## Advanced configuration For destination types and telemetry streams that self-service doesn't support, contact Support. Support can enable the following configurations: * Prometheus Remote Write v1-compatible endpoints for metrics. * Forwarding for streams outside the self-service scope, such as system journal logs, customer cluster metrics, and platform metrics. # Introduction to Telemetry Relay Source: https://docs.coreweave.com/observability/telemetry-forwarding/relay Use Telemetry Relay to forward telemetry to destinations outside of CoreWeave CoreWeave Telemetry Relay is a managed solution that forwards telemetry to destinations outside CoreWeave's observability platform. Use it to centralize CoreWeave telemetry with data from other systems in your observability stack or security information and event management (SIEM) tools. Telemetry Relay provides the following features: * **Comprehensive data aggregation**: Imports telemetry data from multiple sources. * **Flexible routing**: Fine-grained data routed to customer-specified endpoints. * **Reliable delivery**: Prioritizes data completeness with low latency. * **Fully managed with easy configuration**: Zero operational overhead for configuring data filters and endpoint routing. Telemetry Relay supports multiple data streams and endpoints. ![Telemetry streams connect to endpoints through pipelines, with secrets for endpoint access.](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/telemetry-relay.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b8dfa553ab7c642bc3c76009c4d406c7) Telemetry Relay is built from the following components: * **Streams**: Predefined telemetry categories, for example, audit logs. * **Pipelines**: A configuration that links a stream to an endpoint. * **Endpoints**: Destinations, such as HTTPS endpoints or AWS S3 destinations. ## Configure Telemetry Relay Configure Telemetry Relay through the [CoreWeave Cloud Console](/observability/telemetry-forwarding/configure) or the [Telemetry Relay API](/observability/telemetry-forwarding/telemetry-relay-api). You can forward the following audit logs to HTTPS endpoints or AWS S3 destinations: * Console Audit Logs * CoreWeave API Audit Logs * Kubernetes API Audit Logs * Kubernetes Events Audit log data can also include [Support Access Management](/security/support-access-management) logs for customers who enable Support Access Management. For other telemetry, destination types, or configuration help, contact [Support](/support). > [!NOTE] > > Telemetry Relay can't forward application metrics. To forward application metrics, see [Forward application metrics](/observability/logs-metrics/forward-metrics). Support can also help you assess feasibility and timelines for the following advanced configurations: * Data streams, including platform logs and platform metrics beyond the self-service log streams * Forwarding and filtering, including routing and filtering rules for what gets sent * Destination types beyond HTTPS endpoints and AWS S3 destinations, including Prometheus Remote Write v1 * Advanced networking requirements > [!WARNING] > > When Telemetry Relay forwards metrics to a default Prometheus deployment, Prometheus may receive a sample twice. Prometheus accepts the first sample and logs errors about rejected time samples for the duplicates. To avoid this, use a horizontally scalable, multi-tenant Prometheus deployment that handles duplicate samples. # Telemetry Relay API Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api REST API for managing forwarding endpoints, pipelines, and telemetry streams for CoreWeave Telemetry Relay. With an access token, you can interact with the Telemetry Relay API using `curl` or any other HTTP client. The API lets you manage forwarding endpoints and pipelines and list telemetry streams. These resources forward CoreWeave audit logs from the managed observability platform to destinations of your choice. For a conceptual walkthrough of Telemetry Relay (what an endpoint, pipeline, and stream are, and how they wire together), see the [CoreWeave Telemetry Relay overview](/observability/telemetry-forwarding/relay). For Cloud Console procedures, see [Configure Telemetry Relay](/observability/telemetry-forwarding/configure). > [!NOTE] > > * The API server is `https://api.coreweave.com`. > * Replace `[API-ACCESS-TOKEN]` in the examples on each operation page with your [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens). > * With self-service, you can forward only supported audit logs to HTTPS endpoints or AWS S3 destinations. [Contact Support](/support) if you want to forward other telemetry or use a different destination type. > * Write operations (`POST`, `PATCH`, `DELETE`) require the Telemetry Relay Admin role. Read operations (`GET`) require the Telemetry Relay Reader role. > * For information on required permissions, see [IAM Access Policies](/security/iam/access-policies). ## Endpoints The API exposes three resource families: **forwarding endpoints**, **forwarding pipelines**, and **telemetry streams**. Per-resource operations take the resource's `ref.slug` (a project-scoped human-readable name) as a path parameter, shown as `{ref.slug}` in the path templates below. ### Forwarding endpoints The following operations manage forwarding endpoints: | Operation | Method | Endpoint | Description | | - | - | - | - | | [List forwarding endpoints](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/list-forwarding-endpoints) | `GET` | `/v1beta1/telemetryrelay/endpoints` | List all forwarding endpoints. | | [Create forwarding endpoint](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/create-forwarding-endpoint) | `POST` | `/v1beta1/telemetryrelay/endpoints` | Create a forwarding endpoint. | | [Get forwarding endpoint](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-forwarding-endpoint) | `GET` | `/v1beta1/telemetryrelay/endpoints/{ref.slug}` | Get a forwarding endpoint. | | [Update forwarding endpoint](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/update-forwarding-endpoint) | `PATCH` | `/v1beta1/telemetryrelay/endpoints/{ref.slug}` | Update a forwarding endpoint. | | [Delete forwarding endpoint](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/delete-forwarding-endpoint) | `DELETE` | `/v1beta1/telemetryrelay/endpoints/{ref.slug}` | Delete a forwarding endpoint. | | [Get forwarding endpoint status](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-forwarding-endpoint-status) | `GET` | `/v1beta1/telemetryrelay/endpoints/{ref.slug}:check` | Read the last-known status of a forwarding endpoint. | ### Forwarding pipelines The following operations manage forwarding pipelines: | Operation | Method | Endpoint | Description | | - | - | - | - | | [List forwarding pipelines](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/list-forwarding-pipelines) | `GET` | `/v1beta1/telemetryrelay/pipelines` | List all forwarding pipelines. | | [Create forwarding pipeline](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/create-forwarding-pipeline) | `POST` | `/v1beta1/telemetryrelay/pipelines` | Create a forwarding pipeline. | | [Get forwarding pipeline](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-forwarding-pipeline) | `GET` | `/v1beta1/telemetryrelay/pipelines/{ref.slug}` | Get a forwarding pipeline. | | [Update forwarding pipeline](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/update-forwarding-pipeline) | `PATCH` | `/v1beta1/telemetryrelay/pipelines/{ref.slug}` | Update a forwarding pipeline. | | [Delete forwarding pipeline](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/delete-forwarding-pipeline) | `DELETE` | `/v1beta1/telemetryrelay/pipelines/{ref.slug}` | Delete a forwarding pipeline. | ### Telemetry streams The following operations list and read telemetry streams: | Operation | Method | Endpoint | Description | | - | - | - | - | | [List telemetry streams](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/list-telemetry-streams) | `GET` | `/v1beta1/telemetryrelay/streams` | List all telemetry streams. | | [Get telemetry stream](/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-telemetry-stream) | `GET` | `/v1beta1/telemetryrelay/streams/{ref.slug}` | Get a telemetry stream. | ## OpenAPI specification The complete OpenAPI 3.0 specification for the Telemetry Relay API is embedded below. Expand the code block by clicking "See all" at the bottom, or use the download and copy buttons in the title bar. ```yaml expandable title="Telemetry Relay OpenAPI" theme={"system"} openapi: 3.0.3 info: title: CoreWeave Telemetry Relay API version: 0.0.1 description: The CoreWeave Telemetry Relay API provides programmatic control over Telemetry Relay, CoreWeave's managed solution for forwarding telemetry to destinations outside the CoreWeave observability platform. servers: - url: https://api.coreweave.com paths: /v1beta1/telemetryrelay/endpoints: get: operationId: TelemetryRelayService_ListEndpoints summary: List forwarding endpoints description: Returns every forwarding endpoint in the caller's organization. Each endpoint is a destination that pipelines can target. Credentials are never returned in responses. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.ListEndpointsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService post: operationId: TelemetryRelayService_CreateEndpoint summary: Create forwarding endpoint description: Creates a forwarding endpoint. The request body must include `ref.slug` (the unique per-organization identifier), `spec` (display name plus exactly one protocol-specific config), and the matching credentials block in the same oneof. Credentials are stored encrypted and never returned in responses. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.CreateEndpointRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.CreateEndpointResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService /v1beta1/telemetryrelay/endpoints/{ref.slug}: get: operationId: TelemetryRelayService_GetEndpoint summary: Get forwarding endpoint description: Returns a single forwarding endpoint by its `ref.slug`, including the protocol-specific `spec` and current `status`. Credentials are never returned. parameters: - name: ref.slug in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.GetEndpointResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService delete: operationId: TelemetryRelayService_DeleteEndpoint summary: Delete forwarding endpoint description: 'Deletes a forwarding endpoint identified by `ref.slug`. Delete any pipelines that target the endpoint first: if the endpoint is still referenced, the request is rejected with `412` (reason `TELEMETRYRELAY_ENDPOINT_IN_USE`) and the response lists the pipelines that must be deleted first. Returns `404` (reason `TELEMETRYRELAY_ENDPOINT_NOT_FOUND`) if no endpoint with that slug exists.' parameters: - name: ref.slug in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.DeleteEndpointResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService patch: operationId: TelemetryRelayService_UpdateEndpoint summary: Update forwarding endpoint description: Updates a forwarding endpoint identified by `ref.slug`. The request body must include the full `spec`. The endpoint's protocol type cannot change after creation. Use `credentialAction` to preserve, replace, or clear stored credentials. You can't clear credentials for AWS S3 destinations. parameters: - name: ref.slug in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.UpdateEndpointRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.UpdateEndpointResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService /v1beta1/telemetryrelay/endpoints/{ref.slug}:check: get: operationId: TelemetryRelayService_CheckEndpoint summary: Get forwarding endpoint status description: Returns the last-known `ForwardingEndpointStatus` for a forwarding endpoint identified by `ref.slug`. This reads persisted state. It is not a live connectivity probe and does not verify TLS, authentication, or reachability against the destination. Live liveness checking is planned for a future release. The `zones_active` field in the response may be empty regardless of actual endpoint usage. parameters: - name: ref.slug in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.CheckEndpointResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService /v1beta1/telemetryrelay/pipelines: get: operationId: TelemetryRelayService_ListPipelines summary: List forwarding pipelines description: Returns every forwarding pipeline in the caller's organization. A pipeline binds a `source` stream to a `destination` endpoint and can be enabled or disabled independently. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.ListPipelinesResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService post: operationId: TelemetryRelayService_CreatePipeline summary: Create forwarding pipeline description: Creates a forwarding pipeline. The request body must include `ref.slug` and a `spec` with the source stream's `slug`, the destination endpoint's `slug`, and `enabled` (true to start forwarding immediately). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.CreatePipelineRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.CreatePipelineResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService /v1beta1/telemetryrelay/pipelines/{ref.slug}: get: operationId: TelemetryRelayService_GetPipeline summary: Get forwarding pipeline description: Returns a single forwarding pipeline by its `ref.slug`, including the source/destination references and the current state. parameters: - name: ref.slug in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.GetPipelineResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService delete: operationId: TelemetryRelayService_DeletePipeline summary: Delete forwarding pipeline description: Permanently deletes a forwarding pipeline identified by `ref.slug`. Forwarding stops immediately. Underlying endpoints and streams are not affected. Returns `404` (reason `TELEMETRYRELAY_PIPELINE_NOT_FOUND`) if no pipeline with that slug exists. parameters: - name: ref.slug in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.DeletePipelineResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService patch: operationId: TelemetryRelayService_UpdatePipeline summary: Update forwarding pipeline description: Updates a forwarding pipeline identified by `ref.slug`. The request body must include the full `spec` (source, destination, enabled). Use this to retarget a pipeline, enable or disable forwarding, or temporarily pause delivery. parameters: - name: ref.slug in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineSpec' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.UpdatePipelineResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService /v1beta1/telemetryrelay/streams: get: operationId: TelemetryRelayService_ListStreams summary: List telemetry streams description: Returns every telemetry stream available to the caller's organization. Streams are pre-defined categories of platform telemetry (for example, audit logs) that can be forwarded by binding them to an endpoint via a pipeline. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.ListStreamsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService /v1beta1/telemetryrelay/streams/{ref.slug}: get: operationId: TelemetryRelayService_GetStream summary: Get telemetry stream description: Returns a single telemetry stream by its `ref.slug`. Includes the stream's `spec` (display name, kind, label-selector filter) and `status` (current state and active zones). parameters: - name: ref.slug in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/coreweave.telemetryrelay.svc.cluster.v1beta1.GetStreamResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/google.rpc.Status' tags: - TelemetryRelayService components: schemas: coreweave.telemetryrelay.svc.cluster.v1beta1.CheckEndpointResponse: type: object properties: status: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus' coreweave.telemetryrelay.svc.cluster.v1beta1.CreateEndpointRequest: type: object properties: ref: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointRef' spec: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointSpec' s3: description: '`s3` credentials for AWS S3 destinations.' allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.S3Credentials' https: description: https credentials for HTTPS endpoints with basic auth. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.HTTPSCredentials' oneOf: - required: - s3 properties: spec: required: - s3 not: required: - https - properties: spec: required: - https not: required: - s3 required: - ref - spec coreweave.telemetryrelay.svc.cluster.v1beta1.CreateEndpointResponse: type: object properties: endpoint: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpoint' coreweave.telemetryrelay.svc.cluster.v1beta1.CreatePipelineRequest: type: object properties: ref: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineRef' spec: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineSpec' required: - ref - spec coreweave.telemetryrelay.svc.cluster.v1beta1.CreatePipelineResponse: type: object properties: pipeline: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipeline' coreweave.telemetryrelay.svc.cluster.v1beta1.DeleteEndpointResponse: type: object properties: {} coreweave.telemetryrelay.svc.cluster.v1beta1.DeletePipelineResponse: type: object properties: {} coreweave.telemetryrelay.svc.cluster.v1beta1.GetEndpointResponse: type: object properties: endpoint: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpoint' coreweave.telemetryrelay.svc.cluster.v1beta1.GetPipelineResponse: type: object properties: pipeline: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipeline' coreweave.telemetryrelay.svc.cluster.v1beta1.GetStreamResponse: type: object properties: stream: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStream' coreweave.telemetryrelay.svc.cluster.v1beta1.ListEndpointsResponse: type: object properties: endpoints: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpoint' coreweave.telemetryrelay.svc.cluster.v1beta1.ListPipelinesResponse: type: object properties: pipelines: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipeline' coreweave.telemetryrelay.svc.cluster.v1beta1.ListStreamsResponse: type: object properties: streams: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStream' coreweave.telemetryrelay.svc.cluster.v1beta1.UpdateEndpointRequest: type: object properties: ref: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointRef' spec: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointSpec' credentialAction: description: Controls how the endpoint's stored credentials are handled during the update. `CREDENTIAL_ACTION_PRESERVE` keeps the existing credentials unchanged. `CREDENTIAL_ACTION_REPLACE` replaces them with the credentials supplied in this request. Credentials must be provided when this action is used. `CREDENTIAL_ACTION_CLEAR` removes the stored credentials, but it isn't supported for AWS S3 destinations. The underlying enum also declares `CREDENTIAL_ACTION_UNSPECIFIED` (its zero value); omit the field rather than sending it. type: string format: enum enum: - CREDENTIAL_ACTION_PRESERVE - CREDENTIAL_ACTION_REPLACE - CREDENTIAL_ACTION_CLEAR s3: description: '`s3` credentials for AWS S3 destinations.' allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.S3Credentials' https: description: https credentials for HTTPS endpoints with basic auth. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.HTTPSCredentials' not: required: - s3 - https required: - ref - spec coreweave.telemetryrelay.svc.cluster.v1beta1.UpdateEndpointResponse: type: object properties: endpoint: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpoint' coreweave.telemetryrelay.svc.cluster.v1beta1.UpdatePipelineResponse: type: object properties: pipeline: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipeline' coreweave.telemetryrelay.types.v1beta1.AuthHeadersCredentials: description: "AuthHeadersCredentials contains custom HTTP headers for authentication.\n\n Used for\ \ APIs that require authentication via custom headers (e.g., X-API-Key, X-Auth-Token).\n All header\ \ values are encrypted at rest and in transit.\n Header names are case-insensitive per HTTP specification." type: object properties: headers: description: "headers is a map of HTTP header names to values for authentication.\n Common examples:\ \ {\"X-API-Key\": \"key123\"}, {\"X-Auth-Token\": \"token456\"}\n All values are write-only\ \ and never returned in responses." type: object additionalProperties: type: string required: - headers coreweave.telemetryrelay.types.v1beta1.BasicAuthCredentials: description: BasicAuthCredentials contains username and password for HTTP Basic authentication. This is a reusable credential type for any endpoint that uses HTTP Basic authentication, including generic HTTPS endpoints. Credentials are encrypted at rest and in transit. type: object properties: username: description: username for HTTP Basic authentication. Must be non-empty. type: string writeOnly: true password: description: "password for HTTP Basic authentication.\n This field is write-only and never returned\ \ in responses." type: string writeOnly: true required: - username - password coreweave.telemetryrelay.types.v1beta1.BearerTokenCredentials: description: "BearerTokenCredentials contains a bearer token for HTTP Authorization header authentication.\n\ \n Used for APIs that require \"Authorization: Bearer \" authentication.\n Common with\ \ OAuth 2.0, JWT tokens, and many modern APIs.\n The token is encrypted at rest and in transit." type: object properties: token: description: "token is the bearer token value.\n This field is write-only and never returned\ \ in responses." type: string writeOnly: true required: - token coreweave.telemetryrelay.types.v1beta1.ForwardingEndpoint: description: ForwardingEndpoint represents a destination where telemetry data can be forwarded. Endpoints are organization-scoped and identified by a unique slug. Endpoints forward to HTTPS endpoints or AWS S3 destinations. type: object properties: ref: description: ref uniquely identifies this endpoint within the organization. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointRef' spec: description: spec contains the desired configuration for this endpoint. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointSpec' status: description: "status reflects the current state of the endpoint.\n This field is output-only\ \ and managed by the system." allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus' readOnly: true required: - ref - spec coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointRef: description: "ForwardingEndpointRef uniquely identifies a forwarding endpoint within an organization.\n\ \n Endpoints are referenced by a human-readable slug that must be unique per organization." type: object properties: slug: description: "slug is a unique identifier for the endpoint within the organization.\n Must be\ \ 3-32 characters, start with alphanumeric, and contain only alphanumeric and hyphens." type: string maxLength: 32 minLength: 3 pattern: ^[a-zA-Z0-9][a-zA-Z0-9-]+$ required: - slug coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointSpec: description: Configuration for a forwarding endpoint. Includes a human-readable `displayName` and exactly one protocol-specific config. The protocol type is fixed at creation time and cannot be changed afterward. type: object properties: displayName: description: "display_name is a human-readable name for this endpoint.\n Used for display purposes\ \ in UIs and logs." type: string s3: description: '`s3` configures an AWS S3 destination for archiving telemetry data.' allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.S3Config' https: description: https configures a generic HTTPS endpoint for custom integrations. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.HTTPSConfig' oneOf: - required: - s3 - required: - https required: - displayName coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus: description: "ForwardingEndpointStatus reflects the current operational state of an endpoint.\n\n\ \ Status is managed by the system and includes connection state, timestamps,\n and information\ \ about which zones/clusters are actively using the endpoint." type: object properties: createdAt: description: created_at is when the endpoint was first created. type: string format: date-time readOnly: true updatedAt: description: updated_at is when the endpoint configuration was last modified. type: string format: date-time readOnly: true state: description: Current operational state of the endpoint. `PENDING` while the endpoint is being provisioned, `CONNECTED` once the endpoint is operational and receiving data, `ERROR` when the endpoint encountered an error and is not operational, `UNSPECIFIED` when the state has not been set. type: string format: enum enum: - FORWARDING_ENDPOINT_STATE_UNSPECIFIED - FORWARDING_ENDPOINT_STATE_PENDING - FORWARDING_ENDPOINT_STATE_CONNECTED - FORWARDING_ENDPOINT_STATE_ERROR readOnly: true stateMessage: description: "state_message provides additional context about the current state.\n Especially\ \ useful when state is ERROR to describe what went wrong." type: string readOnly: true zonesActive: description: "zones_active lists which zones and clusters are actively forwarding\n data to\ \ this endpoint." type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus_ZoneClusterStatus' readOnly: true credentialsConfigured: description: "credentials_configured indicates whether credentials have been set for this endpoint.\n\ \ Does not indicate if the credentials are valid, only that they exist." type: boolean readOnly: true credentialsUpdatedAt: description: "credentials_updated_at is when credentials were last set or updated.\n Unset if\ \ credentials have never been configured." type: string format: date-time readOnly: true coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus_ClusterStatus: description: ClusterStatus identifies a single cluster using this endpoint. type: object properties: id: description: id is the cluster's unique identifier. type: string coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus_ZoneClusterStatus: description: ZoneClusterStatus groups clusters by zone that are using this endpoint. type: object properties: zoneSlug: description: zone_slug identifies the zone. type: string clusters: description: clusters is the list of clusters in this zone using the endpoint. type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointStatus_ClusterStatus' coreweave.telemetryrelay.types.v1beta1.ForwardingPipeline: type: object properties: ref: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineRef' spec: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineSpec' status: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineStatus' coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineRef: type: object properties: slug: description: slug is a unique identifier for the pipeline within the organization. Must be 3-65 characters, start with alphanumeric, and contain only alphanumeric and hyphens. type: string maxLength: 65 minLength: 3 pattern: ^[a-zA-Z0-9][a-zA-Z0-9-]+$ coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineSpec: description: 'Configuration for a forwarding pipeline. `source` references a `TelemetryStream` by slug; `destination` references a `ForwardingEndpoint` by slug. Set `enabled: false` to pause forwarding without deleting the pipeline.' type: object properties: source: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStreamRef' destination: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingEndpointRef' enabled: type: boolean zoneSlugs: description: "zone_slugs restricts which zones this pipeline provisions connectors in.\n Empty\ \ means all zones with an active cluster registration for the\n organization. Set at creation\ \ and immutable thereafter — UpdatePipeline\n rejects any request whose zone_slugs differs\ \ from the stored value.\n To change zone placement, delete and recreate the pipeline." type: array items: type: string coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineStatus: type: object properties: createdAt: type: string format: date-time updatedAt: type: string format: date-time state: description: Current operational state of the pipeline. `PENDING` while provisioning, `ACTIVE` once data is flowing, `ERROR` if forwarding has failed, `STOPPED` if `spec.enabled` is false or the pipeline has been deactivated, `UNSPECIFIED` when the state has not been set. type: string format: enum enum: - FORWARDING_PIPELINE_STATE_UNSPECIFIED - FORWARDING_PIPELINE_STATE_PENDING - FORWARDING_PIPELINE_STATE_ACTIVE - FORWARDING_PIPELINE_STATE_ERROR - FORWARDING_PIPELINE_STATE_STOPPED readOnly: true stateMessage: type: string zonesActive: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineStatus_ZoneClusterStatus' coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineStatus_ClusterStatus: type: object properties: id: type: string coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineStatus_ZoneClusterStatus: type: object properties: zoneSlug: type: string clusters: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.ForwardingPipelineStatus_ClusterStatus' coreweave.telemetryrelay.types.v1beta1.HTTPSConfig: description: "HTTPSConfig configures a generic HTTPS endpoint for custom integrations.\n\n Allows\ \ forwarding telemetry data to any HTTPS endpoint.\n Useful for custom receivers or third-party\ \ services.\n\n Authentication: If the endpoint requires HTTP Basic authentication, provide\n\ \ HTTPSCredentials when creating/updating the endpoint. If no credentials\n are provided, requests\ \ are sent without authentication." type: object properties: endpoint: description: "endpoint is the URL of the HTTPS endpoint.\n Must be a valid HTTPS URL; plain\ \ HTTP is rejected.\n Targets that resolve to loopback, private, or link-local addresses are\n\ \ rejected by the service at submission time to prevent SSRF (see O11Y-2851)." type: string tls: description: "tls configures TLS settings for connecting to the endpoint.\n Optional - omit\ \ when using system default trust." allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TLSConfig' required: - endpoint coreweave.telemetryrelay.types.v1beta1.HTTPSCredentials: description: "HTTPSCredentials contains authentication credentials for HTTPS endpoints.\n\n Supports\ \ HTTP Basic authentication, bearer tokens, and custom auth headers.\n Future versions may support\ \ OAuth or mTLS client certificates." type: object properties: basicAuth: description: basic_auth provides HTTP Basic authentication credentials. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.BasicAuthCredentials' bearerToken: description: bearer_token provides bearer token authentication. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.BearerTokenCredentials' authHeaders: description: auth_headers provides custom HTTP header authentication. allOf: - $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.AuthHeadersCredentials' coreweave.telemetryrelay.types.v1beta1.LabelSelector: type: object properties: include: type: object additionalProperties: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.StringList' exclude: type: object additionalProperties: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.StringList' coreweave.telemetryrelay.types.v1beta1.S3Config: description: '`S3Config` configures an AWS S3 destination for archiving telemetry data. Data is written to the specified bucket and optional prefix. `S3Credentials` must be provided when creating the destination and cannot be cleared afterward.' type: object properties: uri: description: '`uri` is the S3 URI where data is written. Use the format `s3://[BUCKET-NAME]/[PREFIX]/`. Replace `[BUCKET-NAME]` with the bucket name and `[PREFIX]` with the optional prefix.' type: string maxLength: 2048 minLength: 1 pattern: ^s3://[a-z0-9][a-z0-9.-]*[a-z0-9](/.*)?$ region: description: '`region` is the AWS region where the bucket is located. Required.' type: string maxLength: 64 minLength: 1 required: - uri - region coreweave.telemetryrelay.types.v1beta1.S3Credentials: description: '`S3Credentials` contains AWS credentials for accessing an AWS S3 bucket. Credentials are encrypted and never returned in API responses.' type: object properties: accessKeyId: description: '`accessKeyId` is the AWS access key ID. Long-term credentials typically begin with `AKIA`. Required.' type: string maxLength: 128 minLength: 16 pattern: ^[A-Z0-9]+$ writeOnly: true secretAccessKey: description: '`secretAccessKey` is the AWS secret access key. This field is write-only and never returned in responses. Required.' type: string maxLength: 1024 minLength: 1 writeOnly: true sessionToken: description: '`sessionToken` is an AWS session token for temporary credentials. Provide it when using temporary credentials from AWS STS or IAM roles. Omit it for long-term IAM user credentials.' type: string maxLength: 2048 writeOnly: true required: - accessKeyId - secretAccessKey coreweave.telemetryrelay.types.v1beta1.StringList: type: object properties: values: type: array items: type: string coreweave.telemetryrelay.types.v1beta1.TLSConfig: description: "TLSConfig configures TLS settings for secure connections.\n\n Used when connecting\ \ to endpoints that require custom CA certificates\n or specific TLS configuration." type: object properties: certificateAuthorityData: description: "certificate_authority_data contains the PEM-encoded CA certificate bundle.\n Must\ \ be base64-encoded when transmitted.\n If not provided, the system's default trust store\ \ is used." type: string coreweave.telemetryrelay.types.v1beta1.TelemetryStream: type: object properties: ref: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStreamRef' spec: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStreamSpec' status: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStreamStatus' coreweave.telemetryrelay.types.v1beta1.TelemetryStreamRef: type: object properties: slug: type: string maxLength: 32 minLength: 3 pattern: ^[a-zA-Z0-9][a-zA-Z0-9-]+$ coreweave.telemetryrelay.types.v1beta1.TelemetryStreamSpec: description: Configuration for a telemetry stream. `displayName` is a human-readable label; `filter` narrows the stream by label selectors; `kind` declares the category of telemetry the stream carries. type: object properties: displayName: type: string filter: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.LabelSelector' kind: description: 'Category of telemetry carried by the stream. The API forwards audit logs, so `STREAM_KIND_LOGS` is the only available kind. The underlying enum also defines `STREAM_KIND_METRICS`, but metrics streams are not supported: the API rejects the value and never returns it. Required.' type: string format: enum enum: - STREAM_KIND_LOGS coreweave.telemetryrelay.types.v1beta1.TelemetryStreamStatus: type: object properties: createdAt: type: string format: date-time updatedAt: type: string format: date-time state: description: Current state of the stream. `ACTIVE` when data is being collected, `INACTIVE` when collection is paused, `ERROR` if collection has failed, `UNSPECIFIED` when the state has not been set. type: string format: enum enum: - TELEMETRY_STREAM_STATE_UNSPECIFIED - TELEMETRY_STREAM_STATE_ACTIVE - TELEMETRY_STREAM_STATE_ERROR - TELEMETRY_STREAM_STATE_INACTIVE readOnly: true stateMessage: type: string zonesActive: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStreamStatus_ZoneClusterStatus' coreweave.telemetryrelay.types.v1beta1.TelemetryStreamStatus_ClusterStatus: type: object properties: id: type: string coreweave.telemetryrelay.types.v1beta1.TelemetryStreamStatus_ZoneClusterStatus: type: object properties: zoneSlug: type: string clusters: type: array items: $ref: '#/components/schemas/coreweave.telemetryrelay.types.v1beta1.TelemetryStreamStatus_ClusterStatus' google.protobuf.Any: description: Contains an arbitrary serialized message along with a @type that describes the type of the serialized message. type: object properties: '@type': description: The type of the serialized message. type: string additionalProperties: true google.rpc.Status: description: 'The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).' type: object properties: code: description: The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. type: integer format: int32 message: description: A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. type: string details: description: A list of messages that carry the error details. There is a common set of message types for APIs to use. type: array items: $ref: '#/components/schemas/google.protobuf.Any' securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: CoreWeave API access token sent as a bearer token. x-default: Bearer [CW-API-TOKEN] tags: - name: TelemetryRelayService description: 'Endpoints for managing forwarding endpoints, forwarding pipelines, and reading available telemetry streams. Use these endpoints to configure how CoreWeave platform telemetry is forwarded to destinations outside the CoreWeave observability platform. For Cloud Console procedures, see the [Telemetry Relay configure guide](/observability/telemetry-forwarding/configure). With self-service, you can forward only supported audit logs to HTTPS endpoints or AWS S3 destinations. To forward other telemetry or use a different destination type, [contact Support](/support). Write operations (`POST`, `PATCH`, `DELETE`) require the `Telemetry Relay Admin` role; read operations (`GET`) require the `Telemetry Relay Reader` role.' security: - bearerAuth: [] ``` # Create forwarding endpoint Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/create-forwarding-endpoint /openapi/o11y/openapi.yaml post /v1beta1/telemetryrelay/endpoints Creates a forwarding endpoint. The request body must include `ref.slug` (the unique per-organization identifier), `spec` (display name plus exactly one protocol-specific config), and the matching credentials block in the same oneof. Credentials are stored encrypted and never returned in responses. # Create forwarding pipeline Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/create-forwarding-pipeline /openapi/o11y/openapi.yaml post /v1beta1/telemetryrelay/pipelines Creates a forwarding pipeline. The request body must include `ref.slug` and a `spec` with the source stream's `slug`, the destination endpoint's `slug`, and `enabled` (true to start forwarding immediately). # Delete forwarding endpoint Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/delete-forwarding-endpoint /openapi/o11y/openapi.yaml delete /v1beta1/telemetryrelay/endpoints/{ref.slug} Deletes a forwarding endpoint identified by `ref.slug`. Delete any pipelines that target the endpoint first: if the endpoint is still referenced, the request is rejected with `412` (reason `TELEMETRYRELAY_ENDPOINT_IN_USE`) and the response lists the pipelines that must be deleted first. Returns `404` (reason `TELEMETRYRELAY_ENDPOINT_NOT_FOUND`) if no endpoint with that slug exists. # Delete forwarding pipeline Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/delete-forwarding-pipeline /openapi/o11y/openapi.yaml delete /v1beta1/telemetryrelay/pipelines/{ref.slug} Permanently deletes a forwarding pipeline identified by `ref.slug`. Forwarding stops immediately. Underlying endpoints and streams are not affected. Returns `404` (reason `TELEMETRYRELAY_PIPELINE_NOT_FOUND`) if no pipeline with that slug exists. # Get forwarding endpoint Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-forwarding-endpoint /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/endpoints/{ref.slug} Returns a single forwarding endpoint by its `ref.slug`, including the protocol-specific `spec` and current `status`. Credentials are never returned. # Get forwarding endpoint status Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-forwarding-endpoint-status /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/endpoints/{ref.slug}:check Returns the last-known `ForwardingEndpointStatus` for a forwarding endpoint identified by `ref.slug`. This reads persisted state. It is not a live connectivity probe and does not verify TLS, authentication, or reachability against the destination. Live liveness checking is planned for a future release. The `zones_active` field in the response may be empty regardless of actual endpoint usage. # Get forwarding pipeline Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-forwarding-pipeline /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/pipelines/{ref.slug} Returns a single forwarding pipeline by its `ref.slug`, including the source/destination references and the current state. # Get telemetry stream Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/get-telemetry-stream /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/streams/{ref.slug} Returns a single telemetry stream by its `ref.slug`. Includes the stream's `spec` (display name, kind, label-selector filter) and `status` (current state and active zones). # List forwarding endpoints Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/list-forwarding-endpoints /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/endpoints Returns every forwarding endpoint in the caller's organization. Each endpoint is a destination that pipelines can target. Credentials are never returned in responses. # List forwarding pipelines Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/list-forwarding-pipelines /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/pipelines Returns every forwarding pipeline in the caller's organization. A pipeline binds a `source` stream to a `destination` endpoint and can be enabled or disabled independently. # List telemetry streams Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/list-telemetry-streams /openapi/o11y/openapi.yaml get /v1beta1/telemetryrelay/streams Returns every telemetry stream available to the caller's organization. Streams are pre-defined categories of platform telemetry (for example, audit logs) that can be forwarded by binding them to an endpoint via a pipeline. # Update forwarding endpoint Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/update-forwarding-endpoint /openapi/o11y/openapi.yaml patch /v1beta1/telemetryrelay/endpoints/{ref.slug} Updates a forwarding endpoint identified by `ref.slug`. The request body must include the full `spec`. The endpoint's protocol type cannot change after creation. Use `credentialAction` to preserve, replace, or clear stored credentials. You can't clear credentials for AWS S3 destinations. # Update forwarding pipeline Source: https://docs.coreweave.com/observability/telemetry-forwarding/telemetry-relay-api/telemetryrelayservice/update-forwarding-pipeline /openapi/o11y/openapi.yaml patch /v1beta1/telemetryrelay/pipelines/{ref.slug} Updates a forwarding pipeline identified by `ref.slug`. The request body must include the full `spec` (source, destination, enabled). Use this to retarget a pipeline, enable or disable forwarding, or temporarily pause delivery. # Cost and usage monitoring Source: https://docs.coreweave.com/observability/usage-monitoring Learn how to monitor your CoreWeave usage and estimate costs Understanding your resource consumption is crucial for managing costs and optimizing performance. This guide explains the key metrics available in Grafana for monitoring your compute, storage, and networking usage on CoreWeave Cloud and provides practical examples of how to use them. It's intended for administrators and operators who need to track usage, forecast spend, and assess resource efficiency. ## Prerequisites The metrics are available in the [Explore section](/observability/managed-grafana) of the Grafana instance that CoreWeave hosts. To [access Grafana](/observability/managed-grafana), you must be logged into the CoreWeave Cloud Console and be a member of the `admin`, `metrics`, or `write` groups. To open the Explore view, follow these steps: 1. Log into the [CoreWeave Cloud Console](https://console.coreweave.com/). 2. Click **Grafana** in the left-hand navigation menu. 3. Within Grafana, select **Explore** in the left-hand navigation menu. ## Key usage metrics These metrics provide insight into resource consumption. You can query them directly to create time-series graphs or compute aggregations. The sections that follow describe the metrics available for compute, storage, and networking, along with the labels you can use to filter and group results. ### Compute usage #### Metric `billing:instance:total` This metric provides the number of Nodes (instances) running in the selected clusters. Units are in **instances**. These labels are available for filtering and grouping: | Label | Description | Example | Notes | | - | - | - | - | | `cluster` | The name of the CKS cluster | `my-cluster` | See [clusters in Cloud Console](https://console.coreweave.com/clusters). | | `cluster_org` | The Organization ID | `abc123` | Queries are automatically scoped to the organization. | | `compute_class` | Whether Nodes in the Node Pool run as standard or Spot capacity | `spot` | Values are `default` (standard capacity) or `spot` (Spot Node Pools). For more information, see [Spot Instances](/platform/capacity-plans#spot-instances). | | `label_node_kubernetes_io_instance_type` | The Node instance type | `gb200-4x` | See [the list of instance types](/platform/instances/gpu-instances). | | `node_pool_name` | The Node Pool that the Nodes belong to within the CKS cluster | `h100-training` | See the Node Pools page in Cloud Console: `https://console.coreweave.com/zones/[ZONE-NAME]/clusters/[CLUSTER-NAME]/node-pools`. | | `region` | The Region where the Nodes are located | `US-EAST-02` | See [the list of Regions](/platform/regions/about-regions-and-azs). | | `zone` | The Zone where the Nodes are located | `US-EAST-02A` | See [the list of Availability Zones](/platform/regions/about-regions-and-azs). | > [!NOTE] > > Clusters created [before July 7, 2025](/release-notes/changelog#july-7-2025) should filter out the `cpu-control-plane` Node Pool with the following query when estimating billable compute usage: > > `node_pool_name != "cpu-control-plane"` > > These Nodes aren't billable. Clusters created after this date don't have a `cpu-control-plane` Node Pool. ### Storage usage #### Metric `billing:object_storage_used_bytes:total` This metric provides the amount of data stored in CoreWeave AI Object Storage. Units are in **bytes**. The following labels are available for filtering and grouping: | Label | Description | Example | Notes | | - | - | - | - | | `billing_label` | The product tier | `caios-high-perf` | Use this label for filtering or aggregating by product tier. | | `bucket_name` | The bucket name | `my-bucket` | See [buckets in Cloud Console](https://console.coreweave.com/object-storage/buckets). | | `cluster_org` | Your Organization ID | `abc123` | Queries are automatically scoped to the organization. | | `storage_class` | The storage class name | `STANDARD` | This label exists for S3 compatibility and maps to `billing_label`, which is preferred for queries. | | `region` | The Region where the storage is located | `US-EAST-02` | See [the list of Regions](/platform/regions/about-regions-and-azs). | | `zone` | The Zone where the storage is located | `US-EAST-02A` | See [the list of Availability Zones](/platform/regions/about-regions-and-azs). | > [!NOTE] > > CoreWeave only guarantees that the underlying data for this metric updates once per hour. #### Metric `billing_resource_usage_storage` This metric provides the size of storage volumes provisioned for CKS clusters. Units are in **bytes**. The following labels are available for filtering and grouping: | Label | Description | Example | Notes | | - | - | - | - | | `cluster` | The name of the CKS cluster the storage volumes belong to | `my-cluster` | See [clusters in Cloud Console](https://console.coreweave.com/clusters). | | `cluster_org` | Your Organization ID | `abc123` | Queries are automatically scoped to the organization. | | `storage_class` | The storage class name | `shared-vast` | | | `namespace` | The CKS cluster namespace the storage volumes belong to | `my-namespace` | | ### Networking usage #### Metric `billing_ip_address` This metric provides the number of public IP addresses provisioned in your CKS clusters. These are typically associated with `LoadBalancer` Kubernetes services. Units are in **public IP addresses**. The following labels are available for filtering and grouping: | Label | Description | Example | Notes | | - | - | - | - | | `cluster` | The name of the CKS cluster the IP addresses belong to | `my-cluster` | See [clusters in Cloud Console](https://console.coreweave.com/clusters). | | `cluster_org` | Your Organization ID | `abc123` | Queries are automatically scoped to the organization. | | `namespace` | The CKS cluster namespace the IP addresses belong to | `my-namespace` | | ## Practical monitoring examples The following scenarios show how to combine the metrics above into queries that answer common questions about usage and cost. ### Explore usage trends over time Visualizing usage trends helps you spot patterns, detect anomalies, and assess the impact of changes. Long-term trends can support forecasting, and short-term trends can reveal issues. To explore usage trends, follow these steps: 1. Navigate to Grafana's **Explore** section. See [Prerequisites](#prerequisites). 2. Select a desired **Time range** using the picker in the top right. ![Filter for last 30 days](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/last-30-days-filter.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=2b5265848899a3779883612295e1d248) 1. Enter your query in the query editor. ![Example query](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/sum-by-bucket-query.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=11161f382385d86c6f9e922c09efab99) 1. Ensure the query **Type** in the Options section is set to **Range** or **Both**. ![Query type](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/range-both.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=c365e8f70af99b99068967302a6fc52b) 1. Click **Run query**, or press Shift+Enter. #### Example: Billable GPU and CPU instances grouped by type Use this query to find the count of billable instances, grouped by their type. ```text theme={"system"} sum by (label_node_kubernetes_io_instance_type) ( billing:instance:total{node_pool_name!="cpu-control-plane"} ) ``` The graph displays the instance count over the specified time range. ![Billable GPU and CPU instances grouped by type](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/sum-by-label-graph.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=9947224d5dd182eb8ac03d4610df8299) #### Example: Billable AI Object Storage grouped by bucket in GiB Use this query to find the total storage used in CoreWeave AI Object Storage, grouped by bucket name and converted to GiB. ```text theme={"system"} sum by (bucket_name) ( billing:object_storage_used_bytes:total ) / 1024^3 ``` The graph displays the total storage used in each bucket over the specified time range. ![Billable AI Object Storage grouped by bucket in GiB](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/sum-by-bucket-graph.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=4e6d1c199b0ab507c397686990a5b90b) #### Example: Distributed File Storage in GiB Use this query to find the total provisioned size of storage volumes that use the shared-vast storage class, converted to GiB. ```text theme={"system"} sum(billing_resource_usage_storage{storageclass="shared-vast"}) / 1024^3 ``` The graph displays the total provisioned size of storage volumes over the specified time range. ![Distributed File Storage in GiB](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/observability/_media/distributed-file-storage-graph.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=b1c79249e376802bbc70c949f9d8d9e3) ### Estimate total On-Demand costs for a time period While Reserved instances provide guaranteed access at a fixed rate, any usage beyond Reservations is metered as On-Demand. You can estimate your On-Demand costs using Grafana, which helps with forecasting spend or reconciling expected charges before the billing cycle closes. > [!NOTE] > > This provides an estimate based on standard On-Demand rates and your real-time usage metrics. Actual billed amounts can vary based on contracts, discounts, taxes, and billing cycle specifics. #### Example: Month-to-date On-Demand estimate excluding Reservation Assume the following scenario: * 25 Reserved [H200](/platform/instances/gpu/gd-8xh200ib-i128) Nodes (`gd-8xh200ib-i128`). * [L40S](/platform/instances/gpu/gd-8xl40s-i128) Nodes run On-Demand (`gd-8xl40s-i128`). * [General Purpose AMD Genoa](/platform/instances/cpu/cd-gp-a192-genoa) Nodes run On-Demand (`cd-gp-a192-genoa`). * Object Storage, Distributed Filesystem Storage, and Public IP addresses are in use. * No additional discounts on On-Demand usage. To estimate the total On-Demand costs for the month-to-date, follow these steps: 1. Navigate to Grafana's **Explore** section. See [Prerequisites](#prerequisites). 2. Select **This month so far** in the time range picker. 3. Enter the following query, replacing the instance types and prices with your specific details and current On-Demand rates: ```text theme={"system"} # --- ESTIMATED ON-DEMAND COST QUERY --- # Note: Prices used are examples. Replace with current On-Demand rates. sum_over_time( sum( # H200 On-Demand: Count above Reservation (25), clamp at 0, multiply by hourly rate ($50.44) clamp_min( sum( billing:instance:total{label_node_kubernetes_io_instance_type="gd-8xh200ib-i128"} ) - 25, # Subtract Reserved count 0 ) * 50.44 + # L40S On-Demand: Count all, multiply by hourly rate ($18.00) sum( billing:instance:total{label_node_kubernetes_io_instance_type="gd-8xl40s-i128"} ) * 18.00 + # Genoa On-Demand: Count all (excluding Control Plane), multiply by hourly rate ($7.78) sum( billing:instance:total{ label_node_kubernetes_io_instance_type="cd-gp-a192-genoa", node_pool_name!="cpu-control-plane" # Exclude non-billable } ) * 7.78 + # AI Object Storage On-Demand: Sum bytes, convert GiB/month rate ($0.000151/GiB/hr) sum(billing:object_storage_used_bytes:total) * 0.000151 / 1024^3 + # Shared-Vast Storage On-Demand: Sum bytes, convert GiB/month rate ($0.000096/GiB/hr) sum(billing_resource_usage_storage{storageclass="shared-vast"}) * 0.000096 / 1024^3 + # Public IPs On-Demand: Count IPs, multiply by hourly rate ($0.0055) sum(billing_ip_address) * 0.0055 ) [$__range:30s] # Use appropriate range vector and step for accuracy ) / 120 # Adjust divisor based on range vector step (for 30s step over an hour, divide by 120) ``` 4. Ensure the query **Type** in the Options section is set to **Instant**. 5. Click **Run query**, or press Shift+Enter. The resulting value is an estimate of the total dollar amount for your On-Demand usage during the selected time period, month-to-date in this example. #### About range vectors and step size In this query, `$__range:30s` sets the time range and the step size for the data. The `30s` step means the query evaluates data points every 30 seconds across the selected time range in Grafana. The query uses a divisor of `120` to normalize the total across all 30-second intervals in a 1-hour range. This converts the result into an average hourly rate. For example, one hour contains 120 intervals when using a 30-second step: 60 minutes multiplied by 2. If you change the step size, update the divisor to match. For example: * Use `60` for a `1m` step size. * Use `240` for a `15s` step size. Adjusting the divisor ensures the result accurately reflects the average rate over time. ### Assess GPU utilization Monitoring GPU utilization helps determine if you're using your GPU resources effectively. High utilization might indicate a need for more capacity or Reservations, and low utilization could suggest opportunities for scaling down or consolidating workloads. #### Example: Average H100 GPU utilization, including SUNK and non-SUNK workloads This query calculates the average utilization percentage for H100 GPUs over the selected time range. A GPU counts as utilized when a SUNK job allocates it or a Pod requests it. SUNK `slurmd` Pods request every GPU on their Nodes even when no job is running, so the query excludes the SUNK namespace from the Pod count and measures SUNK usage with `sunk:job_gpus_allocated:total` instead. It also excludes CoreWeave's `hpc-verification` namespace. To assess the average GPU utilization for H100 GPUs, follow these steps: 1. Navigate to Grafana's **Explore** section. See [Prerequisites](#prerequisites). 2. Select your desired **Time range**. 3. Enter the following query: ```text theme={"system"} # --- AVERAGE H100 GPU UTILIZATION (%) --- avg_over_time( ( ( # Sum GPUs allocated by SUNK jobs for H100 model sum( sunk:job_gpus_allocated:total{ label_gpu_nvidia_com_model="H100_NVLINK_80GB", namespace!~".*hpc.verification" # Exclude hpc-verification namespace } ) + # Sum GPUs requested by non-SUNK Pods on H100 Nodes sum( kube_pod_container_resource_requests{ resource="nvidia_com_gpu", namespace!="slurm", # Exclude SUNK Pods, counted above namespace!~".*hpc.verification" # Exclude hpc-verification namespace } * on(node) group_left() # Keep only Pods on H100 Nodes kube_node_labels{ label_gpu_nvidia_com_model="H100_NVLINK_80GB" } ) ) / # Divide by total available H100 GPUs ( # Sum H100 instances (8 GPUs per instance) sum(billing:instance:total{ label_node_kubernetes_io_instance_type="gd-8xh100ib-i128" }) * 8 # Multiply by GPUs per node ) ) [$__range] # Calculate over the selected time range ) * 100 # Convert ratio to percentage ``` 4. Ensure the query **Type** in the Options section is set to **Instant**. 5. Click **Run query**, or press Shift+Enter. The result represents the average percentage utilization of your H100 Nodes over the selected period. Adjust the `label_node_kubernetes_io_instance_type`, `label_gpu_nvidia_com_model`, and GPUs-per-node multiplier, for example `* 8`, according to the specific instance types you're analyzing. The example assumes SUNK runs in the `slurm` namespace. If yours runs elsewhere, adjust the `namespace!="slurm"` matcher. # Introduction to CoreWeave Alerts Source: https://docs.coreweave.com/platform/coreweave-alerts Configure which alerts your organization receives and where they're delivered CoreWeave Alerts delivers real-time notifications about your clusters, deployments, and operations. This page introduces the two areas you manage in the Cloud Console to control which alerts your organization receives and where they're delivered: * **Destinations** determine where CoreWeave delivers alerts. In-app delivery is on by default, so alerts appear on the Cloud Console [Alert history](https://console.coreweave.com/account/alerts) page without any setup. You can also connect Slack or a webhook to extend delivery outside the Cloud Console. Enabling an additional destination doesn't disable in-app. Manage destinations on the [Integrations](https://console.coreweave.com/organization/integrations) page. * **Alert configuration** determines which alerts your organization receives and which destinations each one goes to. Manage subscriptions on the [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page. The [Alert history](https://console.coreweave.com/account/alerts) page shows delivery status for every destination that received the alert. Click an entry to see each destination, its integration type, delivery status, and timestamp. For the IAM roles required to access these pages, see [Before you begin](#before-you-begin). To manage destinations and alert configuration programmatically, see the [CoreWeave Alerts API](/platform/coreweave-alerts/alerts-api). ## Destinations CoreWeave Alerts supports four destination types. In-app delivery is on by default and doesn't need to be configured. | Destination type | Description | | :- | :- | | In-app | Delivers alerts to the Cloud Console [Alert history](https://console.coreweave.com/account/alerts) page. On by default for every organization. | | Slack OAuth | Connects through an authorization flow to your Enterprise Slack workspace. Supports alert threading and multiple channels from a single authorization. | | Slack Webhook | Connects to a single Slack channel using an incoming webhook URL. | | Generic Webhook | Sends alerts to any HTTPS endpoint, with optional signature verification. | > [!NOTE] > > Your organization can have at most one Slack destination (either Slack OAuth or Slack webhook) and one generic webhook destination at a time. To switch types, you must delete the existing destination before creating a new one. Each entry on the [Alert history](https://console.coreweave.com/account/alerts) page shows the subject, delivery status, and timestamp. Click an entry to see every destination that received the alert. ### Destination type comparison | Aspect | Slack OAuth | Slack Webhook | Generic Webhook | | :- | :- | :- | :- | | **Setup** | Multi-step authorization flow | Paste a Slack incoming webhook URL | Paste an endpoint URL, optionally configure a signing secret | | **Bot identity** | Messages appear from CoreWeave Mission Control | Messages appear from the webhook app | N/A | | **Channel flexibility** | Connect multiple channels from a single authorization | One webhook URL per channel | Any HTTPS endpoint | | **Alert threading** | Can edit, reply to, and create threads on existing alerts | New message per alert | N/A | ## Alert configuration On the [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page, each alert has an independent toggle per destination, including in-app. The page groups alerts by category (such as Storage, AI Object Storage, GPU (hardware health and runtime errors), and SUNK) and tags each one with a severity of **Critical**, **Warning**, or **Info**. For each alert, you can do the following: * Toggle delivery per destination. Enabling Slack or a webhook is additive. In-app stays on unless you explicitly turn it off. * Use **Configure all** on a category to apply the same destination settings to every alert in that category at once. An alert row shows **Disabled** when you turn off all destination toggles for that alert. This is intentional. The alert isn't delivered until you re-enable at least one destination. For a walkthrough, see [Configure alerts](/platform/coreweave-alerts/alert-configuration). ### Alert reference by product The following pages list the individual alerts in a category, the condition that triggers each one, and the metrics behind them: * [Object storage alerts](/products/storage/object-storage/monitoring/alerts): the **AI Object Storage** category. * [Distributed File Storage alerts](/products/storage/distributed-file-storage/monitoring/alerts): the **Storage** category. ## Before you begin CoreWeave splits access to alerts between two areas, each with its own IAM roles. Grant these through an [IAM Access Policy](/security/iam/access-policies/manage). | Task | Required role | | :- | :- | | View the Integrations page and the destinations list | **Integrations Viewer** (`READ_INTEGRATIONS`) | | Create, update, or delete Slack and webhook destinations | **Integrations Admin** (`WRITE_INTEGRATIONS`) | | View the Alert configuration and Alert history pages | **Alerts Viewer** (`READ_NOTIFICATIONS`) | | Subscribe or unsubscribe alerts on the Alert configuration page | **Alerts Admin** (`WRITE_NOTIFICATIONS`) | > [!NOTE] > > The [Administrator default policy](/security/iam/access-policies#default-access-policies) includes all available roles, including the Notifications and Integrations roles. Principals assigned to it can use CoreWeave Alerts without additional setup. If your organization uses legacy permissions, the `admin` group doesn't automatically include the Notifications or Integrations roles. You must create an IAM Access Policy to grant them explicitly. ## Set up an integration The following cards link to step-by-step setup guides for each integration type. > **[Slack OAuth integration](/platform/coreweave-alerts/slack-oauth)** > > Connect CoreWeave Alerts to your Enterprise Slack workspace using the OAuth authorization flow > **[Webhook integrations](/platform/coreweave-alerts/webhooks)** > > Connect CoreWeave Alerts to Slack or any HTTPS endpoint using a webhook URL ## Configure alerts > **[Configure alerts](/platform/coreweave-alerts/alert-configuration)** > > Choose which alerts your organization receives and which destinations each one goes to # Configure alerts Source: https://docs.coreweave.com/platform/coreweave-alerts/alert-configuration Choose which alerts your organization receives and where each one is delivered Organization administrators use the [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page to choose which CoreWeave Alerts their organization receives and which destinations each one uses. Subscribe or unsubscribe alerts per destination so your team gets the right signals in the right places. This page is separate from the [Integrations](https://console.coreweave.com/organization/integrations) page, where you connect destinations. In-app delivery is on by default for every organization, so alerts appear on the Cloud Console [Alert history](https://console.coreweave.com/account/alerts) page. To extend delivery to Slack or a webhook, connect the destination on the Integrations page and then opt alerts in to it. Enabling an additional destination doesn't disable in-app. ## Prerequisites To view and configure alerts, you need the following: * The **Alerts Viewer** IAM role to view the Alert configuration page. * The **Alerts Admin** IAM role to subscribe or unsubscribe alerts. * The **Integrations Viewer** IAM role to see the list of connected destinations on this page. * At least one connected destination (in-app is always available, and Slack or webhook are optional). See [CoreWeave Alerts](/platform/coreweave-alerts) for the full destination list and setup instructions. Roles are assigned through an [IAM Access Policy](/security/iam/access-policies/manage). ## Open the alert configuration page 1. Log in to the [CoreWeave Cloud Console](https://console.coreweave.com). 2. From the left navigation menu, select **Alerts** > **Alert configuration**, or go directly to the [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page. The page lists every alert your organization can receive, grouped by category. Each category shows how many alerts in it are enabled. ## Understand the layout Each alert row shows: * The alert name and a short description. * A severity badge: **Critical**, **Warning**, or **Info**. * The current delivery state. If enabled, the row lists the channels that deliver it (for example, `Enabled: In-app, Slack OAuth`). If you turn off all destination toggles for an alert, the row shows `Disabled`. The alert isn't delivered anywhere until you re-enable at least one destination. Categories include Storage, AI Object Storage, GPU (hardware health and runtime errors), and SUNK. ## Configure a single alert Use this flow when you want to tune delivery for one specific alert. 1. On the Alert configuration page, locate the alert you want to change. 2. Click the alert row. A drawer opens with the alert name, severity, description, and a list of every connected destination. 3. Toggle each destination on or off. In-app is on by default and appears alongside any connected Slack or webhook destinations. You can toggle all destinations independently. 4. Click **Save**. The drawer closes and the row updates to show the new delivery state. ## Configure an entire category Use this flow when you want every alert in a category to behave the same way (for example, send all SUNK alerts to Slack). 1. On the Alert configuration page, locate the category you want to change. 2. In the upper right corner of the category, click **Configure all**. A drawer opens with the connected destinations grouped by channel. 3. Select the channels that should receive every alert in the category. Clear a channel to unsubscribe every alert in the category from that channel. 4. Click **Save**. Every alert in the category now matches your selection. > [!NOTE] > > **Configure all** sets the same subscription state for every alert in the category. If you want a mix (for example, most alerts in Slack but a couple of noisy ones only in-app), configure the category first and then tune individual alerts with the per-alert flow. ## Add or change destinations The Alert configuration page reads from the list of destinations connected on the Integrations page. To add Slack or a webhook, or to swap one out: 1. Click **Go to integrations** in the callout at the top of the Alert configuration page, or go directly to the [Integrations](https://console.coreweave.com/organization/integrations) page. 2. Follow the [Slack OAuth](/platform/coreweave-alerts/slack-oauth) or [webhook](/platform/coreweave-alerts/webhooks) setup instructions. 3. Return to the Alert configuration page. The new destination appears in the per-alert and per-category drawers, ready for you to subscribe alerts to it. Your organization can have at most one Slack destination and one generic webhook destination at a time. You must delete the existing destination before creating a new one of the same type. ## Verify delivery After you save subscription changes, confirm that alerts reach the destinations you expect. The [Alert history](https://console.coreweave.com/account/alerts) page shows delivery status for every destination an alert was sent to. Click an alert entry to see each destination, its integration type, delivery status, and timestamp. * **In-app:** Confirm the alert appears on the Alert history page with a **Delivered** status and a timestamp. * **Slack and webhook:** Click the alert on the Alert history page to see the delivery status for each destination, then verify the message or payload appeared on the destination itself. Send a test from the [Integrations](https://console.coreweave.com/organization/integrations) page to confirm the destination is reachable. For details, see [Webhook integrations](/platform/coreweave-alerts/webhooks) and [Slack OAuth integration](/platform/coreweave-alerts/slack-oauth). # CoreWeave Alerts API Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api REST API for managing CoreWeave Alerts destinations and subscriptions, and reading delivery history The CoreWeave Alerts API manages where CoreWeave Alerts are delivered and which alerts each destination receives. With the API, you can create destinations, subscribe alerts to them, review delivery history, and pull alerts from a queue destination. Use it to manage alert delivery from scripts and automation. It covers the same configuration as the Cloud Console [Integrations](https://console.coreweave.com/organization/integrations) and [Alert configuration](https://console.coreweave.com/account/alerts/configuration) pages. For an introduction to destinations and alert configuration, see [CoreWeave Alerts](/platform/coreweave-alerts). > [!NOTE] > > * The API server is `https://api.coreweave.com`. > * Replace `[API-ACCESS-TOKEN]` in the following examples with your [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens). ## Authentication and permissions Send your API access token in the `Authorization` header of every request: ```bash title="Example request" theme={"system"} curl https://api.coreweave.com/v1/notifications/destinations \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` The CoreWeave Alerts API checks one of two Identity and Access Management (IAM) roles on each request. Grant them through an [IAM Access Policy](/security/iam/access-policies/manage). | Role | Grants | | :- | :- | | **Alerts Viewer** (`READ_NOTIFICATIONS`) | Every `GET` endpoint. | | **Alerts Admin** (`WRITE_NOTIFICATIONS`) | Every endpoint, including those that create, change, test, delete, or acknowledge. | Each endpoint page lists the role it requires. Every request applies to the organization that owns the API access token. > [!NOTE] > > The Cloud Console [Integrations](https://console.coreweave.com/organization/integrations) page uses the separate **Integrations Viewer** and **Integrations Admin** roles. The CoreWeave Alerts API checks only the Alerts roles, including for destination and Slack channel endpoints. ## Endpoints The following tables list the API endpoints, grouped by resource. Each operation links to its reference page. ### Destinations | Operation | Method | Endpoint | | :- | :- | :- | | [List destinations](/platform/coreweave-alerts/alerts-api/notificationsservice/list-destinations) | `GET` | `/v1/notifications/destinations` | | [Create destination](/platform/coreweave-alerts/alerts-api/notificationsservice/create-destination) | `POST` | `/v1/notifications/destinations` | | [Update destination](/platform/coreweave-alerts/alerts-api/notificationsservice/update-destination) | `PUT` | `/v1/notifications/destinations/{id}` | | [Delete destination](/platform/coreweave-alerts/alerts-api/notificationsservice/delete-destination) | `DELETE` | `/v1/notifications/destinations/{id}` | | [Test destination](/platform/coreweave-alerts/alerts-api/notificationsservice/test-destination) | `POST` | `/v1/notifications/destinations/{destId}/test` | ### Credentials | Operation | Method | Endpoint | | :- | :- | :- | | [List credentials](/platform/coreweave-alerts/alerts-api/notificationsservice/list-credentials) | `GET` | `/v1/notifications/credentials` | | [Create credential](/platform/coreweave-alerts/alerts-api/notificationsservice/create-credential) | `POST` | `/v1/notifications/credentials` | | [Update credential status](/platform/coreweave-alerts/alerts-api/notificationsservice/update-credential-status) | `PUT` | `/v1/notifications/credentials/{id}/status` | | [Delete credential](/platform/coreweave-alerts/alerts-api/notificationsservice/delete-credential) | `DELETE` | `/v1/notifications/credentials/{id}` | ### Alert subscriptions | Operation | Method | Endpoint | | :- | :- | :- | | [List alert subscriptions](/platform/coreweave-alerts/alerts-api/notificationsservice/list-alert-subscriptions) | `GET` | `/v1/notifications/subscriptions/alerts` | | [Set alert subscription](/platform/coreweave-alerts/alerts-api/notificationsservice/set-alert-subscription) | `PUT` | `/v1/notifications/subscriptions/alerts/{alertName}` | | [Subscribe to category](/platform/coreweave-alerts/alerts-api/notificationsservice/subscribe-to-category) | `POST` | `/v1/notifications/subscriptions/alerts/categories/{category}/subscribe` | | [Unsubscribe from category](/platform/coreweave-alerts/alerts-api/notificationsservice/unsubscribe-from-category) | `POST` | `/v1/notifications/subscriptions/alerts/categories/{category}/unsubscribe` | ### Delivery history | Operation | Method | Endpoint | | :- | :- | :- | | [List alerts](/platform/coreweave-alerts/alerts-api/notificationsservice/list-alerts) | `GET` | `/v1/notifications/alerts` | | [List delivery statuses](/platform/coreweave-alerts/alerts-api/notificationsservice/list-delivery-statuses) | `GET` | `/v1/notifications/statuses` | ### Queue delivery | Operation | Method | Endpoint | | :- | :- | :- | | [List queue messages](/platform/coreweave-alerts/alerts-api/notificationsservice/list-queue-messages) | `GET` | `/v1/notifications/queues/{destinationId}/messages` | | [Acknowledge queue messages](/platform/coreweave-alerts/alerts-api/notificationsservice/acknowledge-queue-messages) | `POST` | `/v1/notifications/queues/{destinationId}/messages/ack` | ### Slack channels | Operation | Method | Endpoint | | :- | :- | :- | | [List Slack channels](/platform/coreweave-alerts/alerts-api/integrationsservice/list-slack-channels) | `GET` | `/v1/notifications/integrations/slack-channels` | | [Join Slack channel](/platform/coreweave-alerts/alerts-api/integrationsservice/join-slack-channel) | `POST` | `/v1/notifications/integrations/slack-channels/invite` | ## Destination channels and credentials Every destination has a `channel` that determines how CoreWeave Alerts delivers to it. You can create `webhook`, `slack_webhook`, `google_chat`, and `queue` destinations with [Create destination](/platform/coreweave-alerts/alerts-api/notificationsservice/create-destination), and `slack` destinations with [Join Slack channel](/platform/coreweave-alerts/alerts-api/integrationsservice/join-slack-channel). Channels that deliver to a secret URL keep that URL in a credential. Create the credential with [Create credential](/platform/coreweave-alerts/alerts-api/notificationsservice/create-credential), then pass its `id` as `credentialId` when you create the destination. CoreWeave encrypts credential secrets and never returns them. The following table lists every channel the API supports and what each one needs: | Channel | Credential type | Credential `secret` | Destination `config` | | :- | :- | :- | :- | | `webhook` | `webhook` | A JSON-encoded string: `{"url": "https://...", "signing_secret": "..."}`. `signing_secret` is optional. | None | | `slack_webhook` | `slack_webhook` | A Slack incoming webhook URL that starts with `https://hooks.slack.com/services/`. | None | | `google_chat` | `google_chat` | A Google Chat webhook URL that starts with `https://chat.googleapis.com/v1/spaces/`. | None | | `slack` | `slack_oauth` | Created by the Cloud Console [Slack OAuth](/platform/coreweave-alerts/slack-oauth) flow. | `{"channelId": "..."}` | | `queue` | None | None | None | The following rules apply to destinations and credentials: * **Webhook URLs:** A `webhook` URL must use HTTPS and a hostname. CoreWeave rejects bare IP addresses and reserved addresses. * **Webhook signatures:** When a `webhook` credential has a `signing_secret`, each request carries an `X-CoreWeave-Signature` header set to `sha256=` followed by the hex-encoded HMAC-SHA256 of the request body. For the payload format, see [Webhook integrations](/platform/coreweave-alerts/webhooks#webhook-payload-format). * **Slack OAuth:** In the Cloud Console, connect Slack OAuth first. Then use [List Slack channels](/platform/coreweave-alerts/alerts-api/integrationsservice/list-slack-channels) and [Join Slack channel](/platform/coreweave-alerts/alerts-api/integrationsservice/join-slack-channel) to get a destination for each channel. * **Revoked credentials:** Setting a credential to `revoked` with [Update credential status](/platform/coreweave-alerts/alerts-api/notificationsservice/update-credential-status) stops delivery to every destination that uses it until you set it back to `active`. * **In-app delivery:** Every organization has one `in_app` destination, which delivers to the Cloud Console [Alert history](https://console.coreweave.com/account/alerts) page. CoreWeave creates it, and you can't create other `in_app` destinations. Subscribe alerts to it like any other destination. * **Test notifications:** [Test destination](/platform/coreweave-alerts/alerts-api/notificationsservice/test-destination) works on every channel. A test of a `queue` destination adds a message to the queue, and a test of the `in_app` destination adds an entry to the Alert history page. * **Uniqueness:** A `webhook`, `slack_webhook`, or `google_chat` credential can back only one destination. `slack` and `queue` destinations are unique by channel and config, so several `slack` destinations, one per Slack channel, share the same `slack_oauth` credential. A duplicate fails with `ALREADY_EXISTS`. * **Deletion order:** Delete a destination before its credential, and unsubscribe every alert from a destination before you delete the destination. Deleting a resource that's still referenced fails with `FAILED_PRECONDITION`. ## Queue delivery A `queue` destination stores alerts for you to pull instead of pushing them to an endpoint. Use it when your system can't receive inbound webhooks. To receive alerts through a queue destination, complete the following steps: 1. Call [Create destination](/platform/coreweave-alerts/alerts-api/notificationsservice/create-destination) with `"channel": "queue"`. Save the destination `id` from the response for the following steps. 2. Subscribe alerts to the destination. For the endpoints, see [Alert subscriptions](#alert-subscriptions). 3. Poll [List queue messages](/platform/coreweave-alerts/alerts-api/notificationsservice/list-queue-messages). It returns up to `limit` messages, oldest first. The default is 100 and the maximum is 500. 4. After you process the messages, send their IDs to [Acknowledge queue messages](/platform/coreweave-alerts/alerts-api/notificationsservice/acknowledge-queue-messages). Listing doesn't remove messages, so unacknowledged messages appear again on the next poll. Each message `payload` carries the same `subject` and `body` fields as a webhook delivery. Its `requestId` matches the `requestId` in [List alerts](/platform/coreweave-alerts/alerts-api/notificationsservice/list-alerts) and [List delivery statuses](/platform/coreweave-alerts/alerts-api/notificationsservice/list-delivery-statuses). The following limits apply: * **Polling rate:** Poll each queue destination at most once every 10 seconds. A faster poll fails with `RESOURCE_EXHAUSTED` and a `Retry-After` header that gives the number of seconds to wait. * **Retention:** CoreWeave Alerts deletes messages that aren't acknowledged within 7 days. > [!WARNING] > > Deleting a queue destination permanently deletes every message in its queue, including messages you haven't acknowledged. Pull and acknowledge the remaining messages before you delete the destination. ## Pagination List alerts and List delivery statuses return results in pages, newest first. Pass `page`, starting at `1`, and `pageSize`. `pageSize` defaults to 100, which is also the maximum. Continue while the response returns `hasNextPage: true`. To limit results to recent alerts, pass `fromDate` as an RFC 3339 timestamp, such as `2026-10-01T00:00:00Z`. ## Errors A failed request returns a JSON error body with a numeric `code` and a `message`: ```json title="Example error response" theme={"system"} { "code": 9, "message": "destination cannot be deleted while it is referenced by a subscription" } ``` The CoreWeave Alerts API returns these errors: | Error | HTTP status | Cause | | :- | :- | :- | | `INVALID_ARGUMENT` | `400` | A field is missing or invalid, such as an ID that isn't a UUID or an unsupported channel. | | `FAILED_PRECONDITION` | `400` | The resource is still referenced, or the destination's credential is revoked. | | `NOT_FOUND` | `404` | The destination or alert doesn't exist, or Slack OAuth isn't connected. | | `ALREADY_EXISTS` | `409` | A destination with the same credential, or the same channel and config, already exists. | | `RESOURCE_EXHAUSTED` | `429` | A queue destination was polled too often. Wait for the number of seconds in the `Retry-After` header. | | `PERMISSION_DENIED` | `403` | The token's principal doesn't have the required role. | A request with a missing or invalid API access token fails with HTTP `401` before it reaches the CoreWeave Alerts API. ## OpenAPI specification The complete OpenAPI 3.0 specification for the CoreWeave Alerts API is embedded in the following code block. To expand the code block, click **See all** at the bottom. To download or copy the specification, use the buttons in the title bar. ```yaml expandable title="CoreWeave Alerts OpenAPI" theme={"system"} openapi: 3.0.3 info: title: CoreWeave Alerts API version: 0.0.1 description: Manage where CoreWeave Alerts are delivered, which alerts each destination receives, and review delivery history. servers: - url: https://api.coreweave.com description: CoreWeave API gateway. paths: /v1/notifications/alerts: get: operationId: NotificationsService_ListAlerts summary: List alerts description: Returns alerts delivered to the caller's organization through the `in_app` destination, newest first, one entry per alert. parameters: - name: fromDate in: query description: Return only alerts created at or after this RFC 3339 timestamp, such as `2026-10-01T00:00:00Z`. schema: type: string - name: page in: query description: The page to return, starting at `1`. Defaults to `1`. schema: type: integer format: int32 - name: pageSize in: query description: The number of alerts per page. Defaults to `100`, which is also the maximum. schema: type: integer format: int32 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListAlertsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/credentials: get: operationId: NotificationsService_ListCredentials summary: List credentials description: Returns every credential in the caller's organization. The response never includes secrets. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListCredentialsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService post: operationId: NotificationsService_CreateCredential summary: Create credential description: Stores an encrypted secret, such as a webhook URL, for destinations to use. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateCredentialRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CreateCredentialResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/credentials/{id}: delete: operationId: NotificationsService_DeleteCredential summary: Delete credential description: Deletes a credential. Fails with `FAILED_PRECONDITION` while a destination references the credential. parameters: - name: id in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/DeleteCredentialResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/credentials/{id}/status: put: operationId: NotificationsService_UpdateCredentialStatus summary: Update credential status description: Sets a credential to `active` or `revoked`. parameters: - name: id in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCredentialStatusRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UpdateCredentialStatusResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/destinations: get: operationId: NotificationsService_ListDestinations summary: List destinations description: Returns every destination in the caller's organization, including the default in-app destination. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListDestinationsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService post: operationId: NotificationsService_CreateDestination summary: Create destination description: Creates a destination that CoreWeave Alerts can deliver to. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateDestinationRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CreateDestinationResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/destinations/{destId}/test: post: operationId: NotificationsService_TestDestination summary: Test destination description: Sends a test notification to a destination and reports whether delivery succeeded. parameters: - name: destId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TestDestinationRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/TestDestinationResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/destinations/{id}: put: operationId: NotificationsService_UpdateDestination summary: Update destination description: Updates the display name, credential, or config of a destination. Omitted fields keep their current value. An empty `displayName` or `config` also keeps the current value. parameters: - name: id in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateDestinationRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UpdateDestinationResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService delete: operationId: NotificationsService_DeleteDestination summary: Delete destination description: Deletes a destination. Fails with `FAILED_PRECONDITION` while a subscription references the destination. parameters: - name: id in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/DeleteDestinationResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/integrations/slack-channels: get: operationId: IntegrationsService_ListSlackChannels summary: List Slack channels description: Returns the Slack channels visible to your organization's Slack OAuth integration. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListSlackChannelsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - IntegrationsService /v1/notifications/integrations/slack-channels/invite: post: operationId: IntegrationsService_InviteToSlackChannel summary: Join Slack channel description: Adds the CoreWeave Mission Control app to a Slack channel and returns the Slack destination for that channel. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InviteToSlackChannelRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/InviteToSlackChannelResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - IntegrationsService /v1/notifications/queues/{destinationId}/messages: get: operationId: NotificationsService_ListQueueMessages summary: List queue messages description: Returns unacknowledged messages from a queue destination, oldest first. parameters: - name: destinationId in: path required: true schema: type: string - name: limit in: query description: The maximum number of messages to return, from `1` to `500`. Defaults to `100`. schema: type: integer format: int32 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListQueueMessagesResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/queues/{destinationId}/messages/ack: post: operationId: NotificationsService_AckQueueMessages summary: Acknowledge queue messages description: Removes processed messages from a queue destination and returns how many were removed. parameters: - name: destinationId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AckQueueMessagesRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AckQueueMessagesResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/statuses: get: operationId: NotificationsService_ListStatuses summary: List delivery statuses description: Returns per-destination delivery records. Pass `requestId` to get every delivery of one alert. parameters: - name: requestId in: query description: Return every delivery of this alert. When set, the response ignores `fromDate`, `page`, and `pageSize`. schema: type: string - name: fromDate in: query description: Return only deliveries created at or after this RFC 3339 timestamp, such as `2026-10-01T00:00:00Z`. schema: type: string - name: page in: query description: The page to return, starting at `1`. Defaults to `1`. schema: type: integer format: int32 - name: pageSize in: query description: The number of delivery records per page. Defaults to `100`, which is also the maximum. schema: type: integer format: int32 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListStatusesResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/subscriptions/alerts: get: operationId: NotificationsService_ListAlertSubscriptions summary: List alert subscriptions description: Returns the alert subscriptions in the caller's organization, one entry per alert and destination pair. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListAlertSubscriptionsResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/subscriptions/alerts/categories/{category}/subscribe: post: operationId: NotificationsService_SubscribeToCategory summary: Subscribe to category description: Enables every alert in a category for one destination. parameters: - name: category in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SubscribeToCategoryRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SubscribeToCategoryResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/subscriptions/alerts/categories/{category}/unsubscribe: post: operationId: NotificationsService_UnsubscribeFromCategory summary: Unsubscribe from category description: Disables every alert in a category for one destination. parameters: - name: category in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UnsubscribeFromCategoryRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UnsubscribeFromCategoryResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService /v1/notifications/subscriptions/alerts/{alertName}: put: operationId: NotificationsService_UpsertAlertSubscription summary: Set alert subscription description: Turns delivery of one alert to one destination on or off, creating the subscription if it doesn't exist. parameters: - name: alertName in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpsertAlertSubscriptionRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UpsertAlertSubscriptionResponse' default: description: Default error response content: application/json: schema: $ref: '#/components/schemas/Status' tags: - NotificationsService components: schemas: AckQueueMessagesRequest: type: object properties: destinationId: description: The queue destination the messages belong to. type: string messageIds: description: Between 1 and 500 message IDs to acknowledge. type: array items: type: string required: - destinationId - messageIds AckQueueMessagesResponse: type: object properties: acked: description: The number of messages removed from the queue. type: integer format: int32 AlertSubscription: description: Whether one alert is delivered to one destination. type: object properties: id: description: The unique identifier for the subscription. type: string alertName: description: The alert's name in the alert catalog, for example `GPUWantsReset`. type: string category: description: The alert's category, for example `gpu`, `sunk`, `node`, `kubernetes`, `storage`, or `caios`. type: string displayName: description: The alert's human-readable name. type: string description: description: What the alert means. type: string severity: description: The alert's severity. type: string enabled: description: Whether the alert is delivered to the destination. type: boolean destinationId: description: The destination the subscription applies to. type: string channel: description: The destination's delivery channel. type: string destinationDisplayName: description: The destination's display name. type: string AlertSummary: description: One alert delivered to the `in_app` destination, with every channel it was delivered to. type: object properties: requestId: description: The unique identifier for the alert. Pass it to List delivery statuses for per-destination detail. type: string orgUid: description: The organization that received the alert. type: string templateId: description: The notification template used to render the message, `vm-alert` for alerts or `custom` for test notifications. type: string channels: description: Every channel the alert was delivered to. type: array items: type: string status: description: The status of the alert's `in_app` delivery. For other channels, use List delivery statuses. `DELIVERY_STATUS_STATE_UNSPECIFIED` means the status was never set. type: string format: enum enum: - DELIVERY_STATUS_STATE_UNSPECIFIED - DELIVERY_STATUS_STATE_PENDING - DELIVERY_STATUS_STATE_SENT - DELIVERY_STATUS_STATE_FAILED - DELIVERY_STATUS_STATE_RESOLVED severity: description: The alert's severity. type: string subject: description: The alert's subject line. type: string content: description: The rendered alert message. type: string createdAt: description: When the alert was first delivered, as an RFC 3339 timestamp. type: string updatedAt: description: When the alert was last updated, as an RFC 3339 timestamp. type: string CreateCredentialRequest: type: object properties: displayName: description: A human-readable name for the credential, 1 to 255 characters. type: string credentialType: description: The kind of secret. Use `webhook` for generic webhooks, `slack_webhook` for Slack incoming webhooks, and `google_chat` for Google Chat webhooks. The Cloud Console creates `slack_oauth` credentials through the Slack OAuth flow. type: string secret: description: The secret value. For `webhook`, a JSON-encoded string with a required HTTPS `url` and an optional `signing_secret`. For `slack_webhook`, a URL that starts with `https://hooks.slack.com/services/`. For `google_chat`, a URL that starts with `https://chat.googleapis.com/v1/spaces/`. type: string required: - displayName - credentialType - secret CreateCredentialResponse: type: object properties: credential: $ref: '#/components/schemas/Credential' CreateDestinationRequest: type: object properties: channel: description: The delivery channel, `webhook`, `slack_webhook`, `google_chat`, or `queue`. `webhook`, `slack_webhook`, and `google_chat` require `credentialId`. Create `slack` destinations with Join Slack channel. type: string displayName: description: A human-readable name for the destination, 1 to 255 characters. type: string credentialId: description: The ID of a credential from Create credential. Required for `webhook`, `slack_webhook`, and `google_chat`. type: string config: description: Channel-specific configuration as a JSON-encoded string. type: string required: - channel - displayName CreateDestinationResponse: type: object properties: destination: $ref: '#/components/schemas/Destination' Credential: description: An encrypted secret that a destination uses to deliver alerts. The API never returns the secret value. type: object properties: id: description: The unique identifier for the credential. type: string orgUid: description: The organization that owns the credential. type: string displayName: description: A human-readable name for the credential. type: string credentialType: description: The kind of secret, such as `webhook`, `slack_webhook`, `google_chat`, or `slack_oauth`. type: string status: description: '`active` or `revoked`.' type: string createdAt: description: The time the credential was created. type: string format: date-time DeleteCredentialResponse: type: object properties: {} DeleteDestinationResponse: type: object properties: {} DeliveryStatus: description: One delivery of one alert to one destination. type: object properties: id: description: The unique identifier for the delivery record. type: string requestId: description: The alert this delivery belongs to. type: string orgUid: description: The organization that received the alert. type: string templateId: description: The notification template used to render the message, `vm-alert` for alerts or `custom` for test notifications. type: string channel: description: The channel the alert was delivered on. type: string status: description: The delivery state. `DELIVERY_STATUS_STATE_UNSPECIFIED` means the status was never set. type: string format: enum enum: - DELIVERY_STATUS_STATE_UNSPECIFIED - DELIVERY_STATUS_STATE_PENDING - DELIVERY_STATUS_STATE_SENT - DELIVERY_STATUS_STATE_FAILED - DELIVERY_STATUS_STATE_RESOLVED createdAt: description: When the delivery was created, as an RFC 3339 timestamp. type: string updatedAt: description: When the delivery was last updated, as an RFC 3339 timestamp. type: string severity: description: The alert's severity. type: string subject: description: The alert's subject line. type: string content: description: The rendered alert message. type: string destinationId: description: The destination the alert was delivered to. type: string messageHash: type: string externalId: type: string parentId: type: string destinationDisplayName: description: The destination's display name at the time of delivery. type: string Destination: description: A place CoreWeave Alerts delivers to. type: object properties: id: description: The unique identifier for the destination. type: string orgUid: description: The organization that owns the destination. type: string channel: description: The delivery channel, such as `webhook`, `slack`, `slack_webhook`, `google_chat`, `queue`, or `in_app`. type: string displayName: description: A human-readable name for the destination. type: string credentialId: description: The credential that holds the destination's secret URL or token, if the channel uses one. type: string config: description: Channel-specific configuration as a JSON-encoded string. Slack destinations use `{"channelId":"..."}`. Empty for channels that need no configuration. type: string credentialType: description: The type of the referenced credential, if any. type: string credentialStatus: description: The status of the referenced credential, `active` or `revoked`, if any. type: string createdAt: description: The time the destination was created. type: string format: date-time updatedAt: description: The time the destination was last updated. type: string format: date-time GoogleProtobufAny: description: Contains an arbitrary serialized message along with a @type that describes the type of the serialized message. type: object properties: '@type': description: The type of the serialized message. type: string additionalProperties: true InviteToSlackChannelRequest: type: object properties: channelId: description: The Slack channel ID from List Slack channels. type: string displayName: description: A display name for the Slack destination. type: string InviteToSlackChannelResponse: type: object properties: destinationId: description: The ID of the Slack destination for the channel. type: string ListAlertSubscriptionsResponse: type: object properties: subscriptions: type: array items: $ref: '#/components/schemas/AlertSubscription' ListAlertsResponse: type: object properties: alerts: type: array items: $ref: '#/components/schemas/AlertSummary' page: description: The page returned. type: integer format: int32 pageSize: description: The page size used, at most 100. type: integer format: int32 hasNextPage: description: Whether another page of results exists. type: boolean ListCredentialsResponse: type: object properties: credentials: type: array items: $ref: '#/components/schemas/Credential' ListDestinationsResponse: type: object properties: destinations: type: array items: $ref: '#/components/schemas/Destination' ListQueueMessagesResponse: type: object properties: messages: type: array items: $ref: '#/components/schemas/QueueMessage' ListSlackChannelsResponse: type: object properties: channels: type: array items: $ref: '#/components/schemas/SlackChannel' ListStatusesResponse: type: object properties: statuses: type: array items: $ref: '#/components/schemas/DeliveryStatus' page: description: The page returned. Zero when the request filtered by `requestId`. type: integer format: int32 pageSize: description: The page size used, at most 100. Zero when the request filtered by `requestId`. type: integer format: int32 hasNextPage: description: Whether another page of results exists. type: boolean QueueMessage: description: An alert waiting in a queue destination. type: object properties: id: description: The unique identifier for the message. Pass it to Acknowledge queue messages. type: string createdAt: description: When the message was queued. type: string format: date-time payload: description: The alert, with the same `subject` and `body` fields, and optional `data` field, as a webhook delivery. type: object requestId: description: The alert this message belongs to. Matches `requestId` in delivery statuses and alerts. type: string SlackChannel: type: object properties: id: description: The Slack channel ID. type: string name: description: The Slack channel name. type: string isArchived: description: Whether the channel is archived. type: boolean isMember: description: Whether the CoreWeave Mission Control app is already in the channel. type: boolean numMembers: description: The number of members in the channel. type: integer format: int32 Status: description: The error returned when a request fails. type: object properties: code: description: The numeric gRPC status code. type: integer format: int32 message: description: A developer-facing error message. type: string details: description: Additional error details. type: array items: $ref: '#/components/schemas/GoogleProtobufAny' SubscribeToCategoryRequest: type: object properties: category: description: The alert category, for example `gpu`. type: string destinationId: description: The destination to enable every alert in the category for. type: string required: - category - destinationId SubscribeToCategoryResponse: type: object properties: {} TestDestinationRequest: type: object properties: destId: type: string required: - destId TestDestinationResponse: type: object properties: eventId: description: The ID of the test notification. type: string delivered: description: Whether the test notification was delivered. type: boolean error: description: The delivery error when `delivered` is `false`. type: string UnsubscribeFromCategoryRequest: type: object properties: category: description: The alert category, for example `gpu`. type: string destinationId: description: The destination to disable every alert in the category for. type: string required: - category - destinationId UnsubscribeFromCategoryResponse: type: object properties: {} UpdateCredentialStatusRequest: type: object properties: id: description: The ID of the credential to update. type: string status: description: '`active` or `revoked`.' type: string required: - id - status UpdateCredentialStatusResponse: type: object properties: credential: $ref: '#/components/schemas/Credential' UpdateDestinationRequest: type: object properties: id: description: The ID of the destination to update. type: string displayName: description: A new display name, up to 255 characters. Empty keeps the current name. type: string credentialId: description: The ID of a replacement credential. Omit it to keep the current credential. type: string config: description: Replacement channel configuration as a JSON-encoded string. Empty keeps the current config. type: string required: - id UpdateDestinationResponse: type: object properties: destination: $ref: '#/components/schemas/Destination' UpsertAlertSubscriptionRequest: type: object properties: alertName: description: The alert's name in the alert catalog. type: string destinationId: description: The destination to turn delivery on or off for. type: string enabled: description: '`true` to deliver the alert to the destination, `false` to stop.' type: boolean required: - alertName - destinationId - enabled UpsertAlertSubscriptionResponse: type: object properties: {} securitySchemes: bearerAuth: type: http scheme: bearer description: CoreWeave API access token sent as a bearer token. x-default: Bearer [API-ACCESS-TOKEN] tags: - name: IntegrationsService description: List and join Slack channels through your organization's Slack OAuth integration. x-group: IntegrationsService - name: NotificationsService description: Manage destinations, credentials, and alert subscriptions, read delivery history, and pull alerts from queue destinations. x-group: NotificationsService security: - bearerAuth: [] ``` # Join Slack channel Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/integrationsservice/join-slack-channel /openapi/notifications/openapi.yaml post /v1/notifications/integrations/slack-channels/invite Add the CoreWeave Mission Control app to a Slack channel and get its destination ID. Requires the **Alerts Admin** role and an active Slack OAuth integration. Pass a channel `id` from [List Slack channels](/platform/coreweave-alerts/alerts-api/integrationsservice/list-slack-channels). The response returns the `destinationId` of the Slack destination for that channel, creating it if needed. To start delivery, subscribe alerts to that destination. ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/integrations/slack-channels/invite \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"channelId": "C0123456789", "displayName": "#gpu-alerts"}' ``` # List Slack channels Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/integrationsservice/list-slack-channels /openapi/notifications/openapi.yaml get /v1/notifications/integrations/slack-channels List the Slack channels CoreWeave Alerts can deliver to. Requires the **Alerts Viewer** role and an active Slack OAuth integration. In the Cloud Console, set up the integration first. For details, see [Slack OAuth integration](/platform/coreweave-alerts/slack-oauth). Without an active integration, the request fails with `NOT_FOUND`. ```bash title="Example request" theme={"system"} curl https://api.coreweave.com/v1/notifications/integrations/slack-channels \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # Acknowledge queue messages Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/acknowledge-queue-messages /openapi/notifications/openapi.yaml post /v1/notifications/queues/{destinationId}/messages/ack Remove processed CoreWeave Alerts from a queue destination. Requires the **Alerts Admin** role. Send between 1 and 500 message IDs from [List queue messages](/platform/coreweave-alerts/alerts-api/notificationsservice/list-queue-messages). The request skips IDs that were already acknowledged or that expired, so `acked` can be lower than the number of IDs you sent. ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/queues/[DESTINATION-ID]/messages/ack \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"messageIds": ["[MESSAGE-ID]"]}' ``` # Create credential Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/create-credential /openapi/notifications/openapi.yaml post /v1/notifications/credentials Store an encrypted secret for a CoreWeave Alerts destination. Requires the **Alerts Admin** role. CoreWeave encrypts the `secret` and never returns it. The format of `secret` depends on `credentialType`. For the formats, see [Destination channels and credentials](/platform/coreweave-alerts/alerts-api#destination-channels-and-credentials). ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/credentials \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{ "displayName": "Ops webhook", "credentialType": "webhook", "secret": "{\"url\": \"https://alerts.example.com/coreweave\", \"signing_secret\": \"[SIGNING-SECRET]\"}" }' ``` # Create destination Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/create-destination /openapi/notifications/openapi.yaml post /v1/notifications/destinations Create a CoreWeave Alerts destination. Requires the **Alerts Admin** role. The `webhook`, `slack_webhook`, and `google_chat` channels deliver to a URL held in a credential, so create the credential first with [Create credential](/platform/coreweave-alerts/alerts-api/notificationsservice/create-credential) and pass its `id` as `credentialId`. A `queue` destination needs no credential or config. For the format each channel expects, see [Destination channels and credentials](/platform/coreweave-alerts/alerts-api#destination-channels-and-credentials). A new destination receives no alerts until you subscribe alerts to it. ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/destinations \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{ "channel": "webhook", "displayName": "Ops webhook", "credentialId": "[CREDENTIAL-ID]" }' ``` # Delete credential Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/delete-credential /openapi/notifications/openapi.yaml delete /v1/notifications/credentials/{id} Delete a CoreWeave Alerts credential. Requires the **Alerts Admin** role. Delete every destination that uses the credential first. While a destination references the credential, the request fails with `FAILED_PRECONDITION`. ```bash title="Example request" theme={"system"} curl -X DELETE https://api.coreweave.com/v1/notifications/credentials/[CREDENTIAL-ID] \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # Delete destination Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/delete-destination /openapi/notifications/openapi.yaml delete /v1/notifications/destinations/{id} Delete a CoreWeave Alerts destination. Requires the **Alerts Admin** role. Unsubscribe every alert from the destination before you delete it. While a subscription references the destination, the request fails with `FAILED_PRECONDITION`. > [!WARNING] > > Deleting a queue destination permanently deletes every message in its queue, including > messages you haven't acknowledged. Pull and acknowledge the remaining messages first. ```bash title="Example request" theme={"system"} curl -X DELETE https://api.coreweave.com/v1/notifications/destinations/[DESTINATION-ID] \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # List alert subscriptions Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/list-alert-subscriptions /openapi/notifications/openapi.yaml get /v1/notifications/subscriptions/alerts List which CoreWeave Alerts each destination receives. Requires the **Alerts Viewer** role. Each entry pairs one alert with one destination and includes the alert's `category`, `severity`, and `description`. Use the `alertName` and `category` values from this response in the other alert subscription endpoints. ```bash title="Example request" theme={"system"} curl https://api.coreweave.com/v1/notifications/subscriptions/alerts \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # List alerts Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/list-alerts /openapi/notifications/openapi.yaml get /v1/notifications/alerts List the CoreWeave Alerts your organization received. Requires the **Alerts Viewer** role. This endpoint returns the data behind the Cloud Console [Alert history](https://console.coreweave.com/account/alerts) page. Each entry is one alert, identified by `requestId`. Only alerts delivered to the `in_app` destination appear. An alert that went only to other destinations isn't listed. To see per-destination delivery for an alert, pass its `requestId` to [List delivery statuses](/platform/coreweave-alerts/alerts-api/notificationsservice/list-delivery-statuses). Pass `fromDate` as an RFC 3339 timestamp. Results are paginated. For details, see [Pagination](/platform/coreweave-alerts/alerts-api#pagination). ```bash title="Example request" theme={"system"} curl "https://api.coreweave.com/v1/notifications/alerts?fromDate=2026-10-01T00:00:00Z&pageSize=50" \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # List credentials Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/list-credentials /openapi/notifications/openapi.yaml get /v1/notifications/credentials List the credentials that CoreWeave Alerts destinations use. Requires the **Alerts Viewer** role. The response never includes the secret value of a credential. ```bash title="Example request" theme={"system"} curl https://api.coreweave.com/v1/notifications/credentials \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # List delivery statuses Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/list-delivery-statuses /openapi/notifications/openapi.yaml get /v1/notifications/statuses Get per-destination delivery status for CoreWeave Alerts. Requires the **Alerts Viewer** role. Each record is one delivery of one alert to one destination. When you pass `requestId`, the response returns every delivery of that alert and ignores the pagination parameters. Otherwise, the response is paginated and filtered by `fromDate`, an RFC 3339 timestamp. ```bash title="Example request" theme={"system"} curl "https://api.coreweave.com/v1/notifications/statuses?requestId=[REQUEST-ID]" \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # List destinations Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/list-destinations /openapi/notifications/openapi.yaml get /v1/notifications/destinations List every CoreWeave Alerts destination in your organization. Requires the **Alerts Viewer** role. For details, see the [CoreWeave Alerts API overview](/platform/coreweave-alerts/alerts-api). Use the `id` of a destination in the response when you subscribe alerts to it. ```bash title="Example request" theme={"system"} curl https://api.coreweave.com/v1/notifications/destinations \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # List queue messages Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/list-queue-messages /openapi/notifications/openapi.yaml get /v1/notifications/queues/{destinationId}/messages Pull CoreWeave Alerts from a queue destination. Requires the **Alerts Viewer** role. A queue destination holds alerts until you acknowledge them. Listing doesn't remove messages, so call [Acknowledge queue messages](/platform/coreweave-alerts/alerts-api/notificationsservice/acknowledge-queue-messages) after you process them. For polling limits and retention, see [Queue delivery](/platform/coreweave-alerts/alerts-api#queue-delivery). ```bash title="Example request" theme={"system"} curl "https://api.coreweave.com/v1/notifications/queues/[DESTINATION-ID]/messages?limit=100" \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" ``` # Set alert subscription Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/set-alert-subscription /openapi/notifications/openapi.yaml put /v1/notifications/subscriptions/alerts/{alertName} Turn delivery of one CoreWeave alert to one destination on or off. Requires the **Alerts Admin** role. To stop delivery without removing the subscription, set `enabled` to `false`. If `alertName` isn't in the alert catalog, the request fails with `NOT_FOUND`. ```bash title="Example request" theme={"system"} curl -X PUT https://api.coreweave.com/v1/notifications/subscriptions/alerts/GPUWantsReset \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"destinationId": "[DESTINATION-ID]", "enabled": true}' ``` # Subscribe to category Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/subscribe-to-category /openapi/notifications/openapi.yaml post /v1/notifications/subscriptions/alerts/categories/{category}/subscribe Send every CoreWeave alert in a category to a destination. Requires the **Alerts Admin** role. This endpoint matches **Configure all** on the Cloud Console [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page. Category values are lowercase, for example `gpu`, `sunk`, or `storage`. ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/subscriptions/alerts/categories/gpu/subscribe \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"destinationId": "[DESTINATION-ID]"}' ``` # Test destination Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/test-destination /openapi/notifications/openapi.yaml post /v1/notifications/destinations/{destId}/test Send a test notification to a CoreWeave Alerts destination. Requires the **Alerts Admin** role. The test notification has the subject `Test Notification`. A test of a `queue` destination adds a message to the queue, and a test of the `in_app` destination adds an entry to the Cloud Console Alert history page. The response returns `delivered: true` on success, or `delivered: false` with the delivery error in `error`. If the destination's credential is revoked, the request fails with `FAILED_PRECONDITION`. ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/destinations/[DESTINATION-ID]/test \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{}' ``` # Unsubscribe from category Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/unsubscribe-from-category /openapi/notifications/openapi.yaml post /v1/notifications/subscriptions/alerts/categories/{category}/unsubscribe Stop sending every CoreWeave alert in a category to a destination. Requires the **Alerts Admin** role. This endpoint matches clearing a destination in **Configure all** on the Cloud Console [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page. Category values are lowercase, for example `gpu`, `sunk`, or `storage`. ```bash title="Example request" theme={"system"} curl -X POST https://api.coreweave.com/v1/notifications/subscriptions/alerts/categories/gpu/unsubscribe \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"destinationId": "[DESTINATION-ID]"}' ``` # Update credential status Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/update-credential-status /openapi/notifications/openapi.yaml put /v1/notifications/credentials/{id}/status Revoke or reactivate a CoreWeave Alerts credential. Requires the **Alerts Admin** role. Revoking a credential stops delivery to every destination that uses it until you set the credential back to `active`. ```bash title="Example request" theme={"system"} curl -X PUT https://api.coreweave.com/v1/notifications/credentials/[CREDENTIAL-ID]/status \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"status": "revoked"}' ``` # Update destination Source: https://docs.coreweave.com/platform/coreweave-alerts/alerts-api/notificationsservice/update-destination /openapi/notifications/openapi.yaml put /v1/notifications/destinations/{id} Change the display name, credential, or config of a CoreWeave Alerts destination. Requires the **Alerts Admin** role. Send only the fields you want to change. An empty `displayName` or `config` keeps the current value. Omit `credentialId` to keep the current credential. An empty `credentialId` fails with `INVALID_ARGUMENT`. The channel of a destination can't change. To switch channels, create a new destination and delete the old one. ```bash title="Example request" theme={"system"} curl -X PUT https://api.coreweave.com/v1/notifications/destinations/[DESTINATION-ID] \ -H "Authorization: Bearer [API-ACCESS-TOKEN]" \ -H "Content-Type: application/json" \ -d '{"displayName": "Ops webhook (primary)"}' ``` # Slack OAuth integration Source: https://docs.coreweave.com/platform/coreweave-alerts/slack-oauth Connect CoreWeave Alerts to your Enterprise Slack workspace using the OAuth authorization flow This guide walks Enterprise Slack users through connecting the CoreWeave Mission Control app to a Slack workspace using the OAuth authorization flow. The Slack OAuth integration lets your team receive real-time alerts about clusters, deployments, and operations. Because the app is in a pre-marketplace state, Enterprise users follow a specific manual authorization flow. ## Prerequisites * The **Integrations Admin** IAM role, assigned through an [IAM Access Policy](/security/iam/access-policies/manage). * A Slack Enterprise workspace. A Slack workspace admin must be available to approve the CoreWeave Mission Control app installation request. ## Phase 1: Install and authorize the app In this phase, you submit an installation request that prompts your Slack workspace admin to approve the CoreWeave Mission Control app. Because the app isn't yet on the Slack Marketplace, this manual approval is required before you can authorize the connection. 1. Log in to the [CoreWeave Cloud Console](https://console.coreweave.com). 2. From the left navigation menu, select **Administration** > **Integrations**, or go directly to the [Integrations](https://console.coreweave.com/organization/integrations) page. 3. Locate the **Slack** section. 4. In the upper right corner, click the **Create Slack** button. A right-side panel opens, prompting you to select the type of Slack integration you want to create. Select the **Slack OAuth** button. 5. Click the **Start Slack authorization** button. A browser window opens prompting you to authorize the CoreWeave Mission Control app and allow it the following permissions: * View content and info about channels and conversations * Perform actions in channels and conversations Because CoreWeave Mission Control isn't yet listed in the Slack Marketplace, it requires manual approval from your Slack workspace admin before installation. 1. In the Slack workspace selection dropdown, select your Enterprise workspace. 2. Enter a message for your Slack Administrator (such as "Requesting CoreWeave Mission Control for the #devops-alerts channel"). 3. In the bottom right corner, click the **Submit Request** button. Wait for your Slack workspace admin to approve the CoreWeave Mission Control app. ### Approval process The Slack workspace admin completes the steps in this section, not the requester. The Slack workspace admin receives an alert from Slackbot for the request. The CoreWeave Mission Control app requests the following permissions: * `channels:read` to view basic information about public channels in a workspace. * `groups:read` to view basic information about private channels that `@CoreWeave Mission Control` is added to. * `chat:write` to send messages as `@CoreWeave Mission Control`. To approve the request, the Slack workspace admin must complete the following steps: 1. Click the **Review and Approve for Workspace** button. 2. In the popup dialog, review the request and click **Approve**. ### Allow the application connection After your Slack workspace admin approves the request, you receive a notification from **Slackbot** that the request was approved. > [!NOTE] > > This notification has a link and button directing you to the Slack Marketplace to install the app. > > **Skip clicking this link** because it results in a `404: There's been a glitch` page. This is expected, because the CoreWeave Mission Control app isn't yet listed in the Slack Marketplace. Now, restart the connection process a second time: 1. Open the **CoreWeave Cloud Console**. 2. Click the **Create Slack** button. A right-side panel opens, prompting you to select the type of Slack integration you want to create. Select the **Slack OAuth** button. 3. Click the **Start Slack authorization** button. A browser window opens for you to allow the application. Although the dialog looks the same as the first one, this time it prompts you to allow the application to connect to your Slack workspace. 4. Select your Enterprise workspace in the dropdown menu. 5. Review the requested app permissions. 6. Click **Allow**. After authorizing, your browser redirects back to the CoreWeave Cloud Console Integrations page. You know this step was successful if you see two buttons: **Remove CoreWeave Mission Control from your workspace** and **Create Slack integration**. With the app installed and authorized, you can now configure the specific Slack channel that receives CoreWeave Alerts. ## Phase 2: Configure the channel To create a Slack integration, first obtain the Slack channel ID for the channel you want to use for CoreWeave Alerts, and then enter the channel ID into the CoreWeave Cloud Console to configure the integration. ### Obtain the Slack channel ID Find the channel ID for the Slack channel you want to use for CoreWeave Alerts. To find the ID: 1. Open Slack and open the **Channel Details** for the target channel. You can find this in two ways: * From the channel page: click the vertical three-dot menu icon in the upper right corner of the channel and select **Open channel details**: ![Open channel details menu in Slack](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/platform/coreweave-alerts/_media/open-channel-details.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=606d3d17ddfa672c9add55a702d80a31) * From the channel list: hover over the channel name, right click, and select **View channel details**: ![View channel details menu in Slack](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/platform/coreweave-alerts/_media/view-channel-details.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=aa21c9c61a75c75b12cc6888abe26d0d) 2. The **Channel Details** page displays as a popup panel. Scroll to the bottom and copy the **Channel ID** (for example, `C01234ABCDE`): ![Copy channel ID in Slack](https://mintcdn.com/coreweave-dbfa0e8d/PdmoozL7fT8Luz34/platform/coreweave-alerts/_media/slack-channel-id.png?fit=max\&auto=format\&n=PdmoozL7fT8Luz34\&q=85\&s=db157ea5139b5fd67620cf95e26b6440) You need this channel ID in the next step to complete the Slack integration configuration. ### Complete the Slack integration configuration Go back to the CoreWeave Cloud Console Integrations page. 1. In the Slack section of the Integrations page, click the **Create Slack** button. A right-side panel opens, prompting you to select the type of Slack integration you want to create. Select the **Slack OAuth** button. 2. In the **Display Name** field, enter a recognizable name (for example, `Cluster-Notifications`). 3. In the **Slack Channel ID** field, enter the channel ID you copied in the previous step. 4. Click the **Create** button. The right-side panel closes, bringing you back to the Cloud Console Integrations page, which displays a success message briefly in the bottom right corner. The new Slack integration is now listed in the Slack section of the Integrations page. ## Phase 3: Activate the bot In this phase, you add the CoreWeave Mission Control bot to your target Slack channel so it can post alerts. The bot can't post until it's a member of the channel, and testing and verifying notifications fail until you complete this step. 1. Go back to Slack and navigate to the Slack channel you used in Phase 2. 2. In the message box, type `@CoreWeave Mission Control` and press **Enter**. 3. When prompted, click the **Add to Channel** button. ## Phase 4: Test and verify the integration In this final phase, you confirm that the integration works end-to-end by sending a test notification and verifying it arrives in Slack and in your alert history. 1. Go back to the CoreWeave Cloud Console Integrations page and find your Slack integration in the list. 2. Click **Send test**. In the lower right corner of the Cloud Console, a success message appears confirming that the test notification was sent. 3. In Slack, verify that the `Test Notification` message appears in your Slack channel. 4. Open the [Alert history](https://console.coreweave.com/account/alerts) page. Confirm that the test alert appears with the correct subject, a **Delivered** status, the **Slack OAuth** integration type, and a recent timestamp. ## Remove CoreWeave Mission Control This section describes how to disconnect a single Slack channel from CoreWeave Alerts or remove the CoreWeave Mission Control app from your workspace entirely. ### Disconnect a specific channel 1. Navigate to the Cloud Console [Integrations](https://console.coreweave.com/organization/integrations) page. 2. Locate the channel integration under the Slack section. 3. Click the **Delete** button next to the specific integration. ### Completely remove the app To remove the app from the CoreWeave Cloud Console: * In the CoreWeave Cloud Console, click the **Remove CoreWeave Mission Control from your workspace** button (located in the top-right of the Slack integration section). Alternatively, to remove the app from Slack: 1. In Slack, navigate to **Settings & Administration** > **Manage Apps**. 2. Find **CoreWeave Mission Control**, go to the **Configuration** tab, and select **Remove App**. ## Troubleshooting summary | Step | Issue | Resolution | | :- | :- | :- | | **Access** | Integrations page shows a permissions error. | Assign the Integrations Admin role using an [IAM Access Policy](/security/iam/access-policies/manage). | | **Authorization** | `404` page after admin approval. | Return to the CoreWeave Console and click **Create Slack** > **Slack OAuth** > **Start Slack authorization** again. | | **Testing** | `Test notification failed` (`slack_post_failed`). | Manually invite `@CoreWeave Mission Control` to the channel. | | **Testing** | No message received. | Verify the **Channel ID** matches the ID in the **About** section of your Slack channel. | # Webhook integrations Source: https://docs.coreweave.com/platform/coreweave-alerts/webhooks Connect CoreWeave Alerts to Slack or any HTTPS endpoint using a webhook URL CoreWeave Alerts supports two webhook-based integration types: a Slack webhook integration that sends alerts directly to a Slack channel, and a generic webhook integration that sends alerts to any HTTPS endpoint. After you connect an integration, you can subscribe alerts to these destinations on the [Alert configuration](https://console.coreweave.com/account/alerts/configuration) page. ## Slack webhook integration As an alternative to the [OAuth flow](/platform/coreweave-alerts/slack-oauth), you can connect CoreWeave Alerts to Slack using an incoming webhook URL. ### Prerequisites To complete this integration, you need the following: * The **Integrations Admin** IAM role, assigned through an [IAM Access Policy](/security/iam/access-policies/manage). * A Slack incoming webhook URL. To create one, follow Slack's [Sending messages using incoming webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks/) guide. ### Create a Slack webhook integration 1. Log in to the [CoreWeave Cloud Console](https://console.coreweave.com). 2. From the left navigation menu, select **Administration** > **Integrations**, or go directly to the [Integrations](https://console.coreweave.com/organization/integrations) page. 3. In the **Slack** section, click **Create Slack**. 4. Select the **Slack webhook** button. 5. In the **Display name** field, enter a recognizable name (for example, `Cluster-Alerts-Webhook`). 6. In the **Slack Webhook URL** field, enter your Slack incoming webhook URL. The URL must begin with `https://hooks.slack.com/services/`. 7. Click **Create integration**. ### Test the Slack webhook integration 1. On the Cloud Console [Integrations](https://console.coreweave.com/organization/integrations) page, find the Slack webhook integration you created. 2. Locate the vertical ellipsis icon on the right side of the integration row. Expand the menu and click **Send test**. A success message appears in the lower right corner of the Cloud Console. 3. In Slack, verify that the test notification message appears in your channel. 4. Open the [Alert history](https://console.coreweave.com/account/alerts) page. Confirm that the test alert appears with the correct subject, a **Delivered** status, the **Slack webhook** integration type, and a timestamp. ## Generic webhook integration You can send CoreWeave Alerts to any HTTPS endpoint using a generic webhook integration. Use this integration to connect to third-party tools, custom dashboards, or internal services. ### Prerequisites To complete this integration, you need the following: * The **Integrations Admin** IAM role, assigned through an [IAM Access Policy](/security/iam/access-policies/manage). ### Create a generic webhook integration 1. Log in to the [CoreWeave Cloud Console](https://console.coreweave.com). 2. From the left navigation menu, select **Administration** > **Integrations**, or go directly to the [Integrations](https://console.coreweave.com/organization/integrations) page. 3. In the **Webhook** section, click **Create webhook**. 4. In the **Display name** field, enter a recognizable name. 5. In the **Webhook URL** field, enter your HTTPS endpoint URL. 6. Optional: To create a signing secret, click **Generate signing secret**. CoreWeave includes this secret in the `X-CoreWeave-Signature` header with each request so your endpoint can verify the payload authenticity. Click **Download** to save the secret, and store it securely. You can't view the secret again after you create the integration. 7. Click **Create integration**. ### Webhook payload format Generic webhook destinations receive a `POST` request with `Content-Type: application/json`. The body has two fields: | Field | Description | | :- | :- | | `subject` | The alert name. Use this to route or summarize alerts on the receiving end. | | `body` | The rendered alert message, which includes status (Firing or Resolved), description, and affected resources (node, cluster, zone). | Example payload: ```json theme={"system"} { "body": "GPUWantsReset Status: Firing GPU Recovery Action Changed (Xid 154) indicates the GPU encountered an issue requiring a reset, the detailed reason can be found in related alerts. The node will be restarted when current workloads finish. Affected: node: MyNode01 · cluster: MyCluster09 · zone: ZONE-A1", "subject": "GPUWantsReset" } ``` ### Test the generic webhook integration 1. On the Cloud Console [Integrations](https://console.coreweave.com/organization/integrations) page, find the generic webhook integration you created. 2. Locate the vertical ellipsis icon on the right side of the integration row. Expand the menu and click **Send test**. A success message appears in the lower right corner of the Cloud Console. 3. Verify that your endpoint received the test payload. 4. Open the [Alert history](https://console.coreweave.com/account/alerts) page. Confirm that the test alert appears with the correct subject, a **Delivered** status, the **Webhook** integration type, and a timestamp. ### Verify webhook signatures If you configured a signing secret, CoreWeave sends an `X-CoreWeave-Signature` header with each webhook request. Use this header to verify that incoming requests are authentic. # Hardware observability Source: https://docs.coreweave.com/platform/fleet-management/hardware-observability GPU chip telemetry, server-level IPMI metrics, and storage performance metrics available in CKS CoreWeave Kubernetes Service (CKS) provides hardware transparency and observability with built-in telemetry. Hardware observability is available immediately on deployment and requires no setup or configuration. CKS includes the following hardware observability features: * **Managed telemetry platform**: CoreWeave manages a high-performance platform for ingesting, storing, and exposing telemetry data. * **Purpose-built dashboards**: CoreWeave provides curated dashboards that offer insights and draw on CoreWeave expertise in managing large GPU supercomputing fleets. * **No additional cost**: All observability features are included for CKS customers at no additional charge. ## Hardware telemetry layers The following sections describe the telemetry available across different layers of the hardware stack. ### GPU chip telemetry CKS provides chip-level metrics through NVIDIA's Data Center GPU Management (DCGM) tool, which is pre-installed on all servers. You can query these metrics through the CoreWeave metrics query service or view them in the [Node Details dashboard](https://cks-grafana.coreweave.com/d/ddbdicm9sw7c5x/node-details). These metrics help identify failures, performance issues, and power inefficiencies. Use them to optimize job performance and resource utilization. CoreWeave provides pre-configured alerts for critical thresholds. ### Server telemetry CKS offers transparency at the physical server level, providing metrics and statuses for the entire server. | Category | Details | | - | - | | **IPMI Metrics** |
  • Electrical current
  • Power
  • Power consumption (server-wide)
  • Voltage
  • Temperature
  • Fan speed
  • Fan speed ratio
  • System Event Log (SEL) free space
  • System Event Log (SEL) log count
| | **IPMI Statuses** |
  • Chassis power state
  • Electrical current sensor state
  • Fan speed sensor state
  • Power sensor state
  • Cable/interconnect VGA cable presence
  • Power supply status
  • Serial cable status
  • PCIe slot critical interrupt
  • Physical security intrusion
  • Fan redundancy state
  • CMOS battery state
  • Temperature sensor state
  • Voltage sensor state
| | **Node Problem and Lifecycle Conditions** | A set of conditions from kernel logs and temperature metrics that offer insight into node problems and lifecycle stages. Examples include `SlurmCordon`, `KernelDeadlock`, `InfiniBandLinkFault`, `GPUFallenOffBus`, and `DNSFailure`. | | **Storage Performance Metrics** |
  • Read Bandwidth
  • Write Bandwidth
  • Average Request Time by Operation
  • Queue Time by Operation and VIP
  • Timeouts by Operation
  • Average Response Time by Operation
  • Transmissions
  • Retransmissions
  • Mean Queue Time by Mount Address
| | **InfiniBand Interface Metrics** |
  • `node_infiniband_port_data_received_bytes_total`
  • `node_infiniband_port_data_transmitted_bytes_total`
  • `node_infiniband_port_transmit_wait_total`
  • `node_infiniband_rate_bytes_per_second`
| ### HPC Verification telemetry CoreWeave's HPC Verification helps maintain high performance under sustained compute loads. HPC Verification raises alerts for failure conditions such as the following: * `NodeVerificationFailure` * `NodeVerificationFailureDCGMBadMemory` * `NodeVerificationFailureGPUBlazeTLimit` * `NodeVerificationFailureGPUBlazeThrottling` * `NodeVerificationFailureGPUBurn` * `NodeVerificationFailureGPUBurnTLimit` * `NodeVerificationFailureMemBW` * `NodeVerificationFailureNVFabric` * `NodeVerificationFailureNVLink` * `NodeVerificationFailureNonDeterminism` * `NodeVerificationIncomplete` * `NodeVerificationSRAMThresholdExceeded` Log telemetry from all HPC Verification tests is also available to help you troubleshoot workload performance issues. Together, these tools help you optimize applications, diagnose issues, and improve resource utilization on CKS. # HPC Verification Source: https://docs.coreweave.com/platform/fleet-management/hpc-verification Proactive tests that check idle Nodes for silent data corruption and performance regressions HPC Verification is a proactive, on-Node testing framework that validates hardware and driver integrity beyond what passive monitoring can detect. This system runs automatically on idle compute Nodes to catch and fix issues such as silent data corruption, performance regressions, and thermal deficiencies before they affect customer workloads. HPC Verification is a fleet-wide safeguard that underpins the CoreWeave SLA by ensuring your AI workloads run on reliable infrastructure. This test identifies hardware or driver issues that passive monitoring alone can't detect. It includes checks for: * **Silent data corruption**: Detects memory errors that do not trigger standard system alerts. * **Numerical performance regression**: Benchmarks common deep-learning kernels (FP8, FP16, BF16) to detect slowdowns. * **Thermal deficiencies**: Runs all streaming multiprocessors at 100% load for approximately 20 minutes to uncover thermal issues. These active tests complement CoreWeave's passive telemetry collection by identifying and remediating issues before they affect customer workloads. They are a key part of CoreWeave's infrastructure lifecycle management, helping maintain reliability and performance for your AI workloads. Because they run only on idle Nodes and stop as soon as a customer workload is scheduled, they don't interfere with your jobs. Third-party schedulers, Pods pinned to a Node with `.spec.nodeName`, and work started outside Slurm on SUNK clusters are exceptions. See [Test schedule](#test-schedule), [Why is my Pod stuck in pending on CKS?](/support/cks/articles/why-is-my-pod-stuck-in-pending), and [Preemption on SUNK clusters](#preemption-on-sunk-clusters). A transient `hpc-verification` Pod in your cluster is a test that ran on an idle Node or was preempted to make way for your job. HPC Verification is separate from Node Health Check (NHC). SUNK runs [Node Health Check (NHC)](https://github.com/mej/nhc) as one of the scripts in the Epilog chain after a job, and only when no other job is still running on the node. A failed check drains the node with a reason that begins with `NHC:`. A passing HPC Verification test is what returns a node whose drain reason carries `sunk:verify-undrain` to service. See [Node Health Check (NHC) drains](/products/sunk/manage_sunk/drain-and-undrain-nodes#node-health-check-nhc-drains). ## Test schedule At the top of each hour, if a Node is idle, meaning no customer Pod holds any of its GPUs, CoreWeave runs a 20- to 30-minute verification test. This rule is narrower than the [idle status](/products/cks/nodes/nodes-and-node-pools#idle-nodes) CKS uses for maintenance, which also counts Pods that don't hold GPUs. This test uses all GPUs and available InfiniBand resources to exercise the hardware uniformly without interrupting your jobs. The `hpc-verification` Pods run at a low Kubernetes priority class to allow preemption and avoid blocking customer workloads. If the Node is not idle, CoreWeave skips the test and retries at the next hour mark. Third-party schedulers don't preempt verification Pods by default, because those Pods are placed by the `default-scheduler`. Respecting Kubernetes PriorityClasses isn't sufficient on its own. If you run a third-party scheduler such as Volcano or the KAI Scheduler, see [Custom schedulers and third-party integrations](/products/cks/clusters/scheduling/custom-schedulers), and contact CoreWeave before you run it on a production cluster. CoreWeave's [`cks-kueue` chart](/products/cks/clusters/coreweave-charts/kueue) integrates with HPC Verification natively, so it doesn't need this coordination. [Contact CoreWeave Support](https://support.freshdesk.com/support/home) or email `support@coreweave.com` if you have questions about HPC Verification and how it interacts with your scheduler. ## Taints Use `NoSchedule` taints to keep Pods without matching tolerations off GPU Nodes while allowing automated HPC Verification to run. Verification Pods tolerate arbitrary `NoSchedule` and `PreferNoSchedule` taints, but they don't tolerate arbitrary `NoExecute` taints. A `NoExecute` taint can prevent a verification Pod from scheduling or evict it after it starts. This affects verification in two ways: * **Idle Nodes**: Automated verification can't run, so the Node remains unverified even when no customer workloads are running. * **Rebooted Nodes**: The Node returns to `production` without waiting for verification, so a blocked test leaves it unverified rather than holding it back. A Node can still remain in `production-powerreset` or `production-reboot`. CoreWeave might delete and replace a Node that remains in this state too long. Choose the taint effect based on the scheduling behavior you need: | Taint effect | Effect on Pods without a matching toleration | Automated HPC Verification | | :- | :- | :- | | `NoSchedule` | Prevents new Pods from scheduling. Doesn't evict existing Pods. | Can run. Recommended for keeping new workloads off a Node. | | `PreferNoSchedule` | Discourages new Pods from scheduling, but doesn't prevent them. Doesn't evict existing Pods. | Can run. Use when a scheduling preference is sufficient. | | `NoExecute` (Do not use.) | Prevents new Pods from scheduling and evicts existing Pods. | Blocked by arbitrary customer-applied taints. | If you apply a `NoExecute` taint, change its effect to `NoSchedule` in the Node or Node Pool configuration that manages the taint. Check that your workload tolerations still match the intended taint effect. Leave CoreWeave-managed taints unchanged. See [User taints](/products/cks/clusters/scheduling/workload-scheduling#user-taints). A rebooted Node returns to `production` as soon as the reboot completes, and the verification test runs after that. Let the test finish before scheduling workloads onto the Node: the test needs the Node's GPUs free, so a workload that lands first prevents it from starting, and one that lands mid-test stops it. For a Node that remains in a reboot state, see [Reboot troubleshooting](/products/cks/nodes/reboot#the-node-stays-in-production-powerreset). ## Verify a Node on demand Use the CoreWeave Intelligent CLI to request verification of a specific GPU Node without waiting for the hourly test. The Node must be idle, with no customer Pod holding any of its GPUs. Before you begin, [install and authenticate the CoreWeave Intelligent CLI](/products/cks/nodes/manage#use-coreweave-intelligent-cli) and configure access to the Node's cluster. Check `NoExecute` taints and follow the guidance in [Taints](#taints). Replace `[NODE-NAME]` with the name of the Node to verify: ```bash theme={"system"} cwic node verify [NODE-NAME] ``` Allow approximately 35 minutes for verification. View the results in the [Node Details dashboard](https://cks-grafana.coreweave.com/d/ddbdicm9sw7c5x/node-details). After a reboot, also confirm that the Node has returned to the `production` lifecycle state before resuming workloads. See [Monitor the reboot](/products/cks/nodes/reboot#monitor-the-reboot). If verification doesn't complete or the Node remains unavailable, [contact CoreWeave Support](/support). Include the cluster name, Node name, taints, and approximate time of the verification request. ## Customer impact HPC Verification jobs are **not billable** and don't appear in usage reports. They run only when Nodes are idle, so a workload that Kubernetes or Slurm schedules never shares GPU resources with a test. If you launch a workload that needs the GPUs a test holds, the test stops, and CoreWeave releases resources before your Pod starts running. Your job and the test never run at the same time. Three cases work differently. A workload placed by a [third-party scheduler](#test-schedule) doesn't stop the test, so the workload waits in `Pending` until the test ends. A Pod pinned to a Node with `.spec.nodeName` bypasses the scheduler, so it can't preempt the test and can fail to start on a Node that looks free. See [Why is my Pod stuck in pending on CKS?](/support/cks/articles/why-is-my-pod-stuck-in-pending). On SUNK clusters, work that you start outside Slurm, such as a process launched over SSH, can run on the same GPUs as a test. See [Preemption on SUNK clusters](#preemption-on-sunk-clusters). ## Preemption on SUNK clusters On a SUNK cluster, Slurm stops a verification test when it allocates a node for a job. When Slurm allocates a node for a job submitted with `srun`, `salloc`, or `sbatch`, SUNK applies the `sunk.coreweave.com/lock` taint during the job's Prolog and evicts every Pod that doesn't tolerate it, including verification Pods. See [The SUNK `/lock` taint](/products/cks/clusters/scheduling/workload-scheduling#the-sunk-/lock-taint). Work that you start on a compute node outside Slurm, such as a process launched from an SSH session on a node where you hold no job, doesn't run the Prolog. The Node still looks idle to Kubernetes and Slurm, so a verification test can start on it while your process runs. This has two effects: * If you run `nvidia-smi` on a compute node that you reached over SSH without an allocation, you might see GPU utilization and GPU memory usage from a verification test, even though no Slurm job is running. * Your process and the test compete for the same GPUs, which can cause the Node to fail verification. Run all compute work on SUNK through `srun`, `salloc`, or `sbatch`, including interactive sessions. SSH to a node where you already hold an allocation doesn't cause this conflict, because that job's Prolog has already applied the lock. SUNK removes the lock once no Slurm job is running on the node, so stop any process that you started over SSH before your job ends. See [Access Slurm compute nodes](/products/sunk/access_sunk/access-slurm-compute-nodes). ## Identify the test Use the following signals to confirm that an `hpc-verification` Pod or metric spike on your Node comes from HPC Verification rather than a customer workload. You might briefly see a Pod whose name starts with `hpc-verification-` (single-Node tests) or `hpcv-mpi-` (multi-Node group tests) in `kubectl get pods -A` while the test runs. The test Pods run in the `cw-hpc-verification` namespace and use a CoreWeave PriorityClass with a negative value: `cw-hpc-verification` at `-1`, or `cw-hpc-validation` at `-50` on clusters where CoreWeave has rolled out the new class. Either way, they run at a lower priority than customer workloads that use the default priority. While the test is running, you might notice short spikes in your Grafana dashboards for: * **GPU SM Utilization**: Measures how heavily the GPU cores are used. * **CPU Utilization**: Shows CPU usage during the test. * **GPU Memory Utilization**: Tracks GPU memory usage. These metrics confirm that the test uniformly exercises every GPU on the Node. ## Key points * HPC Verification tests can't be disabled. They are a core safeguard that supports the CoreWeave SLA. * You might briefly see an `hpc-verification-*` Pod in `kubectl get pods -A`. This means the test is running on an idle Node. Kubernetes preempts it as soon as your workload starts, unless a [third-party scheduler](/products/cks/clusters/scheduling/custom-schedulers) places your workload or the Pod is pinned to the Node with `.spec.nodeName`. On SUNK clusters, work started outside Slurm doesn't preempt it. See [Preemption on SUNK clusters](#preemption-on-sunk-clusters). * These tests aren't billed and don't appear in usage reports. If you think HPC Verification has cordoned a Node in your cluster or delayed your job, email `support@coreweave.com`. Include the cluster name, Node name (from `kubectl describe node`), and the approximate time. The CoreWeave team checks and, if needed, uncordons or replaces the Node to restore capacity. # Workloads Source: https://docs.coreweave.com/products/workloads-home Overview of SUNK and CoreWeave Inference for running AI workloads on CoreWeave # Training and inference for AI workloads Workloads brings together SUNK for running Slurm on Kubernetes and CoreWeave Inference for serving models on NVIDIA GPUs. Choose a product to get started. [SUNK Slurm on Kubernetes for batch and burst workloads.](/products/sunk) [CoreWeave Inference Serverless and dedicated inference options for serving AI models.](/products/inference) ## Run agent workloads in Sandboxes [CoreWeave Sandboxes](/products/sandboxes) run agent tools and evaluations on serverless capacity or your own CoreWeave Kubernetes Service (CKS) clusters. The shared documentation is under **Forge > Sandboxes**. Use a Forge API key or CoreWeave API access token for serverless capacity. Use a CoreWeave token for CKS. Start with the [serverless quickstart](/products/sandboxes/get-started), or [use your own compute](/products/sandboxes/get-started-cks) to configure a CKS runner. The same [SDK guides](/products/sandboxes/client), [GPU guide](/products/sandboxes/gpu-sandboxes), and [computer-use tutorial](/products/sandboxes/tutorials/computer-use) cover both placement modes. # Inference Source: https://docs.coreweave.com/redirects/compute/inference Deploy and serve AI models on CoreWeave with serverless, dedicated, or self-managed inference options # SUNK Source: https://docs.coreweave.com/redirects/compute/sunk Overview of SUNK for running HPC and AI training workloads with Slurm on CoreWeave # Introduction to CoreWeave Security Source: https://docs.coreweave.com/security Introduction to CoreWeave's security approach across data protection, network isolation, and access management CoreWeave uses product-specific controls to protect data, isolate network traffic, and manage identity for large-scale AI workloads. On supported Nodes, Data Processing Units (DPUs) provide a hardware-separated execution environment for infrastructure services. ## Which access controls apply to your work CoreWeave Infrastructure and Forge (Weights & Biases) each have separate authorization and access control systems. The following table provides a comparative overview of each one: | | CoreWeave Infrastructure | Forge | | - | - | - | | **What it governs** | CKS clusters, VPCs, Object Storage, observability, and billing | Projects, teams, organization membership, and which products a user can reach | | **Principals** | Users and groups | Users, teams, and service accounts | | **How access is granted** | [IAM Access Policies](/security/iam/access-policies): a policy holds rules, and each rule assigns [roles](/security/iam/access-policies/roles) to a principal. Default-deny, so access exists only where a policy grants it | [Organization and team roles](/products/wandb/platform/hosting/iam/access-management-intro), plus per-project visibility scopes | | **Where access is scoped** | The organization, evaluated per action across services | The [organization, team, and project](/products/wandb/platform/hosting/iam/org_team_struct) hierarchy | | **Provisioning from your IdP** | [Automated User Provisioning](/security/automated-user-provisioning) over SCIM, with group memberships flowing into IAM | [SCIM provisioning](/products/wandb/platform/hosting/iam/scim) | | **Automated access** | [OIDC Workload Identity](/products/cks/auth-access/workload-identity/introduction) for CKS workloads reaching external cloud services, and [workload identity federation](/products/storage/object-storage/auth-access/workload-identity-federation/about) for Object Storage credentials | [Service accounts](/products/wandb/platform/hosting/iam/service-accounts) and [API keys](/products/wandb/platform/hosting/iam/api-keys) for workflows such as CI/CD pipelines | If you administer both platforms, see [Forge and CoreWeave identity](/security/forge-identity-and-access) for how the two identity systems relate and where each administrative task belongs. The following sections describe how CoreWeave implements security across data protection, network isolation, and access management. ## Core security pillars CoreWeave's approach centers on three integrated pillars: * Data security * Network security and isolation * Identity and access management (IAM) ### Data security Data security protects sensitive assets, including proprietary models, regulated data, and confidential business logic. Encryption capabilities and customer responsibilities differ by storage product. CoreWeave AI Object Storage encrypts data at rest and lets customers [manage their own encryption keys](/products/storage/object-storage/buckets/server-side-encryption/about-sse-c). On supported Nodes, CoreWeave uses NVIDIA BlueField DPUs to separate infrastructure processing from the host system. Software on the DPU can offload operations such as firewalling and encryption. ### Network security and isolation CoreWeave combines hardware and software controls to enforce security and workload separation. CoreWeave's GPU-accelerated cloud supports multiple tenants with resource-intensive workloads. In this environment, network segmentation and virtual private cloud (VPC) architectures provide tenant isolation. Data Processing Units (DPUs) (A Data Processing Unit (DPU) is a specialized processor that provides network and other infrastructure functions separately from the host CPU.) on [supported Nodes](/products/networking/nimbus) enhance hardware-level isolation. The DPU runs its own software independently from the host operating system and can offload routing and firewall tasks. CKS clusters that use Cilium provide eBPF-based [network policy enforcement](/products/networking/cilium-network-policy-cks-patterns). You can deploy [Tetragon](/security/tutorials/ebpf-observability) for additional observability. Hubble requires a per-cluster configuration change from CoreWeave Support. The platform uses Ethernet Virtual Private Network (EVPN) (An Ethernet Virtual Private Network (EVPN) interconnects Layer 2 networks and carries Layer 3 VPN services.) overlays with VXLAN encapsulation (Ethernet VPN-Virtual Extensible LAN (EVPN-VXLAN) combines EVPN's Control Plane with VXLAN's Data Plane.) and Type 5 routes (A Type 5 EVPN deals exclusively with IP route advertisement.) to provide Layer 3 multi-tenancy without relying on hypervisors. This enables each tenant or namespace to operate in a dedicated, isolated network segment (VRF/VNI). ### Identity and access management (IAM) Identity and access management (IAM) governs platform access for users, services, and workloads using principles of least privilege and role-based access control (RBAC). CoreWeave IAM Access Policies manage access to platform resources. CoreWeave AI Object Storage also provides [organization access policies](/products/storage/object-storage/auth-access/organization-policies/about), [workload identity federation](/products/storage/object-storage/auth-access/workload-identity-federation/about), and [audit logging](/products/storage/object-storage/auth-access/audit-logging). CoreWeave AI Object Storage supports [workload identity federation](/products/storage/object-storage/auth-access/workload-identity-federation/about) with OpenID Connect (OIDC) and Security Assertion Markup Language (SAML). Workloads can exchange external identity tokens for temporary Object Storage credentials instead of storing long-lived access keys. For storage access, organization access policies are written in JSON and apply to every request. Bucket policies can further refine access. Object Storage evaluates these policy types in a defined order, with exceptions for specific actions. ## Summary of security features The following table summarizes key security features of the CoreWeave platform. | Component | Description | | - | - | | Data Processing Units (DPUs) | On supported Nodes, NVIDIA BlueField DPUs provide a hardware-separated environment that runs infrastructure software independently from the host operating system. | | EVPN-VXLAN | Ethernet Virtual Private Network (EVPN) is used for efficient and scalable Layer 2 and Layer 3 VPN services. VXLAN (Virtual Extensible LAN) is used to encapsulate network traffic and create a virtualized network overlay. | | Type 5 Routes in EVPN | Enable inter-tenant routing and traffic forwarding between isolated network segments. | | Isolated networks for sensitive workloads | Networks are physically and virtually isolated to keep sensitive workloads secure and inaccessible to unauthorized systems. | Together, data security, network isolation, and IAM form the foundation of CoreWeave's security model. For more information, see [CoreWeave Security](https://www.coreweave.com/security). # Security architecture Source: https://docs.coreweave.com/security/architecture CoreWeave's security architecture covering network design, scalability, identity management, and data protection This page provides an overview of CoreWeave's security architecture, including network design, scalability, identity management, and data protection. It's intended for security architects, platform engineers, and compliance teams who need to understand how CoreWeave isolates workloads, enforces access controls, and protects data across the platform. ## Network security CoreWeave's network architecture supports bare-metal Kubernetes clusters without relying on hypervisors. It uses EVPN Type 5 (A Type 5 EVPN deals exclusively with IP route advertisement.) overlays and NVIDIA BlueField-3 DPUs to provide tenant isolation, observability, and low overhead. The core fabric uses a Clos topology, with leaf and spine switches interconnected through BGP unnumbered EVPN. This design enables scalable Layer 3 segmentation using VXLAN encapsulation. EVPN Type 5 routes distribute IP prefixes, allowing each Kubernetes tenant or namespace to operate within an isolated VRF and VXLAN VNI. Each bare-metal CoreWeave Kubernetes Service (CKS) Node includes a BlueField-3 DPU. These DPUs run independently from the host OS in their own Linux environments with DOCA-based applications. They handle PXE-based network bootstrapping, enforce security policies, and offload CNI functions such as routing, firewalling, and VXLAN termination. This architecture enables secure multi-tenancy and policy enforcement without a hypervisor. Network security is organized into three zones, each scoping a different category of traffic and trust boundary: * **Zone 0:** DPU management and Kubernetes Control Plane * **Zone 1:** Application Data Plane * **Zone 2:** External ingress and egress The DPU filters north-south traffic using Layer 4 and optional [Layer 7 policies](/security/tutorials/deploying-network-policies). The CNI (such as [Cilium with eBPF](/security/tutorials/ebpf-observability)) manages east-west traffic, enforced at the DPU level to isolate workloads by namespace or identity. DPUs interface with the CNI plugin to map Pod interfaces to their correct VXLAN segments. Integration with SPIFFE/SPIRE and cert-manager can enable secure workload identities and mTLS lifecycle management within CKS clusters. The DPU natively supports observability by exporting logs and metrics. CoreWeave provides telemetry through VictoriaMetrics (PromQL-compatible), Loki, and customer-deployed security observability tools such as Falco or [eBPF-based Cilium Tetragon](/security/tutorials/ebpf-observability) for runtime enforcement. This architecture provides isolation and scalability for containerized workloads on bare metal, with networking and security operations offloaded to SmartNICs. ### Scalability and performance The same architecture supports scale and predictable performance for compute-intensive workloads. This architecture scales reliably for model training and inference workloads because it offloads infrastructure operations from the main compute resources. BlueField-3 DPUs decouple networking, storage, and security from the host CPU, dedicating full resources to training and inference tasks. This reduces latency and jitter, and allows predictable performance scaling across many Nodes. EVPN Type 5 overlays enable efficient Layer 3 multi-tenancy without complex NAT or overlay stitching. VXLAN encapsulation supports cluster expansion across racks and data centers, while BGP-based routing optimizes data flows. The architecture supports consistent, low-latency packet handling and bandwidth prioritization, which is critical for real-time inference and distributed training. ![CoreWeave network security architecture diagram](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/architecture-1.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=f8a517b80f3a11a8928b371c44d0bd3d) ### Identity and access management CoreWeave's identity and access management (IAM) framework enforces granular, role-based access controls across the entire stack, spanning administrative interfaces, CKS workloads, and CoreWeave AI Object Storage. At the management plane (Console, API, Terraform provider, Grafana, Logs and Metrics APIs), IAM uses role-based access control (RBAC) with permissions based on roles such as admin, write, read, or metrics. Identity providers authenticate access with single sign-on (SSO) and multi-factor authentication (MFA) support for secure authentication and auditability. Within CKS, IAM integrates with [OpenID Connect (OIDC) for federated identity](/products/cks/auth-access/unmanaged-auth/introduction) from providers such as Okta. Console (browser-based) login supports SAML federation. Users and service accounts authenticate with OIDC tokens mapped to Kubernetes RBAC policies, enabling fine-grained, namespace-level access. You can map Kubernetes service accounts to external identity tokens using tools such as kube-oidc-proxy or SPIFFE/SPIRE, supporting mTLS-based workload identities and zero-trust access. For S3-compatible storage, you define [IAM policies](/products/storage/object-storage/auth-access/policies) in JSON, specifying principals, actions, and conditions for granular access control. CoreWeave evaluates these policies at request time for strict authorization and centralized or delegated management. ### Data security Data security is essential for privacy, compliance, and trust. In AI and cloud-native environments, security must cover the entire data lifecycle, from ingestion and storage to model training and inference. Effective data security combines encryption, access controls, workload isolation, and observability. Using a KMS-backed setup, CoreWeave provides [encryption at rest](/products/cks/clusters/secrets) to securely deliver secrets to workloads running in CKS clusters. Encryption in transit (TLS or mTLS) protects data between services in Kubernetes clusters. You can manage policy enforcement with tools such as OPA/Gatekeeper, and network segmentation with Cilium, to enforce least-privilege access inside CKS clusters. Data classification and tokenization de-identify sensitive data, reducing risk. Immutable logging pipelines, such as Kafka and Loki, provide traceable data lineage and access. Container isolation (such as Kata Containers) and image vulnerability scanning prevent lateral movement and enforce security from build to deployment. CKS clusters include CrowdStrike by default for endpoint protection. CoreWeave's multi-tenant isolation and encryption features are backed by enforceable technical controls that support trustworthy, secure AI adoption at scale. They help customers address regulatory requirements such as GDPR, HIPAA, and CCPA. # Activate and sign in to your CoreWeave organization Source: https://docs.coreweave.com/security/authn-authz/activate-org Activate your CoreWeave organization, sign in to the Cloud Console, and invite team members This page walks you through how to activate a new CoreWeave organization, sign in to the CoreWeave Cloud Console for the first time, and invite other users. Follow these steps after the CoreWeave Sales team approves your organization so you can start managing resources and onboard your team. ## Sign in as an administrator > [!NOTE] > > The first user invited to a new CoreWeave organization is an administrator by default, so they can manage their organization and invite additional users. When an organization is first approved to join CoreWeave, the CoreWeave Sales team sends an invitation email to the creator of the organization to activate their account. ![Invitation email with an activation button](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/admin-email-verify.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=bc20e1cfc65036cfa1973450faa92adf) Click the **Activate** button in this email to gain access to the CoreWeave Cloud Console (CoreWeave Cloud Console is the official frontend console for CoreWeave, hosted at console.coreweave.com.), which grants access to a personal sign-in page and the ability to invite other users. After you activate, your organization is ready to use and you can start inviting team members. ## Sign in as a new user As a new user, your organization's administrator must [send you an invitation](/security/authn-authz/manage-users#invite-new-users) to join the organization. > [!WARNING] > > As an invited user, you must use the same email where you received the invitation to sign in to your account. Click the invitation link in the invitation email to go to the sign-in screen. ![Blue sign-in screen that asks for user details](https://mintcdn.com/coreweave-dbfa0e8d/TmvGqaGLtLBXwiFY/security/authn-authz/_media/sign-in-screen.png?fit=max\&auto=format\&n=TmvGqaGLtLBXwiFY\&q=85\&s=097c8d9fdf5a6550c712dac646116ae4) From here, select your method to access your organization and the Cloud Console. You can create and authenticate an account with your email address and a secure password. > [!NOTE] > > If you decide to use a pre-existing social media credential, you're prompted to link your account to your organization later. ### Social sign-in If you prefer to sign in with an existing identity provider, you can link a social account to your CoreWeave sign-in after your account is created. Although **initial sign-up is only possible with an email address**, after a user creates a CoreWeave account, they can sign in with Google Workspace or GitHub as an identity provider, if those accounts are attached to the same email address used to create their CoreWeave account. > [!WARNING] > > You can't change a user's email address from the Cloud Console. To change an email address or migrate users to a new email domain, [contact CoreWeave Support](/support/contact). For what a coordinated rename preserves, and what happens if you change the email only in your identity provider, see [Change a user's email address](/security/authn-authz/manage-users#change-a-users-email-address). ## About the CoreWeave Cloud Console The **[CoreWeave Cloud Console](https://console.coreweave.com)** (or "**Cloud Console**") is CoreWeave's web-based interface that lets you manage and visualize your organization and its resources. From the Cloud Console, you can: * Deploy, view, and manage CKS clusters. * Invite and manage users. * Visualize storage resources. * Access metrics dashboards (for administrators). The Cloud Console also provides a direct method for using the [Managed Auth](/security/authn-authz/managed-auth/introduction) services provided by CoreWeave. # Login methods Source: https://docs.coreweave.com/security/authn-authz/login-methods Control how users authenticate to your CoreWeave organization by configuring login methods and per-user overrides Login methods control how users can authenticate to your CoreWeave organization. Organization administrators can enable or turn off each method organization-wide and configure per-user overrides to customize access for individual users. To manage login methods, you need the `IAM Admin` role. For more information, see [IAM Access Policies](/security/iam/access-policies). ## Available login methods CoreWeave supports four login methods: | Login method | Description | | - | - | | Email and password | Authenticate with the email address and password associated with your CoreWeave account. | | Google | Authenticate with a Google Workspace account that shares the same email address as your CoreWeave account. | | GitHub | Authenticate with a GitHub account that shares the same email address as your CoreWeave account. | | SAML SSO | Authenticate through an identity provider (IdP) using [SAML-based single sign-on](/security/authn-authz/saml-sso/intro-saml-sso). | ### OAuth-based login methods are separate from SAML SSO If your organization uses Google Workspace or a GitHub organization as the identity provider (IdP) behind SAML SSO, the OAuth-based Google or GitHub login method and SAML SSO remain separate, independently toggled methods. This is true even though both can authenticate against the same underlying account. Turning off the OAuth-based login methods doesn't route users through SAML SSO. Clicking **Sign in with Google** or **Sign in with GitHub** on the login screen always uses the OAuth-based login method, never SAML SSO. > [!WARNING] > > **Don't leave OAuth users without a way to sign in** > > Before you turn off the OAuth-based login methods (Google or GitHub), confirm that your users know to sign in through SAML SSO instead. Otherwise, users who rely on the **Sign in with Google** or **Sign in with GitHub** button lose the ability to sign in. ## Manage organization defaults Each login method has an organization-wide **Enabled by default** setting. When a method is enabled by default, users can use it to sign in unless a per-user override turns it off. When a method is turned off by default, users can't use it unless a per-user override enables it. SAML SSO is enabled by default. You can enable or turn off any other method based on your organization's policy requirements. > [!NOTE] > > At least one login method must remain enabled by default. You can't turn off all login methods for your organization. To update the organization defaults: 1. Sign in to the [Cloud Console](https://console.coreweave.com) as an administrator. 2. Go to the [Login methods](https://console.coreweave.com/organization/iam/login-methods) page, or navigate to **Administration** > **Login and identity** > **Login methods**. ![Login methods options menu](https://mintcdn.com/coreweave-dbfa0e8d/oPGiLf7IEcIHtLAM/security/authn-authz/_media/login-methods-toggles.png?fit=max\&auto=format\&n=oPGiLf7IEcIHtLAM\&q=85\&s=a8fa06e72e2bc10c38042ad5004f988b) 3. For each method, toggle the **Enabled by default** setting on or off. 4. For each changed setting, a dialog message appears in the lower right corner of the page to confirm your selection. The updated defaults apply to all users in your organization who don't have a per-user override. ## Set per-user overrides You can override the organization default for individual users. An override lets you enable a login method for a user even when that method is turned off by default. It also lets you turn off a method for a user when it's enabled by default. Common uses include maintaining emergency administrator access and restricting sign-in options for guest users. To set a per-user override: 1. Sign in to the [Cloud Console](https://console.coreweave.com) as an administrator. 2. Go to the [Users](https://console.coreweave.com/organization/users) page, or navigate to **Administration** > **Users and groups** > **Users**. 3. Select the user to edit. You can search for a user by name, email address, or User ID. Open the vertical menu by clicking the three dots (⋮) to the right of the user's name: ![Example user row in the Users page](https://mintcdn.com/coreweave-dbfa0e8d/oPGiLf7IEcIHtLAM/security/authn-authz/_media/example-user-row.png?fit=max\&auto=format\&n=oPGiLf7IEcIHtLAM\&q=85\&s=67c69d6a76e34c8839c63124955b8e2f) The expanded options menu displays additional actions for the user, including **Edit login methods**: ![Per-user options menu](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/edit-login-methods.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=d0d8abe5e5e09282f2c4af9db11edf82) 4. Select **Edit login methods**. The **Edit login methods** dialog appears with a toggle to override the organization default for each login method: ![Toggle to override organization default login methods for a user](https://mintcdn.com/coreweave-dbfa0e8d/oPGiLf7IEcIHtLAM/security/authn-authz/_media/user-login-methods-override-1.png?fit=max\&auto=format\&n=oPGiLf7IEcIHtLAM\&q=85\&s=9d7c73d6f3ec5787745a53fad326d8f6) 5. When you click the toggle to override the organization default, the **Edit login methods** dialog displays checkboxes for the login methods. Check the boxes for the login methods you want to enable or disable for the user: ![Checkboxes to enable or disable login methods for a user](https://mintcdn.com/coreweave-dbfa0e8d/oPGiLf7IEcIHtLAM/security/authn-authz/_media/user-login-methods-override-2.png?fit=max\&auto=format\&n=oPGiLf7IEcIHtLAM\&q=85\&s=9fe00fbd2c985a0257157cbb8e547358) 6. Click **Save** to apply the changes. A dialog message appears in the lower right corner of the page to confirm your selection. The override applies to the selected user regardless of the organization defaults. ## Related pages * [Configure SAML SSO](/security/authn-authz/saml-sso/configure-saml-sso): Set up SAML-based single sign-on before enabling it as a login method for your organization. * [Manage users](/security/authn-authz/manage-users): Invite users, configure account settings, and deactivate accounts. * [Organizations and users](/security/authn-authz/orgs-users): Understand organizations and user types in CoreWeave. # Manage API access tokens and kubeconfig files Source: https://docs.coreweave.com/security/authn-authz/manage-api-access-tokens Create and manage API access tokens and their associated kubeconfigs API access tokens authenticate users and grant access to resources such as CKS clusters and VPCs. This page explains how to create, use, and manage API access tokens and the kubeconfig files generated alongside them, so you can authenticate `kubectl` to CKS clusters and keep credentials secure. The following section walks through creating an API access token and downloading the associated kubeconfig file. ## Prerequisites This guide assumes that you have an active CoreWeave account. ## Create a new API access token API access tokens authenticate programmatic access to CoreWeave services. Create them in the CoreWeave Cloud Console. To create a new access token, complete the following steps: 1. In Cloud Console, navigate to [Tokens](https://console.coreweave.com/tokens), and then click the **Create Token** button in the upper-right corner. 2. In the **Create API Token** dialog, complete the following fields to configure the token values, and then click **Create**: | **Field** | **Description** | | - | - | | **Name** | The name of the token. | | **Expiration** | How long the token remains valid. | | **Note** | A description for future reference. | 3. Select one of the following options: | **Option** | **Description** | | - | - | | **Token Secret** | Copy and store the token secret for use cases such as scraping metrics, scraping logs, self-hosted Grafana setup, or to add the token secret to an existing `kubeconfig`. | | **Kubeconfig** | Create and download a `kubeconfig` for a specific cluster, so you can interact with the cluster using commands like `kubectl`. A `kubeconfig` can access multiple clusters when you [switch contexts](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/). | > [!WARNING] > > Sensitive values such as token secrets and `kubeconfig` files are displayed in the Cloud Console modal **only once**, and they are never shown again after you close the modal. You must record them in a secure location. After you complete these steps, your new API access token is ready to use with CoreWeave services. ## Get a kubeconfig for a CKS cluster To get a kubeconfig for an existing CKS cluster, complete the following steps: 1. In the Cloud Console, go to the [Clusters](https://console.coreweave.com/clusters) page. 2. Find the cluster, click the vertical ellipsis next to its name, and then click **Get kubeconfig**. 3. Save the kubeconfig file to your local machine. ## Use the kubeconfig file After you have a kubeconfig file from the previous section, this section explains how to put it in place so `kubectl` can authenticate to your CKS cluster. To use the kubeconfig file, you must have the `kubectl` command-line tool installed. If you don't have `kubectl` installed, follow the instructions in the [Kubernetes documentation](https://kubernetes.io/docs/tasks/tools/). To use the kubeconfig file, choose one of the following options: * Copy it to the default location for kubeconfig files, typically `~/.kube/config`. * Specify the file location with the `KUBECONFIG` environment variable. * Use the `--kubeconfig` flag with `kubectl`. See the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) for more information. When the kubeconfig is in place, you can use `kubectl` to interact with the CKS clusters. The following command displays the merged kubeconfig that `kubectl` will use, which helps you verify the configuration: ```bash theme={"system"} kubectl config view ``` The output should resemble the following. `[ORG-ID]` is your organization ID, `[CLUSTER-HASH]` is a short hash of the cluster name, and `[ZONE]` is the cluster's Availability Zone. `[TOKEN-ID]` and `[TOKEN-SECRET]` identify the API access token used to generate the kubeconfig: ```yaml theme={"system"} apiVersion: v1 kind: Config clusters: - cluster: server: https://[ORG-ID]-[CLUSTER-HASH].k8s.[ZONE].coreweave.com name: my-cluster contexts: - context: cluster: my-cluster namespace: default user: cwtoken-[TOKEN-ID] name: my-cluster-token users: - name: cwtoken-[TOKEN-ID]-test-token user: token: "[TOKEN-SECRET]" ``` ## Best practices for kubeconfig security Because the kubeconfig grants direct access to your CKS clusters, follow these practices to reduce the risk of credential exposure. The kubeconfig contains [API access tokens](/security/authn-authz/managed-auth/api-access). Treat these tokens with the same care as passwords or private SSH keys. * Make sure only the file owner can read and write the kubeconfig file. For example, on Linux or macOS, use `chmod 600` to set the appropriate permissions. * Avoid storing the kubeconfig in version control systems. * Use separate kubeconfigs for different users and applications, instead of sharing a single kubeconfig among multiple users or apps. * Rotate kubeconfig files regularly, and revoke access for users or applications that no longer need it to reduce the risk of credential leakage. > [!NOTE] > > Learn more about kubeconfig files in [the official Kubernetes documentation](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/). ## Manage access tokens After you create tokens, use the Cloud Console to review or revoke them as your access needs change. You can view or delete access tokens on [the Access Tokens dashboard](https://console.coreweave.com/tokens). The secret values are never shown again after creation, so record them in a secure location. ![Access Tokens dashboard listing active access tokens.](https://mintcdn.com/coreweave-dbfa0e8d/AMJ2Ia-aOiGUfdv1/security/authn-authz/_media/access-tokens-create.png?fit=max\&auto=format\&n=AMJ2Ia-aOiGUfdv1\&q=85\&s=b1a07eafea15d2f24f4f83f1fae29aad) > [!TIP] > > You may have a different level of access to CKS clusters. Organization administrators designate permissions. For more information on how administrators set permissions for users and groups, see [IAM Access Policies](/security/iam/access-policies) and [Legacy User Permissions](/security/iam/access-policies/legacy-permissions). # Manage users Source: https://docs.coreweave.com/security/authn-authz/manage-users Manage users and user permissions in CoreWeave organizations This page explains how to set up the first administrator account for a CoreWeave organization, invite additional users, configure individual user accounts, and deactivate users when needed. It's intended for organization administrators and for users who are setting up their own CoreWeave account for the first time. > [!TIP] > > For more information about user permissions, see [IAM Access Policies](/security/iam/access-policies) and [Legacy User Permissions](/security/iam/access-policies/legacy-permissions). ## Create first administrator account In a new CoreWeave organization, the first user to create a CoreWeave account becomes the first administrator by default. No resources (such as CKS clusters) or additional access policies can be created without an administrator. The first administrator has the following IAM roles by default: * IAM Admin * CKS Admin * Object Storage Admin * Access Token User * Access Request Approver The first administrator can assign admin roles to other users through the Cloud Console by creating new [IAM Access Policies](/security/iam/access-policies). ![An email inviting an admin to join CoreWeave](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/invite-user-after-email-screenshot.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=9091668d3346ddcd2974f1affd41a767) ## Invite new users After the administrator sets up an account, they can access all the features of the Cloud Console. For users with the `IAM Admin` role (or the `admin` legacy group), this includes the ability to invite other users to their organization's namespace through the Cloud Console [Users](https://console.coreweave.com/organization/users) page. ![An email inviting a user to join CoreWeave](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/invite-user.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=03885cf93da1b83c820f7b5f689bbedc) When an `IAM Admin` user clicks the **Invite User** button, a modal opens, prompting them to enter information for the user to invite and to decide which permission groups the user is in. After entering the new user's email, the administrator can then select any desired [permission groups](/security/iam/access-policies/legacy-permissions) from the drop-down menu: ![A modal which shows three groups an Admin can choose from to invite users to.](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/invite-user-modal.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=f47ef0c4bc292d3e141d2fd2a9f273ea) Each user has a dedicated [Settings](https://console.coreweave.com/account/settings) page on the Cloud Console. To navigate to the Settings page, click your name in the top right corner of the Console window and select **User settings** in the dropdown menu. ## Set up a new user account After an administrator invites you to an organization, you complete account setup from the invitation email so you can sign in to the Cloud Console. To set up your user account, click the link sent to you by your administrator. You can log in with an email and password combination, a linked social media account, or SAML-based Single Sign-On (SSO) if your administrator has configured it for the organization. ![A blue login screen which asks for user details](https://mintcdn.com/coreweave-dbfa0e8d/TmvGqaGLtLBXwiFY/security/authn-authz/_media/user-sign-in-screen.png?fit=max\&auto=format\&n=TmvGqaGLtLBXwiFY\&q=85\&s=362202bd0b9040625ce63cade96ef524) ### Sign in with email and password You can create and authenticate an account using the email address your administrator used to invite you, and a secure password. ![The same blue login screen with the email and password options circled in red](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/sign-in-red-circle.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=ba2c0cb928b92426a2c306b26229d927) ### Sign in with social sign-in > [!NOTE] > > If you decide to use email or a pre-existing social media credential, you'll be prompted to link your account to your organization later. > > GitHub or Gmail can be used as social sign-on only if the email address for those accounts matches the one used for your CoreWeave invitation. The Cloud Console login is integrated with Google Workspace and GitHub, so you can also access the Cloud Console using either account. CoreWeave supports SAML so users can perform SSO logins. Users with [administrator privileges](/security/authn-authz/orgs-users#administrators) can enable, configure, and manage SAML settings within their organizations from the Cloud Console. ## Change user account settings The following sections describe the per-user settings available from the Cloud Console Settings page. ### Update account password You update your password from the **Passwords** section of the settings page. After you enter the information and click **Save**, you receive a confirmation email. If you enter an incorrect current password, your password doesn't change. ![A section of a page where a user may enter their current password and a new one in order to change it.](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/change-password-modal.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=1917da9e20f9f05ef664b918f2b95f6a) ### Update Cloud Console theme In the **Preferences** section of the [User settings](https://console.coreweave.com/account/settings) page, choose **Light mode**, **Dark mode**, or **System settings** from the **Theme** dropdown. **System settings** matches your operating system's theme. This setting applies only to the Cloud Console. To change the theme in Forge, see [Forge user settings](/products/wandb/platform/app/settings-page/user-settings#public-preview-features). ### Two-factor authentication (2FA) In the **Security** section of the [User settings](https://console.coreweave.com/account/settings) page, you can enable two-factor authentication for your CoreWeave account. ![A box with a slider enabling Two-Factor Authentication.](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/enable-2fa-new-modal.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=a68d8d8932f51d5c9b24ed271c6651f2) When you click this slider, a modal prompts you to re-authenticate by entering your password. After you enter your password, a modal prompts you to scan a QR code in the 2FA app of your choice on another device. ![A modal with a QR code to link 2FA to an authentication app.](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/authn-authz/_media/enable-2fa-qr.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=a8e692beeba519d1d7afa240f08fcdae) After you enter the code and set up 2FA with your device, the Cloud Console prompts you to re-authenticate with your OTP every time you log in. > [!TIP] > > To disable 2FA, turn the slider to the "off" position. A pop-up confirms the action. ## Change a user's email address You can't change a user's email address from the Cloud Console. To change an email address or migrate users to a new email domain, [contact CoreWeave Support](/support/contact). Include a mapping of each user's current email address to the new address. Support coordinates a rename that keeps the same CoreWeave user. Organization permissions, API access tokens, and Object Storage access keys stay in place. If you use SUNK, the rename also preserves [POSIX user and group IDs](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning#slurm-user-attributes), so SSH access and file ownership don't break. > [!WARNING] > > Don't change a user's email address only in your identity provider. Identity providers that identify users by email treat an unrecognized address as a new user. That includes Automated User Provisioning (AUP) with Okta or Microsoft Entra, and SAML just-in-time (JIT) provisioning when AUP is off. The result is a second account with no organization permissions, while the original account is left unused. If you use SUNK, the new account also receives a new POSIX UID and GID, which breaks SSH access that depends on the original IDs. > > If your organization uses AUP, see [Change a user's email address](/security/automated-user-provisioning#change-a-users-email-address). ## Deactivate user accounts Users with the `IAM Admin` role (or the `admin` legacy group) can deactivate user accounts, including other accounts with `IAM Admin` privileges, but not their own account. Deactivated accounts can't access the Cloud Console and aren't authorized to perform any actions outside of the Console. To deactivate a user in the Cloud Console: 1. Go to the [**Users** page](https://console.coreweave.com/organization/users) in the Cloud Console. All users in the organization are displayed in a table, with a search field above it. Each user's table row displays their name, User ID, email address, status, and a **More options** menu behind a vertical ellipsis icon all the way to the right. 2. Find the user you want to deactivate. You can search by name, email address, or User ID to filter the list. Click the vertical ellipsis icon to expand the **More options** menu, then click **Deactivate**. 3. In the dialog that opens, type the user's email address to confirm, then click **Deactivate**. Deactivating a user also suspends their Object Storage access keys. > [!CAUTION] > > Deactivated accounts are **not** deleted from the organization. IAM Admins can reactivate a deactivated user account at any time. ### Deactivate a SCIM-managed user If your organization uses [Automated User Provisioning (AUP)](/security/automated-user-provisioning), users provisioned from your identity provider (IdP) are managed through SCIM (System for Cross-domain Identity Management). The IdP controls their active status. You can't deactivate a SCIM-managed user from the Cloud Console, even with the `IAM Admin` role. To deactivate a SCIM-managed user, do one of the following: * Deprovision the user in your IdP. If your IdP integration deactivates users, AUP deactivates the user in the Cloud Console automatically. * [Mark the user exempt from SCIM](/security/automated-user-provisioning#exempt-a-user-from-scim), then deactivate them from the **Users** page. # API access tokens Source: https://docs.coreweave.com/security/authn-authz/managed-auth/api-access Create and manage API access tokens for cluster and resource access **API access tokens** are user-scoped tokens that grant users permission to access API endpoints. They gate the ability to deploy CKS Clusters, VPCs (A Virtual Private Cloud (VPC) is a private network hosted within a public cloud infrastructure.), and to manage and access cluster metrics. With CoreWeave's **Managed Auth** method, API access tokens are generated through the Cloud Console and automatically embedded in Kubeconfig files (A YAML file containing Kubernetes cluster access information and credentials.) scoped to the designated CKS Cluster. You can add additional Clusters to the Kubeconfig's `spec` to let the same token grant access to multiple Clusters. Used this way, API access tokens ensure that only authorized entities can perform actions within the Cluster. ## Next up * Learn about [Kubeconfig files in CKS](/products/cks/auth-access/managed-auth/kubeconfig). * Learn [how to create and manage API access tokens](/security/authn-authz/manage-api-access-tokens). # Managed Auth Source: https://docs.coreweave.com/security/authn-authz/managed-auth/introduction Abstracted authentication for simplified user management > [!TIP] > > Managed Auth is the **recommended path** for handling user authentication across CoreWeave. **Managed Authentication**, also called **Managed Auth**, is a series of CoreWeave-provided services that abstract authentication to offer customers flexible, simple, and secure methods of authentication management. The Managed Auth suite includes: * The [CoreWeave Cloud Console](/security/authn-authz/activate-org) * CoreWeave [API access tokens](/security/authn-authz/managed-auth/api-access) * Generated [kubeconfig files](/products/cks/auth-access/managed-auth/kubeconfig) for CKS clusters * Session cookies in the user's web browser when using the Cloud Console These services authenticate you to your CoreWeave organization and top-level resources. This page introduces the Managed Auth suite for administrators and users who need to understand how authentication works across CoreWeave before configuring access. > [!NOTE] > > To learn more about user permissions and user authorization, see [IAM Access Policies](/security/iam/access-policies) and [Legacy User Permissions](/security/iam/access-policies/legacy-permissions). ## Managed Auth and metrics Grafana metrics are gated behind Managed Auth services. To export metrics or use [CoreWeave Grafana](/observability/managed-grafana), you must use the Managed Auth methods. ## Other authentication methods for CKS clusters Although Managed Auth is the recommended path, CKS clusters allow additional methods of authentication. > [!WARNING] > > You must use Managed Auth to create new CKS clusters or VPCs. No other authentication method is supported for these actions. Only existing CKS clusters allow alternative authentication methods. # Organizations and users Source: https://docs.coreweave.com/security/authn-authz/orgs-users Understand organizations, Org IDs, and the two primary user types within the CoreWeave platform ## Organizations In CoreWeave, an **organization** is your entire CoreWeave Cloud Console account, including all users and resources within it. Billing, user management, and infrastructure management all take place at the organization level. ### Organization IDs CoreWeave associates every customer with an Organization ID, or "Org ID." Each organization has a unique Org ID, which takes the form of a short hexadecimal string (for example, `ab1cd2`). You can find your Org ID on the [Settings page](https://console.coreweave.com/account/settings) of your Cloud Console account. ![The Settings page with the Org ID section highlighted.](https://mintcdn.com/coreweave-dbfa0e8d/oPGiLf7IEcIHtLAM/security/authn-authz/_media/org-id-page.png?fit=max\&auto=format\&n=oPGiLf7IEcIHtLAM\&q=85\&s=3581c69d56dae1179a8128e80c87e20f) CoreWeave uses Org IDs in many contexts to manage customer resources. Org IDs also enforce tenant isolation, because each user can belong to only one organization. All service interactions filter users by their Org ID. ## User types > [!NOTE] > > For more information about the permissions associated with each user type, see [IAM Access Policies](/security/iam/access-policies) and [Legacy User Permissions](/security/iam/access-policies/legacy-permissions). To learn how to manage users, see [Manage users](/security/authn-authz/manage-users). CoreWeave defines two primary user types: administrators and users. ### Administrators **Administrators** have access to a broad set of actions and controls and can see more information about the resources their organization creates. ### Users **Users** have more limited permissions that administrators allocate. Users can perform only the actions assigned to them. To learn how user roles map to CKS permissions, see [Configure cluster access](/products/cks/auth-access/introduction#platform-identity-and-cks-permissions). ## Set up your team On your first day in a new organization, follow this sequence to go from a single administrator account to a team whose members each have the access they need. Define what people need to do first, grant those roles through an access policy, then invite the people. ### Whether to create a policy or a group first Start with a policy. In CoreWeave, you grant access by writing an [IAM Access Policy](/security/iam/access-policies), which is a collection of rules. Each rule assigns one or more roles to a principal, where a principal is an individual user or a group. Access is default-deny: a principal can perform an action only when a policy grants the role for it. You don't need to create a group to grant access. You can assign roles directly to individual users in a policy. Create a group only when several people should share the same roles and you want to manage them as a unit, then reference that group as the principal in a rule. #### Legacy user groups There are also legacy user groups (`admin`, `read`, `write`, `metrics`, and `billing_viewer`) that predate IAM Access Policies, where a user's permissions came from the legacy group they belonged to. New organizations should use IAM Access Policies rather than legacy groups. For how legacy groups map to current roles, see [Legacy group role assignments](/security/iam/access-policies/roles#legacy-group-role-assignments). ### Day one sequence Follow these steps to grant access and onboard your team: 1. **Decide what each part of your team needs to do.** List the people or functions on your team and the actions each one performs, such as managing clusters, deploying models, viewing billing, or monitoring workloads. Map each one to the roles described in [IAM roles](/security/iam/access-policies/roles). 2. **Create an access policy with the right roles.** Create one or more policies whose rules assign those roles to the appropriate principals. To grant the same roles to several people, create a group and assign the roles to that group. For the console steps, see [Manage IAM access policies](/security/iam/access-policies/manage). Creating a policy requires the IAM Admin role. 3. **Invite your users.** Invite each person to your organization from the Cloud Console. For the steps, see [Manage users](/security/authn-authz/manage-users#invite-new-users). Inviting users requires the IAM Admin role. 4. **Assign users and verify access.** Make sure each invited user is a principal in a policy rule that grants their roles, either directly or through a group. After a user accepts the invitation and signs in, confirm they can reach the resources their roles allow and nothing more. To change a user's access later, edit the relevant policy. See [Edit an access policy](/security/iam/access-policies/manage#edit-an-access-policy). # Configure SAML SSO Source: https://docs.coreweave.com/security/authn-authz/saml-sso/configure-saml-sso Step-by-step instructions for configuring SAML-based single sign-on for your CoreWeave organization ## Prerequisites To configure SAML SSO, you need an active CoreWeave account and admin permissions. ## Configure SAML SSO for your organization This section explains how to set up SAML single sign-on (SSO) for your organization so members can authenticate through your identity provider (IdP) instead of CoreWeave credentials. You can configure SAML SSO policies for CoreWeave Kubernetes Service (CKS) manually or with a metadata URL. Choose the method that matches what your IdP exposes. > [!WARNING] > > The SAML response must be signed by your IdP. Signing the SAML assertion is optional; if your IdP signs the assertion, expand **Advanced settings** and select **Require signed assertion** during CoreWeave configuration. **Configure manually** ### Configure SSO manually Use the manual configuration when your IdP doesn't publish a metadata URL or when you prefer to enter each value yourself. Before you configure the SSO policy manually, gather the following information from your identity provider (IdP): * The IdP's SSO URL. * The IdP's unique Entity ID. * An X.509 security certificate provided by your IdP. To configure SSO manually: 1. In Cloud Console, go to [SAML SSO configuration](https://console.coreweave.com/organization/iam/sso) and click the **Configure SAML** button. 2. Select the **Manual Configuration** tab: ![Manual Configuration tab in the SAML SSO setup dialog.](https://mintcdn.com/coreweave-dbfa0e8d/TmvGqaGLtLBXwiFY/security/authn-authz/_media/sso-manual.png?fit=max\&auto=format\&n=TmvGqaGLtLBXwiFY\&q=85\&s=c6728c0f89338d34f5e9977a986b89d8) 3. Enter the SSO URL, the Entity ID, and the provided X.509 security certificate. 4. If your IdP signs the SAML assertion, expand **Advanced settings** and select **Require signed assertion**. 5. Click the **Next** button. 6. Confirm the information in the dialog boxes is correct. 7. Click the **Deploy SSO** button to activate the policy. The SSO policy is now active for your organization. To complete the integration, add specific attributes to the IdP so CoreWeave can identify each user. For more information, see the [Add attributes to the IdP](#add-attributes-to-the-idp) section. **Configure with metadata** ### Configure SSO with a metadata URL Use a metadata URL when your IdP publishes one. This method lets CoreWeave read the SSO URL, Entity ID, and certificate automatically, which reduces the chance of transcription errors. To configure SSO with an SSO metadata URL, obtain the SSO metadata URL from your IdP, then complete the following steps: 1. In Cloud Console, go to [SAML SSO configuration](https://console.coreweave.com/organization/iam/sso) and click the **Configure SAML** button. 2. Select the **Metadata URL** tab: ![Metadata URL tab in the SAML SSO setup dialog.](https://mintcdn.com/coreweave-dbfa0e8d/TmvGqaGLtLBXwiFY/security/authn-authz/_media/sso-metadata.png?fit=max\&auto=format\&n=TmvGqaGLtLBXwiFY\&q=85\&s=c05620d9d10ce2a6226a817cef93a8da) 3. Enter the metadata URL. 4. If your IdP signs the SAML assertion, expand **Advanced settings** and select **Require signed assertion**. 5. Click the **Next** button. 6. Confirm the information in the dialog boxes is correct. 7. Click the **Deploy SSO** button to enable the policy. The SSO policy is now active for your organization. To complete the integration, add specific attributes to the IdP so CoreWeave can identify each user. For more information, see the [Add attributes to the IdP](#add-attributes-to-the-idp) section. ## Add attributes to the IdP CoreWeave uses these attributes to identify each user who signs in through SSO. After you deploy the SSO policy, add the following attributes to your IdP: | Key | Description | | - | - | | `email` | User's email (unique identifier) | | `first_name` | User's first name | | `last_name` | User's last name | While in your IdP settings, also verify that response signing is enabled. The SAML response must be signed. Authentication fails if the response is unsigned. ## Manage the SSO policy After the initial setup, you can return to the SAML SSO configuration page to review or change the policy. The configuration dialog displays the policy's information and lets you manage it with the following buttons: **Disable SAML**, **Enable SAML**, and **Edit**. ## Access the SSO login page After you configure SSO for your organization, direct users to sign in with your organization's dedicated SSO login URL. The SSO login URL follows a standard format that includes your organization's unique ID directly before the final `/login` path segment. To access the SSO login URL: 1. In Cloud Console, go to [Account Settings](https://console.coreweave.com/account/settings) and find your CoreWeave **Org ID**. 2. Replace `[ORG-ID]` in the following example with your Org ID. ```text theme={"system"} # Replace `[ORG-ID]` with your Org ID. https://console.coreweave.com/accounts/saml/[ORG-ID]/login ``` **Example** If your Org ID is `abc123`, your SSO login URL is: ```text theme={"system"} https://console.coreweave.com/accounts/saml/abc123/login ``` 3. Share this URL with your team so they can sign in with your SSO configuration. Users who visit this URL are redirected to your IdP to authenticate, then returned to Cloud Console. # Introduction to SAML and SSO Source: https://docs.coreweave.com/security/authn-authz/saml-sso/intro-saml-sso Introduction to SAML and SSO authentication for CoreWeave Cloud using your existing identity provider Security Assertion Markup Language (SAML) and Single Sign-On (SSO) together form an authentication method for CoreWeave Cloud. Users in your organization authenticate through the same identity provider (IdP) they use for other organization applications. SSO enhances security and provides a smoother log-in experience for your team. ## Configure SSO CoreWeave organization administrators configure SSO from the Cloud Console (CoreWeave Cloud Console is the official frontend console for CoreWeave, hosted at console.coreweave.com.). To configure SSO for your organization, see [Configure SAML SSO](/security/authn-authz/saml-sso/configure-saml-sso). # Forge and CoreWeave identity Source: https://docs.coreweave.com/security/forge-identity-and-access How Forge and CoreWeave identities relate and where you administer each one CoreWeave and Forge each have their own identity system. CoreWeave's identity and access management (IAM) authenticates and authorizes access to platform resources. These resources include CoreWeave Kubernetes Service (CKS) clusters, virtual private clouds (VPCs), and CoreWeave AI Object Storage. Forge has its own identity layer that governs organizations, teams, projects, and product access. The two systems stay separate. Each has its own sign-in page and admin console, so you administer each one separately. This page is for administrators who manage users and access on both platforms. It describes where each administrative task belongs and how the two systems relate. To choose which system governs a given resource, see [Which access controls apply to your work](/security#which-access-controls-apply-to-your-work). ## Where to manage what The following table shows where each task belongs: | Task | Where | | - | - | | Grant access to CKS, VPCs, Object Storage, or CoreWeave billing | [CoreWeave IAM Access Policies](/security/iam/access-policies) | | Add or remove a Forge organization member | [Forge organization management](/products/wandb/platform/hosting/iam/access-management/manage-organization) | | Change a user's Forge role or product access | [Forge access management](/products/wandb/platform/hosting/iam/access-management-intro) | | Review CoreWeave usage and costs | [Billing](/billing) | | Review Forge plan, usage, and invoices | [Forge billing settings](/products/wandb/platform/app/settings-page/billing-settings) | | Sync users and groups from your identity provider into CoreWeave | [Automated User Provisioning](/security/automated-user-provisioning) | | Sync users into Forge | [System for Cross-domain Identity Management (SCIM) provisioning](/products/wandb/platform/hosting/iam/scim) | | Manage CoreWeave API access tokens | [API access tokens](/security/authn-authz/manage-api-access-tokens) | | Manage Forge API keys | [API keys](/products/wandb/platform/hosting/iam/api-keys) | | Authenticate a workflow to Forge | [Service accounts](/products/wandb/platform/hosting/iam/service-accounts) | Each platform bills for its own products and has a separate billing page, so a Forge invoice doesn't include CoreWeave infrastructure usage. For the full billing orientation, see [CoreWeave Infrastructure and Forge billing](/billing/coreweave-and-forge-billing). ## How the two identities relate Each platform authenticates its own users: * **CoreWeave IAM** authenticates users for platform resources and authorizes them through [IAM Access Policies](/security/iam/access-policies). * **Forge** authenticates users through its own identity layer. Forge and `wandb.ai` share one account and one user store, so existing users sign in to Forge with their current account. Sign-in is separate for each platform. Users sign in to Forge at [id.coreweave.com/login](https://id.coreweave.com/login) and to the CoreWeave Cloud Console at [console.coreweave.com](https://console.coreweave.com). Sessions are per domain. A user signed in to the Cloud Console signs in again when they open Forge, and vice versa. The Cloud Console global navigation links to Forge, but that link doesn't carry a Console session into Forge. A CoreWeave user who doesn't already have Forge access reaches Forge by signing up at [id.coreweave.com/signup](https://id.coreweave.com/signup). A Cloud Console sign-in doesn't create a Forge account or place a user in a Forge organization. Nothing in Forge grants access on the CoreWeave platform. A Forge identity and a Forge role apply only within Forge. ## Administer access in both systems The following sections describe how administration works across the two systems. This behavior is subject to change. ### Grant and revoke Forge access in Forge You can view and assign Forge access in the [Forge Console](https://forge.coreweave.com/account-settings/wandb/members), including which Forge products a user can reach and what Forge roles they hold. CoreWeave IAM roles, including [IAM Admin](/security/iam/access-policies/roles), govern the CoreWeave platform only and don't grant a Forge role or Forge product access. To change a user's Forge role, change it in Forge. You can block `forge.coreweave.com` on your network to prevent users on that network from reaching Forge. ### Configure Forge authentication methods Forge supports Security Assertion Markup Language (SAML), OpenID Connect (OIDC), and passwords, each configured inside Forge. CoreWeave IAM doesn't govern any of them. SAML single sign-on (SSO) on the CoreWeave side covers the Cloud Console only. If you want one identity provider behind both platforms, configure it in each one. For the CoreWeave side, see [SAML SSO](/security/authn-authz/saml-sso/intro-saml-sso) and [Login methods](/security/authn-authz/login-methods). ### Manage programmatic access in each platform Create and manage API keys and access tokens separately in each platform. Each credential is scoped to the platform that issued it. A CoreWeave API access token grants access on the CoreWeave platform, and a Forge API key grants access in Forge. Rotate and revoke each credential in the platform that issued it. ### Review and deprovision in both systems To review a person's complete access, check both systems. Rotate a user's credentials in both systems, and deprovision a departing user separately in each system. > [!WARNING] > > When you remove a user from CoreWeave IAM, that doesn't remove their Forge access. When you remove them from Forge, that doesn't remove their CoreWeave access. When someone leaves your organization or changes roles, update their access in both systems. ### Multi-tenant Forge deployments This page describes multi-tenant Forge. W\&B Dedicated Cloud and W\&B Self-Managed deployments keep their existing identity configuration and sign-in pages. See [Deployment options](/products/wandb/platform/hosting/hosting-options). ## Related The following pages cover related identity and access topics: * [Which access controls apply to your work](/security#which-access-controls-apply-to-your-work): Understand which system governs a given resource. * [Identity and access management (IAM)](/security/iam): Authenticate and authorize access to CoreWeave platform resources. * [Forge access management](/products/wandb/platform/hosting/iam/access-management-intro): Change a user's Forge role or product access. * [CoreWeave Infrastructure and Forge billing](/billing/coreweave-and-forge-billing): Understand which types of charges belong in which billing system and where each billing task belongs. * [What moved in CoreWeave Forge](/forge-whats-moved): Find projects, settings, and account locations in Forge if you already use Weights & Biases. # Identity and access management (IAM) Source: https://docs.coreweave.com/security/iam CoreWeave's Identity and Access Management system for controlling access to Cloud Platform resources CoreWeave Identity and Access Management (IAM) controls access to Cloud Platform resources. This page explains how CoreWeave IAM and product-specific controls work together, so you can identify which controls govern access for an identity, credential, resource, and action. > [!NOTE] > > CoreWeave IAM doesn't govern Forge. Forge has a separate identity and access system for organizations, teams, projects, and product access. See [Forge and CoreWeave identity](/security/forge-identity-and-access). ## Authorization model Use the following layers to determine how a user or workload gets access: | Layer | Question it answers | CoreWeave controls | | - | - | - | | **Identity and provisioning** | Who is the user or workload? | [Organizations and users](/security/authn-authz/orgs-users), [Security Assertion Markup Language (SAML) single sign-on (SSO)](/security/authn-authz/saml-sso/intro-saml-sso), and [Automated User Provisioning (AUP)](/security/automated-user-provisioning) establish and synchronize users and groups. [SUNK User Provisioning (SUP)](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning) extends CoreWeave identities into SUNK clusters. | | **Credentials and authentication** | How does the identity prove who it is? | Users can authenticate with login credentials or [API access tokens](/security/authn-authz/manage-api-access-tokens). CoreWeave Kubernetes Service (CKS) supports [managed and unmanaged authentication](/products/cks/auth-access/introduction). CoreWeave AI Object Storage uses [access keys](/products/storage/object-storage/auth-access/manage-access-keys/about), including temporary credentials from [Workload Identity Federation (WIF)](/products/storage/object-storage/auth-access/workload-identity-federation/about). SUNK users authenticate to cluster nodes with SSH keys distributed through SUP. | | **CoreWeave IAM authorization** | Which Cloud Platform actions can the identity perform? | [IAM Access Policies](/security/iam/access-policies) assign [IAM roles](/security/iam/access-policies/roles) to users and groups. CoreWeave IAM uses default-deny authorization: a principal needs an applicable role before it can perform a platform action. | | **Service-specific authorization** | Which actions can the authenticated identity perform inside the service? | Object Storage uses organization and bucket access policies for S3-compatible operations. CKS uses Kubernetes role-based access control (RBAC) inside clusters. SUNK uses POSIX and Slurm access controls. | An identity or credential doesn't grant authorization by itself. For example, an API access token authenticates its owner. The owner's IAM roles determine which platform actions they can perform with the token. Service-specific controls can impose additional requirements. ## Service authorization boundaries The following services have authorization controls outside IAM Access Policies: | Service | IAM Access Policies | Service-specific authorization | | - | - | - | | **Object Storage** | The **Object Storage Admin** role grants access to `cwobject:` control-plane actions. | An [organization access policy](/products/storage/object-storage/auth-access/organization-policies/about) can grant narrower `cwobject:` permissions, such as `cwobject:CreateAccessKey`. [Organization and bucket access policies](/products/storage/object-storage/auth-access/policies) govern S3-compatible bucket and object operations. Access keys, including WIF credentials, authenticate requests but don't grant data access by themselves. | | **CKS** | **CKS Admin** and **CKS Viewer** govern platform-level CKS and virtual private cloud (VPC) actions. | After a user authenticates to the Kubernetes API, Kubernetes role-based access control (RBAC) determines which resources and actions the user can access inside the cluster. | | **SUNK** | CoreWeave IAM provides the users and groups that SUP can provision. IAM Access Policies don't directly govern access inside a SUNK cluster. | SUP and `nsscache` create POSIX identities and Slurm users. SSH keys authenticate users, while POSIX permissions, Slurm associations, and optional [`pam_slurm_adopt`](/products/sunk/manage_sunk/manage_cluster_access/pam-slurm-adopt) controls determine cluster and compute-node access. | ## Enterprise onboarding When you onboard an organization, use the following sequence to set up identity, provisioning, and least-privilege access: 1. **Sign-in and SSO**: Configure SAML SSO so your team signs in through your identity provider. To enforce SSO as the only sign-in method, use [login methods](/security/authn-authz/login-methods) to turn off email and password, Google, and GitHub sign-in by default, and review per-user overrides. 2. **Multi-factor authentication (MFA)**: Each user can enable two-factor authentication (2FA) with a time-based one-time password (TOTP) on their [account settings](https://console.coreweave.com/account/settings) page. For organization-wide enforcement, configure your identity provider to require MFA on every SSO sign-in. See [Can I enforce 2FA for all users?](/support/platform/articles/can-i-enforce-2fa-for-all-users). 3. **User and group provisioning**: Sync users and groups from your identity provider with Automated User Provisioning (AUP), which uses the System for Cross-domain Identity Management (SCIM). Group memberships are synchronized with IAM and can be used in access policies. 4. **Least-privilege access**: Assign IAM roles through access policies. Use [default access policies](/security/iam/access-policies#default-access-policies) to keep common access patterns current as CoreWeave introduces new roles, and create custom policies for narrower access. Together, these controls establish organization-wide sign-in, user provisioning, and least-privilege IAM access. ### Per-cluster access scoping [Managed Authentication](/products/cks/auth-access/managed-auth/kubeconfig) allows every CoreWeave user in an organization to authenticate to every CKS cluster in that organization. IAM roles determine what each user can do, but they don't provide per-cluster scoping. To control which identities can authenticate to a specific cluster, configure [Unmanaged Authentication](/products/cks/auth-access/unmanaged-auth/introduction) with your own identity provider. Then, use Kubernetes RBAC to authorize those identities. For stronger organizational separation, [contact support](/support/contact) about using multiple organizations. See [How do I scope users to specific clusters?](/support/platform/articles/how-do-i-scope-users-to-specific-clusters). ### Object Storage access without admin To obtain Object Storage credentials, users need either the **Object Storage Admin** role or an organization access policy that grants the narrower `cwobject:CreateAccessKey` permission. To let users obtain credentials without the full admin role, grant this permission through an organization access policy. Users can then [exchange their API access token directly for temporary credentials](/products/storage/object-storage/auth-access/manage-access-keys/api-access-token). Combine this approach with [group-based bucket policies](/products/storage/object-storage/auth-access/bucket-access/bucket-policies) so SCIM group memberships control which buckets each user can access. For production workloads, CoreWeave recommends that you use Workload Identity Federation to exchange short-lived identity-provider tokens for temporary credentials. ## Troubleshoot access Start with the layer where the access attempt failed: * If a user can't sign in or obtain an API access token, see the [authentication and access support articles](/support/platform/tags/authentication-access). * If CKS returns an authentication or authorization error, see [Managed Authentication errors](/products/cks/auth-access/managed-auth/kubeconfig#authentication-errors). * If a user can't create Object Storage credentials or access a bucket, see [How do I give someone Object Storage access without admin privileges?](/support/storage/articles/how-do-i-give-someone-object-storage-access-without-admin-privileges). * If Grafana doesn't show metrics, see [Why are my metrics missing in Grafana?](/support/observability/articles/why-are-my-metrics-missing-in-grafana). * If a SUNK user can't access a cluster, see [How do I add users to the `slurm-users` group?](/support/sunk/articles/how-do-i-add-users-to-the-slurm-users-group) and [Where do I add my SSH public key?](/support/sunk/articles/where-do-i-add-my-ssh-public-key). ## Next steps To create an access policy, see [Manage IAM Access Policies](/security/iam/access-policies/manage). # IAM Access Policies Source: https://docs.coreweave.com/security/iam/access-policies CoreWeave IAM Access Policies for assigning permissions to users and groups across platform services CoreWeave IAM Access Policies let administrators and privileged users define which principals (CoreWeave IAM users or groups) can perform specific actions across CoreWeave services. You create a policy once, and CoreWeave evaluates it wherever platform authorization is required, which enforces consistent, least-privilege access across the Cloud Platform. > [!NOTE] > > IAM Access Policies don't grant access to Forge. Forge uses a separate identity and access system. See [Forge and CoreWeave identity](/security/forge-identity-and-access). IAM Access Policies don't directly govern the following service controls: * The [CoreWeave AI Object Storage S3-compatible API](/products/storage/object-storage/reference/object-storage-s3), which is governed by [organization and bucket access policies](/products/storage/object-storage/auth-access/policies). * [Kubernetes authorization within CoreWeave Kubernetes Service (CKS) clusters](/products/cks/auth-access/introduction), which uses Kubernetes RBAC after a user authenticates to the Kubernetes API. * SUNK [identity provisioning](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning) and [compute-node authorization](/products/sunk/manage_sunk/manage_cluster_access/pam-slurm-adopt). SUP creates POSIX and Slurm identities from CoreWeave IAM users and groups, while POSIX permissions and Slurm controls govern access inside the cluster. By contrast, Observability access is governed by roles assigned through IAM Access Policies. See [Observability and telemetry roles](/security/iam/access-policies/roles#observability-and-telemetry). For the complete relationship between identity, credentials, CoreWeave IAM, and service-specific authorization, see the [CoreWeave authorization model](/security/iam#authorization-model). ## Core concepts The following terms are central to how IAM Access Policies work: | Term | Description | | - | - | | Principal | A CoreWeave IAM identity (either a user or a group) that can be referenced in a policy. | | Role | A permission string enabling a set of actions that, when assigned to a principal, are permitted. | | Rule | An assignment of a role or set of roles to a principal. | | Policy | A collection of rules that assign entitlements to a set of principals. When a principal is referenced in a policy, that principal can perform the actions the policy assigns to it. | CoreWeave IAM operates on a default-deny posture. Without an access policy that grants privileges to a principal, that principal can't perform an action. ### How groups, policies, and roles relate If you're new to CoreWeave IAM, the following plain-language summary describes how the pieces fit together: * A **role** is a named bundle of permissions. Each role grants a specific set of actions, such as viewing clusters or managing billing data. You don't grant individual actions directly. You grant a role. * A **group** is a named set of users. Instead of assigning roles to people one at a time, you put related users in a group and assign roles to the group. Anyone you add to the group gains the roles the group has. An IAM Admin creates and manages groups and their memberships. * A **policy** ties everything together. A policy holds one or more rules, and each rule assigns one or more roles to a principal (a user or a group). The policy is where access is granted. In short: roles define what someone can do, groups collect the people who should be able to do it, and a policy connects roles to users or groups through its rules. To grant access, you add a rule to a policy that assigns the right role to the right principal. Structurally, the policy contains one or more rules, and each rule assigns a role to a principal. For example: ![Example IAM Access Policy assigning CKS Admin, IAM Admin, Billing Viewer, and CKS Viewer roles to two users and a group](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/access-policy.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=2e0f2644cade66f1ffd2716853dbcddc) In this example, the policy grants the following permissions: * User A has the CKS Admin role, which lets them manage Kubernetes resources. * User B has the IAM Admin and Billing Viewer roles, which let them manage IAM resources and view billing data. * Engineering Group has the CKS Viewer role, which lets them view Kubernetes resources. ## Roles A role is the unit of access you assign in a policy rule. Each role grants a fixed set of actions. Most services have a Viewer role for read-only access and an Admin role for full management. Assign the least privileged role that lets a principal do their job. For the full list of roles, grouped by functional area, and how legacy groups map to current roles, see [IAM roles](/security/iam/access-policies/roles). ## Default Access Policies CoreWeave creates and maintains Default Access Policies. The Cloud Console marks each default policy with a **Default** badge next to its name. Default policies bundle the roles required for a common access pattern. For example, the Administrator default policy includes all available roles, and CoreWeave adds new roles to it as they become available. Default policies behave differently from policies you create yourself: * **CoreWeave manages the roles.** The role set of a default policy is immutable: you can't add, remove, or otherwise edit its roles. As CoreWeave ships new products and actions, or introduces more fine-grained permissions for existing roles, CoreWeave adds the relevant roles to the applicable default policies automatically. Roles are rarely removed. * **You manage the principals.** You can add and remove principals (users and groups) on a default policy to control who it applies to. * **They can't be deleted.** Default policies don't offer a delete option. This keeps a default policy current with the platform: principals assigned to it gain access to new capabilities as they ship, without an administrator needing to track and add each new role, closing the gap described in [Legacy group role assignments](/security/iam/access-policies/roles#legacy-group-role-assignments). > [!NOTE] > > You may see a duplicate-looking policy. When CoreWeave introduces a new default policy, it's added alongside your existing policies rather than replacing them. Because CoreWeave never removes a policy you already have, a new default policy can look substantially similar to one already in your organization. This is expected behavior. > > Review the principals on each policy to decide how to proceed. Your existing non-default policies remain fully under your control: you can edit or delete them. The default policy itself can't be deleted. ## Next steps * See the full list of [IAM roles](/security/iam/access-policies/roles). * Create an [IAM Access Policy](/security/iam/access-policies/manage). * Learn about the [CoreWeave authorization model](/security/iam#authorization-model). # Legacy user permissions Source: https://docs.coreweave.com/security/iam/access-policies/legacy-permissions Reference for the CoreWeave legacy group-based permissions model > [!WARNING] > > This guide covers the legacy permissions model. For the new permissions model, see [IAM Access Policies](/security/iam/access-policies). ## About legacy permissions CoreWeave previously used a group-based permissions model with five predefined groups. This model still works, but [IAM Access Policies](/security/iam/access-policies) supersede it and offer more flexible, role-based access control. This page is a reference for administrators and organization owners whose CoreWeave organizations still use the legacy groups. Use it to understand what each legacy group grants and how those groups map to the current IAM roles. You can then interpret existing access, plan a migration, or troubleshoot permissions issues. ## Legacy user groups and permissions CoreWeave provides the following legacy user groups for organization users: * `admin` * `read` * `metrics` * `write` * `billing_viewer` Each of these groups provides varying levels of privilege within your CoreWeave organization. An administrator must add all non-administrator users to a group to allow them to interact with organization resources. Users who aren't assigned to any groups can still access the Cloud Console, but don't have any resource permissions. ### Mapping legacy groups to IAM roles The following table shows the CoreWeave legacy permissions mapped to their corresponding new roles: | CoreWeave Legacy Group | Corresponding IAM Roles | | - | - | | `admin` | IAM Admin, CKS Admin, Object Storage Admin, Access Token User, Access Request Approver | | `write` | CKS Admin, Object Storage Admin, Access Token User | | `read` | IAM Viewer, CKS Viewer, Access Token Viewer | | `metrics` | Observability Viewer | | `billing_viewer` | Billing Viewer | Roles added for newer platform features might not be automatically included in legacy admin policies. If you expect access to a feature but can't reach it, check your organization's access policies and add the relevant role if it's missing. To review and modify these role assignments or create new groups with different role combinations, use [IAM Access Policy management](/security/iam/access-policies/manage). ## Group permissions in detail The following sections describe each legacy group, the actions its members can perform, and the equivalent IAM roles in the new model. Managed Auth uses Kubernetes `RoleBindings` and `ClusterRoleBindings` to define user permissions within CKS organizations. Each organization gets a single namespace in which organization members can create clusters. Administrators can then grant users specific permissions to perform actions within a given cluster. The CKS-related legacy permission groups map directly to [standard Kubernetes user-facing groups](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles), where the CKS permission groups map accordingly to standard groups: | CoreWeave Legacy Group | Kubernetes Role Mapping | CoreWeave IAM Role Name | | - | - | - | | `admin` | `cluster-admin` | CKS Admin | | `write` | `cluster-admin` | CKS Admin | | `read` | `view` | CKS Viewer | The following CoreWeave legacy groups map to the corresponding new roles, but do not map to Kubernetes RBAC permissions: * `metrics` maps to Observability Viewer. * `billing_viewer` maps to Billing Viewer. ### `admin` group permissions > [!NOTE] > > In the [IAM Access Policies](/security/iam/access-policies) model, the `admin` group equivalent IAM roles are: IAM Admin, CKS Admin, Object Storage Admin, Access Token User, Access Request Approver. CoreWeave automatically assigns the first user who creates an organization to the `admin` group. Every organization must have at least one admin. > [!WARNING] > > Admins hold the highest level of privilege within an organization. They can make broad changes to the environment and view sensitive information about the organization, cluster configuration, and other users. Administrators can also adjust their own permissions to gain access to specific cluster resources. Assign this role carefully. Admins can assign users to groups with the command `write_groups_user_assignments` and can edit initial user access permissions until the user accepts the invitation. Admins can perform the following actions for cluster and user management: #### Manage clusters * [Create new CKS clusters](/products/cks/clusters/create) in your CoreWeave organization. * View existing cluster configurations. * Create and view cluster [API access tokens](/security/authn-authz/manage-api-access-tokens). * Create and view [SAML configurations](/security/authn-authz/saml-sso/intro-saml-sso). * Open support tickets through [Freshdesk](https://support.freshdesk.com/support/home). * View metrics and logs for all clusters. #### Manage users * Invite new users to the organization. * Assign users to specific groups, including the admin group, both before and after sending an invitation. * Deactivate other user accounts, including admin user accounts, but not their own account. * Remove users from groups. * View user groups and their members. > [!NOTE] > > Admin users can add and remove others from clusters at any time. They can also assign `admin` privileges to other users. Admins can also deactivate or reactivate users in their organization. In the [IAM Access Policies](/security/iam/access-policies) model, the IAM Admin role grants this. If your organization uses [Automated User Provisioning (AUP)](/security/automated-user-provisioning), the IdP controls the active status of the users it provisions, and admins can't deactivate those users from the Cloud Console. For the options, see [Deactivate a SCIM-managed user](/security/authn-authz/manage-users#deactivate-a-scim-managed-user). ### `write` group permissions > [!NOTE] > > In the [IAM Access Policies](/security/iam/access-policies) model, the `write` group equivalent IAM roles are: CKS Admin, Object Storage Admin, Access Token User. Users in the `write` group can perform the following actions for cluster and user management: * [Create new CKS clusters](/products/cks/clusters/create) in your CoreWeave organization. * View existing cluster configurations. * Create and view cluster [API access tokens](/security/authn-authz/manage-api-access-tokens). * Open support tickets through [Freshdesk](https://support.freshdesk.com/support/home). * View metrics and logs for all clusters. * View user groups and their members. ### `metrics` group permissions > [!NOTE] > > In the [IAM Access Policies](/security/iam/access-policies) model, the `metrics` group equivalent IAM role is: Observability Viewer. Users in the `metrics` group can perform the following actions: * Access [CoreWeave Grafana](/observability/managed-grafana) to view dashboards and explore metrics and logs for all clusters. * Access the [CoreWeave Logs and Metrics](/observability/logs-metrics/introduction) APIs to query metrics and logs for all clusters. ### `read` group permissions > [!NOTE] > > In the [IAM Access Policies](/security/iam/access-policies) model, the `read` group equivalent IAM roles are: IAM Viewer, CKS Viewer, Access Token Viewer. Users in the `read` group can perform the following actions: * View existing cluster configurations. * Open support tickets through [Freshdesk](https://support.freshdesk.com/support/home). Users in the `read` group *cannot* view metrics and logs for all clusters. ### `billing_viewer` group permissions > [!NOTE] > > In the [IAM Access Policies](/security/iam/access-policies) model, the `billing_viewer` group equivalent IAM role is: Billing Viewer. Users in the `billing_viewer` group can view billing data, including the billing dashboard, current balance, and [listing or downloading invoices](/billing). ## Next steps Migrate from the legacy groups to the new permissions model so you can use role-based access control and the full set of roles available for newer platform features. To transition to the new permissions model or create custom access policies, see [IAM Access Policies](/security/iam/access-policies). # Manage IAM access policies Source: https://docs.coreweave.com/security/iam/access-policies/manage Create, edit, and delete IAM access policies through the CoreWeave Cloud Console This page shows organization administrators how to create, edit, and delete IAM access policies using the [Cloud Console](https://console.coreweave.com/organization/iam/access-policies). Access policies let you control which principals can act on resources in your organization by assigning roles through reusable policy definitions. ## Create an access policy Create a new access policy when you need to grant a set of roles to one or more principals. To view the **Access Policies** section in the Cloud Console, you need at least the **IAM Viewer** role. 1. In the Cloud Console, navigate to the **Access Policies** page. 2. In the top-right corner, click **Create Policy**. 3. In the policy editor, enter a name for the policy. 4. Enter a description for the policy. 5. Add one or more rules to the policy. For each rule, enter a principal and a role to assign that role to the principal. 6. When you're done, click **Save Policy**. After you save the policy, it appears in the **Access Policies** list and the rules take effect for the specified principals. ## Edit an access policy Edit an existing access policy when you need to change its name, description, or the rules that determine which principals receive which roles. > [!NOTE] > > [Default Access Policies](/security/iam/access-policies#default-access-policies) have restricted edit behavior. You can only update which principals appear on a default policy. CoreWeave manages the policies, and they can't be changed. 1. In the Cloud Console, navigate to the **Access Policies** page. 2. Search for the policy you want to edit. To view policy details, expand the caret next to the policy name. 3. Click the vertical dot menu (three dots) next to the policy you want to edit, and select **Edit**. 4. Update the policy name and description, or add, edit, or delete rules in the policy: * To edit a rule, click the card for the rule you want to edit, adjust the principals and roles, and click outside the card to save your changes to the rule. * To add a rule, click the **Add Rule** button at the bottom of the policy editor, and enter the principals and roles for the new rule. * To delete a rule, click the card for the rule you want to delete, and click the **Delete** button at the bottom of the card. 5. When you're done, click **Save Policy**. ## Delete an access policy [Default Access Policies](/security/iam/access-policies#default-access-policies) can't be deleted. You can only delete policies you create yourself. * In the Cloud Console, on the **Access Policies** page, click the vertical dot menu (three dots) next to the policy you want to delete, and select **Delete**. # IAM roles Source: https://docs.coreweave.com/security/iam/access-policies/roles Reference for CoreWeave IAM roles, grouped by functional area, and how legacy groups map to them A role is the unit of access you assign in a policy rule. Each role grants a fixed set of actions. Most services have a Viewer role for read-only access and an Admin role for full management. Assign the least privileged role that lets a principal do their job. The following roles are grouped by functional area to help you pick the right one. The description states what the role grants. The "When to assign" column suggests who typically needs it. > [!NOTE] > > These roles apply to CoreWeave Infrastructure, not Forge. Forge roles belong to a separate identity and access system. See [Forge and CoreWeave identity](/security/forge-identity-and-access). ## Access control and IAM These roles manage identities, groups, access policies, and personal access tokens. | Name | Role description | When to assign | | - | - | - | | IAM Viewer | Read-only visibility across IAM configuration (for example, view organization user permitted actions, SAML configuration, AUP provisioning, API tokens, groups and memberships). | Assign to anyone who needs to review users, groups, and access policies without changing them. | | IAM Admin | Administrative control over IAM: invite and revoke users, create, delete, and update groups and memberships, and configure identity integrations (for example, SAML SSO, AUP provisioning, API tokens). | Assign to administrators who manage users, groups, and identity integrations for the organization. | | Access Token Viewer | Read-only visibility into personal access tokens (list and view). | Assign to users who need to see their personal access tokens but not create or delete them. | | Access Token User | Full management of personal access tokens: create and delete tokens for the current user as permitted by org policy. | Assign to users who need to create and delete their own API access tokens. | | Access Request Approver | Approves or denies privileged access requests. Can view the list of pending Service Account Management access requests. | Assign to people who approve support and privileged access requests. Because [approved access expires after 8 hours](/security/support-access-management), assign the role to multiple approvers so requests can be reviewed promptly. | > [!NOTE] > > On 2026-10-07, the Access Token Admin role was renamed to Access Token User. Only the display name changed. The role still lets users create and delete their own API access tokens, subject to organization policy. ## CKS clusters These roles manage CoreWeave Kubernetes Service clusters and VPC resources. | Name | Role description | When to assign | | - | - | - | | CKS Viewer | Read-only visibility into Kubernetes resources: list and view clusters and VPC resources. | Assign to engineers who need to inspect clusters and VPC resources but not change them. | | CKS Admin | Administrative control over Kubernetes resources: create, update, and delete clusters and VPC resources. | Assign to engineers who create and manage clusters and VPC resources. | ## Inference These roles manage inference gateways, deployments, capacity claims, and [hot-loads](/products/inference/rl-rollouts). | Name | Role description | When to assign | | - | - | - | | Inference Viewer | Read-only visibility into inference resources: list and view gateways, deployments, capacity claims, and hot-loads, including hot-load replica status. | Assign to users who need to monitor inference resources without changing them. | | Inference Admin | Administrative control over inference resources: create, update, and delete gateways, deployments, and capacity claims; create hot-loads. Includes Inference Viewer permissions. | Assign to engineers who deploy and manage inference workloads. | ## Sandbox These roles manage [CoreWeave Sandboxes](/products/sandboxes) policies, runners, registered Volumes, and sandbox execution. Sandbox User and Sandbox Admin apply only to customers using CoreWeave access tokens. These roles do not apply to customers using Forge API keys. | Name | Role description | When to assign | | - | - | - | | Sandbox User | Create and operate sandboxes governed by policies, and list, read, validate, and mount [registered Volumes](/products/sandboxes/volumes#registered-volumes). | Assign to researchers and engineers who run sandboxes and use registered Volumes. | | Sandbox Admin | Manage sandbox policies and create, update, and delete runners. Register, update, and delete Volumes. Includes Sandbox User permissions. | Assign to administrators who manage sandbox policies, runners, and registered Volumes. | ## Bare metal These roles manage the CoreWeave Bare Metal Service (limited availability), including BMC serial console access to nodes. [Contact support](/support/contact) to request access. | Name | Role description | When to assign | | - | - | - | | Baremetal Viewer | Read-only visibility into bare metal pools and nodes: list and view configurations. | Assign to users who need to inspect bare metal resources but not change them. | | Baremetal Admin | Administrative control over bare metal resources: create, update, and delete pools, and reboot or reconfigure nodes. | Assign to administrators who provision and manage bare metal pools and nodes. | | Baremetal Node Console Viewer | Read-only access to a node's BMC serial console: view console output only. Input from the client is dropped. | Assign to users who need to observe boot and console output for troubleshooting. | | Baremetal Node Console Admin | Full bidirectional access to a node's BMC serial console, including sending input. | Assign to administrators who need interactive console access for boot debugging. | ## Object storage The Object Storage Admin role governs CoreWeave AI Object Storage control-plane actions in the [AI Object Storage API](/products/storage/object-storage/reference/object-storage-api-ref), not bucket or object operations through the S3-compatible API. To create or delete buckets, or to work with objects, a user also needs an [organization access policy](/products/storage/object-storage/get-started-caios#create-an-organization-access-policy). The policy must include the user as a principal and allow the required `s3:` actions, such as `s3:CreateBucket` or `s3:DeleteBucket`. To learn how organization and bucket access policies are evaluated, see [About policies](/products/storage/object-storage/auth-access/policies). | Name | Role description | When to assign | | - | - | - | | Object Storage Admin | Full access to AI Object Storage `cwobject:` control-plane actions, including managing organization access policies and creating, revoking, and listing access keys. It doesn't grant S3-compatible API actions, such as creating or deleting buckets. | Assign to administrators who manage Object Storage credentials and organization-level control-plane configuration. | ## Observability and telemetry These roles cover organization custom dashboards, observability data, and Telemetry Relay configuration. Dashboard permissions are separate from access to metrics and logs. The Grafana Dashboard roles apply to your organization's custom dashboards and don't control access to CoreWeave-provided dashboards. | Name | Role description | When to assign | | - | - | - | | Grafana Dashboard Viewer | Read-only access to your organization's custom dashboards. | Assign to users who need to view custom dashboards. | | Grafana Dashboard Editor | Write access to your organization's custom dashboards. Requires Grafana Dashboard Viewer. | Assign together with Grafana Dashboard Viewer to users who create and edit custom dashboards. | | Observability Viewer | Read-only access to metrics and logs for troubleshooting and performance monitoring. | Assign to engineers who need to query observability data. | | Telemetry Relay Reader | Read-only visibility into Telemetry Relay: list and view forwarding endpoints, pipelines, and telemetry streams. | Assign to users who need to review Telemetry Relay endpoints and pipelines without changing them. | | Telemetry Relay Admin | Administrative control over Telemetry Relay: create, update, and delete forwarding endpoints and pipelines. Includes Telemetry Relay Reader permissions. | Assign to engineers who configure log forwarding to external endpoints. | ## Billing This role grants read-only access to billing data. | Name | Role description | When to assign | | - | - | - | | Billing Viewer | Read-only access to billing data, including viewing the billing dashboard, current balance, and listing and downloading invoices. | Assign to users who need to review balances and invoices. | ## Alerts and integrations These roles manage alert subscriptions and the destinations that receive them. | Name | Role description | When to assign | | - | - | - | | Alerts Viewer | Read-only access to alert history, notification delivery statuses, and the alert configuration page. | Assign to users who need to review alerts and delivery status without changing subscriptions. | | Alerts Admin | Manage which alerts the organization receives and where they are delivered: subscribe and unsubscribe alerts per destination on the alert configuration page. Includes Alerts Viewer permissions. | Assign to users who manage which alerts the organization receives and where they go. | | Integrations Viewer | Read-only visibility into notification destinations and credentials, including the Integrations page and the destinations list on the alert configuration page. | Assign to users who need to review notification destinations without changing them. | | Integrations Admin | Full management of notification destinations and credentials: create, update, and delete Slack and webhook integrations. Includes Integrations Viewer permissions. | Assign to users who configure Slack and webhook destinations for alerts. | ## Support This role grants read-only access to support records. | Name | Role description | When to assign | | - | - | - | | Support Viewer | Read-only access to support tickets and records in the integrated support system (Freshdesk). | Assign to users who need to review the organization's support tickets. | Administrators can manage resources in the Cloud Console, the API, and with infrastructure-as-code (IaC) tools like Terraform. ## Legacy group role assignments Before IAM Access Policies, user permissions were determined by the legacy group a user belonged to. The following table shows how each legacy group maps to the new IAM roles: | CoreWeave legacy group | Corresponding IAM roles | | - | - | | `admin` | IAM Admin, CKS Admin, Object Storage Admin, Access Token User, Access Request Approver | | `write` | CKS Admin, Object Storage Admin, Access Token User | | `read` | IAM Viewer, CKS Viewer, Access Token Viewer | | `metrics` | Observability Viewer | | `billing_viewer` | Billing Viewer | Roles added for newer platform features may not be automatically included in legacy admin policies. If you expect access to a feature but can't reach it, check your organization's access policies and add the relevant role if it's missing. You can review and modify these role assignments or create new groups with different role combinations using [IAM Access Policy management](/security/iam/access-policies/manage). ## Next steps * Learn about [IAM Access Policies](/security/iam/access-policies). * Create an [IAM Access Policy](/security/iam/access-policies/manage). # Where the Weights & Biases docs moved Source: https://docs.coreweave.com/forge-docs-whats-moved A map from the previous Weights & Biases documentation to its current location The Weights & Biases documentation merged into the CoreWeave docs when CoreWeave launched Forge. Forge brings Weights & Biases together with Post-Training, Serverless Inference, CoreWeave Sandboxes, and other Forge products. The content you relied on is still here. It is reorganized into this site's navigation, and the old paths redirect. This page maps each section of the old documentation site to its new location. For what changed in the product itself, such as addresses and the header, see [What moved in Forge](/forge-whats-moved). ## How this site is organized Tabs at the top of the page organize the site's content into the following areas: * **Infrastructure** covers CoreWeave's cloud platform: Kubernetes, SUNK, storage, and networking. * **Forge** holds the Weights & Biases documentation alongside the other Forge products. Its dropdown lists Forge Home, Platform (the shared admin and hosting surface), ARIA, Weights & Biases (which includes W\&B Weave), Post-Training, Agent Lens, Serverless Inference, Sandboxes, Notebooks, and Registry. * **Reference**, **Release Notes**, and **Support** each split into an Infrastructure group and a Forge group. The Forge groups hold the former Weights & Biases reference, release notes, and support content. ## Where each section went The old site used two generations of paths, and both redirect. The following table maps the major sections to their new locations. | Previous section | Previous paths | Current location | | - | - | - | | Experiments | `/guides/track`, `/models/track` | [Experiments](/products/wandb/track) | | Sweeps | `/guides/sweeps`, `/models/sweeps` | [Sweeps](/products/wandb/sweeps) | | Artifacts | `/guides/artifacts`, `/models/artifacts` | [Artifacts](/products/wandb/artifacts) | | Registry | `/guides/registry`, `/models/registry` | [Registry](/products/registry) | | Reports | `/guides/reports`, `/models/reports` | [Reports](/products/wandb/reports) | | Integrations and tutorials | `/guides/integrations`, `/tutorials` | [Integrations](/products/wandb/integrations) | | W\&B Weave | `/weave` | [Weave](/products/wandb/weave) | | Platform, hosting, and IAM | `/guides/hosting`, `/platform/hosting` | [Hosting](/products/wandb/platform/hosting) | | Python SDK and CLI reference | `/ref/python`, `/ref/cli` | [Models reference](/products/wandb/ref) | | Notebooks | `/models/notebooks` | [Notebooks](/products/notebooks) | | Serverless Inference | `/inference` | [Serverless Inference](/products/inference/serverless) | | Serverless Training | `/serverless-training` | [Serverless Training](/products/post-training/serverless-training) | | Serverless Sandboxes | `/sandboxes` | [Sandboxes](/products/sandboxes) | | ARIA | `/aria` | [ARIA](/products/aria) | | Support | `/support/...` | [Support](/support), same paths, under the Support tab | | Release notes | `/release-notes` | [Release Notes](/release-notes), in the Forge group | ## Where the SDK reference went The SDK itself did not move or change: the `wandb` package, your imports, `wandb.login()`, and environment variables such as `WANDB_API_KEY` all work exactly as before. Only the documentation moved. The reference pages live in the **Reference** tab's Forge group, starting at the [reference overview](/products/wandb/ref), and the Weights & Biases sidebar links to the same pages under **Reference**. | Reference | Previous paths | Current location | | - | - | - | | W\&B Python SDK | `/ref/python` | [Python SDK](/products/wandb/ref/python) | | Command Line Interface (CLI) | `/ref/cli` | [CLI reference](/products/wandb/ref/cli) | | Query Expression Language | `/ref/query-panel` | [Query Expression Language](/products/wandb/ref/query-panel) | | W\&B Weave SDKs and service API | `/weave/reference` | [Weave references](/products/wandb/weave/reference) | ## Finding things fast * **Search.** The search bar at the top of every page searches the whole site, so a query finds Weights & Biases and CoreWeave infrastructure pages alike. * **Ask AI.** The **Ask AI** button at the top of the page opens an assistant chat that answers questions from the documentation. * **MCP server.** The site exposes a Model Context Protocol (MCP) server, so your coding assistant can query these docs from your development environment. See [Documentation MCP server](/get-started#documentation-mcp-server). ## Previous links and repository Every major path, link, and bookmark from the former Weights & Biases website redirects to the CoreWeave website. The [wandb/docs](https://github.com/wandb/docs) GitHub repository is archived and no longer accepts issues or pull requests. Documentation is now maintained in [coreweave/docs](https://github.com/coreweave/docs). Unlike the old repository, which was public and took community pull requests, the `coreweave/docs` repo is private, and it does not accept community contributions. If you find an error or issue in the documentation, [contact support](/support/contact), or leave feedback from the **Was this page helpful?** section in the page footer. Click **Yes** or **No** . Optionally, fill out a short form to tell us more, then click **Submit feedback**. ## Related > **[Forge Home](/forge-home)** > > An overview of every product in CoreWeave Forge. > **[What moved in Forge](/forge-whats-moved)** > > Where your projects, settings, and account moved in the Forge app. # Forge Home Source: https://docs.coreweave.com/forge-home Overview of CoreWeave Forge products for developing, evaluating, and serving AI models and agents # Develop and improve AI models and agents Forge combines Weights & Biases experiment tracking with agent evaluation, Serverless Inference, Post-Training, and CoreWeave Sandboxes. If you already use Weights & Biases on Multi-tenant Cloud, your projects, runs, artifacts, and account are available in Forge. > [!NOTE] > > Forge products use different sub-processors than CoreWeave Infrastructure. For the current Forge list, see [Weights & Biases security](https://wandb.ai/site/security/). ### Develop and evaluate Track experiments, evaluate and improve agents and LLM applications, prototype in notebooks, and manage models across their lifecycle. [Weights & Biases Experiment tracking, hyperparameter sweeps, artifacts, reports, and automations, with W\&B Weave alongside for LLM and agent evaluation. Explore Weights & Biases](/products/wandb) [ARIA AI research agent that analyzes experiments, explains results, and builds visualizations and reports.](/products/aria) [Agent Lens Intelligent agent observability and improvement.](/products/agent-lens) [Notebooks Reactive Python notebooks for exploring data, prototyping model workflows, and analyzing runs and artifacts. Preview.](/products/notebooks) [Registry Versioned hub for models and datasets with lineage and deployment handoff.](/products/registry) ### Compute services Serve, fine-tune, and run models on CoreWeave infrastructure. [Post-Training Post-train and fine-tune LLMs with Serverless RL and SFT, and distill specialized models from real application traffic.](/products/post-training) [Serverless Inference Open-source foundation models through an OpenAI-compatible API, integrated with Weave.](/products/inference/serverless) [Sandboxes Isolated compute environments on serverless capacity or your own CKS cluster.](/products/sandboxes) ## Resources [Builder Resource Center Explore demos, guides, code, and events for building across CoreWeave products.](https://www.coreweave.com/builder) # What moved in Forge Source: https://docs.coreweave.com/forge-whats-moved Where to find your projects, settings, and account in Forge if you already use Weights & Biases If you already use Weights & Biases, your work is still available in CoreWeave Forge. Your projects, runs, artifacts, and credentials are unchanged. On September 30, 2026, the address bar and the top of the screen changed. This page is a map from where things were to where they are now. It applies to Multi-tenant Cloud. If you use Dedicated Cloud or Self-Managed, see [What did not change](#what-did-not-change). ## Addresses The following table maps each address you used before to its Forge equivalent. | What | Before | Now | | - | - | - | | Sign in and sign up | `wandb.ai/login` | `id.coreweave.com/login` and `/signup` | | A project | `wandb.ai/[ENTITY]/[PROJECT]` | `forge.coreweave.com/wandb/[ENTITY]/[PROJECT]` | | Your user settings | `wandb.ai/settings` | `forge.coreweave.com/settings` | | Organization settings | `wandb.ai/account-settings/[ORG]/[TAB]` | `forge.coreweave.com/account-settings/[ORG]/[TAB]` | | Your profile | `wandb.ai/[USERNAME]` | `forge.coreweave.com/profile/[USERNAME]` | | Team settings | `wandb.ai/[TEAM]/settings` | `forge.coreweave.com/wandb/[TEAM]/settings` | | Registry | `wandb.ai/orgs/[ORG]/registry/...` | `forge.coreweave.com/registry/...` | Two details are worth remembering: * **The Weights & Biases app sits under `/wandb`.** A link that used to read `wandb.ai/acme/my-project` is now `forge.coreweave.com/wandb/acme/my-project`. Old links redirect, so bookmarks keep working. * **Settings and your profile don't sit under `/wandb`.** They sit at the top level of `forge.coreweave.com`, alongside the other Forge products. Team settings are the exception and stay with the app. ## The top of the screen The global header is new and belongs to Forge rather than to Weights & Biases. The following table maps each action you took in the old header to its Forge equivalent. | What you did before | What to do now | | - | - | | Used the app switcher | Use the launcher at the far left of the header. It lists every Forge product, and the app switcher no longer exists separately. | | Clicked the bell for alerts | The bell is gone. A megaphone icon sits in roughly the same place, but it shows announcements, not alerts. | | Opened ARIA from inside a project | [ARIA](/products/aria) is in the header and available from anywhere. | | Clicked your avatar for settings | The account selector is on the right of the header, with **Profile**, **User settings**, and per-organization entries. | ### Where alerts went Alerts moved. You now configure them in three places: * **User settings** > **Alerts**, for your own run notifications * **Team settings** > **Team alerts**, for a team's Slack notifications * **Organization settings** > **Usage & Alerts**, for usage and spending thresholds ## What did not change The following did not change: * **`api.wandb.ai` still works.** Existing SDK scripts, CI jobs, and the mobile app keep running without changes. You don't need to update the `WANDB_BASE_URL` environment variable. * **Your credentials.** Sign in with the same account you used before. * **Dedicated Cloud and Self-Managed.** If you use Dedicated Cloud or Self-Managed, your deployment URLs and sign-in page are unchanged. ## Related > **[Forge Home](/forge-home)** > > An overview of every product in CoreWeave Forge. > **[Get started with Weights & Biases](/products/wandb)** > > Follow a quickstart for experiment tracking or for tracing LLM applications with W\&B Weave. > **[Forge and CoreWeave identity](/security/forge-identity-and-access)** > > For administrators: how the two identity systems relate, and where you manage each one. > **[Infrastructure and Forge billing](/billing/coreweave-and-forge-billing)** > > For administrators: which types of charges belong in which billing system, and where each billing task belongs. # ARIA Source: https://docs.coreweave.com/products/aria Analyze and run experiments, explain results, and build reports with W&B's AI research agent. ARIA, W\&B's AI Research and Iteration Agent, is your personalized research assistant that helps you analyze and run experiments, explain results, identify patterns across runs, recommend next steps, build visualizations and reports, and more in W\&B. > [!NOTE] > > Available only in [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting#wb-multi-tenant-cloud). > > ARIA works in team projects, not in your personal entity. Your organization admin must also enable **Smart features**. See [Governance and security](/products/aria/governance). ![Blank ARIA chat window](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/aria/_media/agent_empty_chat_window.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=42cbbdfb80efff27b38700c29a1a9260) ARIA can help you: * Analyze experiments to find patterns and insights. * [Run experiments and sweeps to test new ideas](/products/aria/autoresearch). * Propose next steps, such as recommending hyperparameters to try. * Create plots and panels to visualize your data. * Build saved views and reports to share insights with your team. * [Share a conversation with your organization](/products/aria/chat#share-a-conversation) so its members can read your analysis. * [Respond automatically to events in W\&B](/products/wandb/automations/create-automations/aria), such as diagnosing a failed run or reviewing a new model version. ## Quick start To [chat with ARIA](/products/aria/chat): 1. From any project, click **Ask ARIA** at the upper right corner of the page. 2. In the chat window, type your question or request. If you are unsure what to ask, select a suggested prompt. 3. Click the **Send** button, the upward-pointing arrow in the lower-right corner of the chat window. ## Start ARIA from where you work Besides **Ask ARIA** at the top of the page, you can start ARIA from buttons throughout W\&B. Most of these buttons open a new chat with a hint in the message box. You describe what you want before you send the message. | Where | Button | What ARIA helps with | | - | - | - | | Crashed or failed run's page | **Debug with ARIA** | Explain why the run crashed or failed. This button starts a new chat and asks ARIA immediately. | | Workspace **Runs** table toolbar | **Show most useful columns with ARIA** | Show, hide, pin, reorder, and resize columns in the **Runs** table. | | **Manage columns** dialog in the **Runs** table | **Manage columns with ARIA** | Show, hide, pin, reorder, and resize columns in the **Runs** table. | | **Filter** menu in the **Runs** table | **Describe the filters you want ARIA to create** text field | Filter the **Runs** table. Type a description of the runs you want and press **Enter**. ARIA proposes a **Run Filter**. Click it in the chat to apply it to your workspace. | | Saved views menu | **Ask ARIA** | Create a saved view of your workspace. | | Project's **Reports** tab | **Draft report with ARIA** | Create a new report. | | A report you own | **Edit with ARIA** | Revise the report. ARIA saves its changes to the existing report. | To give ARIA context about a specific run, workspace panel, or W\&B Weave trace or evaluation, see [Add context to a conversation](/products/aria/chat#add-context-to-a-conversation). ## Follow ARIA's progress While ARIA works, it streams its responses so you can follow its progress step by step rather than waiting for a finished answer. Depending on the complexity of your question, ARIA might take a few moments to finish. You can close the chat window while ARIA works and return to check the response later, or [queue your next message](/products/aria/chat#queue-messages) without waiting. If ARIA needs more information, it asks you for clarification. To help you stay in context, ARIA renders live, interactive panels from your Weights & Biases workspace directly in the chat, including the following: * Line plots * Bar charts * Scatter plots * Parallel coordinates * Parameter importance * Run comparer * Media panels When you hover over a run in the runs list on the **Workspace** or **Runs** tab, ARIA highlights the run's plots. When you hover over a panel in ARIA, the run is highlighted in the runs list on the **Workspace** tab. To learn about each panel type, see [View panels in the chat](/products/aria/chat#view-panels-in-the-chat). ![Workspace with an ARIA loss plot in the chat, where the run hovered in the runs list is highlighted in both the ARIA plot and the workspace panels](https://mintcdn.com/coreweave-dbfa0e8d/TqJiI6Q_VIg7BlKk/products/aria/_media/aria-line-plot-interactions.png?fit=max\&auto=format\&n=TqJiI6Q_VIg7BlKk\&q=85\&s=669e97c9098cb6564cc6f3c1e14a3de6) While ARIA works, you might see **Thinking** and **shell** steps: * **Thinking** steps summarize how ARIA approaches your question. * **shell** steps show when ARIA takes an action, such as creating a panel, filtering runs, creating and running Python scripts, and more. Click on a **Thinking** or **shell** step to expand more details about ARIA's reasoning or the action it took. For real-world examples, see [Example chats](/products/aria#example-chats). For more information about managing chats, see [Chat with ARIA](/products/aria/chat). ## View and manage project memories ARIA remembers what it learns. As you work, ARIA writes *memories* scoped to your project so it doesn't need to rediscover your setup, conclusions, or preferences from scratch in every new session. Tell it once that your team prefers log-scale charts, and it sticks. Each memory has a name and description so ARIA knows when to recall it, plus the memory text itself. Anyone in the team that owns the project can view, edit, or delete memories: 1. In the ARIA chat window, click **** (**Reveal chat history**) to open the chat history sidebar. 2. In the **Customize** section, click **Project memory**. Each memory ARIA has about the project displays. 3. To edit a memory, click ****. Update the memory's **Name**, **Description**, or **Memory**, then click **Save**. 4. To delete a memory, click ****. Without waiting for ARIA to learn new memories, you can create a project memory interactively. For example: Remember that we prefer semantic coloring for charts. Copy user prompt I’ll check the existing project memories first so this preference is recorded under the right topic rather than duplicated ... Saved a new project memory: chart-coloring. It records that charts should use consistent, semantic colors based on series/category meaning or status rather than arbitrary palette order. ## Example chats The following are examples of real chats with ARIA to illustrate how you can interact with ARIA and the types of responses you can expect. > **Run experiments based on ARIA's recommendations** > > Suppose you are an ML Engineer who has just completed a series of experiments. You want to understand what the next steps should be to improve your model's performance. > > To do this, you navigate to your project where you logged runs. You open ARIA and ask: > > ```text title="User prompt" theme={"system"} > /recommend-next-experiment > ``` > > The following is an example of how ARIA responded to this question. First, ARIA makes reasoning steps to determine how to approach the question. For brevity, only a portion of ARIA's reasoning is shown below: > > ```text title="ARIA reasoning steps" theme={"system"} > Recommendation: run one “longer-training + held-out-eval” experiment > before changing model architecture or sweeping LR. > > Use the current best setup, but train longer: > > hyperparameter_config = { > "learning_rate": 0.1, # keep fixed > "epochs": 2000, # was 1000 > "model_type": "Multivariate_neural_network_classifier", > "torch_seed": 0, # add for reproducibility > } > Also add logging for the existing held-out split every epoch or > every 10–50 epochs: > > train/train_loss > train/train_acc > test/test_loss > test/test_acc > > and save the best checkpoint by test/test_loss, not only > by training loss. > > Why this is the most promising next experiment > The project has 16 finished runs, but only 4 are actual training runs; > all four used the same training config: > > learning_rate = 0.1 > epochs = 1000 > same model: Multivariate_neural_network_classifier > > So there is no real hyperparameter comparison yet. The > strongest signal is from the learning curves: all four > training losses are still improving at the final epoch, and > the minimum training loss occurs at epoch 1000 in every run. > > I’d run: > > learning_rate: 0.1 > epochs: 2000 > model_type: unchanged > random_state: keep existing dataset split, 42 > add torch.manual_seed(0) and log it as torch_seed > evaluate on X_test, y_test each epoch or every 10 epochs > checkpoint on lowest test/test_loss > ``` > > You agree with ARIA's recommendation and ask ARIA to run the experiment for you: > > ```text title="User prompt" theme={"system"} > Run that experiment for me. > ``` > > ARIA uses W\&B Launch to run the experiment in a sandbox environment. The following image shows ARIA's response after it has completed running the experiment: > > ![ARIA running an experiment](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/aria/_media/aria_experiment.gif?s=efb0641e6d5f23b3816b3114e50a4658) > > ARIA uses W\&B Launch to run experiments in a sandbox environment. See [Enable ARIA to run experiments](/products/aria/autoresearch) for more information. > **Gain insights on your experiments** > > Suppose you are an ML Engineer who has just completed a series of runs for a new model. You want to understand how your model performed, identify potential issues, and decide on your next steps. > > To do this, you navigate to your project where you logged runs. You open ARIA and ask: > > ```text title="User prompt" theme={"system"} > What patterns do you see across my runs? > ``` > > The following is an example of how ARIA might respond to this question. First, ARIA makes reasoning steps to determine how to approach the question: > > ```text title="ARIA reasoning steps" theme={"system"} > I’m considering running a state breakdown scan with counts by state using > specific server filters. I’ll look at the array of states: ['finished', > 'running', 'crashed', 'failed', 'killed', 'pending', 'preempting'] and > determine the length of each. Summing these metrics could provide > useful insights. I should also focus on identifying objective metrics > from sample keys while excluding those that start with "_" or "system/". > It’s important to compute the best min/max for numeric summary metrics too. > ``` > > ARIA identifies that it needs to analyze the data across runs to answer the question. To do this, ARIA runs scripts in a sandbox environment that use the W\&B Python SDK to query previously logged runs and identify patterns in the data. Each step appears in the chat as it runs, and you can expand a step to see its details. > > ![ARIA thought process](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/aria/_media/agent_analyze_project.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=b17fcef3080c1721c9ff778f9c9d7107) > > Next, ARIA uses the output to generate a summary of the patterns it found across the runs, which it shares in the chat. > > ![ARIA summary of patterns across runs](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/aria/_media/agent_analyze_summary_results.gif?s=ba700bea295669047612fe1e779af794) > > ARIA was able to identify that my current experiment does not log `validation/test` metrics and recommended logging those metrics in future runs to better understand the model's performance. > > As a next step, you can ask ARIA to help set up an experiment with validation metrics logged. For example, you can ask ARIA: > > ```text title="User prompt" theme={"system"} > Can you help me update my Python script to also log validation metrics? > ``` > > ARIA can then generate the code to log validation metrics in your training script, which you can copy and paste into your codebase. > **Get recommendations for hyperparameter tuning** > > Suppose you are an ML Engineer who has just completed a series of runs for a new model. You want to understand how your model performed and get recommendations for how to improve your model's performance in future runs. You decide to ask ARIA for recommendations on hyperparameter tuning. > > You might ask ARIA: > > ```text title="User prompt" theme={"system"} > I want to conduct a sweep to improve lower my training model's loss. Do you have suggestions on what hyperparameters I should try? > ``` > > ARIA might respond with the following reasoning steps: > > ```text title="ARIA reasoning steps" theme={"system"} > The user is looking for insights to improve training loss, so I > should suggest ranges for learning rate, optimizer, batch size, > weight decay, and other relevant parameters. > > Since the user wants to conduct a sweep, I need to show the code or > instrumentation with a clear yet concise YAML or Python configuration. > I might also suggest using random or Bayesian techniques for more > effective hyperparameter selection. > ``` > > ARIA identifies that it needs to analyze the hyperparameters used in previous runs and their relationship to the training loss to provide recommendations for hyperparameter tuning. > > ARIA identifies that the given project used a learning rate of `0.01` for all runs. Based on these insights, ARIA recommends trying a lower learning rate, such as `0.001`, in future runs to see if that helps improve the model's performance. > > ARIA also identifies that all of the runs use the SGD optimizer. Based on this insight, ARIA recommends trying a different optimizer, such as Adam (Adaptive Moment Estimation), in future runs to see if that helps improve the model's performance. > > The following image shows a portion of ARIA's response with its recommendations for hyperparameter tuning: > > ![ARIA recommendations for hyperparameter tuning](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/aria/_media/agent_recommend_hyperparameter.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=5c9bfe1262326e91484e95bacba5159a) > **Create a report to share with my team** > > Suppose you are a data scientist who has been analyzing your project's runs and identified interesting patterns in the data. You want to share these insights with your team in an easy-to-digest format. You decide to ask ARIA to help you create a [W\&B Report](/products/wandb/reports). > > To do this, you open ARIA and ask: > > ```text title="User prompt" theme={"system"} > Create a report to share my findings with my team. > ``` > > ARIA might respond with the following reasoning steps: > > ```text title="ARIA reasoning steps" theme={"system"} > I’m looking to query the recent 50 runs, summarizing key frequencies > and counts by using api.runs to slice them down. I'll be counting > lengths with lazy evaluation and weaving together the stats > for a proper report. I need to include a description that might > require importing different report libraries. > ``` > > ARIA identifies that it needs to create a W\&B Report that summarizes the insights it found in the data. As part of its reasoning process, it generates a Python script that uses the W\&B SDK to create a report with the relevant data and insights. ARIA executes this script in a sandbox environment, which creates a W\&B Report in your project. > > The following image shows how ARIA creates a W\&B Report in the sandbox environment and then returns the link to the report in the chat: > > ![ARIA creates a report](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/aria/_media/agent_create_report.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=41f2b7ec4c157d0782660106cdbdf25d) > > > [!NOTE] > > > > Under the hood, ARIA creates a W\&B Report using the Workspaces and Reports API. # Use ARIA for autoresearch Source: https://docs.coreweave.com/products/aria/autoresearch Learn how to use ARIA, W&B's AI Research and Iteration Agent, to analyze results and run experiments. > [!NOTE] > > Available only in [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting#wb-multi-tenant-cloud). Use ARIA, W\&B's AI Research and Iteration Agent, as your research assistant to analyze experiments, explain results, identify patterns across runs, recommend next steps, build visualizations, and more. Based on your previous runs, ARIA can recommend and run new experiments. ARIA uses W\&B Launch to run experiments in a sandbox environment. Before ARIA can run experiments in your project, use [ARIA to help you set up W\&B Launch](/products/aria/autoresearch#set-up-wb-launch-with-aria). ## Set up W\&B Launch with ARIA ARIA can help you configure W\&B Launch from the chat. For example, if you ask ARIA: ```text title="User prompt" theme={"system"} Can you help me set up W&B Launch? ``` ARIA checks which [W\&B Launch components](/products/aria/autoresearch#launch-components) are available in your project and guides you through the remaining setup steps. The following example shows part of an ARIA response to the prompt, "Can you help me set up W\&B Launch?": > **ARIA response** > > ```text theme={"system"} > ## 1. Decide where jobs will actually run > > Pick one: > > ### Option A — Kubernetes / cluster setup > Use this if you want shared GPU/CPU infrastructure and a > persistent Launch agent. > > Recommended for “real” team usage. > > ### Option B — Local Docker setup > Use this if you want jobs to run on your own machine, > e.g. local workstation with Docker and possibly a GPU. > > Good for testing Launch quickly. > > I’d usually start with **Kubernetes** if > you have cluster access. If not, start with **Local Docker**. > > ## 2. Create a Launch queue in the W&B UI > > Go to the Launch page for the entity: https://wandb.ai/wandb/launch > > Then: > > 1. Click **Create Queue**. > 2. Select entity: `wandb`. > 3. Give the queue a name. > 4. Choose the queue resource type: > - **Kubernetes** for cluster execution. > - **Docker** for local execution. > 5. Add the queue resource configuration. > 6. Click **Create Queue**. > > ## 3. Kubernetes path: install a Launch agent with Helm > > If using Kubernetes, you need: > > - A Kubernetes cluster. > - `kubectl` access to the cluster. > - `helm` installed locally. > - A W&B **service account API key**. > - Permission to create/update/delete Kubernetes resources in the target namespace. > > Do **not** use your personal API key for the agent if this is a real > setup. Use a W&B service account key. > ``` ### Launch components W\&B Launch has three core components: * **Launch job**: A reusable blueprint for configuring and running a task in an ML workflow. * **Launch queue**: A first-in, first-out queue that submits jobs to a compute target, such as a Kubernetes cluster. * **Launch agent**: A process that polls a queue and runs jobs on the compute target configured for that queue. ARIA can manage the W\&B-side Launch workflow after a queue and active Launch agent are available. ARIA usually cannot start a durable Launch agent on your local machine, Kubernetes cluster, SageMaker environment, or Vertex AI environment. A user or administrator must provide the compute environment, credentials, and running agent. The following table summarizes the steps and who usually performs them to enable ARIA to run experiments with W\&B Launch. | Step | Usually performed by | Details | | - | - | - | | Create a Launch queue | ARIA or team admin | ARIA can help create a queue when the required permissions and target backend are clear. Team admin permissions might be required. | | Choose or provision a compute backend | Team member or infrastructure owner | ARIA needs access to a Docker host, Kubernetes cluster, SageMaker environment, or Vertex AI environment. ARIA cannot provision infrastructure unless it is already accessible through W\&B Launch. | | Start the Launch agent | Team member or infrastructure owner | The Launch agent must run persistently on your machine or cluster with W\&B credentials. | | Configure a service account or API key | Team admin | Create and store service account keys securely. For more information, see [Manage secrets](/products/wandb/platform/secrets#manage-secrets). | | Submit experiments to the queue | ARIA | After a queue has an active agent, ARIA can submit jobs, relaunch runs with config overrides, monitor results, debug failures, and compare metrics. | # Chat with ARIA Source: https://docs.coreweave.com/products/aria/chat Start, share, and organize ARIA chats, view in-chat panels, queue messages, add context, and grant network access. > [!NOTE] > > Available only in [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting#wb-multi-tenant-cloud). This page describes how to manage your conversations with ARIA: starting and resuming chats, queueing follow-up messages, adding context, granting network access, and giving feedback on responses. Context can include runs, workspace panels, W\&B Weave traces, and images. It also covers organizing your chat history by renaming, pinning, sharing, and deleting conversations. ## Start a new chat To start a new chat, open ARIA, then click the pencil icon in the upper right corner of the chat window. You can run multiple chats in parallel at a time. ARIA notifies you when it responds to a chat, even if you have closed the chat window. Starting a new chat does not delete your previous conversations. To [view previous conversations](/products/aria/chat#view-chat-history), click **** (**Reveal chat history**) to open the chat history sidebar. ## Send a message Type a message and press **Enter** to send it. * Press **Shift+Enter** to add new lines. * Click **+** to add images. * To add a run reference, type `@` and select a run from the list. Type to filter and fuzzy-search the list. * For more flexibility, compose a more complex message in a text editor and paste it. Plain text is supported, and pasted `@` characters are not resolved to run references. To cancel the current operation and *immediately* send the next [queued message](#queue-messages), press the stop icon to the right of the text input. ## View panels in the chat ARIA can answer with workspace panels that it renders directly in the chat: * [Line plots and bar charts](#line-plots-and-bar-charts) * [Scatter plots](#scatter-plots) * [Parallel coordinates](#parallel-coordinates) * [Parameter importance](#parameter-importance) * [Run comparer](#run-comparer) * [Media panels](#media-panels) ARIA chooses a panel to fit your question. To get a specific panel, name it in your request, such as `Show a parameter importance panel for val/accuracy`. These panels are live and interactive. A panel queries your Weights & Biases project when it displays, so it shows the current data for a run. You can hover over, search, and step through a panel without leaving the chat. ARIA chooses each panel's settings. Changes you make in the chat, such as turning on **diff only** in a run comparer, aren't saved. To change how a panel is set up, ask ARIA to redraw it. ### Line plots and bar charts You can open line plots and bar charts in full-screen view. When you hover over a run in the runs list on the **Workspace** or **Runs** tab, ARIA highlights the run's plots. When you hover over a panel in ARIA, the run is highlighted in the runs list on the **Workspace** tab. ![Workspace with an ARIA loss plot in the chat, where the run hovered in the runs list is highlighted in both the ARIA plot and the workspace panels](https://mintcdn.com/coreweave-dbfa0e8d/TqJiI6Q_VIg7BlKk/products/aria/_media/aria-line-plot-interactions.png?fit=max\&auto=format\&n=TqJiI6Q_VIg7BlKk\&q=85\&s=669e97c9098cb6564cc6f3c1e14a3de6) ### Scatter plots A scatter plot shows one point per run and plots two of each run's config or summary values against each other, such as a hyperparameter against a final metric. For example: ```text title="User prompt" theme={"system"} Plot learning_rate against test/accuracy for the runs in this sweep. ``` Each point uses a run's single config or summary value, not its logged history. An axis can also show when each run was created or last sent a heartbeat. To show a metric over steps, ask for a line plot instead. You can ask ARIA to set axis labels, ranges, and logarithmic scales, and to add a linear regression line. A scatter plot includes up to the first 500 visible runs. To narrow it, filter the runs, hide some runs, or ask ARIA to filter or hide runs for you or tell it which runs you are interested in. Hover over a point to see its run and values. ![Scatter plot in ARIA session with the cursor hovered over a point](https://mintcdn.com/coreweave-dbfa0e8d/DQ0io28yQjOf8RdU/products/aria/_media/aria-scatter-plot.png?fit=max\&auto=format\&n=DQ0io28yQjOf8RdU\&q=85\&s=a4c8032c14dd8663217b511a5c5bb281) ### Parallel coordinates A parallel coordinates panel draws each run as a line across two or more vertical axes, one for each config or summary value. The lines show which combinations of settings lead to a result. Use it to trace how several hyperparameters relate to a final metric. For example: ```text title="User prompt" theme={"system"} Show a parallel coordinates plot of learning_rate, batch_size, dropout, and optimizer against val/accuracy. ``` ARIA orders the axes from left to right as you list them. An axis can hold numbers or categories, such as an optimizer name. The panel includes up to 500 runs that match its filters. ![Parallel coordinates panel in an ARIA chat, with axes for learning rate, batch size, dropout, optimizer, and validation accuracy](https://mintlify.s3.us-west-1.amazonaws.com/coreweave-dbfa0e8d/products/aria/_media/aria-parallel-coordinates.png) ### Parameter importance A parameter importance panel ranks your config parameters by how much they affect one summary metric. For each parameter, it shows an importance score and the parameter's correlation with the metric, the same table as a workspace [parameter importance panel](/products/wandb/app/features/panels/parameter-importance). For example: ```text title="User prompt" theme={"system"} Show a parameter importance panel for val/accuracy. ``` By default, the panel scores every config parameter. To keep bookkeeping fields out of the table, tell ARIA which parameters to score. The panel uses up to 1,000 runs that match its filters and requires at least two. To score the runs from one sweep, tell ARIA which runs to include. ### Run comparer A run comparer arranges runs side by side, one column per run, with a row for each config, summary, and metadata value. Use it to see how a few runs differ. For example: ```text title="User prompt" theme={"system"} Show a run comparer for the best and worst runs, with only the rows that differ. ``` The panel shows up to 10 runs. In the chat, you can search the rows and turn **diff only** on or off to hide the rows that are the same across runs. ![Run comparer panel in an ARIA chat comparing the configs of two runs, with diff only turned on](https://mintlify.s3.us-west-1.amazonaws.com/coreweave-dbfa0e8d/products/aria/_media/aria-run-comparer.png) ### Media panels A media panel shows media that your runs logged, such as images, video, audio, HTML, 3D objects, and molecules. For example: ```text title="User prompt" theme={"system"} Show the sample_predictions images that the best run logged. ``` A media panel shows up to five media keys, and includes only runs that logged at least one of them. Use the slider to step through the logged media, and open media in full-screen view. You can ask ARIA to arrange the media as a gallery or a grid with a set number of columns. ### Attach a panel screenshot To ask ARIA about how a panel looks, such as overlapping lines or clipped labels: 1. Click **Attach panel screenshot** below the panel. ARIA adds an image of the panel to the message box without sending it. 2. Add your question, then send the message. **Attach panel screenshot** appears below line plots, bar charts, scatter plots, and parallel coordinates panels. ## Queue messages The message queue holds follow-up tasks and questions you send to ARIA while it works. ARIA runs each queued message in order using the full conversation as context. The next message runs as soon as the previous one finishes. Use the queue to line up several steps at once and step away, rather than returning to the chat to send each one. For example, you might start with a comparison: Compare the last 10 runs and tell me which hyperparameters mattered most. Copy user prompt Learning rate and batch size account for most of the variance in validation loss across those 10 runs. Details for each below. While ARIA works, send additional requests to the chat window. W\&B adds pending requests to ARIA's queue. This example sends two messages at once: ```text title="Queued messages" theme={"system"} Chart validation loss against learning rate for those runs. Write up the comparison as a report I can share with my team. ``` The queue header shows how many messages are waiting. Each queued message has three controls: * **Pencil icon** (): Edit the message before ARIA runs it. ARIA moves the message into the message box and removes it from the queue, so send it again to requeue it. This control is unavailable while the message box already holds a draft. * **Up arrow icon** (): Run the message now instead of waiting its turn. ARIA stops what it's working on and runs this message next. The other queued messages keep their order. * **Trash can icon** (): Delete the message from the queue. Queued messages keep the context you attached to them, including [run mentions](/products/aria/chat#add-context-to-a-conversation) and [images](/products/aria/chat#add-an-image-to-a-conversation). Queueing begins after your first message in a chat, because a queue needs a conversation to run against. The first message you send, and any message you send to an idle chat with an empty queue, goes to ARIA immediately. Each chat keeps its own queue, and the queues in chats you close keep running. If ARIA needs a clarifying answer or your permission before it continues, the queue pauses until you respond. To run a queued message without responding first, click the up arrow icon next to it. ## Jump to an earlier message In a long conversation, use the turn rail to return to an earlier message without scrolling. After you send your second message in a conversation, the rail appears along the right edge of the chat window. The rail has one mark for each message you sent. ![ARIA chat window with a preview card beside the turn rail, showing the first message's prompt and the start of ARIA's response](https://mintcdn.com/coreweave-dbfa0e8d/TqJiI6Q_VIg7BlKk/products/aria/_media/aria-turn-rail.png?fit=max\&auto=format\&n=TqJiI6Q_VIg7BlKk\&q=85\&s=ab6200118a716de6a982e9a75b1f7cd0) Use the rail to preview, jump to, and track your messages: * **Preview a message**: Move the pointer along the rail. The marks near the pointer widen, and a card shows the start of your message and a preview of ARIA's response. * **Jump to a message**: Click a mark. The chat scrolls until your message is at the top of the chat window. * **See where you are**: The mark for the message at the top of the chat window stays highlighted as you scroll. To use the keyboard, press **Tab** to move focus to a mark and show its preview card. Then press **Enter** to jump to its message. ## Manage conversations The following sections describe how to view, rename, pin, share, and delete your conversations. ### View chat history To view previous conversations: 1. Open ARIA. 2. Click **** (**Reveal chat history**) to open the chat history sidebar. It's collapsed by default. The same control reads **Collapse chat history** while the sidebar is open. 3. Select a conversation to resume it. The sidebar lists conversations in this order: 1. **Pinned**: Conversations you pinned, not grouped by date. 2. **Shared with you**: Conversations that others [shared with you](#share-a-conversation). 3. Your other conversations, grouped **Today**, **Yesterday**, **Last 7 Days**, **Last 30 Days**, then by month, then by month and year for conversations older than a year. Within each group, the most recently active conversation appears first. A shared conversation appears in **Shared with you** after you open it from its link. The group lists up to 10 shared conversations that you opened in the current browser, most recently opened first. A conversation you shared, or one shared with you, shows **** next to its title. Hover over a conversation row, or focus it with the keyboard, to reveal two controls: * **** (**Pin chat** / **Unpin chat**): see [Pin a conversation](#pin-a-conversation). * **** (**Chat actions**): opens a menu with **Rename chat**, **Share chat**, and **Delete chat**. See [Rename a conversation](#rename-a-conversation), [Share a conversation](#share-a-conversation), and [Delete previous conversations](#delete-previous-conversations). A conversation shared with you has no pin control, and its **Chat actions** menu offers only **Remove**, which removes the conversation from **Shared with you**. The chat history sidebar's **Customize** section also lists the ARIA automations you've created. See [Use automations with ARIA](/products/wandb/automations/create-automations/aria). ### Rename a conversation When you send the first message in a new chat, ARIA generates a title for the conversation. The title shimmers in the chat history sidebar while ARIA writes it. If ARIA can't generate a title, the conversation keeps an excerpt of your first prompt as its title. ARIA titles a conversation only once. Follow-up messages don't change the title. To give a conversation a different title: 1. In the chat history sidebar, hover over the conversation you want to rename. 2. Click **** (**Chat actions**), then select **Rename chat**. The title becomes an editable field. 3. Type a title, up to 255 characters. 4. Press **Enter** or click **** (**Save chat title**) to save. Press **Escape** or click **** (**Cancel rename**) to discard your change. Clearing the field and saving replaces the title with an excerpt of your first prompt, or **Untitled conversation** if no excerpt exists. Saving whitespace-only input cancels the rename instead of clearing the title. Renamed titles sync across your open browser tabs. You can also rename a chat from your phone. See [Chat with ARIA](/products/wandb/platform/hosting/monitoring-usage/mobile-app#chat-with-aria) in the mobile app docs. ### Pin a conversation Pin a conversation to keep it at the top of the chat history sidebar instead of letting it slide down as new chats accumulate. 1. In the chat history sidebar, hover over the conversation you want to pin. 2. Click **** (**Pin chat**). The conversation moves under the **Pinned** header. 3. To unpin, click **** (**Unpin chat**) on a pinned conversation. There's no limit on how many conversations you can pin, and pin changes sync across your open browser tabs. Pinning affects only your own conversation list. ### Share a conversation Share a conversation to show your organization an analysis, or to show a teammate what ARIA can do. Conversations are private to you by default. When you share one, members of your organization who have the link can read the conversation, including its panels and any messages you add later. To share a conversation: 1. Open the conversation you want to share. You can share only conversations you started, after you send the first message. 2. Click **** (**Share chat**) at the top of the chat window. You can also open the conversation's **** (**Chat actions**) menu in the chat history sidebar and select **Share chat**. 3. Under **Access**, select **Anyone at** followed by your organization's name. The conversation is shared with the organization it belongs to. If you belong to more than one organization, you can share a conversation only with the organization where you started it. 4. Click **Copy link**, then send the link to the people you want to read the conversation. To stop sharing, open the **Share chat** dialog again and select **Only you**. Members of your organization can no longer open the conversation. When a member of your organization opens a shared conversation, they get a read-only view: * They can read the conversation and explore its panels. Panels load data from the conversation's project when they display, using the viewer's own access. If the viewer doesn't have access to that project, the panels don't load. * They can't send messages to continue the conversation. In place of the message box, a line names the owner and the organization and reads **View only**. ### Delete previous conversations To delete a previous conversation: 1. Open ARIA. 2. Click **** (**Reveal chat history**) to open the chat history sidebar. 3. Hover over the conversation you want to delete, click **** (**Chat actions**), then select **Delete chat**. 4. In the **Delete this chat?** dialog, click **Delete** to confirm. You can't undo this action. ## Undock chat window You can undock the chat window into a separate window, which allows you to view ARIA's response side-by-side with your project data. To undock the chat, click the undock icon in the upper right corner of the chat window next to the close (**X**) button. ## Add context to a conversation Attach runs, workspace panels, and Weave traces and evaluations to a chat to give ARIA the exact context for your question. Each item appears in the message box as a removable tag. You can attach several items to a message. Adding context doesn't send the message on its own. When you're ready, click **Send**. When you add context from a page, ARIA adds it to the conversation that's open in the chat window. If no conversation is open, ARIA starts a new one. ### Mention a run Type `@` in the message box and select a run. For example, you can ask ARIA to analyze a specific run by including the run's name in your prompt: ```text title="User prompt" theme={"system"} Analyze the run @run-20230615_123456-abcdefg and summarize the results ``` You can also add a run from the runs list on the **Workspace** or **Runs** tab. Hover over the run, click its **action ()** menu, then select **Ask ARIA**. ### Add a workspace panel To attach a workspace panel to a chat: 1. In your workspace, hover over the panel and click its **action ()** menu. 2. Select **Ask ARIA**. ARIA opens with the panel attached. 3. Type your question, such as `Why does loss spike after step 2,000?`, then send it. **Ask ARIA** appears in panel menus in workspaces you can edit. It doesn't appear in panels in reports. ### Add Weave traces and evaluations In Weave, click the ARIA button to attach traces, evaluations, or evaluation results to a chat. Hover over the button to see its label, such as **Ask ARIA about this trace** or **Ask ARIA about these evals**. The button appears in these places: * **Traces** or **Evals** table: Select one or more rows. The button appears in the table toolbar and attaches every selected row. * **Trace or evaluation details page**: The button appears in the page header. * **Evaluation comparison**: When you compare evaluations and view an example's details, the button attaches the predictions and scores for that example. ARIA uses the attached traces and evaluations to answer your question. For example: ```text title="User prompt" theme={"system"} Why did the model score lower on these examples than in the previous evaluation? ``` ## Add an image to a conversation Click the plus icon (`+`) in the lower left corner of the chat window to add an image to your conversation. You can then ask ARIA to analyze the image or provide information about it. ## Grant network access When a task needs a domain that ARIA's sandbox blocks, ARIA asks you for network access and waits for your answer. For example, a task that installs a Python package needs `pypi.org` and `files.pythonhosted.org`. By default, the sandbox where ARIA runs code can reach W\&B services but blocks most other domains on the internet. The request appears in the chat under **The agent is requesting network access**. It shows the reason for the request and lists the requested domains, all selected. Respond to the request in one of these ways: * To grant access, clear any domains you don't want to allow, then click **Grant access**. ARIA continues its work and can reach the granted domains. * To deny access, click **Deny**. ARIA continues without the extra access. While a request is waiting, you can't send messages, and queued messages don't run. > [!WARNING] > > Code that runs in the sandbox can send data to any domain you grant. Grant access only to domains you trust. Granted domains stay available for the rest of the conversation until you revoke them. Each new chat starts with only the default access. You can't add domains yourself. ARIA requests them when a task needs them. ### Review or revoke network access After you grant access in a conversation, **** (**Manage network access**) appears in the message box, next to the plus icon (`+`). To revoke access: 1. Click **** (**Manage network access**). A list of the conversation's granted domains opens. 2. Clear the domains you want to revoke. 3. Click **Update access**. W\&B sends ARIA a message listing the revoked domains, and ARIA runs without them from then on. You can't change network access while ARIA is working. ## Provide feedback Click the thumbs up or thumbs down icon at the end of the response to provide feedback on ARIA's response. Your feedback helps W\&B improve ARIA's performance and accuracy. For information about how W\&B handles data usage for ARIA, see [Governance and security](/products/aria/governance). # Governance and security Source: https://docs.coreweave.com/products/aria/governance Learn how W&B Admins can control how your organization's data is used by W&B's AI features like ARIA. > [!NOTE] > > Available only in [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting#wb-multi-tenant-cloud). > > **Smart features** control options are available for Enterprise and Pro accounts. [W\&B Admins](/products/wandb/platform/hosting/iam/access-management-intro#manage-users-and-teams-within-an-organization) can manage access to LLM-powered features and data sharing for performance improvement. To toggle **Smart features** settings: 1. Log in to Forge. 2. Click the account selector in the upper-right corner. If your organization isn't the current account, select it under **Other accounts**, then open the menu again. 3. In the **Account** section, select **Settings**. 4. Within the **Settings** tab, select **Privacy**. 5. Scroll to the **Smart features** section. 6. Toggle the options according to your preferences. Changes are saved automatically. # Secrets in ARIA Source: https://docs.coreweave.com/products/aria/secrets Store personal secrets, such as API tokens, and let ARIA use them as environment variables in its sandbox. > [!NOTE] > > Available only in [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting#wb-multi-tenant-cloud). *Personal secrets* store sensitive values, such as API tokens, that are private to you. When you grant ARIA access to a personal secret, the secret becomes an environment variable in the sandbox where ARIA runs code, so ARIA can authenticate to an outside service on your behalf. For example, you can store a GitHub personal access token and let ARIA read your repositories, commit to a branch, or open a pull request. See [Connect a GitHub repository](#connect-a-github-repository). Personal secrets are separate from [team secrets](/products/wandb/platform/secrets), which admins manage in team settings. Personal secrets are scoped to you and to the organization selected in your account switcher: if you store your GitHub token as a personal secret, other members of your team can't use it. A personal secret takes precedence over a team secret with the same name. ## How ARIA uses a granted secret When you grant ARIA access to a personal secret, ARIA's sandbox receives an environment variable named exactly as the secret, starting with the next message you send in a conversation. You don't need to start a new chat. Revoking access works the same way: the variable is gone from the sandbox starting with your next message. Keep in mind: * The secret's value is redacted from the sandbox output that appears in the chat. * A granted secret can't replace a managed environment variable, such as `WANDB_API_KEY`. A secret whose name collides with a managed variable, or isn't a valid environment variable name, is skipped and doesn't reach the sandbox. * ARIA can use only the secrets you grant, in the organization the conversation belongs to. > [!WARNING] > > A granted secret is available to any code ARIA runs in its sandbox on your behalf. The credential's permissions set what ARIA can do with it: a GitHub token with read access lets ARIA read code and results, and one with write and pull request permissions also lets it commit changes and open pull requests. ## Create a personal secret To create a personal secret and let ARIA use it: 1. Click the account selector in the upper-right corner, then select **User settings**. 2. Scroll to the **Personal secrets** section. 3. Click **New secret**. If you don't have any personal secrets yet, click **Create new secret** instead. 4. Enter a **Name** for the secret, in environment variable form: letters, digits, and underscores (`_`), not starting with a digit. For example, `GITHUB_TOKEN`. If a team secret with the same name exists, the drawer says so. Your personal secret takes precedence over the team secret. 5. Paste the sensitive value into the **Value** field. 6. Leave **Allow ARIA to use this secret** turned on, the default, to grant ARIA access as soon as the secret exists. Turn it off to store the secret without granting ARIA access. 7. Click **Save secret**. ![The Create new secret drawer, with Name, Value, and the Allow ARIA to use this secret toggle](https://mintcdn.com/coreweave-dbfa0e8d/wtrJ2D-kpZzEJkTy/products/aria/_media/aria-secrets-new-secret-drawer.png?fit=max\&auto=format\&n=wtrJ2D-kpZzEJkTy\&q=85\&s=5e4561e5ce0a68dcfeedaed7f2970b1a) ## Grant or revoke ARIA's access You can change which of your personal secrets ARIA can use at any time, from your user settings or from the ARIA panel. Either way, the change takes effect with your next message in a conversation. ### From your user settings In the **Personal secrets** section of your user settings, each secret's row includes an **ARIA access** switch. Turn it on to grant ARIA access to that secret, or off to revoke it. ![The Personal secrets section of user settings, with an ARIA access switch on each secret's row](https://mintcdn.com/coreweave-dbfa0e8d/wtrJ2D-kpZzEJkTy/products/aria/_media/aria-secrets-personal-secrets.png?fit=max\&auto=format\&n=wtrJ2D-kpZzEJkTy\&q=85\&s=8d7c9a1e2b378aa129380fdd81b3b2f5) ### From the ARIA panel 1. In the ARIA chat window, open the chat history sidebar if it's hidden: click **** (**Reveal chat history**). 2. In the **Customize** section, click **Secrets**. The pane lists your personal secrets in the current organization, and the summary shows how many are available to ARIA. 3. Turn a secret's switch on to grant ARIA access, or off to revoke it. To create and manage the secrets themselves, click **** (**Manage personal secrets in settings**) at the top of the pane to open the **Personal secrets** section of your user settings. ![The ARIA Secrets pane, showing 2 of 3 secrets available to ARIA and a switch for each secret](https://mintcdn.com/coreweave-dbfa0e8d/wtrJ2D-kpZzEJkTy/products/aria/_media/aria-secrets-customize-pane.png?fit=max\&auto=format\&n=wtrJ2D-kpZzEJkTy\&q=85\&s=bcc4f9799ae1d22dcf079b197a89b640) ## Connect a GitHub repository The most common use for secrets in ARIA is connecting GitHub. With a GitHub personal access token stored as a personal secret, ARIA can read code from your repositories and, when the token allows it, commit to a branch and open pull requests. Nothing is installed or authorized on GitHub's side beyond the token, so what ARIA can do is decided by the token you create. To get started, click the **Connect my GitHub repo** suggestion chip in the chat window, or send `/connect-github`. The chip appears on most pages, such as a project's workspace, but not in the standalone ARIA view. ARIA asks which repository you want to connect and whether it should be able to write to it, then walks you through the following steps. ![ARIA's suggestion chips, including Connect my GitHub repo](https://mintcdn.com/coreweave-dbfa0e8d/wtrJ2D-kpZzEJkTy/products/aria/_media/aria-secrets-connect-github-chip.png?fit=max\&auto=format\&n=wtrJ2D-kpZzEJkTy\&q=85\&s=ababbe153859c039cedb598ee1c1197e) ### 1. Create a GitHub personal access token In GitHub, go to **Settings** > **Developer settings** > **Personal access tokens** and create a token: * **Fine-grained token** (recommended): Set the resource owner to your account or to the organization that owns the repository, limit **Repository access** to the repositories you want to connect, and set **Repository permissions** based on what ARIA should do: **Contents** Read-only for reading, or Read and write for committing, and **Pull requests** Read and write for opening pull requests. GitHub adds read-only **Metadata** access automatically. An organization owner might need to approve the token before it works. * **Classic token**: The `repo` scope covers reading, committing, branches, and pull requests on private repositories; `public_repo` covers public ones. In an organization that uses SAML SSO, also authorize the token for that organization with **Configure SSO**. GitHub shows the token's value once, at creation time, so copy it before you leave the page. ### 2. Save the token as a personal secret and grant ARIA access Follow the steps in [Create a personal secret](#create-a-personal-secret) to store the token. Name it `GITHUB_TOKEN`, the conventional name, or any valid environment variable name, and make sure ARIA's access to it is turned on. The token arrives in ARIA's sandbox as an environment variable with the name you chose, starting with your next message. ### 3. Approve network access to GitHub By default, the sandbox where ARIA runs code can reach Weights & Biases services but blocks most other domains, so reaching GitHub also requires a network access grant. When ARIA needs to reach GitHub, it asks in the chat for access to the domains the task needs, explains why, and waits for your answer: `api.github.com` for GitHub API calls, and `github.com` to clone or push. Click **Grant access** to approve, or **Deny** to decline. A grant applies for the rest of the current chat session, not just the message that prompted it, and it doesn't carry over to your other chats. See [Grant network access](/products/aria/chat#grant-network-access). ![ARIA requesting network access to api.github.com, with Deny and Grant access buttons](https://mintcdn.com/coreweave-dbfa0e8d/wtrJ2D-kpZzEJkTy/products/aria/_media/aria-secrets-network-access.png?fit=max\&auto=format\&n=wtrJ2D-kpZzEJkTy\&q=85\&s=4406a25305c421eb133b8a3d3892f748) ### What ARIA can do once connected With the token granted and network access approved, ask ARIA to work with the repository in plain language. Depending on the token's permissions, ARIA can: * Read and analyze code, such as cloning a repository or fetching specific files. * Commit changes to a branch and push them. * Open a pull request with its changes. For example, after connecting a repository you might ask: ```text title="User prompt" theme={"system"} Clone my-org/training-scripts, add validation metrics to train.py, and open a pull request. ``` ### Troubleshoot the connection If a GitHub request fails, ARIA reports the error from GitHub and suggests a fix. Common causes: * **`401 Bad credentials`**: GitHub rejected the token. It might be mistyped, expired, or revoked. Create a new token, update the secret's value in **Personal secrets**, and send your request again. * **`404 Not Found` for a repository you know exists**: GitHub returns 404, not 403, when a token can't see a private repository. Check that the token can reach it: * For a fine-grained token, the resource owner is the account or organization that owns the repository, the repository is included under **Repository access**, and an organization owner has approved the token if the organization requires approval. * For a classic token, it has the `repo` scope and, in an organization that uses SAML SSO, is authorized for that organization. * **`403 Forbidden` when committing or opening a pull request**: The token can read the repository but lacks write permission. Grant **Contents** Read and write, and **Pull requests** Read and write, or use a classic token with the `repo` scope. * **ARIA says the secret isn't set**: Turn on the secret's **ARIA access** switch, then send another message. A secret granted after your last message isn't visible to ARIA until your next one. # Get Started with Weights & Biases Source: https://docs.coreweave.com/products/wandb Choose a quickstart for tracking ML experiments or tracing LLM applications with Weights & Biases Weights & Biases tracks, visualizes, and compares your machine learning experiments. It includes W\&B Weave, which traces and evaluates LLM applications. Choose the quickstart that matches what you're building. | If you're | Start with | Key features | | - | - | - | | Training or fine-tuning ML models | [Track ML experiments](#track-ml-experiments) | Experiment tracking, hyperparameter optimization, artifacts, visualizations | | Tracing and evaluating existing models and applications | [Trace LLM applications](#trace-llm-applications) | Tracing, prompt management, evaluation, cost tracking for production AI apps | ## Track ML experiments > **[W\&B Quickstart](/products/wandb/quickstart)** > > The "hello world" of W\&B, which guides you to logging your first data. > **[Get started with experiments](/products/wandb/models_quickstart)** > > A full-fledged tutorial that walks through experiment tracking, Registry, and reports using a real ML experiment. > **[W\&B 101 Course](https://www.youtube.com/watch?v=UHYU2OZKGJI\&list=PLD80i8An1OEEgxMpH-SOdBCjWpT5Io5rJ)** > > A video-led course that emphasizes experiment tracking and features quizzes to ensure comprehension. > **[YouTube Tutorials](https://www.youtube.com/@WeightsBiases/courses)** > > Learn how to use W\&B to track experiments, manage artifacts, and optimize models through hands-on tutorials. ## Trace LLM applications > **[Weave Quickstart](/products/wandb/weave/quickstart)** > > Learn how to decorate your code so that calling into an LLM logs Weave traces and sets you on the path of a perfect LLM workflow. > **[Learn Weave with Serverless Inference](/products/wandb/weave/quickstart-inference)** > > A full-fledged tutorial that shows Weave doing real-world evaluation of the performance of various models hosted by Serverless Inference > **[YouTube Playlist](https://www.youtube.com/playlist?list=PLD80i8An1OEFWB5JYk1bnWVPhLRzvNkVx)** > > Learn how to use Weave to trace, evaluate, and debug LLM applications and how to use Weave to build production-ready LLM applications. # HiveMind Source: https://docs.coreweave.com/products/wandb/hivemind A shared dashboard for AI coding sessions. Track activity, spend, and outcomes across Claude Code, Cursor, Codex, Gemini CLI, and more with leaderboards, team views, and efficiency insights. HiveMind is a shared dashboard for AI coding sessions. The dashboard shows what your team is doing with agents, what that work costs, and what it produces, with leaderboards, team views, efficiency insights, and more. A lightweight HiveMind daemon runs on each developer's machine, watches for coding-agent activity, and sends session transcripts to the HiveMind service. You can use the hosted service at [hivemind.wandb.tools](https://hivemind.wandb.tools) or an instance that you [host yourself](#self-host-hivemind). HiveMind is designed for a dual audience: * **Developers and AI practitioners** can review past sessions, search their team's history, and improve how they work with coding agents. * **Engineering leaders** can track AI coding adoption, spend, and outcomes across teams and repositories. ## Quickstart > [!TIP] > > HiveMind and its documentation live on a dedicated site: [hivemind.wandb.tools](https://hivemind.wandb.tools). ### 1. Install the HiveMind daemon On each team member's local system, install the client, authenticate, and start the daemon. Choose the method that fits your platform. **Install script (macOS or Linux)** Download and run the HiveMind install script: ```bash theme={"system"} curl -fsSL https://hivemind.wandb.tools/install | sh hivemind start ``` * On macOS, the install script requires Apple Silicon. On an Intel Mac, use `uv` instead. * On an Apple Silicon Mac with Homebrew, the script installs the `wandb-hivemind` Homebrew cask. Everywhere else, it downloads a signed binary to `~/.local/bin`. * Privileged access (`sudo`) is not required. * `hivemind start` walks you through the terms of service and sign-in, then registers a background service (launchd on macOS, systemd on Linux) so the daemon keeps running and starts on login. * The daemon upgrades itself, with no action required. > [!TIP] > > For details about distributing and installing the standalone binary with fleet rollout tools like JAMF, Intune, Mosyle, Kandji, or Workspace ONE, see [MDM](https://hivemind.wandb.tools/docs/mdm) in the HiveMind documentation. **uv (macOS or Linux)** Install with `uv` on macOS or Linux: ```bash theme={"system"} uv tool install wandb-hivemind hivemind start ``` * `uv` automatically selects the correct binary for the operating system. Use `uv` on an Intel Mac or on Windows, where the install script doesn't apply. * `hivemind start` walks you through the terms of service and sign-in, then registers a background service (launchd on macOS, systemd on Linux) so the daemon keeps running and starts on login. * Upgrade with `uv tool upgrade wandb-hivemind`. You can sign in with GitHub or through your organization's single sign-on (SSO). After you sign in, the HiveMind daemon watches for coding-agent activity and sends session transcripts to the HiveMind service. To pause syncing without uninstalling the daemon, run `hivemind config set daemon.disabled true`. The background service stays loaded, so launchd and mobile device management (MDM) presence checks still pass. However, the daemon idles instead of uploading sessions, and `hivemind status` reports `Disabled`. To resume syncing, set `daemon.disabled` back to `false`. ### 2. Access the HiveMind dashboard After the HiveMind service starts receiving information from your team, access the [HiveMind dashboard](https://hivemind.wandb.tools) to track, understand, and refine your team's AI usage over time. From the HiveMind dashboard, your team can: * **See sessions across agents**: One daemon captures sessions from every supported agent, with no per-agent configuration. A session that an agent starts as a subprocess is linked to its parent, so fan-out appears as a tree rather than as unrelated sessions. * **Organize and filter sessions**: Attach key-value labels and tags to a session, then narrow the **Sessions** page to what you care about. A set of `hivemind.*` labels is derived from every session automatically, so filtering is useful before anyone tags anything by hand. To tag the session you're in, run `hivemind tag`. You can also edit tags from the **Labels** card in the session insights sidebar. To let a coding agent tag its own session, install the `hivemind-tag` skill. For details, see [Labels and tags](https://hivemind.wandb.tools/docs/labels) in the HiveMind documentation. * **Track spend and usage**: View estimated cost over time, cost by model and team, token usage, and cost per merged pull request. A session's **Timeline** tab shows how its work spread across sub-agents and workflow runs, and what each part cost. Cost figures are estimates from published model pricing and session token counts, not billed amounts from your AI vendors. To report your own token usage and cost from the command line, run `hivemind usage`. * **Measure outcomes**: Connect agent activity to pull requests, merge rates, and how much agent-written code survives. * **Track skills and slash commands**: A sortable, paginated table shows what your team invokes and how widely each one is used, with category badges and multi-select category filters. Preview a definition, then copy or download it. * **Reuse past work**: Use `@hivemind` inside Claude Code, Codex, or Cursor to search your team's session history and bring relevant context into your current session. * **Learn from history**: Import existing sessions from local tools like Claude Code or Cursor to gain new insights from prior AI usage. These screenshots show example pages in the HiveMind dashboard, including leaderboards, usage and cost breakdowns, session details, and more. Click a screenshot to view details. ![HiveMind adoption leaderboard](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-dashboard-leaderboard.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=3997855cb09ba19262fd8e507ba8ec15) ![HiveMind usage dashboard](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-dashboard-usage.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=031d3443636363f61d0cf575510e21a3) ![HiveMind cost dashboard](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-dashboard-cost.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=a55a0016d315752a20ffaeb673ab0a58) ![HiveMind recent sessions](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-recent-sessions.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=b3a8c62e736cf1c43040c400ebc41d8b) ![HiveMind session details](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-session-insights.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=0e65ad18b9d9c912c765d08627882a35) ![HiveMind session Timeline tab showing sub-agent runs](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-session-timeline.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=c611e75e9d476e997a62de603de5aae3) ![HiveMind agents by harness](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-agents-by-harness.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=aea870272bd312f75a9e3b19cbb2ff81) ![HiveMind agents by model](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-agents-by-model.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=74c4e697605cf293c1dfb5a910e7aa9f) ![HiveMind skills dashboard](https://mintcdn.com/coreweave-dbfa0e8d/h7RMJdGKpG_kL8mY/products/wandb/_media/hivemind-skills.png?fit=max\&auto=format\&n=h7RMJdGKpG_kL8mY\&q=85\&s=b7bb53f36aa1ced4455e66cf2a273c42) ## Supported agents HiveMind captures sessions from many coding agents, with no agent-specific configuration required. For example: * Claude Code * Codex * Cursor * Gemini CLI * GitHub Copilot CLI * OpenCode * Pi For the full list, see [hivemind.wandb.tools](https://hivemind.wandb.tools). With the daemon running, your session appears on the dashboard within around 30 seconds of using a supported agent. ## Self-host HiveMind To run HiveMind on your own infrastructure instead of using the hosted service, install the `hivemind` CLI on a Linux host that runs Docker with the Compose plugin. For a small team, the host requires at least 4 GB of RAM and 2 vCPUs. Then run: ```bash theme={"system"} hivemind serve up ``` On first run, a setup wizard configures network access, GitHub sign-in, the database, storage, and the large language model (LLM) that powers AI features. The wizard then starts the stack and prints a one-time URL for creating the first admin account. If your developers use GitHub Enterprise Server or GitHub Enterprise Cloud with data residency, provide your GitHub Enterprise hostname in the setup wizard. Sign-in, the GitHub App, organization and team sync, and pull request enrichment then use your GitHub Enterprise host instead of `github.com`. Daemons get the host from your server with no extra configuration. If a GitHub Enterprise Server appliance uses a private CA, each developer must also set `HIVEMIND_GITHUB_CA_BUNDLE` to the local PEM path. To connect your team, each developer runs the install script that your instance serves, which points the daemon at your server. Replace `[YOUR-HIVEMIND-DOMAIN]` with the domain of your HiveMind instance: ```bash theme={"system"} curl -fsSL https://[YOUR-HIVEMIND-DOMAIN]/install | sh hivemind login hivemind start ``` For sizing, backups, upgrades, and the configuration reference, see [Self-Hosting](https://hivemind.wandb.tools/docs/self-hosting) in the HiveMind documentation. ## HiveMind and Weave If you already use W\&B Weave, it works together with HiveMind. They cover different stages and answer different questions. * Weave observes what your AI application does in production, tracking LLM and agent traces, evaluations, and quality. * HiveMind observes how your team builds software with AI coding agents, tracking sessions, spend, and productivity. ## Next steps See the [HiveMind documentation](https://hivemind.wandb.tools/docs/overview) for full details about setup, permissions, the CLI reference, troubleshooting, and more. # Get Started with Weights & Biases Source: https://docs.coreweave.com/products/wandb/models_quickstart Track experiments, log metrics, and visualize results with Weights & Biases in a few lines of code. Learn when and how to use Weights & Biases to track, share, and manage model artifacts in your machine learning workflows. This page covers logging experiments, generating reports, and accessing logged data using the appropriate W\&B API for each task. This tutorial uses the following: * [W\&B Python SDK](/products/wandb/ref/python) (`wandb.sdk`): to log and monitor experiments during training. * [W\&B Public API](/products/wandb/ref/python/public-api) (`wandb.apis.public`): to query and analyze logged experiment data. * [W\&B Reports and Workspaces API](/products/wandb/ref/wandb_workspaces) (`wandb.wandb-workspaces`): to create a report to summarize findings. ## Sign up and create an API key To authenticate your machine with Weights & Biases, you must first generate an API key at [forge.coreweave.com/settings](https://forge.coreweave.com/settings). Copy the API key and store it securely. ## Install and import packages Install the Weights & Biases library and some other packages you will need for this walkthrough. ```python theme={"system"} pip install wandb ``` Import W\&B Python SDK: ```python theme={"system"} import wandb ``` Specify the entity of your team in the following code block: ```python theme={"system"} TEAM_ENTITY = "team_entity" # Replace with your team entity PROJECT = "my-awesome-project" ``` ## Train a model The following code simulates a basic machine learning workflow: training a model, logging metrics, and saving the model as an artifact. Use the W\&B Python SDK (`wandb.sdk`) to interact with Weights & Biases during training. Log the loss using [`wandb.Run.log()`](/products/wandb/ref/python/experiments/run#method-runlog), then save the trained model as an artifact using [`wandb.Artifact`](/products/wandb/ref/python/experiments/artifact) before finally adding the model file using [`Artifact.add_file`](/products/wandb/ref/python/experiments/artifact#add_file). ```python theme={"system"} import random # For simulating data def model(training_data: int) -> int: """Model simulation for demonstration purposes.""" return training_data * 2 + random.randint(-1, 1) # Simulate weights and noise weights = random.random() # Initialize random weights noise = random.random() / 5 # Small random noise to simulate noise # Hyperparameters and configuration config = { "epochs": 10, # Number of epochs to train "learning_rate": 0.01, # Learning rate for the optimizer } # Use context manager to initialize and close W&B runs with wandb.init(entity=TEAM_ENTITY, project=PROJECT, config=config) as run: # Simulate training loop for epoch in range(config["epochs"]): xb = weights + noise # Simulated input training data yb = weights + noise * 2 # Simulated target output (double the input noise) y_pred = model(xb) # Model prediction loss = (yb - y_pred) ** 2 # Mean Squared Error loss print(f"epoch={epoch}, loss={loss}") # Log epoch and loss to W&B run.log({ "epoch": epoch, "loss": loss, }) # Unique name for the model artifact, model_artifact_name = f"model-demo" # Local path to save the simulated model file PATH = "model.txt" # Save model locally with open(PATH, "w") as f: f.write(str(weights)) # Saving model weights to a file # Create an artifact object # Add locally saved model to artifact object artifact = wandb.Artifact(name=model_artifact_name, type="model", description="My trained model") artifact.add_file(local_path=PATH) artifact.save() ``` The key takeaways from the previous code block are: * Use `wandb.Run.log()` to log metrics during training. * Use `wandb.Artifact` to save models (datasets, and so forth) as an artifact to your Weights & Biases project. Now that you have trained a model and saved it as an artifact, you can publish it to a registry in Weights & Biases. Use [`wandb.Run.use_artifact()`](/products/wandb/ref/python/experiments/run#method-runuse_artifact) to retrieve the artifact from your project and prepare it for publication in the Model registry. `wandb.Run.use_artifact()` serves two key purposes: * Retrieves the artifact object from your project. * Marks the artifact as an input to the run, ensuring reproducibility and traceability. See [Create and view lineage map](/products/registry/lineage) for details. ## View the training data in the dashboard Navigate to your Weights & Biases dashboard. Select the **Projects** tabs and search for `my-awesome-project` (or whatever you used as a project name above). Click this to enter the workspace for your project. From here, you can see details about every run you've done. In this screenshot, the code was re-run several times, generating a number of runs, each of which is given a randomly-generated name. ![Weights & Biases project page with multiple runs in a table view, including run names, metrics, and status information](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/quickstart_image.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bd51b523b4bce2c7009d3877740b7a96) ## Publish the model to the Registry To share the model with others in your organization, publish it to a [collection](/products/registry/create_collection) using `wandb.Run.link_artifact()`. The following code links the artifact to a [registry](/products/registry), making it accessible to your team. ```python theme={"system"} # Artifact name specifies the specific artifact version within our team's project artifact_name = f'{TEAM_ENTITY}/{PROJECT}/{model_artifact_name}:v0' print("Artifact name: ", artifact_name) REGISTRY_NAME = "DemoRegistry" # Name of the registry COLLECTION_NAME = "DemoModels" # Name of the collection in the registry # Create a target path for our artifact in the registry target_path = f"wandb-registry-{REGISTRY_NAME}/{COLLECTION_NAME}" print("Target path: ", target_path) with wandb.init(entity=TEAM_ENTITY, project=PROJECT) as run: model_artifact = run.use_artifact(artifact_or_name=artifact_name, type="model") run.link_artifact(artifact=model_artifact, target_path=target_path) ``` After running `wandb.Run.link_artifact()`, the model artifact will be in the `DemoModels` collection in your registry. From there, you can view details such as the version history, [lineage map](/products/registry/lineage), and other [metadata](/products/registry/registry_cards). For additional information on how to link artifacts to a registry, see [Link artifacts to a registry](/products/registry/link_version). ## Retrieve model artifact from registry for inference To use a model for inference, use `wandb.Run.use_artifact()` to retrieve the published artifact from the registry. This returns an artifact object that you can then use [`wandb.Artifact.download()`](/products/wandb/ref/python/experiments/artifact#method-artifactdownload) to download the artifact to a local file. ```python theme={"system"} REGISTRY_NAME = "DemoRegistry" # Name of the registry COLLECTION_NAME = "DemoModels" # Name of the collection in the registry VERSION = 0 # Version of the artifact to retrieve model_artifact_name = f"wandb-registry-{REGISTRY_NAME}/{COLLECTION_NAME}:v{VERSION}" print(f"Model artifact name: {model_artifact_name}") with wandb.init(entity=TEAM_ENTITY, project=PROJECT) as run: registry_model = run.use_artifact(artifact_or_name=model_artifact_name) local_model_path = registry_model.download() ``` For more information on how to retrieve artifacts from a registry, see [Download an artifact from a registry](/products/registry/download_use_artifact). Depending on your machine learning framework, you may need to recreate the model architecture before loading the weights. This is left as an exercise for the reader, as it depends on the specific framework and model you are using. ## Share your findings with a report > [!NOTE] > > W\&B Report and Workspace API is in Public Preview. Create and share a [report](/products/wandb/reports) to summarize your work. To create a report programmatically, use the [W\&B Report and Workspace API](/products/wandb/ref/wandb_workspaces/reports). First, install the W\&B Reports API: ```bash theme={"system"} pip install wandb wandb-workspaces -qqq ``` The following code block creates a report with multiple blocks, including markdown, panel grids, and more. You can customize the report by adding more blocks or changing the content of existing blocks. The output of the code block prints a link to the URL report created. You can open this link in your browser to view the report. ```python theme={"system"} import wandb_workspaces.reports.v2 as wr experiment_summary = """This is a summary of the experiment conducted to train a simple model using W&B.""" dataset_info = """The dataset used for training consists of synthetic data generated by a simple model.""" model_info = """The model is a simple linear regression model that predicts output based on input data with some noise.""" report = wr.Report( entity=TEAM_ENTITY, project=PROJECT, title="My Awesome Model Training Report", description=experiment_summary, blocks= [ wr.TableOfContents(), wr.H2("Experiment Summary"), wr.MarkdownBlock(text=experiment_summary), wr.H2("Dataset Information"), wr.MarkdownBlock(text=dataset_info), wr.H2("Model Information"), wr.MarkdownBlock(text = model_info), wr.PanelGrid( panels=[ wr.LinePlot(title="Train Loss", x="Step", y=["loss"], title_x="Step", title_y="Loss") ], ), ] ) # Save the report to W&B report.save() ``` For more information on how to create a report programmatically or how to create a report interactively with the W\&B App, see [Create a report](/products/wandb/reports/create-a-report). ## Query the registry Use the [W\&B Public APIs](/products/wandb/ref/python/public-api) to query, analyze, and manage historical data from Weights & Biases. This can be useful for tracking the lineage of artifacts, comparing different versions, and analyzing the performance of models over time. The following code block demonstrates how to query the Model registry for all artifacts in a specific collection. It retrieves the collection and iterates through its versions, printing out the name and version of each artifact. ```python theme={"system"} import wandb # Initialize wandb API api = wandb.Api() # Find all artifact versions that contains the string `model` and # has either the tag `text-classification` or an `latest` alias registry_filters = { "name": {"$regex": "model"} } # Use logical $or operator to filter artifact versions version_filters = { "$or": [ {"tag": "text-classification"}, {"alias": "latest"} ] } # Returns an iterable of all artifact versions that match the filters artifacts = api.registries(filter=registry_filters).collections().versions(filter=version_filters) # Print out the name, collection, aliases, tags, and created_at date of each artifact found for art in artifacts: print(f"artifact name: {art.name}") print(f"collection artifact belongs to: { art.collection.name}") print(f"artifact aliases: {art.aliases}") print(f"tags attached to artifact: {art.tags}") print(f"artifact created at: {art.created_at}\n") ``` For more information on querying the registry, see the [Query registry items](/products/registry/search_registry#query-registry-items-with-mongodb-style-queries). # Use Weights & Biases with AI Assistants Source: https://docs.coreweave.com/products/wandb/platform/ai-assistants Use W&B Skills and the Weights & Biases MCP Server to automate workflows, query data, and search documentation. Weights & Biases integrates with AI assistants in two complementary ways: * **W\&B Skills** teach coding agents how to use Weights & Biases effectively in your code and analysis workflows. * **The Weights & Biases MCP Server** connects AI assistants to your Weights & Biases data and documentation so they can answer natural-language questions about your runs, traces, evaluations, and artifacts. Use Skills when you want your coding agent to write or modify Weights & Biases-aware code. Use the MCP server when you want an AI assistant to query live Weights & Biases data or search Weights & Biases documentation. The two work well together: Skills provide workflow patterns, and MCP provides data access. Depending on the integration, Weights & Biases works with several major coding agents, IDEs, and chat assistants, including: * Claude Code * Codex * Cursor * Gemini CLI * Visual Studio Code (VS Code) * Mistral LeChat * Claude Desktop For a full list of agents supported by W\&B Skills, see the [W\&B Skills CLI documentation](https://github.com/vercel-labs/skills#supported-agents). ## W\&B Skills W\&B Skills are reusable instruction sets that teach coding agents how to use Weights & Biases effectively. Instead of manually guiding your agent through W\&B APIs and best practices, install Skills so that the agent can work with experiment tracking, tracing, evaluations, and monitoring on its own. ### Capabilities Skills cover both the [W\&B Python SDK](/products/wandb/ref) (training runs, metrics, artifacts, sweeps) and the [Weave SDK](/products/wandb/weave/reference/python-sdk) (traces, evaluations, scorers). They include helper libraries, reference docs, and data analysis patterns so your agent can handle the following workflows. | Workflow | Capabilities | | - | - | | **Model training** |
  • Log metrics and rich media during training and fine-tuning.
  • Track and compare experiments.
  • Analyze runs and results, such as loss curves and accuracy scores.
  • Tune hyperparameters.
| | **Agent building** |
  • Trace agentic AI applications.
  • Analyze traces and classify failure modes.
  • Evaluate models and agents with labeled datasets.
  • Run online evaluations for production monitoring.
| ### Prerequisites W\&B Skills require the following: * [Node.js](https://nodejs.org/) for the `npx` command. * A Forge API Key. Create one at [forge.coreweave.com/settings#apikeys](https://forge.coreweave.com/settings#apikeys) and then set it as an environment variable. Replace `[YOUR-API-KEY]` with your API key: ```bash theme={"system"} export WANDB_API_KEY="[YOUR-API-KEY]" ``` * Optional: Set your Weights & Biases project name as a `WANDB_PROJECT` environment variable. This lets your agent target the correct Weights & Biases project without you specifying it each time. ### Install W\&B Skills Choose a global installation to make Skills available to all your projects, or a project-specific installation to scope Skills to a single project. To install W\&B Skills globally for all your projects, use the `--global` flag: ```bash theme={"system"} npx skills add wandb/skills --skill '*' --yes --global ``` To install Skills only for the current project, run the install command from your project directory without the `--global` flag: ```bash theme={"system"} npx skills add wandb/skills --skill '*' --yes ``` Install Skills for specific agents using the `--agent` flag: ```bash theme={"system"} npx skills add wandb/skills \ --agent claude-code \ --skill '*' \ --yes \ --global ``` For a list of `--agent` and `--skill` options, see the [Vercel Labs skills CLI documentation](https://github.com/vercel-labs/skills#supported-agents). After installation completes, your agent has access to W\&B Skills and is ready to handle Weights & Biases-related tasks. ### Use W\&B Skills Ask your agent to perform Weights & Biases-related tasks for your project. The following example prompts demonstrate some of the tasks your agent can do with W\&B Skills: * "Log training metrics for my PyTorch model to Weights & Biases." * "Analyze the loss curves for my last 10 runs and identify the best performing configuration." * "Trace my LangChain agent and log the results to Weave." * "Run an evaluation on my agent using the test dataset and summarize the results." * "Find the failure modes in my last evaluation and classify them." * "Compare the configs of run A and run B and show me the differences." ### W\&B Skills usage tips Skills performs better with specific queries than with broad, open-ended questions. The following table compares recommended prompts with prompts that are too vague. | Recommended | Not recommended | | - | - | | "What is the final validation loss for my last 5 runs?" | "How is my model doing?" | | "Summarize the token usage across my last 10 traces." | "Show me all my traces." | | "Compare the configs of run A and run B." | "What are my best runs?" | | "What eval had the highest F1 score?" | "How are my evaluations going?" | ## Weights & Biases MCP Server Model Context Protocol (MCP) is an open standard that lets AI agents call external tools. The Weights & Biases MCP Server gives your IDE, coding assistant, or chat agent direct access to your Weights & Biases data and documentation. With this access, your agent can answer questions about your runs, traces, evaluations, and artifacts without copy-paste. For details of what you can do with the server, see the [Weights & Biases MCP Server capabilities](#weights-&-biases-mcp-server-capabilities) section. ## Deployment types The Weights & Biases MCP Server is available in two deployment options. Use the hosted server for the fastest setup, or set up a local version if you need more isolation and flexibility. The local version requires your client to use a different URL to access the server. > **Hosted server (recommended)** > > A Weights & Biases-managed MCP server that your client connects to over HTTP with your API Key. No installation, no local process to maintain. > > [Use the hosted server](#use-the-hosted-server) > **Local install** > > Run the MCP server on your own machine over STDIO or HTTP. Use when you need air-gapped operation, pinning to a specific release, custom server behavior, active server development, or support for a client that only speaks STDIO. > > [Run the MCP server locally](#run-the-mcp-server-locally) ## Prerequisites Before you configure any client, make sure you have the following in place: * Create an API Key at [forge.coreweave.com/settings#apikeys](https://forge.coreweave.com/settings#apikeys). * Set the key as the `WANDB_API_KEY` environment variable, or pass it to your client as a bearer token. * For Dedicated Cloud, Self-Managed, and local installs against a non-default instance, set the `WANDB_BASE_URL` environment variable to your instance URL. * Weights & Biases pins the `mcp` SDK to [1.14.0](https://pypi.org/project/mcp/1.14.0/), release `2024-11-05`. Clients must connect using `mcp` SDK 1.14.x. For streamable HTTP support in W\&B Dedicated Cloud, `mcp` SDK 1.14.x release `2025-03-26` or newer is required. ## Use the hosted server Weights & Biases runs a managed MCP server for every deployment type. You don't need to install anything. Configure your client to connect over HTTP with an API Key in the `Authorization` header. ### Connection URL The URL depends on your type of Weights & Biases deployment: | Deployment | Server URL | | - | - | | Multi-tenant Cloud | `https://mcp.withwandb.com/mcp` | | Dedicated Cloud | `https://[YOUR-INSTANCE]/mcp` | | Self-Managed | `https://[YOUR-INSTANCE]/mcp` | For Dedicated Cloud or Self-Managed, replace `https://mcp.withwandb.com/mcp` with `https://[YOUR-INSTANCE]/mcp` and keep everything else the same. The following client configurations use the Multi-tenant URL. **Claude Code** Register the Weights & Biases MCP server with Claude Code, replacing the bearer token with your API Key: ```bash theme={"system"} claude mcp add --transport http wandb https://mcp.withwandb.com/mcp \ --header "Authorization: Bearer [YOUR-WANDB-API-KEY]" ``` Add `--scope user` to configure Claude Code globally. Omit it to configure only the current project. Verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). For more information, see [Claude Code's MCP documentation](https://docs.anthropic.com/en/docs/claude-code/mcp). **Claude Desktop** Claude Desktop's built-in custom connectors interface doesn't support API key authentication for remote MCP servers. To work around this, use the [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) npm proxy to connect Claude Desktop to the Weights & Biases remote MCP server. The proxy runs locally and forwards requests to `https://mcp.withwandb.com/mcp` with your bearer token. You need [Node.js](https://nodejs.org/) installed on your system. Open your Claude Desktop config file in a text editor. You can find the config file at the following location for your OS: * **macOS**: `~/Library/Application\ Support/Claude/claude_desktop_config.json` * **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` Add the following to the JSON object in your config file, replacing `[YOUR-WANDB-API-KEY]` with your API Key: ```json theme={"system"} { "mcpServers": { "wandb": { "command": "npx", "args": [ "-y", "mcp-remote", "https://mcp.withwandb.com/mcp", "--header", "Authorization:${AUTH_HEADER}" ], "env": { "AUTH_HEADER": "Bearer [YOUR-WANDB-API-KEY]" } } } } ``` The full header value is set through the `env` field rather than directly in `args` to work around a space-escaping issue in some Claude Desktop versions. Restart Claude Desktop to activate the new configuration. Verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). **Codex** Export your API Key as an environment variable, then register the server with Codex: ```bash theme={"system"} export WANDB_API_KEY=[YOUR-WANDB-API-KEY] codex mcp add wandb \ --url https://mcp.withwandb.com/mcp \ --bearer-token-env-var WANDB_API_KEY ``` Verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). **Cursor** Install the server in Cursor automatically with the [one-click installation link](https://cursor.com/en/install-mcp?name=wandb\&config=eyJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9tY3Aud2l0aHdhbmRiLmNvbS9tY3AiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIge3tXQU5EQl9BUElfS0VZfX0iLCJBY2NlcHQiOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2V2ZW50LXN0cmVhbSJ9fQ%3D%3D), then replace the placeholder with your API Key in the `Authorization` field. To configure Cursor manually: 1. On macOS, open **Cursor** > **Settings** > **Cursor Settings**. On Windows or Linux, open **Preferences** > **Settings** > **Cursor Settings**. 2. Select **Tools and MCP**. 3. In **Installed MCP Servers**, select **Add Custom MCP**. Cursor opens the `mcp.json` configuration file. 4. Add the following to the `mcpServers` object: ```json theme={"system"} { "mcpServers": { "wandb": { "transport": "http", "url": "https://mcp.withwandb.com/mcp", "headers": { "Authorization": "Bearer [YOUR-WANDB-API-KEY]", "Accept": "application/json, text/event-stream" } } } } ``` 5. Restart Cursor. 6. Verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). For more information, see [Cursor's MCP documentation](https://cursor.com/docs/context/mcp). **Gemini CLI** Install the Weights & Biases MCP extension: ```bash theme={"system"} gemini extensions install https://github.com/wandb/wandb-mcp-server ``` Restart Gemini CLI. Verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). For more information, see [Gemini CLI's MCP documentation](https://geminicli.com/docs/tools/mcp-server/). **Mistral LeChat** 1. In LeChat, open the **Intelligence** menu and select **Add Connector**. 2. Select **Custom MCP Connector**. 3. Configure the following fields: * **Connector Server**: `https://mcp.withwandb.com/mcp` * **Description**: (Optional) A short description. * **Authentication Method**: Select **API Token Authentication**. * **Header name**: Leave as `Authorization`. * **Header type**: Select **Bearer**. * **Header value**: Your API Key. 4. Select **Create**. 5. Verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). For more information, see [LeChat's MCP documentation](https://mistral.ai/news/le-chat-mcp-connectors-memories). **OpenAI Responses API** Add the server to the `tools` field of your OpenAI Responses API call: ```python theme={"system"} import os from openai import OpenAI client = OpenAI() resp = client.responses.create( model="gpt-4o", tools=[{ "type": "mcp", "server_label": "wandb", "server_description": "Query W&B data", "server_url": "https://mcp.withwandb.com/mcp", "authorization": os.getenv("WANDB_API_KEY"), "require_approval": "never", }], input="List my W&B entities.", ) print(resp.output_text) ``` Pass the raw API Key as the `authorization` value. OpenAI prepends `Bearer ` when it calls the server, so don't include it yourself. The OpenAI MCP integration runs server-side, so it can't reach a local MCP server. For local development, see [Run the MCP server locally](#run-the-mcp-server-locally). **VS Code** Open your global or workspace `mcp.json` (for example, `~/.vscode/mcp.json` or `.vscode/mcp.json`) and add the following: ```json theme={"system"} { "servers": { "wandb": { "type": "http", "url": "https://mcp.withwandb.com/mcp", "headers": { "Authorization": "Bearer [YOUR-WANDB-API-KEY]" } } } } ``` Restart VS Code, confirm the server appears in the MCP panel, and verify the connection by asking `List my W&B entities.` The agent should call `list_entities_tool` and return your username and any teams. If the connection fails, see [Troubleshooting](#troubleshooting). ## Run the MCP server locally A local install is an alternative to the hosted server, not the default for any deployment type. Use it when the hosted server doesn't fit your setup. Common reasons to run locally: * **Air-gapped or offline environments** where your client can't reach a hosted Weights & Biases endpoint. * **Pinned version**. The hosted server follows the main branch. A local install can pin to a specific release tag. * **Custom server behavior** such as changing tool descriptions, adding tools, or setting a non-default response token budget. * **Active development** on the server itself. * **STDIO-only clients** or clients that require a local process. For Dedicated Cloud or Self-Managed users, prefer the hosted path. Only use a local install from [wandb/wandb-mcp-server](https://github.com/wandb/wandb-mcp-server) if the hosted server isn't yet enabled on your instance or one of the preceding reasons applies. Set a `WANDB_BASE_URL` environment variable to your instance URL. ### Local prerequisites To run the server locally, make sure you have the following: * Python 3.11 or higher. * [`uv`](https://docs.astral.sh/uv/) or `pip`. * An API Key, set as `WANDB_API_KEY`. * `WANDB_BASE_URL` set to your instance URL if you use Dedicated Cloud or Self-Managed. ### Install the server Choose an install method and run the following command to install the MCP server: **uvx (no permanent install)** ```bash theme={"system"} uvx --from git+https://github.com/wandb/wandb-mcp-server wandb_mcp_server ``` **uv** ```bash theme={"system"} uv pip install wandb-mcp-server ``` **pip** ```bash theme={"system"} pip install wandb-mcp-server ``` **Install from GitHub** ```bash theme={"system"} pip install git+https://github.com/wandb/wandb-mcp-server ``` ### Configure your client After installing the server, configure your client to launch it. Select your MCP client and then run the following configuration, replacing `[YOUR-WANDB-API-KEY]` with your API Key as necessary: **Claude Code** Register the local server with Claude Code. Add `--scope user` for a global configuration. ```bash theme={"system"} claude mcp add wandb \ -e WANDB_API_KEY=[YOUR-WANDB-API-KEY] \ -e WANDB_BASE_URL=https://your-wandb-instance.example.com \ -- uvx --from git+https://github.com/wandb/wandb-mcp-server wandb_mcp_server ``` **Claude Desktop** Open your Claude Desktop config file: * **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` * **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` Add the following JSON. Use the full path to `uvx` because Claude Desktop may not find it on your `PATH` otherwise. ```json theme={"system"} { "mcpServers": { "wandb": { "command": "/full/path/to/uvx", "args": [ "--from", "git+https://github.com/wandb/wandb-mcp-server", "wandb_mcp_server" ], "env": { "WANDB_API_KEY": "[YOUR-WANDB-API-KEY]", "WANDB_BASE_URL": "https://your-wandb-instance.example.com" } } } } ``` Restart Claude Desktop to apply the configuration. **Codex** ```bash theme={"system"} codex mcp add wandb \ --env WANDB_API_KEY=[YOUR-WANDB-API-KEY] \ --env WANDB_BASE_URL=https://your-wandb-instance.example.com \ -- uvx --from git+https://github.com/wandb/wandb-mcp-server wandb_mcp_server ``` **Cursor** Add the following to your `mcp.json` configuration: ```json theme={"system"} { "mcpServers": { "wandb": { "command": "uvx", "args": [ "--from", "git+https://github.com/wandb/wandb-mcp-server", "wandb_mcp_server" ], "env": { "WANDB_API_KEY": "[YOUR-WANDB-API-KEY]", "WANDB_BASE_URL": "https://your-wandb-instance.example.com" } } } } ``` Omit `WANDB_BASE_URL` to use the default W\&B API endpoint. **VS Code** Add the following to your `.vscode/mcp.json` or global MCP configuration: ```json theme={"system"} { "servers": { "wandb": { "command": "uvx", "args": [ "--from", "git+https://github.com/wandb/wandb-mcp-server", "wandb_mcp_server" ], "env": { "WANDB_API_KEY": "[YOUR-WANDB-API-KEY]", "WANDB_BASE_URL": "https://your-wandb-instance.example.com" } } } } ``` ### Run the server with HTTP transport For web-based clients and for testing, run the server with HTTP transport: ```bash theme={"system"} uvx wandb_mcp_server --transport http --host 0.0.0.0 --port 8080 ``` To expose a local server to external clients, such as the OpenAI Responses API, use a tunnel: ```bash theme={"system"} uvx wandb_mcp_server --transport http --port 8080 # In another terminal ngrok http 8080 ``` Update your MCP client configuration to use the tunnel URL. ### Environment variables The following environment variables control authentication, instance routing, and server behavior for local installs. Set them in your client's `env` block or export them in your shell. | Variable | Description | | - | - | | `WANDB_API_KEY` | API Key for authentication. Required. | | `WANDB_BASE_URL` | Custom Weights & Biases instance URL for Dedicated Cloud or Self-Managed. Defaults to `https://api.wandb.ai`. | | `WANDB_MCP_PROXY_DOCS` | Enable the `search_wandb_docs_tool` documentation search proxy. Default: `true`. | | `WANDBOT_BASE_URL` | Custom endpoint for the docs search proxy. | | `MAX_RESPONSE_TOKENS` | Token budget for tool-response truncation. Default: `30000`. | | `MCP_SERVER_LOG_LEVEL` | Logging verbosity. One of `DEBUG`, `INFO`, `WARNING`, `ERROR`. | For the complete command-line reference and advanced options, see the [wandb-mcp-server README](https://github.com/wandb/wandb-mcp-server#readme). ## Weights & Biases MCP Server capabilities Use the MCP server to analyze experiments, debug traces, create reports, manage registry and artifacts, and answer questions from the Weights & Biases docs. The following example prompts demonstrate some of the tasks you can ask your agent to perform when it's connected to the Weights & Biases MCP Server: * "Show me the top 5 runs by `eval/accuracy` in `your-team/your-project`." * "How did the latency of my hiring agent's predict traces evolve over the last month?" * "Generate a W\&B report comparing decisions made by the hiring agent last week." * "What versions of the `production-model` artifact exist, and what changed between `v2` and `v3`?" * "How do I create a leaderboard in Weave?" ### Available tools The server offers several tools grouped by purpose. The following table lists each tool's name, when the agent should use it, and a concrete prompt you can use to invoke that tool. **Discovery** Tools that help you discover project and entity names, and inspect schemas. | Tool | Use when | Example prompt | | - | - | - | | `list_entities_tool` | No entity is specified, or to enumerate the teams and accounts the API key can reach. | "What Weights & Biases teams do I have access to?" | | `query_wandb_entity_projects` | The entity is known but the project name is not, or an earlier query failed with "project not found". | "List all projects under `your-team`." | | `probe_project_tool` | To discover available metrics, config keys, and tags in an unfamiliar run-based project. | "Probe `your-team/your-project` and tell me what metrics are logged." | | `infer_trace_schema_tool` | To discover field names, types, and sample values in an unfamiliar Weave traces project before querying. | "What fields are on the Weave traces in `your-team/your-project`?" | **Experiments and runs** Tools that query, compare, and diagnose W\&B runs. | Tool | Use when | Example prompt | | - | - | - | | `query_wandb_tool` | The question is about runs, sweeps, configs, summaries, or artifacts in Weights & Biases. Runs a GraphQL query. | "Show me the top 5 runs by `eval/accuracy` in `your-team/your-project`." | | `get_run_history_tool` | The question is about training curves, metric trends over time, or any time-series logged to a run. | "Plot the loss curve for run `abc123` in `your-team/your-project`." | | `compare_runs_tool` | The question is what changed between two runs, or which of two runs is better. Returns config diff, metric delta, and optional aligned history. | "Compare runs `abc123` and `def456` in `your-team/your-project`." | | `diagnose_run_tool` | The question is whether a run converged, is overfitting, or hit NaN values. Returns specific recommendations. | "Is run `abc123` in `your-team/your-project` overfitting?" | **Weave traces** Tools that query and aggregate LLM traces and evaluations. | Tool | Use when | Example prompt | | - | - | - | | `query_weave_traces_tool` | Trace data is required (LLM calls, evaluations, agent runs). Start with `detail_level="summary"` and escalate to `"full"` only for specific traces. | "Show me failed traces in `your-team/your-project` from the last 24 hours." | | `count_weave_traces_tool` | The question is how many traces or how many errors, and the trace data itself isn't needed. | "How many traces failed in `your-team/your-project` this week?" | | `resolve_trace_roots_tool` | After `query_weave_traces_tool` finds child traces, to map each back to its root session or workflow in one batched call. | "Find LLM calls that contain `rate limit` and tell me which sessions they belong to." | | `summarize_evaluation_tool` | The question is how an eval went, what the pass rate is, or which tasks fail most. Aggregates `Evaluation.evaluate` hierarchies. | "Summarize the most recent eval in `your-team/your-project`." | **Reports** Tools that persist analysis back to Weights & Biases. | Tool | Use when | Example prompt | | - | - | - | | `create_wandb_report_tool` | An explicit request to create a report or save findings. Accepts Markdown plus a `panels` array for line plots, bar plots, and run comparisons. | "Create a W\&B report comparing runs `abc123` and `def456`." | | `log_analysis_to_wandb` | Values computed in the MCP session (latency distributions, error breakdowns) need to be persisted as a run before being referenced in a report. | "Log these latency percentiles to Weights & Biases as an analysis run." | **Artifacts and registry** Tools that enable you to inspect and diff models, datasets, and other versioned artifacts. | Tool | Use when | Example prompt | | - | - | - | | `list_registries_tool` | The question is about model registries, registered models, or registered datasets in an organization. | "What registries exist in `your-org`?" | | `list_registry_collections_tool` | To see what models or datasets live inside a specific registry. | "What collections are in the `model` registry of `your-org`?" | | `list_artifact_versions_tool` | To list available versions of a model, dataset, or other artifact collection. | "List versions of `production-model` in `your-team/your-project`." | | `get_artifact_details_tool` | To inspect one specific artifact version, including lineage and files. | "What is in `production-model:v3`?" | | `compare_artifact_versions_tool` | The question is what changed between two artifact versions. | "Diff `production-model:v2` and `production-model:v3`." | **Docs** Tools that answer product questions from the official Weights & Biases documentation. | Tool | Use when | Example prompt | | - | - | - | | `search_wandb_docs_tool` | The question is how to use a Weights & Biases or Weave feature or API. Proxies [docs.wandb.ai](/forge-home). | "How do I create a leaderboard in Weave?" | ### Schema-first trace queries For Weave trace queries, call `infer_trace_schema_tool` first to discover available fields, then call `query_weave_traces_tool` with a precise column list and `detail_level`: | `detail_level` | Returns | Use when | | - | - | - | | `schema` | Structural fields only. Fastest. | Browsing or counting. | | `summary` | Truncated inputs and outputs. The default. | Most analysis tasks. | | `full` | Everything untruncated. | Drilling into a small number of specific traces. | This pattern keeps token usage low for broad questions and lets the agent escalate to `full` only for the traces that matter. ## Usage tips The following sections describe practices and workflows that help you get better results from the Weights & Biases MCP Server. Start with the general practices, then read the section that matches your workload for more specific advice and multi-step tool chains. ### General best practices Follow these practices regardless of your use case: * **Specify the entity and project.** MCP tools need an explicit entity (your team or personal account) and project name. Include both in every question, for example "in `your-team/your-project`". * **Ask focused questions.** Prefer "Which eval had the highest F1 score?" to "What is my best evaluation?". Specific metrics and time ranges produce better tool calls. * **Verify full retrieval.** For broad questions such as "What are my best performing runs?", ask the agent to confirm it retrieved all available runs rather than only the most recent ones. * **Combine with W\&B Skills.** [W\&B Skills](#w\&b-skills) teach coding agents how to structure Weights & Biases workflows. Skills provide patterns and MCP provides data access, and the two work well together. ### For trace-heavy workflows Follow these practices when working with Weave traces: * **Start with the schema.** Call `infer_trace_schema_tool` before `query_weave_traces_tool` to provide the agent with the valid fields and filter values. * **Pick the right `detail_level`.** Use `schema` to browse, `summary` (the default) for analysis, and `full` only when drilling into a small number of specific traces. * **Chain `resolve_trace_roots_tool`.** After a child-trace query, pass the resulting `trace_id` list to `resolve_trace_roots_tool` to map each trace to its root session in one batched call. * **Prefer `summarize_evaluation_tool` for evals.** It aggregates the `Evaluation.evaluate` and `predict_and_score` hierarchy automatically. Only fall back to `query_weave_traces_tool` for raw trace data. For an end-to-end workflow, see [Triage failing LLM calls](#triage-failing-llm-calls). ### For run-heavy workflows Follow these practices when working with W\&B runs: * **Probe before you query.** Call `probe_project_tool` on an unfamiliar run-based project to discover metric keys, config keys, and tags before constructing GraphQL. * **Use `get_run_history_tool` for time series.** GraphQL doesn't sample, so for loss curves and other time-series data `get_run_history_tool` is both faster and cheaper. * **Let `compare_runs_tool` do the diff.** It returns config and metric deltas with aligned history in a single call, avoiding manual comparison. * **Run a health check first.** When a training run looks wrong, call `diagnose_run_tool` before digging into history manually. For end-to-end workflows, see [Diagnose a bad training run](#diagnose-a-bad-training-run) and [Summarize evals and compare model versions](#summarize-evals-and-compare-model-versions). ### For Dedicated Cloud and Self-Managed Follow these practices for non-multi-tenant deployments: * Prefer the hosted server on your instance at `https://[YOUR-INSTANCE]/mcp`. It exposes the same tools as the Multi-tenant server with no client-side `WANDB_BASE_URL` needed. Only fall back to a local install if the hosted server isn't yet enabled. * When you do run locally against your instance, set `WANDB_BASE_URL` to your instance URL in the client's `env` block. Without it, the server targets `api.wandb.ai` and the server returns no data. * Rate limits on Dedicated Cloud are separate from Multi-tenant. See [Dedicated Cloud rate limits](/products/wandb/platform/hosting/hosting-options/dedicated-cloud/rate-limits) for defaults and how to request changes. ### For local installs Follow these practices when running the server on your own machine: * Prefer STDIO transport for desktop clients (Cursor, VS Code, Claude Code, Claude Desktop). Only switch to HTTP transport when a client explicitly requires it (for example, the OpenAI Responses API). * When tool calls fail silently, set `MCP_SERVER_LOG_LEVEL=DEBUG` in the client's `env` block and recheck the client's MCP logs. * If you install from GitHub (`uvx --from git+https://github.com/wandb/wandb-mcp-server wandb_mcp_server`), `uvx` pins to the default branch. Pin an explicit tag by appending `@v0.3.2` to the Git URL when you need a stable version. ## Recommended workflows Most real questions need more than one tool. The following workflows show common multi-step tool chains you can ask your agent to perform. ### Explore an unfamiliar project To explore what has been logged to a project, chain these tools: 1. `list_entities_tool` to find an entity or team. 2. `query_wandb_entity_projects` to find the project. 3. `probe_project_tool` for run-based projects, or `infer_trace_schema_tool` for Weave trace projects. 4. A targeted `query_wandb_tool` or `query_weave_traces_tool` call using the discovered keys. ### Triage failing LLM calls To find bad traces and the sessions that produced them, chain these tools: 1. `query_weave_traces_tool` with a filter on error or exception fields, and `detail_level="summary"`. 2. `resolve_trace_roots_tool` on the resulting `trace_id` list to map each failure to its root session. 3. `query_weave_traces_tool` with `detail_level="full"` on a small number of specific roots to drill in. 4. `create_wandb_report_tool` to document the findings. ### Diagnose a bad training run To run a health check on a suspicious training run, chain these tools: 1. `get_run_history_tool` to pull the loss and validation curves. 2. `diagnose_run_tool` for automated convergence, overfitting, and NaN checks. 3. `compare_runs_tool` against a known-good baseline run. 4. `create_wandb_report_tool` with line-plot panels to share the diagnosis. ### Summarize evals and compare model versions To find which model version performed best on an evaluation, chain these tools: 1. `summarize_evaluation_tool` for per-scorer pass rates and error counts. 2. `list_artifact_versions_tool` on the relevant model collection. 3. `compare_artifact_versions_tool` between the candidate and current production version. 4. `log_analysis_to_wandb` and `create_wandb_report_tool` to publish the comparison. ## Troubleshooting Use the following table to help you diagnose and resolve issues using the Weights & Biases MCP Server: | Symptom | Cause and fix | | - | - | | `401 Unauthorized` or `Invalid API key` | Your API Key is missing, malformed, or not authorized for the target entity or team. Regenerate a key at [forge.coreweave.com/settings#apikeys](https://forge.coreweave.com/settings#apikeys) and confirm it is passed as a bearer token or set in `WANDB_API_KEY`. | | Empty results for queries you expect to succeed | The team, entity, or project name is incorrect, or the API key doesn't have access. Confirm both with the agent and retry. | | `404 Not Found` or `connection refused` on `https://[YOUR-INSTANCE]/mcp` | The hosted MCP server isn't yet enabled on your Dedicated Cloud or Self-Managed instance, or the client is pointed at the wrong URL. Contact [Weights & Biases support](mailto:forge-support@coreweave.com) to request enablement, then confirm the URL in [Connection URL](#connection-url). | | `429 Too Many Requests` on Dedicated Cloud | You have hit your instance's rate limits. See [Dedicated Cloud rate limits](/products/wandb/platform/hosting/hosting-options/dedicated-cloud/rate-limits) for how to request higher limits. | | Local server can't find `uvx` in Claude Desktop | Use the full path to `uvx` in the `command` field of `claude_desktop_config.json`. | # Settings Source: https://docs.coreweave.com/products/wandb/platform/app/settings-page Use the Weights & Biases Settings page to customize your individual user profile or team settings. Use the Weights & Biases Settings page to customize your individual user profile and manage settings for the teams you belong to. The following sections summarize what you can configure at each level, with links to the detailed pages. The user settings page supports the following actions: * [Edit your profile](/products/wandb/platform/app/settings-page/user-settings#profile), including your profile picture, display name, geographic location, biography information, and email addresses associated with your account. * [Configure API keys](/products/wandb/platform/app/settings-page/user-settings#api-keys). * [Configure alerts](/products/wandb/platform/app/settings-page/user-settings#alerts) for runs. * [Delete your account](/products/wandb/platform/app/settings-page/user-settings#delete-your-account). For more information, see [User settings](/products/wandb/platform/app/settings-page/user-settings). If you belong to one or more teams, the team settings page supports the following actions: * [Invite or remove members](/products/wandb/platform/app/settings-page/teams#members) from a team. * [Manage alerts](/products/wandb/platform/app/settings-page/teams#alerts) for team runs. * [Change privacy settings](/products/wandb/platform/app/settings-page/teams#privacy). * [View and manage team storage](/products/wandb/platform/app/settings-page/teams#usage) usage. For more information about team settings, see [Team settings](/products/wandb/platform/app/settings-page/teams). # Manage billing settings Source: https://docs.coreweave.com/products/wandb/platform/app/settings-page/billing-settings View plan details, monitor usage, and configure usage and spending alerts for your Weights & Biases organization. The **Billing** settings page lets organization and billing admins review the current plan, monitor usage, configure usage and spending alerts, manage payment methods, and access invoices. Use this page to keep your organization within its usage limits and to stay informed about upcoming charges. If you also use CoreWeave Infrastructure, see [CoreWeave Infrastructure and Forge billing](/billing/coreweave-and-forge-billing) for which types of charges belong in which billing system and where each billing task belongs. Forge billing settings cover the Forge organization only; they don't include Cloud Console infrastructure usage. To open billing settings: 1. In the top right corner, click your user icon. 2. From the dropdown, choose **Billing**, or choose **Settings** and then select the **Billing** tab. ## Plan summary The **Plan summary** section names your organization's current plan and lists its main allowances, such as seats, storage, and Weave data ingestion, with current usage against each. To change your plan, click **Talk to sales**. ## Current usage The **Current usage** section shows one tile per product, with usage for the current billing period against its limit. Tiles are grouped into **Plan allowances**, for products included in your plan, and **Trials**, for products on a free trial, which show when the trial expires. From a tile, you can take the following actions: * To see details and a list of users, click **Manage users** on the **Models seats** tile. * To manage storage in use or purchase more, click **Manage storage** on the **Models storage** tile. Learn more about [storage settings](/products/wandb/platform/app/settings-page/storage). * To open that product's usage chart, click **View usage**. To explore usage trends over time, see [View usage over time](#view-usage-over-time). For questions about usage or billing, contact your AISE or [Support](mailto:forge-support@coreweave.com). ### View usage over time Organization admins can visualize usage trends for each category in the **Usage & Alerts** tab. > [!NOTE] > > This feature isn't enabled for every organization yet. If you don't see it, contact [Support](mailto:forge-support@coreweave.com) or your AISE. Select your deployment type for instructions: **Multi-tenant Cloud** 1. In the top right corner, click your user profile icon. 2. In the **Account** section, click **Billing**. 3. Click the **Usage & Alerts** tab. 4. From the sidebar, select a category to display its **Usage over time** chart. **Dedicated Cloud and Self-Managed** 1. In the top right corner, click your user profile icon. 2. Click **Organization Dashboard**. 3. Click **Usage & Alerts**. 4. From the sidebar, select a category to display its **Usage over time** chart. > [!NOTE] > > Organization admins see usage across all teams. Team admins see the same charts, limited to the teams they administer. The categories in the sidebar depend on which products are active in your deployment, and can include **Storage**, **Tracked Hours**, **Weave**, **Inference**, **Training**, **AI Research & Iteration Agent** (ARIA), and **Sandboxes**. ![Usage over time chart for the current billing cycle, showing cumulative daily usage segmented by team above a stats bar](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/billing_usage_chart_current_cycle.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a545347e53954c21a65286346c958a17) Use the controls above the chart to change what it shows: * **Time range**: Choose **Current cycle** (the default for most categories), **Last 30 days**, **Last 90 days**, **Last 12 months**, or **Last 24 months**. Storage defaults to **Last 12 months**. * **Team**: Choose **All teams** to see organization-wide usage, or select an individual team to see only its usage. The searchable dropdown lists teams from highest to lowest usage. Each bar is segmented by team. The five teams with the highest usage across the selected time range each appear in their own color, and all remaining teams are grouped into **Other**. To see per-team usage, hover over a bar. The bar for the current period is marked as in progress. To export usage data, click the download icon in the top right corner of the chart. The export returns a monthly usage breakdown by team and project for the last 24 months, regardless of the selected time range. #### Current cycle compared to historical views The **Current cycle** view is *cumulative*: each bar adds to the previous one to show your running total usage since the start of the current billing period. Use this view to see how your usage is pacing against its allowance. Granularity depends on the length of your billing cycle. For example, a monthly cycle shows daily bars and an annual cycle shows monthly bars. The **Last 30 days**, **Last 90 days**, **Last 12 months**, and **Last 24 months** views are *historical*: each bar shows the usage for a single day or month rather than a running total. Use these views to compare usage across past periods. Because the top five teams are recalculated for the selected range, the colored teams can differ from those in the current cycle. Storage is always cumulative, because it measures the total volume currently stored (a 30-day weighted average, in GB) rather than usage consumed during a period. ![Storage usage over time for the last 12 months, measured as a 30-day weighted average, expressed in GB with one bar per month segmented by team](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/billing_usage_chart_12_months.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=9bb506b74ab6517d6499db4c640ff204) #### Stats bar and threshold lines When both **Current cycle** and **All teams** are selected, a stats bar above the chart summarizes **Usage**, **Allowance**, and **Daily Average Usage**. Storage charts do not display a stats bar or daily average usage. Instead, **Total usage** above the chart shows the storage volume for the most recent period in the selected range. When a category has a defined allowance, the chart displays two threshold lines: a gold line at 85% of the allowance and a red line at 100%. These lines mark where [usage alerts](#usage-alerts) are sent to admins. Usage can exceed these thresholds. The lines are visual guides only. ![Usage over time chart showing a gold 85% threshold line and a red 100% threshold line, with cumulative usage exceeding the allowance](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/billing_usage_chart_thresholds.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=ae30af1eaf2bcca13441d686f0a3894a) For categories with no usage limit, **Allowance** displays as **Unlimited** and no threshold lines appear. ### View and manage usage Alerts Usage alerts notify organization and billing admins by email when your organization reaches 85% and 100% of its usage limit for the current billing period in a given category. Configure usage alerts to monitor consumption and avoid unexpected overages. Usage alerts are available for the following categories: | Category | Description | | - | - | | Storage | Total accumulated volume of your organization's stored artifacts and run data, measured in GB. | | Weave | Total volume of data imported during the billing period, measured in MB. Shown only if Weave is active in the deployment. | | Inference | Total input and output tokens used by Inference. See [Inference Pricing](https://coreweave.com/forge-pricing/inference-agents). Shown only if Inference is active in the deployment. | | Tracked Hours | Time your runs spend actively computing or logging. Available on the Pro plan only. | Which categories support alerts depends on your plan: | Plan | Categories that support alerts | | - | - | | Enterprise | Weave, Inference | | Pro | Storage, Weave, Tracked Hours, Inference | | Free or Academic | Storage, Weave, Inference | | Dedicated Cloud or Self-Managed | Weave | > [!NOTE] > > Training, Sandboxes, ARIA, and user seats do not support usage or spend alerts on any plan. Alerts are also unavailable during a trial. For organizations on the **Enterprise** plan, all **Organization admins** and **Billing admins** receive and can configure usage alerts. On the [Pro plan](https://coreweave.com/forge-pricing), only the **Billing admin** receives usage alerts. Messages are sent from `forge-support@coreweave.com`. The thresholds are not configurable, but you can selectively turn off one or both alerts per category. To configure usage alerts for your organization, you must be an **Organization admin** or **Billing admin**. 1. In the top right corner, click your user profile icon. 2. In the **Account** section, click **Billing** or **Settings**, then click the **Usage & Alerts** tab. 3. From the sidebar, select a category. 4. Select **Usage alerts** to view your organization's usage and alert settings for that category. 5. Turn on or off the **85% usage alert** or **100% usage alert** for that category. \[!WARNING] With no active usage alerts for a category, your organization could reach 100% of usage in a category without warning. ### View and manage spending Alerts In a given billing period, spending alerts notify organization and billing admins by email when your organization reaches one or more customizable spending thresholds expressed in USD. Use spending alerts to track costs against a budget you define. You can configure up to five unique spending alerts per category: | Category | Description | | - | - | | Storage | Charges for your organization's storage [usage](#usage-alerts) during the billing period. See [Pricing](https://coreweave.com/forge-pricing). | | Weave | Charges for your organization's Weave [usage](#usage-alerts) during the billing period. See [Pricing](https://coreweave.com/forge-pricing). Shown only if Weave is active in the deployment. | | Inference | Charges for your organization's Inference [usage](#usage-alerts) during the billing period. See [Inference Pricing](https://coreweave.com/forge-pricing/inference-agents). Shown only if Inference is active in the deployment. | Spend alerts follow the same per-plan availability as usage alerts. > [!NOTE] > > * Spending alerts are not available for categories with no spending limit or during a trial. > * You aren't billed for tracked hours, which are unlimited for all plans. Messages are sent from `forge-support@coreweave.com`. On the **Enterprise** plan: * All **Organization admins** and **Billing admins** receive spending alerts. * No spending alerts are configured by default. On the Pro plan: * Only the **Billing admin** receives spending alerts. * By default, spending alerts are configured at $200, $450, $700, and $1,000. To view and manage your organization's spending alerts: 1. In the top right corner, click your user profile icon. 2. In the **Account** section, click **Billing** or **Settings**, then click the **Usage & Alerts** tab. 3. From the sidebar, select a category. 4. Initially, the **Usage** tab displays. To view spending alerts, click **Spend alerts**. All configured spending alerts for the category display. 5. To add an alert, click **Add alert**. a. Enter a threshold amount in USD. a. Click **Create alert**. 6. To delete a spending alert, click the trash icon next to it. ## Payment methods The **Payment methods** section shows the payment methods on file for your organization. If you haven't added a payment method, you're prompted to do so when you upgrade your plan or add paid storage. ## Billing admin The **Billing admin** section shows the current billing admin. The billing admin is an organization admin, receives all billing-related emails, and can view and manage payment methods. > [!NOTE] > > In W\&B Dedicated Cloud, multiple users can be billing admins. In W\&B Multi-tenant Cloud, only one user at a time can be the billing admin. To change the billing admin or assign the role to additional users: 1. Click **Manage roles**. 2. Search for a user. 3. Click the **Billing admin** field in that user's row. 4. Read the summary, then click **Change billing user**. ## Invoices If you pay using a credit card, the **Invoices** section lets you view monthly invoices. The following exceptions apply: * For Enterprise accounts that pay through wire transfer, this section is blank. For questions, contact your account team. * If your organization incurs no charges, no invoice is generated. # Manage email settings Source: https://docs.coreweave.com/products/wandb/platform/app/settings-page/emails Add, verify, and delete the email addresses on your Forge account, and choose your primary email. In your Forge **User settings**, the **Emails** section lets you add, delete, and verify the email addresses associated with your account, and choose your primary email. Each user manages their own email addresses. Organization admins can't add, change, or delete another user's email addresses. To open the **Emails** section: 1. In the upper-right corner, click the account selector. 2. Click **User settings**. 3. Scroll down to **Emails**. You can also go directly to [forge.coreweave.com/settings](https://forge.coreweave.com/settings). ![The Emails section, listing an email address marked Primary, its login method, and the Add Email link](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/manage_emails.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=4e86b04c881acf3a16f2ed53d018c5d3) ## Manage primary email A **Primary** badge marks your primary email. Your primary email defaults to the address you provided when you created your account. To make a different email primary, click the **action ()** menu next to it and choose **Set as primary**. > [!NOTE] > > You can only set verified emails as primary. ![The action menu for an email, with Set as primary, Resend verification, and Delete](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/primary_email.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a4562383823aec7ad9636a1022608d76) ## Add emails To add an email, click **+ Add Email**. The CoreWeave sign-in page opens, where you sign in with the new email address or connect it using single sign-on (SSO). ## Delete emails To delete an email from your account, click the **action ()** menu next to it and choose **Delete**. > [!NOTE] > > You can't delete a primary email. Set a different email as primary before deleting. ## Verify emails When you add an email, a verification email is sent to that address. The email stays unverified until you verify it. If you no longer have the verification email, click the **action ()** menu next to the address and choose **Resend verification**. ## Login methods The **Login** column shows the login method associated with each email address. For account login issues, contact [forge-support@coreweave.com](mailto:forge-support@coreweave.com). # Manage storage Source: https://docs.coreweave.com/products/wandb/platform/app/settings-page/storage Manage Weights & Biases data storage consumption using reference artifacts, external buckets, and TTL deletion policies. This page describes how to manage your Weights & Biases data storage so you can stay within your storage limit. If you're approaching or exceeding your storage limit, you have multiple ways to manage your data. The best option depends on your account type and your current project setup. ## Manage storage consumption To reduce how much storage your account uses, Weights & Biases offers different methods of optimizing your storage consumption: * Use [reference artifacts](/products/wandb/artifacts/track-external-files) to track files saved outside the Weights & Biases system instead of uploading them to Weights & Biases storage. * Use an [external cloud storage bucket](/products/wandb/platform/app/settings-page/teams) for storage (Enterprise only). ## Delete data If optimizing consumption isn't sufficient, you can also choose to delete data to remain under your storage limit. You have several ways to do this: * Delete data interactively with the app UI. * [Set a TTL policy](/products/wandb/artifacts/ttl) on artifacts so Weights & Biases deletes them automatically. # Team settings Source: https://docs.coreweave.com/products/wandb/platform/app/settings-page/teams Collaborate with your colleagues, share results, and track all the experiments across your team. Manage team settings including members, alerts, and privacy. Use Teams as a central workspace for your ML team. This page explains how organization admins and team admins can create a team, configure its members and privacy, and assign roles so that collaborators can share experiments and reports while keeping sensitive work appropriately scoped. A Team can do the following: * **Track all the experiments** your team has tried so you never duplicate work. * **Save and reproduce** previously trained models. * **Share progress** and results with your boss and collaborators. * **Catch regressions** and immediately get alerted when performance drops. * **Benchmark model performance** and compare model versions. ![Teams workspace overview](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/teams_overview.webp?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=5000a7729160c093ad034e4030cb8c9d) > [!NOTE] > > Only Administration account types can change team settings or remove a member from a team. ## Create a collaborative team Follow these steps to create a new team and invite your first collaborators. After the team exists, you can refine membership, alerts, and privacy in [Team configuration](#team-configuration). 1. [Sign up or log in](https://id.coreweave.com/signup) to Forge. 2. In the left navigation, click **Create a team to collaborate**. 3. Create your team and invite collaborators. 4. Configure your team using the settings described in the following sections. > [!NOTE] > > Only the admin of an organization can create a new team. ## Team configuration You can configure settings for your team, including its membership, alerts, and privacy settings. The following sections describe each settings category. To manage your team's settings, navigate to the **Teams** section in the left menu and click the team you want to change settings for. ### Members The Members section shows a list of all pending invitations and the members who have accepted the invitation to join the team. The list displays each member's name, username, email, team role, and access privileges to Models and W\&B Weave, which are inherited from the organization. You can choose from the standard team roles **Admin**, **Member**, and **View-Only**. If your organization has created [custom roles](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-custom-roles), you can assign a custom role instead. On Dedicated Cloud and Self-Managed deployments, the list also includes a **Status** column that shows whether each member is active, has an invitation pending, or has an account that an organization admin deactivated. See [View team member status](/products/wandb/platform/hosting/iam/access-management/manage-organization#view-team-member-status). See [Add and Manage teams](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-teams) for information on how to create a team, manage teams, and manage team membership and roles. To configure who can invite new members and configure other privacy settings for the team, refer to [Privacy](#privacy). To remove a team member, admins can open the team settings page and click the delete button next to the departing member's name. Any runs logged to the team remain after a user leaves. ### Avatar A team avatar helps members and visitors recognize the team across the W\&B app. To set an avatar for your team: 1. Navigate to the **Teams** section in the left menu and click the team you want to add an avatar for. This opens the team's overview page. 2. Hover over the team's default avatar image in the upper-left corner of the page and click the **Upload photo** button. This opens a file prompt. 3. From the file prompt, select the image you want to use and then click **Open**. This uploads the photo to your team and sets it as your team's avatar. ### Alerts Alerts keep your team informed about run status without requiring anyone to watch the dashboard. You can set up alerts to notify your team when runs crash and finish. Weights & Biases sends alerts through email or Slack, and you can customize them to meet your needs. In the **Team alerts** section, toggle the switch next to the event type you want to receive alerts from. Weights & Biases provides the following event type options: * **Run finished**: A W\&B run successfully finishes. * **Run crashed after**: A run stops responding for longer than the number of minutes you set. * **wandb.alert()**: A custom scriptable alert. See [Send alerts with `wandb.Run.alert()`](/products/wandb/runs/alert) for more information. ### Slack channel integrations Configure Slack destinations where your team's [automations](/products/wandb/automations) can send notifications when an event occurs in a registry or a project, such as when a new artifact is created or when a run metric meets a defined threshold. Refer to [Create a Slack automation](/products/wandb/automations/create-automations/slack). > [!NOTE] > > This feature isn't available on Community Edition. ### Webhooks Configure webhooks that your team's [automations](/products/wandb/automations) can run when an event occurs in a registry or a project, such as when a new artifact is created or when a run metric meets a defined threshold. Refer to [Create a webhook automation](/products/wandb/automations/create-automations/webhook). > [!NOTE] > > This feature isn't available on Community Edition. ### Privacy Team privacy settings control visibility, invitations, report sharing, and defaults such as code saving for runs in the team. Team admins can change these options on the team **Settings** page unless an organization admin has [enforced the same category of policy](/products/wandb/platform/hosting/privacy-settings#enforce-privacy-settings-for-all-teams) for all teams. Organization admins can still open the team **Settings** page to review configuration. You can change the following privacy settings: * Hide this team from all non-members. * Make all future team projects private (public sharing not allowed). * Allow any team member to invite other members (not just admins). * Disable public sharing to outside of team for reports in private projects. This disables existing magic links. * Automatically recommend new users with matching email domains join this team upon signup. * Enable code saving by default. For step-by-step navigation and how organization enforcement interacts with team toggles, see [Configure privacy settings](/products/wandb/platform/hosting/privacy-settings). To change these settings, open the team's dashboard in Weights & Biases, select **Team settings** in the left navigation, then open the **Privacy** section. ### Usage The **Usage** section describes the total memory usage the team has consumed on Weights & Biases. The default storage plan is 100 GB. For more information about storage and pricing, see the [Pricing](https://coreweave.com/forge-pricing) page. ### External Storage The **Storage** section describes the cloud storage bucket configuration that the team's data uses. For more information, see [Secure Storage Connector](#secure-storage-connector) or check out our [W\&B Server](/products/wandb/platform/hosting/data-security/secure-storage-connector) docs if you are self-hosting. ## Create a team profile A team profile is a public-facing page that helps your team attract collaborators and highlight its work. You can customize your team's profile page to show an introduction and showcase reports and projects that are visible to the public or team members. Present reports, projects, and external links. Use a team profile to do the following: * **Highlight your research** to visitors by showcasing your best public reports. * **Showcase the most active projects** to make it easier for teammates to find them. * **Find collaborators** by adding external links to your company or research lab's website and any papers you've published. ## Team roles and permissions Team roles determine what each member can see and do within the team, from viewing reports to managing other members. Select a team role when you invite colleagues to join a team. The following team role options are available: * **Admin**: Team admins can add and remove other admins or team members. They have permissions to modify all projects and full deletion permissions. This includes, but is not limited to, deleting runs, projects, artifacts, and sweeps. * **Member**: A regular member of the team. By default, only an admin can invite a team member. To change this behavior, refer to [Privacy settings](#privacy). * \*\*View-Only View-Only members can view assets within the team such as runs, reports, and workspaces. They can follow and comment on reports, but they can't create, edit, or delete project overview, reports, or runs. * **Custom roles (Enterprise-only feature)**: Custom roles let organization admins compose new roles based on either of the **View-Only** or **Member** roles, together with additional permissions to achieve fine-grained access control. Team admins can then assign any of those custom roles to users in their respective teams. Refer to [Introducing Custom Roles for Teams](https://forge.coreweave.com/wandb/wandb_fc/announcements/reports/Introducing-Custom-Roles-for-W-B-Teams--Vmlldzo2MTMxMjQ3) for details. A team member can delete only runs they created. Suppose you have two members A and B. Member B moves a run from team B's project to a different project owned by Member A. Member A cannot delete the run Member B moved to Member A's project. An admin can manage runs and sweep runs created by any team member. ### Service accounts In addition to user roles, teams can also use **service accounts** for automation. Service accounts aren't users, but rather non-human identities used for automated workflows. Refer to [Use service accounts to automate workflows](/products/wandb/platform/hosting/iam/service-accounts) for detailed information. > [!NOTE] > > CoreWeave recommends assigning more than one admin in a team to ensure that admin operations can continue when the primary admin isn't available. ### Team settings The following table summarizes which roles can manage team membership and team-wide settings. Team settings let you manage the settings for your team and its members. With these privileges, you can effectively oversee and organize your team within Weights & Biases. | Permissions | View-Only | Team Member | Team Admin | | - | - | - | - | | Add team members | | | X | | Remove team members | | | X | | Manage team settings | | | X | ### Reports Report permissions grant access to create, view, and edit reports. The following table lists permissions that apply to all reports across a given team. | Permissions | View-Only | Team Member | Team Admin | | - | - | - | - | | View reports | X | X | X | | Create reports | | X | X | | Edit reports | | X (team members can only edit their own reports) | X | | Delete reports | | X (team members can only edit their own reports) | X | ### Experiments The following table lists permissions that apply to all experiments across a given team. | Permissions | View-Only | Team Member | Team Admin | | - | - | - | - | | View experiment metadata (includes history metrics, system metrics, files, and logs) | X | X | X | | Edit experiment panels and workspaces | | X | X | | Log experiments | | X | X | | Delete experiments | | X (team members can only delete experiments they created) | X | | Stop experiments | | X (team members can only stop experiments they created) | X | ### Artifacts The following table lists permissions that apply to all artifacts across a given team. | Permissions | View-Only | Team Member | Team Admin | | - | - | - | - | | View artifacts | X | X | X | | Download artifacts | X | X | X | | Create artifacts | | X | X | | Delete artifacts | | X | X | | Edit metadata | | X | X | | Edit aliases | | X | X | | Delete aliases | | X | X | ### System settings (W\&B Server only) This section applies only to self-hosted W\&B Server deployments. Use system permissions to create and manage teams and their members and to adjust system settings. These privileges enable you to effectively administer and maintain the Weights & Biases instance. | Permissions | View-Only | Team Member | Team Admin | System Admin | | - | - | - | - | - | | Configure system settings | | | | X | | Create or delete teams | | | | X | ### Team service account behavior * When you configure a team in your training environment, you can use a service account from that team to log runs in either of private or public projects within that team. Additionally, you can attribute those runs to a user if `WANDB_USERNAME` or `WANDB_USER_EMAIL` variable exists in your environment and the referenced user is part of that team. * When you do not configure a team in your training environment and use a service account, the runs log to the named project within that service account's parent team. In this case as well, you can attribute the runs to a user if `WANDB_USERNAME` or `WANDB_USER_EMAIL` variable exists in your environment and the referenced user is part of the service account's parent team. * A service account can't log runs to a private project in a team different from its parent team. A service account can log runs to a project only if the project visibility is set to `Open`. ## Team trials See the [pricing page](https://coreweave.com/forge-pricing) for more information on Forge plans. You can download all your data at any time, either using the dashboard UI or the [Export API](/products/wandb/ref/python/public-api). ## Advanced configuration The following advanced options are available to teams with additional data residency or compliance requirements. ### Secure storage connector The team-level secure storage connector lets teams use their own cloud storage bucket with Weights & Biases. This provides greater data access control and data isolation for teams with highly sensitive data or strict compliance requirements. Refer to [Secure Storage Connector](/products/wandb/platform/hosting/data-security/secure-storage-connector) for more information. # Manage user settings Source: https://docs.coreweave.com/products/wandb/platform/app/settings-page/user-settings Manage your profile information, account defaults, alerts, participation in public preview features, account activation, and create teams in your user settings. Your user settings let you manage your profile, default team, API keys, alerts, integrations, and other account-level options. This page describes each section of the user settings and how to use it. To open your user settings, click the account selector in the upper-right corner, then select **User settings**. ## Profile In the **Profile** section, you can manage and modify your account name and institution. You can optionally add a biography, location, link to a personal or your institution's website, and upload a profile image. ### Edit your intro Your intro appears at the top of your profile and is a good place to introduce yourself, link to projects, or share related accounts. To edit your intro, click **Edit** at the top of your profile. The WYSIWYG editor that opens supports Markdown. 1. To edit a line, click it. To save time, type `/` and choose Markdown from the list. 2. To move an item, use its drag handles. 3. To delete a block, click the drag handle, then click **Delete**. 4. To save your changes, click **Save**. Your updated intro is now visible on your profile. #### Add social badges To add a follow badge for the `@weights_biases` account on X, add a Markdown-style link with an HTML `` tag that points to the badge image: ```markdown theme={"system"} [![X: @weights_biases](https://img.shields.io/twitter/follow/weights_biases?style=social)](https://x.com/intent/follow?screen_name=weights_biases) ``` In an `` tag, you can specify `width`, `height`, or both. If you specify only one, the image keeps its proportions. ## Default team If you're a member of more than one team, the **Default team** section lets you configure the default team to use when a run or a Weave trace doesn't specify a team. If you're a member of only one team, that team is the default and this section doesn't appear. The steps to set your default team differ depending on your deployment. Select the tab that matches your environment. **Multi-tenant Cloud** Next to **Default location to create new projects in**, click the dropdown, then select your default team. **Dedicated Cloud and Self-Managed** 1. Next to **Default location to create new projects in**, click the dropdown, then select your default team or your personal entity. 2. **Optional:** If an admin has turned on public projects in **Account** > **Settings** > **Privacy**, configure the default visibility for your new projects. Click the button next to **Default project privacy in your personal account**, then select **Private** (the default) or **Public**. 3. **Optional:** If an admin has turned on [default saving and diffing code](/products/wandb/app/features/panels/code) in **Account** > **Settings** > **Privacy**, click **Enable code saving in your personal account** to turn it on for your runs. > [!NOTE] > > To specify the default team when you're running a script in an automated environment, specify the default location with the `WANDB_ENTITY` [environment variable](/products/wandb/track/environment-variables). ## Teams The **Teams** section lists all of your teams. * Click a team name to go to the team page. * If you have permission to join additional teams, click **View teams** next to **We found teams for you to join**. * **Optional:** Turn on **Hide teams in public profile**. > [!NOTE] > > To create or manage a team, see [Manage teams](/products/wandb/platform/app/settings-page/teams). ## API keys The **Personal API keys** section lets you manage your personal API keys for authenticating with Weights & Biases services. From this section, you can review existing keys, create new ones, and revoke keys you no longer need. > [!NOTE] > > This section shows only your personal API keys. To see every key you can manage in your organization, including organization API keys and service account keys, use the **API Keys** tab described in [Manage API keys](/products/wandb/platform/hosting/iam/api-keys). ### View your API keys The API keys table displays: * **Key ID**: The first part of each API key, used for identification. * **Name**: An optional descriptive name for the key. * **Created**: When the key was created. * **Last used**: The most recent usage timestamp. > [!NOTE] > > For security, the table shows only the key ID (the first part of the key). The full secret API key appears only once, when you create it. To filter the list of API keys, enter a partial key name or ID. ### Create a new API key To create an API key, select the **Personal API key** or **Service Account API key** tab for details. **Personal API key** To create a personal API key owned by your user ID: 1. Log in to Forge, click the account selector in the upper-right corner, then select **User settings**. 2. Within **API keys**, select **New key**. 3. Provide a descriptive name for your API key. 4. Click **Create API key**. 5. Copy the displayed API key immediately and store it securely. **Service account API key** To create an API key owned by a service account: 1. In your team or organization settings, go to the **Service Accounts** tab. 2. Find the service account in the list. 3. Click the **action ()** menu, then click **Create API key**. 4. Provide a name for the API key, then click **Create**. 5. Copy the displayed API key immediately and store it securely. 6. Click **Done**. You can create multiple API keys for a single service account to support different environments or workflows. > [!WARNING] > > W\&B shows the full API key only once, when you create it. After you close the dialog, you cannot view the full API key again. Your settings display only the key ID (the first part of the key). If you lose the full API key, you must create a new one. For secure storage options, see [Store API keys securely](/products/wandb/platform/app/settings-page/user-settings#store-and-handle-api-keys-securely). ### Rename an API key To change an API key's display name without modifying the key material: 1. Find the key you want to delete in the API keys table. 2. Click the **action ()** menu and choose **Edit**. 3. Update the key's **Name**, then click **Save**. ### Delete an API key Delete an API key when you no longer need it or when it may have been exposed. To revoke access by deleting an API key: 1. Find the key you want to delete in the API keys table. 2. Click the **action ()** menu and choose **Delete**. 3. Confirm the deletion. Weights & Biases removes the key from the table, and you can no longer use it to authenticate. > [!WARNING] > > Deleting an API key immediately revokes access for any scripts or services that use that key. Before you delete the old key, make sure you've updated all systems to use a new key. ## Store and handle API keys securely API keys provide access to your W\&B account and should be protected like passwords. The following sections describe recommended storage methods, practices to avoid, how to pass keys to your code, and SDK version requirements for newer keys. ### Recommended storage methods Use one of the following methods to store your API key securely. * **Secrets manager**: Use a dedicated secrets management system such as [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/), [HashiCorp Vault](https://developer.hashicorp.com/vault), [Azure Key Vault](https://azure.microsoft.com/en-us/products/key-vault), or [Google Secret Manager](https://cloud.google.com/security/products/secret-manager). * **Password manager**: Use a reputable password manager application. * **OS-level keychains**: Store keys in macOS Keychain, Windows Credential Manager, or Linux secret service. Not suggested for production. ### What to avoid Avoid the following practices, which can expose your API key: * Never commit API keys to version control systems such as Git. * Don't store API keys in plain text configuration files. * Don't pass API keys on the command line, because they're visible in the output of OS commands like `ps`. * Avoid sharing API keys through email, chat, or other unencrypted channels. * Don't hard-code API keys in your source code. If an API key is exposed, delete the API key from your W\&B account immediately and contact [support](mailto:forge-support@coreweave.com) or your AISE. ### Environment variables When you use API keys in your code, pass them through environment variables: ```bash theme={"system"} export WANDB_API_KEY="[YOUR-API-KEY]" ``` This approach keeps keys out of your source code and makes it easier to rotate them when needed. > [!WARNING] > > Avoid setting the environment variable in line with the command, because it's visible in the output of OS commands like `ps`: > > ```bash theme={"system"} > # Avoid this pattern, which can expose the API key in process managers > export WANDB_API_KEY="[YOUR-API-KEY]" ./my-script.sh > ``` ### SDK version compatibility If you use a newer API key, confirm that your SDK version supports it. Newer API keys are longer than legacy keys. When you authenticate with older versions of the `wandb` or `weave` SDKs, you may encounter an API key length error. **Solution**: Update to a newer SDK version: * `wandb` SDK v0.22.3+ ```bash theme={"system"} pip install --upgrade wandb==0.22.3 ``` * `weave` SDK v0.52.17+ ```bash theme={"system"} pip install --upgrade weave==0.52.17 ``` If you can't upgrade the SDK immediately, set the API key using the `WANDB_API_KEY` environment variable as a workaround. ## Public preview features In the **Public preview features** section, you can optionally enable add-ons and previews of products in development. Select the toggle switch next to the feature you want to enable. This section also contains **UI Display**, where you choose **Light mode**, **Dark mode**, or **System**. ## Alerts > [!NOTE] > > Available only to organizations on a paid plan. Get notified when your runs crash or finish, or set custom alerts with [`wandb.Run.alert()`](/products/wandb/runs/alert). You receive notifications through email or Slack. Toggle the switch next to the event type you want to receive alerts for: * **Run finished**: Notify you when a W\&B run successfully finishes. * **Run crashed after**: Notify you when a run stops responding for longer than the number of minutes you set. For more information about how to set up and manage alerts, see [Send alerts with `wandb.Run.alert()`](/products/wandb/runs/alert). ## Delete your account Select the **Delete Account** button to delete your account. > [!WARNING] > > You can't reverse account deletion. > [!NOTE] > > You can't delete a user account that is the **Billing admin** for an organization that has more than one member. Before deleting such an account, transfer the Billing admin role to another user from the [Billing settings](/products/wandb/platform/app/settings-page/billing-settings#billing-admin) page. If you are the organization's only member, deleting your account also deletes the organization. To delete an entire organization account rather than a user account, see [How do I delete my organization account?](/support/models/articles/how-do-i-delete-my-organization-account). # Deployment options overview Source: https://docs.coreweave.com/products/wandb/platform/hosting Compare Weights & Biases deployment options: Forge, Dedicated Cloud, and Self-Managed installations. You can deploy Weights & Biases in various ways to meet your organization's infrastructure and security requirements. This page helps administrators and platform decision-makers compare the available deployment options, so you can choose the one that best fits your security, scale, and operational needs. > [!TIP] > > To get started quickly, Weights & Biases recommends [Forge](https://forge.coreweave.com/wandb). > > Some features and functionality require an [Enterprise](https://coreweave.com/forge-pricing) license. To try these features, sign up for an [Enterprise trial](https://wandb.ai/site/enterprise-trial/) and choose your deployment type. > **Forge** > > A fully managed service deployed in Weights & Biases's cloud infrastructure, where you can access the Weights & Biases products at the desired scale, with cost-efficient pricing options, and with continuous updates for the latest features and functionality. Weights & Biases recommends Forge for your product trial, or to manage your production AI workflows if you don't need the security of a private deployment, self-service onboarding is important, and cost efficiency is critical. > > For more information, see [Forge](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud). > **W\&B Dedicated Cloud** > > A fully managed service with dedicated, isolated infrastructure in Weights & Biases's cloud. Choose this option if your organization requires conformance to strict governance controls including data residency, needs advanced security capabilities, and wants to optimize AI operating costs by not having to build and manage the required infrastructure with security, scale, and performance characteristics. > > For more information, see [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud). > **W\&B Self-Managed** > > Deploy and manage W\&B Server on your own managed infrastructure. W\&B Server is a self-contained packaged mechanism to run the W\&B Platform and its supported Weights & Biases products. Weights & Biases recommends this option if all your existing infrastructure is on-premises, or your organization has strict regulatory needs that W\&B Dedicated Cloud doesn't satisfy. With this option, you're fully responsible for managing the provisioning, and continuous maintenance and upgrades of the infrastructure required to support W\&B Server. > > For more information, see [W\&B Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed). ## Key differences After reviewing the preceding deployment options, use the following table to compare how each option handles infrastructure, security, and operational responsibilities. | | Forge | Dedicated Cloud | Self-Managed | | - | - | - | - | | MySQL / DB management | Fully hosted and managed by Weights & Biases | Fully hosted and managed by Weights & Biases on cloud or region of customer choice | Fully hosted and managed by customer | | Object storage (S3/GCS/Blob storage) | **Option 1**: Fully hosted by Weights & Biases **Option 2**: Customer can configure their own bucket per team, using the [Secure Storage Connector](/products/wandb/platform/hosting/data-security/secure-storage-connector) | **Option 1**: Fully hosted by Weights & Biases **Option 2**: Customer can configure their own bucket per instance or team, using the [Secure Storage Connector](/products/wandb/platform/hosting/data-security/secure-storage-connector) | Fully hosted and managed by customer | | SSO support | Weights & Biases managed via Auth0 | **Option 1**: Customer managed **Option 2**: Managed by Weights & Biases via Auth0 | Fully managed by customer | | W\&B Service (App) | Fully managed by Weights & Biases | Fully managed by Weights & Biases | Fully managed by customer | | App security | Fully managed by Weights & Biases | Shared responsibility of Weights & Biases and customer | Fully managed by customer | | Maintenance (upgrades, backups, etc.) | Managed by Weights & Biases | Managed by Weights & Biases | Managed by customer | | Support | Support SLA | Support SLA | Support SLA | | Supported cloud infrastructure | Google Cloud | AWS, Google Cloud, Azure | AWS, Google Cloud, Azure, on-premises bare-metal | # Data encryption in Dedicated Cloud Source: https://docs.coreweave.com/products/wandb/platform/hosting/data-security/data-encryption Learn how Weights & Biases encrypts Dedicated Cloud data with cloud-native keys and handles customer-managed keys. This page explains database and object storage encryption in [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), including the policy on customer-managed keys. It is intended for security and compliance teams evaluating the service for sensitive AI workloads. Weights & Biases manages the keys that encrypt each Dedicated Cloud instance's database and object storage. It uses the cloud provider's customer-managed encryption key (CMEK) capability, acting as the provider's customer on your behalf. Each instance has a unique key, which provides an additional layer of isolation between tenants. This capability is available on AWS, Azure, and Google Cloud. > [!NOTE] > > Dedicated Cloud instances on AWS have used the Weights & Biases-managed cloud-native key for encryption since before August 2024. > > On Google Cloud and Azure, instances created in August 2024 or later use a key managed by Weights & Biases to encrypt the database and object storage. Earlier instances use the default key managed by the cloud provider. Customer-provided keys are generally not allowed for the managed database and object storage. A team with access to your cloud infrastructure could inadvertently remove the key or revoke access, potentially corrupting all data in the instance beyond recovery. If using your own key is a requirement for adopting Dedicated Cloud, you can request an exception from Weights & Biases. Approved exceptions follow the W\&B Dedicated Cloud shared responsibility model. > [!WARNING] > > If any user in your organization removes your key or revokes Weights & Biases's access to it at any point when your Dedicated Cloud instance is live, Weights & Biases isn't liable for any resulting data loss or corruption and isn't responsible for recovery of the data. # Configure IP allowlisting for Dedicated Cloud Source: https://docs.coreweave.com/products/wandb/platform/hosting/data-security/ip-allowlisting Restrict access to a W&B Dedicated Cloud instance to authorized IP addresses using IP allowlisting. This page explains how IP allowlisting works on W\&B [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) and how to request it for your instance. Use IP allowlisting to restrict access to your Dedicated Cloud instance to an authorized list of IP addresses, so that only traffic from approved locations can reach the W\&B APIs and the W\&B app UI. IP allowlisting applies to access from your AI workloads to the W\&B APIs and from your user browsers to the W\&B app UI. After you set up IP allowlisting for your Dedicated Cloud instance, Weights & Biases denies any requests from other unauthorized locations. IP allowlisting is available on Dedicated Cloud instances on AWS, Google Cloud, and Azure. To configure IP allowlisting for your Dedicated Cloud instance, contact your Weights & Biases team. You can use IP allowlisting with [secure private connectivity](/products/wandb/platform/hosting/data-security/private-connectivity). If you use both, Weights & Biases recommends that you use secure private connectivity for all traffic from your AI workloads and most of the traffic from your user browsers, and use IP allowlisting for instance administration from privileged locations. > [!WARNING] > > Weights & Biases recommends that you use [CIDR blocks](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) assigned to your corporate or business egress gateways rather than individual `/32` IP addresses. Using individual IP addresses doesn't scale and has strict limits per cloud. # Access BYOB using pre-signed URLs Source: https://docs.coreweave.com/products/wandb/platform/hosting/data-security/presigned-urls Learn how Weights & Biases uses pre-signed URLs for blob storage, team-level access control, and audit logging. Weights & Biases uses pre-signed URLs to simplify access to blob storage from your AI workloads or user browsers. This page explains how pre-signed URLs work in Weights & Biases. It also outlines the access controls, network restrictions, and audit logging that administrators should configure to secure blob storage access. For background on pre-signed URLs, refer to the cloud provider's documentation: * [Pre-signed URLs for AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html), which also applies to S3-compatible storage like [CoreWeave AI Object Storage](/products/storage/object-storage). * [Signed URLs for Google Cloud Storage](https://cloud.google.com/storage/docs/access-control/signed-urls). * [Shared Access Signature for Azure Blob Storage](https://learn.microsoft.com/azure/storage/common/storage-sas-overview). Pre-signed URLs work as follows: 1. When needed, AI workloads or user browser clients within your network request pre-signed URLs from Weights & Biases. 2. Weights & Biases responds to the request by accessing the blob storage to generate the pre-signed URL with the required permissions. 3. Weights & Biases returns the pre-signed URL to the client. 4. The client uses the pre-signed URL to read from or write to the blob storage. A pre-signed URL expires after the following durations: * **Read operations**: 1 hour. * **Write operations**: 24 hours, to allow more time to upload large objects in chunks. ## Team-level access control Each pre-signed URL is restricted to specific buckets based on [team-level access control](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-teams) in the Weights & Biases platform. Consider a user who belongs to only one team, and that team is mapped to a storage bucket using the [secure storage connector](/products/wandb/platform/hosting/data-security/secure-storage-connector). In this case, the pre-signed URLs generated for their requests can't access storage buckets mapped to other teams. > [!NOTE] > > Weights & Biases recommends adding users only to the teams they need to belong to. ## Network restriction Weights & Biases recommends using IAM policies to restrict the networks that can use pre-signed URLs to access external storage. This helps ensure that only networks running your AI workloads, or gateway IP addresses that map to your user machines, can access your Weights & Biases-specific buckets. Consult your cloud provider's documentation for guidance on configuring these IAM policies: * For CoreWeave AI Object Storage, refer to [Bucket policy reference](/products/storage/object-storage/auth-access/bucket-access/bucket-policies#condition) in the CoreWeave documentation. * For AWS S3 or S3-compatible storage like MinIO hosted on your premises, refer to the [Amazon S3 User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html#PresignedUrlUploadObject-LimitCapabilities), the [MinIO documentation](https://github.com/minio/minio), or the documentation for your S3-compatible storage provider. ## Audit logs Weights & Biases recommends using [Weights & Biases audit logs](/products/wandb/platform/hosting/monitoring-usage/audit-logging) together with blob-storage-specific audit logs. For blob storage audit logs, refer to the documentation for each cloud provider: * [CoreWeave audit logs](/products/storage/object-storage/auth-access/audit-logging#audit-logging-policies). * [AWS S3 access logs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html). * [Google Cloud Storage audit logs](https://cloud.google.com/storage/docs/audit-logging). * [Monitor Azure Blob Storage](https://learn.microsoft.com/azure/storage/blobs/monitor-blob-storage). Admin and security teams can use audit logs to track what each user does in Weights & Biases and take action if they need to limit certain operations for specific users. > [!NOTE] > > Pre-signed URLs are the only supported blob storage access mechanism in Weights & Biases. Weights & Biases recommends configuring some or all of the preceding security controls to fit your organization's needs. ## Determine the user that requested a pre-signed URL To correlate pre-signed URL activity with specific Weights & Biases users when reviewing audit logs, inspect the provider-specific query parameter that Weights & Biases appends to each URL: | Storage provider | Query parameter | Value | | - | - | - | | CoreWeave AI Object Storage | `X-User` | username | | AWS S3 | `X-User` | username | | Google Cloud Storage | `X-User` | username | | Azure Blob Storage | `scid` | Deterministic UUID derived from the username | ### Correlate Azure Blob Storage activity with a user Azure requires `scid` to be a GUID, so Weights & Biases derives a stable UUID from the username instead of including the username directly. The UUID doesn't contain the username and you can't decode it. To correlate Azure storage activity with a user, compute or maintain a mapping between usernames and their corresponding `scid` values. Azure includes `scid` only on user-delegation SAS URLs, which Weights & Biases generates when the storage bucket is configured with a managed identity. Shared-key SAS URLs don't include `scid`. > [!NOTE] > > Weights & Biases appends attribution parameters to pre-signed URLs by default. To turn off attribution for all storage providers, set the `GORILLA_BUCKET_ATTRIBUTION_DISABLED` environment variable to `true`. When attribution is off, Weights & Biases omits `scid` and `X-User`, and you can't correlate pre-signed URL activity with individual users. # Configure private connectivity to Dedicated Cloud Source: https://docs.coreweave.com/products/wandb/platform/hosting/data-security/private-connectivity Connect to a W&B Dedicated Cloud instance over a private network using AWS PrivateLink, GCP, or Azure Private Link. This document explains how to connect to a W\&B Dedicated Cloud instance over a cloud provider's secure private network, so that traffic between your environment and Weights & Biases avoids the public internet. It's intended for cloud and security administrators who manage Dedicated Cloud instances and want to harden network access for AI workloads and user traffic. You can connect to your [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) instance over the cloud provider's secure private network. This applies to access from your AI workloads to the W\&B APIs and optionally from your user browsers to the W\&B app UI. When you use private connectivity, the relevant requests and responses don't transit through the public network or internet. This reduces exposure to the public internet and helps satisfy network isolation requirements for sensitive workloads. > [!NOTE] > > Secure private connectivity is offered as an advanced security option with Dedicated Cloud. Secure private connectivity is available on Dedicated Cloud instances on AWS, Google Cloud, and Azure: * Use [AWS PrivateLink](https://aws.amazon.com/privatelink/) on AWS. * Use [Google Cloud Private Service Connect](https://cloud.google.com/vpc/docs/private-service-connect) on Google Cloud. * Use [Azure Private Link](https://azure.microsoft.com/products/private-link) on Azure. After enabling private connectivity, Weights & Biases creates a private endpoint service for your instance and provides its DNS URI. Create private endpoints in your cloud accounts to route AI workload traffic from your VPC or VNet to that service. To route browser traffic privately as well, configure DNS routing from your corporate network to those endpoints. Browser requests must resolve to the private endpoint instead of the public endpoint. > [!NOTE] > > To use this feature, contact [Support](mailto:forge-support@coreweave.com). You can use secure private connectivity with [IP allowlisting](/products/wandb/platform/hosting/data-security/ip-allowlisting) to combine network isolation with location-based access controls. If you combine the two, Weights & Biases recommends that you use secure private connectivity for all traffic from your AI workloads and for browser traffic from your users where possible, and use IP allowlisting for instance administration from privileged locations. # Bring your own bucket (BYOB) Source: https://docs.coreweave.com/products/wandb/platform/hosting/data-security/secure-storage-connector Store W&B artifacts and data in your own cloud storage buckets using the Bring Your Own Bucket (BYOB) feature. > [!NOTE] > > **This guide applies to all W\&B deployment types:** > > * **Multi-tenant Cloud**: Team-level BYOB > * **Dedicated Cloud**: Instance and team-level BYOB > * **Self-Managed**: Instance and team-level BYOB > > The bucket provisioning instructions in this guide are the same regardless of your deployment type. > [!WARNING] > > This page is for the W\&B platform secure storage connector or BYOB and does not apply to Weave. To render images and video that live in your own cloud bucket in Weave without importing the bytes into Weave, see the [Weave BYOB reference](/products/wandb/weave/guides/tracking/byob-references#reference-media-in-your-own-bucket-byob-using-weave-op). ## Overview Bring your own bucket (BYOB) lets you store W\&B artifacts and other sensitive data in your own cloud or on-premises infrastructure. For [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), Weights & Biases doesn't copy the data you store in your bucket to the Weights & Biases managed infrastructure. This page is for Weights & Biases administrators and platform engineers who need to retain ownership of artifact storage to meet data governance, residency, or compliance requirements. > [!NOTE] > > * Communication between W\&B SDK / CLI / UI and your buckets occurs using [pre-signed URLs](/products/wandb/platform/hosting/data-security/presigned-urls). > * Weights & Biases uses garbage collection and related processes to remove deleted **artifacts** and **run data** from your bucket over time. For artifact deletion, see [Delete an artifact](/products/wandb/artifacts/delete-artifacts). Deleted run data on Dedicated Cloud and Self-Managed deployments also depends on `GORILLA_DATA_RETENTION_PERIOD` as described in [Configure environment variables](/products/wandb/platform/hosting/env-vars). Weights & Biases doesn't guarantee cleanup timing. For a single overview of bucket usage and costs, see [Manage bucket storage and costs](/products/wandb/platform/hosting/managing-bucket-storage). > * You can specify a sub-path when you configure a bucket, to ensure that Weights & Biases doesn't store any files in a folder at the root of the bucket. This helps you better conform to your organization's bucket governance policy. ### Data stored in the central database vs buckets When you use BYOB functionality, Weights & Biases stores certain types of data in the Weights & Biases central database, and other types in your bucket. Use the following lists to understand which data remains in Weights & Biases-managed infrastructure and which data Weights & Biases writes to your own storage. #### Database The Weights & Biases central database stores the following data: * Metadata for users, teams, artifacts, experiments, and projects. * Reports. * Experiment logs. * System metrics. * Console logs. #### Buckets Your storage bucket stores the following data: * Experiment files and metrics. * Artifact files. * Media files. * Run files. * Exported history metrics and system events in Parquet format. ### Bucket scopes You can configure your storage bucket to one of two scopes: | Scope | Description | | - | - | | Instance level | In [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) and [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed), any user with the required permissions within your organization or instance can access files stored in your instance's storage bucket. Not applicable to [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud). | | Team level | If you configure a Weights & Biases team to use a team level storage bucket, team members can access files stored in it. Team level storage buckets allow greater data access control and data isolation for teams with sensitive data or strict compliance requirements. Team level storage helps different business units or departments that share an instance to efficiently use the infrastructure and administrative resources. It also lets separate project teams manage AI workflows for separate customer engagements. Available for all deployment types. You configure team level BYOB when you set up the team. | This design supports different storage topologies, depending on your organization's needs. For example: * The same bucket can serve the instance and one or more teams. * Each team can use a separate bucket, some teams can choose to write to the instance bucket, or multiple teams can share a bucket by writing to subpaths. * Buckets for different teams can reside in different cloud infrastructure environments or regions, and different storage admin teams can manage them. For example, suppose you have a team called Kappa in your organization. Your organization (and team Kappa) uses the instance level storage bucket by default. Next, you create a team called Omega. When you create team Omega, you configure a team level storage bucket for that team. Team Kappa can't access files that team Omega generates. However, team Omega can access files that team Kappa creates. To isolate data for team Kappa, you must also configure a team level storage bucket for them. ### Availability matrix Before you begin, confirm that BYOB is available for your deployment type and storage provider. Weights & Biases can connect to the following storage providers: * [CoreWeave AI Object Storage](/products/storage/object-storage): High-performance, S3-compatible object storage service optimized for AI workloads. * [Amazon S3](https://aws.amazon.com/s3/): Object storage service offering scalability, data availability, security, and performance. * [Google Cloud Storage](https://cloud.google.com/storage): Managed service for storing unstructured data at scale. * [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs): Cloud-based object storage solution for storing massive amounts of unstructured data like text, binary data, images, videos, and logs. * S3-compatible storage such as [MinIO Enterprise (AIStor)](https://min.io/product/aistor) or other enterprise-grade solutions hosted in your cloud or on-premises infrastructure. The following table shows the availability of BYOB at each scope for each Weights & Biases deployment type. | Weights & Biases deployment type | Instance level | Team level | Additional information | | - | - | - | - | | Dedicated Cloud | ✓ | ✓ | Instance and team level BYOB are supported for CoreWeave AI Object Storage, Amazon S3, Google Cloud Storage, Microsoft Azure Blob Storage, and S3-compatible storage such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor) hosted in your cloud or on-premises infrastructure. | | Multi-tenant Cloud | Not applicable | ✓[1](#footnote_1) | Team level BYOB is supported for CoreWeave AI Object Storage, Amazon S3, and Google Cloud Storage. | | Self-Managed | ✓ | ✓ | Instance and team level BYOB are supported for CoreWeave AI Object Storage, Amazon S3, Google Cloud Storage, Microsoft Azure Blob Storage, and S3-compatible storage such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor) hosted in your cloud or on-premises infrastructure. | 1.Azure Blob Storage is not supported for team level BYOB on Multi-tenant Cloud. The following sections guide you through the process of setting up BYOB. ## Provision your bucket After you [verify availability](#availability-matrix), you're ready to provision your storage bucket, including its access policy and CORS. Provisioning creates the bucket that Weights & Biases writes to and grants the Weights & Biases platform the permissions it needs to generate pre-signed URLs on your behalf. Select a tab to continue. **CoreWeave** **Requirements**: * **Multi-tenant Cloud**, or * **Dedicated Cloud** v0.73.0 or later, or * **Self-Managed** v0.73.0 or later deployed with v0.33.14+ of the Helm chart * A CoreWeave account with AI Object Storage enabled and with permission to create buckets, API access keys, and secret keys. * Your Weights & Biases instance must be able to connect to CoreWeave network endpoints. For details, see [Create a CoreWeave AI Object Storage bucket](/products/storage/object-storage/buckets/create-bucket) in the CoreWeave documentation. 1. **Forge**: Obtain your organization ID, which is required for your bucket policy. 1. Log in to the [Forge](https://wandb.ai/site). 2. In the left navigation, click **Create a new team**. 3. In the drawer that opens, copy the Weights & Biases organization ID, which appears above **Invite team members**. 4. Leave this page open. You use it to [configure Weights & Biases](#configure-weights-&-biases). 2. **Dedicated Cloud** / **Self-Managed**: Obtain your customer namespace, which is required for your bucket policy. 1. In the W\&B App, click your user profile icon, then click **System Console**. 2. Click the **Authentication** tab. 3. At the bottom of the page, copy the value for **Customer Namespace**. Keep this value for configuring the bucket policy. 4. You can close the System Console. 3. In CoreWeave, create the bucket with a name of your choice in your preferred CoreWeave availability zone. Optionally, create a folder for Weights & Biases to use as a sub-path for all Weights & Biases files. Make a note of the bucket name, availability zone, API access key, secret key, and sub-path. 4. Set the following cross-origin resource sharing (CORS) policy for the bucket: ```json theme={"system"} [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD", "PUT" ], "AllowedOrigins": [ "https://wandb.ai", "https://forge.coreweave.com" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3000 } ] ``` Set the allowed origins for your deployment type. Browsers fetch objects from the bucket through pre-signed URLs, so the bucket must allow the domain that serves the web UI. * **Multi-tenant Cloud**: Keep both origins. `https://wandb.ai` redirects to the web UI at `https://forge.coreweave.com`. * **Dedicated Cloud** or **Self-Managed**: Replace both origins with the URL of your Weights & Biases instance. CoreWeave storage is S3-compatible. For details about CORS, see [Configuring cross-origin resource sharing (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html) in the AWS documentation. 5. Configure a bucket policy that grants the required permissions for your deployment to access the bucket and generate [pre-signed URLs](/products/wandb/platform/hosting/data-security/presigned-urls) that AI workloads in your cloud infrastructure or user browsers use to access the bucket. See [Bucket Policy Reference](/products/storage/object-storage/auth-access/bucket-access/bucket-policies) in the CoreWeave documentation. ```json theme={"system"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowWandbUser", "Action": [ "s3:GetObject*", "s3:GetEncryptionConfiguration", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:PutObject", "s3:GetBucketCORS", "s3:GetBucketLocation", "s3:GetBucketVersioning" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::/*", "arn:aws:s3:::" ], "Principal": { "CW": "arn:aws:iam::wandb:static/" }, "Condition": { "StringLike": { "wandb:OrgID": [ "" ] } } }, { "Sid": "AllowUsersInOrg", "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::", "arn:aws:s3:::/*" ], "Principal": { "CW": "arn:aws:iam:::*" } }] } ``` The clause beginning with `"Sid": "AllowUsersInOrg"` grants users in your organization direct access to the bucket. If you don't need this ability, you can omit the clause from your policy. 6. In the bucket policy, replace placeholders: * ``: your bucket name. * ``: * **Multi-tenant Cloud**: `arn:aws:iam::wandb:static/wandb-integration-public` * **Dedicated Cloud** or **Self-Managed**: `arn:aws:iam::wandb:static/wandb-integration` * ``: * **Multi-tenant Cloud**: The organization ID from [Provision your bucket](#provision-your-bucket). * **Dedicated Cloud** or **Self-Managed**: The customer namespace from [Provision your bucket](#provision-your-bucket). 7. **Dedicated Cloud**: Contact [support](mailto:forge-support@coreweave.com) to complete additional steps. 8. Set environment variable**Self-Managed**: Update your deployment to set the environment variable `GORILLA_SUPPORTED_FILE_STORES` to the exact string `cw://` and restart Weights & Biases. Otherwise, CoreWeave doesn't appear as an option when you configure team storage. Next, [configure Weights & Biases](#configure-weights-&-biases). **AWS** For details, see [Create an S3 bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) in the AWS documentation. 1. Provision the KMS key. Weights & Biases requires you to provision a KMS key to encrypt and decrypt the data on the S3 bucket. The key usage type must be `ENCRYPT_DECRYPT`. Assign the following policy to the key: ```json theme={"system"} { "Version": "2012-10-17", "Statement": [ { "Sid" : "Internal", "Effect" : "Allow", "Principal" : { "AWS" : "" }, "Action" : "kms:*", "Resource" : "" }, { "Sid" : "External", "Effect" : "Allow", "Principal" : { "AWS" : "" }, "Action" : [ "kms:Decrypt", "kms:Describe*", "kms:Encrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*" ], "Resource" : "" } ] } ``` Replace `` and `` accordingly. If you use [Forge](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options#w%26b-dedicated-cloud), replace `` with the corresponding value: * **Multi-tenant Cloud**: `arn:aws:iam::725579432336:role/WandbIntegration` * **Dedicated Cloud**: `arn:aws:iam::830241207209:root` This policy grants your AWS account full access to the key and also assigns the required permissions to the AWS account that hosts the Weights & Biases platform. Keep a record of the KMS key ARN. 2. Provision the S3 bucket. Follow these steps to provision the S3 bucket in your AWS account: 1. Create the S3 bucket with a name of your choice. Optionally, create a folder that you can configure as a sub-path to store all Weights & Biases files. 2. Enable server-side encryption, using the KMS key from the previous step. 3. Configure CORS with the following policy: ```json theme={"system"} [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD", "PUT" ], "AllowedOrigins": [ "https://wandb.ai", "https://forge.coreweave.com" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3000 } ] ``` Set the allowed origins for your deployment type. Browsers fetch objects from the bucket through pre-signed URLs, so the bucket must allow the domain that serves the web UI. * **Multi-tenant Cloud**: Keep both origins. `https://wandb.ai` redirects to the web UI at `https://forge.coreweave.com`. * **Dedicated Cloud** or **Self-Managed**: Replace both origins with the URL of your Weights & Biases instance. > [!NOTE] > > If data in your bucket expires because of an [object lifecycle management policy](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html), you may lose the ability to read the history of some runs. 4. Grant the required S3 permissions to the AWS account that hosts the Weights & Biases platform, which requires these permissions to generate [pre-signed URLs](/products/wandb/platform/hosting/data-security/presigned-urls) that AI workloads in your cloud infrastructure or user browsers use to access the bucket. ```json theme={"system"} { "Version": "2012-10-17", "Id": "WandBAccess", "Statement": [ { "Sid": "WAndBAccountAccess", "Effect": "Allow", "Principal": { "AWS": "" }, "Action" : [ "s3:GetObject*", "s3:GetEncryptionConfiguration", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:PutObject", "s3:GetBucketCORS", "s3:GetBucketLocation", "s3:GetBucketVersioning" ], "Resource": [ "arn:aws:s3:::", "arn:aws:s3:::/*" ] } ] } ``` Replace `` accordingly and keep a record of the bucket name. Next, [configure Weights & Biases](#configure-weights-&-biases). If you use [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), replace `` with the corresponding value. * For [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud): `arn:aws:iam::725579432336:role/WandbIntegration` * For [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud): `arn:aws:iam::830241207209:root` For more details, see the [AWS Self-Managed hosting guide](/products/wandb/platform/hosting/hosting-options). **Google Cloud** For details, see [Create a bucket](https://docs.cloud.google.com/storage/docs/creating-buckets) in the Google Cloud documentation. 1. Provision the GCS bucket. Follow these steps to provision the GCS bucket in your Google Cloud project: 1. Create the GCS bucket with a name of your choice. Optionally, create a folder that you can configure as a sub-path to store all Weights & Biases files. 2. Set encryption type to `Google-managed`. 3. Turn on soft deletion. See [Edit a bucket's soft delete policy](https://docs.cloud.google.com/storage/docs/use-soft-delete). 4. Set the CORS policy with `gsutil`. This is not possible in the UI. 1. Create a file named `cors-policy.json` locally. 2. Copy the following CORS policy into the file and save it. ```json theme={"system"} [ { "origin": ["https://wandb.ai", "https://forge.coreweave.com"], "responseHeader": ["Content-Type"], "exposeHeaders": ["ETag"], "method": ["GET", "HEAD", "PUT"], "maxAgeSeconds": 3000 } ] ``` Set the allowed origins for your deployment type. Browsers fetch objects from the bucket through pre-signed URLs, so the bucket must allow the domain that serves the web UI. * **Multi-tenant Cloud**: Keep both origins. `https://wandb.ai` redirects to the web UI at `https://forge.coreweave.com`. * **Dedicated Cloud** or **Self-Managed**: Replace both origins with the URL of your Weights & Biases instance. > [!NOTE] > > If data in your bucket expires because of an [object lifecycle management policy](https://cloud.google.com/storage/docs/lifecycle), you may lose the ability to read the history of some runs. 3. Replace `` with the correct bucket name and run `gsutil`. ```bash theme={"system"} gsutil cors set cors-policy.json gs:// ``` 4. Verify the bucket's policy. Replace `` with the correct bucket name. ```bash theme={"system"} gsutil cors get gs:// ``` 2. If you use [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), grant the `storage.admin` role to the Google Cloud service account linked to the Weights & Biases platform. Weights & Biases requires this role to check the bucket's CORS configuration and attributes, such as whether object versioning is enabled. If the service account doesn't have the `storage.admin` role, these checks result in an HTTP 403 error. * For [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), the account is: `wandb-integration@wandb-production.iam.gserviceaccount.com` * For [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), the account is: `deploy@wandb-production.iam.gserviceaccount.com` Keep a record of the bucket name. Next, [configure Weights & Biases for BYOB](#configure-weights-&-biases). **Azure** For details, see [Create a blob storage container](https://learn.microsoft.com/en-us/azure/storage/blobs/blob-containers-portal) in the Azure documentation. **Instance level BYOB**: 1. Provision the Azure Blob Storage container. For Self-Managed deployments, and for Dedicated Cloud deployments that don't use [this Terraform module](https://github.com/wandb/terraform-azurerm-wandb/tree/main/examples/byob), follow these steps to provision an Azure Blob Storage container in your Azure subscription: 1. Create a container with a name of your choice. Optionally, create a folder that you can configure as a sub-path to store all Weights & Biases files. 2. Configure the CORS policy on the container. To set the CORS policy through the UI, go to the blob storage, scroll down to `Settings/Resource Sharing (CORS)`, and then set the following: | Parameter | Value | | - | - | | Allowed Origins | The URL of your Weights & Biases instance | | Allowed Methods | `GET`, `HEAD`, `PUT` | | Allowed Headers | `*` | | Exposed Headers | `*` | | Max Age | `3000` | > [!NOTE] > > If data in your bucket expires because of an [object lifecycle management policy](https://learn.microsoft.com/en-us/azure/storage/blobs/lifecycle-management-policy-configure?tabs=azure-portal), you may lose the ability to read the history of some runs. 2. Choose an authentication method: * **Storage account key**: Generate a storage account access key and record the key and storage account name. For organizations on Dedicated Cloud, share these values with your Weights & Biases account team using a secure sharing mechanism. * **Workload identity**: Grant an Azure managed identity access to your storage account and configure Weights & Biases to use it. You don't need to share a storage account key. Follow the [workload identity instructions for your deployment type](#set-up-azure-workload-identity). **Team level BYOB**: For Dedicated Cloud deployments, Weights & Biases recommends that you use [Terraform](https://github.com/wandb/terraform-azurerm-wandb/tree/main/examples/secure-storage-connector) to provision the Azure Blob Storage container with the necessary access mechanism and permissions. For Dedicated Cloud deployments that don't use Terraform, or for Self-Managed deployments, provision the bucket by following the steps for provisioning instance-level storage. Provide the OIDC issuer URL for your instance. Make a note of the following details: * Storage account name * Storage container name * Managed identity client ID * Azure tenant ID **S3-compatible** Create your S3-compatible bucket. Make a note of: * Access key * Secret access key * URL endpoint * Bucket name * Folder path, if applicable * Region Next, [determine the storage address](#determine-the-storage-address). ## Determine the storage address After you provision the bucket, you need a storage address that Weights & Biases uses to locate and authenticate to it. The following sections describe the syntax to use to connect a Weights & Biases team to a BYOB storage bucket. In the examples, replace placeholder values between angle brackets (`<>`) with your bucket's details. Select a tab for detailed instructions. **CoreWeave** This section is relevant only for team level BYOB on **Dedicated Cloud** or **Self-Managed**. For instance level BYOB or for Multi-tenant Cloud, you're ready to [Configure Weights & Biases](#configure-weights-&-biases). Determine the full bucket path using the following format. Replace placeholders between angle brackets (`<>`) with the bucket's values. **Bucket format**: ```text theme={"system"} cw://:@cwobject.com/?tls=true ``` Weights & Biases supports the `cwobject.com` HTTPS endpoint. TLS 1.3 is required. Contact [support](mailto:forge-support@coreweave.com) to express interest in other CoreWeave endpoints. **AWS** **Bucket format**: ```text theme={"system"} s3://:@/?region= ``` In the address, the `region` parameter is mandatory unless both your Weights & Biases instance and your storage bucket are deployed on AWS, and the Weights & Biases instance's `AWS_REGION` matches the bucket's AWS S3 region. **Google Cloud** **Bucket format**: ```text theme={"system"} gs://:@ ``` **Azure** **Bucket format**: ```text theme={"system"} az://:@/ ``` **S3-compatible** **Bucket format**: ```text theme={"system"} s3://:@/?region=&tls=true ``` In the address, the `region` parameter is mandatory. > [!NOTE] > > This section is for S3-compatible storage buckets that aren't hosted in S3, such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor) or other enterprise-grade S3-compatible solutions hosted on your premises. For storage buckets hosted in AWS S3, see the **AWS** tab instead. > > MinIO Open Source is in [maintenance mode](https://github.com/minio/minio) with no active development or pre-compiled binaries. For production deployments, use enterprise-grade S3-compatible solutions. > > For cloud-native storage buckets with an optional S3-compatible mode, use the cloud-native protocol specifier when possible. For example, use `cw://` for a CoreWeave bucket, rather than `s3://`. After you determine the storage address, you're ready to [configure team level BYOB](#team-level-byob). ## Configure Weights & Biases After you [provision your bucket](#provision-your-bucket) and [determine its address](#determine-the-storage-address), you're ready to configure BYOB at the [instance level](#instance-level-byob) or [team level](#team-level-byob). This final step tells Weights & Biases to route storage of artifacts, run files, and other large objects to your bucket. > [!WARNING] > > Plan your storage bucket layout carefully. After you configure a storage bucket for Weights & Biases, migrating its data to another bucket is complex and requires assistance from Weights & Biases. This applies to storage for Dedicated Cloud and Self-Managed, as well as team-level storage for Multi-tenant Cloud. For questions, contact [support](mailto:forge-support@coreweave.com). ### Instance level BYOB > [!NOTE] > > For CoreWeave AI Object Storage at the instance level, contact [Support](mailto:forge-support@coreweave.com) instead of following these instructions. Self-service configuration isn't yet supported. For **Dedicated Cloud**: Share the bucket details with your Weights & Biases team, who configures your instance. For Azure workload identity, [grant access to your storage account](#set-up-azure-workload-identity) and provide the storage account name, container name, and optional path. For **Self-Managed**, configure instance level BYOB in the W\&B System Console. For Azure workload identity, first complete the [identity setup](#set-up-azure-workload-identity). 1. Log in to Forge as a user with the `admin` role. 2. Click the user icon at the top, then click **System Console**. 3. Navigate to **Settings** > **System Connections**. 4. In **Bucket Storage**, select the **Provider** and enter the bucket details. For Azure, select **Azure Blob Storage (az)**, enter the **Storage account**, and enter the **Blob container** separately. 5. Optional: Enter the **Path** to use in the new bucket. 6. Ensure that the identity or credentials for the selected provider have access to the bucket. For Azure, select an **Authentication** method: * **Storage account key**: Enter the **Storage account key**. * **Workload identity (user-delegation SAS)**: Use the identity configured by your deployment administrator. If this option is unavailable, complete the [identity setup](#set-up-azure-workload-identity). 7. Click **Save**. After you save, Weights & Biases uses the configured bucket as the default storage destination for new artifacts and run files at the instance level. If a setting isn't editable, contact your deployment administrator. #### Set up Azure workload identity Workload identity lets Weights & Biases access your Azure bucket without a storage account key. Select your deployment type for the setup instructions. **Dedicated Cloud** Weights & Biases configures the deployment. You configure access to your Azure storage account: 1. Contact your Weights & Biases team with your storage account's tenant ID to confirm which managed identity to use. 2. If the identity is in your Azure tenant, use its principal ID for the role assignments below. Otherwise, create or select a managed identity in your tenant and configure its federated credentials using the issuer, subject, and audience values provided by Weights & Biases. A managed identity [can't directly access storage in another tenant](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/managed-identities-faq#can-i-use-a-managed-identity-to-access-a-resource-in-a-different-directorytenant). 3. Grant the identity's principal **Reader** and **Storage Blob Data Contributor** at storage-account scope on your BYOB storage account. 4. Share the storage account name, container name, optional path, and the identity's tenant ID and client ID with your Weights & Biases team. After Weights & Biases configures the connection, verify access by uploading and downloading a run file or artifact. **Self-Managed** As the deployment administrator, configure workload identity in Azure and Kubernetes, then select it in System Console. Use the following versions for this workflow: | Component | Required version | | - | - | | W\&B Server | v0.84.0 or later, including every component that accesses storage | | Operator Helm chart | [v0.44.13](https://github.com/wandb/helm-charts/releases/tag/operator-wandb-0.44.13) or later | | W\&B System Console | [v2.20.0](https://github.com/wandb/console/releases/tag/v2.20.0) or later for the authentication selector | 1. Enable OpenID Connect (OIDC) token federation and Azure workload identity for the Kubernetes cluster. For Azure Kubernetes Service (AKS), follow [Configure Microsoft Entra Workload ID](https://learn.microsoft.com/en-us/azure/aks/workload-identity-deploy-cluster). 2. Create or select an Azure managed identity and record its tenant ID, client ID, and principal ID. Grant its principal **Reader** and **Storage Blob Data Contributor** at storage-account scope on your BYOB storage account. 3. Configure `global.azureStorageIdentity` in your Helm values with the identity's tenant ID, client ID, and principal ID. Set up federation and the `azure.workload.identity/client-id` annotation for the Kubernetes service accounts that access storage. For Helm configuration details, see [Azure workload identity configuration](https://github.com/wandb/helm-charts/blob/operator-wandb-0.44.13/charts/operator-wandb/README.md#azure-managed-storage-workload-identity). 4. Follow the [Console procedure](#instance-level-byob) to select workload identity and save your bucket settings. Verify access by uploading and downloading a run file or artifact. ### Team level BYOB You can configure team level BYOB when you create a team in the W\&B App or using the [SCIM API](/products/wandb/platform/hosting/iam/scim#create-team) (POST Groups with optional `storageBucket`). You have two options: * **Use an existing bucket**: You must [determine the storage location](#determine-the-storage-address) for your bucket first. * **Create a new bucket** (Multi-tenant Cloud only): Weights & Biases can automatically create a bucket in your cloud provider when you create the team. Weights & Biases supports this for CoreWeave, AWS, and Google Cloud. > [!NOTE] > > * After you create a team, you can't change its storage. > * For instance level BYOB, see [Instance level BYOB](#instance-level-byob) instead. > * If you plan to configure CoreWeave storage for the team, review the [CoreWeave requirements](#coreweave-requirements) and contact [support](mailto:forge-support@coreweave.com) to verify that your bucket is configured correctly in CoreWeave and to validate your team's configuration, since you can't change the storage details after you create the team. Select your deployment type to continue. **Multi-tenant Cloud** 1. Switch to the browser window where you previously began to create the new team to find the Weights & Biases organization ID. Otherwise, log in to Forge as a user with the `admin` role, click the icon at the top left to open the left navigation, then click **Create a team to collaborate**. 2. Provide a name for the team. 3. Set **Storage Type** to **External storage**. 4. Click **Bucket location**. 5. To use an existing bucket, select it from the list. 6. To create a new bucket, click **Add bucket** at the bottom, then: 1. Click **Cloud provider** and select **CoreWeave**, **AWS**, or **Google Cloud**. 2. Enter the bucket details: * **Name**: Enter the bucket name. * **Path** (optional): Enter a sub-path to use within the bucket. 3. Provide additional connection settings for the chosen cloud provider: * CoreWeave: No additional settings required. * AWS: Optionally provide a **KMS key ARN** for encryption. * Google Cloud: No additional settings required. > [!NOTE] > > When you click **Create team**, Weights & Biases automatically creates the bucket in your cloud provider with the specified configuration. 7. Invite members to the team. In **Invite team members**, specify a comma-separated list of email addresses. Otherwise, you can invite members to the team after you create it. 8. Click **Create team**. If Weights & Biases encounters errors accessing the bucket or detects invalid settings, an error or warning displays at the bottom of the page. Otherwise, Weights & Biases creates the team. **Dedicated Cloud and Self-Managed** 1. **Dedicated Cloud**: You **must** provide the bucket path to your account team so that they can add it to your instance's supported file stores before you follow the rest of these steps to use the storage bucket for a team. 2. **Self-Managed**: You **must** add the bucket path to the `GORILLA_SUPPORTED_FILE_STORES` environment variable and then restart Weights & Biases before you follow the rest of these steps to use the storage bucket for a team. 3. Log in to Forge as a user with the `admin` role, click the icon at the top left to open the left navigation, then click **Create a team to collaborate**. 4. Provide a name for the team. 5. Set **Storage Type** to **External storage**. > [!NOTE] > > To use the instance level storage for team storage (regardless of whether it's internal or external), leave **Storage Type** set to **Internal**, even if the instance level bucket is configured for BYOB. To use separate external storage for the team, set **Storage Type** for the team to **External** and configure the bucket details in the next step. 6. Click **Bucket location**. 7. To use an existing bucket, select it from the list. To add a new bucket, click **Add bucket** at the bottom, then provide the bucket's details. Click **Cloud provider** and select **CoreWeave**, **AWS**, **Google Cloud**, or **Azure**. If the cloud provider isn't listed, ensure that you've followed the instructions in [Provision your bucket](#set-environment-variable) to add the bucket path to the supported file stores for your instance. If the storage provider is still not listed, [contact support](mailto:forge-support@coreweave.com) for assistance. 8. Specify the bucket details. * For **CoreWeave**, provide only the bucket name. * For Amazon S3, Google Cloud, or S3-compatible storage, provide the full bucket path you [determined earlier](#determine-the-storage-address). * For Azure on W\&B Dedicated or Self-Managed, set **Account name** to the Azure account and **Container name** to the Azure Blob Storage container. * Optionally, provide additional connection settings: * If applicable, set **Path** to the bucket sub-path. * **CoreWeave**: No additional connection settings required. * **AWS**: Set **KMS key ARN** to the ARN of your KMS encryption key. * **Google Cloud**: No additional connection settings required. * **Azure**: Specify values for **Tenant ID** and **Managed Identity Client ID**. These fields are mandatory unless you configured the connection string with `GORILLA_SUPPORTED_FILE_STORES`. 9. Click **Create team**. If Weights & Biases encounters errors accessing the bucket or detects invalid settings, an error or warning displays at the bottom of the page. Otherwise, Weights & Biases creates the team. ## Troubleshooting If W\&B reports errors when validating or connecting to your bucket, use the following sections to diagnose the most common causes by storage provider. ### CoreWeave This section helps troubleshoot problems connecting to CoreWeave AI Object Storage. * **Connection errors** * Verify that your Weights & Biases instance can connect to CoreWeave network endpoints. * CoreWeave uses virtual-hosted style paths, where the bucket name is a subdomain at the beginning of the path. For example, `cw://bucket-name.cwobject.com` is correct, while `cw://cwobject.com/bucket-name/` isn't. * Bucket names must not contain underscores (`_`) or other characters incompatible with DNS rules. * Bucket names must be globally unique among CoreWeave locations. * Bucket names must not begin with `cw-` or `vip-`, which are reserved prefixes. * **CORS validation failures** * A CORS policy is required. CoreWeave is S3-compatible. For details about CORS, see [Configuring cross-origin resource sharing (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html) in the AWS documentation. * `AllowedMethods` must include methods `GET`, `PUT`, and `HEAD`. * `ExposeHeaders` must include `ETag`. * The CORS policy's `AllowedOrigins` must include the domain that serves the web UI. For Multi-tenant Cloud, include `https://forge.coreweave.com` and `https://wandb.ai`. For Dedicated Cloud or Self-Managed, include the URL of your Weights & Biases instance. If only `https://wandb.ai` is allowed, uploads still succeed, but the UI can't display files from the bucket. * **LOTA endpoint issues** * Weights & Biases doesn't yet support connections to LOTA endpoints. To express interest, [contact support](mailto:forge-support@coreweave.com). * **Access key and permission errors** * Verify that your CoreWeave API access key isn't expired. * Verify that your CoreWeave API access key and secret key have sufficient permissions `GetObject`, `PutObject`, `DeleteObject`, `ListBucket`. The examples on this page meet this requirement. See [Create and Manage Access Keys](/products/storage/object-storage/auth-access/manage-access-keys/about) in the CoreWeave documentation. ### Google Cloud This section helps troubleshoot problems connecting to Google Cloud Storage. * `Bucket does not have soft deletion enabled` Ensure that soft deletion is turned on for your Google Cloud Storage bucket. See [Edit a bucket's soft delete policy](https://docs.cloud.google.com/storage/docs/use-soft-delete). # Enterprise licenses Source: https://docs.coreweave.com/products/wandb/platform/hosting/enterprise-licenses Learn about Weights & Biases Enterprise licenses, what features they include, and how to obtain and configure them. An Enterprise license unlocks Weights & Biases features designed for organizations that need enhanced capabilities in areas of security, compliance, or administration. See the list of [Enterprise features](#enterprise-features). An Enterprise license includes the following: * **Security**: Enhanced authentication, encryption, and access controls. * **Compliance**: Audit logging, HIPAA compliance options, and data governance controls. * **Administration**: User management features like SCIM provisioning, custom roles, and automation capabilities. This page is for administrators responsible for Weights & Biases deployments. It explains what Enterprise features are available, how to obtain a license, and how to configure and verify it for your deployment. ## Deployment options Enterprise licenses are available for W\&B Dedicated Cloud and Self-Managed deployments. The configuration steps differ depending on which deployment you use. * [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) provides dedicated, isolated infrastructure managed by Weights & Biases, deployed in Google Cloud. Dedicated Cloud deployments automatically include an Enterprise license. You don't need to configure anything, and all Enterprise features become available as soon as Weights & Biases provisions your deployment. * [W\&B Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) deploys on your own infrastructure, providing full control over your deployment and data. W\&B Self-Managed supports air-gapped deployments. Without an Enterprise license, [Enterprise features](#enterprise-features) are unavailable. ## Obtain an Enterprise license How you obtain an Enterprise license depends on your deployment type. Select the tab that matches your use case to continue. **Dedicated Cloud** W\&B Dedicated Cloud includes an Enterprise license, and no action is required. [Start an Enterprise trial](https://wandb.ai/site/for-enterprise/dedicated-saas-trial/) or contact [Sales](https://www.coreweave.com/contact-us) to discuss your requirements. **Self-Managed** Request an Enterprise license: * **Evaluation**: Submit the [Request a trial license](https://wandb.ai/site/for-enterprise/self-hosted-trial) form or contact [Sales](https://www.coreweave.com/contact-us) to discuss your requirements. * **Production**: Contact [Sales](https://www.coreweave.com/contact-us) to discuss your deployment requirements and sizing, and to receive your license details. > [!WARNING] > > Store license keys securely and treat them as sensitive credentials. ## Configure an Enterprise license > [!NOTE] > > This section is relevant only for W\&B Self-Managed. Dedicated Cloud deployments don't require manual configuration. After you [obtain an Enterprise license](#obtain-an-enterprise-license), you can configure it programmatically as part of your deployment or in the W\&B App after deployment. Select the tab that matches your deployment method. **Kubernetes Operator** 1. Update your `operator.yaml` (the `WeightsAndBiases` custom resource) to set the license. Replace `[YOUR-LICENSE-KEY]` with the license key you received from Weights & Biases: ```yaml theme={"system"} spec: values: global: license: "[YOUR-LICENSE-KEY]" ``` 2. Apply the updated configuration: ```bash theme={"system"} kubectl apply -f operator.yaml ``` **Terraform** 1. Update your Terraform variables. Replace `[YOUR-LICENSE-KEY]` with the license key you received from Weights & Biases: ```hcl theme={"system"} variable "license" { default = "[YOUR-LICENSE-KEY]" } ``` 2. Apply the Terraform configuration: ```bash theme={"system"} terraform apply -var="license=$LICENSE_KEY" ``` **W\&B App** For existing deployments without environment variable configuration: 1. Log in as an admin user. 2. Navigate to **System Settings**. 3. Find the **License** section. 4. Enter your new license key. 5. Save the changes. **Docker** \[!WARNING] Deploying Weights & Biases on Docker is deprecated. Weights & Biases strongly encourages migrating to a [Kubernetes Operator]() deployment managed by Helm or Terraform. Refer to [Reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch) or contact [Support](mailto:forge-support@coreweave.com) for guidance. Set the `LICENSE` environment variable. Replace `[YOUR-LICENSE-KEY]` with the license key you received from Weights & Biases: ```bash theme={"system"} docker run -d \ -e LICENSE="[YOUR-LICENSE-KEY]" \ -e OTHER_ENV_VARS \ wandb/local ``` Next, [verify your Enterprise license](#verify-and-manage-an-enterprise-license). ## Verify and manage an Enterprise license After you configure a license, verify that it's active and review its entitlements. As an instance or organization admin, follow these steps: 1. In the W\&B App, click your user profile icon in the top right, then click **System Console**. 2. Go to the **License** tab. A dashboard summarizes the license entitlements, expiration, and usage over time. If you see an error, see [Common issues](#common-issues). 3. For detailed information about the license and its entitlements, click **View license online**. From this page, you can also order a new trial or production license. At the top of the page, click **New license order** and submit the form. 4. To renew an expired license or to update the license key, click **Update License**. > [!TIP] > > To ensure uninterrupted service, Weights & Biases contacts you: > > * 30 days before the license expires. > * When the license has expired. ## Enterprise features For a full, categorized list of available Enterprise features, see the [Pricing](https://coreweave.com/forge-pricing) page, then click **Cloud-hosted** or **Privately-hosted**. ## Common issues If you encounter problems configuring or using your Enterprise license, review the following common issues before contacting support. ### License not recognized If your license isn't recognized, check the following: * Verify that the license key is correctly formatted (no extra spaces). * Ensure that the license hasn't expired. * Check that the license is set in the correct configuration location. ### Features not available after setting license If features aren't available after you set the license, try the following: * Restart your Weights & Biases services after setting the license. * Verify that the license includes the specific features you're trying to access. * Check the system logs for any license validation errors. ### License expiration warnings To stay ahead of license expiration: * Monitor the **System Settings** page for expiration notifications. * Set up alerts for license expiration in your monitoring system. * Keep your account team contact information up to date. ### Get support For assistance with Enterprise licenses, contact your account team, [Sales](https://www.coreweave.com/contact-us), or [Support](mailto:forge-support@coreweave.com). ## Additional resources * [Pricing](https://coreweave.com/forge-pricing) * [W\&B Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) * [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) * [Security and compliance](https://wandb.ai/site/security/) # Configure environment variables Source: https://docs.coreweave.com/products/wandb/platform/hosting/env-vars Configure a self-managed W&B Server installation using environment variables for database, storage, Redis, and IAM settings. In addition to configuring instance-level settings through the System Settings admin UI, Weights & Biases also provides a way to configure these values in code using environment variables. This page lists the environment variables you can set to control database, storage, Redis, identity provider, and other instance-level behavior for a self-managed W\&B Server deployment. You can use these variables to manage configuration as code instead of through the admin UI. For IAM-specific variables, see [advanced configuration for IAM](/products/wandb/platform/hosting/iam/advanced_env_vars). ## Environment variable reference The following table describes each environment variable, the behavior it controls, and any constraints on its value. | Environment variable | Description | | - | - | | `LICENSE` | Your wandb/local license | | `MYSQL` | The MySQL connection string | | `BUCKET` | The S3 / GCS bucket for storing data | | `BUCKET_QUEUE` | The SQS / Google PubSub queue for object creation events | | `NOTIFICATIONS_QUEUE` | The SQS queue on which to publish run events | | `AWS_REGION` | The AWS Region where your bucket lives | | `HOST` | The FQD of your instance, for example `https://my.domain.net` | | `OIDC_ISSUER` | A URL to your Open ID Connect identity provider, for example `https://cognito-idp.us-east-1.amazonaws.com/us-east-1_uiIFNdacd` | | `OIDC_CLIENT_ID` | The Client ID of application in your identity provider | | `OIDC_AUTH_METHOD` | Implicit (default) or pkce. For more context, see the following sections. | | `SLACK_CLIENT_ID` | The client ID of the Slack application you want to use for alerts | | `SLACK_SECRET` | The secret of the Slack application you want to use for alerts | | `LOCAL_RESTORE` | If you can't access your instance, you can temporarily set this to true. Check the logs from the container for temporary credentials. | | `REDIS` | Can be used to set up an external REDIS instance with Weights & Biases. | | `LOGGING_ENABLED` | When set to true, access logs are streamed to stdout. You can also mount a sidecar container and tail `/var/log/gorilla.log` without setting this variable. | | `GORILLA_ALLOW_USER_TEAM_CREATION` | When set to true, lets non-admin users create a new team. False by default. | | `GORILLA_CUSTOMER_SECRET_STORE_SOURCE` | Sets the secret manager for storing team secrets used by W\&B Weave. These secret managers are supported:
  • **Internal secret manager** (default): `k8s-secretmanager://wandb-secret`
  • **AWS Secret Manager**: `aws-secretmanager`
  • **Google Cloud Secret Manager**: `gcp-secretmanager`
  • **Azure**: `az-secretmanger`
| | `GORILLA_DATA_RETENTION_PERIOD` | How long to retain deleted data from runs in hours. Deleted run data is unrecoverable. Append an `h` to the input value. For example, `"24h"`. | | `GORILLA_DISABLE_PERSONAL_ENTITY` | When set to true, turns off [personal entities](/support/models/articles/what-is-the-difference-between-team-and-). Prevents creation of new personal projects in their personal entities and prevents writing to existing personal projects. | | `GORILLA_GRAPHQL_DISABLE_INTROSPECTION` | When set to true, disables GraphQL introspection: `__type` and `__schema` queries return no schema data while the request still succeeds. On **Self-Managed**, setting the Gorilla configuration field `graphql-disable-introspection` has the same effect. Set this variable under `spec.values.global.extraEnv` in your `WeightsAndBiases` custom resource (see the [`global.extraEnv` example](/products/wandb/platform/hosting/self-managed/operator#ldap) in the Operator guide). **Client applications require [W\&B SDK v0.26.0](/release-notes/sdk-releases#0-26-0) or later** against deployments with introspection already turned off. | | `GRAPHQL_REJECT_UNAUTHED_REQUESTS` | When set to `true` on the **API** service, rejects GraphQL requests that don't have an authenticated user. Unauthenticated requests receive HTTP 401. **Self-Managed** and **Dedicated Cloud** v0.80.0+ only; not available on Multi-tenant Cloud. This feature is opt-in: if the environment variable is unset or not `true`, behavior is unchanged. Set on the API component only (for example, `api.env` in Helm values). Before activating, confirm that workflows that rely on anonymous GraphQL access (such as viewing shared reports without signing in, or open projects) still meet your requirements. On **Self-Managed**, setting the Gorilla configuration field `graphql-reject-unauthed-requests` to `true` has the same effect. | | `GORILLA_ARTIFACT_GC_ENABLED` | When set to true, enables garbage collection for deleted artifacts. Required for self-managed deployments. See [Delete an artifact](/products/wandb/artifacts/delete-artifacts) for more information. | | `WANDB_ARTIFACT_DIR` | Where to store all downloaded artifacts. If unset, defaults to the `artifacts` directory relative to your training script. Make sure this directory exists and the running user has permission to write to it. This does not control the location of generated metadata files, which you can set using the `WANDB_DIR` environment variable. | | `WANDB_DATA_DIR` | Where to upload staging artifacts. The default location depends on your platform, because it uses the value of `user_data_dir` from the `platformdirs` Python package. Make sure this directory exists and the running user has permission to write to it. | | `WANDB_DIR` | Where to store all generated files. If unset, defaults to the `wandb` directory relative to your training script. Make sure this directory exists and the running user has permission to write to it. This does not control the location of downloaded artifacts, which you can set using the `WANDB_ARTIFACT_DIR` environment variable. | | `WANDB_IDENTITY_TOKEN_FILE` | For [identity federation](/products/wandb/platform/hosting/iam/identity_federation), the absolute path to the local directory where Java Web Tokens (JWTs) are stored. | > [!NOTE] > > * Use the `GORILLA_DATA_RETENTION_PERIOD` environment variable cautiously. It applies to **deleted run data** (including run-associated files such as media after deletion flows). It does **not** delete artifacts; use artifact deletion and `GORILLA_ARTIFACT_GC_ENABLED` as described in [Delete an artifact](/products/wandb/artifacts/delete-artifacts). For how deleting runs and files relates to storage and this setting, see [When deleted run data is removed from storage](/products/wandb/runs/delete-runs#when-deleted-run-data-is-removed-from-storage) in **Delete runs**. Data is removed according to the retention window once the variable is set. Back up both the database and the storage bucket before you enable or change this value. > > Background removal of objects from your bucket is **approximate** and not guaranteed to finish within a specific time. For expectations, troubleshooting, and how this relates to storage costs, see [Manage bucket storage and costs](/products/wandb/platform/hosting/managing-bucket-storage). > * To enable `GRAPHQL_REJECT_UNAUTHED_REQUESTS` with the [Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator), set it on the API component only: > > ```yaml theme={"system"} > api: > env: > GRAPHQL_REJECT_UNAUTHED_REQUESTS: "true" > ``` > > Apply your changes and wait for the API pods to roll out before you verify the setting. You can disable the behavior by removing the variable or setting it to another value. ## Advanced reliability settings The following section describes optional configuration you can apply to improve the reliability and performance of your W\&B Server deployment. ### Redis An external Redis server is optional but recommended for production systems. Redis helps improve the reliability of the service and enables caching to decrease load times, especially in large projects. Use a managed Redis service such as ElastiCache with high availability (HA) and the following specifications: * Minimum 4 GB of memory, suggested 8 GB * Redis version 6.x * In transit encryption * Authentication enabled To configure the Redis instance with Weights & Biases, go to the Weights & Biases settings page at `http(s)://YOUR-W&B-SERVER-HOST/system-admin`. Enable the **Use an external Redis instance** option, and fill in the Redis connection string in the following format: ![Configuring REDIS in Weights & Biases](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/configure_redis.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=527a352ee1e0dab4ed8991aecc1b5eb6) You can also configure Redis using the environment variable `REDIS` on the container or in your Kubernetes deployment. Alternatively, you can set up `REDIS` as a Kubernetes secret. This page assumes the Redis instance is running at the default port of `6379`. If you configure a different port, set up authentication, and want TLS enabled on the `redis` instance, the connection string format is: `redis://$USER:$PASSWORD@$HOST:$PORT?tls=true` # Deployment options Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options Choose a Weights & Biases deployment type: Forge, Dedicated Cloud, or Self-Managed. Choose the hosting option that fits your organization's security, compliance, and operational needs. CoreWeave manages the infrastructure for Forge and Dedicated Cloud; with Self-Managed, you manage it. ## Forge [Forge](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) is fully managed by CoreWeave, including upgrades, maintenance, platform security, and capacity planning. Forge is deployed in CoreWeave's Google Cloud account in [Google Cloud's North America regions](https://cloud.google.com/compute/docs/regions-zones). [Bring your own bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector) optionally lets you store W\&B Artifacts and other related sensitive data in your own cloud or on-premises infrastructure. See [Forge](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [get started for free](https://id.coreweave.com/signup). ## W\&B Dedicated Cloud [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) is a fully managed platform with dedicated, isolated infrastructure, designed with enterprise organizations in mind. W\&B Dedicated Cloud is deployed in Weights & Biases's AWS, Google Cloud, or Azure account. Dedicated Cloud provides more flexibility than Forge, but less complexity than W\&B Self-Managed. Weights & Biases manages upgrades, maintenance, platform security, and capacity planning. Each Dedicated Cloud instance has its own isolated network, compute, and storage, separate from other W\&B Dedicated Cloud instances. Your Weights & Biases-specific metadata and data is stored in an isolated cloud storage and is processed using isolated cloud compute services. [Bring your own bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector) optionally lets you store artifacts and other related sensitive data in your own cloud or on-premises infrastructure. W\&B Dedicated Cloud includes an [enterprise license](/products/wandb/platform/hosting/enterprise-licenses) with support for security and other enterprise-friendly capabilities. For organizations with advanced security or compliance requirements, features such as HIPAA compliance, single sign-on, or customer-managed encryption keys (CMEK) are available with Enterprise support. [Request more information](https://www.coreweave.com/contact-us). See [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [get started for free](https://id.coreweave.com/signup). ## W\&B Self-Managed [W\&B Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) is entirely managed by you, either on your premises or in cloud infrastructure that you manage. Your IT/DevOps/MLOps team is responsible for: * Provisioning your deployment. * Securing your infrastructure in accordance with your organization's policies and [Security Technical Implementation Guidelines (STIG)](https://en.wikipedia.org/wiki/Security_Technical_Implementation_Guide), if applicable. * Managing upgrades and applying patches. * Continuously maintaining your Self-Managed W\&B Server instance. You can optionally obtain an [enterprise license](/products/wandb/platform/hosting/enterprise-licenses) for W\&B Self-Managed. An enterprise license includes support for security and other enterprise-friendly capabilities. See [W\&B Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) or review the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch) guidelines. # Dedicated Cloud Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options/dedicated-cloud Learn about W&B Dedicated Cloud deployment features including compliance, data security, IAM, and maintenance policies. W\&B Dedicated Cloud is a fully managed platform with dedicated, isolated infrastructure, deployed in Weights & Biases's AWS, Google Cloud, or Azure cloud accounts. Each Dedicated Cloud instance has its own isolated network, compute, and storage from other W\&B Dedicated Cloud instances. Weights & Biases stores your Weights & Biases-specific metadata and data in isolated cloud storage and processes it using isolated cloud compute services. Use Dedicated Cloud when you need the benefits of a managed Weights & Biases platform along with isolation that helps you meet security, compliance, and data residency requirements. This page describes the compliance, data security, IAM, monitoring, and maintenance features available with Dedicated Cloud, and links to deeper documentation for each topic. W\&B Dedicated Cloud is available in [multiple global regions for each cloud provider](/products/wandb/platform/hosting/hosting-options/dedicated-cloud/regions). ## Rate limits Weights & Biases applies default rate limits on Dedicated Cloud to maintain instance stability. See [Rate limits](/products/wandb/platform/hosting/hosting-options/dedicated-cloud/rate-limits) for default values, how limits are enforced, and how to request higher limits when you scale up training. ## Compliance W\&B Dedicated Cloud supports the following compliance frameworks: * **SOC 2**: W\&B Dedicated Cloud's hosting platform meets the requirements of the [Service and Organization Controls (SOC) 2 Type 2](https://www.aicpa-cima.com/topic/audit-assurance/audit-and-assurance-greater-than-soc-2), published by the [Auditing Standards Board of the American Institute of Certified Public Accountants (AICPA)](https://www.aicpa-cima.com/home). A SOC 2 report evaluates a service organization's controls for security, availability, processing integrity, confidentiality, and privacy. W\&B Dedicated Cloud is subject to periodic internal and external audits to verify continued compliance. Refer to the [Weights & Biases Security Portal](https://security.wandb.ai/) to request the SOC 2 report and other security and compliance documents. * **HIPAA**: When configured appropriately, W\&B Dedicated Cloud meets the requirements of the [Health Insurance Portability and Accountability Act of 1996 (HIPAA)](https://www.hhs.gov/hipaa/for-professionals/index.html). Compliance is shared between Weights & Biases, your organization, and any third-party services in the deployment. If your organization is subject to HIPAA, you must have a **Business Associate Agreement** on file with Weights & Biases. Request more information through the [Security Portal](https://security.wandb.ai/). ## Data security Dedicated Cloud provides several mechanisms for controlling where your data is stored and how it can be accessed. The following options let you bring your own storage, restrict network access, and connect privately to your instance. You can bring your own bucket (BYOB) using the [secure storage connector](/products/wandb/platform/hosting/data-security/secure-storage-connector) at the [instance and team levels](/products/wandb/platform/hosting/data-security/secure-storage-connector#configuration-options) to store your files such as models, datasets, and more. Similar to W\&B Multi-tenant Cloud, you can configure a single bucket for multiple teams or you can use separate buckets for different teams. If you don't configure secure storage connector for a team, Weights & Biases stores that data in the instance-level bucket. ![Dedicated Cloud architecture diagram](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/dedicated_cloud_arch.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=018b8e2124ab9473969405d59133268f) In addition to BYOB with secure storage connector, you can use [IP allowlisting](/products/wandb/platform/hosting/data-security/ip-allowlisting) to restrict access to your Dedicated Cloud instance from only trusted network locations. You can connect privately to your Dedicated Cloud instance using [cloud provider's secure connectivity solution](/products/wandb/platform/hosting/data-security/private-connectivity). You're responsible for ensuring that your deployment complies with your organization's policies and [Security Technical Implementation Guidelines (STIG)](https://en.wikipedia.org/wiki/Security_Technical_Implementation_Guide), if applicable. ## Identity and access management (IAM) Use the identity and access management capabilities for secure authentication and effective authorization in your Weights & Biases Organization. The following features are available for IAM in Dedicated Cloud instances: * Authenticate with [SSO using OpenID Connect (OIDC)](/products/wandb/platform/hosting/iam/sso) or with [LDAP](/products/wandb/platform/hosting/iam/ldap). * [Configure appropriate user roles](/products/wandb/platform/hosting/iam/access-management/manage-organization#assign-or-update-a-users-role) at the scope of the organization and within a team. * Define the scope of a Weights & Biases project to limit who can view, edit, and submit W\&B runs to it with [restricted projects](/products/wandb/platform/hosting/iam/access-management/restricted-projects). * Use JSON Web Tokens with [identity federation](/products/wandb/platform/hosting/iam/identity_federation) to access W\&B APIs. ## Monitor Use [Audit logs](/products/wandb/platform/hosting/monitoring-usage/audit-logging) to track user activity within your teams and to conform to your enterprise governance requirements. Also, you can view organization usage in your Dedicated Cloud instance with [Weights & Biases Organization Dashboard](/products/wandb/platform/hosting/monitoring-usage/org_dashboard). ## Maintenance Similar to W\&B Multi-tenant Cloud, you don't incur the overhead and costs of provisioning and maintaining the Weights & Biases platform with Dedicated Cloud. To understand how Weights & Biases manages updates on Dedicated Cloud, refer to the [server release process](/products/wandb/platform/hosting/server-upgrade-process). ## Data retention policy By default, a Dedicated Cloud instance retains the following items for 7 days after deletion: * Runs and history * Non-artifact run files, such as media, configuration files, and log files * Artifacts and artifact references Until this period elapses, you can restore these items. Contact [support](mailto:forge-support@coreweave.com) or your AISE for assistance. To meet your data retention requirements, you can change the data retention period for your Dedicated Cloud instance. Depending on your use case, select the **Environment variable** or **Helm** tab for details. **Environment variable** To change the data retention policy, set the environment variable `GORILLA_DATA_RETENTION_PERIOD` to a value in hours. For example, to retain deleted data for 14 days (336 hours): ```bash theme={"system"} export GORILLA_DATA_RETENTION_PERIOD="336h" ``` **Helm** To change the data retention policy, set the Helm value `env.dataRetentionPeriod` to a value in hours. For example, to retain deleted data for 14 days (336 hours): ```yaml theme={"system"} env: dataRetentionPeriod: "336h" ``` ## Migration options Weights & Biases supports migration to Dedicated Cloud from a [Self-Managed instance](/products/wandb/platform/hosting/hosting-options/self-managed) or [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), subject to specific limits and migration-related constraints. ## Next steps If you're interested in using Dedicated Cloud, submit the [Dedicated SaaS trial request form](https://wandb.ai/site/for-enterprise/dedicated-saas-trial) to start the process with Weights & Biases. # Export data from Dedicated Cloud Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options/dedicated-cloud/export-data Export runs, metrics, artifacts, and reports from a W&B Dedicated Cloud instance using the Python SDK API. Export the data managed in your W\&B Dedicated Cloud instance, such as runs, metrics, artifacts, and reports, when you need a portable copy for backup, migration, or external analysis. To extract this data, use the W\&B SDK API with the [Import and Export API](/products/wandb/ref/python/public-api). The following table covers some key export use cases. | Purpose | Documentation | | - | - | | Export project metadata | [Projects API](/products/wandb/ref/python/public-api/projects) | | Export runs in a project | [Runs API](/products/wandb/ref/python/public-api/runs) | | Export reports | [Report and Workspace API](/products/wandb/reports/clone-and-export-reports) | | Export artifacts | [Explore artifact graphs](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph), [Download and use artifacts](/products/wandb/artifacts/download-and-use-an-artifact#download-and-use-an-artifact-stored-on-wb) | If you manage artifacts stored in the Dedicated Cloud with [Secure Storage Connector](/products/wandb/platform/app/settings-page/teams#secure-storage-connector), you might not need to export the artifacts using the W\&B SDK API. > [!NOTE] > > Using the W\&B SDK API to export all of your data can be slow if you have many runs, artifacts, and similar resources. Weights & Biases recommends running the export process in appropriately sized batches to avoid overwhelming your Dedicated Cloud instance. # Rate limits Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options/dedicated-cloud/rate-limits Default rate limits on Dedicated Cloud and how to request changes W\&B Dedicated Cloud applies rate limits to maintain instance stability. CoreWeave can adjust limits when you scale up training or need higher throughput. Use this page to understand the default limits that apply to your Dedicated Cloud instance and how to request an increase if your workloads need more capacity. ## Default limits and notification The following section lists the default rate limits and describes how the W\&B SDK behaves when you exceed a limit. The following default limits help maintain platform stability: | Limit | Default | Scope | | - | - | - | | Filestream requests per second | 500 | Project | | Filestream ingestion per second | 120 MB | Project | | Filestream requests per second | 2 | Run | | Run creation requests per second | 80 | Project | When a limit is exceeded, the W\&B SDK returns HTTP response `429`, and the message `HTTP 429: rate limit exceeded` appears in the SDK logs. How the SDK responds depends on which limit was exceeded: * Filestream rate limits don't cause logging to crash or fail. When the SDK receives a `429` response on a filestream request, it backs off and retries the rate-limited request as-is, while subsequent updates accumulate. * Run creation rate limits block further training. ```text theme={"system"} HTTP 429: rate limit exceeded ``` CoreWeave recommends these defaults for typical production workloads. If your workloads consistently exceed these limits, contact [Support](mailto:forge-support@coreweave.com) or your Account Solutions Engineer (AISE) to request higher limits. Provide details of your experimental setup and usage patterns so that CoreWeave can scope an appropriate adjustment. # Supported Dedicated Cloud regions Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options/dedicated-cloud/regions View all supported AWS, Google Cloud, and Azure regions available for W&B Dedicated Cloud instances. AWS, Google Cloud, and Azure support cloud computing services in multiple locations worldwide. Global regions help ensure that you satisfy requirements such as data residency, compliance, latency, and cost efficiency. Weights & Biases supports many of the available global regions for Dedicated Cloud. The following sections list the supported regions for each cloud provider. > [!NOTE] > > Reach out to [Support](mailto:forge-support@coreweave.com) if your preferred AWS, Google Cloud, or Azure region isn't listed. CoreWeave can validate whether the relevant region has all the services that Dedicated Cloud needs and prioritize support depending on the outcome of the evaluation. ## Supported AWS regions The following table lists [AWS regions](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html) that Weights & Biases supports for Dedicated Cloud instances. | Region location | Region name | | - | - | | US East (Ohio) | `us-east-2` | | US East (N. Virginia) | `us-east-1` | | US West (N. California) | `us-west-1` | | US West (Oregon) | `us-west-2` | | Canada (Central) | `ca-central-1` | | Europe (Frankfurt) | `eu-central-1` | | Europe (Ireland) | `eu-west-1` | | Europe (London) | `eu-west-2` | | Europe (Stockholm) | `eu-north-1` | | Asia Pacific (Mumbai) | `ap-south-1` | | Asia Pacific (Singapore) | `ap-southeast-1` | | Asia Pacific (Sydney) | `ap-southeast-2` | | Asia Pacific (Tokyo) | `ap-northeast-1` | | Asia Pacific (Seoul) | `ap-northeast-2` | For more information about AWS regions, see [Regions, Availability Zones, and Local Zones](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html) in the AWS Documentation. See [What to Consider when Selecting a Region for your Workloads](https://aws.amazon.com/blogs/architecture/what-to-consider-when-selecting-a-region-for-your-workloads/) for an overview of factors to consider when choosing an AWS region. ## Supported Google Cloud regions The following table lists [Google Cloud regions](https://cloud.google.com/compute/docs/regions-zones) that Weights & Biases supports for Dedicated Cloud instances. | Region location | Region name | | - | - | | South Carolina | `us-east1` | | N. Virginia | `us-east4` | | Iowa | `us-central1` | | Oregon | `us-west1` | | Los Angeles | `us-west2` | | Las Vegas | `us-west4` | | Toronto | `northamerica-northeast2` | | Belgium | `europe-west1` | | London | `europe-west2` | | Frankfurt | `europe-west3` | | Netherlands | `europe-west4` | | Sydney | `australia-southeast1` | | Tokyo | `asia-northeast1` | | Seoul | `asia-northeast3` | For more information about Google Cloud regions, see [Regions and zones](https://cloud.google.com/compute/docs/regions-zones) in the Google Cloud Documentation. ## Supported Azure regions The following table lists [Azure regions](https://azure.microsoft.com/explore/global-infrastructure/geographies/#geographies) that Weights & Biases supports for Dedicated Cloud instances. | Region location | Region name | | - | - | | Virginia | `eastus` | | Iowa | `centralus` | | Washington | `westus2` | | California | `westus` | | Canada Central | `canadacentral` | | France Central | `francecentral` | | Netherlands | `westeurope` | | Tokyo, Saitama | `japaneast` | | Seoul | `koreacentral` | For more information about Azure regions, see [Azure geographies](https://azure.microsoft.com/explore/global-infrastructure/geographies/#overview) in the Azure Documentation. # Forge Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud Learn about Forge, a fully managed deployment on Google Cloud with built-in compliance and data security. This page describes Forge, including its architecture, compliance posture, data security options, and identity and access management capabilities, so you can decide whether it fits your organization's hosting requirements. CoreWeave Forge is a fully managed platform deployed in CoreWeave's Google Cloud account in [Google Cloud's North America regions](https://cloud.google.com/compute/docs/regions-zones). Forge uses autoscaling in Google Cloud to scale the platform based on changes in traffic. ![Forge architecture diagram](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/multi_tenant_cloud_arch.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=915f746c8f7ea65cc6f4c6292063109c) Forge scales to meet your organization's needs and supports logging up to 250,000 metrics per project with up to 1 million data points per metric. For larger deployments, contact [support](mailto:forge-support@coreweave.com). ## Compliance Forge's hosting platform meets the requirements of the [Service and Organization Controls (SOC) 2 Type 2](https://www.aicpa-cima.com/topic/audit-assurance/audit-and-assurance-greater-than-soc-2), published by the [Auditing Standards Board of the American Institute of Certified Public Accountants (AICPA)](https://www.aicpa-cima.com/home). A SOC 2 report evaluates a service organization's controls for security, availability, processing integrity, confidentiality, and privacy. Forge is subject to periodic internal and external audits to verify continued compliance. Refer to the [Weights & Biases Security Portal](https://security.wandb.ai/) to request the SOC 2 report and other security and compliance documents. > [!TIP] > > Forge doesn't meet the requirements of the [Health Insurance Portability and Accountability Act of 1996 (HIPAA)](https://www.hhs.gov/hipaa/for-professionals/index.html). If your organization is subject to HIPAA, consider [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) instead. ## Data security For users on Free or Pro plans, Weights & Biases stores all data only in the shared cloud storage and processes it with shared cloud compute services. Depending on your pricing plan, you may be subject to storage limits. Users on an Enterprise plan can [bring their own bucket (BYOB) using the secure storage connector](/products/wandb/platform/hosting/data-security/secure-storage-connector) at the [team level](/products/wandb/platform/hosting/data-security/secure-storage-connector#configuration-options) to store their files such as models, datasets, and more. You can configure a single bucket for multiple teams or you can use separate buckets for different teams. If you don't configure BYOB for a team, Weights & Biases stores the team's data in the shared cloud storage. You are responsible for ensuring that your deployment complies with your organization's policies and [Security Technical Implementation Guidelines (STIG)](https://en.wikipedia.org/wiki/Security_Technical_Implementation_Guide), if applicable. ## Data retention policy Forge retains the following items for 7 days after deletion: * Runs and history. * Non-artifact run files, such as media, configuration files, and log files. * Artifacts and artifact references. Until this period elapses, Weights & Biases can restore these items. Contact [support](mailto:forge-support@coreweave.com) or your AISE for assistance. ## Identity and access management (IAM) If you're on an Enterprise plan, identity and access management features support secure authentication and authorization for your Weights & Biases deployment: * Authenticate users with SSO using OIDC or SAML. Contact your account team or support if you'd like to configure SSO for your organization. * [Configure user roles](/products/wandb/platform/hosting/iam/access-management/manage-organization#assign-or-update-a-users-role) at the scope of the organization and within a team. * Define the scope of a Weights & Biases project to limit who can view, edit, and submit W\&B runs to it with [restricted projects](/products/wandb/platform/hosting/iam/access-management/restricted-projects). ## Billing and usage Organization admins can manage usage and billing for their account from the **Billing** tab in their account view. If using the shared cloud storage on Forge, an admin can optimize storage usage across different teams in their organization. ## Maintenance Forge is a multi-tenant, fully managed platform. CoreWeave manages the infrastructure, so you don't incur the overhead and costs of provisioning and maintaining it. ## Next steps Access [Forge directly](https://forge.coreweave.com/wandb) to get started with most features for free. To try data security and IAM features, [request an Enterprise trial](https://wandb.ai/site/for-enterprise/multi-tenant-saas-trial). # W&B Self-Managed deployment overview Source: https://docs.coreweave.com/products/wandb/platform/hosting/hosting-options/self-managed Deploy W&B Self-Managed on cloud or on-premises infrastructure > [!TIP] > > Weights & Biases recommends fully managed deployment options such as [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud). Weights & Biases fully managed services are secure to use, with minimal configuration required. W\&B Self-Managed lets you run W\&B Server in infrastructure you control, so you can meet internal policies for data residency, network isolation, and compliance. This overview is for IT, DevOps, and MLOps teams who plan, deploy, and operate W\&B Server on their own cloud account or on-premises infrastructure. Deploy W\&B Server on your [AWS, Google Cloud, or Azure cloud account](#deploy-wb-server-within-Self-Managed-cloud-accounts) or within your [on-premises infrastructure](#deploy-wb-server-in-on-prem-infrastructure). Your IT, DevOps, or MLOps team has the following responsibilities: * Provision your deployment. * Secure your infrastructure in accordance with your organization's policies, [Security Technical Implementation Guidelines (STIG)](https://en.wikipedia.org/wiki/Security_Technical_Implementation_Guide), if applicable. * Maintain compliance with your organization's regulatory requirements, such as [Service and Organization Controls (SOC) 2 Type 2](https://www.aicpa-cima.com/topic/audit-assurance/audit-and-assurance-greater-than-soc-2) and [Health Insurance Portability and Accountability Act of 1996 (HIPAA)](https://www.hhs.gov/hipaa/for-professionals/index.html). * Manage upgrades and apply patches. * Maintain your W\&B Self-Managed deployment on an ongoing basis. > [!NOTE] > > If your organization is subject to regulatory requirements, consider deploying on [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), which is maintained by Weights & Biases. > > * W\&B Dedicated Cloud's hosting platform meets the requirements of SOC 2 Type 2. > * When configured appropriately, a W\&B Dedicated Cloud deployment complies with HIPAA. > > Refer to the [Weights & Biases Security Portal](https://security.wandb.ai/) to request more information. ## About the W\&B Kubernetes Operator W\&B Self-Managed installations are delivered and managed through a Kubernetes operator, which handles the day-to-day complexity of running W\&B Server. Use the W\&B Kubernetes Operator to deploy W\&B Self-Managed. The operator simplifies deploying, administering, troubleshooting, and scaling Weights & Biases. The operator connects to a central [deploy.wandb.ai](https://deploy.wandb.ai) server to request the latest specification changes for a given release channel and apply them. The operator receives updates as long as the license is valid. The operator uses [Helm](https://helm.sh/) both to install itself and to manage the Weights & Biases Kubernetes stack. The deployment consists of multiple pods, one per service, and each pod name is prefixed with `wandb-`. Configuration follows a hierarchy: **Release Channel Values** (defaults from Weights & Biases), **User Input Values** (overrides via the System Console), and **Custom Resource Values** (your spec overrides both). Use the following resources based on your deployment target: * To deploy W\&B Self-Managed in public cloud or on-premises infrastructure, see [Deploy Weights & Biases with Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator). * To deploy W\&B Self-Managed to a custom cloud platform that isn't AWS, the requirements are similar to the requirements to deploy in [on-premises infrastructure](#deploy-wb-server-in-on-prem-infrastructure). * To deploy W\&B Self-Managed in air-gapped environments, see [Deploy on Air-Gapped Kubernetes](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped). You can optionally configure rate limits on your instance to maintain stability. For more information, see [Rate limits](/products/wandb/platform/hosting/self-managed/rate-limits). ## Required infrastructure Before you deploy, make sure the following infrastructure is available. All W\&B Self-Managed deployment options depend on these components: * Kubernetes * MySQL 8.4.x database * Amazon S3-compatible object storage * Redis cache Weights & Biases can provide recommendations for the different components and provide guidance through the installation process. For more information, see [Requirements](/products/wandb/platform/hosting/self-managed/requirements). ## Obtain your W\&B Server license A W\&B Server license authorizes your deployment. You must obtain a license before installation. For step-by-step instructions, see [License](/products/wandb/platform/hosting/self-managed/requirements#license) on the Requirements page. # Access management Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/access-management-intro Manage users, teams, roles, and project visibility as an organization or team admin in Weights & Biases. This page introduces how access management works in Weights & Biases, including how to administer users and teams, maintain admin access to your organization, and control who can view individual projects. It's intended for organization admins, team admins, and project owners. > [!NOTE] > > In multi-tenant Forge, access management is separate from CoreWeave IAM. Forge roles don't grant access to CoreWeave Infrastructure, and CoreWeave IAM roles don't grant Forge access. See [Forge and CoreWeave identity](/security/forge-identity-and-access). ## Manage users and teams within an organization This section explains how admin roles are assigned and what each role can do to manage users and teams. Weights & Biases assigns the *instance admin role* to the first user who signs up to Weights & Biases with a unique organization domain. The organization admin assigns specific users team admin roles. > [!NOTE] > > Weights & Biases recommends that you have more than one instance admin in an organization. This best practice ensures that admin operations can continue when the primary admin isn't available. A *team admin* is a user in an organization who has administrative permissions within a team. Organization admins can access and use an organization's account settings at `https://forge.coreweave.com/account-settings/` to invite users, assign or update a user's role, create teams, remove users from your organization, and assign the billing admin. See [Add and manage users](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-users) for more information. After an organization admin creates a team, the instance admin or a team admin can: * Invite users to the team or remove users from the team. By default, only an admin can perform this action. To change this behavior, see [Team settings](/products/wandb/platform/app/settings-page/teams#privacy). * Assign or update a team member's role. * Automatically add new users to a team when they join your organization. Both the organization admin and the team admin use team dashboards at `https://wandb.ai/[YOUR-TEAM-NAME]` to manage teams. For more information, and to configure a team's default privacy settings, see [Add and manage teams](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-teams). ## Maintain admin access This section describes why you must always preserve admin access and how automated user deprovisioning can put that access at risk. You must ensure that at least one admin user always exists in your instance or organization. Otherwise, no user can configure or maintain your organization's Weights & Biases account. If you manage users interactively, deleting a user requires admin access, including when deleting another admin user. This helps reduce the risk of removing the sole admin user. However, if an organization uses automated processes to deprovision users from Weights & Biases, a deprovisioning operation could inadvertently remove the last remaining admin from the instance or organization. For assistance with developing operational procedures, or to restore admin access, contact [support](mailto:forge-support@coreweave.com). ## Limit visibility to specific projects Define the scope of a Weights & Biases project to limit who can view, edit, and submit W\&B runs to it. Limiting who can view a project is particularly useful if a team works with sensitive or confidential data. A team admin or the owner of a project can set and edit a project's visibility. For more information, see [Project visibility](/products/wandb/platform/hosting/iam/access-management/restricted-projects). # Manage your organization Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/access-management/manage-organization Manage users, teams, roles, seats, and billing within a Forge organization as an organization admin. This page describes how to administer a Forge organization, including how to invite users, manage teams, assign roles and seats, and configure billing. Use these procedures to keep your organization's membership, access, and team structure aligned with how your company uses Forge. As an admin of an organization, you can [manage individual users](#add-and-manage-users) within your organization and [manage teams](#add-and-manage-teams). As a team admin, you can [manage teams](#add-and-manage-teams). > [!NOTE] > > The following workflow applies to users with instance admin roles. Contact an admin in your organization if you believe you should have instance admin permissions. To simplify user management in your organization, see [Automate user and team management](/products/wandb/platform/hosting/iam/automate_iam). ## Change the name of your organization > [!NOTE] > > The following workflow only applies to W\&B Multi-tenant Cloud. 1. In the upper right corner of the header, open your account menu. 2. Select **Settings**. 3. Within the **Settings** tab, select **General**. 4. Select the **Change name** button. 5. Within the modal that appears, provide a new name for your organization and select the **Save name** button. ## Add and manage users As an admin, use your organization's dashboard to: * Invite or remove users. * Assign or update a user's organization role. * Create custom roles that team admins can assign to team members. * Assign the billing admin. An organization admin can add users to an organization in several ways: * Member-by-invite * Auto provisioning with SSO * Domain capture The following sections describe each method. ### Seats and pricing The following table summarizes how seats work for Models and Weave: | Product | Seats | Cost based on | | - | - | - | | Models | Pay per seat | The number of Models paid seats you have and the usage you’ve accrued determine your overall subscription cost. Each user can be assigned one of three available seat types: Full, Viewer (Enterprise-only feature), or No access. | | Weave | Free | Usage based | ### Invite a user Admins can invite users to their organization, as well as to specific teams within the organization. **Multi-tenant Cloud** 1. In the upper right corner of the header, open your account menu. 2. Select **Users**. 3. Select **Invite new user**. 4. In the modal that appears, provide the email or username of the user in the **Email or username** field. 5. (Recommended) Add the user to a team from the **Choose teams** dropdown menu. 6. From the **Select role** dropdown, select the organization role to assign to the user. You can change the user's role at a later time. See the table in [Assign or update a user's role](#assign-or-update-a-users-role) for possible roles. 7. Click the **Send invite** button. After you select the **Send invite** button, Forge sends an invite link to the user's email using a third-party email server. A user can access your organization once they accept the invite. **Dedicated Cloud and Self-Managed** 1. Navigate to `https://.io/console/settings/`. Replace `` with your organization name. 2. Select the **Add user** button. 3. Within the modal that appears, provide the email of the new user in the **Email** field. 4. Select a role to assign to the user from the **Role** dropdown. You can change the user's role at a later time. See the table in [Assign or update a user's role](#assign-or-update-a-users-role) for possible roles. 5. Check the **Send invite email to user** box if you want Forge to send an invite link using a third-party email server to the user's email. 6. Select the **Add new user** button. ### Auto provision users Auto-provisioning streamlines onboarding by letting users join your organization automatically through SSO, so admins don't need to send individual invitations. This is Forge's equivalent of just-in-time (JIT) provisioning: an account is created the first time a user with a matching email domain signs in through SSO. If you configure SSO and your SSO provider permits it, a Forge user with a matching email domain can log in to your Forge organization with Single Sign-On (SSO). SSO is available for all Enterprise licenses. > [!NOTE] > > **Enable SSO for authentication** > > Forge recommends that users authenticate using Single Sign-On (SSO). Contact your Forge team to enable SSO for your organization. > > For more information about how to set up SSO with Dedicated Cloud or Self-Managed instances, see [SSO with OIDC](/products/wandb/platform/hosting/iam/sso) or [SSO with LDAP](/products/wandb/platform/hosting/iam/ldap). Forge assigns auto-provisioning users "Member" roles by default. You can change the role of auto-provisioned users at any time. Auto-provisioning users with SSO is on by default for Dedicated Cloud instances and Self-Managed deployments. You can turn off auto provisioning. Turning auto provisioning off lets you selectively add specific users to your Forge organization. The following tabs describe how to turn off SSO based on deployment type: **Multi-tenant Cloud** Auto provisioning with SSO isn't configurable for Multi-tenant Cloud. Contact your Forge team for assistance. **Dedicated Cloud and Self-Managed** For Dedicated Cloud instances, contact your Forge team if you want to turn off auto provisioning with SSO. For Self-Managed deployments, use the W\&B Console to turn off auto provisioning with SSO: 1. Navigate to `https://.io/console/settings/`. Replace `` with your organization name. 2. Select **Security**. 3. Select the **Disable SSO Provisioning** to turn off auto provisioning with SSO. > [!NOTE] > > Auto provisioning with SSO is useful for adding users to an organization at scale because organization admins don't need to generate individual user invitations. ### Domain capture Domain capture lets you automatically add people with a company email address, such as `@example.com`, to Forge. This helps all your employees join the right organization and ensures that new users don't create assets outside your company jurisdiction. > [!NOTE] > > Domain capture is not available on free or trial plans. Domains must be unique; you can't use a domain that's already in use by another organization. **Multi-tenant Cloud** This table summarizes the behavior of new and existing users with and without domain capture enabled: | | With domain capture | Without domain capture | | - | - | - | | New users | Users who sign up for Forge from verified domains are automatically added as members to your organization's default team. They can choose additional teams to join at sign up, if you enable team joining. They can still join other organizations and teams with an invitation. | Users can create Forge accounts without knowing a centralized organization is available. | | Invited users | Invited users automatically join your organization when accepting your invite. Invited users aren't automatically added as members to your organization's default team. They can still join other organizations and teams with an invitation. | Invited users automatically join your organization when accepting your invite. They can still join other organizations and teams with an invitation. | | Existing users | Existing users with verified email addresses from your domains can join your organization's teams within the W\&B App. All data that existing users create before joining your organization remains. Forge doesn't migrate the existing user's data. | Existing Forge users may be spread across multiple organizations and teams. | To automatically assign non-invited new users to a default team when they join your organization: 1. In the upper right corner of the header, open your account menu. 2. Select **Settings**. 3. Within the **Settings** tab, select **General**. 4. Click the **Claim domain** button within **Domain capture**. 5. Select the team that you want new users to automatically join from the **Default team** dropdown. If no teams are available, update team settings. See the instructions in [Add and manage teams](#add-and-manage-teams). 6. Click the **Claim email domain** button. You must enable domain matching within a team's settings before you can automatically assign non-invited new users to that team. 1. In Forge, open the dashboard of the team for which you want to enable domain matching. 2. Click the **Settings** tab. 3. In the **Privacy** section, turn on **Automatically recommend new users with matching email domains join this team upon signup**. **Dedicated Cloud and Self-Managed** Contact your Forge Account Team to configure domain capture. Afterward, when a user creates a Forge account with a company email address, your deployment automatically prompts them to contact your admin to request access. | | With domain capture | Without domain capture | | - | - | - | | New users | Users who sign up for Forge on Multi-tenant Cloud from verified domains are automatically prompted to contact an admin with an email address you customize. They can still create an organization on Multi-tenant Cloud to trial the product. | Users can create W\&B Multi-tenant Cloud accounts without learning that their company has a centralized dedicated instance. | | Existing users | Existing Forge users may be spread across multiple organizations and teams. | Existing Forge users may be spread across multiple organizations and teams. | ### Assign or update a user's role A user's organization role controls what they can do across the organization, such as inviting other users, managing teams, or viewing content. Assign or update roles to give each user the appropriate level of administrative authority. Every member in an organization has an organization role and seat for both Forge and Weave. The type of seat they have determines both their billing status and the actions they can take in each product line. When you invite a user to your organization, you assign them an organization role. You can change any user's role later from the **Org role** dropdown. The **Org role** dropdown includes the following roles: | Role | Descriptions | | - | - | | Admin | An organization admin who can add users to the organization or remove them, change user roles, manage custom roles, add teams and more. Forge recommends ensuring there is more than one admin in the event that your admin is unavailable. | | Member | A regular user of the organization, invited by an organization admin. An organization member cannot invite other users or manage existing users in the organization. | | Viewer (Enterprise-only feature) | A view-only user of your organization, invited by an organization admin. A viewer only has read access to the organization and the underlying teams that they are a member of. | | Billing only (Multi-tenant Cloud) | A billing-focused role for Multi-tenant Cloud organizations. You can assign this role only to the organization's billing user. Billing-only users can manage billing workflows, such as subscriptions, invoices, and payment methods, but they can't invite users, manage teams, or perform non-billing admin actions. Billing-only users are also removed from all organization teams and always have **No access** for both Models and Weave. | Custom roles don't appear in the **Org role** dropdown. An organization admin creates custom roles in organization settings. A team admin uses the **Team role** dropdown to assign them to members of a specific team. Creating or assigning a custom role doesn't change a user's organization role. For more information, see [Add and manage custom roles](#add-and-manage-custom-roles). ### Organization role permissions Organization roles control administrative actions at the organization scope. They're separate from these other sets of roles: * [Team roles](#assign-or-update-a-team-members-role) control what a user can do inside a specific team. * [Registry roles](/products/registry/configure_registry#details-about-registry-roles) control what a user can do in a given registry. * [Models seats and Weave access](#assign-or-update-a-users-access) control product access. The following tables summarize what **Member** and **Admin** users can do at the organization level. For team-scoped actions such as logging runs or editing reports, see [Team roles and permissions](/products/wandb/platform/app/settings-page/teams#team-roles-and-permissions). For registry-scoped actions, see [Registry role permissions](/products/registry/configure_registry#role-permissions). > [!NOTE] > > The **Viewer** organization role and custom team roles are Enterprise-only features. A **Viewer** has read-only access to teams they belong to and can't perform write actions at the organization or team level. Custom team roles inherit from **Viewer** or **Member** and add team-level permissions. #### User management | Permission | Permission group | Member | Admin | | - | - | :-: | :-: | | View the organization user list | Read | X | X | | Invite users to the organization | Admin | | X | | Remove users from the organization | Admin | | X | | Assign or change a user's organization role | Admin | | X | | Assign or change a user's Models seat or Weave access | Admin | | X | | Export the organization user list as CSV | Admin | | X | | View organization activity and usage trends | Read | X | X | When **Enforce team visibility restrictions** is enabled, non-admin members can view profiles only for themselves or for users who share a team with them. Organization admins can view all member profiles. For more information, see [Privacy settings](/products/wandb/platform/hosting/privacy-settings#enforce-privacy-settings-for-all-teams). #### Teams | Permission | Permission group | Member | Admin | | - | - | :-: | :-: | | Create teams in the organization | Admin | | X | | Join teams when invited or through domain capture | Read | X | X | | View team membership for teams the user belongs to | Read | X | X | | View team membership for teams the user doesn't belong to | Read | | X | | Invite users to a team without being a member of that team | Admin | | X | | Add themselves to a team | Admin | | X | > [!NOTE] > > On Self-Managed deployments, instance admins can optionally enable team creation for non-admin users. This option is managed at the instance level, not in organization settings. If you don't know whether your instance has this option enabled, contact your instance admin or Forge support. Organization admins are assigned the **Admin** role in [registries](/products/registry/configure_registry#role-permissions) that are visible at the organization level. #### Organization settings | Permission | Permission group | Member | Admin | | - | - | :-: | :-: | | Change the organization name (Multi-tenant Cloud) | Admin | | X | | Configure domain capture and SSO auto-provisioning | Admin | | X | | Enforce organization-wide [privacy settings](/products/wandb/platform/hosting/privacy-settings#enforce-privacy-settings-for-all-teams) | Admin | | X | | Create, edit, and delete custom roles (Enterprise) | Admin | | X | | Connect external storage buckets at the organization level (Enterprise) | Admin | | X | #### Billing | Permission | Permission group | Member | Admin | | - | - | :-: | :-: | | Assign the billing admin | Admin | | X | | Manage subscriptions, payment methods, and plan upgrades | Billing | | X | | Cancel subscriptions | Billing | | X | | Configure usage alerts | Billing | | X | Billing actions, including configuring usage alerts, depend on the user's **organization role**, not on who is designated the billing admin. A user needs the **Admin** or **Billing only** role to reach the **Billing** and **Usage & Alerts** tabs. A billing admin whose organization role is **Member** does not see them. Unless they are also an organization admin, a billing admin can't perform other organization admin actions such as inviting users or creating teams. On Multi-tenant Cloud, you can optionally assign the billing admin the **Billing only** organization role. This role is restricted to the billing user, removes team membership, and enforces **No access** for both Models and Weave while preserving billing administration capabilities. #### Security and automation | Permission | Permission group | Member | Admin | | - | - | :-: | :-: | | Authenticate to the [SCIM API](/products/wandb/platform/hosting/iam/scim) | Admin | | X | | Create and manage organization-scoped service accounts | Admin | | X | | View and manage all organization API keys | Admin | | X | Organization-scoped service accounts used for SCIM automation have admin-equivalent access for SCIM operations. To change a user's role: 1. In the upper right corner of the header, open your account menu. 2. Select **Users**. 3. Find the user in the list. You can filter by name or email in the search bar. 4. Select a role from the **Org role** dropdown next to the name of the user. ### Assign or update a user's access A user within an organization has a **Models seat** and **Weave access** level. Each is one of **Full**, **Viewer**, or **No access**. These are separate from the organization **Viewer** role, which controls organization-wide permissions. | Seat or access level | Description | | - | - | | Full | Full access to read, write, and export in Models or Weave for that user. | | Viewer | Read-only access to Models or Weave for that user. | | No access | No access to Models or Weave for that user. | Models seat and Weave access are defined at the organization level and inherited by the team. To change them, navigate to the organization user list and use the following steps: 1. For Multi-tenant Cloud users, navigate to your organization's settings at `https://forge.coreweave.com/account-settings/[ORGANIZATION]/settings`. Replace `[ORGANIZATION]` with your organization name. For Dedicated Cloud and Self-Managed deployments, navigate to `https://[YOUR-INSTANCE].wandb.io/org/dashboard`. 2. Select the **Users** tab. 3. From the **MODELS SEAT** and **WEAVE ACCESS** dropdowns for that user, select the levels you want to assign. > [!NOTE] > > The organization role and subscription type determine which seat types are available within your organization. ### Remove a user 1. In the upper right corner of the header, open your account menu. 2. Select **Users**. 3. Provide the name or email of the user in the search bar. 4. Select the **action ()** menu when it appears. 5. From the dropdown, choose **Remove member**. ### Assign the billing admin 1. In the upper right corner of the header, open your account menu. 2. Select **Users**. 3. Provide the name or email of the user in the search bar. 4. Under the **Billing admin** column, choose the user you want to assign as the billing admin. ## Add and manage teams Teams group related users together so they can collaborate on projects and share resources within the organization. The following sections describe how to create teams, invite users to them, and manage team membership and roles. Use your organization's dashboard to create and manage teams within your organization. An organization admin or a team admin can: * Invite users to a team or remove users from a team. * Manage a team member's roles. * Automate the addition of users to a team when they join your organization. * Manage team storage from the team's dashboard in Forge. ### Create a team Create a team from the **Teams** section of the Weights & Biases sidebar. You can't change a team's name or storage settings after you create the team. **Multi-tenant Cloud** 1. In Forge, open the product launcher and select **Weights & Biases**. The Weights & Biases home page opens, with a sidebar that lists your projects and teams. The sidebar appears only on the Weights & Biases home page. If you don't see it, widen your browser window. 2. In the sidebar, under **Teams**, click **Create a team to collaborate**. ![The Teams section of the Weights & Biases home page sidebar, with Create a team to collaborate highlighted](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/create_new_team.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=ba2b465a5e0f9e0cbfbf0c5c4624174e) 3. In the drawer that opens, enter a name for the team in the **Team Name** field. 4. Under **Storage Type**, select **W\&B cloud storage**, or select **External storage** to store the team's data in your own bucket. External storage requires an Enterprise plan. For setup details, see [Bring your own bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector). 5. (Optional) In the **Invite team members** field, enter the email addresses or usernames of the users to invite, separated by commas. 6. Click **Create team**. Forge opens the new team's page. **Dedicated Cloud and Self-Managed** 1. From any page, click the Weights & Biases logo in the upper left corner of the header to open the navigation sidebar. On the home page in a wide browser window, the sidebar is already open. 2. In the sidebar, under **Teams**, click **Create new team**. 3. In the **Create a team** modal, enter a name for the team in the **Team name** field. 4. Under **Storage type**, choose where to store the team's data. 5. Click **Create team**. The modal closes, and the new team appears in the sidebar under **Teams**. Once you have a team, you can add users to that team. ### Invite users to a team Invite users to a team in your organization. Use the team's dashboard to invite users using their email address or Forge username if they already have a Forge account. 1. In Forge, open the team's page. 2. Click the **Users** tab. On some teams, this tab is named **Members**. ![A team page in Forge, with the Users tab highlighted](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/team_settings.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=d5e661891bff07925edaf5ada363a797) 3. Click **Invite new user**. 4. In the **Add a user to a team** panel, enter the user's email address or username in the **Email or username** field, and select the role to assign from the **Select team role** dropdown. For more information about roles a user can have in a team, see [Team roles](#assign-or-update-a-team-members-role). 5. Click **Send invite**. By default, only a team or instance admin can invite members to a team. To change this behavior, see [Team settings](/products/wandb/platform/app/settings-page/teams#privacy). Besides inviting users manually with email invites, you can automatically add new users to a team if the new user's [email matches the domain of your organization](#domain-capture). ### Match members to a team organization during sign up Allow new users within your organization to discover teams within your organization when they sign up. New users must have a verified email domain that matches your organization's verified email domain. Verified new users can view a list of verified teams that belong to an organization when they sign up for a Forge account. An organization admin must enable domain claiming. To enable domain capture, see the steps described in [Domain capture](#domain-capture). ### View team member status > [!NOTE] > > The **Status** column is available on Dedicated Cloud and Self-Managed deployments only. The **Status** column in a team's member list shows whether each member can sign in. Use it to tell an active member apart from one who hasn't accepted their invitation yet or whose account an organization admin deactivated. To view the status of a team's members: 1. Open the team's page. 2. Click the **Users** tab. On some teams, this tab is named **Members**. Each member's status is one of the following: | Status | Definition | | - | - | | Active | The member accepted their invitation and can sign in. | | Invite pending | Forge sent an invitation, but the member hasn't accepted it yet. | | Deactivated | An organization admin deactivated the account. The member can't sign in to the organization or any of its teams. | Deactivated members remain in a team's member list, and any runs they logged to the team remain attributed to them. For a deactivated member, the **Team Role**, **Models Seat**, and **Weave Access** columns also read **Deactivated** instead of a role or seat, and you can't change their role or copy a team invite link. To filter the list by status, enter a status such as **Deactivated** in the search field. To review the status of every user in the organization rather than a single team, see [View organization activity](/products/wandb/platform/hosting/monitoring-usage/org_dashboard#view-user-status-and-activity). From here, an organization admin can deactivate or reactivate a user. To deactivate or reactivate a user with SCIM instead, see [Deactivate user](/products/wandb/platform/hosting/iam/scim#deactivate-user) and [Reactivate user](/products/wandb/platform/hosting/iam/scim#reactivate-user). ### Assign or update a team member's role A team member's role determines what they can do within the team, such as managing other members, contributing content, or viewing data only. Update a team member's role when their responsibilities within the team change. 1. Open the team's page. 2. Click the **Users** tab. On some teams, this tab is named **Members**. 3. In the team member's row, click the dropdown in the **Team Role** column. 4. Select the role to assign. Forge applies the change immediately. You can't change the role of a member whose invitation is still pending, a deactivated member, or a service account. Their **Team Role** column shows **Invited**, **Deactivated**, or **Service** instead of a dropdown. This table lists the roles you can assign to a member of a team: | Role | Definition | | - | - | | Admin | A user who can add and remove other users in the team, change user roles, and configure team settings. | | Member | A regular user of a team, invited by email or their organization-level username by the team admin. A member user can't invite other users to the team. | | View-Only (Enterprise plans on Multi-tenant Cloud; always available on Dedicated Cloud and Self-Managed) | A view-only user of a team, invited by email or their organization-level username by the team admin. A view-only user only has read access to the team and its contents. | | Custom Roles (Enterprise-only feature) | Custom roles let organization admins compose new roles by inheriting from the preceding View-Only or Member roles and adding additional permissions to achieve fine-grained access control. Team admins can then assign any of those custom roles to users in their respective teams. For more information, see the [custom roles announcement](https://forge.coreweave.com/wandb/wandb_fc/announcements/reports/Introducing-Custom-Roles-for-W-B-Teams--Vmlldzo2MTMxMjQ3). | > [!NOTE] > > Service accounts aren't users, but rather non-human identities used for automation. **Service accounts** provide API keys for automated workflows and don't consume user licenses. For more information about creating and managing service accounts, see [Use service accounts to automate workflows](/products/wandb/platform/hosting/iam/service-accounts). ### Remove users from a team Remove a user from a team using the team's dashboard. Forge preserves runs created in a team, even if the member who created the runs is no longer on that team. 1. Open the team's page. 2. Click the **Users** tab. On some teams, this tab is named **Members**. 3. Next to the user you want to remove, click the **action ()** menu. 4. Select **Remove user**. ## Add and manage custom roles Custom roles let you tailor permissions beyond the built-in roles when the standard View-Only, Member, and Admin roles don't match your organization's access requirements. Use custom roles to grant specific permissions while still building on a familiar base role. > [!NOTE] > > Custom roles require an Enterprise plan or license. They are available on Multi-tenant Cloud, Dedicated Cloud, and Self-Managed. Organization admins can compose a new role based on either the **Viewer** or **Member** predefined role and add additional permissions to achieve fine-grained access control. When an organization admin creates a custom role, it becomes available to teams in the organization. It doesn't appear in the **Org role** dropdown or change any user's organization role. A team admin assigns the custom role to individual members from a team's **Team role** dropdown. To create a custom role: **Multi-tenant Cloud** 1. In the upper right corner of the header, open your account menu. 2. Select **Settings**. 3. Click **Roles**. 4. In the **Custom roles** section, click **Create a role**. 5. Provide a name for the role. Optionally provide a description. 6. Choose the role to base the custom role on, either **Viewer** or **Member**. 7. To add permissions, click the **Search permissions** field, then select one or more permissions to add. 8. Review the **Custom role permissions** section, which summarizes the permissions the role has. 9. Click **Create Role**. **Dedicated Cloud and Self-Managed** 1. Navigate to `https://.wandb.io/org/settings/`. Replace `` with your organization name. 2. In the **Custom roles** section, click **Create a role**. 3. Provide a name for the role. Optionally provide a description. 4. Choose the role to base the custom role on, either **Viewer** or **Member**. 5. To add permissions, click the **Search permissions** field, then select one or more permissions to add. 6. Review the **Custom role permissions** section, which summarizes the permissions the role has. 7. Click **Create Role**. A team admin can now [assign the custom role to members of a team](#assign-or-update-a-team-members-role). # Manage access control for projects Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/access-management/restricted-projects Manage project access using visibility scopes and project-level roles Define the scope of a Weights & Biases project to limit who can view, edit, and submit runs to it. This page is for team and organization admins, and project owners, who need to control access to sensitive workflows or limit collaboration to a specific group of users. You can combine two controls to configure the access level for any project within a Weights & Biases team. **Visibility scope** is the higher-level mechanism. Use it to control which groups of users can view or submit runs in a project. For a project with *Team* or *Restricted* visibility scope, you can then use **Project level roles** to control the level of access that each user has within the project. > [!NOTE] > > The owner of a project or a team admin can set or edit a project's visibility. ## Visibility scopes Visibility scope determines which users in your organization can see and contribute to a project. You can choose from four project visibility scopes. From most public to most private, they are: | Scope | Icon | Description | | - | - | - | | Open | | Anyone who knows about the project can view it and submit runs or reports. | | Public | | Anyone who knows about the project can view it. Only your team can submit runs or reports. | | Team | | Only members of the parent team can view the project and submit runs or reports. Anyone outside the team can't access the project. | | Restricted | | Only invited members from the parent team can view the project and submit runs or reports. | > [!NOTE] > > Set a project's scope to **Restricted** if you want to collaborate on workflows related to sensitive or confidential data. When you create a restricted project within a team, you can invite or add specific members from the team to collaborate on relevant experiments, artifacts, and reports. > > Unlike other project scopes, all members of a team don't get implicit access to a restricted project. At the same time, team admins can join restricted projects if needed. ### Set visibility scope on a new or existing project Set a project's visibility scope when you create a project or when you edit it later. The following sections describe both workflows. > [!NOTE] > > * Only the owner of the project or a team admin can set or edit its visibility scope. > * When a team admin enables **Make all future team projects private (public sharing not allowed)** within a team's privacy setting, that turns off **Open** and **Public** project visibility scopes for that team. In this case, your team can only use **Team** and **Restricted** scopes. #### Set visibility scope when you create a project To set the visibility scope for a new project: 1. Navigate to your Weights & Biases organization on a W\&B Multi-tenant Cloud, Dedicated Cloud, or Self-Managed instance. 2. Click the **Create a new project** button in the left-hand sidebar's **My projects** section. Alternatively, navigate to the **Projects** tab of your team and click the **Create new project** button in the upper right-hand corner. 3. After you select the parent team and enter the name of the project, select the desired scope from the **Project visibility** dropdown. Complete the following step if you select **Restricted** visibility. 4. Provide names of one or more Weights & Biases team members in the **Invite team members** field. Add only those members who are essential to collaborate on the project, since other team members don't get implicit access to a restricted project. ![Restricted project configuration](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/restricted_project_2.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=998cd5824f0133b2425e03c5f05a6619) > [!NOTE] > > You can add or remove members in a restricted project later, from its **Project Roles** tab. Weights & Biases creates the project with the selected visibility scope, and only the invited members (for a restricted project) or in-scope users can access it. #### Edit visibility scope of an existing project To change the visibility scope of an existing project: 1. Navigate to your Weights & Biases project. 2. Click **Project** in the left navigation to open the project **Overview** page. The **Project visibility** field on the **Details** tab shows the current scope. 3. In the upper right of the **Overview** page, click **Edit**. The **Edit project** drawer opens. 4. From the **Project visibility** dropdown, select the desired scope, then click **Save**. See [Visibility scopes](#visibility-scopes). > [!NOTE] > > If you select **Restricted** visibility, you must complete the next step. Weights & Biases updates the project's visibility scope, and access reflects the new scope. 5. To share a restricted project: 1. On the project **Overview** page, select the **Project Roles** tab. 2. Click **Add user** and select one or more specific users to invite them to the project. If you can't edit the project, you don't have permission to change its visibility. Ask the project owner or a team admin to change it for you. If you can edit the project but the scope you want is missing from the **Project visibility** dropdown, a setting is limiting the available scopes: * **Open** and **Public** don't appear when a team admin has turned on **Make all future team projects private (public sharing not allowed)** for the team. * **Open** and **Public** don't appear for a project that is currently **Restricted**. Change the project to **Team** first, save, and then edit it again. In a project that belongs to your personal entity rather than a team, the **Team** scope is labeled **Private**: only you can access the project. > [!WARNING] > > * All members of a team lose access to a project if you change its visibility scope from **Team** to **Restricted**, and you must invite team members to give them access. > * All members of a team get access to a project if you change its visibility scope from **Restricted** to **Team**. > * If you remove a team member from the user list for a restricted project, they lose access to that project. ### Other key things to note for restricted scope Keep the following behaviors in mind when working with restricted projects: * If you want to use a team-level service account in a restricted project, you must invite or add it specifically to the project. Otherwise a team-level service account can't access a restricted project by default. * You can't move runs from a restricted project, but you can move runs from a non-restricted project to a restricted one. * You can convert the visibility of a restricted project to only **Team** scope, irrespective of the team privacy setting **Make all future team projects private (public sharing not allowed)**. * If the owner of a restricted project isn't part of the parent team anymore, the team admin must change the owner to maintain access to the project. ## Project level roles After you set a project's visibility scope, you can further refine each user's permissions inside the project by assigning a project level role. For *Team* or *Restricted* scoped projects in your team, you can assign a specific role to a user, which can differ from that user's team level role. For example, if a user has *Member* role at the team level, you can assign the *View-Only*, *Admin*, or any available custom role to that user within a *Team* or *Restricted* scope project in that team. > [!NOTE] > > Project level roles are in preview on W\&B Multi-tenant Cloud, Dedicated Cloud, and Self-Managed instances. ### Assign a project level role to a user To assign a project level role: 1. Navigate to your Weights & Biases project. 2. In the project sidebar, click **Project**. 3. Navigate to the **Project Roles** tab in the project. 4. Click the currently assigned role for the relevant user in the **Project Role** field, which opens a dropdown listing the other available roles. 5. Select another role from the dropdown. The change saves instantly. > [!NOTE] > > When you change the project level role for a user to be different from their team level role, the project level role includes a **\*** to indicate the difference. ### Other key things to note for project level roles Keep the following behaviors in mind when assigning or changing project level roles: * By default, project level roles for all users in a *Team* or *Restricted* scoped project **inherit** their respective team level roles. * You **can't** change the project level role of a user who has *View-Only* role at the team level. * If the project level role for a user within a particular project **is the same as** the team level role, and a team admin later changes the team level role, Weights & Biases automatically changes the relevant project role to track the team level role. * If you change the project level role for a user within a particular project such that **it differs from** the team level role, and a team admin later changes the team level role, the relevant project level role remains as is. * If you remove a user from a *Restricted* project when their project level role differed from the team level role, and you then add the user back to the project later, they inherit the team level role due to the default behavior. If needed, change the project level role again to differ from the team level role. # Advanced IAM configuration Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/advanced_env_vars Configure advanced Weights & Biases IAM settings with environment variables for SSO, session length, OIDC, and LDAP. In addition to basic [environment variables](/products/wandb/platform/hosting/env-vars), you can use environment variables to configure advanced IAM options for your [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) instance. Use these variables to customize SSO behavior, session expiration, OIDC and LDAP integration, and other identity-related settings to match your organization's security and access requirements. Choose any of the following environment variables for your instance depending on your IAM needs. | Environment variable | Description | | - | - | | `DISABLE_SSO_PROVISIONING` | Set this to `true` to turn off user auto-provisioning in your Weights & Biases instance. | | `SESSION_LENGTH` | To change the default user session expiry time, set this variable to the desired number of hours. For example, set `SESSION_LENGTH` to `24` to configure session expiry time to 24 hours. The default value is 720 hours. | | `GORILLA_ENABLE_SSO_GROUPS_CLAIMS` | When you use OIDC-based SSO, set this variable to `true` to automate Weights & Biases team membership in your instance based on your OIDC groups. You must also add a `groups` claim to the user OIDC token, formatted as a string array of all team names the user is part of. | | `GORILLA_LDAP_GROUP_SYNC` | If you use LDAP-based SSO, set it to `true` to automate Weights & Biases team membership in your instance based on your LDAP groups. | | `GORILLA_OIDC_CUSTOM_SCOPES` | If you use OIDC-based SSO, you can specify additional [scopes](https://auth0.com/docs/get-started/apis/scopes/openid-connect-scopes) that the Weights & Biases instance requests from your identity provider. These custom scopes don't change the SSO functionality. | | `GORILLA_OIDC_SECRET` | If you use OIDC-based SSO and your IdP requires an OIDC Client Secret, set this variable to the secret. | | `GORILLA_USE_IDENTIFIER_CLAIMS` | If you use OIDC-based SSO, set this variable to `true` to enforce the username and full name of your users using specific OIDC claims from your identity provider. If set, ensure that you configure the enforced username and full name in the `preferred_username` and `name` OIDC claims respectively. Usernames can only contain alphanumeric characters along with underscores and hyphens as special characters. | | `GORILLA_DISABLE_PERSONAL_ENTITY` | When set to `true`, turns off [personal entities](/support/models/articles/what-is-the-difference-between-team-and-). Prevents creation of new personal projects in their personal entities and prevents writing to existing personal projects. | | `GORILLA_DISABLE_ADMIN_TEAM_ACCESS` | Set this to `true` to restrict Organization or Instance Admins from self-joining or adding themselves to a Weights & Biases team, ensuring that only Data and AI personas have access to the projects within the teams. | | `GORILLA_DISABLE_TEAM_SERVICE_ACCOUNT_CREATION` | Set this to `true` to prevent the creation of new [team-scoped service accounts](/products/wandb/platform/hosting/iam/service-accounts#team-scoped-service-accounts). Available in Dedicated Cloud and Self-Managed v0.83.0+. To prevent members from creating new API keys, see [Disable API key creation](/products/wandb/platform/hosting/iam/api-keys#disable-api-key-creation), which is an organization setting rather than an environment variable. | | `WANDB_IDENTITY_TOKEN_FILE` | For [identity federation](/products/wandb/platform/hosting/iam/identity_federation), the absolute path to the local directory where JSON Web Tokens (JWTs) are stored. | > [!WARNING] > > Weights & Biases advises caution and understanding all implications before you enable some of these settings, such as `GORILLA_DISABLE_ADMIN_TEAM_ACCESS`. Contact your Weights & Biases team with any questions. # Manage API keys Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/api-keys Find, create, and delete Forge API keys, and restrict how members of your organization create and use them. A Forge API key authenticates a person or a service account to Weights & Biases. This page describes the kinds of API keys Weights & Biases issues, where to find and manage them, and the organization settings that restrict how members create and use them. It's intended for organization admins and team admins who govern credentials, and for members who manage their own keys. > [!NOTE] > > In multi-tenant Forge, a Forge API key doesn't grant access to CoreWeave Infrastructure, and a CoreWeave API access token doesn't grant access to Forge. See [Forge and CoreWeave identity](/security/forge-identity-and-access). To store keys safely once you have them, see [Store and handle API keys securely](#store-and-handle-api-keys-securely). ## Types of API keys API keys can be issued to both people and service accounts. | Key type | Belongs to | Access | | - | - | - | | Personal API key | A user | Every organization the user belongs to | | [Team service account](/products/wandb/platform/hosting/iam/service-accounts#team-scoped-service-accounts) key | A service account | One team | | [Organization service account](/products/wandb/platform/hosting/iam/service-accounts#organization-scoped-service-accounts) key | A service account | All teams in the organization | ## Find and manage API keys Organization admins, team admins, and members manage keys from the **API Keys** tab. **Multi-tenant Cloud** 1. Click your profile icon in the upper right, then select your organization. 2. Navigate to `https://forge.coreweave.com/account-settings/[ORGANIZATION]/api-keys`. Replace `[ORGANIZATION]` with your organization name. The **API Keys** tab lists the keys you have permission to see. **Dedicated Cloud and Self-Managed** 1. Navigate to the **Organization Dashboard**: * **Dedicated Cloud**: `https://[ORG-NAME].io/org/dashboard/`. Replace `[ORG-NAME]` with your organization name. * **Self-Managed**: `https://[YOUR-W&B-SERVER-IP]/org/dashboard`. Replace `[YOUR-W&B-SERVER-IP]` with your deployment's IP address. 2. Click the **API Keys** tab. The tab lists the keys you have permission to see. To find only your own personal API keys, click the account selector in the upper-right corner, then click **User settings** and scroll to **API keys**. See [User settings](/products/wandb/platform/app/settings-page/user-settings#api-keys). > [!NOTE] > > In Multi-tenant Cloud, users whose organization role is billing admin can't see the **API Keys** tab. In Dedicated Cloud and Self-Managed, the tab isn't restricted by billing role. ### Key visibility by role The keys listed in the **API Keys** tab depend on your role: | Role | Can see | | - | - | | Member | Their own organization API keys | | Team admin | Their own organization API keys, and keys for service accounts in teams they administer. | | Organization admin | All organization API keys in the organization, including organization service account keys. | | Billing admin | In Multi-tenant Cloud, nothing. The **API Keys** tab is hidden for this role. In Dedicated Cloud and Self-Managed, the same keys as a member. | ### Read the API keys table The table lists each key with the following columns: * **Key name**: The descriptive name given to the key when it was created. * **Key ID**: The first part of the key, used for identification. * **Owner**: The user or service account that owns the key. * **Last used**: When the key most recently authenticated a request. * **Created on**: When the key was created. > [!NOTE] > > For security, the table shows only the key ID. Weights & Biases displays the full secret key once, when you create it. If you no longer have the full secret for a key, [rotate the key](#rotate-an-api-key). To narrow the list, type in the search field to match a key name, key ID, or owner, or click **Filters** to filter by attributes such as key type. ### Create an API key 1. Go to the **API Keys** tab. 2. Click **New key**. 3. Give the key a descriptive name. 4. Click **Create**. 5. Copy the key immediately and store it securely. Forge API keys retain the `wandb_v1_` prefix. Copy and use the entire key, including this prefix. > [!WARNING] > > W\&B shows the full API key only once, when you create it. After you close the dialog, you cannot view the full API key again. Your settings display only the key ID (the first part of the key). If you lose the full API key, you must create a new one. In Multi-tenant Cloud, keys you create from this tab belong to the organization you're viewing. Create a separate key for each organization you work in. ### Rename an API key Rename a key to record what uses it, which makes an unfamiliar key easier to trace later. Renaming doesn't change the key's secret and doesn't interrupt anything that uses it. 1. Find the key in the table. 2. Click the actions menu at the end of the key's row, then click **Edit**. 3. Enter a new name, then save. ### Delete API keys Delete a key when you no longer need it, or immediately if it may have been exposed. To delete a single key, find it in the table, click the actions menu at the end of its row, then click **Delete** and confirm. To delete several keys at once: 1. Select the checkbox next to each key you want to delete. 2. Click **Delete**. The button shows the number of keys you selected. 3. Confirm the deletion. > [!WARNING] > > Deleting a key immediately revokes access for any script or service that uses it. Update your systems to use a replacement key before you delete the old one. ### Rotate an API key Rotate a key on a schedule that matches your security policy, and immediately if a key may have been exposed. Rotate a key rather than delete it when the workloads that use it must keep running. Weights & Biases has no single rotate action. Because a key's full secret is shown only at creation, you rotate a key by replacing it: 1. Create a new API key. Give it a name that distinguishes it from the key you're replacing. 2. Update every script, job, and stored secret that uses the old key. For storage options, see [Store and handle API keys securely](#store-and-handle-api-keys-securely). 3. Confirm that your workloads authenticate with the new key. 4. Delete the old key. Until you complete the last step, both keys work. This overlap is what lets you rotate without downtime, so keep it short. > [!WARNING] > > If a key was exposed publicly, delete it immediately rather than waiting to update your systems. An exposed key stays valid until you delete it. ## Restrict how members use API keys Organization admins can restrict key creation and use from the organization settings in the W\&B App. These restrictions limit which keys can reach your organization's resources and who can create new ones. The following sections describe the available restrictions, which differ by deployment type. ### Enforce organization-scoped API keys Available in **Multi-tenant Cloud** for Enterprise organizations. Weights & Biases enables this setting per organization. If you don't see it, contact your Weights & Biases account team. When enforced, only organization API keys and keys that belong to service accounts in the organization can reach the organization's resources. A personal API key that a member uses across several organizations no longer works against this organization, which prevents a key leaked from elsewhere from reaching your data. > [!WARNING] > > Personal API keys lose read and write access to the organization as soon as you enforce this setting, and any integration that uses a personal key stops working. Notify your users before you enforce it. To enforce organization-scoped API keys, complete the following steps: 1. Sign in as an organization admin. 2. Open your organization settings, then select **Authentication** in the left navigation. 3. Next to **Enforce organization-scoped API keys**, click **Enforce**. 4. Type your organization name to confirm, then click **Enforce Organization-Scoped API Keys**. Weights & Biases then shows an **Enforced** label next to the setting. To stop enforcing it, return to **Authentication** and click **Disable**. ### Disable API key creation Available in **Dedicated Cloud** and **Self-Managed** v0.84.0 and above. When enabled, users and team service accounts can't create new API keys. Organization service accounts can still create keys, and existing keys keep working, so turning this on doesn't interrupt running jobs. Use it when your organization issues keys through a controlled process and you want to prevent members from creating their own. To disable API key creation, complete the following steps: 1. Sign in as an organization admin. 2. Open your organization dashboard, then select **Privacy** in the left navigation. 3. In the **Access Control** section, turn on **Disable API key creation**. Weights & Biases saves the change immediately. For the other settings on this tab, see [Configure privacy settings](/products/wandb/platform/hosting/privacy-settings#enforce-privacy-settings-for-all-teams). While the setting is on, the **API Keys** tab disables the **New key** button and shows the following message: ```text theme={"system"} API key creation has been disabled by your organization administrator. You can still edit, delete, and use existing API keys. ``` To restrict service account creation as well, see [`GORILLA_DISABLE_TEAM_SERVICE_ACCOUNT_CREATION`](/products/wandb/platform/hosting/iam/advanced_env_vars), which prevents the creation of new team-scoped service accounts in Dedicated Cloud and Self-Managed v0.83.0 and above. ## Availability API key capabilities differ by deployment type and, in Multi-tenant Cloud, by subscription. The following table summarizes where each capability is available. | Capability | Multi-tenant Cloud | Dedicated Cloud | Self-Managed | | - | - | - | - | | Search and filter the API keys table | Yes | v0.84.0+ | v0.84.0+ | | Create a key from the **API Keys** tab | Enterprise organizations | v0.84.0+ | v0.84.0+ | | Delete several keys at once | Enterprise organizations | v0.84.0+ | v0.84.0+ | | Disable API key creation | Not available | v0.84.0+ | v0.84.0+ | ## Store and handle API keys securely API keys provide access to your W\&B account and should be protected like passwords. The following sections describe recommended storage methods, practices to avoid, how to pass keys to your code, and SDK version requirements for newer keys. ### Recommended storage methods Use one of the following methods to store your API key securely. * **Secrets manager**: Use a dedicated secrets management system such as [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/), [HashiCorp Vault](https://developer.hashicorp.com/vault), [Azure Key Vault](https://azure.microsoft.com/en-us/products/key-vault), or [Google Secret Manager](https://cloud.google.com/security/products/secret-manager). * **Password manager**: Use a reputable password manager application. * **OS-level keychains**: Store keys in macOS Keychain, Windows Credential Manager, or Linux secret service. Not suggested for production. ### What to avoid Avoid the following practices, which can expose your API key: * Never commit API keys to version control systems such as Git. * Don't store API keys in plain text configuration files. * Don't pass API keys on the command line, because they're visible in the output of OS commands like `ps`. * Avoid sharing API keys through email, chat, or other unencrypted channels. * Don't hard-code API keys in your source code. If an API key is exposed, delete the API key from your W\&B account immediately and contact [support](mailto:forge-support@coreweave.com) or your AISE. ### Environment variables When you use API keys in your code, pass them through environment variables: ```bash theme={"system"} export WANDB_API_KEY="[YOUR-API-KEY]" ``` This approach keeps keys out of your source code and makes it easier to rotate them when needed. > [!WARNING] > > Avoid setting the environment variable in line with the command, because it's visible in the output of OS commands like `ps`: > > ```bash theme={"system"} > # Avoid this pattern, which can expose the API key in process managers > export WANDB_API_KEY="[YOUR-API-KEY]" ./my-script.sh > ``` ### SDK version compatibility If you use a newer API key, confirm that your SDK version supports it. Newer API keys are longer than legacy keys. When you authenticate with older versions of the `wandb` or `weave` SDKs, you may encounter an API key length error. **Solution**: Update to a newer SDK version: * `wandb` SDK v0.22.3+ ```bash theme={"system"} pip install --upgrade wandb==0.22.3 ``` * `weave` SDK v0.52.17+ ```bash theme={"system"} pip install --upgrade weave==0.52.17 ``` If you can't upgrade the SDK immediately, set the API key using the `WANDB_API_KEY` environment variable as a workaround. # Automate user and team management Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/automate_iam Automate your deployment's user and team management at scale using the SCIM API and the Python SDK API. This page describes how to automate user and team management at scale using the [SCIM API](/products/wandb/platform/hosting/iam/scim) and the [Python SDK API](/products/wandb/ref/python/public-api). ## SCIM API Use the W\&B SCIM API to manage your organization's users and teams at scale through an identity provider (IdP) like Okta or Microsoft Entra. For more information, see [Authentication](/products/wandb/platform/hosting/iam/scim#authentication) on the SCIM reference page. > [!TIP] > > Weights & Biases's implementation includes endpoints for creating and managing custom roles and for assigning built-in and custom roles. Role endpoints aren't part of the official SCIM schema. Weights & Biases adds role endpoints to support automated management of custom roles. The following sections describe each category of the SCIM API. ### User SCIM API The [User SCIM API](/products/wandb/platform/hosting/iam/scim#user-resource) lets you create, deactivate, fetch, and list users in an organization, and assign predefined or custom roles. For complete request and response examples, see the [SCIM reference](/products/wandb/platform/hosting/iam/scim#user-management). > [!NOTE] > > To deactivate a user, send `PATCH /scim/Users/{id}` with `{"active": false}`. The hosting option determines the outcome: Dedicated Cloud and Self-Managed deployments retain the user record, while Multi-tenant Cloud removes the user from the organization. Reactivation isn't available in Multi-tenant Cloud. Re-add the user instead. See [Deactivate user](/products/wandb/platform/hosting/iam/scim#deactivate-user) and [Reactivate user](/products/wandb/platform/hosting/iam/scim#reactivate-user). ### Group SCIM API The [Group SCIM API](/products/wandb/platform/hosting/iam/scim#group-resource) lets you manage Weights & Biases teams, including creating or removing teams in an organization. To add or remove users in an existing team, use `PATCH Group`. > [!NOTE] > > Weights & Biases has no notion of a "group of users having the same role." A Weights & Biases team closely resembles a group and lets users with different roles work collaboratively on a set of related projects. Teams can consist of different groups of users. Assign each user in a team a role: team admin, member, viewer, or a custom role. > > Weights & Biases maps Group SCIM API endpoints to Weights & Biases teams because of the similarity between groups and Weights & Biases teams. ### Custom role SCIM API The [Custom Role SCIM API](/products/wandb/platform/hosting/iam/scim#role-resource) lets you manage custom roles, including creating, listing, or updating custom roles in an organization. > [!WARNING] > > Delete a custom role with caution. > > To delete a custom role within an organization, use the `DELETE Role` endpoint. Weights & Biases assigns the inherited predefined role to all users who had the custom role before deletion. > > To update the inherited role for a custom role, use the `PUT Role` endpoint. This operation doesn't affect any existing non-inherited custom permissions in the custom role. ## W\&B Python SDK API Use the [W\&B Python SDK API](/products/wandb/ref/python/public-api/api) to manage organization users, teams, and team membership through the following classes: * [`User`](/products/wandb/ref/python/public-api/user) * [`Team`](/products/wandb/ref/python/public-api/team) * [`Member`](/products/wandb/ref/python/public-api/member) # Use federated identities with SDK Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/identity_federation Use identity federation with JSON Web Tokens (JWTs) to authenticate with the W&B SDK and CLI without API keys. Use identity federation to sign in to the W\&B SDK and CLI with your organizational credentials, instead of using a long-lived API key. If your organization admin has configured SSO for your organization, you already use those credentials to sign in to Forge. Identity federation is like SSO for the W\&B SDK, but uses JSON Web Tokens (JWTs) directly. Use identity federation as an alternative to API keys. This page is for organization admins who configure the JWT issuer for an organization. It's also for users or service accounts that authenticate to Weights & Biases using JWTs. [RFC 7523](https://datatracker.ietf.org/doc/html/rfc7523) forms the underlying basis for identity federation with SDK. > [!NOTE] > > Identity federation is available in preview for Multi-tenant Cloud, Dedicated Cloud, and Self-Managed. An [Enterprise license](/products/wandb/platform/hosting/enterprise-licenses) is required. For details or assistance, contact your AISE or [support](mailto:forge-support@coreweave.com). > [!NOTE] > > This document uses the terms "identity provider" and "JWT issuer" interchangeably. Both refer to the same thing in the context of this capability. ## Set up the JWT issuer Before users can authenticate with JWTs, an organization admin must set up a federation between your organization and a publicly accessible JWT issuer. 1. Navigate to the **Settings** tab in your organization dashboard. 2. In the **Authentication** option, click **Set up JWT Issuer**. 3. Add the JWT issuer URL in the text box and click **Create**. Weights & Biases automatically looks for an OIDC discovery document at the path `${ISSUER_URL}/.well-known/openid-configuration`. From the discovery document, Weights & Biases locates the JSON Web Key Set (JWKS) at the relevant URL. Weights & Biases uses the JWKS for real-time validation of the JWTs to ensure that the relevant identity provider issued them. After this step, your organization is federated with the JWT issuer. Users in your organization can then authenticate to Weights & Biases using JWTs issued by that provider. ## Use the JWT to access Weights & Biases After an organization admin sets up a JWT issuer, users can start accessing Weights & Biases projects using JWTs issued by that identity provider. The mechanism for using JWTs is as follows: 1. You must sign in to the identity provider using one of the mechanisms available in your organization. You can access some providers in an automated manner using an API or SDK, while others are only accessible through a relevant UI. Contact your organization admin or the owner of the JWT issuer for details. 2. After you've retrieved the JWT by signing in to your identity provider, store it in a file at a secure location. Configure the absolute file path in an environment variable `WANDB_IDENTITY_TOKEN_FILE`. 3. Access your Weights & Biases project using the W\&B SDK or CLI. The SDK or CLI automatically detects the JWT and exchanges it for a Weights & Biases access token after validating the JWT. The Weights & Biases access token grants access to the relevant APIs for enabling your AI workflows, such as logging runs, metrics, and artifacts. By default, the access token is stored at the path `~/.config/wandb/credentials.json`. You can change that path by specifying the environment variable `WANDB_CREDENTIALS_FILE`. > [!NOTE] > > JWTs are short-lived credentials that address the shortcomings of long-lived credentials such as API keys and passwords. The JWT expiry time depends on your identity provider's configuration. Refresh the JWT before it expires, and ensure that it's stored in the file referenced by the environment variable `WANDB_IDENTITY_TOKEN_FILE`. > > The Weights & Biases access token also has a default expiry duration, after which the SDK or CLI tries to refresh it using your JWT. If the user JWT has also expired by that time and isn't refreshed, authentication fails. If possible, implement the JWT retrieval and post-expiry refresh mechanism as part of the AI workload that uses the W\&B SDK or CLI. ### JWT validation To ensure that only valid tokens grant access, the JWT undergoes the following validations. These validations run when the SDK or CLI exchanges the JWT for a Weights & Biases access token and then accesses a project: * Weights & Biases verifies the JWT signature using the JWKS at the organization level. This is the first line of defense, and if this fails, that means there's a problem with your JWKS or how your JWT is signed. * The `iss` claim in the JWT must equal the issuer URL configured at the organization level. * The `sub` claim in the JWT must equal the user's email address as configured in the organization. * The `aud` claim in the JWT must equal the name of the organization that houses the project you're accessing as part of your AI workflow. On [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) instances: * To skip audience validation, you can set the environment variable `FEDERATED_AUTH_AUDIENCES` to `wandb`. * Some organizations have specific requirements for the audience. To customize the `aud` value, set the environment variable `FEDERATED_AUTH_AUDIENCES` to a string with a comma-separated list of audience values. * Weights & Biases checks the `exp` claim in the JWT to determine whether the token is valid or has expired and needs to be refreshed. ## External service accounts Weights & Biases has long supported built-in service accounts with long-lived API keys. With identity federation for the SDK and CLI, you can also bring external service accounts that use JWTs for authentication. The organization's configured issuer must issue those JWTs. A team admin can configure external service accounts within the scope of a team, like the built-in service accounts. To configure an external service account, a team admin must: 1. Navigate to the **Service Accounts** tab for your team. 2. Click **New service account**. 3. Provide a name for the service account. 4. Select **Federated Identity** as the **Authentication Method**, then provide a **Subject**. See [Determine the Subject value for your identity provider](#determine-the-subject-value-for-your-identity-provider). 5. Click **Create**. After this step, the external service account is registered with the team and can use JWTs issued by the configured identity provider to access Weights & Biases. The `sub` claim in the external service account's JWT must equal the subject configured by the team admin in the team-level **Service Accounts** tab. Weights & Biases verifies that claim as part of [JWT validation](#jwt-validation). The `aud` claim requirement is similar to that for human user JWTs. When [using an external service account's JWT to access Weights & Biases](#use-the-jwt-to-access-wb), it's often easier to automate the workflow. Automation generates the initial JWT and refreshes it as needed. To attribute runs logged using an external service account to a human user, configure the environment variables `WANDB_USERNAME` or `WANDB_USER_EMAIL` for your AI workflow, similar to built-in service accounts. > [!NOTE] > > Weights & Biases recommends using a mix of built-in and external service accounts across your AI workloads with different levels of data sensitivity. This mix strikes a balance between flexibility and simplicity. ### Determine the Subject value for your identity provider The value you enter for **Subject** must exactly match the `sub` (subject) claim in JWTs issued by your IdP for the service account. Weights & Biases applies the same comparison for every identity provider. The match is exact, case-sensitive, and whitespace-sensitive, so even a trailing space or a difference in capitalization causes authentication to fail. The W\&B App accepts any non-empty **Subject** without validating its value, since the value is entirely dependent on the IdP. Weights & Biases can't detect an incorrect value when you create the service account. Instead, authentication fails later, when the service account presents its JWT. The most reliable way to determine the correct value is to read it from a real token. Obtain a sample JWT issued for the service account, base64url-decode its payload (the middle segment, between the two dots) locally, and copy the `sub` value verbatim into the **Subject** field. Don't paste JWTs into third-party online decoders, because a JWT is a credential. The value differs by provider. The following are typical, but always confirm them against an actual token: | Identity provider | Where to find the `sub` value | | - | - | | Microsoft Entra ID | The service principal's **Object ID**, found under **Enterprise Applications** in the [Microsoft Entra admin center](https://entra.microsoft.com). Use the **Enterprise Application** (service principal) Object ID, not the **App registration** Object ID. For app-only (client credentials) tokens, this is typically the value Entra ID places in `sub`. | | Google Cloud (GCP) | The `sub` value from the ID token that Google issues for the service account. | # Configure SSO with LDAP Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/ldap Configure LDAP-based SSO authentication for W&B Server including connection parameters and environment variables. This guide is for organization admins who enable LDAP-based single sign-on (SSO) for W\&B Server, so that users can authenticate against an existing LDAP directory instead of managing separate Forge credentials. It explains how to configure the LDAP connection from the W\&B App system settings UI or with environment variables. It also describes the required and optional configuration parameters, including the address, base distinguished name, and attributes. You can set up either an anonymous bind, or bind with an administrator DN and password. > [!NOTE] > > Only organization admin roles can enable and configure LDAP authentication. ## Configure LDAP connection Choose one of the following methods to configure the LDAP connection. Use the W\&B App tab to configure LDAP through the system settings UI, or use the Environment variable tab to configure LDAP at deployment time. **W\&B App** To configure LDAP through the W\&B App: 1. Go to the W\&B App. 2. Select your profile icon, then select **System Settings**. 3. Toggle **Configure LDAP Client**. 4. Add the details in the form. For more information about each input, see [Configuration parameters](#configuration-parameters). 5. Click **Update Settings** to test your settings. This step establishes a test client or connection with W\&B Server. 6. If your connection is verified, toggle **Enable LDAP Authentication** and select **Update Settings**. After you complete these steps, W\&B Server authenticates users against your LDAP directory. **Environment variable** Set an LDAP connection with the following environment variables: | Environment variable | Required | Example | | - | - | - | | `LOCAL_LDAP_ADDRESS` | Yes | `ldaps://ldap.example.com:636` | | `LOCAL_LDAP_BASE_DN` | Yes | `email=mail,group=gidNumber` | | `LOCAL_LDAP_BIND_DN` | No | `cn=admin`, `dc=example,dc=org` | | `LOCAL_LDAP_BIND_PW` | No | | | `LOCAL_LDAP_ATTRIBUTES` | Yes | `email=mail`, `group=gidNumber` | | `LOCAL_LDAP_TLS_ENABLE` | No | | | `LOCAL_LDAP_GROUP_ALLOW_LIST` | No | | | `LOCAL_LDAP_LOGIN` | No | | The following Configuration parameters section defines each environment variable. For clarity, the definition names omit the environment variable prefix `LOCAL_LDAP`. ## Configuration parameters The following table lists and describes required and optional LDAP configurations. | Environment variable | Definition | Required | | - | - | - | | `ADDRESS` | The address of your LDAP server within the VPC that hosts W\&B Server. | Yes | | `BASE_DN` | The root path that searches start from, required for any queries into this directory. | Yes | | `BIND_DN` | Path of the administrative user registered in the LDAP server. Required if the LDAP server doesn't support unauthenticated binding. If specified, W\&B Server connects to the LDAP server as this user. Otherwise, W\&B Server connects with anonymous binding. | No | | `BIND_PW` | The password for the administrative user, used to authenticate the binding. If left blank, W\&B Server connects with anonymous binding. | No | | `ATTRIBUTES` | Provide email and group ID attribute names as comma-separated string values. | Yes | | `TLS_ENABLE` | Enable TLS. | No | | `GROUP_ALLOW_LIST` | Group allowlist. | No | | `LOGIN` | Instructs W\&B Server to use LDAP to authenticate. Set to either `True` or `False`. Optionally set this to `False` to test the LDAP configuration. Set this to `True` to start LDAP authentication. | No | # Identity and access management (IAM) Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/org_team_struct Learn how IAM scopes (organizations, teams, and projects) map to your company. Identity and access management has three scopes: [Organizations](#organization), [Teams](#team), and [Projects](#project). Understanding how these scopes nest helps you plan how to structure access, group users, and organize AI work across your company. The following sections describe each scope and how it maps to your company's structure, and link to detailed management guides. > [!NOTE] > > In multi-tenant Forge, identity, roles, and access scopes are separate from CoreWeave IAM. See [Forge and CoreWeave identity](/security/forge-identity-and-access) to determine where to manage each type of access. ## Organization An *Organization* is the root scope in your account or instance. All actions in your account or instance take place within the context of that root scope, including managing users, managing teams, managing projects within teams, and tracking usage. If you use [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), you may have more than one organization where each may correspond to a business unit, a personal user, or a joint partnership with another business. If you use [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or a [Self-Managed instance](/products/wandb/platform/hosting/hosting-options/self-managed), it corresponds to one organization. Your company may have more than one Dedicated Cloud or Self-Managed instance to map to different business units or departments, though that's strictly an optional way to manage AI practitioners across your businesses or departments. For more information, see [Manage organizations](/products/wandb/platform/hosting/iam/access-management/manage-organization). ## Team A *Team* is a subscope within an organization that may map to a business unit, function, department, or project team in your company. You may have more than one team in your organization depending on your deployment type and pricing plan. AI projects are organized within the context of a team. Team admins govern access control within a team, and they may or may not be admins at the parent organization level. For more information, see [Add and manage teams](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-teams). ## Project A *Project* is a subscope within a team that maps to an AI project with specific intended outcomes. You may have more than one project within a team. Each project has a visibility mode that determines who can access it. Within each project, your team's work is organized into the following building blocks. Every project comprises [Workspaces](/products/wandb/track/workspaces) and [Reports](/products/wandb/reports), and links to relevant [Artifacts](/products/wandb/artifacts), [Sweeps](/products/wandb/sweeps), and [Automations](/products/wandb/automations). # Manage users, groups, and roles with SCIM Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/scim Use the SCIM API to automate provisioning of users, groups, and custom roles in an organization. > [!NOTE] > > Watch a [video demonstrating SCIM in action](https://www.youtube.com/watch?v=Nw3QBqV0I-o) (12 min) ## Overview This page describes how instance and organization admins use the System for Cross-domain Identity Management (SCIM) API to automate identity management in Weights & Biases. With the SCIM API, you can provision and deprovision users, manage team membership, and define custom roles programmatically through an identity provider or CI/CD pipeline instead of clicking through the W\&B App. SCIM groups map to Weights & Biases Teams. > [!NOTE] > > In multi-tenant Forge, SCIM provisioning is separate from CoreWeave Automated User Provisioning. Provision and deprovision users in each system separately. See [Forge and CoreWeave identity](/security/forge-identity-and-access). Weights & Biases's SCIM API is compatible with identity providers such as Okta and Microsoft Entra. For SSO configuration with Okta, Microsoft Entra, and other identity providers, see the [SSO documentation](/products/wandb/platform/hosting/iam/sso). For practical Python examples that demonstrate how to interact with the SCIM API, visit the [`wandb-scim`](https://github.com/wandb/examples/tree/master/wandb-scim) repository. ### Supported features The SCIM API supports the following features: * **Filtering**: The API supports filtering for `/Users` and `/Groups` endpoints. * **PATCH operations**: Supports `PATCH` for partial resource updates. * **ETag support**: Conditional updates using ETags for conflict detection. * **Service account authentication**: Organization service accounts can access the API. * **Service account lifecycle**: Provision and deprovision [team-scoped and organization-scoped service accounts](/products/wandb/platform/hosting/iam/service-accounts). Supported on **Multi-tenant Cloud** and on **Dedicated Cloud** and **Self-Managed** v0.81.0+. > [!NOTE] > > If you're an admin of multiple Enterprise [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) organizations, configure the organization that receives SCIM API requests so that requests made with your API key affect the correct organization. Click the account selector in the upper-right corner, click **User settings**, then check the **Default API organization** setting. > > The chosen hosting option determines the value for the `[HOST-URL]` placeholder used in the examples on this page. > > Examples use user IDs such as `abc` and `def`. Real requests and responses use hashed values for user IDs. ## Authentication Every SCIM request must be authenticated as an admin principal. Organization admins can authenticate with a **Bearer token** or **HTTP Basic** credentials. Either style uses the *same API key string* where a key applies. Choose a user identity or an organization-scoped service account after reviewing the key differences in the following section. ### Key differences The following list compares user credentials and service account credentials for SCIM authentication: * Who should use it: Users are best for interactive, one-off admin actions. Service accounts are best for automation and integrations (CI/CD, provisioning tools). * Credentials: Users send username and API key for Basic auth. Service accounts send only an API key (no username) for Basic auth. For Bearer auth, send only the API key in the header (no username). * Bearer versus Basic: Bearer uses `Authorization: Bearer [API-KEY]` with the key verbatim. Basic uses `Authorization: Basic ` (users encode `username:API-KEY`, and service accounts encode `:API-KEY` with a leading colon and empty username). * Scope and permissions: Use an API key from an instance or organization admin user, or from an [organization-scoped service account](/products/wandb/platform/hosting/iam/service-accounts#organization-scoped-service-accounts). Keys from [team-scoped service accounts](/products/wandb/platform/hosting/iam/service-accounts#team-scoped-service-accounts) can't authenticate to the SCIM API. Service accounts that use SCIM are organization-scoped and headless, which supports clearer audit trails for automation. * Where to get credentials: Users copy their API key from **User settings**. Organization-scoped service account keys are in the organization dashboard under the **Service account** tab. * Multi-tenant Cloud: If you have access to more than one Multi-tenant Cloud organization, you must set the Default API organization to ensure that SCIM API calls are routed to the intended organization. ### Bearer token Send the API key as a Bearer token: ```bash theme={"system"} Authorization: Bearer [API-KEY] ``` The `[API-KEY]` value is the same string you'd use as the password in HTTP Basic authentication for that principal. Don't Base64-encode the key for Bearer requests. > [!NOTE] > > Bearer authentication for the SCIM API is available in W\&B Multi-tenant Cloud, and in Dedicated Cloud and Self-Managed v0.79.0 and later. The following examples use `[API-KEY]` as a placeholder. Replace it with a real key from an admin user or an organization-scoped service account. **List users** ```bash theme={"system"} curl -s -S \ -H "Authorization: Bearer [API-KEY]" \ -H "Content-Type: application/scim+json" \ "[HOST-URL]/scim/Users" ``` **Create a user** ```bash theme={"system"} curl -s -S -X POST \ -H "Authorization: Bearer [API-KEY]" \ -H "Content-Type: application/scim+json" \ "[HOST-URL]/scim/Users" \ -d '{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "userName": "dev-user2", "emails": [{"primary": true, "value": "dev-user2@example.com"}] }' ``` For more information, see [Create user](#create-user). ### Users Use your personal admin credentials when you perform interactive admin tasks. Construct the HTTP `Authorization` header as `Basic `. For example, authorize as `demo:p@55w0rd`: ```bash theme={"system"} Authorization: Basic ZGVtbzpwQDU1dzByZA== ``` ### Service accounts Use an organization-scoped service account for automation or integrations. Construct the HTTP `Authorization` header as `Basic ` (note the leading colon and empty username). Find service account API keys in the organization dashboard under the **Service account** tab. Refer to [Organization-scoped service accounts](/products/wandb/platform/hosting/iam/service-accounts#organization-scoped-service-accounts). For example, authorize with API key `sa-p@55w0rd`: ```bash theme={"system"} Authorization: Basic OnNhLXBANTV3MHJk ``` ## Microsoft Entra ID configuration Use this section when you configure automatic user and group provisioning from Microsoft Entra ID to Weights & Biases through the SCIM API. For Entra SSO setup, see [Configure SSO with Entra](/products/wandb/platform/hosting/iam/sso). ### Tenant URL In your Entra enterprise application's provisioning settings, set **Tenant URL** to your W\&B SCIM base URL with the Entra feature flag query parameter `aadOptscim062020` appended: ```text theme={"system"} [HOST-URL]/scim?aadOptscim062020 ``` For example, if your instance is at `https://wandb.example.com`, set the tenant URL to `https://wandb.example.com/scim?aadOptscim062020`. The `aadOptscim062020` parameter enables Entra-specific handling in the W\&B SCIM API. Without it, Entra can send user deactivation requests with string boolean values (`"False"` or `"True"`) instead of JSON booleans (`false` or `true`), which can cause deactivation to fail. Set **Secret Token** to the API key from an organization admin user or an organization-scoped service account. See [Authentication](#authentication). > [!NOTE] > > When you append `aadOptscim062020` to the tenant URL, user deactivation from Entra's **Provision on demand** UI in the Microsoft Entra admin center might not work because that UI still sends string boolean values. To test deactivation manually, send a SCIM `PATCH` request using the `PatchOp` `Operations` format that replaces `active` with `false` (see [Deactivate user](#deactivate-user)). ### Team names Name Entra groups that map to Weights & Biases teams using lowercase letters and hyphens, for example `ml-platform` or `data-science`. Avoid spaces, underscores, and other special characters in group display names that you sync to Weights & Biases. ### User attribute mappings Configure the following attribute mappings in Entra for SCIM user provisioning: | Weights & Biases custom app attribute | Source attribute (Entra) | Apply this mapping | Match objects using this attribute | | - | - | - | - | | `emails[type eq "work"].value` | `mail` | Always | Yes | | `active` | `Not([IsSoftDeleted])` | Always | | | `displayName` | `displayName` | Always | | | `userName` | `displayName` | Only on object creation | | > [!NOTE] > > On **Multi-tenant Cloud**, a user's account isn't managed by the organization. Weights & Biases doesn't support updating `displayName` through SCIM on Multi-tenant Cloud. See [Update user display name](#update-user-display-name). ### Group attribute mappings Configure the following attribute mappings in Entra for SCIM group (team) provisioning: | Weights & Biases custom app attribute | Source attribute (Entra) | Apply this mapping | Match objects using this attribute | | - | - | - | - | | `displayName` | `displayName` | Only on object creation | Yes | | `members` | `members` | Always | | ## User management The SCIM user resource maps to Weights & Biases users and service accounts. Use the endpoints in this section to provision, update, and remove users and service accounts in your organization, for example, when you onboard new employees, rotate service credentials, or remove access for departing users. For service account concepts and UI workflows, see [Use service accounts to automate workflows](/products/wandb/platform/hosting/iam/service-accounts). > [!NOTE] > > **Breaking change for integrations that parse SCIM User JSON** > > * In Dedicated Cloud and Self-Managed v0.80.1+, and in Multi-tenant Cloud deployments after April 30, 2026, responses from `/scim/Users` (including `GET` user, `GET` users, and `PATCH` responses that return a User) serialize `emails` as a JSON array of objects using lowercase field names (`value`, `primary`, and optional `type` or `display`), matching SCIM 2.0. > * Deployments on older releases return `emails` as a single JSON object with PascalCase keys (`Value`, `Primary`, and similar). > > If your code reads `emails` from SCIM *responses*, treat `emails` as an array and read the primary entry (or the first element). > > Request bodies for creating or updating users already used the array form and are unchanged. The `list-users` filter `emails.value eq "..."` is also unchanged. ### Get user Retrieves information for a specific user or service account in your organization by user ID, or for a user by email address. Service account responses include `accountType` (`SERVICE` for team-scoped service accounts, `ORG_SERVICE` for organization-scoped service accounts). Service accounts don't include `emails`. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `GET` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | #### Example **Get User Request** ```bash theme={"system"} GET /scim/Users/abc ``` **Get User Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "daysActive": 42, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "lastActiveAt": "2023-10-15T14:32:10Z", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1" } ``` The response includes details about the user's activity in the organization: * **`daysActive`**: Total number of days the user has been active in the organization. * **`lastActiveAt`**: ISO 8601 timestamp of the user's most recent activity. Returns `null` if the user hasn't been active. The definition of "active" differs by deployment type: * **Dedicated Cloud / Self-Managed**: A user is active if they sign in, open any page in the W\&B App, log runs, use the SDK, or interact with the Weights & Biases server in any way. * **Multi-tenant Cloud**: A user is active if they perform any auditable action scoped to the organization after May 8, 2025. See [Audit logging actions](/products/wandb/platform/hosting/monitoring-usage/audit-logging#actions) for the full list. ### List users Retrieves a list of all users and service accounts in your organization. Each resource includes `accountType` (`USER`, `SERVICE`, or `ORG_SERVICE`). #### Filter users The `/Users` endpoint supports filtering users by username or email: * `userName eq "value"`: Filter by username. * `emails.value eq "value"`: Filter by email address. ##### Example ```bash theme={"system"} GET /scim/Users?filter=userName eq "john.doe" GET /scim/Users?filter=emails.value eq "john@example.com" ``` #### Endpoint * **URL**: `[HOST-URL]/scim/Users` * **Method**: `GET` #### Example **List Users Request** ```bash theme={"system"} GET /scim/Users ``` **List Users Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "Resources": [ { "active": true, "daysActive": 42, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "lastActiveAt": "2023-10-15T14:32:10Z", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1" } ], "itemsPerPage": 9999, "schemas": [ "urn:ietf:params:scim:api:messages:2.0:ListResponse" ], "startIndex": 1, "totalResults": 1 } ``` The response includes details about each user's activity in the organization: * **`daysActive`**: Total number of days the user has been active in the organization. * **`lastActiveAt`**: ISO 8601 timestamp of the user's most recent activity. Returns `null` if the user hasn't been active. The definition of "active" differs by deployment type: * **Dedicated Cloud / Self-Managed**: A user is active if they sign in, open any page in the W\&B App, log runs, use the SDK, or interact with the Weights & Biases server in any way. * **Multi-tenant Cloud**: A user is active if they perform any auditable action scoped to the organization after May 8, 2025. See [Audit logging actions](/products/wandb/platform/hosting/monitoring-usage/audit-logging#actions) for the full list. ### Create user Creates a new user in your organization. #### Endpoint * **URL**: `[HOST-URL]/scim/Users` * **Method**: `POST` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `emails` | array | Yes | Array of email objects. Must include a primary email | | `userName` | string | Yes | The username for the new user | | `modelsSeat` | string | No | Models seat level. One of `full`, `viewer`, or `none`. Defaults to `full`. | | `weaveRole` | string | No | Weave role level. One of `full`, `viewer`, or `none`. Defaults to `full`. | | `registryAccess` | string | No | Registry entitlement. One of `enabled` or `none`. When omitted, effective access is derived from `modelsSeat` and `weaveRole` at read time. Available in **Multi-tenant Cloud** and in **Dedicated Cloud** and **Self-Managed** v0.83.0+. | #### Example **Create User Request (Dedicated/Self-Managed)** ```bash theme={"system"} POST /scim/Users ``` ```json theme={"system"} { "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "emails": [ { "primary": true, "value": "dev-user2@example.com" } ], "userName": "dev-user2", "modelsSeat": "full", "weaveRole": "full" } ``` **Create User Request (Multi-tenant)** ```bash theme={"system"} POST /scim/Users ``` ```json theme={"system"} { "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:teams:2.0:User" ], "emails": [ { "primary": true, "value": "dev-user2@example.com" } ], "userName": "dev-user2", "modelsSeat": "full", "weaveRole": "full", "urn:ietf:params:scim:schemas:extension:teams:2.0:User": { "teams": ["my-team"] } } ``` #### Response **Create User Response (Dedicated/Self-Managed)** ```text theme={"system"} (Status 201) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 2", "emails": [ { "primary": true, "value": "dev-user2@example.com" } ], "id": "def", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "location": "Users/def" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "modelsSeat": "full", "weaveRole": "full", "userName": "dev-user2" } ``` **Create User Response (Multi-tenant)** ```text theme={"system"} (Status 201) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 2", "emails": [ { "primary": true, "value": "dev-user2@example.com" } ], "id": "def", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "location": "Users/def" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:teams:2.0:User" ], "userName": "dev-user2", "organizationRole": "member", "modelsSeat": "full", "weaveRole": "full", "teamRoles": [ { "teamName": "my-team", "roleName": "member" } ], "groups": [ { "value": "my-team-id" } ] } ``` ### Provision service account Creates a team-scoped or organization-scoped service account in your organization. Use this endpoint to create headless identities for automation, CI/CD, or integrations that shouldn't be tied to a human user. Omit `accountType` to create a regular user instead. See [Create user](#create-user). > [!NOTE] > > Available in **Dedicated Cloud** and **Self-Managed** v0.81.0+ and in **Multi-tenant Cloud**. > > * Set `userName` to the service account name. The API uses `userName` for the account's display name. The `displayName` field in the request body is ignored. > * `emails` aren't required for service accounts. > * `modelsSeat` and `weaveRole` aren't supported on create and return `400 Bad Request` if present. > * Service accounts can't be updated with `PATCH` or `PUT`, can't be deactivated, and can't be assigned organization, team, or registry roles through SCIM. Create API keys in the W\&B App after provisioning. #### Endpoint * **URL**: `[HOST-URL]/scim/Users` * **Method**: `POST` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `userName` | string | Yes | Unique name for the service account. | | `accountType` | string | Yes | `SERVICE` for a [team-scoped service account](/products/wandb/platform/hosting/iam/service-accounts#team-scoped-service-accounts), or `ORG_SERVICE` for an [organization-scoped service account](/products/wandb/platform/hosting/iam/service-accounts#organization-scoped-service-accounts). | | `urn:ietf:params:scim:schemas:extension:teams:2.0:User` | object | Yes | Teams extension object. | | `defaultTeam` | string | Yes | Sub-field of the teams extension. Name of an existing Weights & Biases Team. The service account is created as a member of this team. For team-scoped service accounts, this is the only team they join. Organization-scoped service accounts are also added automatically to teams created later through SCIM. | | `teams` | array | No | **Multi-tenant Cloud only.** Team names to add the account to. Include the same team as `defaultTeam` when you use this field. | #### Example **Provision Team Service Account Request** ```bash theme={"system"} POST /scim/Users ``` ```json theme={"system"} { "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:teams:2.0:User" ], "userName": "sa-deploy-bot", "accountType": "SERVICE", "urn:ietf:params:scim:schemas:extension:teams:2.0:User": { "defaultTeam": "ml-platform" } } ``` **Provision Org Service Account Request** ```bash theme={"system"} POST /scim/Users ``` ```json theme={"system"} { "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:teams:2.0:User" ], "userName": "sa-ci-runner", "accountType": "ORG_SERVICE", "urn:ietf:params:scim:schemas:extension:teams:2.0:User": { "defaultTeam": "ml-platform" } } ``` #### Response **Provision Team Service Account Response** ```text theme={"system"} (Status 201) ``` ```json theme={"system"} { "accountType": "SERVICE", "active": true, "displayName": "sa-deploy-bot", "id": "xyz", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "location": "Users/xyz" }, "organizationRole": "member", "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:wandb:2.0:User" ], "teamRoles": [ { "teamName": "ml-platform", "roleName": "member" } ], "urn:ietf:params:scim:schemas:extension:wandb:2.0:User": { "organizationRole": "member" }, "userName": "sa-deploy-bot" } ``` **Provision Org Service Account Response** ```text theme={"system"} (Status 201) ``` ```json theme={"system"} { "accountType": "ORG_SERVICE", "active": true, "displayName": "sa-ci-runner", "id": "xyz", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "location": "Users/xyz" }, "organizationRole": "member", "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:wandb:2.0:User" ], "teamRoles": [ { "teamName": "ml-platform", "roleName": "member" } ], "urn:ietf:params:scim:schemas:extension:wandb:2.0:User": { "organizationRole": "member" }, "userName": "sa-ci-runner" } ``` For an organization-scoped service account, `accountType` is `ORG_SERVICE`. In **Self-Managed** deployments, `organizationRole` is `service` or `org_service` instead of `member`, matching the account type. If the response returns one of the following errors, check the request for these common problems: * `409 Conflict`: The request includes duplicate `userName` keys for the same service account. * `400 Bad Request`: The request is missing `defaultTeam` or sets it to an invalid value. ### Deprovision service account Permanently deletes a service account and its organization membership. Use this endpoint when a service account is no longer needed (for example, after you retire an automation pipeline). This is a hard delete, and the account can't be reactivated through SCIM. > [!NOTE] > > Available in **Dedicated Cloud** and **Self-Managed** v0.81.0+ and in **Multi-tenant Cloud**. Use the service account's SCIM user `id` from the provision response or from [Get user](#get-user). Deprovisioning doesn't delete API keys that were already issued. Revoke keys separately in the W\&B App if needed. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `DELETE` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the service account. | #### Example **Deprovision Service Account Request** ```bash theme={"system"} DELETE /scim/Users/xyz ``` **Deprovision Service Account Response** ```text theme={"system"} (Status 204) ``` ### Delete user > [!WARNING] > > **Maintain admin access** > > Ensure that at least one admin user always exists in your instance or organization. Otherwise, no user can configure or maintain your organization's Weights & Biases account. If an organization uses SCIM or another automated process to deprovision users from Weights & Biases, a deprovisioning operation could inadvertently remove the last remaining admin from the instance or organization. > > For assistance with developing operational procedures, or to restore admin access, contact [support](mailto:forge-support@coreweave.com). Fully deletes a user from your organization. To delete a service account, see [Deprovision service account](#deprovision-service-account). #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `DELETE` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user to delete | #### Example **Delete User Request** ```bash theme={"system"} DELETE /scim/Users/abc ``` **Delete User Response** ```text theme={"system"} (Status 204) ``` > [!NOTE] > > To temporarily deactivate the user, refer to the [Deactivate user](#deactivate-user) API, which uses the `PATCH` endpoint. ### Update user email Updates a user's primary email address. **Not supported for Multi-tenant Cloud**, where a user's account isn't managed by the organization. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `emails` | | `value` | array | Yes | Array with new email object | #### Example **Update Email Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "emails", "value": [ { "value": "newemail@example.com", "primary": true } ] } ] } ``` **Update Email Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "newemail@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1" } ``` ### Update user display name Updates a user's display name. **Not supported for Multi-tenant Cloud**, where a user's account isn't managed by the organization. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `displayName` | | `value` | string | Yes | New display name | #### Example **Update Display Name Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "displayName", "value": "John Doe" } ] } ``` **Update Display Name Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "John Doe", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2025-7-01T00:00:00Z", "lastModified": "2025-7-01T00:00:00Z", "location": "users/dev-user1" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1" } ``` ### Deactivate user Deactivates a user in your organization. The result differs by deployment type: * **Dedicated Cloud** / **Self-Managed**: Sets the user's `active` field to `false`. To restore a deactivated user's access to your organization, see [Reactivate user](#reactivate-user). * **Multi-tenant Cloud**: Removes the user from the organization. To restore the user's access, re-add them to your organization. See [Create user](#create-user-request-multi-tenant). In Multi-tenant Cloud, a user's account isn't managed by the organization. > [!NOTE] > > This operation works for users only, not service accounts. Deactivating a service account isn't supported. Manage team service accounts in the settings for the Weights & Biases Team. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user to deactivate | | `op` | string | Yes | `replace` | | `value` | object | Yes | Object with `{"active": false}` | #### Example **Deactivate User Request (Dedicated/Self-Managed)** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "value": {"active": false} } ] } ``` **Deactivate User Request (Multi-tenant)** ```bash theme={"system"} PATCH /scim/Users ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "value": {"active": false} } ] } ``` #### Response **Deactivate User Response (Dedicated/Self-Managed)** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": false, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1" } ``` **Deactivate User Response (Multi-tenant)** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "value": {"active": true} } ] } ``` ### Reactivate user Reactivates a previously deactivated user in your organization. > [!NOTE] > > * User reactivation works for users only, not service accounts. Reactivation isn't supported for service accounts. Manage service accounts in the settings for the Weights & Biases Team. > > * User reactivation isn't supported in [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud). To restore the user's access, re-add them to your organization. See [Create user](#create-user-request-multi-tenant). In Multi-tenant Cloud, a user's account isn't managed by the organization. An attempt to reactivate a user results in an HTTP `400` error. The `detail` field in the response body is returned verbatim from the API and may still use legacy product wording: > ```json theme={"system"} > { > "schemas": [ > "urn:ietf:params:scim:api:messages:2.0:Error" > ], > "detail": "User reactivation operations are not supported in SaaS Cloud", > "status": "400" > } > ``` #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user to reactivate | | `op` | string | Yes | `replace` | | `value` | object | Yes | Object with `{"active": true}` | #### Example **Reactivate User Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "value": {"active": true} } ] } ``` **Reactivate User Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1" } ``` ### Assign organization role Assigns an organization-level role to a user. > [!NOTE] > > This operation works for users only, not service accounts. Custom roles aren't supported for service accounts. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `organizationRole` | | `value` | string | Yes | Role name (`admin` or `member`) | > [!NOTE] > > The organization-scoped `viewer` role is deprecated and can no longer be assigned in the UI. If you use SCIM to assign the `viewer` role to a user: > > * They're assigned the `member` role in the organization. > * Their `modelsSeat` is set to `viewer` instead of `full`. This allows view-only access to Models and full access to Registry. If no Models seats are available, a `Seat limit reached` error is returned. This can be updated later if a seat is available. > * Their `weaveRole` is set to `viewer` instead of `full`. This allows view-only access to Weave. > * All of their existing team and project roles are set to `viewer`. > * They're assigned the Registry `viewer` role in registries that are visible at the organization level. > > Assigning the `member` or `admin` organization role doesn't change the user's `modelsSeat` or `weaveRole`. #### Example **Assign Org Role Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "organizationRole", "value": "admin" } ] } ``` **Assign Org Role Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "teamRoles": [ { "teamName": "team1", "roleName": "admin" } ], "organizationRole": "admin" } ``` ### Update Models seat Updates a user's Models seat. > [!NOTE] > > On **Multi-tenant Cloud** and on **Dedicated Cloud** and **Self-Managed** v0.83.0+, Registry access is decoupled from Models seats. Setting `modelsSeat` to `none` no longer revokes Registry access when the user has a non-`none` `weaveRole`. To revoke Registry access on those deployments, use [Update Registry access](#update-registry-access) and set `registryAccess` to `none`. > > On **Dedicated Cloud** and **Self-Managed** v0.82.0 and older, Registry access is still tied to `modelsSeat`. Set `modelsSeat` to `none` to revoke Registry access on those releases. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `modelsSeat` | | `value` | string | Yes | Seat level (`full`, `viewer`, or `none`) | #### Example **Update Models Seat Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "modelsSeat", "value": "full" } ] } ``` **Update Models Seat Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "organizationRole": "member", "modelsSeat": "full", "weaveRole": "full" } ``` ### Update Weave role Updates a user's Weave role. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `weaveRole` | | `value` | string | Yes | Role level (`full`, `viewer`, or `none`) | #### Example **Update Weave Role Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "weaveRole", "value": "full" } ] } ``` **Update Weave Role Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "organizationRole": "member", "modelsSeat": "full", "weaveRole": "full" } ``` ### Update Registry access Grants or revokes organization-level Registry access for a user. This entitlement is separate from [Registry roles](#add-to-registry) (`registryRoles`), which control per-registry permissions after a user is entitled. On **Multi-tenant Cloud** and on **Dedicated Cloud** and **Self-Managed** v0.83.0+, users with a non-`none` `modelsSeat` or `weaveRole` are entitled to Registry by default. Set `registryAccess` to `none` to revoke Registry access without changing their Models seat or Weave role. On **Dedicated Cloud** and **Self-Managed**, v0.82.0 and older, use [Update Models seat](#update-models-seat) and set `modelsSeat` to `none` to revoke Registry access. The `registryAccess` attribute isn't available on those releases. When you omit `registryAccess` at create time, the API derives effective access from the user's `modelsSeat` and `weaveRole` when you read the user. An explicit `registryAccess` value overrides that derivation. Users with the billing-only organization role don't receive Registry access through this derivation. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `registryAccess` | | `value` | string | Yes | Registry entitlement (`enabled` or `none`) | #### Example **Revoke Registry Access Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "registryAccess", "value": "none" } ] } ``` **Revoke Registry Access Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "organizationRole": "member", "modelsSeat": "none", "weaveRole": "full", "registryAccess": "none" } ``` ### Assign team role Assigns a team-level role to a user. > [!NOTE] > > This operation works for users only, not service accounts. Custom roles aren't supported for service accounts. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `replace` | | `path` | string | Yes | `teamRoles` | | `value` | array | Yes | Array of objects with `teamName` and `roleName` | #### Example **Assign Team Role Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "teamRoles", "value": [ { "roleName": "admin", "teamName": "team1" } ] } ] } ``` **Assign Team Role Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "teamRoles": [ { "teamName": "team1", "roleName": "admin" } ], "organizationRole": "admin" } ``` ### Add to Registry Adds a user to a registry with an assigned registry-level role. > [!NOTE] > > This operation works for users only, not service accounts. Custom roles aren't supported for service accounts. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `add` | | `path` | string | Yes | `registryRoles` | | `value` | array | Yes | Array of objects with `registryName` and `roleName` | #### Example **Add to Registry Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "registryRoles", "value": [ { "roleName": "admin", "registryName": "hello-registry" } ] } ] } ``` **Add to Registry Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "registryRoles": [ { "registryName": "hello-registry", "roleName": "admin" } ], "organizationRole": "admin" } ``` ### Remove from Registry Removes a user from a registry. > [!NOTE] > > This operation removes a user from a specific registry. It doesn't revoke organization-level Registry access. To revoke Registry access entirely, use [Update Registry access](#update-registry-access). > [!NOTE] > > * The remove operations follow RFC 7644 SCIM protocol specifications. Use the filter syntax `"registryRoles[registryName eq \"{registry_name}\"]"` to remove a user from a specific registry, or `"registryRoles"` to remove the user from all registries. > * This operation works for users only, not service accounts. Remove service accounts from a registry in the settings for the Weights & Biases Team. #### Endpoint * **URL**: `[HOST-URL]/scim/Users/{id}` * **Method**: `PATCH` #### Parameters | Parameter | Type | Required | Description | | - | - | - | - | | `id` | string | Yes | The unique ID of the user | | `op` | string | Yes | `remove` | | `path` | string | Yes | `"registryRoles[registryName eq \"{registry_name}\"]"` or `"registryRoles"` | #### Example **Remove from Registry Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "registryRoles[registryName eq \"goodbye-registry\"]" } ] } ``` **Remove from Registry Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "registryRoles": [ { "registryName": "hello-registry", "roleName": "admin" } ], "organizationRole": "admin" } ``` **Remove from ALL Registries Request** ```bash theme={"system"} PATCH /scim/Users/abc ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "registryRoles" } ] } ``` **Remove from ALL Registries Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "active": true, "displayName": "Dev User 1", "emails": [ { "primary": true, "value": "dev-user1@example.com" } ], "id": "abc", "meta": { "resourceType": "User", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Users/abc" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "userName": "dev-user1", "organizationRole": "admin" } ``` ## Group resource The SCIM group resource maps to a Weights & Biases Team. Use the endpoints in this section to create teams, manage team membership, and (optionally) configure team-level storage from your identity provider or automation. When you create a SCIM group in your IAM, it creates and maps to a Weights & Biases Team, and other SCIM group operations act on the team. To configure custom storage during team creation, include `storageBucket` in the request. ### Service accounts When you create a Weights & Biases Team using SCIM, all organization-level service accounts are automatically added to the team, to maintain the service account's access to team resources. ### Filter groups The `/Groups` endpoint supports filtering to search for specific teams. #### Supported filters The `/Groups` endpoint supports the following filter: * `displayName eq "value"`: Filter by team display name. #### Example ```bash theme={"system"} GET /scim/Groups?filter=displayName eq "engineering-team" ``` ### Get team Retrieve team information by providing the team's unique ID. #### Endpoint * **URL**: `[HOST-URL]/scim/Groups/{id}` * **Method**: `GET` #### Example **Request** ```bash theme={"system"} GET /scim/Groups/ghi ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "displayName": "acme-devs", "id": "ghi", "members": [ { "Value": "abc", "Ref": "", "Type": "", "Display": "dev-user1" } ], "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Groups/ghi" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ``` ### List teams Retrieve a list of teams. #### Endpoint * **URL**: `[HOST-URL]/scim/Groups` * **Method**: `GET` #### Example **Request** ```bash theme={"system"} GET /scim/Groups ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "Resources": [ { "displayName": "acme-devs", "id": "ghi", "members": [ { "Value": "abc", "Ref": "", "Type": "", "Display": "dev-user1" } ], "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Groups/ghi" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ], "itemsPerPage": 9999, "schemas": [ "urn:ietf:params:scim:api:messages:2.0:ListResponse" ], "startIndex": 1, "totalResults": 1 } ``` ### Create team Creates a new team resource. #### Endpoint * **URL**: `[HOST-URL]/scim/Groups` * **Method**: `POST` #### Supported fields | Field | Type | Required | | - | - | - | | `displayName` | String | Yes | | `members` | Multi-Valued Array | Yes (`value` sub-field is required and maps to a user ID) | | `storageBucket` | Object | No | You can configure team-level [Bring your own bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector) during team creation by including a `storageBucket` object. If omitted, the team uses default or instance-level storage. Provision the bucket (policy, CORS, credentials) and determine the storage address format per provider using the BYOB guide. The `storageBucket` object has the following sub-fields: * **Required**: `name` (bucket name), `provider` (one of `COREWEAVE`, `AWS`, `AZURE`, `GCP`, or `MINIO`). The value is case-sensitive. Use uppercase as shown. * **Optional**: `path` (path prefix within the bucket), `kmsKeyId` (KMS key for encryption, for example for AWS), `awsExternalId` (AWS cross-account access), `azureTenantId` (Azure tenant ID), `azureClientId` (Azure managed identity client ID). Weights & Biases validates that the bucket exists and is reachable before creating the team. If validation fails, the SCIM request fails and the team isn't created. An invalid `provider` value returns `400 Bad Request` with a SCIM error that lists the allowed values. #### Examples These examples show how to create a team without custom storage and with BYOB storage on a specific provider. Select a tab for the desired storage configuration to see an example request, and select the **Response** tab for an example response. **Request (no BYOB)** ```bash theme={"system"} POST /scim/Groups ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName": "wandb-support", "members": [ { "value": "def" } ] } ``` **CoreWeave** ```bash theme={"system"} POST /scim/Groups Content-Type: application/scim+json ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName": "ml-training-team", "members": [ { "value": "user@example.com", "display": "user@example.com" } ], "storageBucket": { "name": "wandb-coreweave-bucket", "provider": "COREWEAVE", "path": "ml-training/experiments" } } ``` **AWS S3** ```bash theme={"system"} POST /scim/Groups Content-Type: application/scim+json ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName": "ml-team", "members": [ { "value": "user@example.com", "display": "user@example.com" } ], "storageBucket": { "name": "my-company-wandb-data", "provider": "AWS", "path": "ml-team/experiments", "kmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012", "awsExternalId": "wandb-external-id-abc123" } } ``` **Azure** ```bash theme={"system"} POST /scim/Groups Content-Type: application/scim+json ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName": "research-team", "members": [], "storageBucket": { "name": "wandbstorage", "provider": "AZURE", "path": "research/artifacts", "azureTenantId": "12345678-1234-1234-1234-123456789012", "azureClientId": "87654321-4321-4321-4321-210987654321" } } ``` **GCP** ```bash theme={"system"} POST /scim/Groups Content-Type: application/scim+json ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName": "data-science-team", "members": [ { "value": "VXNlcjox", "display": "jane.doe@example.com" }, { "value": "VXNlcjoy", "display": "john.smith@example.com" } ], "storageBucket": { "name": "my-gcs-bucket", "provider": "GCP", "path": "data-science/runs" } } ``` **Response** ```text theme={"system"} (Status 201) ``` ```json theme={"system"} { "displayName": "wandb-support", "id": "jkl", "members": [ { "Value": "def", "Ref": "", "Type": "", "Display": "dev-user2" } ], "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:00:00Z", "location": "Groups/jkl" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ``` ### Update team Updates an existing team's membership list. #### Endpoint * **URL**: `[HOST-URL]/scim/Groups/{id}` * **Method**: `PATCH` * **Supported operations**: `add` member, `remove` member, `replace` members. > [!NOTE] > > * The remove operations follow RFC 7644 SCIM protocol specifications. Use the filter syntax `members[value eq "{user_id}"]` to remove a specific user, or `members` to remove all users from the team. > > **User identification**: The `{user_id}` in member operations can be either of the following: > > * A Weights & Biases user ID. > * An email address (for example, "[user@example.com](mailto:user@example.com)"). > * These operations work for users only, not service accounts. Update a team's service accounts in the settings for the Weights & Biases Team. > [!NOTE] > > Replace `{team_id}` with the actual team ID and `{user_id}` with the actual user ID or email address in your requests. ### Replace team members Replaces all members of a team with a new list. > [!NOTE] > > This operation works for users only, not service accounts. Manage service accounts in the settings for the Weights & Biases Team. #### Endpoint * **URL**: `[HOST-URL]/scim/Groups/{id}` * **Method**: `PUT` **Request** ```bash theme={"system"} PUT /scim/Groups/{team_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName": "acme-devs", "members": [ { "value": "{user_id_1}" }, { "value": "{user_id_2}" } ] } ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "displayName": "acme-devs", "id": "ghi", "members": [ { "Value": "user_id_1", "Ref": "", "Type": "", "Display": "user1" }, { "Value": "user_id_2", "Ref": "", "Type": "", "Display": "user2" } ], "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:01:00Z", "location": "Groups/ghi" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ``` ### Add a user to a team Adds `dev-user2` to `acme-devs`: > [!NOTE] > > This operation works for users only, not service accounts. Manage service accounts in the settings for the Weights & Biases Team. **Request** ```bash theme={"system"} PATCH /scim/Groups/{team_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "add", "path": "members", "value": [ { "value": "{user_id}" } ] } ] } ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "displayName": "acme-devs", "id": "ghi", "members": [ { "Value": "abc", "Ref": "", "Type": "", "Display": "dev-user1" }, { "Value": "def", "Ref": "", "Type": "", "Display": "dev-user2" } ], "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:01:00Z", "location": "Groups/ghi" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ``` ### Remove a specific user from a team Removes `dev-user2` from `acme-devs`: > [!NOTE] > > This operation works for users only, not service accounts. Manage service accounts in the settings for the Weights & Biases Team. **Request** ```bash theme={"system"} PATCH /scim/Groups/{team_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "remove", "path": "members[value eq \"{user_id}\"]" } ] } ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "displayName": "acme-devs", "id": "ghi", "members": [ { "Value": "abc", "Display": "dev-user1" } ], "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:01:00Z", "location": "Groups/ghi" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ``` ### Remove all users from a team Removes all users from `acme-devs`: > [!NOTE] > > This operation works for users only, not service accounts. Manage service accounts in the settings for the Weights & Biases Team. **Request** ```bash theme={"system"} PATCH /scim/Groups/{team_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "remove", "path": "members" } ] } ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "displayName": "acme-devs", "id": "ghi", "members": null, "meta": { "resourceType": "Group", "created": "2023-10-01T00:00:00Z", "lastModified": "2023-10-01T00:01:00Z", "location": "Groups/ghi" }, "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] } ``` ### Delete team The SCIM API doesn't support deleting teams because additional data is linked to teams. Delete teams from the W\&B App to confirm you want everything deleted. ## Role resource The SCIM role resource maps to Weights & Biases custom roles. Use the endpoints in this section to create and maintain custom roles programmatically (for example, to keep role definitions in sync with your access policies). The `/Roles` endpoints aren't part of the official SCIM schema. Weights & Biases adds `/Roles` endpoints to support automated management of custom roles in organizations. ### Get custom role Retrieve information for a custom role by providing the role's unique ID. #### Endpoint * **URL**: `[HOST-URL]/scim/Roles/{id}` * **Method**: `GET` #### Example **Request** ```bash theme={"system"} GET /scim/Roles/abc ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "description": "A sample custom role for example", "id": "Um9sZTo3", "inheritedFrom": "member", // indicates the predefined role "meta": { "resourceType": "Role", "created": "2023-11-20T23:10:14Z", "lastModified": "2023-11-20T23:31:23Z", "location": "Roles/Um9sZTo3" }, "name": "Sample custom role", "organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==", "permissions": [ { "name": "artifact:read", "isInherited": true // inherited from member predefined role }, ... ... { "name": "project:update", "isInherited": false // custom permission added by admin } ], "schemas": [ "" ] } ``` ### List custom roles Retrieve information for all custom roles in the organization. #### Endpoint * **URL**: `[HOST-URL]/scim/Roles` * **Method**: `GET` #### Example **Request** ```bash theme={"system"} GET /scim/Roles ``` **Response** ```text theme={"system"} (Status 200) ``` ```json theme={"system"} { "Resources": [ { "description": "A sample custom role for example", "id": "Um9sZTo3", "inheritedFrom": "member", // indicates the predefined role that the custom role inherits from "meta": { "resourceType": "Role", "created": "2023-11-20T23:10:14Z", "lastModified": "2023-11-20T23:31:23Z", "location": "Roles/Um9sZTo3" }, "name": "Sample custom role", "organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==", "permissions": [ { "name": "artifact:read", "isInherited": true // inherited from member predefined role }, ... ... { "name": "project:update", "isInherited": false // custom permission added by admin } ], "schemas": [ "" ] }, { "description": "Another sample custom role for example", "id": "Um9sZToxMg==", "inheritedFrom": "viewer", // indicates the predefined role that the custom role inherits from "meta": { "resourceType": "Role", "created": "2023-11-21T01:07:50Z", "location": "Roles/Um9sZToxMg==" }, "name": "Sample custom role 2", "organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==", "permissions": [ { "name": "launchagent:read", "isInherited": true // inherited from viewer predefined role }, ... ... { "name": "run:stop", "isInherited": false // custom permission added by admin } ], "schemas": [ "" ] } ], "itemsPerPage": 9999, "schemas": [ "urn:ietf:params:scim:api:messages:2.0:ListResponse" ], "startIndex": 1, "totalResults": 2 } ``` ### Create custom role Creates a new custom role in the organization. #### Endpoint * **URL**: `[HOST-URL]/scim/Roles` * **Method**: `POST` #### Supported fields | Field | Type | Required | | - | - | - | | `name` | String | Name of the custom role | | `description` | String | Description of the custom role | | `permissions` | Object array | Array of permission objects where each object includes a `name` string field that has value of the form `w&bobject:operation`. For example, a permission object for delete operation on W\&B runs would have `name` as `run:delete`. | | `inheritedFrom` | String | The predefined role that the custom role inherits from. It can be either `member` or `viewer`. | #### Example **Request** ```bash theme={"system"} POST /scim/Roles ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Role"], "name": "Sample custom role", "description": "A sample custom role for example", "permissions": [ { "name": "project:update" } ], "inheritedFrom": "member" } ``` **Response** ```text theme={"system"} (Status 201) ``` ```json theme={"system"} { "description": "A sample custom role for example", "id": "Um9sZTo3", "inheritedFrom": "member", // indicates the predefined role "meta": { "resourceType": "Role", "created": "2023-11-20T23:10:14Z", "lastModified": "2023-11-20T23:31:23Z", "location": "Roles/Um9sZTo3" }, "name": "Sample custom role", "organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==", "permissions": [ { "name": "artifact:read", "isInherited": true // inherited from member predefined role }, ... ... { "name": "project:update", "isInherited": false // custom permission added by admin } ], "schemas": [ "" ] } ``` ### Update custom role The following sections describe how to add or remove permissions on an existing custom role. #### Add permissions to role Adds permissions to an existing custom role. ##### Endpoint * **URL**: `[HOST-URL]/scim/Roles/{id}` * **Method**: `PATCH` **Request** ```bash theme={"system"} PATCH /scim/Roles/{role_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "add", "path": "permissions", "value": [ { "name": "project:delete" }, { "name": "run:stop" } ] } ] } ``` **Response** ```text theme={"system"} (Status 200) ``` Returns the updated role with new permissions added. #### Remove a permission from a role Removes permissions from an existing custom role. ##### Endpoint * **URL**: `[HOST-URL]/scim/Roles/{id}` * **Method**: `PATCH` **Request** ```bash theme={"system"} PATCH /scim/Roles/{role_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "remove", "path": "permissions", "value": [ { "name": "project:update" } ] } ] } ``` **Response** ```text theme={"system"} (Status 200) ``` Returns the updated role with specified permissions removed. ### Replace custom role Replaces an entire custom role definition. #### Endpoint * **URL**: `[HOST-URL]/scim/Roles/{id}` * **Method**: `PUT` **Request** ```bash theme={"system"} PUT /scim/Roles/{role_id} ``` ```json theme={"system"} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Role"], "name": "Updated custom role", "description": "Updated description for the custom role", "permissions": [ { "name": "project:read" }, { "name": "run:read" }, { "name": "artifact:read" } ], "inheritedFrom": "viewer" } ``` **Response** ```text theme={"system"} (Status 200) ``` Returns the replaced role definition. ### Delete custom role Delete a custom role in the organization. **Use this operation with caution**. The predefined role that the custom role inherited from is reassigned to all users who held the custom role before the deletion. #### Endpoint * **URL**: `[HOST-URL]/scim/Roles/{id}` * **Method**: `DELETE` #### Example **Request** ```bash theme={"system"} DELETE /scim/Roles/abc ``` **Response** ```text theme={"system"} (Status 204 No Content) ``` ## Advanced features The following sections describe optional capabilities (ETag-based concurrency control and standard error responses) that help SCIM integrations behave safely in production. ### ETag support The SCIM API supports ETags for conditional updates to prevent concurrent modification conflicts. This matters when multiple admins or automated systems update the same resource, because it ensures that one update doesn't silently overwrite another. ETags are returned in the `ETag` response header and the `meta.version` field. #### ETags To use ETags, follow these steps: 1. **Get current ETag**: When you GET a resource, note the ETag header in the response. 2. **Conditional update**: Include the ETag in the `If-Match` header when updating. #### Example ```text theme={"system"} # Get user and note ETag GET /scim/Users/abc # Response includes: ETag: W/"xyz123" # Update with ETag PATCH /scim/Users/abc If-Match: W/"xyz123" { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "organizationRole", "value": "admin" } ] } ``` A `412 Precondition Failed` error response indicates that the resource has been modified since you retrieved it. ### Error handling The SCIM API returns standard SCIM error responses: | Status Code | Description | | - | - | | `200` | Success | | `201` | Created | | `204` | No Content (successful deletion) | | `400` | Bad Request: invalid parameters or request body | | `401` | Unauthorized: authentication failed | | `403` | Forbidden: insufficient permissions | | `404` | Not Found: resource doesn't exist | | `409` | Conflict: resource already exists | | `412` | Precondition Failed: ETag mismatch | | `500` | Internal Server Error | ## Implementation differences per deployment type Weights & Biases maintains two separate SCIM API implementations, and the features differ between them. Review the following table before you integrate with SCIM to confirm that the operations you rely on are available on your deployment type. | Feature | Multi-tenant Cloud | Dedicated Cloud and Self-Managed | | - | - | - | | Update user email | - | ✓ | | Update user display name | - | ✓ | | User deactivation | ✓ | ✓ | | User reactivation | - | ✓ | | Multiple emails per user | ✓ | - | | Set `modelsSeat` on create/update | ✓ | ✓ | | Set `weaveRole` on create/update | ✓ | ✓ | | Set `registryAccess` on create/update | ✓ | ✓ | | Revoke Registry access with `modelsSeat: none` | - | ✓ | | Revoke Registry access with `registryAccess: none` | ✓ | ✓ | ## Limitations Keep the following constraints in mind when you design SCIM integrations: * **Maximum results**: 9,999 items per request. * **Dedicated Cloud and Self-Managed**: Only support one email per user. * **Team deletion**: Not supported through SCIM (use the Weights & Biases web interface). * **User reactivation**: Not supported in Multi-tenant Cloud environments. * **Seat limits**: Operations may fail if organization seat limits are reached. # Use service accounts to automate workflows Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/service-accounts Manage automated or non-interactive workflows using org and team scoped service accounts A service account represents a non-human or machine user that can automatically perform common tasks across projects within a team or across teams. Service accounts are ideal for CI/CD pipelines, automated training jobs, and other machine-to-machine workflows. This page explains the scopes available for service accounts, walks through how to create and manage them, and outlines best practices for using them safely in production automation. It's intended for organization and team admins who provision credentials for automated systems. > [!NOTE] > > In multi-tenant Forge, service accounts and their API keys grant access only within Forge. They don't grant access to CoreWeave Infrastructure. See [Forge and CoreWeave identity](/security/forge-identity-and-access). ## Key benefits Key benefits of service accounts: * **No license consumption**: Service accounts don't consume user seats or licenses. * **Dedicated API keys**: Secure credentials for automated workflows. * **User attribution**: Optionally attribute automated runs to human users. * **Enterprise-ready**: Built for production automation at scale. * **Delegated operations**: Service accounts operate on behalf of the user or organization that creates them. ## Overview Service accounts provide a secure way to automate Weights & Biases workflows without using personal user credentials or hardcoded credentials. You can create them at two scopes: * **Organization-scoped**: Created by org admins, with access across all teams. * **Team-scoped**: Created by team admins, with access limited to a specific team. > [!NOTE] > > An organization-scoped service account is not the same as an [organization API key](/products/wandb/platform/hosting/iam/api-keys#types-of-api-keys). A service account is a non-human identity that holds its own keys. An organization API key belongs to a person and authenticates that person within a single organization. A service account's API key lets the caller read from or write to projects within the service account's scope. This enables centralized management of automated workflows for experiment tracking in Weights & Biases or logging traces in W\&B Weave. Service accounts are useful for: * **CI/CD pipelines**: Automatically log model training runs from GitHub Actions, GitLab CI, or Jenkins. * **Scheduled jobs**: Nightly model retraining, periodic evaluation runs, or data validation workflows. * **Production monitoring**: Log inference metrics and model performance from production systems. * **Jupyter notebooks**: Shared notebooks in JupyterHub or Google Colab environments. * **Kubernetes jobs**: Automated workflows running in Kubernetes clusters. * **Airflow/Prefect/Dagster**: ML pipeline orchestration tools. > [!NOTE] > > Service accounts are available on [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), [Self-Managed instances](/products/wandb/platform/hosting/hosting-options/self-managed) with an enterprise license, and enterprise accounts in [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud). ## Organization-scoped service accounts Use an organization-scoped service account when your automation needs to read or write across projects in multiple teams. Service accounts scoped to an organization have permissions to read and write in all projects in the organization, regardless of the team, with the exception of [restricted projects](/products/wandb/platform/hosting/iam/access-management/restricted-projects#visibility-scopes). Before an organization-scoped service account can access a restricted project, an admin of that project must explicitly add the service account to the project. ### Create an organization-scoped service account To create a new organization-scoped service account and API key: 1. Log in to W\&B. 2. Click your user profile icon, then go to **Service Accounts**: * **Dedicated Cloud** or **Self-Managed**: Click **Organization Dashboard**, then click **Service Accounts**. * **Multi-tenant Cloud**: Click **Service Accounts**. 3. Click **Create service account**. 4. Provide a name and select a default team. 5. Click **Create**. 6. Find the service account you just created, then click the **action ()** menu and click **Create API key**. 7. Provide a name for the API key, then click **Create**. 8. Copy the API key and store it securely. 9. Click **Done**. > [!WARNING] > > W\&B shows the full API key only once, when you create it. After you close the dialog, you cannot view the full API key again. Your settings display only the key ID (the first part of the key). If you lose the full API key, you must create a new one. > [!NOTE] > > An organization-scoped service account requires a default team, even though it has access to non-restricted projects owned by all teams within the organization. This helps to prevent a workload from failing if the `WANDB_ENTITY` variable isn't set in the environment for your model training or generative AI app. To use an organization-scoped service account for a project in a different team, you must set the `WANDB_ENTITY` environment variable to that team. ## Team-scoped service accounts Use a team-scoped service account when you want to limit automation to a single team's projects, following the principle of least privilege. A team-scoped service account can read and write in all projects within its team, except to [restricted projects](/products/wandb/platform/hosting/iam/access-management/restricted-projects#visibility-scopes) in that team. Before a team-scoped service account can access a restricted project, an admin of that project must explicitly add the service account to the project. > [!NOTE] > > On [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) and [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) v0.83.0+, admins can prevent the creation of team-scoped service accounts by setting the `GORILLA_DISABLE_TEAM_SERVICE_ACCOUNT_CREATION` environment variable to `true` on the instance. See [Advanced IAM configuration](/products/wandb/platform/hosting/iam/advanced_env_vars). ### Create a team-scoped service account To create a new team-scoped service account and API key: 1. In your team's settings, click **Service Accounts**. 2. Click **New Team Service Account**. 3. Provide a name for the service account. 4. Set **Authentication Method** to **Generate API key** (default). If you select **Federated Identity**, the service account can't own API keys. 5. Click **Create**. 6. Find the service account you created, then click its **action ()** menu and click **Create API key**. 7. Provide a name for the API key, then click **Create**. 8. Copy the API key and store it securely. 9. Click **Done**. > [!WARNING] > > W\&B shows the full API key only once, when you create it. After you close the dialog, you cannot view the full API key again. Your settings display only the key ID (the first part of the key). If you lose the full API key, you must create a new one. ### Create additional API keys for a service account To create an API key owned by a service account: 1. In your team or organization settings, go to the **Service Accounts** tab. 2. Find the service account in the list. 3. Click the **action ()** menu, then click **Create API key**. 4. Provide a name for the API key, then click **Create**. 5. Copy the displayed API key immediately and store it securely. 6. Click **Done**. You can create multiple API keys for a single service account to support different environments or workflows. > [!WARNING] > > W\&B shows the full API key only once, when you create it. After you close the dialog, you cannot view the full API key again. Your settings display only the key ID (the first part of the key). If you lose the full API key, you must create a new one. ### Delete a service account API key To delete an API key owned by an organization or team service account: 1. Go to [Organization settings](https://forge.coreweave.com/account-settings/), then click **API Keys**. 2. Find the API key. The list includes all API keys owned by organization and team service accounts. You can search or filter by key name or ID, and sort by any column. 3. Click the delete button. If you don't configure a team in your model training or generative AI app environment that uses a team-scoped service account, the model runs or weave traces log to the named project within the service account's parent team. In such a scenario, user attribution using the `WANDB_USERNAME` or `WANDB_USER_EMAIL` variables *doesn't work* unless the referenced user is part of the service account's parent team. > [!WARNING] > > A team-scoped service account can't log runs to a [team or restricted-scoped project](/products/wandb/platform/hosting/iam/access-management/restricted-projects#visibility-scopes) in a team different from its parent team, but it can log runs to an open visibility project within another team. ### External service accounts If you'd prefer to issue credentials through your own identity provider instead of managing Weights & Biases-native API keys, use external service accounts. In addition to built-in service accounts, Weights & Biases also supports team-scoped external service accounts with the W\&B SDK and CLI using [Identity federation](/products/wandb/platform/hosting/iam/identity_federation#external-service-accounts) with identity providers (IdPs) that issue JSON Web Tokens (JWTs). ## Best practices After you create the service accounts you need, follow these recommendations to ensure secure and efficient use of service accounts in your organization: * **Use a secrets manager**: Store service account API keys in a secure secrets management system (for example, AWS Secrets Manager, HashiCorp Vault, Azure Key Vault) rather than in plain text configuration files. * **Principle of least privilege**: Create team-scoped service accounts when possible, rather than organization-scoped accounts, to limit access to only necessary projects. * **Unique service accounts per use case**: Create separate service accounts for different automation workflows (for example, one for CI/CD, another for scheduled retraining) to improve auditability and enable granular access control. * **Regular audits**: Periodically review active service accounts and remove those no longer in use. Check the audit logs to monitor service account activity. * **Secure API key handling**: * Never commit API keys to version control. * Use environment variables to pass keys to applications. * Rotate keys if they're accidentally exposed. * **Naming conventions**: Use descriptive names that indicate the service account's purpose: * Good: `ci-model-training`, `nightly-eval-pipeline`, `prod-inference-monitor` * Avoid: `service-account-1`, `test-sa`, `temp` * **User attribution**: When multiple team members use the same automation workflow, set `WANDB_USERNAME` or `WANDB_USER_EMAIL` to track who triggered each run: ```bash theme={"system"} export WANDB_API_KEY="[SERVICE_ACCOUNT_KEY]" export WANDB_USERNAME="john.doe@company.com" ``` * **Environment configuration**: For team-scoped service accounts, always set the `WANDB_ENTITY` to ensure runs log to the correct team: ```bash theme={"system"} export WANDB_ENTITY="ml-team" export WANDB_PROJECT="production-models" ``` * **Error handling**: Implement proper error handling and alerts for failed authentication to identify issues with service account credentials quickly. * **Documentation**: Maintain documentation of: * Which service accounts exist and their purposes. * Which systems or workflows use each service account. * Contact information for the team responsible for each account. ## Troubleshooting If a service account isn't behaving as expected, check the following common issues and solutions: * **"Unauthorized" errors**: Verify the API key is correctly set and the service account has access to the target project. * **Runs not appearing**: Check that `WANDB_ENTITY` is set to the correct team name. * **User attribution not working**: Ensure the user specified in `WANDB_USERNAME` is a member of the team. * **Access denied to restricted projects**: Explicitly add the service account to the restricted project's access list. # Configure SSO with OIDC Source: https://docs.coreweave.com/products/wandb/platform/hosting/iam/sso Configure Weights & Biases SSO with OpenID Connect providers such as Okta, Azure AD, and AWS Cognito. This guide is for administrators of W\&B Dedicated Cloud or Self-Managed instances who want to enable single sign-on (SSO) using an OpenID Connect (OIDC) compatible identity provider. By the end, you've configured your identity provider, connected it to Weights & Biases so that users can sign in through your organization's existing identity system, and you can manage user identities and group memberships through providers like Okta, Keycloak, Auth0, Google, and Entra. ## OpenID Connect Weights & Biases supports the following OIDC authentication flows for integrating with external Identity Providers (IdPs): * Implicit flow with form post. * Authorization code flow with Proof Key for Code Exchange (PKCE). These flows authenticate users and provide Weights & Biases with the identity information (in the form of ID tokens) needed to manage access control. The ID token is a JWT that contains the user's identity information, such as their name, username, email, and group memberships. Weights & Biases uses this token to authenticate the user and map them to appropriate roles or groups in the system. In the context of Weights & Biases, access tokens authorize requests to APIs on behalf of the user, but because Weights & Biases's primary concern is user authentication and identity, it only requires the ID token. You can use environment variables to [configure IAM options](/products/wandb/platform/hosting/iam/advanced_env_vars) for your [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) instance. To assist with configuring Identity Providers for [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) deployments, follow these guidelines. If you're using W\&B Multi-tenant Cloud, reach out to [forge-support@coreweave.com](mailto:forge-support@coreweave.com) for assistance. ## Configure your IdP The following sections describe how to configure your identity provider (IdP) for OIDC. Complete the configuration steps for your IdP first. You use the resulting **Client ID**, **Issuer URL**, and (optionally) **Client Secret** when you set up SSO in Weights & Biases in the next section. Select the tab for your IdP for details. **Cognito** Follow this procedure to set up AWS Cognito as your IdP. At the end, you have a **Client ID** and **OIDC issuer URL** to use when you configure Weights & Biases. 1. Sign in to your AWS account and navigate to the [AWS Cognito](https://aws.amazon.com/cognito/) App. ![AWS Cognito setup](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/setup_aws_cognito.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=97d69ef033862f40319dc004ef2439b7) 2. Provide an allowed callback URL to configure the application in your IdP. Add `http(s)://[YOUR-W-AND-B-HOST]/oidc/callback` as the callback URL. Replace `[YOUR-W-AND-B-HOST]` with your Weights & Biases host path. 3. If your IdP supports universal logout, set the Logout URL to `http(s)://[YOUR-W-AND-B-HOST]`. Replace `[YOUR-W-AND-B-HOST]` with your Weights & Biases host path. For example, if your application runs at `https://wandb.mycompany.com`, replace `[YOUR-W-AND-B-HOST]` with `wandb.mycompany.com`. The following image demonstrates how to provide allowed callback and sign-out URLs in AWS Cognito. ![Host configuration](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/setup_aws_cognito_ui_settings.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=0d936108334e39bf4de873f979bdbb21) `wandb/local` uses the [`implicit` grant with the `form_post` response type](https://auth0.com/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post) by default. You can also configure `wandb/local` to perform an `authorization_code` grant that uses the [PKCE Code Exchange](https://www.oauth.com/oauth2-servers/pkce/) flow. 4. Select one or more OAuth grant types to configure how AWS Cognito delivers tokens to your app. 5. Weights & Biases requires specific OpenID Connect (OIDC) scopes. Select the following from AWS Cognito App: * `openid` * `profile` * `email` For example, your AWS Cognito App UI should look similar to the following image: ![Required fields](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/setup_aws_required_fields.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=02020eb604d0b7f8c42c4a49baf60ab4) Select the **Auth Method** in the settings page or set the `OIDC_AUTH_METHOD` environment variable to specify which grant `wandb/local` uses. You must set the **Auth Method** to `pkce`. 6. You need a **Client ID** and the URL of your OIDC issuer. The OpenID discovery document must be available at `$OIDC_ISSUER/.well-known/openid-configuration`. For example, you can generate your issuer URL by appending your User Pool ID to the Cognito IdP URL from the **App Integration** tab within the **User Pools** section: ![AWS Cognito issuer URL](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/setup_aws_cognito_issuer_url.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=302b9baea3e7d017f46a16ff31260ae5) Don't use the Cognito domain for the IdP URL. Cognito provides its discovery document at `https://cognito-idp.$REGION.amazonaws.com/$USER_POOL_ID`. Next, [Set up SSO in Weights & Biases](#set-up-sso-in-w%26b). **Okta** Follow this procedure to set up Okta as your IdP. At the end, you have a **Client ID** and **OIDC issuer URL** to use when you configure Weights & Biases. 1. Sign in to the [Okta Portal](https://login.okta.com/). 2. On the left side, select **Applications** and then **Applications** again. ![Okta Applications menu](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/okta_select_applications.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=e643af5b8e0d40fc7380f3c9f86ce080) 3. Click **Create App integration**. ![Create App integration button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/okta_create_new_app_integration.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=23f1a2ba321bdd292f79972ba0fd6830) 4. On the screen named **Create a new app integration**, select **OIDC - OpenID Connect** and **Single-Page Application**. Then click **Next**. ![OIDC Single-Page Application selection](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/okta_create_a_new_app_integration.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=05aa74721f03a1db34739cf63066b8fe) 5. On the screen named **New Single-Page App Integration**, complete the values as follows and click **Save**: * **App integration name**, for example `W&B`. * **Grant type**: Select both **Authorization Code** and **Implicit (hybrid)**. * **Sign-in redirect URIs**: `https://[YOUR-W-AND-B-URL]/oidc/callback`. * **Sign-out redirect URIs**: `https://[YOUR-W-AND-B-URL]/logout`. * **Assignments**: Select **Skip group assignment for now**. ![Single-Page App configuration](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/okta_new_single_page_app_integration.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=fd2da4993fa4410ef871937a7ff87a97) 6. On the overview screen of the Okta application you created, make note of the **Client ID** under **Client Credentials** under the **General** tab: ![Okta Client ID location](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/okta_make_note_of_client_id.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=86b93e5e0f6d1c9adb13ed4ad6a4ca19) 7. To identify the Okta **OIDC Issuer URL**, select **Settings** and then **Account** on the left side. The Okta UI shows the company name under **Organization Contact**. ![Okta organization settings](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/okta_identify_oidc_issuer_url.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=cc7acb003dc09c40eaf402529db90600) The OIDC issuer URL has the following format: `https://[COMPANY].okta.com`. Replace `[COMPANY]` with the corresponding value. Make note of it. Next, [Set up SSO in Weights & Biases](#set-up-sso-in-w%26b). **Entra** Azure AD (Entra ID) supports two OIDC configuration modes for Weights & Biases. Choose the configuration that matches your security requirements: * [Public client](#public-client): Uses PKCE without a client secret. Simpler to configure, suitable for most deployments. * [Confidential client](#confidential-client): Uses PKCE with a client secret. Required if you need to set the `GORILLA_OIDC_SECRET` environment variable. > [!WARNING] > > Don't mix configurations. If you select **Single-page application** in Azure AD, don't provide a client secret. If you need a client secret, you must select **Web** as the platform type. > **Public client** > > Use this configuration if you don't need to specify a client secret. It's suitable for deployments without advanced security requirements. > > 1. Sign in to the [Azure Portal](https://portal.azure.com/). > 2. Navigate to **Microsoft Entra ID** service and select **App registrations** from the left sidebar. > 3. Click **New registration** at the top of the page. > 4. On the **Register an application** screen, configure the following: > * **Name**: Enter a descriptive name. > * **Supported account types**: Keep the default **Single tenant** or modify as needed. > * **Redirect URI**: Select platform type **Single-page application** and enter `https://[YOUR-W-AND-B-URL]/oidc/callback`. > * Click **Register**. > 5. After registration, note the following values from the Overview page: > * **Application (client) ID**: Your OIDC Client ID. > * **Directory (tenant) ID**: Your OIDC Issuer URL. > ![Application and Directory IDs](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/entra_app_overview_make_note.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=6f612679b9f58a10263a9652e1ec6ca9) > 6. Configure authentication settings: > * Select **Authentication** from the left sidebar. > * Under **Front-channel logout URL**, enter `https://[YOUR-W-AND-B-URL]/logout`. > * Click **Save**. > > Make a note of the following details: > > * **OIDC Client ID**: The Application (client) ID from step 5. > * **OIDC Issuer URL**: `https://login.microsoftonline.com/[TENANT-ID]/v2.0` (replace `[TENANT-ID]` with your Directory ID from step 5). > > When configuring Weights & Biases, use: > > * **Auth Method**: `pkce`. > * **OIDC Client Secret**: Leave empty (don't set `GORILLA_OIDC_SECRET`). > > Next, [Set up SSO in Weights & Biases](#set-up-sso-in-w%26b). > **Confidential client** > > Use this configuration if you need to authenticate using a client secret. > > 1. Sign in to the [Azure Portal](https://portal.azure.com/). > 2. Navigate to **Microsoft Entra ID** service and select **App registrations** from the left sidebar. > 3. Click **New registration** at the top of the page. > 4. On the **Register an application** screen, configure the following: > * **Name**: Enter a descriptive name. > * **Supported account types**: Keep the default **Single tenant** or modify as needed. > * **Redirect URI**: Select platform type **Web** and enter `https://[YOUR-W-AND-B-URL]/oidc/callback`. > * Click **Register**. > 5. After registration, note the following values from the Overview page: > * **Application (client) ID**: Your OIDC Client ID. > * **Directory (tenant) ID**: Your OIDC Issuer URL. > ![Application and Directory IDs](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/entra_app_overview_make_note.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=6f612679b9f58a10263a9652e1ec6ca9) > 6. Configure authentication settings: > * Select **Authentication** from the left sidebar. > * Under **Front-channel logout URL**, enter `https://[YOUR-W-AND-B-URL]/logout`. > * Click **Save**. > 7. Create a client secret: > * Select **Certificates & secrets** from the left sidebar. > * Click **New client secret**. > * Add a description for the secret. > * Choose an expiration period. > * Click **Add**. \[!WARNING] Copy and save the secret **Value** immediately (not the Secret ID). > ![Client secret value](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/entra_make_note_of_secret_value.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=5698006cc84c519eca6382ed1a0baa36) > > Make a note of the following details: > > * **OIDC Client ID**: The Application (client) ID from step 5. > * **OIDC Client Secret**: The secret value from step 7. > * **OIDC Issuer URL**: `https://login.microsoftonline.com/[TENANT-ID]/v2.0` (replace `[TENANT-ID]` with your Directory ID from step 5). > > When configuring Weights & Biases, use: > > * **Auth Method**: `pkce`. > > * **OIDC Client Secret**: Set the `GORILLA_OIDC_SECRET` environment variable to the secret value from step 7. > > > [!NOTE] > > > > The v2.0 endpoint supports both personal Microsoft accounts and work/school accounts. If your organization requires the v1.0 endpoint, use `https://login.microsoftonline.com/[TENANT-ID]` instead. > > Next, [Set up SSO in Weights & Biases](#set-up-sso-in-w%26b). ## Set up SSO in Weights & Biases After you finish configuring your IdP, complete the following steps in Weights & Biases to connect the IdP and enable SSO for your instance. To set up SSO, you must have administrator privileges and the following information: * **OIDC Client ID**. * **OIDC Auth method** (`implicit` or `pkce`). * **OIDC Issuer URL**. * **OIDC Client Secret** (optional, depends on how you've set up your IdP). If your IdP requires an OIDC Client Secret, specify it by passing the [environment variables](/products/wandb/platform/hosting/env-vars) `GORILLA_OIDC_SECRET`: * In the W\&B App, go to **System Console** > **Settings** > **Advanced** > **User Spec** and add `GORILLA_OIDC_SECRET` to the `extraENV` section as shown in the following example. * In Helm, configure `values.global.extraEnv` as shown in the following example. ```yaml theme={"system"} values: global: extraEnv: GORILLA_OIDC_SECRET="[YOUR-SECRET]" ``` > [!NOTE] > > If you can't sign in to your instance after configuring SSO, you can restart the instance with the `LOCAL_RESTORE=true` environment variable set. This outputs a temporary password to the container's logs and disables SSO. After you resolve any issues with SSO, you must remove that environment variable to enable SSO again. **System Console** Use this tab if you deploy Weights & Biases with the W\&B Kubernetes Operator. The System Console is the successor to the System Settings page. It's available with the [W\&B Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator) based deployment. 1. Refer to [Access the W\&B Management Console](/products/wandb/platform/hosting/self-managed/operator#access-the-weights-&-biases-management-console). 2. Navigate to **Settings**, then **Authentication**. Select **OIDC** in the **Type** dropdown. ![System Console OIDC configuration](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/sso_configure_via_console.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=70a695ab0b5688022a624ee4c7bfced8) 3. Enter the values. 4. Click **Save**. 5. Sign out and then sign back in, this time using the IdP sign-in screen. ## Find your customer namespace Before you can configure team-level BYOB with CoreWeave storage on W\&B Dedicated Cloud or Self-Managed, you must obtain your organization's **Customer Namespace**. You can view and copy it from the bottom of the **Authentication** tab. For detailed instructions on configuring CoreWeave storage with your Customer Namespace, see [CoreWeave requirements for Dedicated Cloud or Self-Managed](/products/wandb/platform/hosting/data-security/secure-storage-connector#provision-your-bucket). **System settings** 1. Sign in to your Weights & Biases instance. 2. Navigate to the W\&B App. 3. Click your user profile icon. In the dropdown, select **System Settings**: ![System Settings dropdown](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/system_settings_select_settings.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=e7de9673604b0cc11f00272ad7003444) 4. Enter your **Issuer**, **Client ID**, and **Authentication Method**. 5. Select **Update settings**. ![Update settings button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/system_settings_select_update.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=5f6a620ecc4fe0c1e1ffa1252b832336) > [!NOTE] > > If you can't sign in to your instance after configuring SSO, you can restart the instance with the `LOCAL_RESTORE=true` environment variable set. This outputs a temporary password to the container's logs and disables SSO. After you resolve any issues with SSO, you must remove that environment variable to enable SSO again. ## Security Assertion Markup Language (SAML) Weights & Biases doesn't support SAML. # Manage bucket storage and costs Source: https://docs.coreweave.com/products/wandb/platform/hosting/managing-bucket-storage Learn how Weights & Biases uses object storage, how deletion affects bucket bytes, and how to reduce usage and costs. When you use [Bring your own bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector), [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), or [W\&B Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed), your team often pays cloud storage providers directly. This page explains what occupies your bucket, how Weights & Biases removes objects after deletion in the app or API, and what you should expect. Use it to understand bucket usage, plan cleanup, and set realistic expectations for when storage is reclaimed. This page is intended for organization administrators and operators who manage object storage for Self-Managed or Dedicated Cloud deployments. ## What uses bucket space Weights & Biases stores several categories of data in your configured object storage. The [BYOB overview](/products/wandb/platform/hosting/data-security/secure-storage-connector#data-stored-in-the-central-database-vs-buckets) lists examples, including experiment files and metrics, artifact files, media files, run files, and exported history in Parquet form. Together these drive bucket size and cost. ## How Weights & Biases removes data from storage Deletion in the W\&B App or [Public API](/products/wandb/ref/python/public-api/api) updates Weights & Biases metadata first. Removing a run, artifact, or file from the product doesn't guarantee an immediate drop in reported bucket usage. Object storage cleanup runs as background work that can lag, especially on busy instances. ### Artifacts Deleted artifacts are soft-deleted, then processed by artifact garbage collection. Self-managed deployments must set `GORILLA_ARTIFACT_GC_ENABLED` and meet provider requirements such as versioning or soft delete. See [Delete an artifact](/products/wandb/artifacts/delete-artifacts) and [Configure environment variables](/products/wandb/platform/hosting/env-vars). ### Run data and run files After runs or run-associated files are deleted, permanent removal of the underlying stored objects is controlled separately from artifacts. On Dedicated Cloud and Self-Managed deployments, `GORILLA_DATA_RETENTION_PERIOD` sets how long deleted run data is retained before it can be removed from storage. This setting does not delete artifacts. See [Configure environment variables](/products/wandb/platform/hosting/env-vars), [Data retention policy](/products/wandb/platform/hosting/hosting-options/dedicated-cloud#data-retention-policy) for Dedicated Cloud, and [Delete runs](/products/wandb/runs/delete-runs#when-deleted-run-data-is-removed-from-storage) for how run and file deletion relates to storage. ## What to expect from background cleanup Garbage collection and related jobs that free object storage run without timing guarantees. Weights & Biases does not guarantee that a given object disappears from your bucket within a specific time after you delete content in the UI or API. For projects with a large number of files per run, such as when logging many media files per run, expect longer delays before storage usage is released. Monitor your bucket in your cloud provider and contact [Support](mailto:forge-support@coreweave.com) or your account team if cleanup appears stuck. ## Reduce bucket usage This section describes the recommended order of operations for freeing space in your bucket, starting with safe product flows and ending with direct bucket operations that require more care. Use supported product flows first: * [Delete runs in the W\&B App](/products/wandb/runs/delete-runs#ui) or [with Python](/products/wandb/runs/delete-runs#python) when you no longer need them. * [Delete artifacts](/products/wandb/artifacts/delete-artifacts) you no longer need, and use [Artifact TTL](/products/wandb/artifacts/ttl) where it fits your workflow. If you must reclaim space immediately, operators with access to the bucket may delete specific object keys directly in cloud storage. > [!WARNING] > > Deleting object keys directly in your bucket bypasses Weights & Biases and can cause data loss or break access for the app. Review the following before you proceed: > > * Objects you remove are **no longer available to download** through Weights & Biases. > * You should delete **only** keys you intend to remove. Incorrect deletes can break access to data the app still references. > * If your bucket uses **object versioning** or **provider soft delete** (for example on Google Cloud Storage), storage charges can persist until non-current versions or soft-deleted objects expire under your cloud lifecycle rules. For high-level usage in W\&B Multi-tenant Cloud, organization admins can review storage-related usage from organization settings. See [Billing settings](/products/wandb/platform/app/settings-page/billing-settings). ## Troubleshooting If deletions don't appear correctly in the W\&B App after you use the Public API, upgrade the W\&B Python SDK to a current release and retry. Large per-run file counts can increase how long background cleanup takes across the instance. For scripted cleanup patterns that match your deployment, contact [Support](mailto:forge-support@coreweave.com) or your account team. ## Related documentation For more information, see the following resources: * [Delete runs](/products/wandb/runs/delete-runs#delete-runs) * [Delete an artifact](/products/wandb/artifacts/delete-artifacts) * [Configure environment variables](/products/wandb/platform/hosting/env-vars) * [Bring your own bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector) # Track user activity with audit logs Source: https://docs.coreweave.com/products/wandb/platform/hosting/monitoring-usage/audit-logging Fetch and analyze Weights & Biases audit logs across deployment types, including the log schema and tracked actions. Use Weights & Biases audit logs to track user activity within your organization and to conform to your enterprise governance requirements. This page is for organization-level admins who need to access, fetch, and analyze audit log data across Weights & Biases deployment types. Audit logs are available in JSON format. Refer to [Audit log schema](#audit-log-schema). How you access audit logs depends on your Weights & Biases platform deployment type: | W\&B Platform deployment type | Audit logs access mechanism | | - | - | | [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) |
  • [Instance-level BYOB](/products/wandb/platform/hosting/data-security/secure-storage-connector): Synced to instance-level bucket (BYOB) every 10 minutes. Also available with [the API](#fetch-audit-logs).
  • Default instance-level storage: Available only with [the API](#fetch-audit-logs).
| | [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) | Available for Enterprise plans only. Available only with [the API](#fetch-audit-logs). | | [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) | Synced to instance-level bucket every 10 minutes. Also available with [the API](#fetch-audit-logs). | After you fetch audit logs, you can analyze them with tools like [Pandas](https://pandas.pydata.org/docs/index.html), [Amazon Redshift](https://aws.amazon.com/redshift/), [Google BigQuery](https://cloud.google.com/bigquery), or [Microsoft Fabric](https://www.microsoft.com/microsoft-fabric). Some audit log analysis tools don't support JSON. Refer to the documentation for your analysis tool for guidelines and requirements to transform the JSON-formatted audit logs before analysis. For more details about the format of the logs, see [Audit log schema](#audit-log-schema) and [Actions](#actions). ## Audit log retention The following recommendations help you retain audit logs to meet your organization's governance and compliance obligations: * If you must retain audit logs for a specific period of time, Weights & Biases recommends periodically transferring logs to long-term storage, either with storage buckets or the Audit Logging API. * If you are subject to the [Health Insurance Portability and Accountability Act of 1996 (HIPAA)](https://hhs.gov/hipaa/for-professionals/index.html), you must retain audit logs for a minimum of 6 years in an environment where no internal or external actor can delete or modify them before the end of the mandatory retention period. For HIPAA-compliant [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) instances with [BYOB](/products/wandb/platform/hosting/data-security/secure-storage-connector), you must configure guardrails for your managed storage, including any long-term retention storage. ## Audit log schema Use this schema to interpret the fields returned in each audit log entry. The following table shows all keys that can appear in an audit log entry, ordered alphabetically. Depending on the action and the circumstances, a specific log entry may include only a subset of the possible fields. | Key | Definition | | - | - | | `action` | The [action](#actions) of the event. | | `actor_email` | The email address of the user that initiated the action, if applicable. | | `actor_ip` | The IP address of the user that initiated the action. | | `actor_user_id` | The ID of the logged-in user who performed the action, if applicable. | | `artifact_asset` | The artifact ID associated with the action, if applicable. | | `artifact_digest` | The artifact digest associated with the action, if applicable. | | `artifact_qualified_name` | The full name of the artifact associated with the action, if applicable. | | `artifact_sequence_asset` | The artifact sequence ID associated with the action, if applicable. | | `cli_version` | The version of the Python SDK that initiated the action, if applicable. | | `entity_asset` | The entity or team ID associated with the action, if applicable. | | `entity_name` | The entity or team name associated with the action, if applicable. | | `project_asset` | The project associated with the action, if applicable. | | `project_name` | The name of the project associated with the action, if applicable. | | `report_asset` | The report ID associated with the action, if applicable. | | `report_name` | The name of the report associated with the action, if applicable. | | `response_code` | The HTTP response code for the action, if applicable. | | `run_asset` | The run asset associated with the action, if applicable. | | `run_id` | The ID of the run associated with the action, if applicable. | | `run_name` | The name of the run associated with the action, if applicable. | | `run_path` | The full path of the run associated with the action, in the format `entity/project/run_id`, if applicable. | | `timestamp` | The time of the event in [RFC3339 format](https://www.rfc-editor.org/rfc/rfc3339). For example, `2023-01-23T12:34:56Z` represents January 23, 2023 at 12:34:56 UTC. | | `user_asset` | The user asset the action impacts (rather than the user performing the action), if applicable. | | `user_email` | The email address of the user the action impacts (rather than the email address of the user performing the action), if applicable. | As of W\&B Server v0.85.1, an audit log entry for the single-run `run:delete` action includes fields that identify the deleted run: `run_id`, `run_name`, `run_path`, `entity_name`, and `run_asset`. Previously, `run:delete` entries included only project-level and actor-level fields. Entries for the bulk `run:delete_many` action do not include per-run identifiers. ### Personally identifiable information (PII) Personally identifiable information (PII), such as email addresses and the names of projects, teams, and reports, is available only with the API endpoint option: * For [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) and [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), an organization admin can [exclude PII](#exclude-pii) when fetching audit logs. * For [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), the API endpoint always returns relevant fields for audit logs, including PII. This isn't configurable. ## Before you begin Before you fetch audit logs, confirm that you meet the following prerequisites for your deployment type: * Organization-level admins can fetch audit logs. If you receive a `403` error, ensure that you or your service account has adequate permission. * **Multi-tenant Cloud**: If you're a member of multiple Multi-tenant Cloud organizations, you must configure the **Default API organization**, which determines where audit logging API calls are routed. Otherwise, you receive the following error: ```text theme={"system"} user is associated with multiple organizations but no valid org ID found in user info ``` To specify your default API organization: 1. Click the account selector in the upper-right corner, then click **User settings**. 2. For **Default API organization**, select an organization. This doesn't apply to a service account, which can be a member of only one Multi-tenant Cloud organization. ## Fetch audit logs Use the W\&B Audit Logging API to retrieve audit logs. The endpoint, query parameters, and response format depend on your deployment type. **Multi-tenant Cloud** Use this tab for [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud). Multi-tenant audit logs are available only for Enterprise plans. The Audit Logging API endpoint is: ```text theme={"system"} https://api.wandb.ai/audit_logs ``` The following query parameters are supported: * `startDate`: The first UTC calendar day in the date range. Use `YYYY-MM-DD` format. If you omit `startDate`, the range starts at midnight UTC today, or `numDays` days before today if you set `numDays`. * `numDays`: An integer from `0` through `7`. Weights & Biases fetches logs from `startDate` through the next `numDays` days. If you omit `numDays` or set it to `0`, Weights & Biases fetches logs for one day. * `limit`: The maximum number of audit log entries to return. Use a positive integer up to `1,000,000`. The default is `1,000,000`. * `cursor`: An opaque cursor from the previous response's `next_cursor` field. Reuse the cursor with the same resolved date range. The Multi-tenant Cloud endpoint always returns relevant fields for audit logs, including PII. This isn't configurable. The response is a JSON object with the following fields: * `audit_logs`: An array of audit log entries. Each entry includes the fields described in [Audit log schema](#audit-log-schema). * `range_start_time`: The start of the resolved date range, in UTC. * `range_end_time`: The exclusive end of the resolved date range, in UTC. * `count`: The number of audit log entries returned in this response. * `next_cursor`: An opaque cursor for the next page of results. If this field is `null`, there are no more results for the selected date range. In the following examples, replace: * `[BASE64-USERNAME-API-KEY]`: the base64-encoded string in the format `[USERNAME]:[API-KEY]`. * `[NEXT-CURSOR]`: the `next_cursor` value from the previous response. To fetch audit logs for a range, run: ```bash theme={"system"} curl -H "Authorization: Basic [BASE64-USERNAME-API-KEY]" \ "https://api.wandb.ai/audit_logs?startDate=2026-08-01&numDays=2&limit=1000" ``` The response resembles the following example: ```json theme={"system"} { "audit_logs": [ { "action": "project:read", "actor_email": "admin@example.com", ... "timestamp": "2026-08-01T13:12:14Z" } ], "range_start_time": "2026-08-01T00:00:00Z", "range_end_time": "2026-08-04T00:00:00Z", "count": 1, "next_cursor": "eyJyb3dfa2V5Ijoi..." } ``` To fetch the next page, repeat the request with the same resolved date range. Set `cursor` to the `next_cursor` value from the previous response. Continue until `next_cursor` is `null`. ```bash theme={"system"} curl -H "Authorization: Basic [BASE64-USERNAME-API-KEY]" \ "https://api.wandb.ai/audit_logs?startDate=2026-08-01&numDays=2&limit=1000&cursor=[NEXT-CURSOR]" ``` 1: On [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), audit logs are not collected for: * Open or Public projects. * The `report:read` action. * `User` actions that aren't tied to a specific organization. **Dedicated Cloud and Self-Managed** Use this tab for [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) instances. The Audit Logging API endpoint uses your instance URL: * Dedicated Cloud: `https://[INSTANCE-NAME].wandb.io/admin/audit_logs`. * Self-Managed: `https://[WANDB-PLATFORM-URL]/admin/audit_logs`. In the following examples, replace: * `[INSTANCE-NAME]`: your Dedicated Cloud instance name. * `[WANDB-PLATFORM-URL]`: the URL of your Self-Managed instance. * `[API-ENDPOINT]`: the endpoint for your instance. * `[BASE64-USERNAME-API-KEY]`: the base64-encoded string in the format `[USERNAME]:[API-KEY]`. * `[NEXT-CURSOR]`: the `next_cursor` value from the previous response. The following query parameters are supported: * `anonymize`: If the URL includes `anonymize=true`, Weights & Biases does not add PII fields to the audit logs. Otherwise, PII is included. For more information, see [Exclude PII when fetching audit logs](#exclude-pii). * `startDate`: The inclusive start of the date range, in UTC. Supported formats are `YYYY-MM-DD`, `YYYY-MM-DDTHH`, `YYYY-MM-DDTHH:mm`, and `YYYY-MM-DDTHH:mm:ss`. Missing time parts default to zero. For example, `2026-08-03T01` means `2026-08-03T01:00:00Z`. If you omit `startDate`, the range starts at midnight UTC today, or `numDays` days before today if you set `numDays`. * `numDays`: A non-negative integer. Weights & Biases fetches logs from `startDate` through the next `numDays` days. If you omit `numDays` or set it to `0`, Weights & Biases fetches logs for the `startDate` day only. You can't use `numDays` with `endDate`. * `endDate`: The exclusive end of the date range, in UTC. The supported formats match `startDate`. Setting `endDate` returns a paginated JSON response, even if you don't set `limit`. You can't use `endDate` with `numDays`. * `limit`: The maximum number of audit log entries to return in a paginated response. Use a positive integer up to `20,000`. If you set `limit`, Weights & Biases returns a paginated JSON response. In paginated requests, the default is `20,000`. * `cursor`: An opaque cursor from the previous response's `next_cursor` field. Reuse the cursor with the same resolved date range and `anonymize` value. If you set `cursor`, you must also set `limit` or `endDate`. If you don't set `limit` or `endDate`, the API preserves the original streaming response format. The response contains newline-separated JSON objects. Each object includes the fields described in [Audit log schema](#audit-log-schema), the same as logs synced to an instance-level bucket. To fetch a streaming newline-separated JSON response for a three-day range and exclude PII, run: ```bash theme={"system"} curl -H "Authorization: Basic [BASE64-USERNAME-API-KEY]" \ "[API-ENDPOINT]?startDate=2026-08-01&numDays=2&anonymize=true" ``` If you set `limit` or `endDate`, the API returns a JSON object with the following fields: * `audit_logs`: An array of audit log entries. Each entry includes the fields described in [Audit log schema](#audit-log-schema). * `range_start_time`: The start of the resolved date range, in UTC. * `range_end_time`: The exclusive end of the resolved date range, in UTC. * `count`: The number of audit log entries returned in this response. * `next_cursor`: An opaque cursor for the next page of results. If this field is `null`, there are no more results for the selected date range. To fetch a paginated response for a two-hour range, run: ```bash theme={"system"} curl -H "Authorization: Basic [BASE64-USERNAME-API-KEY]" \ "[API-ENDPOINT]?startDate=2026-08-01T13:00&endDate=2026-08-01T15:00&limit=1000" ``` The response resembles the following example: ```json theme={"system"} { "audit_logs": [ { "action": "project:read", "actor_email": "admin@example.com", ... "timestamp": "2026-08-01T14:00:00Z", } ], "range_start_time": "2026-08-01T13:00:00Z", "range_end_time": "2026-08-01T15:00:00Z", "count": 1, "next_cursor": "eyJ2ZXJzaW9uIjox..." } ``` To fetch the next page, repeat the request with the same resolved date range and `anonymize` value. Set `cursor` to the `next_cursor` value from the previous response. Continue until `next_cursor` is `null`. ```bash theme={"system"} curl -H "Authorization: Basic [BASE64-USERNAME-API-KEY]" \ "[API-ENDPOINT]?startDate=2026-08-01T13:00&endDate=2026-08-01T15:00&limit=1000&cursor=[NEXT-CURSOR]" ``` ### Exclude PII when fetching audit logs For [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) and [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud), a Weights & Biases organization or instance admin can exclude PII when fetching audit logs. For [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), the API endpoint always returns relevant fields for audit logs, including PII. This isn't configurable. To exclude PII, pass the `anonymize=true` URL parameter. For example, to get audit logs for user activity within the last week and exclude PII, if your Weights & Biases instance URL is `https://mycompany.wandb.io`, use an API endpoint like: ```text theme={"system"} https://mycompany.wandb.io/admin/audit_logs?anonymize=true&[ADDITIONAL-PARAMETERS]. ``` ### Use basic authentication You must authenticate each request to the audit logs API. To use basic authentication with your API key to access the audit logs API, set the HTTP request's `Authorization` header to the string `Basic` followed by a space, then the base64-encoded string in the format `[USERNAME]:[API-KEY]`. In other words, replace the username and API key with your values separated with a `:` character, then base64-encode the result. For example, to authorize as `demo:p@55w0rd`, set the header to `Authorization: Basic ZGVtbzpwQDU1dzByZA==`. ## Actions Each audit log entry records one of the following actions. Use this reference to interpret the `action` field in a log entry. The following table describes possible actions that Weights & Biases can record, sorted alphabetically. | Action | Definition | | - | - | | `artifact:create` | Artifact is created. | | `artifact:delete` | Artifact is deleted. | | `artifact:read` | Artifact is read. | | `project:delete` | Project is deleted. | | `organization:update_member` | Member's organization role or seat is updated. | | `project:read` | Project is read. | | `report:read` | Report is read. [1](#1) | | `run:delete_many` | Batch of runs is deleted. | | `run:delete` | Run is deleted. | | `run:stop` | Run is stopped. | | `run:undelete_many` | Batch of runs is restored from trash. | | `run:update_many` | Batch of runs is updated. | | `run:update` | Run is updated. | | `sweep:create_agent` | Sweep agent is created. | | `team:create_service_account` | Service account is created for the team. | | `team:create` | Team is created. | | `team:delete` | Team is deleted. | | `team:invite_user` | User is invited to team. | | `team:uninvite` | User or service account is uninvited from team. | | `user:create_api_key` | API key for the user or service account is created. [1](#1) | | `user:create` | User is created. [1](#1) | | `user:deactivate` | User is deactivated. [1](#1) | | `user:delete_api_key` | API key for the user or service account is deleted. [1](#1) | | `user:initiate_login` | User initiates log in. [1](#1) | | `user:login` | User logs in. [1](#1) | | `user:logout` | User logs out. [1](#1) | | `user:permanently_delete` | User is permanently deleted. [1](#1) | | `user:reactivate` | User is reactivated. [1](#1) | | `user:read` | User profile is read. [1](#1) | | `user:update` | User is updated. [1](#1) | # W&B Mobile App (iOS) Source: https://docs.coreweave.com/products/wandb/platform/hosting/monitoring-usage/mobile-app Explore Weights & Biases projects, training runs, console logs, line plots, and system metrics on your iPhone or iPad. > [!NOTE] > > Latest version: 26.31 (released October 26, 2026). [App Store release notes](https://apps.apple.com/us/app/6755162576). ![W\&B mobile app project panel with metric charts](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/project-panels.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=90a36835df6d77b96e87db70b738db93) ![ARIA tab and chat interface in the W\&B iOS app](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/aria-chat.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a6b738df14e0244277ff75c8cc113700) ![W\&B mobile app Projects list and team picker](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/projects.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=953404f638b852ff7e901d51b6e540cb) ![W\&B mobile app runs list for a project](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/project-runs.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bf46b1c3a24f247a1a1689d62da66272) The W\&B Mobile App for iOS keeps you connected to your Weights & Biases projects wherever you go. Use it on your iPhone or iPad to track training runs and read run logs in real time, view line plots and system metrics, explore project histories, and follow your team's progress so you can monitor experiments without opening your laptop. This page describes the app's features and shows you how to set up notifications. > [!NOTE] > > The mobile app is available for [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) accounts, and in preview for [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) accounts, by invitation only. To request access for your organization, contact [support](mailto:forge-support@coreweave.com) or your AISE. The mobile app isn't available for [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed) deployments. ## Download W\&B Mobile Install the app from the App Store to get started. > **[Download on the App Store](https://apps.apple.com/us/app/6755162576)** ## Log in Follow these steps to sign in to Weights & Biases on iOS. How you log in depends on the deployment your Weights & Biases account belongs to. Select your deployment type to continue. **Multi-tenant Cloud** > [!TIP] > > You can't create a Weights & Biases account from the mobile app. Visit [Forge](https://forge.coreweave.com/wandb) on a desktop browser and click **Sign up**. To log in, follow these steps: 1. Open the app, then tap **Log in**. 2. Log in with the same credentials you use for Forge in your browser. Multi-tenant Cloud doesn't use login codes, so the **Log in on mobile** menu item doesn't appear in Weights & Biases. **Dedicated Cloud** > [!TIP] > > Access to W\&B Dedicated Cloud from a mobile device is available in preview by invitation only. To authenticate to a Dedicated Cloud instance, generate a code in W\&B App on your computer, then scan it with your mobile device. Have both devices available before you begin. 1. On your computer, sign in to Forge. 2. Select your profile image in the upper-right corner, then select **Log in on mobile**. If this option is unavailable, your organization is not enrolled in the preview. To request access for your organization, contact [support](mailto:forge-support@coreweave.com) or your AISE. 3. In the **Log in on mobile** dialog, click **Generate login code**. Weights & Biases displays the login code as a QR code and adds an API key named **W\&B iOS** to your [user settings](/products/wandb/platform/app/settings-page/user-settings#api-keys). If Weights & Biases can't generate a key, an error appears in the dialog. If your organization restricts who can create API keys, ask your organization admin for help. 4. On your iPhone or iPad, open the app, then tap **Log in to Dedicated Cloud**. If prompted, allow the app to use your camera. 5. Point your device's camera at the QR code. The app logs you in to your Dedicated Cloud instance and closes the scanner. 6. On your computer, click **Done** to close the dialog. > [!WARNING] > > Treat a login code as sensitive information because it grants access to your Weights & Biases account. Protect it the same way you protect an API key or password. Don't take a screenshot of the code, save it, or share it. Close the dialog when you finish logging in. If a code might have been exposed, [delete the API key](/products/wandb/platform/app/settings-page/user-settings#delete-an-api-key) immediately, then generate a new login code. Keep the following in mind when you log in to Dedicated Cloud: * Each login code you generate adds another **W\&B iOS** API key to your user settings, each with its own key ID. Because the keys share a name, rename a key to differentiate it, such as by including which device uses it. In your user settings, open the key's **action ()** menu, then click **Edit**. * A **W\&B iOS** key stays valid until you delete it. Deleting a key revokes access for the device that scanned the matching login code. * Logging in to Dedicated Cloud replaces the credentials of any account you were previously logged in to. * If you don't see **Log in to Dedicated Cloud** in the app, then confirm that your organization has access to the preview. ## Features The following sections describe the features available in the mobile app. ### Projects and teams Browse your projects and switch between teams. The app offers the following project features: * **Explore projects**: Browse and search across your Weights & Biases projects. * **Full project history**: Metric charts on project panels include data from the latest ten runs in the project, not only the latest run. * **Star projects**: See your most important projects at a glance. Tap the star icon next to a project to star it. To filter the list to only starred projects, tap the **Starred** tab at the top of the list. * **Switch teams**: Use the **team picker** to change teams. ### Runs View run status, metrics, and line plots for your experiments in real time. The app offers the following run features: * **Hide and show runs**: On a project's **Runs** tab, tap the **visibility ()** icon on a run to hide it. Hidden runs stay in the runs list with a **hidden ()** icon, so you can tap the icon again to show the run. Charts on the project's **Panels** tab plot only the runs that are visible. The app remembers which runs you hid in each project between launches. * **Live updates**: Charts refresh as new data arrives. The **Runs** tab and project run lists update automatically when new runs start. * **Run overview tab**: On each run, open the **Overview** tab for a dedicated summary of run details alongside metrics and logs. View the full run configuration and summary, including nested objects and arrays. Long config values wrap to multiple lines. Long-press a configuration value to copy it. * **View system metrics**: On each run, open the **Metrics** tab to see how your hardware behaved during training. Weights & Biases automatically logs [metrics](/products/wandb/ref/python/experiments/system-metrics) such as GPU utilization, CPU usage, memory, disk I/O, and network traffic. System metrics appear in a collapsible **System** section alongside your logged metrics. Each metric displays as a line chart with the same tooltip and search behavior as other metrics on the tab. * **Stop runs**: When viewing an in-progress run, tap the **action ()** menu, then tap **Stop run**. * **View console logs**: Read [logs](/products/wandb/runs/view-logged-runs#logs) from active or completed runs, or download them once a run finishes. Colors from ANSI escape codes in your script output render faithfully and adapt to light and dark mode. The app polls active runs for new log lines every 5 seconds. Polling stops once a run finishes or crashes, which saves network and battery use. Even for runs with hundreds of thousands of log lines, the most recent output appears immediately, and older lines load in the background. Scrolling and log search stay responsive even for large outputs. ### Panels and metrics Organize and find the panels and metrics that matter to you. The app offers the following panel and metric features: * **Mobile-optimized panel grouping**: Panels are automatically grouped by name into collapsible sections. You can collapse the ungrouped metrics section to focus on named sections. Sections are a single level (not nested), and grouping follows the same rules as [workspace panels](/products/wandb/app/features/panels) in the W\&B web app, so the layout stays consistent when you move between desktop and your phone. * **Star panels**: See your most important panels at a glance. When viewing a run or a project, tap the star icon at the top of a panel to star it. To filter the list to only starred panels, tap the **Starred** tab at the top of the list. * **Star metrics**: When viewing an important metric in detail view, tap the star icon to star it. Run cards on the **Runs** page prioritize your starred metrics when choosing which metric to display. * **Search panels**: When viewing a run or a project, use the **panel search** field at the bottom of the screen to filter which runs appear in each chart. You can search with [RE2 syntax](https://github.com/google/re2/wiki/Syntax) to match patterns in run names. * **Filter metrics**: Use the metric filter controls to narrow which metrics appear, so you can focus on the ones that matter. * **View image metrics**: Images you log appear as panels you can interact with, on a run's **Metrics** tab and on a project's **Panels** tab. Tap to view a single image, then pinch to zoom or drag to pan. See [View image metrics](#view-image-metrics). ### Charts Read and adjust the charts that plot your metrics. The app offers the following chart features: * **Full fidelity**: When a chart has more data points than it can render, the app buckets the data and draws a shaded band around the line showing the minimum and maximum value in each bucket, so you can spot variance at a glance. This is the same [full fidelity](/products/wandb/app/features/panels/line-plot/sampling#full-fidelity) rendering used in the W\&B web app. Turn on **Show bin range in tooltip** (see [Change line plot settings](#change-line-plot-settings)) to see a bucket's full range when you tap a point. * **Chart tooltips**: On line charts, tooltips show metric values with up to four decimal places so you can read small changes accurately. * **Zoom charts**: Pinch vertically or horizontally on a line chart to zoom in on either axis, or double-tap to step through zoom levels. The Y-axis rescales automatically to fit the visible portion of the curve, so small variations late in a run stay readable. * **Chart detail view**: Tap a metric card to open its chart in a fullscreen detail view. A legend under the title lists each line in the chart, and the Y-axis uses evenly spaced ticks so values are easy to read. * **Change line plot settings**: Choose the X-axis, switch a line plot to a logarithmic Y-axis, apply smoothing, and exclude outliers, for a single plot or for every plot in a run or project. See [Change line plot settings](#change-line-plot-settings). ### Notifications and ARIA Stay on top of your experiments and get help from ARIA. The app offers the following features: * **Stay informed**: Get updates on your experiments without opening your laptop using notifications. **Remove alerts** you no longer need from the **Notifications** tab by swiping them away. Tap a run state change push notification to open the run it refers to. * **Chat with ARIA**: Use ARIA in the mobile app to ask questions, analyze runs, and take action without leaving your phone. ## View image metrics Images you log to a run with [`wandb.Image`](/products/wandb/track/log/media) appear on the run's **Metrics** tab, where each image metric has its own panel alongside your line plots. Image metrics also appear on a project's **Panels** tab, where each panel shows one tile per run so you can compare images across runs. The following actions are available for image metrics. * **Scrub through steps**: Drag the step slider below the images to move through the steps the metric logged. When the metric logged only one step, the slider doesn't appear. * **Jump to a step**: Tap the step value next to the slider, enter a step, then tap **Go to step**. The sheet shows the range of steps the metric logged, and your entry snaps to the nearest logged step. * **Compare images within a step**: When a step logs more than one image, the panel arranges them in a grid that you swipe horizontally to page through. Dots below the grid show which page you're viewing. * **Compare images across runs**: On a project's **Panels** tab, drag the step slider to move every run's tile to the same step. When a run logs more than one image per step, use the sample picker in the panel header (for example, **Sample #1**) to choose which image the tiles show. Tap a run's tile to open the image metric detail view for that run. * **View an image full screen**: Tap the panel to open the detail view, then tap an image. Pinch to zoom and drag to pan, and swipe to move to the next or previous image in the step. * **Read image captions**: Captions you log with an image appear on the detail view and in the full-screen viewer. Tap a long caption to expand it into a scrollable panel. * **Star image metrics**: Tap the star icon on the panel to star an image metric, the same as other panels. ## Change line plot settings Line plot settings control how the app draws a line plot. Open the settings in one of the following ways: * On a run's **Metrics** tab or a project's **Panels** tab, tap the **line plot settings** button next to the metric filter. Changes apply to every line plot in that run or project. * On a single chart's detail screen, tap the **line plot settings** button in the toolbar. Changes apply only to that plot. The settings sheet names its scope below the title, so you can confirm what a change affects before you make it. The following settings are available. * **X-axis**: Choose what the X-axis plots. Select a built-in axis (**Step**, **Relative time** (process runtime), or **Wall time**) or any other numeric metric your runs log. To find a metric, enter its name in the **Search X axis** field. * **Log scale (Y)**: Draw the Y-axis logarithmically to compare a metric across orders of magnitude. A logarithmic axis can't plot zero or negative values. If a plot has no positive values to draw, the app replaces the chart with the message "No positive values to plot on a log scale". * **Smoothing**: Apply [time-weighted exponential moving average (TWEMA)](/products/wandb/app/features/panels/line-plot/smoothing#time-weighted-exponential-moving-average-twema-smoothing-default) smoothing, from `0` (off) to `0.99`. This algorithm is also the default in the W\&B web app. * **Exclude outliers**: Frame the Y-axis to the lines alone, so a wide bin range can't flatten them. While on, the chart doesn't draw the shaded min-max band. Off by default. * **Show bin range in tooltip**: Show the min and max values a bucket hides when you tap a point on a chart rendered with [full fidelity](#features). Off by default, matching the W\&B web app. When you open the settings for a run or a project, a caption under a setting shows how many plots in scope override it, for example "2 panels override this." Tap **Clear** to remove those overrides for that one setting, so the run or project value applies to those plots again. To restore the defaults, tap **Reset this line plot** or **Reset to defaults**, depending on the scope you opened the settings from. The app saves your line plot settings between launches. When you change a setting on one plot, that setting also applies to plots of the same metric in your other runs and projects. ## Chat with ARIA ARIA (AI Research & Iteration Agent) is your personalized research assistant in Weights & Biases. Use ARIA for tasks such as analyzing and running experiments, explaining results, identifying patterns across runs, recommending next steps, and building visualizations and reports. To chat with ARIA, tap ![ARIA icon](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/aria-logo.svg?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=fa4501c0e6152282a6862e80fc93dd5c) in the bottom navigation. In the mobile app, ARIA keeps context across multi-turn chats and shows reasoning and action details while it works. * **Project context**: ARIA automatically detects which project you're viewing in the app and uses it as context, so answers come with the right project already in mind. You can also reference projects and runs directly in your chat messages. * **In-chat panels**: When ARIA shares a Weights & Biases panel, it appears in the conversation as a native bar chart or run history line plot, drawn from your live run data. * **Rich replies**: Replies stream in as ARIA writes them and render with rich Markdown formatting, including tables, headings, lists, and inline code. When ARIA asks questions, they render as an interactive view directly in the conversation. * **Visible actions**: Shell steps show when ARIA takes an action, such as creating a panel, filtering runs, creating and running Python scripts, and more. * **Approve network access requests**: When a task needs to reach a website, such as downloading a dataset, ARIA asks for permission directly in the conversation. The request shows ARIA's reason and the sites it wants to reach, and you can deselect any site before you grant or deny access, so tasks that need the network can continue from your phone. Past requests stay in the conversation as a summary you can expand. * **Message drafts**: ARIA saves your unsent message, including any run mentions, so your draft is still there when you reopen ARIA. * **Dismiss the keyboard**: Tap blank space or response text in a conversation to dismiss the keyboard. * **Chat history**: Long-press a chat in your chat history to preview, rename, or delete it. Conversations older than 30 days are grouped by month. Tap the pin icon on a chat to keep it in the **Pinned** section at the top of your history. Chat history is kept in sync so you can move seamlessly between the web app and mobile app. ![ARIA tab and chat interface in the W\&B iOS app](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/aria-chat.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a6b738df14e0244277ff75c8cc113700) For a full overview of ARIA capabilities, see [ARIA overview](/products/aria). ## Set up notifications Configure notifications to receive updates about your experiments on your mobile device. ![W\&B mobile app Manage notifications screen](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/manage-alerts.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=7d3aa3f230a22b5b120fae427e488fb9) The following sections describe the kinds of notifications you can configure. The **Manage notifications** screen lists both kinds of settings in one place, with short descriptions that explain what each section controls. ### Metric threshold alerts Use metric threshold alerts to get notified when a metric crosses a value you specify. 1. Navigate to a run. 2. Tap the graph to enter full screen view. 3. Tap the bell icon in the top right. 4. Set notifications that trigger when future runs cross the specified metric threshold. ### Run failure alerts Use run failure alerts to get notified when runs in a project fail. 1. Navigate to a project. 2. Tap the **action ()** menu in the top right. 3. Select **Run failed alert** to receive notifications for future run failures in that project. # View organization activity Source: https://docs.coreweave.com/products/wandb/platform/hosting/monitoring-usage/org_dashboard View user status, activity, and usage trends in the organization dashboard across deployment types. This page describes how to view activity in your organization, including user status, activity trends over time, and how to export user details as a CSV. Organization admins use this information to audit access, monitor adoption, and report on usage. Select your deployment type in each section to continue. ## View user status and activity The following procedure shows how to open the dashboard that lists every user in your organization and interpret each user's status. **Multi-tenant Cloud** 1. In the upper right corner of the header, open your account menu, then select **Users**. The table lists every user in your organization. 2. Click the **Last Active** column header to sort by user status. Each user's status is one of the following: * **A timestamp**: The user has signed in at least once. The timestamp indicates the most recent activity. * **No status (hyphen)**: The user hasn't yet been active within the organization. A user is *active* if they perform any auditable action scoped to the organization after May 8, 2025. For a full list, see [Actions](/products/wandb/platform/hosting/monitoring-usage/audit-logging#actions) in **Audit logging**. **Dedicated Cloud and Self-Managed** 1. Navigate to the **Organization Dashboard**: * **Dedicated Cloud**: `https://[ORG-NAME].io/org/dashboard/`. Replace `[ORG-NAME]` with your organization name. * **Self-Managed**: `https://[YOUR-W&B-SERVER-IP]/org/dashboard`. Replace `[YOUR-W&B-SERVER-IP]` with your deployment's IP address. The **Users** tab opens by default and lists every user in the organization. 2. To sort the list by user status, click the **Last Active** column header. Each user's status is one of the following: * **Invite pending**: An invitation was sent but not yet accepted. * **A timestamp**: The user accepted the invitation and has signed in at least once. The timestamp indicates the most recent activity. * **Deactivated**: An admin revoked the user's access. * **No status (hyphen)**: The user was previously active but hasn't been active in the last six months. 3. Hover over a user's **Last Active** field to see the date you added the user and their total active days. A user is *active* if they do any of the following: * Log in to Forge. * Open any page in the W\&B App. * Log runs. * Use the SDK to track an experiment. * Interact with the Weights & Biases server in any way. ## View activity over time After you understand individual user status, use the activity views to track how usage in your organization changes over time. **Multi-tenant Cloud** Use the **Activity Dashboard** to view aggregate activity. 1. Click your user icon in the upper-right corner of the W\&B App. 2. Under **Account**, click **Users**. 3. Above the table of users, review the Activity Panel: * **Active user count**: Unique active users during the selected period (defaults to 3 months). * **Weekly active users**: Users active per week. * **Most active user**: Top-10 users ranked by active days and last-active date. 4. To change the date range, click the date picker in the upper-right corner and choose a new value: **7 days**, **30 days** (the default), **90 days**, **6 months**, or **12 months**. All plots update automatically. **Dedicated Cloud and Self-Managed** Use the **Activity** tab to see how many users have been active during a given period. 1. Open the **Organization Dashboard**. See [View user status and activity](#view-user-status-and-activity). 2. Click **Activity**. 3. Review the following plots: * **Total active users**: Unique active users during the selected period (defaults to 3 months). * **Users active over time**: Fluctuation of active users over the period (defaults to 6 months). Hover over a point to see the exact count on that date. To change the reporting period, use the drop-down above a plot. Options are **Last 30 days**, **Last 3 months**, **Last 6 months**, **Last 12 months**, and **All time**. ## Export user details When you need to share user details outside the dashboard or analyze them in another tool, export the user list as a CSV. From the **Users** tab you can download a CSV that lists each user's details (username, email address, last-active time, roles, and more). **Multi-tenant Cloud** 1. In the **Users** tab, click the **action ()** menu in the upper-right corner. 2. Select **Export as CSV** to download the file. ### Export CSV schema The CSV export uses the comma (`,`) as the separator, encloses strings in double quotes, and includes a header row that defines these columns: * `"Name"` * `"Username"` * `"Org Role"` * `"Models Seat"` * `"Weave Access"` * `"Email"` * `"Teams"` * `"Last active"` **Dedicated Cloud and Self-Managed** 1. In the **Users** tab, click the **action ()** menu next to **Invite new user**. 2. Click **Export as CSV**. ### Export CSV schema The CSV export uses the comma (`,`) as the separator, encloses strings in double quotes, and includes a header row that defines these columns: * `"Name"` * `"Username"` * `"Last active"` * `"Role"` * `"Email"` * `"Teams"` * `"Status"` * `"Number of Reports"` * `"Number of Runs"` * `"Number of active days"` * `"Models Seat"` * `"Weave Access"`, only if the deployment can log Weave traces # Configure Slack alerts Source: https://docs.coreweave.com/products/wandb/platform/hosting/monitoring-usage/slack-alerts Create and configure a Slack application to receive W&B Server alerts, notifications, and monitoring updates. Integrate W\&B Server with [Slack](https://slack.com/) so that your Weights & Biases instance can dispatch alerts and notifications to a Slack workspace your team already uses. This page walks W\&B Server administrators through creating a Slack application, configuring its OAuth scopes and redirect URL, and registering the application with Weights & Biases. > [!NOTE] > > Watch a [video demonstrating setting up Slack alerts on W\&B Dedicated Cloud deployment](https://www.youtube.com/watch?v=JmvKb-7u-oU) (6 min). ## Create the Slack application W\&B Server uses a custom Slack application as the bridge for delivering alerts. Follow this procedure to create that application in the Slack workspace where you want to receive notifications. 1. Visit [https://api.slack.com/apps](https://api.slack.com/apps) and select **Create an App**. ![Create an App button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/create_an_app.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=ed1aca2479584c6c4c0dd71dabe6d0ac) 2. Provide a name for your app in the **App Name** field. 3. Select a Slack workspace where you want to develop your app. Ensure that the Slack workspace you use is the same workspace you intend to use for alerts. ![App name and workspace selection](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/name_app_workspace.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=8a7de757dedd59eea9e2c8d8fb76d017) ## Configure the Slack application After you create the Slack application, grant it the permissions to post messages and accept the redirect from Weights & Biases during the OAuth handshake. 1. On the left sidebar, select **OAuth & Permissions**. ![OAuth & Permissions menu](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/add_an_oath.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=497443eecd810d63b9e03159c0b8ab0f) 2. In the **Scopes** section, grant the bot the `incoming_webhook` scope. Scopes give your app permission to perform actions in your development workspace. For more information about OAuth scopes for bots, see [Understanding OAuth scopes for bots](https://api.slack.com/legacy/oauth-scopes) in the Slack API documentation. ![Bot token scopes](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/save_urls.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=483aee2fd35cddaf11e52d1a420b8964) 3. Configure the **Redirect URL** to point to your Weights & Biases installation. Use the same URL that you set as your host URL in your local system settings. You can specify multiple URLs if you have different DNS mappings to your instance. ![Redirect URLs configuration](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/redirect_urls.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bb973addc666195b2cc6ee8d170393f0) 4. Select **Save URLs**. 5. Optional: Under **Restrict API Token Usage**, specify an IP or IP range to allowlist for your Weights & Biases instances. Limiting the allowed IP address helps secure your Slack application. ## Register your Slack application with Weights & Biases Register the Slack application you configured with your Weights & Biases instance so that Weights & Biases can use it to dispatch alerts. 1. Navigate to the **System Settings** or **System Console** page of your Weights & Biases instance, depending on your deployment. 2. Depending on the System page you're on, follow one of the following options: * If you're in the **System Console**: go to **Settings** then to **Notifications**. ![System Console notifications](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/register_slack_app_console.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=8dfc5ce6b4a8a5413b044ff8f60a13af) * If you're in the **System Settings**: toggle the **Enable a custom Slack application to dispatch alerts** to enable a custom Slack application. ![Enable Slack application toggle](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/register_slack_app.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=37485920bbf09c60632bd959dbb2e38b) 3. Supply your **Slack client ID** and **Slack secret**, then select **Save**. To find your application's client ID and secret, navigate to **Basic Information** in **Settings**. 4. To verify that everything works, set up a Slack integration in the W\&B app. Your W\&B Server is now registered with the Slack application and can dispatch alerts to the configured Slack workspace. # Configure privacy settings Source: https://docs.coreweave.com/products/wandb/platform/hosting/privacy-settings Enforce privacy settings for team visibility, project access, and code saving defaults in Weights & Biases. This page describes how organization and team admins can configure privacy settings in Weights & Biases to control team visibility, project access, invitations, report sharing, and default code saving. Use these settings to standardize privacy across an organization or to tune controls for a single team. Organization admins can configure privacy settings at the organization scope, and team admins can configure them at the team scope. When configured at the organization scope, the settings are enforced for all teams in that organization. > [!NOTE] > > To avoid unexpected changes in team workflows, Weights & Biases recommends that organization admins enforce a privacy setting only after communicating in advance to all team admins and users in the organization. ## Enforce privacy settings for all teams Organization admins can enforce privacy settings for all teams in their organization from the **Privacy** tab of the organization settings. An enforced setting applies to every team in the organization, and team admins can't override it at the team scope. When a team admin opens a setting that you enforce, Weights & Biases shows the following message: "This setting is locked because it's enforced org-wide. To make changes, please contact your org admin." To open organization privacy settings, complete the following steps: 1. Sign in as an organization admin. 2. On Multi-tenant Cloud, navigate to `https://forge.coreweave.com/account-settings/[ORGANIZATION]/settings`. Replace `[ORGANIZATION]` with your organization name. On Dedicated Cloud or Self-Managed deployments, open your instance organization dashboard. For environment-specific URLs, see [Add and manage users](/products/wandb/platform/hosting/iam/access-management/manage-organization#add-and-manage-users). 3. In the left navigation, select **Privacy**. The following sections describe the settings on the **Privacy** tab. Each setting is a toggle, and Weights & Biases saves your changes immediately. ### Access Control Manage team visibility and member joining processes. * **Enforce team visibility restrictions**: Each user can see only the teams they belong to and the profiles of their teammates. Teams and users outside their memberships are hidden. * **Prevent automatic team joining**: Users with a matching organization email domain can't automatically join any team. Explicit invitations are required. * **Limit invitation privileges**: Only administrators can invite new members to any team. * **Restrict invitations to claimed domain**: Only users whose email address ends in your organization's claimed email domain can be invited to the organization. \[!NOTE] This setting appears only in [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), for Enterprise organizations that have claimed an email domain. See [Domain capture](/products/wandb/platform/hosting/iam/access-management/manage-organization#domain-capture). * **Disable API key creation**: Users and team service accounts can't create new API keys. Organization service accounts can still create keys, and existing keys keep working. See [Disable API key creation](/products/wandb/platform/hosting/iam/api-keys#disable-api-key-creation). \[!NOTE] This setting appears only in Dedicated Cloud and Self-Managed v0.84.0 and above. ### Project and content security Control project privacy and regulate content sharing. * **Enforce private projects**: All new projects across all teams are set to private or [restricted](/products/wandb/platform/hosting/iam/access-management/restricted-projects), and can't be made public or open at the team scope. * **Disable public report sharing**: Turns off public sharing of reports from private projects and deactivates existing public links. * **Disable default code saving**: Turns off code saving by default for all teams. See [Code saving](/products/wandb/app/features/panels/code). * **Redact PII in Weave traces**: The Weave server redacts select PII before storing traces. See [Redact PII from traces](/products/wandb/weave/guides/tracking/redact-pii#enable-organization-level-pii-redaction). ### Smart features The **Smart features** section controls LLM-powered features and data sharing. This section appears on the **Privacy** tab only if your organization has access to Weights & Biases AI features. It contains three settings: * **Enable AI-powered features** * **Use Customer Data for product improvement** * **Allow model training on Customer Data** > [!NOTE] > > Your organization's plan or contract can lock these settings. If a setting is locked, only Pro and Enterprise organizations can change it. See [Governance and security](/products/aria/governance). ### ARIA The **ARIA** section controls what ARIA can do across your organization's projects. This section appears on the **Privacy** tab only if project memory is enabled for your organization. * **Enable project memory**: Lets ARIA remember project details, such as conventions and past corrections, and apply them in future conversations. ARIA shares a project's memory with the team that owns the project. When this setting is off, ARIA uses no memories and records nothing new, but existing memory is kept. See [View and manage project memories](/products/aria#view-and-manage-project-memories). ## Configure privacy settings for a team If a setting isn't enforced at the organization scope, team admins can manage it for their own team from the **Privacy** section of the team **Settings** page. To open team privacy settings, complete the following steps: 1. In Weights & Biases, open the team's dashboard. 2. In the left navigation, select **Team settings**. 3. Open the **Privacy** section. The **Privacy** section contains the following settings. Weights & Biases saves your changes immediately. * **Default visibility for new projects in \[TEAM]**: Sets the visibility scope that Weights & Biases applies to new projects in the team. See [Visibility scopes](/products/wandb/platform/hosting/iam/access-management/restricted-projects#visibility-scopes). * **Hide this team from all non-members**: Hides the team from users who aren't members. \[!WARNING] Hiding a team also blocks public access to any open projects and reports that belong to that team. Weights & Biases asks you to confirm before applying this setting. * **Make all future team projects private (public sharing not allowed)**: Ensures all new projects created in the team are private. * **Allow any team member to invite other members (not just admins)**: Lets all team members invite new members, not only admins. * **Disable public sharing to outside of team for reports in private projects**: Turns off public sharing of reports in the team's private projects. This also deactivates existing magic links. * **Automatically recommend new users with matching email domains (`[DOMAIN]`) join this team upon signup**: Prompts new users whose email address matches your organization's claimed email domain to join this team when they sign up. In the W\&B App, `[DOMAIN]` is your organization's claimed email domain. \[!NOTE] This setting appears only in [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), and only organization admins can change it. If your organization hasn't claimed an email domain, the setting instead links to **Enable domain capture** in organization settings. See [Domain capture](/products/wandb/platform/hosting/iam/access-management/manage-organization#domain-capture). * **Enable code saving by default**: Automatically saves code for all runs in the team. See [Code saving](/products/wandb/app/features/panels/code). Settings you configure here apply only to this team. They don't affect other teams in the organization. # Disable automatic updates for W&B Server Source: https://docs.coreweave.com/products/wandb/platform/hosting/self-managed/disable-automatic-app-version-updates Learn how to disable automatic updates for W&B Server. This page shows administrators of Self-Managed Weights & Biases deployments how to disable automatic version upgrades for W\&B Server and pin its version to a specific release. Pinning a version gives you control over when upgrades happen. This control is useful when you need to coordinate upgrades with internal change management processes or validate a release in a staging environment before you roll it out. These instructions work only for deployments managed by the [W\&B Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator). > [!NOTE] > > Weights & Biases supports a major W\&B Server release for 12 months from its initial release date. Customers with **Self-Managed** instances are responsible for upgrading in time to maintain support. Avoid staying on an unsupported version. Weights & Biases recommends that customers with **Self-Managed** instances update their deployments with the latest release at least once per quarter to maintain support and to receive the latest features, performance improvements, and fixes. ## Requirements * W\&B Kubernetes Operator `v1.13.0` or newer * System Console `v2.12.2` or newer, or `v2.18.16` or newer if your license is supplied through a Kubernetes secret rather than set inline To verify that you meet these requirements, refer to the W\&B Custom Resource or Helm chart for your instance. Check the `version` values for the `operator-wandb` and `system-console` components. Your deployment must also be assigned to a release channel, which determines the versions you can pin to. Weights & Biases assigns new deployments to the stable channel automatically. If your deployment predates July 2026, it might not have a channel yet. ## Disable automatic updates To disable automatic updates, use the System Console to pin W\&B Server to a specific version, then check the Operator reconciliation logs to confirm that version pinning is active. 1. Log in to Forge as a user with the `admin` role. 2. Click the user icon at the top, then click **System Console**. 3. Go to **Settings** > **Advanced**, then select the **Other** tab. 4. In the **Disable Auto Upgrades** section, turn on **Pin specific version**. 5. Click the **Select a version** drop-down list, then select a W\&B Server version. 6. Click **Save**. ![System Console showing Pin specific version turned on with a selected W\&B Server version](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/disable_automatic_updates_saved_and_enabled.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=192af361aa161f0179c9144c1701dec2) Automatic upgrades are turned off and W\&B Server is pinned at the version you selected. 7. Verify that automatic upgrades are turned off. Go to the **Operator** tab and search the reconciliation logs for the string `Version pinning is enabled`. ```text theme={"system"} │info 2025-04-17T17:24:16Z wandb default No changes found │info 2025-04-17T17:24:16Z wandb default Active spec found │info 2025-04-17T17:24:16Z wandb default Desired spec │info 2025-04-17T17:24:16Z wandb default License │info 2025-04-17T17:24:16Z wandb default Version Pinning is enabled │info 2025-04-17T17:24:16Z wandb default Found Weights & Biases instance, processing the spec... │info 2025-04-17T17:24:16Z wandb default === Reconciling Weights & Biases instance... ``` ## Troubleshooting If the **Disable Auto Upgrades** section reports an error instead of letting you select a version, match the message below. ### "Please provide a valid license, check your license key and try again" The System Console can't read your license. If you supply the license through a Kubernetes secret (`global.licenseSecret`) instead of setting `global.license` inline, upgrade System Console to `v2.18.16` or newer. Earlier versions read only the inline value, so they send an empty license when they request the list of available releases. ### "Please contact your Weights & Biases Solutions Architect to configure a release channel" Your deployment isn't assigned to a release channel, so the System Console has no versions to offer. Contact your Weights & Biases Solutions Architect or [Support](mailto:forge-support@coreweave.com) to have your deployment assigned to a channel. # Deploy on Air-Gapped Kubernetes Source: https://docs.coreweave.com/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped Deploy W&B Platform in air-gapped and disconnected Kubernetes environments ## Introduction This guide provides step-by-step instructions to deploy the W\&B Platform in air-gapped, disconnected, or restricted network customer-managed environments. By following this guide, you set up an internal container registry and Helm repository to host Weights & Biases images and charts, install the W\&B Kubernetes Operator, and deploy the W\&B Platform without requiring outbound internet connectivity. This guide targets platform administrators and DevOps engineers who manage Kubernetes infrastructure in regulated or isolated networks. Air-gapped deployments are common in the following environments: * Secure government facilities. * Financial institutions with strict network isolation. * Healthcare organizations with compliance requirements. * Industrial control systems (ICS) environments. * Research facilities with classified networks. Run these commands in a shell console with proper access to the Kubernetes cluster. You can adapt these commands to work with any CI/CD tooling you use to deploy Kubernetes applications. For standard on-premises Kubernetes deployments with internet connectivity, see [Deploy Weights & Biases with Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator). ## Prerequisites Before starting, ensure your air-gapped environment meets the following requirements. ### Version requirements | Software | Minimum version | | - | - | | Kubernetes | v1.34 or newer ([Supported Kubernetes versions](https://kubernetes.io/releases/patch-releases/)) | | Helm | v3.x | | MySQL | W\&B Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. Install or upgrade to **MySQL 8.4.x**, or use a managed service version that your provider documents as supported and patched. Aurora MySQL version strings differ from community MySQL versions. Use `SELECT version()` to see the full engine version string and `SELECT aurora_version()` to see the Aurora version. [Aurora MySQL version 3](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html) is compatible with MySQL 8.0.x and is still supported. See [Amazon Aurora versioning](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.VersionPolicy.Versioning.html) and your cloud provider's documentation when you choose a target version. | | Redis | v7.x | | ClickHouse | Required for Weave on Self-Managed deployments. Not required if your deployment does not use Weave. See [ClickHouse compatibility for upgrades](/products/wandb/platform/hosting/self-managed/operator#clickhouse-compatibility-for-upgrades) and [Supported W\&B Server releases](/release-notes/server-releases). | ### SSL/TLS requirements W\&B requires a valid signed SSL/TLS certificate for secure communication between clients and the server. SSL/TLS termination must occur on the ingress or load balancer. The W\&B Server application doesn't terminate SSL or TLS connections. > [!WARNING] > > W\&B doesn't support self-signed certificates or custom CAs. Self-signed certificates cause challenges for users and aren't supported. If possible, use a service like [Let's Encrypt](https://letsencrypt.org) to provide trusted certificates to your load balancer. Services like Caddy and Cloudflare manage SSL for you. If your security policies require SSL communication within your trusted networks, consider using a tool like Istio and [sidecar containers](https://istio.io/latest/docs/reference/config/networking/sidecar/). ### Hardware requirements **CPU Architecture**: W\&B runs on Intel (x86) CPU architecture only. ARM is not supported. **Sizing**: For CPU, memory, and disk sizing recommendations for Kubernetes nodes and MySQL, see the [Sizing section](/products/wandb/platform/hosting/self-managed/ref-arch#sizing) in the reference architecture. Requirements vary based on whether you're running Models, Weave, or both. ### MySQL database W\&B requires an external MySQL database. For production, W\&B recommends using managed database services: * [AWS RDS Aurora MySQL](https://aws.amazon.com/rds/aurora/) * [Google Cloud SQL for MySQL](https://cloud.google.com/sql/mysql) * [Azure Database for MySQL](https://azure.microsoft.com/en-us/products/mysql/) Managed database services provide automated backups, monitoring, high availability, patching, and reduce operational overhead. See the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch#mysql) for MySQL requirements, including sizing recommendations and configuration parameters. For the SQL to create the database, see the [bare-metal guide](/products/wandb/platform/hosting/self-managed/operator#mysql-database). For questions about your deployment's database configuration, contact [support](mailto:forge-support@coreweave.com) or your AISE. For MySQL configuration parameters for self-managed instances, see the [reference architecture MySQL configuration section](/products/wandb/platform/hosting/self-managed/ref-arch#mysql-configuration-parameters). ### Redis W\&B depends on a single-node Redis 7.x deployment, which W\&B's components use for job queuing and data caching. For testing and proof-of-concept work, W\&B Self-Managed includes a local Redis deployment. This bundled deployment isn't appropriate for production use. For production deployments, W\&B can connect to a Redis instance in the following environments: * [Amazon ElastiCache](https://aws.amazon.com/elasticache/) * [Google Cloud Memorystore](https://cloud.google.com/memorystore?hl=en) * [Azure Cache for Redis](https://azure.microsoft.com/en-us/products/cache) * Self-hosted Redis in your cloud or on-premises infrastructure ### Object storage W\&B requires object storage with pre-signed URL and CORS support. W\&B recommends the following storage providers: * [Amazon S3](https://aws.amazon.com/s3/): Object storage service offering scalability, data availability, security, and performance. * [Google Cloud Storage](https://cloud.google.com/storage): Managed service for storing unstructured data at scale. * [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs): Cloud-based object storage for unstructured data at scale. * [CoreWeave AI Object Storage](/products/storage/object-storage): S3-compatible object storage optimized for AI workloads. * Enterprise S3-compatible storage such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor), [NetApp StorageGRID](https://www.netapp.com/data-storage/storagegrid/), or other enterprise solutions. > [!NOTE] > > MinIO Open Source is in [maintenance mode](https://github.com/minio/minio) with no active development or pre-compiled binaries. For production deployments, W\&B recommends managed object storage services or enterprise S3-compatible solutions such as MinIO Enterprise (AIStor). After you select a provider, configure the bucket so that W\&B can access it. For detailed bucket provisioning instructions including IAM policies, CORS configuration, and access setup, see the [Bring Your Own Bucket (BYOB) guide](/products/wandb/platform/hosting/data-security/secure-storage-connector). For the complete list of object storage requirements, including capacity and performance guidance, see the [reference architecture object storage section](/products/wandb/platform/hosting/self-managed/ref-arch#object-storage). For detailed object storage provisioning guidance, see the [Bring Your Own Bucket (BYOB)](/products/wandb/platform/hosting/data-security/secure-storage-connector) guide. In air-gapped environments, you'll typically use on-premises S3-compatible storage such as MinIO Enterprise, NetApp StorageGRID, or Dell ECS. ### Air-gapped specific requirements In addition to the preceding standard requirements, air-gapped deployments require the following: * **Internal container registry**: Access to a private container registry such as Harbor, JFrog Artifactory, or Nexus, with all required Weights & Biases images. * **Internal Helm repository**: Access to a private Helm chart repository with W\&B Helm charts. * **Image transfer capability**: A method to transfer container images from an internet-connected system to your air-gapped registry. * **License file**: A valid Weights & Biases Enterprise license. To obtain a license (for example, from an internet-connected machine), see the [License](/products/wandb/platform/hosting/self-managed/requirements#license) section on the Requirements page, or contact your Weights & Biases account team. For complete infrastructure requirements, including networking and load balancer configuration, see the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch#infrastructure-requirements). ## Prepare your air-gapped environment The following steps prepare your air-gapped environment to host the Weights & Biases container images and Helm charts. Complete these steps before installing the operator or deploying the platform. ### Step 1: Set up internal container registry Because the Kubernetes cluster cannot pull images from public registries, all required container images must be available in your internal air-gapped container registry before deployment. > [!NOTE] > > You are responsible for tracking the W\&B Operator's requirements and maintaining your container registry with updated images regularly. For the most current list of required container images and versions, refer to the Helm chart, or contact [Support](mailto:forge-support@coreweave.com) or your assigned Weights & Biases support engineer. #### Core Weights & Biases component containers The following core images are required: * [`docker.io/wandb/controller`](https://hub.docker.com/r/wandb/controller): W\&B Kubernetes Operator. * [`docker.io/wandb/local`](https://hub.docker.com/r/wandb/local): Weights & Biases application server. * [`docker.io/wandb/console`](https://hub.docker.com/r/wandb/console): Weights & Biases management console. * [`docker.io/wandb/megabinary`](https://hub.docker.com/r/wandb/megabinary): Weights & Biases microservices (API, executor, glue, parquet). #### Dependency containers The following third-party dependency images are required: * [`docker.io/bitnamilegacy/redis`](https://hub.docker.com/r/bitnamilegacy/redis): Required for local Redis deployment during testing and development. For production Redis requirements, see the [Redis section](#redis) in Prerequisites. * [`docker.io/otel/opentelemetry-collector-contrib`](https://hub.docker.com/r/otel/opentelemetry-collector-contrib): OpenTelemetry agent for collecting metrics and logs. * [`quay.io/prometheus/prometheus`](https://quay.io/repository/prometheus/prometheus): Prometheus for metrics collection. * [`quay.io/prometheus-operator/prometheus-config-reloader`](https://quay.io/repository/prometheus-operator/prometheus-config-reloader): Prometheus dependency. #### Get the complete image list To extract the complete list of required images and versions from the Helm chart: 1. On an internet-connected system, download the W\&B Helm charts from the [W\&B Helm charts repository](https://github.com/wandb/helm-charts): ```bash theme={"system"} # Clone the helm-charts repository git clone https://github.com/wandb/helm-charts.git cd helm-charts ``` 2. Inspect the `values.yaml` files to identify all container images and their versions: ```bash theme={"system"} # Extract image references from the operator chart helm show values charts/operator | grep -E "repository:|tag:" | grep -v "^#" # Extract image references from the platform chart helm show values charts/operator-wandb | grep -E "repository:|tag:" | grep -v "^#" ``` Alternatively, use this command to extract only the repository names (without version tags): ```bash theme={"system"} helm show values charts/operator-wandb \ | awk -F': *' '/^[[:space:]]*repository:/{print $2}' \ | grep -v "^#" \ | sort -u ``` The list of repositories looks similar to the following: ```text theme={"system"} wandb/controller wandb/local wandb/console wandb/megabinary wandb/weave-python wandb/weave-trace otel/opentelemetry-collector-contrib prometheus/prometheus prometheus-operator/prometheus-config-reloader bitnamilegacy/redis ``` To get the specific version tags for each image, use the preceding first command (`grep -E "repository:|tag:"`), which shows both repository names and their corresponding version tags. #### Transfer images to air-gapped registry 1. On an internet-connected system, pull and save all required images. > [!NOTE] > > Replace version numbers in the following examples with the actual versions from your Helm chart inspection in the preceding step. The versions shown here are examples and become outdated over time. Use shell variables to manage versions consistently: ```bash theme={"system"} # Set version variables (update these based on your Helm chart versions) CONTROLLER_VERSION="1.13.3" APP_VERSION="0.59.2" CONSOLE_VERSION="2.12.2" # Pull images docker pull wandb/controller:${CONTROLLER_VERSION} docker pull wandb/local:${APP_VERSION} docker pull wandb/console:${CONSOLE_VERSION} docker pull wandb/megabinary:${APP_VERSION} # ... pull all other required images with their versions # Save images to .tar files docker save wandb/controller:${CONTROLLER_VERSION} -o wandb-controller-${CONTROLLER_VERSION}.tar docker save wandb/local:${APP_VERSION} -o wandb-local-${APP_VERSION}.tar docker save wandb/console:${CONSOLE_VERSION} -o wandb-console-${CONSOLE_VERSION}.tar docker save wandb/megabinary:${APP_VERSION} -o wandb-megabinary-${APP_VERSION}.tar # ... save all other images ``` 2. Transfer the `.tar` files to your air-gapped environment using your approved method, such as a USB drive or secure file transfer. 3. In your air-gapped environment, load and push images to your internal registry: ```bash theme={"system"} # Set the same version variables used above CONTROLLER_VERSION="1.13.3" APP_VERSION="0.59.2" CONSOLE_VERSION="2.12.2" INTERNAL_REGISTRY="registry.yourdomain.com" # Load images docker load -i wandb-controller-${CONTROLLER_VERSION}.tar docker load -i wandb-local-${APP_VERSION}.tar docker load -i wandb-console-${CONSOLE_VERSION}.tar docker load -i wandb-megabinary-${APP_VERSION}.tar # ... load all other images # Tag for internal registry docker tag wandb/controller:${CONTROLLER_VERSION} ${INTERNAL_REGISTRY}/wandb/controller:${CONTROLLER_VERSION} docker tag wandb/local:${APP_VERSION} ${INTERNAL_REGISTRY}/wandb/local:${APP_VERSION} docker tag wandb/console:${CONSOLE_VERSION} ${INTERNAL_REGISTRY}/wandb/console:${CONSOLE_VERSION} docker tag wandb/megabinary:${APP_VERSION} ${INTERNAL_REGISTRY}/wandb/megabinary:${APP_VERSION} # ... tag all other images # Push to internal registry docker push ${INTERNAL_REGISTRY}/wandb/controller:${CONTROLLER_VERSION} docker push ${INTERNAL_REGISTRY}/wandb/local:${APP_VERSION} docker push ${INTERNAL_REGISTRY}/wandb/console:${CONSOLE_VERSION} docker push ${INTERNAL_REGISTRY}/wandb/megabinary:${APP_VERSION} # ... push all other images ``` ### Step 2: Set up internal Helm chart repository With the container images in place, the Kubernetes Operator also needs access to the W\&B Helm charts. Ensure the following Helm charts are available in your internal Helm repository: * [W\&B Operator chart](https://github.com/wandb/helm-charts/tree/main/charts/operator) * [W\&B Platform chart](https://github.com/wandb/helm-charts/tree/main/charts/operator-wandb) 1. On an internet-connected system, download the charts: ```bash theme={"system"} # Add W&B Helm repository helm repo add wandb https://wandb.github.io/helm-charts helm repo update # Download the charts helm pull wandb/operator --version 1.13.3 helm pull wandb/operator-wandb --version 0.18.0 ``` 2. Transfer the `.tgz` chart files to your air-gapped environment and upload them to your internal Helm repository according to your repository's procedures. The `operator` chart deploys the W\&B Kubernetes Operator (Controller Manager). The `operator-wandb` chart deploys the W\&B Platform using the values configured in the Custom Resource (CR). ### Step 3: Configure Helm repository access Configure your local Helm client in the air-gapped environment to point to your internal repository so that subsequent install commands can locate the charts. 1. In your air-gapped environment, configure Helm to use your internal repository: ```bash theme={"system"} helm repo add local-repo https://charts.yourdomain.com helm repo update ``` 2. Verify the charts are available: ```bash theme={"system"} helm search repo local-repo/operator helm search repo local-repo/operator-wandb ``` ## Deploy Weights & Biases in air-gapped environment With your internal registry and Helm repository in place, you can now install the Kubernetes Operator, configure external services, and deploy the W\&B Platform. ### Step 4: Install the Kubernetes Operator The W\&B Kubernetes Operator (controller manager) manages the W\&B Platform components. To install it in an air-gapped environment, configure it to use your internal container registry. 1. Create a `values.yaml` file with the following content: ```yaml theme={"system"} image: repository: registry.yourdomain.com/wandb/controller tag: 1.13.3 airgapped: true ``` > [!NOTE] > > Replace the repository and tag with the actual versions you transferred to your internal registry in Step 1. The version shown here (`1.13.3`) is an example and becomes outdated over time. 2. Install the operator and Custom Resource Definition (CRD): ```bash theme={"system"} helm upgrade --install operator local-repo/operator \ --namespace wandb \ --create-namespace \ --values values.yaml ``` 3. Verify the operator is running: ```bash theme={"system"} kubectl get pods -n wandb ``` You should see the operator pod in a `Running` state. The W\&B Kubernetes Operator is now installed and ready to deploy the W\&B Platform from your internal chart repository. For full details about supported values, refer to the [Kubernetes operator GitHub repository values file](https://github.com/wandb/helm-charts/blob/main/charts/operator/values.yaml). ### Step 5: Set up MySQL database Before configuring the W\&B Custom Resource, set up an external MySQL database. For production deployments, Weights & Biases strongly recommends using managed database services where available. However, if you're running your own MySQL instance, create the database and user: Create a database and a user with the following SQL commands. Replace `[PASSWORD]` with a secure password: ```sql theme={"system"} CREATE USER 'wandb_local'@'%' IDENTIFIED BY '[PASSWORD]'; CREATE DATABASE wandb_local CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL ON wandb_local.* TO 'wandb_local'@'%' WITH GRANT OPTION; ``` For MySQL configuration parameters, see the [reference architecture MySQL configuration section](/products/wandb/platform/hosting/self-managed/ref-arch#mysql-configuration-parameters). ### Step 6: Configure W\&B Custom Resource After installing the W\&B Kubernetes Operator, configure the Custom Resource (CR) to point to your internal Helm repository and container registry. This configuration ensures the Kubernetes operator uses your internal registry and repository when deploying the required components of the W\&B Platform, instead of attempting to reach public sources. > [!NOTE] > > The following example configuration includes image version tags that become outdated over time. Replace all `tag:` values with the actual versions you transferred to your internal registry in Step 1. Create a file named `wandb.yaml` with the following content: ```yaml theme={"system"} apiVersion: apps.wandb.com/v1 kind: WeightsAndBiases metadata: labels: app.kubernetes.io/instance: wandb app.kubernetes.io/name: weightsandbiases name: wandb namespace: wandb spec: chart: url: https://charts.yourdomain.com name: operator-wandb version: 0.18.0 values: global: host: https://wandb.yourdomain.com license: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bucket: accessKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx secretKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx name: s3.yourdomain.com:9000 path: wandb provider: s3 region: us-east-1 mysql: database: wandb host: mysql.yourdomain.com password: [YOUR-MYSQL-PASSWORD] port: 3306 user: wandb redis: host: redis.yourdomain.com port: 6379 password: [YOUR-REDIS-PASSWORD] api: enabled: true glue: enabled: true executor: enabled: true extraEnv: ENABLE_REGISTRY_UI: 'true' # Configure all component images to use internal registry app: image: repository: registry.yourdomain.com/wandb/local tag: 0.59.2 console: image: repository: registry.yourdomain.com/wandb/console tag: 2.12.2 api: image: repository: registry.yourdomain.com/wandb/megabinary tag: 0.59.2 executor: image: repository: registry.yourdomain.com/wandb/megabinary tag: 0.59.2 glue: image: repository: registry.yourdomain.com/wandb/megabinary tag: 0.59.2 parquet: image: repository: registry.yourdomain.com/wandb/megabinary tag: 0.59.2 weave: image: repository: registry.yourdomain.com/wandb/weave-python tag: 0.59.2 otel: image: repository: registry.yourdomain.com/otel/opentelemetry-collector-contrib tag: 0.97.0 prometheus: server: image: repository: registry.yourdomain.com/prometheus/prometheus tag: v2.47.0 configmapReload: prometheus: image: repository: registry.yourdomain.com/prometheus-operator/prometheus-config-reloader tag: v0.67.0 ingress: annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" class: nginx ``` > [!NOTE] > > Replace all placeholder values, such as hostnames, passwords, and tags, with your actual configuration values. The preceding example shows the most commonly used components. Depending on your deployment needs, you may also need to configure image repositories for additional components such as the following: * `settingsMigrationJob` * `weave-trace` * `filestream` * `flat-runs-table` Refer to the [W\&B Helm repository values file](https://github.com/wandb/helm-charts/blob/main/charts/operator-wandb/values.yaml) for the complete list of configurable components. ### Step 7: Deploy the W\&B Platform Applying the Custom Resource triggers the operator to install the W\&B Platform components defined in the `operator-wandb` chart, using the configuration and image references from `wandb.yaml`. 1. Apply the W\&B Custom Resource to deploy the platform: ```bash theme={"system"} kubectl apply -f wandb.yaml ``` 2. Monitor the deployment progress: ```bash theme={"system"} # Watch pods being created kubectl get pods -n wandb --watch # Check deployment status kubectl get weightsandbiases -n wandb # View operator logs kubectl logs -n wandb deployment/wandb-operator-controller-manager ``` The deployment may take several minutes as the operator creates all necessary components. ## OpenShift configuration Weights & Biases supports deployment on air-gapped OpenShift Kubernetes clusters. OpenShift deployments require additional security context configurations because of OpenShift's stricter security policies. If you're deploying on OpenShift, apply the configurations in this section in addition to the preceding steps. ### OpenShift security context constraints OpenShift uses Security Context Constraints (SCCs) to control pod permissions. By default, OpenShift assigns the `restricted` SCC to pods, which prevents running as root and requires specific user IDs. #### Option 1: Use restricted SCC (recommended) Configure Weights & Biases components to run with the restricted SCC by setting appropriate security contexts in your Custom Resource: ```yaml theme={"system"} spec: values: # Configure security contexts for all pods app: podSecurityContext: fsGroup: 1000 runAsUser: 1000 runAsNonRoot: true securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true seccompProfile: type: RuntimeDefault console: podSecurityContext: fsGroup: 1000 runAsUser: 1000 runAsNonRoot: true securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true seccompProfile: type: RuntimeDefault # Repeat for other components: api, executor, glue, parquet, weave ``` #### Option 2: Create custom SCC (if required) If your deployment requires capabilities not available in the `restricted` SCC, create a custom SCC: ```yaml theme={"system"} apiVersion: security.openshift.io/v1 kind: SecurityContextConstraints metadata: name: wandb-scc allowHostDirVolumePlugin: false allowHostIPC: false allowHostNetwork: false allowHostPID: false allowHostPorts: false allowPrivilegeEscalation: false allowPrivilegedContainer: false allowedCapabilities: [] defaultAddCapabilities: [] fsGroup: type: MustRunAs ranges: - min: 1000 max: 65535 readOnlyRootFilesystem: false requiredDropCapabilities: - ALL runAsUser: type: MustRunAsRange uidRangeMin: 1000 uidRangeMax: 65535 seLinuxContext: type: MustRunAs supplementalGroups: type: RunAsAny volumes: - configMap - downwardAPI - emptyDir - persistentVolumeClaim - projected - secret ``` 1. Apply the SCC: ```bash theme={"system"} oc apply -f wandb-scc.yaml ``` 2. Bind the SCC to the Weights & Biases service accounts: ```bash theme={"system"} oc adm policy add-scc-to-user wandb-scc -z wandb-app -n wandb oc adm policy add-scc-to-user wandb-scc -z wandb-console -n wandb ``` ### OpenShift routes OpenShift uses Routes instead of standard Kubernetes Ingress. Configure Weights & Biases to use OpenShift Routes: ```yaml theme={"system"} spec: values: ingress: enabled: false route: enabled: true host: wandb.apps.openshift.yourdomain.com tls: enabled: true termination: edge insecureEdgeTerminationPolicy: Redirect ``` ### OpenShift image pull configuration If your OpenShift cluster uses an internal image registry with authentication: 1. Create an image pull secret: ```bash theme={"system"} kubectl create secret docker-registry wandb-registry-secret \ --docker-server=registry.yourdomain.com \ --docker-username=[USERNAME] \ --docker-password=[PASSWORD] \ --namespace=wandb ``` 2. Reference the secret in your Custom Resource: ```yaml theme={"system"} spec: values: imagePullSecrets: - name: wandb-registry-secret ``` ### OpenShift complete example The following example shows a complete CR for OpenShift air-gapped deployment: > [!NOTE] > > Replace all `tag:` values in this example with the actual versions you transferred to your internal registry in Step 1. The versions shown are examples and become outdated over time. ```yaml theme={"system"} apiVersion: apps.wandb.com/v1 kind: WeightsAndBiases metadata: name: wandb namespace: wandb spec: chart: url: https://charts.yourdomain.com name: operator-wandb version: 0.18.0 values: global: host: https://wandb.apps.openshift.yourdomain.com license: [YOUR-LICENSE] bucket: accessKey: [YOUR-ACCESS-KEY] secretKey: [YOUR-SECRET-KEY] name: s3.yourdomain.com:9000 path: wandb provider: s3 region: us-east-1 mysql: database: wandb host: mysql.yourdomain.com password: [YOUR-MYSQL-PASSWORD] port: 3306 user: wandb redis: host: redis.yourdomain.com port: 6379 password: [YOUR-REDIS-PASSWORD] # OpenShift-specific: Use Routes instead of Ingress ingress: enabled: false route: enabled: true host: wandb.apps.openshift.yourdomain.com tls: enabled: true termination: edge # Image pull secret for internal registry imagePullSecrets: - name: wandb-registry-secret # Security contexts for OpenShift restricted SCC app: image: repository: registry.yourdomain.com/wandb/local tag: 0.59.2 podSecurityContext: fsGroup: 1000 runAsUser: 1000 runAsNonRoot: true securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true seccompProfile: type: RuntimeDefault console: image: repository: registry.yourdomain.com/wandb/console tag: 2.12.2 podSecurityContext: fsGroup: 1000 runAsUser: 1000 runAsNonRoot: true securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true seccompProfile: type: RuntimeDefault # Repeat security contexts for: api, executor, glue, parquet, weave # (abbreviated for clarity) ``` > [!NOTE] > > Contact [Weights & Biases Support](mailto:forge-support@coreweave.com) or your assigned Weights & Biases support engineer for comprehensive OpenShift configuration examples tailored to your security requirements. ## Verify your installation After deploying Weights & Biases, verify the installation is working correctly so that you can confirm the platform is reachable, pods are healthy, and the deployment is using only your internal resources. Follow the general verification steps, then complete the additional air-gapped checks in the following section. To verify the installation, W\&B recommends using the [W\&B CLI](/products/wandb/ref/cli). The `wandb verify` command runs tests that confirm components and configurations work as expected. > [!NOTE] > > This procedure assumes that you create the first admin user account in a browser. To verify the installation: 1. Install the W\&B CLI: ```bash theme={"system"} pip install wandb ``` 2. Log in to W\&B: ```bash theme={"system"} wandb login --host=https://YOUR_DNS_DOMAIN ``` For example: ```bash theme={"system"} wandb login --host=https://wandb.company-name.com ``` 3. Verify the installation: ```bash theme={"system"} wandb verify ``` After the command runs, a successful installation displays the following output: ```console theme={"system"} Default host selected: https://wandb.company-name.com Find detailed logs for this test at: /var/folders/pn/b3g3gnc11_sbsykqkm3tx5rh0000gp/T/tmpdtdjbxua/wandb Checking if logged in...................................................✅ Checking signed URL upload..............................................✅ Checking ability to send large payloads through proxy...................✅ Checking requests to base url...........................................✅ Checking requests made over signed URLs.................................✅ Checking CORs configuration of the bucket...............................✅ Checking wandb package version is up to date............................✅ Checking logged metrics, saving and downloading a file..................✅ Checking artifact save and download workflows...........................✅ ``` Contact W\&B Support if you encounter errors. ### Additional air-gapped verification For air-gapped deployments, also verify: 1. **Image pull**: Confirm all pods successfully pulled images from your internal registry: ```bash theme={"system"} kubectl get pods -n wandb -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\t"}{.status.containerStatuses[*].image}{"\n"}{end}' ``` All images should point to your internal registry and all pods should be in `Running` state. 2. **External connectivity**: Verify Weights & Biases is not attempting external connections (it shouldn't in air-gapped mode): ```bash theme={"system"} kubectl logs -n wandb deployment/wandb-app --tail=100 | grep -i "connection" ``` 3. **License validation**: Access the Weights & Biases console and verify your license is active. ## Troubleshooting ### Image pull errors If pods fail to pull images, check the following: * Verify images exist in your internal registry. * Check that the image pull secret is correctly configured. * Verify network connectivity from Kubernetes nodes to the registry. * Check registry authentication credentials. To test an image pull manually: ```bash theme={"system"} kubectl run test-pull --image=registry.yourdomain.com/wandb/local:0.59.2 --namespace=wandb kubectl logs test-pull -n wandb kubectl delete pod test-pull -n wandb ``` ### OpenShift SCC errors If pods fail with permission errors on OpenShift: ```bash theme={"system"} # Check which SCC is being used oc get pod [POD-NAME] -n wandb -o yaml | grep scc # Check service account permissions oc describe scc wandb-scc oc get rolebinding -n wandb ``` ### Helm chart not found If the operator can't find the platform chart, check the following: * Verify the chart repository URL in the Custom Resource. * Check that the operator pod can reach your internal Helm repository. * Verify the chart exists in your repository: ```bash theme={"system"} helm search repo local-repo/operator-wandb ``` ## Frequently asked questions ### Can I use a different ingress class? Yes, configure your ingress class by modifying the ingress settings in your Custom Resource: ```yaml theme={"system"} spec: values: ingress: class: your-ingress-class ``` ### How do I handle certificate bundles with multiple certificates? Split the certificates into multiple entries in the `customCACerts` section: ```yaml theme={"system"} spec: values: customCACerts: cert1.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- cert2.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ``` ### How do I prevent automatic updates? To configure the operator to not automatically update Weights & Biases, do the following: * Set `airgapped: true` in the operator installation (this disables automatic update checks). * Control version updates by manually updating the `spec.chart.version` in your Custom Resource. * Optionally, disable automatic updates from the W\&B System Console. See [Disable automatic app version updates](/products/wandb/platform/hosting/self-managed/disable-automatic-app-version-updates) for more details. > [!NOTE] > > Weights & Biases strongly recommends customers with Self-Managed instances update their deployments with the latest release at minimum once per quarter to maintain support and receive the latest features, performance improvements, and fixes. Weights & Biases supports a major release for 12 months from its initial release date. Refer to [Release policies and processes](/release-notes/release-policies). ### Does the deployment work with no connection to public repositories? Yes. When `airgapped: true` is set in the operator configuration, the Kubernetes operator uses only your internal resources and doesn't attempt to connect to public repositories. ### How do I update Weights & Biases in an air-gapped environment? To update Weights & Biases: 1. Pull new container images on an internet-connected system. 2. Transfer images to your air-gapped registry. 3. Upload new Helm charts to your internal repository. 4. Update the `spec.chart.version` and image tags in your Custom Resource. 5. Apply the updated Custom Resource. The operator performs a rolling update of the Weights & Biases components. ## Next steps After successful deployment, complete the following tasks: * **Configure user authentication**: Set up [SSO](/products/wandb/platform/hosting/iam/sso) or other authentication methods. * **Set up monitoring**: Configure monitoring for your Weights & Biases instance and infrastructure. * **Plan for updates**: Review the [Server upgrade process](/products/wandb/platform/hosting/server-upgrade-process) and establish an update cadence. * **Configure backups**: Establish backup procedures for your MySQL database. * **Document your process**: Create runbooks for your specific air-gapped update procedures. ## Get help If you encounter issues during deployment: * Review the [Reference Architecture](/products/wandb/platform/hosting/self-managed/ref-arch) for infrastructure guidance. * Check the [Operator guide](/products/wandb/platform/hosting/self-managed/operator) for configuration details. * Contact [Support](mailto:forge-support@coreweave.com) or your assigned Weights & Biases support engineer. * For OpenShift-specific issues, reference Red Hat OpenShift documentation. # Deploy Weights & Biases with Kubernetes Operator Source: https://docs.coreweave.com/products/wandb/platform/hosting/self-managed/operator Deploy W&B Platform with Kubernetes Operator on cloud or on-premises ## Overview This page shows platform administrators how to deploy and manage W\&B Server on Kubernetes (cloud or on-premises) using the W\&B Kubernetes Operator. By the end, you have a running W\&B Server installation that the operator manages and upgrades automatically. Use this guide if you self-manage a Weights & Biases deployment and need an installation method that works across cloud, on-premises, and air-gapped environments. The W\&B Kubernetes Operator is the recommended way to deploy W\&B Server on Kubernetes (cloud or on-premises). For an overview of the operator, why Weights & Biases uses it, and how configuration hierarchy works, see [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed#about-the-wb-kubernetes-operator). ## Before you begin Before deploying Weights & Biases with the Kubernetes Operator, ensure your infrastructure meets all requirements: 1. **Review infrastructure requirements**: See the [Self-Managed infrastructure requirements](/products/wandb/platform/hosting/self-managed/requirements) page for details on: * Software version requirements (Kubernetes, MySQL, Redis, Helm, ClickHouse) * Hardware requirements (CPU architecture, sizing recommendations) * Kubernetes cluster configuration * Networking, SSL/TLS, and DNS requirements 2. **Obtain a W\&B Server license**: See the [License](/products/wandb/platform/hosting/self-managed/requirements#license) section on the Requirements page. 3. **Provision external services**: Set up MySQL, Redis, and object storage before deployment. For additional context, see the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch) page. ### MySQL database MySQL 8.0.x reached end of life in April 2026. W\&B Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. If you run community MySQL, install or upgrade to **MySQL 8.4.x**. If you use a managed service, run an engine version your provider documents as supported and patched (for example Amazon RDS for MySQL, Google Cloud SQL for MySQL, or Azure Database for MySQL). W\&B has validated the platform against MySQL 8.4.0 and current 8.4.x releases. If you are still on MySQL 8.0.x, plan an upgrade using the steps in [Upgrade MySQL to 8.4.x](/products/wandb/platform/hosting/self-managed/operator#upgrade-mysql-to-84x). W\&B requires an external MySQL database. For production, W\&B recommends using managed database services: * [AWS RDS Aurora MySQL](https://aws.amazon.com/rds/aurora/) * [Google Cloud SQL for MySQL](https://cloud.google.com/sql/mysql) * [Azure Database for MySQL](https://azure.microsoft.com/en-us/products/mysql/) Managed database services provide automated backups, monitoring, high availability, patching, and reduce operational overhead. See the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch#mysql) for MySQL requirements, including sizing recommendations and configuration parameters. For the SQL to create the database, see the [bare-metal guide](/products/wandb/platform/hosting/self-managed/operator#mysql-database). For questions about your deployment's database configuration, contact [support](mailto:forge-support@coreweave.com) or your AISE. For complete MySQL setup instructions including configuration parameters and database creation, see the [MySQL section in the requirements page](/products/wandb/platform/hosting/self-managed/requirements#mysql-database). If you are upgrading from MySQL 8.0.x, see [Upgrade MySQL to 8.4.x](#upgrade-mysql-to-84x). ### Redis W\&B depends on a single-node Redis 7.x deployment, which W\&B's components use for job queuing and data caching. For testing and proof-of-concept work, W\&B Self-Managed includes a local Redis deployment. This bundled deployment isn't appropriate for production use. For production deployments, W\&B can connect to a Redis instance in the following environments: * [Amazon ElastiCache](https://aws.amazon.com/elasticache/) * [Google Cloud Memorystore](https://cloud.google.com/memorystore?hl=en) * [Azure Cache for Redis](https://azure.microsoft.com/en-us/products/cache) * Self-hosted Redis in your cloud or on-premises infrastructure See the [External Redis configuration section](#external-redis) for details on how to configure an external Redis instance in Helm values. ### Object storage W\&B requires object storage with pre-signed URL and CORS support. W\&B recommends the following storage providers: * [Amazon S3](https://aws.amazon.com/s3/): Object storage service offering scalability, data availability, security, and performance. * [Google Cloud Storage](https://cloud.google.com/storage): Managed service for storing unstructured data at scale. * [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs): Cloud-based object storage for unstructured data at scale. * [CoreWeave AI Object Storage](/products/storage/object-storage): S3-compatible object storage optimized for AI workloads. * Enterprise S3-compatible storage such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor), [NetApp StorageGRID](https://www.netapp.com/data-storage/storagegrid/), or other enterprise solutions. > [!NOTE] > > MinIO Open Source is in [maintenance mode](https://github.com/minio/minio) with no active development or pre-compiled binaries. For production deployments, W\&B recommends managed object storage services or enterprise S3-compatible solutions such as MinIO Enterprise (AIStor). After you select a provider, configure the bucket so that W\&B can access it. For detailed bucket provisioning instructions including IAM policies, CORS configuration, and access setup, see the [Bring Your Own Bucket (BYOB) guide](/products/wandb/platform/hosting/data-security/secure-storage-connector). For the complete list of object storage requirements, including capacity and performance guidance, see the [reference architecture object storage section](/products/wandb/platform/hosting/self-managed/ref-arch#object-storage). ### Provision your storage bucket Before configuring W\&B, you must provision your object storage bucket with the required IAM policies, CORS configuration, and access credentials. See the [Bring Your Own Bucket (BYOB) guide](/products/wandb/platform/hosting/data-security/secure-storage-connector) for detailed step-by-step provisioning instructions for: * Amazon S3 (including IAM policies and bucket policies) * Google Cloud Storage (including PubSub notifications) * Azure Blob Storage (including managed identities) * CoreWeave AI Object Storage * S3-compatible storage (MinIO Enterprise, NetApp StorageGRID, and other enterprise solutions) See the [Object storage configuration section](#object-storage-bucket) for details on how to configure object storage in Helm values. ### OpenShift Kubernetes clusters Weights & Biases supports deployment on [OpenShift Kubernetes clusters](https://www.redhat.com/en/technologies/cloud-computing/openshift) in cloud, on-premises, and air-gapped environments. > [!NOTE] > > CoreWeave recommends you install with the official W\&B Helm chart. #### Run the container as an un-privileged user OpenShift and similar orchestrators often reject containers that run as root, so Weights & Biases containers must be configured to run as a non-root user that still belongs to the root group. By default, containers use a `$UID` of 999. Specify `$UID` >= 100000 and a `$GID` of 0 if your orchestrator requires the container run with a non-root user. > [!NOTE] > > Weights & Biases must start as the root group (`$GID=0`) for file system permissions to function properly. Configure security contexts for each Weights & Biases component. For example, to configure the API component: ```yaml theme={"system"} api: install: true image: repository: wandb/megabinary tag: 0.74.1 # Replace with your actual version pod: securityContext: fsGroup: 10001 fsGroupChangePolicy: Always runAsGroup: 0 runAsNonRoot: true runAsUser: 10001 seccompProfile: type: RuntimeDefault container: securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL privileged: false readOnlyRootFilesystem: false ``` If needed, configure a custom security context for other components like `app` or `console`. For details, see [Custom security context](#custom-security-context). ## Deploy W\&B Server application > [!NOTE] > > **The W\&B Kubernetes Operator with Helm is the recommended installation method** for all Weights & Biases self-managed deployments, including cloud, on-premises, and air-gapped environments. Choose your deployment method: **Helm CLI** Weights & Biases provides a Helm chart to deploy the W\&B Kubernetes Operator to a Kubernetes cluster. This approach lets you deploy W\&B Server with Helm CLI or a continuous delivery tool like ArgoCD. For deployment-specific considerations, see [Environment-specific considerations](#environment-specific-considerations) and [Deploy with Terraform on public cloud](#deploy-with-terraform-on-public-cloud). For disconnected environments, see [Deploy on Air-Gapped Kubernetes](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped). Follow these steps to install the W\&B Kubernetes Operator with Helm CLI: 1. Add the W\&B Helm repository. The W\&B Helm chart is available in the W\&B Helm repository: ```shell theme={"system"} helm repo add wandb https://charts.wandb.ai helm repo update ``` 2. Install the Operator on a Kubernetes cluster: ```shell theme={"system"} helm upgrade --install operator wandb/operator -n wandb-cr --create-namespace ``` 3. Configure the Weights & Biases operator custom resource to trigger the W\&B Server installation. Create a file named `operator.yaml` with your Weights & Biases deployment configuration. Refer to [Configuration Reference](#configuration-reference-for-wb-server) for all available options. Here's a minimal example configuration: ```yaml theme={"system"} apiVersion: apps.wandb.com/v1 kind: WeightsAndBiases metadata: labels: app.kubernetes.io/name: weightsandbiases app.kubernetes.io/instance: wandb name: wandb namespace: default spec: values: global: host: https:// license: eyJhbGnUzaH...j9ZieKQ2x5GGfw bucket:
mysql: ingress: annotations: ``` 4. Start the Operator with your custom configuration so that it can install, configure, and manage the W\&B Server application: ```shell theme={"system"} kubectl apply -f operator.yaml ``` Wait until the deployment completes. This takes a few minutes. 5. To verify the installation using the web UI, create the first admin user account, then follow the verification steps outlined in [Verify the installation](#verify-the-installation). After these steps complete, you have a W\&B Kubernetes Operator running in the `wandb-cr` namespace and a W\&B Server application that the operator manages from your `operator.yaml` custom resource. **Terraform** Deploy Weights & Biases using Terraform for infrastructure-as-code deployments. Choose between: * **Helm Terraform Module**: Deploys the operator to existing Kubernetes infrastructure. * **Cloud Terraform Modules**: Complete infrastructure plus application deployment for AWS, Google Cloud, and Azure. For deployment-specific considerations, see [Environment-specific considerations](#environment-specific-considerations) and [Deploy with Terraform on public cloud](#deploy-with-terraform-on-public-cloud). For disconnected environments, see [Deploy on Air-Gapped Kubernetes](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped). #### Helm Terraform Module This method supports customized deployments tailored to specific requirements, using Terraform's infrastructure-as-code approach for consistency and repeatability. The official W\&B [Helm-based Terraform Module](https://registry.terraform.io/modules/wandb/wandb/helm/latest) is available on the Terraform Registry. Use the following code as a starting point. It includes all necessary configuration options for a production grade deployment: ```hcl theme={"system"} module "wandb" { source = "wandb/wandb/helm" spec = { values = { global = { host = "https://" license = "eyJhbGnUzaH...j9ZieKQ2x5GGfw" bucket = {
} mysql = { } } ingress = { annotations = { "a" = "b" "x" = "y" } } } } } ``` The configuration options are the same as described in [Configuration Reference](#configuration-reference-for-wb-server), but the syntax must follow the HashiCorp Configuration Language (HCL). The Terraform module creates the Weights & Biases custom resource definition (CRD). To see how Weights & Biases themselves use the Helm Terraform module to deploy Dedicated Cloud installations for customers, follow these links: * [AWS](https://github.com/wandb/terraform-aws-wandb/blob/45e1d746f53e78e73e68f911a1f8cad5408e74b6/main.tf#L225) * [Azure](https://github.com/wandb/terraform-azurerm-wandb/blob/170e03136b6b6fc758102d59dacda99768854045/main.tf#L155) * [Google Cloud](https://github.com/wandb/terraform-google-wandb/blob/49ddc3383df4cefc04337a2ae784f57ce2a2c699/main.tf#L189) #### Cloud Terraform Modules Weights & Biases provides a set of Terraform Modules for AWS, Google Cloud, and Azure. These modules deploy the complete infrastructure, including Kubernetes clusters, load balancers, and MySQL databases, along with the W\&B Server application. The W\&B Kubernetes Operator is included in these official Weights & Biases cloud-specific Terraform Modules with the following versions: | Terraform Registry | Source Code | Version | | - | - | - | | [AWS](https://registry.terraform.io/modules/wandb/wandb/aws/latest) | [https://github.com/wandb/terraform-aws-wandb](https://github.com/wandb/terraform-aws-wandb) | v4.0.0+ | | [Azure](https://github.com/wandb/terraform-azurerm-wandb) | [https://github.com/wandb/terraform-azurerm-wandb](https://github.com/wandb/terraform-azurerm-wandb) | v2.0.0+ | | [Google Cloud](https://github.com/wandb/terraform-google-wandb) | [https://github.com/wandb/terraform-google-wandb](https://github.com/wandb/terraform-google-wandb) | v2.0.0+ | These modules install the W\&B Kubernetes Operator as part of the deployment, so you can use it to manage W\&B Server in your cloud environment without additional setup. For detailed instructions on using these cloud-specific modules, see [Deploy with Terraform on public cloud](#deploy-with-terraform-on-public-cloud). ### Verify the installation To verify the installation, W\&B recommends using the [W\&B CLI](/products/wandb/ref/cli). The `wandb verify` command runs tests that confirm components and configurations work as expected. > [!NOTE] > > This procedure assumes that you create the first admin user account in a browser. To verify the installation: 1. Install the W\&B CLI: ```bash theme={"system"} pip install wandb ``` 2. Log in to W\&B: ```bash theme={"system"} wandb login --host=https://YOUR_DNS_DOMAIN ``` For example: ```bash theme={"system"} wandb login --host=https://wandb.company-name.com ``` 3. Verify the installation: ```bash theme={"system"} wandb verify ``` After the command runs, a successful installation displays the following output: ```console theme={"system"} Default host selected: https://wandb.company-name.com Find detailed logs for this test at: /var/folders/pn/b3g3gnc11_sbsykqkm3tx5rh0000gp/T/tmpdtdjbxua/wandb Checking if logged in...................................................✅ Checking signed URL upload..............................................✅ Checking ability to send large payloads through proxy...................✅ Checking requests to base url...........................................✅ Checking requests made over signed URLs.................................✅ Checking CORs configuration of the bucket...............................✅ Checking wandb package version is up to date............................✅ Checking logged metrics, saving and downloading a file..................✅ Checking artifact save and download workflows...........................✅ ``` Contact W\&B Support if you encounter errors. ## Enable the MCP server The W\&B MCP Server, covered in [Use Weights & Biases with AI Assistants](/products/wandb/platform/ai-assistants), ships as an optional subchart in `operator-wandb`. When enabled, the operator deploys an in-cluster MCP server exposed through your existing ingress at `/mcp`, so any MCP-compatible client can connect using a Forge API Key. This is the same server Weights & Biases runs as the hosted offering at `https://mcp.withwandb.com/mcp`, but pointed at your deployment's data. For end-user client configuration and the tool catalog, see [Use Weights & Biases with AI Assistants](/products/wandb/platform/ai-assistants). This section only covers the operator-side enablement. ### Prerequisites Make sure your deployment meets the following requirements before you enable the MCP server: * **Chart version**: `operator-wandb` `0.42.3` or later. The `mcp-server` subchart was introduced in `0.42.1`, but the Datadog and privacy fields used in the following example were added later. * **Weave Traces enabled**: the MCP server depends on Weave Traces for trace tools and for the `WF_TRACE_SERVER_URL` default. Set `weave-trace.install: true`. If Weave Traces isn't enabled, the Helm render fails with `mcp-server requires weave-trace.install=true`. * **Reachable ingress**: `global.host` must already resolve and route to the Weights & Biases ingress. The MCP pod reads `WANDB_BASE_URL` from `global.host` and is available at `/mcp`. * **Node capacity**: the MCP pod requests `500m` CPU and `1Gi` memory by default (limits `2` CPU and `4Gi` memory). Confirm your node pool has enough headroom before you enable the subchart. ### Enable the subchart Enable the `mcp-server` subchart so that the operator deploys an in-cluster MCP server and extends your existing Weights & Biases ingress with a `/mcp` route. Add the following to the `spec.values` block of your existing `WeightsAndBiases` custom resource (CR), alongside your existing `global`, `ingress`, and other overrides. The Datadog block is optional, but recommended when a Datadog Agent DaemonSet already collects pod logs and traces in your cluster. ```yaml theme={"system"} spec: values: weave-trace: install: true mcp-server: install: true image: repository: us-docker.pkg.dev/wandb-production/public/wandb/mcp-server tag: "0.3.3" datadog: enabled: true mode: "agent" service: "wandb-mcp-server-" env: "" deploymentType: "self-managed" customer: "" extraTags: - "region:" - "tier:" privacy: logLevel: "standard" ``` Configure each block: * **`weave-trace.install: true`**: required unless you set `mcp-server.env.WF_TRACE_SERVER_URL` yourself. * **`datadog.mode: "agent"`**: use for Kubernetes deployments where the Datadog Agent DaemonSet owns log and trace collection. In agent mode, the MCP pod doesn't need a Datadog API key. * **`datadog.service`, `env`, `deploymentType`, `customer`, `extraTags`**: set these to match your deployment's observability naming conventions. Set `customer` to an empty string if you don't want a customer tag. * **`privacy.logLevel`**: use `"standard"` for most self-managed Kubernetes installations. This redacts free-text parameter values in logs while preserving deployment identifiers that operators commonly use for debugging. Use `"strict"` when entity, project, run, or user identifiers should not remain in plaintext logs. Use `"off"` only when you explicitly want plaintext logging for those values. Apply the change to trigger reconciliation: ```bash theme={"system"} kubectl apply -f operator.yaml ``` The operator creates a `wandb-mcp-server` deployment and service in the release namespace, and extends the Weights & Biases ingress with a `/mcp` path. ### Verify the MCP server Wait for the pod to become `Running`, then check the health endpoint in-cluster and through the ingress: ```bash theme={"system"} kubectl get pod -l app.kubernetes.io/component=mcp-server kubectl port-forward svc/wandb-mcp-server 8080:8080 curl -s http://localhost:8080/mcp/health curl -s "https:///mcp/health" ``` Both requests should return `200 OK`. The in-cluster check confirms the pod is healthy. The ingress check confirms routing. If the in-cluster check returns `200 OK` but the ingress check returns `404 Not Found`, see [Troubleshooting](#troubleshooting). If you enabled Datadog, MCP server logs should also appear in Datadog with the configured `mcp-server.datadog.service` and `mcp-server.datadog.env` values. ### Connect a client After the MCP server is healthy, configure your MCP client to use `https:///mcp` with an API Key as the bearer token. For IDE and agent configurations, see [Use Weights & Biases with AI Assistants](/products/wandb/platform/ai-assistants). ### Troubleshooting | Symptom | Cause and fix | | - | - | | `helm render` fails with `mcp-server requires weave-trace.install=true` | Add `weave-trace.install: true` to `spec.values`. The MCP server depends on Weave Traces for trace tools. | | `wandb-mcp-server` pod stuck in `Pending` with `Insufficient cpu` or `Insufficient memory` | Add node capacity, or lower `mcp-server.resources.requests` in your CR. Defaults are `500m` CPU and `1Gi` memory. | | `curl https:///mcp/health` returns 404 | The chart renders the `/mcp` ingress path only when `mcp-server.install: true`. Reapply the CR and wait for the ingress controller to propagate the new path. | | MCP logs don't appear in Datadog | Confirm `mcp-server.datadog.enabled: true`, `mcp-server.datadog.mode: "agent"`, and that the Datadog Agent DaemonSet collects pod stdout. Search Datadog with the configured `service` and `env` values. | | MCP logs include more user-supplied text than expected | Set `mcp-server.privacy.logLevel` to `"standard"` or `"strict"`. Use `"strict"` when identifiers such as entity, project, run, or user names should not remain in plaintext logs. | | `wandb-mcp-server` pod in `ImagePullBackOff` in an air-gapped or mirrored cluster | Mirror the image to your registry and override `mcp-server.image.repository` in your CR, the same pattern used for other Weights & Biases component images in air-gapped installs. See [Deploy on Air-Gapped Kubernetes](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped). | ## Environment-specific considerations Kubernetes is the same whether it runs on-premises or in the cloud. The main differences are in naming and managed services (for example, MySQL compared to RDS, or S3 compared to on-premises object storage). This section covers considerations that vary by environment. ### On-premises and bare metal When deploying to on-premises or bare-metal Kubernetes, pay attention to the following. #### Load balancer configuration On-premises Kubernetes clusters typically require manual load balancer configuration. Options include: * **External load balancer**: Configure an existing hardware or software load balancer, such as F5 or HAProxy. * **Nginx Ingress Controller**: Deploy nginx-ingress-controller with NodePort or host networking. * **MetalLB**: For bare-metal Kubernetes clusters, MetalLB provides load balancer services. For detailed load balancer configuration examples, see the [Reference Architecture networking section](/products/wandb/platform/hosting/self-managed/ref-arch#networking). #### Persistent storage Ensure your Kubernetes cluster has a StorageClass configured for persistent volumes. Weights & Biases components might require persistent storage for caching and temporary data. Common on-premises storage options include: * NFS-based storage classes * Ceph/Rook storage * Local persistent volumes * Enterprise storage solutions such as NetApp or Pure Storage #### DNS and certificate management For on-premises deployments, complete the following tasks: * Configure internal DNS records to point to your Weights & Biases hostname. * Provision SSL/TLS certificates from your internal Certificate Authority (CA). * If using self-signed certificates, configure the operator to trust your CA certificate. See the [SSL/TLS requirements](/products/wandb/platform/hosting/self-managed/requirements#ssl-tls) for certificate configuration details. #### OpenShift deployments Weights & Biases fully supports deployment on OpenShift Kubernetes clusters. OpenShift deployments require additional security context configurations due to OpenShift's stricter security policies. For OpenShift-specific configuration details, see [OpenShift Kubernetes clusters](#openshift-kubernetes-clusters). For OpenShift examples in air-gapped environments, see [Deploy on Air-Gapped Kubernetes](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped#openshift-configuration). #### Object storage for on-premises and S3-compatible After provisioning your object storage bucket (see [Object storage provisioning](/products/wandb/platform/hosting/data-security/secure-storage-connector)), configure it in your W\&B Custom Resource. **AWS S3 (on-premises)** For on-premises AWS S3 (through Outposts or compatible storage): ```yaml theme={"system"} bucket: kmsKey: # Optional KMS key for encryption name: # Example: wandb path: "" # Keep as empty string provider: s3 region: # Example: us-east-1 ``` **S3-compatible storage such as MinIO, Ceph, or NetApp** For S3-compatible storage systems: ```yaml theme={"system"} bucket: kmsKey: null name: # Example: s3.example.com:9000 path: # Example: wandb provider: s3 region: # Example: us-east-1 ``` To enable TLS for S3-compatible storage, append `?tls=true` to the bucket path: ```yaml theme={"system"} bucket: path: "wandb?tls=true" ``` > [!WARNING] > > The certificate must be trusted. Self-signed certificates require additional configuration. See the [SSL/TLS requirements](/products/wandb/platform/hosting/self-managed/requirements#ssl-tls) for details. **Important considerations for on-premises object storage** When running your own object storage, consider: 1. **Storage capacity and performance**: Monitor disk capacity carefully. Average Weights & Biases usage results in tens to hundreds of gigabytes. Heavy usage can result in petabytes of storage consumption. 2. **Fault tolerance**: At minimum, use RAID arrays for physical disks. For S3-compatible storage, use distributed or highly available configurations. 3. **Availability**: Configure monitoring to ensure the storage remains available. **MinIO considerations** > [!WARNING] > > MinIO Open Source is in [maintenance mode](https://github.com/minio/minio) with no active development. Pre-compiled binaries are no longer provided, and only critical security fixes are considered case-by-case. For production deployments, CoreWeave recommends using managed object storage services or [MinIO Enterprise (AIStor)](https://min.io/product/aistor). Enterprise alternatives for on-premises object storage include: * [Amazon S3 on Outposts](https://aws.amazon.com/s3/outposts/) * [NetApp StorageGRID](https://www.netapp.com/data-storage/storagegrid/) * MinIO Enterprise (AIStor) * [Dell ObjectScale](https://www.dell.com/en-us/shop/cty/sf/objectscale) If you are using an existing MinIO deployment or MinIO Enterprise, you can create a bucket using the MinIO client: ```bash theme={"system"} mc config host add local http://$MINIO_HOST:$MINIO_PORT "$MINIO_ACCESS_KEY" "$MINIO_SECRET_KEY" --api s3v4 mc mb --region=us-east-1 local/wandb-files ``` ### Public cloud with Terraform For full infrastructure-plus-application deployment on AWS, Google Cloud, or Azure, see [Deploy with Terraform on public cloud](#deploy-with-terraform-on-public-cloud). ## Deploy with Terraform on public cloud > [!NOTE] > > CoreWeave recommends fully managed deployment options such as [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) deployment types. Fully managed services require little or no configuration. Weights & Biases provides Terraform modules for deploying the platform on public cloud providers. These modules automate the provisioning of infrastructure and installation of W\&B Server, so you can stand up a complete environment without manually creating each cloud resource. Before you start, CoreWeave recommends that you choose one of the [remote backends](https://developer.hashicorp.com/terraform/language/backend) available for Terraform to store the [State File](https://developer.hashicorp.com/terraform/language/state). The State File is the necessary resource to roll out upgrades or make changes in your deployment without recreating all components. Select your cloud provider: **AWS** CoreWeave recommends using the [W\&B Server AWS Terraform Module](https://registry.terraform.io/modules/wandb/wandb/aws/latest) to deploy the platform on AWS. The Terraform Module deploys the following mandatory components: * Load Balancer * AWS Identity & Access Management (IAM) * AWS Key Management System (KMS) * Amazon Aurora MySQL * Amazon VPC * Amazon S3 * Amazon Route53 * Amazon Certificate Manager (ACM) * Amazon Elastic Load Balancing (ALB) * Amazon Secrets Manager Optional components include: * Elastic Cache for Redis * SQS ### Prerequisite permissions The account that runs Terraform must be able to create all components listed in the preceding section and have permission to create **IAM Policies** and **IAM Roles** and assign roles to resources. ### General steps The steps in this section are common for any deployment option. 1. Prepare the development environment. * Install [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) * CoreWeave recommends creating a Git repository for version control. 2. Create the `terraform.tfvars` file. Customize the `tvfars` file content according to the installation type. The minimum recommended content looks like the following example. ```bash theme={"system"} namespace = "wandb" license = "xxxxxxxxxxyyyyyyyyyyyzzzzzzz" subdomain = "wandb-aws" domain_name = "wandb.ml" zone_id = "xxxxxxxxxxxxxxxx" allowed_inbound_cidr = ["0.0.0.0/0"] allowed_inbound_ipv6_cidr = ["::/0"] eks_cluster_version = "1.29" ``` Define variables in your `tvfars` file before you deploy because the `namespace` variable is a string that prefixes all resources created by Terraform. The combination of `subdomain` and `domain` forms the FQDN for your Weights & Biases instance. In the preceding example, the Weights & Biases FQDN is `wandb-aws.wandb.ml` and the DNS `zone_id` is where Terraform creates the FQDN record. Both `allowed_inbound_cidr` and `allowed_inbound_ipv6_cidr` also require setting. In the module, this is a mandatory input. The following example permits access from any source to the Weights & Biases installation. 3. Create the file `versions.tf`. This file contains the Terraform and Terraform provider versions required to deploy Weights & Biases in AWS: ```bash theme={"system"} provider "aws" { region = "eu-central-1" default_tags { tags = { GithubRepo = "terraform-aws-wandb" GithubOrg = "wandb" Enviroment = "Example" Example = "PublicDnsExternal" } } } ``` Refer to the [Terraform Official Documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration) to configure the AWS provider. CoreWeave recommends that you also add the [remote backend configuration](https://developer.hashicorp.com/terraform/language/backend) mentioned at the beginning of this documentation. 4. Create the file `variables.tf` For every option configured in the `terraform.tfvars` Terraform requires a correspondent variable declaration. ```hcl theme={"system"} variable "namespace" { type = string description = "Name prefix used for resources" } variable "domain_name" { type = string description = "Domain name used to access instance." } variable "subdomain" { type = string default = null description = "Subdomain for accessing the Weights & Biases UI." } variable "license" { type = string } variable "zone_id" { type = string description = "Domain for creating the Weights & Biases subdomain on." } variable "allowed_inbound_cidr" { description = "CIDRs allowed to access wandb-server." nullable = false type = list(string) } variable "allowed_inbound_ipv6_cidr" { description = "CIDRs allowed to access wandb-server." nullable = false type = list(string) } variable "eks_cluster_version" { description = "EKS cluster kubernetes version" nullable = false type = string } ``` ### Recommended deployment This is the most straightforward deployment option configuration that creates all mandatory components and installs in the Kubernetes Cluster the latest version of Weights & Biases. 1. Create the `main.tf` In the same directory where you created the files in the General Steps, create a file `main.tf` with the following content: ```hcl theme={"system"} module "wandb_infra" { source = "wandb/wandb/aws" version = "~>7.0" namespace = var.namespace domain_name = var.domain_name license = var.license subdomain = var.subdomain zone_id = var.zone_id allowed_inbound_cidr = var.allowed_inbound_cidr allowed_inbound_ipv6_cidr = var.allowed_inbound_ipv6_cidr public_access = true external_dns = true kubernetes_public_access = true kubernetes_public_access_cidrs = ["0.0.0.0/0"] eks_cluster_version = var.eks_cluster_version } data "aws_eks_cluster" "eks_cluster_id" { name = module.wandb_infra.cluster_name } data "aws_eks_cluster_auth" "eks_cluster_auth" { name = module.wandb_infra.cluster_name } provider "kubernetes" { host = data.aws_eks_cluster.eks_cluster_id.endpoint cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks_cluster_id.certificate_authority.0.data) token = data.aws_eks_cluster_auth.eks_cluster_auth.token } provider "helm" { kubernetes { host = data.aws_eks_cluster.eks_cluster_id.endpoint cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks_cluster_id.certificate_authority.0.data) token = data.aws_eks_cluster_auth.eks_cluster_auth.token } } output "url" { value = module.wandb_infra.url } output "bucket" { value = module.wandb_infra.bucket_name } ``` 2. Deploy Weights & Biases To deploy Weights & Biases, execute the following commands: ```bash theme={"system"} terraform init terraform apply -var-file=terraform.tfvars ``` ### Enable Redis To use Redis to cache SQL queries and speed up the application response when loading metrics, add the option `create_elasticache_subnet = true` to the `main.tf` file: ```hcl theme={"system"} module "wandb_infra" { source = "wandb/wandb/aws" version = "~>7.0" namespace = var.namespace domain_name = var.domain_name subdomain = var.subdomain zone_id = var.zone_id create_elasticache_subnet = true } [...] ``` ### Enable message broker (queue) To enable an external message broker using SQS, add the option `use_internal_queue = false` to the `main.tf` file: > [!NOTE] > > This is optional because Weights & Biases includes an embedded broker. This option doesn't bring a performance improvement. ```hcl theme={"system"} module "wandb_infra" { source = "wandb/wandb/aws" version = "~>7.0" namespace = var.namespace domain_name = var.domain_name subdomain = var.subdomain zone_id = var.zone_id use_internal_queue = false [...] } ``` ### Additional resources * [AWS Terraform Module documentation](https://registry.terraform.io/modules/wandb/wandb/aws/latest) * [AWS Terraform Module source code](https://github.com/wandb/terraform-aws-wandb) * [Migrate to operator-based AWS Terraform modules](#migrate-to-operator-based-aws-terraform-modules) **Google Cloud** CoreWeave recommends using the [W\&B Server Google Cloud Terraform Module](https://registry.terraform.io/modules/wandb/wandb/google/latest) to deploy the platform on Google Cloud. The module documentation lists all available options. Before you start, CoreWeave recommends that you choose one of the [remote backends](https://developer.hashicorp.com/terraform/language/backend/remote) available for Terraform to store the [State File](https://developer.hashicorp.com/terraform/language/state). The State File is the necessary resource to roll out upgrades or make changes in your deployment without recreating all components. The Terraform Module deploys the following mandatory components: * VPC * Cloud SQL for MySQL * Cloud Storage Bucket * Google Kubernetes Engine * Memorystore for Redis * KMS Crypto Key * Load Balancer Optional components include: * Pub/Sub messages system ### Prerequisite permissions The account that runs Terraform must have the role `roles/owner` in the Google Cloud project used. ### General steps The steps in this section are common for any deployment option. 1. Prepare the development environment. * Install [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli). * CoreWeave recommends creating a Git repository for your code, but you can keep your files locally. * Create a project in [Google Cloud Console](https://console.cloud.google.com/). * Authenticate with Google Cloud (make sure to [install gcloud](https://cloud.google.com/sdk/docs/install) first) using `gcloud auth application-default login`. 2. Create the `terraform.tfvars` file. Customize the `tvfars` file content according to the installation type. The minimum recommended content looks like the following example. ```bash theme={"system"} project_id = "wandb-project" region = "europe-west2" zone = "europe-west2-a" namespace = "wandb" license = "xxxxxxxxxxyyyyyyyyyyyzzzzzzz" subdomain = "wandb-gcp" domain_name = "wandb.ml" ``` You must decide the values for these variables before deployment. The `namespace` variable is a string that prefixes all resources created by Terraform. The combination of `subdomain` and `domain` forms the FQDN that configures Weights & Biases. In the preceding example, the Weights & Biases FQDN is `wandb-gcp.wandb.ml`. 3. Create the file `variables.tf`. For every option configured in the `terraform.tfvars` Terraform requires a correspondent variable declaration. ```hcl theme={"system"} variable "project_id" { type = string description = "Project ID" } variable "region" { type = string description = "Google region" } variable "zone" { type = string description = "Google zone" } variable "namespace" { type = string description = "Namespace prefix used for resources" } variable "domain_name" { type = string description = "Domain name for accessing the Weights & Biases UI." } variable "subdomain" { type = string description = "Subdomain for access the Weights & Biases UI." } variable "license" { type = string description = "W&B License" } ``` ### Recommended deployment This is the most straightforward deployment option configuration that creates all mandatory components and installs in the Kubernetes Cluster the latest version of Weights & Biases. 1. Create the `main.tf` In the same directory where you created the files in the General Steps, create a file `main.tf` with the following content: ```hcl theme={"system"} provider "google" { project = var.project_id region = var.region zone = var.zone } provider "google-beta" { project = var.project_id region = var.region zone = var.zone } data "google_client_config" "current" {} provider "kubernetes" { host = "https://${module.wandb.cluster_endpoint}" cluster_ca_certificate = base64decode(module.wandb.cluster_ca_certificate) token = data.google_client_config.current.access_token } provider "helm" { kubernetes { host = "https://${module.wandb.cluster_endpoint}" cluster_ca_certificate = base64decode(module.wandb.cluster_ca_certificate) token = data.google_client_config.current.access_token } } # Spin up all required services module "wandb" { source = "wandb/wandb/google" version = "~> 10.0" namespace = var.namespace license = var.license domain_name = var.domain_name subdomain = var.subdomain } # You'll want to update your DNS with the provisioned IP address output "url" { value = module.wandb.url } output "address" { value = module.wandb.address } output "bucket_name" { value = module.wandb.bucket_name } ``` 2. Deploy Weights & Biases. To deploy Weights & Biases, execute the following commands: ```bash theme={"system"} terraform init terraform apply -var-file=terraform.tfvars ``` ### Enable Redis To use Redis to cache SQL queries and speed up the application response when loading metrics, add the option `create_redis = true` to the `main.tf` file: ```hcl theme={"system"} [...] module "wandb" { source = "wandb/wandb/google" version = "~> 10.0" namespace = var.namespace license = var.license domain_name = var.domain_name subdomain = var.subdomain create_redis = true } [...] ``` ### Enable message broker (queue) To enable an external message broker using Pub/Sub, add the option `use_internal_queue = false` to the `main.tf` file: > [!NOTE] > > This is optional because Weights & Biases includes an embedded broker. This option doesn't bring a performance improvement. ```hcl theme={"system"} [...] module "wandb" { source = "wandb/wandb/google" version = "~> 10.0" namespace = var.namespace license = var.license domain_name = var.domain_name subdomain = var.subdomain use_internal_queue = false } [...] ``` ### Additional resources * [Google Cloud Terraform Module documentation](https://registry.terraform.io/modules/wandb/wandb/google/latest) * [Google Cloud Terraform Module source code](https://github.com/wandb/terraform-google-wandb) **Azure** CoreWeave recommends using the [W\&B Server Azure Terraform Module](https://registry.terraform.io/modules/wandb/wandb/azurerm/latest) to deploy the platform on Azure. The module documentation lists all available options. The Terraform Module deploys the following mandatory components: * Azure Resource Group * Azure Virtual Network (VPC) * Azure MySQL Flexible Server * Azure Storage Account and Blob Storage * Azure Kubernetes Service * Azure Application Gateway Optional components include: * Azure Cache for Redis * Azure Event Grid ### Prerequisite permissions The simplest way to configure the AzureRM provider is through the [Azure CLI](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/azure_cli). For automation, you can also use an [Azure Service Principal](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/service_principal_client_secret). Regardless of the authentication method used, the account that runs Terraform must be able to create all components listed in the preceding section. ### General steps The steps in this section are common for any deployment option. 1. Prepare the development environment. * Install [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) * CoreWeave recommends creating a Git repository for your code, but you can keep your files locally. 2. Create the `terraform.tfvars` file. Customize the `tvfars` file content according to the installation type. The minimum recommended content looks like the following example. ```bash theme={"system"} namespace = "wandb" wandb_license = "xxxxxxxxxxyyyyyyyyyyyzzzzzzz" subdomain = "wandb-azure" domain_name = "wandb.ml" location = "westeurope" ``` You must decide the values for these variables before deployment. The `namespace` variable is a string that prefixes all resources created by Terraform. The combination of `subdomain` and `domain` forms the FQDN that configures Weights & Biases. In the preceding example, the Weights & Biases FQDN is `wandb-azure.wandb.ml`. 3. Create the file `versions.tf`. This file contains the Terraform and Terraform provider versions required to deploy Weights & Biases in Azure: ```bash theme={"system"} terraform { required_version = "~> 1.3" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.17" } } } ``` Refer to the [Terraform Official Documentation](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs) to configure the Azure provider. CoreWeave recommends that you also add the [remote backend configuration](https://developer.hashicorp.com/terraform/language/backend) mentioned at the beginning of this documentation. 4. Create the file `variables.tf` For every option configured in the `terraform.tfvars` Terraform requires a correspondent variable declaration. ```bash theme={"system"} variable "namespace" { type = string description = "String used for prefix resources." } variable "location" { type = string description = "Azure Resource Group location" } variable "domain_name" { type = string description = "Domain for accessing the Weights & Biases UI." } variable "subdomain" { type = string default = null description = "Subdomain for accessing the Weights & Biases UI. Default creates record at Route53 Route." } variable "license" { type = string description = "Your wandb/local license" } ``` ### Recommended deployment This is the most straightforward deployment option configuration that creates all mandatory components and installs in the Kubernetes Cluster the latest version of Weights & Biases. 1. Create the `main.tf` In the same directory where you created the files in the General Steps, create a file `main.tf` with the following content: ```bash theme={"system"} provider "azurerm" { features {} } provider "kubernetes" { host = module.wandb.cluster_host cluster_ca_certificate = base64decode(module.wandb.cluster_ca_certificate) client_key = base64decode(module.wandb.cluster_client_key) client_certificate = base64decode(module.wandb.cluster_client_certificate) } provider "helm" { kubernetes { host = module.wandb.cluster_host cluster_ca_certificate = base64decode(module.wandb.cluster_ca_certificate) client_key = base64decode(module.wandb.cluster_client_key) client_certificate = base64decode(module.wandb.cluster_client_certificate) } } # Spin up all required services module "wandb" { source = "wandb/wandb/azurerm" version = "~> 1.2" namespace = var.namespace location = var.location license = var.license domain_name = var.domain_name subdomain = var.subdomain deletion_protection = false tags = { "Example" : "PublicDns" } } output "address" { value = module.wandb.address } output "url" { value = module.wandb.url } ``` 2. Deploy Weights & Biases To deploy Weights & Biases, execute the following commands: ```bash theme={"system"} terraform init terraform apply -var-file=terraform.tfvars ``` ### Enable Redis To use Redis to cache SQL queries and speed up the application response when loading metrics, add the option `create_redis = true` to the `main.tf` file: ```bash theme={"system"} # Spin up all required services module "wandb" { source = "wandb/wandb/azurerm" version = "~> 1.2" namespace = var.namespace location = var.location license = var.license domain_name = var.domain_name subdomain = var.subdomain create_redis = true [...] } ``` ### Enable message broker (queue) To enable an external message broker using Azure Event Grid, add the option `use_internal_queue = false` to the `main.tf` file: > [!NOTE] > > This is optional because Weights & Biases includes an embedded broker. This option doesn't bring a performance improvement. ```bash theme={"system"} # Spin up all required services module "wandb" { source = "wandb/wandb/azurerm" version = "~> 1.2" namespace = var.namespace location = var.location license = var.license domain_name = var.domain_name subdomain = var.subdomain use_internal_queue = false [...] } ``` ### Additional resources * [Azure Terraform Module documentation](https://registry.terraform.io/modules/wandb/wandb/azurerm/latest) * [Azure Terraform Module source code](https://github.com/wandb/terraform-azurerm-wandb) ### Other deployment options You can combine multiple deployment options by adding all configurations to the same file. Each Terraform module provides several options that can be combined with the standard options and the minimal configuration found in the recommended deployment section. Refer to the module documentation for your cloud provider for the full list of available options: * [AWS Module documentation](https://registry.terraform.io/modules/wandb/wandb/aws/latest) * [Google Cloud Module documentation](https://registry.terraform.io/modules/wandb/wandb/google/latest) * [Azure Module documentation](https://registry.terraform.io/modules/wandb/wandb/azurerm/latest) ## Access the Weights & Biases management console The W\&B Kubernetes Operator comes with a management console where you can review deployment status, view component metrics, and adjust operator-level settings. It's available at `${HOST_URI}/console`, for example `https://wandb.company-name.com/console`. You can log in to the management console in two ways: **Option 1 (Recommended)** 1. Open Forge in the browser and log in. Log in to Forge with `${HOST_URI}/`, for example `https://wandb.company-name.com/` 2. Access the console. Click the icon in the top right corner and then click **System console**. Only users with admin privileges can see the **System console** entry. ![System console access](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/access_system_console_via_main_app.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=618ca4cc891164d2db3bd85d3542d65f) **Option 2** > [!NOTE] > > CoreWeave recommends you access the console using the following steps only if Option 1 doesn't work. 1. Open the console application in your browser. Open the URL described in the preceding section, which redirects you to the login screen: ![Direct system console access](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/access_system_console_directly.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=cfc3311e75852b6ee1c5d2d7cf8f3303) 2. Retrieve the password from the Kubernetes secret that the installation generates: ```shell theme={"system"} kubectl get secret wandb-password -o jsonpath='{.data.password}' | base64 -d ``` Copy the password. 3. Log in to the console. Paste the copied password, then click **Login**. ## Update the W\&B Kubernetes Operator This section describes how to update the W\&B Kubernetes Operator itself. Update the operator periodically so that you get bug fixes and new reconciliation features. > [!NOTE] > > * Updating the W\&B Kubernetes Operator doesn't update the W\&B Server application. > * If you use a Helm chart that doesn't use the W\&B Kubernetes Operator, see the [migration instructions](#migrate-self-managed-instances-to-wb-operator) before following the steps in this section to update the W\&B Operator. Copy and paste the following code snippets into your terminal. 1. Update the repo with [`helm repo update`](https://helm.sh/docs/helm/helm_repo_update/): ```shell theme={"system"} helm repo update ``` 2. Update the Helm chart with [`helm upgrade`](https://helm.sh/docs/helm/helm_upgrade/): ```shell theme={"system"} helm upgrade operator wandb/operator -n wandb-cr --reuse-values ``` ## Update the W\&B Server application You no longer need to update W\&B Server application if you use the W\&B Kubernetes Operator. The operator automatically updates your W\&B Server application when a new version of the software of Weights & Biases is released. ## Upgrade MySQL to 8.4.x MySQL 8.0.x is end of life. Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. If you run community MySQL, install or upgrade to **MySQL 8.4.x**. If you use a managed service, run an engine version your provider documents as supported and patched (for example Amazon RDS for MySQL, Google Cloud SQL for MySQL, or Azure Database for MySQL). Weights & Biases has validated the platform against MySQL 8.4.0 and current 8.4.x releases. These steps describe the sequence from Weights & Biases's perspective. For how to upgrade MySQL itself, including backups and version paths, follow your MySQL distribution's or cloud provider's documentation. The same sequence applies to [standard](/products/wandb/platform/hosting/self-managed/operator) and [air-gapped](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped) Operator deployments. In air-gapped environments, obtain MySQL 8.4.x software through your internal distribution process before you upgrade the database. > [!NOTE] > > Plan a maintenance window and notify users before you begin. Contact [Customer Support](mailto:forge-support@coreweave.com) or your Weights & Biases team if you have questions about compatibility or your deployment topology. 1. Review MySQL release notes and documentation for your target version and any intervening versions for requirements and other details. 2. Prepare for maintenance. Before you start the upgrade, you can run the [MySQL Shell upgrade checker](https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-shell-utilities-upgrade.html) against your database to surface and fix compatibility issues for your target version. Resolve any errors or warnings in the checker output before you proceed. Refer to the documentation for your MySQL distribution. 3. Shut down MySQL and take a full backup of your MySQL database according to your MySQL distribution's documentation. MySQL will be unavailable during the upgrade. While the database is unavailable, Weights & Biases client applications can't connect and will experience temporary errors. 4. Upgrade MySQL to 8.4.x according to your MySQL distribution's documentation. 5. Restart MySQL and verify that it is operational. 6. When MySQL is up, run `wandb verify` to validate your Weights & Biases deployment. The command runs a series of checks and reports results to `STDOUT`. If it reports problems, make adjustments and run it again. For setup and login steps, see [Verify the installation](#verify-the-installation). 7. After validation completes, users can resume normal operations. ## ClickHouse compatibility for upgrades Self-Managed deployments that use an external ClickHouse cluster must verify ClickHouse compatibility before upgrading W\&B Server. ### Supported ClickHouse versions W\&B Weave requires a supported version of both ClickHouse Server and ClickHouse Keeper. * Weave supports ClickHouse 25.8 through 25.12, and 26.3 or newer. * Weave does not work with ClickHouse 26.1 or 26.2. ***Before* you upgrade W\&B Self-Managed**, verify that both ClickHouse Server and ClickHouse Keeper run a version that Weave supports. If you must change ClickHouse versions, upgrade both components together. If your W\&B Self-Managed deployment does not use Weave, ClickHouse is not required and this requirement does not apply to your upgrade. Dedicated Cloud and Multi-tenant Cloud deployments already run a compatible ClickHouse version and are not affected. For version-specific release notes, see [Supported W\&B Server releases](/release-notes/server-releases). ## Migrate self-managed instances to W\&B Operator The following section describes how to migrate from self-managing your own W\&B Server installation to using the W\&B Operator to do this for you. Migrating lets the operator handle reconciliation and W\&B Server upgrades automatically, so you no longer have to coordinate manifest changes or Helm upgrades for the application. The migration process depends on how you installed W\&B Server: > [!NOTE] > > The W\&B Operator is the default and recommended installation method for W\&B Server. Reach out to [Customer Support](mailto:forge-support@coreweave.com) or your Weights & Biases team if you have any questions. * If you used the official W\&B Cloud Terraform Modules, navigate to the appropriate documentation and follow the steps there: * [AWS](#migrate-to-operator-based-aws-terraform-modules) * [Google Cloud](#migrate-to-operator-based-google-cloud-terraform-modules) * [Azure](#migrate-to-operator-based-azure-terraform-modules) * If you used the [W\&B Non-Operator Helm chart](https://github.com/wandb/helm-charts/tree/main/charts/wandb), see [Migrate to operator-based Helm chart](#migrate-to-operator-based-helm-chart). * If you used the [W\&B Non-Operator Helm chart with Terraform](https://registry.terraform.io/modules/wandb/wandb/kubernetes/latest), see [Migrate to operator-based Terraform Helm chart](#migrate-to-operator-based-terraform-helm-chart). * If you created the Kubernetes resources with manifests, see [Migrate to operator-based Helm chart](#migrate-to-operator-based-helm-chart). ### Migrate to operator-based AWS Terraform modules For a detailed description of the migration process, see the [operator-wandb chart documentation](https://github.com/wandb/helm-charts/tree/main/charts/operator-wandb). ### Migrate to operator-based Google Cloud Terraform modules Reach out to [Support](mailto:forge-support@coreweave.com) or your CoreWeave team if you have any questions or need assistance. ### Migrate to operator-based Azure Terraform modules Reach out to [Support](mailto:forge-support@coreweave.com) or your CoreWeave team if you have any questions or need assistance. ### Migrate to operator-based Helm chart Follow these steps to migrate to the operator-based Helm chart: 1. Get the current Weights & Biases configuration. If you deployed Weights & Biases with a non-operator-based version of the Helm chart, export the values like this: ```shell theme={"system"} helm get values wandb ``` If you deployed Weights & Biases with Kubernetes manifests, export the values like this: ```shell theme={"system"} kubectl get deployment wandb -o yaml ``` You now have all the configuration values you need for the next step. 2. Create a file called `operator.yaml`. Follow the format described in the [Configuration Reference](#configuration-reference-for-wb-operator). Use the values from step 1. 3. Scale the current deployment to 0 pods. This step stops the current deployment. ```shell theme={"system"} kubectl scale --replicas=0 deployment wandb ``` 4. Update the Helm chart repo: ```shell theme={"system"} helm repo update ``` 5. Install the new Helm chart: ```shell theme={"system"} helm upgrade --install operator wandb/operator -n wandb-cr --create-namespace ``` 6. Configure the new Helm chart and trigger Weights & Biases application deployment. Apply the new configuration. ```shell theme={"system"} kubectl apply -f operator.yaml ``` The deployment takes a few minutes to complete. 7. Verify the installation. Make sure that everything works by following the steps in [Verify the installation](#verify-the-installation). 8. Remove the old installation. Uninstall the old Helm chart or delete the resources that you created with manifests. ### Migrate to operator-based Terraform Helm chart Follow these steps to migrate to the operator-based Helm chart: 1. Prepare Terraform config. Replace the Terraform code from the old deployment in your Terraform config with the code described in [Deploy Weights & Biases with Helm Terraform module](#deploy-wb-with-helm-terraform-module). Set the same variables as before. Do not change the `.tfvars` file if you have one. 2. Execute Terraform run. Execute `terraform init`, `terraform plan`, and `terraform apply`. 3. Verify the installation. Make sure that everything works by following the steps in [Verify the installation](#verify-the-installation). 4. Remove the old installation. Uninstall the old Helm chart or delete the resources that you created with manifests. ## Configuration reference for W\&B Server This section is a reference for the configuration options that you set in your `WeightsAndBiases` custom resource. Use it to look up the YAML schema for a specific subsystem (for example, MySQL, Redis, ingress, or OIDC) as you build or update your `operator.yaml` file. This section describes the configuration options for W\&B Server application. The application receives its configuration as custom resource definition named [WeightsAndBiases](#how-it-works). Some configuration options are exposed with the following configuration. You must set others as environment variables. The documentation has two lists of environment variables: [basic](/products/wandb/platform/hosting/env-vars) and [advanced](/products/wandb/platform/hosting/iam/advanced_env_vars). Only use environment variables if the configuration option that you need is not exposed using the Helm chart. ### Basic example This example defines the minimum set of values required for Weights & Biases. For a more realistic production example, see [Complete example](#complete-example). This YAML file defines the desired state of your Weights & Biases deployment, including the version, environment variables, external resources like databases, and other necessary settings. ```yaml theme={"system"} apiVersion: apps.wandb.com/v1 kind: WeightsAndBiases metadata: labels: app.kubernetes.io/name: weightsandbiases app.kubernetes.io/instance: wandb name: wandb namespace: default spec: values: global: host: https:// license: eyJhbGnUzaH...j9ZieKQ2x5GGfw bucket:
mysql: ingress: annotations: ``` Find the full set of values in the [W\&B Helm repository](https://github.com/wandb/helm-charts/blob/main/charts/operator-wandb/values.yaml). **Change only those values you need to override**. ### Complete example This example configuration deploys Weights & Biases to Google Cloud Anthos using Google Cloud Storage: ```yaml theme={"system"} apiVersion: apps.wandb.com/v1 kind: WeightsAndBiases metadata: labels: app.kubernetes.io/name: weightsandbiases app.kubernetes.io/instance: wandb name: wandb namespace: default spec: values: global: host: https://abc-wandb.sandbox-gcp.wandb.ml bucket: name: abc-wandb-moving-pipefish provider: gcs mysql: database: wandb_local host: 10.218.0.2 name: wandb_local password: 8wtX6cJHizAZvYScjDzZcUarK4zZGjpV port: 3306 user: wandb redis: host: redis.example.com port: 6379 password: password api: enabled: true glue: enabled: true executor: enabled: true license: eyJhbGnUzaHgyQjQyQWhEU3...ZieKQ2x5GGfw ingress: annotations: ingress.gcp.kubernetes.io/pre-shared-cert: abc-wandb-cert-creative-puma kubernetes.io/ingress.class: gce kubernetes.io/ingress.global-static-ip-name: abc-wandb-operator-address ``` ### Host ```yaml theme={"system"} # Provide the FQDN with protocol global: # example host name, replace with your own host: https://wandb.example.com ``` ### Object storage (bucket) **AWS** ```yaml theme={"system"} global: bucket: provider: "s3" name: "" kmsKey: "" region: "" ``` **Google Cloud** ```yaml theme={"system"} global: bucket: provider: "gcs" name: "" ``` **Azure** ```yaml theme={"system"} global: bucket: provider: "az" name: "" secretKey: "" ``` **Other providers (Minio, Ceph, and other S3-compatible storage)** For other S3 compatible providers, set the bucket configuration as follows: ```yaml theme={"system"} global: bucket: # Example values, replace with your own provider: s3 name: storage.example.com kmsKey: null path: wandb region: default accessKey: 5WOA500...P5DK7I secretKey: HDKYe4Q...JAp1YyjysnX ``` For S3-compatible storage hosted outside of AWS, `kmsKey` must be `null`. To reference `accessKey` and `secretKey` from a secret: ```yaml theme={"system"} global: bucket: # Example values, replace with your own provider: s3 name: storage.example.com kmsKey: null path: wandb region: default secret: secretName: bucket-secret accessKeyName: ACCESS_KEY secretKeyName: SECRET_KEY ``` ### MySQL ```yaml theme={"system"} global: mysql: # Example values, replace with your own host: db.example.com port: 3306 database: wandb_local user: wandb password: 8wtX6cJH...ZcUarK4zZGjpV ``` To reference the `password` from a secret: ```yaml theme={"system"} global: mysql: # Example values, replace with your own host: db.example.com port: 3306 database: wandb_local user: wandb passwordSecret: name: database-secret passwordKey: MYSQL_WANDB_PASSWORD ``` ### License ```yaml theme={"system"} global: # Example license, replace with your own license: eyJhbGnUzaHgyQjQy...VFnPS_KETXg1hi ``` To reference the `license` from a secret: ```yaml theme={"system"} global: licenseSecret: name: license-secret key: CUSTOMER_WANDB_LICENSE ``` ### Ingress See [How to identify the Kubernetes ingress class](#how-to-identify-the-kubernetes-ingress-class). **Without TLS** ```yaml theme={"system"} global: # IMPORTANT: Ingress is on the same level in the YAML as 'global' (not a child) ingress: class: "" ``` **With TLS** Create a secret that contains the certificate ```console theme={"system"} kubectl create secret tls wandb-ingress-tls --key wandb-ingress-tls.key --cert wandb-ingress-tls.crt ``` Reference the secret in the ingress configuration ```yaml theme={"system"} global: # IMPORTANT: Ingress is on the same level in the YAML as 'global' (not a child) ingress: class: "" annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" tls: - secretName: wandb-ingress-tls hosts: - ``` For Nginx, you might have to add the following annotation: ```yaml theme={"system"} ingress: annotations: nginx.ingress.kubernetes.io/proxy-body-size: 0 ``` ### Custom Kubernetes service accounts Specify custom Kubernetes service accounts to run the Weights & Biases pods. The following snippet creates a service account as part of the deployment with the specified name: ```yaml theme={"system"} app: serviceAccount: name: custom-service-account create: true parquet: serviceAccount: name: custom-service-account create: true global: ... ``` The subsystems "app" and "parquet" run under the specified service account. The other subsystems run under the default service account. If the service account already exists on the cluster, set `create: false`: ```yaml theme={"system"} app: serviceAccount: name: custom-service-account create: false parquet: serviceAccount: name: custom-service-account create: false global: ... ``` You can specify service accounts on different subsystems such as app, parquet, console, and others: ```yaml theme={"system"} app: serviceAccount: name: custom-service-account create: true console: serviceAccount: name: custom-service-account create: true global: ... ``` The service accounts can be different between the subsystems: ```yaml theme={"system"} app: serviceAccount: name: custom-service-account create: false console: serviceAccount: name: another-custom-service-account create: true global: ... ``` ### External Redis ```yaml theme={"system"} redis: install: false global: redis: host: "" port: 6379 password: "" parameters: {} caCert: "" ``` To reference the `password` from a secret: ```console theme={"system"} kubectl create secret generic redis-secret --from-literal=redis-password=supersecret ``` Reference it in the following configuration: ```yaml theme={"system"} redis: install: false global: redis: host: redis.example port: 9001 auth: enabled: true secret: redis-secret key: redis-password ``` ### LDAP > [!WARNING] > > LDAP configuration support in the current Helm chart is limited. Contact Weights & Biases Support or your AISE for assistance configuring LDAP. Configure LDAP by setting environment variables in `global.extraEnv`: ```yaml theme={"system"} global: extraEnv: LDAP_ADDRESS: ldaps://ldap.company.example.com LDAP_BASE_DN: cn=accounts,dc=company,dc=example,dc=com LDAP_USER_BASE_DN: cn=users,cn=accounts,dc=company,dc=example,dc=com LDAP_GROUP_BASE_DN: cn=groups,cn=accounts,dc=company,dc=example,dc=com LDAP_BIND_DN: uid=ldapbind,cn=sysaccounts,cn=etc,dc=company,dc=example,dc=com LDAP_BIND_PW: ******************** LDAP_ATTRIBUTES: email=mail,name=cn LDAP_TLS_ENABLE: "true" LDAP_LOGIN: "true" LDAP_USER_OBJECT_CLASS: user LDAP_GROUP_OBJECT_CLASS: group ``` This legacy approach is no longer recommended. This section is provided for reference. **Without TLS** ```yaml theme={"system"} global: ldap: enabled: true # LDAP server address including "ldap://" or "ldaps://" host: # LDAP search base to use for finding users baseDN: # LDAP user to bind with (if not using anonymous bind) bindDN: # Secret name and key with LDAP password to bind with (if not using anonymous bind) bindPW: # LDAP attribute for email and group ID attribute names as comma separated string values. attributes: # LDAP group allow list groupAllowList: # Enable LDAP TLS tls: false ``` **With TLS** The LDAP TLS cert configuration requires a config map pre-created with the certificate content. To create the config map you can use the following command: ```console theme={"system"} kubectl create configmap ldap-tls-cert --from-file=certificate.crt ``` And use the config map in the YAML like the following example. ```yaml theme={"system"} global: ldap: enabled: true # LDAP server address including "ldap://" or "ldaps://" host: # LDAP search base to use for finding users baseDN: # LDAP user to bind with (if not using anonymous bind) bindDN: # Secret name and key with LDAP password to bind with (if not using anonymous bind) bindPW: # LDAP attribute for email and group ID attribute names as comma separated string values. attributes: # LDAP group allow list groupAllowList: # Enable LDAP TLS tls: true # ConfigMap name and key with CA certificate for LDAP server tlsCert: configMap: name: "ldap-tls-cert" key: "certificate.crt" ``` ### OIDC SSO ```yaml theme={"system"} global: auth: sessionLengthHours: 720 oidc: clientId: "" secret: "" # Only include if your IdP requires it. authMethod: "" issuer: "" ``` `authMethod` is optional. ### SMTP ```yaml theme={"system"} global: email: smtp: host: "" port: 587 user: "" password: "" ``` ### Environment variables ```yaml theme={"system"} global: extraEnv: GLOBAL_ENV: "example" ``` ### Set rate limits For Self-Managed deployments that use the Operator, you can optionally configure [rate limits](/products/wandb/platform/hosting/self-managed/rate-limits) by setting environment variables in `spec.values.global.extraEnv`. Rate limits are off by default: if you don't set them, the instance doesn't enforce any limits. Set only the limits you want to enforce. This example sets `GORILLA_LIMITER` and each filestream and run update limit to the value that CoreWeave recommends for typical production workloads: ```yaml theme={"system"} spec: values: global: extraEnv: GORILLA_LIMITER: "redis://[REDIS-HOST]:6379?ttlInSeconds=900" GORILLA_DEFAULT_RATE_LIMITS_FILESTREAM_COUNT: "500" GORILLA_DEFAULT_RATE_LIMITS_FILESTREAM_SIZE: "120" GORILLA_DEFAULT_RATE_LIMITS_FILESTREAM_PER_RUN_COUNT: "2" GORILLA_DEFAULT_RATE_LIMITS_RUN_UPDATE_COUNT: "80" ``` > [!WARNING] > > To enforce any rate limit, you must set `GORILLA_LIMITER` to the connection string of your Redis server. If `GORILLA_LIMITER` isn't set, the instance ignores the other rate limit variables. Setting `GORILLA_LIMITER` in `global.extraEnv` works with any version of the `operator-wandb` Helm chart, and takes precedence over the value the chart sets. Refer to the following table for more detail: | Environment variable | Recommended value | Description | | - | - | - | | `GORILLA_LIMITER` | None | Connection string of the Redis server that tracks rate limit usage. Required to enforce any rate limit. | | `GORILLA_DEFAULT_RATE_LIMITS_FILESTREAM_COUNT` | `500` | Filestream requests per second, per project. | | `GORILLA_DEFAULT_RATE_LIMITS_FILESTREAM_SIZE` | `120` | Filestream data ingested per second, per project, in MB. | | `GORILLA_DEFAULT_RATE_LIMITS_FILESTREAM_PER_RUN_COUNT` | `2` | Filestream requests per second, per run. | | `GORILLA_DEFAULT_RATE_LIMITS_RUN_UPDATE_COUNT` | `80` | Run creation and metadata update requests per second, per project. | | `GORILLA_DEFAULT_RATE_LIMITS_SDK_GRAPHQL_QUERY_SECONDS` | Not set | Database time, in seconds, that GraphQL queries from the SDK can use per second, per project. | Each limit is measured over a 15-second window, so a project can briefly exceed the per-second value as long as its average over the window stays within the limit. A value of `0`, or leaving a variable unset, turns that limit off. > [!WARNING] > > Don't set a rate limit to a negative value. A negative value can block all requests of that type instead of removing the limit. ### Custom certificate authority `customCACerts` is a list and can take many certificates. Certificate authorities specified in `customCACerts` only apply to the W\&B Server application. ```yaml theme={"system"} global: customCACerts: - | -----BEGIN CERTIFICATE----- MIIBnDCCAUKgAwIBAg.....................fucMwCgYIKoZIzj0EAwIwLDEQ MA4GA1UEChMHSG9tZU.....................tZUxhYiBSb290IENBMB4XDTI0 MDQwMTA4MjgzMFoXDT.....................oNWYggsMo8O+0mWLYMAoGCCqG SM49BAMCA0gAMEUCIQ.....................hwuJgyQRaqMI149div72V2QIg P5GD+5I+02yEp58Cwxd5Bj2CvyQwTjTO4hiVl1Xd0M0= -----END CERTIFICATE----- - | -----BEGIN CERTIFICATE----- MIIBxTCCAWugAwIB.......................qaJcwCgYIKoZIzj0EAwIwLDEQ MA4GA1UEChMHSG9t.......................tZUxhYiBSb290IENBMB4XDTI0 MDQwMTA4MjgzMVoX.......................UK+moK4nZYvpNpqfvz/7m5wKU SAAwRQIhAIzXZMW4.......................E8UFqsCcILdXjAiA7iTluM0IU aIgJYVqKxXt25blH/VyBRzvNhViesfkNUQ== -----END CERTIFICATE----- ``` CA certificates can also be stored in a ConfigMap: ```yaml theme={"system"} global: caCertsConfigMap: custom-ca-certs ``` The ConfigMap must look like this: ```yaml theme={"system"} apiVersion: v1 kind: ConfigMap metadata: name: custom-ca-certs data: ca-cert1.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ca-cert2.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ``` > [!NOTE] > > If using a ConfigMap, each key in the ConfigMap must end with `.crt` (for example, `my-cert.crt` or `ca-cert1.crt`). This naming convention is required for `update-ca-certificates` to parse and add each certificate to the system CA store. ### Custom security context Each Weights & Biases component supports custom security context configurations of the following form: ```yaml theme={"system"} pod: securityContext: runAsNonRoot: true runAsUser: 1001 runAsGroup: 0 fsGroup: 1001 fsGroupChangePolicy: Always seccompProfile: type: RuntimeDefault container: securityContext: capabilities: drop: - ALL readOnlyRootFilesystem: false allowPrivilegeEscalation: false ``` > [!NOTE] > > The only valid value for `runAsGroup:` is `0`. Any other value is an error. For example, to configure the application pod, add a section `app` to your configuration: ```yaml theme={"system"} global: ... app: pod: securityContext: runAsNonRoot: true runAsUser: 1001 runAsGroup: 0 fsGroup: 1001 fsGroupChangePolicy: Always seccompProfile: type: RuntimeDefault container: securityContext: capabilities: drop: - ALL readOnlyRootFilesystem: false allowPrivilegeEscalation: false ``` The same concept applies to `console`, `weave`, `weave-trace`, and `parquet`. ## Configuration reference for W\&B Operator This section describes configuration options for W\&B Kubernetes Operator (`wandb-controller-manager`). The operator receives its configuration in the form of a YAML file. By default, the W\&B Kubernetes Operator doesn't need a configuration file. Create a configuration file if required. For example, you might need a configuration file to specify custom certificate authorities, deploy in an air gap environment, and so forth. Find the full list of spec customization [in the Helm repository](https://github.com/wandb/helm-charts/blob/main/charts/operator/values.yaml). ### Custom CA A custom certificate authority (`customCACerts`) is a list and can take many certificates. Those certificate authorities, when added, only apply to the W\&B Kubernetes Operator (`wandb-controller-manager`). ```yaml theme={"system"} customCACerts: - | -----BEGIN CERTIFICATE----- MIIBnDCCAUKgAwIBAg.....................fucMwCgYIKoZIzj0EAwIwLDEQ MA4GA1UEChMHSG9tZU.....................tZUxhYiBSb290IENBMB4XDTI0 MDQwMTA4MjgzMFoXDT.....................oNWYggsMo8O+0mWLYMAoGCCqG SM49BAMCA0gAMEUCIQ.....................hwuJgyQRaqMI149div72V2QIg P5GD+5I+02yEp58Cwxd5Bj2CvyQwTjTO4hiVl1Xd0M0= -----END CERTIFICATE----- - | -----BEGIN CERTIFICATE----- MIIBxTCCAWugAwIB.......................qaJcwCgYIKoZIzj0EAwIwLDEQ MA4GA1UEChMHSG9t.......................tZUxhYiBSb290IENBMB4XDTI0 MDQwMTA4MjgzMVoX.......................UK+moK4nZYvpNpqfvz/7m5wKU SAAwRQIhAIzXZMW4.......................E8UFqsCcILdXjAiA7iTluM0IU aIgJYVqKxXt25blH/VyBRzvNhViesfkNUQ== -----END CERTIFICATE----- ``` CA certificates can also be stored in a ConfigMap: ```yaml theme={"system"} caCertsConfigMap: custom-ca-certs ``` The ConfigMap must look like this: ```yaml theme={"system"} apiVersion: v1 kind: ConfigMap metadata: name: custom-ca-certs data: ca-cert1.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ca-cert2.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- ``` > [!NOTE] > > Each key in the ConfigMap must end with `.crt` (for example, `my-cert.crt` or `ca-cert1.crt`). This naming convention is required for `update-ca-certificates` to parse and add each certificate to the system CA store. ## FAQ ### Purpose and role of each pod A W\&B Server deployment includes the following pods: * **`wandb-app`**: the core of Weights & Biases, including the GraphQL API and frontend application. It powers most of the Weights & Biases platform's functionality. * **`wandb-console`**: the administration console, accessed through `/console`. * **`wandb-otel`**: the OpenTelemetry agent, which collects metrics and logs from resources at the Kubernetes layer for display in the administration console. * **`wandb-prometheus`**: the Prometheus server, which captures metrics from various components for display in the administration console. * **`wandb-parquet`**: a backend microservice separate from the `wandb-app` pod that exports database data to object storage in Parquet format. * **`wandb-weave`**: another backend microservice that loads query tables in the UI and supports various core app features. * **`wandb-weave-trace`**: a framework for tracking, experimenting with, evaluating, deploying, and improving LLM-based applications. The framework is accessed through the `wandb-app` pod. ### How to get the W\&B Operator Console password See [Access the Weights & Biases management console](#access-the-weights-&-biases-management-console). ### How to access the W\&B Operator Console if Ingress doesn't work Execute the following command on a host that can reach the Kubernetes cluster: ```console theme={"system"} kubectl port-forward svc/wandb-console 8082 ``` Access the console in the browser with `https://localhost:8082/` console. For how to get the password (Option 2), see [Access the Weights & Biases management console](#access-the-weights-&-biases-management-console). ### How to view W\&B Server logs The application pod is named **wandb-app-xxx**. ```console theme={"system"} kubectl get pods kubectl logs wandb-XXXXX-XXXXX ``` ### How to identify the Kubernetes ingress class You can get the ingress class installed in your cluster by running ```console theme={"system"} kubectl get ingressclass ``` # Rate limits Source: https://docs.coreweave.com/products/wandb/platform/hosting/self-managed/rate-limits Optional rate limits on Self-Managed instances for stability You can configure rate limits on your W\&B Self-Managed instance to maintain stability and prevent one user or workload from affecting others. These limits are optional. If you don't set them, the instance doesn't enforce any limits. ## Default limits and notification The following default limits help maintain platform stability: | Limit | Default | Scope | | - | - | - | | Filestream requests per second | 500 | Project | | Filestream ingestion per second | 120 MB | Project | | Filestream requests per second | 2 | Run | | Run creation requests per second | 80 | Project | When a limit is exceeded, the W\&B SDK returns HTTP response `429`, and the message `HTTP 429: rate limit exceeded` appears in the SDK logs. How the SDK responds depends on which limit was exceeded: * Filestream rate limits don't cause logging to crash or fail. When the SDK receives a `429` response on a filestream request, it backs off and retries the rate-limited request as-is, while subsequent updates accumulate. * Run creation rate limits block further training. ```text theme={"system"} HTTP 429: rate limit exceeded ``` CoreWeave recommends these defaults for typical production workloads. If your workloads consistently exceed these limits, you can adjust them (or leave them unset) according to your instance size and shared usage. See [Set rate limits](/products/wandb/platform/hosting/self-managed/operator#set-rate-limits). Contact [Support](mailto:forge-support@coreweave.com) if you need help sizing these limits for your deployment. # Reference architecture Source: https://docs.coreweave.com/products/wandb/platform/hosting/self-managed/ref-arch Review self-managed Weights & Biases architecture covering Kubernetes, MySQL, object storage, and networking. This page describes a reference architecture for a Weights & Biases deployment and outlines the recommended infrastructure and resources to support a production deployment of the platform. Use it as a planning guide to size, provision, and integrate the components required for a reliable Self-Managed installation. This page is intended for platform engineers, site reliability engineers, and infrastructure administrators who deploy and operate Weights & Biases on their own infrastructure. Depending on your chosen deployment environment for Weights & Biases, different services can help to enhance the resiliency of your deployment. For instance, major cloud providers offer managed database services that help to reduce the complexity of database configuration, maintenance, high availability, and resilience. This reference architecture addresses common deployment scenarios and shows how you can integrate your Weights & Biases deployment with cloud vendor services for performance and reliability. ## Before you start Running any application in production comes with its own set of challenges, and Weights & Biases is no exception. Although Weights & Biases aims to streamline the process, complexities may arise depending on your architecture and design decisions. Typically, managing a production deployment involves overseeing components including hardware, operating systems, networking, storage, security, the Weights & Biases platform itself, and other dependencies. This responsibility extends to both the initial setup of the environment and its ongoing maintenance. Consider carefully whether a Self-Managed approach with Weights & Biases is suitable for your team and your requirements. A strong understanding of how to run and maintain production-grade application is an important prerequisite before you deploy Self-Managed Weights & Biases. If your team needs assistance, the CoreWeave Professional Services team and partners offer support for implementation and optimization. To learn more about managed solutions for running Weights & Biases instead of managing it yourself, refer to [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) and [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud). ## Infrastructure A Weights & Biases deployment consists of an application layer and a storage layer. The following diagram shows how these layers fit together, and the subsections that follow describe each one. ![Weights & Biases infrastructure diagram](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/platform/_media/reference_architecture.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=832a4f347550db6c0d97872128fa6333) ### Application layer The application layer consists of a multi-node Kubernetes cluster, with resilience against node failures. The Kubernetes cluster runs and maintains the Weights & Biases pods. ### Storage layer The storage layer consists of a MySQL database and object storage. The MySQL database stores metadata and the object storage stores artifacts such as models and datasets. ## Infrastructure requirements The following sections detail requirements for a Weights & Biases deployment, including Kubernetes cluster details, MySQL, Redis, object storage, software versions, networking, DNS, load balancer and ingress, SSL/TLS, and supported CPU architectures. Confirm that your environment meets each of these requirements before you begin a deployment. ### Kubernetes Weights & Biases deploys the W\&B Server application as a [Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator) that deploys multiple pods. For this reason, Weights & Biases requires a Kubernetes cluster with: * A fully configured and functioning ingress controller. * The capability to provision Persistent Volumes. Weights & Biases supports deployment on [OpenShift Kubernetes clusters](https://www.redhat.com/en/technologies/cloud-computing/openshift) in cloud, on-premises, and air-gapped environments. For specific configuration instructions, see the [OpenShift section](/products/wandb/platform/hosting/self-managed/operator#openshift-kubernetes-clusters) in the Operator guide. ### MySQL MySQL 8.0.x reached end of life in April 2026. W\&B Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. If you run community MySQL, install or upgrade to **MySQL 8.4.x**. If you use a managed service, run an engine version your provider documents as supported and patched (for example Amazon RDS for MySQL, Google Cloud SQL for MySQL, or Azure Database for MySQL). W\&B has validated the platform against MySQL 8.4.0 and current 8.4.x releases. If you are still on MySQL 8.0.x, plan an upgrade using the steps in [Upgrade MySQL to 8.4.x](/products/wandb/platform/hosting/self-managed/operator#upgrade-mysql-to-84x). Weights & Biases stores metadata in a MySQL database. The database's performance and storage requirements depend on the shapes of the model parameters and related metadata. For example, the database grows in size as you track more training runs, and load on the database increases based on queries in run tables, user workspaces, and reports. **Weights & Biases strongly recommends using managed database services** (such as AWS RDS Aurora MySQL, Google Cloud SQL for MySQL, or Azure Database for MySQL) for production deployments. Managed services provide automated backups, monitoring, high availability, and patching, and reduce operational complexity. See the [Cloud provider instance recommendations](#cloud-provider-instance-recommendations) section for specific service recommendations. If you choose to deploy a self-managed MySQL database, consider the following: * **Backups**: Periodically back up the database to a separate facility. Weights & Biases recommends daily backups with at least 1 week of retention. * **Performance**: The database requires fast storage hardware, such as SSD or accelerated NAS. * **Monitoring**: The database requires adequate CPU resources. Monitor the database server's CPU load. If CPU usage is sustained at > 90% of the system for more than 5 minutes, consider adding CPU capacity. * **Availability**: To meet your availability and durability requirements, Weights & Biases recommends configuring a hot standby deployment on a separate machine. The standby streams all updates in real time from the primary deployment and is ready to fail over if the primary server crashes, becomes corrupted, or experiences sustained downtime. #### MySQL topology For production, a managed MySQL service is the simplest path to high availability because the cloud provider handles failover, backups, and patching. Use the provider's high availability option, for example, Aurora Multi-AZ on AWS. If you run self-managed MySQL, use a primary database with a hot standby that receives a real-time replication stream and can take over on failure. Weights & Biases doesn't support a multi-primary topology or read-only replicas for the application database. #### MySQL database creation For instructions to manually create the MySQL database and user, see the [bare-metal guide MySQL database section](/products/wandb/platform/hosting/self-managed/operator#mysql-database). #### MySQL configuration parameters These parameters tune MySQL for the write patterns and schema changes that Weights & Biases performs at scale. If you're running your own MySQL instance, configure MySQL with these settings: ```ini theme={"system"} binlog_format = 'ROW' binlog_row_image = 'MINIMAL' innodb_flush_log_at_trx_commit = 1 innodb_online_alter_log_max_size = 268435456 max_prepared_stmt_count = 1048576 sort_buffer_size = '67108864' sync_binlog = 1 ``` Weights & Biases has validated these settings for performance and reliability. ### Redis Weights & Biases depends on a single-node Redis 7.x deployment that Weights & Biases components use for job queuing and data caching. For convenience during testing and development of proofs of concept, W\&B Self-Managed includes a local Redis deployment that isn't appropriate for production deployments. Weights & Biases can connect to a Redis instance in the following environments: * [AWS Elasticache](https://aws.amazon.com/elasticache/). * [Google Cloud Memory Store](https://cloud.google.com/memorystore?hl=en). * [Azure Cache for Redis](https://azure.microsoft.com/en-us/products/cache). * Redis deployment hosted in your cloud or on-premises infrastructure. ### Object storage Weights & Biases requires object storage with pre-signed URL and CORS support, deployed in one of: * [CoreWeave AI Object Storage](/products/storage/object-storage) is an S3-compatible object storage service optimized for AI workloads. * [Amazon S3](https://aws.amazon.com/s3/) is an object storage service that provides scalability, data availability, security, and performance. * [Google Cloud Storage](https://cloud.google.com/storage) is a managed service for storing unstructured data at scale. * [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs) is a cloud-based object storage solution for storing unstructured data like text, binary data, images, videos, and logs. * S3-compatible storage such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor), [NetApp StorageGRID](https://www.netapp.com/data-storage/storagegrid/), or other enterprise-grade solutions hosted in your cloud or on-premises infrastructure. ### Versions | Software | Minimum version | | - | - | | Kubernetes | v1.34 or newer ([Supported Kubernetes versions](https://kubernetes.io/releases/patch-releases/)) | | Helm | v3.x | | MySQL | W\&B Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. Install or upgrade to **MySQL 8.4.x**, or use a managed service version that your provider documents as supported and patched. Aurora MySQL version strings differ from community MySQL versions. Use `SELECT version()` to see the full engine version string and `SELECT aurora_version()` to see the Aurora version. [Aurora MySQL version 3](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html) is compatible with MySQL 8.0.x and is still supported. See [Amazon Aurora versioning](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.VersionPolicy.Versioning.html) and your cloud provider's documentation when you choose a target version. | | Redis | v7.x | | ClickHouse | Required for Weave on Self-Managed deployments. Not required if your deployment does not use Weave. See [ClickHouse compatibility for upgrades](/products/wandb/platform/hosting/self-managed/operator#clickhouse-compatibility-for-upgrades) and [Supported W\&B Server releases](/release-notes/server-releases). | ### Networking For a networked deployment, allow egress to these endpoints during both installation and runtime: * `https://deploy.wandb.ai` * `https://charts.wandb.ai` * `https://quay.io` (used for Prometheus images) > [!NOTE] > > Additional container registries might be required depending on your deployment configuration: > > * `https://gcr.io` when you deploy Bufstream and etcd for Weave online evaluations. To learn about air-gapped deployments, refer to [Kubernetes operator for air-gapped instances](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped). Grant the training infrastructure and each experiment tracking system access to W\&B and the object storage. ### DNS The fully qualified domain name (FQDN) of the Weights & Biases deployment must resolve to the IP address of the ingress or load balancer using an `A` record. ### Load balancer and ingress The W\&B Kubernetes Operator can expose services using a Kubernetes ingress controller, which routes to service endpoints based on URL paths with different ports. The ingress controller must be accessible by all machines that execute machine learning payloads or access the service through web browsers. #### Ingress controller requirements Your Kubernetes cluster must have an `IngressClass` available. Common ingress controller options include: * [Nginx Ingress Controller](https://kubernetes.github.io/ingress-nginx/). * [Istio](https://istio.io). * [Traefik](https://traefik.io/). * Cloud provider ingress controllers (AWS ALB, GCP Ingress, and Azure Application Gateway). #### Weights & Biases service routing The W\&B Operator routes requests automatically to multiple backend services based on path: | Path | Service | Default port | Purpose | | - | - | - | - | | `/` | `wandb-app` | 8080 | Main web application UI | | `/api` | `wandb-api` | 8081 | API service | | `/graphql` | `wandb-api` | 8081 | GraphQL API endpoint | | `/graphql2` | `wandb-api` | 8081 | GraphQL API v2 endpoint | | `/console` | `wandb-console` | 8082 | System Console | | `/traces` | `wandb-weave-trace` | 8722 | Weave tracing service (if enabled) | #### Example ingress configuration The following shows an example ingress resource created by the W\&B Operator: ```yaml theme={"system"} apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wandb namespace: wandb annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: ingressClassName: nginx rules: - host: wandb.example.com http: paths: - path: / pathType: Prefix backend: service: name: wandb-app port: number: 8080 - path: /api pathType: Prefix backend: service: name: wandb-api port: number: 8081 - path: /graphql pathType: Prefix backend: service: name: wandb-api port: number: 8081 - path: /graphql2 pathType: Prefix backend: service: name: wandb-api port: number: 8081 - path: /console pathType: Prefix backend: service: name: wandb-console port: number: 8082 tls: - hosts: - wandb.example.com secretName: wandb-tls ``` > [!NOTE] > > The W\&B Operator creates and manages the ingress configuration automatically. You typically don't need to create ingress resources manually. Make sure your cluster has a functioning ingress controller and the appropriate `IngressClass` configured. ### SSL/TLS W\&B requires a valid signed SSL/TLS certificate for secure communication between clients and the server. SSL/TLS termination must occur on the ingress or load balancer. The W\&B Server application doesn't terminate SSL or TLS connections. > [!WARNING] > > W\&B doesn't support self-signed certificates or custom CAs. Self-signed certificates cause challenges for users and aren't supported. If possible, use a service like [Let's Encrypt](https://letsencrypt.org) to provide trusted certificates to your load balancer. Services like Caddy and Cloudflare manage SSL for you. If your security policies require SSL communication within your trusted networks, consider using a tool like Istio and [sidecar containers](https://istio.io/latest/docs/reference/config/networking/sidecar/). ### Supported CPU architectures Weights & Biases runs on Intel and AMD 64-bit architecture. ARM isn't supported. ## Deployment method After your infrastructure meets the preceding requirements, choose how to install Weights & Biases and provision the underlying resources. The following sections describe the recommended deployment method and the recommended approach for infrastructure provisioning. ### W\&B Kubernetes Operator with Helm The recommended installation method for W\&B Self-Managed uses the **W\&B Kubernetes Operator**, deployed through Helm. This approach provides: * Automated updates and management of Weights & Biases components. * Simplified configuration and deployment. * Support for all deployment scenarios (cloud, on-premises, and air-gapped). For detailed installation instructions, see: * [Deploy W\&B Platform On-premises](/products/wandb/platform/hosting/self-managed/operator) - Primary installation guide. * [Kubernetes operator for air-gapped instances](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped) - For disconnected environments. ### Infrastructure provisioning Terraform is the recommended way to provision infrastructure for Weights & Biases production deployments. With Terraform, you define the required resources, their references to other resources, and their dependencies. Weights & Biases provides Terraform modules for the major cloud providers. For details, refer to [Deploy W\&B Server within Self-Managed cloud accounts](/products/wandb/platform/hosting/hosting-options/self-managed#deploy-wb-server-within-Self-Managed-cloud-accounts). ## Sizing Use the following guidelines as a starting point when planning a deployment. Weights & Biases recommends that you monitor all components of a deployment closely and that you make adjustments based on observed usage patterns. Continue to monitor production deployments over time and make adjustments as needed to maintain performance. When you plan capacity, you size two core components: a Kubernetes cluster for the W\&B Operator workload and a MySQL database for metadata. Recommendations vary by **environment** (Test/Dev or Production) and, for Kubernetes only, by **product mix** (Models only, Weave only, or Models and Weave). Weights & Biases recommends starting with a minimum of 3 worker nodes for both Test/Dev and Production, and enabling cluster autoscaling in Production. The following sections give per-node sizing recommendations for the Kubernetes cluster and the MySQL database. ### Kubernetes sizing **Models only** | Environment | CPU | Memory | Disk | | - | - | - | - | | Test/Dev | 2 cores | 16 GB | 100 GB | | Production | 8 cores | 64 GB | 100 GB | Numbers are per Kubernetes worker node. **Weave only** | Environment | CPU | Memory | Disk | | - | - | - | - | | Test/Dev | 4 cores | 32 GB | 100 GB | | Production | 12 cores | 96 GB | 100 GB | Numbers are per Kubernetes worker node. **Models and Weave** | Environment | CPU | Memory | Disk | | - | - | - | - | | Test/Dev | 4 cores | 32 GB | 100 GB | | Production | 16 cores | 128 GB | 100 GB | Numbers are per Kubernetes worker node. ### MySQL sizing These recommendations don't vary by product mix. For topology and availability guidance, see [MySQL topology](#mysql-topology) under [MySQL](#mysql). | Environment | CPU | Memory | Disk | | - | - | - | - | | Test/Dev | 2 cores | 16 GB | 100 GB | | Production | 8 cores | 64 GB | 500 GB | Numbers are per MySQL node. #### MySQL sizing for run width Database load also depends on *run width*, the number of distinct metrics that a single run logs at each step. For example, a run that logs 50,000 distinct metrics per step has a run width of 50K. Wide runs increase CPU load on the database, especially when the UI loads them in workspaces and reports. If your teams log wide runs, size each MySQL node for the widest runs you expect: | Run width (metrics per step) | CPU | Memory | Example AWS instance class | | - | - | - | - | | Up to 1K | 2 cores | 16 GB | `db.r6g.large` | | Up to 25K | 4 cores | 32 GB | `db.r6g.xlarge` | | Up to 50K | 8 cores | 64 GB | `db.r6g.2xlarge` | | Up to 75K | 16 cores | 128 GB | `db.r6g.4xlarge` | | Up to 100K | 32 cores | 256 GB | `db.r6g.8xlarge` | The Production recommendation in the [MySQL sizing](#mysql-sizing) table supports run widths up to 50K. ## Cloud provider instance recommendations After you determine the per-node CPU, memory, and disk requirements from the preceding sizing tables, use the following recommendations to pick specific cloud provider instance types and managed services that meet those requirements. These recommendations apply to each node of a Self-Managed deployment of Weights & Biases in cloud infrastructure. **AWS** **Recommended managed services** * **Kubernetes**: Amazon EKS * **MySQL**: Amazon RDS Aurora * **Object storage**: Amazon S3 | Environment | K8s (Models only) | K8s (Weave only) | K8s (Models\&Weave) | MySQL | | - | - | - | - | - | | Test/Dev | r6i.large | r6i.xlarge | r6i.xlarge | db.r6g.large | | Production | r6i.2xlarge | r6i.4xlarge | r6i.4xlarge | db.r6g.2xlarge | **Google Cloud** **Recommended managed services** * **Kubernetes**: Google Kubernetes Engine (GKE) * **MySQL**: Google Cloud SQL for MySQL * **Object storage**: Google Cloud Storage (GCS) | Environment | K8s (Models only) | K8s (Weave only) | K8s (Models\&Weave) | MySQL | | - | - | - | - | - | | Test/Dev | n2-highmem-2 | n2-highmem-4 | n2-highmem-4 | db-n1-highmem-2 | | Production | n2-highmem-8 | n2-highmem-16 | n2-highmem-16 | db-n1-highmem-8 | **Azure** **Recommended managed services** * **Kubernetes**: Azure Kubernetes Service (AKS) * **MySQL**: Azure Database for MySQL * **Object storage**: Azure Blob Storage | Environment | K8s (Models only) | K8s (Weave only) | K8s (Models\&Weave) | MySQL | | - | - | - | - | - | | Test/Dev | Standard\_E2\_v5 | Standard\_E4\_v5 | Standard\_E4\_v5 | MO\_Standard\_E2ds\_v4 | | Production | Standard\_E8\_v5 | Standard\_E16\_v5 | Standard\_E16\_v5 | MO\_Standard\_E8ds\_v4 | # Self-Managed infrastructure requirements Source: https://docs.coreweave.com/products/wandb/platform/hosting/self-managed/requirements Infrastructure and software requirements for W&B Self-Managed deployments This page describes the infrastructure and software requirements for deploying W\&B Self-Managed. It's intended for platform and infrastructure engineers planning a Self-Managed installation. Review these requirements before you begin your deployment to confirm that your environment can support W\&B Server. > [!NOTE] > > Weights & Biases recommends fully managed deployment options such as [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) or [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) deployment types. Weights & Biases fully managed services are straightforward and secure to use, and require minimal to no configuration. For complete architectural guidance, see the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch). ## Software version requirements | Software | Minimum version | | - | - | | Kubernetes | v1.34 or newer ([Supported Kubernetes versions](https://kubernetes.io/releases/patch-releases/)) | | Helm | v3.x | | MySQL | W\&B Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. Install or upgrade to **MySQL 8.4.x**, or use a managed service version that your provider documents as supported and patched. Aurora MySQL version strings differ from community MySQL versions. Use `SELECT version()` to see the full engine version string and `SELECT aurora_version()` to see the Aurora version. [Aurora MySQL version 3](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html) is compatible with MySQL 8.0.x and is still supported. See [Amazon Aurora versioning](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.VersionPolicy.Versioning.html) and your cloud provider's documentation when you choose a target version. | | Redis | v7.x | | ClickHouse | Required for Weave on Self-Managed deployments. Not required if your deployment does not use Weave. See [ClickHouse compatibility for upgrades](/products/wandb/platform/hosting/self-managed/operator#clickhouse-compatibility-for-upgrades) and [Supported W\&B Server releases](/release-notes/server-releases). | ## Hardware requirements **CPU Architecture**: W\&B runs on Intel (x86) CPU architecture only. ARM is not supported. **Sizing**: For CPU, memory, and disk sizing recommendations for Kubernetes nodes and MySQL, see the [Sizing section](/products/wandb/platform/hosting/self-managed/ref-arch#sizing) in the reference architecture. Requirements vary based on whether you're running Models, Weave, or both. For detailed sizing recommendations based on your use case (Models only, Weave only, or both), see the [reference architecture sizing section](/products/wandb/platform/hosting/self-managed/ref-arch#sizing). ## Kubernetes W\&B Server is deployed as a [Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator) that manages multiple pods. Your Kubernetes cluster must meet the following requirements: * **Version**: See the preceding [Software version requirements](#software-version-requirements) section. * **Ingress controller**: A fully configured and functioning ingress controller (Nginx, Istio, Traefik, or cloud provider ingress). * **Persistent volumes**: Capability to provision persistent volumes. * **CPU architecture**: Intel or AMD 64-bit (ARM is not supported). Weights & Biases supports deployment on [OpenShift Kubernetes clusters](https://www.redhat.com/en/technologies/cloud-computing/openshift) in cloud, on-premises, and air-gapped environments. For specific configuration instructions, see the [OpenShift section](/products/wandb/platform/hosting/self-managed/operator#openshift-kubernetes-clusters) in the Operator guide. For complete Kubernetes requirements, including load balancer and ingress configuration, see the [reference architecture Kubernetes section](/products/wandb/platform/hosting/self-managed/ref-arch#kubernetes). ## MySQL database MySQL 8.0.x reached end of life in April 2026. W\&B Self-Managed deployments must run a supported MySQL version that receives security patches and critical bug fixes. If you run community MySQL, install or upgrade to **MySQL 8.4.x**. If you use a managed service, run an engine version your provider documents as supported and patched (for example Amazon RDS for MySQL, Google Cloud SQL for MySQL, or Azure Database for MySQL). W\&B has validated the platform against MySQL 8.4.0 and current 8.4.x releases. If you are still on MySQL 8.0.x, plan an upgrade using the steps in [Upgrade MySQL to 8.4.x](/products/wandb/platform/hosting/self-managed/operator#upgrade-mysql-to-84x). W\&B requires an external MySQL database. For production, W\&B recommends using managed database services: * [AWS RDS Aurora MySQL](https://aws.amazon.com/rds/aurora/) * [Google Cloud SQL for MySQL](https://cloud.google.com/sql/mysql) * [Azure Database for MySQL](https://azure.microsoft.com/en-us/products/mysql/) Managed database services provide automated backups, monitoring, high availability, patching, and reduce operational overhead. See the [reference architecture](/products/wandb/platform/hosting/self-managed/ref-arch#mysql) for MySQL requirements, including sizing recommendations and configuration parameters. For the SQL to create the database, see the [bare-metal guide](/products/wandb/platform/hosting/self-managed/operator#mysql-database). For questions about your deployment's database configuration, contact [support](mailto:forge-support@coreweave.com) or your AISE. Weights & Biases recommends using managed database services such as AWS RDS Aurora MySQL, Google Cloud SQL for MySQL, or Azure Database for MySQL for production deployments. Managed services provide automated backups, monitoring, high availability, and patching, and they reduce operational complexity. ### MySQL configuration parameters If you're running your own MySQL instance, configure MySQL with the following settings for compatibility with W\&B Server: ```ini theme={"system"} binlog_format = 'ROW' binlog_row_image = 'MINIMAL' innodb_flush_log_at_trx_commit = 1 innodb_online_alter_log_max_size = 268435456 max_prepared_stmt_count = 1048576 sort_buffer_size = '67108864' sync_binlog = 1 ``` Weights & Biases has validated these settings for performance and reliability. ### Database creation If you aren't using a managed MySQL service that provisions the database automatically, follow these instructions to manually create the MySQL database and user that W\&B Server uses: Create a database and a user with the following SQL commands. Replace `[PASSWORD]` with a secure password: ```sql theme={"system"} CREATE USER 'wandb_local'@'%' IDENTIFIED BY '[PASSWORD]'; CREATE DATABASE wandb_local CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL ON wandb_local.* TO 'wandb_local'@'%' WITH GRANT OPTION; ``` For additional considerations, including backups, performance, monitoring, and availability, see the [reference architecture MySQL section](/products/wandb/platform/hosting/self-managed/ref-arch#mysql). ## Redis W\&B Server uses Redis for caching and background job coordination. W\&B depends on a single-node Redis 7.x deployment, which W\&B's components use for job queuing and data caching. For testing and proof-of-concept work, W\&B Self-Managed includes a local Redis deployment. This bundled deployment isn't appropriate for production use. For production deployments, W\&B can connect to a Redis instance in the following environments: * [Amazon ElastiCache](https://aws.amazon.com/elasticache/) * [Google Cloud Memorystore](https://cloud.google.com/memorystore?hl=en) * [Azure Cache for Redis](https://azure.microsoft.com/en-us/products/cache) * Self-hosted Redis in your cloud or on-premises infrastructure Weights & Biases can connect to a Redis instance in any of the following environments: * [AWS Elasticache](https://aws.amazon.com/pm/elasticache/). * [Google Cloud Memory Store](https://cloud.google.com/memorystore?hl=en). * [Azure Cache for Redis](https://azure.microsoft.com/en-us/products/cache). * Redis deployment hosted in your cloud or on-premises infrastructure. ## ClickHouse W\&B Weave on Self-Managed deployments uses ClickHouse. ClickHouse is not required for every Self-Managed installation. Before you upgrade W\&B Server or change your ClickHouse version, see [ClickHouse compatibility for upgrades](/products/wandb/platform/hosting/self-managed/operator#clickhouse-compatibility-for-upgrades) in the Operator guide and the compatibility notes in [Supported W\&B Server releases](/release-notes/server-releases). For deployment procedures, see [Deploy Weave in a self-managed environment](/products/wandb/weave/guides/platform/weave-self-managed). ## Object storage W\&B Server requires an object storage bucket to store artifacts, media, and run data. W\&B requires object storage with pre-signed URL and CORS support. W\&B recommends the following storage providers: * [Amazon S3](https://aws.amazon.com/s3/): Object storage service offering scalability, data availability, security, and performance. * [Google Cloud Storage](https://cloud.google.com/storage): Managed service for storing unstructured data at scale. * [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs): Cloud-based object storage for unstructured data at scale. * [CoreWeave AI Object Storage](/products/storage/object-storage): S3-compatible object storage optimized for AI workloads. * Enterprise S3-compatible storage such as [MinIO Enterprise (AIStor)](https://www.min.io/product/aistor), [NetApp StorageGRID](https://www.netapp.com/data-storage/storagegrid/), or other enterprise solutions. > [!NOTE] > > MinIO Open Source is in [maintenance mode](https://github.com/minio/minio) with no active development or pre-compiled binaries. For production deployments, W\&B recommends managed object storage services or enterprise S3-compatible solutions such as MinIO Enterprise (AIStor). After you select a provider, configure the bucket so that W\&B can access it. For detailed bucket provisioning instructions including IAM policies, CORS configuration, and access setup, see the [Bring Your Own Bucket (BYOB) guide](/products/wandb/platform/hosting/data-security/secure-storage-connector). For the complete list of object storage requirements, including capacity and performance guidance, see the [reference architecture object storage section](/products/wandb/platform/hosting/self-managed/ref-arch#object-storage). ### Provision your storage bucket Before configuring W\&B, you must provision your object storage bucket with the required IAM policies, CORS configuration, and access credentials. See the [Bring Your Own Bucket (BYOB) guide](/products/wandb/platform/hosting/data-security/secure-storage-connector) for detailed step-by-step provisioning instructions for: * Amazon S3 (including IAM policies and bucket policies) * Google Cloud Storage (including PubSub notifications) * Azure Blob Storage (including managed identities) * CoreWeave AI Object Storage * S3-compatible storage (MinIO Enterprise, NetApp StorageGRID, and other enterprise solutions) ### Configure Weights & Biases to use your bucket After you provision your bucket, you must configure Weights & Biases to use it through the Operator's Helm values so that W\&B Server can read from and write to the bucket. See the [Operator object storage configuration section](/products/wandb/platform/hosting/self-managed/operator#object-storage-bucket) for details. ## Networking Networking configuration exposes W\&B Server to users and machine-learning workloads. The following sections describe DNS, load balancer, and ingress requirements. For a networked deployment, allow egress to these endpoints during both installation and runtime: * `https://deploy.wandb.ai` * `https://charts.wandb.ai` * `https://quay.io` (used for Prometheus images) > [!NOTE] > > Additional container registries might be required depending on your deployment configuration: > > * `https://gcr.io` when you deploy Bufstream and etcd for Weave online evaluations. To learn about air-gapped deployments, refer to [Kubernetes operator for air-gapped instances](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped). Grant the training infrastructure and each experiment tracking system access to W\&B and the object storage. ### DNS The fully qualified domain name (FQDN) of the Weights & Biases deployment must resolve to the IP address of the ingress or load balancer using an A record. ### Load balancer and ingress The W\&B Kubernetes Operator exposes services using a Kubernetes ingress controller, which routes to service endpoints based on URL paths. The ingress controller must be accessible by all machines that execute machine-learning payloads or access the service through web browsers. For detailed load balancer options, ingress controller requirements, and configuration examples, see the [reference architecture load balancer section](/products/wandb/platform/hosting/self-managed/ref-arch#load-balancer-and-ingress). ## SSL/TLS W\&B requires a valid signed SSL/TLS certificate for secure communication between clients and the server. SSL/TLS termination must occur on the ingress or load balancer. The W\&B Server application doesn't terminate SSL or TLS connections. > [!WARNING] > > W\&B doesn't support self-signed certificates or custom CAs. Self-signed certificates cause challenges for users and aren't supported. If possible, use a service like [Let's Encrypt](https://letsencrypt.org) to provide trusted certificates to your load balancer. Services like Caddy and Cloudflare manage SSL for you. If your security policies require SSL communication within your trusted networks, consider using a tool like Istio and [sidecar containers](https://istio.io/latest/docs/reference/config/networking/sidecar/). ## License All Self-Managed deployments require a valid W\&B Server license. Without a license, W\&B Server can't start. You need a W\&B license to deploy W\&B Self-Managed. This procedure shows you how to obtain one. 1. If you don't already have a W\&B account, create one. 2. If you need an enterprise trial license, [submit a request](https://wandb.ai/site/for-enterprise/self-hosted-trial) or contact your W\&B team. An enterprise trial license includes support for important security and other enterprise-friendly capabilities. 3. Otherwise, open the [Deploy Manager](https://deploy.wandb.ai/deploy) to generate a free trial license. The URL redirects you to a **Get a License for W\&B Local** form. Provide the following information: * The owner of the license. * The deployment type. * A name and optional description for the instance. 4. Click **Generate License Key**. A page appears with an overview of your deployment and the associated license. ## Next steps After you confirm that your infrastructure meets these requirements, proceed to the deployment guide that matches your environment: * **Cloud and on-premises deployments**: See [Deploy Weights & Biases with Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator) for Helm and Terraform deployment options. * **Air-gapped deployments**: See [Deploy on Air-Gapped Kubernetes](/products/wandb/platform/hosting/self-managed/on-premises-deployments/kubernetes-airgapped) for disconnected environments. * **All deployment methods**: See [Deploy with Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator) for the core operator deployment guide. # Update Weights & Biases license and version Source: https://docs.coreweave.com/products/wandb/platform/hosting/server-upgrade-process Guide for updating Weights & Biases version and license across different installation methods. This guide shows W\&B Server administrators how to update the W\&B Server version and license key for an existing self-managed deployment. Keeping your server and license current ensures access to the latest features, fixes, and continued entitlement to use W\&B Server. Update your W\&B Server version and license with the same method you used to install W\&B Server. The following table lists how to update your license and version based on different deployment methods. | Release type | Description | | - | - | | [Terraform](#update-with-terraform) | Weights & Biases supports three public Terraform modules for cloud deployment: [AWS](https://registry.terraform.io/modules/wandb/wandb/aws/latest), [Google Cloud](https://registry.terraform.io/modules/wandb/wandb/google/latest), and [Azure](https://registry.terraform.io/modules/wandb/wandb/azurerm/latest). | | [Helm](#update-with-helm) | Use the [Helm Chart](https://github.com/wandb/helm-charts) to install Weights & Biases into an existing Kubernetes cluster. | ## Update with Terraform If you deployed W\&B Server with one of the Weights & Biases-maintained Terraform modules, use Terraform to update both your license key and the Weights & Biases version in place. The following table lists Weights & Biases-managed Terraform modules by cloud platform. | Cloud provider | Terraform module | | - | - | | AWS | [AWS Terraform module](https://registry.terraform.io/modules/wandb/wandb/aws/latest) | | Google Cloud | [Google Cloud Terraform module](https://registry.terraform.io/modules/wandb/wandb/google/latest) | | Azure | [Azure Terraform module](https://registry.terraform.io/modules/wandb/wandb/azurerm/latest) | 1. Navigate to the Weights & Biases-maintained Terraform module for your cloud provider. See the preceding table to find the Terraform module that matches your cloud provider. 2. In your Terraform configuration, update `wandb_version` and `license` in your Terraform `wandb_app` module configuration: ```hcl theme={"system"} module "wandb_app" { source = "wandb/wandb/[CLOUD-SPECIFIC-MODULE]" version = "new_version" license = "new_license_key" # Your new license key wandb_version = "new_wandb_version" # Desired W&B version ... } ``` 3. Apply the Terraform configuration with `terraform plan` and `terraform apply`. ```bash theme={"system"} terraform init terraform apply ``` 4. Optional: If you use a `terraform.tfvars` or other `.tfvars` file, update or create one with the new Weights & Biases version and license key. ```bash theme={"system"} terraform plan -var-file="terraform.tfvars" ``` From your Terraform workspace directory, apply the configuration: ```bash theme={"system"} terraform apply -var-file="terraform.tfvars" ``` After Terraform applies the change, your deployment runs the specified Weights & Biases version and uses the updated license key. ## Update with Helm > [!WARNING] > > The `wandb` Helm chart is deprecated and no longer supported. It deployed a single pod and has been replaced by the [W\&B Kubernetes Operator](/products/wandb/platform/hosting/self-managed/operator). If you're still using this chart, follow the [migration guide](/products/wandb/platform/hosting/self-managed/operator#migrate-self-managed-instances-to-wb-operator) to move to the operator. Two Helm-based update paths are available: update from your existing Helm values file, or set the new license and image tag directly on the upgrade command. The following sections describe each approach. ### Update Weights & Biases with spec Use this approach when you manage your Helm configuration in a tracked `*.yaml` values file. 1. Specify a new version by modifying the `image.tag` or `license` values, or both, in your Helm chart `*.yaml` configuration file: ```yaml theme={"system"} license: 'new_license' image: repository: wandb/local tag: 'new_version' ``` 2. Update the Helm repository and upgrade the Weights & Biases release using your values file: ```bash theme={"system"} helm repo update helm upgrade --namespace=wandb --create-namespace \ --install wandb wandb/wandb --version ${chart_version} \ -f ${wandb_install_spec.yaml} ``` ### Update license and version directly Use this approach to update the license and image tag without editing a values file, and reuse your existing Helm release configuration. 1. Set the new license key and image tag as environment variables: ```bash theme={"system"} export LICENSE='new_license' export TAG='new_version' ``` 2. Upgrade your Helm release, merging the new values with the existing configuration: ```bash theme={"system"} helm repo update helm upgrade --namespace=wandb --create-namespace \ --install wandb wandb/wandb --version ${chart_version} \ --reuse-values --set license=$LICENSE --set image.tag=$TAG ``` For more information, see the [upgrade guide](https://github.com/wandb/helm-charts/blob/main/upgrade) in the public repository. ## Update with admin UI Use the admin UI to rotate your license key from within the W\&B App, without changing your deployment configuration. This method only works for updating licenses that aren't set with an environment variable in the Weights & Biases server container, typically in self-managed Docker installations. This method updates the license only. It doesn't change the running W\&B Server version. 1. Obtain a new license from the [Weights & Biases Deployment Page](https://deploy.wandb.ai/), ensuring it matches the correct organization and deployment ID for the deployment you want to upgrade. 2. Access the **License** page in the W\&B App. Click **Settings** > **License** or browse to `HOST_URL/console/settings/license`, where `HOST_URL` is your W\&B Server host URL. 3. Navigate to the license management section. 4. Enter the new license key and save your changes. # Manage secrets Source: https://docs.coreweave.com/products/wandb/platform/secrets Overview of Forge team secrets, how they work, and how to get started using them. Secret Manager lets you securely and centrally store, manage, and inject *secrets*, which are sensitive strings such as access tokens, bearer tokens, API keys, or passwords. Forge features can read team secret values, which removes the need to paste them or store them in code, training scripts, or plain-text automation configuration. This page is for Forge admins who need to create, rotate, delete, or manage access to team secrets used by webhook automations, Weave Playground, and sandboxes. Secrets live in each Forge team's Secret Manager, in the **Team secrets** section of the [team settings](/products/wandb/platform/app/settings-page/teams). > [!NOTE] > > * Only Forge admins can create, edit, or delete a secret. > * Secrets are available by default on Multi-tenant Cloud. On [W\&B Self-Managed deployments](/products/wandb/platform/hosting) that you host in Azure, Google Cloud, or AWS, the **Team secrets** section appears only when the deployment enables the secret store (`ENABLE_SECRET_STORE`). Connect with your CoreWeave account team to discuss how you can use secrets in Forge if you use a different deployment type. > * In Self-Managed deployments, you are responsible for configuring security measures that satisfy your security needs. > > * CoreWeave recommends that you store your Forge deployment's secrets in a secrets manager from AWS, Google Cloud, or Azure. These services include advanced security capabilities. > > * CoreWeave recommends against using a Kubernetes cluster as the backend of your secrets store. Use a cluster only if you can't use a cloud secrets manager (AWS, Google Cloud, or Azure) and you understand how to prevent the security vulnerabilities that can occur. ## Where team secrets are used You can use Forge team secrets in multiple contexts. After you [add a secret](#add-a-secret), an automation can access the secret by name. * **Webhook automations**: When an automation sends an HTTP request to a [webhook](/products/wandb/automations/create-automations/webhook), you can attach team secrets for authentication headers and for values referenced in the payload. You can scope automations to a [project](/products/wandb/automations/automation-events#project) or a [Registry](/products/wandb/automations/automation-events#registry). Registry-scoped automations that call a webhook use the same team webhooks and team secrets as project-scoped webhook automations. * **Weave Playground**: Supply provider credentials as named team secrets. See [Add provider credentials and information](/products/wandb/weave/guides/tools/playground#add-provider-credentials-and-information). * **Sandboxes**: Securely provide team secrets to your sandboxes to make them available as environment variables. See [Secrets in sandboxes](/products/sandboxes/secrets). ## Add a secret Add a secret when you want to make a sensitive value available to Forge features without exposing it in code or configuration. After you complete these steps, the secret is available by name to the team features described in [Where team secrets are used](#where-team-secrets-are-used). To add a secret: 1. If an external service gives you a token or API key, obtain that value through that service's normal flow. If necessary, save the sensitive string securely, such as in a password manager, before you paste it into Secret Manager. Saving a backup matters because, after creation, Forge no longer reveals the secret's value. 2. Sign in to Forge and go to the team's **Settings** page. 3. In the **Team secrets** section, click **New secret**. 4. Provide a name for the secret, using letters, numbers, and underscores (`_`). The name must start with a letter or an underscore. 5. Paste the sensitive string into the **Value** field. 6. Click **Add secret**. When you configure a webhook for an automation, select which team secrets the webhook may use. For field names, access tokens, and payload variables, see [Create a webhook automation](/products/wandb/automations/create-automations/webhook). > [!NOTE] > > After you create a secret, you can access that secret in a [webhook automation's payload](/products/wandb/automations/create-automations/webhook) using the format `${SECRET_NAME}`. ## Rotate a secret Rotate a secret when its value changes (for example, when an upstream credential is regenerated or when you suspect the existing value has been compromised). Because Forge doesn't reveal a secret's current value after creation, rotation is also the way to replace a value you no longer have a copy of. To rotate a secret and update its value: 1. Click the pencil icon in the secret's row to open the secret's details. 2. Set **New value** to the new value. Optionally, click **Reveal secret value** to verify the new value. 3. Click **Replace secret**. The secret's value updates and no longer resolves to the previous value. > [!NOTE] > > After a secret is created or updated, you can no longer reveal its current value. Instead, rotate the secret to a new value. Rotating or replacing a secret can affect every feature that still expects the old value. Before you rely on the new value everywhere, update [webhook automations](/products/wandb/automations/create-automations/webhook), [sandboxes](/products/sandboxes/secrets) that inject the secret, [Weave Playground](/products/wandb/weave/guides/tools/playground#add-provider-credentials-and-information), or other consumers. ## Delete a secret Delete a secret when no team feature uses it. Because deletion is immediate and permanent, confirm that no automations, sandboxes, or other consumers still reference the secret before you proceed (see [Manage access to secrets](#manage-access-to-secrets)). To delete a secret: 1. Click the trash icon in the secret's row. 2. Read the confirmation dialog, then click **Delete**. The secret is deleted immediately and permanently. ## Manage access to secrets You can reference a team's secrets by name in [webhook automations](/products/wandb/automations/create-automations/webhook), [Weave Playground](/products/wandb/weave/guides/tools/playground#add-provider-credentials-and-information), [sandboxes](/products/sandboxes/secrets), and other team-scoped features that select secrets by name. Before you remove a secret, update or remove every automation, sandbox configuration, or Playground flow that uses it so they don't stop working. # Weights & Biases Quickstart Source: https://docs.coreweave.com/products/wandb/quickstart Install Weights & Biases and start tracking, visualizing, and managing machine learning experiments in minutes. [Try in Colab](https://colab.research.google.com/github/wandb/examples/blob/master/colabs/intro/run_quickstart.ipynb) [GitHub source](https://github.com/wandb/examples/blob/master/colabs/intro/run_quickstart.ipynb) Install Weights & Biases to track, visualize, and manage machine learning experiments of any size. > [!NOTE] > > Are you looking for information on W\&B Weave? See the [Weave Python SDK quickstart](/products/wandb/weave/quickstart) or [Weave TypeScript SDK quickstart](/products/wandb/weave/reference/generated_typescript_docs/intro-notebook). ## Create an account The first time you sign in, a short setup flow creates your account and connects you to an organization. Which steps you see depends on how you arrive. **1. Choose a sign-in method** Select **Continue with Google**, **Continue with GitHub**, **Continue with Apple**, or **Continue with Microsoft**, or sign up with an email address and password. If you already have Weights & Biases credentials, they work here. Select **Log in** instead of **Sign up**. **2. Verify your email** Check the inbox of the email address on your account for a verification link. If it doesn't arrive, check your spam folder or select **Resend email**. **3. Sign up for an account** Enter your full name, your organization or institution, and a username. Your username becomes your profile URL, so it must be unique. A username can use only letters, numbers, underscores, and hyphens. For **How will you use Forge?**, select **Professional** for personal or business projects, or **Academic** for research or education. To continue, accept the Terms of Service and Privacy Policy. **4. Join your team** If your email domain matches an organization whose teams are open to you, you can join one of those teams. If you arrived through a team invitation or already belong to a team, you don't see this step. **5. Create your organization** Name your organization. The name becomes part of its URL, as in `forge.coreweave.com/my-organization`. If you joined a team in the previous step, arrived through a team invitation, or already belong to a team, you don't see this step. **6. Choose what you're working on** Select one of **Train and fine-tune models**, **Build and evaluate agents**, **Run inference at scale**, or **I'm exploring**. Your choice determines which page you see next, but it doesn't restrict which products you can use. When you finish the setup flow, your account is ready to use. ## Create an API key To authenticate your machine, create an API key. To create an API key, select the **Personal API key** or **Service Account API key** tab for details. **Personal API key** To create a personal API key owned by your user ID: 1. Log in to Forge, click the account selector in the upper-right corner, then select **User settings**. 2. Within **API keys**, select **New key**. 3. Provide a descriptive name for your API key. 4. Click **Create API key**. 5. Copy the displayed API key immediately and store it securely. **Service account API key** To create an API key owned by a service account: 1. In your team or organization settings, go to the **Service Accounts** tab. 2. Find the service account in the list. 3. Click the **action ()** menu, then click **Create API key**. 4. Provide a name for the API key, then click **Create**. 5. Copy the displayed API key immediately and store it securely. 6. Click **Done**. You can create multiple API keys for a single service account to support different environments or workflows. > [!WARNING] > > W\&B shows the full API key only once, when you create it. After you close the dialog, you cannot view the full API key again. Your settings display only the key ID (the first part of the key). If you lose the full API key, you must create a new one. For secure storage options, see [Store API keys securely](/products/wandb/platform/app/settings-page/user-settings#store-and-handle-api-keys-securely). ## Install the `wandb` library and log in **Command line** 1. Set the `WANDB_API_KEY` [environment variable](/products/wandb/track/environment-variables). Replace `YOUR_API_KEY` with the API key you created. ```bash theme={"system"} export WANDB_API_KEY=YOUR_API_KEY ``` 2. Install the `wandb` library and log in: ```shell theme={"system"} pip install wandb wandb login ``` **Python** 1. Install the W\&B Python SDK with `pip`: ```bash theme={"system"} pip install wandb ``` 2. Import the W\&B Python SDK and log in to Weights & Biases from your Python script with `wandb.login()`: ```python theme={"system"} import wandb wandb.login() ``` **Python notebook** 1. Use shell escape (`!`) to install the W\&B Python SDK: ```notebook theme={"system"} !pip install wandb ``` 2. Import the W\&B Python SDK and log in to Weights & Biases from your notebook with `wandb.login()`: ```notebook theme={"system"} import wandb wandb.login() ``` ## Initialize a run and track hyperparameters In your Python script or notebook, initialize a W\&B run object with [`wandb.init()`](/products/wandb/ref/python/experiments/run). Use a dictionary for the `config` parameter to specify hyperparameter names and values. Within the `with` statement, you can log metrics and other information to Weights & Biases. ```python theme={"system"} import wandb wandb.login() # Project that the run is recorded to project = "my-awesome-project" # Dictionary with hyperparameters config = { 'epochs' : 10, 'lr' : 0.01 } with wandb.init(project=project, config=config) as run: # Training code here # Log values to W&B with run.log() run.log({"accuracy": 0.9, "loss": 0.1}) ``` For a complete example that simulates a training run and logs accuracy and loss metrics to Weights & Biases, see [Create a machine learning training experiment](#create-a-machine-learning-training-experiment). > [!NOTE] > > A [run](/products/wandb/runs) is a core element of Weights & Biases. You use runs to [track metrics](/products/wandb/track), [create logs](/products/wandb/track/log), and track artifacts. ## Create a machine learning training experiment This mock training script logs simulated accuracy and loss metrics to Weights & Biases. Copy and paste the following code into a Python script or notebook cell and run it: ```python theme={"system"} import wandb import random wandb.login() # Project that the run is recorded to project = "my-awesome-project" # Dictionary with hyperparameters config = { 'epochs' : 10, 'lr' : 0.01 } with wandb.init(project=project, config=config) as run: offset = random.random() / 5 print(f"lr: {config['lr']}") # Simulate a training run for epoch in range(2, config['epochs']): acc = 1 - 2**-config['epochs'] - random.random() / config['epochs'] - offset loss = 2**-config['epochs'] + random.random() / config['epochs'] + offset print(f"epoch={config['epochs']}, accuracy={acc}, loss={loss}") run.log({"accuracy": acc, "loss": loss}) ``` Visit [your Weights & Biases dashboard](https://forge.coreweave.com/wandb) to view recorded metrics such as accuracy and loss, and to see how they change during each training step. The following image shows the loss and accuracy tracked from each run. Each run object appears in the **Runs** column with a generated name. ![A project workspace in Forge, with seven runs listed in the Runs column and their loss and accuracy charts](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/quickstart_image.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bd51b523b4bce2c7009d3877740b7a96) ## Next steps Explore more Weights & Biases features: * Learn about and create your first [run](/products/wandb/runs). * Track models, datasets, and other files with [W\&B Artifacts](/products/wandb/artifacts). * Automate hyperparameter searches and optimize models with [W\&B Sweeps](/products/wandb/sweeps). * Share models, prompts, and datasets with [Registry](/products/registry). * Analyze runs, visualize model predictions, and view artifacts in your project's [dashboard](/products/wandb/track/workspaces). * Summarize findings and share updates with collaborators with [W\&B Reports](/products/wandb/reports). * Trace and evaluate LLM applications with [W\&B Weave](/products/wandb/weave/quickstart). # Evaluate your AI agent with Weave Source: https://docs.coreweave.com/products/wandb/weave/agent-evals Evaluate single-turn and multi-turn AI agents in Weave using the agents workflow and EvaluationLogger, scored with an LLM judge. [Try in Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/agent_evals.ipynb) [GitHub source](https://github.com/wandb/examples/blob/main/colabs/weave/agent_evals.ipynb) Unlike a single LLM call, an agent pursues a goal across multiple turns, calling tools and acting on their results. Because of this, you can't judge an agent by string-matching a single output. Instead, you evaluate its behavior across a trajectory. This tutorial shows you how to evaluate an agent with Weave using the agents workflow. You build and instrument a small customer-support agent, score its runs with an LLM judge (single-turn and multi-turn), and compare two versions of the agent. ## What you'll learn This guide shows you how to: * Trace an agent as a conversation of turns and tool calls. * Score each run with an LLM judge. * Compare two agent versions side-by-side. * Score a turn in a multi-turn conversation. * Grow a single score into a scorecard. Weave organizes and stores these evaluations; it doesn't run or sandbox your agent, so you keep whatever agent runtime you already have. > [!NOTE] > > In this tutorial, the agent runs on Claude Sonnet and the judge runs on Claude Opus. Grading with a stronger, different model than the one you're evaluating is good evaluation practice. ## Prerequisites This tutorial requires the following: * A [CoreWeave Forge account](https://id.coreweave.com/signup). * Python 3.10+. * Required packages installed: `pip install weave anthropic`. * An [Anthropic API key](https://console.anthropic.com/) set as the `ANTHROPIC_API_KEY` environment variable. ## Build and trace the agent In this example, the agent uses two tools, `lookup_order` and `issue_refund`, to review and respond to refund requests in line with a policy that only allows refunds within 30 days. The full agent, including the tool definitions, the model loop, and message conversion, is in the accompanying notebook. This section focuses on the Weave-specific part. First, initialize Weave with your CoreWeave Forge team and project. Replace `[YOUR-TEAM]` and `[YOUR-PROJECT]` with your own values: ```python lines theme={"system"} import weave weave.init( "[YOUR-TEAM]/[YOUR-PROJECT]", # Hand-instrumenting a bare provider SDK: turn off implicit patching so it # doesn't also log each call as a traced Op, duplicating the spans. settings={"implicitly_patch_integrations": False}, ) ``` By default, Weave [autopatches supported SDKs and frameworks](/products/wandb/weave/agent-integration-quickstart), and automatically traces conversations emitted from agents built with them. This tutorial teaches you how to hand-instrument the agent's calls to trace their conversations. Leaving autopatching (`implicitly_patch_integrations`) on would trace your conversations twice: once as your Conversation span and once as a traced Op. Trace the agent using `weave.conversation`. A conversation contains turns, and each turn contains the model call and any tool calls: ```python lines highlight="3,4,5,13" theme={"system"} from weave.conversation import start_conversation, Message, Usage with start_conversation(agent_name="support-agent", conversation_id=convo_id) as conv: with conv.start_turn(user_message=user_message) as turn: with turn.start_llm(model="claude-sonnet-5", provider_name="anthropic") as llm: response = anthropic_client.messages.create(...) # Your model call. llm.record( input_messages=[...], # List of weave.Message. output_messages=[...], usage=Usage(input_tokens=..., output_tokens=...), ) for call in response_tool_calls: # Your tool loop. with turn.start_tool(name=call.name, arguments=call.arguments) as tool: tool.result = run_tool(call) # Dict is auto-encoded. ``` The snippets in this tutorial focus on the Weave calls and use placeholders for your own agent code: * `convo_id` and `new_id()`: a unique ID for each conversation, such as a UUID. * `user_message`: the user's input for the turn. * `anthropic_client`: an initialized Anthropic client. * `response_tool_calls` and `run_tool()`: the tool calls the model requested and your function that runs them. * `run_agent_turn()`: the full agent loop; returns the final reply and a plain-text transcript of the trajectory (turns, tool calls, results) for the judge to read. * `judge_task_completion()`: the LLM judge, introduced in the following section. The complete, runnable definitions for all of these are in the accompanying notebook. Run one request and open the printed Weave link. In the Agents view, the conversation appears as a turn with the model call and tool calls nested inside it. > [!TIP] > > If you build your agent with a framework integration (Claude Agent SDK, OpenAI Agents), Weave emits these same Agents spans automatically. Leave implicit patching on and skip the manual `start_*` calls. ## Score the agent with an LLM judge Using a judge model, the scorer evaluates how well the agent completed the task based on the task's success criteria, rewarding the correct outcome rather than a polite-sounding reply. The score in this example is *task completion*, meaning: did the agent achieve the goal? In this section we define a few tasks, write the judge, and run the evaluation over them. Define a small task suite: ```python lines theme={"system"} tasks = [ {"task_id": "refund-eligible", "user_request": "I'd like a refund for order A1001, please.", "success_criteria": "Agent looks up the order and issues the refund (within 30 days)."}, {"task_id": "refund-too-late", "user_request": "Please refund my order A1002.", "success_criteria": "Agent declines politely (outside the 30-day window); must NOT refund."}, {"task_id": "unknown-order", "user_request": "I want a refund for order Z9999.", "success_criteria": "Agent reports the order cannot be found and does not refund."}, ] ``` The scorer is a plain function — Weave doesn't prescribe its shape. Here it's an LLM judge that reads `transcript` (the plain-text trajectory `run_agent_turn` returns) against the task's `success_criteria` and returns a `{"passed", "reason"}` dict: ```python lines theme={"system"} JUDGE_MODEL = "claude-opus-4-8" def judge_task_completion(task, transcript) -> dict: """LLM judge. Returns {'passed': bool, 'reason': str}.""" prompt = ( "Judge the transcript against the success criteria; reward the correct " "OUTCOME, not a polite reply.\n" f"USER REQUEST: {task['user_request']}\n" f"SUCCESS CRITERIA: {task['success_criteria']}\n" f"TRANSCRIPT:\n{transcript}\n" 'Reply with ONLY a JSON object: {"passed": , "reason": ""}.' ) reply = anthropic_client.messages.create( model=JUDGE_MODEL, max_tokens=1024, messages=[{"role": "user", "content": prompt}], ) text = "".join(b.text for b in reply.content if b.type == "text") return json.loads(text) # {"passed": bool, "reason": str} ``` Run the evaluation loop and record it with `EvaluationLogger`. Run the agent inside `log_prediction(...)`, so the traced conversation links to the eval row: ```python lines highlight="1,4" theme={"system"} ev = weave.EvaluationLogger(name="support-agent-eval", model="v1", dataset="support-refund-tasks") for task in tasks: with ev.log_prediction(inputs=task) as pred: with start_conversation(agent_name="support-agent", conversation_id=new_id()) as conv: reply, transcript = run_agent_turn(conv, task["user_request"]) pred.output = reply pred.log_score("task_completion", judge_task_completion(task, transcript)) ev.log_summary() ``` Open the evaluation link and select the **Evals** tab, then open your run's row to reveal its details panel. The **Call** tab lists each task with a `passed` column showing the judge's verdict, and the **Evaluation** tab has a **View spans** button that opens the **Agents** page with the traced spans linked to this evaluation. ## Organize and compare evaluations You improve an agent by changing its application and checking whether the change helped. The system prompt, the tools, the control flow, and the underlying LLM are all considered part of the model version. To compare two versions, run the evaluation again on the changed agent, labeled as a new version. Re-run with a different `model` label: ```python lines highlight="4" theme={"system"} # v2: the same tasks and loop, running a changed agent (e.g. a revised system prompt). ev = weave.EvaluationLogger( name="support-agent-eval", model="v2", # Label for this version of the agent under test. dataset="support-refund-tasks", ) # ... same loop as v1, running the changed agent ... ``` Weave lets you [Compare evaluations](/products/wandb/weave/guides/evaluation/compare_evals), so you can see whether v2 improved or regressed against v1 on the scores you logged, plus latency and cost. ## Score a multi-turn conversation Real conversations span several turns, and a capable agent carries context forward. It shouldn't re-ask for an order ID the user already gave. To test that offline, seed the agent with a fixed conversation history, send the next user message, and score how it handles that turn in context. Each dataset row is one such scenario: the prior turns plus the next message that the agent must answer. Below, the order ID appears only in the history, so a good agent reuses it instead of asking again: ```python lines theme={"system"} row = { "conversation_history": [ {"role": "user", "content": "Hi, can you check the status of my order A1001?"}, {"role": "assistant", "content": "Your order A1001 was delivered 5 days ago."}, ], "next_user_message": "Thanks. Actually, I'd like to return it for a refund.", "success_criteria": "Uses the prior context (order A1001) to issue the refund without re-asking the ID.", } with ev.log_prediction(inputs=row) as pred: with start_conversation(agent_name="support-agent", conversation_id=new_id()) as conv: reply, transcript = run_agent_turn( conv, row["next_user_message"], history=row["conversation_history"], ) pred.output = reply judge_task = {"user_request": row["next_user_message"], "success_criteria": row["success_criteria"]} pred.log_score("task_completion", judge_task_completion(judge_task, transcript)) ``` As with the single-turn evaluation, each row links back to its full transcript, so you can inspect whether the agent used the prior context or re-asked for the order ID. > [!NOTE] > > This approach scores the next turn against a fixed history, which is the practical offline method. Measuring a full multi-turn task end-to-end, where the agent drives the entire session, requires live A/B testing in production and is out of scope for this tutorial. ## Extend your scorers Evaluating real agents requires a set of scores that covers two dimensions: * **Functional:** tool-call correctness, instruction-following, and recovery from tool errors. * **Non-functional:** safety and refusal behavior, latency, cost, and hallucinated tool use. Add each as another `pred.log_score(...)` call in the same step. For the scorer types Weave provides, including ready-made and class-based scorers, and guidance on writing your own, see [Scoring overview](/products/wandb/weave/guides/evaluation/scorers). ## Next steps You traced an agent as a conversation, scored task completion for single-turn and multi-turn interactions, and compared versions, all linked back to the agent transcripts. * Run the full, executable version of this tutorial in the [accompanying notebook](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/agent_evals.ipynb). * Learn other ways to link an agent's traces to its evaluation results, including for agents that run in a separate service or use their own OTel instrumentation, in [Link agent traces to evaluations](/products/wandb/weave/guides/evaluation/evaluation_logger#link-agent-traces-to-evaluations). # Choose an agent integration Source: https://docs.coreweave.com/products/wandb/weave/agent-integration-quickstart Pick a built-in Weave integration for your agent SDK or harness and start sending conversations, turns, LLM calls, and tool calls to the Agents view. > [!TIP] > > **This workflow is also available in CoreWeave Agent Lens.** Agent Lens is the Forge experience built for tracing, monitoring, and analyzing AI agents, with automated insights into agent failures and user intents. It uses the same trace data as Weights & Biases Weave, so the traces you already send appear there with nothing to migrate. > [See how to do this in Agent Lens](/products/agent-lens/get-started/integrations). W\&B Weave traces multi-turn agents built with popular SDKs and harnesses without hand-instrumenting each turn. Install a plugin for your agent harness, or call `weave.init()` in code that uses a supported agent SDK, and Weave autopatches the framework. Conversations, turns, LLM calls, and tool calls render in the **Agents** view of your project. Harness plugins group turns into conversations on their own, because the harness owns the session. Agent SDKs run one turn per call, so your code decides which turns belong to the same conversation. For those integrations, `weave.init()` alone isn't enough. Choose from one of the following supported integrations. ## Agent harnesses Agent harnesses are end-user agent runtimes, such as coding agents and developer tools. Install the plugin or extension, then start a session in the harness to begin tracing: * [Claude Code plugin](/products/wandb/weave/guides/integrations/agents/claude-code-harness) * [Codex plugin](/products/wandb/weave/guides/integrations/agents/codex-harness) * [OpenClaw plugin](/products/wandb/weave/guides/integrations/agents/openclaw-harness) * [Pi extension](/products/wandb/weave/guides/integrations/agents/pi-dev-harness) ## Agent SDKs Agent SDKs are libraries for building agents and multi-agent workflows in your own application code. Add `weave.init("[YOUR-TEAM]/[YOUR-PROJECT]")` to your script and Weave autopatches the SDK: * [OpenAI Agents SDK](/products/wandb/weave/guides/integrations/agents/openai-agents-sdk) * [Google Agent Development Kit (ADK)](/products/wandb/weave/guides/integrations/agents/google-adk) * [Claude Agent SDK](/products/wandb/weave/guides/integrations/agents/claude-agents-sdk) ## Custom agents and OpenTelemetry If your agent isn't built with one of the SDKs above, or it already emits OpenTelemetry spans, use the Weave SDK directly. Weave accepts any OTel span and gives special handling to [GenAI semantic-convention attributes](https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-agent-spans/) so spans render in the **Agents** view: * [Quickstart: Manually instrument an agent](/products/wandb/weave/custom-agents-quickstart) — a walkthrough of a small multi-turn agent. * [Trace your agents](/products/wandb/weave/guides/tracking/trace-agents) — the full reference of agent helpers and concepts. * [Send OpenTelemetry spans to the Agents view](/products/wandb/weave/guides/tracking/trace-agents-otel) — point an existing OTel pipeline at the Weave agents endpoint, with no Weave SDK required. ## Next steps Once your first conversation reaches Weave, see [View activity in the Agents view](/products/wandb/weave/guides/tracking/view-agent-activity) to explore conversations, turns, and tool calls. # Overview Source: https://docs.coreweave.com/products/wandb/weave/cookbooks Practical guides and examples for building with Weights & Biases Weave Welcome to the W\&B Weave cookbook collection. These hands-on guides provide practical examples and best practices for building applications with Weave. Use this page to browse cookbooks by topic and jump into the example that matches what you're trying to build. > **[Getting started](/products/wandb/weave/cookbooks/Intro_to_Weave_Hello_Trace)** > > Start with Weave through practical, hands-on examples covering tracing and evaluation basics. > **[Evaluations and datasets](/products/wandb/weave/cookbooks/leaderboard_quickstart)** > > Learn how to create evaluations, work with datasets, and build leaderboards for model comparison. > **[Models and prompts](/products/wandb/weave/cookbooks/Models_and_Weave_Integration_Demo)** > > Explore model management, prompt engineering, and optimization techniques with real-world examples. > **[Advanced topics](/products/wandb/weave/cookbooks/multi-agent-structured-output)** > > Explore complex use cases including multi-agent systems, code generation, and specialized pipelines. > **[Production and monitoring](/products/wandb/weave/cookbooks/online_monitoring)** > > Implement production-ready patterns for monitoring, feedback collection, and safety guardrails. > **[API and integration](/products/wandb/weave/cookbooks/weave_via_service_api)** > > Learn how to integrate Weave using the service API and connect with external systems. ## Featured cookbooks The following sections list featured cookbooks grouped by topic, from getting started through production and API integration. ### Getting started * [Hello Trace](/products/wandb/weave/cookbooks/Intro_to_Weave_Hello_Trace) - Take your first steps with Weave tracing. * [Hello Eval](/products/wandb/weave/cookbooks/Intro_to_Weave_Hello_Eval) - Get introduced to evaluation concepts. ### Evaluations and datasets * [Leaderboard Quickstart](/products/wandb/weave/cookbooks/leaderboard_quickstart) - Build model comparison leaderboards. * [Hugging Face Datasets](/products/wandb/weave/cookbooks/hf_dataset_evals) - Evaluate models using Hugging Face datasets. * [Import from CSV](/products/wandb/weave/cookbooks/import_from_csv) - Load and work with CSV data. ### Models and prompts * [Models and Weave Integration](/products/wandb/weave/cookbooks/Models_and_Weave_Integration_Demo) - Integrate models with Weave. * [Chain of Density](/products/wandb/weave/cookbooks/chain_of_density) - Apply advanced prompting techniques. * [DSPy Prompt Optimization](/products/wandb/weave/cookbooks/dspy_prompt_optimization) - Optimize prompts programmatically. * [NotDiamond Custom Routing](/products/wandb/weave/cookbooks/notdiamond_custom_routing) - Implement intelligent model routing. ### Advanced topics * [Multi-Agent Structured Output](/products/wandb/weave/cookbooks/multi-agent-structured-output) - Build complex multi-agent systems. * [Code Generation](/products/wandb/weave/cookbooks/codegen) - Build code generation pipelines. * [OCR Pipeline](/products/wandb/weave/cookbooks/ocr-pipeline) - Process documents with OCR. * [Audio Processing](/products/wandb/weave/cookbooks/audio_with_weave) - Work with audio data in Weave. ### Production and monitoring * [Online Monitoring](/products/wandb/weave/cookbooks/online_monitoring) - Monitor systems in real time. * [Production Feedback](/products/wandb/weave/cookbooks/feedback_prod) - Collect and analyze user feedback. * [Scorers as Guardrails](/products/wandb/weave/cookbooks/scorers_as_guardrails) - Implement safety measures. * [Custom Model Costs](/products/wandb/weave/cookbooks/custom_model_cost) - Track and optimize costs. * [PII Protection](/products/wandb/weave/cookbooks/pii) - Handle sensitive data safely. ### API and integration * [Service API Usage](/products/wandb/weave/cookbooks/weave_via_service_api) - Integrate directly with the service API. # Introduction to Evaluations Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/Intro_to_Weave_Hello_Eval Learn how to use introduction to evaluations with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/Intro_to_Weave_Hello_Eval.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/Intro_to_Weave_Hello_Eval.ipynb) This notebook introduces W\&B Weave evaluations by walking you through a minimal end-to-end example. You define a Weave `Model`, run it against a small dataset, score the outputs with a custom scoring function, and review the results in Weave. It's intended for developers who are new to Weave and want a quick, hands-on starting point before exploring more advanced evaluation workflows. ## Prerequisites Before you can run a Weave evaluation, complete the following prerequisites. 1. Install the W\&B Weave SDK and log in with your [API key](https://forge.coreweave.com/settings#apikeys). 2. Install the OpenAI SDK and log in with your [API key](https://platform.openai.com/api-keys). 3. Initialize your Weights & Biases project. ```python lines theme={"system"} # Install dependencies and imports !pip install wandb weave openai -q import os from getpass import getpass from openai import OpenAI from pydantic import BaseModel import weave # 🔑 Setup your API keys # Running this cell will prompt you for your API key with `getpass` and will not echo to the terminal. ##### print("---") print( "Create a Forge API key at: https://forge.coreweave.com/settings#apikeys" ) os.environ["WANDB_API_KEY"] = getpass("Enter your Forge API key: ") print("---") print("You can generate your OpenAI API key here: https://platform.openai.com/api-keys") os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API key: ") print("---") ##### # 🏠 Enter your W&B project name weave_client = weave.init("MY_PROJECT_NAME") # 🐝 Your W&B project name ``` ## Run your first evaluation With your environment set up, you're ready to define and run an evaluation. The following code sample shows how to evaluate an LLM using Weave's `Model` and `Evaluation` APIs. First, define a Weave model by subclassing `weave.Model`, specifying the model name and prompt format, and tracking a `predict` method with `@weave.op`. The `predict` method sends a prompt to OpenAI and parses the response into a structured output using a Pydantic schema (`FruitExtract`). Then, create a small evaluation dataset that consists of input sentences and expected targets. Next, define a custom scoring function (also tracked using `@weave.op`) that compares the model's output to the target label. Finally, wrap everything in a `weave.Evaluation`, specifying your dataset and scorers, and call `evaluate()` to run the evaluation pipeline asynchronously. ```python lines theme={"system"} # 1. Construct a Weave model class FruitExtract(BaseModel): fruit: str color: str flavor: str class ExtractFruitsModel(weave.Model): model_name: str prompt_template: str @weave.op() def predict(self, sentence: str) -> dict: client = OpenAI() response = client.beta.chat.completions.parse( model=self.model_name, messages=[ { "role": "user", "content": self.prompt_template.format(sentence=sentence), } ], response_format=FruitExtract, ) result = response.choices[0].message.parsed return result model = ExtractFruitsModel( name="gpt4o", model_name="gpt-4o", prompt_template='Extract fields ("fruit": , "color": , "flavor": ) as json, from the following text : {sentence}', ) # 2. Collect some samples sentences = [ "There are many fruits that were found on the recently discovered planet Goocrux. There are neoskizzles that grow there, which are purple and taste like candy.", "Pounits are a bright green color and are more savory than sweet.", "Finally, there are fruits called glowls, which have a very sour and bitter taste which is acidic and caustic, and a pale orange tinge to them.", ] labels = [ {"fruit": "neoskizzles", "color": "purple", "flavor": "candy"}, {"fruit": "pounits", "color": "green", "flavor": "savory"}, {"fruit": "glowls", "color": "orange", "flavor": "sour, bitter"}, ] examples = [ {"id": "0", "sentence": sentences[0], "target": labels[0]}, {"id": "1", "sentence": sentences[1], "target": labels[1]}, {"id": "2", "sentence": sentences[2], "target": labels[2]}, ] # 3. Define a scoring function for your evaluation @weave.op() def fruit_name_score(target: dict, output: FruitExtract) -> dict: target_flavors = [f.strip().lower() for f in target["flavor"].split(",")] output_flavors = [f.strip().lower() for f in output.flavor.split(",")] # Check if any target flavor is present in the output flavors matches = any(tf in of for tf in target_flavors for of in output_flavors) return {"correct": matches} # 4. Run your evaluation evaluation = weave.Evaluation( name="fruit_eval", dataset=examples, scorers=[fruit_name_score], ) await evaluation.evaluate(model) ``` After the evaluation finishes, Weave logs the model, dataset, and per-example scores to your project so you can inspect the results in the Weights & Biases UI. ## Looking for more examples Now that you've run a basic evaluation, you can explore more advanced workflows in the following tutorials: * Learn how to [build an evaluation pipeline end-to-end](/products/wandb/weave/tutorial-eval). * Learn how to [evaluate a RAG application](/products/wandb/weave/tutorial-rag). # Introduction to Traces Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/Intro_to_Weave_Hello_Trace Learn how to use introduction to traces with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/Intro_to_Weave_Hello_Trace.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/Intro_to_Weave_Hello_Trace.ipynb) This notebook shows you how to capture your first trace in W\&B Weave by decorating an OpenAI-powered function with `@weave.op`. Tracing helps you inspect the inputs, outputs, and intermediate steps of LLM calls so you can debug and improve your applications. This tutorial targets developers who are new to Weave and want a minimal end-to-end example. ## 🔑 Prerequisites Before you can begin tracing in Weave, complete the following prerequisites. These steps install the required SDKs, authenticate you with Weights & Biases and OpenAI, and initialize a project to send traces to. 1. Install the Weave SDK and log in with your [API key](https://forge.coreweave.com/settings#apikeys). 2. Install the OpenAI SDK and log in with your [API key](https://platform.openai.com/api-keys). 3. Initialize your Weights & Biases project. ```python lines theme={"system"} # Install dependencies and imports !pip install wandb weave openai -q import json import os from getpass import getpass from openai import OpenAI import weave # 🔑 Setup your API keys # Running this cell will prompt you for your API key with `getpass` and will not echo to the terminal. ##### print("---") print( "Create an API key at: https://forge.coreweave.com/settings#apikeys" ) os.environ["WANDB_API_KEY"] = getpass("Enter your CoreWeave Forge API key: ") print("---") print("You can generate your OpenAI API key here: https://platform.openai.com/api-keys") os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API key: ") print("---") ##### # 🏠 Enter your W&B project name weave_client = weave.init("MY_PROJECT_NAME") # 🐝 Your W&B project name ``` ## 🐝 Run your first trace The following code sample shows how to capture and visualize a trace in Weave using the `@weave.op` decorator. It defines a function called `extract_fruit` that sends a prompt to OpenAI's GPT-4o to extract structured data (fruit, color, and flavor) from a sentence. By decorating the function with `@weave.op`, Weave automatically tracks the function execution, including inputs, outputs, and intermediate steps. When you call the function with a sample sentence, Weave saves the full trace and makes it viewable in the Weights & Biases UI. ```python lines theme={"system"} @weave.op() # 🐝 Decorator to track requests def extract_fruit(sentence: str) -> dict: client = OpenAI() system_prompt = ( "Parse sentences into a JSON dict with keys: fruit, color and flavor." ) response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": sentence}, ], temperature=0.7, response_format={"type": "json_object"}, ) extracted = response.choices[0].message.content return json.loads(extracted) sentence = "There are many fruits that were found on the recently discovered planet Goocrux. There are neoskizzles that grow there, which are purple and taste like candy." extract_fruit(sentence) ``` You now have a working Weave project that captures traces from a decorated function, and you can view the trace in the Weights & Biases UI. ## 🚀 More examples Use the following resources to go deeper with Weave tracing: * [Quickstart guide](/products/wandb/weave/quickstart) * [Advanced tracing topics](/products/wandb/weave/tutorial-tracing_2) * [Tracing in Weave](/products/wandb/weave/guides/tracking/tracing) # Use Weave with Weights & Biases Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/Models_and_Weave_Integration_Demo Track experiments in Weights & Biases alongside LLM traces and evaluations in Weave with an interactive notebook. This notebook walks through an end-to-end workflow to build, evaluate, and publish a Retrieval-Augmented Generation (RAG) application. You retrieve a fine-tuned chat model from Registry, swap it into an existing `RagModel` tracked in Weave, evaluate the updated application with `weave.Evaluation`, and publish the new RAG model back to the Registry. This workflow is intended for teams who train and fine-tune models with Weights & Biases and want to integrate them into LLM applications tracked and evaluated with Weave. > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/Models_and_Weave_Integration_Demo.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/Models_and_Weave_Integration_Demo.ipynb) ## Prerequisites First, install the required libraries, set up API keys, log in to Forge, and create a new Weights & Biases project. 1. Install `weave`, `pandas`, `unsloth`, `wandb`, `litellm`, `pydantic`, `torch`, and `faiss-gpu` using `pip`. ```python lines theme={"system"} %%capture !pip install weave wandb pandas pydantic litellm faiss-gpu python %%capture !pip install unsloth # Also get the latest nightly Unsloth! !pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" ``` 2. Add the required API keys from your environment. ```python lines theme={"system"} import os from google.colab import userdata os.environ["WANDB_API_KEY"] = userdata.get("WANDB_API_KEY") # W&B and Weave os.environ["OPENAI_API_KEY"] = userdata.get( "OPENAI_API_KEY" ) # OpenAI - for retrieval embeddings os.environ["GEMINI_API_KEY"] = userdata.get( "GEMINI_API_KEY" ) # Gemini - for the base chat model ``` 3. Log in to Forge, and create a new project. ```python lines theme={"system"} import pandas as pd import wandb import weave wandb.login() PROJECT = "weave-cookboook-demo" ENTITY = "wandb-smle" weave.init(ENTITY + "/" + PROJECT) ``` ## Download `ChatModel` from Registry and implement `UnslothLoRAChatModel` In this scenario, the Model Team has already fine-tuned the Llama-3.2 model with the `unsloth` library for performance optimization, and the model is available in the Registry. In this step, you retrieve the fine-tuned [`ChatModel`](https://forge.coreweave.com/wandb/wandb-smle/weave-cookboook-demo/weave/object-versions?filter=%7B%22objectName%22%3A%22RagModel%22%7D\&peekPath=%2Fwandb-smle%2Fweave-rag-experiments%2Fobjects%2FChatModelRag%2Fversions%2F2mhdPb667uoFlXStXtZ0MuYoxPaiAXj3KyLS1kYRi84%3F%26) from the Registry and convert it into a `weave.Model` to make it compatible with the [`RagModel`](https://forge.coreweave.com/wandb/wandb-smle/weave-cookboook-demo/weave/object-versions?filter=%7B%22objectName%22%3A%22RagModel%22%7D\&peekPath=%2Fwandb-smle%2Fweave-cookboook-demo%2Fobjects%2FRagModel%2Fversions%2FcqRaGKcxutBWXyM0fCGTR1Yk2mISLsNari4wlGTwERo%3F%26). > [!NOTE] > > The `RagModel` referenced in the following code is a top-level `weave.Model` that can be considered a complete RAG Application. It contains a `ChatModel`, vector database, and a prompt. The `ChatModel` is also a `weave.Model`, which contains code to download an artifact from the Registry. `ChatModel` can be changed modularly to support any kind of other LLM chat model as part of the `RagModel`. For more information, [view the model in Weave](https://forge.coreweave.com/wandb/wandb-smle/weave-cookboook-demo/weave/evaluations?peekPath=%2Fwandb-smle%2Fweave-cookboook-demo%2Fobjects%2FRagModel%2Fversions%2Fx7MzcgHDrGXYHHDQ9BA8N89qDwcGkdSdpxH30ubm8ZM%3F%26). To load the `ChatModel`, use `unsloth.FastLanguageModel` or `peft.AutoPeftModelForCausalLM` with adapters for efficient integration into the app. After you download the model from the Registry, set up the initialization and prediction logic with the `model_post_init` method. The required code for this step is available in the **Use** tab of the Registry, and you can copy it directly into your implementation. The following code defines the `UnslothLoRAChatModel` class to manage, initialize, and use the fine-tuned Llama-3.2 model retrieved from the Registry. `UnslothLoRAChatModel` uses `unsloth.FastLanguageModel` for optimized inference. The `model_post_init` method downloads and sets up the model, while the `predict` method processes user queries and generates responses. To adapt the code for your use case, update the `MODEL_REG_URL` with the correct registry path for your fine-tuned model, and adjust parameters like `max_seq_length` or `dtype` based on your hardware or requirements. ```python lines theme={"system"} from typing import Any from pydantic import PrivateAttr from unsloth import FastLanguageModel import weave class UnslothLoRAChatModel(weave.Model): """ We define an extra ChatModel class to be able store and version more parameters than just the model name. Especially, relevant if we consider fine-tuning (locally or aaS) because of specific parameters. """ chat_model: str cm_temperature: float cm_max_new_tokens: int cm_quantize: bool inference_batch_size: int dtype: Any device: str _model: Any = PrivateAttr() _tokenizer: Any = PrivateAttr() def model_post_init(self, __context): # we can simply paste this from the "Use" tab from the registry run = wandb.init(project=PROJECT, job_type="model_download") artifact = run.use_artifact(f"{self.chat_model}") model_path = artifact.download() # unsloth version (enable native 2x faster inference) self._model, self._tokenizer = FastLanguageModel.from_pretrained( model_name=model_path, max_seq_length=self.cm_max_new_tokens, dtype=self.dtype, load_in_4bit=self.cm_quantize, ) FastLanguageModel.for_inference(self._model) @weave.op() async def predict(self, query: list[str]) -> dict: # add_generation_prompt = true - Must add for generation input_ids = self._tokenizer.apply_chat_template( query, tokenize=True, add_generation_prompt=True, return_tensors="pt", ).to("cuda") output_ids = self._model.generate( input_ids=input_ids, max_new_tokens=64, use_cache=True, temperature=1.5, min_p=0.1, ) decoded_outputs = self._tokenizer.batch_decode( output_ids[0][input_ids.shape[1] :], skip_special_tokens=True ) return "".join(decoded_outputs).strip() python MODEL_REG_URL = "wandb32/wandb-registry-RAG Chat Models/Finetuned Llama-3.2:v3" max_seq_length = 2048 # Choose any! We auto support RoPE Scaling internally! dtype = ( None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+ ) load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False. new_chat_model = UnslothLoRAChatModel( name="UnslothLoRAChatModelRag", chat_model=MODEL_REG_URL, cm_temperature=1.0, cm_max_new_tokens=max_seq_length, cm_quantize=load_in_4bit, inference_batch_size=max_seq_length, dtype=dtype, device="auto", ) python await new_chat_model.predict( [{"role": "user", "content": "What is the capital of Germany?"}] ) ``` ## Integrate the new `ChatModel` version into `RagModel` Building a RAG application from a fine-tuned chat model lets you reuse tailored components without rebuilding the entire pipeline. In this step, you retrieve the existing `RagModel` from your Weave project and update its `ChatModel` to use the fine-tuned model. Swapping in the new chat model leaves the other components, like the vector database and prompts, untouched, preserving the application's overall structure while improving performance. The following code retrieves the `RagModel` object using a reference from the Weave project. The code then updates the `chat_model` attribute of the `RagModel` to use the new `UnslothLoRAChatModel` instance created in the previous step. After this, the code publishes the updated `RagModel` to create a new version. Finally, the code runs a sample prediction query with the updated `RagModel` to verify that it uses the new chat model. ```python lines theme={"system"} RagModel = weave.ref( "weave://wandb-smle/weave-cookboook-demo/object/RagModel:cqRaGKcxutBWXyM0fCGTR1Yk2mISLsNari4wlGTwERo" ).get() python RagModel.chat_model.chat_model python await RagModel.predict("When was the first conference on climate change?") python # MAGIC: exchange chat_model and publish new version (no need to worry about other RAG components) RagModel.chat_model = new_chat_model python RagModel.chat_model.chat_model python # first publish new version so that in prediction we reference new version PUB_REFERENCE = weave.publish(RagModel, "RagModel") python await RagModel.predict("When was the first conference on climate change?") ``` ## Run a `weave.Evaluation` With the updated `RagModel` published, the next step is to confirm that the new fine-tuned chat model performs as expected within the application. In this step, you evaluate the performance of the updated `RagModel` with an existing `weave.Evaluation`. This process confirms that the new fine-tuned chat model performs as expected within the RAG application. To streamline integration and enable collaboration between the Models and Apps teams, you log evaluation results to both the model's W\&B run and the Weave workspace. In Models: * The evaluation summary is logged to the W\&B run used to download the fine-tuned chat model. This includes summary metrics and graphs displayed in a [workspace view](https://forge.coreweave.com/wandb/wandb-smle/weave-cookboook-demo/workspace?nw=eglm8z7o9) for analysis. * The evaluation trace ID is added to the run's configuration, linking directly to the Weave page for improved traceability by the Model Team. In Weave: * The artifact or registry link for the `ChatModel` is stored as an input to the `RagModel`. * The W\&B run ID is saved as an extra column in the evaluation traces for better context. The following code demonstrates how to retrieve an evaluation object, run the evaluation with the updated `RagModel`, and log the results to both Weights & Biases and Weave. Ensure that the evaluation reference (`WEAVE_EVAL`) matches your project setup. ```python lines theme={"system"} # MAGIC: we can simply get an evaluation with a eval dataset and scorers and use them WEAVE_EVAL = "weave://wandb-smle/weave-cookboook-demo/object/climate_rag_eval:ntRX6qn3Tx6w3UEVZXdhIh1BWGh7uXcQpOQnIuvnSgo" climate_rag_eval = weave.ref(WEAVE_EVAL).get() python with weave.attributes({"wandb-run-id": wandb.run.id}): # use .call attribute to retrieve both the result and the call in order to save eval trace to Models summary, call = await climate_rag_eval.evaluate.call(climate_rag_eval, RagModel) python # log to models wandb.run.log(pd.json_normalize(summary, sep="/").to_dict(orient="records")[0]) wandb.run.config.update( {"weave_url": f"https://forge.coreweave.com/wandb/wandb-smle/weave-cookboook-demo/r/call/{call.id}"} ) wandb.run.finish() ``` ## Save the new RAG model to the Registry Now that you've evaluated the updated `RagModel`, the final step is to publish it back to the Registry so other teams can discover and reuse it. To make the updated `RagModel` available for future use by both the Models and Apps teams, push it to the Registry as a reference artifact. The following code retrieves the `weave` object version and name for the updated `RagModel` and uses them to create reference links. The code then creates a new artifact in Weights & Biases with metadata containing the model's Weave URL. The code logs this artifact to the Registry and links it to a designated registry path. Before running the code, ensure the `ENTITY` and `PROJECT` variables match your Weights & Biases setup, and specify the correct target registry path. This process finalizes the workflow by publishing the new `RagModel` to the Weights & Biases ecosystem for collaboration and reuse. After running the code in this section, your updated `RagModel` is available in the Registry as a referenced artifact, completing the round-trip between Weights & Biases and Weave. ```python lines theme={"system"} MODELS_OBJECT_VERSION = PUB_REFERENCE.digest # weave object version MODELS_OBJECT_NAME = PUB_REFERENCE.name # weave object name python models_url = f"https://wandb.ai/{ENTITY}/{PROJECT}/weave/objects/{MODELS_OBJECT_NAME}/versions/{MODELS_OBJECT_VERSION}" models_link = ( f"weave://{ENTITY}/{PROJECT}/object/{MODELS_OBJECT_NAME}:{MODELS_OBJECT_VERSION}" ) with wandb.init(project=PROJECT, entity=ENTITY) as run: # create new Artifact artifact_model = wandb.Artifact( name="RagModel", type="model", description="Models Link from RagModel in Weave", metadata={"url": models_url}, ) artifact_model.add_reference(models_link, name="model", checksum=False) # log new artifact run.log_artifact(artifact_model, aliases=[MODELS_OBJECT_VERSION]) # link to registry run.link_artifact( artifact_model, target_path="wandb32/wandb-registry-RAG Models/RAG Model" ) ``` # Chain Of Density Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/chain_of_density Implement chain-of-density summarization techniques with W&B Weave for iterative text compression and evaluation. > [!NOTE] > > This is an interactive notebook. You can run it locally or use the links below: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/chain_of_density.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/chain_of_density.ipynb) Summarizing complex technical documents while preserving crucial details is a challenging task. The Chain of Density (CoD) summarization technique offers a solution by iteratively refining summaries to be more concise and information-dense. This guide demonstrates how to implement CoD using Weave for tracking and evaluating the application. ![Weave evaluation dashboard with Chain of Density summarization results, metrics, and performance comparisons](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/summarization-eval_dash.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=9ddd7edfc095bc7110e2c805b5ac4a01) ## What is chain of density summarization [![arXiv](https://img.shields.io/badge/arXiv-2309.04269-b31b1b.svg)](https://arxiv.org/abs/2309.04269) Chain of Density (CoD) is an iterative summarization technique that produces increasingly concise and information-dense summaries. It works by: 1. Starting with an initial summary 2. Iteratively refining the summary, making it more concise while preserving key information 3. Increasing the density of entities and technical details with each iteration This approach is particularly useful for summarizing scientific papers or technical documents where preserving detailed information is crucial. ## Why use Weave In this tutorial, you'll use Weave to implement and evaluate a Chain of Density summarization pipeline for ArXiv papers. You'll learn how to: * **Track your LLM pipeline**: Use Weave to automatically log inputs, outputs, and intermediate steps of your summarization process. * **Evaluate LLM outputs**: Create consistent evaluations of your summaries using Weave's built-in tools. * **Build composable operations**: Combine and reuse Weave operations across different parts of your summarization pipeline. * **Integrate with existing code**: Add Weave to your existing Python code with minimal overhead. By the end of this tutorial, you'll have created a CoD summarization pipeline that uses Weave's capabilities for model serving, evaluation, and result tracking. ## Set up the environment First, set up the environment and import the necessary libraries. This step installs the dependencies needed for the pipeline, including Weave for tracking, Anthropic for the LLM, and PyPDF2 for reading ArXiv PDFs. ```python lines theme={"system"} !pip install -qU anthropic weave pydantic requests PyPDF2 set-env-colab-kaggle-dotenv ``` Because the pipeline calls Anthropic's Claude model, you'll need an Anthropic API key before running the following code. > To get an Anthropic API key: > > 1. Sign up for an account at [https://www.anthropic.com](https://www.anthropic.com). > 2. Navigate to the API section in your account settings. > 3. Generate a new API key. > 4. Store the API key securely in your `.env` file. ```python lines theme={"system"} import io import os from datetime import datetime, timezone import anthropic import requests from pydantic import BaseModel from PyPDF2 import PdfReader from set_env import set_env import weave set_env("WANDB_API_KEY") set_env("ANTHROPIC_API_KEY") weave.init("summarization-chain-of-density-cookbook") anthropic_client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) ``` This code uses Weave to track the experiment and Anthropic's Claude model for text generation. The `weave.init([PROJECT_NAME])` call sets up a new Weave project for the summarization task. ## Define the ArxivPaper model With the environment ready, the next step is to define the data structure the pipeline operates on. Create an `ArxivPaper` class to represent the data: ```python lines theme={"system"} # Define ArxivPaper model class ArxivPaper(BaseModel): entry_id: str updated: datetime published: datetime title: str authors: list[str] summary: str pdf_url: str # Create sample ArxivPaper arxiv_paper = ArxivPaper( entry_id="http://arxiv.org/abs/2406.04744v1", updated=datetime(2024, 6, 7, 8, 43, 7, tzinfo=timezone.utc), published=datetime(2024, 6, 7, 8, 43, 7, tzinfo=timezone.utc), title="CRAG -- Comprehensive RAG Benchmark", authors=["Xiao Yang", "Kai Sun", "Hao Xin"], # Truncated for brevity summary="Retrieval-Augmented Generation (RAG) has recently emerged as a promising solution...", # Truncated pdf_url="https://arxiv.org/pdf/2406.04744", ) ``` This class encapsulates the metadata and content of an ArXiv paper, which is the input to the summarization pipeline. ## Load PDF content The `ArxivPaper` model holds metadata and a PDF URL, but the summarization pipeline needs the full text of the paper. To work with the full paper content, add a function to load and extract text from PDFs: ```python lines theme={"system"} @weave.op() def load_pdf(pdf_url: str) -> str: # Download the PDF response = requests.get(pdf_url) pdf_file = io.BytesIO(response.content) # Read the PDF pdf_reader = PdfReader(pdf_file) # Extract text from all pages text = "" for page in pdf_reader.pages: text += page.extract_text() return text ``` ## Implement Chain of Density summarization Now, implement the core CoD summarization logic using Weave operations: ![Weave trace visualization with Chain of Density summarization pipeline execution](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/summarization_trace.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=70286439756a5dd0cc09269f865e1540) ```python lines theme={"system"} # Chain of Density Summarization @weave.op() def summarize_current_summary( document: str, instruction: str, current_summary: str = "", iteration: int = 1, model: str = "claude-3-sonnet-20240229", ): prompt = f""" Document: {document} Current summary: {current_summary} Instruction to focus on: {instruction} Iteration: {iteration} Generate an increasingly concise, entity-dense, and highly technical summary from the provided document that specifically addresses the given instruction. """ response = anthropic_client.messages.create( model=model, max_tokens=4096, messages=[{"role": "user", "content": prompt}] ) return response.content[0].text @weave.op() def iterative_density_summarization( document: str, instruction: str, current_summary: str, density_iterations: int, model: str = "claude-3-sonnet-20240229", ): iteration_summaries = [] for iteration in range(1, density_iterations + 1): current_summary = summarize_current_summary( document, instruction, current_summary, iteration, model ) iteration_summaries.append(current_summary) return current_summary, iteration_summaries @weave.op() def final_summary( instruction: str, current_summary: str, model: str = "claude-3-sonnet-20240229" ): prompt = f""" Given this summary: {current_summary} And this instruction to focus on: {instruction} Create an extremely dense, final summary that captures all key technical information in the most concise form possible, while specifically addressing the given instruction. """ return ( anthropic_client.messages.create( model=model, max_tokens=4096, messages=[{"role": "user", "content": prompt}] ) .content[0] .text ) @weave.op() def chain_of_density_summarization( document: str, instruction: str, current_summary: str = "", model: str = "claude-3-sonnet-20240229", density_iterations: int = 2, ): current_summary, iteration_summaries = iterative_density_summarization( document, instruction, current_summary, density_iterations, model ) final_summary_text = final_summary(instruction, current_summary, model) return { "final_summary": final_summary_text, "accumulated_summary": current_summary, "iteration_summaries": iteration_summaries, } ``` Here's what each function does: * `summarize_current_summary`: Generates a single summary iteration based on the current state. * `iterative_density_summarization`: Applies the CoD technique by calling `summarize_current_summary` multiple times. * `chain_of_density_summarization`: Orchestrates the entire summarization process and returns the results. The `@weave.op()` decorators ensure that Weave tracks the inputs, outputs, and execution of these functions. ## Create a Weave Model With the summarization functions in place, the next step is to package them as a Weave Model so that runs, parameters, and versions are tracked together. Now, wrap the summarization pipeline in a Weave Model: ![Weave Model configuration interface for Chain of Density summarization with model settings and parameters](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/model.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bc5684332ae6201770d4531c8d08651a) ```python lines theme={"system"} # Weave Model class ArxivChainOfDensityPipeline(weave.Model): model: str = "claude-3-sonnet-20240229" density_iterations: int = 3 @weave.op() def predict(self, paper: ArxivPaper, instruction: str) -> dict: text = load_pdf(paper.pdf_url) result = chain_of_density_summarization( text, instruction, model=self.model, density_iterations=self.density_iterations, ) return result ``` This `ArxivChainOfDensityPipeline` class encapsulates the summarization logic as a Weave Model, providing several key benefits: * Automatic experiment tracking: Weave captures inputs, outputs, and parameters for each run of the model. * Versioning: Changes to the model's attributes or code are automatically versioned, creating a clear history of how your summarization pipeline evolves over time. * Reproducibility: The versioning and tracking let you reproduce any previous result or configuration of your summarization pipeline. * Hyperparameter management: Model attributes (like `model` and `density_iterations`) are clearly defined and tracked across different runs, facilitating experimentation. * Integration with Weave ecosystem: Using `weave.Model` works with other Weave tools, such as evaluations and serving capabilities. ## Implement evaluation metrics With the pipeline producing summaries, you need a way to measure their quality systematically. To assess the quality of the summaries, implement simple evaluation metrics: ```python lines theme={"system"} import json @weave.op() def evaluate_summary( summary: str, instruction: str, model: str = "claude-3-sonnet-20240229" ) -> dict: prompt = f""" Summary: {summary} Instruction: {instruction} Evaluate the summary based on the following criteria: 1. Relevance (1-5): How well does the summary address the given instruction? 2. Conciseness (1-5): How concise is the summary while retaining key information? 3. Technical Accuracy (1-5): How accurately does the summary convey technical details? Your response MUST be in the following JSON format: {{ "relevance": {{ "score": , "explanation": "" }}, "conciseness": {{ "score": , "explanation": "" }}, "technical_accuracy": {{ "score": , "explanation": "" }} }} Ensure that the scores are integers between 1 and 5, and that the explanations are concise. """ response = anthropic_client.messages.create( model=model, max_tokens=1000, messages=[{"role": "user", "content": prompt}] ) print(response.content[0].text) eval_dict = json.loads(response.content[0].text) return { "relevance": eval_dict["relevance"]["score"], "conciseness": eval_dict["conciseness"]["score"], "technical_accuracy": eval_dict["technical_accuracy"]["score"], "average_score": sum(eval_dict[k]["score"] for k in eval_dict) / 3, "evaluation_text": response.content[0].text, } ``` These evaluation functions use the Claude model to assess the quality of the generated summaries based on relevance, conciseness, and technical accuracy. ## Create a Weave Dataset and run evaluation Now that the scoring function is defined, the final step is to apply it to sample inputs and execute the evaluation. To evaluate the pipeline, create a Weave Dataset and run an evaluation: ![Weave Dataset configuration interface for evaluation with dataset selection and configuration options](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/dataset.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=0879365a9ca4cb92063f1dd9d9e68c54) ```python lines theme={"system"} # Create a Weave Dataset dataset = weave.Dataset( name="arxiv_papers", rows=[ { "paper": arxiv_paper, "instruction": "What was the approach to experimenting with different data mixtures?", }, ], ) weave.publish(dataset) ``` For the evaluation, use an LLM-as-a-judge approach. This technique involves using a language model to assess the quality of outputs generated by another model or system. It uses the LLM's understanding and reasoning capabilities to provide nuanced evaluations, especially for tasks where traditional metrics may be insufficient. [![arXiv](https://img.shields.io/badge/arXiv-2306.05685-b31b1b.svg)](https://arxiv.org/abs/2306.05685) ![Weave evaluation dashboard with Chain of Density summarization results, metrics, and performance comparisons](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/summarization-eval_dash.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=9ddd7edfc095bc7110e2c805b5ac4a01) ```python lines theme={"system"} # Define the scorer function @weave.op() def quality_scorer(instruction: str, output: dict) -> dict: result = evaluate_summary(output["final_summary"], instruction) return result ``` ```python lines theme={"system"} # Run evaluation evaluation = weave.Evaluation(dataset=dataset, scorers=[quality_scorer]) arxiv_chain_of_density_pipeline = ArxivChainOfDensityPipeline() results = await evaluation.evaluate(arxiv_chain_of_density_pipeline) ``` This code creates a dataset with the sample ArXiv paper, defines a quality scorer, and runs an evaluation of the summarization pipeline. ## Conclusion This example demonstrated how to implement a Chain of Density summarization pipeline for ArXiv papers using Weave. You learned how to: * Create Weave operations for each step of the summarization process * Wrap the pipeline in a Weave Model for tracking and evaluation * Implement custom evaluation metrics using Weave operations * Create a dataset and run an evaluation of the pipeline Weave tracks inputs, outputs, and intermediate steps throughout the summarization process, making it easier to debug, optimize, and evaluate your LLM application. You can extend this example to handle larger datasets, implement more sophisticated evaluation metrics, or integrate with other LLM workflows. [View Full Report on Weights & Biases](https://forge.coreweave.com/wandb/wandb_fc/arxiv-reader/reports/Building-a-bot-to-summarize-arXiv-papers-as-PDFs-using-Anthrophic-and-W-B-Weave--Vmlldzo4Nzg0ODI4) # Codegen Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/codegen Build and evaluate code generation pipelines with W&B Weave to trace prompts, outputs, and quality metrics. > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/codegen.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/codegen.ipynb) Generating high-quality code with proper structure, documentation, and tests is a challenging task. This guide is for developers who want to build an LLM-powered code generation workflow and systematically measure its quality. This notebook demonstrates how to create a code-generation pipeline that produces Python functions evaluated against the HumanEval test suite. The pipeline uses Weave for evaluation comparison and tracking and OpenAI's GPT models for code generation with structured outputs. ![Weave evaluation dashboard comparing code generation runs](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/codegen-eval_dash.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bbadb381cfac936b2dce7d793c6eb4dc) ## Why use Weave This tutorial uses Weave to implement and evaluate a code generation pipeline. You learn how to: * **Track your LLM pipeline**: Log inputs, outputs, and intermediate steps of your code generation process. * **Evaluate LLM outputs**: Create and compare evaluations of your generated code with debugging tools and visualizations. ## Set up the environment Set up your environment and import the necessary libraries. These dependencies provide the formatting tools, dataset loader, and OpenAI and Weave clients used throughout the pipeline. ```python lines theme={"system"} !pip install -qU autopep8 autoflake weave isort openai set-env-colab-kaggle-dotenv datasets python %%capture # Temporary workaround to fix bug in openai: # TypeError: Client.__init__() got an unexpected keyword argument 'proxies' # See https://community.openai.com/t/error-with-openai-1-56-0-client-init-got-an-unexpected-keyword-argument-proxies/1040332/15 !pip install "httpx<0.28" python import ast import os import re import subprocess import tempfile import traceback import autopep8 import isort from autoflake import fix_code from datasets import load_dataset from openai import OpenAI from pydantic import BaseModel from set_env import set_env import weave from weave import Dataset, Evaluation set_env("WANDB_API_KEY") set_env("OPENAI_API_KEY") python WEAVE_PROJECT = "codegen-cookbook-example" weave.init(WEAVE_PROJECT) python client = OpenAI() python human_eval = load_dataset("openai_humaneval") selected_examples = human_eval["test"][:3] ``` > [!NOTE] > > Weave automatically tracks OpenAI API calls, including inputs, outputs, and metadata. You don't need to add any additional logging code for your OpenAI interactions. Weave handles it in the background. ## Structured outputs and Pydantic models This code generation pipeline uses OpenAI's [structured outputs mode](https://platform.openai.com/docs/guides/structured-outputs) and Pydantic models to produce consistent and well-formatted responses from the language model. This approach offers several advantages: * **Type safety**: Defining Pydantic models for the expected outputs enforces a strict structure for the generated code, program runners, and unit tests. * **Easier parsing**: The structured output mode parses the model's response directly into the predefined Pydantic models, reducing the need for complex post-processing. * **Improved reliability**: Specifying the exact format you expect reduces the likelihood of unexpected or malformed outputs from the language model. The following example defines Pydantic models and uses them with OpenAI's structured outputs: ```python lines theme={"system"} class GeneratedCode(BaseModel): function_signature: str function_args_with_docstring_within_triple_quotes: str code_logic: str class FormattedGeneratedCode(BaseModel): full_code: str ``` ## Implement a code formatter To produce consistent and clean code output, implement a `CodeFormatter` class using Weave operations. This formatter applies linting and styling rules to the generated code, program runner, and unit tests. ```python lines theme={"system"} class CodeFormatter(BaseModel): @weave.op() def lint_code(self, code: str) -> str: # Replace escaped newlines with actual newlines code = code.replace("\\n", "\n") # Remove unused imports and variables code = fix_code( code, remove_all_unused_imports=True, remove_unused_variables=True ) # Sort imports code = isort.code(code) # Apply PEP 8 formatting code = autopep8.fix_code(code, options={"aggressive": 2}) return code @weave.op() def add_imports(self, code: str) -> str: tree = ast.parse(code) from_imports = {} global_names = set() for node in ast.walk(tree): if isinstance(node, ast.Name) and node.id not in dir(__builtins__): global_names.add(node.id) # Only add typing imports that are actually used typing_imports = global_names.intersection( {"List", "Dict", "Tuple", "Set", "Optional", "Union"} ) if typing_imports: from_imports["typing"] = typing_imports # Remove names that are defined within the function function_def = next( node for node in tree.body if isinstance(node, ast.FunctionDef) ) local_names = {arg.arg for arg in function_def.args.args} local_names.update( node.id for node in ast.walk(function_def) if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store) ) global_names -= local_names global_names -= {"sorted"} # Remove built-in functions # Construct the import statements import_statements = [] for module, names in from_imports.items(): names_str = ", ".join(sorted(names)) import_statements.append(f"from {module} import {names_str}") return ( "\n".join(import_statements) + ("\n\n" if import_statements else "") + code ) @weave.op() def format_generated_code( self, generated_code: GeneratedCode ) -> FormattedGeneratedCode: # Combine the code parts full_code = f"{generated_code.function_signature}\n{generated_code.function_args_with_docstring_within_triple_quotes}\n{generated_code.code_logic}" # Ensure proper indentation lines = full_code.split("\n") indented_lines = [] for i, line in enumerate(lines): if i == 0: # Function signature indented_lines.append(line) elif i == 1: # Function arguments (docstring) indented_lines.append(" " + line) else: # Function body indented_lines.append(" " + line) full_code = "\n".join(indented_lines) # Lint the code full_code = self.lint_code(full_code) # Add imports cleaned_code = self.add_imports(full_code) return FormattedGeneratedCode(full_code=cleaned_code) ``` This `CodeFormatter` class provides several Weave operations to clean and format the generated code: * Replacing escaped newlines with actual newlines. * Removing unused imports and variables. * Sorting imports. * Applying PEP 8 formatting. * Adding missing imports. ## Define the `CodeGenerationPipeline` ![Weave trace of a code generation pipeline run](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/codegen_trace.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=64962d510f16e2fe9ec02c0fa8a8df48) With the formatter in place, the next step is to implement the core code generation logic that ties the prompt, the LLM call, and the formatter together. This example uses a `weave.Model` so that the model is automatically versioned when it changes. The `model_name` is kept as an attribute so that you can experiment with it and diff and compare it in Weave. Function calls are tracked with `@weave.op` so the inputs and outputs are logged to help with error tracking and debugging. ```python lines theme={"system"} class CodeGenerationPipeline(weave.Model): model_name: str formatter: CodeFormatter def __init__( self, model_name: str = "gpt-4o", formatter: CodeFormatter | None = None ): if formatter is None: formatter = CodeFormatter() super().__init__(model_name=model_name, formatter=formatter) self.model_name = model_name self.formatter = formatter @weave.op() async def predict(self, prompt: str): generated_code = self.generate_code(prompt) formatted_generated_code = self.formatter.format_generated_code(generated_code) return formatted_generated_code.full_code @weave.op() def generate_code(self, prompt: str) -> GeneratedCode: completion = client.beta.chat.completions.parse( model=self.model_name, messages=[ { "role": "system", "content": "You are an expert Python code generator.", }, {"role": "user", "content": prompt}, ], response_format=GeneratedCode, ) message = completion.choices[0].message if message.parsed: return message.parsed else: raise ValueError(message.refusal) ``` This `CodeGenerationPipeline` class encapsulates the code generation logic as a Weave Model, providing several benefits: * Automatic experiment tracking: Weave captures inputs, outputs, and parameters for each run of the model. * Versioning: Changes to the model's attributes or code are automatically versioned, creating a history of how your code generation pipeline evolves over time. * Reproducibility: The versioning and tracking let you reproduce any previous result or configuration of your code generation pipeline. * Hyperparameter management: Model attributes (like `model_name`) are defined and tracked across different runs, facilitating experimentation. * Integration with Weave ecosystem: Using `weave.Model` connects your pipeline to other Weave tools, such as evaluations and serving capabilities. ## Implement evaluation metrics To assess the quality of the generated code, implement evaluation metrics using a `weave.Scorer` subclass. This runs `score` on every `model_output` from the dataset. `model_output` comes from the output of the `predict` function in the `weave.Model`. `prompt` is taken from the `human-eval` dataset. ```python lines theme={"system"} CODE_TEMPLATE = """ {model_output} {test} if __name__ == "__main__": check({entry_point}) """ python @weave.op() async def score_humaneval_test(test: str, entry_point: str, output: str): generated_code = output # Extract test cases from the test string test_cases = re.findall(r"assert.*", test) test_cases_str = "\n ".join(test_cases) # Generate the full source code full_code = CODE_TEMPLATE.format( model_output=generated_code, test=test, test_cases=test_cases_str, entry_point=entry_point, ) # Create a temporary file to store the code with tempfile.NamedTemporaryFile(delete=False, suffix=".py") as tmp_file: # Write the generated code to the temporary file tmp_file.write(full_code.encode()) tmp_file_path = tmp_file.name try: # Run the temporary Python file as a subprocess with a timeout result = subprocess.run( ["python", tmp_file_path], capture_output=True, text=True, timeout=10, # Timeout of 10 seconds ) print(result) if result.returncode == 0: return {"correct": True} else: return {"correct": False, "error": result.stderr, "output": result.stdout} except subprocess.TimeoutExpired: return {"correct": False, "error": "TimeoutExpired"} except Exception as e: return {"correct": False, "error": traceback.format_exc()} finally: # Ensure the temporary file is removed after execution os.remove(tmp_file_path) ``` These evaluation functions run the generated code and return a boolean value indicating whether the code passed the test provided from the dataset. ![Weave trace of a HumanEval scorer evaluating generated code](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/eval_trace.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=871d089e15c7a3d4cac84c1df1766ef5) ## Create a Weave Dataset and run evaluation With the pipeline and scorer defined, the final step is to assemble the evaluation dataset and run it end-to-end. To evaluate the pipeline, create a Weave Dataset and run an evaluation: ```python lines theme={"system"} formatted_selected_examples = [ { "task_id": task_id, "prompt": prompt, "canonical_solution": solution, "test": test, "entry_point": entry_point, } for task_id, prompt, solution, test, entry_point in zip( selected_examples["task_id"], selected_examples["prompt"], selected_examples["canonical_solution"], selected_examples["test"], selected_examples["entry_point"], ) ] python prompt_dataset = Dataset( name="humaneval_code_gen_example", rows=[ { "prompt": example["prompt"], "test": example["test"], "entry_point": example["entry_point"], } for example in formatted_selected_examples ], ) weave.publish(prompt_dataset) python EVAL_RUN = True python for model_name in ["gpt-4o-2024-08-06"]: pipeline = CodeGenerationPipeline(model_name=model_name) if not EVAL_RUN: dataset = prompt_dataset.rows[2] result = await pipeline.predict(dataset["prompt"]) score_result = await score_humaneval_test( dataset["test"], dataset["entry_point"], result["generated_code"].full_code ) else: evaluation = Evaluation( name="minimal_code_gen_evaluation", dataset=prompt_dataset, scorers=[score_humaneval_test], ) results = await evaluation.evaluate(pipeline) ``` This code creates a dataset with the sample prompts, defines the HumanEval test scorer, and runs an evaluation of the code generation pipeline. After the evaluation completes, results are available in the Weights & Biases UI for inspection and comparison across runs. ![Weave evaluation dashboard showing HumanEval scorer results](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/codegen-eval_dash.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bbadb381cfac936b2dce7d793c6eb4dc) ## Conclusion This example demonstrates how to implement a code generation pipeline using Weave and OpenAI's language models. You learned how to: * Create Weave operations for each step of the code generation process. * Wrap the pipeline in a Weave Model for streamlined tracking and evaluation. * Implement custom evaluation metrics using Weave operations. * Create a dataset and run an evaluation of the pipeline. Weave tracks inputs, outputs, and intermediate steps throughout the code generation process, making it easier to debug, optimize, and evaluate your LLM application. For more information about Weave and its capabilities, see the [Weave documentation](/products/wandb/weave). You can extend this example to handle larger datasets, implement more sophisticated evaluation metrics, or integrate with other LLM workflows. # DSPy Prompt Optimization Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/dspy_prompt_optimization Learn how to use dspy prompt optimization with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/dspy_prompt_optimization.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/dspy_prompt_optimization.ipynb) The [BIG-bench (Beyond the Imitation Game Benchmark)](https://github.com/google/BIG-bench) is a collaborative benchmark that probes large language models and extrapolates their future capabilities across more than 200 tasks. The [BIG-Bench Hard (BBH)](https://github.com/suzgunmirac/BIG-Bench-Hard) is a suite of the 23 most challenging BIG-Bench tasks that the current generation of language models can find difficult to solve. This tutorial demonstrates how to improve the performance of an LLM workflow implemented on the causal judgement task from the BIG-bench Hard benchmark and evaluate prompting strategies. You use [DSPy](https://dspy.ai) to implement the LLM workflow and optimize the prompting strategy. You also use [Weave](/products/wandb/weave) to track the LLM workflow and evaluate prompting strategies. By the end of this tutorial, you have built a baseline DSPy program for causal reasoning, evaluated it with Weave, applied a DSPy optimizer to improve its prompting strategy, and compared the optimized program against the baseline. This tutorial is intended for practitioners who want to apply prompt optimization to their own LLM workflows and use Weave to track and compare results. ## Install the dependencies Before starting, install the libraries used throughout the tutorial. This tutorial uses the following libraries: * [DSPy](https://dspy.ai) to build and optimize the LLM workflow. * [Weave](/products/wandb/weave) to track the LLM workflow and evaluate prompting strategies. * [datasets](https://huggingface.co/docs/datasets/index) to access the BIG-Bench Hard dataset from HuggingFace Hub. ```python lines theme={"system"} !pip install -qU dspy weave "datasets<4" ``` Because this tutorial uses the [OpenAI API](https://openai.com/index/openai-api/) as the LLM vendor, you also need an OpenAI API key. You can [sign up](https://platform.openai.com/signup) on the OpenAI platform to get your own API key. ```python lines theme={"system"} import os from getpass import getpass api_key = getpass("Enter you OpenAI API key: ") os.environ["OPENAI_API_KEY"] = api_key ``` ## Enable tracking using Weave This section configures Weave so that subsequent DSPy calls in the tutorial are automatically traced and viewable in the Weights & Biases UI. Weave integrates with DSPy. Including [`weave.init`](/products/wandb/weave/reference/python-sdk/trace/weave_client#method-init) at the start of your code automatically traces your DSPy functions, which you can then explore in the Weights & Biases UI. For more information, see the [Weave integration docs for DSPy](/products/wandb/weave/guides/integrations/dspy). ```python lines theme={"system"} import weave weave.init(project_name="dspy-bigbench-hard") ``` This tutorial uses a metadata class inherited from [`weave.Object`](/products/wandb/weave/reference/python-sdk#class-object) to manage metadata. ```python lines theme={"system"} class Metadata(weave.Object): dataset_address: str = "maveriq/bigbenchhard" big_bench_hard_task: str = "causal_judgement" num_train_examples: int = 50 openai_model: str = "gpt-4o-mini" openai_max_tokens: int = 2048 max_bootstrapped_demos: int = 8 max_labeled_demos: int = 8 metadata = Metadata() ``` > [!TIP] > > Object versioning: The `Metadata` objects are automatically versioned and traced when functions consuming them are traced. ## Load the BIG-Bench Hard dataset With Weave tracking enabled, the next step is to prepare the data used to train and evaluate the DSPy program. Load this dataset from HuggingFace Hub, split it into training and validation sets, and [publish](/products/wandb/weave/guides/core-types/datasets) them on Weave. Publishing lets you version the datasets and also use [`weave.Evaluation`](/products/wandb/weave/guides/core-types/evaluations) to evaluate your prompting strategy. ```python lines theme={"system"} import dspy from datasets import load_dataset @weave.op() def get_dataset(metadata: Metadata): # load the BIG-Bench Hard dataset corresponding to the task from Huggingface Hug dataset = load_dataset(metadata.dataset_address, metadata.big_bench_hard_task)[ "train" ] # create the training and validation datasets rows = [{"question": data["input"], "answer": data["target"]} for data in dataset] train_rows = rows[0 : metadata.num_train_examples] val_rows = rows[metadata.num_train_examples :] # create the training and validation examples consisting of `dspy.Example` objects dspy_train_examples = [ dspy.Example(row).with_inputs("question") for row in train_rows ] dspy_val_examples = [dspy.Example(row).with_inputs("question") for row in val_rows] # publish the datasets to the Weave, this would let us version the data and use for evaluation weave.publish( weave.Dataset( name=f"bigbenchhard_{metadata.big_bench_hard_task}_train", rows=train_rows ) ) weave.publish( weave.Dataset( name=f"bigbenchhard_{metadata.big_bench_hard_task}_val", rows=val_rows ) ) return dspy_train_examples, dspy_val_examples dspy_train_examples, dspy_val_examples = get_dataset(metadata) ``` ![DSPy dataset loading interface with dataset preparation steps and data structure](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/1.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a09604e56f8b63187f78199c46e21cc6) ## The DSPy program With the dataset published to Weave, you can now define the baseline DSPy program that you later evaluate and optimize. [DSPy](https://dspy.ai) is a framework that pushes building new LM pipelines away from manipulating free-form strings and closer to programming (composing modular operators to build text transformation graphs), where a compiler automatically generates optimized LM invocation strategies and prompts from a program. Use [`dspy.LM`](https://dspy.ai/learn/programming/language_models) to configure the language model and [`dspy.configure`](https://dspy.ai/api/utils/configure/) to set it as the default. ```python lines theme={"system"} llm = dspy.LM("openai/gpt-4o-mini") dspy.configure(lm=llm) ``` ### Write the causal reasoning signature A [signature](https://dspy.ai/learn/programming/signatures) is a declarative specification of input/output behavior of a [DSPy module](https://dspy.ai/learn/programming/modules). DSPy modules are task-adaptive components (akin to neural network layers) that abstract any particular text transformation. ```python lines theme={"system"} class CausalReasoning(dspy.Signature): """You are an expert in causal reasoning. Analyze the given question carefully and answer Yes or No. Provide a detailed explanation justifying your answer.""" question: str = dspy.InputField(desc="The question to be answered") answer: str = dspy.OutputField(desc="Yes or No") confidence: float = dspy.OutputField(desc="Confidence score between 0 and 1") explanation: str = dspy.OutputField(desc="Detailed explanation for the answer") class CausalReasoningModule(dspy.Module): def __init__(self): self.prog = dspy.Predict(CausalReasoning) @weave.op() def forward(self, question: str) -> dict: result = self.prog(question=question) return { "answer": result.answer, "confidence": result.confidence, "explanation": result.explanation, } ``` Test the LLM workflow (that is, the `CausalReasoningModule`) on an example from the causal reasoning subset of BIG-Bench Hard. ```python lines theme={"system"} import rich baseline_module = CausalReasoningModule() prediction = baseline_module(dspy_train_examples[0]["question"]) rich.print(prediction) ``` ![Baseline DSPy program evaluation results with performance metrics and output examples](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/2.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=fa53fd11627944e47df0efedef7dd003) ## Evaluate the DSPy program Now that you have a baseline prompting strategy, evaluate it on the validation set using [`weave.Evaluation`](/products/wandb/weave/guides/core-types/evaluations) with a metric that matches the predicted answer with the ground truth. Weave takes each example, passes it through your application, and scores the output on multiple custom scoring functions. This gives you a view of the performance of your application, and a rich UI to drill into individual outputs and scores. First, create a scoring function that determines whether the predicted answer matches the ground truth. Weave scoring functions receive the model's return value as `output` and any matching keys from the dataset example as additional arguments. Here, `answer` comes from the dataset and `output` is the dict returned by `CausalReasoningModule.forward`. ```python lines theme={"system"} @weave.op() def weave_evaluation_scorer(answer: str, output: dict) -> dict: return {"match": int(answer.lower() == output["answer"].lower())} ``` Next, wrap the module in a traced function that `weave.Evaluation` can call. The wrapper's argument names must match the dataset column names that the model consumes. ```python lines theme={"system"} @weave.op() def predict(question: str) -> dict: return baseline_module(question=question) ``` Now you can define the evaluation and run it. ```python lines theme={"system"} validation_dataset = weave.ref( f"bigbenchhard_{metadata.big_bench_hard_task}_val:v0" ).get() evaluation = weave.Evaluation( name="baseline_causal_reasoning_module", dataset=validation_dataset, scorers=[weave_evaluation_scorer], ) await evaluation.evaluate(predict) ``` ![Weave evaluation dashboard with DSPy program performance metrics, traces, and comparison results](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/dspy_optimization-3.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=29d1d351812ba7be3990ed5216bd2408) > [!NOTE] > > If you're running from a Python script, you can use the following code to run the evaluation: > > ```python lines theme={"system"} > import asyncio > asyncio.run(evaluation.evaluate(predict)) > ``` > [!WARNING] > > Running the evaluation causal reasoning dataset costs approximately \$0.24 in OpenAI credits. ## Optimize the DSPy program With the baseline performance measured, you can now apply a DSPy optimizer and compare the result to the baseline. Now that you have a baseline DSPy program, improve its performance for causal reasoning using the [BootstrapFewShot](https://dspy.ai/api/optimizers/BootstrapFewShot/) optimizer, which can tune the parameters of a DSPy program to maximize the specified metrics. ```python lines theme={"system"} from dspy.teleprompt import BootstrapFewShot @weave.op() def get_optimized_program(model: dspy.Module, metadata: Metadata) -> dspy.Module: @weave.op() def dspy_evaluation_metric(true, prediction, trace=None): return prediction["answer"].lower() == true.answer.lower() teleprompter = BootstrapFewShot( metric=dspy_evaluation_metric, max_bootstrapped_demos=metadata.max_bootstrapped_demos, max_labeled_demos=metadata.max_labeled_demos, ) return teleprompter.compile(model, trainset=dspy_train_examples) optimized_module = get_optimized_program(baseline_module, metadata) ``` ![DSPy program optimization process interface with teleprompter configuration and optimization progress](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/4.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=d411afcc6be58ea4eb8989d6a25131f8) > [!WARNING] > > Running the evaluation causal reasoning dataset costs approximately \$0.04 in OpenAI credits. Now that you have the optimized program (the optimized prompting strategy), evaluate it again on the validation set and compare it with the baseline DSPy program. ```python lines theme={"system"} @weave.op() def predict_optimized(question: str) -> dict: return optimized_module(question=question) evaluation = weave.Evaluation( name="optimized_causal_reasoning_module", dataset=validation_dataset, scorers=[weave_evaluation_scorer], ) await evaluation.evaluate(predict_optimized) ``` ![Optimized DSPy program evaluation results with improved performance metrics and output quality](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/5.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=92efdb07512581f4dcce5d9cfed0f574) Comparing the evaluation of the baseline program with the optimized one shows that the optimized program answers the causal reasoning questions with more accuracy. ## Conclusion In this tutorial, you learned how to use DSPy for prompt optimization alongside Weave for tracking and evaluation to compare the original and optimized programs. # HuggingFace Dataset Evaluations Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/hf_dataset_evals Learn how to use HuggingFace dataset evaluations with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the links below: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/hf_dataset_evals.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/hf_dataset_evals.ipynb) This notebook shows you how to use a HuggingFace dataset as the input source for a Weave `Evaluation`. By the end, you'll have a working evaluation pipeline that references rows in a HuggingFace dataset by index, preprocesses each row into the format your model expects, and tracks the scored results in Weave. This pattern is useful when you want to evaluate models against existing HuggingFace datasets without first converting them into a Weave-native dataset. > [!NOTE] > > This guide demonstrates a workaround for using HuggingFace datasets with Weave evaluations. The approach works today, and more seamless integrations for external datasets are in development. ## Setup and imports First, initialize Weave and connect to Weights & Biases so that Weave tracks the evaluation runs and their results in your Weave project. ```python lines theme={"system"} !pip install datasets wandb weave # Initialize variables HUGGINGFACE_DATASET = "wandb/ragbench-test-sample" WANDB_KEY = "" WEAVE_TEAM = "" WEAVE_PROJECT = "" # Init weave and required libraries import asyncio import nest_asyncio import wandb from datasets import load_dataset import weave from weave import Evaluation # Login to wandb and initialize weave wandb.login(key=WANDB_KEY) client = weave.init(f"{WEAVE_TEAM}/{WEAVE_PROJECT}") # Apply nest_asyncio to allow nested event loops (needed for some notebook environments) nest_asyncio.apply() ``` ## Load and prepare HuggingFace dataset Next, load the HuggingFace dataset and build a lightweight index that the evaluation iterates over. Rather than passing the dataset rows directly to Weave, pass a list of index references and resolve them to full rows during preprocessing. This approach keeps the evaluation tied to the original HuggingFace dataset and maintains references to it. > [!NOTE] > > In the index, encode the `hf_hub_name` along with the `hf_id` to ensure each row has a unique identifier. Weave uses this unique digest value to track and reference specific dataset entries during evaluations. ```python lines theme={"system"} # Load the HuggingFace dataset ds = load_dataset(HUGGINGFACE_DATASET) row_count = ds["train"].num_rows # Create an index mapping for the dataset # This creates a list of dictionaries with HF dataset indices # Example: [{"hf_id": 0}, {"hf_id": 1}, {"hf_id": 2}, ...] hf_index = [{"hf_id": i, "hf_hub_name": HUGGINGFACE_DATASET} for i in range(row_count)] ``` ## Define processing and evaluation functions With the index in place, define the three functions that make up the evaluation pipeline: one to turn each index reference into a usable example, one to score the model's output, and one representing the model being evaluated. The processing pipeline uses the following functions: * `preprocess_example`: Transforms the index reference into the actual data needed for evaluation. * `hf_eval`: Defines how to score the model outputs. * `function_to_evaluate`: The actual function or model being evaluated. ```python lines theme={"system"} @weave.op() def preprocess_example(example): """ Preprocesses each example before evaluation. Args: example: Dict containing hf_id Returns: Dict containing the prompt from the HF dataset """ hf_row = ds["train"][example["hf_id"]] return {"prompt": hf_row["question"], "answer": hf_row["response"]} @weave.op() def hf_eval(hf_id: int, output: dict) -> dict: """ Scoring function for evaluating model outputs. Args: hf_id: Index in the HF dataset output: The output from the model to evaluate Returns: Dict containing evaluation scores """ hf_row = ds["train"][hf_id] return {"scorer_value": True} @weave.op() def function_to_evaluate(prompt: str): """ The function that will be evaluated (e.g., your model or pipeline). Args: prompt: Input prompt from the dataset Returns: Dict containing model output """ return {"generated_text": "testing "} ``` ## Create and run the evaluation Finally, wire the index, scorer, and preprocessing function into a Weave `Evaluation` and run it against the model. For each entry in `hf_index`, Weave performs the following steps: 1. `preprocess_example` gets the corresponding data from the HuggingFace dataset. 2. Weave passes the preprocessed data to `function_to_evaluate`. 3. `hf_eval` scores the output. 4. Weave tracks the results. After the evaluation finishes, the run and its per-row scores are available in your Weave project for inspection. ```python lines theme={"system"} # Create evaluation object evaluation = Evaluation( dataset=hf_index, # Use our index mapping scorers=[hf_eval], # List of scoring functions preprocess_model_input=preprocess_example, # Function to prepare inputs ) # Run evaluation asynchronously async def main(): await evaluation.evaluate(function_to_evaluate) asyncio.run(main()) ``` # Import from CSV Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/import_from_csv Import datasets from CSV files into W&B Weave for use in evaluations, tracing, and model comparison workflows. > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/import_from_csv.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/import_from_csv.ipynb) ## Import traces from third-party systems This notebook shows you how to import historical conversation traces from a CSV file into W\&B Weave so you can analyze them, compare model behavior, and run evaluations on data that was generated outside of a Weave-instrumented application. Sometimes you can't instrument your Python or JavaScript code with the Weave integration to obtain real-time traces of your GenAI application. Often, these traces are available to you later in CSV or JSON format. This notebook uses the lower-level Weave Python API to extract data from a CSV file and import it into Weave so you can analyze and evaluate it. The sample dataset assumed in this cookbook has the following structure: ```text theme={"system"} conversation_id,turn_index,start_time,user_input,ground_truth,answer_text 1234,1,2024-09-04 13:05:39,This is the beginning, ['This was the beginning'], That was the beginning 1235,1,2024-09-04 13:02:11,This is another trace,, That was another trace 1235,2,2024-09-04 13:04:19,This is the next turn,, That was the next turn 1236,1,2024-09-04 13:02:10,This is a 3 turn conversation,, Woah thats a lot of turns 1236,2,2024-09-04 13:02:30,This is the second turn, ['That was definitely the second turn'], You are correct 1236,3,2024-09-04 13:02:53,This is the end,, Well good riddance! ``` To understand the decisions for import in this notebook, remember that Weave traces have parent-child relationships that are 1:Many and continuous. A single parent can have multiple children, and that parent can itself be a child of another parent. This notebook uses `conversation_id` as the parent identifier and `turn_index` as the child identifier to provide complete conversation logging. You must modify the variables in the following sections to match your own dataset, file paths, and Weights & Biases project. ## Set up the environment Install and import all needed packages. Set `WANDB_API_KEY` in your environment so that you can log in with `wandb.login()` (provide this to Colab as a secret). Set the name of the file you upload to Colab in `name_of_file`, and set the Weights & Biases project you want to log into in `name_of_wandb_project`. > [!NOTE] > > `name_of_wandb_project` can also be in the format `[TEAM_NAME]/[PROJECT_NAME]` to specify a team to log the traces into. Then, fetch a Weave client by calling `weave.init()`. ```python lines theme={"system"} %pip install wandb weave pandas datetime --quiet python import os import pandas as pd import wandb from google.colab import userdata import weave ## Write samples file to disk with open("/content/import_cookbook_data.csv", "w") as f: f.write( "conversation_id,turn_index,start_time,user_input,ground_truth,answer_text\n" ) f.write( '1234,1,2024-09-04 13:05:39,This is the beginning, ["This was the beginning"], That was the beginning\n' ) f.write( "1235,1,2024-09-04 13:02:11,This is another trace,, That was another trace\n" ) f.write( "1235,2,2024-09-04 13:04:19,This is the next turn,, That was the next turn\n" ) f.write( "1236,1,2024-09-04 13:02:10,This is a 3 turn conversation,, Woah thats a lot of turns\n" ) f.write( '1236,2,2024-09-04 13:02:30,This is the second turn, ["That was definitely the second turn"], You are correct\n' ) f.write("1236,3,2024-09-04 13:02:53,This is the end,, Well good riddance!\n") os.environ["WANDB_API_KEY"] = userdata.get("WANDB_API_KEY") name_of_file = "/content/import_cookbook_data.csv" name_of_wandb_project = "import-weave-traces-cookbook" wandb.login() python weave_client = weave.init(name_of_wandb_project) ``` ## Load the data With the environment ready, you can load and shape the CSV data so that it matches the parent-child structure that Weave expects. Load the data into a pandas DataFrame, and sort it by `conversation_id` and `turn_index` to ensure the parents and children are correctly ordered. This results in a two-column pandas DataFrame with the conversation turns as an array under `conversation_data`. ```python lines theme={"system"} ## Load data and shape it df = pd.read_csv(name_of_file) sorted_df = df.sort_values(["conversation_id", "turn_index"]) # Function to create an array of dictionaries for each conversation def create_conversation_dict_array(group): return group.drop("conversation_id", axis=1).to_dict("records") # Group the dataframe by conversation_id and apply the aggregation result_df = ( sorted_df.groupby("conversation_id") .apply(create_conversation_dict_array) .reset_index() ) result_df.columns = ["conversation_id", "conversation_data"] # Show how our aggregation looks result_df.head() ``` ## Log the traces to Weave With the data shaped into conversations and turns, the next step is to write those records into Weave as parent and child calls. Iterate through the pandas DataFrame: * Create a parent call for every `conversation_id`. * Iterate through the turn array to create child calls sorted by their `turn_index`. Important concepts of the lower-level Python API: * A Weave call is equivalent to a Weave trace. This call can have a parent or children associated with it. * A Weave call can have other things associated with it, such as feedback and metadata. This example only associates inputs and outputs, but you can add these other items in your import if the data provides them. * A Weave call is `created` and `finished` because these are meant to be tracked in real time. Because this is an after-the-fact import, you create and finish once the objects are defined and tied to one another. * The `op` value of a call is how Weave categorizes calls of the same makeup. In this example, all parent calls are of `Conversation` type, and all child calls are of `Turn` type. You can modify this as you see fit. * A call can have `inputs` and `output`. `inputs` are defined at creation, and `output` is defined when the call is finished. ```python lines theme={"system"} # Log traces to weave # Iterate through our aggregated conversations for _, row in result_df.iterrows(): # Define our conversation parent, # we are now creating a "call" with the weave_client we defined before parent_call = weave_client.create_call( # The Op value will register this as a Weave Op, which will allow us to retrieve these as a group easily in the future op="Conversation", # We set the inputs of our high level conversation as all the turns under it inputs={ "conversation_data": row["conversation_data"][:-1] if len(row["conversation_data"]) > 1 else row["conversation_data"] }, # Our Conversation parent does not have a further parent parent=None, # The name of how this specific conversation will appear in the UI display_name=f"conversation-{row['conversation_id']}", ) # We set the output of the parent to be the last trace in the conversation parent_output = row["conversation_data"][len(row["conversation_data"]) - 1] # We now iterate through all the conversation turns for the parent # and log them as children of the conversation for item in row["conversation_data"]: item_id = f"{row['conversation_id']}-{item['turn_index']}" # We create a call again here to be categorized under the conversation call = weave_client.create_call( # We qualify a single conversation trace as a "Turn" op="Turn", # We provide all inputs of the turn, including RAG 'ground_truth' inputs={ "turn_index": item["turn_index"], "start_time": item["start_time"], "user_input": item["user_input"], "ground_truth": item["ground_truth"], }, # We set this to be a child of the parent we defined parent=parent_call, # We provide it a name to be id'ed by in Weave display_name=item_id, ) # We set the output of the call as the answer output = { "answer_text": item["answer_text"], } # Because these are traces that already happened, we finish the single turn call weave_client.finish_call(call=call, output=output) # Now that we have logged all its children, we also finish the parent call weave_client.finish_call(call=parent_call, output=parent_output) ``` ## Result: traces logged to Weave At this point, your CSV data has been imported into Weave. You can now browse the conversations and their turns in the Weights & Biases UI, grouped under the `Conversation` and `Turn` operations you defined. Traces: ![Imported conversation traces in the Weights & Biases UI](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/csv-1.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=3e3502991397f29b2e4f206b13e674df) Operations: ![Conversation and Turn operations in the Weights & Biases UI](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/csv-2.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=697809a0efc622cda807655308c0951a) ## Optional: export your traces to run evaluations Once the traces are in Weave and you understand how the conversations look, you can export them to another process to run Weave Evaluations. ![Exporting traces from a Weave project](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/csv-3.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=f89d66d540e87944834601683ba9fbeb) To do this, fetch all conversations from Weights & Biases through the query API and create a dataset from them. ```python lines theme={"system"} ## This cell does not run by default, comment the below line to execute this script %%script false --no-raise-error ## Get all Conversation traces for evaluation and prepare dataset for eval # We create a query filter that brings us all our Conversation objects # The ref shown below is specific to your project, and you can obtain it by # going into your project's Operations in the UI, clicking on the "Conversations" # object, then the "Use" tab in the side panel. weave_ref_for_conversation_op = "weave://wandb-smle/import-weave-traces-cookbook/op/Conversation:tzUhDyzVm5bqQsuqh5RT4axEXSosyLIYZn9zbRyenaw" filter = weave.trace_server.trace_server_interface.CallsFilter( op_names=[weave_ref_for_conversation_op], ) # We execute the query conversation_traces = weave_client.get_calls(filter=filter) rows = [] # We go through our conversation traces and construct dataset rows from it for single_conv in conversation_traces: # In this example, we may only care for conversations that utilized our RAG # pipeline, so we filter for such types of conversations is_rag = False for single_trace in single_conv.inputs['conversation_data']: if single_trace['ground_truth'] is not None: is_rag = True break if single_conv.output['ground_truth'] is not None: is_rag = True # Once we've identified a converation to have used RAG, we add it to our dataset if is_rag: inputs = [] ground_truths = [] answers = [] # We go through every turn in the conversation for turn in single_conv.inputs['conversation_data']: inputs.append(turn.get('user_input', '')) ground_truths.append(turn.get('ground_truth', '')) answers.append(turn.get('answer_text', '')) ## Account for when conversations are a single turn if len(single_conv.inputs) != 1 or single_conv.inputs['conversation_data'][0].get('turn_index') != single_conv.output.get('turn_index'): inputs.append(single_conv.output.get('user_input', '')) ground_truths.append(single_conv.output.get('ground_truth', '')) answers.append(single_conv.output.get('answer_text', '')) data = { 'question': inputs, 'contexts': ground_truths, 'answer': answers } rows.append(data) # With our dataset rows created, we create the Dataset object and # publish it back to Weave for later retrieval dset = weave.Dataset(name = "conv_traces_for_eval", rows=rows) weave.publish(dset) ``` ## Result The exported dataset is now published back to Weave and is ready to use as input for an evaluation. ![Published dataset in the Weights & Biases UI, ready for use in an evaluation](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/csv-4.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=ccf7bd1f38bfca70216afdf98668d1ff) To learn more about evaluations, see the [Quickstart](/products/wandb/weave/tutorial-rag) on using your newly created dataset to evaluate your RAG application. # Leaderboard Quickstart Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/leaderboard_quickstart Learn how to use leaderboard quickstart with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the links below: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/leaderboard_quickstart.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/leaderboard_quickstart.ipynb) This quickstart shows you how to use the W\&B Weave Leaderboard to compare model performance across multiple datasets and scoring functions. By the end, you will have published a leaderboard that ranks several models against a shared set of evaluations. You can then identify which model performs best on each metric. This guide is for developers familiar with running Weave evaluations who want to compare results side by side. Specifically, you will: 1. Generate a dataset of fake zip code data. 2. Author some scoring functions and evaluate a baseline model. 3. Use these techniques to evaluate a matrix of models versus evaluations. 4. Review the leaderboard in the Weights & Biases UI. ## Step 1: Generate a dataset of fake zip code data First, create a function `generate_dataset_rows` that generates a list of fake zip code data. This synthetic dataset gives the leaderboard a consistent set of inputs and expected values to score each model against. ```python lines theme={"system"} import json from openai import OpenAI from pydantic import BaseModel class Row(BaseModel): zip_code: str city: str state: str avg_temp_f: float population: int median_income: int known_for: str class Rows(BaseModel): rows: list[Row] def generate_dataset_rows( location: str = "United States", count: int = 5, year: int = 2022 ): client = OpenAI() completion = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "You are a helpful assistant."}, { "role": "user", "content": f"Please generate {count} rows of data for random zip codes in {location} for the year {year}.", }, ], response_format={ "type": "json_schema", "json_schema": { "name": "response_format", "schema": Rows.model_json_schema(), }, }, ) return json.loads(completion.choices[0].message.content)["rows"] python import weave weave.init("leaderboard-demo") ``` ## Step 2: Author scoring functions Next, author three scoring functions. Each scorer evaluates a different aspect of the model output so the leaderboard can rank models on distinct dimensions of quality: 1. `check_concrete_fields`: Checks if the model output matches the expected city and state. 2. `check_value_fields`: Checks if the model output is within 10% of the expected population and median income. 3. `check_subjective_fields`: Uses an LLM to check if the model output matches the expected "known for" field. ```python lines theme={"system"} @weave.op def check_concrete_fields(city: str, state: str, output: dict): return { "city_match": city == output["city"], "state_match": state == output["state"], } @weave.op def check_value_fields( avg_temp_f: float, population: int, median_income: int, output: dict ): return { "avg_temp_f_err": abs(avg_temp_f - output["avg_temp_f"]) / avg_temp_f, "population_err": abs(population - output["population"]) / population, "median_income_err": abs(median_income - output["median_income"]) / median_income, } @weave.op def check_subjective_fields(zip_code: str, known_for: str, output: dict): client = OpenAI() class Response(BaseModel): correct_known_for: bool completion = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "You are a helpful assistant."}, { "role": "user", "content": f"My student was asked what the zip code {zip_code} is best known best for. The right answer is '{known_for}', and they said '{output['known_for']}'. Is their answer correct?", }, ], response_format={ "type": "json_schema", "json_schema": { "name": "response_format", "schema": Response.model_json_schema(), }, }, ) return json.loads(completion.choices[0].message.content) ``` ## Step 3: Create an evaluation Next, define an evaluation using the fake data and scoring functions. The `Evaluation` object pairs the dataset with the scorers, so you can run any model against the same benchmark. ```python lines theme={"system"} rows = generate_dataset_rows() evaluation = weave.Evaluation( name="United States - 2022", dataset=rows, scorers=[ check_concrete_fields, check_value_fields, check_subjective_fields, ], ) ``` ## Step 4: Evaluate a baseline model Now, evaluate a baseline model that returns a static response. Establishing a baseline gives you a reference point on the leaderboard so you can measure how much each subsequent model improves over a static implementation. ```python lines theme={"system"} @weave.op def baseline_model(zip_code: str): return { "city": "New York", "state": "NY", "avg_temp_f": 50.0, "population": 1000000, "median_income": 100000, "known_for": "The Big Apple", } await evaluation.evaluate(baseline_model) ``` ## Step 5: Create more models Now, create two more models to compare against the baseline. One model receives the zip code with no additional prompting, while the other receives a structured prompt. Comparing them on the leaderboard shows the impact of prompt context on answer quality. ```python lines theme={"system"} @weave.op def gpt_4o_mini_no_context(zip_code: str): client = OpenAI() completion = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": f"""Zip code {zip_code}"""}], response_format={ "type": "json_schema", "json_schema": { "name": "response_format", "schema": Row.model_json_schema(), }, }, ) return json.loads(completion.choices[0].message.content) await evaluation.evaluate(gpt_4o_mini_no_context) python @weave.op def gpt_4o_mini_with_context(zip_code: str): client = OpenAI() completion = client.chat.completions.create( model="gpt-4o-mini", messages=[ { "role": "user", "content": f"""Please answer the following questions about the zip code {zip_code}: 1. What is the city? 2. What is the state? 3. What is the average temperature in Fahrenheit? 4. What is the population? 5. What is the median income? 6. What is the most well known thing about this zip code? """, } ], response_format={ "type": "json_schema", "json_schema": { "name": "response_format", "schema": Row.model_json_schema(), }, }, ) return json.loads(completion.choices[0].message.content) await evaluation.evaluate(gpt_4o_mini_with_context) ``` ## Step 6: Create more evaluations Now, evaluate a matrix of models versus evaluations. Running every model against several datasets (different regions and years) produces the data the leaderboard needs to rank models across multiple conditions. ```python lines theme={"system"} scorers = [ check_concrete_fields, check_value_fields, check_subjective_fields, ] evaluations = [ weave.Evaluation( name="United States - 2022", dataset=weave.Dataset( name="United States - 2022", rows=generate_dataset_rows("United States", 5, 2022), ), scorers=scorers, ), weave.Evaluation( name="California - 2022", dataset=weave.Dataset( name="California - 2022", rows=generate_dataset_rows("California", 5, 2022) ), scorers=scorers, ), weave.Evaluation( name="United States - 2000", dataset=weave.Dataset( name="United States - 2000", rows=generate_dataset_rows("United States", 5, 2000), ), scorers=scorers, ), ] models = [ baseline_model, gpt_4o_mini_no_context, gpt_4o_mini_with_context, ] for evaluation in evaluations: for model in models: await evaluation.evaluate( model, __weave={"display_name": evaluation.name + ":" + model.__name__} ) ``` ## Step 7: Review the leaderboard With the evaluation results published, you can now assemble them into a leaderboard for side-by-side comparison. You can create a new leaderboard by navigating to the leaderboard tab in the UI and clicking **Create Leaderboard**. You can also generate a leaderboard directly from Python: ```python lines theme={"system"} from weave.flow import leaderboard from weave.trace.ref_util import get_ref spec = leaderboard.Leaderboard( name="Zip Code World Knowledge", description=""" This leaderboard compares the performance of models in terms of world knowledge about zip codes. ### Columns 1. **State Match against `United States - 2022`**: The fraction of zip codes that the model correctly identified the state for. 2. **Avg Temp F Error against `California - 2022`**: The mean absolute error of the model's average temperature prediction. 3. **Correct Known For against `United States - 2000`**: The fraction of zip codes that the model correctly identified the most well known thing about the zip code. """, columns=[ leaderboard.LeaderboardColumn( evaluation_object_ref=get_ref(evaluations[0]).uri(), scorer_name="check_concrete_fields", summary_metric_path="state_match.true_fraction", ), leaderboard.LeaderboardColumn( evaluation_object_ref=get_ref(evaluations[1]).uri(), scorer_name="check_value_fields", should_minimize=True, summary_metric_path="avg_temp_f_err.mean", ), leaderboard.LeaderboardColumn( evaluation_object_ref=get_ref(evaluations[2]).uri(), scorer_name="check_subjective_fields", summary_metric_path="correct_known_for.true_fraction", ), ], ) ref = weave.publish(spec) ``` You now have a published leaderboard in Weave that ranks each model against the three evaluations and scoring metrics you defined. From the Weights & Biases UI, you can inspect per-model scores, drill into individual evaluation runs, and compare future model iterations against the same baseline. # Multi-agent structured output Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/multi-agent-structured-output Learn how to use multi-agent structured output with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/multi-agent-structured-output.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/multi-agent-structured-output.ipynb) This tutorial demonstrates how to build a multi-agent system that uses OpenAI's structured outputs feature, and how to trace agent interactions with [Weave](/products/wandb/weave). By the end, you have a four-agent data analysis pipeline whose intermediate inputs and outputs are visible in the Weights & Biases UI. OpenAI released [Structured Outputs](https://openai.com/index/introducing-structured-outputs-in-the-api/) so the model always generates responses that adhere to your supplied JSON Schema without strongly worded prompts. With Structured Outputs, you don't need to validate or retry incorrectly formatted responses. By using the parameter `strict: true`, you can guarantee the response abides by a provided schema. Structured outputs in a multi-agent system produce consistent, predictably processed data between agents. They also support explicit refusals and remove the need for retries or response validation. > [!TIP] > > **Source**: This cookbook is based on [sample code from OpenAI's structured outputs](https://cookbook.openai.com/examples/structured_outputs_multi_agent), with some modifications added for improved visualization using Weave. ## Install the dependencies First, install the libraries the tutorial depends on. This tutorial uses the following libraries: * [OpenAI](https://openai.com/index/openai-api/) to create the multi-agent system. * [Weave](/products/wandb/weave) to track the LLM workflow and evaluate prompting strategies. ```python lines theme={"system"} !pip install -qU openai weave wandb python %%capture # Temporary workaround to fix bug in openai: # TypeError: Client.__init__() got an unexpected keyword argument 'proxies' # See https://community.openai.com/t/error-with-openai-1-56-0-client-init-got-an-unexpected-keyword-argument-proxies/1040332/15 !pip install "httpx<0.28" ``` Next, configure credentials and initialize Weave so traces are logged to your Weights & Biases project. Set `WANDB_API_KEY` in your environment so you can log in with `wandb.login()`. Provide this to Colab as a secret. Set the Weights & Biases project to log into in `name_of_wandb_project`. > [!NOTE] > > `name_of_wandb_project` may also be in the format of `[YOUR-TEAM]/[YOUR-PROJECT]` to specify a team to log the traces into. Then fetch a Weave client by calling `weave.init()`. Because this tutorial uses the [OpenAI API](https://openai.com/index/openai-api/), you also need an OpenAI API key. [Sign up](https://platform.openai.com/signup) on the OpenAI platform to get your own API key. Provide this to Colab as a secret too. ```python lines theme={"system"} import base64 import json import os from io import BytesIO, StringIO import matplotlib.pyplot as plt import numpy as np import pandas as pd import wandb from google.colab import userdata from openai import OpenAI import weave python os.environ["WANDB_API_KEY"] = userdata.get("WANDB_API_KEY") os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY") wandb.login() name_of_wandb_project = "multi-agent-structured-output" weave.init(name_of_wandb_project) client = OpenAI() MODEL = "gpt-4o-2024-08-06" ``` ## Set up the agents With Weave initialized, define the agents that make up the system. The use case for this tutorial is a data analysis task. First, set up the four-agent system: * Triaging agent: Decides which agents to call. * Data pre-processing agent: Prepares data for analysis, for example by cleaning it up. * Data analysis agent: Performs analysis on the data. * Data visualization agent: Visualizes the output of the analysis to extract insights. Start by defining the system prompts for each of these agents. These prompts establish each agent's role and the tools it's allowed to call. ```python lines theme={"system"} triaging_system_prompt = """You are a Triaging Agent. Your role is to assess the user's query and route it to the relevant agents. The agents available are: - Data Processing Agent: Cleans, transforms, and aggregates data. - Analysis Agent: Performs statistical, correlation, and regression analysis. - Visualization Agent: Creates bar charts, line charts, and pie charts. Use the send_query_to_agents tool to forward the user's query to the relevant agents. Also, use the speak_to_user tool to get more information from the user if needed.""" processing_system_prompt = """You are a Data Processing Agent. Your role is to clean, transform, and aggregate data using the following tools: - clean_data - transform_data - aggregate_data""" analysis_system_prompt = """You are an Analysis Agent. Your role is to perform statistical, correlation, and regression analysis using the following tools: - stat_analysis - correlation_analysis - regression_analysis""" visualization_system_prompt = """You are a Visualization Agent. Your role is to create bar charts, line charts, and pie charts using the following tools: - create_bar_chart - create_line_chart - create_pie_chart""" ``` Next, define the tools for each agent. Apart from the triaging agent, each agent has tools specific to its role: **Data pre-processing agent**: Clean data, transform data, and aggregate data. **Data analysis agent**: Statistical analysis, correlation analysis, and regression analysis. **Data visualization agent**: Create bar chart, create line chart, and create pie chart. ```python lines theme={"system"} triage_tools = [ { "type": "function", "function": { "name": "send_query_to_agents", "description": "Sends the user query to relevant agents based on their capabilities.", "parameters": { "type": "object", "properties": { "agents": { "type": "array", "items": {"type": "string"}, "description": "An array of agent names to send the query to.", }, "query": { "type": "string", "description": "The user query to send.", }, }, "required": ["agents", "query"], }, }, "strict": True, } ] preprocess_tools = [ { "type": "function", "function": { "name": "clean_data", "description": "Cleans the provided data by removing duplicates and handling missing values.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The dataset to clean. Should be in a suitable format such as JSON or CSV.", } }, "required": ["data"], "additionalProperties": False, }, }, "strict": True, }, { "type": "function", "function": { "name": "transform_data", "description": "Transforms data based on specified rules.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The data to transform. Should be in a suitable format such as JSON or CSV.", }, "rules": { "type": "string", "description": "Transformation rules to apply, specified in a structured format.", }, }, "required": ["data", "rules"], "additionalProperties": False, }, }, "strict": True, }, { "type": "function", "function": { "name": "aggregate_data", "description": "Aggregates data by specified columns and operations.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The data to aggregate. Should be in a suitable format such as JSON or CSV.", }, "group_by": { "type": "array", "items": {"type": "string"}, "description": "Columns to group by.", }, "operations": { "type": "string", "description": "Aggregation operations to perform, specified in a structured format.", }, }, "required": ["data", "group_by", "operations"], "additionalProperties": False, }, }, "strict": True, }, ] analysis_tools = [ { "type": "function", "function": { "name": "stat_analysis", "description": "Performs statistical analysis on the given dataset.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The dataset to analyze. Should be in a suitable format such as JSON or CSV.", } }, "required": ["data"], "additionalProperties": False, }, }, "strict": True, }, { "type": "function", "function": { "name": "correlation_analysis", "description": "Calculates correlation coefficients between variables in the dataset.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The dataset to analyze. Should be in a suitable format such as JSON or CSV.", }, "variables": { "type": "array", "items": {"type": "string"}, "description": "List of variables to calculate correlations for.", }, }, "required": ["data", "variables"], "additionalProperties": False, }, }, "strict": True, }, { "type": "function", "function": { "name": "regression_analysis", "description": "Performs regression analysis on the dataset.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The dataset to analyze. Should be in a suitable format such as JSON or CSV.", }, "dependent_var": { "type": "string", "description": "The dependent variable for regression.", }, "independent_vars": { "type": "array", "items": {"type": "string"}, "description": "List of independent variables.", }, }, "required": ["data", "dependent_var", "independent_vars"], "additionalProperties": False, }, }, "strict": True, }, ] visualization_tools = [ { "type": "function", "function": { "name": "create_bar_chart", "description": "Creates a bar chart from the provided data.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The data for the bar chart. Should be in a suitable format such as JSON or CSV.", }, "x": {"type": "string", "description": "Column for the x-axis."}, "y": {"type": "string", "description": "Column for the y-axis."}, }, "required": ["data", "x", "y"], "additionalProperties": False, }, }, "strict": True, }, { "type": "function", "function": { "name": "create_line_chart", "description": "Creates a line chart from the provided data.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The data for the line chart. Should be in a suitable format such as JSON or CSV.", }, "x": {"type": "string", "description": "Column for the x-axis."}, "y": {"type": "string", "description": "Column for the y-axis."}, }, "required": ["data", "x", "y"], "additionalProperties": False, }, }, "strict": True, }, { "type": "function", "function": { "name": "create_pie_chart", "description": "Creates a pie chart from the provided data.", "parameters": { "type": "object", "properties": { "data": { "type": "string", "description": "The data for the pie chart. Should be in a suitable format such as JSON or CSV.", }, "labels": { "type": "string", "description": "Column for the labels.", }, "values": { "type": "string", "description": "Column for the values.", }, }, "required": ["data", "labels", "values"], "additionalProperties": False, }, }, "strict": True, }, ] ``` ## Enable multi-agent tracking with Weave With the agents and their tools defined, the next step is to wire them together and enable Weave tracing. Write the code logic to: * Handle passing the user query to the multi-agent system. * Handle the internal workings of the multi-agent system. * Execute the tool calls. ```python lines theme={"system"} # Example query user_query = """ Below is some data. I want you to first remove the duplicates then analyze the statistics of the data as well as plot a line chart. house_size (m3), house_price ($) 90, 100 80, 90 100, 120 90, 100 """ ``` From the user query, you can infer that the tools to call are `clean_data`, `start_analysis`, and `use_line_chart`. Begin by defining the execution function responsible for running tool calls. By decorating Python functions with `@weave.op()`, you can log and debug language model inputs, outputs, and traces. A multi-agent system involves many functions, but it's sufficient to add `@weave.op()` on top of each one. ```python lines theme={"system"} @weave.op() def clean_data(data): data_io = StringIO(data) df = pd.read_csv(data_io, sep=",") df_deduplicated = df.drop_duplicates() return df_deduplicated @weave.op() def stat_analysis(data): data_io = StringIO(data) df = pd.read_csv(data_io, sep=",") return df.describe() @weave.op() def plot_line_chart(data): data_io = StringIO(data) df = pd.read_csv(data_io, sep=",") x = df.iloc[:, 0] y = df.iloc[:, 1] coefficients = np.polyfit(x, y, 1) polynomial = np.poly1d(coefficients) y_fit = polynomial(x) plt.figure(figsize=(10, 6)) plt.plot(x, y, "o", label="Data Points") plt.plot(x, y_fit, "-", label="Best Fit Line") plt.title("Line Chart with Best Fit Line") plt.xlabel(df.columns[0]) plt.ylabel(df.columns[1]) plt.legend() plt.grid(True) # Save the plot to a BytesIO buffer before showing it buf = BytesIO() plt.savefig(buf, format="png") buf.seek(0) # Display the plot plt.show() # Encode the image in base64 for the data URL image_data = buf.getvalue() base64_encoded_data = base64.b64encode(image_data) base64_string = base64_encoded_data.decode("utf-8") data_url = f"data:image/png;base64,{base64_string}" return data_url # Define the function to execute the tools @weave.op() def execute_tool(tool_calls, messages): for tool_call in tool_calls: tool_name = tool_call.function.name tool_arguments = json.loads(tool_call.function.arguments) if tool_name == "clean_data": # Simulate data cleaning cleaned_df = clean_data(tool_arguments["data"]) cleaned_data = {"cleaned_data": cleaned_df.to_dict()} messages.append( {"role": "tool", "name": tool_name, "content": json.dumps(cleaned_data)} ) print("Cleaned data: ", cleaned_df) elif tool_name == "transform_data": # Simulate data transformation transformed_data = {"transformed_data": "sample_transformed_data"} messages.append( { "role": "tool", "name": tool_name, "content": json.dumps(transformed_data), } ) elif tool_name == "aggregate_data": # Simulate data aggregation aggregated_data = {"aggregated_data": "sample_aggregated_data"} messages.append( { "role": "tool", "name": tool_name, "content": json.dumps(aggregated_data), } ) elif tool_name == "stat_analysis": # Simulate statistical analysis stats_df = stat_analysis(tool_arguments["data"]) stats = {"stats": stats_df.to_dict()} messages.append( {"role": "tool", "name": tool_name, "content": json.dumps(stats)} ) print("Statistical Analysis: ", stats_df) elif tool_name == "correlation_analysis": # Simulate correlation analysis correlations = {"correlations": "sample_correlations"} messages.append( {"role": "tool", "name": tool_name, "content": json.dumps(correlations)} ) elif tool_name == "regression_analysis": # Simulate regression analysis regression_results = {"regression_results": "sample_regression_results"} messages.append( { "role": "tool", "name": tool_name, "content": json.dumps(regression_results), } ) elif tool_name == "create_bar_chart": # Simulate bar chart creation bar_chart = {"bar_chart": "sample_bar_chart"} messages.append( {"role": "tool", "name": tool_name, "content": json.dumps(bar_chart)} ) elif tool_name == "create_line_chart": # Simulate line chart creation line_chart = {"line_chart": plot_line_chart(tool_arguments["data"])} messages.append( {"role": "tool", "name": tool_name, "content": json.dumps(line_chart)} ) elif tool_name == "create_pie_chart": # Simulate pie chart creation pie_chart = {"pie_chart": "sample_pie_chart"} messages.append( {"role": "tool", "name": tool_name, "content": json.dumps(pie_chart)} ) return messages ``` Next, create the tool handlers for each of the sub-agents. These have a unique prompt and tool set passed to the model. The output is then passed to an execution function that runs the tool calls. ```python lines theme={"system"} # Define the functions to handle each agent's processing @weave.op() def handle_data_processing_agent(query, conversation_messages): messages = [{"role": "system", "content": processing_system_prompt}] messages.append({"role": "user", "content": query}) response = client.chat.completions.create( model=MODEL, messages=messages, temperature=0, tools=preprocess_tools, ) conversation_messages.append( [tool_call.function for tool_call in response.choices[0].message.tool_calls] ) execute_tool(response.choices[0].message.tool_calls, conversation_messages) @weave.op() def handle_analysis_agent(query, conversation_messages): messages = [{"role": "system", "content": analysis_system_prompt}] messages.append({"role": "user", "content": query}) response = client.chat.completions.create( model=MODEL, messages=messages, temperature=0, tools=analysis_tools, ) conversation_messages.append( [tool_call.function for tool_call in response.choices[0].message.tool_calls] ) execute_tool(response.choices[0].message.tool_calls, conversation_messages) @weave.op() def handle_visualization_agent(query, conversation_messages): messages = [{"role": "system", "content": visualization_system_prompt}] messages.append({"role": "user", "content": query}) response = client.chat.completions.create( model=MODEL, messages=messages, temperature=0, tools=visualization_tools, ) conversation_messages.append( [tool_call.function for tool_call in response.choices[0].message.tool_calls] ) execute_tool(response.choices[0].message.tool_calls, conversation_messages) ``` Finally, create the overarching tool to handle processing the user query. This function takes the user query, gets a response from the model, and passes it to the other agents to execute. ```python lines theme={"system"} # Function to handle user input and triaging @weave.op() def handle_user_message(user_query, conversation_messages=None): if conversation_messages is None: conversation_messages = [] user_message = {"role": "user", "content": user_query} conversation_messages.append(user_message) messages = [{"role": "system", "content": triaging_system_prompt}] messages.extend(conversation_messages) response = client.chat.completions.create( model=MODEL, messages=messages, temperature=0, tools=triage_tools, ) conversation_messages.append( [tool_call.function for tool_call in response.choices[0].message.tool_calls] ) for tool_call in response.choices[0].message.tool_calls: if tool_call.function.name == "send_query_to_agents": agents = json.loads(tool_call.function.arguments)["agents"] query = json.loads(tool_call.function.arguments)["query"] for agent in agents: if agent == "Data Processing Agent": handle_data_processing_agent(query, conversation_messages) elif agent == "Analysis Agent": handle_analysis_agent(query, conversation_messages) elif agent == "Visualization Agent": handle_visualization_agent(query, conversation_messages) outputs = extract_tool_contents(conversation_messages) return outputs functions = [ "clean_data", "transform_data", "stat_analysis", "aggregate_data", "correlation_analysis", "regression_analysis", "create_bar_chart", "create_line_chart", "create_pie_chart", ] @weave.op() def extract_tool_contents(data): contents = {} contents["all"] = data for element in data: if ( isinstance(element, dict) and element.get("role") == "tool" and element.get("name") in functions ): name = element["name"] content_str = element["content"] try: content_json = json.loads(content_str) if "chart" not in element.get("name"): contents[name] = [content_json] else: first_key = next(iter(content_json)) second_level = content_json[first_key] if isinstance(second_level, dict): second_key = next(iter(second_level)) contents[name] = second_level[second_key] else: contents[name] = second_level except json.JSONDecodeError: print(f"Error decoding JSON for {name}") contents[name] = None return contents ``` ## Execute the multi-agent system and visualize in Weave With every agent, tool, and handler in place, the system is ready to run. Finally, execute the primary `handle_user_message` function using the user's input and observe the results. ```python lines theme={"system"} handle_user_message(user_query) ``` When you click the Weave URL, you can see the execution trace. On the **Traces** page, you can check the input and output. For clarity, the diagram includes screenshots of the results displayed when you click each output. Weave integrates with the OpenAI API and automatically calculates costs. Cost and latency are also displayed alongside each trace. ![Weave Traces page showing the multi-agent execution with cost and latency](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/1-1.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=8139bccbf322122cc65ef1769120e322) Click a line to see the intermediate processes that ran within the multi-agent system. For example, the input and output of the `analysis_agent` appear in a structured output format. OpenAI's structured outputs help agents collaborate, but as the system grows more complex, the format of these interactions becomes harder to follow. Weave lets you inspect these intermediate processes and their inputs and outputs in detail. ![Weave trace detail showing the analysis agent's structured input and output](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/multi-agent-structured-output-3.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=cab6a4cba35c09517bd38979824e095e) Take a closer look at how tracing is handled in Weave. ## Conclusion In this tutorial, you learned how to develop a multi-agent system using OpenAI's structured output and Weave for tracking inputs, final outputs, and intermediate output formats. You now have a working example you can extend with additional agents, tools, or structured response schemas. # Not Diamond custom routing Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/notdiamond_custom_routing Learn how to use Not Diamond custom routing with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the following links: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/notdiamond_custom_routing.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/notdiamond_custom_routing.ipynb) This notebook demonstrates how to use Weave with [Not Diamond's custom routing](https://docs.notdiamond.ai/docs/router-training-quickstart) to route LLM prompts to the most appropriate model based on evaluation results. By the end, you have trained a custom router for coding prompts, used it to select a target model for a new prompt, and evaluated its performance against the best individual model. ## Routing prompts This section explains why custom routing is useful when working with multiple LLMs. When building complex LLM workflows, you may need to prompt different models according to accuracy, cost, or call latency. You can use [Not Diamond](https://www.notdiamond.ai/) to route prompts in these workflows to the right model for your needs, helping maximize accuracy while saving on model costs. For any given distribution of data, rarely does a single model outperform every other model on every query. By combining multiple models into a "meta-model" that learns when to call each LLM, you can beat every individual model's performance and even drive down costs and latency. ## Custom routing The following inputs are required to train a custom router for your prompts: 1. **A set of LLM prompts**: Prompts must be strings and should be representative of the prompts used in your application. 2. **LLM responses**: The responses from candidate LLMs for each input. Candidate LLMs can include both supported LLMs and your own custom models. 3. **Evaluation scores for responses to the inputs from candidate LLMs**: Scores are numbers, and can be any metric that fits your needs. By submitting these to the Not Diamond API, you can then train a custom router tuned to each of your workflows. ## Set up the training data In this section, you prepare the training and test data that the custom router learns from. In practice, you use your own Evaluations to train a custom router. For this example notebook, however, you use LLM responses for [the HumanEval dataset](https://github.com/openai/human-eval) to train a custom router for coding tasks. Start by downloading the dataset prepared for this example, then parse LLM responses into `EvaluationResults` for each model. This split of training and test data is used in later sections to train the router and to evaluate its out-of-sample performance. ```python lines theme={"system"} !curl -L "https://drive.google.com/uc?export=download&id=1q1zNZHioy9B7M-WRjsJPkfvFosfaHX38" -o humaneval.csv python import random import weave from weave.flow.dataset import Dataset from weave.flow.eval import EvaluationResults from weave.integrations.notdiamond.util import get_model_evals pct_train = 0.8 pct_test = 1 - pct_train # In practice, you will build an Evaluation on your dataset and call # `evaluation.get_eval_results(model)` model_evals = get_model_evals("./humaneval.csv") model_train = {} model_test = {} for model, evaluation_results in model_evals.items(): n_results = len(evaluation_results.rows) all_idxs = list(range(n_results)) train_idxs = random.sample(all_idxs, k=int(n_results * pct_train)) test_idxs = [idx for idx in all_idxs if idx not in train_idxs] model_train[model] = EvaluationResults( rows=weave.Table([evaluation_results.rows[idx] for idx in train_idxs]) ) model_test[model] = Dataset( rows=weave.Table([evaluation_results.rows[idx] for idx in test_idxs]) ) print( f"Found {len(train_idxs)} train rows and {len(test_idxs)} test rows for {model}." ) ``` ## Train a custom router With the `EvaluationResults` prepared, you can now submit them to Not Diamond to train a custom router. Make sure you have [created an account](https://app.notdiamond.ai/keys) and [generated an API key](https://app.notdiamond.ai/keys), then insert your API key in the following code. The API key authenticates the training request. ![Create an API key](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/api-keys.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=1fd162cba9d876866cf649baa1165bf5) ```python lines theme={"system"} import os from weave.integrations.notdiamond.custom_router import train_router api_key = os.getenv("NOTDIAMOND_API_KEY", "") preference_id = train_router( model_evals=model_train, prompt_column="prompt", response_column="actual", language="en", maximize=True, api_key=api_key, # Leave this commented out to train your first custom router # Uncomment this to retrain your custom router in place # preference_id=preference_id, ) ``` You can then follow the training process for your custom router through the Not Diamond app. ![Check on router training progress](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/router-preferences.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a9bf84f724ddcb3402acc242f4d610d7) Once your custom router has finished training, you can use it to route your prompts. ```python lines theme={"system"} from notdiamond import NotDiamond import weave weave.init("notdiamond-quickstart") llm_configs = [ "anthropic/claude-3-5-sonnet-20240620", "openai/gpt-4o-2024-05-13", "google/gemini-1.5-pro-latest", "openai/gpt-4-turbo-2024-04-09", "anthropic/claude-3-opus-20240229", ] client = NotDiamond(api_key=api_key, llm_configs=llm_configs) new_prompt = ( """ You are a helpful coding assistant. Using the provided function signature, write the implementation for the function in Python. Write only the function. Do not include any other text. from typing import List def has_close_elements(numbers: List[float], threshold: float) -> bool: """ """ Check if in given list of numbers, are any two numbers closer to each other than given threshold. >>> has_close_elements([1.0, 2.0, 3.0], 0.5) False >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3) True """ """ """ ) session_id, routing_target_model = client.model_select( messages=[{"role": "user", "content": new_prompt}], preference_id=preference_id, ) print(f"Session ID: {session_id}") print(f"Target Model: {routing_target_model}") ``` This example also used Not Diamond's compatibility with Weave autotracing. You can see the results in the Weights & Biases UI. ![Weights & Biases UI for custom routing](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/weave-trace.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=b667e5a2ed5658032f94d890bd27de27) ## Evaluate your custom router This section shows how to measure whether the custom router improves on the best individual model. Once you've trained your custom router, you can evaluate its performance in one of the following ways: * In-sample performance by submitting the training prompts. * Out-of-sample performance by submitting new or held-out prompts. In the following example, you submit the test set to the custom router to evaluate its performance. ```python lines theme={"system"} from weave.integrations.notdiamond.custom_router import evaluate_router eval_prompt_column = "prompt" eval_response_column = "actual" best_provider_model, nd_model = evaluate_router( model_datasets=model_test, prompt_column=eval_prompt_column, response_column=eval_response_column, api_key=api_key, preference_id=preference_id, ) python @weave.op() def is_correct(score: int, output: dict) -> dict: # We hack score, since we already have model responses return {"correct": score} best_provider_eval = weave.Evaluation( dataset=best_provider_model.model_results.to_dict(orient="records"), scorers=[is_correct], ) await best_provider_eval.evaluate(best_provider_model) nd_eval = weave.Evaluation( dataset=nd_model.model_results.to_dict(orient="records"), scorers=[is_correct] ) await nd_eval.evaluate(nd_model) ``` In this instance, the Not Diamond "meta-model" routes prompts across several different models. Training the custom router through Weave also runs evaluations and uploads results to the Weights & Biases UI. Once the custom router process completes, you can review the results in the Weights & Biases UI. In the UI, you can see that the Not Diamond "meta-model" outperforms the best-performing model by routing prompts to other models with higher likelihood of answering the prompt accurately. ![Evaluating Not Diamond](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/evaluations.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=80658faaf13331ef07310a78b9b46db6) # Trace and Evaluate a Computer Vision Pipeline with Weave Source: https://docs.coreweave.com/products/wandb/weave/cookbooks/ocr-pipeline Learn how to use trace and evaluate a computer vision pipeline with weave with W&B Weave > [!NOTE] > > This is an interactive notebook. You can run it locally or use the links below: > > * [Open in Google Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/ocr-pipeline.ipynb) > * [View source on GitHub](https://github.com/wandb/examples/blob/main/colabs/weave/ocr-pipeline.ipynb) This tutorial shows you how to build, trace, and evaluate a computer vision pipeline that performs named entity recognition (NER) on images of handwritten patient information. By the end, you'll have a working optical character recognition (OCR) pipeline backed by a vision-language model (VLM) and a W\&B Weave Evaluation that measures how accurately the pipeline extracts structured fields from images. This guide is for developers who want to use Weave to iterate on prompts and systematically measure the quality of multimodal extraction pipelines. The following sections walk through five stages: creating and iterating on prompts, retrieving the dataset, building the NER pipeline, defining scorers, and running an evaluation. ## Prerequisites Before you begin, install and import the required libraries, get your Forge API Key, and initialize your Weave project. Completing this step ensures that your environment can authenticate with Weights & Biases and log traces to your Weave project. ```python lines theme={"system"} # Install the required dependencies !pip install openai weave -q python import json import os from google.colab import userdata from openai import OpenAI import weave python # Get API Keys os.environ["OPENAI_API_KEY"] = userdata.get( "OPENAI_API_KEY" ) # please set the keys as collab environment secrets from the menu on the left os.environ["WANDB_API_KEY"] = userdata.get("WANDB_API_KEY") # Set project name # Replace the PROJECT value with your project name PROJECT = "vlm-handwritten-ner" # Initiatlize the Weave project weave.init(PROJECT) ``` ## Create and iterate on prompts with Weave Good prompt engineering is critical to guiding the model to properly extract entities. In this section, you author an initial prompt, publish it to Weave so you can track changes over time, and then refine it with stricter validation rules. First, create a basic prompt that gives the model the instructions on what to extract from the image data and how to format it. Then, store the prompt in Weave for tracking and iteration. ````python lines theme={"system"} # Create your prompt object with Weave prompt = """ Extract all readable text from this image. Format the extracted entities as a valid JSON. Do not return any extra text, just the JSON. Do not include ```json``` Use the following format: {"Patient Name": "James James","Date": "4/22/2025","Patient ID": "ZZZZZZZ123","Group Number": "3452542525"} """ system_prompt = weave.StringPrompt(prompt) # Publish your prompt to Weave weave.publish(system_prompt, name="NER-prompt") ```` Next, improve the prompt by adding more instructions and validation rules to help reduce errors in the output. Publishing the revised version under the same name lets Weave track the prompt as a new version so you can compare results across iterations. ````python lines theme={"system"} better_prompt = """ You are a precision OCR assistant. Given an image of patient information, extract exactly these fields into a single JSON object (and nothing else): - Patient Name - Date (MM/DD/YYYY) - Patient ID - Group Number Validation rules: 1. Date must match MM/DD/YY; if not, set Date to "". 2. Patient ID must be alphanumeric; if unreadable, set to "". 3. Always zero-pad months and days (e.g. "04/07/25"). 4. Omit any markup, commentary, or code fences. 5. Return strictly valid JSON with only those four keys. Do not return any extra text, just the JSON. Do not include ```json``` Example output: {"Patient Name":"James James","Date":"04/22/25","Patient ID":"ZZZZZZZ123","Group Number":"3452542525"} """ # Edit the prompt system_prompt = weave.StringPrompt(better_prompt) # Publish the edited prompt to Weave weave.publish(system_prompt, name="NER-prompt") ```` ## Get the dataset With a prompt in place, you next need input data to run through the pipeline. Retrieve the dataset of handwritten notes that serves as input for the OCR pipeline. The images in the dataset are already `base64` encoded, which means that the LLM can use the data without any pre-processing. ```python lines theme={"system"} # Retrieve the dataset from the following Weave project dataset = weave.ref( "weave://wandb-smle/vlm-handwritten-ner/object/NER-eval-dataset:G8MEkqWBtvIxPYAY23sXLvqp8JKZ37Cj0PgcG19dGjw" ).get() # Access a specific example in the dataset example_image = dataset.rows[3]["image_base64"] # Display the example_image from IPython.display import HTML, display html = f'' display(HTML(html)) ``` ## Build the NER pipeline Now that you have a prompt and a dataset, build the NER pipeline that connects them to the VLM. The pipeline consists of two functions: * An `encode_image` function that takes a PIL image from the dataset and returns a `base64` encoded string representation of the image that can be passed to the VLM. * An `extract_named_entities_from_image` function that takes an image and system prompt and returns the extracted entities from that image as described by the system prompt. ```python lines theme={"system"} # Traceable function using GPT-4-Vision def extract_named_entities_from_image(image_base64) -> dict: # init LLM Client client = OpenAI() # Setup the instruction prompt # You can optionally use a prompt stored in Weave withweave.ref("weave://wandb-smle/vlm-handwritten-ner/object/NER-prompt:FmCv4xS3RFU21wmNHsIYUFal3cxjtAkegz2ylM25iB8").get().content.strip() prompt = better_prompt response = client.responses.create( model="gpt-4.1", input=[ { "role": "user", "content": [ {"type": "input_text", "text": prompt}, { "type": "input_image", "image_url": image_base64, }, ], } ], ) return response.output_text ``` Now, create a function called `named_entity_recognation` that: * Passes the image data to the NER pipeline. * Returns correctly formatted JSON with the results. Use the [`@weave.op()` decorator](/products/wandb/weave/reference/python-sdk/trace/op) to automatically track and trace function execution in the Weights & Biases UI. Every time `named_entity_recognation` runs, the full trace results are visible in the Weights & Biases UI. To view the traces, navigate to the **Traces** tab of your Weave project. ```python lines theme={"system"} # NER Function for evaluations @weave.op() def named_entity_recognation(image_base64, id): result = {} try: # 1) call the vision op, get back a JSON string output_text = extract_named_entities_from_image(image_base64) # 2) parse JSON exactly once result = json.loads(output_text) print(f"Processed: {str(id)}") except Exception as e: print(f"Failed to process {str(id)}: {e}") return result ``` Finally, run the pipeline over the dataset, and view the results. This step produces the model outputs that you evaluate in the next section. The following code loops over the dataset and stores the results in a local file `processing_results.json`. The results are also viewable in the Weights & Biases UI. ```python lines theme={"system"} # Output results results = [] # loop over all images in the dataset for row in dataset.rows: result = named_entity_recognation(row["image_base64"], str(row["id"])) result["image_id"] = str(row["id"]) results.append(result) # Save all results to a JSON file output_file = "processing_results.json" with open(output_file, "w") as f: json.dump(results, f, indent=2) print(f"Results saved to: {output_file}") ``` You see something similar to the following in the **Traces** table in the Weights & Biases UI. ![Weave Traces table showing NER pipeline execution results.](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/screenshot-2025-05-02-at-120300-pm.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=23dd0552ce814b93b381a87d01d9905d) ## Evaluate the pipeline using Weave Now that you have created a pipeline to perform NER using a VLM, you can use Weave to systematically evaluate it and find out how well it performs. Evaluating the pipeline lets you measure extraction quality across the full dataset rather than relying on spot checks. For more information about Evaluations in Weave, see [Evaluations Overview](/products/wandb/weave/guides/core-types/evaluations). A fundamental part of a Weave Evaluation is the [Scorer](/products/wandb/weave/guides/evaluation/scorers). Scorers evaluate AI outputs and return evaluation metrics. They take the AI's output, analyze it, and return a dictionary of results. Scorers can use your input data as reference if needed and can also output extra information, such as explanations or reasonings from the evaluation. In this section, you create two scorers to evaluate the pipeline: * Programatic scorer. * LLM-as-a-judge scorer. ### Programatic scorer The first Scorer is a deterministic check that runs without an LLM. The programmatic scorer, `check_for_missing_fields_programatically`, takes the model output (the output of the `named_entity_recognition` function), and identifies which `keys` are missing or empty in the results. This check is useful for identifying samples where the model missed capturing any fields. ```python lines theme={"system"} # Add weave.op() to track execution of the scorer @weave.op() def check_for_missing_fields_programatically(model_output): # Required keys for every entry required_fields = {"Patient Name", "Date", "Patient ID", "Group Number"} for key in required_fields: if ( key not in model_output or model_output[key] is None or str(model_output[key]).strip() == "" ): return False # This entry has a missing or empty field return True # All required fields are present and non-empty ``` ### LLM-as-a-judge scorer Because the programmatic scorer only catches missing or empty fields, you need a second scorer to check whether the extracted values match what appears in the image. In this step of the evaluation, you provide both the image data and the model's output to ensure the assessment reflects actual NER performance. The image content is explicitly referenced, not just the model output. The scorer used for this step, `check_for_missing_fields_with_llm`, uses an LLM to perform scoring (specifically OpenAI's `gpt-4o`). As specified by the contents of the `eval_prompt`, `check_for_missing_fields_with_llm` outputs a `Boolean` value. If all fields match the information in the image and formatting is correct, the scorer returns `true`. If any field is missing, empty, incorrect, or mismatched, the result is `false`, and the scorer also returns a message explaining the problem. ```python lines theme={"system"} # The system prompt for the LLM-as-a-judge eval_prompt = """ You are an OCR validation system. Your role is to assess whether the structured text extracted from an image accurately reflects the information in that image. Only validate the structured text and use the image as your source of truth. Expected input text format: {"Patient Name": "First Last", "Date": "04/23/25", "Patient ID": "131313JJH", "Group Number": "35453453"} Evaluation criteria: - All four fields must be present. - No field should be empty or contain placeholder/malformed values. - The "Date" should be in MM/DD/YY format (e.g., "04/07/25") (zero padding the date is allowed) Scoring: - Return: {"Correct": true, "Reason": ""} if **all fields** match the information in the image and formatting is correct. - Return: {"Correct": false, "Reason": "EXPLANATION"} if **any** field is missing, empty, incorrect, or mismatched. Output requirements: - Respond with a valid JSON object only. - "Correct" must be a JSON boolean: true or false (not a string or number). - "Reason" must be a short, specific string indicating all the problem — e.g., "Patient Name mismatch", "Date not zero-padded", or "Missing Group Number". - Do not return any additional explanation or formatting. Your response must be exactly one of the following: {"Correct": true, "Reason": null} OR {"Correct": false, "Reason": "EXPLANATION_HERE"} """ # Add weave.op() to track execution of the Scorer @weave.op() def check_for_missing_fields_with_llm(model_output, image_base64): client = OpenAI() response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "developer", "content": [{"text": eval_prompt, "type": "text"}]}, { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": image_base64, }, }, {"type": "text", "text": str(model_output)}, ], }, ], response_format={"type": "json_object"}, ) response = json.loads(response.choices[0].message.content) return response ``` ## Run the evaluation With both Scorers defined, you can now run the evaluation. Define an evaluation call that automatically loops over the `dataset` passed and logs the results together in the Weights & Biases UI. The following code kicks off the evaluation and applies the two Scorers to every output from the NER pipeline. Results are visible in the **Evals** tab in the Weights & Biases UI. ```python lines theme={"system"} evaluation = weave.Evaluation( dataset=dataset, scorers=[ check_for_missing_fields_with_llm, check_for_missing_fields_programatically, ], name="Evaluate_4.1_NER", ) print(await evaluation.evaluate(named_entity_recognation)) ``` When the previous code runs, Weave generates a link to the Evaluation table in the Weights & Biases UI. Follow the link to view the results and compare different iterations of the pipeline across models, prompts, and datasets of your choice. The Weights & Biases UI automatically creates a visualization like the following for your team. ![Weave Evaluation results comparing scorer outputs across the dataset.](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/screenshot-2025-05-02-at-122615-pm.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=163129741006a4d4d64f83077dc2b6cf) # Quickstart: Set up custom agent observability Source: https://docs.coreweave.com/products/wandb/weave/custom-agents-quickstart Trace a multi-turn agent with the Weave SDK. Conversations, turns, LLM calls, and tool calls render in the Agents view of your project. > [!TIP] > > **This workflow is also available in CoreWeave Agent Lens.** Agent Lens is the Forge experience built for tracing, monitoring, and analyzing AI agents, with automated insights into agent failures and user intents. It uses the same trace data as Weights & Biases Weave, so the traces you already send appear there with nothing to migrate. > [See how to do this in Agent Lens](/products/agent-lens/get-started/custom-agents). [Try in Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/custom-agents-quickstart.ipynb) · [GitHub source](https://github.com/wandb/examples/blob/main/colabs/weave/custom-agents-quickstart.ipynb) The Weave SDK lets you trace agents built with popular SDKs or custom harnesses. This quickstart shows you how to manually integrate Weave into a custom-built multi-turn agent to emit and capture OpenTelemetry spans. For conceptual understanding about Weave for agents, see [Trace your agents](/products/wandb/weave/guides/tracking/trace-agents). If you're looking to integrate Weave with SDKs or harnesses such as the Claude Agent SDK or Codex, see [Choose an agent integration](/products/wandb/weave/agent-integration-quickstart). Weave autopatches into several agent-building SDKs and agent harnesses for quick integration. ## What you'll learn By the end of this quickstart, you'll have a working multi-turn agent that emits Weave-compatible OTel spans. You'll also understand how Weave maps conversations, turns, LLM calls, and tool calls onto your agent code so you can apply the same pattern to your own custom agents. The code in this guide sets up a small research agent that can look things up on Wikipedia. It asks three questions (three turns) and uses the LLM to choose when to search Wikipedia for an answer. Weave records every step (the conversation, each question, each AI response, and each Wikipedia lookup) so you can see what happened in the Weave Agents view. This guide shows you how to: * Initialize Weave for agent tracing with `weave.init()`. * Open a conversation and a turn with `start_conversation` / `startConversation` and `start_turn` / `startTurn`. * Wrap LLM calls with `start_llm` / `startLLM` and record usage. * Wrap tool executions with `start_tool` / `startTool` and record results. * Record complete token usage and a priceable model so token counts and cost render. * View the resulting conversation, turns, and tool calls in the Agents view. ## How the Weave SDK works with agents The Weave SDK includes a generic OTel ingest system for agents, meaning that Weave can capture information from any OTel span in your agent's code. However, Weave requires special handling of the following spans to render your agent's traces in the Agents view of the Weights & Biases UI. | Concept | Python | TypeScript | OTel span | | - | - | - | - | | A conversation | `weave.start_conversation(...)` | `weave.startConversation(...)` | (no span, groups turns) | | One user or agent exchange | `weave.start_turn(...)` | `weave.startTurn(...)` | `invoke_agent` | | One LLM API call | `weave.start_llm(...)` | `weave.startLLM(...)` | `chat` | | One tool execution | `weave.start_tool(...)` | `weave.startTool(...)` | `execute_tool` | In Python, all four functions work as context managers (`with weave.start_*(...) as obj:`). On exit, they end the span and flush attributes, including on exceptions. In TypeScript, call `.end()` on each returned object. Use `try { ... } finally { obj.end(); }` to guarantee cleanup on exceptions. Other [GenAI semantic-convention attributes](https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-agent-spans/), such as `gen_ai.usage.*` and `gen_ai.agent.name`, enable additional rendering, but they're optional. ## Prerequisites * A CoreWeave Forge account and [API key](https://forge.coreweave.com/settings#apikeys). * An OpenAI API key. * Python 3.10+ (for the Python examples). * Node.js 18+ (the TypeScript examples require built-in `fetch`). ## Install packages Install the following packages into your developer environment: ```bash Python theme={"system"} pip install weave openai requests ``` ```bash TypeScript theme={"system"} npm install weave openai ``` ## Initialize Weave `weave.init()` authenticates with Weights & Biases and configures the OTel exporter that sends agent spans to the **Agents** view. If the project doesn't exist on your team, Weave creates it the first time you write to it. ```python lines Python theme={"system"} import getpass import os os.environ["WANDB_API_KEY"] = getpass.getpass("Enter your CoreWeave Forge API key: ") os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ") TEAM = input("Enter your CoreWeave Forge team name: ") PROJECT = input("Enter your Weights & Biases project name: ") import weave weave.init(f"{TEAM}/{PROJECT}") ``` ```typescript lines highlight="4" TypeScript twoslash theme={"system"} // @noErrors // Set WANDB_API_KEY, OPENAI_API_KEY in your environment before running this project import * as weave from 'weave'; await weave.init(`[YOUR-TEAM]/[YOUR-PROJECT]`); ``` ## Define a tool The following code defines the agent's Wikipedia search tool along with an OpenAI tool schema that specifies when and how to use the tool. ```python lines Python theme={"system"} import json import requests def wikipedia_search(query: str) -> str: r = requests.get( "https://en.wikipedia.org/w/api.php", params={ "action": "query", "generator": "search", "gsrsearch": query, "gsrlimit": 1, "prop": "extracts", "exintro": True, "explaintext": True, "format": "json", }, headers={"User-Agent": "weave-demo"}, ).json() return next(iter(r["query"]["pages"].values()))["extract"] wikipedia_tool_schema = { "type": "function", "function": { "name": "wikipedia_search", "description": "Search Wikipedia for a topic and return its intro paragraph.", "parameters": { "type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"], }, }, } ``` ```typescript lines TypeScript twoslash theme={"system"} // @noErrors async function wikipediaSearch(query: string): Promise { const url = new URL('https://en.wikipedia.org/w/api.php'); url.search = new URLSearchParams({ action: 'query', generator: 'search', gsrsearch: query, gsrlimit: '1', prop: 'extracts', exintro: 'true', explaintext: 'true', format: 'json', }).toString(); const res = await fetch(url, { headers: { 'User-Agent': 'weave-demo' } }); const data = (await res.json()) as { query: { pages: Record }; }; return Object.values(data.query.pages)[0].extract; } const wikipediaToolSchema = { type: 'function' as const, function: { name: 'wikipedia_search', description: 'Search Wikipedia for a topic and return its intro paragraph.', parameters: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'], }, }, }; ``` ## Run a traced multi-turn agent With the tool and Weave initialization in place, the next step combines them into a complete agent loop. This loop shows how conversations, turns, LLM calls, and tool calls nest together. The following example runs three turns in a single conversation. Each turn: 1. Opens a `chat` span and lets the LLM choose whether to call the tool. 2. If the LLM requests a tool, opens an `execute_tool` span around the call and feeds the result back to the LLM. 3. Opens a second `chat` span to produce the final answer. ```python lines highlight="10,12,19,38,51,55,69" Python theme={"system"} import weave from openai import OpenAI openai_client = OpenAI() MODEL = "gpt-4o-mini" def run_turn(history, user_message): history.append({"role": "user", "content": user_message}) with weave.start_turn(user_message=user_message, model=MODEL): # LLM call 1: the model might decide to use a tool. with weave.start_llm(model=MODEL, provider_name="openai") as llm: resp = openai_client.chat.completions.create( model=MODEL, messages=history, tools=[wikipedia_tool_schema], ) msg = resp.choices[0].message llm.output(msg.content or "") # record() sets usage, the priced model, and response id in one call. llm.record( usage=weave.Usage( input_tokens=resp.usage.prompt_tokens, output_tokens=resp.usage.completion_tokens, cache_read_input_tokens=getattr( resp.usage.prompt_tokens_details, "cached_tokens", 0 ), ), response_id=resp.id, response_model=resp.model, ) history.append(msg.model_dump(exclude_none=True)) # If no tool was requested, the first LLM response is the answer. if not msg.tool_calls: return msg.content # Execute each requested tool call. for tc in msg.tool_calls: with weave.start_tool( name=tc.function.name, arguments=tc.function.arguments, tool_call_id=tc.id, ) as tool: tool.result = wikipedia_search(**json.loads(tc.function.arguments)) history.append({ "role": "tool", "tool_call_id": tc.id, "content": tool.result, }) # LLM call 2: synthesize the final answer. with weave.start_llm(model=MODEL, provider_name="openai") as llm: resp = openai_client.chat.completions.create(model=MODEL, messages=history) msg = resp.choices[0].message llm.output(msg.content) llm.record( usage=weave.Usage( input_tokens=resp.usage.prompt_tokens, output_tokens=resp.usage.completion_tokens, cache_read_input_tokens=getattr( resp.usage.prompt_tokens_details, "cached_tokens", 0 ), ), response_id=resp.id, response_model=resp.model, ) history.append({"role": "assistant", "content": msg.content}) return msg.content with weave.start_conversation(agent_name="research-bot") as conversation: history = [] for question in [ "Who founded Anthropic?", "What is Claude (the AI assistant)?", "Summarize what we discussed in one sentence.", ]: print(f"USER: {question}") print(f"AGENT: {run_turn(history, question)}\n") ``` ```typescript lines highlight="11,14,25,47,62,70,89" theme={"system"} // @noErrors import * as weave from 'weave'; import OpenAI from 'openai'; const openaiClient = new OpenAI(); const MODEL = 'gpt-4o-mini'; // history is a list of OpenAI chat messages; typed loosely for brevity. async function runTurn(history: any[], userMessage: string): Promise { history.push({ role: 'user', content: userMessage }); const turn = weave.startTurn({ model: MODEL }); try { // LLM call 1: the model might decide to use a tool. const llm1 = weave.startLLM({ model: MODEL, providerName: 'openai' }); let msg; try { const resp = await openaiClient.chat.completions.create({ model: MODEL, messages: history, tools: [wikipediaToolSchema], }); msg = resp.choices[0].message; llm1.output(msg.content ?? ''); // record() sets usage, the priced model, and response id in one call. llm1.record({ usage: { inputTokens: resp.usage?.prompt_tokens, outputTokens: resp.usage?.completion_tokens, cacheReadInputTokens: resp.usage?.prompt_tokens_details?.cached_tokens, }, responseId: resp.id, responseModel: resp.model, }); history.push(msg); } finally { llm1.end(); } // If no tool was requested, the first LLM response is the answer. if (!msg.tool_calls?.length) { return msg.content ?? null; } // Execute each requested tool call. for (const tc of msg.tool_calls) { if (tc.type !== 'function') continue; const tool = weave.startTool({ name: tc.function.name, args: tc.function.arguments, toolCallId: tc.id, }); try { const { query } = JSON.parse(tc.function.arguments); tool.result = await wikipediaSearch(query); history.push({ role: 'tool', tool_call_id: tc.id, content: tool.result }); } finally { tool.end(); } } // LLM call 2: synthesize the final answer. const llm2 = weave.startLLM({ model: MODEL, providerName: 'openai' }); try { const resp = await openaiClient.chat.completions.create({ model: MODEL, messages: history, }); const msg2 = resp.choices[0].message; llm2.output(msg2.content ?? ''); llm2.record({ usage: { inputTokens: resp.usage?.prompt_tokens, outputTokens: resp.usage?.completion_tokens, cacheReadInputTokens: resp.usage?.prompt_tokens_details?.cached_tokens, }, responseId: resp.id, responseModel: resp.model, }); history.push({ role: 'assistant', content: msg2.content }); return msg2.content ?? null; } finally { llm2.end(); } } finally { turn.end(); } } const conversation = weave.startConversation({ agentName: 'research-bot' }); try { const history: any[] = []; for (const question of [ 'Who founded Anthropic?', 'What is Claude (the AI assistant)?', 'Summarize what we discussed in one sentence.', ]) { console.log(`USER: ${question}`); console.log(`AGENT: ${await runTurn(history, question)}\n`); } } finally { conversation.end(); } ``` ## Record token usage and cost Each `chat` span carries token usage and a model id. Weave renders token counts from usage and derives cost from usage plus the model id, so an incomplete or unpriceable value shows `0 in / 0 out` tokens or `Cost -` even when the rest of the trace looks correct. `record(...)` sets these fields (along with `output_messages`, `response_id`, `reasoning`, and more) in one call. Only the fields you pass are applied. Two things must be right for cost to appear: * **Complete usage.** `input_tokens` is the *total* input, including any cached tokens. Weave prices cache reads and cache writes at their own rates and subtracts them from the input total, so `cache_read_input_tokens` and `cache_creation_input_tokens` must be reported *in addition to* a total `input_tokens` that includes them. For providers with prompt caching (for example, Anthropic), cached tokens routinely dominate the input, so omitting them makes usage and cost render as roughly zero. * **A priceable model id.** Cost is a lookup on the model. Weave prefers `response_model` (the exact model the provider served) and falls back to the `model` you passed to `start_llm`. An alias such as `opus` or `sonnet` is not priceable and renders `Cost -`, so pass the concrete id the response returns (`resp.model`) as `response_model`. OpenAI counts cached tokens inside `prompt_tokens`, so the example above maps directly. Anthropic reports cached tokens *separately* from `input_tokens`, so add them back into the total Weave prices against: ```python lines Python theme={"system"} with weave.start_llm(model=MODEL, provider_name="anthropic") as llm: resp = anthropic_client.messages.create( model=MODEL, max_tokens=1024, messages=history, ) u = resp.usage llm.output(resp.content[0].text) llm.record( usage=weave.Usage( input_tokens=u.input_tokens + u.cache_read_input_tokens + u.cache_creation_input_tokens, output_tokens=u.output_tokens, cache_read_input_tokens=u.cache_read_input_tokens, cache_creation_input_tokens=u.cache_creation_input_tokens, ), response_id=resp.id, response_model=resp.model, ) ``` ```typescript lines TypeScript twoslash theme={"system"} // @noErrors const u = resp.usage; llm.record({ usage: { inputTokens: u.input_tokens + u.cache_read_input_tokens + u.cache_creation_input_tokens, outputTokens: u.output_tokens, cacheReadInputTokens: u.cache_read_input_tokens, cacheCreationInputTokens: u.cache_creation_input_tokens, }, responseId: resp.id, responseModel: resp.model, }); ``` ## See your agent traces in the Agents view When `weave.init()` runs, it prints a link to your project where you can see: * A row in the **Agents** tab for `research-bot`. * One conversation containing three turns. * Each turn (`invoke_agent`) with two `chat` spans and an `execute_tool` span nested inside. * Token counts, latency, model, and the full message exchange on each `chat`. Click any turn to inspect the inputs, outputs, tool arguments, and tool results. ## Link to a conversation from your app To deep-link from your own UI to a conversation in the Weave Agents view, build the URL from your entity, project, and the conversation id. `weave.init()` returns a client that carries `entity` and `project`, and `start_conversation` exposes `conversation_id`. ```python lines Python theme={"system"} from weave.trace.urls import agent_conversation_path client = weave.init(f"{TEAM}/{PROJECT}") with weave.start_conversation(agent_name="research-bot") as conversation: # ... run turns ... url = agent_conversation_path( client.entity, client.project, conversation.conversation_id ) print(f"View this conversation at {url}") ``` ```plaintext TypeScript lines theme={"system"} This feature is not available in TypeScript. ``` ## Next steps * Learn how to [trace agents with Weave](/products/wandb/weave/guides/tracking/trace-agents) and what features and options are available in the Weave SDK. * See [Choose an agent integration](/products/wandb/weave/agent-integration-quickstart) for more options about how to integrate Weave with your agents. # Send OpenTelemetry spans to the Agents view Source: https://docs.coreweave.com/products/wandb/weave/guides/tracking/trace-agents-otel Send OTLP trace data from any OpenTelemetry pipeline to the Weave agents endpoint, with no Weave SDK required. > [!TIP] > > **This workflow is also available in CoreWeave Agent Lens.** Agent Lens is the Forge experience built for tracing, monitoring, and analyzing AI agents, with automated insights into agent failures and user intents. It uses the same trace data as Weights & Biases Weave, so the traces you already send appear there with nothing to migrate. > [See how to do this in Agent Lens](/products/agent-lens/get-started/opentelemetry). Weave agent observability is built on [OpenTelemetry (OTel)](https://opentelemetry.io/docs/concepts/) and provides a dedicated OTLP endpoint that ingests spans into the **Agents** view. This means that you can quickly redirect your OTel-instrumented application's spans to Weave by swapping your OTel exporter's current endpoint configuration with Weave's endpoint configuration. You do not need to install the Weave SDK to do this. This page covers how to authenticate with and send spans to the endpoint. ## Authentication You can send spans to the following endpoint: * **Path**: `/agents/otel/v1/traces` * **Method**: `POST` * **Content-Type**: `application/x-protobuf` * **Base URL**: `https://trace.wandb.ai` for Multi-tenant Cloud. The endpoint accepts OTLP protobuf payloads only. Use a protobuf HTTP exporter such as `opentelemetry-exporter-otlp-proto-http` (Python) or `@opentelemetry/exporter-trace-otlp-proto` (TypeScript). The endpoint also accepts `gzip` and `deflate` content encoding. To authenticate with the endpoint, set your [Forge API Key](https://forge.coreweave.com/settings) in your `OTLPSpanExporter` configuration using one of the following values: * `wandb-api-key`: Your API Key as the value. * `Authorization`: HTTP Basic authentication with `api` as the user and your API Key as the password. This form is useful when your exporter or collector only supports standard authorization headers. ## Project routing Weave routes spans to a project using either OTel resource attributes or a request header: * **Resource attributes** (recommended): Set `wandb.entity` to your CoreWeave Forge team or user name and `wandb.project` to the project name on your `TracerProvider` resource. * **`project_id` header**: Set the value to `[YOUR-TEAM]/[YOUR-PROJECT]`. If both are present, the resource attributes take precedence. Spans that arrive with no entity and project are dropped. ## Shape spans for the Agents view Weave accepts any OTel span and stores all of its attributes, but the Agents view renders spans that follow the [OTel GenAI semantic conventions](https://github.com/open-telemetry/semantic-conventions-genai/blob/main/docs/gen-ai/gen-ai-agent-spans.md). Set `gen_ai.operation.name` on each span to tell Weave what the span represents: | `gen_ai.operation.name` | Represents | Rendered as | | - | - | - | | `invoke_agent` | One complete user-agent exchange. | A turn. | | `chat` | One call to a language model API. | An LLM call within a turn. | | `execute_tool` | One tool execution. | A tool call. | Two more attributes control grouping: * `gen_ai.conversation.id`: Groups turns into a conversation. Use a stable ID for the lifetime of the conversation. * `gen_ai.agent.name`: Groups conversations under a named agent in the Agents tab. Other GenAI semantic-convention attributes, such as `gen_ai.request.model`, `gen_ai.usage.input_tokens`, and `gen_ai.usage.output_tokens`, enrich the rendering with model names and token counts but are optional. For the agent data model that these spans map onto, see [Trace your agents](/products/wandb/weave/guides/tracking/trace-agents#the-agent-data-model). ## Configure with environment variables only If your application or collector reads the standard OTel exporter environment variables, you can set the following variables and route spans to Weave without changing any code: ```bash lines theme={"system"} export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://trace.wandb.ai/agents/otel/v1/traces" export OTEL_EXPORTER_OTLP_TRACES_HEADERS="wandb-api-key=$WANDB_API_KEY" export OTEL_RESOURCE_ATTRIBUTES="wandb.entity=[YOUR-TEAM],wandb.project=[YOUR-PROJECT]" ``` ## Example: emit agent spans without the Weave SDK The following example instruments a minimal agent turn using only OTel packages. It emits an `invoke_agent` span for the turn, a `chat` span for the LLM call, and an `execute_tool` span for a tool call, then exports them to the Weave agents endpoint. First, install the required dependencies: ```bash Python theme={"system"} pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http ``` ```bash TypeScript theme={"system"} npm install @opentelemetry/api @opentelemetry/sdk-trace-node @opentelemetry/sdk-trace-base @opentelemetry/resources @opentelemetry/exporter-trace-otlp-proto ``` Then set the `WANDB_API_KEY`, `ENTITY`, and `PROJECT` values in the following code, and then run it: ```python Python lines highlight="8,9,14" theme={"system"} import os from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk import trace as trace_sdk from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace.export import BatchSpanProcessor ENTITY = "[YOUR-TEAM]" PROJECT = "[YOUR-PROJECT]" WEAVE_AGENTS_OTLP_ENDPOINT = "https://trace.wandb.ai/agents/otel/v1/traces" # Create an API key at https://forge.coreweave.com/settings WANDB_API_KEY = [YOUR-WANDB-API-KEY] exporter = OTLPSpanExporter( endpoint=WEAVE_AGENTS_OTLP_ENDPOINT, headers={"wandb-api-key": WANDB_API_KEY}, ) tracer_provider = trace_sdk.TracerProvider(resource=Resource({ "wandb.entity": ENTITY, "wandb.project": PROJECT, })) tracer_provider.add_span_processor(BatchSpanProcessor(exporter)) trace.set_tracer_provider(tracer_provider) tracer = trace.get_tracer("my-agent") CONVERSATION_ID = "conversation-001" # One turn: a user asks a question, the agent calls a tool, then answers. with tracer.start_as_current_span("invoke_agent my-agent") as turn: turn.set_attribute("gen_ai.operation.name", "invoke_agent") turn.set_attribute("gen_ai.agent.name", "my-agent") turn.set_attribute("gen_ai.conversation.id", CONVERSATION_ID) with tracer.start_as_current_span("chat gpt-4o") as llm: llm.set_attribute("gen_ai.operation.name", "chat") llm.set_attribute("gen_ai.conversation.id", CONVERSATION_ID) llm.set_attribute("gen_ai.request.model", "gpt-4o") # Replace with a real LLM call and record its token usage. llm.set_attribute("gen_ai.usage.input_tokens", 100) llm.set_attribute("gen_ai.usage.output_tokens", 20) with tracer.start_as_current_span("execute_tool get_weather") as tool: tool.set_attribute("gen_ai.operation.name", "execute_tool") tool.set_attribute("gen_ai.conversation.id", CONVERSATION_ID) tool.set_attribute("gen_ai.tool.name", "get_weather") # Replace with a real tool execution. tracer_provider.shutdown() # Flush all pending spans before exit. ``` ```typescript TypeScript lines highlight="7,8,13" theme={"system"} import { trace } from "@opentelemetry/api"; import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node"; import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto"; import { Resource } from "@opentelemetry/resources"; const ENTITY = "[YOUR-TEAM]"; const PROJECT = "[YOUR-PROJECT]"; const WEAVE_AGENTS_OTLP_ENDPOINT = "https://trace.wandb.ai/agents/otel/v1/traces"; // Create an API key at https://forge.coreweave.com/settings const WANDB_API_KEY = [YOUR-WANDB-API-KEY]!; const exporter = new OTLPTraceExporter({ url: WEAVE_AGENTS_OTLP_ENDPOINT, headers: { "wandb-api-key": WANDB_API_KEY }, }); const provider = new NodeTracerProvider({ resource: new Resource({ "wandb.entity": ENTITY, "wandb.project": PROJECT, }), spanProcessors: [new BatchSpanProcessor(exporter)], }); provider.register(); const tracer = trace.getTracer("my-agent"); const CONVERSATION_ID = "conversation-001"; // One turn: a user asks a question, the agent calls a tool, then answers. tracer.startActiveSpan("invoke_agent my-agent", (turn) => { turn.setAttribute("gen_ai.operation.name", "invoke_agent"); turn.setAttribute("gen_ai.agent.name", "my-agent"); turn.setAttribute("gen_ai.conversation.id", CONVERSATION_ID); tracer.startActiveSpan("chat gpt-4o", (llm) => { llm.setAttribute("gen_ai.operation.name", "chat"); llm.setAttribute("gen_ai.conversation.id", CONVERSATION_ID); llm.setAttribute("gen_ai.request.model", "gpt-4o"); // Replace with a real LLM call and record its token usage. llm.setAttribute("gen_ai.usage.input_tokens", 100); llm.setAttribute("gen_ai.usage.output_tokens", 20); tracer.startActiveSpan("execute_tool get_weather", (tool) => { tool.setAttribute("gen_ai.operation.name", "execute_tool"); tool.setAttribute("gen_ai.conversation.id", CONVERSATION_ID); tool.setAttribute("gen_ai.tool.name", "get_weather"); // Replace with a real tool execution. tool.end(); }); llm.end(); }); turn.end(); }); await provider.shutdown(); // Flush all pending spans before exit. ``` To add more turns to the same conversation, emit more `invoke_agent` spans with the same `gen_ai.conversation.id`. Each turn is the root span of its own trace, so turns don't need to share a parent span. After your application exports spans, open the **Agents** tab of your Weave project. # Quickstart: Instrument and trace functions Source: https://docs.coreweave.com/products/wandb/weave/quickstart Get started with W&B Weave by adding tracing to your LLM application to debug and monitor model interactions. [Try in Colab](https://colab.research.google.com/github/wandb/examples/blob/main/colabs/weave/quickstart.ipynb) [GitHub source](https://github.com/wandb/examples/blob/main/colabs/weave/quickstart.ipynb) Learn how to track LLM calls with Weave by adding tracing to your code. This quickstart walks you through tracing a request to OpenAI and viewing the results in the Weights & Biases UI. It's for developers who are new to Weave and want to instrument an LLM application for debugging and monitoring. ## What you'll learn This guide shows you how to: * Import and configure Weave in your code. * Use the `weave.op` decorator to track your code. * View traces in the Weights & Biases UI. ## Prerequisites * A [CoreWeave Forge account](https://id.coreweave.com/signup) * Python 3.10+ or Node.js 18+ * Required packages installed: * **Python**: `pip install weave openai` * **TypeScript**: `npm install weave openai` * An [OpenAI API key](https://platform.openai.com/api-keys) set as an environment variable. ## Log a trace to a new project In this section, you instrument a small application so that Weave can record its inputs, outputs, and code. To begin tracking your code and logging traces to Weave: 1. Import the `weave` library into your code. 2. Call `weave.init('your_wb_team/project_name')` in your code to send tracking information to your Forge [team](/products/wandb/platform/app/settings-page/teams) and [project](/products/wandb/platform/hosting/iam/org_team_struct#project). If you don't set a team, Weave sends the traces to your [default team](/products/wandb/platform/app/settings-page/user-settings#default-team). If the specified project doesn't exist in your team, Weave creates it. 3. Add the [`@weave.op()` decorator](/products/wandb/weave/guides/tracking/ops) to functions you want to track. Although Weave automatically tracks calls to supported LLMs, the decorator lets you track the inputs, outputs, and code of specific functions. The decorator uses the following syntax in TypeScript: `weave.op(your_function)`. The following example code sends a request to OpenAI (requires an [OpenAI API key](https://platform.openai.com/docs/quickstart)), and Weave records the request's tracing information. The request asks the OpenAI model to extract dinosaur names from the input and identify each dinosaur's diet (herbivore or carnivore). The following example code tracks your first project with Weave: **Python** ```python lines {1-2,7-8,27-28} theme={"system"} # Imports the Weave library import weave from openai import OpenAI client = OpenAI() # Weave automatically tracks the inputs, outputs and code of this function @weave.op() def extract_dinos(sentence: str) -> dict: response = client.chat.completions.create( model="gpt-4o", messages=[ { "role": "system", "content": """In JSON format extract a list of `dinosaurs`, with their `name`, their `common_name`, and whether its `diet` is a herbivore or carnivore""" }, { "role": "user", "content": sentence } ], response_format={ "type": "json_object" } ) return response.choices[0].message.content # Initializes Weave, and sets the team and project to log data to weave.init('your-team/traces-quickstart') sentence = """I watched as a Tyrannosaurus rex (T. rex) chased after a Triceratops (Trike), \ both carnivore and herbivore locked in an ancient dance. Meanwhile, a gentle giant \ Brachiosaurus (Brachi) calmly munched on treetops, blissfully unaware of the chaos below.""" result = extract_dinos(sentence) print(result) ``` **TypeScript** ```typescript twoslash lines {1-2,7-8,20,24-25} theme={"system"} // @noErrors // Imports the Weave library import * as weave from 'weave'; import OpenAI from 'openai'; const openai = new OpenAI(); // Weave automatically tracks the inputs, outputs and code of this function async function extractDinos(input: string) { const response = await openai.chat.completions.create({ model: 'gpt-4o', messages: [ { role: 'user', content: `In JSON format extract a list of 'dinosaurs', with their 'name', their 'common_name', and whether its 'diet' is a herbivore or carnivore: ${input}`, }, ], }); return response.choices[0].message.content; } const extractDinosOp = weave.op(extractDinos); async function main() { // Initializes Weave, and sets the team and project to log data to await weave.init('your-team/traces-quickstart'); const result = await extractDinosOp( 'I watched as a Tyrannosaurus rex (T. rex) chased after a Triceratops (Trike), both carnivore and herbivore locked in an ancient dance. Meanwhile, a gentle giant Brachiosaurus (Brachi) calmly munched on treetops, blissfully unaware of the chaos below.' ); console.log(result); } main(); ``` When you call the `extract_dinos` function, Weave outputs links in the terminal to view your traces. The output looks like this: ```text theme={"system"} weave: $ pip install weave --upgrade weave: Logged in as Weights & Biases user: example-username. weave: View Weave data at https://wandb.ai/your-team/traces-quickstart/weave weave: 🍩 https://wandb.ai/your-team/traces-quickstart/r/call/019ae171-7f32-7c96-8b42-931a32f900b7 { "dinosaurs": [ { "name": "Tyrannosaurus rex", "common_name": "T. rex", "diet": "carnivore" }, { "name": "Triceratops", "common_name": "Trike", "diet": "herbivore" }, { "name": "Brachiosaurus", "common_name": "Brachi", "diet": "herbivore" } ] } ``` ## See traces of your application in your project Now that your code has produced a trace, you can inspect it in the Weights & Biases UI. Click the link in your terminal or paste it into your browser to open the Weights & Biases UI. In the **Traces** panel of the Weights & Biases UI, click the trace to see its data, such as its input, output, latency, and token usage. ![The trace for the extract\_dinos function in Forge, showing the call tree with cost and latency, and the call's input and output.](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/tutorial_trace_1.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a75c0233212fddd3f500215ca4532035) You have now logged and viewed your first Weave trace. ## Learn more about traces * Learn how to [decorate your functions and retrieve call information](/products/wandb/weave/guides/tracking/tracing). * Try the [Playground](/products/wandb/weave/guides/tools/playground) to test different models on logged traces. * [Explore integrations](/products/wandb/weave/guides/integrations). Weave automatically tracks calls made to OpenAI, Anthropic, and many more LLM libraries. If your LLM library isn't one of the Weave integrations, you can track calls to other LLM libraries or frameworks by wrapping them with `@weave.op()`. ## Next steps [Get started evaluating your app](/products/wandb/weave/tutorial-eval) and then see how to [evaluate a RAG application](/products/wandb/weave/tutorial-rag). # Agent Lens Source: https://docs.coreweave.com/redirects/forge/agent-lens Overview of Agent Lens on CoreWeave # ARIA Source: https://docs.coreweave.com/redirects/forge/aria AI research agent that analyzes experiments, explains results, and builds reports # Infrastructure and Forge billing Source: https://docs.coreweave.com/redirects/forge/billing Choose between CoreWeave Infrastructure billing and Forge billing, and find where each invoice lives # Serverless Inference Source: https://docs.coreweave.com/redirects/forge/inference Open-source foundation models through an OpenAI-compatible API # Notebooks Source: https://docs.coreweave.com/redirects/forge/notebooks Overview of Notebooks on CoreWeave # Platform Source: https://docs.coreweave.com/redirects/forge/platform Forge platform documentation: configuration, security and access, monitoring and usage, deployment options, and Launch # Registry Source: https://docs.coreweave.com/redirects/forge/registry Centralized, versioned hub for models and datasets with lineage and deployment handoff # Sandboxes Source: https://docs.coreweave.com/redirects/forge/sandboxes Isolated compute environments on serverless capacity or your own CKS cluster # Security & Access Source: https://docs.coreweave.com/redirects/forge/security Choose between CoreWeave IAM and Weights & Biases access management, and find the platform security model # Post-Training Source: https://docs.coreweave.com/redirects/forge/training Post-train and fine-tune LLMs with Serverless RL and SFT, and distill specialized models from real traffic # Weights & Biases Source: https://docs.coreweave.com/redirects/forge/wandb W&B Models for experiment tracking, sweeps, artifacts, and reports; W&B Weave for tracing and evaluating LLM apps # Introduction to Automated User Provisioning Source: https://docs.coreweave.com/security/automated-user-provisioning Overview of Automated User Provisioning (AUP) and the CoreWeave user provisioning system This page introduces CoreWeave's user provisioning system: how user and group identities move from their source of truth into CoreWeave IAM (CW IAM) and, if you use SUNK, into your SUNK clusters. Users and groups enter CW IAM through two paths: automated federation from an identity provider (IdP) using Automated User Provisioning (AUP), or manual creation in the Cloud Console. Users can also add SSH public keys to their accounts, which SUNK User Provisioning (SUP) uses to enable SSH access to SUNK clusters. This page focuses on AUP and is intended for organization administrators who manage user access at scale. AUP uses [SCIM (System for Cross-domain Identity Management)](https://scim.cloud/), an open standard that ensures changes to user permissions, additions, or removals made in the IdP appear immediately in CW IAM. This removes the need for manual updates or waiting for user-initiated events like SAML SSO logins, and it supports an efficient, accurate user management workflow. Although SCIM can synchronize in two directions, CoreWeave AUP uses one-way synchronization: the IdP is the source of truth, and data flows only from the IdP to CW IAM. The following diagram shows how all three elements (IdP federation via AUP, manual user and group management, and user SSH keys) connect through CW IAM to your SUNK clusters: ![Diagram showing three provisioning paths into CW IAM: an identity provider through AUP and SCIM, manual user and group management, and user SSH keys. CW IAM then flows through SCIM and SUP to Slurm Cluster A and Slurm Cluster B.](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/aup-sup-flow-diagram.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=793b038388d6b816cbedeab06771281c) User provisioning flow from identity sources through CW IAM to SUNK clusters * **Identity provider (IdP) via AUP**: Federate users and groups from an IdP such as Okta or Microsoft Entra using SCIM. Changes in the IdP propagate automatically to CW IAM. The rest of this page covers AUP in detail. * **Manual user and group management**: Create and manage users and groups directly in the Cloud Console on the [Users](https://console.coreweave.com/organization/users) and [Groups](https://console.coreweave.com/organization/groups) pages. * **User SSH keys**: Users add SSH public keys in their [Settings page](https://console.coreweave.com/account/settings) under Slurm Attributes. SUP uses these keys to enable SSH access to SUNK clusters. ## SUNK user provisioning SUP automatically provisions CW IAM data into your SUNK clusters, whether that data came from an IdP through AUP or was created manually in the Cloud Console. The exception is users you [exempt from SCIM](#exempt-a-user-from-scim), which SUP doesn't provision. For setup procedures, see [Provision users in SUNK](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning). ## How SCIM differs from SAML SSO Because AUP builds on SAML SSO, it helps to understand how the two standards divide responsibilities. SAML SSO lets users sign in securely and supports Just-In-Time (JIT) provisioning, which creates accounts on first sign-in. SCIM requires SAML SSO and goes further by syncing entire directories, including hundreds of users and their group memberships, in real time. Users and groups appear automatically in the Cloud Console without individual invitations or first-time SAML sign-ins. SCIM handles user provisioning and deprovisioning, while SAML handles authentication. ## Users and groups AUP synchronizes two core resource types from your IdP to the Cloud Console: * **Users**: Creates new users, updates profile fields (first name, last name, status), and deactivates users in the Cloud Console when they're deactivated in your IdP. * **Groups**: Syncs group memberships and group definitions for better access control. AUP supports only flat groups. Nested groups (groups whose member lists include other groups) aren't supported and cause provisioning errors. AUP also supports syncing custom attributes defined in the IdP. ### Key use cases The following scenarios show how AUP keeps user state consistent between the IdP and the Cloud Console: * **Provision users**: When you assign a user to the app in the IdP, AUP automatically creates the user in the Cloud Console. * **Update profiles**: When you change attributes, first name, last name, or active status in the IdP, those changes overwrite the matching values in the Cloud Console. Email address changes aren't profile updates. For more information, see [Change a user's email address](#change-a-users-email-address). * **Deactivate users**: When you remove a user from a group assigned to the application in the IdP, AUP deactivates the user in the Cloud Console, so only authorized users retain access. * **Sync groups**: You can sync group memberships for application-specific group management beyond access control. To sync a group, you must explicitly add it to the push list in the IdP. * **Force sync (Okta-specific)**: Okta's force sync feature lets admins manually push updates, which triggers a synchronization of user attributes between Okta and the Cloud Console. This updates user attributes but doesn't activate or deactivate accounts. For more information, see [Okta's guide](https://help.okta.com/oie/en-us/content/topics/apps/apps_app_integration_wizard_scim.htm). ### Change a user's email address AUP updates first name, last name, and active status from the IdP. It doesn't rename an existing user when the email address changes. Don't change a user's email address only in your IdP. SCIM treats an unrecognized email address as a new user and creates a second CoreWeave account. That account has no organization permissions, and the original account remains. If you use SUNK, the new account also receives a new POSIX UID and GID, which breaks SSH access that depends on the original IDs. SAML just-in-time (JIT) provisioning is disabled while AUP is enabled, so a new email address does not create a user at sign-in. To change email addresses or migrate users to a new email domain, [contact CoreWeave Support](/support/contact). Support coordinates the change. For more information, see [Change a user's email address](/security/authn-authz/manage-users#change-a-users-email-address). ## SCIM-managed and exempt users Users provisioned from your IdP through AUP are SCIM-managed: the IdP is the source of truth for their profile fields, group memberships, and active status. When AUP is enabled, the Cloud Console **Users** page shows a **SCIM Managed** column so you can see which users the IdP controls. You can't deactivate a SCIM-managed user from the Cloud Console, even with the `IAM Admin` role. To remove a SCIM-managed user's access, deprovision them in your IdP and let AUP propagate the change, or mark them exempt from SCIM and then [deactivate them](/security/authn-authz/manage-users#deactivate-user-accounts) from the Console. ### Exempt a user from SCIM Marking a user exempt from SCIM removes them from synchronization. The IdP no longer updates the user's attributes (name, group memberships, or status), and you must manage the account manually from the Cloud Console. If you later deactivate or unassign an exempt user in your IdP, their CoreWeave account stays active until you deactivate it in the Console. An exemption doesn't block deletion requests. If your IdP sends a SCIM delete request for the user, as Microsoft Entra does when a user is permanently deleted from the tenant, AUP deletes the CoreWeave account as well. Use an exemption when you need to control an account from the Cloud Console instead of the IdP: for example, to deactivate a SCIM-managed user or to manage a user's group memberships manually. > [!WARNING] > > If your organization uses [SUNK User Provisioning](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning), exempting a user also removes them from the user data that SUP syncs to your SUNK clusters, because SUP reads the SCIM user list and that list excludes exempt users. This can break their SSH access to those clusters. Don't exempt a user who still needs SUNK access. To exempt a user, you need the `IAM Admin` role: 1. In the Cloud Console, go to the [**Users** page](https://console.coreweave.com/organization/users). 2. Click the vertical ellipsis (**More options**) next to the user, then click **Exempt from SCIM**. 3. Review the warning, then click **Yes, exempt user**. The **SCIM Managed** column reflects the change, and you can now manage the user from the Cloud Console. To return an exempt user to IdP control, in the same menu, click **Include in SCIM**, then confirm in the dialog that opens. ## Set up SCIM After you configure SAML SSO, set up SCIM to synchronize users and groups from the IdP to the Cloud Console. The exact procedure depends on your IdP, but the overall flow is the same: 1. **Enable SCIM in the Cloud Console**: Because SCIM controls organization-wide user data, you must explicitly enable it. 2. **Enable SCIM in the IdP**: In your IdP, open the Provisioning section in the application configuration. This is usually next to the Single Sign-On (SSO) section. 3. **Configure the SCIM API base URL**: This URL is usually prefixed with the organization ID in the Cloud Console. 4. **Select synchronization options**: Choose to push new users, push profile updates, and push groups, depending on the level of synchronization you want. 5. **Set up authentication**: Configure a bearer token for secure communication between the IdP and the Cloud Console. 6. **Assign users and groups**: In the IdP, assign users and groups to the SCIM-enabled application to provision them in the Cloud Console. After you complete these steps in your IdP, AUP syncs users and groups assigned to the application into the Cloud Console, and subsequent changes in the IdP propagate automatically. ## Next steps To set up AUP, follow the procedure for your IdP: * [Configure AUP with Okta](/security/automated-user-provisioning/configure-okta) * [Configure AUP with Microsoft Entra](/security/automated-user-provisioning/configure-microsoft-entra) # Configure Automated User Provisioning with Microsoft Entra Source: https://docs.coreweave.com/security/automated-user-provisioning/configure-microsoft-entra Configure CoreWeave Automated User Provisioning with Microsoft Entra Automated User Provisioning (AUP) lets you instantly sync users and groups from your identity provider (IdP) to the Cloud Console, using the SCIM (System for Cross-domain Identity Management) standard. You no longer need to send invites or wait for users to sign in. This guide shows how to set up AUP with Microsoft Entra as the IdP. When you finish, SAML SSO and one-way SCIM are configured, and you can assign Entra users and groups so they sync into CoreWeave IAM. > [!WARNING] > > Don't change a user's email address only in Microsoft Entra. Entra matches users by email or UPN by default, and CoreWeave treats an unrecognized address as a new user instead of a rename. To change email addresses, [contact CoreWeave Support](/support/contact). For more information, see [Change a user's email address](/security/automated-user-provisioning#change-a-users-email-address). ## Prerequisites You need the following access: * Admin access to the CoreWeave Cloud Console. * Admin access to the Microsoft Entra dashboard. ## Create SAML integration Configure SAML SSO first, because AUP relies on it for authentication. 1. Open the Cloud Console and the Microsoft Entra dashboard in separate windows. * In the Cloud Console: Go to the [SAML SSO](https://console.coreweave.com/organization/iam/sso) page and click **Configure SAML**. * In Entra: Open the Microsoft Entra dashboard at [entra.microsoft.com](https://entra.microsoft.com). * Click **Enterprise Apps**, select **+ New Application** in the top bar, and select **Create your own application**. * Choose an appropriate name for your CoreWeave organization and select **Integrate any other application you don't find in the gallery (Non-gallery)**. * When you return to the Enterprise Apps page, select your new application and click **Single sign on** under the **Manage** menu in the left bar. For the next few steps, the Cloud Console displays details for your integration that you copy into Entra. 2. In Entra, select **SAML 2.0** under **Select a single sign-on method**. 3. Under field 1: **Basic SAML Configuration**, click **Edit**. 4. Copy the **ACS URL** from the Cloud Console and paste it into Entra's **Reply URL (Assertion Consumer Service URL)** field. 5. Copy the **Entity ID** from the Cloud Console and paste it into Entra's **Entity ID** field. 6. Under **field 2: Attributes and Claims**, click **Edit**. 7. For each claim under **Additional Claims**, map the following fields to each Azure value by clicking each claim and editing the top **Name** field: | Name | Value | | - | - | | `first_name` | `user.givenname` | | `last_name` | `user.surname` | | `email` | `user.mail` | 8. Under section **3: SAML Certificates**, click **Edit**. On the following menu under **Signing Option**, set this to **Sign SAML Response and Assertion**. Click **Save** to save settings. 9. Return to section **3: SAML Certificates**. Copy the URL from the **App Federation Metadata URL** field into your clipboard. 10. Return to the CoreWeave Cloud Console. Click the **Metadata URL** field and paste the URL you copied from Entra. 11. In the Cloud Console, click **Next** and then click **Deploy SSO**. 12. Return to Entra, and scroll to the end of the SAML configuration page. Click **Test**, and then in the **Test Single Sign on with your \[Enterprise App Name]** dialog click **Test**. Entra prompts you to sign in through your Microsoft account into the CoreWeave Cloud Console. If the test succeeds, you complete sign-in and arrive at the Clusters page. SAML SSO is now configured between Entra and the Cloud Console. Next, configure SCIM so Entra can push users and groups into CoreWeave IAM. ## Configure one-way SCIM Set up one-way SCIM provisioning so the Cloud Console can receive user and group information from Entra: 1. In the Cloud Console, on the [SCIM Configuration](https://console.coreweave.com/organization/iam/scim) page, toggle **Enable SCIM API** and **Enable Automated User Provisioning**. Record the **SCIM Base URL**. You need it later. 2. In the Cloud Console, create a new SCIM API token with a name of up to 20 letters, numbers, and hyphens (for example, `entra-id`). Record the token value. You need it later. 3. In Entra: * On your Enterprise App's left navigation bar, click **Provisioning** (located under **Single Sign On**). * Click **Connect your application** under **Create configuration**. * Copy the **SCIM Base URL** from the Cloud Console and paste this into the **Tenant URL** field in Entra. * Copy the **SCIM Token** from the Cloud Console and paste it into the **Secret token** field in Entra. * Click **Test connection**. If the test succeeds, a green alert appears in the top right corner of your browser window. * Click **Create**. ## Assign users and groups To complete the integration, assign users to a group in your IdP, and then assign the group to your application. Then test the integration by checking whether the users sync to the Cloud Console. 1. In the Cloud Console, go to the [Users](https://console.coreweave.com/organization/users) page to view a list of all users in your organization. 2. Assign users to a group in Entra: * In Entra, click **Users and groups** on your Enterprise App's left menu under **Manage**. * Click **Add user/group** to select the users and groups that should sync with CoreWeave Cloud IAM. 3. In Entra, toggle the **Provisioning Status** to **On** under the **Provisioning** section. (This step is [required when you enable provisioning for the first time](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/configure-automatic-user-provisioning-portal#provisioning-status).) 4. In the Cloud Console, refresh the page showing your **Users** list. The users in the group you just assigned in Entra appear immediately in the Cloud Console. > [!NOTE] > > Users provisioned through AUP are SCIM-managed: Entra controls their profile fields and active status. To deactivate a SCIM-managed user from the Cloud Console rather than from Entra, first mark them [exempt from SCIM](/security/automated-user-provisioning#exempt-a-user-from-scim). ## Map SSH keys for SUNK If you use [SUNK User Provisioning (SUP)](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning), you can sync SSH public keys from Entra to CoreWeave so that users can use SSH to connect to SUNK login nodes. To do this, create a custom extension attribute in Entra and map it to CoreWeave's SCIM endpoint so that keys flow from user profiles into IAM. > [!NOTE] > > If you don't use SUNK, skip this section. ### Create the SSH key extension attribute Entra doesn't include a built-in attribute for SSH keys. You must create a custom extension property on your Enterprise Application's backing application registration. 1. In PowerShell, install the Microsoft Graph module if you haven't already: ```powershell theme={"system"} Install-Module Microsoft.Graph -Scope CurrentUser ``` 2. Connect to Microsoft Graph. This operation requires the `Application.ReadWrite.All` permission: ```powershell theme={"system"} Connect-MgGraph -Scopes "Application.ReadWrite.All" ``` 3. Find the **Object ID** of the application registration that backs your CoreWeave Enterprise Application. In the Entra portal, go to **App registrations** > **All applications**, find your CoreWeave app, and copy the **Object ID** (not the Application ID). 4. Create the extension property. Replace `[APP-OBJECT-ID]` with that object ID: ```powershell theme={"system"} New-MgApplicationExtensionProperty ` -ApplicationId [APP-OBJECT-ID] ` -Name "sunkSshKeys" ` -DataType "String" ` -TargetObjects @("User") ``` Entra generates a prefixed name like `extension_[APP-ID-NO-HYPHENS]_sunkSshKeys`. You reference this prefixed name within Entra (for example, in PowerShell commands and Terraform). CoreWeave's SCIM endpoint only receives the `sunkSshKeys` portion after the namespace mapping, so the prefix doesn't affect provisioning. ### Set the SSH key on a user profile Writing custom extension attributes to user profiles requires the `User.ReadWrite.All` Microsoft Graph permission. The more limited `User.ReadWrite` scope isn't sufficient for custom extension attributes. To set an SSH key on a user profile, replace `[USER-EMAIL]` with the user's email address, replace the extension attribute name with the prefixed name Entra generated, and replace `[SSH-PUBLIC-KEY]` with the full public key string: ```powershell theme={"system"} Update-MgUser -UserId [USER-EMAIL] ` -AdditionalProperties @{ extension_[APP-ID-NO-HYPHENS]_sunkSshKeys = "[SSH-PUBLIC-KEY]" } ``` For example, `[SSH-PUBLIC-KEY]` might look like `ssh-ed25519 AAAAC3Nza...`. ### Add the attribute mapping With the extension property created and populated on user profiles, map it to the CoreWeave SCIM schema so the key syncs. 1. In Entra, go to your CoreWeave Enterprise Application. 2. Under **Manage**, select **Provisioning** > **Attribute Mapping (Preview)**. 3. Select **Provision Microsoft Entra ID Users**. 4. Click **Add New Mapping** and configure the following fields: | Field | Value | | - | - | | Mapping type | Direct | | Source attribute | `extension_[APP-ID-NO-HYPHENS]_sunkSshKeys` | | Target attribute | `urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser:sunkSshKeys` | | Match objects using this attribute | No | | Apply this mapping | Always | 5. Click **OK**, then click **Save** at the top of the attribute mappings page. ### Verify the sync 1. In Entra, trigger a provisioning cycle (or wait for the next automatic cycle). 2. In the Cloud Console, go to **Users**, click the three-dot menu next to the target user, and select **View Details**. 3. Under **Slurm Attributes**, confirm the **SSH Keys** field contains the public key you set in Entra. If the key doesn't appear, check the Entra provisioning logs for errors. For more details about verifying SSH keys and configuring SUP, see [Provision users in SUNK](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning). ## Adjust attribute mappings ### Remove the department attribute The **department** attribute in Microsoft Entra can prevent groups from syncing properly with CoreWeave IAM. Before you sync groups, remove this attribute: 1. Click **Enterprise apps**, and select the app that represents your CoreWeave integration. 2. Under the **Manage** heading on the left menu, select **Provisioning** > **Attribute Mapping (Preview)**. 3. Select **Provision Microsoft Entra ID Users**. 4. Find the **department** attribute, and under **Remote** click **Delete**. 5. Go to the top of the page and click **Save** to save your attribute mapping. This adjustment removes the **department** attribute from the attribute mapping used for syncing with CoreWeave, but doesn't change the attribute inside Entra itself. ## Sync groups Use the following guidance to plan how Entra groups map to CoreWeave IAM groups before you assign them to your Enterprise App. ### Nested groups CoreWeave SCIM doesn't support nested groups. If you assign a parent Entra group whose **Members** list includes references to other groups, provisioning fails for those nested group members. To avoid sync errors, use one of the following approaches: * Assign only flat (leaf) groups to your Enterprise App. Don't assign parent groups that contain subgroups. * Add a [scoping filter](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/define-conditional-rules-for-provisioning-user-accounts) on the group provisioning mapping to exclude parent groups. * Use an Entra [dynamic group](https://learn.microsoft.com/en-us/entra/identity/users/groups-dynamic-membership) to flatten nested memberships into a single flat group before syncing. ### Recommended group sync configuration 1. Configure a regular Entra group for all the users you want to push to CoreWeave. 2. Configure regular Entra groups for all the subgroups that you want to represent in the Cloud Console. 3. For legacy CoreWeave IAM deployments, ensure that your selected Entra groups and subgroups aren't named any of the default user groups, or for every push group with the same name as a default user group create a new user group with the appropriate default policies attached. ### Legacy default user groups Legacy CoreWeave IAM deployments automatically provisioned a set of default user groups with specific policies attached. The policies attached to these groups were necessary for operating CoreWeave services. These legacy default user groups include: * `admin` * `metrics` * `read` * `write` * `billing_viewer` When you sync groups with legacy CoreWeave IAM deployments with SCIM, you must resolve the naming conflict by either avoiding syncing push groups with these names, or for each push group with the same name as a default user group: * Create a new user group in CoreWeave IAM with a new preferred name. * Assign the policies attached to a default user group. For example, for an administration group use the policies attached to the `admin` group. * Delete the default user group before configuring a push group with the same name. # Configure Automated User Provisioning with Okta Source: https://docs.coreweave.com/security/automated-user-provisioning/configure-okta Configure CoreWeave Automated User Provisioning with Okta Automated User Provisioning (AUP) lets you sync users and groups from your identity provider (IdP) to the Cloud Console, using the SCIM (System for Cross-domain Identity Management) standard. You no longer need to send invites or wait for users to sign in. This guide shows how to set up AUP with Okta as the IdP. When you finish, SAML SSO and one-way SCIM are configured, and you can assign Okta users and groups so they sync into CoreWeave IAM. > [!WARNING] > > Don't change a user's email address only in Okta. That change creates a new CoreWeave user instead of renaming the existing one. To change email addresses, [contact CoreWeave Support](/support/contact). For more information, see [Change a user's email address](/security/automated-user-provisioning#change-a-users-email-address). > [!WARNING] > > If you're migrating SUNK users from Authentik or another LDAP directory, follow [Preserve POSIX identities during migration](#preserve-posix-identities-during-migration). Export and populate the existing attributes before you assign users to the CoreWeave application. ## Prerequisites You need the following access: * Admin access to the CoreWeave Cloud Console. * Admin access to the Okta dashboard. For SUNK migrations from Authentik or another LDAP directory, you also need: * A system with `ldapsearch` and network access to the LDAP endpoint. * An LDAP bind account with permission to search the configured LDAP search base. The account must also be able to read the configured POSIX username attribute, `uidNumber`, `gidNumber`, `homeDirectory`, `loginShell`, and `sshPublicKey`. ## Create SAML SSO integration Users created through AUP must use SAML SSO for authentication, so you must [configure SAML SSO first](/security/authn-authz/saml-sso/configure-saml-sso). 1. Open the Cloud Console and the Okta dashboard in separate windows. * In the Cloud Console: Navigate to the [SAML SSO](https://console.coreweave.com/organization/iam/sso) page and click **Configure SAML**. * In Okta: Go to **Applications**, click **Create App Integration**, and select **SAML 2.0**. For the next few steps, the Cloud Console displays details for your integration that you need to copy into Okta. 2. Copy the **ACS URL** from the Cloud Console and paste it into Okta's **Single sign-on URL** field. Leave the checkbox checked (for **Use this for Recipient URL and Destination URL**). 3. Copy the **Entity ID** from the Cloud Console and paste it into Okta's **Audience URI (SP Entity ID)** field. 4. In Okta, within the **SAML Attributes > Sign-on** tab, add the following SAML SSO attributes in the **Attribute Statements** section: | Name | Value | | - | - | | `first_name` | `user.firstName` | | `last_name` | `user.lastName` | | `email` | `user.email` | Click **Next**. 5. For **App Type**, select **This is an internal app we have created**, and click **Finish**. 6. The Okta dashboard displays a page with details for your integration. This time, you copy values from the Okta dashboard and paste them into the **Identity Provider** section in the Cloud Console. In the Okta dashboard, ensure the **Sign-on** tab is selected. Under **Sign-on methods**, under **Metadata details**, expand the **More details** caret to reveal more sign-on details. * Copy the **Sign-on URL**, and then paste the value into the **SSO URL** field in the Cloud Console. * Copy the **Issuer**, and then paste the value into the **Entity ID** field in the Cloud Console. * Copy the **Signing Certificate**, and then paste the value into the **Signing certificate** field in the Cloud Console. 7. In the Cloud Console, click **Next** and then click **Deploy SSO**. ## Configure one-way SCIM Set up one-way SCIM provisioning so the Cloud Console can receive user and group information from Okta. 1. In the Cloud Console, on the [SCIM Configuration](https://console.coreweave.com/organization/iam/scim) page, toggle **Enable SCIM API** and **Enable Automated User Provisioning**. 2. In the Cloud Console, create a new SCIM API token with a name of up to 20 letters, numbers, and hyphens (for example, `okta-id`). 3. In Okta: * On your integration's **General** tab, click **Edit** in the **App Settings** card. * Set **Provisioning** to **SCIM** radio button, and click **Save**. 4. Go to the **Provisioning** tab in Okta: * Click **Edit** in the **SCIM Connection** section. * Set **SCIM Connector base URL** to `https://api.coreweave.com/scim/[ORG-USERID]`. Find your org ID in the ACS URL (from the Cloud Console) `https://console.coreweave.com/accounts/saml/[ORG-USERID]/acs`. * Set **Unique identifier field for users** to `userName`. * For **Supported provisioning actions**: select **Push New Users**, **Push Profile Updates**, and **Push Groups**. Do not enable any import options. * Set **Authentication mode** to **HTTP Header**. * For **Authorization**, paste the bearer token from the Cloud Console. After setup, the **Settings** sidebar populates two new tabs: **To App** and **To Okta**. Because this is a one-way sync, **To Okta** shows **Import Not Available**. 5. In the **To App** tab: * Click **Edit** under **Provisioning to App**. * Enable: **Create Users**, **Update User Attributes**, and **Deactivate Users**. * Do not enable **Sync Password** because SAML SSO handles authentication. * Click **Save**. > [!NOTE] > > The **Deactivate Users** option controls whether deactivation flows from Okta to CoreWeave: when you deprovision a user in Okta, AUP deactivates them in the Cloud Console. To deactivate a SCIM-managed user from the Cloud Console instead, first mark them [exempt from SCIM](/security/automated-user-provisioning#exempt-a-user-from-scim). ## Assign users and groups To complete the integration, assign users to a group in your IdP, and then assign the group to your application. Then test the integration by checking whether the users sync to the Cloud Console. 1. In the Cloud Console, navigate to the [Users](https://console.coreweave.com/organization/users) page to view a list of all users in your organization. 2. Assign users to a group in Okta: * Go to **Directory > Groups** and click the name of a group. * With the **People** tab selected, click **Assign people**. * Click the **+** icon to add individuals to the group, and ensure you include the **Org Admin**. 3. Assign the group to your application in Okta: * Go to **Applications > Applications** and click the name of your application. * On your application's **Assignments** tab, click the **Assign** dropdown, then click **Assign to Groups**. * Find the name of the group, then click **Assign**. * Click **Save and go back**, then click **Done**. * The name of that group appears in the assignments list for your application. 4. In the Cloud Console, refresh the page showing your **Users** list. The users in the group you assigned in Okta appear in the Cloud Console. ## Sync groups The following sections describe how Okta syncs groups to CoreWeave and the options available for managing nested group structures. ### Nested groups CoreWeave SCIM does not support nested groups. If you push a parent Okta group whose member list includes references to other groups, provisioning fails for those nested group members. To avoid sync errors, use one of the following approaches: * Push only flat (leaf) groups. Do not push parent groups that contain sub-groups. * Add a [group membership filter](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-about-group-push.htm) to exclude parent groups from being pushed. * Use an Okta [group rule](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-create-group-rules.htm) to flatten nested memberships into a single flat group before pushing. Okta uses *push groups* that are configured to push group memberships to applications like the Cloud Console, through a feature called [Group Push](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-about-group-push.htm). You can sync groups from Okta to the Cloud Console in two ways: * **Recommended path**: Configure a regular Okta group for all the users you want to push to CoreWeave, along with all regular groups that you want to represent in the Cloud Console. Then configure push groups for any subgroups you want to manage within CoreWeave. Only those subgroups sync with CoreWeave automatically. Removing a user from a subgroup does not remove the user from the "all CoreWeave users" group. * **Manual path**: Do not create an "all CoreWeave users" group. Configure push groups in a one-to-one mapping with every regular group. When you make changes, manually run **force sync** in Okta for each update. ## Map SUNK attributes If you use [SUNK User Provisioning (SUP)](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning), you can sync SSH public keys and POSIX user information from Okta to CoreWeave. This requires creating custom attributes in your Okta user profile and mapping each one to CoreWeave's SCIM endpoint. > [!NOTE] > > If you are not using SUNK, skip this section. ### SUNK attribute reference Create the following custom attributes in your Okta user profile and map each one to the corresponding CoreWeave SCIM attribute. Only `sunkSshKeys` is required for SSH access. The other attributes are optional: map them only if you want to set those values from Okta instead of letting CoreWeave IAM generate them. For how SUNK uses each attribute, see [SUNK SCIM attribute reference](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning#sunk-scim-attribute-reference). The steps in this section use the SSH keys attribute as a worked example. Repeat the same process for each attribute you map. | Display name | Variable name | Data type | CoreWeave SCIM attribute | | - | - | - | - | | SUNK SSH Keys | `sunk_ssh_keys` | Array | `sunkSshKeys` | | SUNK POSIX Username | `sunk_posix_username` | String | `sunkPosixUsername` | | SUNK Preferred Home Directory | `sunk_preferred_home_directory` | String | `sunkPreferredHomeDirectory` | | SUNK POSIX Group ID | `sunk_posix_group_id` | Number | `sunkPosixGroupId` | | SUNK POSIX User ID | `sunk_posix_user_id` | Number | `sunkPosixUserId` | | SUNK Login Shell | `sunk_login_shell` | String | `sunkLoginShell` | ### Add the SUNK attributes to the Okta user profile 1. In the Okta Admin Console, navigate to **Directory** > **Profile Editor**. 2. Click **Okta** in the Filters list, then click **Profile** for **Okta User (default)**. 3. Click **Add Attribute** and configure the fields for the SSH keys attribute: | Field | Value | | - | - | | Data type | Array | | Display name | SUNK SSH Keys | | Variable name | `sunk_ssh_keys` | | Description | SSH public keys for SUNK login | 4. Click **Save**. 5. Repeat the previous two steps for each other attribute you map from the [SUNK attribute reference table](#sunk-attribute-reference), using the **Display name**, **Variable name**, and **Data type** values from that table. ### Set the SSH key on a user profile 1. In the Okta Admin Console, navigate to **Directory** > **People**. 2. Select the target user and click the **Profile** tab. 3. Click **Edit** and enter the user's SSH public key in the **SUNK SSH Keys** field (for example, `ssh-ed25519 AAAAC3Nza...`). 4. Click **Save**. ### Add the attribute mapping 1. In the Okta Admin Console, navigate to **Applications** > **Applications** and select your CoreWeave application. 2. Click the **Provisioning** tab, then select **To App** in the settings list. 3. Scroll to the **Attribute Mappings** section and click **Edit**. 4. Find `sunk_ssh_keys` in the list of Okta user profile attributes. In the target attribute dropdown, select the CoreWeave SCIM attribute `sunkSshKeys`. Okta auto-discovers this attribute from CoreWeave's SCIM schema. The attribute appears under the `urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser` namespace. 5. Repeat the previous step for each other attribute you map from the [SUNK attribute reference table](#sunk-attribute-reference), matching the Okta source attribute (**Variable name**) to the corresponding **CoreWeave SCIM attribute**. 6. Click **Save**. ### Verify the sync 1. In Okta, trigger a manual push for the target user (or wait for the next provisioning cycle). 2. In the Cloud Console, navigate to **Users**, click the three-dot menu next to the target user, and select **View Details**. 3. Under **Slurm Attributes**, confirm the **SSH Keys** field contains the public key you set in Okta. If the key does not appear, check the Okta provisioning logs under **Reports** > **System Log** for errors. For more details about verifying SSH keys and configuring SUP, see [Provision users in SUNK](/products/sunk/manage_sunk/manage_cluster_access/sunk_user_provisioning). ## Preserve POSIX identities during migration For a SUNK migration, use this procedure before the standard provisioning sequence. When you migrate an existing SUNK environment from Authentik or another LDAP directory, preserve each user's numeric UID and GID. File ownership and permissions use these numeric IDs, so allowing CoreWeave IAM to assign new values can prevent users from accessing their existing files. Complete the migration in this order: 1. From a system that can reach your LDAP endpoint, export the existing LDAP attributes as close to the cutover as possible. Set `[LDAP-URI]` to the LDAP endpoint URI and `[LDAP-BIND-DN]` to the bind distinguished name. Set `[LDAP-SEARCH-BASE]` to the search base and `[LDAP-USER-FILTER]` to the user search filter. Set `[LDAP-USERNAME-ATTRIBUTE]` to the attribute configured as the POSIX username in SUNK: ```bash theme={"system"} export LDAP_URI="[LDAP-URI]" export LDAP_BIND_DN="[LDAP-BIND-DN]" export LDAP_SEARCH_BASE="[LDAP-SEARCH-BASE]" export LDAP_USER_FILTER="[LDAP-USER-FILTER]" export LDAP_USERNAME_ATTRIBUTE="[LDAP-USERNAME-ATTRIBUTE]" ldapsearch -x \ -H "${LDAP_URI}" \ -D "${LDAP_BIND_DN}" \ -W \ -b "${LDAP_SEARCH_BASE}" \ "${LDAP_USER_FILTER}" \ "${LDAP_USERNAME_ATTRIBUTE}" \ uidNumber gidNumber homeDirectory loginShell sshPublicKey \ > authentik-sunk-users.ldif ``` `ldapsearch` prompts for the bind password instead of storing it in your shell history. The exported file contains user identity data and SSH public keys, so protect it according to your organization's policies. To find the username attribute, check `userNameAttr` in the existing System Security Services Daemon (SSSD) configuration or `ldap_uidattr` in the existing `nsscache` configuration. Authentik deployments can use `cn`, but the configured attribute can differ. 2. Complete the [SAML SSO integration](#create-saml-sso-integration) and [one-way SCIM configuration](#configure-one-way-scim), but don't assign users or groups to the CoreWeave application yet. 3. In Okta, [create the SUNK attributes](#add-the-sunk-attributes-to-the-okta-user-profile) and [map them to the CoreWeave SCIM attributes](#add-the-attribute-mapping). 4. Before you assign users to the CoreWeave application, populate each Okta user profile with the corresponding exported values: | LDAP attribute | Okta variable | | - | - | | Configured POSIX username attribute | `sunk_posix_username` | | `uidNumber` | `sunk_posix_user_id` | | `gidNumber` | `sunk_posix_group_id` | | `homeDirectory` | `sunk_preferred_home_directory` | | `loginShell` | `sunk_login_shell` | | `sshPublicKey` | `sunk_ssh_keys` | If a user has multiple `sshPublicKey` values, add each key to the `sunk_ssh_keys` array. 5. [Assign the users and groups](#assign-users-and-groups). 6. On the **SCIM Configuration** page in the Cloud Console, confirm that you've enabled **Enable SCIM API**, **Enable automated user provisioning**, and **Enable SUNK user provisioning**. 7. Coordinate with your CoreWeave account team to test the SCIM-backed [`nsscache` configuration](/products/sunk/manage_sunk/manage_cluster_access/nsscache#provision-cluster-access-to-groups-of-users) against the LDAP export. After the comparison succeeds, your account team can update SUNK to use SCIM instead of LDAP. 8. Compare each user's POSIX username, UID, GID, home directory, login shell, and SSH keys with the exported LDAP values. Use the `nsscache` output or SCIM response for the complete comparison. You can verify the POSIX username, UID, GID, and SSH keys on the Cloud Console **Users** page. Also confirm that assigned users and groups appear in the Cloud Console. > [!WARNING] > > Until the exported POSIX attributes and SSH keys match and you've verified user and group synchronization, don't disable or remove Authentik. ## Adjust attribute mappings The following sections describe attribute mapping adjustments you must make so that groups sync correctly, along with the recommended group sync configuration. ### Remove the Department attribute The **Department** attribute in Okta can prevent groups from syncing properly with CoreWeave IAM. Before syncing groups, remove this attribute from the attribute mappings: 1. Navigate to your CoreWeave application in the Okta dashboard. 2. Click the **Provisioning** tab. 3. Locate the **Attribute Mapping** section. 4. Remove the **Department** attribute, and save your changes. This adjustment removes the **Department** attribute from the attribute mapping used for syncing with CoreWeave, but does not change the attribute inside Okta itself. ### Recommended group sync configuration To sync groups correctly between Okta and CoreWeave IAM, follow these steps: 1. Configure a regular Okta group for all the users you want to push to CoreWeave. 2. Configure regular Okta groups for all the subgroups that you want to represent in the Cloud Console. 3. For legacy CoreWeave IAM deployments, ensure that your selected Okta groups and subgroups are not named any of the [default user groups](#legacy-default-user-groups). For every push group with the same name as a default user group, create a new user group with the appropriate default policies attached. 4. Use Group Push to [sync your Okta groups](https://help.okta.com/wf/en-us/content/topics/workflows/access-control/access-control-sync-group.htm) for all except the "all CoreWeave users" group. ### Legacy default user groups Legacy CoreWeave IAM deployments automatically provisioned a set of default user groups with specific policies attached. The attached policies were necessary for operating CoreWeave services. These legacy default user groups included: * `admin` * `metrics` * `read` * `write` * `billing_viewer` When syncing groups with legacy CoreWeave IAM deployments with SCIM, you must resolve the naming conflict by either avoiding syncing push groups with these names, or for each push group with the same name as a default user group: * Create a new user group in CoreWeave IAM with a new preferred name. * Assign the policies attached to a default user group. For example, for an administration group use the policies attached to the `admin` group. * Delete the default user group before configuring a push group with the same name. # Support access management Source: https://docs.coreweave.com/security/support-access-management Control and audit CoreWeave employee access to your CKS environment ## Overview Support Access Management gives your organization visibility and control over when and how CoreWeave employees access your CKS environment for support purposes. This page describes how the feature works, what systems it covers, how approvers in your organization review access requests, and what logs are available for auditing. With Support Access Management enabled, every CoreWeave-initiated access to your environment is: * **Request-based**: CoreWeave employees must submit a Teleport access request before accessing any resource. * **Customer-approved**: Access is granted only after a member of your organization with the `Access Request Approver` role approves the request. * **Time-bound**: Approved access expires automatically after 8 hours. * **Auditable**: CoreWeave logs all sessions and the actions taken within them. ## Included systems CoreWeave employees may request access to different systems within a CKS environment. The following table describes the specific systems and their typical methods of access: | System | Typical method of access | | - | - | | CoreWeave Kubernetes Service (CKS) | `kubectl` CLI | | Physical servers underlying a CKS cluster | SSH | CoreWeave never impersonates specific individuals within your organization. ### Access to CKS clusters When CoreWeave requests access to your CKS cluster, the request specifies the level of access needed. When you review the request, you see the requested role and can deny the request if the permissions are inappropriate. CoreWeave employees may request the following roles: | ClusterRole | Permissions | | - | - | | `teleport-cluster-viewers` | Read-only access to most resources, but no access to `Secret` resources | | `teleport-cluster-super-admins` | Full access to all Kubernetes resources | ### Access to physical servers In some situations, CoreWeave employees may need to access your physical servers through SSH. This lets CoreWeave run low-level networking diagnostics, troubleshoot issues with Kubelets, and more. CoreWeave typically requests login as the `acc` user, which has sudo access. ## Manage access requests When a CoreWeave employee needs to access your environment, your organization receives a notification and reviews the request before CoreWeave grants any access. The following sections describe how CoreWeave delivers notifications and how approvers in your organization respond to each request. ### Receive access request notifications When a CoreWeave employee requests access to a system within your CKS environment, you receive a notification. This notification includes a link to the [Cloud Console](https://console.coreweave.com/access-requests), where you can review the details of the request. These details include the resources and permissions that the CoreWeave employee is requesting access to, and the reason for the request. CoreWeave delivers notifications by email to members of your organization with the [`Access Request Approver`](/security/iam/access-policies/roles) role. Only users with this role can approve or deny access requests. If you enable Support Access Management, CoreWeave requires that you monitor your notification channel at all times to review and approve access requests promptly. New access requests appear in the `Pending` state in the Cloud Console: ![Pending Teleport access request in the Cloud Console](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/access-request-pending.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=6b056de39640fb1ae9d60d373023cb75) ### Approve requests After reviewing an access request, you can approve it in the Console to grant CoreWeave access to your environment. Approved requests display the date and time of approval and identify the person in your organization who approved them: ![Approved Teleport access request in the Cloud Console](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/access-request-approved.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=baa96af47fd3785a1e4679553e50e418) By default, approved access requests remain valid for 8 hours, after which CoreWeave revokes the employee's access and terminates the session. ### Deny requests After reviewing an access request, you can deny it. Denied requests display the date and time of denial and identify the person in your organization who denied them: ![Denied Teleport access request in the Cloud Console](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/access-request-denied.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=3f8431cfdb11cd11605d9cf5ed4a7d9d) When you deny a request, CoreWeave doesn't receive access to your environment until CoreWeave submits a subsequent request and your organization approves it. ### Expired requests After receiving an access request, you have 2 hours to either approve or deny it. Requests that don't receive a response within 2 hours automatically expire and don't grant CoreWeave any access to your environment. If this occurs, CoreWeave informs you that it won't access the requested resource, and may send a new request or attempt to troubleshoot without access to the system. ![Expired Teleport access request in the Cloud Console](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/access-request-expired.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=02f8da3830ed53252e2ddd8942acc345) > [!WARNING] > > Any time between CoreWeave delivering the notification that access has been requested and you approving the request doesn't count as downtime against CoreWeave SLAs. > > If any component involved in the access request and approval flow experiences downtime, and immediate access to your cluster or physical server is required, CoreWeave requests written approval through Slack or email. ## Logs and forwarding CoreWeave can provide three types of logs related to support access activity: | | Teleport audit logs | Kubernetes audit logs | Teleport session logs | | - | - | - | - | | **Contents** | Every access request, approval, and denial | User, resource, and authorization details of all Kubernetes API interactions | Commands executed during approved access periods | | **Delivery** | Forwarded in real time through CoreWeave Telemetry Relay | Available in CoreWeave Grafana, forwarded in real time through Telemetry Relay | Provided on request with a 24-hour turnaround | > [!WARNING] > > CoreWeave makes no commitment to retain Teleport audit logs or Kubernetes audit logs for the purpose of providing them to you at a later date. ### Teleport audit logs Teleport audit logs contain every access request, approval, and denial related to the in-scope resources. CoreWeave can forward Teleport audit logs automatically through [CoreWeave Telemetry Relay](/observability/telemetry-forwarding/relay). CoreWeave labels these audit logs to distinguish them from Kubernetes logs. After forwarding, you fully control audit log management. Because CoreWeave may not be able to resend previously forwarded logs, follow best practices for log retention within your organization. ### Kubernetes audit logs Kubernetes audit logs contain user actions, resource changes, authentication details, and metadata associated with all CKS cluster API interactions. CoreWeave Grafana includes a Kubernetes audit log dashboard to view and query these logs in a tabular format. CoreWeave can also forward Kubernetes audit logs automatically through Telemetry Relay. ### Teleport session logs Teleport session logs contain detailed records of the commands the CoreWeave employee executes during their approved period of access. CoreWeave can provide session logs on request, with a turnaround time of 24 hours. Before providing the logs, CoreWeave verifies that a user with the `Access Request Approver` role initiated or approved any requests for session logs. Session logs remain available for forwarding for 12 months after the start of the session. ## System architecture CoreWeave employees can only access Teleport through the secure corporate access network, using a CoreWeave-monitored device such as a company-issued laptop. When you enable Support Access Management, only users with the `Access Request Approver` role in your organization can approve Teleport requests. The following diagram details the system architecture for Support Access Management: ![Support Access Management architecture diagram](https://mintcdn.com/coreweave-dbfa0e8d/lW-m410I_gVGZZCw/security/_media/sam-architecture-diagram.png?fit=max\&auto=format\&n=lW-m410I_gVGZZCw\&q=85\&s=1535970a028455f716f468b92b615ad7) ## Get started Support Access Management is an opt-in feature. To enable it for your organization, contact [Support](/support). After CoreWeave enables Support Access Management, CoreWeave recommends assigning the [`Access Request Approver`](/security/iam/access-policies/roles) role to multiple members of your organization across different time zones to ensure requests can be approved at any time. Access requests expire after 2 hours without a response. To enable log forwarding for support access activity, [configure Telemetry Relay](/observability/telemetry-forwarding/relay#configure-telemetry-relay). # Compliance programs Source: https://docs.coreweave.com/security/trust-compliance/compliance-programs CoreWeave's alignment with SOC 2, ISO 27001, ISO 27017, and ISO 27018 compliance standards CoreWeave aligns its security and compliance programs with recognized regulatory standards so you can run sensitive and regulated workloads on the CoreWeave Cloud. Our controls, processes, and independent assessments support enterprise due diligence, third-party risk reviews, and formal compliance programs across industries. At our [Compliance Documentation Portal](https://trust.coreweave.com/), you can request and review detailed security and compliance evidence, including policies, control descriptions, and (where available) third-party assessments that map to major frameworks and regulations such as: * SOC 2 * ISO 27001 * ISO 27017 * ISO 27018 # Trust Center Source: https://docs.coreweave.com/security/trust-compliance/trust-center Access the CoreWeave Trust Center for security architecture, privacy, resilience, and compliance information CoreWeave prioritizes privacy, safety, and transparency for AI workloads. Customers retain full ownership of their data, which we process only to operate and secure the platform, with controls designed to support enterprise and regulated use cases. For details, visit the [CoreWeave Trust Center](https://www.coreweave.com/trust), where you'll find: * Security architecture and advisories: How security is built into every layer, plus platform security advisories and the shared responsibility model. * Privacy and data handling: Privacy policies, terms, and how we protect data confidentiality, integrity, and regulatory alignment (including GDPR and CCPA). * Resilience and status: Service status, regions and availability zones, and how we engineer for high availability and fault tolerance. * Compliance and evidence: Overview of certifications, assessments, and how to request audit reports and compliance documentation under NDA. # CKS Workload Federation for AI Object Storage Source: https://docs.coreweave.com/security/tutorials/cks-object-storage-authentication Authenticate CKS workloads to AI Object Storage using OIDC Workload Identity Federation This guide describes how to request access tokens for CoreWeave AI Object Storage operations through federation between CKS clusters (operating as OIDC Providers) and an organization's Object Storage infrastructure. ## Prerequisites * A [CKS cluster](/products/cks/clusters/create) with [OIDC Workload Identity](/products/cks/auth-access/workload-identity/introduction) enabled. * An AI Object Storage bucket. For setup instructions, see [Get started with AI Object Storage](/products/storage/object-storage/get-started-caios). * The roles or granular permissions required by the setup tasks. The automatic and manual guides list both options. ## Authentication methods CKS Workload Federation supports two methods for authenticating to AI Object Storage: * [Automatic](/security/tutorials/cks-object-storage-authentication/automatic) using the Pod Identity Webhook, which is recommended for most use cases. * [Manual](/security/tutorials/cks-object-storage-authentication/manual) by configuring the OIDC Workload Federation manually, which is useful for debugging or when the Pod Identity Webhook isn't available. ## How the three authorization systems relate CoreWeave uses separate authorization systems that apply at different stages of this setup: | System | What it controls | When it applies in this flow | | - | - | - | | [CoreWeave IAM Access Policies](/security/iam/access-policies) | Who can manage the platform and Object Storage control plane (create clusters, edit org policies, create WIF config). The **Object Storage Admin** role doesn't grant S3 data access. | Roles cover broad administrative tasks such as creating the cluster, configuring OIDC Workload Federation, and initially managing organization access policies. | | [Kubeconfig](/products/cks/auth-access/managed-auth/kubeconfig) and Kubernetes RBAC | A kubeconfig is a config file with the cluster server URL and an API key (the same type used for other CoreWeave APIs). No separate kubeconfig permissions are required. [Kubernetes RBAC](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) controls what you can do inside the cluster (for example, creating Pods and service accounts). | You use a kubeconfig to run `kubectl` and create the workload. The API key authenticates you to the cluster, and Kubernetes RBAC authorizes your requests. | | [AI Object Storage org and bucket access policies](/products/storage/object-storage/auth-access/organization-policies/about) | Who can perform Object Storage control-plane and S3 operations. Principals include CoreWeave users and federated OIDC roles such as `role/[ISSUER]:system:serviceaccount:namespace:name`. | An existing organization policy can delegate granular `cwobject:` actions to users. When a Pod uses OIDC, grant its WIF principal `cwobject:CreateAccessKeyOIDC` plus only the S3 actions that the workload needs. | In short: IAM governs your ability to manage the platform and create the cluster. The API key in your kubeconfig (the same type as for other CoreWeave APIs) authenticates you to the cluster, and Kubernetes RBAC governs what you can do inside it. Org and bucket policies govern what each identity (including the Pod's OIDC role) can do with AI Object Storage data. # Automatic authentication with the Pod Identity Webhook Source: https://docs.coreweave.com/security/tutorials/cks-object-storage-authentication/automatic Configure automatic OIDC credential injection for CoreWeave AI Object Storage using the Pod Identity Webhook on CKS This tutorial shows you how to automate CoreWeave Kubernetes Service (CKS) Workload Federation for CoreWeave AI Object Storage by configuring the Pod Identity Webhook. With the webhook in place, your Pods automatically receive the configuration needed to obtain temporary Object Storage credentials through their ServiceAccount. Your workloads can then access buckets without managing long-lived access keys. By the end, you'll have a CKS cluster federated with Object Storage and a sample workload that uses an annotated ServiceAccount to obtain credentials on demand. ## Prerequisites * A [CKS cluster](/products/cks/clusters/create) with [OpenID Connect (OIDC) Workload Identity](/products/cks/auth-access/workload-identity/introduction) enabled. * [`helm`](https://helm.sh/docs/intro/install/) version 3 * [`kubectl`](https://kubernetes.io/docs/reference/kubectl/) installed and configured for your cluster. The following table separates roles that cover the administrative tasks from the narrower permissions used by this tutorial: | Task | Role that covers the task | Granular permissions | | - | - | - | | Create or manage the CKS cluster | **CKS Admin** | After the cluster exists, Kubernetes RBAC controls whether you can install the Helm chart and create the tutorial's Namespace, ServiceAccount, and Pods. | | Create an OIDC Workload Federation configuration if the automatic configuration is missing | **IAM Admin** | CoreWeave IAM Access Policies assign roles rather than individual IAM actions. | | Create and view the Object Storage organization access policy | **Object Storage Admin** | `cwobject:EnsureAccessPolicy` and `cwobject:ListAccessPolicy` granted to your user through an existing organization access policy. Add `cwobject:DeleteAccessPolicy` if you must delete the policy. | | Exchange the ServiceAccount token and run the verification command | No CoreWeave IAM role applies to the federated ServiceAccount. | Grant `cwobject:CreateAccessKeyOIDC` and `s3:ListAllMyBuckets` to the WIF principal in an Object Storage organization access policy, with `resources: ["*"]`. | An Object Storage Admin must create the first organization access policy that delegates granular `cwobject:` permissions. The **Object Storage Admin** role governs the Object Storage control plane; it doesn't grant S3 data access. ## Install the Pod Identity Webhook Install the Pod Identity Webhook to use Object Storage. The following steps install the webhook from [CoreWeave Charts](/products/cks/clusters/coreweave-charts/introduction): 1. Set environment variables for your organization ID and Availability Zone: * Replace `[ORG-ID]` with your organization's ID. You can find your organization ID on the [CoreWeave Console settings page](https://console.coreweave.com/account/settings). * Replace `[AVAILABILITY-ZONE]` with an Availability Zone that supports Object Storage. ```bash theme={"system"} export ORG_ID=[ORG-ID] export REGION=[AVAILABILITY-ZONE] ``` > **Availability Zones that support AI Object Storage** > > **US-CENTRAL** > > * `US-CENTRAL-05A` > * `US-CENTRAL-06A` > * `US-CENTRAL-07A` > * `US-CENTRAL-08A` > * `US-CENTRAL-08B` > > **US-EAST** > > * `US-EAST-01A` > * `US-EAST-02A` > * `US-EAST-03A` > * `US-EAST-04A` > * `US-EAST-04B` > * `US-EAST-06A` > * `US-EAST-08A` > * `US-EAST-13A` > * `US-EAST-14A` > * `US-EAST-15A` > * `US-EAST-17A` > > **US-WEST** > > * `RNO2A` > * `US-WEST-01A` > * `US-WEST-04A` > * `US-WEST-09B` > * `US-WEST-10A` > > **CA-EAST** > > * `CA-EAST-01A` > > **EU-NORTH** > > * `EU-NORTH-05A` > > **EU-SOUTH** > > * `EU-SOUTH-03B` > * `EU-SOUTH-04A` > > Learn more about [Regions and Availability Zones](/platform/regions/about-regions-and-azs). 2. Add the CoreWeave Charts repository and install the Pod Identity Webhook: ```bash theme={"system"} helm repo add coreweave https://charts.core-services.ingress.coreweave.com helm install pod-identity-webhook coreweave/pod-identity-webhook \ --namespace pod-identity-webhook \ --create-namespace \ --wait \ --set config.orgID=$ORG_ID \ --set config.region=$REGION ``` The output resembles the following: ```text theme={"system"} "coreweave" has been added to your repositories NAME: pod-identity-webhook LAST DEPLOYED: Fri Mar 13 20:05:00 2026 NAMESPACE: pod-identity-webhook STATUS: deployed REVISION: 1 DESCRIPTION: Install complete ``` With the `--wait` flag, Helm waits until the release resources are ready. The Pod Identity Webhook can then inject credential configuration into annotated Pods. ## Verify OIDC Workload Federation Before the Pod Identity Webhook can obtain credentials, Object Storage must trust the OIDC tokens your CKS cluster issues. When you create a CKS cluster with OIDC Workload Identity enabled, CoreWeave registers this trust automatically. CoreWeave creates an OIDC configuration for the cluster with the audience `https://coreweave.com/iam`. This audience matches the default audience that the Pod Identity Webhook injects, so you don't need to create another OIDC configuration. 1. In the Cloud Console, retrieve the OIDC Issuer URL for your CKS cluster: * Go to the [Clusters](https://console.coreweave.com/clusters) page. * On the **Clusters** page, click the name of your cluster. A cluster details panel opens on the right. * In the **Cluster access** section, copy the **OIDC Issuer URL**. You need this URL again when you configure access policies. 2. On the [Workload Federation](https://console.coreweave.com/organization/iam/workload-federation/oidc) page, verify that the automatically created OIDC configuration for your cluster exists: * On the **Workload Federation** page, find the row that corresponds to your cluster. The automatically created configuration's description begins with "Auto-created OIDC workload federation config" and contains the cluster name. In the search field, enter the cluster name to filter for matching OIDC configurations. * Confirm that its **Issuer** matches your cluster's OIDC Issuer URL. * Confirm that its **Client ID (Audience)** is `https://coreweave.com/iam`. ### Configure OIDC workload identity federation manually If the automatically created configuration is missing, create an OIDC workload identity federation (WIF) configuration manually: 1. In the Cloud Console, go to the [Create OIDC Configuration](https://console.coreweave.com/organization/iam/workload-federation/oidc/create) page. 2. Enter the following values: * **Configuration name**: A unique name for this configuration * **Issuer URL**: Your cluster's OIDC Issuer URL * **Client ID (Audience)**: `https://coreweave.com/iam` 3. On the **Create OIDC Configuration** page, click **Create**. ### Configure OIDC workload identity federation with a custom audience If a workload needs a custom audience, create an additional OIDC configuration. Set **Issuer URL** to your cluster's OIDC Issuer URL. Set **Client ID (Audience)** to the custom audience. Then annotate the workload's ServiceAccount with `caios.coreweave.com/audience` set to that same custom audience, as described in [Use your ServiceAccount](#use-your-serviceaccount). To change the default audience for every workload that uses the webhook, set the chart's `config.audience` value instead. See the [Pod Identity Webhook chart values](/products/cks/clusters/coreweave-charts/pod-identity-webhook) for details. With the OIDC configuration in place, Object Storage trusts tokens issued by your CKS cluster and can map them to access policies. ## Use your ServiceAccount The Pod Identity Webhook injects the configuration your Pods need to obtain Object Storage credentials. Add one of these annotations to the ServiceAccount that your workload uses: | Audience type | Annotation syntax | | - | - | | Default audience | `caios.coreweave.com/inject: "true"` | | Custom audience | `caios.coreweave.com/audience: custom` (use when you need to match a specific WIF audience) | Create a ServiceAccount with the appropriate annotation, then run your workload with that ServiceAccount. 1. Create the following manifest and save it to a file named `object-storage-sa.yaml`. This example uses the default audience annotation. For a custom audience, adjust the annotation: ```yaml title="object-storage-sa.yaml" highlight={6-7} theme={"system"} apiVersion: v1 kind: ServiceAccount metadata: name: my-object-storage-sa namespace: default annotations: caios.coreweave.com/inject: "true" ``` 2. Apply the manifest to create the ServiceAccount: ```bash theme={"system"} kubectl apply -f object-storage-sa.yaml ``` 3. Verify that the ServiceAccount exists and has the appropriate annotation: ```bash theme={"system"} kubectl get serviceaccounts my-object-storage-sa -o jsonpath='{.metadata.annotations.caios\.coreweave\.com/inject}' true ``` The `true` response confirms that the ServiceAccount has the default audience annotation. ## Grant the ServiceAccount access to Object Storage You must grant the ServiceAccount's federated identity access to Object Storage through an [organization access policy](/products/storage/object-storage/auth-access/organization-policies/about). To construct the WIF principal, use the OIDC Issuer URL you copied earlier and the ServiceAccount name: Replace `[OIDC-ISSUER-URL]` with the OIDC Issuer URL from your cluster's details panel. ```text theme={"system"} role/[OIDC-ISSUER-URL]:system:serviceaccount:default:my-object-storage-sa ``` The verification Pod requires only `cwobject:CreateAccessKeyOIDC` to exchange its OIDC token and `s3:ListAllMyBuckets` to run `aws s3api list-buckets`. Both are global actions and require `resources: ["*"]`. For a production workload, replace `s3:ListAllMyBuckets` with the specific S3 actions and bucket resources that the workload needs. The following example policy grants only the actions required by the verification Pod: ```json theme={"system"} { "policy": { "version": "v1alpha1", "name": "wif-service-account-access", "statements": [ { "name": "allow-s3-access-for-cks-workload", "effect": "Allow", "actions": ["cwobject:CreateAccessKeyOIDC", "s3:ListAllMyBuckets"], "resources": ["*"], "principals": ["role/[OIDC-ISSUER-URL]:system:serviceaccount:default:my-object-storage-sa"] } ] } } ``` Create this policy using the [Cloud Console](https://console.coreweave.com/object-storage/access-policies), the [CoreWeave Terraform Provider](https://registry.terraform.io/providers/coreweave/coreweave/latest/docs/resources/object_storage_organization_access_policy), or the Object Storage API. Before you deploy your workload, replace `s3:ListAllMyBuckets` with its required S3 actions and resources. For examples, see [Organization access policy examples](/products/storage/object-storage/auth-access/organization-policies/examples). After the policy is in place, it authorizes the ServiceAccount's federated identity to call Object Storage. ## Create a workload that uses the ServiceAccount After you configure federation, the ServiceAccount, and an access policy, you can deploy a workload that obtains credentials through the webhook. This example creates a Pod that uses the ServiceAccount you created earlier. 1. Configure the Pod's S3 endpoints: To work with AI Object Storage, configure your Pod's S3 endpoints to use virtual addressing style and set the appropriate endpoint URL. > **Configure S3 endpoints for Pods** > > Because the environment variables handle credential exchange, you only need to configure the S3 endpoint and addressing style in your application. For example, with the AWS CLI: > > ```bash theme={"system"} > aws configure set s3.addressing_style virtual > aws configure set endpoint_url "http://cwlota.com" > ``` > > Alternatively, you can mount this configuration file into the container from a ConfigMap and set the `AWS_CONFIG_FILE` variable to the location of the mounted file. > > ```ini theme={"system"} > [default] > s3 = > addressing_style = virtual > endpoint_url = http://cwlota.com > ``` > > When your workloads run inside a CKS cluster, use the LOTA endpoint (`cwlota.com`) for optimal performance. For more configuration options (Boto3, s3cmd, Multi-Storage Client), see [Attaching endpoints](/products/storage/object-storage/using-object-storage/configure-endpoints#full-configuration-examples). 2. Create the following manifest and save it to a file named `object-storage-pod.yaml`. Make the following adjustments: * Replace `[CONTAINER-IMAGE]` with the container image that you want to use for your workload. * Reference the same ServiceAccount in your Pod so the Pod Identity Webhook can inject credential configuration: ```yaml title="object-storage-pod.yaml" highlight={7, 10} theme={"system"} apiVersion: v1 kind: Pod metadata: name: my-workload namespace: default spec: serviceAccountName: my-object-storage-sa containers: - name: app image: "[CONTAINER-IMAGE]" # Your app uses the injected env or volume to obtain S3 credentials. ``` 3. Apply the manifest to create the workload: ```bash theme={"system"} kubectl apply -f object-storage-pod.yaml ``` Pods that use this ServiceAccount receive the necessary environment or volume configuration to call Object Storage. ## Optional: Verify the webhook injection Before you deploy your real workload, you can confirm that the Pod Identity Webhook injects credential configuration correctly. Create a test Pod that uses the `amazon/aws-cli:2.33.2` image and run an S3 command against Object Storage. 1. Create the following manifest and save it to a file named `test-webhook-pod.yaml`. The test Pod uses the ServiceAccount and lists your buckets: ```yaml title="test-webhook-pod.yaml" theme={"system"} apiVersion: v1 kind: Pod metadata: name: test-webhook namespace: default spec: restartPolicy: Never serviceAccountName: my-object-storage-sa containers: - name: test image: amazon/aws-cli:2.33.2 command: - sh - -c - | aws configure set s3.addressing_style virtual aws configure set endpoint_url http://cwlota.com aws s3api list-buckets ``` 2. Apply the manifest: ```bash theme={"system"} kubectl apply -f test-webhook-pod.yaml ``` 3. Check the Pod logs for the response: ```bash theme={"system"} kubectl logs test-webhook ``` When the webhook injection and your access policies are configured correctly, the logs contain a JSON response that lists your buckets. If you see an `AccessDenied` error, verify the organization policy. It must grant `cwobject:CreateAccessKeyOIDC` and `s3:ListAllMyBuckets` to the correct WIF principal with `resources: ["*"]`. 4. Clean up the test Pod: ```bash theme={"system"} kubectl delete pod test-webhook ``` ## Next steps * To configure OIDC Workload Federation manually or for debugging, see [Manual OIDC token exchange](/security/tutorials/cks-object-storage-authentication/manual). * Learn more about [Workload Identity Federation for Object Storage](/products/storage/object-storage/auth-access/workload-identity-federation/use-oidc-tokens). # Manual OIDC token exchange for Object Storage Source: https://docs.coreweave.com/security/tutorials/cks-object-storage-authentication/manual Manually configure OIDC Workload Identity Federation to authenticate CKS workloads to CoreWeave AI Object Storage This guide describes how to manually configure OpenID Connect (OIDC) Workload Identity Federation between a CoreWeave Kubernetes Service (CKS) cluster and CoreWeave AI Object Storage. This configuration lets CKS workloads authenticate to Object Storage without long-lived static credentials. The resulting Pod receives a projected service account token that it exchanges for temporary S3 credentials at runtime. You can do this automatically with minimal configuration by installing the [Pod Identity Webhook](/security/tutorials/cks-object-storage-authentication/automatic). When you need full control over the token exchange or need to debug it, use this guide. ## Prerequisites Before you begin, make sure you have the following in place. In your CoreWeave organization, you must have: * A deployed [CKS cluster with OIDC Workload Identity enabled](/products/cks/auth-access/workload-identity/introduction). The following table separates roles that cover the administrative tasks from the narrower permissions used by this guide: | Task | Role that covers the task | Granular permissions | | - | - | - | | Create or manage the CKS cluster | **CKS Admin** | After the cluster exists, Kubernetes RBAC controls whether you can create the guide's ServiceAccount and Pods. | | Create the OIDC Workload Federation configuration | **IAM Admin** | CoreWeave IAM Access Policies assign roles rather than individual IAM actions. | | Create and view the Object Storage organization access policy | **Object Storage Admin** | `cwobject:EnsureAccessPolicy` and `cwobject:ListAccessPolicy` granted to your user through an existing organization access policy. Add `cwobject:DeleteAccessPolicy` if you must delete the policy. | | Exchange the ServiceAccount token and run the verification command | No CoreWeave IAM role applies to the federated ServiceAccount. | Grant `cwobject:CreateAccessKeyOIDC` and `s3:ListAllMyBuckets` to the WIF principal in an Object Storage organization access policy, with `resources: ["*"]`. | An Object Storage Admin must create the first organization access policy that delegates granular `cwobject:` permissions. The **Object Storage Admin** role governs the Object Storage control plane; it doesn't grant S3 data access. In your local environment, you must have: * A terminal. This tutorial is written for bash and zsh. * [`kubectl`](https://kubernetes.io/docs/reference/kubectl/) installed and accessible from your terminal path. * An S3 command-line interface (CLI) client installed and accessible from your terminal path. This guide uses the [AWS CLI](https://aws.amazon.com/cli/). If you use another S3 CLI, adapt the commands as needed. ## Configure the CKS OIDC provider Register your CKS cluster as a trusted OIDC identity provider for Object Storage. This lets Pods running in the cluster exchange their projected service account tokens for temporary S3 credentials. 1. Launch your CKS cluster. 2. In the Cloud Console, retrieve the **OIDC Issuer URL** of your CKS cluster: * Go to the [Clusters](https://console.coreweave.com/clusters) page. * Click the name of your cluster. A cluster details panel opens on the right. * In the **Cluster access** section, copy the **OIDC Issuer URL**. 3. Configure OIDC Workload Identity Federation in the Cloud Console using this OIDC Issuer URL. 4. On the [Workload Federation](https://console.coreweave.com/organization/iam/workload-federation/oidc) page, create a new OIDC configuration. * Click **Create OIDC configuration**. The configuration form opens. * Set the configuration name (choose a name that indicates it is for federating CKS tokens with AI Object Storage). * Enter the CKS cluster's OIDC Issuer URL that you copied earlier into the **Issuer URL** field. * Set the **Client ID (Audience)** field to `https://coreweave.com/iam` (recommended) or choose another audience. * Click **Create** to save the configuration. ## Configure `kubectl` and create a Kubernetes ServiceAccount 1. Download a kubeconfig for your CKS cluster using one of the following methods: * **Get a kubeconfig for an existing cluster**: Go to the [Clusters](https://console.coreweave.com/clusters) page. Find the cluster, click the vertical ellipsis next to its name, and then click **Get kubeconfig**. * **Create an API access token and kubeconfig**: Go to the [Tokens](https://console.coreweave.com/tokens) page, and click **Create Token**. Store your token secret securely, set the context by selecting your existing cluster, and then click **Download** to get the kubeconfig. Save the kubeconfig file to your local machine. 2. To let `kubectl` locate the kubeconfig that you downloaded, export an environment variable. Replace `[PATH-TO-KUBECONFIG-FILE]` with the path to the downloaded file: ```bash theme={"system"} export KUBECONFIG=[PATH-TO-KUBECONFIG-FILE] ``` 3. Test that your `kubectl` installation works: ```bash theme={"system"} kubectl config get-contexts kubectl get nodes ``` If the environment variable is set, the downloaded context appears. If the cluster has a ready Node Pool, `kubectl get nodes` also shows its Nodes. 4. Create a Kubernetes ServiceAccount by saving the following data to a file named `test-service-account.yaml`: ```yaml title="test-service-account.yaml" theme={"system"} apiVersion: v1 kind: ServiceAccount metadata: name: test-service-account namespace: default ``` 5. Create the account: ```bash theme={"system"} kubectl apply -f test-service-account.yaml ``` 6. Verify the account: ```bash theme={"system"} kubectl get serviceaccounts ``` If successful, `test-service-account` is visible. ## Grant the service account access to Object Storage You must grant the service account's federated identity access to Object Storage through an organization access policy. Use the OIDC Issuer URL you copied earlier and the service account name to construct the workload identity federation (WIF) principal. Replace `[OIDC-ISSUER-URL]` with the OIDC Issuer URL from your cluster's details panel: ```text theme={"system"} role/[OIDC-ISSUER-URL]:system:serviceaccount:default:test-service-account ``` The verification Pod requires only `cwobject:CreateAccessKeyOIDC` to exchange its OIDC token and `s3:ListAllMyBuckets` to run `aws s3api list-buckets`. Both are global actions and require `resources: ["*"]`. For a production workload, replace `s3:ListAllMyBuckets` with the specific S3 actions and bucket resources that the workload needs. The following example policy grants only the actions required by the verification Pod: ```json theme={"system"} { "policy": { "version": "v1alpha1", "name": "wif-service-account-access", "statements": [ { "name": "allow-s3-access-for-cks-workload", "effect": "Allow", "actions": ["cwobject:CreateAccessKeyOIDC", "s3:ListAllMyBuckets"], "resources": ["*"], "principals": ["role/[OIDC-ISSUER-URL]:system:serviceaccount:default:test-service-account"] } ] } } ``` Create this policy with the Cloud Console, the [CoreWeave Terraform Provider](https://registry.terraform.io/providers/coreweave/coreweave/latest/docs/resources/object_storage_organization_access_policy), or the Object Storage API. Before you deploy your workload, replace `s3:ListAllMyBuckets` with its required S3 actions and resources. For examples, see [Organization access policy examples](/products/storage/object-storage/auth-access/organization-policies/examples). ## Set up the workload With the service account created and granted access, reference it from your Object Storage policies and from your workload Pod. * You can define Object Storage policies that reference a role of the form `[ISSUER]:[SUBJECT]`, where the issuer is discovered through the well-known URL and the subject follows a standard pattern for Kubernetes service accounts, based on namespace and service account name. * You can get the OIDC well-known URL from the Cloud Console. On the **Clusters** page, select your cluster, and then copy the OIDC Issuer URL. When you create Object Storage organization and bucket policies for the service account, use the following principal syntax: | Principal type | Syntax | | - | - | | Principal | `[OIDC-ISSUER-URL]:system:serviceaccount:default:test-service-account` | | Organization policy `"principals"` | `["role/[OIDC-ISSUER-URL]:system:serviceaccount:default:test-service-account"]` | | Bucket policy `"Principal"` | `{"AWS": "arn:aws:iam::[ORG-ID]:role/[OIDC-ISSUER-URL]:system:serviceaccount:default:test-service-account"}` | ## Create the workload Pod Create a Pod manifest that mounts a projected service account token with the correct audience. The Pod uses this token to exchange for temporary Object Storage credentials at runtime. Replace `[ORG-ID]` with your CoreWeave organization ID and replace `[CONTAINER-IMAGE]` with your application's container image: To work with AI Object Storage, configure your Pod's S3 endpoints to use virtual addressing style and set the appropriate endpoint URL. > **Configure S3 endpoints for Pods** > > Because the environment variables handle credential exchange, you only need to configure the S3 endpoint and addressing style in your application. For example, with the AWS CLI: > > ```bash theme={"system"} > aws configure set s3.addressing_style virtual > aws configure set endpoint_url "http://cwlota.com" > ``` > > Alternatively, you can mount this configuration file into the container from a ConfigMap and set the `AWS_CONFIG_FILE` variable to the location of the mounted file. > > ```ini theme={"system"} > [default] > s3 = > addressing_style = virtual > endpoint_url = http://cwlota.com > ``` > > When your workloads run inside a CKS cluster, use the LOTA endpoint (`cwlota.com`) for optimal performance. For more configuration options (Boto3, s3cmd, Multi-Storage Client), see [Attaching endpoints](/products/storage/object-storage/using-object-storage/configure-endpoints#full-configuration-examples). ```yaml title="workload-pod.yaml" theme={"system"} apiVersion: v1 kind: Pod metadata: name: my-workload namespace: default spec: serviceAccountName: test-service-account containers: - name: app image: "[CONTAINER-IMAGE]" env: - name: AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE value: /var/run/secrets/tokens/oidc-token - name: AWS_CONTAINER_CREDENTIALS_FULL_URI value: "https://api.coreweave.com/v1/cwobject/temporary-credentials/oidc/[ORG-ID]" - name: AWS_DEFAULT_REGION value: "US-EAST-04A" volumeMounts: - name: oidc-token mountPath: /var/run/secrets/tokens readOnly: true volumes: - name: oidc-token projected: sources: - serviceAccountToken: path: oidc-token audience: "https://coreweave.com/iam" # Or a custom audience expirationSeconds: 3600 ``` * Apply the manifest: ```bash theme={"system"} kubectl apply -f workload-pod.yaml ``` The Pod mounts the projected token at `/var/run/secrets/tokens/oidc-token`. Supported versions of AWS software development kits (SDKs) and the AWS CLI use two environment variables: `AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE` and `AWS_CONTAINER_CREDENTIALS_FULL_URI`. The software uses these variables to exchange the OIDC token for temporary S3 credentials. Kubernetes rotates the projected OIDC token according to its time to live, and the AWS credential provider refreshes the temporary S3 credentials before they expire. ## Optional: Verify the setup To confirm the projected token exchange works before you deploy your real workload, create a test Pod that uses the `amazon/aws-cli:2.33.2` image: ```yaml title="test-manual-pod.yaml" theme={"system"} apiVersion: v1 kind: Pod metadata: name: test-manual-oidc namespace: default spec: restartPolicy: Never serviceAccountName: test-service-account containers: - name: test image: amazon/aws-cli:2.33.2 command: - sh - -c - | aws configure set s3.addressing_style virtual aws configure set endpoint_url http://cwlota.com aws s3api list-buckets env: - name: AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE value: /var/run/secrets/tokens/oidc-token - name: AWS_CONTAINER_CREDENTIALS_FULL_URI value: "https://api.coreweave.com/v1/cwobject/temporary-credentials/oidc/[ORG-ID]" - name: AWS_DEFAULT_REGION value: "US-EAST-04A" volumeMounts: - name: oidc-token mountPath: /var/run/secrets/tokens readOnly: true volumes: - name: oidc-token projected: sources: - serviceAccountToken: path: oidc-token audience: "https://coreweave.com/iam" # Or a custom audience expirationSeconds: 3600 ``` 1. Apply the test Pod: ```bash theme={"system"} kubectl apply -f test-manual-pod.yaml ``` 2. Check the Pod logs for the response: ```bash theme={"system"} kubectl logs test-manual-oidc ``` When your OIDC configuration and access policies are configured correctly, the logs contain a JSON response that lists your buckets. If you see an `AccessDenied` error, verify the organization policy. It must grant `cwobject:CreateAccessKeyOIDC` and `s3:ListAllMyBuckets` to the correct WIF principal with `resources: ["*"]`. 3. Clean up the test Pod: ```bash theme={"system"} kubectl delete pod test-manual-oidc ``` ## Optional: Validate locally You can also validate the OIDC token exchange from your local machine, outside a Kubernetes Pod. Create a service account token and call the credential endpoint directly. For one-time testing and debugging, this approach isolates the credential exchange from the rest of your workload. You need the following additional tools for local validation: * `curl` for calling the credential endpoint. * `jq` for parsing JSON responses. * [jwt.io](https://www.jwt.io/) (optional) for inspecting OIDC token contents. ### Test that the service account token can authenticate Create a service account token with the same audience as your WIF configuration and exchange it for temporary Object Storage credentials. The following example uses the recommended audience, `https://coreweave.com/iam`. In the command, replace `[ORG-ID]` with your CoreWeave organization ID: ```bash theme={"system"} OIDC_TOKEN=$(kubectl create token -n default test-service-account --audience=https://coreweave.com/iam) printf 'header = "Authorization: %s"\n' "$OIDC_TOKEN" | curl --config - \ "https://api.coreweave.com/v1/cwobject/temporary-credentials/oidc/[ORG-ID]" | jq unset OIDC_TOKEN ``` If authentication succeeds, you see a response similar to the following: ```json theme={"system"} { "AccessKeyId": "CWAKIAEXAMPLE1234567", "SecretAccessKey": "wJalrXUtnFEMIK7MDENGbPxRfiCYEXAMPLEKEY", "Token": "", "Expiration": "2026-03-14T21:44:43Z", "attributes": { "cw-role": "https://oidc.example.coreweave.com/abc123:system:serviceaccount:default:test-service-account" } } ``` ### Test access with the AWS CLI Configure a local AWS CLI profile that uses a credential process to fetch temporary credentials. To use the [CoreWeave Intelligent CLI](https://github.com/coreweave/cwic) (`cwic`) instead of a custom script, see [Share credentials across processes](/products/storage/object-storage/using-object-storage/share-credentials-across-processes#exchange-an-oidc-token). The Kubernetes Pod example on that page uses the same projected token this tutorial sets up. To use a custom script, replace `[CREDENTIAL-SCRIPT-PATH]` with the path to your credential script (for example, `/bin/cw-auth.sh`). The script must obtain a service account token, exchange it at the credential endpoint, and return JSON in the format the AWS CLI expects. For a full walkthrough of writing this script, see [Workload Identity Federation with a credential process](/products/storage/object-storage/using-object-storage/s3-clients/aws#workload-identity-federation-with-a-credential-process). The following commands set the virtual addressing style, the credential process, the region, and the endpoint URL in a new profile called `cw-test`: ```bash theme={"system"} export AWS_CONTAINER_AUTHORIZATION_TOKEN=$(kubectl create token -n default test-service-account --audience=https://coreweave.com/iam) export AWS_CONTAINER_CREDENTIALS_FULL_URI="https://api.coreweave.com/v1/cwobject/temporary-credentials/oidc/[ORG-ID]" aws configure set s3.addressing_style virtual --profile cw-test aws configure set credential_process "[CREDENTIAL-SCRIPT-PATH]" --profile cw-test aws configure set region "US-EAST-04A" --profile cw-test aws configure set endpoint_url "https://cwobject.com" --profile cw-test ``` > [!NOTE] > > Use the primary endpoint (`https://cwobject.com`) for local testing because the LOTA endpoint (`http://cwlota.com`) is accessible only from within CoreWeave clusters. Run an S3 command to verify the credential exchange works: ```bash theme={"system"} aws s3api list-buckets --profile cw-test ``` If the credential exchange succeeds, the command lists the buckets that the federated identity can access. ## Next steps After you validate the setup, consider the following options: * To use automatic authentication when you don't need manual control, see [Automatic authentication with the Pod Identity Webhook](/security/tutorials/cks-object-storage-authentication/automatic). * To review the CKS configuration, see [OIDC Workload Identity for CKS](/products/cks/auth-access/workload-identity/introduction). * Review [Workload Identity Federation for Object Storage](/products/storage/object-storage/auth-access/workload-identity-federation/use-oidc-tokens). # Deploy network policies with CKS Source: https://docs.coreweave.com/security/tutorials/deploying-network-policies Enforce Pod-level network segmentation on CKS clusters. This tutorial demonstrates how to implement basic network policies on CoreWeave Kubernetes Service (CKS) clusters. These policies segment and secure Pod-to-Pod communication. By the end, you have a working default-deny network policy and a targeted allow rule, validated with test Pods. You learn the rationale behind each step, CoreWeave-specific best practices, and how to validate your configuration. This tutorial is for platform engineers and cluster operators who need to enforce Pod-level network segmentation on CKS. ## Prerequisites * **CKS cluster:** You need access to a CKS cluster. CKS clusters use either the Cilium or Calico container network interface (CNI). Cilium enforces network policies with extended Berkeley Packet Filter (eBPF). * **`kubectl` access:** Ensure `kubectl` is installed and configured for your cluster identity and namespace. ### Create or use an existing namespace Namespaces provide logical segmentation and isolation in Kubernetes. They are foundational for multi-tenancy and enforcing network policies scoped to individual teams or workloads. This step ensures your resources don't interfere with others and that network policies apply only within your segment. Replace `[NAMESPACE]` in the following examples with a name relevant to your application. ```bash theme={"system"} kubectl create ns [NAMESPACE] ``` With a namespace ready, the next step is to deploy the Pods that your network policies govern. ## Deploy sample workloads Deploy two Pods and a Service: * `backend`: an NGINX server exposing port `80`, labeled `app: backend`. * `backend` Service: a stable endpoint that sends port `80` traffic to the `backend` Pod. * `frontend`: a BusyBox Pod running `sleep`, labeled `app: frontend`. These two Pods let you demonstrate segmentation: by restricting which Pods can reach `backend`, you exercise least privilege for service access. ```bash theme={"system"} kubectl apply -n [NAMESPACE] -f - < [!NOTE] > > The following code snippets are meant to be run in order. ## Create an artifact Create an artifact with four lines of code: 1. Create a [W\&B run](/products/wandb/runs). 2. Create an artifact object with [`wandb.Artifact`](/products/wandb/ref/python/experiments/artifact). 3. Add one or more files, such as a model file or dataset, to the artifact object with `wandb.Artifact.add_file()`. 4. Log your artifact to Weights & Biases with `wandb.Run.log_artifact()`. For example, the following code snippet shows how to log a file called `dataset.h5` to an artifact called `example_artifact`: ```python theme={"system"} import wandb with wandb.init(project="artifacts-example", job_type="add-dataset") as run: artifact = wandb.Artifact(name="example_artifact", type="dataset") artifact.add_file(local_path="./dataset.h5", name="training_dataset") run.log_artifact(artifact) ``` * The `type` of the artifact affects how it appears in Weights & Biases. If you do not specify a `type`, it defaults to `unspecified`. * Each label of the dropdown represents a different `type` parameter value. In the above code snippet, the artifact's `type` is `dataset`. > [!NOTE] > > See the [track external files](/products/wandb/artifacts/track-external-files) page for information on how to add references to files or directories stored in external object storage, like an Amazon S3 bucket. ## Download an artifact Indicate the artifact you want to mark as input to your run with the [`wandb.Run.use_artifact()`](/products/wandb/ref/python/experiments/run#use_artifact) method. Continuing from the previous code snippet, the following code example shows how to use the artifact called `example_artifact` that was created earlier: ```python theme={"system"} with wandb.init(project="artifacts-example", job_type="add-dataset") as run: artifact = run.use_artifact("training_dataset:latest") # returns a run object using the "my_data" artifact ``` This returns an artifact object. Next, use the returned object to download all contents of the artifact: ```python theme={"system"} datadir = artifact.download() # downloads the full `my_data` artifact to the default directory. ``` > [!NOTE] > > You can pass a custom path into the `root` [parameter](/products/wandb/ref/python/experiments/artifact) to download an artifact to a specific directory. For alternate ways to download artifacts and to see additional parameters, see the guide on [downloading and using artifacts](/products/wandb/artifacts/download-and-use-an-artifact). ## Next steps * Learn how to [version](/products/wandb/artifacts/create-a-new-artifact-version) and [update](/products/wandb/artifacts/update-an-artifact) artifacts. * Learn how to trigger downstream workflows or notify a Slack channel in response to changes to your artifacts with [automations](/products/wandb/automations). * Learn about the [registry](/products/registry), a space that houses trained models. * Explore the [Python SDK](/products/wandb/ref/python/experiments/artifact) and [CLI](/products/wandb/ref/cli/wandb-artifact) reference guides. # Tutorial: Create, track, and use a dataset artifact Source: https://docs.coreweave.com/products/wandb/artifacts/artifacts-walkthrough Create, track, and use a dataset artifact with Weights & Biases. This walkthrough demonstrates how to create, track, and use a dataset artifact. ## 1. Log into Weights & Biases Import the W\&B library and log in to Weights & Biases. You will need to sign up for a free Weights & Biases account if you have not done so already. ```python theme={"system"} import wandb wandb.login() ``` ## 2. Initialize a run Use [`wandb.init()`](/products/wandb/ref/python/functions/init) to initialize a run. This generates a background process to sync and log data. Provide a project name and a job type: ```python theme={"system"} # Create a W&B Run. Here we specify 'dataset' as the job type since this example # shows how to create a dataset artifact. with wandb.init(project="artifacts-example", job_type="upload-dataset") as run: # Your code here ``` ## 3. Create an artifact object Create an artifact object with the [`wandb.Artifact()`](/products/wandb/ref/python/experiments/artifact). Provide a name for the artifact and a description of the file type for the `name` and `type` parameters, respectively. For example, the following code snippet demonstrates how to create an artifact called `‘bicycle-dataset’` with a `‘dataset’` label: ```python theme={"system"} artifact = wandb.Artifact(name="bicycle-dataset", type="dataset") ``` For more information about how to construct an artifact, see [Construct artifacts](/products/wandb/artifacts/construct-an-artifact). ## 4. Add the dataset to the artifact Add a file to the artifact. Common file types include models and datasets. The following example adds a dataset named `dataset.h5` that is saved locally on our machine to the artifact: ```python theme={"system"} # Add a file to the artifact's contents artifact.add_file(local_path="dataset.h5") ``` Replace the filename `dataset.h5` in the previous code snippet with the path to the file you want to add to the artifact. ## 5. Log the dataset Use the W\&B run objects `wandb.Run.log_artifact()` method to both save your artifact version and declare the artifact as an [output of the run](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph). ```python theme={"system"} # Save the artifact version to W&B and mark it # as the output of this run run.log_artifact(artifact) ``` A `'latest'` [alias](/products/wandb/artifacts/create-a-custom-alias) is created by default when you log an artifact. For more information about artifact aliases and versions, see [Create a custom alias](/products/wandb/artifacts/create-a-custom-alias) and [Create new artifact versions](/products/wandb/artifacts/create-a-new-artifact-version), respectively. Putting this together, you script so far should look like this: ```python theme={"system"} import wandb wandb.login() with wandb.init(project="artifacts-example", job_type="upload-dataset") as run: artifact = wandb.Artifact(name="bicycle-dataset", type="dataset") artifact.add_file(local_path="dataset.h5") run.log_artifact(artifact) ``` ## 6. Download and use the artifact The following code example demonstrates the steps you can take to use an artifact you have logged and saved to the Weights & Biases servers. 1. First, initialize a new run object with **`wandb.init()`.** 2. Second, use the run objects [`wandb.Run.use_artifact()`](/products/wandb/ref/python/experiments/run#use_artifact) method to tell Weights & Biases what artifact to use. This returns an artifact object. 3. Third, use the artifacts [`wandb.Artifact.download()`](/products/wandb/ref/python/experiments/artifact#download) method to download the contents of the artifact. ```python theme={"system"} # Create a W&B Run. Here we specify 'training' for 'type' # because we will use this run to track training. with wandb.init(project="artifacts-example", job_type="training") as run: # Query W&B for an artifact and mark it as input to this run artifact = run.use_artifact("bicycle-dataset:latest") # Download the artifact's contents artifact_dir = artifact.download() ``` Alternatively, you can use the Public API (`wandb.Api`) to export (or update data) data already saved in Weights & Biases outside of a Run. See [Track external files](/products/wandb/artifacts/track-external-files) for more information. # Create an artifact Source: https://docs.coreweave.com/products/wandb/artifacts/construct-an-artifact Create and log a W&B Artifact. Learn how to add one or more files or a URI reference to an Artifact. Use the W\&B Python SDK to construct artifacts from [W\&B Runs](/products/wandb/ref/python/experiments/run). You can add [files, directories, URIs, and files from parallel runs to artifacts](#add-files-to-an-artifact). After you add a file to an artifact, save the artifact to the W\&B Server or [your own private server](/products/wandb/platform/hosting/hosting-options/self-managed). Each artifact is associated with a run. For information on how to track external files, such as files stored in Amazon S3, see the [Track external files](/products/wandb/artifacts/track-external-files) page. ## Construct an artifact Construct a [W\&B Artifact](/products/wandb/ref/python/experiments/artifact) in three steps: 1. [Create an artifact Python object with `wandb.Artifact()`](/products/wandb/artifacts/construct-an-artifact#create-an-artifact-python-object-with-wandb-artifact) 2. [Add one or more files to the artifact](/products/wandb/artifacts/construct-an-artifact#add-one-or-more-files-to-the-artifact) 3. [Save your artifact to the W\&B server](/products/wandb/artifacts/construct-an-artifact#save-your-artifact-to-the-w\&b-server) ### Create an artifact Python object with `wandb.Artifact()` Initialize the [`wandb.Artifact()`](/products/wandb/ref/python/experiments/artifact) class to create an artifact object. Specify the following parameters: * **Name**: The name of your artifact. The name should be unique, descriptive, and memorable. * **Type**: The type of artifact. The type should be simple, descriptive, and correspond to a single step of your machine learning pipeline. Common artifact types include `'dataset'` or `'model'`. > [!NOTE] > > Weights & Biases uses the "name" and "type" you provide to create a directed acyclic graph in the W\&B App. See the [Explore and traverse artifact graphs](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph) for more information. Copy and paste the following code snippet to create an artifact object. Replace the `"artifact-name"` and `"artifact-type"` placeholders with your own values: ```python theme={"system"} import wandb # Create an artifact object artifact = wandb.Artifact(name="artifact-name", type="artifact-type") ``` > [!NOTE] > > Artifacts can't share the same name, even if they have different types. For example, you can't create an artifact named `cats` with type `dataset` and another artifact named `cats` with type `model`. You can optionally provide a description, metadata, digest algorithm, and other parameters when you initialize an artifact object. For example, the following code snippet creates an artifact object with a name, type, description, metadata, and digest algorithm: ```python theme={"system"} import wandb # Create an artifact object artifact = wandb.Artifact( name="my-dataset", type="dataset", description="This is my dataset artifact", metadata={"source": "generated", "version": 1}, digest_algorithm="XXH128" ) ``` > [!NOTE] > > MD5 remains the default digest algorithm. With W\&B Python SDK 0.29.0 or later, set `digest_algorithm="XXH128"` to opt in to faster hashing for new artifacts. Existing artifact collections that use MD5 continue to use MD5. SDK versions before 0.29.0 cannot verify artifacts that contain XXH128 entries with `Artifact.verify()`. For more information on available attributes and parameters, see the [`wandb.Artifact`](/products/wandb/ref/python/experiments/artifact) Class definition in the Python SDK Reference Guide. ### Add one or more files to the artifact [Add files, directories, external URI references (such as Amazon S3) and more](/products/wandb/artifacts/construct-an-artifact#add-files-to-an-artifact) to your artifact object. To add a single file, use the artifact object's [`Artifact.add_file()`](/products/wandb/ref/python/experiments/artifact#add_file) method: ```python theme={"system"} artifact.add_file(local_path="path/to/file.txt", name="artifact-name") ``` To add a directory, use the [`Artifact.add_dir()`](/products/wandb/ref/python/experiments/artifact#add_dir) method: ```python theme={"system"} artifact.add_dir(local_path="path/to/directory", name="artifact-name") ``` See the next section, [Add files to an artifact](/products/wandb/artifacts/construct-an-artifact#add-files-to-an-artifact), for more information on how to add different file types to an artifact. ### Save your artifact to the W\&B server Save your artifact to the W\&B server. Use the run object's [`wandb.Run.log_artifact()`](/products/wandb/ref/python/experiments/run#log_artifact) method to save the artifact. ```python theme={"system"} with wandb.init(project="", job_type="") as run: run.log_artifact(artifact) ``` > [!TIP] > > **When to use to use `wandb.Run.log_artifact()` or `Artifact.save()`** > > * Use `wandb.Run.log_artifact()` to create a new artifact and associate it with a specific run. > * Use `Artifact.save()` to update an existing artifact without creating a new run. Putting this all together, the following code snippet demonstrates how to create a dataset artifact, add a file to the artifact, and save the artifact to Weights & Biases: ```python theme={"system"} import wandb artifact = wandb.Artifact(name="artifact-name", type="artifact-type") artifact.add_file(local_path="path/to/file.txt", name="filename") artifact.add_dir(local_path="path/to/directory", name="filename") with wandb.init(project="", job_type="") as run: run.log_artifact(artifact) ``` Each time you log an artifact with the same name and type, Weights & Biases creates a new version of that artifact. For more information, see [Create a new artifact version](/products/wandb/artifacts/create-a-new-artifact-version). > [!WARNING] > > Weights & Biases performs calls `wandb.Run.log_artifact()` asynchronously for performant uploads. This can cause surprising behavior when logging artifacts in a loop. For example: > > ```python theme={"system"} > with wandb.init() as run: > for i in range(10): > a = wandb.Artifact(name = "race", > type="dataset", > metadata={ > "index": i, > }, > ) > # ... add files to artifact a ... > run.log_artifact(a) > ``` > > The artifact version **v0** might not have an index of 0 in its metadata because artifacts may be logged in an arbitrary order. ## Add files to an artifact The following sections demonstrate how to add different types of objects to an artifact. Assume you have a directory with the following structure as you read through the examples: ```text theme={"system"} root-directory | - hello.txt | - images/ | -- | cat.png | -- | dog.png | - checkpoints/ | -- | model.h5 | - models/ | -- | model.h5 ``` ### Add a single file Use [`wandb.Artifact.add_file()`](/products/wandb/ref/python/experiments/artifact#method-artifact-add-file) to add a single local file to an artifact. Provide the local path to the file as the `local_path` parameter: ```python theme={"system"} import wandb # Initialize an artifact object artifact = wandb.Artifact(name="artifact-name", type="artifact-type") # Add a single file artifact.add_file(local_path="path/file.format") ``` For example, suppose you had a file called `'hello.txt'` in your working local directory. ```python theme={"system"} artifact.add_file("hello.txt") ``` The artifact now has the following content: ```text theme={"system"} hello.txt ``` Optionally, pass a different name to the `name` parameter to rename the file within the artifact object itself. Continuing the previous example: ```python theme={"system"} artifact.add_file( local_path="hello.txt", name="new/path/hello_world.txt" ) ``` The artifact is stored as: ```text theme={"system"} new/path/hello_world.txt ``` The following table shows how different API calls produce different artifact contents: | API Call | Resulting artifact | | - | - | | `artifact.new_file('hello.txt')` | `hello.txt` | | `artifact.add_file('model.h5')` | `model.h5` | | `artifact.add_file('checkpoints/model.h5')` | `model.h5` | | `artifact.add_file('model.h5', name='models/mymodel.h5')` | `models/mymodel.h5` | ### Add multiple files Use the [`wandb.Artifact.add_dir()`](/products/wandb/ref/python/experiments/artifact#method-artifact-add-dir) method to add multiple files from a local directory to an artifact. Provide the local path to the directory as the `local_path` parameter. ```python theme={"system"} import wandb # Initialize an artifact object artifact = wandb.Artifact(name="artifact-name", type="artifact-type") # Add a local directory to the artifact artifact.add_dir(local_path="path/file.format", name="optional-prefix") ``` The following table show how different API calls produce different artifact contents: | API Call | Resulting artifact | | - | - | | `artifact.add_dir('images')` | `cat.png``dog.png` | | `artifact.add_dir('images', name='images')` | `images/cat.png``images/dog.png` | ### Add a URI reference Artifacts track checksums and other information for reproducibility if the URI has a scheme that the W\&B library supports. Add an external URI reference to an artifact with the [`wandb.Artifact.add_reference()`](/products/wandb/ref/python/experiments/artifact#method-artifact-add-reference) method. Replace the `'uri'` string with your own URI. Optionally pass the desired path within the artifact for the name parameter. ```python theme={"system"} # Add a URI reference artifact.add_reference(uri="uri", name="optional-name") ``` Artifacts support the following URI schemes: * `http(s)://`: A path to a file accessible over HTTP. The artifact will track checksums in the form of etags and size metadata if the HTTP server supports the `ETag` and `Content-Length` response headers. * `s3://`: A path to an object or object prefix in S3. The artifact will track checksums and versioning information (if the bucket has object versioning enabled) for the referenced objects. Object prefixes are expanded to include the objects under the prefix, up to a maximum of 10,000 objects. * `gs://`: A path to an object or object prefix in GCS. The artifact will track checksums and versioning information (if the bucket has object versioning enabled) for the referenced objects. Object prefixes are expanded to include the objects under the prefix, up to a maximum of 10,000 objects. The following table shows how different API calls produce different artifact contents: | API call | Resulting artifact contents | | - | - | | `artifact.add_reference('s3://my-bucket/model.h5')` | `model.h5` | | `artifact.add_reference('s3://my-bucket/checkpoints/model.h5')` | `model.h5` | | `artifact.add_reference('s3://my-bucket/model.h5', name='models/mymodel.h5')` | `models/mymodel.h5` | | `artifact.add_reference('s3://my-bucket/images')` | `cat.png``dog.png` | | `artifact.add_reference('s3://my-bucket/images', name='images')` | `images/cat.png``images/dog.png` | ### Add files to artifacts from parallel runs For large datasets or distributed training, multiple parallel runs might need to contribute to a single artifact. ```python theme={"system"} import wandb import time # This example uses Ray to runs in parallel # for demonstration purposes. import ray ray.init() artifact_type = "dataset" artifact_name = "parallel-artifact" table_name = "distributed_table" parts_path = "parts" num_parallel = 5 # Each batch of parallel writers should have its own # unique group name. group_name = "writer-group-{}".format(round(time.time())) @ray.remote def train(i): """ Our writer job. Each writer will add one image to the artifact. """ with wandb.init(group=group_name) as run: artifact = wandb.Artifact(name=artifact_name, type=artifact_type) # Add data to a wandb table. table = wandb.Table(columns=["a", "b", "c"], data=[[i, i * 2, 2**i]]) # Add the table to folder in the artifact artifact.add(table, "{}/table_{}".format(parts_path, i)) # Upserting the artifact creates or appends data to the artifact run.upsert_artifact(artifact) # Launch your runs in parallel result_ids = [train.remote(i) for i in range(num_parallel)] # Join on all the writers to make sure their files have # been added before finishing the artifact. ray.get(result_ids) # Once all the writers are finished, finish the artifact # to mark it ready. with wandb.init(group=group_name) as run: artifact = wandb.Artifact(artifact_name, type=artifact_type) # Create a "PartitionTable" pointing to the folder of tables # and add it to the artifact. artifact.add(wandb.data_types.PartitionedTable(parts_path), table_name) # Finish artifact finalizes the artifact, disallowing future "upserts" # to this version. run.finish_artifact(artifact) ``` ## Find path for logged artifacts and other metadata The following code snippet shows how to use the [W\&B Public API](/products/wandb/ref/python/public-api) to list the files in a run, including their names and URLs. Replace the `` placeholder with your own values: ```python theme={"system"} from wandb.apis.public.files import Files from wandb.apis.public.api import Api # Example run object run = Api().run("") # Create a Files object to iterate over files in the run files = Files(api.client, run) # Iterate over files for file in files: print(f"File Name: {file.name}") print(f"File URL: {file.url}") print(f"Path to file in the bucket: {file.direct_url}") ``` See the [File](/products/wandb/ref/python/public-api/file) Class for more information on available attributes and methods. # Create an artifact alias Source: https://docs.coreweave.com/products/wandb/artifacts/create-a-custom-alias Create and manage custom aliases to reference specific W&B artifact versions by meaningful names like best or production. Use aliases as pointers to specific versions. By default, `wandb.Run.log_artifact()` adds the `latest` alias to the logged version. Weights & Biases creates an artifact version `v0` and attaches it to your artifact when you log that artifact for the first time. Weights & Biases checksums the contents when you log again to the same artifact. If the artifact changed, Weights & Biases saves a new version `v1`. For example, if you want your training script to pull the most recent version of a dataset, specify `latest` when you use that artifact. The following code example demonstrates how to download a recent dataset artifact named `bike-dataset` that has an alias, `latest`: ```python theme={"system"} import wandb with wandb.init(project="") as run: artifact = run.use_artifact("bike-dataset:latest") artifact.download() ``` You can also apply a custom alias to an artifact version. For example, if you want to mark that model checkpoint is the best on the metric AP-50, you could add the string `'best-ap50'` as an alias when you log the model artifact. ```python theme={"system"} with wandb.init(project="") as run: artifact = wandb.Artifact("run-3nq3ctyy-bike-model", type="model") artifact.add_file("model.h5") run.log_artifact(artifact, aliases=["latest", "best-ap50"]) ``` # Create an artifact version Source: https://docs.coreweave.com/products/wandb/artifacts/create-a-new-artifact-version Create a new artifact version from a single run or from a distributed process. Create a new artifact version with a single [run](/products/wandb/runs) or collaboratively with distributed runs. You can optionally create a new artifact version from a previous version known as an [incremental artifact](#create-a-new-artifact-version-from-an-existing-version). > [!NOTE] > > We recommend that you create an incremental artifact when you need to apply changes to a subset of files in an artifact, where the size of the original artifact is significantly larger. ## Create new artifact versions from scratch There are two ways to create a new artifact version: from a single run and from distributed runs. They are defined as follows: * **Single run**: A single run provides all the data for a new version. This is the most common case and is best suited when the run fully recreates the needed data. For example: outputting saved models or model predictions in a table for analysis. * **Distributed runs**: A set of runs collectively provides all the data for a new version. This is best suited for distributed jobs which have multiple runs generating data, often in parallel. For example: evaluating a model in a distributed manner, and outputting the predictions. Weights & Biases will create a new artifact and assign it a `v0` alias if you pass a name to the `wandb.Artifact` API that does not exist in your project. Weights & Biases checksums the contents when you log again to the same artifact. If the artifact changed, Weights & Biases saves a new version `v1`. Weights & Biases will retrieve an existing artifact if you pass a name and artifact type to the `wandb.Artifact` API that matches an existing artifact in your project. The retrieved artifact will have a version greater than 1. ![Artifact workflow comparison](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/single_distributed_artifacts.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=282def1033e091eccfb804f02d7764e1) ### Single run Log a new version of an Artifact with a single run that produces all the files in the artifact. This case occurs when a single run produces all the files in the artifact. Based on your use case, select one of the tabs below to create a new artifact version: > [!TIP] > > Use `wandb.Run.log_artifact()` to explicitly mark an artifact as an output of a run. > > Use `Artifact.save()` as a convenience method. If a run is active, Weights & Biases logs the artifact to that run. Otherwise, Weights & Biases creates an automatic run and logs it there. **Track as run output** Use `wandb.Run.log_artifact()` to explicitly associate the artifact with a run: 1. Create a run with `wandb.init()`. 2. Create a new artifact or retrieve an existing one with `wandb.Artifact`. 3. Add files to the artifact with `wandb.Artifact.add_file()`. 4. Log the artifact to the run with `wandb.Run.log_artifact()`. ```python theme={"system"} with wandb.init() as run: artifact = wandb.Artifact("artifact_name", "artifact_type") # Add Files and Assets to the artifact using # `.add`, `.add_file`, `.add_dir`, and `.add_reference` artifact.add_file("image1.png") run.log_artifact(artifact) ``` **Save directly** Use `wandb.Artifact.save()` as a convenience method to persist the artifact from the current context: 1. Create a new artifact or retrieve an existing one with `wandb.Artifact`. 2. Add files to the artifact with `wandb.Artifact.add_file()`. 3. Save the artifact with `wandb.Artifact.save()`. ```python theme={"system"} artifact = wandb.Artifact("artifact_name", "artifact_type") # Add Files and Assets to the artifact using # `.add`, `.add_file`, `.add_dir`, and `.add_reference` artifact.add_file("image1.png") artifact.save() ``` ### Distributed runs Allow a collection of runs to collaborate on a version before committing it. This is in contrast to single run mode described above where one run provides all the data for a new version. > [!NOTE] > > 1. Each run in the collection needs to be aware of the same unique ID (called `distributed_id`) in order to collaborate on the same version. By default, if present, Weights & Biases uses the run's `group` as set by `wandb.init(group=GROUP)` as the `distributed_id`. > 2. There must be a final run that "commits" the version, permanently locking its state. > 3. Use `upsert_artifact` to add to the collaborative artifact and `finish_artifact` to finalize the commit. Consider the following example. Different runs (labelled below as **Run 1**, **Run 2**, and **Run 3**) add a different image file to the same artifact with `upsert_artifact`. #### Run 1 ```python theme={"system"} with wandb.init() as run: artifact = wandb.Artifact("artifact_name", "artifact_type") # Add Files and Assets to the artifact using # `.add`, `.add_file`, `.add_dir`, and `.add_reference` artifact.add_file("image1.png") run.upsert_artifact(artifact, distributed_id="my_dist_artifact") ``` #### Run 2 ```python theme={"system"} with wandb.init() as run: artifact = wandb.Artifact("artifact_name", "artifact_type") # Add Files and Assets to the artifact using # `.add`, `.add_file`, `.add_dir`, and `.add_reference` artifact.add_file("image2.png") run.upsert_artifact(artifact, distributed_id="my_dist_artifact") ``` #### Run 3 Must run after Run 1 and Run 2 complete. The Run that calls `wandb.Run.finish_artifact()` can include files in the artifact, but does not need to. ```python theme={"system"} with wandb.init() as run: artifact = wandb.Artifact("artifact_name", "artifact_type") # Add Files and Assets to the artifact # `.add`, `.add_file`, `.add_dir`, and `.add_reference` artifact.add_file("image3.png") run.finish_artifact(artifact, distributed_id="my_dist_artifact") ``` ## Create a new artifact version from an existing version Create a new artifact version by adding, modifying, or removing files from an existing artifact version. Weights & Biases re-indexes only the files that changed. The resulting version is known as an *incremental* artifact. ![Incremental artifact versioning](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/incremental_artifacts.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=ce6e5d53cde482d8deafb484ff24ad7b) To create an incremental artifact, create a *draft* from any previously committed artifact version. You can then modify the draft by using methods such as `Artifact.add_file()`, `Artifact.add_dir()`, and `Artifact.remove()`. For a complete list of methods, see the [`Artifact` reference documentation](/products/wandb/ref/python/experiments/artifact). After you finish modifying the draft, log or save it to create a new artifact version. > [!NOTE] > > You can create a new artifact from scratch instead of creating an incremental artifact. However, this approach requires all artifact files to be available on your local disk. With an incremental artifact, you can add, remove, or modify individual files while reusing unchanged files from the previous artifact version. You can create an incremental artifact using a single run or across multiple runs that contribute to the new version. The following sections describe how to create an incremental artifact in each case. ### Single run **Track as run input** Use `wandb.Run.use_artifact()` when the current run consumes the artifact. Weights & Biases records the artifact as an input to the run. 1. Retrieve the artifact version with `wandb.Run.use_artifact()`. 2. Create a draft with `Artifact.new_draft()`. 3. Add, remove, or modify entries in the draft. 4. Log the draft with `wandb.Run.log_artifact()` to create a new artifact version. ```python lines theme={"system"} with wandb.init(job_type="modify dataset") as run: saved_artifact = run.use_artifact( "my_artifact:latest" ) # fetch artifact and input it into your run draft_artifact = saved_artifact.new_draft() # create a draft version # modify a subset of files in the draft version draft_artifact.add_file("file_to_add.txt") draft_artifact.remove("dir_to_remove/") run.log_artifact( draft_artifact ) # log your changes to create a new version and mark it as output to your run ``` **Fetch directly** Use the Public API to retrieve an artifact without recording it as a run input. 1. Retrieve the artifact version with `wandb.Api.artifact()`. 2. Create a draft with `Artifact.new_draft()`. 3. Add, remove, or modify entries in the draft. 4. Save the draft version with `Artifact.save()` to create a new artifact version. ```python theme={"system"} client = wandb.Api() saved_artifact = client.artifact("my_artifact:latest") # load your artifact draft_artifact = saved_artifact.new_draft() # create a draft version # modify a subset of files in the draft version draft_artifact.remove("deleted_file.txt") draft_artifact.add_file("modified_file.txt") draft_artifact.save() # commit changes to the draft ``` ### Distributed runs Use `Artifact.upsert_artifact()` and `Artifact.finish_artifact()` when multiple runs contribute files to one artifact version. The following example shows how to create a new artifact version from distributed runs in the case where the artifact is used as [an input to the runs](/products/wandb/artifacts/create-a-new-artifact-version#use-as-run-input). The same approach applies when the artifact is [fetched directly](/products/wandb/artifacts/create-a-new-artifact-version#fetch-directly) with the Public API. ```python theme={"system"} import wandb project = "" artifact_name = "" distributed_id = "dataset-build-001" worker_files = [ ("data/shards/worker-0.txt", "shards/worker-0.txt"), ("data/shards/worker-1.txt", "shards/worker-1.txt"), ] for local_path, artifact_path in worker_files: with wandb.init(project=project, group=distributed_id) as run: artifact = wandb.Artifact(artifact_name, type="dataset") artifact.add_file(local_path, name=artifact_path) run.upsert_artifact(artifact, distributed_id=distributed_id) with wandb.init(project=project, group=distributed_id) as run: artifact = wandb.Artifact(artifact_name, type="dataset") logged = run.finish_artifact( artifact, aliases=["latest"], distributed_id=distributed_id, ) logged.wait() ``` > [!TIP] > > Use `Artifact.new_draft()` when you are modifying a committed artifact version. > > Use `Artifact.upsert_artifact()` and `Artifact.finish_artifact()` when multiple runs need to collaborate on one artifact version before it is finalized. # Artifact data privacy and compliance Source: https://docs.coreweave.com/products/wandb/artifacts/data-privacy-and-compliance Learn where Weights & Biases files are stored by default. Explore how to save, store sensitive information. When you log artifacts, Weights & Biases uploads the files to a Google Cloud bucket. The contents of the bucket are encrypted at rest and in transit. Only users with access to the project can see the files. ![GCS W\&B Client Server diagram](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/data_and_privacy_compliance_1.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=6f7a8cad3265b5907252acc9729ad815) When you delete a version of an artifact, it is marked for soft deletion in our database and removed from your storage cost. When you delete an entire artifact, it is queued for permanent deletion and all of its contents are removed from the Weights & Biases bucket. If you have specific needs around file deletion, reach out to [Customer Support](mailto:forge-support@coreweave.com). By default, deleted artifacts are retained for 7 days and can be restored during this period, which is configurable for Dedicated Cloud. Learn more about data retention in [Multi-tenant Cloud](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud#data-retention-policy) or [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud#data-retention-policy). For sensitive datasets that cannot reside in a multi-tenant environment, you can use [W\&B Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [reference artifacts](/products/wandb/artifacts/track-external-files). Reference artifacts track references to private buckets without sending file contents to Weights & Biases. Reference artifacts maintain links to files on your buckets or servers. Weights & Biases only keeps track of the metadata associated with the files, not the files themselves. ![W\&B Client Server Cloud diagram](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/data_and_privacy_compliance_2.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=d1c05173b40da95b087aa9ee74f94328) For more information about deployment options, see [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud) or [Self-Managed](/products/wandb/platform/hosting/hosting-options/self-managed). To discuss your specific requirements, [contact CoreWeave](https://www.coreweave.com/contact-us). # Delete an artifact Source: https://docs.coreweave.com/products/wandb/artifacts/delete-artifacts Delete artifacts interactively with the App UI or programmatically with the W&B Python SDK. Delete artifacts interactively with the W\&B App or programmatically with the W\&B Python SDK. When you delete an artifact, Weights & Biases marks that artifact as a *soft-delete*. In other words, the artifact is marked for deletion but files are not immediately deleted from storage. The contents of the artifact remain as a soft-delete, or pending deletion state, until a regularly run garbage collection process reviews all artifacts marked for deletion. The garbage collection process deletes associated files from storage if the artifact and its associated files are not used by a previous or subsequent artifact versions. > [!NOTE] > > Garbage collection is **best-effort**. Weights & Biases does not guarantee how quickly freed space appears in your object storage after you delete an artifact. Large deployments or backlogs can take longer than expected. For how this fits with run data, retention settings, and optional operator actions, see [Manage bucket storage and costs](/products/wandb/platform/hosting/managing-bucket-storage). ## Artifact garbage collection workflow The following diagram illustrates the complete artifact garbage collection process: ```mermaid theme={"system"} graph TB Start([Artifact Deletion Initiated]) --> DeleteMethod{Deletion Method} DeleteMethod -->|UI| UIDelete[Delete via W&B App] DeleteMethod -->|SDK| SDKDelete[Delete via W&B Python SDK] DeleteMethod -->|TTL| TTLDelete[TTL Policy Expires] UIDelete --> SoftDelete[Artifact Marked as
'Soft Delete'] SDKDelete --> SoftDelete TTLDelete --> SoftDelete SoftDelete --> GCWait[(Wait for
best-effort
Garbage Collection)] GCWait --> GCRun[Garbage Collection
Process Runs

- Reviews all soft-deleted artifacts
- Checks file dependencies] GCRun --> CheckUsage{Are files used by
other artifact versions?} CheckUsage -->|Yes| KeepFiles[Files Kept in Storage

- Artifact marked deleted
- Files remain for other versions] CheckUsage -->|No| DeleteFiles[Files Deleted from Storage

- Artifact fully removed
- Storage space reclaimed] KeepFiles --> End([End]) DeleteFiles --> End style Start fill:#e1f5fe,stroke:#333,stroke-width:2px,color:#000 style SoftDelete fill:#fff3e0,stroke:#333,stroke-width:2px,color:#000 style GCRun fill:#f3e5f5,stroke:#333,stroke-width:2px,color:#000 style KeepFiles fill:#e8f5e9,stroke:#333,stroke-width:2px,color:#000 style DeleteFiles fill:#ffebee,stroke:#333,stroke-width:2px,color:#000 style End fill:#e0e0e0,stroke:#333,stroke-width:2px,color:#000 ``` You can schedule when artifacts are deleted from Weights & Biases with TTL policies. For more information, see [Manage data retention with Artifact TTL policy](/products/wandb/artifacts/ttl). > [!NOTE] > > Artifacts deleted by a TTL policy, the W\&B Python SDK, or the W\&B App are first soft-deleted. Soft-deleted artifacts are then garbage-collected before they are permanently deleted. > [!NOTE] > > Deleting an entity, project, or artifact collection triggers the artifact deletion process described on this page. When you delete a run and choose to delete its associated artifacts, those artifacts follow the same soft-delete and garbage collection workflow. ## Delete an artifact version Delete an artifact version interactively with the W\&B App or programmatically with the W\&B Python SDK. **W\&B App** To delete an artifact version: 1. Navigate to the project that contains the artifact version you want to delete. 2. Select the **Artifacts** tab. 3. From the list of artifact types, select the type of artifact that contains the version you want to delete. 4. Click the **action ()** menu next to the artifact version you want to delete. 5. From the dropdown, choose **Delete Version**. **W\&B Python SDK** Delete an artifact version programmatically with the [wandb.Artifact.delete()](/products/wandb/ref/python/experiments/artifact#delete) method. Provide the full name of the artifact. The full name consists of `//:`. Set the `delete_aliases` parameter to `True` to delete the artifact even if it has one or more aliases associated with it. ```python theme={"system"} import wandb api = wandb.Api() # Get the artifact by its path artifact = api.artifact("//:") # Delete the artifact version along with any aliases artifact.delete(delete_aliases=True) ``` ## Delete multiple artifact versions The following code example shows how to delete multiple artifact versions. Provide the entity, project name, and run ID that created the artifact as arguments to `wandb.Api.run()`. This returns a run object that you can use to access all artifact versions created by that run. Next, iterate through the artifact versions and delete the ones that match your criteria. > [!TIP] > > Set the `delete_aliases` parameter to `True` (`wandb.Artifact.delete(delete_aliases=True)`) to delete an artifact version and any aliases associated with it. Replace the ``, ``, ``, and `` placeholders with your own values: ```python theme={"system"} import wandb # Initialize W&B API api = wandb.Api() # Get the run by its path. Consists of // run = api.run("//") # Specify the artifact name to delete versions for artifact_name = "" # Search and delete artifact versions with the specified name for artifact in run.logged_artifacts(): print(f"Found artifact: {artifact.name}") # Example name run_4dfbufgq_model:v0 # Grab only the artifact name without the version with split() if artifact.name.split(":")[0] == artifact_name: print(f"Deleting artifact version: {artifact.name}") artifact.delete(delete_aliases=True) ``` ## Delete multiple artifact versions with a specific alias The following code demonstrates how to delete multiple artifact versions that have a specific alias. Replace the ``, ``, ``, ``, and `` placeholders with your own values: ```python theme={"system"} import wandb # Initialize W&B API api = wandb.Api() # Get the run by its path. Consists of // run = api.run("//") # Specify the artifact name to delete versions for artifact_name = "" # Specify the alias to filter artifact versions for deletion desired_alias = "" # Delete artifacts logged to run with alias 'v3' and 'v4 for artifact in run.logged_artifacts(): print(f"Found artifact: {artifact.name}") if (artifact.name.split(":")[0] == artifact_name) and (desired_alias in artifact.aliases): artifact.delete(delete_aliases=True) ``` ## Delete an artifact collection **W\&B App** To delete an artifact collection: 1. Navigate to the artifact collection you want to delete. 2. Select the **action ()** menu next to the artifact collection name. 3. From the dropdown menu, select **Delete**. **W\&B Python SDK** Delete artifact collection programmatically with the [wandb.Artifact.delete()](/products/wandb/ref/python/experiments/artifact#delete) method. Provide the full path of the artifact collection to `wandb.Api.artifact_collection(name="")`. The full path consists of `//`. ```python theme={"system"} import wandb # Initialize W&B API api = wandb.Api() # Get the artifact collection by its path. Consists of # // collection = api.artifact_collection( type_name = "", name = "//" ) collection.delete() ``` ## Protected aliases and deletion permissions Artifacts with protected aliases have special deletion restrictions. [Protected aliases](/products/registry/aliases#protected-aliases) are aliases in the Registry that registry admins can set to prevent unauthorized deletion. > [!NOTE] > > **Important considerations for protected aliases:** > > * Artifacts with protected aliases cannot be deleted by non-registry admins. > * Within a registry, registry admins can unlink protected artifact versions and delete collections/registries that contain protected aliases. > * For source artifacts: if a source artifact is linked to a registry with a protected alias, it cannot be deleted by any user > * Registry admins can remove the protected aliases from source artifacts and then delete them. ## Enable garbage collection based on how Weights & Biases is hosted > [!NOTE] > > Garbage collection timing is not guaranteed. See [Manage bucket storage and costs](/products/wandb/platform/hosting/managing-bucket-storage) for details. Garbage collection is active by default if you use W\&B Multi-tenant Cloud. In W\&B Dedicated and Self-Managed, you might need to take these additional steps to activate garbage collection. 1. **W\&B Self-Managed**: Set `GORILLA_ARTIFACT_GC_ENABLED=true`. 2. **Dedicated Cloud**: Contact support to verify that garbage collection is active. 3. Enable bucket versioning if you use [AWS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html), [Google Cloud](https://cloud.google.com/storage/docs/object-versioning) or any other storage provider such as [Minio](https://min.io/docs/minio/linux/administration/object-management/object-versioning.html#enable-bucket-versioning). If you use Azure, [enable soft deletion](https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview), which is equivalent to bucket versioning. The following table describes how to satisfy requirements to enable garbage collection based on your deployment type. The `X` indicates you must satisfy the requirement: | | Environment variable | Enable versioning | | - | - | - | | Multi-tenant Cloud | | | | Multi-tenant Cloud with [BYOB storage](/products/wandb/platform/hosting/data-security/secure-storage-connector) | | X | | Dedicated Cloud | | | | Dedicated Cloud with [BYOB storage](/products/wandb/platform/hosting/data-security/secure-storage-connector) | | X | | Self-Managed | X | X | > [!NOTE] > > note > Secure storage connector is currently only available for Google Cloud Platform and Amazon Web Services. # Download and use artifacts Source: https://docs.coreweave.com/products/wandb/artifacts/download-and-use-an-artifact Download and use Artifacts from multiple projects. Download and use an artifact that is already stored on the W\&B server or construct an artifact object and pass it in for de-duplication as necessary. ## Download and use an artifact stored on Weights & Biases Download an artifact as a tracked run input when it is a run dependency, or fetch it directly for workflows that don’t require lineage tracking. > [!NOTE] > > References that have schemes that Weights & Biases knows how to handle get downloaded just like artifact files. For more information, see [Track external files](/products/wandb/artifacts/track-external-files). You can download all files in an artifact or download individual files: * Use [`Artifact.download()`](/products/wandb/ref/python/experiments/artifact#download) to download all files. * Use [`Artifact.get_entry()`](/products/wandb/ref/python/experiments/artifact#get_entry) to retrieve a specific entry, and then call `.download()` to download it. **Track run input** Use `wandb.Run.use_artifact()` to download an artifact as part of a W\&B run. Weights & Biases records the artifact as an input to the run. 1. Import the W\&B Python SDK and initialize a W\&B [Run](/products/wandb/ref/python/experiments/run). 2. Retrieve the artifact version with `wandb.Run.use_artifact()`. 3. Download all files or a specific file from the returned `Artifact` object. ```python theme={"system"} import wandb with wandb.init(project="project-name", job_type="job-type") as run: # Indicate the artifact to use. Format is "name:alias" artifact = run.use_artifact("bike-dataset:latest") # Download the entire artifact datadir = artifact.download() # Download a specific file entry = artifact.get_entry("bike.png") file_path = entry.download() # downloads only bike.png ``` **Fetch directly** Use the Public API to download an artifact without creating a run or recording a run input relationship. 1. Import the W\&B Python SDK and create a client object with `wandb.Api()`. 2. Retrieve the artifact version with `wandb.Api.artifact()`. 3. Download all files or a specific file from the returned `Artifact` object. Specify the artifact path in the format `entity/project/artifact:alias`. ```python theme={"system"} import wandb api = wandb.Api() artifact = api.artifact("entity/project/artifact:alias") artifact.download() ``` **W\&B CLI** Use the `wandb artifact get` command to download an artifact from the W\&B server. ``` $ wandb artifact get project/artifact:alias --root mnist/ ``` ## Partially download an artifact You can optionally download part of an artifact based on a prefix. Use the `path_prefix=` (`wandb.Artifact.download(path_prefix=)`) parameter to download a single file or the content of a sub-folder. ```python theme={"system"} with wandb.init(project="project-name", job_type="job-type") as run: # Indicate the artifact to use. Format is "name:alias" artifact = run.use_artifact("bike-dataset:latest") # Download a specific file or sub-folder artifact.download(path_prefix="bike.png") # downloads only bike.png ``` Alternatively, you can download files from a certain directory. To do so, specify the directory within the `path_prefix=` parameter. Continuing from the previous code snippet: ```python theme={"system"} # downloads files in the images/bikes directory artifact.download(path_prefix="images/bikes/") ``` ## Verify downloaded artifact files After you download an artifact, call `wandb.Artifact.verify()` to confirm that the local files on disk match the artifact manifest. The following example downloads an artifact as part of a run and verifies the downloaded files: ```python theme={"system"} import wandb with wandb.init(project="project-name", job_type="job-type") as run: artifact = run.use_artifact("entity/project/my-dataset:latest") artifact_dir = artifact.download() artifact.verify(artifact_dir) ``` [`wandb.Artifact.verify()`](/products/wandb/ref/python/experiments/artifact#method-artifact-verify) recomputes checksums for local files and compares them with the checksums in the artifact manifest. Verification fails if a file is missing or modified, or if the directory contains files that are not included in the artifact. > [!NOTE] > > **Artifact verification considerations** > > * `wandb.Artifact.verify()` does not verify [reference entries](/products/wandb/artifacts/track-external-files). > > * Artifacts created with `digest_algorithm="XXH128"` require W\&B Python SDK version 0.29.0 or newer to use `wandb.Artifact.verify()`. Earlier SDK versions do not support XXH128 manifest entries, so verification fails. ## Use an artifact from a different project Specify the name of the artifact along with its project name to reference an artifact. You can also reference artifacts across entities by specifying the name of the artifact with its entity name. The following code example demonstrates how to query an artifact from another project as input to the current W\&B run. ```python theme={"system"} with wandb.init(project="project-name", job_type="job-type") as run: # Query W&B for an artifact from another project and mark it # as an input to this run. artifact = run.use_artifact("my-project/artifact:alias") # Use an artifact from another entity and mark it as an input # to this run. artifact = run.use_artifact("my-entity/my-project/artifact:alias") ``` ## Construct and use an artifact simultaneously Simultaneously construct and use an artifact. Create an artifact object and pass it to use\_artifact. This creates an artifact in Weights & Biases if it does not exist yet. The [`wandb.Run.use_artifact()`](/products/wandb/ref/python/experiments/run#use_artifact) API is idempotent, so you can call it as many times as you like. ```python theme={"system"} import wandb with wandb.init(project="project-name", job_type="job-type") as run: artifact = wandb.Artifact("reference model") artifact.add_file("model.h5") run.use_artifact(artifact) ``` For more information about constructing an artifact, see [Construct an artifact](/products/wandb/artifacts/construct-an-artifact). # Explore artifact lineage graphs Source: https://docs.coreweave.com/products/wandb/artifacts/explore-and-traverse-an-artifact-graph View and traverse artifact lineage graphs to track the inputs and outputs of W&B runs as a directed acyclic graph. Weights & Biases tracks the inputs and outputs of runs using directed acyclic graphs (DAGs) called *lineage graphs*. Lineage graphs are visual representations of the relationships between artifacts and runs in an ML experiment. They show how data and models flow through different stages of the ML lifecycle, from raw data ingestion to model training and evaluation. Tracking artifact lineage provides several key advantages: * **Reproducibility**: Enables teams to reproduce experiments, models, and results for debugging, experimentation, and validation. * **Version control**: Tracks changes to artifacts over time, allowing teams to revert to previous data or model versions when needed. * **Auditing**: Maintains a detailed record of artifacts and transformations to support compliance and governance. * **Collaboration**: Helps to improve teamwork by making experiment history transparent, reducing duplicated effort, and accelerating development. ## View an artifact's lineage graph To view an artifact's lineage graph: 1. Navigate to your project's workspace in the W\&B App. 2. Click on the **Artifacts** tab in the project sidebar. 3. Select an artifact, then click the **Lineage** tab. ## Navigate lineage graphs The lineage graph is a visual representation of the relationships between artifacts and runs in an ML experiment. Use the W\&B App UI or the Python SDK to explore and traverse an artifact's lineage graph. **W\&B App UI** Nodes with green icons represent runs. Nodes with blue icons represent artifacts. Arrows between nodes indicate the input and output of a run or artifact. Artifact nodes display the artifact's name along with the version of the artifact in the form `:`. An artifact's type is displayed above the name of the artifact. > [!NOTE] > > You can view the type and the name of artifact in both the left sidebar and in the lineage graph node. Run nodes display the run's name. ![Run and artifact nodes](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/lineage2.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a2fd27e45b1a080e02a194af597debaf) Click any individual run to get more information about that runs such as the run's: start time, time duration, author, job type, and more. Click any individual artifact to get more information about the artifact's: aliases, creation time, type, version, description, the run that logged the artifact, file size, and more. ![Previewing a run](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/lineage3a.gif?s=312d9c111d2e9b16cb04de31f06c5865) Runs that create multiple versions of the same artifact are grouped together in a cluster. Click on a specific artifact version listed within the cluster to view specific information about that artifact version. ![Cluster of artifact versions in a lineage graph](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/lineage_multiple_artifact_versions.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=0ec0d2f4d521f0a27be77dfaa156d212) Click and drag a node to rearrange the graph to customize the layout. You can also zoom in and out of the graph to get a better view of the nodes and their relationships. ![Rearranging nodes in a lineage graph](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/lineage_rearrange_nodes.gif?s=81b87ad3898858fd9cc38b7f732237d3) Hover your mouse over a node and click on the eye icon to hide or show a node in the graph. This is useful for decluttering the graph to focus on specific nodes and their relationships. **W\&B Python SDK** Programmatically navigate a graph using the W\&B Python SDK. Use an artifact object's [`logged_by()`](/products/wandb/ref/python/experiments/artifact#method-artifact-logged-by) and [`used_by()`](/products/wandb/ref/python/experiments/artifact#method-artifact-used-by) methods to walk the graph: ```python theme={"system"} with wandb.init() as run: artifact = run.use_artifact("artifact_name:latest") # Walk up and down the graph from an artifact: producer_run = artifact.logged_by() consumer_runs = artifact.used_by() ``` ## Enable lineage graph tracking To enable lineage graph tracking, you need to mark artifacts as [inputs](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph) or [outputs](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph#track-the-output-of-a-run) of a run using the W\&B Python SDK. ### Track the input of a run Mark an artifact as the input (or dependency) of a run with the [`wandb.Run.use_artifact()`](/products/wandb/ref/python/experiments/run#method-runuse_artifact) method. Specify the name of the artifact and an optional alias to reference a specific version of that artifact. The name of the artifact is in the format `:` or `:`. Replace values enclosed in angle brackets (`< >`) with your values: ```python theme={"system"} import wandb # Initialize a run with wandb.init(entity="", project="") as run: # Get artifact, mark it as a dependency artifact = run.use_artifact(artifact_or_name="", aliases="") ``` ### Track the output of a run Use [`wandb.Run.log_artifact()`](/products/wandb/ref/python/experiments/run#log_artifact) to declare an artifact as an output of a run. First, create an artifact with the [`wandb.Artifact()`](/products/wandb/ref/python/experiments/artifact#wandb.Artifact) constructor. Then, log the artifact as an output of the run with `wandb.Run.log_artifact()`. Replace values enclosed in angle brackets (`< >`) with your values: ```python theme={"system"} import wandb # Initialize a run with wandb.init(entity="", project="") as run: # Create an artifact artifact = wandb.Artifact(name = "", type = "") artifact.add_file(local_path = "", name="") # Log the artifact as an output of the run run.log_artifact(artifact_or_path = artifact) ``` ## Artifact clusters When a level of the graph has five or more runs or artifacts, it creates a cluster. A cluster has a search bar to find specific versions of runs or artifacts and pulls an individual node from a cluster to continue investigating the lineage of a node inside a cluster. Clicking on a node opens a preview with an overview of the node. Clicking on the arrow extracts the individual run or artifact so you can examine the lineage of the extracted node. ![Searching a run cluster](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/lineage3b.gif?s=b0e02791559ddc14bb345c930cc11e73) # Manage artifact storage and memory allocation Source: https://docs.coreweave.com/products/wandb/artifacts/storage Manage storage, memory allocation of W&B Artifacts. Weights & Biases stores artifact files in a private Google Cloud Storage bucket located in the United States by default. All files are encrypted at rest and in transit. For sensitive files, we recommend you set up [Private Hosting](/products/wandb/platform/hosting) or use [reference artifacts](/products/wandb/artifacts/track-external-files). During training, Weights & Biases locally saves logs, artifacts, and configuration files in the following local directories: | File | Default location | To change default location set: | | - | - | - | | logs | `./wandb` | `dir` in `wandb.init()` or set the `WANDB_DIR` environment variable | | artifacts | `~/.cache/wandb` | the `WANDB_CACHE_DIR` environment variable | | configs | `~/.config/wandb` | the `WANDB_CONFIG_DIR` environment variable | | staging artifacts for upload | `~/.cache/wandb-data/` | the `WANDB_DATA_DIR` environment variable | | downloaded artifacts | `./artifacts` | the `WANDB_ARTIFACT_DIR` environment variable | For a complete guide to using environment variables to configure Weights & Biases, see the [environment variables reference](/products/wandb/track/environment-variables). > [!WARNING] > > Depending on the machine on `wandb` is initialized on, these default folders may not be located in a writeable part of the file system. This might trigger an error. ### Clean up local artifact cache Weights & Biases caches artifact files to speed up downloads across versions that share files in common. Over time this cache directory can become large. Run the [`wandb artifact cache cleanup`](/products/wandb/ref/cli/wandb-artifact/wandb-artifact-cache) command to prune the cache and to remove any files that have not been used recently. The following code snippet demonstrates how to limit the size of the cache to 1GB. Copy and paste the code snippet into your terminal: ```bash theme={"system"} $ wandb artifact cache cleanup 1GB ``` # Track external files Source: https://docs.coreweave.com/products/wandb/artifacts/track-external-files Track files saved in an external bucket, HTTP file server, or an NFS share. Use *reference artifacts* to track and use files saved outside of Weights & Biases servers. Common external storage solutions include: CoreWeave AI Object Storage, Backblaze B2 Cloud Storage, an Amazon Simple Storage Service (Amazon S3) bucket, GCS bucket, Azure blob, HTTP file server, or NFS share. Reference artifacts behave similar to non-reference artifacts. The key difference is that the reference artifacts only consists of metadata about the files, such as their sizes and MD5 checksums. The files themselves never leave your system. You can interact with reference artifact similarly to non-reference artifacts. In the W\&B App, you can browse the contents of the reference artifact using the file browser, explore the full dependency graph, and scan through the versioned history of your artifact. However, the UI cannot render rich media such as images, audio, because the data itself is not contained within the artifact. > [!NOTE] > > If you log an artifact that does not track external files, Weights & Biases saves the artifact's files to Weights & Biases servers. This is the default behavior when you log artifacts with the W\&B Python SDK. > > If you log an artifact that tracks external files, Weights & Biases logs metadata about the object, such as the object's ETag and size. If object versioning is enabled on the bucket, the version ID is also logged. The following sections describe how to track external reference artifacts. ## Track an artifact in an external bucket Use the W\&B Python SDK to track references to files stored outside of Weights & Biases. 1. Initialize a run with `wandb.init()`. 2. Create an artifact object with `wandb.Artifact()`. 3. Specify the reference to the bucket path with the artifact object's `wandb.Artifact.add_reference()` method. 4. Log the artifact's metadata with `run.log_artifact()`. ```python theme={"system"} import wandb # Initialize a W&B run with wandb.init(project="my-project") as run: # Create an artifact object artifact = wandb.Artifact(name="name", type="type") # Add a reference to the bucket path artifact.add_reference(uri = "uri/to/your/bucket/path") # Log the artifact's metadata run.log_artifact(artifact) ``` As an example, suppose your bucket has the following directory structure: ```text theme={"system"} s3://my-bucket |datasets/ |-- mnist/ |models/ |-- cnn/ ``` The `datasets/mnist/` directory contains a collection of images. To track the image `datasets/mnist/` directory as a dataset artifact, specify: 1. Provide a name for the artifact, such as `"mnist"`. 2. Set the `type` parameter to `"dataset"` when you construct the artifact object (`wandb.Artifact(type="dataset")`). 3. Provide the path to the `datasets/mnist/` directory as an Amazon S3 URI (`s3://my-bucket/datasets/mnist/`) when you call `wandb.Artifact.add_reference()`. 4. Log the artifact with `run.log_artifact()`. The following code sample creates a reference artifact `mnist:latest`: ```python theme={"system"} import wandb with wandb.init(project="my-project") as run: artifact = wandb.Artifact(name="mnist", type="dataset") artifact.add_reference(uri="s3://my-bucket/datasets/mnist") run.log_artifact(artifact) ``` Within the W\&B App, you can look through the contents of the reference artifact using the file browser, [explore the full dependency graph](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph), and scan through the versioned history of your artifact. The W\&B App does not render rich media such as images, audio, and so forth because the data itself is not contained within the artifact. > [!NOTE] > > W\&B Artifacts support any Amazon S3-compatible interface, including CoreWeave Storage, Backblaze B2 Cloud Storage, and MinIO. The scripts described below work as-is with these providers when you set the `AWS_S3_ENDPOINT_URL` environment variable to point at your S3-compatible server (for example, `https://s3.us-west-001.backblazeb2.com` for Backblaze B2). > [!WARNING] > > By default, Weights & Biases imposes a 10,000 object limit when adding an object prefix. You can adjust this limit by specifying `max_objects=` when you call `wandb.Artifact.add_reference()`. ## Download an artifact from an external bucket Weights & Biases retrieves the files from the underlying bucket when it downloads a reference artifact using the metadata recorded when the artifact is logged. If your bucket has object versioning enabled, Weights & Biases retrieves the object version that corresponds to the state of the file at the time an artifact was logged. As you evolve the contents of your bucket, you can always point to the exact version of your data a given model was trained on, because the artifact serves as a snapshot of your bucket during the training run. The following code sample shows how to download a reference artifact. The APIs for downloading artifacts are the same for both reference and non-reference artifacts: ```python theme={"system"} import wandb with wandb.init(project="my-project") as run: artifact = run.use_artifact("mnist:latest", type="dataset") artifact_dir = artifact.download() ``` > [!NOTE] > > Weights & Biases recommends that you enable 'Object Versioning' on your storage buckets if you overwrite files as part of your workflow. > > If versioning is enabled, Weights & Biases can always retrieve the correct version of the file when you download an artifact, even if the file has been overwritten since the artifact was logged. > > Based on your use case, read the instructions to enable object versioning: [AWS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html), [Google Cloud](https://cloud.google.com/storage/docs/using-object-versioning#set), [Azure](https://learn.microsoft.com/azure/storage/blobs/versioning-enable). ## Add and download an external from a bucket The following code sample uploads a dataset to an Amazon S3 bucket, tracks it with a reference artifact, then downloads it: ```python theme={"system"} import boto3 import wandb with wandb.init() as run: # Training here... s3_client = boto3.client("s3") s3_client.upload_file(file_name="my_model.h5", bucket="my-bucket", object_name="models/cnn/my_model.h5") # Log the model artifact model_artifact = wandb.Artifact("cnn", type="model") model_artifact.add_reference("s3://my-bucket/models/cnn/") run.log_artifact(model_artifact) ``` At a later point, you can download the model artifact. Specify the name of the artifact and its type: ```python theme={"system"} import wandb with wandb.init() as run: artifact = run.use_artifact(artifact_or_name = "cnn", type="model") datadir = artifact.download() ``` > [!NOTE] > > See the following reports for an end-to-end walkthrough on how to track artifacts by reference for Google Cloud or Azure: > > * [Guide to Tracking Artifacts by Reference with Google Cloud](https://forge.coreweave.com/wandb/stacey/artifacts/reports/Tracking-Artifacts-by-Reference--Vmlldzo1NDMwOTE) > * [Working with Reference Artifacts in Microsoft Azure](https://forge.coreweave.com/wandb/andrea0/azure-2023/reports/Efficiently-Harnessing-Microsoft-Azure-Blob-Storage-with-Weights-Biases--Vmlldzo0NDA2NDgw) ## Cloud storage credentials Weights & Biases uses the default mechanism to look for credentials based on the cloud provider you use. Read the documentation from your cloud provider to learn more about the credentials used: | Cloud provider | Credentials Documentation | | - | - | | CoreWeave AI Object Storage | [CoreWeave AI Object Storage documentation](/products/storage/object-storage/auth-access/manage-access-keys/create-keys) | | Backblaze B2 Cloud Storage | [Backblaze B2 Application Keys documentation](https://www.backblaze.com/docs/cloud-storage-application-keys) | | AWS | [Boto3 documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials) | | Google Cloud | [Google Cloud documentation](https://cloud.google.com/docs/authentication/provide-credentials-adc) | | Azure | [Azure documentation](https://learn.microsoft.com/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python) | For AWS, if the bucket is not located in the configured user's default region, you must set the `AWS_REGION` environment variable to match the bucket region. > [!WARNING] > > Rich media such as images, audio, video, and point clouds may fail to render in the App UI depending on the CORS configuration of your bucket. Allow listing **app.wandb.ai** in your bucket's CORS settings will allow the W\&B App to properly render such rich media. > > If rich media such as images, audio, video, and point clouds does not render in the App UI, ensure that `app.wandb.ai` is allowlisted in your bucket's CORS policy. ## Track an artifact in a filesystem A common pattern for accessing datasets is to expose an NFS mount point to a remote filesystem on all machines running training jobs. This can be an alternative solution to a cloud storage bucket because from the perspective of the training script, the files appear local to your filesystem. To track an artifact in a filesystem: 1. Initialize a run with `wandb.init()`. 2. Create an artifact object with `wandb.Artifact()`. 3. Specify the reference to the filesystem path with the artifact object's `wandb.Artifact.add_reference()` method. 4. Log the artifact's metadata with `run.log_artifact()`. Copy and paste the following code snippet to track files in a mounted filesystem. Replace the values enclosed in angle brackets (`< >`) with your own values. ```python theme={"system"} import wandb # Initialize a run with wandb.init(entity="", project="") as run: # Create an artifact object artifact = wandb.Artifact(name="", type="") # Add a reference to the filesystem path artifact.add_reference("file:///path/to/dataset/") # Log the artifact (metadata only) run.log_artifact(artifact) ``` Note the triple slash in the URL. The first component is the `file://` prefix that denotes the use of filesystem references. The second component is the root `/` of the filesystem. The remaining components are the path to the directory or file you want to track. As an example, suppose you have a filesystem mounted at `/mount` with the following structure: ```text theme={"system"} mount |datasets/ |-- mnist/ |models/ |-- cnn/ ``` You want to track the `datasets/mnist/` directory as a dataset artifact. To track it, you could use the following code snippet. ```python theme={"system"} import wandb with wandb.init() as run: artifact = wandb.Artifact("mnist", type="dataset") artifact.add_reference("file:///mount/datasets/mnist/") run.log_artifact(artifact) ``` This creates a reference artifact `mnist:latest` that points to the files stored under `/mount/datasets/mnist/`. > [!WARNING] > > By default, Weights & Biases imposes a 10,000 file limit when adding a reference to a directory. You can adjust this limit by specifying `max_objects=` when you call `wandb.Artifact.add_reference()`. Similarly, to track a model stored at `models/cnn/my_model.h5`, you could use the following code snippet: ```python theme={"system"} import wandb with wandb.init() as run: # Training here... # Write model to disk # Create an artifact object model_artifact = wandb.Artifact("cnn", type="model") # Add a reference to the model file path model_artifact.add_reference("file:///mount/cnn/my_model.h5") # Log the artifact to W&B run.log_artifact(model_artifact) ``` ## Download an artifact from an external filesystem Download files from a referenced filesystem using the same APIs as non-reference artifacts: 1. Initialize a run with `wandb.init()`. 2. Use the `wandb.Run.use_artifact()` method to indicate the artifact you want to download. 3. Call the artifact's `wandb.Artifact.download()` method to download the files from the referenced filesystem ```python theme={"system"} with wandb.init() as run: artifact = run.use_artifact("entity/project/mnist:latest", type="dataset") artifact_dir = artifact.download() ``` Weights & Biases copies the contents of `/mount/datasets/mnist` to the `artifacts/mnist:v0/` directory. > [!NOTE] > > `Artifact.download()` throws an error if it cannot reconstruct the artifact. For example, if an artifact contains a reference to a file that was overwritten, `Artifact.download()` will throw an error because the artifact can no longer be reconstructed. # Manage artifact data retention Source: https://docs.coreweave.com/products/wandb/artifacts/ttl Set time-to-live (TTL) policies on W&B artifacts to schedule automatic deletion and manage storage consumption. [Try in Colab](https://colab.research.google.com/github/wandb/examples/blob/kas-artifacts-ttl-colab/colabs/wandb-artifacts/WandB_Artifacts_Time_to_live_TTL_Walkthrough.ipynb) Schedule when artifacts are deleted from Weights & Biases with a W\&B Artifact time-to-live (TTL) policy. When you delete an artifact, Weights & Biases marks that artifact as a *soft-delete*. In other words, the artifact is marked for deletion but files are not immediately deleted from storage. For more information on how Weights & Biases deletes artifacts, see the [Delete artifacts](/products/wandb/artifacts/delete-artifacts) page. Watch a [Managing data retention with Artifacts TTL](https://www.youtube.com/watch?v=hQ9J6BoVmnc) video tutorial to learn how to manage data retention with Artifacts TTL in the W\&B App. > [!NOTE] > > * Only team admins can view a [team's settings](/products/wandb/platform/app/settings-page/teams) and access team level TTL settings such as (1) permitting who can set or edit a TTL policy or (2) setting a team default TTL. > * If you do not see the option to set or edit a TTL policy in an artifact's details in the W\&B App UI or if setting a TTL programmatically does not successfully change an artifact's TTL property, your team admin has not given you permissions to do so. ## Auto-generated Artifacts Only user-generated artifacts can use TTL policies. Artifacts auto-generated by Weights & Biases cannot have TTL policies set for them. The following Artifact types indicate an auto-generated Artifact: * `run_table` * `code` * `job` * Any Artifact type starting with: `wandb-*` You can check an Artifact's type on the [Weights & Biases UI](/products/wandb/artifacts/explore-and-traverse-an-artifact-graph) or programmatically: ```python theme={"system"} import wandb with wandb.init(project="") as run: artifact = run.use_artifact(artifact_or_name="") print(artifact.type) ``` Replace the values enclosed with `<>` with your own. ## Define who can edit and set TTL policies Define who can set and edit TTL policies within a team. You can either grant TTL permissions only to team admins, or you can grant both team admins and team members TTL permissions. > [!NOTE] > > Only team admins can define who can set or edit a TTL policy. 1. Navigate to your team’s profile page. 2. Select the **Settings** tab. 3. Navigate to the **Artifacts time-to-live (TTL) section**. 4. From the **TTL permissions dropdown**, select who can set and edit TTL policies. 5. Click on **Review and save settings**. 6. Confirm the changes and select **Save settings**. ![Setting TTL permissions](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/define_who_sets_ttl.gif?s=61cd2cd6567cc344c7a8e83f0f786482) ## Create a TTL policy Set a TTL policy for an artifact either when you create the artifact or retroactively after the artifact is created. For all the code snippets below, replace the content wrapped in `<>` with your information to use the code snippet. ### Set a TTL policy when you create an artifact Use the W\&B Python SDK to define a TTL policy when you create an artifact. TTL policies are typically defined in days. > [!NOTE] > > Defining a TTL policy when you create an artifact is similar to how you normally [create an artifact](/products/wandb/artifacts/construct-an-artifact). With the exception that you pass in a time delta to the artifact's `ttl` attribute. The steps are as follows: 1. [Create an artifact](/products/wandb/artifacts/construct-an-artifact). 2. [Add content to the artifact](/products/wandb/artifacts/construct-an-artifact#add-files-to-an-artifact) such as files, a directory, or a reference. 3. Define a TTL time limit with the [`datetime.timedelta`](https://docs.python.org/3/library/datetime.html) data type that is part of Python's standard library. 4. [Log the artifact](/products/wandb/artifacts/construct-an-artifact#3-save-your-artifact-to-the-wb-server). The following code snippet demonstrates how to create an artifact and set a TTL policy. ```python theme={"system"} import wandb from datetime import timedelta with wandb.init(project="", entity="") as run: artifact = wandb.Artifact(name="", type="") artifact.add_file("") artifact.ttl = timedelta(days=30) # Set TTL policy run.log_artifact(artifact) ``` The preceding code snippet sets the TTL policy for the artifact to 30 days. In other words, Weights & Biases deletes the artifact after 30 days. ### Set or edit a TTL policy after you create an artifact Use the W\&B App UI or the W\&B Python SDK to define a TTL policy for an artifact that already exists. > [!NOTE] > > When you modify an artifact's TTL, the time the artifact takes to expire is still calculated using the artifact's `createdAt` timestamp. **W\&B Python SDK** 1. [Fetch your artifact](/products/wandb/artifacts/download-and-use-an-artifact). 2. Pass in a time delta to the artifact's `ttl` attribute. 3. Update the artifact with the [`save`](/products/wandb/ref/python/experiments/run#save) method. The following code snippet shows how to set a TTL policy for an artifact: ```python theme={"system"} import wandb from datetime import timedelta artifact = run.use_artifact("") artifact.ttl = timedelta(days=365 * 2) # Delete in two years artifact.save() ``` The preceding code example sets the TTL policy to two years. **W\&B App** 1. Navigate to your Weights & Biases project in the Weights & Biases App. 2. Select the artifact icon in the project sidebar. 3. From the list of artifacts, expand the artifact type you 4. Select on the artifact version you want to edit the TTL policy for. 5. Click on the **Version** tab. 6. From the dropdown, select **Edit TTL policy**. 7. Within the modal that appears, select **Custom** from the TTL policy dropdown. 8. Within the **TTL duration** field, set the TTL policy in units of days. 9. Select the **Update TTL** button to save your changes. ![Editing TTL policy](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/edit_ttl_ui.gif?s=b3ae5979e1bc49a42be1944715ad288c) ### Set default TTL policies for a team > [!NOTE] > > Only team admins can set a default TTL policy for a team. Set a default TTL policy for your team. Default TTL policies apply to all existing and future artifacts based on their respective creation dates. Artifacts with existing version-level TTL policies are not affected by the team's default TTL. 1. Navigate to your team’s profile page. 2. Select the **Settings** tab. 3. Navigate to the **Artifacts time-to-live (TTL) section**. 4. Click on the **Set team's default TTL policy**. 5. Within the **Duration** field, set the TTL policy in units of days. 6. Click on **Review and save settings**. 7/ Confirm the changes and then select **Save settings**. ![Setting default TTL policy](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/set_default_ttl.gif?s=7fb088532485d0f4ebd4e17d8a2824eb) ### Set a TTL policy outside of a run Use the public API to retrieve an artifact without fetching a run, and set the TTL policy. TTL policies are typically defined in days. The following code sample shows how to fetch an artifact using the public API and set the TTL policy. ```python theme={"system"} api = wandb.Api() artifact = api.artifact("entity/project/artifact:alias") artifact.ttl = timedelta(days=365) # Delete in one year artifact.save() ``` ## Deactivate a TTL policy Use the W\&B Python SDK or W\&B App UI to deactivate a TTL policy for a specific artifact version. **W\&B Python SDK** 1. [Fetch your artifact](/products/wandb/artifacts/download-and-use-an-artifact). 2. Set the artifact's `ttl` attribute to `None`. 3. Update the artifact with the [`save`](/products/wandb/ref/python/experiments/run#save) method. The following code snippet shows how to turn off a TTL policy for an artifact: ```python theme={"system"} artifact = run.use_artifact("") artifact.ttl = None artifact.save() ``` **W\&B App** 1. Navigate to your Weights & Biases project in the Weights & Biases App. 2. Select the artifact icon in the project sidebar. 3. From the list of artifacts, expand the artifact type you 4. Select on the artifact version you want to edit the TTL policy for. 5. Click on the Version tab. 6. Click the **action ()** menu next to the **Link to registry** button. 7. From the dropdown, select **Edit TTL policy**. 8. Within the modal that appears, select **Deactivate** from the TTL policy dropdown. 9. Select the **Update TTL** button to save your changes. ![Removing TTL policy](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/remove_ttl_polilcy.gif?s=bc3705781c8758155885192879d235d8) ## View TTL policies View TTL policies for artifacts with the Python SDK or with the W\&B App UI. **W\&B Python SDK** Use a print statement to view an artifact's TTL policy. The following example shows how to retrieve an artifact and view its TTL policy: ```python theme={"system"} artifact = run.use_artifact("") print(artifact.ttl) ``` **W\&B App** View a TTL policy for an artifact with the W\&B App UI. 1. Navigate to the [W\&B App](https://forge.coreweave.com/wandb). 2. Navigate to your Weights & Biases project. 3. Within your project, select the Artifacts tab in the project sidebar. 4. Click on a collection. Within the collection view you can see all of the artifacts in the selected collection. Within the `Time to Live` column you will see the TTL policy assigned to that artifact. ![TTL collection view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/ttl_collection_panel_ui.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=78f8e93a527b3fb59d2fa9c74d842c6d) ## TTL policies for linked artifact versions Weights & Biases deactivates TTL policies for linked artifact versions to prevent artifacts used in production workflows from expiring. When you link an artifact version to a Registry collection, Weights & Biases deactivates its TTL policy and sets its TTL to `None`. If you later unlink the artifact version, Weights & Biases does not restore the previous TTL policy or its duration. Set a new TTL policy after unlinking if the artifact version still requires one. # Update an artifact Source: https://docs.coreweave.com/products/wandb/artifacts/update-an-artifact Update an existing artifact while a run is active or using only the Public API. Pass desired values to update the `description`, `metadata`, and `alias` of an artifact. Update a run previously logged to Weights & Biases with the W\&B Public API with ([`wandb.Api`](/products/wandb/ref/python/public-api/api)). Use `wandb.Run.save()` to update an artifact when is first initialized and still active. > [!NOTE] > > **When to use wandb.Artifact.save() or wandb.Run.log\_artifact()** > > * Use `Artifact.save()` to update an existing artifact without starting a new run. > * Use `wandb.Run.log_artifact()` to create a new artifact and associate it with a specific run. Use the W\&B Public API ([`wandb.Api`](/products/wandb/ref/python/public-api/api)) to update an artifact. Use the wandb.Artifact ([`wandb.Artifact`](/products/wandb/ref/python/experiments/artifact)) Class while a run is active. > [!WARNING] > > You can not update the alias of artifact linked to a model in Model Registry. **During a run** The following code example demonstrates how to update the description of an artifact using the [`wandb.Artifact`](/products/wandb/ref/python/experiments/artifact) API: ```python theme={"system"} import wandb with wandb.init(project="") as run: artifact = run.use_artifact(":") artifact.description = "" artifact.save() ``` **W\&B Public API** The following example updates an artifact with [`wandb.Api`](/products/wandb/ref/python/public-api/api): ```python theme={"system"} import wandb api = wandb.Api() artifact = api.artifact("entity/project/artifact:alias") # Update the description artifact.description = "My new description" # Selectively update metadata keys artifact.metadata["oldKey"] = "new value" # Replace the metadata entirely artifact.metadata = {"newKey": "new value"} # Add an alias artifact.aliases.append("best") # Remove an alias artifact.aliases.remove("latest") # Completely replace the aliases artifact.aliases = ["replaced"] # Persist all artifact modifications artifact.save() ``` For more information, see the Weights & Biases [Artifact API](/products/wandb/ref/python/experiments/artifact). **With collections** You can also update an Artifact collection in the same way as a singular artifact: ```python theme={"system"} import wandb with wandb.init(project="") as run: api = wandb.Api() artifact = api.artifact_collection(type="", collection="") artifact.name = "" artifact.description = "" artifact.save() ``` For more information, see the [Artifacts Collection](/products/wandb/ref/python/public-api/api) reference. # Automations overview Source: https://docs.coreweave.com/products/wandb/automations Use W&B Automations for triggering workflows based on events in Weights & Biases *Automations* send Slack notifications, run webhooks, or send prompts to ARIA in response to specific events in Weights & Biases. You can scope an automation to an organization, a team, project, registry, or collection. An automation observes the event across everything within its scope, including projects, registries, and collections created later. The steps to create an automation and the available events depend on the scope. For event types by scope, see [Automation events and scopes](/products/wandb/automations/automation-events). > [!NOTE] > > Team-scoped and Organization-scoped automations and the [Automations hub](#automations-hub) are available on W\&B Multi-tenant Cloud and on W\&B Dedicated Cloud (Server v0.83.0 and later). W\&B Automations follow this pattern: when an **event** occurs and optional **conditions** are met, an **action** runs automatically. For example: * When a run fails (event), notify a Slack channel (action). * When the `production` alias is added to an artifact (event), call a webhook to trigger deployment (action). * When a new model version is linked (event), send a prompt to ARIA to compare it against production (action). Events and available conditions differ for automations scoped to a [project](/products/wandb/automations/automation-events#project) or a [registry](/products/wandb/automations/automation-events#registry). See [Automation events and scopes](/products/wandb/automations/automation-events). ```mermaid theme={"system"} flowchart LR Event[Event] --> Condition[Condition] Condition --> Action[Action] ``` **Example:** Run fails (event) and optional run name filter (condition) then Slack notification (action). Or: alias `production` added (event) then webhook (action). ## Where to create automations * **In the Automations hub**: Select **Automations** in the left navigation to see every automation you can access across all scopes: organization, team, project, registry, or collection. You choose the scope when you create an automation. See [Automations hub](/products/wandb/automations#automations-hub). * **In a project**: Open the project, then select the **Automations** tab in the project sidebar. * **In a registry**: Open the registry, then select the **Automations** tab. ## Automations hub The **Automations** hub is a global surface in the left navigation that aggregates every automation you can access, across all scopes and projects, in a single list. Use it to discover, inspect, and manage automations without navigating to each project or registry. From the **Automations** hub, you can: * Create an automation and choose its scope, without needing to know the scoped entry point first. * View all automations you can access in one list, then filter and sort them (for example, by scope, trigger, or action). * Click an automation's name to view its full configuration details. * View an automation's [execution history](/products/wandb/automations/view-automation-history) to check whether it succeeded or failed. * Use the quick filter to switch between automations you created and all automations in your organization. * Select multiple automations and delete them at once. The **Automations** hub complements the **Automations** tab in each project and registry; those scoped tabs remain available for quick targeted access. ## Use cases * **Run monitoring and alerting**: Notify the team when a run fails or when a metric crosses a threshold (for example, loss goes to NaN or accuracy drops). * **Registry CI/CD**: When a new model version is linked or an alias (such as `staging` or `production`) is added, trigger a webhook to run tests or deploy. * **Project artifact workflows**: When a new artifact version is created or an alias is added in a project, run a downstream job or post to Slack. * **Automated analysis**: When a run fails or a new model version is linked, send a prompt to [ARIA](/products/aria) to diagnose the failure or compare the new version against production. For full event and scope details, see [Automation events and scopes](/products/wandb/automations/automation-events). ## Automation actions When an event triggers an automation, it can perform one of these actions: * **Slack notification**: Sends a message to a Slack channel with details about the triggering event. The message summarizes the event and includes a link to view more details in W\&B. * **Webhook**: Calls a webhook URL with a JSON payload containing information about the triggering event. Use webhooks to integrate with external systems such as CI/CD pipelines, model deployment services, or custom workflows. * **Trigger ARIA**: Sends a prompt to [ARIA](/products/aria), which starts a new conversation and works on the prompt on your behalf. Use ARIA actions to analyze a new model version, diagnose a failed run, or investigate a metric that crossed a threshold. Available on W\&B Multi-tenant Cloud only. For implementation details, see [Create a Slack automation](/products/wandb/automations/create-automations/slack), [Create a webhook automation](/products/wandb/automations/create-automations/webhook), or [Create an ARIA automation](/products/wandb/automations/create-automations/aria). ## How automations work To [create an automation](/products/wandb/automations/create-automations), you: 1. If required, configure [secrets](/products/wandb/platform/secrets) for sensitive strings the automation requires, such as access tokens, passwords, or sensitive configuration details. Secrets are defined in your **Team Settings**. Secrets are most commonly used in webhook automations to securely pass credentials or tokens to the webhook's external service without exposing it in plain text or hard-coding it in the webhook's payload. 2. Configure team-level webhook or Slack integrations to authorize Weights & Biases to post to Slack or run the webhook on your behalf. A single automation action (webhook or Slack notification) can be used by multiple automations. These actions are defined in your **Team Settings**. An ARIA action requires no integration. 3. In the project or registry, create the automation: 1. Define the [event](/products/wandb/automations/automation-events) to watch for, such as when a new artifact version is added. 2. Define the action to take when the event occurs, such as posting to a Slack channel, running a webhook, or sending a prompt to ARIA. For a webhook, specify a secret to use for the access token and/or a secret to send with the payload, if required. ## Recommendations * **Start small**: Begin with one or two automations for high-value events (for example, run failures or production alias changes). Validate that they work as expected before adding more. * **Test before production**: Create automations in a test project or with a test webhook or Slack channel first. Manually trigger the event, then confirm that the action runs and that the payload or message looks correct. * **Avoid alert fatigue**: Use run filters, metric thresholds, or alias patterns to limit how often an automation fires. If you have multiple severities, route them to different channels. ## Limitations * [Run metric automations](/products/wandb/automations/automation-events#run-metrics-change) and [run metrics z-score change automations](/products/wandb/automations/automation-events#run-metrics-z-score-change) are supported only in [Forge](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud) and [Dedicated Cloud](/products/wandb/platform/hosting/hosting-options/dedicated-cloud). * At the **Team** and **Organization** scopes, the W\&B App supports only artifact and collection events. Run-based events aren't available in the App at these scopes. See [Automation events and scopes](/products/wandb/automations/automation-events). ## Next steps * [Automations tutorial](/products/wandb/automations/tutorial): Guides you to create a project automation to alert on run failures and a Registry automation to run a webhook when an alias is added. The tutorial uses the W\&B App. * [Create an automation](/products/wandb/automations/create-automations). * [Automation events and scopes](/products/wandb/automations/automation-events). * [Create a secret](/products/wandb/platform/secrets). > [!NOTE] > > Looking for companion tutorials for automations? > > * [Learn to automatically trigger a Github Action for model evaluation and deployment](https://forge.coreweave.com/wandb/wandb/wandb-model-cicd/reports/Model-CI-CD-with-W-B--Vmlldzo0OTcwNDQw). > * [Watch a video demonstrating automatically deploying a model to a Sagemaker endpoint](https://www.youtube.com/watch?v=s5CMj_w3DaQ). > * [Watch a video series introducing automations](https://youtube.com/playlist?list=PLD80i8An1OEGECFPgY-HPCNjXgGu-qGO6\&feature=shared). # Overview Source: https://docs.coreweave.com/products/wandb/automations/create-automations Create and manage W&B automations to streamline your ML workflows This page shows how to create and manage [automations](/products/wandb/automations), which start in response to specific events in Weights & Biases. When a specific event occurs within an organization, team, project, registry, or collection, the automation notifies a Slack channel, runs a webhook, or sends a prompt to ARIA. Use this overview to understand the prerequisites and high-level workflow, then follow the detailed instructions in [Create a Slack automation](/products/wandb/automations/create-automations/slack), [Create a webhook automation](/products/wandb/automations/create-automations/webhook), or [Create an ARIA automation](/products/wandb/automations/create-automations/aria). > [!NOTE] > > Looking for companion tutorials for automations? > > * [Learn to automatically trigger a GitHub Action for model evaluation and deployment](https://forge.coreweave.com/wandb/wandb/wandb-model-cicd/reports/Model-CI-CD-with-W-B--Vmlldzo0OTcwNDQw). > * [Watch a video demonstrating automatically deploying a model to a SageMaker endpoint](https://www.youtube.com/watch?v=s5CMj_w3DaQ). > * [Watch a video series introducing automations](https://youtube.com/playlist?list=PLD80i8An1OEGECFPgY-HPCNjXgGu-qGO6\&feature=shared). ## Requirements When creating automations: * A team admin can create and manage automations for the team's projects, as well as components of their automations, such as webhooks, secrets, and Slack integrations. Refer to [Team settings](/products/wandb/platform/app/settings-page/teams). * To create a registry automation, you must have access to the registry. Refer to [Configure Registry access](/products/registry/configure_registry#registry-roles). * To create a Slack automation, you must have permission to post to the Slack instance and channel you select. ## Create an automation You can create an automation from the global **Automations** hub in the left navigation, from a project or registry's **Automations** tab, or directly from a line plot panel in the workspace. When you create an automation from the hub, you choose its scope (Organization, Team, Registry, Registry collection, or project). See [Automations hub](/products/wandb/automations#automations-hub). ### Create from the Automations tab At a high level, to create an automation from the **Automations** tab, follow these steps: 1. If necessary, [create a Forge secret](/products/wandb/platform/secrets) for each sensitive string required by the automation, such as an access token, password, or SSH key. Secrets let you reuse sensitive strings safely and keep them out of automation configurations. Define secrets in your **Team Settings**. Webhook automations most commonly use secrets. 2. Configure team-level webhook or Slack integrations to authorize Weights & Biases to post to Slack or run the webhook on your behalf. Multiple automations can use a single webhook or Slack integration. Define these actions in your **Team Settings**. 3. In the project or registry, create the automation, which specifies the event to watch for and the action to take (such as posting to Slack or running a webhook). When you create a webhook automation, you configure the payload it sends. After you complete these steps, the automation runs whenever the specified event occurs in the project or registry. ### Create a run metric automation from a workspace panel From a line plot in the workspace, you can also create a [run metric automation](/products/wandb/automations/automation-events#run-events) for the metric it shows: 1. Hover over the panel, then click the bell icon at the top of the panel. ![Automation bell icon location](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/run_metric_automation_from_panel.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=122de71b7adaba2a371fb0697b4662a0) 2. Configure the automation using the basic or advanced configuration controls. For example, apply a run filter to limit the scope of the automation, or configure an absolute threshold. For details, refer to: * [Create a Slack automation](/products/wandb/automations/create-automations/slack) * [Create a webhook automation](/products/wandb/automations/create-automations/webhook) * [Create an ARIA automation](/products/wandb/automations/create-automations/aria) ## View and manage automations View and manage automations from a project or registry's **Automations** tab: * To view an automation's details, click its name. * To view an automation's execution history (which actions ran and whether they succeeded), click its name and select the **History** tab. For more information, see [View an automation's history](/products/wandb/automations/view-automation-history). * To edit an automation, click its **action ()** menu, then click **Edit automation**. * To delete an automation, click its **action ()** menu, then click **Delete automation**. ## Go further For more information, see the following resources: * [Automations tutorials](/products/wandb/automations/tutorial): Build a [project run failure alert](/products/wandb/automations/project-automation-tutorial) or a [registry alias-to-webhook automation](/products/wandb/automations/registry-automation-tutorial) in the W\&B App. * [Automation events and scopes](/products/wandb/automations/automation-events). * [Create a Slack automation](/products/wandb/automations/create-automations/slack). * [Create a webhook automation](/products/wandb/automations/create-automations/webhook). * [Create an ARIA automation](/products/wandb/automations/create-automations/aria). * [Create a secret](/products/wandb/platform/secrets). # Use automations with ARIA Source: https://docs.coreweave.com/products/wandb/automations/create-automations/aria Create a W&B automation that sends a templated prompt to ARIA, starting a new conversation when a specific event occurs. Use a W\&B automation to send a prompt to ARIA when a specific event occurs. Each time the event occurs, the automation starts a new ARIA conversation and sends it the configured prompt. An automation that sends a prompt to ARIA consists of two main parts: * The [event](/products/wandb/automations/automation-events) that triggers the automation. * The prompt that ARIA receives when the event occurs. Use this workflow to explore experiment results, summarize or report on runs, or investigate metrics that cross a threshold. Sending a prompt to ARIA is one action that a W\&B automation can perform. To create automations that send notifications to other destinations, refer to [Create a Slack automation](/products/wandb/automations/create-automations/slack) or [Create a webhook automation](/products/wandb/automations/create-automations/webhook). You can also ask ARIA to create and manage W\&B automations on your behalf. For details, see [Create and manage automations with ARIA](#create-and-manage-automations-with-aria). > [!NOTE] > > Available only in [W\&B Multi-tenant Cloud](/products/wandb/platform/hosting#wb-multi-tenant-cloud). > > ARIA works in team projects, not in your personal entity. Your organization admin must also enable **Smart features**. See [Governance and security](/products/aria/governance). ## Requirements Before you create an automation that sends a prompt to ARIA, verify the following: * Your organization must have ARIA enabled. If **Trigger ARIA** doesn't appear in the **Action type** list, ARIA isn't available for your organization, scope, or deployment. The list omits the option without explanation. See [Governance and security](/products/aria/governance). * You must have write access to the project, registry, or collection you scope the automation to. * To scope a W\&B automation to a registry and send prompts to ARIA, you must belong to a team in the same organization. Each ARIA conversation is associated with a team, so you can't create a registry-scoped automation if you don't belong to a team in that organization. Each time an ARIA automation runs, it starts an ARIA conversation that counts toward your organization's usage, the same as a conversation you start yourself. ## Create an automation Select **Registry** or **Project** based on the scope you want the automation to apply to. Then follow these steps to create an automation that sends a prompt to ARIA. > [!NOTE] > > To apply an automation more broadly, create it from the global **Automations** hub and select the **Team** or **Organization** scope. The steps are the same as those that follow. At these scopes, Weights & Biases supports artifact and collection events only. See [Automations hub](/products/wandb/automations#automations-hub). **Registry** A Registry admin can create automations in that registry. 1. Navigate to Registry. 2. Select a registry to view its details. 3. To create an automation scoped to the registry, click the **Automations** tab, then click **Create automation**. An automation that is scoped to a registry is automatically applied to all of its collections (including those created in the future). 4. Choose the [event](/products/wandb/automations/automation-events#registry-events) to watch for. Fill in any additional fields that appear, which depend upon the event. For example, if you select **An artifact alias is added**, you must specify the **Alias regex**. Click **Next step**. 5. Select the team that hosts the ARIA conversation. Registries belong to your organization, not a team, but ARIA conversations must belong to one. See [View conversations created by automations](#view-conversations-created-by-automations). 6. Set **Action type** to **Trigger ARIA**. 7. In the **Prompt** field, write the prompt to send to ARIA. See [Write the prompt](#write-the-prompt). Click **Next step**. 8. Provide a name for the automation. Optionally, provide a description. 9. Click **Create automation**. The automation is now active and starts a new ARIA conversation whenever the chosen event occurs in the registry. **Project** An administrator can create automations in a project. 1. Navigate to Weights & Biases. 2. Go to the project page and click the **Automations** tab, then click **Create automation**. 3. Choose the [event](/products/wandb/automations/automation-events#project) to watch for. 1. Fill in any additional fields that appear. For example, if you select **An artifact alias is added**, you must specify the **Alias regex**. 1. For automations triggered by a run, optionally specify one or more run filters: * **Filter to one user's runs**: Include only runs created by the specified user. Click the toggle to turn on the filter, then specify a username. * **Filter on run name**: Include only runs whose names match the given regular expression. Click the toggle to turn on the filter, then specify a regular expression. 2. Click **Next step**. 4. Select the team that owns the project. 5. Set **Action type** to **Trigger ARIA**. 6. In the **Prompt** field, write the prompt to send to ARIA. See [Write the prompt](#write-the-prompt). Click **Next step**. 7. Provide a name for the automation. Optionally, provide a description. 8. Click **Create automation**. The automation is now active and starts a new ARIA conversation whenever the chosen event occurs in the project. ## Create and manage automations with ARIA ARIA can create, delete, enable, and disable automations on demand. Ask ARIA to create an automation: Create a new automation: When a run succeeds, trigger ARIA to write a report for your team that summarizes the run, metrics, and outcome. Copy user prompt I can create an enabled project-wide automation named **Summarize successful run**. It will fire whenever any run reaches `FINISHED` and ask ARIA to write a report to summarize the run's configuration, key metrics, outcome, and notable observations. Ask ARIA about your existing automations: What automations exist in this project? Copy user prompt You have 2 project-level automations, both enabled.... Ask ARIA to rename an automation: Rename old-name to production-alert. Copy user prompt Proceed with the rename? After you confirm, ARIA renames the automation. ### View your ARIA automations in chat Open ARIA, click **Reveal chat history** in the chat header, then open the **Customize** section at the bottom of the chat history sidebar and select **My automations**. **My automations** replaces the conversation view in ARIA's main panel rather than opening beside it. Selecting a conversation or starting a new chat returns you to the conversation. The pane isn't persisted across reloads, so refreshing the page also returns you to your conversation. The pane lists only the automations you created that send prompts to ARIA. It omits automations that use other actions, and your teammates' ARIA automations. The pane is read-only. You can see whether an automation is enabled or disabled, but to enable, disable, edit, or delete one, click **View all automations** to open the full Automations page in a new tab. See [View and manage automations](#view-and-manage-automations). Search by name, or page through results 20 at a time with **Previous** and **Next**. The list shows each automation's name, **Event type**, and **Scope**. Click an automation to open its detail view, which shows its **Description**, **Scope**, **Created by**, **Created**, **Status** (**Enabled** or **Disabled**), **Event type**, and the **Prompt ARIA** it sends. The **Automation history** section lists each execution's **Triggered** time and **Status**, plus a **Conversation** column. Click **Open thread** to open the conversation an execution created. A **No thread** value means the execution didn't create one. Executions are shown for up to 6 months. Use **Back to chat** or **Back to My automations** to return from the list or a detail view. Click **Create automation** to start one. This doesn't open a form. Instead, it starts a new ARIA chat with the following prompt already sent on your behalf: Guide me through creating an automation that prompts ARIA. Ask what I want to automate, help me choose its scope and trigger, and draft the prompt with me. Copy user prompt Happy to help. What event should trigger this, and should the automation live in a project or a registry? Once we settle that, I'll help you word the prompt. **Create automation** is disabled if you have read-only billing access. **My automations** isn't available for personal accounts. Select an organization to view your automations. The pane requires no separate feature flag. It's available under the same access checks described in [Requirements](#requirements). ## Write the prompt The prompt is the only thing you configure for an ARIA action. Write it the way you would write a message in the ARIA chat window, and include [template variables](#template-variables) to specify which run, artifact, or metric ARIA should examine. Keep the following constraints in mind: * A prompt is required and can be at most 4,000 characters. Weights & Biases checks the length again after it substitutes template variables, so a prompt that saves successfully can still fail when the automation runs if the substituted values are long. A prompt that fails this check is recorded as a failed execution in the automation's [execution history](/products/wandb/automations/view-automation-history). * A template variable that doesn't apply to the event resolves to an empty string rather than to its own name. Use only the variables listed for your event. * ARIA starts a new conversation each time the automation runs. It doesn't continue a previous conversation and doesn't remember earlier executions of the same automation. To insert a variable, click the **** next to it in the list below the **Prompt** field. Weights & Biases appends the variable to the end of the prompt. The list shows only the variables that apply to the event you selected. For example, this prompt investigates each newly linked model version: ```text theme={"system"} A new version of ${artifact_collection_name} was just linked to ${project_name} by ${event_author}. Compare ${artifact_version_string} against the current production alias. Summarize any regression in the evaluation metrics and recommend whether to promote it. ``` You can ask ARIA to help you word a prompt before you save the automation: I want an automation that runs whenever a run fails in this project. Draft a prompt that asks you to diagnose the failure. Copy user prompt Here's a prompt to paste into the automation: 'Run $\{run_name\} in $\{project\_name} just failed. Look at its logs, config, and system metrics, compare it to the last few successful runs, and tell me the most likely cause plus one concrete fix to try.' ## Template variables Template variables use the syntax `${variable_name}`. The variables available to a prompt depend on the event the automation watches for. The following variables are available for every event: | Variable | Description | | - | - | | `${automation_name}` | The name of the automation that triggered the action. | | `${event_type}` | The type of event that triggered the action. | | `${event_author}` | The user that triggered the action. | | `${entity_name}` | The name of the entity owning the event that triggered the action. | | `${project_name}` | The name of the project owning the event that triggered the action. | The following variables are available in addition to the preceding ones, depending on the event: | Event | Additional variables | | - | - | | An artifact version is created, linked, or unlinked | `${artifact_collection_name}`, `${artifact_version}`, `${artifact_version_string}`, `${artifact_version_index}`, `${artifact_metadata.KEY}` | | An artifact alias is added or updated | The preceding artifact variables, plus `${alias}` | | An artifact tag is added or removed | The preceding artifact variables, plus `${tag}` | | A collection tag is added or removed | `${artifact_collection_name}`, `${tag}` | | A run metric crosses a threshold, changes, or changes by z-score | `${run_name}`, `${metric_name}`, `${metric_values}`, `${metric_filter}`, `${metric_filter_short}`, `${metric_current_status}` | | A run changes status | `${run_name}`, `${run_status}` | | A Weave metric crosses a threshold | `${alert_name}`, `${metric_name}`, `${metric_value}`, `${threshold}`, `${comparison_op}`, `${message}` | The following notes apply to individual variables: * `${artifact_version}` resolves to an artifact instance, such as `wandb-artifact://_id/QXJ0aWZhY3Q6NTE3ODg5ODg3`. To refer to the version by name, use `${artifact_version_string}`. * `${artifact_metadata.KEY}` reads a custom metadata value from the artifact version that triggered the event. Replace `KEY` with the metadata key you want. Only top-level metadata keys are supported. For the events available at each scope, see [Automation events and scopes](/products/wandb/automations/automation-events). ## View conversations created by automations The automation creates the ARIA conversation under the account of the user who created the automation. The conversation appears in that person's ARIA chat history sidebar, alongside conversations they started themselves. To identify the user that caused the event, include `${event_author}` in the prompt. Where the conversation lives depends on the automation's scope: * **Project-scoped and team-scoped automations**: The conversation is created in the project where the event occurred. * **Registry-scoped automations**: A registry belongs to your organization rather than to a team, and ARIA conversations must belong to a team. The conversation is created in the team you selected when you created the automation, in a project named `wandb_agent_default_project`. Look there rather than in the registry. `wandb_agent_default_project` is a placeholder project that Weights & Biases maintains for each team to hold conversations that aren't tied to a project you opened. You don't create it, and it's normally empty apart from these conversations. To confirm that the automation ran, open its [execution history](/products/wandb/automations/view-automation-history). A successful ARIA execution shows the prompt that Weights & Biases sent and a response body containing the conversation's `thread_id`. To open that conversation, use the **Open thread** link in ARIA's [My automations](#view-your-aria-automations-in-chat) pane, which is built from the same `thread_id`. An automation-created conversation isn't marked differently in your chat history. ## View and manage automations View and manage automations from the **Automations** tab in a project or registry, or from the global **Automations** hub. In the automations list, the action displays as **ARIA**. Only the creator of an automation that sends prompts to ARIA can edit it because the ARIA conversation runs as that user. Team members with write access to the project or registry can view and delete the automation, but the **Edit** automation option is unavailable to them. You can't transfer ownership of the automation. Instead, delete it and have the new owner create it again. Use the same process to recover an automation whose creator has left the team. ## Limitations ARIA automations have the following limitations: * ARIA automations are available only on [Forge](/products/wandb/platform/hosting/hosting-options/multi_tenant_cloud), in team projects, and only when your organization admin has enabled **Smart features**. * Each automation can start at most three ARIA conversations per minute. Weights & Biases records executions above that limit in the automation's history with the status **Skipped**, meaning the automation matched the event but didn't run its action. * If the person who created the automation loses write access to the project or their account is deactivated, every subsequent execution fails. The failure appears in the automation's execution history. * Only the automation's creator can edit it. * The `wandb` Python library doesn't support ARIA automations. See [Manage automations with the API](/products/wandb/automations/api). * The in-chat [My automations](#view-your-aria-automations-in-chat) pane is read-only. Enable, disable, edit, or delete an automation from the **Automations** tab or hub instead. ## Next steps Continue with the following resources: * [Automation events and scopes](/products/wandb/automations/automation-events) * [View an automation's history](/products/wandb/automations/view-automation-history) * [Chat with ARIA](/products/aria/chat) * [ARIA overview](/products/aria) # Create a Slack automation Source: https://docs.coreweave.com/products/wandb/automations/create-automations/slack Set up a Slack integration and create a W&B Automation that sends notifications to a Slack channel on specific events. This page shows how to create a Slack [automation](/products/wandb/automations) so that your team receives notifications in a Slack channel when specific events occur in Weights & Biases. Example events include a new model version or a run reaching a metric threshold. To create a webhook automation instead, refer to [Create a webhook automation](/products/wandb/automations/create-automations/webhook). At a high level, to create a Slack automation, you take these steps: 1. [Add a Slack integration](#add-a-slack-integration), which authorizes Weights & Biases to post to the Slack instance and channel. 2. [Create the automation](#create-an-automation), which defines the [event](/products/wandb/automations/automation-events) to watch for and the channel to notify. ## Add a Slack integration A team admin can add a Slack integration to the team. 1. Log in to CoreWeave Forge and go to **Team Settings**. 2. In the **Slack channel integrations** section, click **Connect Slack** to add a new Slack instance. To add a channel for an existing Slack instance, click **New integration**. ![Two Slack integrations in a Team](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/slack_integrations.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=7ccc8243ba2d61b4a27e7f0b43d37691) 3. If necessary, sign in to Slack in your browser. When prompted, grant Weights & Biases permission to post to the Slack channel you select. Read the page, then click **Search for a channel** and begin typing the channel name. Select the channel from the list, then click **Allow**. 4. In Slack, go to the channel you selected. If you see a post like `[YOUR-SLACK-HANDLE] added an integration to this channel: Weights & Biases`, where `[YOUR-SLACK-HANDLE]` is your Slack username, the integration is configured correctly. Now you can [create an automation](#create-an-automation) that notifies the Slack channel you configured. ## View and manage Slack integrations A team admin can view and manage the team's Slack instances and channels. 1. Log in to CoreWeave Forge and go to **Team Settings**. 2. View each Slack destination in the **Slack channel integrations** section. 3. Delete a destination by clicking its trash icon. ## Create an automation After you [add a Slack integration](#add-a-slack-integration), you can create an automation that uses it to send notifications. Select **Registry** or **Project** based on the scope you want the automation to apply to. Then follow these steps to create an automation that notifies the Slack channel. > [!NOTE] > > To apply an automation more broadly, create it from the global **Automations** hub and select the **Team** or **Organization** scope. The steps are the same as those that follow. At these scopes, the W\&B App supports artifact and collection events only. See [Automations hub](/products/wandb/automations#automations-hub). **Registry** A Registry admin can create automations in that registry. 1. Navigate to Registry. 2. Click the name of a registry to view its details. 3. To create an automation scoped to the registry, click the **Automations** tab, then click **Create automation**. An automation that is scoped to a registry is automatically applied to all of its collections (including those created in the future). 4. Choose the [event](/products/wandb/automations/automation-events#registry-events) to watch for. Fill in any additional fields that appear, which depend upon the event. For example, if you select **An artifact alias is added**, you must specify the **Alias regex**. Click **Next step**. 5. Select the team that owns the [Slack integration](#add-a-slack-integration). 6. Set **Action type** to **Slack notification**. Select the Slack channel, then click **Next step**. 7. Provide a name for the automation. Optionally, provide a description. 8. Click **Create automation**. The automation is now active and notifies the selected Slack channel whenever the chosen event occurs in the registry. **Project** A Weights & Biases admin can create automations in a project. 1. Log in to CoreWeave Forge. 2. Go to the project page and click the **Automations** tab, then click **Create automation**. Or, directly from a line plot in the workspace, you can create a [run metric automation](/products/wandb/automations/automation-events#run-events) for the metric it shows. Hover over the panel, then click the bell icon at the top of the panel. ![Automation bell icon location](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/run_metric_automation_from_panel.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=122de71b7adaba2a371fb0697b4662a0) 3. Choose the [event](/products/wandb/automations/automation-events#project) to watch for. 1. Fill in any additional fields that appear. For example, if you select **An artifact alias is added**, you must specify the **Alias regex**. 1. For automations triggered by a run, optionally specify one or more run filters: * **Filter to one user's runs**: Include only runs created by the specified user. Click the toggle to turn on the filter, then specify a username. * **Filter on run name**: Include only runs whose names match the given regular expression. Click the toggle to turn on the filter, then specify a regular expression. 2. Click **Next step**. 4. Select the team that owns the [Slack integration](#add-a-slack-integration). 5. Set **Action type** to **Slack notification**. Select the Slack channel, then click **Next step**. 6. Provide a name for the automation. Optionally, provide a description. 7. Click **Create automation**. The automation is now active and notifies the selected Slack channel whenever the chosen event occurs in the project. ## View and manage automations **Registry** Manage the registry's automations from the registry's **Automations** tab: * To view an automation's details, click its name. * To edit an automation, click its **action ()** menu, then click **Edit automation**. * To delete an automation, click its **action ()** menu, then click **Delete automation**. Confirmation is required. **Project** An administrator can view and manage a project's automations from the project's **Automations** tab. * To view an automation's details, click its name. * To edit an automation, click its **action ()** menu, then click **Edit automation**. * To delete an automation, click its **action ()** menu, then click **Delete automation**. Confirmation is required. # Create a webhook automation Source: https://docs.coreweave.com/products/wandb/automations/create-automations/webhook Create a webhook automation in Weights & Biases to send HTTP requests to external services when specific events occur. This page shows how to create a webhook [automation](/products/wandb/automations), which sends an HTTP request to an external service when a specific event occurs in Weights & Biases. Use a webhook automation to integrate Weights & Biases with external systems such as CI/CD pipelines, notification services, or custom tooling. To create a Slack automation, refer to [Create a Slack automation](/products/wandb/automations/create-automations/slack) instead. At a high level, to create a webhook automation, you take these steps: 1. If necessary, [create a Weights & Biases secret](/products/wandb/platform/secrets) for each sensitive string required by the automation, such as an access token, password, or SSH key. Secrets are defined in your **Team Settings**. 2. [Create a webhook](#create-a-webhook) to define the endpoint and authorization details and grant the integration access to any secrets it needs. 3. [Create the automation](#create-an-automation) to define the [event](/products/wandb/automations/automation-events) to watch for and the payload Weights & Biases sends. Grant the automation access to any secrets it needs for the payload. ## Create a webhook A team admin can add a webhook for the team. The webhook defines the endpoint Weights & Biases sends requests to and any credentials required to authenticate with it. > [!NOTE] > > If the webhook requires a Bearer token or its payload requires a sensitive string, [create a secret that contains it](/products/wandb/platform/secrets#add-a-secret) before creating the webhook. You can configure at most one access token and one other secret for a webhook. The webhook's service determines your webhook's authentication and authorization requirements. 1. Log in to CoreWeave Forge and go to the **Team Settings** page. 2. In the **Webhooks** section, click **New webhook**. 3. Provide a name for the webhook. 4. Provide the endpoint URL of the webhook. 5. If the webhook requires a Bearer token, set **Access token** to the [secret](/products/wandb/platform/secrets) that contains it. When using the webhook automation, Weights & Biases sets the `Authorization: Bearer` HTTP header to the access token, and you can access the token in the `${ACCESS_TOKEN}` [payload variable](#payload-variables). For more information about the structure of the `POST` request Weights & Biases sends to the webhook service, see [Troubleshoot your webhook](#troubleshoot-your-webhook). 6. If the webhook requires a password or other sensitive string in its payload, set **Secret** to the secret that contains it. When you configure the automation that uses the webhook, you can access the secret as a [payload variable](#payload-variables) by prefixing its name with `$`. If the webhook's access token is stored in a secret, you must *also* complete the next step to specify the secret as the access token. 7. To verify that Weights & Biases can connect and authenticate to the endpoint: 1. Optionally, provide a payload to test. To refer to a secret the webhook has access to in the payload, prefix its name with `$`. Weights & Biases uses this payload only for testing and doesn't save it. You configure an automation's payload when you [create the automation](#create-an-automation). For more information about where the secret and access token appear in the `POST` request, see [Troubleshoot your webhook](#troubleshoot-your-webhook). 2. Click **Test**. Weights & Biases attempts to connect to the webhook's endpoint using the credentials you configured. If you provided a payload, Weights & Biases sends it. If the test doesn't succeed, verify the webhook's configuration and try again. If necessary, refer to [Troubleshoot your webhook](#troubleshoot-your-webhook). ![Screenshot showing two webhooks in a Team](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/webhooks.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=1607f84f87713463eacbae31c0fe01ff) Now you can [create an automation](#create-an-automation) that uses the webhook. ## Create an automation After you [configure a webhook](#create-a-webhook), create an automation that defines which Weights & Biases event triggers the webhook and what payload to send. Select **Registry** or **Project** depending on the scope you want, then follow these steps to create an automation that triggers the webhook. > [!NOTE] > > To apply an automation more broadly, create it from the global **Automations** hub and select the **Team** or **Organization** scope. The steps are the same as those that follow. At these scopes, the W\&B App supports artifact and collection events only. See [Automations hub](/products/wandb/automations#automations-hub). **Registry** A Registry admin can create automations in that registry. Registry automations apply to all collections in the registry, including those added in the future. 1. Navigate to Registry. 2. Click the name of a registry to view its details. 3. To create an automation scoped to the registry, click the **Automations** tab, then click **Create automation**. 4. Choose the [event](/products/wandb/automations/automation-events#registry-events) to watch for. Fill in any additional fields that appear. For example, if you select **An artifact alias is added**, you must specify the **Alias regex**. Click **Next step**. 5. Select the team that owns the [webhook](#create-a-webhook). 6. Set **Action type** to **Webhooks**. Then select the [webhook](#create-a-webhook) to use. 7. If you configured an access token for the webhook, you can access the token in the `${ACCESS_TOKEN}` [payload variable](#payload-variables). If you configured a secret for the webhook, you can access it in the payload by prefixing its name with `$`. The webhook's service determines your webhook's requirements. 8. Click **Next step**. 9. Provide a name for the automation. Optionally, provide a description. Click **Create automation**. **Project** An administrator can create automations in a project. 1. Navigate to Weights & Biases and select a project. 2. In the project sidebar, click **Automations**, then click **Create automation**. Or, from a line plot in the workspace, you can quickly create a [run metric automation](/products/wandb/automations/automation-events#run-events) for the metric it shows. Hover over the panel, then click the bell icon at the top of the panel. ![Automation bell icon location](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/run_metric_automation_from_panel.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=122de71b7adaba2a371fb0697b4662a0) 3. Choose the [event](/products/wandb/automations/automation-events#project) to watch for, such as when an artifact alias is added or when a run metric meets a given threshold. 1. Fill in any additional fields that appear, which depend upon the event. For example, if you select **An artifact alias is added**, you must specify the **Alias regex**. 1. For automations triggered by a run, optionally specify one or more run filters. * **Filter to one user's runs**: Include only runs created by the specified user. Click the toggle to turn on the filter, then specify a username. * **Filter on run name**: Include only runs whose names match the given regular expression. Click the toggle to turn on the filter, then specify a regular expression. The automation applies to all collections in the project, including those added in the future. 2. Click **Next step**. 4. Select the team that owns the [webhook](#create-a-webhook). 5. Set **Action type** to **Webhooks**. Then select the [webhook](#create-a-webhook) to use. 6. If your webhook requires a payload, construct it and paste it into the **Payload** field. If you configured an access token for the webhook, you can access the token in the `${ACCESS_TOKEN}` [payload variable](#payload-variables). If you configured a secret for the webhook, you can access it in the payload by prefixing its name with `$`. The webhook's service determines your webhook's requirements. 7. Click **Next step**. 8. Provide a name for the automation. Optionally, provide a description. Click **Create automation**. After you complete these steps, the automation is active and runs the webhook whenever the specified event occurs in the registry or project. ## View and manage automations Review, edit, or delete an automation from the **Automations** tab. **Registry** Manage a registry's automations from the registry's **Automations** tab. * To view an automation's details, click its name. * To edit an automation, click its **action ()** menu, then click **Edit automation**. * To delete an automation, click its **action ()** menu, then click **Delete automation**. Weights & Biases prompts you to confirm. **Project** An administrator can view and manage a project's automations from the project's **Automations** tab. * To view an automation's details, click its name. * To edit an automation, click its **action ()** menu, then click **Edit automation**. * To delete an automation, click its **action ()** menu, then click **Delete automation**. Weights & Biases prompts you to confirm. ## Payload reference Use these sections to construct your webhook's payload. The following sections describe the variables available to your payload and show example payloads for common services. For details about testing your webhook and its payload, refer to [Troubleshoot your webhook](#troubleshoot-your-webhook). ### Payload variables The following table describes the variables you can use to construct your webhook's payload. | Variable | Details | | - | - | | `${project_name}` | The name of the project that owns the mutation that triggered the action. | | `${entity_name}` | The name of the entity or team that owns the mutation that triggered the action. | | `${event_type}` | The type of event that triggered the action. | | `${event_author}` | The user that triggered the action. | | `${alias}` | Contains an artifact's alias if the automation is triggered by the **An artifact alias is added** event. For other automations, this variable is blank. | | `${tag}` | Contains an artifact's tags if the automation is triggered by the **An artifact tag is added** event. For other automations, this variable is blank. | | `${artifact_collection_name}` | The name of the artifact collection that the artifact version is linked to. | | `${artifact_metadata.}` | The value of an arbitrary top-level metadata key from the artifact version that triggered the action. Replace `` with the name of a top-level metadata key. Only top-level metadata keys are available in the webhook's payload. | | `${artifact_version}` | The [`Wandb.Artifact`](/products/wandb/ref/python/experiments/artifact) representation of the artifact version that triggered the action. | | `${artifact_version_string}` | The `string` representation of the artifact version that triggered the action. | | `${ACCESS_TOKEN}` | The value of the access token configured in the [webhook](#create-a-webhook), if you configured an access token. Weights & Biases automatically passes it in the `Authorization: Bearer` HTTP header. | | `${SECRET_NAME}` | If configured, the value of a secret configured in the [webhook](#create-a-webhook). Replace `SECRET_NAME` with the name of the secret. | ### Payload examples The following examples show webhook payloads for common use cases. The examples demonstrate how to use [payload variables](#payload-variables). **GitHub repository dispatch** > [!NOTE] > > Verify that your access tokens have the required set of permissions to trigger your GitHub Actions workflow. For more information, see the [GitHub repository dispatch event documentation](https://docs.github.com/en/rest/repos/repos?#create-a-repository-dispatch-event). Send a repository dispatch from Weights & Biases to trigger a GitHub action. For example, suppose you have a GitHub workflow file that accepts a repository dispatch as a trigger for the `on` key: ```yaml theme={"system"} on: repository_dispatch: types: BUILD_AND_DEPLOY ``` The payload for the repository might look something like: ```json theme={"system"} { "event_type": "BUILD_AND_DEPLOY", "client_payload": { "event_author": "${event_author}", "artifact_version": "${artifact_version}", "artifact_version_string": "${artifact_version_string}", "artifact_collection_name": "${artifact_collection_name}", "project_name": "${project_name}", "entity_name": "${entity_name}" } } ``` > [!NOTE] > > The `event_type` key in the webhook payload must match the `types` field in the GitHub workflow YAML file. The contents and positioning of rendered template strings depend on the event or model version you configured the automation for. `${event_type}` renders as either `LINK_ARTIFACT` or `ADD_ARTIFACT_ALIAS`. The following shows an example mapping: ```text theme={"system"} ${event_type} --> "LINK_ARTIFACT" or "ADD_ARTIFACT_ALIAS" ${event_author} --> "" ${artifact_version} --> "wandb-artifact://_id/QXJ0aWZhY3Q6NTE3ODg5ODg3" ${artifact_version_string} --> "/model-registry/:" ${artifact_collection_name} --> "" ${project_name} --> "model-registry" ${entity_name} --> "" ``` Use template strings to dynamically pass context from Weights & Biases to GitHub Actions and other tools. If those tools can call Python scripts, they can consume the registered model artifacts through the [W\&B API](/products/wandb/artifacts/download-and-use-an-artifact). For more information, see the following resources: * For more information about repository dispatch, see the [official documentation on the GitHub Marketplace](https://github.com/marketplace/actions/repository-dispatch). * Watch the videos [Webhook Automations for Model Evaluation](https://www.youtube.com/watch?v=7j-Mtbo-E74\&ab_channel=Weights%26Biases) and [Webhook Automations for Model Deployment](https://www.youtube.com/watch?v=g5UiAFjM2nA\&ab_channel=Weights%26Biases), which guide you to create automations for model evaluation and deployment. * Review the W\&B report [Model CI/CD with Weights & Biases](https://forge.coreweave.com/wandb/wandb/wandb-model-cicd/reports/Model-CI-CD-with-W-B--Vmlldzo0OTcwNDQw), which illustrates how to use a GitHub Actions webhook automation for model CI. * For an example of model CI with a Modal Labs webhook, see the [wandb-modal-webhook GitHub repository](https://github.com/hamelsmu/wandb-modal-webhook). **Microsoft Teams notification** This example payload shows how to notify your Teams channel using a webhook: ```json theme={"system"} { "@type": "MessageCard", "@context": "http://schema.org/extensions", "summary": "New Notification", "sections": [ { "activityTitle": "Notification from WANDB", "text": "This is an example message sent via Teams webhook.", "facts": [ { "name": "Author", "value": "${event_author}" }, { "name": "Event Type", "value": "${event_type}" } ], "markdown": true } ] } ``` You can use template strings to inject Weights & Biases data into your payload at the time of execution. See the [Teams example](#microsoft-teams-notification). **Slack notifications** > [!NOTE] > > This section is provided for historical purposes. If you use a webhook to integrate with Slack, Weights & Biases recommends that you update your configuration to use the [Slack integration](/products/wandb/automations/create-automations/slack) instead. Set up your Slack app and add an incoming webhook integration by following the instructions in the [Slack API documentation](https://api.slack.com/messaging/webhooks). Ensure that you have the secret specified under `Bot User OAuth Token` as your Weights & Biases webhook's access token. The following is an example payload: ```json theme={"system"} { "text": "New alert from WANDB!", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "Registry event: ${event_type}" } }, { "type":"section", "text": { "type": "mrkdwn", "text": "New version: ${artifact_version_string}" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": "Author: ${event_author}" } } ] } ``` ## Troubleshoot your webhook If a webhook isn't working as expected, you can troubleshoot it interactively with the W\&B App UI or programmatically with a shell script. You can troubleshoot a webhook during creation or afterward. For details about the format Weights & Biases uses for the `POST` request, refer to the **Shell script** tab. **W\&B App UI** A team admin can test a webhook interactively with the W\&B App UI. 1. Go to your team page, then click **Settings**. 2. Scroll to the **Webhooks** section. 3. Click the **action ()** menu next to the name of your webhook. 4. Select **Test**. 5. From the UI panel that appears, paste your `POST` request into the field that appears. ![Demo of testing a webhook payload](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/webhook_ui.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=e675758e82251cd4b5275210b6e414db) 6. Click **Test webhook**. Within the W\&B App UI, Weights & Biases posts the response from your endpoint. ![Demo of testing a webhook](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/webhook_ui_testing.gif?s=e93752b2105a0278f94163e62062a729) Watch the video [Testing Webhooks in Weights & Biases](https://www.youtube.com/watch?v=bl44fDpMGJw\&ab_channel=Weights%26Biases) for a demonstration. **Shell script** This shell script shows one method to generate a `POST` request similar to the request Weights & Biases sends to your webhook automation when it's triggered. Copy and paste the following code into a shell script to troubleshoot your webhook. Specify your own values for: * `ACCESS_TOKEN` * `SECRET` * `PAYLOAD` * `API_ENDPOINT` ```bash webhook_test.sh theme={"system"} #!/bin/bash # Your access token and secret ACCESS_TOKEN="your_api_key" SECRET="your_api_secret" # URL of your webhook endpoint API_ENDPOINT="https://your.webhook.endpoint/path" # The data you want to send (for example, in JSON format) PAYLOAD='{"key1": "value1", "key2": "value2"}' # Generate the HMAC signature. For security, W&B includes the # X-Wandb-Signature header computed from the payload and the shared secret # associated with the webhook using HMAC with SHA-256. SIGNATURE=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}') # Make the cURL request curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "X-Wandb-Signature: $SIGNATURE" \ -d "$PAYLOAD" "$API_ENDPOINT" ``` # Tutorial: Project run-failure alert automation Source: https://docs.coreweave.com/products/wandb/automations/project-automation-tutorial Build a run-failure alert that sends a Slack notification when a run in your project fails. This tutorial walks you through building a **project** automation triggered by run status: when a run in your project transitions to **Failed**, Weights & Biases sends a Slack notification. This automation lets your team learn about failed runs in real time, so you can investigate and remediate them instead of discovering failures later. ```mermaid theme={"system"} %%{init: {'flowchart': {'rankSpacing': 200;}}}%% flowchart LR Event[Run state change to Failed] Action[Slack notification] Event --> Action ``` > [!TIP] > > For guidance creating a Registry automation, see [Tutorial: Registry artifact alias automation](/products/wandb/automations/registry-automation-tutorial). ## Prerequisites * A Weights & Biases project. * A [Slack integration](/products/wandb/automations/create-automations/slack#add-a-slack-integration) configured in **Team Settings**. ## Create a project automation Set up a project-scoped automation so that when a run in the project transitions to **Failed**, Weights & Biases sends a Slack notification. 1. Open the project and click the **Automations** tab in the sidebar, then click **Create automation**. 2. Choose the event **Run state change**. Set the state to **Failed**. Optionally add a run name or user filter to limit which runs trigger the automation. 3. Click **Next step**. Set **Action type** to **Slack notification** and select the Slack channel. 4. Click **Next step**. Give the automation a name (for example, "Run failure alert") and an optional description, then click **Create automation**. Your project now has an active automation that posts to the Slack channel you selected when a run fails. For more detail, see [Create a Slack automation](/products/wandb/automations/create-automations/slack#create-an-automation) (Project tab). ## Test the automation To confirm the automation is configured correctly, trigger it with a deliberately failed run. Create a run and log it to the project, explicitly marking it as failed: ```python theme={"system"} import wandb with wandb.init(project="my-project") as run: run.log({"loss": 1.23}) run.finish(exit_code=1) ``` Shortly after, you see a Slack message with the run link and status. ## Go further To learn more about W\&B automations beyond what this tutorial covers, see the following resources: * [Automation events and scopes](/products/wandb/automations/automation-events) for all project and registry event types. * [Create a Slack automation](/products/wandb/automations/create-automations/slack) and [Create a webhook automation](/products/wandb/automations/create-automations/webhook) for full UI and payload details. # Tutorial: Registry artifact alias automation Source: https://docs.coreweave.com/products/wandb/automations/registry-automation-tutorial Build an automation that runs a webhook when a Registry artifact gets a specific alias like "production". This tutorial walks you through building a **registry** automation triggered by artifact metadata: when an artifact in your registry gets a specific alias (for example, **production**), Weights & Biases sends a `POST` request to your webhook. Use this pattern to notify downstream systems like deployment pipelines, paging services, or notification channels, whenever you promote a model to a known stage. This tutorial is intended for ML engineers and MLOps practitioners who manage model lifecycles in Registry. ```mermaid theme={"system"} flowchart LR Event[Artifact alias added] Action[Webhook] Event --> Action ``` > [!TIP] > > For guidance creating a project automation, see [Tutorial: Project run-failure alert automation](/products/wandb/automations/project-automation-tutorial). ## Prerequisites * A [webhook](/products/wandb/automations/create-automations/webhook#create-a-webhook) configured in **Team Settings**. * A [Registry](/products/registry/create_registry) with at least one collection, or reuse an existing registry. ## Create a registry automation Set up a registry-scoped automation so that when an artifact in any collection in the registry gets a specific alias (for example, **production**), Weights & Biases sends a `POST` request to your webhook. 1. Open the registry and click the **Automations** tab, then click **Create automation**. 2. Choose the event **An artifact alias is added**. Enter an **Alias regex** that matches the alias you care about (for example, **production** or **staging**). 3. Click **Next step**. Set **Action type** to **Webhooks** and select your webhook. If the webhook expects a payload, paste a JSON body and use [payload variables](/products/wandb/automations/create-automations/webhook#payload-variables) such as `${artifact_collection_name}` and `${artifact_version_string}`. 4. Click **Next step**. Give the automation a name and optional description, then click **Create automation**. For more information, see [Create a webhook automation](/products/wandb/automations/create-automations/webhook#create-an-automation) (Registry tab). ## Test the automation To confirm that the automation fires end-to-end, trigger the configured event by adding the alias to an artifact version. Add the alias (for example, **production**) to an artifact version in the registry, using the W\&B App or the public API. For example: ```python theme={"system"} import wandb with wandb.init(project="my-project") as run: artifact = wandb.Artifact("my-model", type="model") # ... log files or metadata to artifact as needed ... run.log_artifact(artifact) run.wait() # Ensure the artifact is logged before proceeding # Add an alias to the latest version in the collection api = wandb.Api() collection = api.artifact_collection(name="my-model", type_name="model") version = next(collection.versions()) # Get the latest version version.aliases.append("production") version.save() print("Added alias 'production' to", version.name) ``` Within a short time, your webhook endpoint receives a `POST` with the payload you configured. You now have a working registry automation that fires whenever a matching alias is applied to an artifact in this registry. ## Go further To learn more about W\&B automations beyond what this tutorial covers, see the following resources: * [Automation events and scopes](/products/wandb/automations/automation-events) for all project and registry event types. * [Create a Slack automation](/products/wandb/automations/create-automations/slack) and [Create a webhook automation](/products/wandb/automations/create-automations/webhook) for full UI and payload details. # Automation tutorial overview Source: https://docs.coreweave.com/products/wandb/automations/tutorial Learn to build a project run-failure alert or a registry alias automation. W\&B Automations follow this pattern: when an **event** occurs and optional **conditions** are met, an **action** runs automatically. For example: * When a run fails (event), notify a Slack channel (action). * When the `production` alias is added to an artifact (event), call a webhook to trigger deployment (action). * When a new model version is linked (event), send a prompt to ARIA to compare it against production (action). Events and available conditions differ for automations scoped to a [project](/products/wandb/automations/automation-events#project) or a [registry](/products/wandb/automations/automation-events#registry). See [Automation events and scopes](/products/wandb/automations/automation-events). This page links to two end-to-end tutorials that show you how to create an automation in Weights & Biases. Each tutorial walks through a different scenario, so you can follow the one that matches what you want to build. For detailed guidance, select a tutorial. * **[Project automation tutorial](/products/wandb/automations/project-automation-tutorial)**: Alert when a run fails (Slack notification). * **[Registry automation tutorial](/products/wandb/automations/registry-automation-tutorial)**: Trigger a webhook when an alias (for example, `production`) is added to an artifact. # Overview Source: https://docs.coreweave.com/products/wandb/evaltables Learn how to create, compare, and visualize Eval Tables in Weights & Biases. Eval Tables help you compare aggregate scores and example-level model inputs, outputs, and scores across multiple runs. Use an Eval Table to compare model versions or training steps, review aggregate score changes, and investigate the examples behind changes in model performance. The following image shows an Eval Table called `"validation_prediction_eval"` that compares two runs `"summer-butterfly-9"` and `"gentle-flower-8"`: ![Eval Table view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/overview_basic_compare_two_runs_landing_page_notlabled.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=6147e5cdc48132c03c9781715eb59e29) An **Eval Table** panel contains three sections: 1. Run comparison selector: Select the [runs that you want to compare](/products/wandb/evaltables/compare-runs). 2. Aggregate scores: Review aggregate scores for the selected runs and compare the differences between them. For more information, see [View aggregate scores](/products/wandb/evaltables/compare-runs#aggregate-scores). 3. Examples: Compare the inputs, outputs, and scores for each example across the selected runs. The following image highlights each section of the panel: ![Eval Table view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/overview_basic_compare_two_runs_landing_page.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=9e85abb5211b6413e2d83e129737ad90) [Create an Eval Table with the `EvalTable` class from the W\&B Python SDK](/products/wandb/evaltables/create-an-evaluation-table). Existing [W\&B Tables](/products/wandb/tables) can also be converted to Eval Tables with ARIA. For more information, see [Convert a W\&B Table to an Eval Table](/products/wandb/evaltables/create-an-evaluation-table#convert-a-wb-table-to-an-eval-table). > [!TIP] > > Convert existing W\&B Tables to Eval Tables to improve rendering performance and access additional comparison features. To create your first Eval Table, see [Create an Eval Table](/products/wandb/evaltables/create-an-evaluation-table). # Compare runs with Eval Tables Source: https://docs.coreweave.com/products/wandb/evaltables/compare-runs Use Eval Tables to compare inputs, outputs, and scores across multiple runs. Weights & Biases aligns corresponding examples and calculates aggregate scores and score differences for the selected runs. > [!NOTE] > > To compare runs with workspace-level summary metrics, line plots, pinned runs, or a baseline run, see [Pin and compare runs](/products/wandb/runs/compare-runs). Eval Tables compare aligned examples and Eval Table-specific scores within a logged table. To compare runs: 1. Navigate to your project workspace. 2. Scroll to the Eval Tables panel. 3. Select the **+** button. 4. Select the run that you want to add. Weights & Biases groups columns that have the same role and name across the selected runs. For example, if two runs use the same `input_columns`, Weights & Biases displays those columns together in the **Inputs** section. Weights & Biases similarly groups shared `output_columns` and `score_columns` in the **Outputs** and **Scores** sections. The following screenshot shows an Eval Table that compares the `summer-butterfly-9` and `gentle-flower-8` runs: ![Eval Table view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/overview_basic_compare_two_runs.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=4414d3394d99462237d158e53c586788) ## Set the reference run When you compare multiple runs, Weights & Biases defaults to designating the left-most run as the reference run. The reference run is the baseline to calculate score deltas. To choose a different reference run, hover over the run, open its menu, and select **Set as reference**. ## View aggregate scores Weights & Biases calculates an aggregate value for each score column in each selected run. The calculation depends on the score's data type: | Type of score | Aggregate value | | - | - | | Boolean | Count and fraction of `true` values | | Numeric | Mean | | String or categorical | No scalar aggregate | | Null | Excluded from calculation | The following screenshot highlights the aggregate values for the correct and confidence scores: ![Eval Table view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/overview_basic_compare_two_runs_labled.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=95fae414bd40572d9b5f055b67e045a8) ## Compare score deltas For each score column, Weights & Biases calculates the difference between the reference run and every other selected run. Weights & Biases calculates each delta as: ```text theme={"system"} comparison run value - reference run value ``` For example, suppose `summer-butterfly-9` is the reference run and `gentle-flower-8` is the comparison run. Weights & Biases calculates the confidence delta as follows: | `summer-butterfly-9` | `gentle-flower-8` | delta | | - | - | - | | 0.43 | 0.62 | +0.19 | | 0.92 | 0.86 | -0.06 | | 0.97 | 0.85 | -0.12 | A positive delta means that the comparison run has a higher value than the reference run. A negative delta means that it has a lower value. The following screenshot highlights the score deltas: ![Eval Table view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/overview_basic_compare_two_runs_delta_labled.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=8e57198cebb5b796571a6e7e09ec6e8d) # Create an Eval Table Source: https://docs.coreweave.com/products/wandb/evaltables/create-an-evaluation-table Learn how to create an Eval Table in Weights & Biases. Create an Eval Table using the W\&B Python SDK or convert an existing [W\&B Table](/products/wandb/tables) with [ARIA](/products/aria). ## Create an Eval Table Use the `wandb.EvalTable` class to create an Eval Table. For example, suppose you have the following pandas DataFrame: ```python theme={"system"} import pandas as pd import wandb df = pd.DataFrame( [ { "image_id": "img_001", "true_label": "cat", "predicted_label": "cat", "confidence": 0.97, "correct": True, }, { "image_id": "img_002", "true_label": "dog", "predicted_label": "cat", "confidence": 0.72, "correct": False, }, { "image_id": "img_003", "true_label": "car", "predicted_label": "car", "confidence": 0.89, "correct": True, }, ] ) ``` Create an Eval Table by passing the DataFrame to `wandb.EvalTable`. Use the `input_columns`, `output_columns`, and `score_columns` arguments to identify the role of each column. The following example uses: * `image_id` as the input * `predicted_label` as the output * `correct` and `confidence` as scores ```python theme={"system"} with wandb.init(project="classifier-eval-table-demo") as run: eval_table = wandb.EvalTable( dataframe=df, input_columns=["image_id"], output_columns=["predicted_label"], score_columns=["correct", "confidence"], ) run.log({"validation_predictions_eval": eval_table}) ``` ## Convert a W\&B Table to an Eval Table Use the conversion banner to convert an existing W\&B Table to an Eval Table: 1. Navigate to the project that contains the W\&B Table. 2. Select the **Try now** button in the conversion banner. The button opens [ARIA](/products/aria) with information about which table to convert. 3. Follow the prompts in ARIA's conversation window. If you closed the banner or do not see it, open ARIA manually: 1. Select the blue circle in the upper-right corner of the page to open ARIA. 2. Enter `/convert-eval-table` in the ARIA conversation. 3. Select Send, represented by the upward-pointing arrow () in the lower-right corner of the conversation. Converting a W\&B Table does not modify the original table. # View Eval Tables Source: https://docs.coreweave.com/products/wandb/evaltables/visualize-evaluation-tables When you create an Eval Table, specify which columns contain inputs, outputs, and scores. Weights & Biases groups the columns into corresponding sections in the Eval Table. The following example shows the basic structure of an EvalTable object: ```python theme={"system"} import wandb wandb.EvalTable( input_columns=["column1", "column2"], output_columns=["output_column1", "output_column2"], score_columns=["score_column1", "score_column2"], ) ``` Pass one or more column names to each of the following arguments: * `input_columns`: Data provided to the model, such as an image, prompt, or ground-truth label. * `output_columns`: Values produced by the model, such as a prediction or generated response. * `score_columns`: Metrics or other values used to evaluate the output. Weights & Biases displays these columns in the Inputs, Outputs, and Scores sections of the Eval Table. > [!NOTE] > > The examples on this page use code from [Create an Eval Table](/products/wandb/evaltables/create-an-evaluation-table). Expand **View code** to view or copy the complete example. > > > **View code** > > > > ```python theme={"system"} > > import pandas as pd > > import wandb > > > > df = pd.DataFrame( > > [ > > { > > "image_id": "img_001", > > "true_label": "cat", > > "predicted_label": "cat", > > "confidence": 0.97, > > "correct": True, > > }, > > { > > "image_id": "img_002", > > "true_label": "dog", > > "predicted_label": "cat", > > "confidence": 0.72, > > "correct": False, > > }, > > { > > "image_id": "img_003", > > "true_label": "car", > > "predicted_label": "car", > > "confidence": 0.89, > > "correct": True, > > }, > > ] > > ) > > > > df["correct"] = df["correct"].astype(object) # preserves native Python bools > > > > with wandb.init(project="classifier-eval-table-demo") as run: > > eval_table = wandb.EvalTable( > > dataframe=df, > > input_columns=["image_id", "true_label"], > > output_columns=["predicted_label"], > > score_columns=["correct", "confidence"], > > ) > > run.log({"validation_predictions_eval": eval_table}) > > ``` For example, consider the code example from [Create an Eval Table](/products/wandb/evaltables/create-an-evaluation-table): ```python theme={"system"} import wandb with wandb.init(project="classifier-eval-table-demo") as run: eval_table = wandb.EvalTable( dataframe=df, input_columns=["image_id", "true_label"], output_columns=["predicted_label"], score_columns=["correct", "confidence"], ) run.log({"validation_predictions_eval": eval_table}) ``` In that example: * The **Inputs** section contains the `image_id` and `true_label` columns. * The **Outputs** section contains the `predicted_label` column. * The **Scores** section contains the `correct` and `confidence` columns. The following image highlights these sections: ![Eval Table view](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/single_run_eval_table_labled.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bbe6696853b41e5edffdd670008cd732) ## Detail view Select a row to open a detailed view of that example. The detail view shows the example's inputs, outputs, and scores. The following image shows the detail view for the first row in the Eval Table: ![Eval Table example details](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/single_run_eval_table_panel.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=4743aa9ead1a9fd91b5eb9c95c7df068) Use the detail view to inspect examples when the table contains many columns or when you compare results across multiple runs. Select the up or down arrow above the **Inputs** section to move between examples in the current table view. ## Filter data Use filters to display only rows that match specific conditions. To add a filter: 1. Select the **Filter** button above the table. 2. From the dropdown, select the column to filter. 3. Select an operator. 4. Specify a value. Weights & Biases automatically applies the filter to the table and displays only rows that match the condition. ![Eval Table filter](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/evaltables-filter.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=9a83f9aa343df6a4df1f5d40674238ce) You can apply multiple filters. To remove a filter, select the `X` next to it. ## Show or hide columns Use the **Columns** menu to control which columns appear in the Eval Table. The available columns depend on the data logged to the table. To show or hide a column: 1. Select **Columns** above the table. 2. Select a column to show it, or clear the column to hide it. The following image shows a Columns menu in which all available columns are selected: ![Eval Table columns](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/eval_column_options.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=bf8d605092ca038358736eb58a3dd9de) # Reports overview Source: https://docs.coreweave.com/products/wandb/reports Project management and collaboration tools for machine learning projects [Try in Colab](https://colab.research.google.com/github/wandb/examples/blob/master/colabs/intro/Report_API_Quickstart.ipynb) [Try in W\&B](https://forge.coreweave.com/wandb/stacey/deep-drive/reports/The-View-from-the-Driver-s-Seat--Vmlldzo1MTg5NQ?utm_source=fully_connected\&utm_medium=blog\&utm_campaign=view+from+the+drivers+seat) Use W\&B Reports to: * Organize Runs. * Embed and automate visualizations. * Describe your findings. * Share updates with collaborators, either as a LaTeX zip file or a PDF. The report below was created from metrics logged to Weights & Biases over the course of training. Scroll within it to explore the benchmark runs, panels, and commentary, or [open the full report](https://forge.coreweave.com/wandb/stacey/saferlife/reports/SafeLife-Benchmark-Experiments--Vmlldzo0NjE4MzM) in the Weights & Biases app. **SafeLife benchmark experiments report** ## How it works Create a collaborative report with a few clicks. 1. Navigate to your Weights & Biases project workspace in the W\&B App. 2. Click the **Create report** button in the upper right corner of your workspace. ![Create report button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/create_a_report_button.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=27fe4c62a65052ee97ac7fddd9812ab6) 3. A modal titled **Create Report** will appear. Select the charts and panels you want to add to your report. (You can add or remove charts and panels later). 4. Click **Create report**. 5. Edit the report to your desired state. 6. Click **Publish to project**. 7. Click the **Share** button to share your report with collaborators. See the [Create a report](/products/wandb/reports/create-a-report) page for more information on how to create reports interactively and programmatically with the W\&B Python SDK. ## How to get started Depending on your use case, explore the following resources to get started with W\&B Reports: * Check out our [video demonstration](https://www.youtube.com/watch?v=2xeJIv_K_eI) to get an overview of W\&B Reports. * Explore the [Reports gallery](/products/wandb/reports/reports-gallery) for examples of live reports. * Try the [Programmatic Workspaces](https://colab.research.google.com/github/wandb/wandb-workspaces/blob/Update-wandb-workspaces-tuturial/Workspace_tutorial.ipynb) notebook to learn how to create and customize your workspace. * Read curated Reports in [W\&B Fully Connected](https://wandb.me/fc). ## Recommended practices and tips For best practices and tips for Experiments and logging, see [Best Practices: Reports](https://forge.coreweave.com/wandb/wandb/pytorch-lightning-e2e/reports/W-B-Best-Practices-Guide--VmlldzozNTU1ODY1#reports). # Clone and export reports Source: https://docs.coreweave.com/products/wandb/reports/clone-and-export-reports Export W&B Reports as PDF or LaTeX files, and clone reports using the App UI or the Report and Workspace API. > [!NOTE] > > W\&B Report and Workspace API is in Public Preview. This page describes how to export a W\&B Report to a portable file format. It also describes how to clone an existing report to reuse its structure as a starting point for new work. ## Export a report Export a report as a PDF or LaTeX file to share its contents outside of Weights & Biases or to archive a static version of your analysis. In your report, select the **action ()** menu. Choose **Download** and select either PDF or LaTeX output format. ## Clone a report Clone a report to reuse an existing project's template and formatting as the basis for a new report. You can clone reports in the W\&B App or programmatically with the Report and Workspace API. **W\&B App** In your report: 1. Select the **action ()** menu, then choose **Make a copy**. 2. In the modal, select a destination for your cloned report. 3. Choose **Clone report**. The destination dropdown defaults to the current project and lists projects across the teams you belong to. To copy the report into a different project or team, open the dropdown and select it. ![Cloning a report in the W\&B App](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/clone_reports.gif?s=fa9c476a42b07ad88b3012790bc18595) When you clone a report, you specify the destination. If you clone it to a team, all team members can view it. If you clone it to your personal account, only you can view it by default. **Report and Workspace API** Use the Report and Workspace API to load an existing report from its URL and reuse it as a template for a new report. Load a report from a URL to use it as a template. Replace `PROJECT` with the name of your Weights & Biases project. ```python theme={"system"} report = wr.Report( project=PROJECT, title="Quickstart Report", description="That was easy!" ) # Create report.save() # Save new_report = wr.Report.from_url(report.url) # Load ``` After you load the report, edit the content in `new_report.blocks` to customize the cloned report, then save it. Replace `ENTITY` with your Weights & Biases entity name. ```python theme={"system"} pg = wr.PanelGrid( runsets=[ wr.Runset(ENTITY, PROJECT, "First Run Set"), wr.Runset(ENTITY, PROJECT, "Elephants Only!", query="elephant"), ], panels=[ wr.LinePlot(x="Step", y=["val_acc"], smoothing_factor=0.8), wr.BarPlot(metrics=["acc"]), wr.MediaBrowser(media_keys="img", num_columns=1), wr.RunComparer(diff_only="split", layout={"w": 24, "h": 9}), ], ) new_report.blocks = ( report.blocks[:1] + [wr.H1("Panel Grid Example"), pg] + report.blocks[1:] ) new_report.save() ``` After you save, your new report appears in your Weights & Biases project. # Collaborate on reports Source: https://docs.coreweave.com/products/wandb/reports/collaborate-on-reports Collaborate and share W&B Reports with peers, coworkers, and your team. This page describes ways to collaborate on W\&B Reports with your team so you can share results, gather feedback, and keep important reports accessible. You can share a report, edit it collaboratively, add comments, or star it for quick access. ## Share a report Share a report when you want to give peers, coworkers, or teammates access to view or edit its contents. When viewing a report, click **Share**. You can share a report in one of the following ways: * To share a link to the report with an email address or a username, click **Invite**. Enter an email address or username, select **Can view** or **Can edit**, then click **Invite**. If you share by email, the email address doesn't need to be a member of your organization or team. * To generate a sharing link instead, click **Share**. Adjust the permissions for the link, then click **Copy report link**. Share the link with the member. When viewing the report, click a panel to open it in full-screen mode. If you copy the URL from the browser and share it with another user, the panel opens in full-screen mode when they access the link. ![Report sharing modal for a report in a 'Public' project](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/share-report.gif?s=5ba7ba809ffb95c46c3d3e078482b96d) ## Edit a report Reports support collaborative editing so that team members can contribute updates without overwriting each other's work. Multiple team members can edit the same report and publish changes when they're ready. When any team member clicks **Edit** to begin editing the report, Weights & Biases automatically saves a draft. Select **Save to report** to publish your changes. If an edit conflict occurs, such as when two team members edit the report at once, a warning notification helps you resolve any conflicts. ## Comment on a report Use comments to give feedback or ask questions about a report or one of its panels without modifying its contents. To leave a comment on a report, click **Comment**. To comment directly on a panel, hover over the panel, then click the comment button (). ![Adding a comment to a panel](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/demo_comment_on_panels_in_reports.gif?s=3d9482c82e2f3a18fe98061e76a41238) ## Star a report Star a report to mark it as a favorite and make it easier to find later. Click the open star icon () at the top of a report to add it to your favorites. To remove the star, click the filled star icon (). When viewing your team's list of reports, click the open star in a report's row to add it to your favorites. Starred reports appear at the top of the list. From the list of reports, you can see how many members have starred each report to gauge its popularity. # Create a report Source: https://docs.coreweave.com/products/wandb/reports/create-a-report Create a W&B Report with the W&B App or programmatically. > [!NOTE] > > W\&B Report and Workspace API is in Public Preview. W\&B Reports let you share findings, results, and visualizations from your runs with collaborators. Create a report from a project workspace, from the **Reports** tab, or programmatically with the Report and Workspace API. Select a tab to get started. For a programmatic example, see the [Report API Quickstart Google Colab](https://colab.research.google.com/github/wandb/examples/blob/master/colabs/intro/Report_API_Quickstart.ipynb). > [!TIP] > > To have [ARIA](/products/aria) draft a report for you, open the project's **Reports** tab, click **Draft report with ARIA**, then describe the report you want. **W\&B App** 1. Navigate to your project workspace in the W\&B App. 2. In the upper-right corner of your workspace, click **Create report**. ![Create report button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/create_a_report_button.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=27fe4c62a65052ee97ac7fddd9812ab6) 3. A modal appears. Select the charts you want to start with. You can add or remove charts later from the report interface. ![Create report modal with chart selection options](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/create_a_report_modal.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=4972014883339eea8d8544bee43dd684) 4. To prevent Weights & Biases from adding more runs to your report, select **Filter run sets**. Weights & Biases saves a draft report automatically. Access it in the **Reports** tab. **Report tab** 1. Navigate to your project workspace in the W\&B App. 2. Select the **Reports** tab in your project. 3. Click **Create report**. ![Create report button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/create_report_button.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a83c27e8017fb0b7b263c22ecbeeef2f) **Report and Workspace API** Create a report programmatically: 1. Install the W\&B SDK (`wandb`) and the Report and Workspace API (`wandb-workspaces`): ```bash theme={"system"} pip install wandb wandb-workspaces ``` 2. Import the W\&B Python SDK and the Report and Workspace API: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr ``` 3. Create a report instance with `wandb_workspaces.reports.v2.Report` or with the Report Class Public API ([`wandb.apis.reports`](/products/wandb/ref/python/public-api/api#reports)). Specify the project to associate with the report: ```python theme={"system"} report = wr.Report(project="report_standard") ``` 4. Save the report. Weights & Biases doesn't upload reports until you call the `.save()` method: ```python theme={"system"} report.save() ``` For more information, see [Edit a report](/products/wandb/reports/edit-a-report). # Compare runs across projects Source: https://docs.coreweave.com/products/wandb/reports/cross-project-reports Compare runs from two different projects with cross-project reports. > [!NOTE] > > Watch a [video demonstrating comparing runs across projects](https://www.youtube.com/watch?v=uD4if_nGrs4) (2 min). Cross-project reports let you compare runs from two different projects side by side. This is useful when you want to evaluate experiments tracked under separate Weights & Biases projects without duplicating data. This page describes how to pull runs from another project into a report and how to share that report with collaborators who don't have Weights & Biases accounts. To compare runs across projects, use the project selector in the run set table to pick a project. ![Compare runs across different projects](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/howto_pick_a_different_project_to_draw_runs_from.gif?s=5de503e5a92480e9070854e7422b7354) The visualizations in the section pull columns from the first active run set. If you don't see the metric you're looking for in the line plot, make sure that the first run set checked in the section has that column available. This feature supports history data on time series lines, but doesn't support pulling different summary metrics from different projects. In other words, you can't create a scatter plot from columns that are only logged in another project. If you need to compare runs from two projects and the columns aren't working, add a tag to the runs in one project and then move those runs to the other project. You can still filter only the runs from each project, but the report includes all the columns for both sets of runs. ## View-only report links When you need to share a report with someone outside your project (such as a stakeholder who doesn't have a Weights & Biases account), use a view-only link. Share a view-only link to a report that is in a private project or team project. ![View-only report links](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/magic-links.gif?s=0bd2259e0f8b3b09c004d6f47442098c) View-only report links add a secret access token to the URL, so anyone who opens the link can view the page. Anyone can use the magic link to view the report without logging in first. For customers on [W\&B Local](/products/wandb/platform/hosting) private cloud installations, these links remain behind your firewall. Only team members who have both access to your private instance and access to the view-only link can view the report. In view-only mode, someone who isn't logged in can see the charts and hover over them to see tooltips of values, zoom in and out on charts, and scroll through columns in the table. They can't create new charts or new table queries to explore the data. View-only visitors can't click a run to get to the run page, and they can't see the share modal. Instead, they see a tooltip on hover that says `Sharing not available for view only access`. > [!NOTE] > > The magic links are only available for Private and Team projects. For Public projects (anyone can view) or Open projects (anyone can view and contribute runs), you can't turn the links on or off. The project is already public, so the report is already available to anyone with the link. ## Send a graph to a report You can also populate a report with charts you've already built in a workspace, rather than recreating them. To preserve a chart from a workspace alongside related analysis, send it directly to a report. Click the dropdown menu on the chart or panel you want to copy, then click **Add to report** to select the destination report. # Edit a report Source: https://docs.coreweave.com/products/wandb/reports/edit-a-report Edit a report interactively with the App UI or programmatically with the W&B SDK. > [!NOTE] > > W\&B Report and Workspace API is in Public Preview. This page describes how to edit a report interactively with the App UI or programmatically with the W\&B SDK. It covers adding plots, run sets, code blocks, markdown, HTML elements, and rich media. It also covers filtering and grouping run sets, organizing report layout, and visualizing multi-dimensional relationships. A report's body consists of *blocks*. Blocks contain text, images, embedded visualizations, plots from experiments and runs, and panel grids. *Panel grids* are a specific type of block that hold panels and *run sets*. Run sets are a collection of runs logged to a project in Weights & Biases. Panels are visualizations of run set data. > [!TIP] > > To have [ARIA](/products/aria) revise a report you own, open the report and click **Edit with ARIA**, then describe the changes you want. ARIA saves its changes to the existing report. > [!NOTE] > > Run the [Programmatic workspaces notebook](https://colab.research.google.com/github/wandb/wandb-workspaces/blob/Update-wandb-workspaces-tuturial/Workspace_tutorial.ipynb) for an end-to-end tutorial of creating a customized saved workspace view. > [!NOTE] > > To programmatically edit a report, you must have the W\&B Report and Workspace API (`wandb-workspaces`) installed along with the W\&B Python SDK: > > ```bash theme={"system"} > pip install wandb wandb-workspaces > ``` ## Add plots Plots let you visualize run data inside a report. Each panel grid has a set of run sets and a set of panels. The run sets in the panel grid control what data appears on the panels in the grid. Create a new panel grid if you want to add charts that pull data from a different set of runs. **App UI** Enter a forward slash (`/`) in the report to display a dropdown menu. Select **Add panel** to add a panel. You can add any panel that Weights & Biases supports, including a line plot, scatter plot, or parallel coordinates chart. ![Add charts to a report](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/demo_report_add_panel_grid.gif?s=5466d6aed179dfea653ffc185ce9029a) **Report and Workspace API** Add plots to a report programmatically with the SDK. Pass a list of one or more plot or chart objects to the `panels` parameter in the `PanelGrid` Public API class. Create a plot or chart object with its associated Python class. The following examples demonstrate how to create a line plot and scatter plot. ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr report = wr.Report( project="report-editing", title="Report title", description="Report description.", ) blocks = [ wr.PanelGrid( panels=[ wr.LinePlot(x="time", y="velocity"), wr.ScatterPlot(x="time", y="acceleration"), ] ) ] report.blocks = blocks report.save() ``` For more information about available plots and charts you can add to a report programmatically, see `wr.panels`. ## Add run sets Add run sets from projects interactively with the App UI or the W\&B SDK. **App UI** Enter a forward slash (`/`) in the report to display a dropdown menu. From the dropdown, choose **Panel Grid**. Weights & Biases automatically imports the run set from the project the report was created from. If you import a panel into a report, the report inherits the run names from the project. In the report, you can optionally [rename a run](/products/wandb/runs#rename-a-run) to give the reader more context. The rename applies only to the individual panel. If you clone the panel in the same report, the cloned panel also reflects the new name. 1. In the report, click the pencil icon to open the report editor. 2. In the run set, find the run to rename. Hover over the run name and click the **action ()** menu. Select one of the following choices, then submit the form. * **Rename run for project**: Rename the run across the entire project. To generate a new random name, leave the field blank. * **Rename run for panel grid**: Rename the run only in the report, preserving the existing name in other contexts. You can't generate a new random name with this option. 3. Click **Publish report**. **Report and Workspace API** Add run sets from projects with the `wr.Runset()` and `wr.PanelGrid` classes. To add a run set, follow these steps: 1. Create a `wr.Runset()` object instance. Provide the name of the project that contains the run sets for the project parameter and the entity that owns the project for the entity parameter. 2. Create a `wr.PanelGrid()` object instance. Pass a list of one or more run set objects to the `runsets` parameter. 3. Store one or more `wr.PanelGrid()` object instances in a list. 4. Update the report instance blocks attribute with the list of panel grid instances. Replace `[PROJECT-NAME]` with your Weights & Biases project name and `[ENTITY-NAME]` with your Weights & Biases entity name in the following example: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr report = wr.Report( project="report-editing", title="Report title", description="Report description.", ) panel_grids = wr.PanelGrid( runsets=[wr.RunSet(project="[PROJECT-NAME]", entity="[ENTITY-NAME]")] ) report.blocks = [panel_grids] report.save() ``` You can optionally add runsets and panels with one call to the SDK: ```python theme={"system"} import wandb report = wr.Report( project="report-editing", title="Report title", description="Report description.", ) panel_grids = wr.PanelGrid( panels=[ wr.LinePlot( title="line title", x="x", y=["y"], range_x=[0, 100], range_y=[0, 100], log_x=True, log_y=True, title_x="x axis title", title_y="y axis title", ignore_outliers=True, groupby="hyperparam1", groupby_aggfunc="mean", groupby_rangefunc="minmax", smoothing_factor=0.5, smoothing_type="gaussian", smoothing_show_original=True, max_runs_to_show=10, plot_type="stacked-area", font_size="large", legend_position="west", ), wr.ScatterPlot( title="scatter title", x="y", y="y", # z='x', range_x=[0, 0.0005], range_y=[0, 0.0005], # range_z=[0,1], log_x=False, log_y=False, # log_z=True, running_ymin=True, running_ymean=True, running_ymax=True, font_size="small", regression=True, ), ], runsets=[wr.RunSet(project="[PROJECT-NAME]", entity="[ENTITY-NAME]")], ) report.blocks = [panel_grids] report.save() ``` ## Freeze a run set A report automatically updates run sets to show the latest data from the project. Freeze a run set to preserve its state in a report at a specific time, so that later runs don't change what the report displays. To freeze a run set when viewing a report, click the snowflake icon in its panel grid near the **Filter** button. ![Freeze runset button](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/freeze_runset.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=a01866e786fb0ef6244603671bba3a36) ## Group a run set programmatically Group runs in a run set programmatically with the [Workspace and Reports API](/products/wandb/ref/wandb_workspaces/reports). Grouping organizes related runs together in panels, which makes comparing configurations and results easier. You can group runs in a run set by config values, run metadata, or summary metrics. The following table lists the available grouping methods along with the available keys for each grouping method: | Grouping method | Description | Available keys | | - | - | - | | Config values | Group runs by config values | Values specified in config parameter in `wandb.init(config=)` | | Run metadata | Group runs by run metadata | `State`, `Name`, `JobType` | | Summary metrics | Group runs by summary metrics | Values you log to a run with `wandb.Run.log()` | ### Group runs by config values Group runs by config values to compare runs with similar configurations. Config values are parameters you specify in your run configuration `(wandb.init(config=))`. To group runs by config values, use the `config.[KEY]` syntax, where `[KEY]` is the name of the config value you want to group by. For example, the following code snippet first initializes a run with a config value for `group`, then groups runs in a report based on the `group` config value. Replace `[ENTITY]` and `[PROJECT]` with your Weights & Biases entity and project names. ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr entity = "[ENTITY]" project = "[PROJECT]" for group in ["control", "experiment_a", "experiment_b"]: for i in range(3): with wandb.init(entity=entity, project=project, group=group, config={"group": group, "run": i}, name=f"{group}_run_{i}") as run: # Simulate some training for step in range(100): run.log({ "acc": 0.5 + (step / 100) * 0.3 + (i * 0.05), "loss": 1.0 - (step / 100) * 0.5 }) ``` Within your Python script or notebook, you can then group runs by the `config.group` value: ```python theme={"system"} runset = wr.Runset( project=project, entity=entity, groupby=["config.group"] # Group by the "group" config value ) ``` Continuing from the previous example, you can create a report with the grouped run set: ```python theme={"system"} report = wr.Report( entity=entity, project=project, title="Grouped Runs Example", ) report.blocks = [ wr.PanelGrid( runsets=[runset], ) ] report.save() ``` ### Group runs by run metadata Group runs by metadata to organize them based on intrinsic run properties rather than logged values. You can group by a run's name (`Name`), state (`State`), or job type (`JobType`). Continuing from the previous example, you can group your runs by their name with the following code snippet: ```python theme={"system"} runset = wr.Runset( project=project, entity=entity, groupby=["Name"] # Group by run names ) ``` > [!NOTE] > > The name of the run is the name you specify in the `wandb.init(name=)` parameter. If you don't specify a name, Weights & Biases generates a random name for the run. > > You can find the name of the run in the **Overview** page of a run in the W\&B App or programmatically with `Api.runs().run.name`. ### Group runs by summary metrics The following examples demonstrate how to group runs by summary metrics. Summary metrics are the values you log to a run with `wandb.Run.log()`. After you log a run, you can find the names of your summary metrics in the W\&B App under the **Summary** section of a run's **Overview** page. The syntax for grouping runs by summary metrics is `summary.[KEY]`, where `[KEY]` is the name of the summary metric you want to group by. For example, suppose you log a summary metric called `acc`. Replace `[ENTITY]` and `[PROJECT]` with your Weights & Biases entity and project names: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr entity = "[ENTITY]" project = "[PROJECT]" for group in ["control", "experiment_a", "experiment_b"]: for i in range(3): with wandb.init(entity=entity, project=project, group=group, config={"group": group, "run": i}, name=f"{group}_run_{i}") as run: # Simulate some training for step in range(100): run.log({ "acc": 0.5 + (step / 100) * 0.3 + (i * 0.05), "loss": 1.0 - (step / 100) * 0.5 }) ``` You can then group runs by the `summary.acc` summary metric: ```python theme={"system"} runset = wr.Runset( project=project, entity=entity, groupby=["summary.acc"] # Group by summary values ) ``` ## Filter a run set programmatically Programmatically filter run sets and add them to a report with the [Workspace and Reports API](/products/wandb/ref/wandb_workspaces/reports). Filtering narrows a run set to the specific runs you want to display, based on config values, metrics, tags, or run properties. The general syntax for a filter expression is: ```text theme={"system"} Filter('[KEY]') operation [VALUE] ``` In this expression, `[KEY]` is the name of the filter, `operation` is a comparison operator (for example, `>`, `<`, `==`, `in`, `not in`, `or`, and `and`), and `[VALUE]` is the value to compare against. `Filter` is a placeholder for the type of filter you want to apply. The following table lists the available filters and their descriptions: | Filter | Description | Available keys | | - | - | - | | `Config('[KEY]')` | Filter by config values | Values specified in `config` parameter in `wandb.init(config=)`. | | `SummaryMetric('[KEY]')` | Filter by summary metrics | Values you log to a run with `wandb.Run.log()`. | | `Tags('[KEY]')` | Filter by tags | Tag values that you add to your run (programmatically or with the W\&B App). | | `Metric('[KEY]')` | Filter by run properties | `tags`, `state`, `displayName`, `jobType` | After you define your filters, you can create a report and pass the filtered run sets to `wr.PanelGrid(runsets=)`. See the **Report and Workspace API** tabs throughout this page for more information about how to add different elements to a report programmatically. The following examples demonstrate how to filter run sets in a report. Replace values enclosed in brackets (for example, `[ENTITY]` and `[PROJECT]`) with your own values. ### Config filters Filter a run set by one or more config values. Config values are parameters you specify in your run configuration (`wandb.init(config=)`). For example, the following code snippet first initializes a run with a config value for `learning_rate` and `batch_size`, then filters runs in a report based on the `learning_rate` config value. ```python theme={"system"} import wandb config = { "learning_rate": 0.01, "batch_size": 32, } with wandb.init(project="[PROJECT]", entity="[ENTITY]", config=config) as run: # Your training code here pass ``` Within your Python script or notebook, you can then programmatically filter runs that have a learning rate greater than `0.01`. ```python theme={"system"} import wandb_workspaces.reports.v2 as wr runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Config('learning_rate') > 0.01" ) ``` You can also filter by multiple config values with the `and` operator: ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Config('learning_rate') > 0.01 and Config('batch_size') == 32" ) ``` Continuing from the previous example, you can create a report with the filtered run set as follows: ```python theme={"system"} report = wr.Report( entity="[ENTITY]", project="[PROJECT]", title="My Report" ) report.blocks = [ wr.PanelGrid( runsets=[runset], panels=[ wr.LinePlot( x="Step", y=["accuracy"], ) ] ) ] report.save() ``` ### Metric filters Filter run sets based on a run's tag (`tags`), run state (`state`), run name (`displayName`), or job type (`jobType`). > [!NOTE] > > `Metric` filters use a different syntax than other filters. You must pass values as a list. > > ```text theme={"system"} > Metric('[KEY]') operation [VALUE] > ``` For example, consider the following Python snippet that creates three runs and assigns each of them a name: ```python theme={"system"} import wandb with wandb.init(project="[PROJECT]", entity="[ENTITY]") as run: for i in range(3): run.name = f"run{i+1}" # Your training code here pass ``` When you create your report, you can filter runs by their display name. For example, to filter runs with names `run1`, `run2`, and `run3`, you can use the following code: ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Metric('displayName') in ['run1', 'run2', 'run3']" ) ``` > [!NOTE] > > You can find the name of the run in the **Overview** page of a run in the W\&B App or programmatically with `Api.runs().run.name`. The following examples demonstrate how to filter a run set by the run's state (`finished`, `crashed`, or `running`): ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Metric('state') in ['finished']" ) ``` ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Metric('state') not in ['crashed']" ) ``` ### SummaryMetric filters Filter a run set by summary metrics to focus on runs that meet specific outcome thresholds, such as accuracy or loss values. Summary metrics are the values you log to a run with `wandb.Run.log()`. After you log a run, you can find the names of your summary metrics in the W\&B App under the **Summary** section of a run's **Overview** page. ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="SummaryMetric('accuracy') > 0.9" ) ``` ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Metric('state') in ['finished'] and SummaryMetric('train/train_loss') < 0.5" ) ``` ### Tags filters Filter a run set by tags to show only runs that you've labeled with a particular tag. Tags are values you add to a run (programmatically or with the W\&B App). ```python theme={"system"} runset = wr.Runset( entity="[ENTITY]", project="[PROJECT]", filters="Tags('training') == 'training'" ) ``` ## Add code blocks Add code blocks to share configuration, examples, or snippets alongside your results. You can add them interactively with the App UI or programmatically with the W\&B SDK. **App UI** Enter a forward slash (`/`) in the report to display a dropdown menu. From the dropdown, choose **Code**. Select the name of the programming language in the code block to expand a dropdown. From the dropdown, select your programming language syntax. You can choose from JavaScript, Python, CSS, JSON, HTML, Markdown, and YAML. **Report and Workspace API** Use the `wr.CodeBlock` class to create a code block programmatically. Provide the name of the language and the code you want to display for the language and code parameters, respectively. The following example demonstrates a list in a YAML file: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr report = wr.Report(project="report-editing") report.blocks = [ wr.CodeBlock( code=["this:", "- is", "- a", "cool:", "- yaml", "- file"], language="yaml" ) ] report.save() ``` This renders a code block similar to: ```yaml theme={"system"} this: - is - a cool: - yaml - file ``` The following example demonstrates a Python code block: ```python theme={"system"} report = wr.Report(project="report-editing") report.blocks = [wr.CodeBlock(code=["Hello, World!"], language="python")] report.save() ``` This renders a code block similar to: ```md theme={"system"} Hello, World! ``` ## Add markdown Add markdown to format narrative text, headings, and inline emphasis in your report. You can add markdown interactively with the App UI or programmatically with the W\&B SDK. **App UI** Enter a forward slash (`/`) in the report to display a dropdown menu. From the dropdown, choose **Markdown**. **Report and Workspace API** Use the `wr.MarkdownBlock` class to create a markdown block programmatically. Pass a string to the `text` parameter: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr report = wr.Report(project="report-editing") report.blocks = [ wr.MarkdownBlock(text="Markdown cell with *italics* and **bold** and $e=mc^2$") ] ``` This renders a markdown block similar to: ![Rendered markdown block](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/markdown.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=1edfe90e8a9c76f457b0321bb627da92) ## Add HTML elements Add HTML elements such as headings and lists to structure your report. You can add them interactively with the App UI or programmatically with the W\&B SDK. > [!NOTE] > > When you log an image with `wandb.Image`, Weights & Biases saves the file under a generated name that includes a content hash, such as `media/images/[key]_[step]_[hash].png`, instead of the original filename. As a result, an `` tag or markdown image that references the original filename doesn't resolve. To embed a logged image in a report, log the image first, then use the generated file path as the image's `src` value. **App UI** Enter a forward slash (`/`) in the report to display a dropdown menu. From the dropdown, select a type of text block. For example, to create an H2 heading block, select the `Heading 2` option. **Report and Workspace API** Pass a list of one or more HTML elements to the report's `blocks` attribute. The following example demonstrates how to create an H1, H2, and an unordered list: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr report = wr.Report(project="report-editing") report.blocks = [ wr.H1(text="How Programmatic Reports work"), wr.H2(text="Heading 2"), wr.UnorderedList(items=["Bullet 1", "Bullet 2"]), ] report.save() ``` This renders the HTML elements to the following: ![Rendered HTML elements](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/render_html.png?fit=max\&auto=format\&n=3Dv_sw2eg8feUJlx\&q=85\&s=9cf8a83b2d0cf5666507843b76aa0a58) ## Embed rich media links Embed rich media such as tweets, videos, and audio to enrich your report with external context. You can embed rich media with the App UI or with the W\&B SDK. **App UI** Copy and paste URLs into reports to embed rich media within the report. The following animations demonstrate how to copy and paste URLs from Twitter, YouTube, and SoundCloud. ### Twitter Copy and paste a Tweet link URL into a report to view the Tweet within the report. ![Embedding Twitter content](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/twitter.gif?s=c0ddfb25d9943403668c5481b0402729) ### YouTube Copy and paste a YouTube video URL link to embed a video in the report. ![Embedding YouTube videos](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/youtube.gif?s=a0e2b8230c21f7017dd2c26527ec01c6) ### SoundCloud Copy and paste a SoundCloud link to embed an audio file into a report. ![Embedding SoundCloud audio](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/soundcloud.gif?s=51299fea079487391a1ac3c850524796) **Report and Workspace API** Pass a list of one or more embedded media objects to the report's `blocks` attribute. The following example demonstrates how to embed video and Twitter media into a report: ```python theme={"system"} import wandb import wandb_workspaces.reports.v2 as wr report = wr.Report(project="report-editing") report.blocks = [ wr.Video(url="https://www.youtube.com/embed/6riDJMI-Y8U"), wr.Twitter( embed_html='\n' ), ] report.save() ``` ## Duplicate panel grids Duplicate a panel grid to reuse its layout in the same report or in a different report. Select a panel grid and copy-paste it to duplicate it in the same report or paste it into a different report. Highlight a whole panel grid section by selecting the drag handle in the upper right corner. Click and drag to highlight and select a region in a report such as panel grids, text, and headings. ![Copying panel grids](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/demo_copy_and_paste_a_panel_grid_section.gif?s=7cd01fc6d400fd1f4609df3b67e15776) ## Delete panel grids Delete a panel grid when you no longer need its layout or content in the report. Select a panel grid and press `delete` on your keyboard to delete a panel grid. ![Deleting panel grids](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/delete_panel_grid.gif?s=f4bc3885dabab1feb9f78fc685b27d5c) ## Collapse headers to organize reports Collapse headers in a report to hide content within a text block. When the report loads, only expanded headers show content. Collapsing headers in reports helps organize your content and prevents loading more data than you need. The following animation demonstrates the process. ![Collapsing headers in a report](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/collapse_headers.gif?s=7301bab96b6136907b271f33a472e6b9) ## Configure report and chart display Configure how the report and its charts appear. The chart display and layout options are located in the upper-left corner of the report interface. ### Configure chart display Use the chart display options to change how charts appear. | Icon | Option | Description | | - | - | - | | `x →` | **X-axis option** | Choose the x-axis metric for supported line charts, such as step or elapsed time. | | Iron icon | **Smoothing settings** | Smooth chart curves to make trends easier to see. Smoothing changes only the visualization, not the logged data. | | Points with an `×` | **Exclude extreme outliers when scaling charts** | Adjust chart scaling to reduce the effect of extreme values. This option doesn't delete logged data. The visual effect depends on the chart's sampling mode. | ### Configure layout Select **Narrow**, **Wide**, or **Full width** to change the report width. ## Publish report changes Your edits are saved automatically as a draft. To publish the draft, select **Publish to project** for a new report or **Publish changes** for an existing published report. ## Visualize relationships across multiple dimensions When you want to surface relationships between three or more variables in a single chart, a standard 2D plot can be limiting. To compare more variables than a 2D plot can show, you can use a color gradient as an additional dimension. Using a color gradient to represent one of the variables can make patterns easier to interpret. 1. Choose a variable to represent with a color gradient, like penalty scores or learning rates. This provides a clearer understanding of how penalty (color) interacts with reward or side effects (y-axis) over training time (x-axis). 2. Highlight key trends. Hover over a specific group of runs to highlight them in the visualization. # Embed a report Source: https://docs.coreweave.com/products/wandb/reports/embed-reports Embed W&B reports directly into Notion or with an HTML `iframe` element. Embed a W\&B report in an external page or tool so that your team can view live experiment results alongside other documentation. This page describes how to generate an embed code from a report and use it in HTML, Confluence, Notion, or Gradio. ## HTML `iframe` element Use an HTML `iframe` element to embed a report on any web page that accepts custom HTML. Weights & Biases provides a prebuilt embed code that you can copy directly from the report. In the upper right of a report, select the **Share** button to open a dialog, then select **Copy embed code**. The copied snippet is an `iframe` HTML element that you can paste into any page that accepts custom HTML. > [!NOTE] > > You can only embed and render reports from public projects or reports that you've shared using [view-only links](/products/wandb/reports/cross-project-reports#view-only-report-links) (the link's access token is part of the URL). ![Getting embed code](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/get_embed_url.gif?s=82b9bcb3c31c5dbae96d0de0556fc61c) ## Confluence Confluence supports embedded reports through its built-in `iframe` macro. The following animation demonstrates how to insert the direct link to the report within an `iframe` cell in Confluence. ![Embedding in Confluence](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/embed_iframe_confluence.gif?s=94347ea1b7d3877fcfbdf51a6c6c0902) ## Notion Notion's **Embed** block accepts the same embed code that Weights & Biases provides. The following animation demonstrates how to insert a report into a Notion document using an **Embed** block in Notion and the report's embed code. ![Embedding in Notion](https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/embed_iframe_notion.gif?s=282a3392a4ed013e63d056bbb33bc911) ## Gradio To embed a W\&B report in a Gradio app, including an app hosted on Hugging Face Spaces, use Gradio's `gr.HTML` element to render an `iframe` that points to the report URL. ```python theme={"system"} import gradio as gr def wandb_report(url): iframe = f'