* python: replace pre-commit with prek, add PEP 723 script deps, clean up dev dependencies - Replace pre-commit with prek (Rust-native, faster pre-commit alternative) - Move supported hooks to repo: builtin for zero-clone speed - Add new builtin hooks: trailing-whitespace, check-merge-conflict, detect-private-key, check-added-large-files - Update all hook versions to latest (pre-commit-hooks v6, pyupgrade v3.21.2, bandit 1.9.3, uv-pre-commit 0.10.0) - Add PEP 723 inline script metadata to 34 samples with external deps - Remove autogen-agentchat/autogen-ext from dev deps (now declared per-sample) - Remove unused dev deps: pytest-env, tomli-w - Add agent-framework-core>=1.0.0b260130 lower bound to all 21 packages - Update CI workflow to use j178/prek-action - Update docs: DEV_SETUP.md, AGENTS.md, CODING_STANDARD.md, SAMPLE_GUIDELINES.md * updated lock * python: fix prek config paths for local execution and CI workflow Remove global 'files: ^python/' filter and strip python/ prefix from all path patterns in .pre-commit-config.yaml so prek finds files when run from the python/ directory. Update CI workflow to use --cd python instead of --config path. Include trailing whitespace fixes and dev dependency cleanup. * python: move helper scripts to scripts/ folder and exclude from checks * python: exclude AGENTS.md from prek markdown code lint * python: exclude AGENTS.md and azure_ai_search sample from markdown lint * fix m365 sample * python: ignore CPY rule for samples with PEP 723 headers * fix in dev_setup * python: replace aiofiles with regular open in samples * python: suppress reportUnusedImport in markdown code block checker * python: use samples pyright config for markdown code block checker Write a temp pyrightconfig.json matching pyrightconfig.samples.json rules (typeCheckingMode=off, only reportMissingImports and reportAttributeAccessIssue). Filter output to only fail on these rules since syntax-level errors (top-level await, undefined vars) are expected in README documentation snippets. * python: use markdown-code-lint with fixed globs instead of prek file list The prek-markdown-code-lint task received all changed files including non-README markdown and files with pre-existing broken imports. Replace with the standard markdown-code-lint task which uses the correct glob patterns (README.md, packages/**/README.md, samples/**/*.md). * python: exclude READMEs with pre-existing broken imports from markdown lint * python: fix broken README code snippets instead of excluding them - ag-ui: replace TextContent (removed) with content.type == 'text' - durabletask: fix import path to durabletask.worker.TaskHubGrpcWorker - orchestrations: use constructor params instead of .participants() method - observability: mark deprecated code blocks as plain text, filter reportMissingImports to agent_framework modules only - remove README excludes from markdown-code-lint task * add revision to gaia download * feat(python): parallelize checks across packages Run (package × task) cross-product in parallel using ThreadPoolExecutor and subprocesses. Key changes: - Add scripts/task_runner.py with shared parallel execution engine - Update run_tasks_in_packages_if_exists.py to accept multiple tasks - Update run_tasks_in_changed_packages.py with --files flag and parallel support - Add check-packages poe task (fmt+lint+pyright+mypy in parallel) - Add prek-markdown-code-lint and prek-samples-check with change detection - Split CI code quality workflow into parallel prek and mypy jobs - Update DEV_SETUP.md to document new parallel behavior Core package changes still trigger checks on all packages. * feat(ci): split code quality into 4 parallel jobs Split the single prek job into parallel jobs: - pre-commit-hooks: lightweight hooks (SKIP=poe-check) - package-checks: fmt/lint/pyright/mypy via check-packages - samples-markdown: samples-lint, samples-syntax, markdown-code-lint - mypy: change-detected mypy checks All 4 jobs run concurrently (×2 Python versions = 8 runners). * feat(ci): use only Python 3.10 for code quality checks * refactor(python): add future annotations and remove quoted types Add `from __future__ import annotations` to 93 package files that used quoted string annotations, then run pyupgrade --py310-plus to remove the now-unnecessary quotes. Fixes https://github.com/microsoft/agent-framework/issues/3578
Semantic Kernel → Microsoft Agent Framework Migration Samples
This gallery helps Semantic Kernel (SK) developers move to the Microsoft Agent Framework (AF) with minimal guesswork. Each script pairs SK code with its AF equivalent so you can compare primitives, tooling, and orchestration patterns side by side while you migrate production workloads.
What’s Included
What’s Included
Chat completion parity
- 01_basic_chat_completion.py — Minimal SK
ChatCompletionAgentand AFChatAgentconversation. - 02_chat_completion_with_tool.py — Adds a simple tool/function call in both SDKs.
- 03_chat_completion_thread_and_stream.py — Demonstrates thread reuse and streaming prompts.
Azure AI agent parity
- 01_basic_azure_ai_agent.py — Create and run an Azure AI agent end to end.
- 02_azure_ai_agent_with_code_interpreter.py — Enable hosted code interpreter/tool execution.
- 03_azure_ai_agent_threads_and_followups.py — Persist threads and follow-ups across invocations.
OpenAI Assistants API parity
- 01_basic_openai_assistant.py — Baseline assistant comparison.
- 02_openai_assistant_with_code_interpreter.py — Code interpreter tool usage.
- 03_openai_assistant_function_tool.py — Custom function tooling.
OpenAI Responses API parity
- 01_basic_responses_agent.py — Basic responses agent migration.
- 02_responses_agent_with_tool.py — Tool-augmented responses workflows.
- 03_responses_agent_structured_output.py — Structured JSON output alignment.
Copilot Studio parity
- 01_basic_copilot_studio_agent.py — Minimal Copilot Studio agent invocation.
- 02_copilot_studio_streaming.py — Streaming responses from Copilot Studio agents.
Orchestrations
- sequential.py — Step-by-step SK Team → AF
SequentialBuildermigration. - concurrent_basic.py — Concurrent orchestration parity.
- group_chat.py — Group chat coordination with an LLM-backed manager in both SDKs.
- handoff.py - Handoff coordination between agents.
- magentic.py — Magentic Team orchestration vs. AF builder wiring.
Processes
- fan_out_fan_in_process.py — Fan-out/fan-in comparison between SK Process Framework and AF workflows.
- nested_process.py — Nested process orchestration vs. AF sub-workflows.
Each script is fully async and the main() routine runs both implementations back to back so you can observe their outputs in a single execution.
Prerequisites
- Python 3.10 or later.
- Access to the necessary model endpoints (Azure OpenAI, OpenAI, Azure AI, Copilot Studio, etc.).
- Installed SDKs:
semantic-kerneland the Microsoft Agent Framework (pip install semantic-kernel agent-framework), or the repo’s editable packages if you are developing locally. - Service credentials exposed through environment variables (for example
OPENAI_API_KEY,AZURE_OPENAI_ENDPOINT,AZURE_OPENAI_KEY, or Copilot Studio auth settings).
Running Single-Agent Samples
From the repository root:
python samples/semantic-kernel-migration/chat_completion/01_basic_chat_completion.py
Every script accepts no CLI arguments and will first call the SK implementation, followed by the AF version. Adjust the prompt or credentials inside the file as necessary before running.
Running Orchestration & Workflow Samples
Advanced comparisons are split between samantic-kernel-migration/orchestrations (Sequential, Concurrent, Magentic) and samantic-kernel-migration/processes (fan-out/fan-in, nested). You can run them directly, or isolate dependencies in a throwaway virtual environment:
cd samples/semantic-kernel-migration
uv venv --python 3.10 .venv-migration
source .venv-migration/bin/activate
uv pip install semantic-kernel agent-framework
uv run python orchestrations/sequential.py
uv run python processes/fan_out_fan_in_process.py
Swap the script path for any other workflow or process sample. Deactivate the sandbox with deactivate when you are finished.
Tips for Migration
- Keep the original SK sample open while iterating on the AF equivalent; the code is intentionally formatted so you can copy/paste across SDKs.
- Threads/conversation state are explicit in AF. When porting SK code that relies on implicit thread reuse, call
agent.get_new_thread()and pass it into eachruncall. - Tools map cleanly: SK
@kernel_functionplugins translate to AF@toolcallables. Hosted tools (code interpreter, web search, MCP) are available only in AF—introduce them once parity is achieved. - For multi-agent orchestration, AF workflows expose checkpoints and resume capabilities that SK Process/Team abstractions do not. Use the workflow samples as a blueprint when modernizing complex agent graphs.