Fix Python SDK type issues with ty type checker#1122
Merged
mishushakov merged 22 commits intomainfrom Feb 12, 2026
Merged
Conversation
Resolve 43 type diagnostics reported by ty (Astral's Python type checker). Changes include: - Fixed Self type on class singletons to use concrete forward references - Added explicit type annotations for instance attributes shadowing static methods - Replaced None with UNSET sentinel for optional auto-generated API parameters - Fixed protocol mismatches and method signatures to align types - Added type: ignore suppressions for class_method_variant overload patterns and protocol structural subtyping edge cases All checks pass: ty check, ruff format, ruff check. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: f664028 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
The @overload declarations mixing @staticmethod/@classmethod with regular methods are fundamentally invalid in Python's type system. Remove them and keep only the @class_method_variant implementation. The runtime behavior (calling as both instance and class method) is unchanged via the descriptor. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix DockerfileParserInterface protocol: simplify copy.src to str (matching actual usage in parse_dockerfile), remove unused CopyItem import - Fix metadata type: use cast(Dict[str, str], ...) for auto-generated Union[Unset, Any] field after isinstance narrowing - Fix mcp type: use cast(Any, mcp) to bridge SDK McpServer type with auto-generated McpType0 (different representations of same data) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…d-override The child classes' _cls_connect returns Self while the parent returns the API Sandbox model. Renaming avoids the incompatible override. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract Unset isinstance checks into local variables for readability. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The downstream SandboxOpts types it as Optional[str] and checks `is not None`, so an empty string would incorrectly pass through. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
mishushakov
commented
Feb 9, 2026
| }, | ||
| headers=headers, | ||
| token=token, | ||
| token=token or "", |
Member
Author
There was a problem hiding this comment.
this is fine
E2B/packages/python-sdk/e2b/api/client/client.py
Lines 265 to 267 in 12c8d6e
Use self: str overloads to tell the type checker that methods like
Sandbox.kill("sandbox_id") and sandbox.kill() are both valid call
patterns. This avoids mixing @classmethod with instance method
overloads (which ty rejects as invalid-overload).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch from `self: str` overloads to `@classmethod` overloads so basedpyright can resolve the class method variants. Configure ty to ignore `invalid-overload` since the pattern is intentional. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch from @classmethod to @staticmethod on overloads to match the original code. @staticmethod doesn't add cls parameter so the parameter count stays consistent with the implementation, avoiding basedpyright's reportInconsistentOverload. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The class_method_variant pattern (dual instance/static dispatch) is inherently inexpressible in Python's type system, so the overload implementation can never match the static overload signature. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a CI workflow that runs type checking on PRs, mirroring the lint workflow. Add typecheck scripts to all packages (tsc for JS/TS, ty for Python). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…in permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
- Suppress no-matching-overload globally (ty bug with @staticmethod overloads) - Add per-path overrides for generated API client models and protobuf stubs - Add type annotations to test data dicts to fix union type inference - Add inline ty:ignore for pytest.skip false positives - Remove now-redundant inline suppression comments Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.
Revert `mcp` from `is not None` check back to truthiness check so empty dicts are treated as UNSET. Remove unnecessary local alias in get_sandbox_url and use self._sandbox_url directly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5b8435b to
be1f50b
Compare
matthewlouisbrockman
approved these changes
Feb 12, 2026
Contributor
matthewlouisbrockman
left a comment
There was a problem hiding this comment.
more typechecking! seems like not issues to me
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
All checks pass: ty check, ruff format, ruff check.
Note
Medium Risk
Mostly typing/CI changes, but some adjustments affect sandbox connect/pause overload dispatch and API response/parameter handling (
UNSETvsNone), which could alter edge-case runtime behavior.Overview
Fixes Python SDK static typing issues for Astral’s
tychecker and wires typechecking into CI.Adds a new
TypecheckGitHub Action plus workspacetypecheckscripts (TS packages viatsc, Python SDK viamake typecheckrunningty), and publishes a patch changeset for@e2b/python-sdk.Across the Python SDK, adjusts type annotations and overloads (e.g.,
Self/singleton typing,connectoverloads, optionaluser/token/domain handling), tightens API model parsing withcast/Optionalchecks andUNSETusage, and adds a few targetedtyignore comments in tests/protocols to silence checker limitations.Written by Cursor Bugbot for commit f664028. This will update automatically on new commits. Configure here.