Parity gap surfaced comparing agent.Response.Update against M.E.AI ChatResponseExtensions.ProcessUpdate.
Gap
ProcessUpdate folds two update fields onto the response that Go has no home for:
update.ModelId → response.ModelId
update.ConversationId → response.ConversationId
Go's agent.Response has neither ModelID nor ConversationID. Today the model id is only surfaced ad hoc via provider AdditionalProperties (e.g. the recent Copilot usage model and OpenAI paths), and conversation identity lives on Session.ServiceID. So there is no canonical, provider-agnostic way to read "which model produced this response" or "which server-side conversation it belongs to."
Reference
- M.E.AI
ChatResponse.ModelId / ChatResponse.ConversationId, folded in ChatResponseExtensions.ProcessUpdate.
ChatResponseUpdate.ModelId / .ConversationId.
Proposed shape (needs maintainer input)
Add ModelID string (and possibly ConversationID string) to agent.Response and agent.ResponseUpdate, and fold them in Response.Update the same way ResponseID/FinishReason are folded (prefer later non-empty values). Providers would populate ResponseUpdate.ModelID from the model on the response.
Open questions:
- Scope:
ModelID alone (smaller, immediately useful) vs also ConversationID (overlaps Session.ServiceID — may be redundant in Go).
- Whether providers should stop stashing model in
AdditionalProperties once a first-class field exists (migration/back-compat).
Filing issue-first per CONTRIBUTING (new public API). Note #1133 fixes the related AdditionalProperties scoping bug in the same Response.Update, independent of this proposal.
Parity gap surfaced comparing
agent.Response.Updateagainst M.E.AIChatResponseExtensions.ProcessUpdate.Gap
ProcessUpdatefolds two update fields onto the response that Go has no home for:update.ModelId → response.ModelIdupdate.ConversationId → response.ConversationIdGo's
agent.Responsehas neitherModelIDnorConversationID. Today the model id is only surfaced ad hoc via providerAdditionalProperties(e.g. the recent Copilot usagemodeland OpenAI paths), and conversation identity lives onSession.ServiceID. So there is no canonical, provider-agnostic way to read "which model produced this response" or "which server-side conversation it belongs to."Reference
ChatResponse.ModelId/ChatResponse.ConversationId, folded inChatResponseExtensions.ProcessUpdate.ChatResponseUpdate.ModelId/.ConversationId.Proposed shape (needs maintainer input)
Add
ModelID string(and possiblyConversationID string) toagent.Responseandagent.ResponseUpdate, and fold them inResponse.Updatethe same wayResponseID/FinishReasonare folded (prefer later non-empty values). Providers would populateResponseUpdate.ModelIDfrom the model on the response.Open questions:
ModelIDalone (smaller, immediately useful) vs alsoConversationID(overlapsSession.ServiceID— may be redundant in Go).AdditionalPropertiesonce a first-class field exists (migration/back-compat).Filing issue-first per CONTRIBUTING (new public API). Note #1133 fixes the related
AdditionalPropertiesscoping bug in the sameResponse.Update, independent of this proposal.