microsoft / microsoft/durabletask-python
[azure-functions-durable] Orchestrator context parameter name is fixed to `context`, blocking access to `func.Context`
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 40
- Forks
- 33
- Merge medio
- 2 d 2 h
- PR fusionados (30 d)
- 6
Descripción
Summary
In the azure-functions-durable (V2) package, the parameter that receives the
orchestration context is effectively hardcoded to the name context. As a
consequence:
- A user-supplied
context_nameother than"context"on
@app.orchestration_trigger(...)does not work — the host cannot bind the
trigger to the generated handle. - There is no way for an orchestrator to also receive an
azure.functions.Context(func.Context) parameter, because the Functions
host injectsfunc.Contextonly into a parameter named exactlycontext
that is not a trigger binding — and that name is always consumed by the
orchestrationTrigger binding.
This matches V1 behavior (see "Not a regression" below), so it is not a
regression introduced by V2. Filing this to track it as a potential V2
improvement to be considered after the Functions PR merges and the beta
release ships.
Mechanism / relevant code paths
The Azure Functions host binds a trigger to a function parameter by name,
and it inspects the generated handle (not the user's function).
-
The trigger binding is registered with
name=context_name:azure/durable_functions/decorators/durable_app.py—
orchestration_trigger(context_name, ...)calls
OrchestrationTrigger(name=context_name, ...).
-
The generated handle that the host actually indexes hardcodes a parameter
literally namedcontext:azure/durable_functions/orchestrator.py—Orchestrator.create:def handle(context: func.OrchestrationContext) -> str: return Orchestrator(fn).handle(context)- The parameter must be annotated
azure.functions.OrchestrationContext
for the host's orchestrationTrigger binding converter to accept it.
-
Because the host matches the binding
name(context_name) to a parameter
ofhandleby name, they only line up whencontext_name == "context".
Any othercontext_nameleaves the trigger unbound. -
func.Contextinjection: the Python worker injectsfunc.Contextonly into
a parameter named exactlycontextthat is not itself a trigger binding.
Since the orchestrationTrigger always occupies thecontextname, there is
no freecontextparameter forfunc.Contextto be injected into. -
Separately, durabletask's executor invokes the user's orchestrator as
fn(ctx, input)— there is no slot in that calling convention for a
func.Contextobject to be passed through to user code.
Not a regression (V1 parity)
V1 has the same structural constraint. In
azure-functions-durable-python's azure/durable_functions/orchestrator.py,
Orchestrator.create also registers a single-parameter
def handle(context: func.OrchestrationContext), so a V1 orchestrator could
never receive a working func.Context parameter either. V2 preserves this
behavior.
Related parity gap: function_context contents
The V1-compat DurableOrchestrationContext adapter currently exposes an empty
function_context. V1's function_context is not necessarily empty: in
azure/durable_functions/models/DurableOrchestrationContext.py, __init__
consumes a fixed set of named fields (history, instanceId, isReplaying,
parentInstanceId, input, upperSchemaVersion, maximumShortTimerDuration,
longRunningTimerIntervalDuration, upperSchemaVersionNew) and funnels every
remaining field of the orchestration-trigger JSON into
FunctionContext(**kwargs). As of today the WebJobs extension injects at least
one such field — defaultHttpAsyncRequestSleepTimeMillseconds (observed value
30000, the durable-HTTP async polling interval) — so a live V1
function_context carries that value.
V2 receives the orchestration input via a protobuf trigger that does not carry
these arbitrary extra fields, so the compat adapter has no source to populate
function_context from. This is a minor parity gap to consider alongside the
context-name / func.Context work above.
Notes
- Out of scope for the current parity-focused Functions PR; capturing here so
it can be picked up as a V2 improvement after the beta release.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza por azure/durable_functions/decorators/durable_app.py y azure/durable_functions/orchestrator.py, especialmente orchestration_trigger y Orchestrator.create. Traza cómo se indexa el handle generado y cómo durabletask invoca la función de usuario; después revisa el adaptador de compatibilidad con V1 y su gestión de function_context en DurableOrchestrationContext. Se consideraría terminado cuando exista un enfoque V2 acordado para nombres de contexto personalizados, el acceso a func.Context y la brecha de paridad relacionada con function_context.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- azure, python
- Área
- backend
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100