Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| try: | |
| import dotenv | |
| dotenv.load_dotenv() | |
| except ImportError: | |
| pass | |
| import openai | |
| import os | |
| import streamlit.components.v1 as components | |
| import requests | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| embedbase_api_key = os.getenv("EMBEDBASE_API_KEY") | |
| URL = "https://api.embedbase.xyz" | |
| local_history = [] | |
| def add_to_dataset(dataset_id: str, data: str): | |
| response = requests.post( | |
| f"{URL}/v1/{dataset_id}", | |
| headers={ | |
| "Content-Type": "application/json", | |
| "Authorization": "Bearer " + embedbase_api_key, | |
| }, | |
| json={ | |
| "documents": [ | |
| { | |
| "data": data, | |
| }, | |
| ], | |
| }, | |
| ) | |
| response.raise_for_status() | |
| return response.json() | |
| def search_dataset(dataset_id: str, query: str, limit: int = 3): | |
| response = requests.post( | |
| f"{URL}/v1/{dataset_id}/search", | |
| headers={ | |
| "Content-Type": "application/json", | |
| "Authorization": "Bearer " + embedbase_api_key, | |
| }, | |
| json={ | |
| "query": query, | |
| "top_k": limit, | |
| }, | |
| ) | |
| response.raise_for_status() | |
| return response.json() | |
| def chat(user_input: str, conversation_name: str) -> str: | |
| local_history.append(user_input) | |
| history = search_dataset( | |
| f"infinite-pt-{conversation_name}", | |
| # searching using last 4 messages from local history | |
| "\n\n---\n\n".join(local_history[-4:]), | |
| limit=3, | |
| ) | |
| print("history", history) | |
| response = openai.ChatCompletion.create( | |
| model="gpt-3.5-turbo", | |
| messages=[ | |
| { | |
| "role": "system", | |
| "content": "You are a helpful assistant.", | |
| }, | |
| *[ | |
| { | |
| "role": "assistant", | |
| "content": h["data"], | |
| } | |
| for h in history["similarities"][-5:] | |
| ], | |
| {"role": "user", "content": user_input}, | |
| ], | |
| ) | |
| message = response.choices[0]["message"] | |
| add_to_dataset(f"infinite-pt-{conversation_name}", message["content"]) | |
| local_history.append(message) | |
| return message["content"] | |
| from datetime import datetime | |
| # conversation name is date like ddmmyy_hhmmss | |
| # conversation_name = datetime.now().strftime("%d%m%y_%H%M%S") | |
| conversation_name = st.text_input("Conversation name", "purpose") | |
| # eg not local dev | |
| if not os.getenv("OPENAI_API_KEY"): | |
| embedbase_api_key = st.text_input( | |
| "Your Embedbase key", "get it here <https://app.embedbase.xyz/signup>" | |
| ) | |
| openai_key = st.text_input( | |
| "Your OpenAI key", "get it here <https://platform.openai.com/account/api-keys>" | |
| ) | |
| openai.api_key = openai_key | |
| user_input = st.text_input("You", "How can I reach maximum happiness this year?") | |
| if st.button("Send"): | |
| infinite_pt_response = chat(user_input, conversation_name) | |
| st.markdown( | |
| f""" | |
| Infinite-PT | |
| """ | |
| ) | |
| st.write(infinite_pt_response) | |
| components.html( | |
| """ | |
| <script> | |
| const doc = window.parent.document; | |
| buttons = Array.from(doc.querySelectorAll('button[kind=primary]')); | |
| const send = buttons.find(el => el.innerText === 'Send'); | |
| doc.addEventListener('keydown', function(e) { | |
| switch (e.keyCode) { | |
| case 13: | |
| send.click(); | |
| break; | |
| } | |
| }); | |
| </script> | |
| """, | |
| height=0, | |
| width=0, | |
| ) | |
| st.markdown( | |
| """ | |
| [Source code](https://huggingface.co/spaces/louis030195/infinite-memory-chatgpt) | |
| """ | |
| ) | |
| st.markdown( | |
| """ | |
| Built with ❤️ by [louis030195](https://louis030195.com). | |
| """ | |
| ) | |
| st.markdown( | |
| """ | |
| Powered by [Embedbase](https://embedbase.xyz). | |
| """ | |
| ) | |