007AJ AI Ready Full

Version 1.0.3 · Commercial plugin · GPLv2 or later · by 007AJ

An AI chatbot trained on your site and WooCommerce store, llms.txt and llms-full.txt, and full control over AI crawlers with analytics.

Contents

  1. Installation
  2. Quick start
  3. AI providers and API keys
  4. What the chatbot knows
  5. Appearance and embedding
  6. Answers, hand-off and leads
  7. WooCommerce
  8. Chat logs and insights
  9. Limits and abuse protection
  10. llms.txt and llms-full.txt
  11. AI crawler controls
  12. Per-page AI settings
  13. Privacy, GDPR and uninstall
  14. Performance and caching
  15. Multisite
  16. Developer hooks
  17. Troubleshooting
  18. Switching themes, deactivation and removing data
  19. License options
  20. Changelog
  21. Support

1. Installation

  1. Go to Plugins → Add New → Upload Plugin and upload 007aj-ai-ready-pro.zip, or copy the 007aj-ai-ready-pro folder into wp-content/plugins.
  2. Activate it. A new AI Ready menu appears. Your /llms.txt is live straight away together with /llms-full.txt.
  3. Requirements: WordPress 6.2+, PHP 7.4+ with the OpenSSL extension (to store API keys encrypted). Pretty permalinks are recommended.

If the free 007AJ AI Ready plugin is active, this plugin takes over immediately and shows a notice with a link to deactivate the free one. Settings, the index and chat history are shared, so nothing is lost.

2. Quick start

  1. AI Crawlers: choose which AI companies may read your site.
  2. Chatbot: pick a provider (OpenAI, Anthropic, Google Gemini or OpenRouter), paste your API key, click Test connection, tick Turn on the chatbot and save.
  3. Knowledge: choose the content the chatbot learns from and click Rebuild index now. Use the test search to check what it finds.
  4. Visit your site: the chat button appears in the corner.

3. AI providers and API keys

ProviderWhere to get a keywp-config.php constant
OpenAIplatform.openai.com → API keysAJAI_OPENAI_KEY
Anthropic (Claude)console.anthropic.com → API keysAJAI_ANTHROPIC_KEY
Google Geminiaistudio.google.com → Get API keyAJAI_GEMINI_KEY
OpenRouteropenrouter.ai → KeysAJAI_OPENROUTER_KEY

