File size: 3,801 Bytes
9572c0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import streamlit as st

try:
    import dotenv
except ImportError:
    pass

dotenv.load_dotenv()
import openai
import os
import streamlit.components.v1 as components
import requests
import asyncio

openai.api_key = os.getenv("OPENAI_API_KEY")
embedbase_api_key = os.getenv("EMBEDBASE_API_KEY")

URL = "https://embedbase-hosted-usx5gpslaq-uc.a.run.app"
local_history = []


async 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()


async 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()


async def chat(user_input: str, conversation_name: str) -> str:
    local_history.append(user_input)

    history = await 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"]
    await 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 = asyncio.run(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).
    """
)