From a20b7971cb05f95ba0a1b6fc22a44fbe8e110fa0 Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Mon, 19 Jun 2023 09:36:02 +0900 Subject: [PATCH 01/10] Bump up version number --- CHANGELOG.md | 2 ++ kanu/version.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e4525..a29bd0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # CHANGELOG +## 0.8.0 (in development) + ## 0.7.0 (2023-06-19) * Implement token counter and price monitor in chat window. * Enable the Enter key for sending messages in chat window. diff --git a/kanu/version.py b/kanu/version.py index faee7a1..807119d 100644 --- a/kanu/version.py +++ b/kanu/version.py @@ -1 +1 @@ -__version__ = "0.7.0" \ No newline at end of file +__version__ = "0.8.0" \ No newline at end of file From cd291fefe3c64f78b7da80d75e3af2188044407c Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Wed, 21 Jun 2023 11:23:12 +0900 Subject: [PATCH 02/10] Fix token usage for embedding --- kanu/docgpt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kanu/docgpt.py b/kanu/docgpt.py index 00b6aa4..cd48a34 100644 --- a/kanu/docgpt.py +++ b/kanu/docgpt.py @@ -168,7 +168,7 @@ def go_with_option1(self): text_splitter = RecursiveCharacterTextSplitter(chunk_size=self.chunk_size.get(), chunk_overlap=self.chunk_overlap.get()) texts = text_splitter.split_documents(documents) for text in texts: - self.tokens += text2tokens("text-embedding-ada-002", text.page_content) + self.tokens += 2 * text2tokens("text-embedding-ada-002", text.page_content) self.price = tokens2price("text-embedding-ada-002", "embedding", self.tokens) db = Chroma.from_documents(texts, OpenAIEmbeddings(model="text-embedding-ada-002"), persist_directory=self.database_directory) db.add_documents(texts) From 85b6aaeabbc156d5f3d55987574dac4f4df3360d Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Thu, 22 Jun 2023 12:55:43 +0900 Subject: [PATCH 03/10] Use UTF-8 encoding when processing .csv documents --- kanu/docgpt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kanu/docgpt.py b/kanu/docgpt.py index cd48a34..8858bc2 100644 --- a/kanu/docgpt.py +++ b/kanu/docgpt.py @@ -25,7 +25,7 @@ ".pdf": (PDFMinerLoader, {}), ".doc": (UnstructuredWordDocumentLoader, {}), ".docx": (UnstructuredWordDocumentLoader, {}), - ".csv": (CSVLoader, {}), + ".csv": (CSVLoader, {"encoding": "utf8"}), } class DocGPT: From d8d478056f6d180b37a588462a7146a7112d9c96 Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Thu, 22 Jun 2023 13:10:38 +0900 Subject: [PATCH 04/10] Use UTF-8 encoding when downloading chat session --- kanu/gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kanu/gui.py b/kanu/gui.py index 83a62d3..fa35768 100644 --- a/kanu/gui.py +++ b/kanu/gui.py @@ -61,7 +61,7 @@ def save(self): data += self.agent.system.get("1.0", tk.END).rstrip() data += "\n\n[Session]\n" data += self.agent.session.get("1.0", tk.END).rstrip() - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding="utf-8") as f: f.write(data) class Settings: From 48cb37707ae6c1e17a4330c4a81027a74c411b14 Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Fri, 23 Jun 2023 16:37:51 +0900 Subject: [PATCH 05/10] Add framework for FuncGPT --- kanu/__main__.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++- kanu/funcgpt.py | 53 +++++++++++++++++++++++++++++++++++ kanu/gui.py | 2 ++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 kanu/funcgpt.py diff --git a/kanu/__main__.py b/kanu/__main__.py index 13082f4..15a76e2 100644 --- a/kanu/__main__.py +++ b/kanu/__main__.py @@ -7,7 +7,7 @@ from .version import __version__ from .gui import Tooltip -GPT_MODELS = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4", "gpt-4-32k"] +GPT_MODELS = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-0613", "gpt-4", "gpt-4-32k", "gpt-4-0613"] CHATGPT_PROMPT = """You are a helpful assistant.""" DOCGPT_PROMPT = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. @@ -15,6 +15,7 @@ Question: {question} Helpful Answer:""" +FUNCGPT_PROMPT = """You are a helpful assistant.""" class KANU: def __init__(self, root): @@ -35,6 +36,8 @@ def homepage(self): b.pack() b = tk.Button(self.container, text="DocGPT", command=lambda: self.config_docgpt()) b.pack() + b = tk.Button(self.container, text="FuncGPT", command=lambda: self.config_funcgpt()) + b.pack() def config_chatgpt(self): self.container.pack_forget() @@ -183,6 +186,70 @@ def template_docgpt_config(self): with open(file_path, "w") as f: config.write(f) + def config_funcgpt(self): + self.container.pack_forget() + self.container = tk.Frame(self.root) + self.container.pack() + l = tk.Label(self.container, text="FuncGPT") + l.grid(row=0, column=0, columnspan=2) + l = tk.Label(self.container, text="Required packages:") + l.grid(row=1, column=0, columnspan=2) + self.display_required_dependency(2, "openai") + m = tk.Message(self.container, width=300, text="Option 1. Upload a configuration file") + m.grid(row=3, column=0, columnspan=2) + b = tk.Button(self.container, text="Browse", command=self.parse_funcgpt_config) + b.grid(row=4, column=0) + b = tk.Button(self.container, text="Template", command=self.template_funcgpt_config) + b.grid(row=4, column=1) + m = tk.Message(self.container, width=300, text="Option 2. Configure manually") + m.grid(row=5, column=0, columnspan=2) + l = tk.Label(self.container, text="Model:") + l.grid(row=6, column=0, columnspan=2) + self.model = tk.StringVar(self.container, value="gpt-3.5-turbo-0613") + om = ttk.OptionMenu(self.container, self.model, *GPT_MODELS) + om.grid(row=7, column=0, columnspan=2) + l = tk.Label(self.container, text="System message ⓘ:") + Tooltip(l, "The system message helps set the behavior of the chatbot.") + l.grid(row=8, column=0, columnspan=2) + self.prompt = tk.Text(self.container, height=9, width=42) + sb = tk.Scrollbar(self.container, command=self.prompt.yview) + self.prompt.insert("1.0", FUNCGPT_PROMPT) + self.prompt.grid(row=9, column=0, columnspan=2, sticky="nsew") + sb.grid(row=9, column=2, sticky="ns") + self.prompt["yscrollcommand"] = sb.set + l = tk.Label(self.container, text="Temperature ⓘ:") + Tooltip(l, "The randomness in generating responses, which ranges between 0 and 1, with 0 indicating almost deterministic behavior.") + l.grid(row=10, column=0, columnspan=2) + self.temperature = tk.DoubleVar(self.container, value=0.5) + e = tk.Entry(self.container, textvariable=self.temperature) + e.grid(row=11, column=0, columnspan=2) + l = tk.Label(self.container, text="OpenAI API key:") + l.grid(row=12, column=0, columnspan=2) + e = tk.Entry(self.container) + e.grid(row=13, column=0, columnspan=2) + b = tk.Button(self.container, text="Submit", command=lambda: self.deploy_agent("FuncGPT", e.get(), self.model.get(), self.temperature.get(), self.prompt.get("1.0", "end-1c"))) + b.grid(row=14, column=0) + b = tk.Button(self.container, text="Go back", command=lambda: self.homepage()) + b.grid(row=14, column=1) + + def parse_funcgpt_config(self): + config = configparser.ConfigParser() + file_path = filedialog.askopenfilename() + if not file_path: + return + config.read(file_path) + self.deploy_agent("FuncGPT", config["USER"]["openai_key"], config["DEFAULT"]["model"], float(config["DEFAULT"]["temperature"]), config["DEFAULT"]["prompt"]) + + def template_funcgpt_config(self): + file_path = filedialog.asksaveasfilename() + if not file_path: + return + config = configparser.ConfigParser() + config["DEFAULT"] = {"model": "gpt-3.5-turbo", "temperature": "0.5", "prompt": FUNCGPT_PROMPT} + config["USER"] = {"openai_key": ""} + with open(file_path, "w") as f: + config.write(f) + def deploy_agent(self, agent, *args, **kwargs): if agent == "ChatGPT": from .chatgpt import ChatGPT @@ -192,6 +259,10 @@ def deploy_agent(self, agent, *args, **kwargs): from .docgpt import DocGPT docgpt = DocGPT(self, *args, **kwargs) docgpt.run() + elif agent == "FuncGPT": + from .funcgpt import FuncGPT + docgpt = FuncGPT(self, *args, **kwargs) + docgpt.run() else: raise ValueError(f"Unknown agent {agent}") diff --git a/kanu/funcgpt.py b/kanu/funcgpt.py new file mode 100644 index 0000000..d2d8ac8 --- /dev/null +++ b/kanu/funcgpt.py @@ -0,0 +1,53 @@ +import tkinter as tk + +import openai + +from .gui import Settings, Conversation +from .utils import tokens2price + +class FuncGPT: + def __init__(self, kanu, openai_key, model, temperature, prompt): + self.kanu = kanu + self.model = model + self.temperature = temperature + self.prompt = prompt + openai.api_key = openai_key + self.settings = Settings(self) + self.conversation = Conversation(self) + self.tokens = 0 + self.price = 0 + + def run(self): + self.conversation.page() + + def send_message(self): + if not self.messages: + self.messages.append({"role": "system", "content": self.prompt}) + self.messages += [{"role": "user", "content": self.user_input.get()}] + bot_response = openai.ChatCompletion.create( + model=self.model, + messages=self.messages, + temperature=self.temperature, + ) + response = bot_response["choices"][0]["message"]["content"] + self.messages += [{"role": "assistant", "content": response}] + self.session.insert(tk.END, "You: " + self.user_input.get() + "\n", "user") + self.session.insert(tk.END, f"Bot: " + response + "\n", "bot") + usage = self.calculate_usage(bot_response) + self.system.insert(tk.END, f"{usage}\n", "system") + self.chatbox.delete(0, tk.END) + + def calculate_usage(self, response): + total_tokens = response["usage"]["total_tokens"] + prompt_tokens = response["usage"]["prompt_tokens"] + completion_tokens = response["usage"]["completion_tokens"] + prompt_price = tokens2price(self.model, "prompt", prompt_tokens) + completion_price = tokens2price(self.model, "completion", completion_tokens) + self.price += prompt_price + completion_price + self.tokens += total_tokens + message = f"System: Used {prompt_tokens:,} prompt + {completion_tokens:,} completion = {total_tokens:,} tokens (total: {self.tokens:,} or ${self.price:.6f})." + return message + + def clear_session(self): + self.tokens = self.price = 0 + self.run() \ No newline at end of file diff --git a/kanu/gui.py b/kanu/gui.py index fa35768..770994a 100644 --- a/kanu/gui.py +++ b/kanu/gui.py @@ -7,6 +7,8 @@ def __init__(self, agent): self.name = self.agent.__class__.__name__ if self.name == "ChatGPT": self.go_back = self.agent.kanu.config_chatgpt + elif self.name == "FuncGPT": + self.go_back = self.agent.kanu.config_funcgpt else: self.go_back = self.agent.run From 2669262afb3a28421ec6517adcb817bebed2f61c Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Fri, 23 Jun 2023 17:26:11 +0900 Subject: [PATCH 06/10] Update files --- kanu/__main__.py | 38 +++++++++++++++++++++++++++++--------- kanu/funcgpt.py | 39 +++++++++++++++++++++++++++++++++++++-- kanu/utils.py | 4 ++++ 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/kanu/__main__.py b/kanu/__main__.py index 15a76e2..d893360 100644 --- a/kanu/__main__.py +++ b/kanu/__main__.py @@ -206,7 +206,7 @@ def config_funcgpt(self): l = tk.Label(self.container, text="Model:") l.grid(row=6, column=0, columnspan=2) self.model = tk.StringVar(self.container, value="gpt-3.5-turbo-0613") - om = ttk.OptionMenu(self.container, self.model, *GPT_MODELS) + om = ttk.OptionMenu(self.container, self.model, "gpt-3.5-turbo-0613", *GPT_MODELS) om.grid(row=7, column=0, columnspan=2) l = tk.Label(self.container, text="System message ⓘ:") Tooltip(l, "The system message helps set the behavior of the chatbot.") @@ -217,20 +217,26 @@ def config_funcgpt(self): self.prompt.grid(row=9, column=0, columnspan=2, sticky="nsew") sb.grid(row=9, column=2, sticky="ns") self.prompt["yscrollcommand"] = sb.set + l = tk.Label(self.container, text="Function script:") + l.grid(row=10, column=0, columnspan=2) + b = tk.Button(self.container, text="Browse", command=self.get_function_script) + b.grid(row=11, column=0) + b = tk.Button(self.container, text="Example", command=self.example_function_script) + b.grid(row=11, column=1) l = tk.Label(self.container, text="Temperature ⓘ:") Tooltip(l, "The randomness in generating responses, which ranges between 0 and 1, with 0 indicating almost deterministic behavior.") - l.grid(row=10, column=0, columnspan=2) + l.grid(row=12, column=0, columnspan=2) self.temperature = tk.DoubleVar(self.container, value=0.5) e = tk.Entry(self.container, textvariable=self.temperature) - e.grid(row=11, column=0, columnspan=2) + e.grid(row=13, column=0, columnspan=2) l = tk.Label(self.container, text="OpenAI API key:") - l.grid(row=12, column=0, columnspan=2) + l.grid(row=14, column=0, columnspan=2) e = tk.Entry(self.container) - e.grid(row=13, column=0, columnspan=2) + e.grid(row=15, column=0, columnspan=2) b = tk.Button(self.container, text="Submit", command=lambda: self.deploy_agent("FuncGPT", e.get(), self.model.get(), self.temperature.get(), self.prompt.get("1.0", "end-1c"))) - b.grid(row=14, column=0) + b.grid(row=16, column=0) b = tk.Button(self.container, text="Go back", command=lambda: self.homepage()) - b.grid(row=14, column=1) + b.grid(row=16, column=1) def parse_funcgpt_config(self): config = configparser.ConfigParser() @@ -238,18 +244,32 @@ def parse_funcgpt_config(self): if not file_path: return config.read(file_path) - self.deploy_agent("FuncGPT", config["USER"]["openai_key"], config["DEFAULT"]["model"], float(config["DEFAULT"]["temperature"]), config["DEFAULT"]["prompt"]) + self.deploy_agent("FuncGPT", config["USER"]["openai_key"], config["DEFAULT"]["model"], float(config["DEFAULT"]["temperature"]), config["DEFAULT"]["prompt"], config["USER"]["function_script"]) def template_funcgpt_config(self): file_path = filedialog.asksaveasfilename() if not file_path: return config = configparser.ConfigParser() - config["DEFAULT"] = {"model": "gpt-3.5-turbo", "temperature": "0.5", "prompt": FUNCGPT_PROMPT} + config["DEFAULT"] = {"model": "gpt-3.5-turbo-0613", "temperature": "0.5", "prompt": FUNCGPT_PROMPT} config["USER"] = {"openai_key": ""} + config["USER"] = {"function_script": ""} with open(file_path, "w") as f: config.write(f) + def get_function_script(self): + file_path = filedialog.askopenfilename() + if not file_path: + return + self.script = file_path + + def example_function_script(self): + file_path = filedialog.asksaveasfilename() + if not file_path: + return + with open(file_path, "w") as f: + f.write('@@') + def deploy_agent(self, agent, *args, **kwargs): if agent == "ChatGPT": from .chatgpt import ChatGPT diff --git a/kanu/funcgpt.py b/kanu/funcgpt.py index d2d8ac8..c610ca8 100644 --- a/kanu/funcgpt.py +++ b/kanu/funcgpt.py @@ -1,4 +1,6 @@ import tkinter as tk +import importlib.util +import json import openai @@ -6,16 +8,28 @@ from .utils import tokens2price class FuncGPT: - def __init__(self, kanu, openai_key, model, temperature, prompt): + def __init__( + self, + kanu, + openai_key, + model, + temperature, + prompt, + function_script + ): self.kanu = kanu self.model = model self.temperature = temperature self.prompt = prompt + self.function_script = function_script openai.api_key = openai_key self.settings = Settings(self) self.conversation = Conversation(self) self.tokens = 0 self.price = 0 + module_name = "imported_module" + loader = importlib.machinery.SourceFileLoader(module_name, self.function_script) + self.module = loader.load_module() def run(self): self.conversation.page() @@ -28,8 +42,29 @@ def send_message(self): model=self.model, messages=self.messages, temperature=self.temperature, + functions=[self.module.openai_functions[0][1]], + function_call="auto", ) - response = bot_response["choices"][0]["message"]["content"] + message = bot_response["choices"][0]["message"] + if message.get("function_call"): + function_name = message["function_call"]["name"] + function_args = json.loads(message["function_call"]["arguments"]) + function_response = self.module.openai_functions[0][0](**function_args) + second_response = openai.ChatCompletion.create( + model=self.model, + messages=[ + {"role": "user", "content": "What is the weather like in boston?"}, + message, + { + "role": "function", + "name": function_name, + "content": function_response, + }, + ], + ) + response = second_response["choices"][0]["message"]["content"] + else: + response = bot_response["choices"][0]["message"]["content"] self.messages += [{"role": "assistant", "content": response}] self.session.insert(tk.END, "You: " + self.user_input.get() + "\n", "user") self.session.insert(tk.END, f"Bot: " + response + "\n", "bot") diff --git a/kanu/utils.py b/kanu/utils.py index 20bc16d..81cd2e5 100644 --- a/kanu/utils.py +++ b/kanu/utils.py @@ -5,9 +5,13 @@ def tokens2price(model, task, tokens): models = { "gpt-3.5-turbo" : {"prompt": 0.0015, "completion": 0.002}, + "gpt-3.5-turbo-0613" : {"prompt": 0.0015, "completion": 0.002}, "gpt-3.5-turbo-16k" : {"prompt": 0.003, "completion": 0.004}, + "gpt-3.5-turbo-16k-0613" : {"prompt": 0.003, "completion": 0.004}, "gpt-4" : {"prompt": 0.03, "completion": 0.06}, + "gpt-4-0613" : {"prompt": 0.03, "completion": 0.06}, "gpt-4-32k" : {"prompt": 0.06, "completion": 0.12}, + "gpt-4-32k-0613" : {"prompt": 0.06, "completion": 0.12}, "text-embedding-ada-002" : {"embedding": 0.0001}, } return models[model][task] / 1000 * tokens From c731d97c04e0abfa182cb68534ce8b4c0a1ecf94 Mon Sep 17 00:00:00 2001 From: Seung-been Lee Date: Sat, 24 Jun 2023 09:42:33 +0900 Subject: [PATCH 07/10] Update files --- CHANGELOG.md | 1 + README.md | 10 ++++++++++ kanu/__main__.py | 38 +++++++++++++++++++++++++++++++++++--- kanu/chatgpt.py | 5 ++--- kanu/docgpt.py | 5 ++--- kanu/funcgpt.py | 23 ++++++++++++----------- 6 files changed, 62 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a29bd0b..1e1a98c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG ## 0.8.0 (in development) +* Enable ChatGPT to answer questions by making calls to external tools, APIs, or databases. ## 0.7.0 (2023-06-19) * Implement token counter and price monitor in chat window. diff --git a/README.md b/README.md index d89db61..1609e01 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ There are currently two chatbots available in KANU: - [ChatGPT](#chatgpt) harnesses the power of ChatGPT, bringing it directly to your local computer - [DocGPT](#docgpt) allows you to effortlessly interact with your documents and ask questions about them +- [FuncGPT](#fucgpt) can answer your questions by making calls to external tools, APIs, or databases Other features of KANU inclde: @@ -63,6 +64,15 @@ unstructured # Optional. Only required for .doc and .docx documents. tabulate # Optional. Only required for .doc and .docx documents. ``` + +### FuncGPT + +The following packages are required to run FuncGPT: + +``` +openai # Required. +``` + ## Changelog See the [CHANGELOG.md](https://github.com/sbslee/kanu/blob/main/CHANGELOG.md) file for details. \ No newline at end of file diff --git a/kanu/__main__.py b/kanu/__main__.py index d893360..48c3274 100644 --- a/kanu/__main__.py +++ b/kanu/__main__.py @@ -16,6 +16,39 @@ Question: {question} Helpful Answer:""" FUNCGPT_PROMPT = """You are a helpful assistant.""" +FUNCGPT_EXAMPLE = """import json + +def get_current_weather(location, unit="fahrenheit"): + weather_info = { + "location": location, + "temperature": "72", + "unit": unit, + "forecast": ["sunny", "windy"], + } + return json.dumps(weather_info) + +get_current_weather_json = { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, + }, + "required": ["location"], + }, +} + +functions = { + "get_current_weather": { + "function": get_current_weather, + "json": get_current_weather_json, + } +}""" class KANU: def __init__(self, root): @@ -252,8 +285,7 @@ def template_funcgpt_config(self): return config = configparser.ConfigParser() config["DEFAULT"] = {"model": "gpt-3.5-turbo-0613", "temperature": "0.5", "prompt": FUNCGPT_PROMPT} - config["USER"] = {"openai_key": ""} - config["USER"] = {"function_script": ""} + config["USER"] = {"openai_key": "", "function_script": ""} with open(file_path, "w") as f: config.write(f) @@ -268,7 +300,7 @@ def example_function_script(self): if not file_path: return with open(file_path, "w") as f: - f.write('@@') + f.write(FUNCGPT_EXAMPLE) def deploy_agent(self, agent, *args, **kwargs): if agent == "ChatGPT": diff --git a/kanu/chatgpt.py b/kanu/chatgpt.py index 95448f5..ae00946 100644 --- a/kanu/chatgpt.py +++ b/kanu/chatgpt.py @@ -33,8 +33,7 @@ def send_message(self): self.messages += [{"role": "assistant", "content": response}] self.session.insert(tk.END, "You: " + self.user_input.get() + "\n", "user") self.session.insert(tk.END, f"Bot: " + response + "\n", "bot") - usage = self.calculate_usage(bot_response) - self.system.insert(tk.END, f"{usage}\n", "system") + self.calculate_usage(bot_response) self.chatbox.delete(0, tk.END) def calculate_usage(self, response): @@ -46,7 +45,7 @@ def calculate_usage(self, response): self.price += prompt_price + completion_price self.tokens += total_tokens message = f"System: Used {prompt_tokens:,} prompt + {completion_tokens:,} completion = {total_tokens:,} tokens (total: {self.tokens:,} or ${self.price:.6f})." - return message + self.system.insert(tk.END, f"{message}\n", "system") def clear_session(self): self.tokens = self.price = 0 diff --git a/kanu/docgpt.py b/kanu/docgpt.py index 8858bc2..8a4b0fd 100644 --- a/kanu/docgpt.py +++ b/kanu/docgpt.py @@ -138,9 +138,8 @@ def send_message(self): self.session.insert(tk.END, "You: " + self.user_input.get() + "\n", "user") with get_openai_callback() as cb: response = self.qa(self.user_input.get()) - usage = self.calculate_usage(cb) + self.calculate_usage(cb) self.session.insert(tk.END, "Bot: " + response["answer"] + "\n", "bot") - self.system.insert(tk.END, f"{usage}\n", "system") self.chatbox.delete(0, tk.END) def calculate_usage(self, cb): @@ -149,7 +148,7 @@ def calculate_usage(self, cb): self.price += prompt_price + completion_price self.tokens += cb.total_tokens message = f"System: Used {cb.prompt_tokens:,} prompt + {cb.completion_tokens:,} completion = {cb.total_tokens:,} tokens (total: {self.tokens:,} or ${self.price:.6f})." - return message + self.system.insert(tk.END, f"{message}\n", "system") def go_with_option1(self): self.database_directory = self.new_database_directory diff --git a/kanu/funcgpt.py b/kanu/funcgpt.py index c610ca8..53b1dcb 100644 --- a/kanu/funcgpt.py +++ b/kanu/funcgpt.py @@ -27,9 +27,7 @@ def __init__( self.conversation = Conversation(self) self.tokens = 0 self.price = 0 - module_name = "imported_module" - loader = importlib.machinery.SourceFileLoader(module_name, self.function_script) - self.module = loader.load_module() + self.module = importlib.machinery.SourceFileLoader("", self.function_script).load_module() def run(self): self.conversation.page() @@ -42,18 +40,18 @@ def send_message(self): model=self.model, messages=self.messages, temperature=self.temperature, - functions=[self.module.openai_functions[0][1]], + functions=[x["json"] for x in self.module.functions.values()], function_call="auto", ) message = bot_response["choices"][0]["message"] if message.get("function_call"): function_name = message["function_call"]["name"] function_args = json.loads(message["function_call"]["arguments"]) - function_response = self.module.openai_functions[0][0](**function_args) + function_response = self.module.functions[function_name]["function"](**function_args) second_response = openai.ChatCompletion.create( model=self.model, messages=[ - {"role": "user", "content": "What is the weather like in boston?"}, + {"role": "user", "content": self.user_input.get()}, message, { "role": "function", @@ -62,17 +60,17 @@ def send_message(self): }, ], ) + self.calculate_usage(second_response, function=function_name) response = second_response["choices"][0]["message"]["content"] else: response = bot_response["choices"][0]["message"]["content"] self.messages += [{"role": "assistant", "content": response}] self.session.insert(tk.END, "You: " + self.user_input.get() + "\n", "user") self.session.insert(tk.END, f"Bot: " + response + "\n", "bot") - usage = self.calculate_usage(bot_response) - self.system.insert(tk.END, f"{usage}\n", "system") + self.calculate_usage(bot_response) self.chatbox.delete(0, tk.END) - def calculate_usage(self, response): + def calculate_usage(self, response, function=None): total_tokens = response["usage"]["total_tokens"] prompt_tokens = response["usage"]["prompt_tokens"] completion_tokens = response["usage"]["completion_tokens"] @@ -80,8 +78,11 @@ def calculate_usage(self, response): completion_price = tokens2price(self.model, "completion", completion_tokens) self.price += prompt_price + completion_price self.tokens += total_tokens - message = f"System: Used {prompt_tokens:,} prompt + {completion_tokens:,} completion = {total_tokens:,} tokens (total: {self.tokens:,} or ${self.price:.6f})." - return message + if function is None: + message = f"System: Used {prompt_tokens:,} prompt + {completion_tokens:,} completion = {total_tokens:,} tokens (total: {self.tokens:,} or ${self.price:.6f})." + else: + message = f"System: Used {prompt_tokens:,} prompt + {completion_tokens:,} completion = {total_tokens:,} tokens (total: {self.tokens:,} or ${self.price:.6f}) (called function: {function})." + self.system.insert(tk.END, f"{message}\n", "system") def clear_session(self): self.tokens = self.price = 0 From 570abd34e8119b5a48eb5452d5ba1d8b51f27199 Mon Sep 17 00:00:00 2001 From: Seung-been Lee Date: Sat, 24 Jun 2023 09:44:12 +0900 Subject: [PATCH 08/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1609e01..33b7362 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ There are currently two chatbots available in KANU: - [ChatGPT](#chatgpt) harnesses the power of ChatGPT, bringing it directly to your local computer - [DocGPT](#docgpt) allows you to effortlessly interact with your documents and ask questions about them -- [FuncGPT](#fucgpt) can answer your questions by making calls to external tools, APIs, or databases +- [FuncGPT](#funcgpt) can answer your questions by making calls to external tools, APIs, or databases Other features of KANU inclde: From 9e73db998996e8405f2d9bdb6e65c09be87a2174 Mon Sep 17 00:00:00 2001 From: Seung-been Lee Date: Sat, 24 Jun 2023 10:47:45 +0900 Subject: [PATCH 09/10] Update file --- kanu/__main__.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/kanu/__main__.py b/kanu/__main__.py index 48c3274..fc5e388 100644 --- a/kanu/__main__.py +++ b/kanu/__main__.py @@ -7,7 +7,16 @@ from .version import __version__ from .gui import Tooltip -GPT_MODELS = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-0613", "gpt-4", "gpt-4-32k", "gpt-4-0613"] +GPT_MODELS = [ + "gpt-3.5-turbo", + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo-16k", + "gpt-3.5-turbo-16k-0613", + "gpt-4", + "gpt-4-0613", + "gpt-4-32k", + "gpt-4-32k-0613", +] CHATGPT_PROMPT = """You are a helpful assistant.""" DOCGPT_PROMPT = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. From 6ec177f8dc39791cfb3642df2f6d64ca9a9ebd64 Mon Sep 17 00:00:00 2001 From: "Seung-been \"Steven\" Lee" Date: Mon, 26 Jun 2023 14:34:13 +0900 Subject: [PATCH 10/10] Update files --- CHANGELOG.md | 2 +- README.md | 2 ++ images/chatgpt.gif | Bin 66657 -> 71854 bytes images/docgpt.gif | Bin 113444 -> 115240 bytes images/funcgpt.gif | Bin 0 -> 73034 bytes 5 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 images/funcgpt.gif diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e1a98c..ba995b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## 0.8.0 (in development) +## 0.8.0 (2023-06-26) * Enable ChatGPT to answer questions by making calls to external tools, APIs, or databases. ## 0.7.0 (2023-06-19) diff --git a/README.md b/README.md index 33b7362..dcdaa21 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ tabulate # Optional. Only required for .doc and .docx documents. ### FuncGPT +![Alt Text](https://raw.githubusercontent.com/sbslee/kanu/main/images/funcgpt.gif) + The following packages are required to run FuncGPT: ``` diff --git a/images/chatgpt.gif b/images/chatgpt.gif index c71fd08834247f519aa7b7e7d594febfa3fa77e9..24266f9266734c96e68613291419e24cb4f5ef35 100644 GIT binary patch literal 71854 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

8gMQs0P1- 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