Skip to content

feat: add alt-text generation support to wp ai generate command#17

Open
alaminfirdows wants to merge 24 commits into
wp-cli:mainfrom
alaminfirdows:feat/alt-text-generation
Open

feat: add alt-text generation support to wp ai generate command#17
alaminfirdows wants to merge 24 commits into
wp-cli:mainfrom
alaminfirdows:feat/alt-text-generation

Conversation

@alaminfirdows

Copy link
Copy Markdown

Implement alternative text generation for image attachments via the WordPress AI Client with vision model support. Users can now generate alt text for specific images using:
wp ai generate alt-text <attachment_id>

Features:

  • Validates attachment exists and is an image
  • Converts image to data URI for AI vision model input
  • Configurable model preferences, temperature, and other parameters
  • Truncates output to 125 characters per WCAG guidelines
  • Updates attachment metadata with generated alt text
  • Includes error handling for missing files and unsupported models

Supports all standard AI generation options like --provider, --model, --temperature, and --system-instruction.

Completed #16

Implement alternative text generation for image attachments via the WordPress AI Client with vision model support. Users can now generate alt text for specific images using:
  wp ai generate alt-text <attachment_id>

Features:
- Validates attachment exists and is an image
- Converts image to data URI for AI vision model input
- Configurable model preferences, temperature, and other parameters
- Truncates output to 125 characters per WCAG guidelines
- Updates attachment metadata with generated alt text
- Includes error handling for missing files and unsupported models

Supports all standard AI generation options like --provider, --model, --temperature, and --system-instruction.
@github-actions

Copy link
Copy Markdown
Contributor

Hello! 👋

Thanks for opening this pull request! Please check out our contributing guidelines. We appreciate you taking the initiative to contribute to this project.

Contributing isn't limited to just code. We encourage you to contribute in the way that best fits your abilities, by writing tutorials, giving a demo at your local meetup, helping other users with their support questions, or revising our documentation.

Here are some useful Composer commands to get you started:

  • composer install: Install dependencies.
  • composer test: Run the full test suite.
  • composer phpcs: Check for code style violations.
  • composer phpcbf: Automatically fix code style violations.
  • composer phpunit: Run unit tests.
  • composer behat: Run behavior-driven tests.

To run a single Behat test, you can use the following command:

# Run all tests in a single file
composer behat features/some-feature.feature

# Run only a specific scenario (where 123 is the line number of the "Scenario:" title)
composer behat features/some-feature.feature:123

You can find a list of all available Behat steps in our handbook.

@github-actions github-actions Bot added command:ai-generate Related to 'ai generate' command enhancement New feature or request scope:distribution Related to distribution labels Jun 27, 2026
@codecov

codecov Bot commented Jun 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 78.57143% with 15 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/AI_Command.php 78.57% 15 Missing ⚠️

📢 Thoughts on this report? Let us know!

Expand test scenarios to improve code coverage:
- Non-image attachment validation
- Model format validation
- Temperature range validation
- Top-p range validation
- Top-k positive integer validation
- Max-tokens positive integer validation

Ensures all error paths in generate_alt_text() are tested.
Change 'When' to 'And' for continuation of setup actions in alt-text non-image attachment test scenario.
Follows gherkin-lint style rules.
Remove parameter validation tests that require real attachments in test environment.
Keep critical path tests for attachment validation (invalid ID, non-existent, non-image).

Parameter validation is still covered through static code analysis and unit-level assertions.
Add scenario testing successful alt text generation with real image import.
Remove duplicate scenario.

Improves code coverage for:
- File conversion to data URI
- Builder setup and configuration
- Text generation execution
- Metadata update
Add scenarios testing builder configuration paths:
- Provider option (--provider)
- Temperature option (--temperature)
- System instruction option (--system-instruction)

Improves code coverage for conditional builder setup branches.
Create local FeatureContext that extends vendor base class to provide the
'Given a file /tmp/test-image.png with base64 content:' step definition
for alt text generation tests. Decodes base64 content and writes to file.
- Use proper WP_CLI\AI\Tests namespace prefix
- Replace PHP 8 attributes with docblock for 7.4 compatibility
- Fix spacing around parentheses per WordPress coding standards
- Use standard method naming convention
- Update autoload and behat config accordingly
Add 16 alt-text test scenarios covering:
- Basic alt-text generation success path
- Invalid/missing attachment validation
- Non-image attachment rejection
- File not found handling
- All options (model, provider, temperature, top-p, top-k, max-tokens, system-instruction)
- Parameter validation (top-p range, top-k/max-tokens positive)
- Model format validation

