Skip to content

Python: [Feature]: Support response_format (structured output) in GitHubCopilotAgent #9809

Description

Problem

GitHubCopilotAgent ignores response_format. Passing a Pydantic model or JSON Schema through options or default_options does not constrain the model output and AgentResponse.value is never populated. The option is not forwarded to the Copilot SDK; instead it is merged into the create_session keyword arguments, where it is not a valid parameter.

The Copilot SDK now supports provider-native structured output (github/copilot-sdk#2590, included since SDK v1.0.15, so already covered by our github-copilot-sdk>=1.0.16 pin). send and send_and_wait accept response_schema (a Pydantic model or a JSON Schema dict), which is sent to the runtime as a strict json_schema response format for that run.

Use Case and Evidence

Agents backed by GitHub Copilot should be able to return typed results the same way other Agent Framework providers do:

agent = GitHubCopilotAgent(...)
response = await agent.run("What is 19 + 23?", options={"response_format": Answer})
print(response.value)  # Answer(value=42)

Desired Outcome

  • response_format (Pydantic model type or JSON Schema mapping) is accepted in GitHubCopilotOptions, both per run and via default_options.
  • It is forwarded as response_schema to send_and_wait (non-streaming) and send (streaming), and is not leaked into create_session.
  • AgentResponse.value is parsed from the final text for both streaming and non-streaming runs.

Alternatives Considered

Calling send_and_wait_typed directly on the SDK session is not an option from the agent, since the agent owns the session lifecycle.

Activity

  1. added
    pythonUsage: [Issues, PRs], Target: Python
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Oct 28, 2026
  2. removed
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Oct 28, 2026
  3. eavanvalkenburg commented on Nov 2, 2026

    @eavanvalkenburg
    Member

    /plan Use the existing maintainer-directed core structured-output work in #9810; do not reopen the ownership question or start a competing implementation. Plan/verify response_format routing for run/default options, exclusion from create_session, supported SDK-floor response_schema behavior and Pydantic/mapping schemas, with shared Response-class value parsing as already requested. Preserve existing model configuration and alias/name-validation behavior across all core providers rather than imposing a Copilot-only alias policy globally; check supported Pydantic versions and invalid-JSON/schema-error behavior. The author reports the child-idle termination fix in 565d65f and the current diff includes it: verify it rather than repeating it as an unfixed finding. Cover child idle before root JSON, root versus child text/preamble/final boundaries, and normal as well as structured streaming because the termination change affects both. Existing reviewer direction is current input, not a minor-ready scope: public option/shared parsing/streaming compatibility exceeds the threshold. Preserve current labels and assignee; no new assignment/readiness pending the current plan.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

agentsUsage: [Issues, PRs], Target: Single agentpythonUsage: [Issues, PRs], Target: Python

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions