Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e52d463
update fraud_detection_durable to feb 12 agent-framework
Feb 17, 2026
91369f9
enhance fraud detection durable
Feb 19, 2026
ee3f9f2
update readme
Feb 19, 2026
391b2d3
Updating Durable Agent Implementation (#404)
james-tn Feb 19, 2026
85c574f
chore: reduce anomaly probability to 1% for controlled demo pace
Feb 19, 2026
ea5bc41
Merge branch 'int-agentic' into james-dev
james-tn Feb 19, 2026
2c19358
Reduce anomaly probability to 1% for controlled demo pace (#406)
james-tn Feb 19, 2026
6c8527c
add mcp_agent_demo
Feb 19, 2026
3132693
Merge branch 'james-dev' of https://github.com/microsoft/OpenAIWorksh…
Feb 19, 2026
a5394be
Add hybrid MCP server (strict-schema + natural-language tools) and ty…
Feb 19, 2026
3eac2c3
Replace workflow_local_remote.py with simplified proxy agent (Script 3)
Feb 20, 2026
72ad453
Clean up MCP demos: remove comparison commentary, drop typed-contracts
Feb 20, 2026
7487b66
Add LangGraph + MAF GroupChat cross-framework demo (Scripts 8-9)
Feb 20, 2026
e93bc7c
MCP agent demo: rewrite README as MCP-vs-A2A thesis, delete proxy age…
Feb 20, 2026
c4af733
README: Mermaid diagrams, professional tone, remove LinkedIn teasing …
Feb 20, 2026
8dfcd4c
README: reframe around multi-framework interop problem, two design pa…
Feb 20, 2026
b72c14b
README: fix Mermaid diagrams - use br tags instead of \n for line breaks
Feb 20, 2026
5515120
README: fix A2A comparison table - elicitation supported, structured …
Feb 20, 2026
23837d8
Upgrade agent-framework to 1.0.0rc1 and fastmcp to 3.0.2
Feb 23, 2026
82bfbee
Fix CI: regenerate requirements.txt with agent-framework-core==1.0.0rc1
Feb 23, 2026
0cd61f9
chore: merge james-dev into int-agentic (auto)
james-tn Feb 23, 2026
640c3d3
Fix: use GH_PAT for auto-merge to trigger downstream workflows
Feb 23, 2026
c081130
Add workflow_dispatch trigger to promote-to-main
Feb 23, 2026
07af66c
Merge branch 'int-a
Feb 23, 2026
ae60f8a
Merge remote-tracking branch 'origin/main' into int-agentic
Feb 23, 2026
87a77db
Fix: Cosmos DB auth + remove phantom reflection_workflow_agent
Feb 23, 2026
cbadc7d
chore: merge james-dev into int-agentic (auto)
james-tn Feb 23, 2026
d9ef29c
Fix promote-to-main + auto-destroy dev environments
Feb 23, 2026
c7c92e6
Fix promote-to-main + auto-destroy dev environments
Feb 23, 2026
50efa21
Trigger rebuild: deploy Cosmos DB auth fix and agent list cleanup
Feb 23, 2026
cc79a16
Fix: iterate ResponseStream directly, not .updates
Feb 23, 2026
bd24124
Fix: make integration test failures block the pipeline
Feb 23, 2026
e6e5e7e
Fix: use SHA-tagged images for container deployment, not :latest
Feb 23, 2026
d8d49ef
Skip MCP localhost check in CI mode
Feb 23, 2026
6b0abc4
Fix: auto-merge creates PR if none exists
Feb 23, 2026
22cd10b
Merge remote-tracking branch 'origin/james-dev' into int-agentic
Feb 23, 2026
13fd93f
Merge remote-tracking branch 'origin/main' into int-agentic
Feb 23, 2026
add8833
chore: merge james-dev into int-agentic (auto)
james-tn Feb 24, 2026
e203077
Merge remote-tracking branch 'origin/main' into int-agentic
Feb 24, 2026
ee02809
chore: merge james-dev into int-agentic (auto)
james-tn Feb 24, 2026
8dc4983
Migrate workshop to agent-framework==1.2.1 (incl. native HandoffBuild…
Copilot Apr 28, 2026
931ca05
docs: Remove misleading RequestInfoExecutor references (#418)
ericchansen Apr 28, 2026
a3a5035
Fix backend 500s by renaming ChatOptions(model_id=…) to ChatOptions(m…
Copilot Apr 28, 2026
ce1afd2
chore: resolve merge conflict - keep model= fix from int-agentic over…
Copilot Apr 28, 2026
c2c22ac
Drop AZURE_OPENAI_API_VERSION; let agent-framework default to Respons…
Copilot Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion agentic_ai/agents/agent_framework/STATE_MANAGEMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ class SessionMemoryCheckpointStorage(CheckpointStorage):

2. **Team agent**
- `MagenticOrchestratorExecutor` automatically snapshots each participant’s `chat_history`.
- Checkpoints include outstanding tool requests (`RequestInfoExecutor` state).
- Checkpoints include outstanding tool requests and plan-review state managed by the orchestrator via `WorkflowEvent(type="request_info")`.
- Ensure all custom executors implement `restore_state` to interpret snapshots after schema changes.

3. **Human-in-the-loop**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ When stalling, the manager calls `replan()`, which uses [`ORCHESTRATOR_TASK_LEDG
1. Registers **participants** (`participants()`), each either a `BaseAgent` or another `Executor`.
2. Configures the **manager** (`with_standard_manager()`).
3. Optionally enables **plan review**, **checkpointing**, and **unified callbacks**.
4. Builds a [`Workflow`](reference/agent-framework/python/packages/main/agent_framework/_workflow/_workflow.py) graph: orchestrator (start node), optional `RequestInfoExecutor` for plan review, and bidirectional edges to each agent executor.
4. Builds a [`Workflow`](reference/agent-framework/python/packages/main/agent_framework/_workflow/_workflow.py) graph: orchestrator (start node) with optional plan review enabled via `enable_plan_review=True`, and bidirectional edges to each agent executor. Plan review is handled internally by the orchestrator, which emits `WorkflowEvent(type="request_info")` events containing `MagenticPlanReviewRequest` data.

### 4.2 Workflow Context & State

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,10 +286,10 @@ async def _setup(self) -> None:
has_api_key = bool(self.azure_openai_key)
has_credential = bool(self.azure_credential)

if not all([self.azure_deployment, self.azure_openai_endpoint, self.api_version]):
if not all([self.azure_deployment, self.azure_openai_endpoint]):
raise RuntimeError(
"Azure OpenAI configuration is incomplete. Ensure "
"AZURE_OPENAI_CHAT_DEPLOYMENT, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_API_VERSION are set."
"AZURE_OPENAI_CHAT_DEPLOYMENT and AZURE_OPENAI_ENDPOINT are set."
)
if not has_api_key and not has_credential:
raise RuntimeError(
Expand All @@ -311,15 +311,13 @@ async def _setup(self) -> None:
api_key=self.azure_openai_key,
model=self.azure_deployment,
azure_endpoint=self.azure_openai_endpoint,
api_version=self.api_version,
)
logger.info("[HANDOFF] Using API key authentication for Azure OpenAI")
else:
chat_client = OpenAIChatClient(
credential=self.azure_credential,
model=self.azure_deployment,
azure_endpoint=self.azure_openai_endpoint,
api_version=self.api_version,
)
logger.info("[HANDOFF] Using managed identity authentication for Azure OpenAI")

Expand All @@ -340,7 +338,7 @@ async def _setup(self) -> None:
description=cfg["description"],
instructions=cfg["instructions"],
tools=domain_tools,
default_options=ChatOptions(model_id=self.openai_model_name),
default_options=ChatOptions(model=self.openai_model_name),
require_per_service_call_history_persistence=True,
)
await agent.__aenter__()
Expand Down
15 changes: 9 additions & 6 deletions agentic_ai/agents/agent_framework/multi_agent/magentic_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,10 +295,15 @@ async def chat_async(self, prompt: str) -> str:
return cleaned_answer

def _validate_configuration(self) -> None:
if not all([self.azure_openai_key, self.azure_deployment, self.azure_openai_endpoint, self.api_version]):
if not all([self.azure_deployment, self.azure_openai_endpoint]):
raise RuntimeError(
"Azure OpenAI configuration is incomplete. Ensure AZURE_OPENAI_API_KEY, "
"AZURE_OPENAI_CHAT_DEPLOYMENT, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_API_VERSION are set."
"Azure OpenAI configuration is incomplete. Ensure AZURE_OPENAI_CHAT_DEPLOYMENT "
"and AZURE_OPENAI_ENDPOINT are set."
)
if not self.azure_openai_key and not getattr(self, "azure_credential", None):
raise RuntimeError(
"Azure OpenAI authentication is not configured. Set AZURE_OPENAI_API_KEY "
"or provide a managed-identity credential."
)

def _build_headers(self) -> Dict[str, str]:
Expand Down Expand Up @@ -376,15 +381,13 @@ def _build_chat_client(self) -> OpenAIChatClient:
api_key=self.azure_openai_key,
model=self.azure_deployment,
azure_endpoint=self.azure_openai_endpoint,
api_version=self.api_version,
)
elif self.azure_credential:
logger.info("[AgentFramework-Magentic] Using managed identity authentication for Azure OpenAI")
return OpenAIChatClient(
credential=self.azure_credential,
model=self.azure_deployment,
azure_endpoint=self.azure_openai_endpoint,
api_version=self.api_version,
)
else:
raise RuntimeError(
Expand Down Expand Up @@ -579,7 +582,7 @@ async def _create_participants(
agent_kwargs: Dict[str, Any] = {
**defaults,
"client": participant_client,
"default_options": ChatOptions(model_id=self.openai_model_name),
"default_options": ChatOptions(model=self.openai_model_name),
}

# Apply tool filtering for this participant's domain
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ async def _setup_agents(self) -> None:
return

# Validate configuration
if not all([self.azure_deployment, self.azure_openai_endpoint, self.api_version]):
if not all([self.azure_deployment, self.azure_openai_endpoint]):
raise RuntimeError("Azure OpenAI configuration incomplete.")

if not self.azure_openai_key and not self.azure_credential:
Expand All @@ -90,7 +90,6 @@ async def _setup_agents(self) -> None:
client_kwargs = {
"model": self.azure_deployment,
"azure_endpoint": self.azure_openai_endpoint,
"api_version": self.api_version,
}
if self.azure_openai_key:
client_kwargs["api_key"] = self.azure_openai_key
Expand All @@ -108,15 +107,15 @@ async def _setup_agents(self) -> None:
name="PrimaryAgent",
instructions=PRIMARY_AGENT_INSTRUCTIONS,
tools=tools,
default_options=ChatOptions(model_id=self.openai_model_name),
default_options=ChatOptions(model=self.openai_model_name),
)

self._reviewer = FrameworkAgent(
client=chat_client,
name="Reviewer",
instructions=REVIEWER_INSTRUCTIONS,
tools=tools,
default_options=ChatOptions(model_id=self.openai_model_name),
default_options=ChatOptions(model=self.openai_model_name),
)

# Initialize agents
Expand Down
8 changes: 3 additions & 5 deletions agentic_ai/agents/agent_framework/single_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ async def _setup_single_agent(self) -> None:
has_api_key = bool(self.azure_openai_key)
has_credential = bool(self.azure_credential)

if not all([self.azure_deployment, self.azure_openai_endpoint, self.api_version]):
if not all([self.azure_deployment, self.azure_openai_endpoint]):
raise RuntimeError(
"Azure OpenAI configuration is incomplete. Ensure "
"AZURE_OPENAI_CHAT_DEPLOYMENT, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_API_VERSION are set."
"AZURE_OPENAI_CHAT_DEPLOYMENT and AZURE_OPENAI_ENDPOINT are set."
)

if not has_api_key and not has_credential:
Expand All @@ -59,15 +59,13 @@ async def _setup_single_agent(self) -> None:
api_key=self.azure_openai_key,
model=self.azure_deployment,
azure_endpoint=self.azure_openai_endpoint,
api_version=self.api_version,
)
logger.info("[AgentFramework] Using API key authentication for Azure OpenAI")
else:
chat_client = OpenAIChatClient(
credential=self.azure_credential,
model=self.azure_deployment,
azure_endpoint=self.azure_openai_endpoint,
api_version=self.api_version,
)
logger.info("[AgentFramework] Using managed identity authentication for Azure OpenAI")

Expand All @@ -85,7 +83,7 @@ async def _setup_single_agent(self) -> None:
name="ai_assistant",
instructions=instructions,
tools=tools,
default_options=ChatOptions(model_id=self.openai_model_name),
default_options=ChatOptions(model=self.openai_model_name),
)

try:
Expand Down
5 changes: 0 additions & 5 deletions infra/terraform/_aca-be.tf
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,6 @@ resource "azurerm_container_app" "backend" {
value = local.openai_endpoint
}

env {
name = "AZURE_OPENAI_API_VERSION"
value = var.openai_api_version
}

env {
name = "AZURE_OPENAI_EMBEDDING_DEPLOYMENT"
value = var.openai_embedding_deployment_name
Expand Down
1 change: 0 additions & 1 deletion infra/terraform/dev.tfvars
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ create_openai_deployment = true
openai_deployment_name = "gpt-5.2-chat"
openai_model_name = "gpt-5.2-chat"
openai_model_version = "2025-12-11"
openai_api_version ="2025-04-01-preview"
openai_deployment_capacity = 200 # 200k tokens/minute - needed for agent evaluation

# OpenAI embedding deployment configuration
Expand Down
1 change: 0 additions & 1 deletion infra/terraform/prod.tfvars
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ create_openai_deployment = true
openai_deployment_name = "gpt-5.2-chat"
openai_model_name = "gpt-5.2-chat"
openai_model_version = "2025-12-11"
openai_api_version = "2025-04-01-preview"
openai_deployment_capacity = 200 # 200k tokens/minute

# OpenAI embedding deployment configuration
Expand Down
5 changes: 0 additions & 5 deletions infra/terraform/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ variable "openai_model_version" {
type = string
default = "2025-12-11"
}
variable "openai_api_version" {
description = "OpenAI API version"
type = string
default = "2025-04-01-preview"
}
variable "openai_deployment_capacity" {
description = "Capacity (TPM in thousands) for OpenAI deployment"
type = number
Expand Down
22 changes: 18 additions & 4 deletions tests/test_agent_framework_1_2_1_regression.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,25 @@ def test_framework_agent_constructor_signature(self):
# description was wired through in 1.2.x and is consumed by HandoffBuilder
assert 'description' in params

def test_chat_options_model_id(self):
"""ChatOptions accepts model_id for specifying the model."""
def test_chat_options_model(self):
"""ChatOptions exposes ``model`` (not ``model_id``) in 1.2.x.

Regression for the CI failure where agents constructed
``ChatOptions(model_id=...)``. ``ChatOptions`` is a ``TypedDict`` with
``total=False``, so unknown keys are silently accepted at construction
time and only blow up later when forwarded as kwargs to the OpenAI
``responses.create`` call (``TypeError: unexpected keyword argument
'model_id'``). Assert against ``__annotations__`` so the test fails
loudly if the field name changes again.
"""
from agent_framework import ChatOptions
opts = ChatOptions(model_id="gpt-4o")
assert opts["model_id"] == "gpt-4o"
opts = ChatOptions(model="gpt-4o")
assert opts["model"] == "gpt-4o"
assert "model" in ChatOptions.__annotations__
assert "model_id" not in ChatOptions.__annotations__, (
"ChatOptions field is `model` in agent-framework 1.2.x; "
"passing model_id= silently constructs a bad dict that fails downstream."
)

def test_openai_client_constructor_supports_azure_kwargs(self):
"""OpenAIChatClient accepts model, api_key, credential, azure_endpoint, api_version."""
Expand Down
Loading