Auto inject crewai_trigger_payload (#3351)

* feat: add props to inject trigger payload

* feat: auto-inject trigger_input in the first crew task
This commit is contained in:
Lucas Gomide
2025-08-18 17:36:08 -03:00
committed by GitHub
parent ec03a53121
commit 80b3d9689a
9 changed files with 2565 additions and 3 deletions

View File

@@ -503,6 +503,7 @@ class Crew(FlowTrackable, BaseModel):
)
return self
@property
def key(self) -> str:
source: List[str] = [agent.key for agent in self.agents] + [
@@ -639,6 +640,7 @@ class Crew(FlowTrackable, BaseModel):
self._inputs = inputs
self._interpolate_inputs(inputs)
self._set_tasks_callbacks()
self._set_inject_trigger_input_for_first_task()
i18n = I18N(prompt_file=self.prompt_file)
@@ -1508,3 +1510,10 @@ class Crew(FlowTrackable, BaseModel):
"""Reset crew and agent knowledge storage."""
for ks in knowledges:
ks.reset()
def _set_inject_trigger_input_for_first_task(self):
crewai_trigger_payload = self._inputs and self._inputs.get("crewai_trigger_payload")
able_to_inject = self.tasks and self.tasks[0].inject_trigger_input is None
if self.process == Process.sequential and crewai_trigger_payload and able_to_inject:
self.tasks[0].inject_trigger_input = True

View File

@@ -72,6 +72,10 @@ class Task(BaseModel):
output_pydantic: Pydantic model for task output.
security_config: Security configuration including fingerprinting.
tools: List of tools/resources limited for task execution.
inject_trigger_input: Optional flag to control crewai_trigger_payload injection.
None (default): Auto-inject for first task only.
True: Always inject trigger payload for this task.
False: Never inject trigger payload, even for first task.
"""
__hash__ = object.__hash__ # type: ignore
@@ -163,6 +167,10 @@ class Task(BaseModel):
end_time: Optional[datetime.datetime] = Field(
default=None, description="End time of the task execution"
)
inject_trigger_input: Optional[bool] = Field(
default=None,
description="Whether this task should append 'Trigger Payload: {crewai_trigger_payload}' to the task description when crewai_trigger_payload exists in crew inputs.",
)
model_config = {"arbitrary_types_allowed": True}
@field_validator("guardrail")
@@ -548,12 +556,23 @@ class Task(BaseModel):
str: The formatted prompt string containing the task description,
expected output, and optional markdown formatting instructions.
"""
tasks_slices = [self.description]
description = self.description
should_inject = self.inject_trigger_input
if should_inject and self.agent:
crew = getattr(self.agent, 'crew', None)
if crew and hasattr(crew, '_inputs') and crew._inputs:
trigger_payload = crew._inputs.get("crewai_trigger_payload")
if trigger_payload is not None:
description += f"\n\nTrigger Payload: {trigger_payload}"
tasks_slices = [description]
output = self.i18n.slice("expected_output").format(
expected_output=self.expected_output
)
tasks_slices = [self.description, output]
tasks_slices = [description, output]
if self.markdown:
markdown_instruction = """Your final answer MUST be formatted in Markdown syntax.