Skip to content

Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder)#419

Merged
james-tn merged 8 commits into
int-agenticfrom
copilot/migrate-to-agent-framework-1-2-1
Apr 28, 2026
Merged

Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder)#419
james-tn merged 8 commits into
int-agenticfrom
copilot/migrate-to-agent-framework-1-2-1

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 28, 2026

Migrates the workshop from agent-framework==1.0.0rc1 to agent-framework==1.2.1, including a deeper rewrite of the multi-domain handoff agent on top of the now-native HandoffBuilder orchestration.

Investigation: what changes between 1.0.0rc1 and 1.2.1

Verified pip install agent-framework==1.2.1 succeeds and inspected the installed package source. Three things matter for this codebase:

Area 1.0.0rc1 1.2.1
Chat client agent_framework.azure.AzureOpenAIChatClient(deployment_name=…, endpoint=…) agent_framework.openai.OpenAIChatClient(model=…, azure_endpoint=…) — single unified client; auto-routes to Azure when azure_endpoint (or credential) is passed
CheckpointStorage protocol save_checkpoint, load_checkpoint, delete_checkpoint; WorkflowCheckpoint.workflow_id save, load, delete, get_latest; listing methods now require keyword-only workflow_name; WorkflowCheckpoint.workflow_name
Handoff orchestration not in framework — workshop hand-rolled an intent classifier + regex pattern matching + manual context-prefix builder (~782-line agent) first-class agent_framework_orchestrations.HandoffBuilder — auto-injects handoff_to_<target> tools per agent, intercepts via middleware, broadcasts shared conversation, emits handoff_sent events, supports checkpointing

Other APIs in active use (Agent, AgentSession, ChatOptions, MCPStreamableHTTPTool, MagenticBuilder, WorkflowEvent, etc.) remain compatible.

What this PR does

Dependency pins (4 files)

  • agentic_ai/applications/pyproject.toml, agentic_ai/applications/requirements.txt (regenerated with uv pip compile)
  • agentic_ai/workflow/fraud_detection_durable/pyproject.toml
  • agentic_ai/agents/mcp_agent_demo/pyproject.toml — replaces the older agent-framework-core>=0.2.0 + agent-framework-orchestrations>=0.1.0 split with the unified agent-framework==1.2.1 umbrella

Mechanical chat-client migration (13 files)
from agent_framework.azure import AzureOpenAIChatClientfrom agent_framework.openai import OpenAIChatClient, with deployment_name=model= and endpoint=azure_endpoint=. Affects single_agent.py, magentic_group.py, reflection_agent.py, all 7 mcp_agent_demo modules, fraud_detection_durable/{worker,fraud_analysis_workflow}.py, and observability/sample_agent_with_tracing.py.

Deeper migration: handoff agent rewrite
agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py is rewritten on top of HandoffBuilder. The hand-rolled intent classifier (Pydantic structured output), regex-based handoff phrase detection, and manual _build_context_prefix are gone. The new flow:

  1. One Agent per domain, configured with a filtered MCP tool set and require_per_service_call_history_persistence=True (required by HandoffBuilder).
  2. HandoffBuilder with default mesh topology — every specialist can hand off to every other specialist via auto-generated handoff_to_<target> tools that the LLM decides to call.
  3. Cross-request continuity via with_checkpointing(_DictCheckpointStorage), with the storage backed by the per-session state_store. First turn → workflow.run(prompt, stream=True); subsequent turns → workflow.run(responses={pending_id: HandoffAgentUserRequest.create_response(prompt)}, checkpoint_id=…, stream=True).
  4. WebSocket streaming preserved: output events with AgentResponseUpdate data drive agent_token/tool_called; handoff_sent events drive handoff_announcement + a follow-up agent_start. Synthetic handoff_to_* tool calls are filtered from the UI.

The new file is ~510 lines vs ~782 lines before, removing ~200 lines of regex / classifier code.

Checkpoint storage
Both _DictCheckpointStorage (handoff) and DictCheckpointStorage (magentic_group) updated to the 1.2.x CheckpointStorage protocol. magentic_group._purge_checkpoint_storage updated to use delete and the new keyword-only workflow_name.

Tests
tests/test_agent_framework_rc1_regression.pytests/test_agent_framework_1_2_1_regression.py. Added coverage for the unified OpenAIChatClient (Azure routing, kwarg names), the native HandoffBuilder integration, the new CheckpointStorage protocol shape, and a save/load/get_latest roundtrip on DictCheckpointStorage. All 61 tests pass.

