Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/content/4.api/1.config.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,14 +146,15 @@ Some user-triggered agents may ignore robots.txt rules.

- `false`: Adds no AI blocking group.
- `true`: Blocks every token in `AiBots`, including search and user-directed retrieval agents.
- `'training'`: Blocks `GPTBot`, `ClaudeBot`, `Google-Extended`, `meta-externalagent`, `Applebot-Extended`, and `CCBot`.
- `'training'`: Blocks `GPTBot`, `ClaudeBot`, `Google-Extended`, `meta-externalagent`, `Amazonbot`, `MistralAI-Training`, `Applebot-Extended`, and `CCBot`.

The `'training'` mode leaves dedicated search and answer agents unblocked, including OpenAI, Claude, and Perplexity agents.
Other robots.txt groups and site indexing rules still apply.
The module maintains this curated list locally, with operator sources in [`src/const.ts`](https://github.com/nuxt-modules/robots/blob/main/src/const.ts).

[Google-Extended](https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers#google-extended) controls both Gemini training and grounding.
Blocking it also opts out of grounding in Gemini Apps and Vertex AI, while preserving Google Search inclusion.
[Amazonbot](https://developer.amazon.com/amazonbot) may be used to train Amazon AI models. Amazon's search and answer agents, Amzn-SearchBot and Amzn-User, stay unblocked.
[CCBot](https://commoncrawl.org/about) supplies a shared web archive used for training and other purposes.
Robots.txt cannot guarantee that content stays out of all training datasets.

Expand Down
6 changes: 6 additions & 0 deletions src/const.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ export const AiBots = [
'ImagesiftBot',
'MistralAI-User',
'MistralAI-Index',
'MistralAI-Training',
'AI2Bot',
'DuckAssistBot',
'FirecrawlAgent',
Expand All @@ -96,6 +97,11 @@ export const AiTrainingBots = [
'Google-Extended',
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers/
'meta-externalagent',
// https://developer.amazon.com/amazonbot
// Amazon search and answers use Amzn-SearchBot and Amzn-User, which Amazon says are not used for training.
'Amazonbot',
// https://docs.mistral.ai/robots
'MistralAI-Training',
// https://support.apple.com/en-us/119829
'Applebot-Extended',
// https://commoncrawl.org/about
Expand Down
2 changes: 2 additions & 0 deletions test/e2e/ai-training.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ describe('training opt-out', () => {
'Google-Extended',
'Applebot-Extended',
'meta-externalagent',
'Amazonbot',
'MistralAI-Training',
'CCBot',
]))
for (const bot of [
Expand Down
17 changes: 16 additions & 1 deletion test/unit/const.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest'
import { AiBots } from '../../src/const'
import { AiBots, AiTrainingBots } from '../../src/const'

describe('aiBots', () => {
it('contains unique user-agent tokens', () => {
Expand All @@ -21,3 +21,18 @@ describe('aiBots', () => {
expect(AiBots).not.toContain('GoogleOther')
})
})

describe('aiTrainingBots', () => {
it('is a subset of AiBots, so `true` blocks everything `training` blocks', () => {
expect(AiBots).toEqual(expect.arrayContaining(AiTrainingBots))
})

it('includes the documented training crawlers', () => {
expect(AiTrainingBots).toEqual(expect.arrayContaining(['Amazonbot', 'MistralAI-Training']))
})

it('leaves dedicated search and user-directed agents out', () => {
for (const bot of ['Amzn-SearchBot', 'Amzn-User', 'MistralAI-Index', 'MistralAI-User'])
expect(AiTrainingBots).not.toContain(bot)
})
})
Loading