Field Hint System
When the agent asks Pimcore "what fields does the Car class have?", it doesn't just get a list of names and types - it
gets a format hint for every field telling it exactly what JSON shape to produce. Without this, an agent would have
to guess the layout of a classification store or a localized field, and it would get it wrong. Field hints are why
propose_data_object_update works reliably across all 40+ Pimcore field types.
What the agent sees
When the agent calls get_class_definition("Car") or get_field_schema(...), each field definition includes an
editableDataFormat string and optional metadata:
{
"name": "mileage",
"type": "quantityValue",
"required": false,
"editableDataFormat": "{\"value\": <number>, \"unitId\": \"<unit>\"}",
"example": "{\"value\": 42000, \"unitId\": \"km\"}",
"metadata": {
"validUnits": ["km", "mi", "m"],
"defaultUnit": "km"
}
}
The agent uses this schema when composing updates - the format string becomes the template, the metadata constrains its choices. Combined with the HITL proposal flow (see Features → HITL Proposals), this is how agents reliably edit complex types without guessing.
Covered field types
The bundle ships nine providers that together cover every Pimcore data type. Each provider handles a family of related types:
| Provider | Types |
|---|---|
| Simple | 30+ scalar types - input, textarea, wysiwyg, numeric, checkbox, date, datetime, image, link, geopoint, … |
| Select | select, multiselect, booleanSelect - extracts static options; notes dynamic providers. |
| Relation | manyToOneRelation, manyToManyRelation, advancedManyToManyRelation, … - metadata for allowed classes, types, max items, relation columns. |
| QuantityValue | quantityValue, inputQuantityValue - resolves unit labels, lists valid units. |
| LocalizedFields | Resolves configured locales; recursively formats child fields. |
| Block | Recursively formats block child fields. |
| FieldCollections | Extracts allowed collection types. |
| ObjectBricks | Extracts allowed brick types. |
| ClassificationStore | Resolves store ID and group count; formats the nested {groupId: {default: {keyId: value}}} structure. |
A few concrete format strings
checkbox→true | falsedatetime→<unix timestamp>with example1700000000numeric→<number>with metadata{min, max}from the field configimage→{"id": <assetId>, "type": "asset"}quantityValue→{"value": <number>, "unitId": "<unit>"}withvalidUnitsblock→[{"<field>": <value>, ...}]withmaxItemslocalizedfields→{"<field>": {"<locale>": <value>}}withlocales
How the system is organised
Field hints use a provider pattern with a central registry:
GetClassDefinitionTool / GetFieldSchemaTool
└─ FieldDefinitionFormatter (facade for tool consumers)
└─ FieldFormatHintRegistry
└─ SimpleFieldHintProvider
└─ BlockHintProvider
└─ ClassificationStoreHintProvider
└─ …
The registry receives every provider via a tagged iterator (pimcore_agent.field_format_hint_provider), builds a
fieldType → provider map once at construction, and delegates hint resolution to the right provider.
Recursive types (blocks of blocks, bricks containing bricks) are bounded by a depth guard at 4 levels - beyond
that the registry returns a generic <value> fallback to keep tool responses bounded.
Extending
If you ship a custom Pimcore data type, you also need a field-hint provider or the agent will see a generic
<value> for it. One class implementing FieldFormatHintProviderInterface, one service tag.
See Extending → Custom Field Hint Providers.
Related reading
- Features → HITL Proposals - how field hints feed the propose tool.
- Extending → Custom Field Hint Providers - implementing a provider for your own data type.