Missing 'multiple' handling in ContextDefinitionNormalizer::normalize
>>> [!note] Migrated issue <!-- Drupal.org comment --> <!-- Migrated from issue #3544949. --> Reported by: [michaellander](https://www.drupal.org/user/636494) Related to !863 >>> <h3 id="summary-problem-motivation">Problem/Motivation</h3> <p>Context definitions have a 'multiple' property, which turns them into a list/array with the original data_type used as the 'item' definition.</p> <h3 id="summary-proposed-resolution">Proposed resolution</h3> <p>Just before <code>$properties[] = $property;</code> in <code>\Drupal\ai\Utility\ContextDefinitionNormalizer::normalize</code>, we add:</p> <div class="codeblock"> <pre><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #FF8000">// If multiple, wrap in array.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #007700">if (</span><span style="color: #0000BB">$definition</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">isMultiple</span><span style="color: #007700">()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$array_property </span><span style="color: #007700">= new </span><span style="color: #0000BB">ToolsPropertyInput</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setType</span><span style="color: #007700">(</span><span style="color: #DD0000">'array'</span><span style="color: #007700">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setDescription</span><span style="color: #007700">(</span><span style="color: #DD0000">'List of ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$definition</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getLabel</span><span style="color: #007700">());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setItems</span><span style="color: #007700">(</span><span style="color: #0000BB">$property</span><span style="color: #007700">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$property </span><span style="color: #007700">= </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></span><span style="color: #0000BB">?&gt;</span></span></pre></div> <p>We also need to map over other properties as well (ex.. if item is required, set required or minItems, etc..)? The <code>\Drupal\ai\OperationType\Chat\Tools\ToolsPropertyInput::setItems</code> method also only accepts <code>array|string</code>, when I think we may actually want it to accept <code>ToolPropertyInputInterface</code>, as most definitions I've found have a single definition and not an array for <code>'items'</code>. The exception are items that use <code>anyOf</code>, <code>oneOf</code>, etc...</p> <p>An example array usage:</p> <div class="codeblock"> <pre><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br></span><span style="color: #007700">{<br>&nbsp; </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"function"</span><span style="color: #007700">,<br>&nbsp; </span><span style="color: #DD0000">"function"</span><span style="color: #007700">: {<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"name"</span><span style="color: #007700">: </span><span style="color: #DD0000">"record_weather"</span><span style="color: #007700">,<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"description"</span><span style="color: #007700">: </span><span style="color: #DD0000">"Record temperatures by city."</span><span style="color: #007700">,<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"parameters"</span><span style="color: #007700">: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"object"</span><span style="color: #007700">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"properties"</span><span style="color: #007700">: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"readings"</span><span style="color: #007700">: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"array"</span><span style="color: #007700">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"minItems"</span><span style="color: #007700">: </span><span style="color: #0000BB">1</span><span style="color: #007700">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"items"</span><span style="color: #007700">: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"object"</span><span style="color: #007700">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"properties"</span><span style="color: #007700">: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"city"</span><span style="color: #007700">: { </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"string"</span><span style="color: #007700">, </span><span style="color: #DD0000">"minLength"</span><span style="color: #007700">: </span><span style="color: #0000BB">1 </span><span style="color: #007700">},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"temperature"</span><span style="color: #007700">: { </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"number" </span><span style="color: #007700">},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"unit"</span><span style="color: #007700">: { </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"string"</span><span style="color: #007700">, </span><span style="color: #DD0000">"enum"</span><span style="color: #007700">: [</span><span style="color: #DD0000">"C"</span><span style="color: #007700">, </span><span style="color: #DD0000">"F"</span><span style="color: #007700">] }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"required"</span><span style="color: #007700">: [</span><span style="color: #DD0000">"city"</span><span style="color: #007700">, </span><span style="color: #DD0000">"temperature"</span><span style="color: #007700">],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"additionalProperties"</span><span style="color: #007700">: </span><span style="color: #0000BB">false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #007700">}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"required"</span><span style="color: #007700">: [</span><span style="color: #DD0000">"readings"</span><span style="color: #007700">],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">"additionalProperties"</span><span style="color: #007700">: </span><span style="color: #0000BB">false<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #007700">}<br>&nbsp; }<br>}<br></span><span style="color: #0000BB">?&gt;</span></span></pre></div> <h3 id="summary-remaining-tasks">Remaining tasks</h3> <h3>Optional: Other details as applicable (e.g., User interface changes, API changes, Data model changes)</h3>
issue