From c77428fb8d3cdbba7fb0b14e15d60ca0f38bc8ab Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Thu, 30 Nov 2023 20:38:38 -0800 Subject: [PATCH] README update and start of supabase plus making next buildable --- README.md | 120 ++++++++++++++++++++++++++++-------- supabase/.gitignore | 4 ++ supabase/config.toml | 141 +++++++++++++++++++++++++++++++++++++++++++ supabase/seed.sql | 0 www/app/page.tsx | 15 +++-- 5 files changed, 250 insertions(+), 30 deletions(-) create mode 100644 supabase/.gitignore create mode 100644 supabase/config.toml create mode 100644 supabase/seed.sql diff --git a/README.md b/README.md index c55f193..2fa1725 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,69 @@ # tutor-gpt +![Static Badge](https://img.shields.io/badge/Version-0.4.0-blue) +[![Discord](https://img.shields.io/discord/1076192451997474938?logo=discord&logoColor=%23ffffff&label=Bloom&labelColor=%235865F2)](https://discord.gg/bloombotai) +![GitHub License](https://img.shields.io/github/license/plastic-labs/tutor-gpt) +![GitHub Repo stars](https://img.shields.io/github/stars/plastic-labs/tutor-gpt) +[![X (formerly Twitter) URL](https://img.shields.io/twitter/url?url=https%3A%2F%2Ftwitter.com%2FBloomBotAI&label=Twitter)](https://twitter.com/BloomBotAI) +[![arXiv](https://img.shields.io/badge/arXiv-2310.06983-b31b1b.svg)](https://arxiv.org/abs/2310.06983) -Tutor-GPT is a LangChain LLM application. It dynamically reasons about your learning needs and *updates its own prompts* to best serve you. -We leaned into theory of mind experiments and Bloom is now more than just a literacy tutor, itโ€™s an expansive learning companion. Read more about how it works [here](https://plasticlabs.ai/blog/Theory-of-Mind-is-All-You-Need) or you can join our [Discord](https://discord.gg/bloombotai) to try out our implementation for free (while our OpenAI spend lasts ๐Ÿ˜„). +Tutor-GPT is a LangChain LLM application developed by [Plastic Labs](https://plasticlabs.ai). It dynamically reasons about your learning needs and *updates its own prompts* to best serve you. + +We leaned into theory of mind experiments and it is now more than just a literacy tutor, itโ€™s an expansive learning companion. Read more about how it works [here](https://plasticlabs.ai/blog/Theory-of-Mind-is-All-You-Need). + +The hosted version of `tutor-gpt` is called [Bloom](https://bloombot.ai) as a nod to Benjamin Bloom's Two Sigma Problem. You can try the web version at [chat.bloombot.ai](https://chat.bloombot.ai) or you can join our [Discord](https://discord.gg/bloombotai) to try out our implementation for free (while our OpenAI spend lasts ๐Ÿ˜„). Alternatively, you can run your own instance of the bot by following the instructions below. -## Installation +## Project Structure -This project requires docker to be installed and running locally. [Install docker](https://docs.docker.com/get-docker/) and ensure it's running before proceeding. +The tutor-gpt project is split between multiple different modules that split up the backend logic for different clients. -## Getting Started +- `agent/` - this contains the core logic and prompting architecture +- `bot/` - this contains the discord bot implementation +- `api/` - this contains an API interface to the tutor-gpt backend +- `www/` - this contains a `NextJS` web front end that can connect to the API interface +- `common/` - this contains common used in different interfaces -This app requires you to have a few different environment variables set. Create a `.env` file from the `.env.template`. +Most of the project is developed using python with the exception of the NextJS application. For python `poetry` is used for dependency management and for the web interface `yarn` is used. -**OPENAI_API_KEY**: Go to [OpenAI](https://beta.openai.com/account/api-keys) to generate your own API key. -**BOT_TOKEN**: This is the discord bot token. You can find instructions on how to create a bot and generate a token in the [pycord docs](https://guide.pycord.dev/getting-started/creating-your-first-bot). -**THOUGHT_CHANNEL_ID**: This is the discord channel for the bot to output thoughts to. Make a channel in your server and copy the ID by right clicking the channel and copying the link. The channel ID is the last string of numbers in the link. +### Supabase -### Docker/Containerization +Additionally, this project uses supabase for managing different users, authentication, and as the database for holding message and conversation information. -The repository containers a `Dockerfile` for running the bot in a containerized workflow. Use the following command to build and run the container locally: +## Installation + +> NOTE: The project uses [poetry](https://python-poetry.org/docs/#installing-with-the-official-installer) and [yarn](https://yarnpkg.com/getting-started/install) for package management. + +The below commands will install all the dependencies necessary for running the tutor-gpt project. We recommend using poetry to setup a virtual environment for the project. ```bash -docker build -t tutor-gpt:latest . -docker run --env-file .env tutor-gpt +git clone https://github.com/plastic-labs/tutor-gpt.git +cd tutor-gpt +poetry install # install Python dependencies +cd www/ +yarn install # install all NodeJS dependencies ``` -The current behaviour will utilize the `.env` file in your local repository and -run the bot. There are two separate entry points for tutor-gpt both a discord UI -and a web ui. Below contains snippets for manually specifying the execution -environment. +### Docker + +Alternatively (The recommended way) this project can be built and run with docker. [Install docker](https://docs.docker.com/get-docker/) and ensure it's running before proceeding. + +The web front end is built and run separately from the remainder of the codebase. Below are the commands for building the core of the tutor-gpt project which includes the necessary dependencies for running either the discord bot or the FastAPI endpoint. ```bash -docker run --env-file .env tutor-gpt python -u -m bot.app # Discord UI -docker run -p 8501:8501 --env-file .env tutor-gpt python -u -m streamlit run www/main.py # Web UI +git clone https://github.com/plastic-labs/tutor-gpt.git +cd tutor-gpt +docker build -t tutor-gpt-core . ``` -### Architecture - -Below is high level diagram of the architecture for the bot. -![Tutor-GPT Discord Architecture](assets/ToM Chain Flow.png) +Similarly, to build the web interface run the below commands +```bash +cd tutor-gpt/www +docker build -t tutor-gpt-web . +``` -## Contributing +> NOTE: for poetry usage This project uses [poetry](https://python-poetry.org/) to manage dependencies. To install dependencies locally run `poetry install`. Or alternatively run @@ -68,3 +89,54 @@ continue directly with `poetry shell` or wrap the source command like below ```bash poetry run source $(poetry env info --path)/bin/activate ``` + +## Usage + +This app requires you to have a few different environment variables set. Create a `.env` file from the `.env.template`. Depending on which interface you are running (web or discord) different variables are necessary. This is explained below + +### Required +**OPENAI_API_KEY**: Go to [OpenAI](https://beta.openai.com/account/api-keys) to generate your own API key. +**SUPABASE_URL**: The base URL for your supabase instance +**SUPABASE_KEY**: The API key for interacting with your supabase project. get it from your project settings +**CONVERSATION_TABLE**: the name of the table to hold conversation metadata +**MEMORY_TABLE**: the name of the table holding messages for different conversations + +### Discord Only +**BOT_TOKEN**: This is the discord bot token. You can find instructions on how to create a bot and generate a token in the [pycord docs](https://guide.pycord.dev/getting-started/creating-your-first-bot). +**THOUGHT_CHANNEL_ID**: This is the discord channel for the bot to output thoughts to. Make a channel in your server and copy the ID by right clicking the channel and copying the link. The channel ID is the last string of numbers in the link. + +### Web Only +**URL**: the URL that the web ui is running from by default this should be http://localhost:3000 + + +### Docker/Containerization + +The repository containers a `Dockerfile` for running the bot in a containerized workflow. Use the following command to build and run the container locally: + +```bash +docker build -t tutor-gpt:latest . +docker run --env-file .env tutor-gpt +``` + +The current behaviour will utilize the `.env` file in your local repository and +run the bot. There are two separate entry points for tutor-gpt both a discord UI +and a web ui. Below contains snippets for manually specifying the execution +environment. + +```bash +docker run --env-file .env tutor-gpt python -u -m bot.app # Discord UI +docker run -p 8501:8501 --env-file .env tutor-gpt python -u -m streamlit run www/main.py # Web UI +``` + +### Architecture + +Below is high level diagram of the architecture for the bot. +![Tutor-GPT Discord Architecture](assets/ToM Chain Flow.png) + +## Contributing + + + +## License + +Tutor-GPT is licensed under the GPL-3.0 License. Learn more at the [License file](./LICENSE) \ No newline at end of file diff --git a/supabase/.gitignore b/supabase/.gitignore new file mode 100644 index 0000000..a3ad880 --- /dev/null +++ b/supabase/.gitignore @@ -0,0 +1,4 @@ +# Supabase +.branches +.temp +.env diff --git a/supabase/config.toml b/supabase/config.toml new file mode 100644 index 0000000..d49a858 --- /dev/null +++ b/supabase/config.toml @@ -0,0 +1,141 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the +# working directory name when running `supabase init`. +project_id = "tutor-gpt" + +[api] +enabled = true +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. public and storage are always included. +schemas = ["public", "storage", "graphql_public"] +# Extra schemas to add to the search_path of every request. public is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[db] +# Port to use for the local database URL. +port = 54322 +# Port used by db diff command to initialize the shadow database. +shadow_port = 54320 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[db.pooler] +enabled = false +# Port to use for the local connection pooler. +port = 54329 +# Specifies when a server connection can be reused by other clients. +# Configure one of the supported pooler modes: `transaction`, `session`. +pool_mode = "transaction" +# How many server connections to allow per user/database pair. +default_pool_size = 20 +# Maximum number of client connections allowed. +max_client_conn = 100 + +[realtime] +enabled = true +# Bind realtime via either IPv4 or IPv6. (default: IPv6) +# ip_version = "IPv6" + +[studio] +enabled = true +# Port to use for Supabase Studio. +port = 54323 +# External URL of the API server that frontend connects to. +api_url = "http://127.0.0.1" + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +enabled = true +# Port to use for the email testing server web interface. +port = 54324 +# Uncomment to expose additional ports for testing user applications that send emails. +# smtp_port = 54325 +# pop3_port = 54326 + +[storage] +enabled = true +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[auth] +enabled = true +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://127.0.0.1:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://127.0.0.1:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). +jwt_expiry = 3600 +# If disabled, the refresh token will never expire. +enable_refresh_token_rotation = true +# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. +# Requires enable_refresh_token_rotation = true. +refresh_token_reuse_interval = 10 +# Allow/disallow new user signups to your project. +enable_signup = true + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false + +# Uncomment to customize email template +# [auth.email.template.invite] +# subject = "You have been invited" +# content_path = "./supabase/templates/invite.html" + +[auth.sms] +# Allow/disallow new user signups via SMS to your project. +enable_signup = true +# If enabled, users need to confirm their phone number before signing in. +enable_confirmations = false +# Template for sending OTP to users +template = "Your code is {{ .Code }} ." + +# Use pre-defined map of phone number to OTP for testing. +[auth.sms.test_otp] +# 4152127777 = "123456" + +# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. +[auth.sms.twilio] +enabled = false +account_sid = "" +message_service_sid = "" +# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: +auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: +secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" + +[analytics] +enabled = false +port = 54327 +vector_port = 54328 +# Configure one of the supported backends: `postgres`, `bigquery`. +backend = "postgres" + +# Experimental features may be deprecated any time +[experimental] +# Configures Postgres storage engine to use OrioleDB (S3) +orioledb_version = "" diff --git a/supabase/seed.sql b/supabase/seed.sql new file mode 100644 index 0000000..e69de29 diff --git a/www/app/page.tsx b/www/app/page.tsx index f24e98e..a56d8bf 100644 --- a/www/app/page.tsx +++ b/www/app/page.tsx @@ -45,8 +45,16 @@ export default function Home() { const isAtBottom = useRef(true); const messageContainerRef = useRef>(null); + const [isDarkMode, setIsDarkMode] = useState(false); + const toggleDarkMode = (checked: boolean) => { + setIsDarkMode(checked); + }; + useEffect(() => { (async () => { + setIsDarkMode( + window.matchMedia("(prefers-color-scheme: dark)").matches + ); const api = await API.create(URL!); setApi(api); const conversations = await api.getConversations(); @@ -84,12 +92,7 @@ export default function Home() { }; }, []); - const [isDarkMode, setIsDarkMode] = useState( - window.matchMedia("(prefers-color-scheme: dark)").matches - ); - const toggleDarkMode = (checked: boolean) => { - setIsDarkMode(checked); - }; + async function chat() { const textbox = input.current!;