Docs

  • agentic_ai/agents/mcp_agent_demo/README.md — dependency table updated to the unified package.
  • agentic_ai/agents/agent_framework/multi_agent/HANDOFF_README.md — rewritten end-to-end to describe the new tool-based handoff flow (architecture diagram, configuration, sample multi-turn trace).

Validation

  • pytest tests/test_agent_framework_1_2_1_regression.py → 61 passed against agent-framework==1.2.1.

  • All migrated modules import cleanly with no fallback to legacy attributes.

  • GPT-5.5 review (run via the task subagent with model=gpt-5.5) surfaced 4 substantive bugs that an LLM-driven review would have shipped if not caught:

    1. _DictCheckpointStorage implemented obsolete save_checkpoint/load_checkpoint and referenced removed WorkflowCheckpoint.workflow_id.
    2. DictCheckpointStorage (magentic_group) had the same protocol drift, plus a stale delete_checkpoint reference in _purge_checkpoint_storage.
    3. reflection_agent.py built OpenAIChatClient(**client_kwargs) from a dict whose keys still said "deployment_name"/"endpoint" (the migration regex matched only Python kwarg syntax).
    4. observability/sample_agent_with_tracing.py still imported the removed ChatAgent, used the old chat_client=/thread/run_stream API, and had two undefined locals from a regex-misfire.

    All four issues are fixed in this PR, and new regression tests lock in the protocol shape so they cannot silently regress.

  • parallel_validation (Code Review + CodeQL): CodeQL clean (0 alerts); 7 minor PEP 8 spacing comments in mcp_agent_demo modules addressed.

Things to be aware of

  • Native handoff is agent-driven: each specialist's instructions explicitly tell it to call the appropriate handoff_to_<target> tool when a request is out of domain. The legacy HANDOFF_LAZY_CLASSIFICATION and HANDOFF_CONTEXT_TRANSFER_TURNS env vars are no longer used (workflow shares conversation between specialists automatically).
  • The per-session checkpoint state lives at state_store[f"{session_id}_handoff_state"] and is trimmed to the last 5 checkpoints.
  • No live integration test against Azure OpenAI was run (no credentials in this environment); the regression suite covers the API surface, the agents' construction, the workflow event shape, and the checkpoint storage roundtrip, but real end-to-end MCP + Azure OpenAI behaviour should be smoke-tested manually before merge.

james-tn and others added 7 commits February 23, 2026 18:28
* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>
* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>
…ent kwargs, observability sample

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>
@james-tn
Copy link
Copy Markdown
Contributor

@copilot I re-checked this after the base branch changed to int-agentic. I still see two issues that look worth fixing before merge:

  1. High - uv.lock files still pin the old Agent Framework packages. The migrated pyproject.toml files now require agent-framework==1.2.1, but the committed lockfiles were not regenerated, so the documented uv sync / uv run paths can still install the old APIs. Examples:

    • agentic_ai/applications/pyproject.toml:8 says agent-framework==1.2.1, but agentic_ai/applications/uv.lock:42 still locks agent-framework to 1.0.0rc1, and agentic_ai/applications/uv.lock:586 still records the project specifier as ==1.0.0rc1.
    • agentic_ai/workflow/fraud_detection_durable/pyproject.toml:9 says agent-framework==1.2.1, but agentic_ai/workflow/fraud_detection_durable/uv.lock:42 still locks 1.0.0rc1, and agentic_ai/workflow/fraud_detection_durable/uv.lock:1098 still has the older durabletask specifier.
    • agentic_ai/agents/mcp_agent_demo/pyproject.toml:8 switches to the umbrella agent-framework==1.2.1, but agentic_ai/agents/mcp_agent_demo/uv.lock:896-897 still records the old split agent-framework-core / agent-framework-orchestrations specs.
  2. Medium - custom Magentic checkpoint storage resume can silently fail under the 1.2.x protocol. DictCheckpointStorage.list_checkpoints, list_checkpoint_ids, and get_latest now require keyword-only workflow_name, but _get_latest_checkpoint_id() still calls the fallback methods without that keyword at agentic_ai/agents/agent_framework/multi_agent/magentic_group.py:1127 and agentic_ai/agents/agent_framework/multi_agent/magentic_group.py:1141. Those TypeErrors are swallowed, so custom storage implementations that follow only the 1.2.x protocol and do not expose the nonstandard latest_checkpoint_id property will fail to find resumable checkpoints.

Validation notes: confirmed PR 419 now targets int-agentic; earlier git diff --check origin/main...origin/pr/419 was clean, and I re-inspected the affected dependency/checkpoint paths on the PR branch after the base retarget.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 28, 2026

