docs/decisions/0049-agents-assistantsV2.md
Open AI has release the Assistants V2 API. This builds on top of the V1 assistant concept, but also invalidates certain V1 features. In addition, the dotnet API that supports Assistant V2 features is entirely divergent on the Azure.AI.OpenAI.Assistants SDK that is currently in use.
Migrating to Assistant V2 API is a breaking change to the existing package due to:
file-search vs retrieval)OpenAI and Azure.AI.OpenAI)The OpenAIAssistant agent is roughly equivalent to its V1 form save for:
Definition propertyPreviously, the agent definition as exposed via direct properties such as:
FileIdsMetadataThis has all been shifted and expanded upon via the Definition property which is of the same type (OpenAIAssistantDefinition) utilized to create and query an assistant.
The following table describes the purpose of diagramed methods on the OpenAIAssistantAgent.
| Method Name | Description |
|---|---|
| Create | Create a new assistant agent |
| ListDefinitions | List existing assistant definitions |
| Retrieve | Retrieve an existing assistant |
| CreateThread | Create an assistant thread |
| DeleteThread | Delete an assistant thread |
| AddChatMessage | Add a message to an assistant thread |
| GetThreadMessages | Retrieve all messages from an assistant thread |
| Delete | Delete the assistant agent's definition (puts agent into a terminal state) |
| Invoke | Invoke the assistant agent (no chat) |
| GetChannelKeys | Inherited from Agent |
| CreateChannel | Inherited from Agent |
This section provides an overview / inventory of all the public surface area described in this ADR.
| Class Name | Description |
|---|---|
| OpenAIAssistantAgent | An Agent based on the Open AI Assistant API |
| OpenAIAssistantChannel | An 'AgentChannel' for OpenAIAssistantAgent (associated with a thread-id.) |
| OpenAIAssistantDefinition | All of the metadata / definition for an Open AI Assistant. Unable to use the Open AI API model due to implementation constraints (constructor not public). |
| OpenAIAssistantExecutionOptions | Options that affect the run, but defined globally for the agent/assistant. |
| OpenAIAssistantInvocationOptions | Options bound to a discrete run, used for direct (no chat) invocation. |
| OpenAIThreadCreationOptions | Options for creating a thread that take precedence over assistant definition, when specified. |
| OpenAIServiceConfiguration | Describes the service connection and used to create the OpenAIClient |
The heart of supporting an assistant agent is creating and processing a Run.
A Run is effectively a discrete assistant interaction on a Thread (or conversation).
This Run processing is implemented as internal logic within the OpenAI Agent Framework that is outlined here:
Initiate processing using:
agent -> OpenAIAssistantAgentclient -> AssistantClientthreadid -> stringoptions -> OpenAIAssistantInvocationOptions (optional)Perform processing:
Verify agent not deleted
Define RunCreationOptions
Create the run (based on threadid and agent.Id)
Process the run:
do
Poll run status until is not queued, in-progress, or cancelling
Throw if run status is expired, failed, or cancelled
Query steps for run
if run status is requires-action
process function steps
post function results
foreach (step is completed)
if (step is tool-call) generate and yield tool content
else if (step is message) generate and yield message content
while (run status is not completed)
Vector Store support is required in order to enable usage of the file-search tool.
In alignment with V2 streaming of the FileClient, the caller may also directly target VectorStoreClient from the OpenAI SDK.
Specific configuration/options classes are introduced to support the ability to define assistant behavior at each of the supported articulation points (i.e. assistant, thread, & run).
| Class | Purpose |
|---|---|
OpenAIAssistantDefinition | Definition of the assistant. Used when creating a new assistant, inspecting an assistant-agent instance, or querying assistant definitions. |
OpenAIAssistantExecutionOptions | Options that affect run execution, defined within assistant scope. |
OpenAIAssistantInvocationOptions | Run level options that take precedence over assistant definition, when specified. |
OpenAIAssistantToolCallBehavior | Informs tool-call behavior for the associated scope: assistant or run. |
OpenAIThreadCreationOptions | Thread scoped options that take precedence over assistant definition, when specified. |
OpenAIServiceConfiguration | Informs the which service to target, and how. |
The OpenAIAssistantDefinition was previously used only when enumerating a list of stored agents. It has been evolved to also be used as input for creating and agent and exposed as a discrete property on the OpenAIAssistantAgent instance.
This includes optional ExecutionOptions which define default run behavior. Since these execution options are not part of the remote assistant definition, they are persisted in the assistant metadata for when an existing agent is retrieved. OpenAIAssistantToolCallBehavior is included as part of the execution options and modeled in alignment with the ToolCallBehavior associated with AI Connectors.
Note: Manual function calling isn't currently supported for
OpenAIAssistantAgentorAgentChatand is planned to be addressed as an enhancement. When this supported is introduced,OpenAIAssistantToolCallBehaviorwill determine the function calling behavior (also in alignment with theToolCallBehaviorassociated with AI Connectors).
Alternative (Future?)
A pending change has been authored that introduces FunctionChoiceBehavior as a property of the base / abstract PromptExecutionSettings. Once realized, it may make sense to evaluate integrating this pattern for OpenAIAssistantAgent. This may also imply in inheritance relationship of PromptExecutionSettings for both OpenAIAssistantExecutionOptions and OpenAIAssistantInvocationOptions (next section).
DECISION: Do not support tool_choice until the FunctionChoiceBehavior is realized.
When invoking an OpenAIAssistantAgent directly (no-chat), definition that only apply to a discrete run may be specified. These definition are defined as OpenAIAssistantInvocationOptions and overtake precedence over any corresponding assistant or thread definition.
<p align="center"> <kbd></kbd> </p>Note: These definition are also impacted by the
ToolCallBehavior/FunctionChoiceBehaviorquandary.
When invoking an OpenAIAssistantAgent directly (no-chat), a thread must be explicitly managed. When doing so, thread specific options may be specified. These options are defined as OpenAIThreadCreationOptions and take precedence over any corresponding assistant definition.
The OpenAIServiceConfiguration defines how to connect to a specific remote service, whether it be OpenAI, Azure, or proxy. This eliminates the need to define multiple overloads for each call site that results in a connection to the remote API service (i.e. create a client).
<p align="center"> <kbd></kbd> </p>Note: This was previously named
OpenAIAssistantConfiguration, but is not necessarily assistant specific.