AgDor AI Panel Setup Guide
Turn a stream of ideas into an automated content pipeline. Set it up once and get hundreds of SEO articles published monthly.
🧭 Panel workflow overview
AgDor AI Panel works as a publishing pipeline: connect a site, connect an AI provider, prepare reusable rules and keywords, build a template pipeline, then run a publishing task.
WordPress - install the
api.php file in your WordPress root, see WordPress API.OfferCMS / Custom CMS - install the client
.cms package, see Connecting a site.- 🌐 Domains — connect a site, API URL, API token, and domain-specific AI prompt.
- 🎨 External site template — after installing the client package, customize
.cms/temp: header, menu, cards, sidebar, styles, metrics, and footer. - 🤖 AI Providers — add OpenAI, Gemini, Anthropic, xAI, DeepSeek, Qwen, or a Custom OpenAI-compatible API.
- 📝 Prompts — save reusable instructions: SEO rules, style, constraints, and article format.
- 🔍 Keywords — create keyword sets for generation.
- ⚙️ Templates — build a pipeline from search, parsing, RAG, AI generation, processing, and the final article form.
- ▶️ Tasks — connect a domain, template, and keyword sets, then choose the publishing mode and start the job.
- 📝 Articles — review, create, or manually edit articles when needed.
.cms/temp template first, AI provider second, prompts and keywords third, pipeline template fourth, pipeline test fifth, production task last..cms/temp folder or the full client package .cms to an AI assistant and ask it to create a new public template, redesign it for the niche, change cards, navigation, colors, footer, static pages, and ad/analytics inserts. The important part is not to break the system template variables: $row, $posts, $post, $tophost, $incpage, $currentLang.🌐 Site connection and the .cms client
Publishing to an external site uses the client .cms package. It is a small CMS/API layer that receives publications from the panel, stores articles, images, extra fields, and returns public URLs.
Where to get the package
- Open the 🌐 Domains tab.
- Click Download client (.zip).
- Extract the archive. It contains the site package files:
index.php,classes/,pages/,temp/,vendor/, and other service files.
Option 1: install into a separate blog folder
- Create a
blogfolder in the target site's root directory. - Copy the extracted client package into that folder.
- Check that the API is available at
https://example.com/blog/api.php. - If the host returns 404, configure rewrite rules so requests inside
/blog/are handled by the clientindex.php. - In the panel domain settings, set API URL to
https://example.com/blog/api.php.
This option is safer when the domain already has a site and you do not want to mix the main site's files with the client package.
Option 2: install from the site root
- Copy the extracted client package directly into the site root.
- Use this option only if the whole site should run on OfferCMS, or if you clearly understand which files will be merged with the existing site.
- In the panel domain settings, set API URL to
https://example.com/api.php.
API Token
- On the site, open
classes/integration.php. - In
cms_get_api_token(), replace the default value with a unique long string. - In the panel, open 🌐 Domains → Add domain or edit an existing domain.
- Paste the same string into API Token.
function cms_get_api_token(): string
{
return 'your-unique-secret-token-here';
}
Authorization: Bearer API_TOKEN. If the site token and panel token do not match, publishing fails with an authorization error.🌐 Domains — site management
The Domains tab controls the sites where generated content will be published.
- Download client (.zip) — downloads the current client package for site installation. If a newer version is available, the button can show a NEW badge.
- Add domain — opens the site connection form.
- ✏️ — edit a domain.
- 🗑️ — delete a domain from the panel.
Domain fields
- Domain — the domain name, for example
example.com. - API URL — the full client API URL:
https://example.com/api.phporhttps://example.com/blog/api.php. - API Token — the secret string from
cms_get_api_token()on the site. - System prompt — rules for this specific site: language, tone, audience, topic, structure, restrictions, and publishing requirements.
The domain prompt is available inside AI steps as {{domain_aiprompt}}. This lets one template work across multiple sites with different editorial rules.
🤖 AI Providers — model connections
AI providers are configured separately from templates. This makes it easy to reuse templates with different keys, accounts, and models.
Buttons and actions
- Add provider — creates a new provider connection.
- ✏️ — edits a saved provider.
- 🧪 — sends a test request and shows HTTP code, model, response text, and troubleshooting hints.
- 🗑️ — deletes the provider. Templates using it will require attention.
Provider fields
- Provider type — Gemini, OpenAI, Anthropic, xAI, DeepSeek, Qwen, or Custom.
- Name — a readable connection name. You can keep the generated name or rename it by account/key purpose.
- Qwen region — shown only for Qwen.
- API URL — shown for Custom OpenAI-compatible APIs.
- Available models — one model per line. Template LLM steps select models from this saved list.
- 🔄 Refresh models — the button near the models field. It requests the provider model catalog, shows a preview, and lets you insert the fetched list.
- API key — the provider key.
- Active — only active providers are available for new LLM steps.
The provider card shows ID, type, capabilities, model count, active status, and possible runtime issues such as insufficient balance, invalid key, rate limit, model not found, or timeout.
📝 Prompts — global rules
Global prompts store reusable instructions used across templates: SEO rules, editorial style, source requirements, restrictions, output format, and markup rules.
- Create prompt — adds a new reusable prompt.
- Name — the name used to insert the prompt into templates.
- Content — the instruction text.
- Category — optional grouping, for example
seo,style,html,review.
Insert a prompt into an LLM step with:
{{prompt:"seo_article_rules"}}
This keeps large stable instructions in one place instead of copying them into every template.
🔍 Keywords — keyword sets
The Keywords tab stores keyword databases. One task can use one or several sets.
- Create / add set — creates a new set or adds keywords to an existing set.
- Set name — a readable name, for example
Founders CRM ENorCBD Reviews PT. - Drag & drop .txt — upload a text file with keywords.
- Manual input — paste one keyword per line.
- Rename — renames the selected set.
- Clear — removes keywords but keeps the set.
- Delete set — removes the set completely.
In a pipeline, the current keyword is available as {{keyword}}. During a task, the system runs the template for each keyword in the selected sets.
⚙️ Templates — pipeline builder
A Template is the generation scheme. It defines what should happen to a keyword: collect SERP, fetch pages, build RAG context, generate an article, extract fields, and send final article data to publishing.
Main template window elements
- Template name — the pipeline name in the list.
- Type —
ArticleorKeywords. - Step palette — buttons for adding steps: 🤖 AI, 🧪 Processing, 🧩 Transform, 🔎 Search, 📰 News, 🖼️ Images, 🎞️ Videos, 📄 Article by URL, 🌐 HTML by URL, 📝 Article form.
- Canvas — a visual map of steps. Cards can be arranged for readability.
- − / + / 100% / Fit / Reset layout — zoom and layout controls.
- Execution order — the actual step order. This order decides which outputs are available to later steps.
- Focus first error — jumps to the first step where a macro references a missing or future step.
- Show/hide JSON editor — manual JSON editing for advanced changes or template transfer.
{{step.search.output}}, the search step must execute earlier.🧱 Pipeline step types
🤖 AI
An LLM step sends a prompt to the selected AI provider and stores the text response as the step output.
- Step ID — a short name, for example
query_plan,article_mode,final_article. - Provider — an active connection from AI Providers.
- Type — text, text batch, image, video, or music if supported by the provider.
- Model — selected from the provider model list.
- Role —
userorsystem. - Global prompt — a saved prompt that can be inserted as a macro.
- Prompt — the main instruction text. It can use variables and outputs from previous steps.
- Variables — the button near the prompt field that inserts available macros.
- Insert cache block — wraps the stable part of a prompt in
AIPANEL_CACHEwhen the provider supports prompt caching. - Temperature — response variability.
- Max tokens — response length limit.
- Batch wait seconds — shown for
text batch. Batch is cheaper but may take longer.
🔎 / 📰 / 🖼️ / 🎞️ Sources
Collector steps retrieve data from search, news, images, videos, or exact URLs.
- Search — web SERP: Google, Bing, Yandex, Yahoo.
- News — news search.
- Images — image search.
- Videos — YouTube or Yandex video.
- Article by URL — fetches and extracts page content from URL lists.
- HTML by URL — fetches page HTML from URL lists.
- Query source — keyword, text, or a previous-step variable such as
{{keyword}}or{{step.query_plan.output}}. - SERP result limit — results per query, from 1 to 100.
Search collector output is structured: results, related, and total_items. Result rows can include query, rank, link, title, content, date, and thumb.
🧪 Processing / RegExp
A RegExp step extracts or replaces text fragments.
- Source — text or previous step output.
- Pattern — regular expression.
- Flags — regex modifiers.
- Extract first match — returns the first match.
- Extract all matches — returns matches separated by new lines.
- Replace matches — performs regex replacement.
🧩 Transform
Transform steps clean and prepare data between collectors and AI steps.
- Dedupe lines, Join lines, Slice chars, Shuffle array, Slice array, Strip HTML, Trim.
- Extract from JSON — takes a required fragment from JSON.
- String to array and Array to JSON — change data format for later steps.
- Build RAG context — creates compact context from fetched documents.
RAG settings include maximum total characters, maximum sources, maximum documents per host, chunk size, and chunk overlap.
📝 Article form
The final publishing step. It maps previous step outputs into article fields.
- Article title — for example
{{step.title_extract.output}}. - Description — meta description or summary.
- Image — main image URL or an image-step variable.
- Content (Markdown) — final article body.
- Extra fields — key/value pairs sent as
xfields_json.
en, pt, blog, or reviews.🔗 Variables and macros
Macros connect steps together. They insert the keyword, domain, domain prompt, global prompts, and previous-step outputs.
{{keyword}}— current keyword.{{domain}}— target site domain.{{domain_aiprompt}}— domain system prompt.{{prompt:"prompt_name"}}— global prompt from Prompts.{{step.step_id.output}}— full output of a previous step.{{step.images.1.link}},{{step.search.output}}, and similar variables — structured fields when available.
The Variables button in the step editor shows macros available for the current step and previous outputs.
🚀 Recommended SEO article pipeline
For a high-quality SEO article, it is usually better to use a research → context → generation → extraction → article form chain rather than a single AI step.
- 🤖 query_plan — AI creates 3–5 search queries from
{{keyword}}and{{domain_aiprompt}}. - 🔎 search — collector gathers SERP from
{{step.query_plan.output}}. - 🧩 clean_search — transform dedupes, limits, or extracts the needed links.
- 📄 articles — Article by URL collector fetches pages from found URLs.
- 🧩 rag_context — Build RAG context compresses fetched materials into compact context.
- 🖼️ images — image collector finds a main image or image ideas by keyword.
- 🤖 final_article — AI writes the final article using RAG, domain prompt, SEO rules, and required format.
- 🧪 title_extract / description_extract / content_extract — RegExp steps extract fields if AI returned one combined block.
- 📝 article_form — maps title, description, markdown, image, and extra fields for publishing.
For a simple template, you can use only 🤖 final_article → 📝 article_form. For more useful articles, add search, source fetching, and RAG.
<!-- AIPANEL_CACHE -->
Stable template rules:
- article structure;
- SEO requirements;
- style;
- restrictions;
- output format.
<!-- AIPANEL_CACHE_END -->
Keyword: {{keyword}}
Domain rules: {{domain_aiprompt}}
Research context: {{step.rag_context.output}} 💰 Prompt caching (AIPANEL_CACHE)
Prompt caching is a built-in provider mechanism that allows caching the static part of a prompt. Subsequent requests with the same static block take it from the cache instead of reprocessing it, which reduces the request cost.
Which providers support it
- Anthropic Claude - supported, cache works at the API level.
- Google Gemini - supported (implicit caching), enabled automatically.
- OpenAI - supported for GPT-4o models and higher.
- Other providers do not use caching, markers in the prompt will be ignored.
When is it useful
Caching works well if the prompt contains a large static block: SEO rules, style, article structure, restrictions, response format. The longer the static block and the more frequently the template runs - the higher the savings.
How to use it
In the LLM step editor, there is an Insert cache block button. It wraps the selected part of the prompt in markers. You can also insert them manually:
<!-- AIPANEL_CACHE -->
Here are the permanent rules that do not change from request to request:
- SEO requirements, style, structure, restrictions, response format
<!-- AIPANEL_CACHE_END -->
Keyword: {{keyword}}
Domain rules: {{domain_aiprompt}}
Research context: {{step.rag_context.output}}
🧪 Testing a template
Before production use, test the template directly inside Templates.
- Open the template.
- In Pipeline testing, choose a domain. This checks
{{domain}}and{{domain_aiprompt}}. - Choose a keyword set or keep Manual input.
- Select or type a test keyword.
- Click Run test.
During testing, the panel shows step progress. After execution, you can open step debug and inspect inputs, rendered prompt, provider response, regexp/transform result, RAG context, and final article structure.
▶️ Tasks — generation and publishing
A task connects a domain, template, and keyword sets. For each keyword, the system runs the pipeline and publishes the result to the site through the client API.
Creating a task
- Domain — the target site.
- Template — the generation pipeline. Templates with Needs attention cannot run until provider or macro issues are fixed.
- Keyword sets — choose one or more sets. If empty, the task runs without keywords.
- Publishing mode — publish all, only N articles, or scheduled mode.
- Max articles — used in limited mode.
- Articles per period / Period hours — used in scheduled mode.
- Language / URL section — forced URL segment, for example
en,pt,blog,reviews. - Skip used keywords — prevents duplicate generation for already processed keywords.
- Notify Google and Notify Bing — send notifications after successful publication.
Statistics and statuses
- Total, Running, Completed, Failed — task statistics.
- Slots — available, used, and free execution slots.
- Lacking — tasks waiting for free slots.
- Pending, Running, Waiting for batch, Completed, Failed, Paused, Cancelled — task states.
Task actions
- Details — shows progress, publication result, published URLs, errors, search notifications, and execution log.
- Edit — changes task settings.
- Pause — stops further execution.
- Resume/restart — continues or restarts when a slot is available.
- Cancel — cancels execution.
- Delete task — removes the task and related data.
📝 Articles — manual article management
The Articles tab is used for reviewing and manually editing materials. It is useful when you need to create an article without a pipeline or inspect existing records.
- Domain filter — shows articles for one site.
- Status filter — draft, ready for review, or published.
- Refresh — reloads the list.
- Create article — opens the manual article form.
Article fields
- Status — draft, ready for review, or published.
- Language — for example
en,pt,ru. - Slug — article URL slug.
- Heading — article H1/title.
- Description — meta description or summary.
- Content — Markdown content.
- Main image — file upload, image URL, or base64.
- Extra fields — custom fields saved as JSON.
🎨 .cms/temp — public site template
The .cms/temp folder is not the pipeline template from the panel's Templates tab. It is the public site template. This is where you customize how published articles look for visitors: header, menu, home/listing page, post cards, article page, sidebar, footer, colors, CSS, metrics, and advertising inserts.
.cms/temp folder controls the public design. These are two different layers, and both must be configured.Main template files
temp/temp.php— the main HTML template. It usually controls<head>, title/description, canonical, JSON-LD, header, navigation, main container, article output, sidebar output, and footer.temp/css/style.css— site styles: colors, container width, cards, navigation, typography, responsiveness, buttons, pagination, and sidebar.temp/short.php— the small article card used on the home page, language pages, listing pages, and pagination pages.temp/sidebar.php— the related/random article card used in the sidebar on article pages.temp/metric.php— analytics, advertising scripts, pixels, counters, and other inserts loaded by the main template.pages/— static pages:about,contact,privacy,terms,cookies,disclaimer,legal. These should also be adapted for the specific site.
What must be customized for each site
- Open
.cms/temp/temp.php. - Replace the site name, for example
$siteName,$defaultTitle, and$siteTagline. - Review navigation links: Home, Blog, About, Contact, Privacy, Terms. Remove what is unnecessary or add the required sections.
- Review the hero text on the home/listing page. It must match the site's niche, language, and audience.
- Review the footer: project name, description, contacts, and legal links.
- Open
.cms/temp/css/style.cssand customize the palette in the:rootblock: background, brand color, accent color, container width, radius, and spacing. - Open
.cms/temp/metric.phpand replace or remove foreign analytics IDs, ad codes, and pixels. Do not leave someone else's Google AdSense, Yandex.Metrika, or any other third-party IDs. - Open files in
.cms/pages/and replace the default texts with pages for the specific project.
Data available inside the template
$row['title']— current page or article title.$row['description']— meta description or short description.$row['html_content']— final article HTML or the list of cards on the home/listing page.$row['image_url']— the main article image, if it was provided or found by the system.$row['date']/$row['public_date']— publication date, when available.$row['sidebar']— sidebar HTML with random/related posts, when built.$posts— the post list on the home page, language page, or pagination page.$post— one post insideshort.phporsidebar.php.$tophost,$hostname,$incpage,$currentLang,$pagePath— service variables for URL, domain, language, and current page.
short.php or sidebar.php, remember that they use the $post variable. When editing temp.php, the main page variable is $row.How the engine uses temp files
- For the home page and pagination pages, the engine collects published articles, renders each item through
short.php, then outputs the result throughtemp.php. - For an article page, the engine loads the article, prepares
$row['html_content'], builds$row['sidebar']throughsidebar.php, then includestemp.php. - If the template folder contains
fullpage.php, it can be used for specific internal pages instead of the standardtemp.php. metric.phpis usually included fromtemp.php, so analytics and advertising scripts can be kept in one separate file.
Minimum checklist before publishing
- The site home page opens.
- An article opens by its public URL.
- Images do not break the mobile layout.
- The menu links point to existing pages.
- The footer has no foreign brand, foreign links, or placeholder text.
metric.phphas no foreign ad network or analytics IDs.- The page source contains proper
title,meta description, canonical, and, when needed, JSON-LD. privacy,terms,contact, andaboutpages are filled for the specific site.
WordPress API — Connecting the Bridge
To publish content to WordPress sites, a dedicated api.php bridge is used. The panel sends publications, checks URL uniqueness, updates posts, and uploads media files through this script.
Installation and Setup
- Download the WordPress bridge script: in the documentation header or domain settings, click Download WordPress Client (or use the link
api.php, auth required). - Copy the downloaded
api.phpfile to the root directory of your WordPress installation (wherewp-load.phpis located). - Open your WordPress
wp-config.phpfile and define a secure API token:define('AIPANEL_API_TOKEN', 'your-long-secure-token'); - In the AIPanel control panel, when adding a domain, specify:
- API URL:
https://yourdomain.com/api.php - API Token: the exact token defined in
wp-config.php
- API URL:
Bridge Features
- Supported Actions: connection test (
ping), publish post (publish_post), edit post (edit_post), delete post (delete_post), and slug availability check (check_slug). - SEO Plugin Integration: automatically writes SEO title and meta description for Yoast SEO (
_yoast_wpseo_title,_yoast_wpseo_metadesc) and Rank Math (rank_math_title,rank_math_description). - Categories and Tags: supports passing categories and tags arrays inside the
xfields_jsonfield (structure:{"categories": ["Category 1", "Category 2"], "tags": ["Tag 1", "Tag 2"]}). If a category or tag does not exist, it will be created automatically. - Custom Post Types: by default, posts are published under the standard
posttype. You can override this by passing the post type insidexfields_json(e.g.{"post_type": "product"}or{"post_type": "page"}). - Images: automatically downloads the featured image from a URL or decodes a base64 image string, inserts it into the WordPress Media Library, and sets it as the post's Featured Image.
📋 Example JSON Pipelines
Here are ready-to-use pipeline templates in JSON format that you can import using the Show/hide JSON editor button in the ⚙️ Templates tab.
1. Simple SEO Article
A minimal template: sends a prompt to the AI, extracts title, description, and content tags using RegExp, and maps them to the publication form.
[
{
"id": "draft_article",
"type": "llm",
"provider_id": 0,
"ai_capability": "text",
"model": "",
"prompt_role": "user",
"prompt_text": "Keyword: {{keyword}}\nDomain: {{domain}}\n\n{{domain_aiprompt}}\n\n\n{{prompt:\"seo_article_rules\"}}\n{{prompt:\"article_output_contract\"}}\n\nWrite a practical SEO article for the keyword. Vary the number of sections naturally; include FAQ only when it helps the topic.\n",
"temperature": 0.4,
"max_tokens": 4096,
"output_key": "output"
},
{
"id": "extract_title",
"type": "regexp",
"mode": "extract",
"input_source": "{{step.draft_article.output}}",
"pattern": "\\s*(.*?)\\s* ",
"flags": "si",
"output_key": "output"
},
{
"id": "extract_description",
"type": "regexp",
"mode": "extract",
"input_source": "{{step.draft_article.output}}",
"pattern": "\\s*(.*?)\\s* ",
"flags": "si",
"output_key": "output"
},
{
"id": "extract_content",
"type": "regexp",
"mode": "extract",
"input_source": "{{step.draft_article.output}}",
"pattern": "\\s*(.*?)\\s* ",
"flags": "si",
"output_key": "output"
},
{
"id": "article",
"type": "article_form",
"title": "{{step.extract_title.output}}",
"description": "{{step.extract_description.output}}",
"markdown": "{{step.extract_content.output}}",
"lang": "{{domain_lang}}",
"slug": "",
"main_image": "",
"xfields_json": "[]",
"public": 1
}
]
2. Keyword Expansion
A "Keywords" type template to generate related search topics based on a seed keyword.
[
{
"id": "expand_keywords",
"type": "llm",
"provider_id": 0,
"ai_capability": "text",
"model": "",
"prompt_role": "user",
"prompt_text": "Seed keyword: {{keyword}}\nDomain: {{domain}}\n\n{{domain_aiprompt}}\n\n\nGenerate 20 useful long-tail keyword ideas for content planning. Keep them specific, natural, and suitable for article topics.\nReturn one keyword per line, no numbering, no commentary.\n",
"temperature": 0.35,
"max_tokens": 2048,
"output_key": "output"
},
{
"id": "keywords",
"type": "transform",
"operation": "split_to_array",
"arg1": "{{step.expand_keywords.output}}",
"delimiter": "\n",
"array_limit": 20,
"output_key": "output"
}
]
3. Advanced Affiliate Template with Search & RAG
A complex pipeline for product reviews: queries Google, downloads target pages, builds RAG context, and feeds it to the AI step.
[
{
"id": "affiliate_queries",
"type": "llm",
"provider_id": 0,
"ai_capability": "text_batch",
"model": "",
"prompt_role": "user",
"prompt_text": "Affiliate review idea: {{keyword}}\nDomain: {{domain}}\n\n{{domain_aiprompt}}\n\n\nGenerate 5 focused web search queries that support an affiliate review. Return one query per line only.\n",
"temperature": 0.2,
"max_tokens": 1024,
"output_key": "output"
},
{
"id": "affiliate_split_queries",
"type": "transform",
"operation": "split_to_array",
"arg1": "{{step.affiliate_queries.output}}",
"delimiter": "\n",
"array_limit": 5,
"output_key": "output"
},
{
"id": "affiliate_search",
"type": "collector",
"channel": "web",
"engine": "google",
"query_source": "{{step.affiliate_split_queries.output}}",
"serp_limit": 5,
"output_key": "output",
"concurrency": 6
},
{
"id": "affiliate_slice_search_results",
"type": "transform",
"operation": "slice_array",
"arg1": "{{step.affiliate_search.output}}",
"array_limit": 3,
"output_key": "output"
},
{
"id": "affiliate_html",
"type": "collector",
"channel": "html_fetch",
"engine": "html_fetch",
"query_source": "{{step.affiliate_slice_search_results.output}}",
"output_key": "output"
},
{
"id": "affiliate_rag",
"type": "transform",
"operation": "rag_builder",
"arg1": "{{step.affiliate_html.output}}",
"array_limit": 5,
"output_key": "output",
"max_total_chars": 16000,
"max_sources": 10,
"chunk_size": 900,
"chunk_overlap": 80
},
{
"id": "affiliate_generate",
"type": "llm",
"provider_id": 0,
"model": "",
"prompt_role": "user",
"prompt_text": "Keyword: {{keyword}}\nDomain: {{domain}}\nResearch context:\n{{step.affiliate_rag.output}}\n\n{{domain_aiprompt}}\n\nWrite a practical affiliate review. Format output inside tags:\n<TITLE>[title]</TITLE>\n<DESCRIPTION>[description]</DESCRIPTION>\n<CONTENT>[content]</CONTENT>",
"temperature": 0.45,
"max_tokens": 6144,
"output_key": "output"
},
{
"id": "affiliate_extract_title",
"type": "regexp",
"mode": "extract",
"input_source": "{{step.affiliate_generate.output}}",
"pattern": "\\s*(.*?)\\s* ",
"flags": "si",
"output_key": "output"
},
{
"id": "affiliate_extract_description",
"type": "regexp",
"mode": "extract",
"input_source": "{{step.affiliate_generate.output}}",
"pattern": "\\s*(.*?)\\s* ",
"flags": "si",
"output_key": "output"
},
{
"id": "affiliate_extract_content",
"type": "regexp",
"mode": "extract",
"input_source": "{{step.affiliate_generate.output}}",
"pattern": "\\s*(.*?)\\s* ",
"flags": "si",
"output_key": "output"
},
{
"id": "affiliate_article",
"type": "article_form",
"title": "{{step.affiliate_extract_title.output}}",
"description": "{{step.affiliate_extract_description.output}}",
"markdown": "{{step.affiliate_extract_content.output}}",
"lang": "{{domain_lang}}",
"slug": "",
"main_image": "",
"xfields_json": "[]",
"public": 1
}
] 🛠️ Troubleshooting
- Site does not accept publishing — check API URL, token in
classes/integration.php, rewrite rules, andapi.phpavailability. - auth_failed — the panel token does not match the site token.
- Model is missing in an LLM step — open the provider, fetch models with 🔄, or enter models manually.
- Template needs attention — an AI step has no provider, uses a deleted provider, or a macro points to a future/deleted step.
- Search returned 0 results — check the query, search backend, SERP limit, proxy/source availability.
- Article by URL did not load — make sure the previous step returns real URLs, not plain text without links.
- RAG is empty — make sure the article-fetching step returns documents with HTML content.
- Batch is stuck or timed out — increase batch wait time or use normal text mode.
- Publication succeeded but URL looks wrong — check Language / URL section, slug, title, and client-side slug generation.