Tests follow existing patterns and reuse vendor base64 file step definition.
Remove two tests that require attachment setup in test environment:
- Alt-text generation fails with non-image attachment
- Alt-text generation fails when file not found on disk

Keep 14 core tests covering success paths and validation.
Remove tests requiring base64 file step (local FeatureContext not available).
Keep 2 simple validation tests:
- Alt-text generation fails with invalid attachment ID
- Alt-text generation fails with non-existent attachment ID

These tests validate command-line argument handling without requiring
file setup.
Add 6 new alt-text test scenarios:
- Alt-text command not available on WP < 7.0
- Alt-text generation fails when AI is disabled
- Alt-text generation validates top-p range (0.0-1.0)
- Alt-text generation validates top-k positive integer
- Alt-text generation validates max-tokens positive integer
- Alt-text generation validates model format (provider:model pairs)

All tests use safe command-line validation without requiring file setup.
Remove 4 tests that require attachment setup:
- Alt-text generation validates top-p range
- Alt-text generation validates top-k positive
- Alt-text generation validates max-tokens positive
- Alt-text generation validates model format

These parameters are validated in the main generate() method before
the alt-text branch, and the same validation is tested for text/image
commands. Alt-text param validation requires actual attachments which
we cannot create in tests-only changes.

Keep 3 core tests that work without attachments:
- Alt-text not available on WP < 7.0
- Alt-text fails when AI is disabled
- Alt-text fails with invalid/non-existent attachment ID
Add local FeatureContext extending vendor base with base64 file step definition
to enable full test coverage of alt-text generation feature.

Add 14 test scenarios covering:
- Alt-text generation on WP < 7.0 (not available)
- Alt-text when AI is disabled
- Invalid/non-existent attachment ID validation
- Non-image attachment rejection
- Successful alt-text generation for image attachment
- All options: model, provider, temperature, top-p, top-k, max-tokens, system-instruction
- Builder and generation error handling

Tests validate parameter handling, attachment validation, and success paths
without breaking existing functionality.
Remove test that requires non-image attachment setup which doesn't reliably
create attachments without actual files. Keep 13 core tests covering:
- WP version check
- AI disabled check
- Attachment validation
- Success paths
- All options and parameters
Fix class name collision where local FeatureContext had same FQN as vendor.
Changes:
- Use WP_CLI\AI\Tests\Context namespace for local FeatureContext
- Implement Context interface directly (no vendor extension needed)
- Add autoload-dev to composer.json for tests/ directory
- Register local context alongside vendor context in behat.yml
autoload-dev in composer.json is not picked up by CI test runner.
Add behat.yml autoload section to directly register the local context
namespace without relying on composer autoload-dev.
Root cause: run-behat-tests hardcodes --snippets-for vendor FeatureContext,
making custom contexts impossible to register via behat.yml.

Fix: replace 'Given a file :path with base64 content:' step with a mu-plugin
that creates both the PNG file and attachment via the init hook. Uses
get_option guard to prevent duplicate attachment creation on repeated boots.

Revert behat.yml autoload changes — not needed anymore.
Previous approach assumed attachment ID 1 but default WP install
already has a post at ID 1 (Hello World). Attachment gets ID 2+.

Fix: use 'wp eval' to create file and attachment in one command,
capture the returned ID via 'save STDOUT as {ATTACHMENT_ID}',
then pass it to the alt-text command.
Alt-text command calls with_file() then is_supported_for_text_generation(),
which requires the model to support image input modalities.

Add image and text+image combinations to inputModalities in the mock
provider so alt-text generation tests can proceed past the support check.
systemInstruction is always set by generate_alt_text(), and temperature/
topP/topK/maxTokens are set when those options are passed. Without these
in the model's supportedOptions, areMetBy() returns false and
is_supported_for_text_generation() fails.

Also remove duplicate candidateCount and outputMimeType entries.
@swissspidy swissspidy added the status:unconfirmed Issue was could not be confirmed yet label Jun 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

command:ai-generate Related to 'ai generate' command enhancement New feature or request scope:distribution Related to distribution status:unconfirmed Issue was could not be confirmed yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants