Skip to content

Add Scout semantic and hybrid search and the Turbopuffer engine - #50

Merged
binaryfire merged 2 commits into
0.4from
upstream-sync-framework-15
Oct 3, 2026
Merged

binaryfire merged 2 commits into
0.4from
upstream-sync-framework-15

Conversation

@binaryfire

@binaryfire binaryfire commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

This adds Scout's semantic and hybrid search and its Turbopuffer engine from laravel/scout 11.x at ce2542f5a7: laravel/scout pull requests 1007, 1008, 1009 and 1012. They're ported together because they share the builder API, configuration, engine manager, test fixtures and documentation, and pull request 1012 reworks 1008's Meilisearch embedding code. The documentation follows laravel/docs 13.x at 2bb1a3edca.

Scout can't generate embeddings yet, so semantic and hybrid search work with each engine's native embeddings or with precomputed vectors. Details are below.

What it adds

  • semantic() and hybrid() on the search builder. semantic() ranks results by vector similarity, with an optional minimum similarity. hybrid() combines full-text and semantic ranking using the given weights. Engines that support them implement SupportsSemanticSearch. On other engines, a semantic search throws NotSupportedException and a hybrid search runs as a normal full-text search.
  • Meilisearch runs both through its hybrid search parameter with the configured embedder, and the minimum similarity becomes rankingScoreThreshold. With the meilisearch embedding driver, Meilisearch embeds documents and queries itself; Scout adds no document vectors and leaves any _vectors the model supplies alone. Otherwise, toSearchableEmbedding() returns a precomputed embedding, which Scout adds to _vectors under the embedder's name, and searches pass their query embedding through the vector option.
  • Typesense supports its own embedding fields with the typesense driver. Semantic searches then query only the embedding field, and hybrid searches add it to query_by when it isn't already listed. Otherwise, precomputed embeddings are stored in the configured attribute and searches pass their query embedding through the vector option. Any search that sends a vector_query goes through Typesense's multi-search endpoint, because a serialized query embedding can exceed the query string length limit. That covers searches with a query embedding, hybrid weighting or a minimum similarity; a native semantic search without a minimum similarity sends no vector_query and uses the normal search endpoint. Multi-search errors become the same Typesense exceptions as normal search errors, so a missing collection is still created and the search retried.
  • A Turbopuffer engine. Full-text searches rank with BM25 across the model's weighted searchable attributes, semantic searches use approximate nearest neighbor search on the embedding attribute, and hybrid searches run both and merge them with weighted reciprocal rank fusion. Embeddings are either generated by Turbopuffer from a string attribute through the schema's embed setting, or precomputed. Scout sends the configured schema and distance metric with each write. Turbopuffer has no similarity threshold, so, as upstream, it ignores minSimilarity; the documentation now says which engines apply it.

Hypervel adaptations and fixes

  • The semantic search check runs after Hypervel's builder preparation callback, so a callback that switches a search to semantic is checked too.
  • Turbopuffer keeps Hypervel's document and index-settings preparation callbacks and operation reporting. It also supports filtered deletion through DeletesByFilter. Turbopuffer deletes a limited number of matches per request, so Scout repeats the request while Turbopuffer reports remaining matches, and reports it as one operation. Deletion requires a filter, and an empty filters option doesn't count as one.
  • Turbopuffer requests use Hypervel's HTTP client and are tagged for Telescope, so Scout now requires hypervel/http.
  • Turbopuffer returns a 404 for a namespace that was never written or has been flushed. Upstream let that error through, so scout:import --fresh failed on a new index and searches failed after a flush. Searches and pagination now return no results, and deletes and flushes do nothing.
  • Paginated Turbopuffer full-text searches counted every document matching the filters, but BM25 only returns documents that contain a query token. The paginator reported pages with no results. The count now only includes documents with a query token in a weighted searchable attribute.
  • Turbopuffer pagination rejected the paginator's own last page. With 15 results per page, the last of 10,000 results are on page 667, which ends past the 10,000th result, so upstream threw. Only pages that start past the 10,000th result are rejected now.
  • Typesense hybrid searches with native embeddings now disable prefix search on the embedding field when it's already listed in query_by. Upstream only did this when Scout added the field itself, and Typesense rejects prefix searches on fields with a remote embedder.

