Skip to content

Commit d5a0b5c

Browse files
committed
bug #47 fix: recursively remove additionalProperties from Gemini requests (valtzu)
This PR was merged into the main branch. Discussion ---------- fix: recursively remove `additionalProperties` from Gemini requests | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | Docs? | no | Issues | | License | MIT Cherry picking php-llm/llm-chain#351 > Tool parameters with nested objects cause 400 bad request from Gemini due to only removing the unsupported `additionalProperties` on top-level. ``` Invalid JSON payload received. Unknown name "additionalProperties" at 'tools[0].function_declarations[0].parameters.properties[0].value': Cannot find field. ``` Commits ------- ea94f84 fix: recursively remove `additionalProperties` from Gemini requests (#351)
2 parents a44e3f7 + ea94f84 commit d5a0b5c

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/platform/src/Bridge/Google/Contract/ToolNormalizer.php

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,34 @@ protected function supportsModel(Model $model): bool
4747
*/
4848
public function normalize(mixed $data, ?string $format = null, array $context = []): array
4949
{
50-
$parameters = $data->parameters;
51-
unset($parameters['additionalProperties']);
52-
5350
return [
5451
'functionDeclarations' => [
5552
[
5653
'description' => $data->description,
5754
'name' => $data->name,
58-
'parameters' => $parameters,
55+
'parameters' => $data->parameters ? $this->removeAdditionalProperties($data->parameters) : null,
5956
],
6057
],
6158
];
6259
}
60+
61+
/**
62+
* @template T of array
63+
*
64+
* @phpstan-param T $data
65+
*
66+
* @phpstan-return T
67+
*/
68+
private function removeAdditionalProperties(array $data): array
69+
{
70+
unset($data['additionalProperties']); // not supported by Gemini
71+
72+
foreach ($data as &$value) {
73+
if (\is_array($value)) {
74+
$value = $this->removeAdditionalProperties($value);
75+
}
76+
}
77+
78+
return $data;
79+
}
6380
}

src/platform/tests/Bridge/Google/Contract/ToolNormalizerTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ public static function normalizeDataProvider(): iterable
8888
'type' => 'integer',
8989
'description' => 'Number parameter',
9090
],
91+
'nestedObject' => [
92+
'type' => 'object',
93+
'description' => 'bar',
94+
'additionalProperties' => false,
95+
],
9196
],
9297
'required' => ['text', 'number'],
9398
'additionalProperties' => false,
@@ -109,6 +114,10 @@ public static function normalizeDataProvider(): iterable
109114
'type' => 'integer',
110115
'description' => 'Number parameter',
111116
],
117+
'nestedObject' => [
118+
'type' => 'object',
119+
'description' => 'bar',
120+
],
112121
],
113122
'required' => ['text', 'number'],
114123
],

0 commit comments

Comments
 (0)