Skip to content

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

Merged
james-tn merged 5 commits intoint-agenticfrom
copilot/fix-integration-test-failure
Apr 28, 2026
Merged

Fix backend 500s by renaming ChatOptions(model_id=…) to ChatOptions(model=…) for agent-framework 1.2.1#421
james-tn merged 5 commits intoint-agenticfrom
copilot/fix-integration-test-failure

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 28, 2026

Investigate and fix integration test failure on int-agentic (run 25067397984).

Root cause: After migrating to agent-framework==1.2.1, the ChatOptions TypedDict renamed model_idmodel. The unknown model_id key was forwarded to the OpenAI Responses API, raising:

TypeError: AsyncResponses.create() got an unexpected keyword argument 'model_id'

This bubbled up as ChatClientException from Agent.chat_async, surfacing as HTTP 500 on /chat and breaking the 5 backend integration tests.

  • Reproduce locally and identify root cause
  • Replace ChatOptions(model_id=...) with ChatOptions(model=...) in all 5 occurrences
    • 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/magentic_group.py
    • agentic_ai/agents/agent_framework/multi_agent/reflection_agent.py (2 sites)
  • Verify locally that the model_id TypeError no longer occurs
  • Run parallel validation (Code Review + CodeQL) — both passed with 0 issues
  • Resolve merge conflict with int-agentic (kept ChatOptions(model=...) in handoff_multi_domain_agent.py)

james-tn and others added 4 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>
* 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>
…tegration-test-failure

# Conflicts:
#	agentic_ai/agents/agent_framework/multi_agent/handoff_multi_domain_agent.py

Co-authored-by: james-tn <25941658+james-tn@users.noreply.github.com>
Copilot AI requested a review from james-tn April 28, 2026 17:57
@james-tn james-tn marked this pull request as ready for review April 28, 2026 17:57
@james-tn james-tn merged commit a3a5035 into int-agentic Apr 28, 2026
2 checks passed
@james-tn
Copy link
Copy Markdown
Contributor

Confirmed root cause via the actual PyPI agent-framework==1.2.1 wheel (agent_framework_openai-1.2.1-py3-none-any.whl):

  • OpenAIChatClient.__init__ does accept model, api_key, credential, azure_endpoint, api_version (Azure overload) — so PR Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) #419's switch to OpenAIChatClient(...) was correct.
  • ChatOptions is a TypedDict whose only model field is model (no model_id). Because ChatOptions is total=False, the wrong model_id= key was silently accepted at construction and forwarded into AsyncResponses.create(), where it raises TypeError: unexpected keyword argument 'model_id' → the 500s in run 25067397984.

So this PR's one-line fix in 5 call sites is correct.

I pushed two follow-up commits on top:

  1. test_chat_options_model_idtest_chat_options_model in tests/test_agent_framework_1_2_1_regression.py. The original test only passed because TypedDict accepts unknown keys at runtime; it codified the wrong key and likely contributed to the original migration error. New version asserts model is in ChatOptions.__annotations__ and model_id is not, so a future drift fails at unit-test time instead of as a 500 in production.
  2. magentic_group._validate_configuration required AZURE_OPENAI_API_KEY even though _build_chat_client already has a managed-identity (credential=) branch (a leftover inconsistency vs. single_agent / handoff_multi_domain_agent / reflection_agent). Aligned the validation with the other three agents.

Out-of-scope items called out in the PR description (MCPStreamableHTTPTool headers= / timeout= not in 1.2.1 signature) are real and worth a separate PR.

@james-tn
Copy link
Copy Markdown
Contributor

Confirmed root cause via the actual PyPI agent-framework==1.2.1 wheel:

  • OpenAIChatClient.__init__ does accept model, api_key, credential, azure_endpoint, api_version (Azure overload) — so PR Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuilder) #419's switch to OpenAIChatClient(...) was correct.
  • ChatOptions is a TypedDict whose only model field is model (no model_id). Because ChatOptions is total=False, the wrong model_id= was silently accepted at construction and forwarded into AsyncResponses.create(), raising TypeError: unexpected keyword argument 'model_id' → the 500s in run 25067397984.

The one-line fix in 5 call sites is correct.

I pushed two follow-up commits:

  1. test_chat_options_model_idtest_chat_options_model in tests/test_agent_framework_1_2_1_regression.py. The original test only passed because TypedDict accepts unknown keys at runtime; it codified the wrong key and likely contributed to the original migration mistake. New version checks ChatOptions.__annotations__ so future drift fails at unit-test time instead of as a 500 in production.
  2. magentic_group._validate_configuration required AZURE_OPENAI_API_KEY even though _build_chat_client has a managed-identity (credential=) branch. Aligned with the three other agents.

Out-of-scope items in the PR description (MCPStreamableHTTPTool headers= / timeout=) are real and worth a separate PR.

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 pushed a commit that referenced this pull request Apr 28, 2026
…_group

1) tests/test_agent_framework_1_2_1_regression.py::test_chat_options_model_id

   incorrectly asserted that ChatOptions(model_id=...) works. ChatOptions is a

   TypedDict(total=False) so unknown keys are silently accepted at construction

   and only blow up downstream when forwarded as kwargs to responses.create().

   Renamed to test_chat_options_model and added an __annotations__ check so the

   test fails loudly if the field is renamed again.

2) magentic_group._validate_configuration required AZURE_OPENAI_API_KEY even

   though _build_chat_client supports managed identity. The other agents

   (single_agent, handoff_multi_domain_agent, reflection_agent) only require

   the deployment/endpoint/version and accept either api_key or credential.

   Aligned magentic_group with that contract so MI-only deployments don't

   raise spurious RuntimeError on every /chat call.

These follow-ups were originally pushed to PR #421 but dropped by its squash

merge. PR #423 already touches both files, so re-applying here.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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