diff --git a/docs/cookbook/rag-implementation.rst b/docs/cookbook/rag-implementation.rst index 46541b42db..8f21c703a0 100644 --- a/docs/cookbook/rag-implementation.rst +++ b/docs/cookbook/rag-implementation.rst @@ -203,7 +203,7 @@ Document Loading Strategies $articles = $articleRepository->findAll(); $documents = array_map( fn($article) => new TextDocument( - id: Uuid::fromString($article->getId()), + id: $article->getId(), content: $article->getTitle().PHP_EOL.$article->getContent(), metadata: new Metadata(['author' => $article->getAuthor()]) ), diff --git a/src/store/src/Bridge/AzureSearch/SearchStore.php b/src/store/src/Bridge/AzureSearch/SearchStore.php index 77c28745e1..d7640a0023 100644 --- a/src/store/src/Bridge/AzureSearch/SearchStore.php +++ b/src/store/src/Bridge/AzureSearch/SearchStore.php @@ -16,7 +16,6 @@ use Symfony\AI\Store\Document\Metadata; use Symfony\AI\Store\Document\VectorDocument; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -91,7 +90,7 @@ private function convertToIndexableArray(VectorDocument $document): array private function convertToVectorDocument(array $data): VectorDocument { return new VectorDocument( - id: Uuid::fromString($data['id']), + id: $data['id'], vector: !\array_key_exists($this->vectorFieldName, $data) || null === $data[$this->vectorFieldName] ? new NullVector() : new Vector($data[$this->vectorFieldName]), diff --git a/src/store/src/Bridge/Cache/Store.php b/src/store/src/Bridge/Cache/Store.php index c994531c0b..41475e0b64 100644 --- a/src/store/src/Bridge/Cache/Store.php +++ b/src/store/src/Bridge/Cache/Store.php @@ -19,7 +19,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\Cache\CacheInterface; /** @@ -79,7 +78,7 @@ public function query(Vector $vector, array $options = []): iterable $documents = $this->cache->get($this->cacheKey, static fn (): array => []); $vectorDocuments = array_map(static fn (array $document): VectorDocument => new VectorDocument( - id: Uuid::fromString($document['id']), + id: $document['id'], vector: new Vector($document['vector']), metadata: new Metadata($document['metadata']), ), $documents); diff --git a/src/store/src/Bridge/ChromaDb/Store.php b/src/store/src/Bridge/ChromaDb/Store.php index 5a9b179344..2e6cdda9b9 100644 --- a/src/store/src/Bridge/ChromaDb/Store.php +++ b/src/store/src/Bridge/ChromaDb/Store.php @@ -16,7 +16,6 @@ use Symfony\AI\Store\Document\Metadata; use Symfony\AI\Store\Document\VectorDocument; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; /** * @author Christopher Hertel @@ -83,7 +82,7 @@ public function query(Vector $vector, array $options = []): iterable } yield new VectorDocument( - id: Uuid::fromString($queryResponse->ids[0][$i]), + id: $queryResponse->ids[0][$i], vector: new Vector($queryResponse->embeddings[0][$i]), metadata: $metaData, score: $queryResponse->distances[0][$i] ?? null, diff --git a/src/store/src/Bridge/ClickHouse/Store.php b/src/store/src/Bridge/ClickHouse/Store.php index dc2b783bc6..c52f894255 100644 --- a/src/store/src/Bridge/ClickHouse/Store.php +++ b/src/store/src/Bridge/ClickHouse/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\RuntimeException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; @@ -95,7 +94,7 @@ public function query(Vector $vector, array $options = [], ?float $minScore = nu foreach ($results as $result) { yield new VectorDocument( - id: Uuid::fromString($result['id']), + id: $result['id'], vector: new Vector($result['embedding']), metadata: new Metadata(json_decode($result['metadata'] ?? '{}', true, 512, \JSON_THROW_ON_ERROR)), score: $result['score'], diff --git a/src/store/src/Bridge/Cloudflare/Store.php b/src/store/src/Bridge/Cloudflare/Store.php index 8cd1e59430..36d5311209 100644 --- a/src/store/src/Bridge/Cloudflare/Store.php +++ b/src/store/src/Bridge/Cloudflare/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -138,7 +137,7 @@ private function convertToVectorDocument(array $data): VectorDocument : new Vector($data['values']); return new VectorDocument( - id: Uuid::fromString($id), + id: $id, vector: $vector, metadata: new Metadata($data['metadata']), score: $data['score'] ?? null diff --git a/src/store/src/Bridge/ManticoreSearch/Store.php b/src/store/src/Bridge/ManticoreSearch/Store.php index 6875b8d4bf..5aa2adb762 100644 --- a/src/store/src/Bridge/ManticoreSearch/Store.php +++ b/src/store/src/Bridge/ManticoreSearch/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -150,7 +149,7 @@ private function convertToVectorDocument(array $data): VectorDocument : new Vector($payload[$this->field]); return new VectorDocument( - id: Uuid::fromString($payload['uuid']), + id: $payload['uuid'], vector: $vector, metadata: new Metadata($payload['metadata'] ?? []), score: $data['_knn_dist'] ?? null diff --git a/src/store/src/Bridge/Meilisearch/Store.php b/src/store/src/Bridge/Meilisearch/Store.php index 4a3ce409ef..5370c77f53 100644 --- a/src/store/src/Bridge/Meilisearch/Store.php +++ b/src/store/src/Bridge/Meilisearch/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -130,7 +129,7 @@ private function request(string $method, string $endpoint, array $payload): arra private function convertToIndexableArray(VectorDocument $document): array { return array_merge([ - 'id' => $document->id->toRfc4122(), + 'id' => $document->id, $this->vectorFieldName => [ $this->embedder => [ 'embeddings' => $document->vector->getData(), @@ -154,6 +153,6 @@ private function convertToVectorDocument(array $data): VectorDocument unset($data['id'], $data[$this->vectorFieldName], $data['_rankingScore']); - return new VectorDocument(Uuid::fromString($id), $vector, new Metadata($data), $score); + return new VectorDocument($id, $vector, new Metadata($data), $score); } } diff --git a/src/store/src/Bridge/Milvus/Store.php b/src/store/src/Bridge/Milvus/Store.php index bd95494077..bf6187ba8e 100644 --- a/src/store/src/Bridge/Milvus/Store.php +++ b/src/store/src/Bridge/Milvus/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -151,7 +150,7 @@ private function request(string $method, string $endpoint, array $payload): arra private function convertToIndexableArray(VectorDocument $document): array { return [ - 'id' => $document->id->toRfc4122(), + 'id' => $document->id, '_metadata' => json_encode($document->metadata->getArrayCopy()), $this->vectorFieldName => $document->vector->getData(), ]; @@ -170,6 +169,6 @@ private function convertToVectorDocument(array $data): VectorDocument $score = $data['distance'] ?? null; - return new VectorDocument(Uuid::fromString($id), $vector, new Metadata(json_decode($data['_metadata'], true)), $score); + return new VectorDocument($id, $vector, new Metadata(json_decode($data['_metadata'], true)), $score); } } diff --git a/src/store/src/Bridge/MongoDb/Store.php b/src/store/src/Bridge/MongoDb/Store.php index 1d407c2d68..393c2fb6e9 100644 --- a/src/store/src/Bridge/MongoDb/Store.php +++ b/src/store/src/Bridge/MongoDb/Store.php @@ -11,7 +11,6 @@ namespace Symfony\AI\Store\Bridge\MongoDb; -use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Collection; use MongoDB\Driver\Exception\CommandException; @@ -23,7 +22,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; /** * @see https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-overview/ @@ -110,7 +108,7 @@ public function add(VectorDocument ...$documents): void foreach ($documents as $document) { $operation = [ - ['_id' => $this->toBinary($document->id)], // we use binary for the id, because of storage efficiency + ['_id' => (string) $document->id], array_filter([ 'metadata' => $document->metadata->getArrayCopy(), $this->vectorFieldName => $document->vector->getData(), @@ -179,7 +177,7 @@ public function query(Vector $vector, array $options = []): iterable foreach ($results as $result) { yield new VectorDocument( - id: $this->toUuid($result['_id']), + id: $result['_id'], vector: new Vector($result[$this->vectorFieldName]), metadata: new Metadata($result['metadata'] ?? []), score: $result['score'], @@ -191,14 +189,4 @@ private function getCollection(): Collection { return $this->client->getCollection($this->databaseName, $this->collectionName); } - - private function toBinary(Uuid $uuid): Binary - { - return new Binary($uuid->toBinary(), Binary::TYPE_UUID); - } - - private function toUuid(Binary $binary): Uuid - { - return Uuid::fromString($binary->getData()); - } } diff --git a/src/store/src/Bridge/MongoDb/Tests/StoreTest.php b/src/store/src/Bridge/MongoDb/Tests/StoreTest.php index 9b452ab16d..4eb11496a3 100644 --- a/src/store/src/Bridge/MongoDb/Tests/StoreTest.php +++ b/src/store/src/Bridge/MongoDb/Tests/StoreTest.php @@ -11,7 +11,6 @@ namespace Symfony\AI\Store\Bridge\MongoDb\Tests; -use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Collection; use MongoDB\Driver\CursorInterface; @@ -40,12 +39,12 @@ public function testAddSingleDocument() ->willReturn($collection); $uuid = Uuid::v4(); - $expectedBinary = new Binary($uuid->toBinary(), Binary::TYPE_UUID); + $expectedId = $uuid->toString(); $collection->expects($this->once()) ->method('replaceOne') ->with( - ['_id' => $expectedBinary], + ['_id' => $expectedId], [ 'metadata' => ['title' => 'Test Document'], 'vector' => [0.1, 0.2, 0.3], @@ -111,7 +110,7 @@ public function testAddWithBulkWrite() ->with([ [ 'replaceOne' => [ - ['_id' => new Binary($uuid1->toBinary(), Binary::TYPE_UUID)], + ['_id' => $uuid1->toString()], [ 'vector' => [0.1, 0.2, 0.3], ], @@ -120,7 +119,7 @@ public function testAddWithBulkWrite() ], [ 'replaceOne' => [ - ['_id' => new Binary($uuid2->toBinary(), Binary::TYPE_UUID)], + ['_id' => $uuid2->toString()], [ 'metadata' => ['title' => 'Test'], 'vector' => [0.4, 0.5, 0.6], @@ -160,13 +159,13 @@ public function testQueryReturnsDocuments() $results = [ [ - '_id' => new Binary($uuid1->toBinary(), Binary::TYPE_UUID), + '_id' => $uuid1->toString(), 'vector' => [0.1, 0.2, 0.3], 'metadata' => ['title' => 'First Document'], 'score' => 0.95, ], [ - '_id' => new Binary($uuid2->toBinary(), Binary::TYPE_UUID), + '_id' => $uuid2->toString(), 'vector' => [0.4, 0.5, 0.6], 'metadata' => ['title' => 'Second Document'], 'score' => 0.85, @@ -215,8 +214,8 @@ public function testQueryReturnsDocuments() $this->assertCount(2, $documents); $this->assertInstanceOf(VectorDocument::class, $documents[0]); $this->assertInstanceOf(VectorDocument::class, $documents[1]); - $this->assertEquals($uuid1, $documents[0]->id); - $this->assertEquals($uuid2, $documents[1]->id); + $this->assertEquals($uuid1->toString(), $documents[0]->id); + $this->assertEquals($uuid2->toString(), $documents[1]->id); $this->assertSame(0.95, $documents[0]->score); $this->assertSame(0.85, $documents[1]->score); $this->assertSame('First Document', $documents[0]->metadata['title']); @@ -511,7 +510,7 @@ public function testQueryWithCustomVectorFieldName() $results = [ [ - '_id' => new Binary($uuid->toBinary(), Binary::TYPE_UUID), + '_id' => $uuid->toString(), 'custom_embeddings' => [0.1, 0.2, 0.3], 'metadata' => ['title' => 'Document'], 'score' => 0.95, diff --git a/src/store/src/Bridge/Neo4j/Store.php b/src/store/src/Bridge/Neo4j/Store.php index 8007e450da..3f941a9822 100644 --- a/src/store/src/Bridge/Neo4j/Store.php +++ b/src/store/src/Bridge/Neo4j/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -117,7 +116,7 @@ private function convertToVectorDocument(array $data): VectorDocument : new Vector($payload['properties'][$this->embeddingsField]); return new VectorDocument( - id: Uuid::fromString($id), + id: $id, vector: $vector, metadata: new Metadata(json_decode($payload['properties']['metadata'], true)), score: $data[1] ?? null diff --git a/src/store/src/Bridge/OpenSearch/Store.php b/src/store/src/Bridge/OpenSearch/Store.php index af9228b81e..0579f01f6f 100644 --- a/src/store/src/Bridge/OpenSearch/Store.php +++ b/src/store/src/Bridge/OpenSearch/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -76,7 +75,7 @@ public function add(VectorDocument ...$documents): void $documentToIndex = fn (VectorDocument $document): array => [ 'index' => [ '_index' => $this->indexName, - '_id' => $document->id->toRfc4122(), + '_id' => $document->id, ], ]; @@ -153,6 +152,6 @@ private function convertToVectorDocument(array $document): VectorDocument ? new NullVector() : new Vector($document['_source'][$this->vectorsField]); - return new VectorDocument(Uuid::fromString($id), $vector, new Metadata(json_decode($document['_source']['metadata'], true)), $document['_score'] ?? null); + return new VectorDocument($id, $vector, new Metadata(json_decode($document['_source']['metadata'], true)), $document['_score'] ?? null); } } diff --git a/src/store/src/Bridge/Pinecone/Store.php b/src/store/src/Bridge/Pinecone/Store.php index 7bc0ab7e7b..aa5f87d0c0 100644 --- a/src/store/src/Bridge/Pinecone/Store.php +++ b/src/store/src/Bridge/Pinecone/Store.php @@ -19,7 +19,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; /** * @author Christopher Hertel @@ -93,7 +92,7 @@ public function query(Vector $vector, array $options = []): iterable foreach ($result->json()['matches'] as $match) { yield new VectorDocument( - id: Uuid::fromString($match['id']), + id: $match['id'], vector: new Vector($match['values']), metadata: new Metadata($match['metadata']), score: $match['score'], diff --git a/src/store/src/Bridge/Postgres/Store.php b/src/store/src/Bridge/Postgres/Store.php index 92001d04b6..30a8d902f1 100644 --- a/src/store/src/Bridge/Postgres/Store.php +++ b/src/store/src/Bridge/Postgres/Store.php @@ -19,7 +19,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; /** * Requires PostgreSQL with pgvector extension. @@ -172,7 +171,7 @@ public function query(Vector $vector, array $options = []): iterable foreach ($statement->fetchAll(\PDO::FETCH_ASSOC) as $result) { yield new VectorDocument( - id: Uuid::fromString($result['id']), + id: $result['id'], vector: new Vector($this->fromPgvector($result['embedding'])), metadata: new Metadata(json_decode($result['metadata'] ?? '{}', true, 512, \JSON_THROW_ON_ERROR)), score: $result['score'], diff --git a/src/store/src/Bridge/Qdrant/Store.php b/src/store/src/Bridge/Qdrant/Store.php index deb4d760c5..6f02ee94d4 100644 --- a/src/store/src/Bridge/Qdrant/Store.php +++ b/src/store/src/Bridge/Qdrant/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -153,7 +152,7 @@ private function convertToVectorDocument(array $data): VectorDocument : new Vector($data['vector']); return new VectorDocument( - id: Uuid::fromString($id), + id: $id, vector: $vector, metadata: new Metadata($data['payload']), score: $data['score'] ?? null diff --git a/src/store/src/Bridge/Redis/Store.php b/src/store/src/Bridge/Redis/Store.php index e15c6569a5..b7cbd66816 100644 --- a/src/store/src/Bridge/Redis/Store.php +++ b/src/store/src/Bridge/Redis/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\RuntimeException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; /** * @author Grégoire Pineau @@ -167,7 +166,7 @@ public function query(Vector $vector, array $options = []): iterable } yield new VectorDocument( - id: Uuid::fromString($data['$.id']), + id: $data['$.id'], vector: new Vector($data['$.embedding'] ?? []), metadata: new Metadata($data['$.metadata'] ?? []), score: $score, diff --git a/src/store/src/Bridge/Supabase/Store.php b/src/store/src/Bridge/Supabase/Store.php index d72ec5dc40..aae3348e67 100644 --- a/src/store/src/Bridge/Supabase/Store.php +++ b/src/store/src/Bridge/Supabase/Store.php @@ -17,7 +17,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\Exception\RuntimeException; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -137,7 +136,7 @@ public function query(Vector $vector, array $options = []): iterable $metadata = \is_array($record['metadata']) ? $record['metadata'] : json_decode($record['metadata'], true, 512, \JSON_THROW_ON_ERROR); yield new VectorDocument( - id: Uuid::fromString($record['id']), + id: $record['id'], vector: new Vector($embedding), metadata: new Metadata($metadata), score: (float) $record['score'], diff --git a/src/store/src/Bridge/Supabase/Tests/StoreTest.php b/src/store/src/Bridge/Supabase/Tests/StoreTest.php index f353e03947..c99873fc2d 100644 --- a/src/store/src/Bridge/Supabase/Tests/StoreTest.php +++ b/src/store/src/Bridge/Supabase/Tests/StoreTest.php @@ -144,7 +144,7 @@ public function testQuerySuccess() $this->assertCount(1, $result); $this->assertInstanceOf(VectorDocument::class, $result[0]); - $this->assertTrue($uuid->equals($result[0]->id)); + $this->assertSame($uuid->toRfc4122(), $result[0]->id); $this->assertSame([0.5, 0.6, 0.7], $result[0]->vector->getData()); $this->assertSame(['category' => 'test'], $result[0]->metadata->getArrayCopy()); $this->assertSame(0.85, $result[0]->score); @@ -176,12 +176,12 @@ public function testQueryHandlesMultipleResultsAndMultipleOptions() $this->assertCount(2, $result); $this->assertInstanceOf(VectorDocument::class, $result[0]); - $this->assertTrue($uuid1->equals($result[0]->id)); + $this->assertSame($uuid1->toRfc4122(), $result[0]->id); $this->assertSame([0.1, 0.2], $result[0]->vector->getData()); $this->assertSame(0.95, $result[0]->score); $this->assertSame(['type' => 'first'], $result[0]->metadata->getArrayCopy()); $this->assertInstanceOf(VectorDocument::class, $result[1]); - $this->assertTrue($uuid2->equals($result[1]->id)); + $this->assertSame($uuid2->toRfc4122(), $result[1]->id); $this->assertSame([0.3, 0.4], $result[1]->vector->getData()); $this->assertSame(0.85, $result[1]->score); $this->assertSame(['type' => 'second'], $result[1]->metadata->getArrayCopy()); @@ -209,7 +209,7 @@ public function testQueryParsesComplexMetadata() $metadata = $document->metadata->getArrayCopy(); $this->assertCount(1, $result); $this->assertInstanceOf(VectorDocument::class, $document); - $this->assertTrue($uuid->equals($document->id)); + $this->assertSame($uuid->toRfc4122(), $document->id); $this->assertSame([0.1, 0.2, 0.3, 0.4], $document->vector->getData()); $this->assertSame(0.92, $document->score); $this->assertSame('Test Document', $metadata['title']); diff --git a/src/store/src/Bridge/SurrealDb/Store.php b/src/store/src/Bridge/SurrealDb/Store.php index 660edc95a4..4217ce9514 100644 --- a/src/store/src/Bridge/SurrealDb/Store.php +++ b/src/store/src/Bridge/SurrealDb/Store.php @@ -19,7 +19,6 @@ use Symfony\AI\Store\Exception\RuntimeException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -149,7 +148,7 @@ private function convertToVectorDocument(array $data): VectorDocument unset($data['_metadata']['_id']); return new VectorDocument( - id: Uuid::fromString($id), + id: $id, vector: $vector, metadata: new Metadata($data['_metadata']), ); diff --git a/src/store/src/Bridge/Typesense/Store.php b/src/store/src/Bridge/Typesense/Store.php index 16c44ca4d1..0bfb3150d8 100644 --- a/src/store/src/Bridge/Typesense/Store.php +++ b/src/store/src/Bridge/Typesense/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -115,7 +114,7 @@ private function request(string $method, string $endpoint, array $payload): arra private function convertToIndexableArray(VectorDocument $document): array { return [ - 'id' => $document->id->toRfc4122(), + 'id' => $document->id, $this->vectorFieldName => $document->vector->getData(), 'metadata' => json_encode($document->metadata->getArrayCopy()), ]; @@ -136,6 +135,6 @@ private function convertToVectorDocument(array $data): VectorDocument $score = $data['vector_distance'] ?? null; - return new VectorDocument(Uuid::fromString($id), $vector, new Metadata(json_decode($document['metadata'], true)), $score); + return new VectorDocument($id, $vector, new Metadata(json_decode($document['metadata'], true)), $score); } } diff --git a/src/store/src/Bridge/Weaviate/Store.php b/src/store/src/Bridge/Weaviate/Store.php index 787a1fb802..8ee2daca07 100644 --- a/src/store/src/Bridge/Weaviate/Store.php +++ b/src/store/src/Bridge/Weaviate/Store.php @@ -18,7 +18,6 @@ use Symfony\AI\Store\Exception\InvalidArgumentException; use Symfony\AI\Store\ManagedStoreInterface; use Symfony\AI\Store\StoreInterface; -use Symfony\Component\Uid\Uuid; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -116,10 +115,10 @@ private function convertToIndexableArray(VectorDocument $document): array { return [ 'class' => $this->collection, - 'id' => $document->id->toRfc4122(), + 'id' => $document->id, 'vector' => $document->vector->getData(), 'properties' => [ - 'uuid' => $document->id->toRfc4122(), + 'uuid' => $document->id, 'vector' => $document->vector->getData(), '_metadata' => json_encode($document->metadata->getArrayCopy()), ], @@ -137,6 +136,6 @@ private function convertToVectorDocument(array $data): VectorDocument ? new NullVector() : new Vector($data['vector']); - return new VectorDocument(Uuid::fromString($id), $vector, new Metadata(json_decode($data['_metadata'], true))); + return new VectorDocument($id, $vector, new Metadata(json_decode($data['_metadata'], true))); } } diff --git a/src/store/src/Document/TextDocument.php b/src/store/src/Document/TextDocument.php index eefac3f314..cd3b5da547 100644 --- a/src/store/src/Document/TextDocument.php +++ b/src/store/src/Document/TextDocument.php @@ -20,7 +20,7 @@ final class TextDocument implements EmbeddableDocumentInterface { public function __construct( - private readonly Uuid $id, + private readonly int|string|Uuid $id, private readonly string $content, private readonly Metadata $metadata = new Metadata(), ) { @@ -34,7 +34,7 @@ public function withContent(string $content): self return new self($this->id, $content, $this->metadata); } - public function getId(): Uuid + public function getId(): int|string|Uuid { return $this->id; } diff --git a/src/store/src/Document/VectorDocument.php b/src/store/src/Document/VectorDocument.php index 861f0d8828..b076ae34d0 100644 --- a/src/store/src/Document/VectorDocument.php +++ b/src/store/src/Document/VectorDocument.php @@ -20,7 +20,7 @@ final class VectorDocument { public function __construct( - public readonly Uuid $id, + public readonly int|string|Uuid $id, public readonly VectorInterface $vector, public readonly Metadata $metadata = new Metadata(), public readonly ?float $score = null, diff --git a/src/store/tests/Document/TextDocumentTest.php b/src/store/tests/Document/TextDocumentTest.php index 5f9c876ad3..2ada4a1ba4 100644 --- a/src/store/tests/Document/TextDocumentTest.php +++ b/src/store/tests/Document/TextDocumentTest.php @@ -22,6 +22,21 @@ final class TextDocumentTest extends TestCase { + #[DataProvider('constructorIdDataProvider')] + public function testConstructorIdSupportsManyTypes(int|string|Uuid $id) + { + $document = new TextDocument($id, 'content'); + + $this->assertSame($id, $document->getId()); + } + + public static function constructorIdDataProvider(): iterable + { + yield 'int' => [1]; + yield 'string' => ['id']; + yield 'uuid' => [Uuid::v4()]; + } + #[TestDox('Creates document with valid content and metadata')] public function testConstructorWithValidContent() { diff --git a/src/store/tests/Document/VectorDocumentTest.php b/src/store/tests/Document/VectorDocumentTest.php index 54a5c2f821..9b03bea5a1 100644 --- a/src/store/tests/Document/VectorDocumentTest.php +++ b/src/store/tests/Document/VectorDocumentTest.php @@ -15,6 +15,7 @@ use PHPUnit\Framework\Attributes\TestDox; use PHPUnit\Framework\Attributes\TestWith; use PHPUnit\Framework\TestCase; +use Symfony\AI\Platform\Vector\NullVector; use Symfony\AI\Platform\Vector\Vector; use Symfony\AI\Store\Document\Metadata; use Symfony\AI\Store\Document\VectorDocument; @@ -25,6 +26,21 @@ */ final class VectorDocumentTest extends TestCase { + #[DataProvider('constructorIdDataProvider')] + public function testConstructorIdSupportsManyTypes(int|string|Uuid $id) + { + $document = new VectorDocument($id, new NullVector()); + + $this->assertSame($id, $document->id); + } + + public static function constructorIdDataProvider(): iterable + { + yield 'int' => [1]; + yield 'string' => ['id']; + yield 'uuid' => [Uuid::v4()]; + } + #[TestDox('Creates document with required parameters only')] public function testConstructorWithRequiredParameters() {