Skip to content

release: 0.38.0#111

Merged
maebert merged 60 commits into
mainfrom
release-please--branches--main--changes--next
Jun 18, 2026
Merged

release: 0.38.0#111
maebert merged 60 commits into
mainfrom
release-please--branches--main--changes--next

Conversation

@stainless-app

@stainless-app stainless-app Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Automated Release PR

0.38.0 (2026-06-18)

Full Changelog: v0.37.0...v0.38.0

Features

Bug Fixes

  • client: add missing f-string prefix in file type error message (6dbd3ec)
  • use correct field name format for multipart file arrays (0f569cc)

Performance Improvements

  • client: optimize file structure copying in multipart requests (c28640c)

Chores

  • internal: more robust bootstrap script (d4a39dc)
  • internal: reformat pyproject.toml (19a83c3)
  • tests: bump steady to v0.22.1 (7d67d91)

This pull request is managed by Stainless's GitHub App.

The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.

For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.

🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions

@stainless-app

stainless-app Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor Author

🧪 Testing

To try out this version of the SDK:

pip install 'https://pkg.stainless.com/s/hyperspell-python/b25c1958b809f7957f354ce2b44cf3a84b8b01e0/hyperspell-0.37.0-py3-none-any.whl'

Expires at: Sat, 18 Jul 2026 00:06:16 GMT
Updated at: Thu, 18 Jun 2026 00:06:16 GMT

@canaries-inc

canaries-inc Bot commented Apr 18, 2026

Copy link
Copy Markdown

🐤 Canary Summary

This PR is a Python SDK release with no UI/UX changes affecting end users:

  • Version bump to 0.38.0 across all configuration files
  • Added date parameter to memories API for backend ranking/filtering
  • Updated API type definitions and test coverage
  • No user-facing UI components or changes present


View PR tests on Canary

@canaries-inc

canaries-inc Bot commented Apr 18, 2026

Copy link
Copy Markdown

🐤 Canary Proposed Tests

No testable user journeys found for this PR.

@entelligence-ai-pr-reviews

Copy link
Copy Markdown

Confidence Score: 5/5 - Safe to Merge

Safe to merge — this PR is a release bump to version 0.38.0 and the automated review found no issues across the reviewed files. No logic changes, security concerns, or correctness problems were identified, and there are no unresolved pre-existing comments to carry forward. The PR appears to be a standard version release with clean diffs.

Key Findings:

  • No review comments were generated by the automated analysis, indicating no detectable logic, security, or correctness issues in the changed files.
  • Zero critical, significant, or medium-severity issues were flagged by the heuristic analysis, consistent with a version bump or release preparation PR.
  • Coverage of 3/8 changed files leaves some files unreviewed, but for a release PR this is a low-risk gap — typically release commits touch changelogs, version files, and lock files which are low-risk by nature.

@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 8517aa7 to 9e83d93 Compare April 18, 2026 08:14
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 9e83d93 to d34485e Compare April 18, 2026 08:16
@entelligence-ai-pr-reviews

entelligence-ai-pr-reviews Bot commented Apr 18, 2026

Copy link
Copy Markdown

EntelligenceAI PR Summary

Releases v0.38.0 with breaking changes to MemorySearchParams and corresponding test updates.

  • effort field changed from int to Literal['minimal', 'low', 'medium', 'high', 'very_high'] in memory_search_params.py
  • New provenance: bool field added (restricted to effort='very_high')
  • Nine new source integrations added: granola, fathom, fireflies, linear, hubspot, salesforce, coda, lightfield, gong
  • OptionsReddit TypedDict and reddit key removed from Options
  • New recency_half_life_days: Optional[float] field added to Options for recency-based score decay
  • Test imports updated from Memory/Resource to MemoryGetResponse/MemoryListResponse
  • .stats.yml updated to 31 configured endpoints with refreshed spec and config hashes

Confidence Score: 3/5 - Review Recommended

Likely safe but review recommended — this release PR introduces meaningful breaking changes to MemorySearchParams (the effort field type change and new provenance field) and nine new source integrations, but carries two unresolved correctness concerns that should be addressed before merging. The Source type is declared in __all__ within src/hyperspell/types/shared/metadata.py but is not re-exported through either src/hyperspell/types/shared/__init__.py or the top-level src/hyperspell/types/__init__.py, meaning external consumers will receive an ImportError when attempting to use it as a public API. A pre-existing concern about flattened_key being passed as an empty string "" instead of None in _utils.py (around L140-L151) when _array_suffix returns "" for repeat/comma formats also remains open and could cause silent data corruption in serialization edge cases.

Key Findings:

  • Source is listed in __all__ in metadata.py but the export chain through src/hyperspell/types/shared/__init__.py and src/hyperspell/types/__init__.py is missing, making it impossible for downstream code to import Source from the documented public API path — a runtime ImportError for any consumer relying on this export.
  • The pre-existing bug in _utils.py L140-L151 where flattened_key=None combined with _array_suffix returning "" (for repeat or comma serialization formats) causes the recursive call to receive flattened_key="" instead of None, which can produce malformed query parameter keys silently rather than raising an error — this is not introduced by this PR but remains unresolved.
  • The breaking change to effort (from int to Literal['minimal', 'low', 'medium', 'high', 'very_high']) is a semver-appropriate change for a 0.38.0 release, and the accompanying test updates appear consistent, which is positive.
  • The removal of OptionsReddit TypedDict and the reddit key from Options is a clean breaking-change removal, but dependent integrations should verify no silent fallback behavior is introduced by the absence of the key.
Files requiring special attention
  • src/hyperspell/types/shared/metadata.py
  • src/hyperspell/types/shared/__init__.py
  • src/hyperspell/types/__init__.py
  • src/hyperspell/_utils/_utils.py
  • src/hyperspell/types/memory_search_params.py

