@@ -312,7 +312,10 @@ def _resolve_deps_and_call(model, context, fn):
312312 # Get Dep-annotated fields for this model class
313313 dep_fields = _get_dep_fields (model .__class__ )
314314
315- if not dep_fields :
315+ # Check if model has custom deps (from @func.deps decorator)
316+ has_custom_deps = getattr (model .__class__ , "__has_custom_deps__" , False )
317+
318+ if not dep_fields and not has_custom_deps :
316319 return fn (model , context )
317320
318321 # Get dependencies from __deps__
@@ -324,27 +327,37 @@ def _resolve_deps_and_call(model, context, fn):
324327
325328 # Resolve dependencies and store in context var
326329 resolved_values = {}
327- for field_name , dep in dep_fields .items ():
328- field_value = getattr (model , field_name , None )
329- if field_value is None :
330- continue
331-
332- # Check if field is a CallableModel that needs resolution
333- if not isinstance (field_value , _CallableModel ):
334- continue # Already a resolved value, skip
335330
336- # Check if this field is in __deps__ (for custom transforms)
337- if id (field_value ) in dep_map :
338- dep_model , contexts = dep_map [id (field_value )]
339- # Call dependency with the (transformed) context
331+ # If custom deps, resolve ALL CallableModel fields from dep_map
332+ if has_custom_deps :
333+ for dep_model , contexts in deps_result :
340334 resolved = dep_model (contexts [0 ]) if contexts else dep_model (context )
341- else :
342- # Not in __deps__, use Dep annotation transform directly
343- transformed_ctx = dep .apply (context )
344- resolved = field_value (transformed_ctx )
335+ # Unwrap GenericResult if present (consistent with auto-detected deps)
336+ if hasattr (resolved , 'value' ):
337+ resolved = resolved .value
338+ resolved_values [id (dep_model )] = resolved
339+ else :
340+ # Standard path: iterate over Dep-annotated fields
341+ for field_name , dep in dep_fields .items ():
342+ field_value = getattr (model , field_name , None )
343+ if field_value is None :
344+ continue
345+
346+ # Check if field is a CallableModel that needs resolution
347+ if not isinstance (field_value , _CallableModel ):
348+ continue # Already a resolved value, skip
349+
350+ # Check if this field is in __deps__ (for custom transforms)
351+ if id (field_value ) in dep_map :
352+ dep_model , contexts = dep_map [id (field_value )]
353+ # Call dependency with the (transformed) context
354+ resolved = dep_model (contexts [0 ]) if contexts else dep_model (context )
355+ else :
356+ # Not in __deps__, use Dep annotation transform directly
357+ transformed_ctx = dep .apply (context )
358+ resolved = field_value (transformed_ctx )
345359
346- # Store resolved value keyed by the CallableModel's id
347- resolved_values [id (field_value )] = resolved
360+ resolved_values [id (field_value )] = resolved
348361
349362 # Store in context var and call function
350363 current_store = _resolved_deps .get ()
0 commit comments