Files
agent-framework/workflow-samples/DeepResearch.yaml
Ren Finlayson 539852f81c
Some checks are pending
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / paths-filter (push) Waiting to run
dotnet-build-and-test / dotnet-build-and-test (Debug, windows-latest, net9.0) (push) Blocked by required conditions
dotnet-build-and-test / dotnet-build-and-test (Release, integration, true, ubuntu-latest, net10.0) (push) Blocked by required conditions
dotnet-build-and-test / dotnet-build-and-test (Release, integration, true, windows-latest, net472) (push) Blocked by required conditions
dotnet-build-and-test / dotnet-build-and-test (Release, ubuntu-latest, net8.0) (push) Blocked by required conditions
dotnet-build-and-test / dotnet-build-and-test-check (push) Blocked by required conditions
test
2026-01-24 03:05:12 +11:00

380 lines
13 KiB
YAML

#
# This workflow coordinates multiple agents in order to address complex user requests
# according to the "Magentic" orchestration pattern introduced by AutoGen.
#
# For this workflow, several agents used, each with specific roles.
#
# The following agents are responsible for overseeing and coordinating the workflow:
# - Research Agent: Analyze the current task and correlate relevant facts.
# - Planner Agent: Analyze the current task and devise an overall plan.
# - Manager Agent: Evaluates status and delegate tasks to other agents.
# - Summary Agent: Evaluates status and delegate tasks to other agents.
#
# The following agents have capabilities that are utilized to address the input task:
# - Knowledge Agent: Performs generic web searches.
# - Coder Agent: Able to write and execute code.
# - Weather Agent: Provides weather information.
#
kind: Workflow
trigger:
kind: OnConversationStart
id: workflow_demo
actions:
- kind: SetVariable
id: setVariable_aASlmF
displayName: List all available agents for this orchestrator
variable: Local.AvailableAgents
value: |-
=[
{
name: "WeatherAgent",
description: "Able to retrieve weather information"
},
{
name: "CoderAgent",
description: "Able to write and execute Python code"
},
{
name: "KnowledgeAgent",
description: "Able to perform generic websearches"
}
]
- kind: SetVariable
id: setVariable_V6yEbo
displayName: Get a summary of all the agents for use in prompts
variable: Local.TeamDescription
value: "=Concat(ForAll(Local.AvailableAgents, $\"- \" & name & $\": \" & description), Value, \"\n\")"
- kind: SetVariable
id: setVariable_NZ2u0l
displayName: Set Task
variable: Local.InputTask
value: =System.LastMessage.Text
- kind: SetVariable
id: setVariable_10u2ZN
displayName: Set Task
variable: Local.SeedTask
value: =UserMessage(Local.InputTask)
- kind: SendActivity
id: sendActivity_yFsbRy
activity: Analyzing facts...
- kind: CreateConversation
id: conversation_1a2b3c
conversationId: Local.StatusConversationId
- kind: CreateConversation
id: conversation_1x2y3z
conversationId: Local.TaskConversationId
- kind: InvokeAzureAgent
id: question_UDoMUw
displayName: Get Facts
conversationId: =Local.StatusConversationId
agent:
name: ResearchAgent
output:
messages: Local.TaskFacts
input:
messages: =UserMessage(Local.InputTask)
- kind: SendActivity
id: sendActivity_yFsbRz
activity: Creating a plan...
- kind: InvokeAzureAgent
id: question_DsBaJU
displayName: Create a Plan
conversationId: =Local.StatusConversationId
agent:
name: PlannerAgent
input:
arguments:
team: =Local.TeamDescription
output:
messages: Local.Plan
- kind: SetTextVariable
id: setVariable_Kk2LDL
displayName: Define instructions
variable: Local.TaskInstructions
value: |-
# TASK
Address the following user request:
{Local.InputTask}
# TEAM
Use the following team to answer this request:
{Local.TeamDescription}
# FACTS
Consider this initial fact sheet:
{MessageText(Local.TaskFacts)}
# PLAN
Here is the plan to follow as best as possible:
{MessageText(Local.Plan)}
- kind: SendActivity
id: sendActivity_bwNZiM
activity: {Local.TaskInstructions}
- kind: InvokeAzureAgent
id: question_o3BQkf
displayName: Progress Ledger Prompt
conversationId: =Local.StatusConversationId
agent:
name: ManagerAgent
input:
messages: =UserMessage(Local.AgentResponseText)
output:
responseObject: Local.ProgressLedger
- kind: ConditionGroup
id: conditionGroup_mVIecC
conditions:
- id: conditionItem_fj432c
condition: =Local.ProgressLedger.is_request_satisfied.answer
displayName: If Done
actions:
- kind: SendActivity
id: sendActivity_kdl3mC
activity: Completed! {Local.ProgressLedger.is_request_satisfied.reason}
- kind: InvokeAzureAgent
id: question_Ke3l1d
displayName: Generate Response
conversationId: =Local.TaskConversationId
agent:
name: SummaryAgent
output:
autoSend: true
messages: Local.FinalResponse
- kind: EndConversation
id: end_SVoNSV
- id: conditionItem_yiqund
condition: =Local.ProgressLedger.is_in_loop.answer || Not(Local.ProgressLedger.is_progress_being_made.answer)
displayName: If Stalling
actions:
- kind: SetVariable
id: setVariable_H5lXdD
displayName: Increase stall count
variable: Local.StallCount
value: =Local.StallCount + 1
- kind: ConditionGroup
id: conditionGroup_vBTQd3
conditions:
- id: conditionItem_fpaNL9
condition: =Local.ProgressLedger.is_in_loop.answer
displayName: Is Loop
actions:
- kind: SendActivity
id: sendActivity_fpaNL9
activity: {Local.ProgressLedger.is_in_loop.reason}
- id: conditionItem_NnqvXh
condition: =Not(Local.ProgressLedger.is_progress_being_made.answer)
displayName: Is No Progress
actions:
- kind: SendActivity
id: sendActivity_NnqvXh
activity: {Local.ProgressLedger.is_progress_being_made.reason}
- kind: ConditionGroup
id: conditionGroup_xzNrdM
conditions:
- id: conditionItem_NlQTBv
condition: =Local.StallCount > 2
displayName: Stall Count Exceeded
actions:
- kind: SendActivity
id: sendActivity_H5lXdD
activity: Unable to make sufficient progress...
- kind: ConditionGroup
id: conditionGroup_4s1Z27
conditions:
- id: conditionItem_EXAlhZ
condition: =Local.RestartCount > 2
actions:
- kind: SendActivity
id: sendActivity_xKxFUU
activity: Stopping after attempting {Local.RestartCount} restarts...
- kind: EndConversation
id: end_GHVrFh
- kind: SendActivity
id: sendActivity_cwNZiM
activity: Re-analyzing facts...
- kind: InvokeAzureAgent
id: question_wFJ123
displayName: Get New Facts Prompt
conversationId: =Local.StatusConversationId
agent:
name: ResearchAgent
output:
messages: Local.TaskFacts
input:
messages: |-
=UserMessage(
"It's clear we aren't making as much progress as we would like, but we may have learned something new.
Please rewrite the following fact sheet, updating it to include anything new we have learned that may be helpful.
Example edits can include (but are not limited to) adding new guesses, moving educated guesses to verified facts if appropriate, etc.
Updates may be made to any section of the fact sheet, and more than one section of the fact sheet can be edited.
This is an especially good time to update educated guesses, so please at least add or update one educated guess or hunch, and explain your reasoning.
Here is the old fact sheet:
{MessageText(Local.TaskFacts)}"
- kind: SendActivity
id: sendActivity_dsBaJU
activity: Re-analyzing plan...
- kind: InvokeAzureAgent
id: question_uEJ456
displayName: Create new Plan Prompt
conversationId: =Local.StatusConversationId
agent:
name: PlannerAgent
output:
messages: Local.Plan
input:
messages: |-
=UserMessage(
"Please briefly explain what went wrong on this last run (the root cause of the failure),
and then come up with a new plan that takes steps and/or includes hints to overcome prior challenges and especially avoids repeating the same mistakes.
As before, the new plan should be concise, be expressed in bullet-point form, and consider the following team composition
(do not involve any other outside people since we cannot contact anyone else):
{Local.TeamDescription}")
- kind: SetTextVariable
id: setVariable_jW7tmM
displayName: Set Plan as Context
variable: Local.TaskInstructions
value: |-
# TASK
Address the following user request:
{Local.InputTask}
# TEAM
Use the following team to answer this request:
{Local.TeamDescription}
# FACTS
Consider this initial fact sheet:
{MessageText(Local.TaskFacts)}
# PLAN
Here is the plan to follow as best as possible:
{MessageText(Local.Plan)}
- kind: SetVariable
id: setVariable_6J2snP
displayName: Reset Stall count
variable: Local.StallCount
value: 0
- kind: SetVariable
id: setVariable_S6HCgh
displayName: Increase Restart count
variable: Local.RestartCount
value: =Local.RestartCount + 1
- kind: GotoAction
id: goto_LzfJ8u
actionId: question_o3BQkf
elseActions:
- kind: SendActivity
id: sendActivity_L7ooQO
activity: |-
({Local.ProgressLedger.next_speaker.reason})
{Local.ProgressLedger.next_speaker.answer} - {Local.ProgressLedger.instruction_or_question.answer}
- kind: SetVariable
id: setVariable_nxN1mE
variable: Local.NextSpeaker
value: =Search(Local.AvailableAgents, Local.ProgressLedger.next_speaker.answer, name)
- kind: ConditionGroup
id: conditionGroup_QFPiF5
conditions:
- id: conditionItem_GmigcU
condition: =CountRows(Local.NextSpeaker) = 1
displayName: If next Agent tool Exists
actions:
- kind: SetVariable
id: setVariable_L7ooQO
variable: Local.StallCount
value: 0
- kind: InvokeAzureAgent
id: question_orsBf06
displayName: Progress Ledger Prompt
conversationId: =Local.TaskConversationId
agent:
name: =First(Local.NextSpeaker).name
output:
autoSend: true
messages: Local.AgentResponse
input:
messages: =UserMessage(Local.ProgressLedger.instruction_or_question.answer)
- kind: SetVariable
id: setVariable_XzNrdM
variable: Local.AgentResponseText
value: =MessageText(Local.AgentResponse)
- kind: ResetVariable
id: setVariable_8eIx2A
displayName: Clear seed task
variable: Local.SeedTask
elseActions:
- kind: SendActivity
id: sendActivity_BhcsI7
activity: Unable to choose next agent...
- kind: SetVariable
id: setVariable_BhcsI7
displayName: Increase stall count
variable: Local.StallCount
value: =Local.StallCount + 1
- kind: GotoAction
id: goto_76Hne8
actionId: question_o3BQkf