diff --git a/README.md b/README.md
index 42e096ed4e7..8ec6b053d9e 100644
--- a/README.md
+++ b/README.md
@@ -12,28 +12,25 @@
-> ⬆️ **DocArray v2**: This readme refer to the second version of DocArray (starting at 0.30). If you want to use the old
-> DocArray v1 version (below 0.30) check out the [docarray-v1-fixe](https://github.com/docarray/docarray/tree/docarray-v1-fixes) branch
-
+> ⬆️ **DocArray v2**: This readme is for the second version of DocArray (starting at 0.30). If you want to use the older
+> version (prior to 0.30) check out the [docarray-v1-fixes](https://github.com/docarray/docarray/tree/docarray-v1-fixes) branch
DocArray is a library for **representing, sending and storing multi-modal data**, perfect for **Machine Learning applications**.
-Those are the three pillars of DocArray, and you can check them out individually:
+With DocArray you can:
-1. [**Represent**](#represent)
-2. [**Send**](#send)
-3. [**Store**](#store)
+1. [**Represent data**](#represent)
+2. [**Send data**](#send)
+3. [**Store data**](#store)
DocArray handles your data while integrating seamlessly with the rest of your **Python and ML ecosystem**:
-- :fire: DocArray has native compatibility for **[NumPy](https://github.com/numpy/numpy)**, **[PyTorch](https://github.com/pytorch/pytorch)** and **[TensorFlow](https://github.com/tensorflow/tensorflow)**, including for **model training use cases**
-- :zap: DocArray is built on **[Pydantic](https://github.com/pydantic/pydantic)** and out-of-the-box compatible with **[FastAPI](https://github.com/tiangolo/fastapi/)** and **[Jina](https://github.com/jina-ai/jina/)**
-- :package: DocArray can index data in vector databases such as **[Weaviate](https://weaviate.io/), [Qdrant](https://qdrant.tech/), [ElasticSearch](https://www.elastic.co/de/elasticsearch/)** as well as **[HNSWLib](https://github.com/nmslib/hnswlib)**
-- :chains: DocArray data can be sent as JSON over **HTTP** or as **[Protobuf](https://protobuf.dev/)** over **[gRPC](https://grpc.io/)**
-
+- :fire: Native compatibility for **[NumPy](https://github.com/numpy/numpy)**, **[PyTorch](https://github.com/pytorch/pytorch)** and **[TensorFlow](https://github.com/tensorflow/tensorflow)**, including for **model training use cases**
+- :zap: Built on **[Pydantic](https://github.com/pydantic/pydantic)** and out-of-the-box compatible with **[FastAPI](https://github.com/tiangolo/fastapi/)** and **[Jina](https://github.com/jina-ai/jina/)**
+- :package: Support vector databases like **[Weaviate](https://weaviate.io/), [Qdrant](https://qdrant.tech/), [ElasticSearch](https://www.elastic.co/de/elasticsearch/)** and **[HNSWLib](https://github.com/nmslib/hnswlib)**
+- :chains: Send data as JSON over **HTTP** or as **[Protobuf](https://protobuf.dev/)** over **[gRPC](https://grpc.io/)**
-> :bulb: **Where are you coming from?** Depending on your use case and background, there are different ways to "get" DocArray.
-> You can navigate to the following section for an explanation that should fit your mindset:
+> :bulb: **Where are you coming from?** Based on your use case and background, there are different ways to understand DocArray:
>
> - [Coming from pure PyTorch or TensorFlow](#coming-from-pytorch)
> - [Coming from Pydantic](#coming-from-pydantic)
@@ -48,13 +45,13 @@ DocArray allows you to **represent your data**, in an ML-native way.
This is useful for different use cases:
-- :woman_running: You are **training a model**, there are myriads of tensors of different shapes and sizes flying around, representing different _things_, and you want to keep a straight head about them
-- :cloud: You are **serving a model**, for example through FastAPI, and you want to specify your API endpoints
-- :card_index_dividers: You are **parsing data** for later use in your ML or DS applications
+- :woman_running: You are **training a model**: There are tensors of different shapes and sizes flying around, representing different _things_, and you want to keep a straight head about them.
+- :cloud: You are **serving a model**: For example through FastAPI, and you want to specify your API endpoints.
+- :card_index_dividers: You are **parsing data**: For later use in your ML or data science applications.
-> :bulb: **Coming from Pydantic?** If you're currently using Pydantic for the use cases above, you should be happy to hear
-> that DocArray is built on top of, and fully compatible with, Pydantic!
-> Also, we have [dedicated section](#coming-from-pydantic) just for you!
+> :bulb: **Coming from Pydantic?** You should be happy to hear
+> that DocArray is built on top of, and is fully compatible with, Pydantic!
+> Also, we have a [dedicated section](#coming-from-pydantic) just for you!
Put simply, DocArray lets you represent your data in a dataclass-like way, with ML as a first class citizen:
@@ -90,7 +87,7 @@ print(vec.image_tensor.shape) # (10, 1704, 2272, 3)
Click for more details
-So let's take a closer look at how you can represent your data with DocArray:
+Let's take a closer look at how you can represent your data with DocArray:
```python
from docarray import BaseDoc
@@ -111,7 +108,7 @@ class MyDocument(BaseDoc):
So not only can you define the types of your data, you can even **specify the shape of your tensors!**
-Once you have your model in form of a `Document`, you can work with it!
+Once you have your model in the form of a document, you can work with it!
```python
# Create a document
@@ -124,8 +121,6 @@ doc = MyDocument(
doc.image_tensor = doc.image_url.load()
# Compute embedding with any model of your choice
-
-
def clip_image_encoder(image_tensor: TorchTensor) -> TorchTensor: # dummy function
return torch.rand(512)
@@ -137,7 +132,7 @@ print(doc.embedding.shape) # torch.Size([512])
### Compose nested Documents
-Of course you can compose Documents into a nested structure:
+Of course, you can compose Documents into a nested structure:
```python
from docarray import BaseDoc
@@ -155,9 +150,7 @@ doc = MultiModalDocument(
)
```
-Of course, you rarely work with a single data point at a time, especially in Machine Learning applications.
-
-That's why you can easily collect multiple `Documents`:
+You rarely work with a single data point at a time, especially in machine learning applications. That's why you can easily collect multiple `Documents`:
### Collect multiple `Documents`
@@ -165,8 +158,8 @@ When building or interacting with an ML system, usually you want to process mult
DocArray offers two data structures for this:
-- **`DocVec`**: A vector of `Documents`. All tensors in the `Documents` are stacked up into a single tensor. **Perfect for batch processing and use inside of ML models**.
-- **`DocList`**: A list of `Documents`. All tensors in the `Documents` are kept as-is. **Perfect for streaming, re-ranking, and shuffling of data**.
+- **`DocVec`**: A vector of `Documents`. All tensors in the documents are stacked into a single tensor. **Perfect for batch processing and use inside of ML models**.
+- **`DocList`**: A list of `Documents`. All tensors in the documents are kept as-is. **Perfect for streaming, re-ranking, and shuffling of data**.
Let's take a look at them, starting with `DocVec`:
@@ -192,10 +185,10 @@ vec = DocVec[Image]( # the DocVec is parametrized by your personal schema!
)
```
-As you can see in the code snippet above, `DocVec` is **parametrized by the type of Document** you want to use with it: `DocVec[Image]`.
+In the code snippet above, `DocVec` is **parametrized by the type of document** you want to use with it: `DocVec[Image]`.
-This may look slightly weird at first, but we're confident that you'll get used to it quickly!
-Besides, it allows us to do some cool things, like giving you **bulk access to the fields that you defined** in your `Document`:
+This may look weird at first, but we're confident that you'll get used to it quickly!
+Besides, it lets us do some cool things, like having **bulk access to the fields that you defined** in your document:
```python
tensor = vec.tensor # gets all the tensors in the DocVec
@@ -219,7 +212,7 @@ dl = DocList[Image]( # the DocList is parametrized by your personal schema!
)
```
-You can still bulk access the fields of your `Document`:
+You can still bulk access the fields of your document:
```python
tensors = dl.tensor # gets all the tensors in the DocList
@@ -227,7 +220,7 @@ print(type(tensors)) # as a list of tensors
print(dl.url) # you can bulk access any other field, too
```
-And you can insert, remove, and append `Documents` to your `DocList`:
+And you can insert, remove, and append documents to your `DocList`:
```python
# append
@@ -270,12 +263,12 @@ This means there is native support for **Protobuf and gRPC**, on top of **HTTP**
This is useful for different use cases:
- :cloud: You are **serving a model**, for example through **[Jina](https://github.com/jina-ai/jina/)** or **[FastAPI](https://github.com/tiangolo/fastapi/)**
-- :spider_web: You **distribute your model** across machines and need to send your data between nodes
+- :spider_web: You are **distributing your model** across machines and need to send your data between nodes
- :gear: You are building a **microservice** architecture and need to send your data between microservices
-> :bulb: **Coming from FastAPI?** If you're currently using FastAPI for the use cases above, you should be happy to hear
+> :bulb: **Coming from FastAPI?** You should be happy to hear
> that DocArray is fully compatible with FastAPI!
-> Also, we have [dedicated section](#coming-from-fastapi) just for you!
+> Also, we have a [dedicated section](#coming-from-fastapi) just for you!
Whenever you want to send your data you need to serialize it, so let's take a look at how that works with DocArray:
@@ -308,14 +301,12 @@ doc_4 = MyDocument.from_bytes(bytes_)
doc_5 = MyDocument.parse_raw(json)
```
-Of course, serialization is not all you need.
-So check out how DocArray integrates with FastAPI and Jina.
-
+Of course, serialization is not all you need. So check out how DocArray integrates with FastAPI and Jina.
## Store
Once you've modelled your data, and maybe sent it around, usually you want to **store it** somewhere.
-But fret not! DocArray has you covered!
+DocArray has you covered!
**Document Stores** let you, well, store your Documents, locally or remotely, all with the same user interface:
@@ -353,7 +344,7 @@ This is useful for:
- :mag: **Neural search** applications
- :bulb: **Recommender systems**
-Currently, DocArray Document Indexes support **[Weaviate](https://weaviate.io/)**, **[Qdrant](https://qdrant.tech/)**, **[ElasticSearch](https://www.elastic.co/)**, and **[HNSWLib](https://github.com/nmslib/hnswlib)**, with more to come!
+Currently, Document Indexes support **[Weaviate](https://weaviate.io/)**, **[Qdrant](https://qdrant.tech/)**, **[ElasticSearch](https://www.elastic.co/)**, and **[HNSWLib](https://github.com/nmslib/hnswlib)**, with more to come!
See Document Index usage
@@ -402,26 +393,25 @@ results, scores = index.find(query, limit=10, search_field='embedding')
-Depending on your background and use case, there are different ways for you to _get_ DocArray.
-Choose your own adventure!
+Depending on your background and use case, there are different ways for you to understand DocArray.
## Coming from old DocArray
Click to expand
-If you are using DocArray v<0.30.0, you will be familiar with its [dataclass API](https://docarray.jina.ai/fundamentals/dataclass/).
+If you are using DocArray version 0.30.0 or lower, you will be familiar with its [dataclass API](https://docarray.jina.ai/fundamentals/dataclass/).
-_DocArray v2 is that idea, taken seriously._ Every `Document` is created through dataclass-like interface,
+_DocArray v2 is that idea, taken seriously._ Every document is created through a dataclass-like interface,
courtesy of [Pydantic](https://pydantic-docs.helpmanual.io/usage/models/).
This gives the following advantages:
- **Flexibility:** No need to conform to a fixed set of fields -- your data defines the schema
-- **Multi-modality:** Easily store multiple modalities and multiple embeddings in the same Document
-- **Language agnostic:** At its core, Documents are just dictionaries. This makes it easy to create and send them from any language, not just Python.
+- **Multimodality:** At their core, documents are just dictionaries. This makes it easy to create and send them from any language, not just Python.
You may also be familiar with our old Document Stores for vector DB integration.
They are now called **Document Indexes** and offer the following improvements (see [here](#store) for the new API):
+
- **Hybrid search:** You can now combine vector search with text search, and even filter by arbitrary fields
- **Production-ready:** The new Document Indexes are a much thinner wrapper around the various vector DB libraries, making them more robust and easier to maintain
- **Increased flexibility:** We strive to support any configuration or setting that you could perform through the DB's first-party client
@@ -435,20 +425,21 @@ For now, Document Indexes support **[Weaviate](https://weaviate.io/)**, **[Qdran
Click to expand
-If you come from Pydantic, you can see DocArray Documents as juiced up Pydantic models, and DocArray as a collection of goodies around them.
+If you come from Pydantic, you can see DocArray documents as juiced up Pydantic models, and DocArray as a collection of goodies around them.
More specifically, we set out to **make Pydantic fit for the ML world** - not by replacing it, but by building on top of it!
-This means that you get the following benefits:
-- **ML focused types**: Tensor, TorchTensor, Embedding, ..., including **tensor shape validation**
+This means you get the following benefits:
+
+- **ML-focused types**: Tensor, TorchTensor, Embedding, ..., including **tensor shape validation**
- Full compatibility with **FastAPI**
- **DocList** and **DocVec** generalize the idea of a model to a _sequence_ or _batch_ of models. Perfect for **use in ML models** and other batch processing tasks.
- **Types that are alive**: ImageUrl can `.load()` a URL to image tensor, TextUrl can load and tokenize text documents, etc.
- Cloud-ready: Serialization to **Protobuf** for use with microservices and **gRPC**
-- **Pre-built multi-modal Documents** for different data modalities: Image, Text, 3DMesh, Video, Audio and more. Note that all of these are valid Pydantic models!
+- **Pre-built multimodal documents** for different data modalities: Image, Text, 3DMesh, Video, Audio and more. Note that all of these are valid Pydantic models!
- **Document Stores** and **Document Indexes** let you store your data and retrieve it using **vector search**
-The most obvious advantage here is **first-class support for ML centric data**, such as {Torch, TF, ...}Tensor, Embedding, etc.
+The most obvious advantage here is **first-class support for ML centric data**, such as `{Torch, TF, ...}Tensor`, `Embedding`, etc.
This includes handy features such as validating the shape of a tensor:
@@ -506,7 +497,6 @@ except Exception as e:
-
## Coming from PyTorch
@@ -515,14 +505,15 @@ except Exception as e:
If you come from PyTorch, you can see DocArray mainly as a way of _organizing your data as it flows through your model_.
It offers you several advantages:
-- Express **tensors shapes in type hints**
+
+- Express **tensor shapes in type hints**
- **Group tensors that belong to the same object**, e.g. an audio track and an image
- **Go directly to deployment**, by re-using your data model as a [FastAPI](https://fastapi.tiangolo.com/) or [Jina](https://github.com/jina-ai/jina) API schema
- Connect model components between **microservices**, using Protobuf and gRPC
DocArray can be used directly inside ML models to handle and represent multi-modal data.
This allows you to reason about your data using DocArray's abstractions deep inside of `nn.Module`,
-and provides a (FastAPI-compatible) schema that eases the transition between model training and model serving.
+and provides a FastAPI-compatible schema that eases the transition between model training and model serving.
To see the effect of this, let's first observe a vanilla PyTorch implementation of a tri-modal ML model:
@@ -623,7 +614,7 @@ schema definition (see [below](#coming-from-fastapi)). Everything is handled in
Click to expand
-Similar to the [PyTorch approach](#coming-from-pytorch), you can also use DocArray with TensorFlow to handle and represent multi-modal data inside your ML model.
+Like the [PyTorch approach](#coming-from-pytorch), you can also use DocArray with TensorFlow to handle and represent multimodal data inside your ML model.
First off, to use DocArray with TensorFlow we first need to install it as follows:
@@ -632,7 +623,7 @@ pip install tensorflow==2.11.0
pip install protobuf==3.19.0
```
-Compared to using DocArray with PyTorch, there is one main difference when using it with TensorFlow:\
+Compared to using DocArray with PyTorch, there is one main difference when using it with TensorFlow:
While DocArray's `TorchTensor` is a subclass of `torch.Tensor`, this is not the case for the `TensorFlowTensor`: Due to some technical limitations of `tf.Tensor`, DocArray's `TensorFlowTensor` is not a subclass of `tf.Tensor` but rather stores a `tf.Tensor` in its `.tensor` attribute.
How does this affect you? Whenever you want to access the tensor data to, let's say, do operations with it or hand it to your ML model, instead of handing over your `TensorFlowTensor` instance, you need to access its `.tensor` attribute.
@@ -666,7 +657,6 @@ class MyPodcastModel(tf.keras.Model):
-
## Coming from FastAPI
@@ -676,10 +666,11 @@ Documents are Pydantic Models (with a twist), and as such they are fully compati
But why should you use them, and not the Pydantic models you already know and love?
Good question!
+
- Because of the ML-first features, types and validations, [here](#coming-from-pydantic)
- Because DocArray can act as an [ORM for vector databases](#coming-from-a-vector-database), similar to what SQLModel does for SQL databases
-And to seal the deal, let us show you how easily Documents slot into your FastAPI app:
+And to seal the deal, let us show you how easily documents slot into your FastAPI app:
```python
import numpy as np
@@ -725,14 +716,13 @@ Just like a vanilla Pydantic model!
-
## Coming from a vector database
Click to expand
If you came across DocArray as a universal vector database client, you can best think of it as **a new kind of ORM for vector databases**.
-DocArray's job is to take multi-modal, nested and domain-specific data and to map it to a vector database,
+DocArray's job is to take multimodal, nested and domain-specific data and to map it to a vector database,
store it there, and thus make it searchable:
```python
@@ -774,6 +764,7 @@ results, scores = index.find(query, limit=10, search_field='embedding')
```
Currently, DocArray supports the following vector databases:
+
- [Weaviate](https://www.weaviate.io/)
- [Qdrant](https://qdrant.tech/)
- [Elasticsearch](https://www.elastic.co/elasticsearch/) v8 and v7
@@ -783,14 +774,14 @@ An integration of [OpenSearch](https://opensearch.org/) is currently in progress
Legacy versions of DocArray also support [Redis](https://redis.io/) and [Milvus](https://milvus.io/), but these are not yet supported in the current version.
-Of course this is only one thing that DocArray can do, so we encourage you to check out the rest of this readme!
+Of course this is only one of the things that DocArray can do, so we encourage you to check out the rest of this readme!
-## Install the alpha
+## Installation
-To try out the alpha you can install it via git:
+To install DocArray from the CLI, run the following command:
```shell
pip install -U docarray
@@ -798,10 +789,10 @@ pip install -U docarray
## See also
-- [Documentation](https://docarray-v2--jina-docs.netlify.app/)
+- [Documentation](https://docs.docarray.org)
- [Join our Discord server](https://discord.gg/WaMp6PVPgR)
- [Donation to Linux Foundation AI&Data blog post](https://jina.ai/news/donate-docarray-lf-for-inclusive-standard-multimodal-data-model/)
- ["Legacy" DocArray github page](https://github.com/docarray/docarray/tree/docarray-v1-fixes)
-- ["Legacy" DocArray documentation](https://docarray.jina.ai/)
+- ["Legacy" DocArray documentation](https://docarray-legacy.jina.ai/)
> DocArray is a trademark of LF AI Projects, LLC
diff --git a/docs/api_references/.pages b/docs/API_reference/.pages
similarity index 100%
rename from docs/api_references/.pages
rename to docs/API_reference/.pages
diff --git a/docs/api_references/array/any_da.md b/docs/API_reference/array/any_da.md
similarity index 100%
rename from docs/api_references/array/any_da.md
rename to docs/API_reference/array/any_da.md
diff --git a/docs/api_references/array/da.md b/docs/API_reference/array/da.md
similarity index 100%
rename from docs/api_references/array/da.md
rename to docs/API_reference/array/da.md
diff --git a/docs/api_references/array/da_stack.md b/docs/API_reference/array/da_stack.md
similarity index 100%
rename from docs/api_references/array/da_stack.md
rename to docs/API_reference/array/da_stack.md
diff --git a/docs/api_references/base_doc/base_doc.md b/docs/API_reference/base_doc/base_doc.md
similarity index 100%
rename from docs/api_references/base_doc/base_doc.md
rename to docs/API_reference/base_doc/base_doc.md
diff --git a/docs/api_references/data/data.md b/docs/API_reference/data/data.md
similarity index 100%
rename from docs/api_references/data/data.md
rename to docs/API_reference/data/data.md
diff --git a/docs/api_references/doc_index/backends/elastic.md b/docs/API_reference/doc_index/backends/elastic.md
similarity index 100%
rename from docs/api_references/doc_index/backends/elastic.md
rename to docs/API_reference/doc_index/backends/elastic.md
diff --git a/docs/api_references/doc_index/backends/elastic7.md b/docs/API_reference/doc_index/backends/elastic7.md
similarity index 100%
rename from docs/api_references/doc_index/backends/elastic7.md
rename to docs/API_reference/doc_index/backends/elastic7.md
diff --git a/docs/api_references/doc_index/backends/hnswlib.md b/docs/API_reference/doc_index/backends/hnswlib.md
similarity index 100%
rename from docs/api_references/doc_index/backends/hnswlib.md
rename to docs/API_reference/doc_index/backends/hnswlib.md
diff --git a/docs/api_references/doc_index/backends/qdrant.md b/docs/API_reference/doc_index/backends/qdrant.md
similarity index 100%
rename from docs/api_references/doc_index/backends/qdrant.md
rename to docs/API_reference/doc_index/backends/qdrant.md
diff --git a/docs/api_references/doc_index/backends/weaviate.md b/docs/API_reference/doc_index/backends/weaviate.md
similarity index 100%
rename from docs/api_references/doc_index/backends/weaviate.md
rename to docs/API_reference/doc_index/backends/weaviate.md
diff --git a/docs/api_references/doc_index/doc_index.md b/docs/API_reference/doc_index/doc_index.md
similarity index 100%
rename from docs/api_references/doc_index/doc_index.md
rename to docs/API_reference/doc_index/doc_index.md
diff --git a/docs/api_references/doc_store/doc_store.md b/docs/API_reference/doc_store/doc_store.md
similarity index 100%
rename from docs/api_references/doc_store/doc_store.md
rename to docs/API_reference/doc_store/doc_store.md
diff --git a/docs/api_references/doc_store/file_doc_store.md b/docs/API_reference/doc_store/file_doc_store.md
similarity index 100%
rename from docs/api_references/doc_store/file_doc_store.md
rename to docs/API_reference/doc_store/file_doc_store.md
diff --git a/docs/api_references/doc_store/jac_doc_store.md b/docs/API_reference/doc_store/jac_doc_store.md
similarity index 100%
rename from docs/api_references/doc_store/jac_doc_store.md
rename to docs/API_reference/doc_store/jac_doc_store.md
diff --git a/docs/api_references/doc_store/s3_doc_store.md b/docs/API_reference/doc_store/s3_doc_store.md
similarity index 100%
rename from docs/api_references/doc_store/s3_doc_store.md
rename to docs/API_reference/doc_store/s3_doc_store.md
diff --git a/docs/api_references/documents/documents.md b/docs/API_reference/documents/documents.md
similarity index 100%
rename from docs/api_references/documents/documents.md
rename to docs/API_reference/documents/documents.md
diff --git a/docs/api_references/typing/bytes.md b/docs/API_reference/typing/bytes.md
similarity index 100%
rename from docs/api_references/typing/bytes.md
rename to docs/API_reference/typing/bytes.md
diff --git a/docs/api_references/typing/id.md b/docs/API_reference/typing/id.md
similarity index 100%
rename from docs/api_references/typing/id.md
rename to docs/API_reference/typing/id.md
diff --git a/docs/api_references/typing/tensor/audio.md b/docs/API_reference/typing/tensor/audio.md
similarity index 100%
rename from docs/api_references/typing/tensor/audio.md
rename to docs/API_reference/typing/tensor/audio.md
diff --git a/docs/api_references/typing/tensor/embedding.md b/docs/API_reference/typing/tensor/embedding.md
similarity index 100%
rename from docs/api_references/typing/tensor/embedding.md
rename to docs/API_reference/typing/tensor/embedding.md
diff --git a/docs/api_references/typing/tensor/image.md b/docs/API_reference/typing/tensor/image.md
similarity index 100%
rename from docs/api_references/typing/tensor/image.md
rename to docs/API_reference/typing/tensor/image.md
diff --git a/docs/api_references/typing/tensor/tensor.md b/docs/API_reference/typing/tensor/tensor.md
similarity index 100%
rename from docs/api_references/typing/tensor/tensor.md
rename to docs/API_reference/typing/tensor/tensor.md
diff --git a/docs/api_references/typing/tensor/video.md b/docs/API_reference/typing/tensor/video.md
similarity index 100%
rename from docs/api_references/typing/tensor/video.md
rename to docs/API_reference/typing/tensor/video.md
diff --git a/docs/api_references/typing/url.md b/docs/API_reference/typing/url.md
similarity index 100%
rename from docs/api_references/typing/url.md
rename to docs/API_reference/typing/url.md
diff --git a/docs/api_references/utils/filter.md b/docs/API_reference/utils/filter.md
similarity index 100%
rename from docs/api_references/utils/filter.md
rename to docs/API_reference/utils/filter.md
diff --git a/docs/api_references/utils/find.md b/docs/API_reference/utils/find.md
similarity index 100%
rename from docs/api_references/utils/find.md
rename to docs/API_reference/utils/find.md
diff --git a/docs/api_references/utils/maps_docs.md b/docs/API_reference/utils/maps_docs.md
similarity index 100%
rename from docs/api_references/utils/maps_docs.md
rename to docs/API_reference/utils/maps_docs.md
diff --git a/docs/api_references/utils/reduce.md b/docs/API_reference/utils/reduce.md
similarity index 100%
rename from docs/api_references/utils/reduce.md
rename to docs/API_reference/utils/reduce.md
diff --git a/docs/data_types/3d_mesh/3d_mesh.md b/docs/data_types/3d_mesh/3d_mesh.md
index 20db151bd23..4895b0b38e4 100644
--- a/docs/data_types/3d_mesh/3d_mesh.md
+++ b/docs/data_types/3d_mesh/3d_mesh.md
@@ -3,12 +3,12 @@
DocArray supports many different modalities including `3D Mesh`.
This section will show you how to load and handle 3D data using DocArray.
-A 3D mesh is the structural build of a 3D model consisting of polygons. Most 3D meshes are created via professional software packages, such as commercial suites like Unity, or the free open-source Blender 3D.
-
+A 3D mesh is the structural build of a 3D model consisting of polygons. Most 3D meshes are created via professional software packages, such as commercial suites like [Unity](https://unity.com/), or the open-source [Blender](https://www.blender.org/).
!!! note
This feature requires `trimesh`. You can install all necessary dependencies via:
- ```cm
+
+ ```cmd
pip install "docarray[mesh]"
```
@@ -21,13 +21,16 @@ A 3D mesh can be represented by its vertices and faces:
### Load vertices and faces
-First, let's define our class `MyMesh3D`, which extends [`BaseDoc`][docarray.base_doc.doc.BaseDoc] and provides attributes to store our 3D data. It has an `url` attribute of type [`Mesh3DUrl`][docarray.typing.url.url_3d.mesh_url.Mesh3DUrl]. To store the vertices and faces, DocArray provides the [`VerticesAndFaces`][docarray.documents.mesh.vertices_and_faces.VerticesAndFaces] class, which has a `vertices` attribute and a `faces` attribute, both of type [`AnyTensor`](../../../../api_references/typing/tensor/tensor). This especially comes in handy later when we want to display our 3D mesh.
+First, let's define our class `MyMesh3D`, which extends [`BaseDoc`][docarray.base_doc.doc.BaseDoc] and provides attributes to store our 3D data:
+
+- The `mesh_url` attribute of type [`Mesh3DUrl`][docarray.typing.url.url_3d.mesh_url.Mesh3DUrl].
+- The optional `tensors` attribute, of type [`VerticesAndFaces`][docarray.documents.mesh.vertices_and_faces.VerticesAndFaces]
+ - The `VerticesAndFaces` class has the attributes `vertices` and `faces`, both of type [`AnyTensor`](../../../../api_references/typing/tensor/tensor). This especially comes in handy later when we want to display our 3D mesh.
!!! tip
Check out our predefined [`Mesh3D`](#getting-started-predefined-docs) to get started and play around with our 3D features.
-But for now, let's create a `MyMesh3D` instance with an URL to a remote `.obj` file:
-
+But for now, let's create a `MyMesh3D` instance with a URL to a remote `.obj` file:
```python
from typing import Optional
@@ -45,7 +48,7 @@ class MyMesh3D(BaseDoc):
doc = MyMesh3D(mesh_url="https://people.sc.fsu.edu/~jburkardt/data/obj/al.obj")
```
-To load the vertices and faces information, you can simply call [`.load()`][docarray.typing.url.url_3d.mesh_url.Mesh3DUrl.load] on the [`Mesh3DUrl`][docarray.typing.url.url_3d.mesh_url.Mesh3DUrl] instance. This will return a [`VerticesAndFaces`][docarray.documents.mesh.vertices_and_faces.VerticesAndFaces] object.
+To load the vertices and faces information, you can call [`.load()`][docarray.typing.url.url_3d.mesh_url.Mesh3DUrl.load] on the [`Mesh3DUrl`][docarray.typing.url.url_3d.mesh_url.Mesh3DUrl] instance. This will return a [`VerticesAndFaces`][docarray.documents.mesh.vertices_and_faces.VerticesAndFaces] object:
```python
doc.tensors = doc.mesh_url.load()
@@ -1329,10 +1332,9 @@ function render(){tracklight.position.copy(camera.position);renderer.render(scen
init();