Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: microsoft/agent-framework
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: python-1.12.0
Choose a base ref
...
head repository: microsoft/agent-framework
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: python-1.12.1
Choose a head ref
  • 14 commits
  • 128 files changed
  • 13 contributors

Commits on Jul 22, 2026

  1. Configuration menu
    Copy the full SHA
    d1d2610 View commit details
    Browse the repository at this point in the history
  2. Harden workflow credential selection (#7249)

    * Harden workflow credential selection
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    
    * Address workflow authentication review feedback
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    
    * Fail safely on membership lookup errors
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
    moonbox3 and Copilot authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    d97c901 View commit details
    Browse the repository at this point in the history
  3. Python: preserve Gemini 3 thought_signature across function-call repl…

    …ays (#7095)
    
    * Python: preserve Gemini 3 thought_signature across function-call replays
    
    Gemini 3 requires the opaque thought_signature attached to each functionCall
    part to be echoed back on every replay of that call, or the request is rejected
    with 400 INVALID_ARGUMENT. The signature previously survived only via
    raw_representation, so any layer that reconstructs a FunctionCallContent (e.g.
    harness tool approval) dropped it and broke the next step of the tool loop.
    
    Capture the signature into additional_properties on parse and replay it when
    building the Gemini Part, independent of raw_representation.
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2
    
    * Store Gemini thought_signature as base64 for JSON-safe persistence
    
    Content.additional_properties is serialized via json.dumps(message.to_dict())
    by history providers (e.g. RedisHistoryProvider), which fails on raw bytes.
    Store the thought_signature as a base64 string on parse and decode it back to
    bytes when building the Gemini Part. Also narrow call_id/name in the round-trip
    test to satisfy the type checkers.
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2
    
    * Harden Gemini thought_signature decode against corrupted history
    
    Guard the untyped additional_properties value with an isinstance(str) check and
    decode with validate=True, degrading gracefully (warn + drop the signature) on
    malformed data instead of raising binascii.Error mid tool loop. Matches the
    defensive base64 handling already used for data URIs in this file.
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2
    
    * Carry Gemini thought_signature on reasoning content via protected_data
    
    Represent the signature as a text_reasoning content's protected_data (base64)
    immediately preceding the function call, instead of a bespoke additional_properties
    key. This uses the framework's first-class opaque-signature field (as Anthropic
    does), survives streaming accumulation, and stays intact when the harness
    reconstructs the function call. Replay correlates the signature by adjacency.
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
    giles17 and Copilot authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    83ba938 View commit details
    Browse the repository at this point in the history
  4. .NET: [BREAKING] Hosting OpenAI Responses protocol helpers and option…

    …al execution state (#7000)
    
    * .NET: Add OpenAI Responses protocol helpers and optional execution state (ADR-0032)
    
    * Fix netstandard2.0/net472 build; harden helpers and workflow checkpoint key per review
    
    * .NET: Migrate hosting Responses samples to Azure.AI.Projects and fix workflow resume
    
    Migrate HostingResponsesAgent and HostingResponsesWorkflow samples from
    Azure.AI.OpenAI to Azure.AI.Projects (AIProjectClient.AsAIAgent), using the
    FOUNDRY_PROJECT_ENDPOINT/FOUNDRY_MODEL convention.
    
    Fix HostedWorkflowState.RunOrResumeAsync: on subsequent turns, restore the
    session's latest checkpoint and run the workflow forward with the new turn's
    input (mirroring the Python hosting host's restore-then-run semantics) instead
    of resuming a halted run with no input, which waited on input indefinitely.
    Add round-trip resume tests and update ADR-0032/spec-003 wording.
    
    * .NET: Fix HostedWorkflowState resume hang on unserviced external requests
    
    On resume, HostedWorkflowState.RunOrResumeAsync drained the workflow with the
    blocking WatchStreamAsync overload, so a workflow that halts at an unserviced
    RequestInfoEvent (human-in-the-loop / approval) blocked forever — asymmetric
    with the first-turn RunAsync path, which returns at the same halt. Break the
    drain when a superstep completes with HasPendingRequests, restoring symmetry
    with turn 1. Add a HITL approval-gate workflow and a resume-does-not-block test.
    
    * .NET: Warn when a HostedWorkflowState resume makes no progress
    
    Add an optional ILoggerFactory to HostedWorkflowState and log a warning when a
    resumed turn produces no events, mirroring the Python host's zero-event restore
    warning (a stale checkpoint or an input that does not match the workflow's
    expected type leaves session state unprogressed). Add a non-chat string workflow
    helper, a capturing logger, and a red/green test.
    
    * .NET: Resume HostedWorkflowState from durable checkpoint on cursor miss
    
    Add CheckpointManager.GetLatestCheckpointAsync(sessionId) and have
    HostedWorkflowState fall back to it when its in-memory head cursor misses, so a
    durable CheckpointManager resumes a session across a process restart or a new
    holder instead of restarting from the workflow's start executor. Mirrors the
    Python host's per-turn get_latest read-through. Add a counting workflow that
    proves resume-vs-fresh via accumulated state, plus a red/green test, and update
    ADR-0032/spec-003 and the XML remarks.
    
    * .NET: Serialize HostedWorkflowState turns through a workflow lock
    
    A single workflow instance backs the holder and workflow instances do not
    support concurrent runs (the runner throws "already owned by another runner"),
    so concurrent turns could fault or race the head cursor. Serialize all turns
    through one SemaphoreSlim (mirroring the Python host's workflow lock) and make
    HostedWorkflowState IDisposable to own it. Add a gated workflow and a
    deterministic concurrency red/green test.
    
    * .NET: Cover non-chat resume and multi-turn checkpoint advance
    
    Add tests for HostedWorkflowState resuming a non-chat-protocol workflow (no
    TurnToken) and for a third turn continuing to advance the head checkpoint,
    closing the coverage gaps the parity review flagged.
    
    * .NET: Add streaming workflow resume path and stream the workflow sample
    
    Add HostedWorkflowState.RunOrResumeStreamingAsync, which yields the turn's
    WorkflowEvents as they occur (fresh run or checkpoint resume) under the same
    serialization lock and records the head checkpoint after the stream drains,
    keeping the blocking and streaming workflow paths in lockstep with the Python
    host. Honor stream:true in the HostingResponsesWorkflow sample by projecting
    AgentResponseUpdateEvent updates over the Responses SSE wire. Add a streaming
    resume test and update the README/spec.
    
    * .NET: Cover Responses input adaptation to a typed workflow start executor
    
    Demonstrate that HostedWorkflowState's generic RunOrResumeAsync<TInput> is the
    input-adaptation seam (parity with Python's ResponsesChannel run hook): the app
    adapts the Responses input into the workflow start executor's own type at the
    call site. Add a typed-brief workflow and a test, and note the seam in spec-003.
    
    * .NET: Drain workflow resume non-blocking to prevent hang and truncation
    
    The resume drain used a SuperStepCompletedEvent{HasPendingRequests} proxy over
    the blocking public WatchStreamAsync. That proxy (a) truncated a resumed turn
    when a superstep both emitted a request and queued downstream work, and (b)
    could fail to fire at all — re-introducing the indefinite hang — when a resume
    input drove no superstep (e.g. a rejected non-chat input).
    
    Make StreamingRun.WatchStreamAsync(bool blockOnPendingRequest, CancellationToken)
    public and drain both the blocking and streaming resume paths with
    blockOnPendingRequest:false, exactly matching the first-turn RunAsync semantics
    (Run.RunToNextHaltAsync). Add guard tests: resume with a rejected input does not
    hang, and a resume superstep with a request plus downstream work is not
    truncated (verified red against the old proxy).
    
    * .NET: Return file-store checkpoint index in commit order
    
    CheckpointManager.GetLatestCheckpointAsync takes the last entry of a store's
    index as the head checkpoint. FileSystemJsonCheckpointStore backed its index
    with a HashSet, whose enumeration order is not contractual: after a rollback
    frees and reuses a slot, enumeration can diverge from commit order, so the
    durable read-through could resume a stale checkpoint. Mirror the HashSet with an
    insertion-ordered list and enumerate it from RetrieveIndexAsync so 'latest' is
    reliable. Add a CheckpointManager.GetLatestCheckpointAsync contract test over the
    file store.
    
    Note: the HashSet disorder is only reachable via the internal rollback path, so
    the test locks the ordering contract rather than reproducing the rare disorder.
    
    * .NET: Advance cursor when a streaming resume is abandoned
    
    RunOrResumeStreamingAsync recorded the head checkpoint only after the stream was
    fully enumerated. If an SSE consumer disconnected mid-turn after supersteps had
    committed, the in-memory cursor kept the previous turn's head; because the next
    turn is then a cursor hit, durable read-through could not self-heal, so it
    resumed pre-disconnect state. Record the run's last committed checkpoint in a
    finally so an abandoned stream still advances the cursor. Add a red/green test.
    
    * .NET: Stream only the final agent's updates in the workflow sample
    
    ExtractUpdates streamed every agent's updates, so the sequential Writer->Reviewer
    sample streamed the intermediate draft and the final answer over SSE, differing
    from the non-streaming response (final message only). Filter the streamed updates
    to the final agent so streaming and non-streaming produce the same response.
    Live-verified against Foundry: one output item streamed instead of two.
    
    * .NET: Isolate the holder lock in the concurrency test
    
    The concurrency test asserted the second same-session turn did not enter the
    workflow, which also passes via the engine's concurrent-run ownership guard
    (which faults) rather than the holder lock (which waits). Assert instead that the
    second turn is not completed while the first holds the lock: a fault would
    complete the task, so a pending task isolates the holder lock from the engine
    guard. Verified red with the lock removed.
    
    * Fix IDE1006 naming in tests; address review feedback and add hosting/live tests
    
    * Document commit-order contract for ICheckpointStore.RetrieveIndexAsync
    
    * Restructure hosting samples under af-hosting with client/server split matching Python parity
    
    * Clarify hosting sample README wording and drop Python comparisons
    
    * Make AgentSessionStore.DeleteSessionAsync abstract and rename session id parameter to sessionStoreId
    
    * Rename OpenAIResponses id helpers and parse the request once for id extraction
    
    * Reclaim per-session locks in HostedAgentState and demonstrate session locking in the agent sample
    
    * Internalize per-session locking in HostedAgentState (automatic, on by default) and remove mirroring-Python wording from code and spec
    
    * Remove HostedAgentState; app-owned routes use AgentSessionStore directly
    
    HostedAgentState only bundled an AIAgent with an AgentSessionStore and, after
    the per-session lock was removed, its GetOrCreateSessionAsync/SaveSessionAsync/
    DeleteSessionAsync were pass-throughs that just bound the agent argument.
    Create-on-miss already lives in the store (unlike Python, whose get/set-only
    SessionStore justifies its AgentState holder), so the type earned its place
    only via the lock.
    
    Each AgentSessionStore.GetSessionAsync now returns an independent session
    instance per call, so concurrent gets fork the same stored state (e.g.
    branching from previous_response_id or managing several conversation ids)
    without sharing an instance. The store does no cross-call locking; serializing
    concurrent runs against the same id is the application's concern.
    
    - Delete HostedAgentState and its unit tests.
    - Rewire the local_responses sample and the OpenAI hosting unit/integration
      tests to call AgentSessionStore (GetSessionAsync/SaveSessionAsync) directly.
    - Update ADR-0032, spec-003, and the af-hosting sample READMEs.
    
    * Isolate hosted session snapshots and distinguish conversation vs response continuation
    
    Mirrors the Python hosted-session isolation work: a hosted session read must be
    an independent copy, and the app-owned route must persist under the right
    continuation key depending on how the caller continued the thread.
    
    - AgentSessionStore.GetSessionAsync: document the isolation invariant (each
      call returns an independent AgentSession so concurrent branches from one
      previous_response_id do not observe each other's mutations or alter stored
      state); fix the stale "or null if not found" wording (in-box stores return a
      fresh created session on miss). The in-box stores already satisfy this via a
      serialize/deserialize snapshot round-trip.
    - local_responses sample + hosting unit-test route: choose the save key by
      channel. A stable conversation id is a mutable head (write back under the
      same id; app owns single-writer coordination). A previous_response_id
      continuation or first turn is an immutable snapshot (save under the new
      response id so branches from the same prior response stay independent).
    - Add regression tests: independent get returns a distinct instance
      (InMemoryAgentSessionStore); previous_response_id supports independent
      branches ([1,2,2,3,3]); conversation id advances the mutable head ([1,2]).
    - Update the sample README and ADR-0032 wording.
    
    * Add workflow-factory support to HostedWorkflowState for concurrent sessions
    
    HostedWorkflowState backed every session with one shared Workflow instance and
    serialized all turns through a lock, so independent sessions could not run
    concurrently. Add a workflow-factory constructor and remove the run lock.
    
    - New constructor HostedWorkflowState(Func<CancellationToken, ValueTask<Workflow>>
      workflowFactory, ..., bool cacheWorkflow = false):
      - cacheWorkflow: false (default) builds a fresh instance per run, so independent
        sessions run in parallel. A resume rehydrates a fresh instance from the
        session's checkpoint in the shared store.
      - cacheWorkflow: true builds the workflow once, lazily on first use, and reuses
        it (a deferred, cached target that, like a shared instance, cannot run
        concurrent turns).
    - Remove the internal SemaphoreSlim run lock and IDisposable; the instance
      constructor is unchanged in behaviour (one shared instance still cannot run
      concurrent turns). Turns are no longer serialized by the holder; a single
      writer per session is the application's responsibility.
    - Switch the local_responses_workflow sample to the factory constructor with an
      explicit cacheWorkflow: false, and document the option.
    - Add tests: parallel independent sessions (factory), fresh-instance resume,
      cached factory builds once and reuses, uncached factory builds per run.
    - Update ADR-0032, spec-003, and the sample README.
    
    * Clarify in ADR-0032 how .NET covers AgentState factory and async-setup via DI
    
    * Rebuild cached workflow after a faulted build and add checkpoint index dedup tests
    rogerbarreto authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    1f1da1b View commit details
    Browse the repository at this point in the history
  5. .NET: Fix declarative autosend output (#7217)

    * Fix declarative workflow auto-send output
    
    Restore completed responses for workflow-conversation agents while preventing hosted workflow adapters from materializing streamed responses twice.
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    * Correlate streamed workflow responses by message
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    * Handle empty streaming message IDs
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    * Restore workflow conversation auto-send
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    * Address workflow response review feedback
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    * Ignore whitespace workflow message IDs
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    * Correlate all content-bearing agent updates
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f
    
    ---------
    
    Co-authored-by: Ben Thomas <[email protected]>
    alliscode and alliscode authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    bfc73a5 View commit details
    Browse the repository at this point in the history
  6. Updating dotnet version for release. (#7265)

    Co-authored-by: Ben Thomas <[email protected]>
    alliscode and alliscode authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    12b2325 View commit details
    Browse the repository at this point in the history
  7. .NET: Added GettingStarted example demonstrating Dapr as an agent pro…

    …vider (#1615)
    
    * Added example demonstrating creating an AIAgent using the Microsoft.AI.Extensions implementation of IChatClient using Dapr as the inference backend provider - in this example, using Ollama
    
    Signed-off-by: Whit Waldo <[email protected]>
    
    * Update dotnet/samples/GettingStarted/AgentProviders/Agent_With_Dapr/README.md
    
    Co-authored-by: Copilot <[email protected]>
    
    * Added copyright statement at top of file
    
    Signed-off-by: Whit Waldo <[email protected]>
    
    * Update dotnet/agent-framework-dotnet.slnx
    
    That's odd the IDE added it a second time.
    
    Co-authored-by: westey <[email protected]>
    
    * Address review nits: configurable Dapr gRPC endpoint and document VersionOverride
    
    Make the Dapr sidecar gRPC endpoint configurable via the DAPR_GRPC_ENDPOINT environment variable
    (defaulting to http://localhost:3501) and document it in the README. Add a comment explaining why the
    Microsoft.Extensions.* VersionOverride entries are needed and when they can be removed.
    
    ---------
    
    Signed-off-by: Whit Waldo <[email protected]>
    Co-authored-by: Copilot <[email protected]>
    Co-authored-by: westey <[email protected]>
    Co-authored-by: Roger Barreto <[email protected]>
    4 people authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    ddb0622 View commit details
    Browse the repository at this point in the history
  8. Python: Support prompt cache breakpoints for GPT-5.6 models in OpenAI…

    … clients (#7163)
    
    * Python: Support prompt cache breakpoints for GPT-5.6 models in OpenAI clients
    
    Add request-level prompt_cache_options to OpenAIChatOptions and
    OpenAIChatCompletionOptions, and forward a per-part prompt_cache_breakpoint
    from Content.additional_properties onto the content blocks each API supports.
    Text parts that carry a breakpoint keep typed list content, since the
    plain-string form cannot hold one; without a breakpoint the existing string
    forms are unchanged.
    
    * Clarify system-message content-shape comment
    
    * Address review: SDK prompt cache types, private helper, add sample
    
    Replace the custom PromptCacheOptions TypedDict with the openai SDK's own
    types for each API, which raises the openai floor to 2.45.0 where those
    types were introduced. Make the breakpoint helper private to the two chat
    clients. Add a prompt caching sample with a README entry, and unquote the
    helper's Content annotation so the pyupgrade hook passes.
    
    * Guard the prompt cache options import for older openai versions
    
    The SDK's PromptCacheOptions types only exist in openai 2.45.0 and
    later, so each client falls back to a local mirror when the import
    fails and the dependency floor stays at 2.25.0. A TYPE_CHECKING-only
    import is not enough because the options classes are introspected with
    get_type_hints() at runtime. Verified against openai 2.25.0: the
    package imports, the fallback resolves, and part-level breakpoints
    still work; sending the option itself requires 2.45.0, which the field
    docstrings now note.
    
    * Make the old-openai fallback for PromptCacheOptions deliberately empty
    
    Assigning None instead, as suggested in review, trips pyright's
    reportInvalidTypeForm on the field annotation (the symbol becomes
    type | None after the try/except). An empty TypedDict gives the same
    effect for users on older openai versions: any content they put in
    prompt_cache_options is flagged by their type checker, since the
    option cannot be sent on those versions anyway, while
    get_type_hints() on the options classes keeps working at runtime.
    
    * Guard prompt_cache_options at runtime instead of via an empty fallback type
    
    The empty-TypedDict fallback flagged valid `prompt_cache_options` usage under
    pyright on every openai version — including this PR's own
    `client_prompt_caching.py` sample (`poe check -S`) — because pyright resolves the
    try/except symbol to the fallback shape regardless of the installed openai, while
    mypy/ty resolve the failed import to `Any` and never warn. So a type-only "warn on
    old openai" signal is not achievable cleanly across type checkers.
    
    Restore the faithful fallback (mirrors the SDK's `mode`/`ttl` shape) so the option
    type-checks identically on every supported openai version, and add a runtime guard:
    setting `prompt_cache_options` on openai < 2.45 now raises a clear
    ChatClientInvalidRequestException instead of forwarding an unusable option to the
    SDK. This keeps the option non-silent for all users regardless of type checker,
    without forcing an openai upgrade. Adds tests covering the guard for both clients.
    
    * Gate system/developer breakpoint shape on a real mapping value
    
    The system/developer branch switched to list-form content whenever
    prompt_cache_breakpoint was set to any non-None value, but the option is
    only attached when the value is a mapping. A malformed value (e.g. a
    string) therefore changed the message shape without adding a breakpoint.
    Decide the shape from the built part instead, matching the user-role path.
    Mordris authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    6180272 View commit details
    Browse the repository at this point in the history
  9. .NET: Fix expensive logging (#7268)

    * .NET: Guard workflow warning logging
    
    Avoid unnecessary structured logging argument evaluation when warning logging is disabled, resolving CA1873 in release builds.
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: 0bc01e26-22ba-42ce-ac1e-6fe166500f4f
    
    * .NET: Use generated workflow logging
    
    Align the no-progress warning with the repository-standard LoggerMessage source generator pattern.
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: 0bc01e26-22ba-42ce-ac1e-6fe166500f4f
    
    * Potential fix for pull request finding
    
    Co-authored-by: Copilot Autofix powered by AI <[email protected]>
    
    ---------
    
    Co-authored-by: Ben Thomas <[email protected]>
    Co-authored-by: Copilot Autofix powered by AI <[email protected]>
    Copilot-Session: 0bc01e26-22ba-42ce-ac1e-6fe166500f4f
    3 people authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    c68c099 View commit details
    Browse the repository at this point in the history
  10. Python: Fix stateless replay of reasoning-paired tool calls (#7233)

    * Python: Fix reasoning-paired client tool replay
    
    * Python: Handle middleware-terminated reasoning tool loops
    
    * Python: Replay encrypted reasoning function groups
    
    Key decisions:
    - Request encrypted reasoning on client-managed Responses calls while preserving caller include values.
    - Store encrypted payloads in Content.protected_data and reconstruct one provider reasoning item per reasoning id.
    - Replay active and completed function call/result groups; retain continuation-owned history behavior and the existing orphan-safe MCP path.
    
    Files changed:
    - python/packages/openai/agent_framework_openai/_chat_client.py
    - python/packages/openai/tests/openai/test_openai_chat_client.py
    
    Next iteration:
    - Extend encrypted reasoning preservation to streaming and framework serialization boundaries.
    
    Co-authored-by: Copilot <[email protected]>
    
    * Python: Preserve encrypted reasoning through streaming
    
    Key decisions:
    - Capture encrypted reasoning from terminal streamed output items in Content.protected_data.
    - Preserve summary and private reasoning as distinct framework contents while reconstructing one provider reasoning item per id.
    - Prove replay after Message JSON and workflow checkpoint round trips, including encrypted-only and completed function groups.
    
    Files changed:
    - python/packages/core/agent_framework/_types.py
    - python/packages/openai/agent_framework_openai/_chat_client.py
    - python/packages/openai/tests/openai/test_openai_chat_client.py
    
    Next iteration:
    - Extend lossless stateless reasoning replay to hosted MCP call/output groups.
    
    Co-authored-by: Copilot <[email protected]>
    
    * Python: Replay hosted MCP reasoning groups
    
    Key decisions:
    - Preserve hosted MCP call/output groups in client-managed history instead of deleting them when reasoning cannot be reconstructed.
    - Keep call/result coalescing and orphan-result exclusion intact, while retaining continuation-owned duplicate avoidance.
    - Cover completed, active, and multi-call reasoning groups plus the public outgoing request boundary.
    
    Files changed:
    - python/packages/openai/agent_framework_openai/_chat_client.py
    - python/packages/openai/tests/openai/test_openai_chat_client.py
    
    Next iteration:
    - Preserve middleware-terminated and parallel function groups atomically.
    - Add preflight rejection for non-replayable reasoning groups in the dedicated validation slice.
    
    Co-authored-by: Copilot <[email protected]>
    
    * Python: Preserve terminated parallel reasoning groups
    
    Key decisions:
    - Return ordinary function results when middleware terminates a loop, removing the provider-specific durable marker.
    - Preserve every parallel call and available sibling result as one encrypted reasoning group in stateless replay.
    - Prove successful and policy-blocked batches through the public two-agent Foundry workflow and outgoing HTTP boundary.
    
    Files changed:
    - python/packages/core/agent_framework/_tools.py
    - python/packages/core/tests/core/test_function_invocation_logic.py
    - python/packages/openai/tests/openai/test_openai_chat_client.py
    - python/packages/foundry/tests/foundry/test_foundry_agent.py
    
    Next iteration:
    - Add preflight rejection for non-replayable and partially compacted reasoning groups.
    
    Co-authored-by: Copilot <[email protected]>
    
    * Python: Reject unsafe stateless reasoning replay
    
    Key decisions:
    - Validate client-managed reasoning groups after compaction and report every affected reasoning and call identifier before transport.
    - Permit service-owned continuation and fully excluded atomic groups while rejecting partial compaction projections.
    - Surface encrypted-reasoning capability failures without lossy retries.
    
    Files changed:
    - python/packages/openai/agent_framework_openai/_chat_client.py
    - python/packages/openai/tests/openai/test_openai_chat_client.py
    
    Next iteration:
    - Run the resource-specific Foundry proof and finish PR #7233; that live proof remains intentionally local and requires the configured developer resource.
    
    Co-authored-by: Copilot <[email protected]>
    
    * Python: Preserve reasoning metadata in Foundry hosting
    
    * Python: Avoid duplicating reasoning text metadata
    
    * Python: Gate encrypted reasoning for Foundry agents
    
    * Python: Type stateless reasoning integration test
    
    * Python: Narrow Foundry mock call arguments
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
    moonbox3 and Copilot authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    a2927c1 View commit details
    Browse the repository at this point in the history
  11. Reduce workflow credential exposure (#7270)

    * Mask workflow authentication configuration
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    
    * Use run-scoped Copilot authentication
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    moonbox3 and Copilot authored Jul 22, 2026
    Configuration menu
    Copy the full SHA
    2d34dee View commit details
    Browse the repository at this point in the history

Commits on Jul 23, 2026

  1. Python: Enforce package coverage by lifecycle (#7261)

    * Enforce Python coverage by package lifecycle
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0
    
    * Fix Python CI and deprecation usage
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0
    
    * Make POSIX kill-tree test portable
    
    Co-authored-by: Copilot <[email protected]>
    
    Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0
    eavanvalkenburg and Copilot authored Jul 23, 2026
    Configuration menu
    Copy the full SHA
    5147579 View commit details
    Browse the repository at this point in the history
  2. Restore dedicated DevFlow Copilot authentication (#7276)

    Co-authored-by: Copilot <[email protected]>
    Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479
    moonbox3 and Copilot authored Jul 23, 2026
    Configuration menu
    Copy the full SHA
    bd17a64 View commit details
    Browse the repository at this point in the history
  3. Bump Python package versions for 1.12.1 release (#7273)

    Bump root and core to 1.12.1, OpenAI to 1.11.0 for new public prompt-cache options, Foundry to 1.10.3, and Gemini and Foundry Hosting to beta 260722 based on CHANGELOG entries. Promote AG-UI from 1.0.0rc9 to stable 1.0.0. No beta cohort bump was applied, and core floors remain unchanged under the strict affected-dependency policy because the connectors do not require a new core API.
    moonbox3 authored Jul 23, 2026
    Configuration menu
    Copy the full SHA
    711d6f2 View commit details
    Browse the repository at this point in the history
Loading