Support structured outputs (JSON schema) per message, passed through to provider
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 38/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- java, typescript
- Lĩnh vực
- api, backend-api-design
Hướng nghiên cứu
Bắt đầu từ API sendMessage hoặc API tương đương và theo dõi cách các tùy chọn theo từng message đi đến các request của provider OpenAI và Anthropic. Sau đó, tiếp tục theo dõi các luồng hoàn tất và streaming của assistant message, cùng với các hook preToolUse và interceptor raw-HTTP. Công việc được xem là hoàn tất khi responseFormat được giữ nguyên, structuredOutput được cung cấp trên assistant message, các provider không được hỗ trợ báo cáo lỗi rõ ràng và các tiêu chí chấp nhận được liệt kê đều được đáp ứng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
The Copilot SDK should expose first-class support for structured outputs (JSON schema–constrained responses) when targeting model providers that natively support the feature — OpenAI (response_format: { type: "json_schema", ... }) and Anthropic (structured output / tool-schema). The schema must be settable per message and passed through unchanged to the provider.
Motivation
The primary use case is deterministic agent flows that operate on the output of Copilot Studio agents.
In Copilot Studio, an agent turn is frequently a step inside a larger orchestrated agent flow — its output is not just rendered to a user, it's fed into:
- Agent flows that expect specific fields in the output
- Routing/branching logic that switches on a category, intent, or decision
These consumers require stable, schema-validated JSON from the agent turn. Today the SDK only emits free-form assistant text, which forces every agent flow to either:
- Post-parse model prose with regex / JSON-extraction heuristics — brittle and silently breaks when the model rephrases.
- Coerce JSON via a fake single-tool tool-call — adds a round-trip per turn, pollutes tool-use telemetry, and confuses
preToolUsehooks and authoring UX. - Rewrite the outgoing HTTP body in an LLM interceptor to inject
response_format— fights the SDK's own retry/streaming logic and is unsupported.
Both OpenAI and Anthropic already accept a JSON schema directly on the request. The SDK is the only layer blocking Copilot Studio from getting deterministic agent output end-to-end.
Proposed API
Structured output must be per message, because different turns in an agent flow need different schemas (classify → plan → extract → summarize).
await session.sendMessage({
content: "Classify this support ticket.",
responseFormat: {
type: "json_schema",
schema: {
name: "TicketClassification",
strict: true,
schema: {
type: "object",
properties: {
category: { type: "string", enum: ["billing", "technical", "other"] },
priority: { type: "string", enum: ["low", "medium", "high"] },
summary: { type: "string" }
},
required: ["category", "priority", "summary"],
additionalProperties: false
}
}
}
});
Requirements
- Per-message setting —
responseFormataccepted onsendMessage/ equivalent. Optional; absent ⇒ current behavior. - Schema passthrough — Forwarded verbatim to the provider request:
- OpenAI BYOM:
response_format: { type: "json_schema", json_schema: <schema> } - Anthropic BYOM: equivalent structured output / tool-schema mechanism
- OpenAI BYOM:
- Typed result on the assistant message — Parsed JSON exposed on the resulting message (e.g.,
message.structuredOutput) so agent flows can bind to fields without re-parsing. - Streaming compatible — Final structured payload available on turn completion.
- Hook/interceptor friendly —
preToolUsehooks and raw-HTTP interceptors observe the schema in the outgoing body unchanged. - Provider capability check — Clear error if the target provider does not support structured output (rather than silently dropping the field).
Non-goals
- Inventing a new schema dialect — accept JSON Schema as the providers do.
- Cross-provider schema translation beyond what each provider natively accepts.
Acceptance criteria
-
responseFormat(JSON schema) accepted on per-message send APIs - Forwarded verbatim to OpenAI and Anthropic provider requests
- Sructured payload exposed on the resulting assistant message
- Works with streaming and with existing hook/interceptor surfaces
- Clear error when targeting a provider that doesn't support it
References
- OpenAI Structured Outputs: https://platform.openai.com/docs/guides/structured-outputs
- Anthropic structured output / tool schemas: https://docs.anthropic.com/en/docs/build-with-claude/tool-use
- Ngôn ngữ chính
- Java
- Star
- 10.5k
- Fork
- 1.5k
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 130
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của github/copilot-sdk
-
agentic-workflows
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
github/copilot-sdk#2760 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
github/copilot-sdk#2759 ·
-
documentation
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
github/copilot-sdk#2758 ·
-
agentic-workflows
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
github/copilot-sdk#2709 · 1 bình luận ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 78/100
github/copilot-sdk#2673 ·
Tất cả issue của github/copilot-sdk
Issue tương tự
-
awaiting triage bug Causes friction Hop Gui P1 P2 Transforms
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
apache/flink-agents#1152 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
jenkinsci/blueocean-plugin#5417 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
objectionary/eo-graphs#75 ·