Commit Graph

42 Commits

  • [BREAKING] Python: DevUI: tighten default access controls and CORS posture (#5740)
    * Python: DevUI: tighten default access controls and CORS posture
    
    Adjusts the default configuration of the DevUI server so the out-of-the-box
    posture matches what most callers expect when running locally. Adds explicit
    opt-outs for callers who need the previous behavior.
    
    - DevServer gains auth_enabled and auth_token constructor params; auth is on by
      default. Auto-generates and logs a token when none provided.
    - CORS default is an empty allowlist on every host. Callers wanting cross-origin
      pass cors_origins explicitly.
    - Streaming /v1/responses no longer sets Access-Control-Allow-Origin directly;
      CORSMiddleware owns all CORS decisions.
    - Loopback binds enforce a Host-header allowlist.
    - /meta moved out of the auth bypass list (was alongside /health and /).
    - serve() default flipped to auth_enabled=True; passes auth args through to
      DevServer instead of using env-var indirection.
    - CLI: --auth opt-in replaced with --no-auth opt-out; --auth-token preserved.
    - Tests cover the eight behaviors above in test_server.py.
    
    * Python: DevUI: address PR review comments
    
    - /meta now derives auth_required from self.auth_enabled instead of
      reading DEVUI_AUTH_TOKEN, so the auto-generated and explicit
      auth_token paths report correctly.
    - Reorder middleware so the loopback Host-header allowlist is registered
      last; Starlette wraps later-added middleware around earlier-added ones,
      so the host check now runs outermost (before CORS/auth) as intended.
    - Rework comments to describe the behavior rather than threat scenarios.
    - Streaming-headers and CORS tests now construct the server with an
      explicit auth_token and send a Bearer header, so the assertions
      actually exercise the streaming/CORS path instead of short-circuiting
      in the auth middleware.
  • Python: Fix incorrect workflow timings in DevUI by adding created_at to executor events (#5615)
    * fix(devui): add created_at to custom output item events for correct workflow timings (#5545)
    
    CustomResponseOutputItemAddedEvent and CustomResponseOutputItemDoneEvent lacked a
    created_at field, causing the frontend to synthesize timestamps using integer-second
    precision with a forced +1s minimum gap between events. This made instant workflows
    appear to take 3+ seconds in the DevUI timeline.
    
    Fix:
    - Add optional created_at: float | None field to both custom event models
    - Populate created_at=float(time.time()) in the mapper for executor_invoked,
      executor_completed, and executor_failed events
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fix(devui): use event created_at for accurate workflow timeline timings
    
    workflow-view.tsx synthesized _uiTimestamp using Math.max(baseTimestamp,
    lastTimestamp + 1) with integer-second precision, forcing a minimum 1-second
    gap between every sequential event. This made instant workflows appear to take
    several seconds in the DevUI timeline.
    
    The fix prefers event.created_at (a float Unix timestamp populated by the
    backend mapper for all executor events) and only falls back to the synthetic
    timestamp when created_at is absent. This matches the pattern already used in
    devuiStore.ts:addDebugEvent.
    
    Added a regression test in test_mapper.py verifying that the mapper attaches
    created_at to all executor lifecycle events (invoked, completed, failed).
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fix(devui): address review feedback for issue #5545
    
    - Read data.timestamp (ISO string) and response.created_at in addition
      to top-level created_at when deriving _uiTimestamp, so
      response.workflow_event.completed events get a real server timestamp
      instead of a synthesized one
    - Change uniqueTimestamp tiebreaker: when a real server timestamp is
      available use Math.max(eventTimestamp, lastTimestamp) rather than
      lastTimestamp + 1, eliminating artificial 1-second gaps while still
      preserving monotonic ordering
    - Apply the same fix in the HIL streaming path (second setOpenAIEvents
      call in workflow-view.tsx)
    - Add assert event.created_at > 0 to regression test to guard against
      zero or negative timestamps
    - Add test_custom_output_item_event_models_have_created_at_field model-
      level test so removing the field produces a clear named failure rather
      than a downstream ValidationError
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fix(#5545): guard NaN timestamps, fix fallback ID uniqueness, add regression tests
    
    - workflow-view.tsx (×2): Wrap data.timestamp ISO→number conversion in a
      Number.isFinite() guard.  Python's datetime.now().isoformat() emits
      microseconds without a trailing 'Z' (e.g. '2024-01-15T12:34:56.123456'),
      which some JS engines cannot parse, returning NaN.  NaN !== undefined is
      true so the eventTimestamp !== undefined guard did not catch it, poisoning
      _uiTimestamp and resetting the monotonic ordering seed (NaN || 0 → 0).
    
    - execution-timeline.tsx: Replace uiTimestamp in the fallback syntheticItemId
      with the per-executor runNumber counter.  Two runs of the same executor
      within the same second previously received identical _uiTimestamp values
      and therefore identical syntheticItemIds, causing their output buckets,
      state, and run entries to collide (execution-timeline.tsx:360–408).
    
    - Add missing test_workflow_timings_bug.py source file (only a stale .pyc
      existed).  Three regression tests:
        · test_custom_event_models_lack_created_at_field – model field guard
        · test_workflow_executor_events_lack_created_at – mapper populates created_at
        · test_rapid_workflow_events_have_no_top_level_timestamps – confirms
          data.timestamp format that requires the frontend NaN guard
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address review feedback for #5545: Python: [Bug]: Workflow timings in DevUI are incorrect
    
    * devui: move timing regression tests into test_mapper.py, remove dedicated bug file
    
    - Delete test_workflow_timings_bug.py; tests belong in existing module files
    - The two tests already present in test_mapper.py (test_executor_events_carry_created_at_timestamp
      and test_custom_output_item_event_models_have_created_at_field) cover the same ground as the
      first two tests in the deleted file
    - Add test_executor_completed_maps_to_output_item_done_event to test_mapper.py, replacing the
      third test from the deleted file with a generic, issue-agnostic name and docstring
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address review feedback for #5545: review comment fixes
    
    ---------
    
    Co-authored-by: Copilot <copilot@github.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • Python: update FoundryAgent for hosted agent sessions (#5447)
    * fixes to FoundryAgent to connect to new hosted agents
    
    Co-authored-by: Copilot <copilot@github.com>
    
    * fix mypy
    
    Co-authored-by: Copilot <copilot@github.com>
    
    * Python: remove Foundry service session helpers
    
    Remove the public hosted-agent service session CRUD helpers from FoundryAgent and drop the related feature-stage inventory entry.
    
    Update the hosted-agent sample to create and delete service sessions directly through the preview AIProjectClient APIs, and tighten a few test harnesses surfaced by full workspace validation.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fix from merge
    
    * fix hosted env detection
    
    Co-authored-by: Copilot <copilot@github.com>
    
    * reverted sample update
    
    * fix tests and code
    
    Co-authored-by: Copilot <copilot@github.com>
    
    * remove aenter
    
    * skipping some tests
    
    Co-authored-by: Copilot <copilot@github.com>
    
    ---------
    
    Co-authored-by: Copilot <copilot@github.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • Python: Fix DevUI streaming memory growth and add cross-platform regression coverage (#5221)
    * fix for memory leak in devui
    
    * update async sleep
    
    * remove old func
  • Python: [BREAKING] Standardize model selection on model (#4999)
    * Refactor Anthropic model option and provider clients
    
    Rename the Anthropic client model option from model_id to model, add provider-specific Anthropic wrappers for Foundry, Bedrock, and Vertex, and expose them through the Anthropic, Foundry, Amazon, and Google namespaces. Update core option handling, docs, samples, and tests accordingly.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix Anthropic skills sample typing
    
    Cast the Anthropic beta client to Any in the skills sample so the pre-commit sample pyright check no longer fails on beta skills and files endpoints that are not exposed by the current SDK stubs.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * undo sample mypy
    
    * Retry CI after transient external failures
    
    Retrigger PR validation after an unrelated Copilot review workflow SAML failure and a transient external tau2 git fetch failure in the Windows Python test setup.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address review feedback on model option merging
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address Anthropic compatibility review feedback
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * moved all to `model`
    
    * fixes for azure ai search
    
    * Python: standardize remaining sample env var names
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Python: fix foundry-local pyright compatibility
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * updated env vars in cicd
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • Python: [BREAKING] Remove deprecated kwargs compatibility paths (#4858)
    * [BREAKING] Remove deprecated kwargs compatibility paths
    
    Remove the deprecated kwargs compatibility shims across core agents, clients, tools, middleware, and telemetry.
    
    Keep workflow kwargs behavior intact in this branch and follow up separately in #4850.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix PR CI fallout for kwargs removal
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address PR review feedback
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * updates
    
    * Fix Azure AI CI fallout
    
    Remove the stale _get_current_conversation_id override from the Azure AI client after the OpenAI base helper was deleted.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fixed new classes
    
    * Fix Assistants deprecated import gating
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix integration replay regressions
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Switch multi-agent hosting samples to Azure chat completions
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Simplify Azure multi-agent sample config
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • Fix CWE-863: Validate function approval responses in DevUI executor (#4598)
    The DevUI /v1/responses endpoint accepts function_approval_response content
    without verifying that the request_id corresponds to a real pending approval
    request issued by the server. This allows forged approval responses to
    execute arbitrary tools with attacker-controlled arguments, bypassing
    approval_mode='always_require'.
    
    Changes:
    - Track outgoing approval requests in a server-side registry
      (_pending_approvals) keyed by request_id
    - Validate incoming approval responses against this registry; reject
      any response whose request_id was not issued by the server
    - Use server-stored function_call data (tool name, arguments, call_id)
      instead of client-supplied data when constructing the approval response
    - Consume request_ids on use (pop from registry) to prevent replay attacks
    
    Tests:
    - 8 new tests covering forged rejection, server-data enforcement,
      anti-replay, multiple independent approvals, and edge cases
    
    Co-authored-by: REDMOND\tusharmudi <tusharmudi@microsoft.com>
  • Python: .NET: Fix .NET conversation memory in DevUI (#3484) (#4294)
    * Fix .NET conversation memory in DevUI (#3484)
    
    * formatting fixes
    
    * fix memory regression in python devui , fix for #4123
    
    * Fix for #3983: Added _get_event_type() helper that safely accesses event type on both objects (.type) and dicts (.get("type")). Replaced all 4 bare event.type accesses in _executor.py (lines 267, 477, 499, 523).
    
    Root cause: PR #3690 changed event.__class__.__name__ == "RequestInfoEvent" (safe) to event.type == "request_info" (crashes on dicts), but _execute_workflow still yields raw dicts on error paths.
    
    Test: test_workflow_error_yields_dict_event_without_crash — mocks a workflow that raises, verifies execute_entity consumes the dict error events without crashing.
    
    * format fixes
    
    * lint fixes
  • Python: Fix streamed workflow agent continuation context by finalizing AgentExecutor streams (#3882)
    * Fix streamed workflow agent continuation context by finalizing AgentExecutor streams
    
    * Fix stream handling
    
    * Fixes
    
    * Fix DevUI and tests
  • Python: [BREAKING] PR2 — Wire context provider pipeline, remove old types, update all consumers (#3850)
    * PR2: Wire context provider pipeline and update all internal consumers
    
    - Replace AgentThread with AgentSession across all packages
    - Replace ContextProvider with BaseContextProvider across all packages
    - Replace context_provider param with context_providers (Sequence)
    - Replace thread= with session= in run() signatures
    - Replace get_new_thread() with create_session()
    - Add get_session(service_session_id) to agent interface
    - DurableAgentThread -> DurableAgentSession
    - Remove _notify_thread_of_new_messages from WorkflowAgent
    - Wire before_run/after_run context provider pipeline in RawAgent
    - Auto-inject InMemoryHistoryProvider when no providers configured
    
    * fix: update all tests for context provider pipeline, fix lazy-loaders, remove old test files
    
    * refactor: update all sample files for context provider pipeline (AgentThread→AgentSession, ContextProvider→BaseContextProvider)
    
    * fix: update remaining ag-ui references (client docstring, getting_started sample)
    
    * fix: make get_session service_session_id keyword-only to avoid confusion with session_id
    
    * refactor: rename _RunContext.thread_messages to session_messages
    
    * refactor: remove _threads.py, _memory.py, and old provider files; migrate devui to use plain message lists
    
    * rename: remove _new_ prefix from test files
    
    * refactor: rewrite SlidingWindowChatMessageStore as SlidingWindowHistoryProvider(InMemoryHistoryProvider)
    
    * fix: read full history from session state directly instead of reaching into provider internals
    
    * fix: update stale .pyi stubs, sample imports, and README references for new provider types
    
    * fix: remove stale message_store, _notify_thread_of_new_messages, and session_id.key references in samples
    
    * refactor: merge context_providers and sessions sample folders into sessions, remove aggregate_context_provider
    
    * refactor: UserInfoMemory stores state in session.state instead of instance attributes
    
    * feat: add Pydantic BaseModel support to session state serialization
    
    Pydantic models stored in session.state are now automatically serialized
    via model_dump() and restored via model_validate() during to_dict()/from_dict()
    round-trips. Models are auto-registered on first serialization; use
    register_state_type() for cold-start deserialization.
    
    Also export register_state_type as a public API.
    
    * fix mem0
    
    * Update sample README links and descriptions for session terminology
    
    - Replace 'thread' with 'session' in sample descriptions across all READMEs
    - Update file links for renamed samples (mem0_sessions, redis_sessions, etc.)
    - Fix Threads section → Sessions section in main samples/README.md
    - Update tools, middleware, workflows, durabletask, azure_functions READMEs
    - Update architecture diagrams in concepts/tools/README.md
    - Update migration guides (autogen, semantic-kernel)
    
    * Fix broken Redis README link to renamed sample
    
    * Fix Mem0 OSS client search: pass scoping params as direct kwargs
    
    AsyncMemory (OSS) expects user_id/agent_id/run_id as direct kwargs,
    while AsyncMemoryClient (Platform) expects them in a filters dict.
    Adds tests for both client types.
    
    Port of fix from #3844 to new Mem0ContextProvider.
    
    * Fix rebase issues: restore missing _conversation_state.py and checkpoint decode logic
    
    - Add back _conversation_state.py (encode/decode_chat_messages) lost in rebase
    - Fix on_checkpoint_restore to decode cache/conversation with decode_chat_messages
    - Fix on_checkpoint_restore to use decode_checkpoint_value for pending requests
    - Add tests/workflow/__init__.py for relative import support
    - Fix test_agent_executor checkpoint selection (checkpoints[1] not superstep)
    
    * Add STORES_BY_DEFAULT ClassVar to skip redundant InMemoryHistoryProvider injection
    
    Chat clients that store history server-side by default (OpenAI Responses API,
    Azure AI Agent) now declare STORES_BY_DEFAULT = True. The agent checks this
    during auto-injection and skips InMemoryHistoryProvider unless the user
    explicitly sets store=False.
    
    * Fix broken markdown links in azure_ai and redis READMEs
    
    * Fix getting-started samples to use session API instead of removed thread/ContextProvider API
    
    * updates to workflow as agent
    
    * fix group chat import
    
    * Rename Thread→Session throughout, fix service_session_id propagation, remove stale AGUIThread
    
    - Fix: Propagate conversation_id from ChatResponse back to session.service_session_id
      in both streaming and non-streaming paths in _agents.py
    - Rename AgentThreadException → AgentSessionException
    - Remove stale AGUIThread from ag_ui lazy-loader
    - Rename use_service_thread → use_service_session in ag-ui package
    - Rename test functions from *_thread_* to *_session_*
    - Rename sample files from *_thread* to *_session*
    - Update docstrings and comments: thread → session
    - Update _mcp.py kwargs filter: add 'session' alongside 'thread'
    - Fix ContinuationToken docstring example: thread=thread → session=session
    - Fix _clients.py docstring: 'Agent threads' → 'Agent sessions'
    
    * Fix broken markdown links after thread→session file renames
    
    * fix azure ai test
  • Python: restructure: Python samples into progressive 01-05 layout (#3862)
    * restructure: Python samples into progressive 01-05 layout
    
    - 01-get-started/: 6 numbered steps (hello agent → hosting)
    - 02-agents/: all agent concept samples (tools, middleware, providers, etc.)
    - 03-workflows/: ALL existing workflow samples preserved as-is
    - 04-hosting/: azure-functions, durabletask, a2a
    - 05-end-to-end/: demos, evaluation, hosted agents
    - Old files moved to _to_delete/ for review
    - Added AGENTS.md with structure documentation
    - autogen-migration/ and semantic-kernel-migration/ preserved at root
    
    * fix: switch to AzureOpenAI Foundry, fix CI failures
    
    - Switch all 01-get-started samples to AzureOpenAIResponsesClient with
      Azure AI Foundry project endpoint (AZURE_AI_PROJECT_ENDPOINT +
      AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME + AzureCliCredential)
    - Add _to_delete/ and 05-end-to-end/ to pyrightconfig.samples.json excludes
    - Fix test paths in packages/ that referenced old getting_started/ dirs:
      durabletask conftest + streaming test, azurefunctions conftest,
      devui conftest + capture_messages + openai_sdk_integration
    - Fix workflow_as_agent_human_in_the_loop.py import (sibling import)
    - Update hosting READMEs and tool comment paths
    - Replace root README.md with new structure overview
    - Update AGENTS.md to document Azure OpenAI Foundry as default provider
    
    * cleanup: remove _to_delete folder, copy resource files to active dirs
    
    All files in _to_delete/ were either:
    - Exact duplicates of files in the new structure (240 files)
    - Same file with only comment path updates (100 files)
    - One import-fix diff (workflow_as_agent_human_in_the_loop.py)
    - One superseded minimal_sample.py
    
    Resource files (sample.pdf, countries.json, employees.pdf, weather.json)
    copied to 02-agents/sample_assets/ and 02-agents/resources/ since active
    samples reference them.
    
    * fix: address PR review comments, centralize resources, remove root duplicates
    
    - Fix type annotation in 04_memory.py (string union -> proper types)
    - Fix old sample paths in observability files
    - Fix grammar/spelling in observability samples
    - Move sample_assets/ and resources/ to shared/ folder
    - Remove 8 duplicate observability files from 02-agents root
    - Update resource path references in multimodal_input and provider samples
    
    * fix: update broken links from old getting_started paths to new structure
    
    - Update relative paths in READMEs: getting_started/ → 01-get-started/,
      02-agents/, 03-workflows/, 04-hosting/, 05-end-to-end/
    - Fix absolute GitHub URLs in package READMEs
    - Fix broken link in ollama package README
    
    * fix: convert absolute GitHub URLs to relative paths for link checker
    
    Absolute URLs to python/samples/ on main branch 404 until PR merges.
    Converted to relative paths that linkspector can verify locally.
    
    * fix: update link for handoff sample moved to orchestrations/
    
    * fix: update chatkit-integration README path from demos/ to 05-end-to-end/
    
    * fix: update broken links in orchestrations README to match flat directory structure
  • Python: [BREAKING] Simplify API: ChatAgent -> Agent, ChatMessage -> Message (#3747)
    * [BREAKING] Rename ChatAgent -> Agent, ChatMessage -> Message, ChatClientProtocol -> SupportsChatGetResponse
    
    Simplify the public API by removing redundant 'Chat' prefix from core types:
    - ChatAgent -> Agent
    - RawChatAgent -> RawAgent
    - ChatMessage -> Message
    - ChatClientProtocol -> SupportsChatGetResponse
    
    Also renamed internal WorkflowMessage (was Message in _runner_context) to avoid collision.
    
    No backward compatibility aliases - this is a clean breaking change.
    
    * [BREAKING] Rename Agent chat_client parameter to client
    
    * Fix rebase issues: WorkflowMessage references and broken markdown links
    
    * Fix formatting and lint issues from code quality checks
    
    * Fix import ordering in workflow sample files
    
    * fixed rebase
    
    * Fix test failures: use WorkflowMessage and A2AMessage after ChatMessage→Message rename
    
    - Replace Message(data=..., source_id=...) with WorkflowMessage(...) in workflow tests
    - Fix isinstance check in A2A agent to use A2AMessage instead of Message
    - Fix import in test_workflow_observability.py (Message→WorkflowMessage)
    
    * Fix lint, fmt, and sample errors after ChatMessage→Message rename
    
    - Auto-fix 70+ ruff lint issues across samples (ChatMessage→Message refs)
    - Fix HostedVectorStoreContent→Content.from_hosted_vector_store in file search sample
    - Fix _normalize_messages→normalize_messages in custom agent sample
    - Fix context.terminate→raise MiddlewareTermination in middleware samples
    - Fix with_update_hook→with_transform_hook in override middleware sample
    - Add TOptions_co import back to custom_chat_client sample
    - Add noqa for FastAPI File() default in chatkit sample
    - Fix B023 loop variable capture in weather agent sample
    
    * fix: update Agent constructor calls from chat_client to client in declaration-only tool tests
    
    * fix: add register_cleanup to devui lazy-loading proxy and type stub
    
    * fixed tests and updated new pieces
    
    * fix agui typevar
    
    * fix merge errors
    
    * fix merge conflicts
    
    * fiux merge
    
    * Remove unused links
    
    ---------
    
    Co-authored-by: Evan Mattson <evan.mattson@microsoft.com>
  • Python: [BREAKING] Standardize TypeVar naming convention (TName → NameT) (#3770)
    * standardized typevar to use suffix T
    
    * addressed copilot comments
  • [BREAKING] Python: Move single-config fluent methods to constructor parameters (#3693)
    * Move single-config fluent methods to constructor parameters
    
    * Updates
    
    * Adjust magentic and group chat
  • [BREAKING] Python: Refactor workflow events to unified discriminated union pattern (#3690)
    * Refactor events
    
    * Merge main
    
    * Fixes
    
    * Cleanup
    
    * Update samples and tests
    
    * Remove unused imports
    
    * PR feedback
    
    * Merge main. Add properties for events to help typing
    
    * Formatting
    
    * Cleanup
    
    * use builtins.type to avoid shadowing by WorkflowEvent.type attribute
    
    * Final improvements
  • Python: [BREAKING] Moved to a single get_response and run API (#3379)
    * WIP
    
    * big update to new ResponseStream model
    
    * fixed tests and typing
    
    * fixed tests and typing
    
    * fixed tools typevar import
    
    * fix
    
    * mypy fix
    
    * mypy fixes and some cleanup
    
    * fix missing quoted names
    
    * and client
    
    * fix  imports agui
    
    * fix anthropic override
    
    * fix agui
    
    * fix ag ui
    
    * fix import
    
    * fix anthropic types
    
    * fix mypy
    
    * refactoring
    
    * updated typing
    
    * fix 3.11
    
    * fixes
    
    * redid layering of chat clients and agents
    
    * redid layering of chat clients and agents
    
    * Fix lint, type, and test issues after rebase
    
    - Add @overload decorators to AgentProtocol.run() for type compatibility
    - Add missing docstring params (middleware, function_invocation_configuration)
    - Fix TODO format (TD002) by adding author tags
    - Fix broken observability tests from upstream:
      - Replace non-existent use_instrumentation with direct instantiation
      - Replace non-existent use_agent_instrumentation with AgentTelemetryLayer mixin
      - Fix get_streaming_response to use get_response(stream=True)
      - Add AgentInitializationError import
      - Update streaming exception tests to match actual behavior
    
    * Fix AgentExecutionException import error in test_agents.py
    
    - Replace non-existent AgentExecutionException with AgentRunException
    
    * Fix test import and asyncio deprecation issues
    
    - Add 'tests' to pythonpath in ag-ui pyproject.toml for utils_test_ag_ui import
    - Replace deprecated asyncio.get_event_loop().run_until_complete with asyncio.run
    
    * Fix azure-ai test failures
    
    - Update _prepare_options patching to use correct class path
    - Fix test_to_azure_ai_agent_tools_web_search_missing_connection to clear env vars
    
    * Convert ag-ui utils_test_ag_ui.py to conftest.py
    
    - Move test utilities to conftest.py for proper pytest discovery
    - Update all test imports to use conftest instead of utils_test_ag_ui
    - Remove old utils_test_ag_ui.py file
    - Revert pythonpath change in pyproject.toml
    
    * fix: use relative imports for ag-ui test utilities
    
    * fix agui
    
    * Rename Bare*Client to Raw*Client and BaseChatClient
    
    - Renamed BareChatClient to BaseChatClient (abstract base class)
    - Renamed BareOpenAIChatClient to RawOpenAIChatClient
    - Renamed BareOpenAIResponsesClient to RawOpenAIResponsesClient
    - Renamed BareAzureAIClient to RawAzureAIClient
    - Added warning docstrings to Raw* classes about layer ordering
    - Updated README in samples/getting_started/agents/custom with layer docs
    - Added test for span ordering with function calling
    
    * Fix layer ordering: FunctionInvocationLayer before ChatTelemetryLayer
    
    This ensures each inner LLM call gets its own telemetry span, resulting in
    the correct span sequence: chat -> execute_tool -> chat
    
    Updated all production clients and test mocks to use correct ordering:
    - ChatMiddlewareLayer (first)
    - FunctionInvocationLayer (second)
    - ChatTelemetryLayer (third)
    - BaseChatClient/Raw...Client (fourth)
    
    * Remove run_stream usage
    
    * Fix conversation_id propagation
    
    * Python: Add BaseAgent implementation for Claude Agent SDK (#3509)
    
    * Added ClaudeAgent implementation
    
    * Updated streaming logic
    
    * Small updates
    
    * Small update
    
    * Fixes
    
    * Small fix
    
    * Naming improvements
    
    * Updated imports
    
    * Addressed comments
    
    * Updated package versions
    
    * Update Claude agent connector layering
    
    * fix test and plugin
    
    * Store function middleware in invocation layer
    
    * Fix telemetry streaming and ag-ui tests
    
    * Remove legacy ag-ui tests folder
    
    * updates
    
    * Remove terminate flag from FunctionInvocationContext, use MiddlewareTermination instead
    
    - Remove terminate attribute from FunctionInvocationContext
    - Add result attribute to MiddlewareTermination to carry function results
    - FunctionMiddlewarePipeline.execute() now lets MiddlewareTermination propagate
    - _auto_invoke_function captures context.result in exception before re-raising
    - _try_execute_function_calls catches MiddlewareTermination and sets should_terminate
    - Fix handoff middleware to append to chat_client.function_middleware directly
    - Update tests to use raise MiddlewareTermination instead of context.terminate
    - Add middleware flow documentation in samples/concepts/tools/README.md
    - Fix ag-ui to use FunctionMiddlewarePipeline instead of removed create_function_middleware_pipeline
    
    * fix: remove references to removed terminate flag in purview tests, add type ignore
    
    * fix: move _test_utils.py from package to test folder
    
    * fix: call get_final_response() to trigger context provider notification in streaming test
    
    * fix: correct broken links in tools README
    
    * docs: clarify default middleware behavior in summary table
    
    * fix: ensure inner stream result hooks are called when using map()/from_awaitable()
    
    * Fix mypy type errors
    
    * Address PR review comments on observability.py
    
    - Remove TODO comment about unconsumed streams, add explanatory note instead
    - Remove redundant _close_span cleanup hook (already called in _finalize_stream)
    - Clarify behavior: cleanup hooks run after stream iteration, if stream is not
      consumed the span remains open until garbage collected
    
    * Remove gen_ai.client.operation.duration from span attributes
    
    Duration is a metrics-only attribute per OpenTelemetry semantic conventions.
    It should be recorded to the histogram but not set as a span attribute.
    
    * Remove duration from _get_response_attributes, pass directly to _capture_response
    
    Duration is a metrics-only attribute. It's now passed directly to _capture_response
    instead of being included in the attributes dict that gets set on the span.
    
    * Remove redundant _close_span cleanup hook in AgentTelemetryLayer
    
    _finalize_stream already calls _close_span() in its finally block,
    so adding it as a separate cleanup hook is redundant.
    
    * Use weakref.finalize to close span when stream is garbage collected
    
    If a user creates a streaming response but never consumes it, the cleanup
    hooks won't run. Now we register a weak reference finalizer that will close
    the span when the stream object is garbage collected, ensuring spans don't
    leak in this scenario.
    
    * Fix _get_finalizers_from_stream to use _result_hooks attribute
    
    Renamed function to _get_result_hooks_from_stream and fixed it to
    look for the _result_hooks attribute which is the correct name in
    ResponseStream class.
    
    * Add missing asyncio import in test_request_info_mixin.py
    
    * Fix leftover merge conflict marker in image_generation sample
    
    * Update integration tests
    
    * Fix integration tests: increase max_iterations from 1 to 2
    
    Tests with tool_choice options require at least 2 iterations:
    1. First iteration to get function call and execute the tool
    2. Second iteration to get the final text response
    
    With max_iterations=1, streaming tests would return early with only
    the function call/result but no final text content.
    
    * Fix duplicate function call error in conversation-based APIs
    
    When using conversation_id (for Responses/Assistants APIs), the server
    already has the function call message from the previous response. We
    should only send the new function result message, not all messages
    including the function call which would cause a duplicate ID error.
    
    Fix: When conversation_id is set, only send the last message (the tool
    result) instead of all response.messages.
    
    * Add regression test for conversation_id propagation between tool iterations
    
    Port test from PR #3664 with updates for new streaming API pattern.
    Tests that conversation_id is properly updated in options dict during
    function invocation loop iterations.
    
    * Fix tool_choice=required to return after tool execution
    
    When tool_choice is 'required', the user's intent is to force exactly one
    tool call. After the tool executes, return immediately with the function
    call and result - don't continue to call the model again.
    
    This fixes integration tests that were failing with empty text responses
    because with tool_choice=required, the model would keep returning function
    calls instead of text.
    
    Also adds regression tests for:
    - conversation_id propagation between tool iterations (from PR #3664)
    - tool_choice=required returns after tool execution
    
    * Document tool_choice behavior in tools README
    
    - Add table explaining tool_choice values (auto, none, required)
    - Explain why tool_choice=required returns immediately after tool execution
    - Add code example showing the difference between required and auto
    - Update flow diagram to show the early return path for tool_choice=required
    
    * Fix tool_choice=None behavior - don't default to 'auto'
    
    Remove the hardcoded default of 'auto' for tool_choice in ChatAgent init.
    When tool_choice is not specified (None), it will now not be sent to the
    API, allowing the API's default behavior to be used.
    
    Users who want tool_choice='auto' can still explicitly set it either in
    default_options or at runtime.
    
    Fixes #3585
    
    * Fix tool_choice=none should not remove tools
    
    In OpenAI Assistants client, tools were not being sent when
    tool_choice='none'. This was incorrect - tool_choice='none' means
    the model won't call tools, but tools should still be available
    in the request (they may be used later in the conversation).
    
    Fixes #3585
    
    * Add test for tool_choice=none preserving tools
    
    Adds a regression test to ensure that when tool_choice='none' is set but
    tools are provided, the tools are still sent to the API. This verifies
    the fix for #3585.
    
    * Fix tool_choice=none should not remove tools in all clients
    
    Apply the same fix to OpenAI Responses client and Azure AI client:
    - OpenAI Responses: Remove else block that popped tool_choice/parallel_tool_calls
    - Azure AI: Remove tool_choice != 'none' check when adding tools
    
    When tool_choice='none', the model won't call tools, but tools should
    still be sent to the API so they're available for future turns.
    
    Also update README to clarify tool_choice=required supports multiple tools.
    
    Fixes #3585
    
    * Keep tool_choice even when tools is None
    
    Move tool_choice processing outside of the 'if tools' block in OpenAI
    Responses client so tool_choice is sent to the API even when no tools
    are provided.
    
    * Update test to match new parallel_tool_calls behavior
    
    Changed test_prepare_options_removes_parallel_tool_calls_when_no_tools to
    test_prepare_options_preserves_parallel_tool_calls_when_no_tools to reflect
    that parallel_tool_calls is now preserved even when no tools are present,
    consistent with the tool_choice behavior.
    
    * Fix ChatMessage API and Role enum usage after rebase
    
    - Update ChatMessage instantiation to use keyword args (role=, text=, contents=)
    - Fix Role enum comparisons to use .value for string comparison
    - Add created_at to AgentResponse in error handling
    - Fix AgentResponse.from_updates -> from_agent_run_response_updates
    - Fix DurableAgentStateMessage.from_chat_message to convert Role enum to string
    - Add Role import where needed
    
    * Fix additional ChatMessage API and method name changes
    
    - Fix ChatMessage usage in workflow files (use text= instead of contents= for strings)
    - Fix AgentResponse.from_updates -> from_agent_run_response_updates in workflow files
    - Fix test files for ChatMessage and Role enum usage
    
    * Fix remaining ChatMessage API usage in test files
    
    * Fix more ChatMessage and Role API changes in source and test files
    
    - Fix ChatMessage in _magentic.py replan method
    - Fix Role enum comparison in test assertions
    - Fix remaining test files with old ChatMessage syntax
    
    * Fix ChatMessage and Role API changes across packages
    
    - Add Role import where missing
    - Fix ChatMessage signature: positional args to keyword args (role=, text=, contents=)
    - Fix Role enum comparisons: .role.value instead of .role string
    - Fix FinishReason enum usage in ag-ui event converters
    - Rename AgentResponse.from_updates to from_agent_run_response_updates in ag-ui
    
    Fixes API compatibility after Types API Review improvements merge
    
    * Fix ChatMessage and Role API changes in github_copilot tests
    
    * Fix ChatMessage and Role API changes in redis and github_copilot packages
    
    - Fix redis provider: Role enum comparison using .value
    - Fix redis tests: ChatMessage signature and Role comparisons
    - Fix github_copilot tests: ChatMessage signature and Role comparisons
    - Update docstring examples in redis chat message store
    
    * Fix ChatMessage and Role API changes in devui package
    
    - Fix executor: ChatMessage signature change
    - Fix conversations: Role enum to string conversion in two places
    - Fix tests: ChatMessage signatures and Role comparisons
    
    * Fix ChatMessage and Role API changes in a2a and lab packages
    
    - Fix a2a tests: Role comparisons and ChatMessage signatures
    - Fix lab tau2 source: Role enum comparison in flip_messages, log_messages, sliding_window
    - Fix lab tau2 tests: ChatMessage signatures and Role comparisons
    
    * Remove duplicate test files from ag-ui/tests (tests are in ag_ui_tests)
    
    * Fix ChatMessage and Role API changes across packages
    
    After rebasing on upstream/main which merged PR #3647 (Types API Review
    improvements), fix all packages to use the new API:
    
    - ChatMessage: Use keyword args (role=, text=, contents=) instead of
      positional args
    - Role: Compare using .value attribute since it's now an enum
    
    Packages fixed:
    - ag-ui: Fixed Role value extraction bugs in _message_adapters.py
    - anthropic: Fixed ChatMessage and Role comparisons in tests
    - azure-ai: Fixed Role comparison in _client.py
    - azure-ai-search: Fixed ChatMessage and Role in source/tests
    - bedrock: Fixed ChatMessage signatures in tests
    - chatkit: Fixed ChatMessage and Role in source/tests
    - copilotstudio: Fixed ChatMessage and Role in tests
    - declarative: Fixed ChatMessage in _executors_agents.py
    - mem0: Fixed ChatMessage and Role in source/tests
    - purview: Fixed ChatMessage in source/tests
    
    * Fix mypy errors for ChatMessage and Role API changes
    
    - durabletask: Use str() fallback in role value extraction
    - core: Fix ChatMessage in _orchestrator_helpers.py to use keyword args
    - core: Add type ignore for _conversation_state.py contents deserialization
    - ag-ui: Fix type ignore comments (call-overload instead of arg-type)
    - azure-ai-search: Fix get_role_value type hint to accept Any
    - lab: Move get_role_value to module level with Any type hint
    
    * Improve CI test timeout configuration
    
    - Increase job timeout from 10 to 15 minutes
    - Reduce per-test timeout to 60s (was 900s/300s)
    - Add --timeout_method thread for better timeout handling
    - Add --timeout-verbose to see which tests are slow
    - Reduce retries from 3 to 2 and delay from 10s to 5s
    
    This ensures individual test timeouts are shorter than the job
    timeout, providing better visibility when tests hang.
    
    With 60s timeout and 2 retries, worst case per test is ~180s.
    
    * Fix ChatMessage API usage in docstrings and source
    
    - Fix ChatMessage positional args in docstrings: _serialization.py, _threads.py, _middleware.py
    - Fix ChatMessage in tau2 runner.py
    - Fix role comparison in _orchestrator_helpers.py to use .value
    - Fix role comparison in _group_chat.py docstring example
    - Fix role assertions in test_durable_entities.py to use .value
    
    * Revert tool_choice/parallel_tool_calls changes - must be removed when no tools
    
    OpenAI API requires tool_choice and parallel_tool_calls to only be
    present when tools are specified. Restored the logic that removes
    these options when there are no tools.
    
    - Restored check in _chat_client.py to remove tool_choice and
      parallel_tool_calls when no tools present
    - Restored same logic in _responses_client.py
    - Reverted test to expect the correct behavior
    
    * fixed issue in tests
    
    * fix: resolve merge conflict markers in ag-ui tests
    
    * fix: restructure ag-ui tests and fix Role/FinishReason to use string types
    
    * fix: streaming function invocation and middleware termination
    
    - Refactor streaming function invocation to use get_final_response() on inner streams
    - Fix MiddlewareTermination to accept result parameter for passing results
    - Fix _AutoHandoffMiddleware to use MiddlewareTermination instead of context.terminate
    - Fix AgentMiddlewareLayer.run() to properly forward function/chat middleware
    - Remove duplicate middleware registration in AgentMiddlewareLayer.__init__
    - Fix exception handling in _auto_invoke_function to properly capture termination
    - Fix mypy errors in core package
    - Update tests to use stream=True parameter for unified run API
    
    * fix all tests command
    
    * Refactor integration tests to use pytest fixtures
    
    - Merge testutils.py into conftest.py for azurefunctions integration tests
    - Merge dt_testutils.py into conftest.py for durabletask integration tests
    - Convert all integration tests to use fixtures instead of direct imports
      (fixes ModuleNotFoundError with --import-mode=importlib)
    - Add sample_helper fixture for azurefunctions tests
    - Add agent_client_factory and orchestration_helper fixtures for durabletask
    - Integration tests now skip with descriptive messages when services unavailable
    - Restructure devui tests into tests/devui/ with proper conftest.py
    - Add test organization guidelines to CODING_STANDARD.md
    - Remove __init__.py from test directories per pytest best practices
    
    * Fix pytest_collection_modifyitems to only skip integration tests
    
    The hook was skipping all tests in the test session, not just
    integration tests. Now it only skips items in the integration_tests
    directory.
    
    * Fix mem0 tests failing on Python 3.13
    
    Use patch.object on the imported module instead of @patch with string
    path to ensure the mock takes effect regardless of import timing.
    
    * fix mem0
    
    * another attempt for mem0
    
    * fix for mem0
    
    * fix mem0
    
    * Increase worker initialization wait time in durabletask tests
    
    Increase from 2 to 8 seconds to allow time for:
    - Python startup and module imports
    - Azure OpenAI client creation
    - Agent registration with DTS worker
    - Worker connection to DTS
    
    This helps prevent test failures in CI where the first tests may run
    before the worker is fully ready to process requests.
    
    * Fix streaming test to use ResponseStream with finalizer
    
    The _consume_stream method now expects a ResponseStream that can provide
    a final AgentResponse via get_final_response(). Update the test to use
    ResponseStream with AgentResponse.from_updates as the finalizer.
    
    * Fix MockToolCallingAgent to use new ResponseStream API and update samples
    
    * small updates to run_stream to run
    
    * fix sub workflow
    
    * temp fix for az func test
    
    ---------
    
    Co-authored-by: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com>
  • [BREAKING] Python: Move orchestrations to dedicated package (#3685)
    * Move orchestrations to dedicated package
    
    * Merge main
    
    * Fix markdown links
    
    * Fix links
  • [BREAKING] Python: Refactor SharedState to State with sync methods and superstep caching (#3667)
    * Refactor SharedState to State with sync methods and superstep caching
    
    * Fixes
    
    * Address PR feedback
    
    * Remove dead links
    
    * Fix lab test import
  • Python: [BREAKING] Types API Review improvements (#3647)
    * Replace Role and FinishReason classes with NewType + Literal
    
    - Remove EnumLike metaclass from _types.py
    - Replace Role class with NewType('Role', str) + RoleLiteral
    - Replace FinishReason class with NewType('FinishReason', str) + FinishReasonLiteral
    - Update all usages across codebase to use string literals
    - Remove .value access patterns (direct string comparison now works)
    - Add backward compatibility for legacy dict serialization format
    - Update tests to reflect new string-based types
    
    Addresses #3591, #3615
    
    * Simplify ChatResponse and AgentResponse type hints (#3592)
    
    - Remove overloads from ChatResponse.__init__
    - Remove text parameter from ChatResponse.__init__
    - Remove | dict[str, Any] from finish_reason and usage_details params
    - Remove **kwargs from AgentResponse.__init__
    - Both now accept ChatMessage | Sequence[ChatMessage] | None for messages
    - Update docstrings and examples to reflect changes
    - Fix tests that were using removed kwargs
    - Fix Role type hint usage in ag-ui utils
    
    * Remove text parameter from ChatResponseUpdate and AgentResponseUpdate (#3597)
    
    - Remove text parameter from ChatResponseUpdate.__init__
    - Remove text parameter from AgentResponseUpdate.__init__
    - Remove **kwargs from both update classes
    - Simplify contents parameter type to Sequence[Content] | None
    - Update all usages to use contents=[Content.from_text(...)] pattern
    - Fix imports in test files
    - Update docstrings and examples
    
    * Rename from_chat_response_updates to from_updates (#3593)
    
    - ChatResponse.from_chat_response_updates → ChatResponse.from_updates
    - ChatResponse.from_chat_response_generator → ChatResponse.from_update_generator
    - AgentResponse.from_agent_run_response_updates → AgentResponse.from_updates
    
    * Remove try_parse_value method from ChatResponse and AgentResponse (#3595)
    
    - Remove try_parse_value method from ChatResponse
    - Remove try_parse_value method from AgentResponse
    - Remove try_parse_value calls from from_updates and from_update_generator methods
    - Update samples to use try/except with response.value instead
    - Update tests to use response.value pattern
    - Users should now use response.value with try/except for safe parsing
    
    * Add agent_id to AgentResponse and clarify author_name documentation (#3596)
    
    - Add agent_id parameter to AgentResponse class
    - Document that author_name is on ChatMessage objects, not responses
    - Update ChatResponse docstring with author_name note
    - Update AgentResponse docstring with author_name note
    
    * Simplify ChatMessage.__init__ signature (#3618)
    
    - Make contents a positional argument accepting Sequence[Content | str]
    - Auto-convert strings in contents to TextContent
    - Remove overloads, keep text kwarg for backward compatibility with serialization
    - Update _parse_content_list to handle string items
    - Update all usages across codebase to use new format: ChatMessage("role", ["text"])
    
    * Allow Content as input on run and get_response
    
    - Update prepare_messages and normalize_messages to accept Content
    - Update type signatures in _agents.py and _clients.py
    - Add tests for Content input handling
    
    * Fix ChatMessage usage across packages and samples
    
    Update all remaining ChatMessage(role=..., text=...) to use new
    ChatMessage('role', ['text']) signature.
    
    * Fix Role string usage and response format parsing
    
    - Fix redis provider: remove .value access on string literals
    - Fix durabletask ensure_response_format: set _response_format before accessing .value
    
    * Fix ollama .value and ai_model_id issues, handle None in content list
    
    - Fix ollama _chat_client: remove .value on string literals
    - Fix ollama _chat_client: rename ai_model_id to model_id
    - Fix _parse_content_list: skip None values gracefully
    
    * Fix A2AAgent type signature to include Content
    
    * Fix Role/FinishReason NewType dict annotations and improve test coverage to 95%
    
    * Fix mypy errors for Role/FinishReason NewType usage
    
    * Fix Role.TOOL and Role.ASSISTANT usage in _orchestrator_helpers.py
    
    * Fix Role NewType usage in durabletask _models.py
  • Python: [Breaking] Simplified Content types to a single class with classmethod constructors. (#3252)
    * ported Content to a new model
    
    * fixed linting
    
    * fixes
    
    * fixed data format handling
    
    * fix for 3.10 mypy
    
    * fix
    
    * fix int test
  • Python: [BREAKING]: Introducing Options as TypedDict and Generic (#3140)
    * WIP typeddict for options
    
    * updated all clients and ChatAgents
    
    * updated everything
    
    * added ADR
    
    * fix mypy
    
    * proper typevar imports
    
    * fixed import
    
    * fixed other imports
    
    * slight update in the sample
    
    * updated from feedback
    
    * fixes
    
    * fixed missing covariants and test fixes
    
    * fixed typing
    
    * updated anthropic thinking config
    
    * ruff fixes
    
    * fixed int tests
    
    * fix tests and mypy
    
    * updated integration tests
    
    * updated docstring and test fix
    
    * improved options handling in obser
    
    * mypy fix
    
    * updated a host of integration tests
    
    * fix tests
    
    * bedrock fix
  • Python: [BREAKING]: removed display_name, renamed context_providers, middleware and AggregateContextProvider (#3139)
    * removed display_name, renamed context_providers, middleware and AggregateContextProvider
    
    * fixes
    
    * fixed test
    
    * testfix
    
    * removed mistakenly put back test
    
    * updated new test
    
    * rename middlewares to middleware
    
    * middleware fixes
  • Python: Improve DevUI, add Context Inspector view as new tab under traces (#2742)
    * Improve DevUI, add Context Inspector view as new tab under traces
    
    * fix mypy errors
    
    * fix: Handle stale MCP connections in DevUI executor
    
    MCP tools can become stale when HTTP streaming responses end - the underlying
    stdio streams close but `is_connected` remains True. This causes subsequent
    requests to fail with `ClosedResourceError`.
    
    Add `_ensure_mcp_connections()` to detect and reconnect stale MCP tools before
    agent execution. This is a workaround for an upstream Agent Framework issue
    where connection state isn't properly tracked.
    
    Fixes MCP tools failing on second HTTP request in DevUI.
    
    fixes  #1476 #1515 #2865
    
    * fix #1572 report import dependency errors more clearly
    
    * Ensure there is streaming toggle where users can select streaming vs non streaming mode in devui . Fixes .NET: [Python] DevUI tool call rendering in non-streaming mode?
    
    * remove unused dead code
    
    * improve ux - workflows with agents show a chat component in execution timelien, also ensure magentic final output shows correctly
    
    * update ui build
    
    * update devui to use instrumentation instead of tracing, other instrumentation and type/instance check fixes
  • Python: Title: DevUI Fix WorkflowFailedEvent error extraction (#2706)
    * Title: Fix WorkflowFailedEvent error extraction to use details instead of error Body:
    Summary
    Fixed WorkflowFailedEvent mapping to extract error message from details.message instead of non-existent error attribute
    Added support for including details.extra context in error messages when present
    Problem
    The WorkflowFailedEvent handler in _mapper.py was reading event.error, but WorkflowFailedEvent uses a details attribute (of type WorkflowErrorDetails), not error. This caused all workflow failures to display "Unknown error" in the UI instead of the actual error message.
    Fix
    Updated the handler to match the pattern already used by ExecutorFailedEvent:
    Read from event.details instead of event.error
    Extract details.message for the error text
    Include details.extra context when available
    
    * improve error handling consistency
  • Python: DevUI, Fix message serialization issue, improve tests (#2674)
    * fix message serialization issue, improve tests for devui
    
    * update tests
  • Python: DevUI fixes : Add multimodal input support for workflows and refactor chat input (#2593)
    * show app version in devui .NET: Python: Improved Versioning for DevUI
    Fixes #2059
    
    * feat: Add multimodal input support for workflows and refactor chat input
    
    This PR adds support for multimodal content (images, files) in workflow
    inputs and refactors the chat input into a reusable component.
    
    ## Multimodal Workflow Support
    - Add `isChatMessageSchema()` to detect ChatMessage input schemas
    - Update `RunWorkflowButton` to use `ChatMessageInput` for ChatMessage workflows
    - Wrap multimodal content in OpenAI message format for backend processing
    - Add `_is_openai_multimodal_format()` to detect OpenAI ResponseInputParam
    - Update `_parse_workflow_input()` to route multimodal input through
      existing `_convert_input_to_chat_message()` converter
    
    ## Reusable ChatMessageInput Component
    - Extract chat input logic from agent-view into `ChatMessageInput` component
    - Support file upload, drag & drop, paste handling, and attachments
    - Add `useDragDrop` hook for parent-level drag handling with full-area
      drop zones
    - Refactor agent-view to use the new shared component
    
    ## Other Improvements
    - Add `isStreaming` prop to executor nodes for animation control
    - Clean up unused imports and state variables in agent-view
    - Add tests for multimodal workflow input handling
    
    Fixes workflow input not receiving images when using AgentExecutor nodes.
    
    * add self loop edge, fix #2470
    
    * fix test
  • Python: make tool call view optional in DevUI + other link fixes (#2243)
    * make tool call view optional in devui + other link fixes
    
    * fix #2310, ensure correct port is shown in command
    
    * fix dialog bug
    
    * ensure executor ids are tracked per items, fix bug where data from concurrent executors where not seperated properly fix #2351
    
    * fix: Enable multi-round human-in-the-loop (HIL) in DevUI workflows
    
    - Backend: Enrich RequestInfoEvents with response schemas in send_responses_streaming path
    - Frontend: Replace old HIL requests with new ones instead of accumulating them
    - Frontend: Fix HIL response state management to prevent sending stale request responses
    
    This allows workflows to properly handle sequential HIL requests, showing only the
    current request to users and progressing through multiple input rounds correctly.
    
    fixes #2334
    
    * fix bug to ensure in memory entities cannot be reloaded in ui
  • Python: Add checkpoint save and restore hooks to executor (#2097)
    * Add checkpoint hooks
    
    * Deprecate get_executor_state and set_executor_state
    
    * Fix tests and samples
    
    * Add doc strings
    
    * Add sample
    
    * Fix import
    
    * Address comments and fix tests
    
    * Address comments
    
    * conditional import
  • Python: Fix HIL regression (#2167)
    * fix devui regression from #2021 where all input is stringified but devui HIL input does not handle stringified json strings correctly.
    
    * update incorrect test
    
    * add devui hil input tests
  • Python: DevUI: Add OpenAI Responses API proxy support + HIL for Workflows (#1737)
    * DevUI: Add OpenAI Responses API proxy support with enhanced UI features
    
    This commit adds support for proxying requests to OpenAI's Responses API,
    allowing DevUI to route conversations to OpenAI models when configured to enable testing.
    
    Backend changes:
    - Add OpenAI proxy executor with conversation routing logic
    - Enhance event mapper to support OpenAI Responses API format
    - Extend server endpoints to handle OpenAI proxy mode
    - Update models with OpenAI-specific response types
    - Remove emojis from logging and CLI output for cleaner text
    
    Frontend changes:
    - Add settings modal with OpenAI proxy configuration UI
    - Enhance agent and workflow views with improved state management
    - Add new UI components (separator, switch) for settings
    - Update debug panel with better event filtering
    - Improve message renderers for OpenAI content types
    - Update types and API client for OpenAI integration
    
    * update ui, settings modal and workflow input form, add register cleanup hooks.
    
    * add workflow HIL support, user mode, other fixes
    
    * feat(devui): add human-in-the-loop (HIL) support with dynamic response schemas
    
    Implement  HIL workflow support allowing workflows to pause for user input
    with dynamically generated JSON schemas based on response handler type hints.
    
    Key Features:
    - Automatic response schema extraction from @response_handler decorators
    - Dynamic form generation in UI based on Pydantic/dataclass response types
    - Checkpoint-based conversation storage for HIL requests/responses
    - Resume workflow execution after user provides HIL response
    
    Backend Changes:
    - Add extract_response_type_from_executor() to introspect response handlers
    - Enrich RequestInfoEvent with response_schema via _enrich_request_info_event_with_response_schema()
    - Map RequestInfoEvent to response.input.requested OpenAI event format
    - Store HIL responses in conversation history and restore checkpoints
    
    Frontend Changes:
    - Add HILInputModal component with SchemaFormRenderer for dynamic forms
    - Support Pydantic BaseModel and dataclass response types
    - Render enum fields as dropdowns, strings as text/textarea, numbers, booleans, arrays, objects
    - Display original request context alongside response form
    
    Testing:
    - Add  tests for checkpoint storage (test_checkpoints.py)
    - Add schema generation tests for all input types (test_schema_generation.py)
    - Validate end-to-end HIL flow with spam workflow sample
    
    This enables workflows to seamlessly pause execution and request structured user input
    with type-safe, validated forms generated automatically from response type annotations.
    
    * improve HIL support, improve workflow execution view
    
    * ui updates
    
    * ui updates
    
    * improve HIL for workflows, add auth and view modes
    
    * update workflow
    
    * security improvements , ui fixes
    
    * fix mypy error
    
    * update loading spinner in ui
    
    ---------
    
    Co-authored-by: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com>
  • Python: DevUI: Use metadata.entity_id instead of model field (#1984)
    * DevUI: Use metadata.entity_id for agent/workflow name instead of model field
    
    * OpenAI Responses: add explicit request validation
    
    * Review feedback
  • Python: DevUI Fix Serialization, Timestamp and Other Issues (#1584)
    * refactor(devui): adopt standard OpenAI lifecycle events for agents and workflows
    
    - Replace custom workflow events with OpenAI Responses API standard lifecycle events
    - Add AgentStartedEvent, AgentCompletedEvent, AgentFailedEvent for clean separation
    - Implement ExecutorActionItem for workflow executor tracking
    - Convert informational events to trace events to reduce noise
    - Update README mapper table with comprehensive event mappings
    - Maintain full backward compatibility with legacy events
    
    * fix(devui): resolve timestamp overwriting and Content serialization errors
    
    - Fix tool call timestamps being overwritten on each render (#1483)
    - Add recursive Content serialization to handle ChatMessage and nested objects (#1548)
    - Implement proper MCP tool cleanup on server shutdown
    - Add timestamp field to function_result.complete events
    - Enhance credential and client resource cleanup
    
    Fixes #1483, #1548
    Partial improvements for #1476
  • Python: Add Function Approval UI to DevUI (#1401)
    * ensure function aproval is parsed correctly
    
    * udpate ui, add deployment guide button, other debug panel fixes
    
    * feat(devui): Implement lazy loading architecture with enhanced security and state management
    
    Major architectural improvements to DevUI for better performance, security, and developer experience:
    
    Performance & Architecture:
    - Implement lazy loading for entity discovery - entities loaded on-demand instead of at startup
    - Add hot reload capability for development workflow via new reload endpoint
    - Reduce startup time and memory footprint by deferring module imports
    
    Security Enhancements:
    - Remove remote entity loading capabilities (POST /v1/entities/add, DELETE endpoints)
    - DevUI now strictly local development tool - no remote code execution
    - Add explicit security documentation and best practices in README
    
    Frontend Improvements:
    - Migrate to Zustand for centralized state management (replacing prop drilling)
    - Add lightweight zero-dependency markdown renderer with code block copy support
    - Improve gallery UX with setup instructions modal instead of direct URL loading
    - Enhanced message UI with copy functionality and better token usage display
    
    Testing & Quality:
    - Expand test coverage for lazy loading, type detection, and cache invalidation
    - Add comprehensive tests for new behaviors (+231 lines of test code)
    - Improve type safety and documentation throughout
    
    Breaking Changes:
    - Remote entity loading via URLs is no longer supported
    - Entities must be loaded from local filesystem only
    
    * update ui issues, uupdate test descripion
  • Python: DevUI - Internal Refactor, Conversations API support, and per… (#1235)
    * Python: DevUI - Internal Refactor, Conversations API support, and performance improvements
    
    Comprehensive refactor of DevUI package including samples relocation,
    frontend reorganization, OpenAI Conversations API support, and critical
    performance and code quality improvements.
    
    Key Changes:
    
    Architecture & Organization
    - Moved DevUI samples to python/samples/getting_started/devui/
    - Consolidated with other framework samples for better discoverability
    - Added .env.example files and comprehensive README
    - Restructured frontend components into feature-based folders (agent, workflow, gallery, layout)
    - Created new OpenAI-compliant message renderers (devui should render oai responses types primarily)
    
    New Features
    - Added _conversations.py (467 lines) - Full conversation storage abstraction, replaces the /threads endpoint to better match oai conversations api
    - Implements OpenAI Conversations API for thread management, Supports in-memory and extensible storage backends
    
    API Simplification
    - Use 'model' field as entity_id (agent/workflow name) instead of extra_body
    - Use standard OpenAI 'conversation' field for conversation context.
    
    Performance & Quality Improvements
    - Improved context management in MessageMapper with bounded memory (~500KB max)
    - Implemented hybrid LRU + cleanup approach to prevent unbounded memory growth
    - General QOL improvement - Eliminated ~150 lines of dead/duplicate code, Consolidated helper functions into _utils.py, Extracted magic numbers to module-level constants, Optimized conversation item lookups with index-based approach
    
    Testing
    - Added test_conversations.py (13 tests)
    - Added test_performance_fixes.py (9 tests)
    - Updated existing tests for code consolidation
    - 53 tests passing
    
    Impact: 76 files changed: +4,106 insertions, -2,373 deletions
    All linting and formatting checks passing. No breaking changes - backward compatible.
    
    Migration: Samples moved to python/samples/getting_started/devui/
    
    * readme lint fixes
    
    * initial support for function approval and minor ui fixes
  • Python: DevUI improvements. (#1091)
    * enable deeplinking in ui, add agent details to entity info, add usage data, add middleware example in samples and foundry agent.
    
    * update ui build
    
    * Update python/packages/devui/frontend/src/components/workflow/workflow-input-form.tsx
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Update python/packages/devui/pyproject.toml
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Update python/packages/devui/pyproject.toml
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * imporove mapping for agent nodes and serialiation for agent run events
    
    * lint fixes
    
    * update pyproj toml and ui updates
    
    ---------
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  • Python: Default DevUI workflows to string input when start node is auto-wrapped agent (#1143)
    * DevUI workflows default to string input when start node is AgentExecutor
    
    * Remove unnecessary sample
    
    * Fix lint issue
  • Python: Bug fixes for devui serialization and agent structured outputs (#1055)
    * Bug fixes for devui serialization and agent structured outputs
    
    * Fix typing
    
    * Add mapper serialization unit tests
  • Python: [BREAKING] cleanup of thread API and serialization (#893)
    * cleanup of threads and serialization
    
    * fix for sliding window
    
    * fix redis test
    
    * updated from comments
    
    * updated context provider and threads
    
    * updated lock
    
    * add asyncio default
    
    * fix redis tests
    
    * fix tests
    
    * fix tests
    
    * renamed to invoking
    
    * fixed tests
    
    * fix for instructions
  • Python: Add DevUI to AgentFramework (#781)
    * add initial backend service code for devui
    
    * add tests
    
    * add frontendcode
    
    * ui updates
    
    * update readme
    
    * ui updates and tweaks
    
    * update ui bundle
    
    * improve ui, add react flow base
    
    * add react flow ui, fix background
    
    * update ui, fix introspection bug
    
    * update readme
    
    * update ui build
    
    * add support for multimodal input - both backend and frontend
    
    * update ui build
    
    * refactor as main framework package
    
    * backend and tests refactor
    
    * ui build update
    
    * ui build update and refactor
    
    * update pyproject.toml, update uv.lock
    
    * update ui build
    
    * ui update to fit oai responses types
    
    * add backend updat and readme update
    
    * mypy and other fixes
    
    * add intial dev guide
    
    * update ui and fix workflow bug
    
    * update ui build, add thread support
    
    * type fixes
    
    * update workflow view
    
    * update uv.lock
    
    * fix workflow iport errors
    
    * lint and other fixes
    
    * mypy fixes
    
    * minor update
    
    * update ui build
    
    * refactor to use oai dependencies directly, update examples to samples, improve typing
    
    * readme update
    
    * update ui and ui build
    
    * fix workflow pyright error
    
    * update ui, fix issues with run workflow placement, miniamp menu, etc
    
    * make samples integrate serve
    
    ---------
    
    Co-authored-by: Chris <66376200+crickman@users.noreply.github.com>
    Co-authored-by: Eric Zhu <ekzhu@users.noreply.github.com>