Not available yet

The default hypervel-ai embedding driver can't generate embeddings, because Hypervel doesn't have the Laravel AI SDK. It throws when a model's toSearchableEmbedding() returns text, or when a search needs a query embedding and none is given. The database engine's semantic and hybrid search always generate the query embedding, so the database engine doesn't support them yet: semantic searches throw and hybrid searches fall back to full-text search. The Scout documentation, README and Laravel porting guide describe this.

The changed tests, the Scout test suite, the Meilisearch and Typesense integration tests, formatting and static analysis pass locally. Turbopuffer is tested with faked HTTP responses, since there's no Turbopuffer service to test against.

Note

Add Scout semantic/hybrid search and the Turbopuffer engine

  • Adds Builder::semantic() and Builder::hybrid() query modes with validated weights and minimum similarity; engines implement the new SupportsSemanticSearch marker contract. Semantic search on unsupported engines throws NotSupportedException, while hybrid search falls back to normal full-text search.
  • Adds a new TurbopufferEngine with a TurbopufferClient/TurbopufferNamespace service layer, driver registration in EngineManager, a turbopuffer config section, and a TelescopeTag::Turbopuffer tag.
  • Extends MeilisearchEngine and TypesenseEngine with per-model embedding settings, embedding enrichment during indexing, and native or precomputed vector support for semantic and hybrid queries. Typesense vector queries route through the multi-search endpoint with mapped error exceptions.
  • Scout cannot generate embeddings via the Laravel AI SDK; generateEmbeddings throws ScoutException and models must supply precomputed vectors or use engine-native embeddings.
  • Risk: behavioral changes include semantic mode being rejected on engines without SupportsSemanticSearch during builder preparation (see Builder::preparedEngine in Builder.php), hybrid weight/similarity validation, and Turbopuffer HTTP 202 responses raising ScoutException.

Macroscope summarized 6e77511.

Ports laravel/scout #1007, #1008, #1009 and #1012 together, because
they share the Builder API, configuration, EngineManager, fixtures and
documentation, and #1012 reworks #1008's Meilisearch embedding code.

The Builder gains semantic() and hybrid(). Engines that implement
SupportsSemanticSearch run them; others reject semantic searches and
run hybrid searches as normal text searches. The capability check runs
after the Builder preparation callback, so a callback that enables
semantic search is checked too.

Meilisearch and Typesense support native embedders and precomputed
document embeddings. Their query vectors come from the native embedder
or the vector option. Typesense sends semantic and hybrid searches
through its multi-search endpoint, because a serialized embedding can
exceed the query string length. Native hybrid searches also disable
prefix search on the embedding field when it is already in query_by;
upstream left the default prefix enabled there, which Typesense
rejects for remote embedders.

The new Turbopuffer engine keeps Hypervel's document and index-settings
preparation callbacks and operation reporting. Filtered deletion
repeats the request while Turbopuffer reports remaining matches, under
one reported operation. Two upstream defects are fixed:

- Turbopuffer returns 404 for a namespace that was never written or
  has been flushed. Searches and pagination now return no results,
  and deletes and flushes do nothing, instead of failing
  scout:import --fresh and searches after a flush.
- Paginated full-text totals counted every filtered document. They
  now count only documents containing a query token in a weighted
  searchable attribute, matching what BM25 ranking returns.

Turbopuffer requests are tagged for Telescope, and Scout now requires
hypervel/http. Scout cannot generate embeddings yet, so the default
embedding driver (hypervel-ai) reports that generation is unavailable,
and the database engine does not support semantic search. The Scout
documentation, README and porting guide describe this.

