fix: eliminate PydanticSerializationUnexpectedValue warnings

Switch RuntimeState serializer from mode="wrap" to mode="plain" with
dict return type so pydantic doesn't re-serialize entities through the
Entity union pipeline. Also switch to string-based field discriminator
for Entity union.
This commit is contained in:
Greyson LaLonde
2026-04-06 19:23:15 +08:00
parent 167b609365
commit e1bbab75b3
2 changed files with 7 additions and 10 deletions

View File

@@ -192,15 +192,13 @@ try:
from typing import Annotated from typing import Annotated
from pydantic import Discriminator, Tag from pydantic import Field
from crewai.state.runtime import RuntimeState, _entity_discriminator from crewai.state.runtime import RuntimeState
Entity = Annotated[ Entity = Annotated[
Annotated[Flow, Tag("flow")] # type: ignore[type-arg] Flow | Crew | Agent, # type: ignore[type-arg]
| Annotated[Crew, Tag("crew")] Field(discriminator="entity_type"),
| Annotated[Agent, Tag("agent")],
Discriminator(_entity_discriminator),
] ]
RuntimeState.model_rebuild( RuntimeState.model_rebuild(

View File

@@ -15,7 +15,6 @@ from pydantic import (
ModelWrapValidatorHandler, ModelWrapValidatorHandler,
PrivateAttr, PrivateAttr,
RootModel, RootModel,
SerializerFunctionWrapHandler,
model_serializer, model_serializer,
model_validator, model_validator,
) )
@@ -84,10 +83,10 @@ class RuntimeState(RootModel): # type: ignore[type-arg]
"""The execution event record.""" """The execution event record."""
return self._event_record return self._event_record
@model_serializer(mode="wrap") @model_serializer(mode="plain")
def _serialize(self, handler: SerializerFunctionWrapHandler) -> CheckpointPayload: def _serialize(self) -> dict[str, Any]:
return { return {
"entities": handler(self), "entities": [e.model_dump() for e in self.root],
"event_record": self._event_record.model_dump(), "event_record": self._event_record.model_dump(),
} }