File size: 3,775 Bytes
bbb606d
 
 
c42974e
bbb606d
 
 
0c791ac
5659cad
0c791ac
 
c42974e
 
 
 
5659cad
c42974e
 
 
 
 
 
 
1f17c41
0c791ac
 
c42974e
0c791ac
 
1f17c41
 
0c791ac
 
 
 
c42974e
 
0c791ac
bbb606d
c42974e
0c791ac
 
1f17c41
 
4501353
1f17c41
 
 
4501353
44d6125
5659cad
0c791ac
5659cad
0c791ac
1f17c41
 
 
 
 
 
 
 
 
 
 
 
bbb606d
c42974e
0c791ac
 
 
 
 
 
 
bbb606d
5659cad
bbb606d
c42974e
 
bbb606d
0c791ac
120c5a1
 
 
 
1f17c41
 
0c791ac
 
5659cad
 
 
 
 
0c791ac
 
5659cad
bbb606d
5bd6b08
bbb606d
c42974e
bbb606d
c42974e
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 io
import random
from typing import List, Tuple
import os

import aiohttp
import panel as pn
from gradio_tools import *
from langchain_experimental.tools import PythonREPLTool
from langchain.prompts import MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from langchain.callbacks import *
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.agents import initialize_agent
from langchain.tools import StructuredTool, ShellTool
from langchain.agents import AgentType, load_tools
from langchain.agents.agent_toolkits.openapi.spec import reduce_openapi_spec
from langchain.agents.agent_toolkits.openapi import planner
from langchain.requests import RequestsWrapper
from langchain.utilities import *
from panel.chat import ChatInterface
from panel.chat.langchain import PanelCallbackHandler
from uuid import uuid4
import io
import panel
import yaml
from PIL import Image
import logging
import audio2numpy as a2n
import scipy

def exception_handler(ex):
    logging.error("Error", exc_info=ex)
    panel.state.notifications.error('Error: %s' % ex)

pn.extension("perspective")
pn.extension(exception_handler=exception_handler, notifications=True)

def on_user_message(contents, user, instance):
    global file_input
    if file_input.value is not None:
        if file_input.filename.endswith((".png", ".jpg", ".jpeg")):
            filename = str(uuid4())+".png"
            Image.open(contents).save(f'/tmp/{filename}')
        elif file_input.filename.endswith((".mp3", ".wav")):
            filename = str(uuid4())+".wav"
            audio, rate = a2n.audio_from_file(contents)
            scipy.io.wavfile.write(f'/tmp/{filename}', rate, audio)
        file_input.value = None
        return agent.run(f"Uploaded: /tmp/{filename}")
    else:
        return agent.run(contents)

def send_image(filepath: str):
    """Sends to the user the image stored in the given filepath"""
    chat_interface.send(Image.open(filepath), user="Assistant", respond=False)
    return 'success'

def send_audio(filepath: str):
    "Sends to the user the audio stored in the given filepath"
    audio, rate = a2n.audio_from_file(filepath)
    chat_interface.send(panel.pane.Audio(audio, sample_rate=rate), user="Assistant", respond=False)
    return 'success'

file_input = panel.widgets.FileInput(name="File Upload", accept=".png,.jpg,.jpeg,.mp3,.wav")

# create chat interface
chat_interface = ChatInterface(
    callback=on_user_message,
    widgets=[
        panel.widgets.TextAreaInput(placeholder="Enter your message here."),
        file_input
    ]
)

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, streaming=True, callbacks=[StreamingStdOutCallbackHandler()])#, PanelCallbackHandler(instance=chat_interface, user='Assistant', avatar=panel.chat.langchain.DEFAULT_AVATARS["assistant"])])

tools = load_tools(["openweathermap-api"], llm)
tools[0].api_wrapper.openweathermap_api_key = os.environ.get('OPENWEATHERMAP_API_KEY')

tools += [
    ImageCaptioningTool(duplicate=True).langchain,
    WhisperAudioTranscriptionTool(duplicate=True).langchain,
    BarkTextToSpeechTool(duplicate=True).langchain,
    StableDiffusionTool(duplicate=True).langchain,
    StructuredTool.from_function(send_image),
    StructuredTool.from_function(send_audio)
]

tools += [
    PythonREPLTool(),
    ShellTool()
]

memory = ConversationBufferMemory(memory_key="memory", return_messages=True)

agent = initialize_agent(tools=tools, llm=llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True, agent_kwargs=dict(extra_prompt_messages=[MessagesPlaceholder(variable_name="memory")]), memory=memory)

main = chat_interface

title = "SkyNet Research Preview"

main.servable(title=title)