Upstream reference: laravel/scout 11.x at ce2542f5a7; laravel/docs 13.x
at 2bb1a3edca.

Validation: the changed test files, the Scout test suite, Meilisearch
and Typesense integration tests, formatting and PHPStan pass.
Turbopuffer is tested with HTTP fakes.
@coderabbitai

coderabbitai Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: hypervel/components-backup/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: acfd285e-c5fd-45c9-9177-1629b8cde814

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Add Scout semantic and hybrid search with a Turbopuffer engine

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Add semantic and hybrid search for Meilisearch, Typesense, and the new Turbopuffer engine.
• Support native or precomputed embeddings; document Hypervel's inability to generate embeddings.
• Fix Turbopuffer missing-namespace and pagination behavior, and Typesense native-embedding prefix
 searches.
Diagram

sequenceDiagram
    participant B as Scout Builder
    participant M as Engine Manager
    participant E as Search Engine
    participant H as HTTP Client
    participant S as Search Service
    B->>M: Resolve configured engine
    M-->>B: Engine instance
    alt Supported semantic or hybrid search
        B->>E: Prepared search
        E->>H: Engine-specific query
        H->>S: Search request
        S-->>E: Ranked results
        E-->>B: Search results
    else Unsupported semantic search
        B-->>B: Throw NotSupportedException
    else Unsupported hybrid search
        B->>E: Run full-text search
    end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Centralize embedding preparation
  • ➕ Could eliminate repeated document-embedding validation and batching across engines.
  • ➕ Would provide one integration point if Hypervel later gains embedding generation.
  • ➖ Must still accommodate distinct backend vector formats and native-embedding behavior.
  • ➖ Adds an abstraction before a shared generation implementation exists.

Recommendation: Keep backend-specific query translation and native-embedding handling: Meilisearch, Typesense, and Turbopuffer expose materially different search APIs. The repeated precomputed-embedding preparation is a reasonable future extraction point, but centralizing it now would add coordination without enabling embedding generation.

Files changed (26) +3962 / -41

Enhancement (10) +1785 / -31
TelescopeTag.phpIdentify Turbopuffer requests in Telescope +2/-0

Identify Turbopuffer requests in Telescope

• Adds a Turbopuffer tag and description for Scout's HTTP requests.

src/contracts/src/Telescope/TelescopeTag.php

Builder.phpAdd semantic and hybrid builder modes +72/-0

Add semantic and hybrid builder modes

• Adds semantic similarity and weighted hybrid search options with query and weight validation. Checks semantic capability after builder preparation, while allowing unsupported engines to run hybrid queries as full-text searches.

src/scout/src/Builder.php

SupportsSemanticSearch.phpMark engines supporting semantic search +15/-0

Mark engines supporting semantic search

• Introduces a capability interface used by the builder to distinguish supporting engines from full-text-only engines.

src/scout/src/Contracts/SupportsSemanticSearch.php

EngineManager.phpResolve Turbopuffer and pass embedding settings +21/-2

Resolve Turbopuffer and pass embedding settings

• Registers Turbopuffer engine construction and passes per-engine configuration to the Meilisearch and Typesense engines.

src/scout/src/EngineManager.php

MeilisearchEngine.phpTranslate semantic searches to Meilisearch hybrid queries +213/-17

Translate semantic searches to Meilisearch hybrid queries

• Supports native and precomputed embeddings, adding precomputed vectors before document preparation without replacing unrelated vectors. Converts semantic weights and minimum similarity into Meilisearch search parameters, and reports unavailable Hypervel embedding generation.

src/scout/src/Engines/MeilisearchEngine.php

TurbopufferEngine.phpImplement the Turbopuffer Scout engine +912/-0

Implement the Turbopuffer Scout engine

• Adds indexing, weighted BM25, native-embedding ANN, weighted reciprocal-rank-fusion hybrid search, filtering, hydration, and pagination. Preserves preparation callbacks and operation reporting, repeats partial filtered deletions, treats missing namespaces as empty, and counts only text-query matches for full-text pagination.

