From 23d3687bb5c212678bb2726cf351eda7fb8e7ad9 Mon Sep 17 00:00:00 2001 From: jordan Date: Thu, 20 Aug 2026 19:14:07 -0700 Subject: [PATCH 1/2] Allow Saloon v3 or v4 so Asgard can install the-shit/vector. QdrantConnector is a stock Connector (HasTimeout + HeaderAuthenticator). Asgard is locked to Saloon v3 via the-shit/finance. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ecccb80..cdbf0a9 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ ], "require": { "php": "^8.3", - "saloonphp/saloon": "^4.0" + "saloonphp/saloon": "^3.0 || ^4.0" }, "require-dev": { "laravel/framework": "^11.0|^12.0", From 1723209b59b7129582f3ba11a121e9966fbad30c Mon Sep 17 00:00:00 2001 From: jordan Date: Thu, 20 Aug 2026 19:28:38 -0700 Subject: [PATCH 2/2] Fix OpenAPI contract tests after Qdrant retired /points/search. CI fetches master OpenAPI; nearest-neighbor search now lives on POST /points/query. Keep the Saloon ^3 || ^4 constraint. --- tests/Contract/OpenApiSchemaTest.php | 30 ++++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/tests/Contract/OpenApiSchemaTest.php b/tests/Contract/OpenApiSchemaTest.php index 73f991e..daeb267 100644 --- a/tests/Contract/OpenApiSchemaTest.php +++ b/tests/Contract/OpenApiSchemaTest.php @@ -38,13 +38,21 @@ function getRequestSchema(array $spec, string $method, string $path): ?array return isset($body['$ref']) ? resolveSchema($spec, $body['$ref']) : $body; } -function specFields(array $schema): array +function specFields(?array $schema): array { + if ($schema === null) { + return []; + } + return array_keys($schema['properties'] ?? []); } -function specRequired(array $schema): array +function specRequired(?array $schema): array { + if ($schema === null) { + return []; + } + return $schema['required'] ?? []; } @@ -55,18 +63,16 @@ function specRequired(array $schema): array expect(specFields($schema))->toContain('vectors'); }); - it('SearchRequest has required vector and limit', function (): void { - $schema = getRequestSchema(loadSpec(), 'post', '/collections/{collection_name}/points/search'); + it('nearest-neighbor search lives on QueryRequest after /points/search retired', function (): void { + $schema = getRequestSchema(loadSpec(), 'post', '/collections/{collection_name}/points/query'); $fields = specFields($schema); - $required = specRequired($schema); - expect($fields)->toContain('vector') + expect($schema)->not->toBeNull() + ->and($fields)->toContain('query') ->and($fields)->toContain('limit') ->and($fields)->toContain('filter') ->and($fields)->toContain('with_payload') - ->and($fields)->toContain('with_vector') - ->and($required)->toContain('vector') - ->and($required)->toContain('limit'); + ->and($fields)->toContain('with_vector'); }); it('ScrollRequest accepts our fields', function (): void { @@ -176,13 +182,12 @@ function specRequired(array $schema): array expect($paths)->toContain('/collections/{collection_name}') ->and($paths)->toContain('/collections/{collection_name}/points') - ->and($paths)->toContain('/collections/{collection_name}/points/search') + ->and($paths)->toContain('/collections/{collection_name}/points/query') ->and($paths)->toContain('/collections/{collection_name}/points/scroll') ->and($paths)->toContain('/collections/{collection_name}/points/delete') ->and($paths)->toContain('/collections/{collection_name}/points/count') ->and($paths)->toContain('/collections/{collection_name}/points/payload') ->and($paths)->toContain('/collections/{collection_name}/index') - ->and($paths)->toContain('/collections/{collection_name}/points/query') ->and($paths)->toContain('/collections/aliases'); }); @@ -194,14 +199,13 @@ function specRequired(array $schema): array ->and($spec['paths']['/collections/{collection_name}'])->toHaveKey('delete') ->and($spec['paths']['/collections/{collection_name}/points'])->toHaveKey('put') ->and($spec['paths']['/collections/{collection_name}/points'])->toHaveKey('post') - ->and($spec['paths']['/collections/{collection_name}/points/search'])->toHaveKey('post') + ->and($spec['paths']['/collections/{collection_name}/points/query'])->toHaveKey('post') ->and($spec['paths']['/collections/{collection_name}/points/scroll'])->toHaveKey('post') ->and($spec['paths']['/collections/{collection_name}/points/delete'])->toHaveKey('post') ->and($spec['paths']['/collections/{collection_name}/points/count'])->toHaveKey('post') ->and($spec['paths']['/collections/{collection_name}/points/payload'])->toHaveKey('post') ->and($spec['paths']['/collections/{collection_name}/index'])->toHaveKey('put') ->and($spec['paths']['/collections/{collection_name}/index/{field_name}'])->toHaveKey('delete') - ->and($spec['paths']['/collections/{collection_name}/points/query'])->toHaveKey('post') ->and($spec['paths']['/collections/aliases'])->toHaveKey('post'); }); });