Refactor the `setupAiProvider` config action to be simpler
>>> [!note] Migrated issue <!-- Drupal.org comment --> <!-- Migrated from issue #3562262. --> Reported by: [phenaproxima](https://www.drupal.org/user/205645) >>> <p>[Tracker]<br> <strong>Update Summary: </strong>[One-line status update for stakeholders]<br> <strong>Short Description: </strong>[One-line issue summary for stakeholders]<br> <strong>Check-in Date: </strong>MM/DD/YYYY<br> <em>Metadata is used by the <a href="https://www.drupalstarforge.ai/" title="AI Tracker">AI Tracker.</a> Docs and additional fields <a href="https://www.drupalstarforge.ai/ai-dashboard/docs" title="AI Issue Tracker Documentation">here</a>.</em><br> [/Tracker]</p> <h3 id="summary-problem-motivation">Problem/Motivation</h3> <p>The <code>setupAiProvider</code> config action is extremely awkward. It was made as a shim, and it's severely limited in its ability to support providers other than OpenAI and Anthropic.</p> <h3 id="summary-proposed-resolution">Proposed resolution</h3> <p>Refactor it so that it runs only on the <code>ai.settings</code> config object, and works like this:</p> <pre>&nbsp;&nbsp;&nbsp; ai.settings:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setupAiProvider:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_value: ${api_key}&nbsp;&nbsp;&nbsp; # Use a general `api_key` input that can be used on any provider.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_name: ai&nbsp;&nbsp;&nbsp; # Create a single key<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_label: '${provider} API key'&nbsp;&nbsp;&nbsp; # Use the `provider` input to name the key accurately.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # env_var: openai_api_key&nbsp;&nbsp;&nbsp; # Entirely deprecated. Drupal 11.3 ssupports inputs from env vars, so this can be moved to the input section.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; provider: ${provider}&nbsp;&nbsp; # Just directly copy the input.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # How we handle this, from a BC standpoint, is that if the inner key has no period, we default to `ai_provider_$FOO.settings`.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleConfigUpdate:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openai:&nbsp;&nbsp; # If the provider is this...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai_provider_openai.settings:&nbsp; # Then these are the configs to change...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; moderation: true&nbsp;&nbsp;&nbsp; # And these are the values to set</pre><p>So, the entire recipe becomes consolidated (this is not <em>exactly</em> what we would do in Drupal CMS, but it's enough to illustrate the point).</p> <pre>input:<br>&nbsp; provider:<br>&nbsp;&nbsp;&nbsp; data_type: string<br>&nbsp;&nbsp;&nbsp; description: Which AI provider to use.<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source: value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value: openai<br>&nbsp;&nbsp;&nbsp; form:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type': radios<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title': Provider<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#description': Which AI provider to use.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#options':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openai: OpenAI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anthropic: Anthropic<br>&nbsp; api_key:<br>&nbsp;&nbsp;&nbsp; data_type: string<br>&nbsp;&nbsp;&nbsp; description: The API key for your chosen provider.<br>&nbsp;&nbsp;&nbsp; prompt:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: ask<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arguments:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; question: 'Enter your API key:'<br>&nbsp;&nbsp;&nbsp; form:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type': 'textfield'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#description': 'Enter your API key. A paid plan is required for AI features to function.'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title': 'API Key'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#required': false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#maxlength': 256<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#attributes':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autocomplete: off<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source: env<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env: ai_api_key<br>config:<br>&nbsp; actions:<br>&nbsp;&nbsp;&nbsp; ai.settings:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setupAiProvider:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_value: ${api_key}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_name: ai_api_key<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_label: 'AI API Key'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; provider: ${provider}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleConfigUpdate:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openai:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai_provider_openai.settings:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; moderation: true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anthropic:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai_provider_anthropic.settings:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openai_moderation: false</pre><p>Much simpler!</p> <h3 id="summary-remaining-tasks">Remaining tasks</h3> <p>Implement this and adjust tests.</p>
issue