SabariKameswaran
commited on
Commit
•
afe9df4
1
Parent(s):
5aa5e6b
Upload 3 files
Browse files- app.ipynb +132 -0
- app.py +62 -0
- persist/chroma.sqlite3 +0 -0
app.ipynb
ADDED
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 2,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"from flask import Flask, jsonify, request, send_file\n",
|
10 |
+
"from gtts import gTTS\n",
|
11 |
+
"from langchain.chains import ConversationalRetrievalChain\n",
|
12 |
+
"from langchain.chat_models import ChatOpenAI\n",
|
13 |
+
"from langchain.document_loaders import TextLoader\n",
|
14 |
+
"from langchain.embeddings import OpenAIEmbeddings\n",
|
15 |
+
"from langchain.indexes import VectorstoreIndexCreator\n",
|
16 |
+
"from langchain.indexes.vectorstore import VectorStoreIndexWrapper\n",
|
17 |
+
"from langchain.vectorstores import Chroma\n",
|
18 |
+
"from langchain.memory import ConversationBufferMemory\n",
|
19 |
+
"import os"
|
20 |
+
]
|
21 |
+
},
|
22 |
+
{
|
23 |
+
"cell_type": "code",
|
24 |
+
"execution_count": 3,
|
25 |
+
"metadata": {},
|
26 |
+
"outputs": [],
|
27 |
+
"source": [
|
28 |
+
"os.environ[\"OPENAI_API_KEY\"] = \"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\"\n",
|
29 |
+
"PERSIST = False"
|
30 |
+
]
|
31 |
+
},
|
32 |
+
{
|
33 |
+
"cell_type": "code",
|
34 |
+
"execution_count": 5,
|
35 |
+
"metadata": {},
|
36 |
+
"outputs": [],
|
37 |
+
"source": [
|
38 |
+
"app = Flask(__name__)"
|
39 |
+
]
|
40 |
+
},
|
41 |
+
{
|
42 |
+
"cell_type": "code",
|
43 |
+
"execution_count": 6,
|
44 |
+
"metadata": {},
|
45 |
+
"outputs": [],
|
46 |
+
"source": [
|
47 |
+
"query = None\n",
|
48 |
+
"\n",
|
49 |
+
"\n",
|
50 |
+
"def main_func(message , history):\n",
|
51 |
+
" chat_history = []\n",
|
52 |
+
" if PERSIST and os.path.exists(\"persist\"):\n",
|
53 |
+
" print(\"Reusing index...\\n\")\n",
|
54 |
+
" vectorstore = Chroma(persist_directory=\"persist\", embedding_function=OpenAIEmbeddings())\n",
|
55 |
+
" index = VectorStoreIndexWrapper(vectorstore=vectorstore)\n",
|
56 |
+
" else:\n",
|
57 |
+
" loader = TextLoader(\"data11.txt\")\n",
|
58 |
+
" if PERSIST:\n",
|
59 |
+
" index = VectorstoreIndexCreator(vectorstore_kwargs={\"persist_directory\":\"persist\"}).from_loaders([loader])\n",
|
60 |
+
" else:\n",
|
61 |
+
" index = VectorstoreIndexCreator().from_loaders([loader])\n",
|
62 |
+
" print(index)\n",
|
63 |
+
"\n",
|
64 |
+
" memory = ConversationBufferMemory(memory_key=\"chat_history\", return_messages=True)\n",
|
65 |
+
" chain = ConversationalRetrievalChain.from_llm(llm=ChatOpenAI(), retriever=index.vectorstore.as_retriever(), memory=memory, verbose=True)\n"
|
66 |
+
]
|
67 |
+
},
|
68 |
+
{
|
69 |
+
"cell_type": "code",
|
70 |
+
"execution_count": 8,
|
71 |
+
"metadata": {},
|
72 |
+
"outputs": [
|
73 |
+
{
|
74 |
+
"ename": "AssertionError",
|
75 |
+
"evalue": "View function mapping is overwriting an existing endpoint function: generate_text",
|
76 |
+
"output_type": "error",
|
77 |
+
"traceback": [
|
78 |
+
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
79 |
+
"\u001b[1;31mAssertionError\u001b[0m Traceback (most recent call last)",
|
80 |
+
"Cell \u001b[1;32mIn[8], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;129;43m@app\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mroute\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m/generate-text/<query>\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethods\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mPOST\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;43;01mdef\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;21;43mgenerate_text\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mresult\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mquestion\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchat_history\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mgenerated_text\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mresult\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43manswer\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\n",
|
81 |
+
"File \u001b[1;32mc:\\Users\\SABARI HARI\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\flask\\sansio\\scaffold.py:366\u001b[0m, in \u001b[0;36mScaffold.route.<locals>.decorator\u001b[1;34m(f)\u001b[0m\n\u001b[0;32m 364\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorator\u001b[39m(f: T_route) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T_route:\n\u001b[0;32m 365\u001b[0m endpoint \u001b[38;5;241m=\u001b[39m options\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mendpoint\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m--> 366\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_url_rule\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrule\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mendpoint\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 367\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m f\n",
|
82 |
+
"File \u001b[1;32mc:\\Users\\SABARI HARI\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\flask\\sansio\\scaffold.py:46\u001b[0m, in \u001b[0;36msetupmethod.<locals>.wrapper_func\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper_func\u001b[39m(\u001b[38;5;28mself\u001b[39m: Scaffold, \u001b[38;5;241m*\u001b[39margs: t\u001b[38;5;241m.\u001b[39mAny, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: t\u001b[38;5;241m.\u001b[39mAny) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m t\u001b[38;5;241m.\u001b[39mAny:\n\u001b[0;32m 45\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_setup_finished(f_name)\n\u001b[1;32m---> 46\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
83 |
+
"File \u001b[1;32mc:\\Users\\SABARI HARI\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\flask\\sansio\\app.py:661\u001b[0m, in \u001b[0;36mApp.add_url_rule\u001b[1;34m(self, rule, endpoint, view_func, provide_automatic_options, **options)\u001b[0m\n\u001b[0;32m 659\u001b[0m old_func \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mview_functions\u001b[38;5;241m.\u001b[39mget(endpoint)\n\u001b[0;32m 660\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m old_func \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m old_func \u001b[38;5;241m!=\u001b[39m view_func:\n\u001b[1;32m--> 661\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAssertionError\u001b[39;00m(\n\u001b[0;32m 662\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mView function mapping is overwriting an existing\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 663\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m endpoint function: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mendpoint\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 664\u001b[0m )\n\u001b[0;32m 665\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mview_functions[endpoint] \u001b[38;5;241m=\u001b[39m view_func\n",
|
84 |
+
"\u001b[1;31mAssertionError\u001b[0m: View function mapping is overwriting an existing endpoint function: generate_text"
|
85 |
+
]
|
86 |
+
}
|
87 |
+
],
|
88 |
+
"source": [
|
89 |
+
"@app.route('/generate-text/<query>', methods=['POST'])\n",
|
90 |
+
"def generate_text(query):\n",
|
91 |
+
" result = chain({\"question\": query, \"chat_history\": []})\n",
|
92 |
+
" generated_text = result['answer']\n",
|
93 |
+
"\n",
|
94 |
+
" tts = gTTS(text=generated_text, lang='en')\n",
|
95 |
+
" tts.save(\"output.mp3\")\n",
|
96 |
+
"\n",
|
97 |
+
" return jsonify({\n",
|
98 |
+
" 'generated_text': generated_text,\n",
|
99 |
+
" 'audio_url': request.host_url + 'audio'\n",
|
100 |
+
" })\n",
|
101 |
+
"\n",
|
102 |
+
"@app.route('/audio')\n",
|
103 |
+
"def get_audio():\n",
|
104 |
+
" return send_file(\"output.mp3\", as_attachment=True)\n",
|
105 |
+
"\n",
|
106 |
+
"if __name__ == \"__main__\":\n",
|
107 |
+
" app.run(debug=True)\n"
|
108 |
+
]
|
109 |
+
}
|
110 |
+
],
|
111 |
+
"metadata": {
|
112 |
+
"kernelspec": {
|
113 |
+
"display_name": "Python 3",
|
114 |
+
"language": "python",
|
115 |
+
"name": "python3"
|
116 |
+
},
|
117 |
+
"language_info": {
|
118 |
+
"codemirror_mode": {
|
119 |
+
"name": "ipython",
|
120 |
+
"version": 3
|
121 |
+
},
|
122 |
+
"file_extension": ".py",
|
123 |
+
"mimetype": "text/x-python",
|
124 |
+
"name": "python",
|
125 |
+
"nbconvert_exporter": "python",
|
126 |
+
"pygments_lexer": "ipython3",
|
127 |
+
"version": "3.11.4"
|
128 |
+
}
|
129 |
+
},
|
130 |
+
"nbformat": 4,
|
131 |
+
"nbformat_minor": 2
|
132 |
+
}
|
app.py
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, jsonify, request, send_file
|
2 |
+
from gtts import gTTS
|
3 |
+
from langchain.chains import ConversationalRetrievalChain
|
4 |
+
from langchain.chat_models import ChatOpenAI
|
5 |
+
from langchain.document_loaders import TextLoader
|
6 |
+
from langchain.embeddings import OpenAIEmbeddings
|
7 |
+
from langchain.indexes import VectorstoreIndexCreator
|
8 |
+
from langchain.indexes.vectorstore import VectorStoreIndexWrapper
|
9 |
+
from langchain.vectorstores import Chroma
|
10 |
+
from langchain.memory import ConversationBufferMemory
|
11 |
+
import os
|
12 |
+
|
13 |
+
app = Flask(__name__)
|
14 |
+
os.environ["OPENAI_API_KEY"] = "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"
|
15 |
+
PERSIST = True
|
16 |
+
|
17 |
+
query = None
|
18 |
+
|
19 |
+
def main_func(message, history):
|
20 |
+
global query
|
21 |
+
chat_history = history
|
22 |
+
if PERSIST and os.path.exists("persist"):
|
23 |
+
print("Reusing index...\n")
|
24 |
+
vectorstore = Chroma(persist_directory="persist", embedding_function=OpenAIEmbeddings())
|
25 |
+
index = VectorStoreIndexWrapper(vectorstore=vectorstore)
|
26 |
+
else:
|
27 |
+
loader = TextLoader("new.txt")
|
28 |
+
if PERSIST:
|
29 |
+
index = VectorstoreIndexCreator(vectorstore_kwargs={"persist_directory": "persist"}).from_loaders([loader])
|
30 |
+
else:
|
31 |
+
index = VectorstoreIndexCreator().from_loaders([loader])
|
32 |
+
|
33 |
+
print(index)
|
34 |
+
|
35 |
+
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
|
36 |
+
chain = ConversationalRetrievalChain.from_llm(llm=ChatOpenAI(), retriever=index.vectorstore.as_retriever(), memory=memory, verbose=True)
|
37 |
+
|
38 |
+
query = message
|
39 |
+
result = chain({"question": query, "chat_history": chat_history})
|
40 |
+
print(result['answer'])
|
41 |
+
chat_history.append((query, result['answer']))
|
42 |
+
return result['answer']
|
43 |
+
|
44 |
+
@app.route('/generate-text/<input_text>', methods=['POST'])
|
45 |
+
def generate_text(input_text):
|
46 |
+
global query
|
47 |
+
generated_text = main_func(input_text, [])
|
48 |
+
|
49 |
+
tts = gTTS(text=generated_text, lang='en')
|
50 |
+
tts.save("output.mp3")
|
51 |
+
|
52 |
+
return jsonify({
|
53 |
+
'generated_text': generated_text,
|
54 |
+
'audio_url': request.host_url + 'audio'
|
55 |
+
})
|
56 |
+
|
57 |
+
@app.route('/audio')
|
58 |
+
def get_audio():
|
59 |
+
return send_file("output.mp3", as_attachment=True)
|
60 |
+
|
61 |
+
if __name__ == "__main__":
|
62 |
+
app.run(debug=True)
|
persist/chroma.sqlite3
ADDED
Binary file (147 kB). View file
|
|