@copilot I re-checked this after the base branch changed to int-agentic. I still see two issues that look worth fixing before merge:

  1. **High - uv.lock files still pin the old Agent Framework pack...

Both fixed in 038dfb6:

  1. Regenerated all three uv.lock files with uv lock. agent-framework is now 1.2.1 in agentic_ai/applications/uv.lock, agentic_ai/workflow/fraud_detection_durable/uv.lock, and agentic_ai/agents/mcp_agent_demo/uv.lock (the last one also dropped the split agent-framework-core / agent-framework-orchestrations specifiers in favor of the umbrella package).

  2. _get_latest_checkpoint_id now resolves the workflow name via _workflow_name_for_storage and passes workflow_name= to get_latest / list_checkpoints / list_checkpoint_ids. It also tries get_latest first (the 1.2.x shortcut) before falling back to listing. Added test_get_latest_checkpoint_id_uses_workflow_name_kwarg, which exercises a storage exposing only the 1.2.x protocol; full suite is 62/62 green.

Copilot AI requested a review from james-tn April 28, 2026 17:13
@james-tn james-tn marked this pull request as ready for review April 28, 2026 17:16
@james-tn james-tn merged commit 8dc4983 into int-agentic Apr 28, 2026
12 of 13 checks passed
james-tn added a commit that referenced this pull request Apr 28, 2026
* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

* Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) (#419)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Bump agent-framework to 1.2.1 and migrate AzureOpenAIChatClient → OpenAIChatClient

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Rewrite handoff agent on native HandoffBuilder; update regression tests for 1.2.1

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Update HANDOFF_README and dependency table for native HandoffBuilder migration

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Address GPT-5.5 review: fix CheckpointStorage protocol, reflection_agent kwargs, observability sample

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Fix PEP 8 spacing in mcp_agent_demo files (code review nits)

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Regenerate uv.lock files; pass workflow_name to 1.2.x checkpoint listing

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/91307ce7-2444-4b5f-b75f-2b736bc022c5

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James Nguyen <janguy@microsoft.com>
Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>
james-tn added a commit that referenced this pull request Apr 28, 2026
…odel=…) for agent-framework 1.2.1 (#421)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#420)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

* Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) (#419)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Bump agent-framework to 1.2.1 and migrate AzureOpenAIChatClient → OpenAIChatClient

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Rewrite handoff agent on native HandoffBuilder; update regression tests for 1.2.1

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Update HANDOFF_README and dependency table for native HandoffBuilder migration

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Address GPT-5.5 review: fix CheckpointStorage protocol, reflection_agent kwargs, observability sample

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Fix PEP 8 spacing in mcp_agent_demo files (code review nits)

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Regenerate uv.lock files; pass workflow_name to 1.2.x checkpoint listing

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/91307ce7-2444-4b5f-b75f-2b736bc022c5

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James Nguyen <janguy@microsoft.com>
Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Fix ChatOptions key for agent-framework 1.2.1 (model_id → model)

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/f921a448-fe80-4a39-8834-6b0ee615f1d1

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James Nguyen <janguy@microsoft.com>
Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>
Co-authored-by: copilot <copilot@github.com>
james-tn added a commit that referenced this pull request Apr 28, 2026
* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

* Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) (#419)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Bump agent-framework to 1.2.1 and migrate AzureOpenAIChatClient → OpenAIChatClient

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Rewrite handoff agent on native HandoffBuilder; update regression tests for 1.2.1

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Update HANDOFF_README and dependency table for native HandoffBuilder migration

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Address GPT-5.5 review: fix CheckpointStorage protocol, reflection_agent kwargs, observability sample

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Fix PEP 8 spacing in mcp_agent_demo files (code review nits)

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Regenerate uv.lock files; pass workflow_name to 1.2.x checkpoint listing

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/91307ce7-2444-4b5f-b75f-2b736bc022c5

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James Nguyen <janguy@microsoft.com>
Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* docs: Remove misleading RequestInfoExecutor references (#418)

doc update

* Fix backend 500s by renaming ChatOptions(model_id=…) to ChatOptions(model=…) for agent-framework 1.2.1 (#421)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#420)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

* Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) (#419)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production …
james-tn added a commit that referenced this pull request Apr 28, 2026
…2.1 storages (#423)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

* Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) (#419)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Bump agent-framework to 1.2.1 and migrate AzureOpenAIChatClient → OpenAIChatClient

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Rewrite handoff agent on native HandoffBuilder; update regression tests for 1.2.1

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Update HANDOFF_README and dependency table for native HandoffBuilder migration

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Address GPT-5.5 review: fix CheckpointStorage protocol, reflection_agent kwargs, observability sample

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Fix PEP 8 spacing in mcp_agent_demo files (code review nits)

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/b1edc1aa-9c20-46c5-afdc-0256050a03de

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Regenerate uv.lock files; pass workflow_name to 1.2.x checkpoint listing

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/91307ce7-2444-4b5f-b75f-2b736bc022c5

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

---------

Co-authored-by: James Nguyen <janguy@microsoft.com>
Co-authored-by: James N. <james.nguyen@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* docs: Remove misleading RequestInfoExecutor references (#418)

doc update

* Replace custom DictCheckpointStorage with built-in 1.2.1 storages

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/f6da6e3e-b288-425d-ac4d-c7ba6fe62fe7

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* tests: use asyncio.run() instead of new/get_event_loop()

Agent-Logs-Url: https://github.com/microsoft/OpenAIWorkshop/sessions/f6da6e3e-b288-425d-ac4d-c7ba6fe62fe7

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>

* Fix backend 500s by renaming ChatOptions(model_id=…) to ChatOptions(model=…) for agent-framework 1.2.1 (#421)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#416)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* Promote: int-agentic → main (production) (#420)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment after successful auto-merge to int-agentic.
   Only dev environments are destroyed; production is retained.

* Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup

* Fix: iterate ResponseStream directly, not .updates

ResponseStream is AsyncIterable - iterate with 'async for chunk in stream:'
The .updates property returns a Sequence (list), not an async iterator.
This caused TypeError: 'async for' requires __aiter__, got list.

Not caught in local tests because unit tests mocked the streaming and
the regression tests verified API signatures but didn't run live agents.

* Fix: make integration test failures block the pipeline

Removed continue-on-error: true from the pytest step so test failures
actually fail the workflow. Previously, 5/7 tests could fail and the
pipeline would still report success and proceed to auto-merge.

* Fix: use SHA-tagged images for container deployment, not :latest

Container Apps don't create a new revision when the image tag is unchanged.
Using :latest meant the old container kept running even after a new image
was pushed. Now passes github.sha as the image tag, which forces a new
revision on every deploy.

This was the root cause of the ResponseStream.updates bug reaching
production - the integration tests ran against old containers.

* Skip MCP localhost check in CI mode

In CI, the evaluation talks to the backend via HTTP which connects to
the deployed MCP container internally. The localhost:8000 check is only
useful for local dev and was producing a confusing warning in CI logs.

* Fix: auto-merge creates PR if none exists

Previously auto-merge only looked for an existing open PR and skipped
if none was found. Now it auto-creates a PR from the dev branch to
int-agentic if one doesn't exist, then merges it. This ensures every
successful pipeline run promotes code to int-agentic regardless of
whether a PR was manually created beforehand.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22330447642

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22334055353

* Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) (#419)

* Promote: int-agentic → main (production) (#414)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* Updating Durable Agent Implementation (#404)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* chore: reduce anomaly probability to 1% for controlled demo pace

* Reduce anomaly probability to 1% for controlled demo pace (#406)

* update fraud_detection_durable to feb 12 agent-framework

* enhance fraud detection durable

* update readme

* chore: reduce anomaly probability to 1% for controlled demo pace

---------

Co-authored-by: James N. <james.nguyen@microsoft.com>

* add mcp_agent_demo

* Add hybrid MCP server (strict-schema + natural-language tools) and typed-contract workflow

Scripts 6-8 for the MCP agent demo:

- workflow_typed_contracts.py: 4-agent IT security incident response pipeline
  with Pydantic-enforced contracts at every boundary (SecurityAlert,
  ThreatAssessment, ImpactAnalysis, IncidentResponse)

- mcp_server_hybrid.py: Single MCP endpoint exposing BOTH tool types:
  * Strict-schema: triage_alert, assess_threat, create_response (Pydantic)
  * Natural-language: ask_security_advisor, explain_for_customer (prose)
  * Shared session state across all tools

- mcp_client_hybrid.py: 5-step incident flow using both tool types with
  explicit context passing between steps

- README.md: Updated from 6 to 8 capabilities with Hybrid Mode architecture
  diagram and Quick Start sections 7-8

* Replace workflow_local_remote.py with simplified proxy agent (Script 3)

- Delete workflow_local_remote.py (old Script 3 with extra LLM call)
- Add workflow_proxy_agent.py: MCPProxyAgent (BaseAgent, no LLM)
  calls MCP tools directly via call_tool()  zero local LLM overhead
- Simplify MCPProxyAgent: extract common _call() method, module-level
  _last_text() helper, remove verbose static methods
- Fix workflow_typed_contracts.py: add async with context managers
- Update README: merge Script 9 into Script 3 position, update
  architecture diagram, Quick Start, How It Works sections

* Clean up MCP demos: remove comparison commentary, drop typed-contracts

- workflow_proxy_agent.py: remove 'traditional vs proxy' framing
  MCPProxyAgent is the standard approach for remote agent integration
- Delete workflow_typed_contracts.py: not relevant to MCP integration
- README: 7 scripts, renumber hybrid 6-7, remove typed-contract sections

* Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)

- mcp_server_langgraph.py: LangGraph ReAct agent exposed as MCP server
  on port 8003 with architecture tools (pattern eval, migration estimate,
  tech stack recommendation)
- workflow_group_chat.py: MAF GroupChatBuilder orchestration with LLM
  planner routing between local BusinessStrategist (MAF) and remote
  TechnicalArchitect (LangGraph via MCP)
- pyproject.toml: add langgraph, langchain-openai, langchain-core deps
- README.md: update to 9 scripts, add cross-framework architecture
  diagram, Quick Start sections, and dependency table entries

* MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy agent, finalize group chat with inline Planner

* README: Mermaid diagrams, professional tone, remove LinkedIn teasing language

* README: reframe around multi-framework interop problem, two design patterns (Agent-as-Tool + Agent Adapter), add conceptual architecture

* README: fix Mermaid diagrams - use br tags instead of \n for line breaks

* README: fix A2A comparison table - elicitation supported, structured schemas not

* Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2

Breaking changes migrated:
- agent-framework 1.0.0rc1: ChatAgent->Agent, AgentThread->AgentSession,
  run_stream->run(stream=True), model->default_options(ChatOptions),
  WorkflowOutputEvent/AgentRunEvent/RequestInfoEvent->unified WorkflowEvent,
  MagenticBuilder now uses constructor kwargs, orchestrations moved to
  agent_framework_orchestrations package
- fastmcp 3.0.2: removed mcp version pin (now pulled by fastmcp),
  no code changes needed (fully compatible)

Files updated:
- agentic_ai/agents/agent_framework/single_agent.py
- agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py
- agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py
- agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
- agentic_ai/applications/pyproject.toml (agent-framework==1.0.0rc1)
- agentic_ai/workflow/fraud_detection_durable/pyproject.toml (agent-framework==1.0.0rc1)
- mcp/pyproject.toml (fastmcp==3.0.2)
- tests/test_agent_framework_rc1_regression.py (51 regression tests, all passing)

* Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1

The Docker build uses requirements.txt (not pyproject.toml/uv.lock), and it
still had agent-framework-core==1.0.0b260130 pinned, which conflicts with
agent-framework==1.0.0rc1 requiring agent-framework-core==1.0.0rc1.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22315210980

* Fix: use GH_PAT for auto-merge to trigger downstream workflows

Pushes made by GITHUB_TOKEN don't trigger other workflows (GitHub
Actions limitation to prevent infinite loops). This meant the auto-merge
into int-agentic never triggered promote-to-main.yml.

Now uses secrets.GH_PAT with fallback to GITHUB_TOKEN so:
1. If GH_PAT is configured: merge triggers promote-to-main.yml
2. If not: merge still works, but promotion PR must be created manually

* Add workflow_dispatch trigger to promote-to-main

Allows manual triggering when auto-trigger is missed (e.g. after
GITHUB_TOKEN-based merges that don't fire downstream workflows).

* Fix: Cosmos DB auth + remove phantom reflection_workflow_agent

1. MCP Cosmos DB: Replace AzureCliCredential (not available in containers)
   with ManagedIdentityCredential (when AZURE_CLIENT_ID is set) or
   DefaultAzureCredential as fallback. This fixes the 'Azure CLI not
   found on path' error in production Container Apps.

2. Backend: Remove reflection_workflow_agent from DEFAULT_AVAILABLE_AGENTS
   and descriptions - the module file doesn't exist, causing it to show
   as a broken option in the UI agent selector.

* chore: merge james-dev into int-agentic (auto)

Auto-merged after successful CI/CD pipeline run 22321497108

* Fix promote-to-main + auto-destroy dev environments

1. promote-to-main.yml: Use GH_PAT instead of GITHUB_TOKEN so the
   workflow can create PRs (GITHUB_TOKEN lacks permission for this
   in repos with branch protection).

2. orchestrate.yml: Add Step 8 auto-destroy that tears down the
   integration-* environment…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants