mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
.NET: NET Workflows - Skip conversation initialization when identifier is provided (#1087)
* Fix * Code-gen case * Tests * Autosend logic * Build fix * Namespace * Validation enhancement
This commit is contained in:
+4
-4
@@ -1,7 +1,7 @@
|
||||
// ------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version: 18.0.0.0
|
||||
// Runtime Version: 17.0.0.0
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
@@ -19,7 +19,7 @@ namespace Microsoft.Agents.AI.Workflows.Declarative.CodeGen
|
||||
/// <summary>
|
||||
/// Class to produce the template output
|
||||
/// </summary>
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")]
|
||||
internal partial class CreateConversationTemplate : ActionTemplate
|
||||
{
|
||||
/// <summary>
|
||||
@@ -59,8 +59,8 @@ namespace Microsoft.Agents.AI.Workflows.Declarative.CodeGen
|
||||
string conversationId = await agentProvider.CreateConversationAsync(cancellationToken).ConfigureAwait(false);");
|
||||
|
||||
AssignVariable(this.ConversationId, "conversationId");
|
||||
|
||||
this.Write("\n return default;\n }\n}\n");
|
||||
this.Write("\n await context.AddEventAsync(new ConversationUpdateEvent(conversationId))" +
|
||||
".ConfigureAwait(false);\n\n return default;\n }\n}\n");
|
||||
return this.GenerationEnvironment.ToString();
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -10,8 +10,9 @@ internal sealed class <#= this.Name #>Executor(FormulaSession session, WorkflowA
|
||||
protected override async ValueTask<object?> ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken)
|
||||
{
|
||||
string conversationId = await agentProvider.CreateConversationAsync(cancellationToken).ConfigureAwait(false);<#
|
||||
AssignVariable(this.ConversationId, "conversationId");
|
||||
#>
|
||||
AssignVariable(this.ConversationId, "conversationId");#>
|
||||
await context.AddEventAsync(new ConversationUpdateEvent(conversationId)).ConfigureAwait(false);
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public static class DeclarativeWorkflowBuilder
|
||||
state.Initialize(workflowElement.WrapWithBot(), options.Configuration);
|
||||
DeclarativeWorkflowExecutor<TInput> rootExecutor =
|
||||
new(rootId,
|
||||
options.AgentProvider,
|
||||
options,
|
||||
state,
|
||||
message => inputTransform?.Invoke(message) ?? DefaultTransform(message));
|
||||
|
||||
|
||||
+5
-1
@@ -12,7 +12,11 @@ public sealed class ConversationUpdateEvent : WorkflowEvent
|
||||
/// </summary>
|
||||
public string ConversationId { get; }
|
||||
|
||||
internal ConversationUpdateEvent(string conversationId)
|
||||
/// <summary>
|
||||
/// Initializes a new instance of <see cref="ConversationUpdateEvent"/>.
|
||||
/// </summary>
|
||||
/// <param name="conversationId">The identifier of the associated conversation.</param>
|
||||
public ConversationUpdateEvent(string conversationId)
|
||||
: base(conversationId)
|
||||
{
|
||||
this.ConversationId = conversationId;
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ internal static class AgentProviderExtensions
|
||||
|
||||
// Enable "autoSend" behavior if this is the workflow conversation.
|
||||
bool isWorkflowConversation = context.IsWorkflowConversation(conversationId);
|
||||
autoSend &= isWorkflowConversation;
|
||||
autoSend |= isWorkflowConversation;
|
||||
|
||||
// Process the agent response updates.
|
||||
List<AgentRunResponseUpdate> updates = [];
|
||||
|
||||
+7
-3
@@ -13,7 +13,7 @@ namespace Microsoft.Agents.AI.Workflows.Declarative.Interpreter;
|
||||
/// </summary>
|
||||
internal sealed class DeclarativeWorkflowExecutor<TInput>(
|
||||
string workflowId,
|
||||
WorkflowAgentProvider agentProvider,
|
||||
DeclarativeWorkflowOptions options,
|
||||
WorkflowFormulaState state,
|
||||
Func<TInput, ChatMessage> inputTransform) :
|
||||
Executor<TInput>(workflowId), IModeledAction where TInput : notnull
|
||||
@@ -26,10 +26,14 @@ internal sealed class DeclarativeWorkflowExecutor<TInput>(
|
||||
DeclarativeWorkflowContext declarativeContext = new(context, state);
|
||||
ChatMessage input = inputTransform.Invoke(message);
|
||||
|
||||
string conversationId = await agentProvider.CreateConversationAsync(cancellationToken: default).ConfigureAwait(false);
|
||||
string? conversationId = options.ConversationId;
|
||||
if (string.IsNullOrWhiteSpace(conversationId))
|
||||
{
|
||||
conversationId = await options.AgentProvider.CreateConversationAsync(cancellationToken: default).ConfigureAwait(false);
|
||||
}
|
||||
await declarativeContext.QueueConversationUpdateAsync(conversationId).ConfigureAwait(false);
|
||||
|
||||
await agentProvider.CreateMessageAsync(conversationId, input, cancellationToken: default).ConfigureAwait(false);
|
||||
await options.AgentProvider.CreateMessageAsync(conversationId, input, cancellationToken: default).ConfigureAwait(false);
|
||||
await declarativeContext.SetLastMessageAsync(input).ConfigureAwait(false);
|
||||
|
||||
await context.SendResultMessageAsync(this.Id).ConfigureAwait(false);
|
||||
|
||||
@@ -23,6 +23,8 @@ public abstract class RootExecutor<TInput> : Executor<TInput> where TInput : not
|
||||
private readonly WorkflowFormulaState _state;
|
||||
private readonly Func<TInput, ChatMessage>? _inputTransform;
|
||||
|
||||
private string? _conversationId;
|
||||
|
||||
/// <summary>
|
||||
/// Get the shared formula session to provide to workflow <see cref="ActionExecutor"/> instances.
|
||||
/// </summary>
|
||||
@@ -39,6 +41,7 @@ public abstract class RootExecutor<TInput> : Executor<TInput> where TInput : not
|
||||
{
|
||||
this._configuration = options.Configuration;
|
||||
this._agentProvider = options.AgentProvider;
|
||||
this._conversationId = options.ConversationId;
|
||||
this._inputTransform = inputTransform;
|
||||
this._state = new WorkflowFormulaState(options.CreateRecalcEngine());
|
||||
this._state.InitializeSystem();
|
||||
@@ -53,10 +56,13 @@ public abstract class RootExecutor<TInput> : Executor<TInput> where TInput : not
|
||||
|
||||
ChatMessage input = (this._inputTransform ?? DefaultInputTransform).Invoke(message);
|
||||
|
||||
string conversationId = await this._agentProvider.CreateConversationAsync(cancellationToken: default).ConfigureAwait(false);
|
||||
await declarativeContext.QueueConversationUpdateAsync(conversationId).ConfigureAwait(false);
|
||||
if (string.IsNullOrWhiteSpace(this._conversationId))
|
||||
{
|
||||
this._conversationId = await this._agentProvider.CreateConversationAsync(cancellationToken: default).ConfigureAwait(false);
|
||||
}
|
||||
await declarativeContext.QueueConversationUpdateAsync(this._conversationId).ConfigureAwait(false);
|
||||
|
||||
await this._agentProvider.CreateMessageAsync(conversationId, input, cancellationToken: default).ConfigureAwait(false);
|
||||
await this._agentProvider.CreateMessageAsync(this._conversationId, input, cancellationToken: default).ConfigureAwait(false);
|
||||
await declarativeContext.SetLastMessageAsync(input).ConfigureAwait(false);
|
||||
|
||||
await declarativeContext.SendMessageAsync(new ActionExecutorResult(this.Id)).ConfigureAwait(false);
|
||||
|
||||
+2
@@ -2,6 +2,7 @@
|
||||
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Agents.AI.Workflows.Declarative.Extensions;
|
||||
using Microsoft.Agents.AI.Workflows.Declarative.Interpreter;
|
||||
using Microsoft.Agents.AI.Workflows.Declarative.PowerFx;
|
||||
using Microsoft.Bot.ObjectModel;
|
||||
@@ -16,6 +17,7 @@ internal sealed class CreateConversationExecutor(CreateConversation model, Workf
|
||||
{
|
||||
string conversationId = await agentProvider.CreateConversationAsync(cancellationToken).ConfigureAwait(false);
|
||||
await this.AssignAsync(this.Model.ConversationId?.Path, FormulaValue.New(conversationId), context).ConfigureAwait(false);
|
||||
await context.QueueConversationUpdateAsync(conversationId).ConfigureAwait(false);
|
||||
|
||||
return default;
|
||||
}
|
||||
|
||||
+9
-5
@@ -18,17 +18,20 @@ public sealed class DeclarativeCodeGenTest(ITestOutputHelper output) : WorkflowT
|
||||
[Theory]
|
||||
[InlineData("SendActivity.yaml", "SendActivity.json")]
|
||||
[InlineData("InvokeAgent.yaml", "InvokeAgent.json")]
|
||||
[InlineData("InvokeAgent.yaml", "InvokeAgent.json", true)]
|
||||
[InlineData("ConversationMessages.yaml", "ConversationMessages.json")]
|
||||
public Task ValidateCaseAsync(string workflowFileName, string testcaseFileName) =>
|
||||
this.RunWorkflowAsync(Path.Combine(Environment.CurrentDirectory, "Workflows", workflowFileName), testcaseFileName);
|
||||
[InlineData("ConversationMessages.yaml", "ConversationMessages.json", true)]
|
||||
public Task ValidateCaseAsync(string workflowFileName, string testcaseFileName, bool externalConveration = false) =>
|
||||
this.RunWorkflowAsync(Path.Combine(Environment.CurrentDirectory, "Workflows", workflowFileName), testcaseFileName, externalConveration);
|
||||
|
||||
[Theory]
|
||||
[InlineData("Marketing.yaml", "Marketing.json")]
|
||||
[InlineData("MathChat.yaml", "MathChat.json")]
|
||||
[InlineData("Marketing.yaml", "Marketing.json", true)]
|
||||
[InlineData("MathChat.yaml", "MathChat.json", true)]
|
||||
[InlineData("DeepResearch.yaml", "DeepResearch.json", Skip = "Long running")]
|
||||
[InlineData("HumanInLoop.yaml", "HumanInLoop.json", Skip = "Needs test support")]
|
||||
public Task ValidateScenarioAsync(string workflowFileName, string testcaseFileName) =>
|
||||
this.RunWorkflowAsync(Path.Combine(GetRepoFolder(), "workflow-samples", workflowFileName), testcaseFileName);
|
||||
public Task ValidateScenarioAsync(string workflowFileName, string testcaseFileName, bool externalConveration = false) =>
|
||||
this.RunWorkflowAsync(Path.Combine(GetRepoFolder(), "workflow-samples", workflowFileName), testcaseFileName, externalConveration);
|
||||
|
||||
protected override async Task RunAndVerifyAsync<TInput>(Testcase testcase, string workflowPath, DeclarativeWorkflowOptions workflowOptions)
|
||||
{
|
||||
@@ -46,6 +49,7 @@ public sealed class DeclarativeCodeGenTest(ITestOutputHelper output) : WorkflowT
|
||||
|
||||
Assert.Empty(workflowEvents.ActionInvokeEvents);
|
||||
Assert.Empty(workflowEvents.ActionCompleteEvents);
|
||||
AssertWorkflow.Conversation(workflowOptions.ConversationId, testcase.Validation.ConversationCount, workflowEvents.ConversationEvents);
|
||||
AssertWorkflow.EventCounts(workflowEvents.ExecutorInvokeEvents.Count - 2, testcase);
|
||||
AssertWorkflow.EventCounts(workflowEvents.ExecutorCompleteEvents.Count - 2, testcase);
|
||||
AssertWorkflow.EventSequence(workflowEvents.ExecutorInvokeEvents.Select(e => e.ExecutorId), testcase);
|
||||
|
||||
+9
-5
@@ -18,17 +18,20 @@ public sealed class DeclarativeWorkflowTest(ITestOutputHelper output) : Workflow
|
||||
[Theory]
|
||||
[InlineData("SendActivity.yaml", "SendActivity.json")]
|
||||
[InlineData("InvokeAgent.yaml", "InvokeAgent.json")]
|
||||
[InlineData("InvokeAgent.yaml", "InvokeAgent.json", true)]
|
||||
[InlineData("ConversationMessages.yaml", "ConversationMessages.json")]
|
||||
public Task ValidateCaseAsync(string workflowFileName, string testcaseFileName) =>
|
||||
this.RunWorkflowAsync(Path.Combine(Environment.CurrentDirectory, "Workflows", workflowFileName), testcaseFileName);
|
||||
[InlineData("ConversationMessages.yaml", "ConversationMessages.json", true)]
|
||||
public Task ValidateCaseAsync(string workflowFileName, string testcaseFileName, bool externalConveration = false) =>
|
||||
this.RunWorkflowAsync(Path.Combine(Environment.CurrentDirectory, "Workflows", workflowFileName), testcaseFileName, externalConveration);
|
||||
|
||||
[Theory]
|
||||
[InlineData("Marketing.yaml", "Marketing.json")]
|
||||
[InlineData("MathChat.yaml", "MathChat.json")]
|
||||
[InlineData("Marketing.yaml", "Marketing.json", true)]
|
||||
[InlineData("MathChat.yaml", "MathChat.json", true)]
|
||||
[InlineData("DeepResearch.yaml", "DeepResearch.json", Skip = "Long running")]
|
||||
[InlineData("HumanInLoop.yaml", "HumanInLoop.json", Skip = "Needs test support")]
|
||||
public Task ValidateScenarioAsync(string workflowFileName, string testcaseFileName) =>
|
||||
this.RunWorkflowAsync(Path.Combine(GetRepoFolder(), "workflow-samples", workflowFileName), testcaseFileName);
|
||||
public Task ValidateScenarioAsync(string workflowFileName, string testcaseFileName, bool externalConveration = false) =>
|
||||
this.RunWorkflowAsync(Path.Combine(GetRepoFolder(), "workflow-samples", workflowFileName), testcaseFileName, externalConveration);
|
||||
|
||||
protected override async Task RunAndVerifyAsync<TInput>(Testcase testcase, string workflowPath, DeclarativeWorkflowOptions workflowOptions)
|
||||
{
|
||||
@@ -42,6 +45,7 @@ public sealed class DeclarativeWorkflowTest(ITestOutputHelper output) : Workflow
|
||||
|
||||
Assert.NotEmpty(workflowEvents.ExecutorInvokeEvents);
|
||||
Assert.NotEmpty(workflowEvents.ExecutorCompleteEvents);
|
||||
AssertWorkflow.Conversation(workflowOptions.ConversationId, testcase.Validation.ConversationCount, workflowEvents.ConversationEvents);
|
||||
AssertWorkflow.EventCounts(workflowEvents.ActionInvokeEvents.Count, testcase);
|
||||
AssertWorkflow.EventCounts(workflowEvents.ActionCompleteEvents.Count, testcase);
|
||||
AssertWorkflow.EventSequence(workflowEvents.ActionInvokeEvents.Select(e => e.ActionId), testcase);
|
||||
|
||||
+3
-1
@@ -51,14 +51,16 @@ public sealed class TestcaseInput
|
||||
public sealed class TestcaseValidation
|
||||
{
|
||||
[JsonConstructor]
|
||||
public TestcaseValidation(int minActionCount, int? maxActionCount = null, TestcaseValidationActions? actions = null)
|
||||
public TestcaseValidation(int conversationCount, int minActionCount, int? maxActionCount = null, TestcaseValidationActions? actions = null)
|
||||
{
|
||||
this.ConversationCount = conversationCount;
|
||||
this.MinActionCount = minActionCount;
|
||||
this.MaxActionCount = maxActionCount;
|
||||
this.Actions = actions ?? new TestcaseValidationActions([]);
|
||||
}
|
||||
|
||||
public TestcaseValidationActions Actions { get; }
|
||||
public int ConversationCount { get; }
|
||||
public int MinActionCount { get; }
|
||||
public int? MaxActionCount { get; }
|
||||
}
|
||||
|
||||
+2
@@ -14,12 +14,14 @@ internal sealed class WorkflowEvents
|
||||
this.EventCounts = workflowEvents.GroupBy(e => e.GetType()).ToDictionary(e => e.Key, e => e.Count());
|
||||
this.ActionInvokeEvents = workflowEvents.OfType<DeclarativeActionInvokedEvent>().ToList();
|
||||
this.ActionCompleteEvents = workflowEvents.OfType<DeclarativeActionCompletedEvent>().ToList();
|
||||
this.ConversationEvents = workflowEvents.OfType<ConversationUpdateEvent>().ToList();
|
||||
this.ExecutorInvokeEvents = workflowEvents.OfType<ExecutorInvokedEvent>().ToList();
|
||||
this.ExecutorCompleteEvents = workflowEvents.OfType<ExecutorCompletedEvent>().ToList();
|
||||
}
|
||||
|
||||
public IReadOnlyList<WorkflowEvent> Events { get; }
|
||||
public IReadOnlyDictionary<Type, int> EventCounts { get; }
|
||||
public IReadOnlyList<ConversationUpdateEvent> ConversationEvents { get; }
|
||||
public IReadOnlyList<DeclarativeActionInvokedEvent> ActionInvokeEvents { get; }
|
||||
public IReadOnlyList<DeclarativeActionCompletedEvent> ActionCompleteEvents { get; }
|
||||
public IReadOnlyList<ExecutorInvokedEvent> ExecutorInvokeEvents { get; }
|
||||
|
||||
+33
-4
@@ -21,9 +21,15 @@ namespace Microsoft.Agents.AI.Workflows.Declarative.IntegrationTests.Framework;
|
||||
/// </summary>
|
||||
public abstract class WorkflowTest(ITestOutputHelper output) : IntegrationTest(output)
|
||||
{
|
||||
protected abstract Task RunAndVerifyAsync<TInput>(Testcase testcase, string workflowPath, DeclarativeWorkflowOptions workflowOptions) where TInput : notnull;
|
||||
protected abstract Task RunAndVerifyAsync<TInput>(
|
||||
Testcase testcase,
|
||||
string workflowPath,
|
||||
DeclarativeWorkflowOptions workflowOptions) where TInput : notnull;
|
||||
|
||||
protected Task RunWorkflowAsync(string workflowPath, string testcaseFileName)
|
||||
protected Task RunWorkflowAsync(
|
||||
string workflowPath,
|
||||
string testcaseFileName,
|
||||
bool externalConversation = false)
|
||||
{
|
||||
this.Output.WriteLine($"WORKFLOW: {workflowPath}");
|
||||
this.Output.WriteLine($"TESTCASE: {testcaseFileName}");
|
||||
@@ -45,7 +51,8 @@ public abstract class WorkflowTest(ITestOutputHelper output) : IntegrationTest(o
|
||||
protected async Task TestWorkflowAsync<TInput>(
|
||||
Testcase testcase,
|
||||
string workflowPath,
|
||||
IConfiguration configuration) where TInput : notnull
|
||||
IConfiguration configuration,
|
||||
bool externalConversation = false) where TInput : notnull
|
||||
{
|
||||
this.Output.WriteLine($"INPUT: {testcase.Setup.Input.Value}");
|
||||
|
||||
@@ -59,12 +66,22 @@ public abstract class WorkflowTest(ITestOutputHelper output) : IntegrationTest(o
|
||||
.AddInMemoryCollection(agentMap)
|
||||
.Build();
|
||||
|
||||
AzureAgentProvider agentProvider = new(foundryConfig.Endpoint, new AzureCliCredential());
|
||||
|
||||
string? conversationId = null;
|
||||
if (externalConversation)
|
||||
{
|
||||
conversationId = await agentProvider.CreateConversationAsync().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
DeclarativeWorkflowOptions workflowOptions =
|
||||
new(new AzureAgentProvider(foundryConfig.Endpoint, new AzureCliCredential()))
|
||||
new(agentProvider)
|
||||
{
|
||||
Configuration = workflowConfig,
|
||||
ConversationId = conversationId,
|
||||
LoggerFactory = this.Output
|
||||
};
|
||||
|
||||
await this.RunAndVerifyAsync<TInput>(testcase, workflowPath, workflowOptions);
|
||||
}
|
||||
|
||||
@@ -103,6 +120,18 @@ public abstract class WorkflowTest(ITestOutputHelper output) : IntegrationTest(o
|
||||
|
||||
protected static class AssertWorkflow
|
||||
{
|
||||
public static void Conversation(string? conversationId, int expectedCount, IReadOnlyList<ConversationUpdateEvent> conversationEvents)
|
||||
{
|
||||
if (string.IsNullOrEmpty(conversationId))
|
||||
{
|
||||
Assert.Equal(expectedCount, conversationEvents.Count);
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.Equal(expectedCount - 1, conversationEvents.Count);
|
||||
}
|
||||
}
|
||||
|
||||
public static void EventCounts(int actualCount, Testcase testcase)
|
||||
{
|
||||
Assert.True(actualCount >= testcase.Validation.MinActionCount, $"Event count less than expected: {testcase.Validation.MinActionCount} ({actualCount}).");
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 3,
|
||||
"min_action_count": 7,
|
||||
"actions": {
|
||||
"start": [
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 2,
|
||||
"min_action_count": 25,
|
||||
"max_action_count": 56,
|
||||
"actions": {
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 1,
|
||||
"min_action_count": 1,
|
||||
"actions": {
|
||||
"start": [
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 2,
|
||||
"min_action_count": 1,
|
||||
"actions": {
|
||||
"start": [
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 1,
|
||||
"min_action_count": 4,
|
||||
"actions": {
|
||||
"start": [
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 1,
|
||||
"min_action_count": 6,
|
||||
"max_action_count": 56,
|
||||
"actions": {
|
||||
|
||||
+1
@@ -7,6 +7,7 @@
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"conversation_count": 1,
|
||||
"min_action_count": 3,
|
||||
"actions": {
|
||||
"start": [
|
||||
|
||||
+1
@@ -12,4 +12,5 @@ trigger:
|
||||
input:
|
||||
messages: =[UserMessage(System.LastMessageText)]
|
||||
output:
|
||||
autoSend: false
|
||||
messages: Local.Answer
|
||||
|
||||
+1
-1
@@ -216,7 +216,7 @@ public sealed class DeclarativeWorkflowTest(ITestOutputHelper output) : Workflow
|
||||
WorkflowFormulaState state = new(RecalcEngineFactory.Create());
|
||||
Mock<WorkflowAgentProvider> mockAgentProvider = CreateMockProvider();
|
||||
DeclarativeWorkflowOptions options = new(mockAgentProvider.Object);
|
||||
WorkflowActionVisitor visitor = new(new DeclarativeWorkflowExecutor<string>(WorkflowActionVisitor.Steps.Root("anything"), mockAgentProvider.Object, state, (message) => DeclarativeWorkflowBuilder.DefaultTransform(message)), state, options);
|
||||
WorkflowActionVisitor visitor = new(new DeclarativeWorkflowExecutor<string>(WorkflowActionVisitor.Steps.Root("anything"), options, state, (message) => DeclarativeWorkflowBuilder.DefaultTransform(message)), state, options);
|
||||
WorkflowElementWalker walker = new(visitor);
|
||||
walker.Visit(dialog);
|
||||
Assert.True(visitor.HasUnsupportedActions);
|
||||
|
||||
@@ -92,6 +92,7 @@ trigger:
|
||||
agent:
|
||||
name: =Env.FOUNDRY_AGENT_RESEARCHANALYST
|
||||
output:
|
||||
autoSend: false
|
||||
messages: Local.TaskFacts
|
||||
input:
|
||||
messages: =UserMessage(Local.InputTask)
|
||||
@@ -126,6 +127,7 @@ trigger:
|
||||
agent:
|
||||
name: =Env.FOUNDRY_AGENT_RESEARCHMANAGER
|
||||
output:
|
||||
autoSend: false
|
||||
messages: Local.Plan
|
||||
input:
|
||||
messages: =UserMessage(Local.InputTask)
|
||||
@@ -179,6 +181,7 @@ trigger:
|
||||
agent:
|
||||
name: =Env.FOUNDRY_AGENT_RESEARCHMANAGER
|
||||
output:
|
||||
autoSend: false
|
||||
messages: Local.ProgressLedgerUpdate
|
||||
input:
|
||||
messages: =UserMessage(Local.AgentResponseText)
|
||||
@@ -366,6 +369,7 @@ trigger:
|
||||
agent:
|
||||
name: =Env.FOUNDRY_AGENT_RESEARCHANALYST
|
||||
output:
|
||||
autoSend: false
|
||||
messages: Local.TaskFacts
|
||||
input:
|
||||
messages: |-
|
||||
@@ -395,6 +399,7 @@ trigger:
|
||||
agent:
|
||||
name: =Env.FOUNDRY_AGENT_RESEARCHMANAGER
|
||||
output:
|
||||
autoSend: false
|
||||
messages: Local.Plan
|
||||
input:
|
||||
additionalInstructions: |-
|
||||
|
||||
Reference in New Issue
Block a user