src/scout/src/Engines/TurbopufferEngine.php

TypesenseEngine.phpAdd Typesense vector queries and safe transport +383/-12

Add Typesense vector queries and safe transport

• Supports native and precomputed embeddings, semantic and weighted hybrid parameters, and multi-search transport whenever a vector query is present. Converts multi-search errors to Typesense exceptions for missing-collection retries and disables prefix matching on native embedding fields already in query_by.

src/scout/src/Engines/TypesenseEngine.php

ScoutServiceProvider.phpBind the Turbopuffer HTTP client +16/-0

Bind the Turbopuffer HTTP client

• Registers a configured Turbopuffer client singleton using Hypervel's HTTP factory.

src/scout/src/ScoutServiceProvider.php

TurbopufferClient.phpAdd tagged Turbopuffer HTTP transport +94/-0

Add tagged Turbopuffer HTTP transport

• Builds fresh authenticated, Telescope-tagged requests with configurable timeouts and transient-error retries. Validates namespace names and distinguishes an index-building response from a completed request.

src/scout/src/Services/Turbopuffer/TurbopufferClient.php

TurbopufferNamespace.phpWrap Turbopuffer namespace endpoints +57/-0

Wrap Turbopuffer namespace endpoints

• Provides query, write, and delete operations against a named Turbopuffer namespace.

src/scout/src/Services/Turbopuffer/TurbopufferNamespace.php

Tests (10) +1840 / -1
MeilisearchEngineIntegrationTest.phpExercise Meilisearch precomputed-vector search +72/-0

Exercise Meilisearch precomputed-vector search

• Indexes two models with supplied embeddings and verifies that semantic search ranks the matching vector first.

tests/Integration/Scout/Meilisearch/MeilisearchEngineIntegrationTest.php

TypesenseEngineIntegrationTest.phpExercise Typesense semantic and hybrid search +105/-0

Exercise Typesense semantic and hybrid search

• Verifies semantic and hybrid ranking with precomputed vectors, including a serialized query vector longer than Typesense's normal query-string limit.

tests/Integration/Scout/Typesense/TypesenseEngineIntegrationTest.php

DatabaseEngineTest.phpVerify database hybrid fallback +10/-0

Verify database hybrid fallback

• Checks that a hybrid builder query still returns ordinary full-text results on the database engine.

tests/Scout/Feature/DatabaseEngineTest.php

TurbopufferEngineTest.phpCover Turbopuffer behavior with faked HTTP +752/-0

Cover Turbopuffer behavior with faked HTTP

• Tests indexing, embedding modes, ranking, filters, pagination totals, deletion, missing namespaces, retries, and Telescope tags. Verifies preparation callbacks and single-operation reporting across partial filtered-deletion requests.

tests/Scout/Feature/Engines/TurbopufferEngineTest.php

SearchableModelWithNativeEmbedding.phpProvide a native-embedding test model +36/-0

Provide a native-embedding test model

• Adds a searchable model fixture that relies on the search backend to generate embeddings.

tests/Scout/Fixtures/Models/SearchableModelWithNativeEmbedding.php

SearchableModelWithPrecomputedEmbedding.phpProvide a precomputed-embedding test model +46/-0

Provide a precomputed-embedding test model

• Adds a searchable model fixture whose embedding source can be a vector or text, enabling indexing and unavailable-generation tests.

tests/Scout/Fixtures/Models/SearchableModelWithPrecomputedEmbedding.php

BuilderTest.phpVerify builder search modes and capability checks +84/-0

Verify builder search modes and capability checks

• Tests semantic and hybrid state, invalid inputs, unsupported-engine behavior, and semantic mode enabled by a preparation callback.

tests/Scout/Unit/BuilderTest.php

EngineManagerTest.phpVerify engine configuration and Turbopuffer resolution +56/-0

