{"id":5037,"date":"2025-02-22T01:14:04","date_gmt":"2025-02-22T01:14:04","guid":{"rendered":"https:\/\/s-o-s.net\/ai-services\/"},"modified":"2025-02-22T01:14:04","modified_gmt":"2025-02-22T01:14:04","slug":"ai-services","status":"publish","type":"post","link":"https:\/\/s-o-s.net\/en_gb\/ai-services\/","title":{"rendered":"AI Services"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<article id=\"post-205431\" class=\"alignwide post-205431 plugin type-plugin status-publish hentry plugin_business_model-community plugin_committers-flixos90\">\n<div class=\"plugin-banner\" id=\"plugin-banner-ai-services\"><\/div>\n<header class=\"plugin-header\">\n<div class=\"entry-heading-container\">\n<div>\n<div class=\"entry-thumbnail\">\n\t\t\t\t\t<img decoding=\"async\" class=\"plugin-icon\" src=\"https:\/\/ps.w.org\/ai-services\/assets\/icon.svg?rev=3165883\" alt=\"\">\t\t\t\t<\/div>\n<div>\n<h1 class=\"plugin-title\">AI Services<\/h1>\n<p>\t\t\t\t\t<span class=\"byline\">By <span class=\"author vcard\"><a target=\"_blank\" class=\"url fn n\" href=\"https:\/\/profiles.wordpress.org\/flixos90\/\" rel=\"noopener\">Felix Arntz<\/a><\/span><\/span>\n\t\t\t\t<\/div>\n<\/p><\/div>\n<div class=\"plugin-actions\">\n<div class=\"wp-block-button is-small plugin-download download-button\"><a target=\"_blank\" class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/downloads.wordpress.org\/plugin\/ai-services.0.4.0.zip\" rel=\"noopener\">Download<\/a><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/header>\n<p><!-- .entry-header --><\/p>\n<p>\t<span id=\"description\"><\/span><br \/>\n\t<span id=\"reviews\"><\/span><br \/>\n\t<span id=\"installation\"><\/span><br \/>\n\t<span id=\"developers\"><\/span><br \/>\n\t<span id=\"advanced\" class=\"\"><\/span><br \/>\n\t<span id=\"section-links\"><\/p>\n<ul class=\"tabs clear\">\n<li id=\"tablink-description\"><a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/ai-services\/#description\" rel=\"noopener\">Details<\/a><\/li>\n<li id=\"tablink-reviews\"><a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/ai-services\/#reviews\" rel=\"noopener\">Reviews<\/a><\/li>\n<li id=\"tablink-installation\">\n\t\t\t\t<a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/ai-services\/#installation\" rel=\"noopener\">Installation<\/a>\n\t\t\t<\/li>\n<li id=\"tablink-developers\"><a target=\"_blank\" href=\"https:\/\/wordpress.org\/plugins\/ai-services\/#developers\" rel=\"noopener\">Development<\/a><\/li>\n<\/ul>\n<div id=\"link-support\">\n\t\t\t<a target=\"_blank\" href=\"https:\/\/wordpress.org\/support\/plugin\/ai-services\/\" rel=\"noopener\">Support<\/a>\n\t\t<\/div>\n<p>\t<\/span><br \/>\n\t<script type=\"text\/javascript\">if ( '#changelog' == window.location.hash ) { window.setTimeout( function() { window.location.hash=\"#developers\"; }, 10 ); }<\/script><\/p>\n<div class=\"entry-content\">\n<div id=\"tab-description\" class=\"plugin-description section\">\n<h2 id=\"description-header\">Description<\/h2>\n<p>This WordPress plugin introduces central infrastructure which allows other plugins to make use of AI capabilities. It exposes APIs that can be used in various contexts, whether you need to use AI capabilities in server-side or client-side code. Furthermore, the APIs are agnostic of the AI service \u2013 whether that\u2019s Anthropic, Google, or OpenAI, to only name a few, you can use any of them in the same way. You can also register your own implementation of another service, if it is not supported out of the box.<\/p>\n<p>The plugin does intentionally <em>not<\/em> come with specific AI driven features built-in, except for an AI Playground screen to explore AI capabilities as well as a settings screen to configure AI service credentials. The purpose of this plugin is to facilitate use of AI by other plugins. As such, it is a perfect use-case for <a target=\"_blank\" href=\"https:\/\/make.wordpress.org\/core\/2024\/03\/05\/introducing-plugin-dependencies-in-wordpress-6-5\/\" rel=\"nofollow ugc noopener\">plugin dependencies<\/a>.<\/p>\n<p>Here\u2019s a (non-comprehensive) feature list:<\/p>\n<ul>\n<li>Abstraction layer and APIs to communicate with any AI service in a uniform way\n<ul>\n<li>APIs are available in both PHP and in JavaScript, as well as via WP-CLI commands<\/li>\n<li>Supports streaming text generation for more immediate feedback to users<\/li>\n<li>Currently only supports text generation (including multi-modal support if supported by the AI service), but support for additional capabilities (e.g. image generation, audio generation) will be added soon<\/li>\n<\/ul>\n<\/li>\n<li>Built-in AI service implementations\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.anthropic.com\/claude\" rel=\"nofollow ugc noopener\">Anthropic (Claude)<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/ai.google.dev\/gemini-api\" rel=\"nofollow ugc noopener\">Google (Gemini)<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/openai.com\/chatgpt\/\" rel=\"nofollow ugc noopener\" class=\"broken_link\">OpenAI (ChatGPT)<\/a><\/li>\n<li>Browser (client-side only; experimental support for <a target=\"_blank\" href=\"https:\/\/developer.chrome.com\/docs\/ai\/built-in-apis\" rel=\"nofollow ugc noopener\">Chrome\u2019s built-in AI APIs<\/a>)<\/li>\n<\/ul>\n<\/li>\n<li>Additional AI service integrations can be registered and will then be available in the same way as built-in ones<\/li>\n<li>AI Playground administration screen (in the Tools menu) allows exploring the different AI capabilities<\/li>\n<li>AI Services settings screen to configure services with API credentials<\/li>\n<\/ul>\n<p><strong>Disclaimer:<\/strong> The AI Services plugin is still in its early stages, with a limited feature set. As long as it is in a <code>0.x.y<\/code> version, there may be occasional breaking changes when using lower level parts of the API. Consider the plugin early access at this point, as there are lots of enhancements to add and polishing to do. A crucial part of that is shaping the APIs to make them easy to use and cover the different generative AI capabilities that the third party services offer in a uniform way. That\u2019s why your feedback is much appreciated!<\/p>\n<h4>Why?<\/h4>\n<ul>\n<li>A centralized AI infrastructure <strong>facilitates user choice<\/strong>. Users may prefer certain AI services over other ones, and for many common tasks, either of the popular AI services is suitable. Having a common API regardless of the AI service allows leaving the choice to the user, rather than the plugin author.<\/li>\n<li>Since the centralized AI infrastructure comes with a common API that works the same for every AI service, it means <strong>plugin developers don\u2019t have to spend as much time familiarizing themselves with different services<\/strong>, at least when it comes to simple tasks. For tasks where certain services may have advantages over others, there is still flexibility to focus on a specific AI service.<\/li>\n<li>It also means <strong>no more reinventing the wheel<\/strong>: Since most AI services do not provide PHP SDKs for their APIs, many times this means WordPress plugins that want to leverage AI have to implement their own layer around the service\u2019s API. Not only is that time consuming, it also distracts from working on the actual (AI driven) features that the plugin should offer to its users. In fact this directly facilitates the user choice aspect mentioned, as having APIs for various AI services already provided means you can simply make those available to your plugin users.<\/li>\n<li>Having central AI infrastructure available <strong>unlocks AI capabilities for smaller plugins or features<\/strong>: It may not be worth the investment to implement a whole AI API layer for a simple AI driven feature, but when you already have it available, it can lead to more plugins (and thus more users) benefitting from AI capabilities.<\/li>\n<li>Last but not least, a central AI infrastructure means <strong>users will only have to configure the AI API once<\/strong>, e.g. paste their API keys only in a single WordPress administration screen. Without central AI infrastructure, every plugin has to provide its own UI for pasting API keys, making the process more tedious for site owners the more AI capabilities their site uses.<\/li>\n<\/ul>\n<h4>Integration with third party services<\/h4>\n<p>While the plugin APIs allow registering custom AI services, the plugin comes with a few popular AI services built-in. These AI services rely on the respective third party API. Their use is optional and it is up to you to choose which third party service you would like to use or whether you would like to use multiple.<\/p>\n<p>The use of the third party AI services is subject to the respective terms of service. The following third party services are supported out of the box:<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.anthropic.com\/claude\" rel=\"nofollow ugc noopener\">Anthropic (Claude)<\/a>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.anthropic.com\/legal\/consumer-terms\" rel=\"nofollow ugc noopener\">Anthropic Consumer Terms of Service<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.anthropic.com\/legal\/commercial-terms\" rel=\"nofollow ugc noopener\">Anthropic Commercial Terms of Service<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.anthropic.com\/legal\/privacy\" rel=\"nofollow ugc noopener\">Anthropic Privacy Policy<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/ai.google.dev\/gemini-api\" rel=\"nofollow ugc noopener\">Google (Gemini)<\/a>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/policies.google.com\/terms\" rel=\"nofollow ugc noopener\">Google Terms of Service<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/policies.google.com\/terms\/generative-ai\" rel=\"nofollow ugc noopener\">Google AI Terms of Service<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/policies.google.com\/privacy\" rel=\"nofollow ugc noopener\">Google Privacy Policy<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/openai.com\/chatgpt\/\" rel=\"nofollow ugc noopener\" class=\"broken_link\">OpenAI (ChatGPT)<\/a>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/openai.com\/policies\/row-terms-of-use\/\" rel=\"nofollow ugc noopener\" class=\"broken_link\">OpenAI Terms of Use<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/openai.com\/policies\/row-privacy-policy\/\" rel=\"nofollow ugc noopener\" class=\"broken_link\">OpenAI Privacy Policy<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Examples<\/h4>\n<p><strong>Generate the answer to a prompt in PHP code:<\/strong><\/p>\n<pre><code>use Felix_Arntz\\AI_Services\\Services\\API\\Enums\\AI_Capability;\nuse Felix_Arntz\\AI_Services\\Services\\API\\Helpers;\n\nif ( ai_services()-&gt;has_available_services() ) {\n    $service = ai_services()-&gt;get_available_service();\n    try {\n        $candidates = $service\n            -&gt;get_model(\n                array(\n                    'feature'      =&gt; 'my-test-feature',\n                    'capabilities' =&gt; array( AI_Capability::TEXT_GENERATION ),\n                )\n            )\n            -&gt;generate_text( 'What can I do with WordPress?' );\n\n        $text = Helpers::get_text_from_contents(\n            Helpers::get_candidate_contents( $candidates )\n        );\n\n        echo $text;\n    } catch ( Exception $e ) {\n        \/\/ Handle the exception.\n    }\n}\n<\/code><\/pre>\n<p><strong>Generate the answer to a prompt in JavaScript code:<\/strong><\/p>\n<pre><code>const helpers = aiServices.ai.helpers;\nconst { hasAvailableServices, getAvailableService } = wp.data.select( 'ai-services\/ai' );\nif ( hasAvailableServices() ) {\n    const service = getAvailableService();\n    try {\n        const candidates = await service.generateText(\n            'What can I do with WordPress?',\n            { feature: 'my-test-feature' }\n        );\n\n        const text = helpers.getTextFromContents(\n                helpers.getCandidateContents( candidates )\n            );\n\n        console.log( text );\n    } catch ( error ) {\n        \/\/ Handle the error.\n    }\n}\n<\/code><\/pre>\n<p><strong>Generate the answer to a prompt using WP-CLI:<\/strong><\/p>\n<pre><code>wp ai-services generate-text \"What can I do with WordPress?\" --feature=my-test-feature --user=admin\n<\/code><\/pre>\n<p>You can also use a specific AI service, if you have a preference, for example the <code>google<\/code> service.<\/p>\n<p><strong>Generate the answer to a prompt using a specific AI service, in PHP code:<\/strong><\/p>\n<pre><code>use Felix_Arntz\\AI_Services\\Services\\API\\Enums\\AI_Capability;\nuse Felix_Arntz\\AI_Services\\Services\\API\\Helpers;\n\nif ( ai_services()-&gt;is_service_available( 'google' ) ) {\n    $service = ai_services()-&gt;get_available_service( 'google' );\n    try {\n        $candidates = $service\n            -&gt;get_model(\n                array(\n                    'feature'      =&gt; 'my-test-feature',\n                    'capabilities' =&gt; array( AI_Capability::TEXT_GENERATION ),\n                )\n            )\n            -&gt;generate_text( 'What can I do with WordPress?' );\n\n        $text = Helpers::get_text_from_contents(\n            Helpers::get_candidate_contents( $candidates )\n        );\n\n        echo $text;\n    } catch ( Exception $e ) {\n        \/\/ Handle the exception.\n    }\n}\n<\/code><\/pre>\n<p>For complete examples such as entire plugins built on top of the AI Services infrastructure, please see the <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/tree\/main\/examples\" rel=\"nofollow ugc noopener\">examples directory on GitHub<\/a>.<\/p>\n<p>Additionally, the <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/tree\/main\/docs\/README.md\" rel=\"nofollow ugc noopener\">plugin documentation<\/a> provides granular examples including explainers.<\/p>\n<\/div>\n<div id=\"screenshots\" class=\"plugin-screenshots section\">\n<h2 id=\"screenshots-header\">Screenshots<\/h2>\n<ul class=\"plugin-screenshots\">\n<li>\n<figure><a target=\"_blank\" href=\"https:\/\/ps.w.org\/ai-services\/assets\/screenshot-1.png?rev=3219864\" rel=\"nofollow noopener\"><img decoding=\"async\" class=\"screenshot\" src=\"https:\/\/ps.w.org\/ai-services\/assets\/screenshot-1.png?rev=3219864\" alt=\"\"><\/a><figcaption>The AI Services settings screen where users can paste their AI service credentials<\/figcaption><\/figure>\n<\/li>\n<li>\n<figure><a target=\"_blank\" href=\"https:\/\/ps.w.org\/ai-services\/assets\/screenshot-2.png?rev=3219864\" rel=\"nofollow noopener\"><img decoding=\"async\" class=\"screenshot\" src=\"https:\/\/ps.w.org\/ai-services\/assets\/screenshot-2.png?rev=3219864\" alt=\"\"><\/a><figcaption>The AI Playground where users can explore the AI capabilities of the different services<\/figcaption><\/figure>\n<\/li>\n<\/ul>\n<\/div>\n<div id=\"tab-installation\" class=\"plugin-installation section\">\n<h2 id=\"installation-header\">Installation<\/h2>\n<h4>Installation from within WordPress<\/h4>\n<ol>\n<li>Visit <strong>Plugins &gt; Add New<\/strong>.<\/li>\n<li>Search for <strong>AI Services<\/strong>.<\/li>\n<li>Install and activate the AI Services plugin.<\/li>\n<\/ol>\n<h4>Manual installation<\/h4>\n<ol>\n<li>Upload the entire <code>ai-services<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Visit <strong>Plugins<\/strong>.<\/li>\n<li>Activate the AI Services plugin.<\/li>\n<\/ol>\n<h4>Usage<\/h4>\n<p>Once the plugin is active, you will find a new <em>Settings &gt; AI Services<\/em> submenu in the WordPress administration menu. In there, you can configure your AI service API keys. After that, you can use the <em>Tools &gt; AI Playground<\/em> screen to explore the available AI capabilities of the different connected services.<\/p>\n<p>If you have enabled the WordPress assistant chatbot via filter, you should see a small \u201cNeed help?\u201d button in the lower right throughout WP Admin after you have configured at least one (valid) API key.<\/p>\n<p>Please refer to the <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/tree\/main\/docs\/README.md\" rel=\"nofollow ugc noopener\">plugin documentation<\/a> for instructions on how you can actually use the AI capabilities of the plugin in your own projects.<\/p>\n<\/div>\n<div id=\"faq\" class=\"plugin-faq section\">\n<h2 id=\"faq-header\">FAQ<\/h2>\n<dl>\n<dt id=\"how%20can%20i%20customize%20ai%20services%20model%20parameters%3F\">\n<h3>How can I customize AI Services model parameters?<\/h3>\n<\/dt>\n<dd>\n<p>You can use the <code>ai_services_model_params<\/code> filter in PHP to customize the model parameters before they are used to retrieve a given AI service model.<\/p>\n<p>This filter is run consistently in any context, regardless of whether the AI model is used via PHP, JavaScript, or WP-CLI.<\/p>\n<p>This can be helpful, for example, if you need to inject custom model configuration parameters or a custom system instruction for a specific feature in a way that it happens dynamically on the server.<\/p>\n<p>Here is an example code snippet which injects a custom system instruction whenever the feature <code>my-movie-expert<\/code> is used:<\/p>\n<pre><code>add_filter(\n    'ai_services_model_params',\n    function ( $params ) {\n        if ( 'my-movie-expert' === $params['feature'] ) {\n            $params['systemInstruction']  = 'You are a movie expert. You can answer questions about movies, actors, directors, and movie references.';\n            $params['systemInstruction'] .= ' If the user asks you about anything unrelated to movies, you should politely deny the request.';\n            $params['systemInstruction'] .= ' You may use famous movie quotes in your responses to make the conversation more engaging.';\n        }\n        return $params;\n    }\n);\n<\/code><\/pre>\n<p>Note that this filter does not allow you to change the <code>feature<\/code> parameter, as that needs to be controlled by the caller.<\/p>\n<\/dd>\n<dt id=\"how%20can%20i%20enable%20the%20wordpress%20assistant%20chatbot%20feature%3F\">\n<h3>How can I enable the WordPress Assistant chatbot feature?<\/h3>\n<\/dt>\n<dd>\n<p>There is a simple WordPress Assistant chatbot available as an experimental feature of the plugin, effectively acting as a proof of concept. Since the plugin is purely an infrastructure plugin that other plugins can use to access AI capabilities in WordPress, that chatbot feature is disabled by default.<\/p>\n<p>If you want to test or use the chatbot, you can easily enable it via filter:<\/p>\n<pre><code>add_filter( 'ai_services_chatbot_enabled', '__return_true' );\n<\/code><\/pre>\n<\/dd>\n<dt id=\"how%20can%20i%20tweak%20the%20wp-cli%20commands%27%20behavior%3F\">\n<h3>How can I tweak the WP-CLI commands\u2019 behavior?<\/h3>\n<\/dt>\n<dd>\n<p>The <code>wp ai-services generate-text<\/code> command streams text responses by default, providing faster feedback to the user. If you prefer to show the complete text response in one go instead, you can disable streaming in WP-CLI by using the <code>ai_services_wp_cli_use_streaming<\/code> filter.<\/p>\n<pre><code>add_filter( 'ai_services_wp_cli_use_streaming', '__return_false' );\n<\/code><\/pre>\n<\/dd>\n<dt id=\"how%20can%20i%20programmatically%20provide%20service%20api%20keys%3F\">\n<h3>How can I programmatically provide service API keys?<\/h3>\n<\/dt>\n<dd>\n<p>If you prefer to not expose the sensitive controls over the AI service API keys to the site\u2019s end users, you can programmatically specify the keys by filtering the relevant service\u2019s option value.<\/p>\n<p>For example, to enforce an API key to use for the Google AI service, you could use a code snippet like the following:<\/p>\n<pre><code>add_filter(\n    'pre_option_ais_google_api_key',\n    function () {\n        return 'my-google-api-key';\n    }\n);\n<\/code><\/pre>\n<p>The same approach works for any other services too. Simply use the correct service slug, e.g. <code>openai<\/code> for the OpenAI integration and <code>anthropic<\/code> for the Anthropic integration.<\/p>\n<\/dd>\n<dt id=\"which%20user%20capabilities%20are%20available%20and%20how%20can%20i%20customize%20them%3F\">\n<h3>Which user capabilities are available and how can I customize them?<\/h3>\n<\/dt>\n<dd>\n<p><a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/blob\/main\/docs\/Customizing-the-Available-Capabilities.md\" rel=\"nofollow ugc noopener\">Please see the documentation article on customizing the available plugin capabilities.<\/a><\/p>\n<\/dd>\n<dt id=\"should%20this%20be%20in%20wordpress%20core%3F\">\n<h3>Should this be in WordPress Core?<\/h3>\n<\/dt>\n<dd>\n<p>Probably not? At least not yet. While generative AI has been around for a few years, in the grand scheme of things we are still only scratching the surface of what\u2019s possible. But most importantly, the lack of standardization makes it difficult to consider built-in AI support in WordPress Core.<\/p>\n<p>WordPress Core rarely adds support for features that rely on third party services. An exception is oEmbed support for many popular services, however via the common oEmbed endpoint that each service implements there is a standard way to have it work correctly without having to individually maintain each integration. Doing so would be a maintenance burden and it would make it almost impossible to stay on top of everything: Imagine one of the services makes a change \u2013 not only would this require to manually update the WordPress Core integration, but it would also require to quickly ship a new release ASAP because otherwise the WordPress sites using the service would break. Unfortunately, there is no such standard for how generative AI APIs provided by third party services should work. In other words, if you implement support for a generative AI API in your plugin, that implementation is subject to the same concern, and it applies to the AI Services plugin too. However, by centralizing the implementation in one plugin, the problem surface is greatly reduced. And differently from WordPress Core, it\u2019s more straightforward and more reasonable to ship a quick hotfix for this plugin.<\/p>\n<p>The other reason that integrating generative AI in WordPress Core would be difficult is because (almost all) the services that make those APIs available require paid subscriptions. This is not well aligned with WordPress\u2019s FOSS philosophy. A potentially promising development that may change that situation is the introduction of browser built-in AI capabilities made available via JavaScript APIs, such as <a target=\"_blank\" href=\"https:\/\/developer.chrome.com\/docs\/ai\" rel=\"nofollow ugc noopener\">Chrome built-in AI<\/a> (which is also supported by the AI Services plugin).<\/p>\n<p>Only time will tell whether those points can be addressed in a way that make built-in AI capabilities in WordPress Core a possibility. Until then, you can use a plugin like this one. While it is for obvious reasons not a WordPress Core feature plugin, it is in many ways built to potentially become a canonical AI plugin for WordPress:<\/p>\n<ul>\n<li>It is free, and always will be.<\/li>\n<li>It follows the WordPress Core philosophies.<\/li>\n<li>It uses WordPress UI components as much as possible.<\/li>\n<li>It is neutral and does not favor one AI service over another.<\/li>\n<\/ul>\n<\/dd>\n<dt id=\"where%20should%20i%20submit%20my%20support%20request%3F\">\n<h3>Where should I submit my support request?<\/h3>\n<\/dt>\n<dd>\n<p>For regular support requests, please use the <a target=\"_blank\" href=\"https:\/\/wordpress.org\/support\/plugin\/ai-services\" rel=\"ugc noopener\">wordpress.org support forums<\/a>. If you have a technical issue with the plugin where you already have more insight on how to fix it, you can also <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\" rel=\"nofollow ugc noopener\">open an issue on GitHub instead<\/a>.<\/p>\n<\/dd>\n<dt id=\"how%20can%20i%20contribute%20to%20the%20plugin%3F\">\n<h3>How can I contribute to the plugin?<\/h3>\n<\/dt>\n<dd>\n<p>If you have ideas to improve the plugin or to solve a bug, feel free to raise an issue or submit a pull request in the <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\" rel=\"nofollow ugc noopener\">GitHub repository for the plugin<\/a>. Please stick to the <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/blob\/main\/CONTRIBUTING.md\" rel=\"nofollow ugc noopener\">contributing guidelines<\/a>.<\/p>\n<p>You can also contribute to the plugin by translating it. Simply visit <a target=\"_blank\" href=\"https:\/\/translate.wordpress.org\/projects\/wp-plugins\/ai-services\" rel=\"nofollow ugc noopener\">translate.wordpress.org<\/a> to get started.<\/p>\n<\/dd>\n<\/dl>\n<\/div>\n<div id=\"tab-reviews\" class=\"plugin-reviews section\">\n<h2 id=\"reviews-header\">Reviews<\/h2>\n<div class=\"notice notice-warning notice-alt\">\n<p>There are no reviews for this plugin.<\/p>\n<\/div>\n<\/div>\n<div id=\"tab-developers\" class=\"plugin-developers section\">\n<h2 id=\"developers-header\">Contributors &amp; Developers<\/h2>\n<div class=\"plugin-contributors\">\n<p>\u201cAI Services\u201d is open source software. The following people have contributed to this plugin.<\/p>\n<p><span class=\"screen-reader-text\">Contributors<\/span><\/p>\n<ul id=\"contributors-list\" class=\"contributors-list\">\n<li>\n\t\t\t\t<img decoding=\"async\" alt=\"\" src=\"https:\/\/secure.gravatar.com\/avatar\/a60abe9a2c42fe5cf2117b88aac2eab186f0ea3c969f1f4a29d4a09d831153b8?s=32&amp;d=mm&amp;r=g\" srcset=\"https:\/\/secure.gravatar.com\/avatar\/a60abe9a2c42fe5cf2117b88aac2eab186f0ea3c969f1f4a29d4a09d831153b8?s=64&amp;d=mm&amp;r=g 2x\" class=\"avatar avatar-32 photo\" height=\"32\" width=\"32\">\t\t\t\t<a target=\"_blank\" href=\"https:\/\/profiles.wordpress.org\/flixos90\/\" rel=\"noopener\"><br \/>\n\t\t\t\t\tFelix Arntz\t\t\t\t<\/a>\n\t\t\t<\/li>\n<\/ul><\/div>\n<div class=\"plugin-development\">\n<p><a target=\"_blank\" href=\"https:\/\/translate.wordpress.org\/projects\/wp-plugins\/ai-services\" rel=\"noopener\">Translate \u201cAI Services\u201d into your language.<\/a><\/p>\n<h3>Interested in development?<\/h3>\n<p><a target=\"_blank\" href=\"https:\/\/plugins.trac.wordpress.org\/browser\/ai-services\/\" rel=\"noopener\" class=\"broken_link\">Browse the code<\/a>, check out the <a target=\"_blank\" href=\"https:\/\/plugins.svn.wordpress.org\/ai-services\/\" rel=\"noopener\">SVN repository<\/a>, or subscribe to the <a target=\"_blank\" href=\"https:\/\/plugins.trac.wordpress.org\/log\/ai-services\/\" rel=\"noopener\" class=\"broken_link\">development log<\/a> by <a target=\"_blank\" href=\"https:\/\/plugins.trac.wordpress.org\/log\/ai-services\/?limit=100&amp;mode=stop_on_copy&amp;format=rss\" rel=\"noopener\" class=\"broken_link\">RSS<\/a>.<\/p>\n<\/div>\n<\/div>\n<div id=\"tab-changelog\" class=\"plugin-changelog section\">\n<h2 id=\"changelog-header\">Changelog<\/h2>\n<h4>0.4.0<\/h4>\n<p><strong>Features:<\/strong><\/p>\n<ul>\n<li>Add AI Playground screen which allows to explore services and models with their configurations and behaviors. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/1495994399a39baf300b4f70d3f8c93ebf29059e\" rel=\"nofollow ugc noopener\">1495994<\/a>)<\/li>\n<li>Add REST route and expand <code>ai-services\/ai<\/code> store to provide general plugin data and user capabilities for JavaScript consumption. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/83d770cd31eb598bd8b1a52e5f117655ef8a1075\" rel=\"nofollow ugc noopener\">83d770c<\/a>)<\/li>\n<\/ul>\n<p><strong>Enhancements:<\/strong><\/p>\n<ul>\n<li>Ensure AI playground message data can be stored in session storage by avoiding to include inline data for attachments. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/b667611c539529ac2f34fcb933af9675dc75d41a\" rel=\"nofollow ugc noopener\">b667611<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/7d346a2423bad8d1bae84c82abb80899e565066d\" rel=\"nofollow ugc noopener\">7d346a2<\/a>)<\/li>\n<li>Implement store infrastructure to manage panel state and persist open\/closed AI playground panels. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/89572e8e2368d68894b82287e639b483d0840f6f\" rel=\"nofollow ugc noopener\">89572e8<\/a>)<\/li>\n<li>Implement AI playground panel to allow customizing most commonly supported AI model config parameters. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/27ea03f54f14bb840efb635673f5f3cad83a3508\" rel=\"nofollow ugc noopener\">27ea03f<\/a>)<\/li>\n<li>Support providing message history alongside new prompt in AI playground. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/33c54cc202b1466b726e6fedf645682896fd2dba\" rel=\"nofollow ugc noopener\">33c54cc<\/a>)<\/li>\n<li>Allow to reset the list of messages in the AI playground. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/95379864c53aef24a3c9f453b89da200eb9e4ae7\" rel=\"nofollow ugc noopener\">9537986<\/a>)<\/li>\n<li>Persist messages from AI playground in session storage. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/60c45d99e82807f9d8bddc386e71a98d3c9fe7b3\" rel=\"nofollow ugc noopener\">60c45d9<\/a>)<\/li>\n<li>Expand interface package with store for easier abstraction and a new <code>Modal<\/code> component. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/5ee0e20ba09194774ca7d6902607500fd6a2ace6\" rel=\"nofollow ugc noopener\">5ee0e20<\/a>)<\/li>\n<li>Implement playground UI to select an attachment from the media library to provide as multimodal input. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/dbad8d360a64649b00e1fa033e2f291a6a59568b\" rel=\"nofollow ugc noopener\">dbad8d3<\/a>)<\/li>\n<li>Enhance playground input by allowing arrow navigation to access previous messages and automatically focusing on it. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/f44efa501bde7a0ef8ad104b4c7ae54fe523d148\" rel=\"nofollow ugc noopener\">f44efa5<\/a>)<\/li>\n<li>Implement keyboard shortcut to toggle system instruction. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/66f990da149a35b3f90432f4bacbf21081b45828\" rel=\"nofollow ugc noopener\">66f990d<\/a>)<\/li>\n<li>Automatically scroll to latest messages as new messages arrive. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/c8f37468e96d8ed6778f7f41ec1fe18684e536b0\" rel=\"nofollow ugc noopener\">c8f3746<\/a>)<\/li>\n<li>Implement <code>getServiceName<\/code> and <code>getServiceCredentialsUrl<\/code> selectors in <code>ai-services\/ai<\/code> store for parity with PHP API. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/d9ca1184a4479beca255b3a40a5a697874c07acd\" rel=\"nofollow ugc noopener\">d9ca118<\/a>)<\/li>\n<li>Implement store <code>ai-services\/ai-playground<\/code> for new AI playground screen. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/96f5b454ecb79969523f70febd22d588a00f98ee\" rel=\"nofollow ugc noopener\">96f5b45<\/a>)<\/li>\n<li>Use newer <code>ai.languageModel<\/code> property for Chrome built-in AI, continuing to support <code>ai.assistant<\/code> for backward compatibility. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/0f5222725419881edcea91fb4524248f005623fb\" rel=\"nofollow ugc noopener\">0f52227<\/a>)<\/li>\n<li>Remove unused option. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/28a864a24e70ff31a5577e69c6025fca94331b5e\" rel=\"nofollow ugc noopener\">28a864a<\/a>)<\/li>\n<li>Ensure service options are set to (temporarily) not autoload when plugin gets deactivated. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/4841d5b5670131b14ceb908a1ee05d056dab3fd4\" rel=\"nofollow ugc noopener\">4841d5b<\/a>)<\/li>\n<\/ul>\n<p><strong>Bug Fixes:<\/strong><\/p>\n<ul>\n<li>Fix AI playground automatic message scrolling to correctly function with multiple quick subsequent updates. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/50f40fe649a444af0a7efaaa2539fef1361b2b7c\" rel=\"nofollow ugc noopener\">50f40fe<\/a>)<\/li>\n<li>Fix sidebar toggle button being hidden on mobile. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/9d4465058050effeb256aad1bb12698752500275\" rel=\"nofollow ugc noopener\">9d44650<\/a>)<\/li>\n<li>Fix bugs with sidebar handling and support keyboard shortcut in interface abstraction. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/cf7b926f9810dd664e8a8b016bfa6b8a0835455f\" rel=\"nofollow ugc noopener\">cf7b926<\/a>)<\/li>\n<\/ul>\n<p><strong>Documentation:<\/strong><\/p>\n<ul>\n<li>Add documentation about the available user capabilities and how to customize them. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/a1d972bdca6121cd3358827798f2c6cd0a2f79ea\" rel=\"nofollow ugc noopener\">a1d972b<\/a>)<\/li>\n<li>Expand readme and documentation to reference the new AI Playground screen. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/a136c1c0a7f1685593ec13c8084f436c665f5a27\" rel=\"nofollow ugc noopener\">a136c1c<\/a>)<\/li>\n<\/ul>\n<h4>0.3.0<\/h4>\n<p><strong>Features:<\/strong><\/p>\n<ul>\n<li>Add text streaming support to generative models in JavaScript. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/9967db5ac2c7d659345a01bb6acc52978c9278ef\" rel=\"nofollow ugc noopener\">9967db5<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/3\" rel=\"nofollow ugc noopener\">#3<\/a>)<\/li>\n<li>Introduce REST route to stream generate text, using an event stream. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/071a664e7b0693870b3f0b822451410bdc5e1875\" rel=\"nofollow ugc noopener\">071a664<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/3\" rel=\"nofollow ugc noopener\">#3<\/a>)<\/li>\n<li>Add text streaming support to all built-in services Anthropic, Google, OpenAI. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/e27697a581204652c8eb08fb37775e185cbb376a\" rel=\"nofollow ugc noopener\">e27697a<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/3\" rel=\"nofollow ugc noopener\">#3<\/a>)<\/li>\n<li>Introduce API foundation for streaming text responses. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/9476333b0b4e0a968eef6a84743924caaa2be844\" rel=\"nofollow ugc noopener\">9476333<\/a>)<\/li>\n<\/ul>\n<p><strong>Enhancements:<\/strong><\/p>\n<ul>\n<li>Polish and complete implementation of Chrome browser built-in AI integration. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/1beb2c5748821ccd2efed31592f99dd03d41423a\" rel=\"nofollow ugc noopener\">1beb2c5<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/6\" rel=\"nofollow ugc noopener\">#6<\/a>)<\/li>\n<li>Support text streaming in chat implementations in both PHP and JavaScript. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/9e11c034b2f5906b54f33e40a3b0645cc199379f\" rel=\"nofollow ugc noopener\">9e11c03<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/3\" rel=\"nofollow ugc noopener\">#3<\/a>)<\/li>\n<li>Use streaming by default for the built-in chatbot. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/3f6266b81893b2abcaa8774eb513c3ca3845b1f7\" rel=\"nofollow ugc noopener\">3f6266b<\/a>)<\/li>\n<li>Use streaming by default for WP-CLI text generation, customizable via filter. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/f9be4ad955400aa825235f86868445067d2e831e\" rel=\"nofollow ugc noopener\">f9be4ad<\/a>)<\/li>\n<li>Remove unnecessary <code>console.log<\/code> call for chatbot. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/7637632e92c04338b096f7ec7696a93d80693623\" rel=\"nofollow ugc noopener\">7637632<\/a>)<\/li>\n<li>Persist chatbot messages history in session storage. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/a349274a4b072a1676410151079dd49f224c9b5b\" rel=\"nofollow ugc noopener\">a349274<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/4\" rel=\"nofollow ugc noopener\">#4<\/a>)<\/li>\n<li>Persist chatbot visibility across page loads. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/81a051151aed336312b59dcca5205b77fa372cd6\" rel=\"nofollow ugc noopener\">81a0511<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/4\" rel=\"nofollow ugc noopener\">#4<\/a>)<\/li>\n<li>Include chatbot input label for screen reader users for better accessibility. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/94026e5fed3f14977ba4ad57321755e450816a8c\" rel=\"nofollow ugc noopener\">94026e5<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/4\" rel=\"nofollow ugc noopener\">#4<\/a>)<\/li>\n<li>Improve chatbot accessibility by focusing on input when the chatbot is opened. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/7b5c6f4eb7b42beb823dcbc268245df887cbbf2d\" rel=\"nofollow ugc noopener\">7b5c6f4<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/4\" rel=\"nofollow ugc noopener\">#4<\/a>)<\/li>\n<li>Improve chatbot error handling by displaying technical errors as a chatbot response. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/e57d7165c255536015ffadb136b6181900b816b0\" rel=\"nofollow ugc noopener\">e57d716<\/a>)<\/li>\n<li>Show loading ellipsis in chatbot while generating text response. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/db7951596fd95e9f5c0b448f2f39b87336b96413\" rel=\"nofollow ugc noopener\">db79515<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/4\" rel=\"nofollow ugc noopener\">#4<\/a>)<\/li>\n<li>Handle errors during browser AI session creation more gracefully. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/0edd56f350deced5dde25bab84c5377f42365add\" rel=\"nofollow ugc noopener\">0edd56f<\/a>)<\/li>\n<li>Consistently handle AI temperature parameter between services, expecting a value between 0.0 and 1.0. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/e7ae611b34edbf82ec6cd9fa9ee97cfa7d4423a6\" rel=\"nofollow ugc noopener\">e7ae611<\/a>)<\/li>\n<li>Improve error handling in chat store and built-in chatbot. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/06b23400c2c8837977a8ba3a43d4cdee44d81789\" rel=\"nofollow ugc noopener\">06b2340<\/a>)<\/li>\n<li>Expand AI capabilities with <code>CHAT_HISTORY<\/code> capability to differentiate between whether text generation models support history. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/4c2feb4112f9dda700a34f425eb3eab0831bee13\" rel=\"nofollow ugc noopener\">4c2feb4<\/a>)<\/li>\n<li>Provide helper function in PHP and JS to aggregate chunks from candidates stream into final candidates response. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/a27bdf65042200d9f55ee3a4c83bb56d0d31032f\" rel=\"nofollow ugc noopener\">a27bdf6<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/3\" rel=\"nofollow ugc noopener\">#3<\/a>)<\/li>\n<li>Ensure third-party production libraries are always backward compatible with minimum supported PHP version by separating tooling. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/e4fe2919da046e742dc2c40d4b1a5e90e3e480bd\" rel=\"nofollow ugc noopener\">e4fe291<\/a>)<\/li>\n<li>Enhance JavaScript API with model instances for better parity with PHP API, while continuing to allow previous approach as short-hand syntax. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/7992d6dd5adb72ea57857f5f5c548563f0e30000\" rel=\"nofollow ugc noopener\">7992d6d<\/a>)<\/li>\n<li>Restructure JavaScript code into separate files per class. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/cd8d90da9bfa59fcb31174279ef41c36fde60e55\" rel=\"nofollow ugc noopener\">cd8d90d<\/a>)<\/li>\n<li>Remove specific API client interface methods that should not be required for the interface. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/140d7c128875b5a73c5a31a93e4f1793ea3599d0\" rel=\"nofollow ugc noopener\">140d7c1<\/a>)<\/li>\n<li>Allow candidates to have no content. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/c072689ebff295ff40de1e8bd57e3abc28b35c14\" rel=\"nofollow ugc noopener\">c072689<\/a>)<\/li>\n<\/ul>\n<p><strong>Bug Fixes:<\/strong><\/p>\n<ul>\n<li>Remove prefix from base64 inline image data for Anthropic AI integration. Props <a target=\"_blank\" href=\"https:\/\/github.com\/mslinnea\" rel=\"nofollow ugc noopener\">mslinnea<\/a>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/pull\/19\" rel=\"nofollow ugc noopener\">#19<\/a>)<\/li>\n<li>Fix bug in <code>CandidatesStreamProcessor<\/code> in JS, leading to stream responses to not being aggregated correctly. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/969b55414945dc598528f894f741ae92b151adea\" rel=\"nofollow ugc noopener\">969b554<\/a>)<\/li>\n<li>Fix OpenAI model definitions by restricting to <code>gpt-4o<\/code> models for multimodal support. Props <a target=\"_blank\" href=\"https:\/\/github.com\/mslinnea\" rel=\"nofollow ugc noopener\">mslinnea<\/a>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/pull\/18\" rel=\"nofollow ugc noopener\">#18<\/a>)<\/li>\n<li>Split components package into distinct components and interface packages to better separate responsibilities and avoid JS warning outside of AI Services admin screen. Props <a target=\"_blank\" href=\"https:\/\/github.com\/westonruter\" rel=\"nofollow ugc noopener\">westonruter<\/a>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/056461c92014926777172424073eb70aac172b5d\" rel=\"nofollow ugc noopener\">056461c<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/13\" rel=\"nofollow ugc noopener\">#13<\/a>)<\/li>\n<li>Fix chatbot bug where unexpected AI response could lead to link button to contain unexpected label and overflow its container. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/66f357883371d6d14a3805615ace681a411d4741\" rel=\"nofollow ugc noopener\">66f3578<\/a>)<\/li>\n<li>Fix UI warnings in WordPress 6.7 due to JS component updates. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/6e8d2317d2db9d049efd3ce9e63c128bc7fe72a3\" rel=\"nofollow ugc noopener\">6e8d231<\/a>)<\/li>\n<li>Fix failing Anthropic API requests when no generation config was provided. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/33db20be1e4179d0776401090f363456994c98a3\" rel=\"nofollow ugc noopener\">33db20b<\/a>)<\/li>\n<\/ul>\n<p><strong>Documentation:<\/strong><\/p>\n<ul>\n<li>Include documentation section about using browser built-in AI in JavaScript. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/91c5be76a46091d235d7eeeb78f44ae0178a9c1d\" rel=\"nofollow ugc noopener\">91c5be7<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/6\" rel=\"nofollow ugc noopener\">#6<\/a>)<\/li>\n<li>Expand documentation to explain how to customize model configuration. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/930058ab3e8ffbbb6adadbbb4022887b6be17e89\" rel=\"nofollow ugc noopener\">930058a<\/a>)<\/li>\n<li>Expand documentation to cover how to use new text streaming capabilities in PHP and JS. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/20d028ba3cade8d1c98a7694ce51816515d7cc84\" rel=\"nofollow ugc noopener\">20d028b<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/3\" rel=\"nofollow ugc noopener\">#3<\/a>)<\/li>\n<\/ul>\n<h4>0.2.0<\/h4>\n<p><strong>Features:<\/strong><\/p>\n<ul>\n<li>Introduce <code>ai_services_model_params<\/code> filter to centrally customize AI service model parameters. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/f36f35d5a37b52375969b2e19d6364b5ff540072\" rel=\"nofollow ugc noopener\">f36f35d<\/a>)<\/li>\n<li>Add enums to the public APIs in PHP and JavaScript, for now covering AI capabilities and content roles. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/48dedc50f9a86e38bb0f1ac7dbbb0afd7beaea4b\" rel=\"nofollow ugc noopener\">48dedc5<\/a>)<\/li>\n<li>Add WP-CLI support under <code>ai-services<\/code> namespace with commands <code>list<\/code>, <code>get<\/code>, <code>list-models<\/code>, and <code>generate-text<\/code>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/415edbc0aa720c560fbef348563ebfb9c2fb494c\" rel=\"nofollow ugc noopener\">415edbc<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/7\" rel=\"nofollow ugc noopener\">#7<\/a>)<\/li>\n<li>Introduce helpers as object with useful functions in both PHP and JavaScript APIs. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/98ae1797746c78f548d5f1c385a2d9ac9fbd72c4\" rel=\"nofollow ugc noopener\">98ae179<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/7cf8a4daff620877460b0a45f106006911c8866b\" rel=\"nofollow ugc noopener\">7cf8a4d<\/a>)<\/li>\n<li>Introduce <code>Generation_Config<\/code> type class for safer and more consistent handling of model generation config data. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/4e6925ab324089ad421a03af89191b6cf44094e1\" rel=\"nofollow ugc noopener\">4e6925a<\/a>)<\/li>\n<\/ul>\n<p><strong>Enhancements:<\/strong><\/p>\n<ul>\n<li>Add Settings link to plugin row actions. Props <a target=\"_blank\" href=\"https:\/\/github.com\/westonruter\" rel=\"nofollow ugc noopener\">westonruter<\/a>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/pull\/12\" rel=\"nofollow ugc noopener\">#12<\/a>)<\/li>\n<li>Remove unnecessary <code>With_API_Client<\/code> interface and related method. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/f3dc6b42dc62f31e1d803772258f9246a59b3354\" rel=\"nofollow ugc noopener\">f3dc6b4<\/a>)<\/li>\n<li>Move <code>Felix_Arntz\\AI_Services\\Services\\Types<\/code> namespace to <code>Felix_Arntz\\AI_Services\\Services\\API\\Types<\/code> to indicate it is part of the public API. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/5e34f7a26e0b6b3f7b4f953b0765bbd1084d0763\" rel=\"nofollow ugc noopener\">5e34f7a<\/a>)<\/li>\n<li>Enhance content part classes by providing dedicated getter functions. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/89ae723eca7fc6ff236ca9cc1402f463c527baf3\" rel=\"nofollow ugc noopener\">89ae723<\/a>)<\/li>\n<li>Move internal <code>Service_Entity<\/code> and <code>Service_Entity_Query<\/code> classes to their own namespace, since they are not only relevant for the REST API. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/4ce7026e4913870a63a0d13b3592003081471c36\" rel=\"nofollow ugc noopener\">4ce7026<\/a>)<\/li>\n<li>Change built-in assistant chatbot feature to be opt-in rather than opt-out. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/92798508d5c566f0596a46ee665e3b664649dc16\" rel=\"nofollow ugc noopener\">9279850<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/15\" rel=\"nofollow ugc noopener\">#15<\/a>)<\/li>\n<li>Rename <code>ai-store<\/code> asset to <code>ai<\/code> and <code>settings-store<\/code> asset to <code>settings<\/code> and adjust JS globals accordingly, keeping old <code>ai-store<\/code> asset and JS global available for backward compatibility. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/fbe49168576230b11e2c02f107da4193a888cb7a\" rel=\"nofollow ugc noopener\">fbe4916<\/a>)<\/li>\n<li>Strengthen prompt content validation and add support for OpenAI audio input. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/350c85ddde3c1403e746cf801a6325fdfde4be1e\" rel=\"nofollow ugc noopener\">350c85d<\/a>)<\/li>\n<li>Allow passing through arbitrary parameters to built-in service APIs. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/81254f62795695114da3aefbf0789c5637bb7aec\" rel=\"nofollow ugc noopener\">81254f6<\/a>)<\/li>\n<li>Enhance generation config transformation to support equivalent arguments across the built-in service APIs for Anthropic, Google, and OpenAI. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/69a99bf708a39083a2e4122d877be580cd90ec08\" rel=\"nofollow ugc noopener\">69a99bf<\/a>)<\/li>\n<li>Validate feature model param in REST API and mark relevant parameters as required. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/2032690a5e825e836e46bb3dc06a38f245172ea9\" rel=\"nofollow ugc noopener\">2032690<\/a>)<\/li>\n<li>Enhance chatbot to rely on feature identifier instead of custom property to inject model params. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/962750b126a3e97a498d5fd4a689303e1470b054\" rel=\"nofollow ugc noopener\">962750b<\/a>)<\/li>\n<li>Consistently handle the Google-specific <code>safetySettings<\/code> model parameter, expecting an array of <code>Safety_Setting<\/code> instances. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/a74e51c70ead3fdd474861b8748c28163e403dd6\" rel=\"nofollow ugc noopener\">a74e51c<\/a>)<\/li>\n<li>Allow passing system instruction as data array to REST endpoint. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/7b4916a5125363ca3578b3f52a728279a96740fc\" rel=\"nofollow ugc noopener\">7b4916a<\/a>)<\/li>\n<li>Use camelCase arguments for model params for more consistency with underlying APIs. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/946c4489863a4c88887b6fb74a32f7a47136a4fc\" rel=\"nofollow ugc noopener\">946c448<\/a>)<\/li>\n<\/ul>\n<p><strong>Bug Fixes:<\/strong><\/p>\n<ul>\n<li>Fix conflict between REST content schemas. Props <a target=\"_blank\" href=\"https:\/\/github.com\/westonruter\" rel=\"nofollow ugc noopener\">westonruter<\/a>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/e087602f8e4a75f2cfe14af22d69d49ce245ebac\" rel=\"nofollow ugc noopener\">e087602<\/a>, <a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/issues\/14\" rel=\"nofollow ugc noopener\">#14<\/a>)<\/li>\n<li>Fix early component return in example plugin. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/e7ce0543d899522c79525123ca448b6d7260d6a0\" rel=\"nofollow ugc noopener\">e7ce054<\/a>)<\/li>\n<\/ul>\n<p><strong>Documentation:<\/strong><\/p>\n<ul>\n<li>Update documentation to cover WP-CLI usage and latest API enhancements. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/21ab225d68e1f00ed909556b3920a727cd33af6b\" rel=\"nofollow ugc noopener\">21ab225<\/a>)<\/li>\n<li>Improve documentation to cover how to process generative model responses. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/c40c89d9154bcb126867b4640c363e20c2ddbdac\" rel=\"nofollow ugc noopener\">c40c89d<\/a>)<\/li>\n<\/ul>\n<h4>0.1.1<\/h4>\n<p><strong>Bug Fixes:<\/strong><\/p>\n<ul>\n<li>Update Prompt API to latest shape. Props <a target=\"_blank\" href=\"https:\/\/github.com\/tomayac\" rel=\"nofollow ugc noopener\">tomayac<\/a>. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/pull\/11\" rel=\"nofollow ugc noopener\">#11<\/a>)<\/li>\n<li>Fix bug preventing inline data to be processed by Google AI API. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/cf57baf8822a5c2a9a13760c4d7fa6a6def45558\" rel=\"nofollow ugc noopener\">cf57baf<\/a>)<\/li>\n<li>Fix OpenAI model configuration to only provide multimodal capabilities for GPT-4 models. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/42ba79bf45b063279fc714fade604b6a3aafb894\" rel=\"nofollow ugc noopener\">42ba79b<\/a>)<\/li>\n<li>Fix bug where REST endpoint to generate content did not accept content in its complex shape. (<a target=\"_blank\" href=\"https:\/\/github.com\/felixarntz\/ai-services\/commit\/2e0687f5620e6a2d4a4ea28527eef64d2f32adb1\" rel=\"nofollow ugc noopener\">2e0687f<\/a>)<\/li>\n<\/ul>\n<h4>0.1.0<\/h4>\n<ul>\n<li>Initial early access release. <a target=\"_blank\" href=\"https:\/\/felix-arntz.me\/blog\/introducing-the-ai-services-plugin-for-wordpress\/\" rel=\"nofollow ugc noopener\">See announcement post.<\/a><\/li>\n<\/ul>\n<\/div><\/div>\n<p><!-- .entry-content --><\/p>\n<p>\t<!-- .entry-meta --><br \/>\n<\/article>\n<p><br \/>\n<br \/><a href=\"https:\/\/wordpress.org\/plugins\/ai-services\/\" target=\"_blank\" rel=\"noopener\">Source link <\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>AI Services By Felix Arntz Download Details Reviews Installation Development Support Description This WordPress plugin introduces central infrastructure which allows other plugins to make use of AI capabilities. It exposes APIs that can be used in various contexts, whether you need to use AI capabilities in server-side or client-side code. Furthermore, the APIs are agnostic [&hellip;]<\/p>","protected":false},"author":328,"featured_media":5038,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"give_campaign_id":0,"footnotes":""},"categories":[1933,39,40],"tags":[2347],"class_list":["post-5037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-community-plugin","category-lite-version","category-wp-plugin-solution","tag-services"],"acf":[],"fifu_image_url":"https:\/\/ps.w.org\/ai-services\/assets\/banner-772x250.png?rev=3165883","_links":{"self":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/posts\/5037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/users\/328"}],"replies":[{"embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/comments?post=5037"}],"version-history":[{"count":0,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/posts\/5037\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/media\/5038"}],"wp:attachment":[{"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/media?parent=5037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/categories?post=5037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/s-o-s.net\/en_gb\/wp-json\/wp\/v2\/tags?post=5037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}