diff --git a/Dockerfile b/Dockerfile index 32fd39deaa54..426426a4407f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ # --------------------------------------------------------------- # To update the sha: # https://github.com/github/gh-base-image/pkgs/container/gh-base-image%2Fgh-base-noble -FROM ghcr.io/github/gh-base-image/gh-base-noble:20251009-110343-g5a525d4e1 AS base +FROM ghcr.io/github/gh-base-image/gh-base-noble:20251010-155737-g547a87a71 AS base # Install curl for Node install and determining the early access branch # Install git for cloning docs-early-access & translations repos diff --git a/content/billing/how-tos/products/view-productlicense-use.md b/content/billing/how-tos/products/view-productlicense-use.md index f8af40b952ac..9e1ad6c67ff2 100644 --- a/content/billing/how-tos/products/view-productlicense-use.md +++ b/content/billing/how-tos/products/view-productlicense-use.md @@ -112,14 +112,11 @@ To show more detailed information for the top 100 users or organizations consumi ## Downloading usage reports -Visit the "Metered Usage" page to access a metered billing report for all products, or navigate to the "Premium request analytics" page for a specialized report tailored for Premium request activity tracking. - -### General usage reports +Visit the "Metered Usage" page to access a metered billing report for all products, or navigate to the "Premium request analytics" page for a specialized report tailored for Premium request activity tracking. 1. At the top of the page, click **Get usage report**. -1. If prompted, specify the report details: - * Metered usage page: in the dialog displayed, define details of the report that you want to download and click **Email me the report**. - * Premium request analytics page: the report will contain usage for the last 45 days. +1. Specify the report details. +1. Click **Email me the report**. When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours. diff --git a/content/billing/reference/billing-reports.md b/content/billing/reference/billing-reports.md index 779345fd9d62..8c2ae3e5de20 100644 --- a/content/billing/reference/billing-reports.md +++ b/content/billing/reference/billing-reports.md @@ -17,25 +17,26 @@ redirect_from: contentType: reference --- -The usage reports show detailed information about your account’s {% data variables.product.github %} usage, including how much of each SKU was used and the resulting billable amount. +Usage reports show detailed information about your account’s {% data variables.product.github %} usage, including how much of each SKU was used and the resulting billable amount. -To generate a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use). +To generate a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports). ## Report types -There are three different types of reports. +The following report types are available. * Metered usage page: - * **Summarized metered usage reports**: A summary of usage for all paid products for a maximum period of one year. - * **Detailed metered usage reports**: A detailed usage report for all paid products for a maximum period of 31 days. + * **Summarized usage report**: A summary of usage for all paid products for a maximum period of one year. + * **Detailed usage report**: A detailed usage report for all paid products for a maximum period of 31 days. * Premium request analytics page: - * **Premium request analytics usage reports**: A detailed, user-based report on usage of premium requests for the last 45 days. + * **Premium requests usage report**: A detailed per-user breakdown of premium requests consumed for a maximum period of 31 days. + * **Legacy premium request usage report**: A detailed, user-based report of premium request usage for the last 45 days. -### Summarized metered usage reports +### Summarized usage report This report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amount` fields based on the combination of the following values: `date`, `sku`, `repository`, `cost_center_name`. If the usage report is for an enterprise with organizations, the amounts will be summarized by the organization value as well. -### Detailed metered usage reports +### Detailed usage report The detailed usage report includes the same fields as the summarized report and adds `username` and `workflow_path`. @@ -43,13 +44,21 @@ This report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amo {% data reusables.billing.usage-reports-api-limitation %} -### Premium request analytics usage reports +### Premium requests usage report -This report includes each recorded use of a premium request and includes the following fields: `Timestamp`,`User`,`Model`,`Requests Used`,`Exceeds Monthly Quota`, and `Total Monthly Quota`. +This report includes additional detail about premium request usage. The report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amount` fields based on the combination of the following values: `date`, `model`, `username`. -## Metered usage report fields +This report contains usage beginning October 01, 2025 00:00 UTC. -The usage report contains the following fields. +### Legacy premium request usage report + +This report includes each recorded use of a premium request and includes the following fields: `Timestamp`,`User`,`Model`,`Requests Used`,`Exceeds Monthly Quota`, and `Total Monthly Quota`. The time period of the report is the most recent 45 days. + +This report will be closing down on December 1, 2025, at which point all premium request usage activity will be available via the Premium requests usage report. + +## Usage report fields + +The usage reports contain the following fields. | Field | Description | |---------------------------|-------------| @@ -61,37 +70,27 @@ The usage report contains the following fields. | `applied_cost_per_quantity` | The unit cost of the product SKU. | | `gross_amount` | The amount of the product SKU that was used. | | `discount_amount` | The amount of usage that was discounted. Usage that is discounted as part of your account’s included usage is reflected in this field. Also includes discounts for {% data variables.product.prodname_actions %} usage for standard {% data variables.product.github %}-hosted runners in public repositories and for self-hosted runners. | -| `net_amount` | The billable amount of usage after applying the `discount_amount`. This is the amount that your account will be billed. `gross_amount - discount_amount = net_amount`. | -| `username` | The user associated with the usage, if applicable. Only available in the detailed report. | +| `net_amount` | The billable amount of usage after applying the `discount_amount`. This is the amount that your account will be billed. `gross_amount - discount_amount = net_amount` | +| `username` | The user associated with the usage, if applicable.

Not included in the `Summarized usage report`. | | `organization` | The organization associated with the usage, if applicable. | | `repository` | The repository associated with the usage, if applicable. | -| `workflow_path` | The path of the {% data variables.product.prodname_actions %} workflow that generated the usage, if applicable. Only available in the detailed report. | +| `workflow_path` | The path of the {% data variables.product.prodname_actions %} workflow that generated the usage, if applicable.

Only available in the `Detailed usage report` | | `cost_center_name` | The cost center associated with the usage, if applicable. | +| `model` | The model used. This might be an LLM like `claude-sonnet-4`, or a product-specific model like `Code Review model`.

Only available in the `Premium request usage report` | +| `exceeds_quota` | Indicates whether the premium request exceeds the user's monthly quota:
- `FALSE`: The request is covered by the monthly quota included in the user's plan.
- `TRUE`: The request exceeds the monthly quota and will be billed

Only available in the `Premium request usage report` | +| `total_monthly_quota` | The number of requests included in the user's current plan. {% ifversion fpt or ghec %}See [AUTOTITLE](/copilot/concepts/billing/individual-plans) and [AUTOTITLE](/copilot/concepts/billing/organizations-and-enterprises).{% endif %}

Only available in the `Premium request usage report` | + +## Receiving the report + +Usage reports are sent via email to the default email address associated with your {% data variables.product.github %} account. You can only request one usage report per account at a time. -### Metered usage report fields that are closing down +## Metered usage report fields that have closed down {% data variables.product.github %} aims to minimize changes to the usage report structure, however at times the report structure or fields may change. -| Closing down | Replacement | +The following fields have been removed from the usage reports. + +| Field | Replacement | |--------------------|---------------------| | `usage_at` | Refer to `date` instead. | | `workflow_name` | Refer to `workflow_path` instead. | - -## Premium request analytics usage report fields - -{% data reusables.billing.premium-request-analytics-start %} - -The premium request analytics report contains the following fields. - -| Field | Description | -|---------------------------|-------------| -| Timestamp | The full UTC date and time in ISO 18601 format. | -| User | The {% data variables.product.github %} handle of the user associated with the usage. | -| Model | The model used. This might be an LLM like `claude-sonnet-4`, or a product-specific model like `Code Review model`. -| Requests Used | The total number of requests used. | -| Exceeds Monthly Quota | This field indicates whether the premium request will be billed separately:
- `FALSE`: The request is covered by the monthly quota included in the user's plan.
- `TRUE`: The request exceeds the monthly quota and will be billed | -| Total Monthly Quota | This field records the total number of requests included in the user's current plan{% ifversion fpt or ghec %}, see [AUTOTITLE](/copilot/concepts/billing/individual-plans) and [AUTOTITLE](/copilot/concepts/billing/organizations-and-enterprises){% endif %}. | - -## Receiving the report - -Usage reports are sent via email to the default email address associated with your {% data variables.product.github %} account. You can only request one usage report per account at a time. diff --git a/content/copilot/concepts/agents/coding-agent/about-coding-agent.md b/content/copilot/concepts/agents/coding-agent/about-coding-agent.md index 64e109acb36a..c7714ed7989f 100644 --- a/content/copilot/concepts/agents/coding-agent/about-coding-agent.md +++ b/content/copilot/concepts/agents/coding-agent/about-coding-agent.md @@ -144,9 +144,7 @@ Users can include hidden messages in issues assigned to {% data variables.produc * **{% data variables.copilot.copilot_coding_agent %} only works with repositories hosted on {% data variables.product.github %}**. If your repository is stored using a different code hosting platform, {% data variables.product.prodname_copilot_short %} won't be able to work on it. * **You cannot select the AI model used by {% data variables.copilot.copilot_coding_agent %}**. A model picker is not available to switch between models, and {% data variables.product.company_short %} reserves the right to change models at any time. - If you are a {% data variables.copilot.copilot_pro %} or {% data variables.copilot.copilot_pro_plus %} subscriber, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.copilot_claude_sonnet_45 %}. - - If you are a {% data variables.copilot.copilot_for_business %} or {% data variables.copilot.copilot_enterprise %} subscriber, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.cca_current_model %} by default, or {% data variables.copilot.copilot_claude_sonnet_45 %} if the model has been enabled by an administrator. See [AUTOTITLE](/copilot/concepts/policies). + Currently, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.copilot_claude_sonnet_45 %}. ## Hands-on practice diff --git a/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md b/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md index eb5858ce0cb5..3db71dbfd0d6 100644 --- a/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md +++ b/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md @@ -30,9 +30,8 @@ There are multiple ways to view your premium request usage: * [View current usage directly within your IDE](#viewing-usage-in-your-ide) * [Viewing an overview in your Billing and licensing settings](#viewing-an-overview-in-your-billing-and-licensing-settings) * [View detailed analytics of your usage](#viewing-detailed-analytics-of-your-usage) -* [Download a usage report for your personal account](#downloading-a-usage-report-for-your-personal-account) -If you reach your limit for premium requests, you will be notified with a message in each of the {% data variables.product.prodname_copilot_short %} interfaces you use. +If you reach your limit for premium requests, you will be notified with a message in each of the {% data variables.product.prodname_copilot_short %} interfaces you use. To download a usage report, see [Downloading usage reports](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports). For information about viewing premium request usage for an organization or enterprise, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use). @@ -67,15 +66,9 @@ You can view an overview of your premium request usage at any time in your "Bill ![Screenshot of the usage chart on the "Premium request analytics" page with "Chart options" open and outlined in dark orange.](/assets/images/help/billing/premium-request-analytics-chart-download.png) -### Downloading a usage report for your personal account +### Downloading a usage report -Reports include all premium request usage, both within and beyond your allowance. - -{% data reusables.user-settings.access_billing_settings_url %} -1. In the side bar, click **Premium request analytics** to show detailed analytics. -1. At the top of the page, click **Get usage report** to generate a CSV report of your premium request use for the past 45 days. - -When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours. For details of the fields included in the reports, see [AUTOTITLE](/billing/reference/billing-reports#premium-request-analytics-usage-report-fields). +For details on how to request a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports). ## Optimizing usage of premium requests diff --git a/content/copilot/reference/ai-models/supported-models.md b/content/copilot/reference/ai-models/supported-models.md index 3b129cf6e33b..e2f0ca607387 100644 --- a/content/copilot/reference/ai-models/supported-models.md +++ b/content/copilot/reference/ai-models/supported-models.md @@ -47,10 +47,10 @@ This table lists the AI models available in {% data variables.product.prodname_c | {% data variables.copilot.copilot_gpt_5 %} | OpenAI | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_o3 %} | OpenAI | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_o4_mini %} | OpenAI | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | -| {% data variables.copilot.copilot_claude_sonnet_45 %} | Anthropic | {% data variables.release-phases.public_preview_caps %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | +| {% data variables.copilot.copilot_claude_sonnet_45 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_claude_opus_41 %} | Anthropic | GA | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_claude_opus %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | -| {% data variables.copilot.copilot_claude_sonnet_35 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | +| {% data variables.copilot.copilot_claude_sonnet_35 %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-11-06 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_claude_sonnet_37 %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_claude_sonnet_37 %} Thinking | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_claude_sonnet_40 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | @@ -87,7 +87,7 @@ The following table shows which models are available in each client. | {% data variables.copilot.copilot_claude_sonnet_40 %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_gemini_25_pro %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | | {% data variables.copilot.copilot_gemini_flash %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | -| {% data variables.copilot.copilot_grok_code %} | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | +| {% data variables.copilot.copilot_grok_code %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% endrowheaders %} diff --git a/src/content-linter/scripts/lint-content.ts b/src/content-linter/scripts/lint-content.ts index 2d0f18ca8612..a60ef3c83e77 100755 --- a/src/content-linter/scripts/lint-content.ts +++ b/src/content-linter/scripts/lint-content.ts @@ -575,18 +575,22 @@ function getMarkdownLintConfig(errorsOnly, runRules) { for (const searchRule of ruleConfig.rules) { const searchRuleSeverity = getRuleSeverity(searchRule, isPrecommit) if (errorsOnly && searchRuleSeverity !== 'error') continue - searchReplaceRules.push(searchRule) + // Add search-replace rules to frontmatter configuration for rules that make sense in frontmatter + // This ensures rules like TODOCS detection work in frontmatter + // Rules with applyToFrontmatter should ONLY run in the frontmatter pass (which lints the entire file) + // to avoid duplicate detections + if (searchRule.applyToFrontmatter) { + frontmatterSearchReplaceRules.push(searchRule) + } else { + // Only add to content rules if not a frontmatter-specific rule + searchReplaceRules.push(searchRule) + } if (searchRule['partial-markdown-files']) { dataSearchReplaceRules.push(searchRule) } if (searchRule['yml-files']) { ymlSearchReplaceRules.push(searchRule) } - // Add search-replace rules to frontmatter configuration for rules that make sense in frontmatter - // This ensures rules like TODOCS detection work in frontmatter - if (searchRule.applyToFrontmatter) { - frontmatterSearchReplaceRules.push(searchRule) - } } if (searchReplaceRules.length > 0) { diff --git a/src/events/components/events.ts b/src/events/components/events.ts index b3a4ea19d4bb..bcb56b34be0d 100644 --- a/src/events/components/events.ts +++ b/src/events/components/events.ts @@ -98,6 +98,7 @@ export function sendEvent({ // Content information referrer: getReferrer(document.referrer), + title: document.title, href: location.href, // full URL hostname: location.hostname, // origin without protocol or port path: location.pathname, // path without search or host @@ -118,6 +119,9 @@ export function sendEvent({ is_headless: isHeadless(), viewport_width: document.documentElement.clientWidth, viewport_height: document.documentElement.clientHeight, + screen_width: window.screen.width, + screen_height: window.screen.height, + pixel_ratio: window.devicePixelRatio || 1, // Location information timezone: new Date().getTimezoneOffset() / -60, diff --git a/src/events/lib/schema.ts b/src/events/lib/schema.ts index 8db06bd96f0c..e16260bb5b8d 100644 --- a/src/events/lib/schema.ts +++ b/src/events/lib/schema.ts @@ -44,6 +44,10 @@ const context = { description: 'The browser value of `document.referrer`.', format: 'uri-reference', }, + title: { + type: 'string', + description: 'The browser value of `document.title`.', + }, href: { type: 'string', description: 'The browser value of `location.href`.', @@ -142,12 +146,27 @@ const context = { viewport_width: { type: 'number', description: 'The viewport width, not the overall device size.', - minimum: 1, + minimum: 0, }, viewport_height: { type: 'number', description: 'The viewport height, not the overall device height.', - minimum: 1, + minimum: 0, + }, + screen_width: { + type: 'number', + description: 'The screen width of the device.', + minimum: 0, + }, + screen_height: { + type: 'number', + description: 'The screen height of the device.', + minimum: 0, + }, + pixel_ratio: { + type: 'number', + description: 'The device pixel ratio.', + minimum: 0, }, // Location information diff --git a/src/events/tests/middleware.ts b/src/events/tests/middleware.ts index 40e0ce8af7bb..084401720e76 100644 --- a/src/events/tests/middleware.ts +++ b/src/events/tests/middleware.ts @@ -32,6 +32,7 @@ describe('POST /events', () => { path: '/github/docs/issues', hostname: 'github.com', referrer: 'https://github.com/github/docs', + title: 'Issues · github/docs', search: '?q=is%3Aissue+is%3Aopen+example+', href: 'https://github.com/github/docs/issues?q=is%3Aissue+is%3Aopen+example+', path_language: 'en', @@ -44,6 +45,9 @@ describe('POST /events', () => { is_headless: false, viewport_width: 1418, viewport_height: 501, + screen_width: 1920, + screen_height: 1080, + pixel_ratio: 2, // Location information timezone: -7, @@ -64,6 +68,7 @@ describe('POST /events', () => { path: '/github/docs/issues', hostname: 'github.com', referrer: 'https://github.com/github/docs', + title: 'Issues · github/docs', search: '?q=is%3Aissue+is%3Aopen+example+', href: 'https://github.com/github/docs/issues?q=is%3Aissue+is%3Aopen+example+', path_language: 'en', @@ -76,6 +81,9 @@ describe('POST /events', () => { is_headless: false, viewport_width: 1418, viewport_height: 501, + screen_width: 1920, + screen_height: 1080, + pixel_ratio: 2, // Location information timezone: -7, diff --git a/src/events/types.ts b/src/events/types.ts index b66f5e30613b..cbe3c5302338 100644 --- a/src/events/types.ts +++ b/src/events/types.ts @@ -24,6 +24,7 @@ export type EventProps = { created: string page_event_id: string referrer: string + title?: string href: string hostname: string path: string @@ -31,9 +32,10 @@ export type EventProps = { hash: string path_language: string path_version: string + path_product?: string path_article: string - path_document_type: string - path_type: string + page_document_type: string + page_type: string status: number is_logged_in: boolean dotcom_user: string @@ -42,15 +44,21 @@ export type EventProps = { os_version: string browser: string browser_version: string + is_headless: boolean + viewport_width?: number + viewport_height?: number + screen_width?: number + screen_height?: number + pixel_ratio?: number timezone: number user_language: string + os_preference: string application_preference: string color_mode_preference: string - os_preference: string code_display_preference: string + experiment_variation?: string event_group_key?: string event_group_id?: string - is_headless: boolean } }