-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathmain.py
More file actions
104 lines (80 loc) · 2.97 KB
/
main.py
File metadata and controls
104 lines (80 loc) · 2.97 KB
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
import os
import json
from simpleaichat import AIChat
from simpleaichat.utils import wikipedia_search, wikipedia_search_lookup
from pluto_client import Router, HttpRequest, HttpResponse, Bucket
router = Router("router")
sessions = Bucket("sessions")
basic_args = {
"console": False,
"api_key": os.environ.get("OPENAI_API_KEY"),
"api_url": os.environ.get("CHAT_API_URL"),
}
def chat_handler(req: HttpRequest) -> HttpResponse:
"""Chat in a session with the AI using simpleaichat."""
session_id = req.query.get("session_id")
query = req.query.get("query")
if session_id is None or query is None:
return HttpResponse(
status_code=400,
body=json.dumps({"error": "session_id and query are required."}),
)
ai = AIChat(**basic_args)
# Load the session from bucket if it exists
ai_chat_sess_id = None
output_path = f"/tmp/${session_id}.json"
try:
sessions.get(session_id, output_path)
ai.load_session(input_path=output_path, **basic_args)
with open(output_path, "r") as f:
ai_chat_sess_id = json.load(f)["id"]
except Exception:
ai_chat_sess_id = ai.default_session.id
pass
response = ai(query, id=ai_chat_sess_id)
# Save the session to the bucket
ai.save_session(
output_path=output_path,
format="json",
minify=True,
id=ai_chat_sess_id,
)
sessions.put(session_id, output_path)
return HttpResponse(status_code=200, body=json.dumps(response))
def qa_handler(req: HttpRequest) -> HttpResponse:
"""Ask a question to the AI using simpleaichat."""
query = req.query.get("query")
if query is None:
return HttpResponse(
status_code=400,
body=json.dumps({"error": "query is required."}),
)
ai = AIChat(**basic_args)
response = ai(query)
return HttpResponse(status_code=200, body=json.dumps(response))
# This uses the Wikipedia Search API.
# Results from it are nondeterministic, your mileage will vary.
def search(query):
"""Search the internet."""
wiki_matches = wikipedia_search(query, n=3)
return {"context": ", ".join(wiki_matches), "titles": wiki_matches}
def lookup(query):
"""Lookup more information about a topic."""
page = wikipedia_search_lookup(query, sentences=3)
return page
def wikipedia_handler(req: HttpRequest) -> HttpResponse:
"""Get information from Wikipedia using simpleaichat."""
query = req.query.get("query")
if query is None:
return HttpResponse(
status_code=400,
body=json.dumps({"error": "query is required."}),
)
params = {"temperature": 0.0, "max_tokens": 100}
ai = AIChat(params=params, **basic_args)
response = ai(query, tools=[search, lookup])
return HttpResponse(status_code=200, body=json.dumps(response))
# Define routes for the ApiGateway
router.get("/chat", chat_handler)
router.get("/qa", qa_handler)
router.get("/wikipedia", wikipedia_handler)