summaryrefslogtreecommitdiff
path: root/vectordb.h
blob: 5c41a0ac3378477307f9af0da5eaad552106c388 (plain)
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
#ifndef VECTORDB_H
#define VECTORDB_H

#include "llama.h"

#include <errno.h>

#define VDB_MAX_DOCS    1000
#define VDB_EMBED_SIZE  768
#define VDB_MAX_TEXT    1024

#define VDB_MAGIC       0x31424456u /* "VDB1" */
#define VDB_VERSION     1u
#define VDB_TOKENS      512

typedef struct {
	float embedding[VDB_EMBED_SIZE];
	char text[VDB_MAX_TEXT];
} VectorDoc;

typedef struct {
	VectorDoc docs[VDB_MAX_DOCS];
	int count;
	struct llama_context *embed_ctx;
} VectorDB;

typedef struct {
	uint32_t magic;
	uint32_t version;
	uint32_t embed_size;
	uint32_t max_text;
	uint32_t count;
} VdbFileHeader;

typedef enum {
	VDB_SUCCESS                = 0,
	VDB_OPEN_ERR               = 9001,
	VDB_CLOSE_ERR              = 9002,
	VDB_HEADER_WRITE_ERR       = 9003,
	VDB_HEADER_READ_ERR        = 9004,
	VDB_MAGIC_MISMATCH_ERR     = 9005,
	VDB_EMBED_MISMATCH_ERR     = 9006,
	VDB_COUNT_TOO_LARGE_ERR    = 9007,
	VDB_DOC_WRITE_ERR          = 9008,
	VDB_DOC_READ_ERR           = 9009,
} VectorDBErrorCode;

void vdb_init(VectorDB *db, struct llama_context *embed_ctx);
void vdb_free(VectorDB *db);

void vdb_add_document(VectorDB *db, const char *text);

void vdb_embed_query(VectorDB *db, const char *text, float *out_embedding);
void vdb_search(VectorDB *db, float *query_embedding, int top_k, int *results);

VectorDBErrorCode vdb_save(const VectorDB *db, const char *path);
VectorDBErrorCode vdb_load(VectorDB *db, const char *path);

const char* vdb_error(VectorDBErrorCode err);

#endif