Keys typed in the settings are stored encrypted (AES-256 with an HMAC, using your site's secret keys) and are never printed back or sent to the browser. A key defined in wp-config.php always wins, for example:

define( 'AJAI_OPENAI_KEY', 'sk-...' );

Model: leave it empty to use the suggested model, pick from the list, or click Load models to fetch your account's live list. Smaller models are cheaper and fast enough for site Q&A.

Reply length limit caps the output tokens of each answer.

4. What the chatbot knows

Content is split into passages of about 900 characters and stored in a search table (BM25 ranking with light stemming). It updates automatically when you publish, edit, unpublish or delete content. Password-protected and private content is never indexed. Changing the content settings schedules a full rebuild in the background; Rebuild index now on the Knowledge page does it right away with a progress bar.

Only the best-matching passages (not your whole site) are sent to the AI with each question. The AI is told to answer only from them, cite them as [1], [2] and reply NO_ANSWER if they don't contain the answer, in which case the visitor sees your fallback message.

5. Appearance and embedding

Embedding the chat in a page

6. Answers, hand-off and leads

Leads are listed under AI Ready → Leads with search, a link to the conversation and Export CSV (Excel-friendly UTF-8; cells that could be read as formulas are escaped).

7. WooCommerce

When WooCommerce is active:

8. Chat logs and insights

9. Limits and abuse protection

SettingDefaultWhat it does
Messages per minute6Per visitor (by hashed IP)
Messages per day60Per visitor
Longest question500 charactersLonger messages are refused
Site-wide daily cap0 (none)Total messages per day for the whole site (UTC day)
Monthly token budget0 (none)Tokens per UTC calendar month. A question is only sent when its conservative upper bound still fits; otherwise the chat pauses politely until next month (see below for how exact this is)
Profanity filterOnAbusive messages get a polite reply without calling the AI. Add your own words.

Usage this month (answers and tokens) is shown on the dashboard.

The limits hold under heavy traffic. Before any paid call, the plugin reserves one message of today's cap and a conservative upper bound of the tokens from the monthly budget in a single database update. The update only succeeds when what was already used, plus every reservation still running, plus the new one fits the limit, so parallel questions cannot overshoot it. A question that doesn't fit gets a friendly "try later" message and makes no paid call at all, not even the query embedding. Per-visitor limits are counted the same way.

How the token budget is enforced

  1. Before anything paid runs, the reservation is the largest the request could be: the AI instructions, the full conversation history the widget sends (up to 6 messages of 1,500 bytes) and the question, five source passages of the largest size in your index (with their titles and links), the reply length limit sent to the AI service, and the query embedding when embeddings search is on.
  2. Right before the AI call, the reservation is set to the estimate of the exact request that will be sent (after every filter) plus its reply length limit. If it has grown and no longer fits, the call is not made. A request without a reply length limit is never sent.
  3. Afterwards, every reservation is settled exactly once, in one atomic database update keyed by its own id: the hold is removed and the billable tokens are added to the month in the same step, so usage can never be dropped or counted twice (a second settle of the same reservation changes nothing). This happens whether the visitor got an answer or an error.

What is charged when a request ends

What happenedCharged to the monthCounts as a message
Answer, or an empty, refused/filtered answer, or an AI error, with usage reported by the serviceThe reported tokens (for Anthropic including cache tokens, for Gemini including thinking tokens)Yes
Successful (HTTP 2xx) response that reports no usage, reports zero, or can't be readFallback: the full reservation, which is the estimate of the exact request that was sent plus its whole reply length limitYes
Timed out after the request was sent, gateway timeout (408, 504, 524, 598, 599), or PHP stopped (fatal error, exit) after sendingThe full reservation (it may have run)Yes
Any other AI error without usage (for example 401, 429, 500)NothingNo
Never sent (budget, no key, could not connect)NothingNo

A paid query embedding is always added on top (its reported tokens, or an estimate when it reports none or fails). If a PHP process dies without settling (for example the server kills it), its reservation is found after 10 minutes and charged in full. The visitor always gets a clear message: a refused question asks them to rephrase it, an empty or unreadable answer asks them to try again in other words, and other errors say the assistant is unavailable. The admin Test connection button and the admin search preview's query embedding are added to the month's usage too, without being blocked by the budget.

Estimate: ASCII letters and spaces count as one token per 3 characters (real tokenizers average about 4), and every digit, punctuation mark, symbol and byte of non-ASCII text (accents, other alphabets, emoji) as a full token. In our tests with maximum history and source passages in English, Japanese, Cyrillic, Arabic, emoji and symbol-heavy text, OpenAI's tokenizers counted 33% to 58% of the reservation.

Accuracy limit: the budget is a strong limit, not an exact one. AI services count tokens with their own tokenizers and can add a few of their own (for example for message formatting), and the plugin records what they report. If one answer ever uses more than its reservation, the month can end up over the budget by that difference; from then on new questions are refused until the next month. Building the embeddings index (background indexing) is not counted in the budget. Check your AI provider's dashboard for your total bill, and set a spending limit there too.

10. llms.txt and llms-full.txt

/llms.txt follows the llmstxt.org format: an # H1 with your site name, a > summary, then sections of links with short descriptions.

/llms-full.txt contains the full plain text of your content, for AI tools that read a whole site in one go. Turn it on or off and set the number of items per type. It is capped at 4 MB.

Tick Exclude from llms.txt in the editor sidebar to leave a page out of both files.

The files are cached and served with X-Robots-Tag: noindex. If a physical llms.txt exists in your site root, your web server sends it instead and the plugin warns you.

11. AI crawler controls

The AI Crawlers page lists the known AI crawlers grouped by company. Each user agent is labelled:

Choose a mode per company:

ModeEffect
AllowNo rules added.
Search onlyTraining crawlers are blocked; AI search and user fetchers stay allowed so you can still be cited.
BlockAll of the company's crawlers get Disallow: /.

Rules are added to WordPress's virtual robots.txt. A physical robots.txt file in your site root overrides it; the plugin warns you and shows the rules to paste.

Blocking Google-Extended or Applebot-Extended does not affect Google Search, AI Overviews, Siri or Spotlight.

Server-level blocking

robots.txt is a request. To enforce it:

noai and noimageai

Add noai/noimageai robots meta site-wide, or per page with the editor sidebar toggles. Some AI services honour these.

Crawler analytics

Visits from known AI crawlers are counted per day, crawler and page path, including robots.txt and llms.txt fetches. The Crawler Analytics page shows a stacked bar chart for 7, 30 or 90 days and tables by crawler and by page. No IP addresses are stored. On busy sites, set a sample rate (count 1 in N visits; counts are scaled back up) and the number of days to keep.

AI visibility checklist

Click Run checks on the dashboard. It checks: search engine visibility setting, HTTPS, llms.txt reachability and format, physical llms.txt, robots.txt reachability and a site-wide block, blocked AI search crawlers, XML sitemap, schema.org JSON-LD on the home page, home page noindex, key pages crawlable and the chatbot index. Each item explains what to fix.

12. Per-page AI settings

In the block editor, open the AI settings panel in the document sidebar (or the AI settings box in the classic editor):

13. Privacy, GDPR and uninstall

Uninstall: deleting the plugin removes its tables, settings, scheduled tasks, post meta and .htaccess block on every site of a network. If the free plugin is still installed, shared data is kept for it.

14. Performance and caching

15. Multisite

Network activation sets up every site, and new sites are set up when created. Each site has its own settings, keys, index, logs and llms.txt.

16. Developer hooks

HookTypeUse
ajai_daily_capfilterSite-wide daily message cap (int, 0 = none)
ajai_monthly_token_budgetfilterMonthly token budget (int, 0 = none)
ajai_token_estimatefilterTokens reserved for a chat request before it runs (gets the built-in upper bound and the messages; values below the built-in bound are ignored)
ajai_token_countfilterConservative token count of a piece of text (for a stricter tokenizer; values below the built-in count are ignored)
ajai_query_embedding_tokensfilterTokens a paid query embedding can use for a question, added to the reservation before it is made
ajai_provider_bodyfilterChange the request sent to the AI service (the reservation is checked again on the final body, and a body without a reply length limit is refused)
ajai_chat_abortedactionA question passed ajai_pre_chat but was not answered (cap, budget or AI error)
ajai_system_promptfilterChange the AI instructions
ajai_pre_chatfilterReturn a WP_Error or ['reply' => ...] to short-circuit a question
ajai_chat_responsefilterChange the reply sent to the browser
ajai_search_resultsfilterRe-rank or change the passages used for an answer
ajai_index_postfilterReturn false to keep a post out of the index
ajai_post_documentfilterChange the text indexed for a post
ajai_extra_documentsfilterAdd your own sources to the index
ajai_utility_idsfilterPage IDs never listed or indexed
ajai_llms_textfilterChange llms.txt before it is served
ajai_botsfilterAdd or change known AI crawlers
ajai_show_floatingfilterReturn false to hide the chat button on a page
ajai_widget_configfilterChange the chat settings passed to the browser
ajai_client_ipfilterVisitor IP used for rate limits (behind a proxy)
ajai_provider_timeoutfilterAI request timeout in seconds (default 45)
ajaip_lead_createdactionRuns with the lead's name, email, consent and page after it is saved, for CRMs

The chat REST API is public and unauthenticated by design (so it works with page caching); it is protected by rate limits, length limits and the daily cap. Admin-only endpoints require the manage_options capability.

17. Troubleshooting

/llms.txt shows a 404
Go to Settings → Permalinks and click Save to refresh rewrite rules. Make sure no physical file or server rule is in the way.
"The chat is not available right now"
No API key, an invalid key, an empty provider account or the provider is down. Use Test connection on the Chatbot page; the last error is shown there.
"Sorry, the assistant can't answer that question" or "couldn't put an answer together"
The AI service replied but without a usable answer: it refused or filtered the question, ran out of reply length (raise the reply length limit), or sent nothing readable. The tokens it used are still counted in the month's usage. The cause is shown as the last error on the Chatbot page.
The chatbot says it can't find things that are on the site
Rebuild the index, check the content type is selected and use the test search on the Knowledge page.
robots.txt doesn't show the rules
Delete any physical robots.txt in your site root, or copy the rules into it. Some SEO plugins replace robots.txt entirely; add the rules there.
Testing the AI connection
On the Chatbot page, click Test connection. It sends one tiny request with your key (its tokens are added to this month's usage) and shows the reply or the provider's error (wrong key, no credit, unknown model). The last error from a visitor chat is shown on the same page.
The chat button or inline chat does not appear
Check that the chatbot is turned on and has a working key, clear your page cache and any "combine/delay JavaScript" cache so the new script loads, and look in the browser console for errors from other plugins. The ajai_show_floating filter may hide the button on some pages. Requests go to /wp-json/ajai/v1/; a security plugin or firewall that blocks the REST API for visitors stops the chat.
The index is not built, or old messages are not deleted
Indexing, embeddings and the daily clean-up run on WP-Cron, which only runs when someone visits the site. On low-traffic sites or with DISABLE_WP_CRON, add a real server cron job that calls wp-cron.php every 5 to 15 minutes. You can also rebuild the index from the Knowledge page.
Lead alerts or the daily digest emails don't arrive
They are sent with WordPress's wp_mail(). Many hosts don't deliver PHP mail reliably: install an SMTP plugin, send a test email from it, and check spam. The digest is sent by WP-Cron (see above).
Webhooks
The plugin uses no webhooks and receives no callbacks.

18. Switching themes, deactivation and removing data

19. License options

LicenseSitesPrice (USD)
Lifetime1$14, paid once
Lifetime5$25, paid once
LifetimeUnlimited$50, paid once
Yearly1$9 a year

Every license gets the same features. The plugin has no license key, activation or remote check. Your AI provider bills you separately for usage under your own API key.

20. Changelog

1.0.3

1.0.2

1.0.1

1.0.0

21. Support

Email admin@007aj.com or message us on WPBay. The Get support button at the top of every AI Ready admin page opens an email with your plugin, WordPress and PHP versions filled in.

Please include: the plugin, WordPress and PHP versions, what you did, what you expected and what happened, and any error shown on the Chatbot page.

Never send passwords or API keys. We will never ask for them.