Verify engine configuration and Turbopuffer resolution

• Checks that Meilisearch and Typesense receive embedding configuration and that Turbopuffer resolves with its client, configuration, and soft-delete setting.

tests/Scout/Unit/EngineManagerTest.php

MeilisearchEngineTest.phpCover Meilisearch embedding and query parameters +261/-0

Cover Meilisearch embedding and query parameters

• Tests vector preparation and preservation, native-embedding indexing, hybrid weights, similarity thresholds, and failures for invalid options or unavailable embedding generation.

tests/Scout/Unit/Engines/MeilisearchEngineTest.php

TypesenseEngineTest.phpCover Typesense vector modes and multi-search +418/-1

Cover Typesense vector modes and multi-search

• Tests embedding indexing, semantic and hybrid parameter construction, prefix handling, and vector-query validation. Also verifies multi-search transport, error conversion, and missing-collection retry.

tests/Scout/Unit/Engines/TypesenseEngineTest.php

Documentation (4) +274 / -8
porting-from-laravel.mdDocument Laravel-to-Hypervel embedding limitations +2/-0

Document Laravel-to-Hypervel embedding limitations

• Explains that Laravel AI SDK embedding generation and database-engine semantic search are unavailable in Hypervel.

src/docs/porting-from-laravel.md

scout.mdDocument semantic search and Turbopuffer setup +270/-7

Document semantic search and Turbopuffer setup

• Adds configuration and usage guidance for native and precomputed embeddings, semantic and hybrid queries, and the Turbopuffer engine. Also covers filtering, deletion, pagination limits, and embedding-generation constraints.

src/docs/scout.md

search.mdList Turbopuffer among Scout backends +1/-1

List Turbopuffer among Scout backends

• Includes Turbopuffer in the search overview's third-party Scout engines.

src/docs/search.md

README.mdCall out Scout embedding limitations +1/-0

Call out Scout embedding limitations

• Notes that semantic and hybrid search require native or precomputed embeddings and are unavailable on the database engine.

src/scout/README.md

Other (2) +63 / -1
composer.jsonRequire the HTTP client for Turbopuffer +2/-0

Require the HTTP client for Turbopuffer

• Adds the Turbopuffer package keyword and requires hypervel/http for its transport.

src/scout/composer.json

scout.phpExpose embedding and Turbopuffer configuration +61/-1

Expose embedding and Turbopuffer configuration

• Adds Meilisearch and Typesense per-model embedding examples, plus Turbopuffer connection, retry, schema, and searchable-attribute settings.

src/scout/config/scout.php

@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[Medium risk] Adds Turbopuffer search engine and semantic search support.

The PR does not yet appear safe to merge because Turbopuffer semantic pagination can report pages that contain no retrievable results.

Fix All in Claude CodeFindings

  1. P1 Semantic pagination overcounts matches ▶

Summary

The PR adds Scout semantic and hybrid search for Meilisearch and Typesense, plus a Turbopuffer engine. Since the previous review, it also permits the final partial Turbopuffer pagination page, rejects an empty native deletion filter, and clarifies the documented similarity-threshold limitation.

Reviews (2) · Last reviewed commit: "Fix Turbopuffer's last page and empty de..."

