JSON TransformObject
merge
Deep-merge one or more objects into the current object
merge
Deep-merges every object in objects (in order) into the current object. Nested objects are merged recursively; scalar and array values are overwritten.
Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
objects | array<object> | Yes | — | Objects to merge in. Selectors are resolved per object. |
Example
Input
{
"model": "gpt-4o-mini",
"params": { "temperature": 0.2, "max_tokens": 1024 },
"tags": ["base"]
}Operation
{
"type": "merge",
"options": {
"objects": [
{ "params": { "temperature": 0.7 }, "tags": ["override"] }
]
}
}Output
{
"model": "gpt-4o-mini",
"params": { "temperature": 0.7, "max_tokens": 1024 },
"tags": ["override"]
}In a Circuit Step
{
"name": "apply_request_overrides",
"description": "Layer the request's overrides on top of the default config",
"function": "circuit.core.transform.json",
"input": {
"source": "${{ secrets.default_config }}",
"operations": [
{
"type": "merge",
"options": {
"objects": [
"${{ input.overrides }}"
]
}
}
]
},
"outputs": [
{
"name": "final_config",
"description": "Merged config with request overrides applied",
"value": "${{ apply_request_overrides.output.transformed_result }}"
}
]
}Notes & gotchas
- Errors with
merge: expected objectif the input is not an object. - Merge is deep for objects only:
params.temperatureis merged into the existingparamsmap. Arrays are overwritten —tagsbecomes["override"], not["base", "override"]. Useconcaton the array first if you want to combine. - Each entry in
objectsis selector-evaluated, so"objects": ["${{ input.overrides }}"]works. - Non-object entries are silently skipped (no error, no merge).
- Order matters: later objects override earlier ones at scalar leaves.