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"><?php<br> </span><span style="color: #FF8000">// If multiple, wrap in array.<br> </span><span style="color: #007700">if (</span><span style="color: #0000BB">$definition</span><span style="color: #007700">-></span><span style="color: #0000BB">isMultiple</span><span style="color: #007700">()) {<br> </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> </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">-></span><span style="color: #0000BB">setType</span><span style="color: #007700">(</span><span style="color: #DD0000">'array'</span><span style="color: #007700">);<br> </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">getLabel</span><span style="color: #007700">());<br> </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">-></span><span style="color: #0000BB">setItems</span><span style="color: #007700">(</span><span style="color: #0000BB">$property</span><span style="color: #007700">);<br> </span><span style="color: #0000BB">$property </span><span style="color: #007700">= </span><span style="color: #0000BB">$array_property</span><span style="color: #007700">;<br> }<br></span><span style="color: #0000BB">?></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"><?php<br></span><span style="color: #007700">{<br> </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"function"</span><span style="color: #007700">,<br> </span><span style="color: #DD0000">"function"</span><span style="color: #007700">: {<br> </span><span style="color: #DD0000">"name"</span><span style="color: #007700">: </span><span style="color: #DD0000">"record_weather"</span><span style="color: #007700">,<br> </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> </span><span style="color: #DD0000">"parameters"</span><span style="color: #007700">: {<br> </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"object"</span><span style="color: #007700">,<br> </span><span style="color: #DD0000">"properties"</span><span style="color: #007700">: {<br> </span><span style="color: #DD0000">"readings"</span><span style="color: #007700">: {<br> </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"array"</span><span style="color: #007700">,<br> </span><span style="color: #DD0000">"minItems"</span><span style="color: #007700">: </span><span style="color: #0000BB">1</span><span style="color: #007700">,<br> </span><span style="color: #DD0000">"items"</span><span style="color: #007700">: {<br> </span><span style="color: #DD0000">"type"</span><span style="color: #007700">: </span><span style="color: #DD0000">"object"</span><span style="color: #007700">,<br> </span><span style="color: #DD0000">"properties"</span><span style="color: #007700">: {<br> </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> </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> </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> },<br> </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> </span><span style="color: #DD0000">"additionalProperties"</span><span style="color: #007700">: </span><span style="color: #0000BB">false<br> </span><span style="color: #007700">}<br> }<br> },<br> </span><span style="color: #DD0000">"required"</span><span style="color: #007700">: [</span><span style="color: #DD0000">"readings"</span><span style="color: #007700">],<br> </span><span style="color: #DD0000">"additionalProperties"</span><span style="color: #007700">: </span><span style="color: #0000BB">false<br> </span><span style="color: #007700">}<br> }<br>}<br></span><span style="color: #0000BB">?></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