release: 0.38.0#111
Conversation
|
🧪 Testing To try out this version of the SDK: Expires at: Sun, 31 May 2026 05:04:53 GMT |
🐤 Canary SummaryThis PR is a Python SDK release with no UI/UX changes affecting end users:
|
🐤 Canary Proposed TestsNo testable user journeys found for this PR. |
Confidence Score: 5/5 - Safe to MergeSafe 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:
|
8517aa7 to
9e83d93
Compare
9e83d93 to
d34485e
Compare
EntelligenceAI PR SummaryRelease v0.38.0 of the Hyperspell Python SDK introducing new API parameters, a custom headers env var, a path-selective deep copy utility, and multipart array format control.
Confidence Score: 3/5 - Review RecommendedLikely safe but review recommended — this PR introduces useful features including the Key Findings:
Files requiring special attention
|
|
Releases v0.38.0 with a new
|
|
Releases hyperspell v0.38.0 with an API enhancement, a deep copy performance improvement, and a test dependency update.
|
d34485e to
7c5dc69
Compare
7c5dc69 to
3aee06b
Compare
3aee06b to
4d6e79f
Compare
4d6e79f to
69f3e7d
Compare
69f3e7d to
2b93798
Compare
2b93798 to
3342428
Compare
3342428 to
5e40e1e
Compare
5e40e1e to
1929ac3
Compare
1929ac3 to
73ae0ce
Compare
73ae0ce to
6b93b1a
Compare
6b93b1a to
7c84d9e
Compare
7c84d9e to
8461559
Compare
8461559 to
eb64fed
Compare
eb64fed to
b166677
Compare
b166677 to
20a202a
Compare
20a202a to
b9d26a4
Compare
b9d26a4 to
b25541d
Compare
b25541d to
d44e2c9
Compare
d44e2c9 to
0c97422
Compare
0c97422 to
d6e30c6
Compare
d6e30c6 to
9da4eec
Compare
There was a problem hiding this comment.
Release v0.38.0 of the hyperspell Python SDK introducing new API parameters, a custom headers environment variable, and internal utility improvements.
- Custom headers: Both sync and async clients now parse
HYPERSPELL_CUSTOM_HEADERS(newline-delimitedKey: Value) and merge intodefault_headers(src/hyperspell/_client.py) - Array format control:
extract_files/_extract_itemsgain anarray_formatparameter (brackets,indices,repeat,comma) controlling multipart field name suffixes (src/hyperspell/_utils/_utils.py) - deepcopy refactor: Replaced
deepcopy_minimalwithdeepcopy_with_pathsfor path-selective shallow copying;deepcopy_minimalremoved from_utilsexports (src/hyperspell/_files.py,src/hyperspell/_utils/__init__.py,src/hyperspell/resources/memories.py) - New API parameters:
date(ISO 8601) added toMemoryUpdateParamsand memoryupdatemethods;recency_half_life_daysadded toOptionsinmemory_search_params.py - Type aliases relocated:
ArrayFormatandNestedFormatmoved from_qs.pyto_types.py - MCP badge URLs: Updated to scoped package name
@hyperspell/hyperspell-mcpinREADME.md - Scripts: Bootstrap hardened against
set -u;@stdy/clibumped to0.22.1in mock/test scripts - Tests: Added coverage for
array_format,deepcopy_with_paths, new API params; removedtest_deepcopy.py
| index=index, | ||
| flattened_key=flattened_key + "[]" if flattened_key is not None else "[]", | ||
| flattened_key=( | ||
| (flattened_key if flattened_key is not None else "") + _array_suffix(array_format, array_index) |
There was a problem hiding this comment.
Correctness: When flattened_key is None and _array_suffix returns "" (for "repeat" or "comma" formats), the new code passes flattened_key="" (empty string) to the recursive call instead of None; the downstream dict-handling branch checks if flattened_key is None to decide whether to assign key or append [key], so an empty string takes the else branch and produces a malformed key like "[fieldname]" instead of "fieldname".
🤖 AI Agent Prompt for Cursor/Windsurf
📋 Copy this prompt to your AI coding assistant (Cursor, Windsurf, etc.) to get help fixing this issue
In `src/hyperspell/_utils/_utils.py`, lines 142–144, the new expression `(flattened_key if flattened_key is not None else "") + _array_suffix(array_format, array_index)` converts a `None` flattened_key into an empty string `""` when `_array_suffix` returns `""` (e.g., for `"repeat"` or `"comma"` array formats). The recursive `_extract_items` call then sees `flattened_key=""`, which is not `None`, so the dict branch appends `[key]` instead of just using `key`, producing a leading-bracket malformed key. Fix by preserving `None` when the suffix is empty: use `(flattened_key + suffix) if flattened_key is not None else (suffix if suffix else None)` where `suffix = _array_suffix(array_format, array_index)`.
Automated Release PR
0.38.0 (2026-05-01)
Full Changelog: v0.37.0...v0.38.0
Features
Bug Fixes
Performance Improvements
Chores
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