> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aipower.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Content Writer

> Generate, update, and schedule WordPress content with AI Puffer.

## Overview

Content Writer creates WordPress content from topics, CSV files, RSS feeds, web pages, and Google Sheets. It can also update existing posts, image metadata, and WooCommerce product copy.

To start using Content Writer, open WordPress Admin and go to **AI Puffer > Content Writer**.

<Columns cols={2}>
  <Card title="Create Content" icon="file-plus" href="#create-content" horizontal>
    Generate posts from topics, CSV, RSS, URLs, and Sheets.
  </Card>

  <Card title="Optimize" icon="wand-sparkles" href="#optimize" horizontal>
    Rewrite posts, update image metadata, and edit products.
  </Card>

  <Card title="Templates" icon="copy" href="#templates" horizontal>
    Save reusable writer settings.
  </Card>

  <Card title="AI" icon="sparkles" href="#ai" horizontal>
    Choose the provider, model, and generation settings.
  </Card>

  <Card title="Prompts" icon="comment" href="#prompts" horizontal>
    Customize instructions for each generated output.
  </Card>

  <Card title="SEO" icon="search" href="#seo" horizontal>
    Generate metadata and improve SEO scores.
  </Card>

  <Card title="Publishing" icon="calendar-clock" href="#publishing" horizontal>
    Set post type, status, author, taxonomy, and schedule.
  </Card>

  <Card title="Images" icon="image" href="#images" horizontal>
    Generate or search images for content.
  </Card>

  <Card title="Knowledge Base" icon="database" href="#knowledge-base" horizontal>
    Use vector data while generating content.
  </Card>

  <Card title="Logs" icon="list" href="#logs" horizontal>
    Review generated content activity.
  </Card>
</Columns>

## Create Content

To create new content, first choose where the input comes from.

You can type topics manually, upload a CSV, use RSS feed items, extract text from web pages, or read rows from Google Sheets.

Manual Entry is for topics you type directly into Content Writer.

Choose **Single**, **Batch Editor**, or **Quick Paste**, then use the right panel to select the model, edit prompts, set publishing options, add images, and enable SEO.

<Info>
  Set up at least one AI provider before using Content Writer. If the model list is empty, configure and sync a provider in [AI Providers](/ai-providers).
</Info>

### Single Entry

Single Entry is for one content item.

1. Select **Manual Entry**.
2. Select **Single**.
3. Enter the topic.
4. Add keywords if needed.
5. Choose the provider, model, and content length.
6. In the right-side **General** card, click **Customize** next to **Prompts** if you want to edit the instructions.
7. Set the post type, status, author, categories, table of contents, and URL option.
8. Click **Generate**.
9. Review the output.
10. Save it as a WordPress post when ready.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/single-entry.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=51fc2196a756d90377e89b00de89b604" alt="Content Writer Single Entry" width="1904" height="1418" data-path="images/screenshots/content-writer/single-entry.png" />
</Frame>

### Batch Editor

Batch Editor is a row-based queue. Each row creates one content item.

The main row fields are **Topic** and **Keywords**. Click the row settings icon to set **Category**, **Author**, **Post Type**, and **Schedule** for that row.

1. Select **Manual Entry**.
2. Select **Batch Editor**.
3. Add one topic per row.
4. Add keywords or row settings where needed.
5. Choose the shared model, prompts, publishing, image, and SEO settings.
6. If row schedules should be used, set publishing to **Publish** and select **Use Dates from Input**.
7. Click **Generate** or **Create Task**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/batch-editor.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=76ea099eea4752d5fca0ea9dacf901de" alt="Content Writer Batch Editor" width="2586" height="1422" data-path="images/screenshots/content-writer/batch-editor.png" />
</Frame>

### Quick Paste

Quick Paste is for adding many rows at once. Each line becomes one Batch Editor row.

Only the topic is required. Optional fields can be added with a pipe character.

Quick Paste format:

```text theme={null}
Topic | Keywords | Category ID | Author Login | Post Type | YYYY-MM-DD HH:MM
```

Example:

```text theme={null}
How to clean leather boots | leather care, boots | 12 | editor | post | 2026-05-01 09:00
```

You can also enter only a topic:

```text theme={null}
How to clean leather boots
```

To use Quick Paste:

1. Select **Manual Entry**.
2. Select **Quick Paste**.
3. Paste one topic per line.
4. Switch to **Batch Editor** if you want to review or edit the rows.
5. Choose the shared model, prompts, publishing, image, and SEO settings.
6. If lines include schedule dates, set publishing to **Publish** and select **Use Dates from Input**.
7. Click **Generate** or **Create Task**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/quick-paste.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=c658a87a03b3f3cf4c2c34832c99b655" alt="Content Writer Quick Paste" width="2586" height="1422" data-path="images/screenshots/content-writer/quick-paste.png" />
</Frame>

### CSV

CSV import reads every non-empty row and converts it into a generation task.

