Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
8c8727b
fix(deps): bump tmp from 0.2.5 to 0.2.7 (#630)
dependabot[bot] May 28, 2026
b4d6ce3
Fix[Alt Generation]: Generate button becomes unresponsive after using…
yogeshbhutkar May 28, 2026
b30c0c9
chore(ci): bump codecov/codecov-action (#636)
dependabot[bot] May 29, 2026
0a84f42
fix(deps-dev): bump the composer-dev-minor-patch group with 2 updates…
dependabot[bot] May 29, 2026
f435d19
Group Editorial Notes and Updates controls in editor sidebar (#605)
macayu17 May 29, 2026
6b36539
Fix: Add accessible labels to filter select elements in Abilities Exp…
Trushiv04 Jun 1, 2026
b0f9f7e
Add the focus button back to generate/regenrate button on apply/dismi…
hbhalodia Jun 2, 2026
3c7663c
Fix: a11y: Connector Approval Matrix input toggle button (#646)
hbhalodia Jun 2, 2026
9595536
Fix Abilities Explorer schema constraint validation (#612)
ekamran Jun 2, 2026
35be266
Fix: a11y Add focus again to Generate Title button on modal close (#644)
hbhalodia Jun 2, 2026
f75cb53
Fix: Add accessible labels to ToggleControl in Connector Approvals ma…
ishitaj34 Jun 3, 2026
71ac4f4
Fix: Add accessible label to ability test payload textarea in Abiliti…
Trushiv04 Jun 3, 2026
64e8032
Fix excerpt generation post context payload (#651)
ekamran Jun 3, 2026
1e81450
Return decorative flag for generated alt text (#659)
yusufhay Jun 4, 2026
4f27b52
Fix canceled meta description suggestion state (#653)
ekamran Jun 4, 2026
65e2d23
fix(deps-dev): bump phpstan/phpstan (#672)
dependabot[bot] Jun 5, 2026
0a70c08
chore(ci): bump WordPress/action-wp-playground-pr-preview from c86075…
dependabot[bot] Jun 5, 2026
e656047
Fix meta description UTF-8 character count (#655)
yusufhay Jun 5, 2026
b4fb466
AI Request Logs: column “move left / move right” has no effect (#669)
Trushiv04 Jun 5, 2026
9383c9f
Fix the border clipping and background color issue (#676)
hbhalodia Jun 5, 2026
a914071
Add maintainers section to README (#677)
jeffpaul Jun 5, 2026
c71c9c9
Fix: Summary counters show zero for “Last Hour” when requests are rec…
prasadkarmalkar Jun 5, 2026
10b566e
[Image Gen]: Improve focus handling in image generation flows (#647)
yogeshbhutkar Jun 8, 2026
e3b016e
Fix: AI Request Logging: token count understated for thinking models …
prasadkarmalkar Jun 8, 2026
b4221d2
Add refresh button to AI Request Logs table header (#687)
prasadkarmalkar Jun 9, 2026
b874ed3
[Content Resizing]: Fix focus loss when regenerating content resizing…
yogeshbhutkar Jun 9, 2026
483c3a9
Update output schema for get-post-terms ability and sanitize image_ur…
the-hercules Jun 9, 2026
df23bd9
Fix: Title Generation: toolbar button disappears after toggling "Show…
hbhalodia Jun 10, 2026
2b2cb29
Clarify AI Connector provider setup (#638)
ekamran Jun 10, 2026
4470733
Fix[Meta Description]: Improve Copy and Focus Behavior (#696)
yogeshbhutkar Jun 11, 2026
81b2aa4
Fix[Excerpt]: Preserve Focus During Generate and Regenerate Actions (…
Infinite-Null Jun 11, 2026
babdbc7
Gate image generation UI on provider support detection (#679)
t-hamano Jun 11, 2026
36aaeb1
Build/Test Tools: Remove ready_for_review trigger from workflows (#703)
Infinite-Null Jun 11, 2026
f014c59
chore(ci): bump actions/checkout from 6.0.2 to 6.0.3 in the github-ac…
dependabot[bot] Jun 12, 2026
b2f2e8b
fix: rename unforwarded `MaskCanvas` to `InnerMaskCanvas` to avoid du…
justlevine Jun 12, 2026
7dd54b6
Fix: AI Request Logs header overlap and sticky positioning (#705)
Infinite-Null Jun 12, 2026
6e158ad
Fix[Meta Description]: Allow clearing meta description (#706)
yogeshbhutkar Jun 12, 2026
0617e44
chore: update NPM dev-deps (#712)
justlevine Jun 12, 2026
caaca2d
Use a neutral icon for disabled features and experiments in the AI St…
i-anubhav-anand Jun 12, 2026
a773d29
Standardize button sizing by adding __next40pxDefaultSize across all …
i-anubhav-anand Jun 15, 2026
724a34f
Add missing __next40pxDefaultSize to remaining Buttons caught by ESLi…
i-anubhav-anand Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-plugin-zip.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
contents: read
steps:
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Dependency Review
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/plugin-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ on:
types:
- opened
- synchronize
- ready_for_review

# Cancels all previous workflow runs for pull requests that have not completed.
concurrency:
Expand All @@ -32,7 +31,7 @@ jobs:
timeout-minutes: 20
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pr-playground-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:

- name: Expose built artifact
id: expose
uses: WordPress/action-wp-playground-pr-preview/.github/actions/expose-artifact-on-public-url@c8607529dac8d2bf9a1e8493865fc97cd1c3c87b # v2
uses: WordPress/action-wp-playground-pr-preview/.github/actions/expose-artifact-on-public-url@5e92f5e3c80d06126f22e83e4bb21221fbbd3e7f # v3
with:
artifact-name: ${{ steps.pr-metadata.outputs.artifact-name }}
artifact-filename: ai.zip
Expand Down Expand Up @@ -102,7 +102,7 @@ jobs:
ARTIFACT_URL: ${{ steps.expose.outputs.artifact-url }}

- name: Post Playground preview button
uses: WordPress/action-wp-playground-pr-preview@c8607529dac8d2bf9a1e8493865fc97cd1c3c87b # v2
uses: WordPress/action-wp-playground-pr-preview@5e92f5e3c80d06126f22e83e4bb21221fbbd3e7f # v3
with:
mode: append-to-description
blueprint: ${{ steps.blueprint.outputs.blueprint }}
Expand Down
13 changes: 6 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ on:
types:
- opened
- synchronize
- ready_for_review

# Cancels all previous workflow runs for pull requests that have not completed.
concurrency:
Expand Down Expand Up @@ -40,7 +39,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down Expand Up @@ -96,7 +95,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down Expand Up @@ -189,7 +188,7 @@ jobs:
echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV"

- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down Expand Up @@ -247,7 +246,7 @@ jobs:
- name: Upload code coverage report
continue-on-error: true
if: ${{ matrix.coverage }}
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: tests/_output/php-coverage.xml
Expand Down Expand Up @@ -279,7 +278,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down Expand Up @@ -320,7 +319,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }}
persist-credentials: false
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/wporg-plugin-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Set up PHP
uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2.37.1
Expand Down
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,15 @@ This [Canonical Plugin](https://make.wordpress.org/core/2022/09/11/canonical-plu
* **Guidelines** - Allows abilities to respect site-wide editorial standards.
* **[Image Generation and Editing](docs/features/image-generation.md)** - Create and edit images from post content in the editor, also via the Media Library.
* **[Meta Description Generation](docs/experiments/meta-description.md)** - Generates meta description suggestions and integrates those with various SEO plugins.
* **[Multi-Provider Support](docs/experiments/multi-provider-support.md)** - Works with popular AI providers like OpenAI, Google, and Anthropic.
* **[Multi-Provider Support](docs/experiments/multi-provider-support.md)** - Works with AI Connector plugins for providers such as OpenAI, Google, and Anthropic.
* **[Title Generation](docs/experiments/title-generation.md)** - Generates title suggestions from content.

## Provider Setup

The AI plugin does not include provider credentials or provider implementations by itself. To use AI-powered features, install and activate at least one AI Connector plugin, then configure its credentials in `Settings -> Connectors`. Features may appear unavailable until a connector is installed, authenticated, and capable of the required operation.

Provider connector plugins include [Anthropic](https://wordpress.org/plugins/ai-provider-for-anthropic), [Google](https://wordpress.org/plugins/ai-provider-for-google), [OpenAI](https://wordpress.org/plugins/ai-provider-for-openai), and [others](https://wordpress.org/plugins/tags/connector/).

## Roadmap

You can view the active plugin roadmap in a filtered view in the WordPress AI [GitHub Project Board](https://github.com/orgs/WordPress/projects/240/views/7).
Expand All @@ -66,7 +72,7 @@ Overview of planned features:

## Developer Experience

The AI plugin is meant to be studied, forked, and extended. If you’re a host or agency, you can configure AI providers on behalf of your users so they don’t need to bring their own API keys.
The AI plugin is meant to be studied, forked, and extended. If you’re a host or agency, you can install and configure AI Connector plugins on behalf of your users so they don’t need to bring their own API keys.

If you’re a plugin developer, you’ll be able to:

Expand All @@ -88,4 +94,8 @@ Anyone contributing to the AI plugin is expected to conduct themselves in accord
* **Design:** [Share feedback](https://github.com/WordPress/ai/issues) on UX flows and accessibility.
* **Test:** Try features as they're [released](https://github.com/WordPress/ai/releases) and [report feedback](https://github.com/WordPress/ai/issues).

View the [Credits](CREDITS.md) file for maintainers, contributors, and libraries for the AI plugin.
### Maintainers

Maintainers for this repo are [Darin Kotter (@dkotter)](https://github.com/dkotter) and [Jeff Paul (@jeffpaul)](https://github.com/jeffpaul); all can be reached using the [@WordPress/ai-maintainers](https://github.com/orgs/WordPress/teams/ai-maintainers) team.

View the [Credits](CREDITS.md) file for a full list of maintainers, contributors, and libraries for the AI plugin.
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
"php-stubs/wp-cli-stubs": "^2.12",
"phpcompatibility/phpcompatibility-wp": "^3.0.0-alpha",
"phpstan/extension-installer": "^1.3",
"phpstan/php-8-stubs": "^0.4.0",
"phpstan/php-8-stubs": "^0.4.35",
"phpstan/phpstan-deprecation-rules": "^2.0.4",
"phpstan/phpstan-phpunit": "^2.0.16",
"phpstan/phpstan": "^2.1.54",
"phpstan/phpstan": "^2.2.1",
"phpunit/phpunit": "^8.5|^9.6",
"slevomat/coding-standard": "^8.0",
"szepeviktor/phpstan-wordpress": "^2.0.2",
Expand Down
33 changes: 22 additions & 11 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions docs/experiments/multi-provider-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@

## Summary

The plugin supports multiple AI providers through the WordPress AI Client and connector system. Features and experiments can run against a prioritized provider/model list, automatically fall back when a preferred model is unavailable, and validate capability support before execution.
The plugin supports multiple AI providers through the WordPress AI Client and connector system. Provider access is supplied by separate AI Connector plugins. Features and experiments can run against a prioritized provider/model list, automatically fall back when a preferred model is unavailable, and validate capability support before execution.

## Overview

### For End Users

You can configure one or more AI connectors (for example OpenAI, Google, Anthropic) in WordPress settings. Once configured:
Install and activate one or more AI Connector plugins, such as OpenAI, Google, or Anthropic, then configure their credentials in `Settings -> Connectors`. Once configured:

- Experiments can use any compatible connected provider.
- Capability checks prevent running requests on unsupported connectors.
- If a preferred model is unavailable, another configured model/provider can be used.
- Features may appear unavailable until a connector is installed, authenticated, and capable of the required operation.

This allows flexibility in cost, performance, and reliability across provider ecosystems.

Expand All @@ -37,6 +38,8 @@ Credential detection is connector-aware:
- `wpai_has_ai_credentials` filter allows custom connector implementations to report configured status.
- `has_valid_ai_credentials()` performs a runtime support probe using AI client prompt checks.

The AI plugin depends on registered `ai_provider` connectors. It does not ship provider credentials or provider implementations directly.

### Model Selection and Fallback

Default model preference arrays are ordered. The first supported and available provider/model pair is used by the AI Client prompt builder.
Expand Down Expand Up @@ -93,6 +96,7 @@ add_filter( 'wpai_has_ai_credentials', function( $has_credentials, $connectors )
## Operational Notes

- Configure at least one connector that supports the feature's required capability.
- If a feature is unavailable, confirm that a provider connector plugin is active, authenticated, and listed under `Settings -> Connectors`.
- Multi-provider setups can improve resilience when individual providers are unavailable.
- Keep model preference filters aligned with currently available provider model IDs.
- If no provider supports the requested capability, abilities should return explicit `WP_Error` responses.
Expand Down
1 change: 1 addition & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export default [
'@wordpress/data-no-store-string-literals': 'error',
'@wordpress/wp-global-usage': 'error',
'@wordpress/react-no-unsafe-timeout': 'error',
'@wordpress/components-no-missing-40px-size-prop': 'error',

// Override WP defaults.
'@wordpress/i18n-text-domain': [
Expand Down
12 changes: 8 additions & 4 deletions includes/Abilities/Image/Alt_Text_Generation.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,8 @@ protected function input_schema(): array {
'description' => esc_html__( 'The attachment ID of the image to generate alt text for.', 'ai' ),
),
'image_url' => array(
'type' => 'string',
'sanitize_callback' => array( $this, 'sanitize_image_reference_input' ),
'description' => esc_html__( 'URL or data URI of the image to generate alt text for. Used if attachment_id is not provided.', 'ai' ),
'type' => 'string',
'description' => esc_html__( 'URL or data URI of the image to generate alt text for. Used if attachment_id is not provided.', 'ai' ),
),
'context' => array(
'type' => 'string',
Expand Down Expand Up @@ -122,6 +121,10 @@ protected function execute_callback( $input ) {
),
);

if ( isset( $args['image_url'] ) ) {
$args['image_url'] = $this->sanitize_image_reference_input( $args['image_url'] );
}

// Get the image reference.
$image_reference = $this->get_image_reference( $args );

Expand Down Expand Up @@ -150,7 +153,8 @@ protected function execute_callback( $input ) {

// Return the alt text in the format the Ability expects.
return array(
'alt_text' => sanitize_text_field( $result ),
'alt_text' => sanitize_text_field( $result ),
'is_decorative' => false,
);
}

Expand Down
2 changes: 1 addition & 1 deletion includes/Abilities/Meta_Description/Meta_Description.php
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ static function ( $key, $value ) {

return array(
'text' => $text,
'character_count' => mb_strlen( $text ),
'character_count' => mb_strlen( $text, 'UTF-8' ),
);
}

Expand Down
Loading
Loading