@entelligence-ai-pr-reviews

Copy link
Copy Markdown

Releases v0.38.0 with a new date field on the memories update endpoint and a targeted deep copy utility replacing the previous full-copy approach in multipart requests.

  • Added date: str | datetime | None parameter to sync/async memories.update() and MemoryUpdateParams
  • Introduced deepcopy_with_paths in src/hyperspell/_files.py for selective container deep copying along specified key paths
  • Removed deepcopy_minimal from src/hyperspell/_utils/_utils.py and its export from src/hyperspell/_utils/__init__.py
  • Updated src/hyperspell/resources/memories.py to use deepcopy_with_paths with ['file'] path in both sync and async upload methods
  • Added 8 new tests in tests/test_files.py covering deepcopy_with_paths and mutation-safety with extract_files
  • Removed tests/test_deepcopy.py along with the deprecated utility
  • Version bumped in pyproject.toml, _version.py, and .release-please-manifest.json; OpenAPI spec hash refreshed in .stats.yml

@entelligence-ai-pr-reviews

Copy link
Copy Markdown

Releases hyperspell v0.38.0 with an API enhancement, a deep copy performance improvement, and a test dependency update.

  • Added optional date field (Union[str, datetime], ISO 8601) to MemoryUpdateParams and sync/async update methods in memories.py
  • Replaced deepcopy_minimal (removed from _utils/_utils.py and _utils/__init__.py) with the new deepcopy_with_paths utility in _files.py, which shallow-copies only containers along specified key paths
  • Updated memories.py upload methods to use deepcopy_with_paths imported from _files instead of _utils
  • Bumped @stdy/cli from 0.20.2 to 0.22.1 in scripts/mock and scripts/test
  • Updated OpenAPI spec URL/hash in .stats.yml
  • Removed tests/test_deepcopy.py; added TestDeepcopyWithPaths tests in tests/test_files.py
  • Version bumped to 0.38.0 in pyproject.toml, _version.py, and .release-please-manifest.json

@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d34485e to 7c5dc69 Compare April 22, 2026 18:30
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 7c5dc69 to 3aee06b Compare April 22, 2026 19:22
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 3aee06b to 4d6e79f Compare April 22, 2026 19:27
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 4d6e79f to 69f3e7d Compare April 22, 2026 19:39
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 69f3e7d to 2b93798 Compare April 22, 2026 19:52
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 2b93798 to 3342428 Compare April 22, 2026 23:12
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 3342428 to 5e40e1e Compare April 23, 2026 04:06
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 5e40e1e to 1929ac3 Compare April 23, 2026 22:30
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d730648 to 4f79c22 Compare June 4, 2026 18:31
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 4f79c22 to 8fb136a Compare June 4, 2026 20:32
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 8fb136a to b4d49c0 Compare June 10, 2026 17:32
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch 2 times, most recently from f765bce to c83f871 Compare June 10, 2026 20:26
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from c83f871 to 5099931 Compare June 11, 2026 17:31
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 5099931 to a3d1e1b Compare June 11, 2026 23:32
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from a3d1e1b to 167dfa7 Compare June 13, 2026 21:32
@entelligence-ai-pr-reviews

Copy link
Copy Markdown

File: src/hyperspell/types/shared/metadata.py

NIT MAINTAINABILITY Export Source through the shared and types package __init__.py

Source is declared in __all__ but shared/__init__.py only re-exports Metadata, and types/__init__.py only imports Metadata from .shared — so from hyperspell.types import Source or from hyperspell.types.shared import Source both fail, forcing users to reach into the internal metadata module.

Prompt to fix with AI

Copy this prompt into your AI coding assistant to fix this issue.

In src/hyperspell/types/shared/__init__.py, add `from .metadata import Source as Source` alongside the existing Metadata import. Then in src/hyperspell/types/__init__.py, update the import on line 6 from `from .shared import Metadata as Metadata, QueryResult as QueryResult` to also include `Source as Source`. This ensures callers can do `from hyperspell.types.shared import Source` or `from hyperspell.types import Source` rather than having to use the internal path `from hyperspell.types.shared.metadata import Source`.

@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 167dfa7 to 1d2895a Compare June 17, 2026 22:31
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 1d2895a to e192782 Compare June 17, 2026 23:32
@entelligence-ai-pr-reviews

Copy link
Copy Markdown

File: src/hyperspell/types/shared/metadata.py

MAJOR CORRECTNESS Export Source from shared and types init.py so it's publicly importable

Source is declared in __all__ but neither src/hyperspell/types/shared/__init__.py nor src/hyperspell/types/__init__.py re-exports it, so from hyperspell.types import Source (or from hyperspell.types.shared import Source) fails at runtime. Users annotating Metadata.sources fields have no stable public import path.

from .metadata import Metadata as Metadata, Source as Source
from .query_result import QueryResult as QueryResult
Prompt to fix with AI

Copy this prompt into your AI coding assistant to fix this issue.

In file `src/hyperspell/types/shared/__init__.py`, add `Source` to the re-export line so it reads:

    from .metadata import Metadata as Metadata, Source as Source

Then in `src/hyperspell/types/__init__.py`, update the shared import line to:

    from .shared import Metadata as Metadata, QueryResult as QueryResult, Source as Source

Without this, users of `Metadata.sources: Optional[List[Source]]` cannot import `Source` via the public package API (`from hyperspell.types import Source` raises ImportError).

@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from e192782 to ffa26c8 Compare June 18, 2026 00:06
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from ffa26c8 to de7e9fb Compare June 18, 2026 00:06
@maebert maebert merged commit 68b0474 into main Jun 18, 2026
7 checks passed
@stainless-app

stainless-app Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant