An experiment to build a ChatGPT-like experience by using Deepchat
This does not work well. See this thread in Elixir Slack.
An experiment to build a ChatGPT-like experience by using Deepchat
This does not work well. See this thread in Elixir Slack.
| Mix.install( | |
| [ | |
| {:phoenix_playground, "~> 0.1.0"}, | |
| {:openai, "~> 0.6.1"}, | |
| {:langchain, "~> 0.2.0"}, | |
| ], | |
| config: [ | |
| openai: [ | |
| api_key: System.get_env("OPENAI_API_KEY"), | |
| organization_key: System.get_env("OPENAI_ORGANIZATION_KEY") | |
| ] | |
| ] | |
| ) | |
| defmodule MyLayout do | |
| use Phoenix.Component | |
| def render("live.html", assigns) do | |
| ~H""" | |
| <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/[email protected]/cdn/themes/light.css" /> | |
| <script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/[email protected]/cdn/shoelace-autoloader.js"></script> | |
| <script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio,container-queries"></script> | |
| <script type="module" src="https://unpkg.com/[email protected]/dist/deepChat.bundle.js"></script> | |
| <script> | |
| document.addEventListener("DOMContentLoaded", (event) => { | |
| const textarea = document.querySelector('sl-textarea'); | |
| textarea.addEventListener('keydown', event => { | |
| if (event.key === 'Enter' && !event.shiftKey) { | |
| // console.log("Enter pressed"); | |
| event.preventDefault(); | |
| let form = document.getElementById('myform'); | |
| console.log(form); | |
| // form.dispatchEvent(new Event('submit', {bubbles: true, cancelable: true})); | |
| form.submit(); | |
| } | |
| }); | |
| }); | |
| </script> | |
| <%= @inner_content %> | |
| """ | |
| end | |
| end | |
| defmodule DemoLive do | |
| use Phoenix.LiveView | |
| def mount(_params, _session, socket) do | |
| {:ok, assign(socket, count: 7), layout: {MyLayout, :live}} | |
| end | |
| def render(assigns) do | |
| assigns = assign(assigns, form: %{}) | |
| ~H""" | |
| <span><%= @count %></span> | |
| <div class="flex flex-col max-w-4xl px-2 py-4"> | |
| <div class="text-right my-2"> | |
| <sl-button variant="primary">New Chat | |
| </sl-button></div> | |
| <sl-tab-group class="w-full" placement="start"> | |
| <sl-tab slot="nav" panel="thread-id-1">Custom chat UI</sl-tab> | |
| <sl-tab slot="nav" panel="thread-id-2">Deepchat for conversation</sl-tab> | |
| <sl-tab-panel name="thread-id-1"> | |
| <div class="mx-4 my-3 flex flex-col items-end gap-2"> | |
| <div class="max-w-96 bg-[#f4f4f4] px-5 py-2.5 rounded-3xl"> | |
| In duckdb, after importing a CSV, I have a column with newline in the column name. How do I use this column in a SELECT query? | |
| </div> | |
| <div class="markdown prose bg-[#f1f1ff] break-words light border-y border-black p-2"> | |
| <h3>Garlic bread with cheese: What the science tells us</h3> | |
| <p> | |
| For years parents have espoused the health benefits of eating garlic bread with cheese to their | |
| children, with the food earning such an iconic status in our culture that kids will often dress | |
| up as warm, cheesy loaf for Halloween. | |
| </p> | |
| <p> | |
| But a recent study shows that the celebrated appetizer may be linked to a series of rabies cases | |
| springing up around the country. | |
| </p> | |
| </div> | |
| <form id="myform" class="w-full" phx-submit="add_message"> | |
| <sl-textarea id="textinput" | |
| name="message" | |
| rows="1" | |
| resize="auto" | |
| placeholder="Send a message" | |
| class="w-full" | |
| ></sl-textarea> | |
| </form> | |
| </div> | |
| </sl-tab-panel> | |
| <sl-tab-panel name="thread-id-2"> | |
| <deep-chat demo="true" style="display: block; width: 100%;"></deep-chat> | |
| </sl-tab-panel> | |
| </sl-tab-group> | |
| </div> | |
| """ | |
| end | |
| def handle_event("add_message", %{"message" => message}, socket) do | |
| IO.puts("Received add_message event: #{message}") | |
| {:noreply, assign(socket, count: socket.assigns.count + 1)} | |
| end | |
| end | |
| PhoenixPlayground.start(live: DemoLive) |