Add is_alive liveness-probe API across SDKs (decouple liveness from typed ping deserialization)
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
- 48/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Lĩnh vực
- api, backend-api-design, documentation
Hướng nghiên cứu
Bắt đầu với các điểm vào ping của Client được nêu trong rust/src/lib.rs:1676, nodejs/src/client.ts:1032, go/client.go:1317, dotnet/src/Client.cs:874 và client Python tương ứng, sau đó kiểm tra @github/copilot/schemas/api.schema.json. Chạy các bài kiểm thử SDK và bổ sung coverage cho một phản hồi JSON-RPC hợp lệ nhưng body của ping không thể được deserialization nghiêm ngặt. Được xem là hoàn tất khi mỗi Client có một phương thức liveness phù hợp với ngôn ngữ, các API ping đã typed hiện có không thay đổi và mỗi SDK đều tài liệu hóa sự phân biệt này.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
The Copilot CLI host (github/github-app) had to work around a deserialization failure in our SDK's typed ping() API on the session-resume / warm-CLI-pool / liveness-probe paths. See github/github-app#5461 for the workaround.
Their fix introduces a ping_cli_compat(&client) helper that drops to the raw client.call("ping", json!({})) so the result body is never deserialized — they only care whether the JSON-RPC round trip succeeded.
We should give them (and everyone doing liveness checks) a first-class primitive instead of forcing them to bypass our typed API.
Root cause
Across all five SDKs, ping() deserializes the response into a typed body:
- Rust:
Client::ping(&self) -> Result<PingResponse, Error>(rust/src/lib.rs:1676) - Node:
client.ping()returning{message, timestamp, protocolVersion?}(nodejs/src/client.ts:1032) - Go:
client.Ping(ctx, msg) (*PingResponse, error)(go/client.go:1317) - .NET:
client.PingAsync(...) : Task<PingResponse>(dotnet/src/Client.cs:874) - Python: equivalent typed return
The authoritative PingResult schema (@github/copilot/schemas/api.schema.json) requires message, timestamp (date-time string), and protocolVersion (integer > 0). The Rust hand-written PingResponse softens this with #[serde(default)] and Option<u32>, but that only helps for missing fields — wrong types (e.g. null timestamp, integer-shape drift) still fail. Same brittleness exists across the other SDKs.
ping is used by hosts as a liveness check (warm-pool reuse, resumed-session aliveness, retrier "is the cached client still alive" probes). These paths straddle CLI version boundaries — a resumed older CLI process can answer with a slightly different ping body shape, and the entire liveness check fails even though the RPC itself succeeded.
This is exactly the wrong failure mode for a health check: the consumer asked "is the CLI reachable?" and we answered "no" because of a body-shape mismatch.
Proposed fix
Add a dedicated liveness-probe API to every SDK Client:
- Sends the
pingJSON-RPC call. - Returns success based solely on JSON-RPC success — never deserializes the result body.
- Composable with caller-supplied timeouts — no baked-in timeout, so each host (startup probe, warm-pool, resume probe, background keepalive) sets its own budget.
ping()and generatedrpc.ping()stay strict and schema-faithful. Callers who actually want the typed data keep getting it; schema drift continues to surface there as a real error.
Per-language names:
| SDK | API |
|---|---|
| Rust | Client::is_alive(&self) -> bool |
| Node | client.isAlive(): Promise<boolean> |
| Python | client.is_alive() -> bool |
| Go | client.IsAlive(ctx context.Context) bool |
| .NET | client.IsAliveAsync(ct) : Task<bool> |
After this lands, the github/github-app workaround helper goes away and call sites become e.g. existing.is_alive().await.
Rejected alternatives
- Loosen
ping()itself. Considered and rejected.ping()is a typed schema-backed API; if it silently swallows malformed bodies, the contract becomes ambiguous (did the caller want liveness, or the ping data?). It also masks real CLI/schema drift in the API most likely to catch it. - Loosen the generated
rpc.ping(PingRequest). Same reasoning, more so — generated APIs must remain schema-faithful.is_aliveis the explicit escape hatch. - "Fix it only in the CLI." The CLI should still honor the schema, and we should investigate any drift. But liveness checks fundamentally straddle version boundaries, so the SDK needs a body-agnostic primitive regardless.
Acceptance criteria
- New
is_alive/IsAlive/isAlivemethod on the Rust, Node, Python, Go, and .NETClienttypes. - Method calls the
pingJSON-RPC method and returns success purely on RPC success, ignoring the response body. - Existing
ping()/rpc.ping()typed APIs unchanged. - Docs in each SDK clearly distinguish "use
is_alivefor liveness/warm-pool/resume checks" from "useping()when you want the typed response." - Tests cover the case where the CLI returns a
pingbody that fails strict deserialization but is otherwise a valid JSON-RPC success —is_alivereturnstrue,ping()returns an error. - Once shipped, the workaround in github/github-app#5461 is removed.
Design review
Reviewed and agreed with GPT-5.5; consensus on:
- Separate
is_aliveAPI (not looseningping). - Keep generated
rpc.pingstrict. - No baked-in timeout; caller composes timeouts.
- Name
is_aliveclearly communicates intent ("RPC round trip succeeded") and beatsping_raw/ping_check.
- 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ự
-
certification
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 80/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
[BUG] ECR GetAuthorizationToken returns a proxyEndpoint for the default region, not the request's Đang mởbug ecr
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
Needs: Triage Type: Feature request
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
AntennaPod/AntennaPod#8794 ·
-
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