* Python: forward GitHubCopilotOptions verbatim to create_session Refactor the GitHub Copilot agent to forward the full options dict to the Copilot SDK's create_session/resume_session instead of hand-mapping a fixed subset. GitHubCopilotOptions stays as the curated, typed surface, but any other create_session parameter (reasoning_effort, context_tier, enable_citations, ...) is now passed through verbatim. Unknown keys surface as TypeError from the SDK instead of being silently dropped. De-duplicates the near-identical _create_session/_resume_session bodies into a shared _build_session_kwargs helper. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f9d016d5-4d8c-43f0-a8fb-f3cf3d1ad7eb * Python: address review feedback on GHCP options passthrough - Strip agent-internal/client-level keys (on_pre_tool_use, on_function_approval, timeout, cli_path, log_level, base_directory) from the forwarded kwargs so they cannot leak into create_session/resume_session and raise TypeError. - Source caller tools from the merged options layer so tools supplied via default_options are honored instead of silently dropped. - Honor a caller-supplied native 'hooks' dict in _build_session_hooks (composing with the on_pre_tool_use shortcut) instead of unconditionally overwriting it. - Validate mock create_session/resume_session calls against the real SDK signatures in tests so invalid kwargs surface as TypeError, and add regression tests for the passthrough contract. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f9d016d5-4d8c-43f0-a8fb-f3cf3d1ad7eb * Python: avoid redundant re-read of model in _build_session_kwargs model is popped from default_options into settings at init, so a per-run model already lands in the merged kwargs. Keep that value when present and only fall back to the resolved setting otherwise, instead of re-reading opts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f9d016d5-4d8c-43f0-a8fb-f3cf3d1ad7eb --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Get Started with Microsoft Agent Framework GitHub Copilot
Please install this package via pip:
pip install agent-framework-github-copilot --pre
GitHub Copilot Agent
The GitHub Copilot agent enables integration with GitHub Copilot, allowing you to interact with Copilot's agentic capabilities through the Agent Framework.
Tool approval (approval_mode="always_require")
The GitHub Copilot SDK owns the tool-calling loop for this provider, so approval for custom function tools is enforced through the SDK's native pre-execution hook rather than the standard Agent Framework approval round-trip.
When you register a FunctionTool declared with approval_mode="always_require" and you
do not supply your own on_pre_tool_use hook, GitHubCopilotAgent installs a default
on_pre_tool_use hook that returns "ask" for that tool and defers (None) for all other
tools. The "ask" decision routes to your on_permission_request handler, where you
approve or deny the call:
from agent_framework import tool
from agent_framework.github import GitHubCopilotAgent, GitHubCopilotOptions
from copilot.session import PermissionHandler
@tool(approval_mode="always_require")
def delete_file(path: str) -> str:
"""Delete a file."""
...
agent = GitHubCopilotAgent(
tools=[delete_file],
# The "ask" decision is routed here; approve or deny the call.
default_options=GitHubCopilotOptions(on_permission_request=PermissionHandler.approve_all),
)
⚠️ If you provide your own
on_pre_tool_usehook, it takes precedence and the agent does not install its default approval hook. In that case you are fully responsible for enforcing approval — including for anyapproval_mode="always_require"tool (e.g. by returning a"deny"or"ask"decision). The agent logs a warning naming any approval-required tool that your hook must handle.Note: with the default (deny-all) permission handler, an
always_requiretool is denied unless you wire an approvingon_permission_request.
Deprecated: on_function_approval
The on_function_approval callback is deprecated. It still works (and is still enforced
inside the tool handler for backward compatibility), but it emits a DeprecationWarning and
will be removed in a future version. Migrate to the on_pre_tool_use + on_permission_request
model described above. When on_function_approval is set, it gates always_require tools and
the default ask-hook is not installed. It is mutually exclusive with on_pre_tool_use —
setting both (whether at construction or per run) raises ValueError.