Comment thread src/scout/src/Engines/TurbopufferEngine.php
Comment thread src/scout/src/Engines/TurbopufferEngine.php
Comment on lines +303 to +308
if ($builder->semanticSearch
|| $builder->hybridSearch !== null
|| isset($builder->options['rank_by'])
|| $builder->query === ''
|| $builder->query === '*') {
return $filters;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Semantic pagination overcounts matches

If an index contains documents without a vector in the embedding attribute, this filter-only count includes them even though the semantic ranking query cannot return them. paginate() then reports more results than can be retrieved, leaving users with empty pages.

Fix in Claude Code Fix in Codex

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Declining. Turbopuffer requires every document in a namespace with vector indexes to include all vector attributes, and precomputed writes add a vector to every record. So the index can't hold documents without a vector for the count to include.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That’s a valid clarification. Given Turbopuffer’s invariant that every document in a namespace with a vector index must provide the configured vector attribute—and this engine adds precomputed vectors to every record—the filter-only count cannot include documents that semantic search would omit. I’m withdrawing this finding.

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Turbopuffer ignores the minimum similarity 🐞 Bug ≡ Correctness
Description
TurbopufferEngine never reads $builder->minimumSimilarity: semanticRankBy(), both
search-parameter builders and map() neither pass the threshold to Turbopuffer nor filter results
by $dist. When a caller uses semantic(minSimilarity: 0.6) or hybrid(..., minSimilarity: ...),
results below the requested threshold can be returned without an error, unlike the same calls
through Meilisearch and Typesense.
Code

src/scout/src/Engines/TurbopufferEngine.php[R552-558]

+        return [
+            $settings['attribute'],
+            'ANN',
+            $this->usesNativeEmbeddings($settings)
+                ? ['Embed', $builder->query]
+                : $this->generateEmbeddings([$builder->query], $settings)[0],
+        ];
Evidence
The Builder stores the argument in minimumSimilarity, and the Meilisearch and Typesense engines
map it to rankingScoreThreshold and distance_threshold, respectively. Turbopuffer constructs
semantic and hybrid ranking through semanticRankBy() but never references minimumSimilarity
elsewhere in the engine, so the documented option cannot affect either search path.

src/scout/src/Builder.php[317-328]
src/scout/src/Engines/MeilisearchEngine.php[260-262]
src/scout/src/Engines/TypesenseEngine.php[619-621]
src/scout/src/Engines/TurbopufferEngine.php[548-558]
src/scout/src/Engines/TurbopufferEngine.php[420-459]
src/docs/scout.md[1410-1414]
src/scout/src/Builder.php[317-357]
src/scout/src/Engines/TurbopufferEngine.php[381-448]
src/scout/src/Engines/TurbopufferEngine.php[540-553]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Turbopuffer semantic and hybrid searches silently ignore `Builder::$minimumSimilarity`, allowing results below the requested threshold.
## Fix Focus Areas
- src/scout/src/Engines/TurbopufferEngine.php[329-349]
- src/scout/src/Engines/TurbopufferEngine.php[381-448]
- src/scout/src/Engines/TurbopufferEngine.php[540-558]
## Recommended Fix
For semantic searches using `cosine_distance`, validate that `minimumSimilarity` is between 0 and 1 and filter rows in `performSearch()` to keep only those with `$dist <= 1 - minimumSimilarity`. Apply an equivalent threshold to hybrid searches or other metrics if Turbopuffer supports one; otherwise, throw a `NotSupportedException` when `minimumSimilarity !== null` rather than ignoring it. Add tests for semantic and hybrid calls.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can copy the agent prompt from any finding and feed it to your IDE agent

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread src/scout/src/Engines/TurbopufferEngine.php
Turbopuffer pagination rejected any page whose window ended past 10,000
results. The paginator links the last page of a full result set, so with
15 results per page, page 667 holds the last 10 of 10,000 results but
ends at 10,005, and the engine threw. Laravel Scout has the same check.
Pages are now only rejected when they start past the 10,000th result, so
the last page returns its remaining rows. Deeper pages still throw.

Filtered deletion requires a filter, but an empty `filters` option was
passed through as the filter and skipped that check. Empty native filters
now count as no filter, so the deletion throws before any request.

Turbopuffer has no similarity threshold, so, as in Laravel Scout, it
ignores the `minSimilarity` argument. The Scout documentation now says
that Meilisearch and Typesense apply it and Turbopuffer doesn't.

Validated with the Turbopuffer engine tests, the Scout test suite,
composer lint:fix and composer analyse.
@binaryfire
binaryfire merged commit c42fa03 into 0.4 Oct 3, 2026
51 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant