File size: 4,235 Bytes
80b54df
0c40d71
a77552d
0c40d71
e9796a8
 
4aff4d5
643386a
57fa412
80b54df
 
 
 
0c40d71
 
4cacd20
0c40d71
80b54df
 
 
 
729a987
 
 
0c40d71
 
4aff4d5
a77552d
 
 
 
 
 
 
56786d6
a77552d
 
56786d6
a77552d
 
 
 
 
 
56786d6
a77552d
56786d6
 
a77552d
e9796a8
 
4aff4d5
a77552d
 
 
 
 
 
 
56786d6
a77552d
 
e9796a8
56786d6
a77552d
 
 
 
 
 
56786d6
a77552d
56786d6
 
a77552d
e9796a8
 
 
80b54df
e9796a8
729a987
 
e9796a8
 
 
 
80b54df
e9796a8
 
729a987
 
e9796a8
643386a
 
70b3d72
80b54df
70b3d72
 
 
 
643386a
863a898
80b54df
74ad48b
643386a
 
 
 
 
eb813a5
 
 
80b54df
eb813a5
729a987
eb813a5
 
 
80b54df
eb813a5
 
729a987
0cd2d2f
 
 
80b54df
199738e
 
57fa412
 
 
80b54df
57fa412
 
fddcae6
 
 
80b54df
1335971
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
from fastapi import FastAPI, Request
from security import auth
from util import find, rank, save, get_authorized_thoughts, remove
from sentence_transformers import SentenceTransformer
from fastapi.datastructures import UploadFile
from fastapi import FastAPI, File, Form
from fastapi.responses import FileResponse, ORJSONResponse
from pathlib import Path
from microverses import create_microverse, remove_microverse, list_microverses
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.middleware import SlowAPIMiddleware
from slowapi.errors import RateLimitExceeded


limiter = Limiter(key_func=get_remote_address, default_limits=['30/minute'])
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
app.add_middleware(SlowAPIMiddleware)

text_image_encoder = SentenceTransformer('clip-ViT-B-32')
text_encoder = SentenceTransformer(
    'sentence-transformers/multi-qa-mpnet-base-cos-v1')


@app.get('/find', response_class=ORJSONResponse)
async def find_text_handler(
    query: str,
    token: str,
    relatedness: float = 0.8,
    activation: float = 0.,
    noise: float = 0.1,
    return_embeddings: bool = False,
    silent: bool = False,
    request: Request = None
):
    return find(
        'text',
        query,
        relatedness,
        activation,
        noise,
        return_embeddings,
        auth(token),
        text_encoder,
        text_image_encoder,
        silent
    )


@app.post('/find', response_class=ORJSONResponse)
async def find_image_handler(
    query: UploadFile = File(...),
    token: str = Form(...),
    relatedness: float = Form(0.8),
    activation: float = Form(0.),
    noise: float = Form(0.1),
    return_embeddings: bool = Form(False),
    silent: bool = Form(False),
    request: Request = None
):
    query = await query.read()
    return find(
        'image',
        query,
        relatedness,
        activation,
        noise,
        return_embeddings,
        auth(token),
        text_encoder,
        text_image_encoder,
        silent
    )


@app.get('/save')
async def save_text_handler(query: str, token: str, request: Request):
    auth_result = auth(token)
    results = save('text', query, auth_result,
                   text_encoder, text_image_encoder)
    return results


@app.post('/save')
async def save_image_handler(query: UploadFile = File(...), token: str = Form(...), request: Request = None):
    query = await query.read()
    auth_result = auth(token)
    results = save('image', query, auth_result,
                   text_encoder, text_image_encoder)
    return results


@app.get('/remove')
async def remove_handler(filename: str, token: str, request: Request):
    auth_result = auth(token)
    return remove(auth_result, filename)


@app.get('/static')
@limiter.limit("200/minute")
async def static_handler(filename: str, token: str, request: Request):
    knowledge_base_path = Path('..') / 'knowledge'

    auth_result = auth(token)
    thoughts = get_authorized_thoughts(auth_result)
    if filename in [e['filename'] for e in thoughts]:
        return FileResponse(knowledge_base_path / filename)


@app.get('/microverse/create')
async def microverse_create_handler(query: str, token: str, request: Request):
    auth_result = auth(token)
    return create_microverse('text', query, auth_result, text_encoder, text_image_encoder)


@app.post('/microverse/create')
async def microverse_create_handler(query: UploadFile = File(...), token: str = Form(...), request: Request = None):
    query = await query.read()
    auth_result = auth(token)
    return create_microverse('image', query, auth_result, text_encoder, text_image_encoder)


@app.get('/microverse/remove')
async def microverse_remove_handler(token: str, microverse: str, request: Request):
    auth_result = auth(token)
    return remove_microverse(auth_result, microverse)


@app.get('/microverse/list')
async def microverse_list_handler(token: str, request: Request):
    auth_result = auth(token)
    return list_microverses(auth_result)


@app.get('/custodian/check')
async def check_custodian(token: str, request: Request):
    return auth(token)