File size: 3,224 Bytes
5a5e912
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12db3c1
 
5a5e912
12db3c1
5a5e912
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
---
title: Text2vector
emoji: 📊
colorFrom: purple
colorTo: green
sdk: docker
pinned: false
short_description: Create a vector embedding from text
---

# Embedding API

API to call an embedding model ([intfloat/multilingual-e5-large](https://huggingface.co/intfloat/multilingual-e5-large)) for generating multilingual text embeddings.<br>
The embedding model takes a text string and converts it into 1024 dimension vector.<br>
Using a `POST` request to the `/embed` endpoint with a list of texts, the API returns their corresponding embeddings.<br>
A maximum of 2000 characters per text is enforced to avoid truncation, and thereby loss of information, by the tokenizer.<br>
Each text must start with either "query: " or "passage: ".<br>

The API is deployed at a Hugging Face Docker space:<br>
[https://emilbm-text2vector.hf.space](https://emilbm-text2vector.hf.space)

Otherwise, the Swagger UI can be acccessed at:<br>
[https://emilbm-text2vector.hf.space/docs](https://emilbm-text2vector.hf.space/docs)


## Features

- FastAPI-based REST API
- `/embed` endpoint for generating embeddings from a list of texts
- `/health` endpoint for checking the API status
- Uses HuggingFace Transformers and PyTorch
- Includes linting and unit tests
- Dockerfile for containerization
- CI/CD with GitHub Actions to build, lint, test, and deploy to Hugging Face

## Local Development
### Requirements

- Python 3.12+
- [UV](https://docs.astral.sh/uv/)
- (Optional) Docker
### Installation

1. **Clone the repository:**
	 ```sh
	 git clone https://github.com/EmilbMadsen/embedding-api.git
	 cd embedding-api
	 ```

2. **Create a virtual environment and activate it:**
	 ```sh
	 uv venv
	 source .venv/bin/activate
	 ```

3. **Install dependencies:**
	 ```sh
	 uv sync
	 ```

### Formatting, Linting and Unit Tests
- **Formatting (with Black and Ruff) and linting (with Black, Ruff, and MyPy):**
	```sh
	make format
	make lint
	```
- **Run unit tests:**
	```sh
	make test
	```

### Running Locally (without Docker)

Start the API server with Uvicorn:

```sh
uvicorn app.main:app --reload --port 7860
```

### Running Locally (with Docker)
Build and start the API server with Docker:

```sh
docker build -t embedding-api .
docker run -p 7860:7860 embedding-api
```
### Test the endpoint
Test the endpoint with either:
```sh
curl -X 'POST' \
  'http://127.0.0.1:7860/embed' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "texts": [
    "query: what is the capital of France?",
    "passage: Paris is the capital of France."
  ]
}'
```
Or through the Swagger UI.



## Usage

### Embed Endpoint

- **POST** `/embed`
- **Request Body:**
	```json
	{
		"texts": [
			"query: what is the capital of France?",
			"passage: Paris is the capital of France."
		]
	}
	```
- **Response:**
	```json
	{
		"embeddings": [[...], [...]]
	}
	```

### Health Endpoint

- **GET** `/health`
- **Response:**
	```json
	{
		"status": "ok"
	}
	```

## Project Structure

```
app/
		main.py            # FastAPI app
		embeddings.py      # Embedding logic
		models.py          # Request/response models
		logger.py          # Logging setup
tests/
		test_api.py        # API tests
		test_embeddings.py # Embedding tests
```