[Download sample CSV](https://docs.google.com/spreadsheets/d/1WOnO_UKkbRCoyjRxQnDDTy0i-RsnrY_MDKD3Ks09JJk/export?format=csv\&gid=0)

1. Select **Import CSV**.
2. Upload a `.csv` file.
3. Confirm the number of tasks found.
4. Set model, prompts, publishing, and other options.
5. Click **Generate** or **Create Task**.

CSV columns are read in this order:

| Column | Field        | Required |
| ------ | ------------ | -------- |
| 1      | Topic        | Yes      |
| 2      | Keywords     | No       |
| 3      | Category ID  | No       |
| 4      | Author Login | No       |
| 5      | Post Type    | No       |
| 6      | Schedule     | No       |

<Warning>
  Do not add a header row unless you want the header row to be treated as a topic.
</Warning>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/csv.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=9c9dfac017f4d1480be9ac971fea2acc" alt="Content Writer CSV" width="2586" height="1422" data-path="images/screenshots/content-writer/csv.png" />
</Frame>

### RSS Feed

Use RSS Feed to generate content from feed items.

1. Select **RSS Feed**.
2. Add one feed URL per line.
3. Add **Include** keywords if only matching titles should be used.
4. Add **Exclude** keywords if matching titles should be skipped.
5. Click **Fetch Feeds** to preview available items.
6. Click **Generate** or **Create Task**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/rss.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=d121818f4179b99273c0e02bc49ebbff" alt="Content Writer RSS" width="2586" height="1422" data-path="images/screenshots/content-writer/rss.png" />
</Frame>

Our plugin checks up to 15 items per feed. Automated RSS tasks keep a history of processed feed items so the same item is not queued again.

### Web Page

Use Web Page to generate content from a list of URLs.

1. Select **Web Page**.
2. Add one URL per line.
3. Click **Test First URL** to preview extracted text.
4. Set prompts and publishing options.
5. Click **Generate** or **Create Task**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/url.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=58d5cd8e9d0e08c87214876f8666f027" alt="Content Writer URL" width="2586" height="1422" data-path="images/screenshots/content-writer/url.png" />
</Frame>

When using Web Page mode, prompts can use:

| Placeholder     | Value                |
| --------------- | -------------------- |
| `{url_content}` | Extracted page text. |
| `{source_url}`  | Source URL.          |

<Warning>
  Some pages block extraction or return very little readable text. Use **Test First URL** before creating a large task.
</Warning>

### Google Sheets

Use Google Sheets when your content inputs are managed in a spreadsheet.

[Open the sample Google Sheet](https://docs.google.com/spreadsheets/d/18QIWggMmbTVTb-nztTo7SFdGJTUC6kwRxgc841xq4x0/edit?gid=0#gid=0), make a copy, and keep the same column order.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-sheets-make-copy.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=6028e37a89b639a44aeed7e327d130d1" alt="Copy the sample Google Sheet" width="1034" height="1326" data-path="images/screenshots/google-sheets/google-sheets-make-copy.png" />
</Frame>

AI Puffer reads columns `A:G`.

| Column | Field         | Notes                                          |
| ------ | ------------- | ---------------------------------------------- |
| A      | Topic         | Required.                                      |
| B      | Keywords      | Optional.                                      |
| C      | Category ID   | Optional.                                      |
| D      | Author Login  | Optional.                                      |
| E      | Post Type     | Optional.                                      |
| F      | Schedule Date | Optional. Use `YYYY-MM-DD HH:MM`.              |
| G      | Status        | Leave empty for rows that should be processed. |

<Warning>
  Column G controls whether a row is processed. If column G has any value, AI Puffer skips that row.
</Warning>

Rows are processed only when column A has a topic and column G is empty. After a post is created, AI Puffer writes `Processed on ...` to column G so the row is not used again.

If you use a header row, put a value in column G for that row, such as `Status`, so it is skipped.

AI Puffer uses a Google Cloud <Tooltip headline="Service account" tip="A Google Cloud identity used by AI Puffer to access the spreadsheet without a personal Google login.">service account</Tooltip> to read the sheet and update the status column.

Create the service account:

1. Open [Google Cloud Console](https://console.cloud.google.com/).
2. Create a new project, or select an existing project.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-new-project.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=ac8976ccbd27b8e40b37d2fe32cdb118" alt="Create a Google Cloud project" width="1536" height="390" data-path="images/screenshots/google-sheets/google-cloud-new-project.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-name-project.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=988623284bbdc5ae5faed4f8213ef918" alt="Name the Google Cloud project" width="1170" height="726" data-path="images/screenshots/google-sheets/google-cloud-name-project.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-select-project.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=12c5e7852bfc9d1b09e7cc7c796e0cfc" alt="Select the Google Cloud project" width="968" height="664" data-path="images/screenshots/google-sheets/google-cloud-select-project.png" />
</Frame>

3. Open the project dashboard.
4. Go to **APIs & Services**.
5. Click **Enable APIs and Services**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-dashboard.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=7a997e8bea58c765b5143c49a93f78c5" alt="Google Cloud dashboard" width="1504" height="544" data-path="images/screenshots/google-sheets/google-cloud-dashboard.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-api-overview.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=76d03650a4c3ae9040419c83441dd068" alt="Google Cloud APIs overview" width="938" height="852" data-path="images/screenshots/google-sheets/google-cloud-api-overview.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-enable-apis.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=9e91dc0aa3527861897f94987196d201" alt="Enable Google Cloud APIs" width="1198" height="838" data-path="images/screenshots/google-sheets/google-cloud-enable-apis.png" />
</Frame>

6. Search for **Google Sheets API**.
7. Select **Google Sheets API**.
8. Click **Enable**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-search-sheets-api.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=6723f3f25e1fc70d9a85b81715e60d80" alt="Search for Google Sheets API" width="1410" height="444" data-path="images/screenshots/google-sheets/google-cloud-search-sheets-api.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-select-sheets-api.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=8d3870fcec81414a62ca7e0c17b5ac47" alt="Select Google Sheets API" width="1448" height="408" data-path="images/screenshots/google-sheets/google-cloud-select-sheets-api.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-enable-sheets-api.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=f0df3ecb1c8a463f334f33b87ec69172" alt="Enable Google Sheets API" width="1234" height="508" data-path="images/screenshots/google-sheets/google-cloud-enable-sheets-api.png" />
</Frame>

9. Go to **Credentials**.
10. Click **Create credentials**.
11. Select **Service account**.
12. Enter a service account name and click **Done**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-credentials.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=4be053e34b002b33a1f581740dbb1c20" alt="Open Google Cloud credentials" width="1498" height="630" data-path="images/screenshots/google-sheets/google-cloud-credentials.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-create-service-account.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=6a528cda49ebc50e63494a821c71cb95" alt="Create service account credentials" width="1720" height="1232" data-path="images/screenshots/google-sheets/google-cloud-create-service-account.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-service-account-done.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=44d8c8b34fd7538628b718ac689fad97" alt="Finish service account creation" width="1360" height="1352" data-path="images/screenshots/google-sheets/google-cloud-service-account-done.png" />
</Frame>

13. Open the service account.
14. Go to **Keys**.
15. Click **Add key**.
16. Select **Create new key**.
17. Select **JSON** and click **Create**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-select-service-account.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=b80848c286d307cb3a3eea23a7c0ea23" alt="Open the service account" width="2048" height="512" data-path="images/screenshots/google-sheets/google-cloud-select-service-account.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-service-account-keys.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=d45dc5bfc1c09add10da1be8498f917d" alt="Open service account keys" width="1352" height="926" data-path="images/screenshots/google-sheets/google-cloud-service-account-keys.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-create-json-key.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=9dafb148ab5cdafbbe3c7933b8184f0b" alt="Create a service account key" width="1150" height="564" data-path="images/screenshots/google-sheets/google-cloud-create-json-key.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-json-key-type.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=7e72b135af81bb74e1db9564617ab28a" alt="Select JSON key type" width="1174" height="754" data-path="images/screenshots/google-sheets/google-cloud-json-key-type.png" />
</Frame>

<Danger>
  Keep the service account JSON file private. Anyone with this file can use the permissions granted to that service account.
</Danger>

Google downloads a `.json` file. You will upload it in AI Puffer.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-json-downloaded.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=69e5aad315589c25eac74e2bacfb0fa7" alt="Downloaded service account JSON" width="1824" height="564" data-path="images/screenshots/google-sheets/google-cloud-json-downloaded.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-json-download-folder.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=df6e6c93fe86a0456641150de75e7d0c" alt="Service account JSON in Downloads" width="530" height="432" data-path="images/screenshots/google-sheets/google-cloud-json-download-folder.png" />
</Frame>

The service account needs Editor access because AI Puffer writes the processed status back to column G.

Share the sheet:

1. Open your Google Sheet.
2. Click **Share**.
3. Copy the service account email from Google Cloud or from the JSON file field named `client_email`.
4. Share the sheet with that email as **Editor**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-sheets-share-button.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=fd2bfb588d10df1c82ddcd5183d0506a" alt="Google Sheets share button" width="2808" height="706" data-path="images/screenshots/google-sheets/google-sheets-share-button.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-cloud-copy-service-account-email.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=36025e0ca6554687666c964a61343cfc" alt="Copy the service account email" width="1570" height="968" data-path="images/screenshots/google-sheets/google-cloud-copy-service-account-email.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/google-sheets/google-sheets-share-service-account.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=1def2fae107e910ebeae6a13ea73d25a" alt="Share the sheet with the service account" width="1846" height="1384" data-path="images/screenshots/google-sheets/google-sheets-share-service-account.png" />
</Frame>

Connect it in Content Writer:

1. Select **Google Sheets** in Content Writer.
2. Paste the Google Sheet ID.
3. Upload the service account JSON file.
4. Wait for the connection check to pass.
5. Set the model, prompts, publishing, image, and SEO options.
6. Click **Generate** or **Create Task**.

The Google Sheet ID is the value between `/d/` and `/edit` in the sheet URL.

```text theme={null}
https://docs.google.com/spreadsheets/d/GOOGLE_SHEET_ID/edit
```

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/sheets.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=f1dceb877d903cbbadb44a8f6e31a9cc" alt="Content Writer Google Sheets" width="1902" height="1422" data-path="images/screenshots/content-writer/sheets.png" />
</Frame>

## Optimize

Use optimize modes when you want to update content that already exists in WordPress.

### Rewrite Posts and Pages

Use **Rewrite Content** to update selected posts or pages.

<Warning>
  Rewrite Content updates selected WordPress content directly. Test with one item first when changing prompts or enabled fields.
</Warning>

1. Select **Rewrite Content**.
2. Filter by type, status, or search term.
3. Select one or more rows.
4. In the right-side **General** card, click **Customize** next to **Prompts** and choose the fields to update.
5. Click **Update**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/rewrite.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=8ecf7aa9db27b05335b3fb05c7827307" alt="Content Writer Rewrite" width="2580" height="1608" data-path="images/screenshots/content-writer/rewrite.png" />
</Frame>

Available update targets:

| Target           | Result                                             |
| ---------------- | -------------------------------------------------- |
| Title            | Updates the post title.                            |
| Content          | Updates the post content.                          |
| Meta Description | Updates the search meta description.               |
| Focus Keyword    | Updates the focus keyword when supported.          |
| Excerpt          | Updates the excerpt.                               |
| Tags             | Updates tags.                                      |
| URL              | Updates the slug when **Optimize URL** is enabled. |

For existing content prompts, include at least one source placeholder:

```text theme={null}
{original_title}
{original_content}
{original_excerpt}
{original_meta_description}
{original_focus_keyword}
{original_tags}
{categories}
```

Available update fields depend on the selected content type and active plugins.

### Image Metadata

Use **Image Metadata** to update media library attachment data.

<Warning>
  Image Metadata writes to media attachment fields directly. Enable only the fields you want to replace.
</Warning>

1. Select **Image Metadata**.
2. Filter images by media type, unattached items, owner, or search term.
3. Select the image.
4. In the right-side **General** card, click **Customize** next to **Prompts**.
5. Enable the metadata fields you want to update.
6. Click **Update**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/image-metadata.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=1dc2cdd70000d48c4af9a11529a30863" alt="Content Writer Image Metadata" width="2580" height="1388" data-path="images/screenshots/content-writer/image-metadata.png" />
</Frame>

Fields:

| Field       | WordPress attachment field |
| ----------- | -------------------------- |
| Image title | Attachment title.          |
| Alt text    | Alternate text.            |
| Caption     | Attachment excerpt.        |
| Description | Attachment content.        |

Image metadata prompts can use:

```text theme={null}
{file_name}
{original_title}
{original_alt}
{original_caption}
{original_description}
{image_context}
```

You can update one selected image or use bulk updates when available in your installed plugin version.

### WooCommerce Products

Optimize Products appears when WooCommerce is active.

<Info>
  Optimize Products requires AI Puffer Pro. If WooCommerce is not active, this mode is not shown. On the free version, product updates are blocked and the action button opens the upgrade flow.
</Info>

Use it to update existing WooCommerce product titles, descriptions, short descriptions, SEO data, tags, and URLs.

To update products:

1. Open **AI Puffer > Content Writer**.
2. Select **Optimize Products** under **Optimize**.
3. Use **Status** and **Search** to find products.
4. Select one or more products.
5. In the right-side **General** card, click **Customize** next to **Prompts**.
6. Enable the product fields you want to update.
7. Edit the prompts if needed.
8. Choose the AI provider, model, and length.
9. In the right-side **Advanced** card, set **Context** if product copy should use stored business or product information.
10. Click **Update**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/woocommerce.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=00f28ca4315773d1dce81e3a87c11a24" alt="Content Writer WooCommerce" width="2580" height="1388" data-path="images/screenshots/content-writer/woocommerce.png" />
</Frame>

Fields:

| Field               | What it updates                                |
| ------------------- | ---------------------------------------------- |
| Product Title       | Product name.                                  |
| Product Description | Main product description.                      |
| Short Description   | Product short description.                     |
| Meta Description    | SEO meta description in supported SEO plugins. |
| Focus Keyword       | SEO focus keyword in supported SEO plugins.    |
| Tags                | WooCommerce product tags.                      |
| URL                 | Product slug when URL optimization is enabled. |

Price, SKU, stock, dimensions, purchase note, categories, and attributes are available for prompts. AI Puffer uses them as source data; it does not change those WooCommerce product fields.

Product prompts can use:

```text theme={null}
{original_title}
{original_content}
{original_excerpt}
{original_meta_description}
{original_focus_keyword}
{original_tags}
{categories}
{price}
{regular_price}
{sale_price}
{sku}
{stock_quantity}
{stock_status}
{weight}
{length}
{width}
{height}
{short_description}
{purchase_note}
{product_categories}
{attributes}
```

## Settings

### Templates

Templates save reusable Content Writer settings. Use them when you often write with the same model, prompts, publishing rules, image settings, or knowledge settings.

The **Template** control is in the **General** panel on the right side of Content Writer.

Use the template menu to load, create, edit, rename, delete, and reset templates. Starter templates and default templates cannot be renamed or deleted.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/templates.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=3a1c83da1e1cd6b370b73380e5a7b041" alt="Templates" width="2044" height="1190" data-path="images/screenshots/content-writer/templates.png" />
</Frame>

### AI

Content Writer uses the AI providers configured in AI Puffer, including hosted providers, xAI, and local Ollama models.

To set the model:

1. In the right panel, open **AI**.
2. Select the model.
3. Select the content **Length**.
4. Click the settings icon next to the model.
5. Adjust **Temperature** if you want more or less variation.
6. Set **Reasoning** only for models that support it. Keep it on **None** for faster generation.

Model settings include:

| Setting         | What it does                                                  |
| --------------- | ------------------------------------------------------------- |
| **Model**       | Model used for generation.                                    |
| **Temperature** | Controls response variation.                                  |
| **Reasoning**   | Sets reasoning effort for supported OpenAI and Ollama models. |
| **Length**      | Sets the token budget used for the generated content.         |

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/models.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=a764cceb2f0719f67d3637cf65df91c1" alt="Models" width="2044" height="1190" data-path="images/screenshots/content-writer/models.png" />
</Frame>

Length values map to these <Tooltip headline="Token budget" tip="The amount of model output reserved for generated content. Longer settings allow longer drafts.">token budgets</Tooltip>:

| Length | Token budget |
| ------ | ------------ |
| Short  | 2000         |
| Medium | 4000         |
| Long   | 6000         |

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/model-settings.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=8cf44ee4fb8fce14f9140c54dc6abaf1" alt="Model Settings" width="842" height="610" data-path="images/screenshots/content-writer/model-settings.png" />
</Frame>

### Prompts

Prompts are the instructions Content Writer sends to the selected model. Each output has its own prompt, so the title, article body, SEO fields, excerpt, and tags can follow different rules.

To customize prompts:

1. In the right-side **General** card, click **Customize** next to **Prompts**.
2. Enable the outputs you want Content Writer to generate.
3. Click the edit icon next to an output.
4. Select **Default** or a saved prompt from the dropdown, or edit the prompt text directly.
5. Use the variables shown under the editor. Click a variable to copy it.
6. Click **Apply changes** if the button appears.
7. Generate one item and review the result before running a batch.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/prompts.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=345d5db7881c7640156d423cd3e09831" alt="Prompts Settings" width="2048" height="1324" data-path="images/screenshots/content-writer/prompts.png" />
</Frame>

| Output               | What it updates                         |
| -------------------- | --------------------------------------- |
| **Title**            | WordPress post title.                   |
| **Content**          | WordPress post content.                 |
| **Meta Description** | SEO meta description.                   |
| **Focus Keyword**    | Focus keyword in supported SEO plugins. |
| **Excerpt**          | WordPress excerpt.                      |
| **Tags**             | Post tags or product tags.              |

Available variables change based on the selected source or optimize mode.

| Workflow                          | Variables to use                                                                                               |
| --------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| Manual Entry, CSV, Google Sheets  | Use `{topic}` in enabled prompts. Use `{keywords}` when keyword input should guide the result.                 |
| RSS Feed                          | Use `{description}` in the title and content prompts. Use `{source_url}` if the source URL should be included. |
| Web Page                          | Use `{url_content}` in the title and content prompts. Use `{source_url}` if the source URL should be included. |
| SEO, excerpt, tags                | Use `{content_summary}` when the output should be based on the generated article.                              |
| Rewrite, image metadata, products | Use the variables shown under the prompt editor. They change for each optimize mode.                           |

<Warning>
  AI Puffer checks required variables before generation. If a required variable is missing, it stops and asks you to update the prompt.
</Warning>

### SEO

Use SEO settings when the generated post should leave Content Writer with search metadata already filled in. AI Puffer can create a meta description, focus keyword, tags, and a cleaner WordPress URL slug.

Pro users can also use **Smart SEO** to audit and improve the generated draft against the active SEO plugin.

To use SEO output:

1. In the right-side **General** card, click **Customize** next to **Prompts**.
2. Enable **Meta Description**, **Focus Keyword**, or **Tags**.
3. Edit the prompt for each enabled output if the default instruction does not match your site.
4. In the right-side **General** card, click the settings icon next to **Status** to open **Post settings**.
5. Enable **Optimize URL** if you want AI Puffer to update the post <Tooltip headline="Slug" tip="The URL-friendly part of a WordPress post address.">slug</Tooltip>.
6. Generate the content.
7. Review the SEO fields in the output panel before saving the post.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/seo.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=de427e4f3e443674270784340a7d5a6e" alt="SEO" width="2080" height="1318" data-path="images/screenshots/content-writer/seo.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/seo-slug.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=8ae78683253d1e4d1a19138665f3106b" alt="SEO" width="2080" height="1204" data-path="images/screenshots/content-writer/seo-slug.png" />
</Frame>

The focus keyword is generated first. Meta description, excerpt, and tag prompts can then use that keyword. If you enter keywords manually, the first keyword is used as the focus keyword.

| Output               | How it is saved                                                                                                                 |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **Meta description** | Saved to the active SEO plugin. If no supported SEO plugin is active, AI Puffer saves it as fallback post meta.                 |
| **Focus keyword**    | Saved to Yoast SEO, Rank Math, or All in One SEO.                                                                               |
| **Tags**             | Saved as WordPress tags for new posts. Existing-post and product update workflows use the matching tag taxonomy when available. |
| **URL**              | Updates the WordPress post slug when **Optimize URL** is enabled.                                                               |

#### Smart SEO

Smart SEO is a Pro feature.

* It works in Content Writer Create mode.
* It supports Single generation, Batch generation, Quick Paste, CSV, RSS, URL, and Google Sheets batches.
* It automatically detects the active SEO plugin.
* It checks the generated draft against that SEO profile.
* It improves the draft before you save it.
* For SEO revisions, Smart SEO may use a quality-focused model from the same AI provider selected for generation, never switches providers, and uses the selected deployment or local model for Azure and Ollama.
* It tries to improve the generated draft up to `100/100`.
* It can run up to three SEO revisions.
* If the draft cannot reach `100/100`, AI Puffer keeps the best-scoring revision.
* In **Single** mode, users can review the SEO score and switch between revisions before saving.
* In batch modes, users see the SEO score and status in the batch monitor.
* Free users can still generate meta descriptions, focus keywords, tags, excerpts, and optimized slugs.
* Only Smart SEO score improvement is paid.

To use Smart SEO:

1. Open **AI Puffer > Content Writer**.
2. Choose a Create source such as **Manual Entry**, **CSV**, **RSS**, **URL**, or **Google Sheets**.
3. In the right-side **General** card, enable **Smart SEO**.
4. Generate the content.
5. Review the SEO score and generated post before saving.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/bllRdgtvvtwirk0u/images/screenshots/content-writer/smart-seo.png?fit=max&auto=format&n=bllRdgtvvtwirk0u&q=85&s=bb6814a03fc821101c63eb68f7bd7095" alt="SEO" width="1020" height="618" data-path="images/screenshots/content-writer/smart-seo.png" />
</Frame>

Depending on the active SEO plugin profile, Smart SEO can check:

| Area                  | Examples                                                                                            |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| **Focus keyword**     | Title, introduction, headings, meta description, slug, and duplicate-keyword usage.                 |
| **Metadata**          | Meta description presence and length.                                                               |
| **Content structure** | Content length, heading balance, table of contents, paragraph length, and sentence length.          |
| **Links**             | Internal links, outbound links, and dofollow outbound links when the active SEO plugin scores them. |
| **Media**             | Image presence and focus-keyword image alt text.                                                    |
| **Readability**       | Transition words, repeated sentence openings, passive voice, and reading ease where supported.      |

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/bllRdgtvvtwirk0u/images/screenshots/content-writer/smart-seo-score.png?fit=max&auto=format&n=bllRdgtvvtwirk0u&q=85&s=2728357e0cb3fa02671f7ecd937e2168" alt="SEO" width="1282" height="661" data-path="images/screenshots/content-writer/smart-seo-score.png" />
</Frame>

<Info>
  Smart SEO follows the active SEO plugin profile automatically. If more than one supported SEO plugin is active, AI Puffer chooses one profile and shows a warning. For predictable scores, use one SEO plugin at a time.
</Info>

<Warning>
  Some SEO plugin checks are owned by the SEO plugin itself and cannot always be fixed by AI Puffer. For example, plugin-specific premium AI checks or settings-based checks may still appear in the SEO plugin after generation.
</Warning>

#### Yoast SEO

AI Puffer saves the generated meta description to the Yoast meta description field and the generated focus keyword to the Yoast focus keyphrase field.

If **Optimize URL** is enabled, the slug is built from the focus keyphrase when available. If there is no focus keyphrase, the post title is used.

Smart SEO's Yoast profile is tuned for Yoast SEO analysis and readability checks, including keyphrase placement, meta description length, links, image alt text, and readability signals.

#### Rank Math

AI Puffer saves the generated meta description to the Rank Math description field and the generated focus keyword to the Rank Math focus keyword field.

Smart SEO's Rank Math profile is tuned for Rank Math's Basic SEO, Additional SEO, Title Readability, and Content Readability checks.

#### All in One SEO

AI Puffer saves the generated meta description to All in One SEO and updates the focus keyphrase data used by AIOSEO.

Smart SEO's All in One SEO profile is tuned for TruSEO checks, focus keyphrase analysis, readability checks, and headline score improvements.

#### The SEO Framework

AI Puffer saves the generated meta description to The SEO Framework description field.

The SEO Framework does not provide a native focus keyword field, so AI Puffer does not save a focus keyword for it.

Smart SEO's The SEO Framework profile focuses on title and description behavior because The SEO Framework does not provide a native focus keyword field.

If none of the supported SEO plugins are active, AI Puffer still saves the meta description as fallback post meta. Focus keyword output remains visible in Content Writer, but there is no SEO plugin field to save it into.

WordPress tags and the optimized URL slug still work without an SEO plugin.

### Publishing

Publishing controls the WordPress post that gets created after generation.

To set the post target:

1. In the right-side **General** card, select the post **Status**.
2. Click the settings icon next to **Status** to open **Post settings**.
3. Select the **Post Type**.
4. Select the **Author**.
5. Select categories if the post type supports them.
6. Enable **Table of Contents** if you want a generated table of contents added to the top of the post.
7. Enable **Optimize URL** if you want AI Puffer to generate a cleaner WordPress slug.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/publishing.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=4a2f21fba6fe0334d24ef67c4f447ee5" alt="Publishing" width="1019" height="533" data-path="images/screenshots/content-writer/publishing.png" />
</Frame>

| Setting               | Use it for                                            |
| --------------------- | ----------------------------------------------------- |
| **Status**            | Draft, Publish, Pending Review, or Private.           |
| **Post Type**         | Public WordPress post type.                           |
| **Author**            | WordPress author.                                     |
| **Categories**        | WordPress categories assigned to the post.            |
| **Table of Contents** | Adds a table of contents from the generated headings. |
| **Optimize URL**      | Updates the WordPress slug after the post is saved.   |

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/publishing-options.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=9a162976b233b63d978413d916150aca" alt="Publishing Options" width="1019" height="693" data-path="images/screenshots/content-writer/publishing-options.png" />
</Frame>

#### Schedule

Schedule options appear when **Status** is set to **Publish** and you are generating multiple items. Single Entry publishes immediately when the status is **Publish**.

To schedule posts:

1. Set **Status** to **Publish**.
2. Choose one of the available schedule modes.
3. Use **Smart Schedule** when AI Puffer should space posts automatically.
4. Use **Use Dates from Input** when each row, CSV line, or Google Sheets row already has its own date.
5. Generate the batch or create the task.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/schedule.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=84810963c2d59ed3fb8e90e53208e6a2" alt="Schedule" width="1019" height="599" data-path="images/screenshots/content-writer/schedule.png" />
</Frame>

| Option                   | Behavior                                                                       |
| ------------------------ | ------------------------------------------------------------------------------ |
| **Publish Immediately**  | Publishes without spacing posts out.                                           |
| **Smart Schedule**       | Starts at a date/time and spaces posts by hours or days.                       |
| **Use Dates from Input** | Uses the schedule field from Batch Editor, Quick Paste, CSV, or Google Sheets. |

Use this date format:

```text theme={null}
YYYY-MM-DD HH:MM
```

Quick Paste can include the schedule as the last field:

```text theme={null}
Topic | Keywords | Category ID | Author Login | Post Type | YYYY-MM-DD HH:MM
```

<Info>
  Use Dates from Input is available for Batch Editor, Quick Paste, CSV, and Google Sheets. RSS Feed and Web Page sources can use Publish Immediately or Smart Schedule.
</Info>

### Images

Images can be inserted into the article content, set as the featured image, or both.

To use images, first choose what AI Puffer should create:

1. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
2. Select the image provider or model from **Image source**.
3. Click the settings icon beside **Image source** to open **Image settings**.
4. Set the image count, placement, WordPress display size, alignment, and provider options.
5. Generate one item and review the image previews before saving the post.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/images.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=e5af0e17dd5053391533dfe05de1bdff" alt="Images" width="1019" height="616" data-path="images/screenshots/content-writer/images.png" />
</Frame>

| Mode                   | Result                                         |
| ---------------------- | ---------------------------------------------- |
| **Off**                | No images are generated or fetched.            |
| **Content**            | Adds images inside the post content.           |
| **Featured**           | Sets a featured image.                         |
| **Content + Featured** | Adds content images and sets a featured image. |

AI image sources use the image prompt. Stock photo sources use the generated keywords first. If there are no keywords, AI Puffer uses the topic or title as the search query.

<Info>
  Image prompts are used for OpenAI, Google, OpenRouter, Azure, xAI, and Replicate. Pexels and Pixabay do not use image prompts because they search existing stock photos.
</Info>

Image placement controls where content images are inserted after the post is saved.

| Setting          | Use it for                                |
| ---------------- | ----------------------------------------- |
| **Count**        | Number of content images to insert.       |
| **Placement**    | Where content images should be inserted.  |
| **X**            | Used only with every-X placement options. |
| **Display size** | WordPress image size used in the post.    |
| **Align**        | WordPress image alignment.                |

Placement options:

| Placement              | Result                                                     |
| ---------------------- | ---------------------------------------------------------- |
| **After 1st H2**       | Inserts the first image after the first H2 heading.        |
| **After 1st H3**       | Inserts the first image after the first H3 heading.        |
| **Every X H2s**        | Inserts images after every selected number of H2 headings. |
| **Every X H3s**        | Inserts images after every selected number of H3 headings. |
| **Every X paragraphs** | Inserts images after every selected number of paragraphs.  |
| **End of content**     | Adds images at the end of the article.                     |

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/image-options.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=ccd450de09c498f67836b48e0d2c9d27" alt="Image Options" width="1021" height="690" data-path="images/screenshots/content-writer/image-options.png" />
</Frame>

#### OpenAI

OpenAI uses your OpenAI API key and one of the image models available in your synced model list.

To set it up:

1. Go to **AI Puffer > Settings > AI**.
2. Select **OpenAI**.
3. Add your OpenAI API key.
4. Sync models.
5. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
6. Select an OpenAI image model from **Image source**.
7. In the right-side **General** card, click **Customize** next to **Prompts** if you want to change the image prompt or featured image prompt.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/image-prompts1.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=b2e1117aced4c3e7c650fb7ea515a571" alt="Image Prompts" width="1019" height="726" data-path="images/screenshots/content-writer/image-prompts1.png" />
</Frame>

#### Google

Google uses your Google API key and the Google image models available in your synced model list.

To set it up:

1. Go to **AI Puffer > Settings > AI**.
2. Select **Google**.
3. Add your Google API key.
4. Sync models.
5. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
6. Select a Google image model from **Image source**.
7. In the right-side **General** card, click **Customize** next to **Prompts** if you want to change the image prompt or featured image prompt.

#### OpenRouter

OpenRouter uses image-capable models from your OpenRouter account.

To set it up:

1. Go to **AI Puffer > Settings > AI**.
2. Select **OpenRouter**.
3. Add your OpenRouter API key.
4. Sync models.
5. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
6. Select an OpenRouter image model from **Image source**.

If a selected OpenRouter model does not return images, choose another image-capable model from the synced list.

#### Azure

Azure uses your Azure OpenAI endpoint, API key, API version, and image deployment.

To set it up:

1. Go to **AI Puffer > Settings > AI**.
2. Select **Azure**.
3. Add the Azure endpoint and API key.
4. Add or sync the image deployment you want to use.
5. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
6. Select the Azure image deployment from **Image source**.

#### xAI

xAI uses your xAI API key and synced xAI image models such as `grok-imagine-image`.

To set it up:

1. Go to **AI Puffer > Settings > AI**.
2. Select **xAI**.
3. Add your xAI API key.
4. Sync models.
5. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
6. Select an xAI image model from **Image source**.

#### Replicate

Replicate uses your Replicate API key and synced text-to-image models.

To set it up:

1. Go to **AI Puffer > Settings > Integrations**.
2. Select **Replicate**.
3. Add your Replicate API key.
4. Sync Replicate models.
5. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
6. Select a Replicate model from **Image source**.

#### Pexels

Pexels searches stock photos instead of generating a new image.

To set it up:

1. Go to **AI Puffer > Settings > Integrations**.
2. Select **Pexels**.
3. Add your Pexels API key, or use the **Get Key** link to create one.
4. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
5. Select **Pexels** from **Image source**.
6. Click the settings icon beside **Image source** to open **Image settings**.
7. Set **Orientation**, **Size**, and **Color** if you want to filter results.
8. Generate one item and review the selected photo.

#### Pixabay

Pixabay searches stock photos, illustrations, or vectors.

To set it up:

1. Go to **AI Puffer > Settings > Integrations**.
2. Select **Pixabay**.
3. Add your Pixabay API key, or use the **Get Key** link to create one.
4. In the right-side **Media** card, set **Images** to **Content**, **Featured**, or **Content + Featured**.
5. Select **Pixabay** from **Image source**.
6. Click the settings icon beside **Image source** to open **Image settings**.
7. Set **Orientation**, **Type**, and **Category** if you want to narrow results.
8. Generate one item and review the selected image.

#### Provider Options

Provider options control the generation request sent to the selected AI provider. They are separate from WordPress display settings such as **Display size** and **Align**.

Only options supported by the selected provider and model are shown.

| Provider       | Available options                                                                                                                                  |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **OpenAI**     | Canvas size, quality, output format, compression, background, moderation.                                                                          |
| **Azure**      | Canvas size, quality, output format, compression, background.                                                                                      |
| **Google**     | Aspect ratio, image resolution, and person generation for supported Imagen models. Nano Banana models are included in the Google image model list. |
| **OpenRouter** | Aspect ratio and image resolution for models that support image configuration.                                                                     |
| **xAI**        | Aspect ratio and image resolution.                                                                                                                 |
| **Replicate**  | Model-specific options from synced model schemas.                                                                                                  |

<Info>
  Pexels and Pixabay are stock image sources. Their filters narrow search results instead of changing an AI generation request.
</Info>

#### Image Prompts

For AI image providers, the image prompt controls content images and the featured image prompt controls the featured image.

You can use these placeholders:

| Placeholder    | Replaced with         |
| -------------- | --------------------- |
| `{topic}`      | Generated title.      |
| `{keywords}`   | Generated keywords.   |
| `{post_title}` | WordPress post title. |
| `{excerpt}`    | Generated excerpt.    |

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/image-prompts2.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=4401ed5ff9bd5013f14e545203d15fe4" alt="Featured Image Prompt" width="1019" height="726" data-path="images/screenshots/content-writer/image-prompts2.png" />
</Frame>

#### Image Metadata

To generate image metadata:

1. In the right-side **General** card, click **Customize** next to **Prompts**.
2. Enable the image metadata fields you want: **Title**, **Alt Text**, **Caption**, or **Description**.
3. Edit the metadata prompts if needed.
4. Generate the content and images.

AI Puffer saves generated metadata to the WordPress media attachment fields. Alt text is saved as the attachment alternate text.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/image-metadata-prompts.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=070834d94679a00295405246cc948d90" alt="Image Metadata" width="1021" height="690" data-path="images/screenshots/content-writer/image-metadata-prompts.png" />
</Frame>

### Knowledge Base

Knowledge Base lets Content Writer use vector data you already added in **AI Puffer > Knowledge Base > Data**.

When Knowledge Base is enabled, AI Puffer searches the selected vector source with the current generation prompt and adds the closest matches to the request.

To enable it:

1. Add data in **AI Puffer > Knowledge Base > Data** first.
2. In the right-side **Advanced** card, set **Context** to **OpenAI**, **Pinecone**, **Qdrant**, or **Chroma**.
3. Select the vector store, index, or collection in **Source**.
4. Click the settings icon beside **Source** to open **Context settings**.
5. For Pinecone, Qdrant, or Chroma, select the embedding provider and model in **Context settings**.
6. Set **Results Limit** and **Confidence Threshold**.
7. Generate one item and check the output.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/knowledgebase.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=71d138c2bbee1d24495b3854e37261fc" alt="knowledgebase" width="1036" height="690" data-path="images/screenshots/content-writer/knowledgebase.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/4ac4_Z0ygLkvmqi8/images/screenshots/content-writer/kb-options.png?fit=max&auto=format&n=4ac4_Z0ygLkvmqi8&q=85&s=a92a14dad7b0a80b19ec1af6a738c737" alt="knowledgebase" width="1036" height="763" data-path="images/screenshots/content-writer/kb-options.png" />
</Frame>

#### OpenAI

OpenAI uses OpenAI Vector Stores.

To create a store:

1. Go to **AI Puffer > Knowledge Base > Stores**.
2. Select **OpenAI** as the provider.
3. Click **Create Store**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/hQhF19jEjVFtgLy6/images/screenshots/knowledgebase/openai-create-new-vector.png?fit=max&auto=format&n=hQhF19jEjVFtgLy6&q=85&s=aeaf5d391b1b6020019614de698f2a7f" alt="OpenAI Create Vector" width="2600" height="1542" data-path="images/screenshots/knowledgebase/openai-create-new-vector.png" />
</Frame>

4. Enter a store name and create it.
5. Go to **AI Puffer > Knowledge Base > Data** and add data to the store.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/suUEnTBeR7lWAmix/images/screenshots/knowledgebase/knowledge-base-add-data.png?fit=max&auto=format&n=suUEnTBeR7lWAmix&q=85&s=db39645059979b1ff715da80e63e86b8" alt="OpenAI Add Data" width="2600" height="1180" data-path="images/screenshots/knowledgebase/knowledge-base-add-data.png" />
</Frame>

To use it in Content Writer:

1. In the right-side **Advanced** card, set **Context** to **OpenAI**.
2. Select one or more vector stores in **Source**.
3. Click the settings icon beside **Source** if you need to adjust **Results Limit** or **Confidence Threshold**.

When Content Writer uses an OpenAI model, AI Puffer can pass the selected vector stores to OpenAI file search. With other content models, AI Puffer searches the stores first and adds matching text to the prompt.

#### Pinecone

Pinecone stores vectors in an index. AI Puffer creates and searches those vectors with the embedding model you choose.

The Pinecone index dimension <u>must match</u> the embedding model. For example, if your index is **3072 dimensions**, use a **3072-dimension** embedding model.

<Warning>
  Use the same embedding model when adding data to Pinecone and when enabling Pinecone in Content Writer.
</Warning>

To create an index:

1. Add your Pinecone credentials in **AI Puffer > Settings > Integrations**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/U5wzdcUWDOHzHsVM/images/screenshots/knowledgebase/pinecone-api-key.png?fit=max&auto=format&n=U5wzdcUWDOHzHsVM&q=85&s=34921feed947f56df2006b695b3cbd80" alt="Pinecone API key" width="2108" height="902" data-path="images/screenshots/knowledgebase/pinecone-api-key.png" />
</Frame>

2. Go to **AI Puffer > Knowledge Base > Stores**.
3. Select **Pinecone** as the provider.
4. Select the embedding model you want to use.
5. Click **Create Store**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/hQhF19jEjVFtgLy6/images/screenshots/knowledgebase/pinecone-create-index1.png?fit=max&auto=format&n=hQhF19jEjVFtgLy6&q=85&s=3bed23035aaaf0d4b7b207a0b0f89e9d" alt="Pinecone Create Index" width="2600" height="1394" data-path="images/screenshots/knowledgebase/pinecone-create-index1.png" />
</Frame>

6. Enter an index name and use the dimension for the selected embedding model.
7. Create the index, then add data with the same embedding model.

<Frame>
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/aipuffer-a96fe641/images/screenshots/knowledgebase/pinecone-create-index2.png" alt="Pinecone Create Index" />
</Frame>

To use it in Content Writer:

1. In the right-side **Advanced** card, set **Context** to **Pinecone**.
2. Select the Pinecone index in **Source**.
3. Click the settings icon beside **Source** to open **Context settings**.
4. Select the same embedding provider and model used when you added the data.
5. Adjust **Results Limit** or **Confidence Threshold** if needed.

#### Qdrant

Qdrant stores vectors in a collection. AI Puffer creates and searches those vectors with the embedding model you choose.

The Qdrant collection size <u>must match</u> the embedding model. For example, if your collection is **3072 dimensions**, use a **3072-dimension** embedding model.

<Warning>
  Use the same embedding model when adding data to Qdrant and when enabling Qdrant in Content Writer.
</Warning>

To create a collection:

1. Add your Qdrant URL and API key in **AI Puffer > Settings > Integrations**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/U5wzdcUWDOHzHsVM/images/screenshots/knowledgebase/qdrant-api-key.png?fit=max&auto=format&n=U5wzdcUWDOHzHsVM&q=85&s=533ff35b1758a7b73cb726423179e1b4" alt="Qdrant API key" width="2082" height="1022" data-path="images/screenshots/knowledgebase/qdrant-api-key.png" />
</Frame>

2. Go to **AI Puffer > Knowledge Base > Stores**.
3. Select **Qdrant** as the provider.
4. Select the embedding model you want to use.
5. Click **Create Store**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/hQhF19jEjVFtgLy6/images/screenshots/knowledgebase/qdrant-create-collection1.png?fit=max&auto=format&n=hQhF19jEjVFtgLy6&q=85&s=f79bd7b6e07614d893810dec8fa2ac4a" alt="Qdrant Create collection" width="2600" height="1394" data-path="images/screenshots/knowledgebase/qdrant-create-collection1.png" />
</Frame>

6. Enter a collection name and use the dimension for the selected embedding model.
7. Create the collection, then add data with the same embedding model.

<Frame>
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/aipuffer-a96fe641/images/screenshots/knowledgebase/qdrant-create-collection2.png" alt="Qdrant Create collection" />
</Frame>

To use it in Content Writer:

1. In the right-side **Advanced** card, set **Context** to **Qdrant**.
2. Select the Qdrant collection in **Source**.
3. Click the settings icon beside **Source** to open **Context settings**.
4. Select the same embedding provider and model used when you added the data.
5. Adjust **Results Limit** or **Confidence Threshold** if needed.

#### Chroma

Chroma stores vectors in a collection. AI Puffer creates and searches those vectors with the embedding model you choose.

Chroma collections do not require a dimension when they are created in AI Puffer, but stored vectors still need a consistent dimension. Use the same embedding model when adding data to Chroma and when enabling Chroma in Content Writer.

To create a collection:

1. Add your Chroma endpoint, tenant, database, and API key in **AI Puffer > Settings > Integrations**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/suUEnTBeR7lWAmix/images/screenshots/knowledgebase/chroma-api-key.png?fit=max&auto=format&n=suUEnTBeR7lWAmix&q=85&s=a5c3beeeeb3ae21a84bcce951a93fefc" alt="Chroma API key" width="2600" height="1338" data-path="images/screenshots/knowledgebase/chroma-api-key.png" />
</Frame>

2. Go to **AI Puffer > Knowledge Base > Stores**.
3. Select **Chroma** as the provider.
4. Click **Create Store**.

<Frame>
  <img src="https://mintcdn.com/aipuffer-a96fe641/suUEnTBeR7lWAmix/images/screenshots/knowledgebase/chroma-create-collection1.png?fit=max&auto=format&n=suUEnTBeR7lWAmix&q=85&s=cb08b0bf72af8e1d9295e237f591bd0a" alt="Chroma Create collection" width="2600" height="1394" data-path="images/screenshots/knowledgebase/chroma-create-collection1.png" />
</Frame>

5. Enter a collection name.
6. Create the collection, then add data with the same embedding model.

To use it in Content Writer:

1. In the right-side **Advanced** card, set **Context** to **Chroma**.
2. Select the Chroma collection in **Source**.
3. Click the settings icon beside **Source** to open **Context settings**.
4. Select the same embedding provider and model used when you added the data.
5. Adjust **Results Limit** or **Confidence Threshold** if needed.

#### Limit and Threshold

Use these settings to control how much vector context is added to the generated content.

| Setting                  | How it works                                                  | Example                                                                       |
| ------------------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| **Results Limit**        | How many matching pieces of knowledge AI Puffer can use.      | `3` means AI Puffer can use up to 3 matching pieces.                          |
| **Confidence Threshold** | How closely a result must match before AI Puffer includes it. | Lower values allow looser matches. Higher values allow only stronger matches. |

Use a lower threshold if useful context is being missed. Use a higher threshold if unrelated context is being included.

After testing, open **Usage > Logs** and check the Score badge when vector results are recorded.

<Tip>
  Start with a small limit and tune the threshold after testing real topics.
</Tip>

## Logs

Content Writer activity is logged under AI Puffer logs.

| Source                           | Log module                  |
| -------------------------------- | --------------------------- |
| Direct Content Writer generation | `content_writer`            |
| Automated Content Writer tasks   | `content_writer_automation` |

Use the `content.generated` event when another system needs to receive generated content after Content Writer finishes. See [Event Webhooks](/event-webhooks) for payload and delivery details.
