-
Notifications
You must be signed in to change notification settings - Fork 64
Open
Labels
Description
π Describe the bug
When a Pydantic Generic object is returned in an activity function azure.functions._durable_functions._serialize_custom_object
returns "class": "ClassName[GenericSpecificClass]". When azure.functions._durable_functions._deserialize_custom_object
is called in the calling orchestrator, getattr(module, "ClassName[GenericSpecificClass]") fails: ClassName exists but not the specialized "ClassName[GenericSpecificClass]".
π€ Expected behavior
Serialization and deserialization handles Generics.
Current behaviour
Deserialization fails with AttributeError: module 'xxx.xxx' has not attribute 'ClassName[GenericSpecificClass]'
and produces a Non-Deterministic Workflow error
β Steps to reproduce
from pydantic import BaseModel
from typing import Generic
import azure.functions as func
import azure.durable_functions as df
class A(BaseModel, Generic[T]):
a: T
def to_json():
return self.model_dump(mode="json")
@classmethod
def from_json(cls, data: dict):
return cls(**data)
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.orchestration_trigger(context_name="context")
def orchestrator_function(context: df.DurableOrchestrationContext):
x = yield context.call_activity("hello", None)
@myApp.activity_trigger(input_name="params")
def hello(params):
return A[str](a="xxx")