* feat: Make WorkflowBuilder more intutitve
Right now Executorish binding has some unintutitive behaviour. When a user adds an eecutor with an id of an executor that already exists, we silently replace it, if the user provides it inside of add_edge. When a user introduces an executor via an unbound id, the user must bind it via BindExecutor, even though the registration is created implicitly when an edge id added.
The change will remove the invisible update in favor of a "best efforts" check of type and instance equality.
* Expand errors when rebinding to disallowed
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* feat: Implement Checkpointing API
* refactor: Normalzie Namespaces and break out multi-class files
* feat: Support checkpointing in AIAgentHostExecutor
* test: Representation tests
* feat: Add Step-level Tracing and WorkflowEvents
* feat: Add Checkpointing Sample and Smoke Test
* Fixes an issue where StateManager was not properly clearing the incoming queued updates.
* Fixes order of checkpointing and in-step event publication
* Adds import of RunContext state on LoadCheckpoint
* Add re-firing of events for unserviced ExternalRequests on Checkpoint load
* docs: Add documentation to publics
* Also adds documentation to ICheckpointManager which may go public
* refactor: Fix Union Aggregators and add Tests
* fix: Fix issues raised in PR comments and remove dead code
* feat: Host Workflow as AIAgent
* Also changes AIAgent-as-Executor to use streaming runs and streaming
events
* Also enables default setting for yielding events
* fix: Infinite loop in GenerateNewId()
* docs: Spelling
* test: Add Workflow-as-Agent sample and test
* feat: Support Executor-targeted messages
This adds support for only sending a message to a given executor. Messages will still only route through connected edges.
* feat: Support sending all valid input types after starting a run
* feat: Normalize AIAgent-as-Executor Message Protocol to use MEAI types
* feat: Define Workflow and Executor APIs
* feat: Define IExecutionContext and Events
* feat: Simple Workflow Demos
* refactor: Move Workflows classes to separate assembly
* feat: Move FanOut/In to LowLevel API with new semantics
* feat: Implement Local Execution
* refactor: Assembly name .Workflow => .Workflows
* feat: Enable Default Message Handling
* also lifts Bind in MessageHandlerInfo to better be able to direclty invoke handlers (for AOT, later)
* feat: Implement StreamingHandle APIs
This allows the user to respond to WorkflowEvents with external messages, enabling HIL.
* feat: Add checks for duplicate edges and chain cycles
* feat: Add built-in WorkflowEvents
* refactor: Pull classes into own files
* refactor: Simplify Disposal pattern in Executor
* refactor: Break EdgeRunner file into per-type files
* refactor: Use Throw.IfNull()
* refactor: Remove AddLoop()
Per https://github.com/microsoft/agent-framework/pull/272#discussion_r2241739079 we decided this was not very useful.
* refactor: Normalize use of ValueTask
* fix: Build Break from removing .AddLoop
* refactor: Explicit routing and RouteBuilder
Split out reflection from MessageRouter implemention into build phase, enabling AOT compilation to drive RouteBuilding without reflection.
* test: Add Reflection/Invocation tests
* fix: Terminate on Completion event
* refactor: Update public API surface
* feat: Add support for external requests
* feat: Support hosting AIAgent instances in Workflows
* fix: Fix routing to go through Executor.ExecuteAsync
* test: Update samples for "must SendMessage" semantics
* Add invoking samples to unit tests to avoid future breaks
* fix: ExternalRequest should block Workflow completion
* feat: Normalize API surface against Python
* Also adds xmldoc to all public APIs
* refactor: Normalize UnitTest and Sample namespaces
* fix: Formatting
* refactor: Normalize project/folder names
* feat: Remove DynamicCodeExecution from ValueTaskTypeErasure
* fix: Fix ILTrim warnings
* docs: Add missing docs and fix typos
* feat: Hosted Agents should report Run events
* fix: Fix type propagation for ILTrim changes
* refactor: Simplify DynamicallyAccessedMembers annotations
* sample: Use static-Type construction of InputPort
* feat: Support non-Streaming Run Mode
* test: Add test for non-streaming execution
* refactor: Remove unused types
* refactor: Simplify Event and EdgeData type hierarchies
* feat: Add Switch (=Conditional Edge Group) control flow
* feat: Make .NET AutoSend the MessageHandler result
* feat: Implement State APIs
* refactor: Simplify public namespaces and code organization
* refactor: Reconcile .NET and Python names
---------
Co-authored-by: Chris <66376200+crickman@users.noreply.github.com>
* Add agent hosting package and update sample
* Review feedback and cleanup
* Include the narrator
* wip
* wip
* Remove workaround for empty state writes.
* Handle changes to AgentThread.
* One more.
* Fix.
---------
Co-authored-by: Aditya Mandaleeka <adityam@microsoft.com>
* Add thread storage and serialization POC
* Switch to using JsonElement and add unit tests
* Add additional unit tests.
* Exclude private debugger properties from CodeCoverage.
* Rename IChatMessagesStorable to IChatMessageStore
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Improve xml doc.
* Update the message storing thread to always use external store for both local and remote storage.
* Remove threadid from the IChatMessageStore interface, since the store should own the thread id itself, if it requires one.
* Switch GetMessages to IEnumerable
* Address pr comments.
* Make jsonserializer options default consistent on DeserializeThreadAsync
* Move message storing thread functionality into AgentThread and simplify AgentThread behavior.
* Remove embedding generation from VectorStore chat history sample.
* Remove unecessary code and fix formatting.
* Make GetNewThread and DeserializeThread virtual with default implementations.
Remove unsued json utilities.
* Fix formatting
* Remove problem test.
* Add more unit tests
* Remove unused using clause.
* Address pr feedback.
* Address PR comments.
* Make InMemory store internal
* Switch InMemoryChatMessageStore to implement IList instead of inheriting from List.
* Rename store deserialize param.
* Update serialization based on PR comments.
* Remove confusing comment.
* Address Deserialization PR comments in the same way as Serialization
* Add State to IChatMessageStore Serialize and Deserialize names.
Make Thread Deserialize internal.
Make AgentThread type switching fobidden.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Chris <66376200+crickman@users.noreply.github.com>
- Remove Dictionary-derived types
- Add an optional name to orchestrations
- Make Handoffs based purely on AIAgent instances rather than separately provided names
* Add ChatClientAgent constructor overload
* Add unit tests for new constructor
* Up code coverage with extra tests
* Address PR comments.
* Address PR comment
* Add additional test to increase code coverage.
- Moved InProcessRuntime type into abstractions package and deleted InProcess package.
- Moved several members of IAgentRuntime to be extension methods instead, e.g. multiple GetActorAsync overloads.
- Added synchronous RegisterMessageHandler overloads and used them to avoid unnecessary async usage at call sites.
- Removed unnecessary surface area from InProcessRuntime, e.g. StopAsync, RunUntilIdleAsync, etc.
- Fixed spin loop in InProcessRuntime that would consume an entire core for the duration of the orchestration's operation.
- Removed a bunch of allocation from InProcessRuntime.
- Made a runtime optional for orchestrations, defaulting to using a temporary InProcessRuntime if none is provided.
- Removed custom delegate types from orchestrations.
- Consolidated namespaces.
- Used records to simplify message classes.
- Tweaked naming on AgentActor to make purpose of protected methods more clear.
- Removed invocation in AgentActor.InvokeAsync of empty update / isFinal parameter.
- Changed OrchestrationHandoffs to avoid needing to pass in agents duplicatively.
- Made various extension methods, such as those on OrchestrationHandoffsExtensions, into instance methods.
* Add ADR for different run response options
* Add another option to the list.
* Update agno non-streaming with further clarification
* Add another option
* Adding optional includeUpdates option
* Adding Pros/Cons for each option
* Make pros/cons a list
* Add some thoughts on structured outputs and custom AIContent types
* Update design doc to clarify primary and secondary better and split out custom response types with it's own options
* Add structured outputs competitive comparison and suggestion
* Address PR comments.
* Remove AgentRunFinishReason until we can find a good use case for it.
* Add finish reason to list of excluded properties.
* Add custom agent run response types.
Usage to follow.
* Update Agent run response types
* Add additional code coverage
* Remove onIntermediateMessage since it is unecessary with the new response approach.
* Add AgentId to response.
* Rename ParseAsStructuredOutput to Deserialize
* Update decision doc.
* Fix formatting.
* Update CopilotStudio to return new response types
* Address PR comment
Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
---------
Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
* Add project and skeleton files.
* Add CopilotStudioAgent implementation
* Add CopilotStudio integration tests
* Fix typos and PR feedback.
* Fix .net framework build errors.
* Address PR comments
* Remove temp test.
* Add rawresponse for streaming updates and more comments.
* Add TODO to review streaming updates
* Address PR comments and fix some issues with streaming messages.
* Map additional properties to agent reponses
* Update CopilotStudio integration tests to match new approach.
* Update copilot studio namespaces/project names to match new naming
* Add todo's for AIContent types.
* Remove files from PR.
* Fix up sln file.
* Update .gitignore.
* Remove duplicate package version items.
* Remove instructions from base agent type, and ensure description is only required where necessary.
* Fix code issue.
* Remove unused import.
* Remove typo
* Make the description parameter optional
* Also use name for handoffs if no description is provided.
* Rename the folders
* Rename the .csproj files
* Some build file updates
* Update namespaces
* Fix order of imports
* Fix order of imports
* Fix order of imports
- Id should return a stable ID, not a different value per access
- The RunAsync virtuals needn't be virtuals... a derived type can/should override just the main worker abstract method
- The protected methods should do argument validation
* Remove additional instructions from AgentRunOptions since it is not well supported outside of ChatClientAgents
* Fix typos and remove unused test.
* Make further namespace fixes and update AzureAIAgent with new tests.
* Expand tests to increase code coverage