Add chat settings
This commit is contained in:
		
							parent
							
								
									da7d5232cc
								
							
						
					
					
						commit
						117f6f2a39
					
				| 
						 | 
				
			
			@ -57,5 +57,6 @@ a.is-disabled {
 | 
			
		|||
 | 
			
		||||
$footer-padding: 3rem 1.5rem;
 | 
			
		||||
$fullhd: 2000px;
 | 
			
		||||
$modal-content-width: 1000px;
 | 
			
		||||
 | 
			
		||||
@import "/node_modules/bulma/bulma.sass";
 | 
			
		||||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
  //import { fetchEventSource } from "@microsoft/fetch-event-source";
 | 
			
		||||
 | 
			
		||||
  import { apiKeyStorage, chatsStorage, addMessage, clearMessages } from "./Storage.svelte";
 | 
			
		||||
  import type { Request, Response, Message } from "./Types.svelte";
 | 
			
		||||
  import type { Request, Response, Message, Settings } from "./Types.svelte";
 | 
			
		||||
 | 
			
		||||
  import { afterUpdate, onMount } from "svelte";
 | 
			
		||||
  import SvelteMarkdown from "svelte-markdown";
 | 
			
		||||
| 
						 | 
				
			
			@ -11,6 +11,46 @@
 | 
			
		|||
  let updating: boolean = false;
 | 
			
		||||
 | 
			
		||||
  let input: HTMLTextAreaElement;
 | 
			
		||||
  let settings: HTMLDivElement;
 | 
			
		||||
  const settingsMap: Settings[] = [
 | 
			
		||||
    {
 | 
			
		||||
      key: "temperature",
 | 
			
		||||
      name: "Sampling Temperature",
 | 
			
		||||
      default: 1,
 | 
			
		||||
      type: "number",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      key: "top_p",
 | 
			
		||||
      name: "Nucleus Sampling",
 | 
			
		||||
      default: 1,
 | 
			
		||||
      type: "number",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      key: "n",
 | 
			
		||||
      name: "Number of Messages",
 | 
			
		||||
      default: 1,
 | 
			
		||||
      type: "number",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      key: "max_tokens",
 | 
			
		||||
      name: "Max Tokens",
 | 
			
		||||
      default: 0,
 | 
			
		||||
      type: "number",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      key: "presence_penalty",
 | 
			
		||||
      name: "Presence Penalty",
 | 
			
		||||
      default: 0,
 | 
			
		||||
      type: "number",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      key: "frequency_penalty",
 | 
			
		||||
      name: "Frequency Penalty",
 | 
			
		||||
      default: 0,
 | 
			
		||||
      type: "number",
 | 
			
		||||
    },
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  $: chat = $chatsStorage.find((chat) => chat.id === chatId);
 | 
			
		||||
  const token_price = 0.000002; // $0.002 per 1000 tokens
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -74,12 +114,15 @@
 | 
			
		|||
          })
 | 
			
		||||
          // Skip error messages
 | 
			
		||||
          .filter((message) => message.role !== "error"),
 | 
			
		||||
        // temperature: 1
 | 
			
		||||
        // top_p: 1
 | 
			
		||||
        // n: 1
 | 
			
		||||
        //stream: false,
 | 
			
		||||
        // stop: null
 | 
			
		||||
        //max_tokens: 4096,
 | 
			
		||||
 | 
			
		||||
        // Provide the settings by mapping the settingsMap to key/value pairs
 | 
			
		||||
        ...settingsMap.reduce((acc, setting) => {
 | 
			
		||||
          const value = (settings.querySelector(`#settings-${setting.key}`) as HTMLInputElement).value;
 | 
			
		||||
          if (value) {
 | 
			
		||||
            acc[setting.key] = parseFloat(value);
 | 
			
		||||
          }
 | 
			
		||||
          return acc;
 | 
			
		||||
        }, {}),
 | 
			
		||||
      };
 | 
			
		||||
      response = await (
 | 
			
		||||
        await fetch("https://api.openai.com/v1/chat/completions", {
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +200,14 @@
 | 
			
		|||
      chatId = null;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const showSettings = () => {
 | 
			
		||||
    settings.classList.add("is-active");
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const closeSettings = () => {
 | 
			
		||||
    settings.classList.remove("is-active");
 | 
			
		||||
  };
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<nav class="level chat-header">
 | 
			
		||||
| 
						 | 
				
			
			@ -294,7 +345,53 @@
 | 
			
		|||
      bind:this={input}
 | 
			
		||||
    />
 | 
			
		||||
  </p>
 | 
			
		||||
  <p class="control">
 | 
			
		||||
    <button class="button is-link is-light is-medium" on:click|preventDefault={showSettings}
 | 
			
		||||
      ><span class="greyscale">⚙️</span></button
 | 
			
		||||
    >
 | 
			
		||||
  </p>
 | 
			
		||||
  <p class="control">
 | 
			
		||||
    <button class="button is-info is-medium" type="submit">Send</button>
 | 
			
		||||
  </p>
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
<svelte:window
 | 
			
		||||
  on:keydown={(event) => {
 | 
			
		||||
    if (event.key === "Escape") {
 | 
			
		||||
      closeSettings();
 | 
			
		||||
    }
 | 
			
		||||
  }}
 | 
			
		||||
/>
 | 
			
		||||
 | 
			
		||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
			
		||||
<div class="modal" bind:this={settings}>
 | 
			
		||||
  <div class="modal-background" on:click={closeSettings} />
 | 
			
		||||
  <div class="modal-card">
 | 
			
		||||
    <header class="modal-card-head">
 | 
			
		||||
      <p class="modal-card-title">Settings</p>
 | 
			
		||||
    </header>
 | 
			
		||||
    <section class="modal-card-body">
 | 
			
		||||
      {#each settingsMap as setting}
 | 
			
		||||
        <div class="field is-horizontal">
 | 
			
		||||
          <div class="field-label is-normal">
 | 
			
		||||
            <label class="label" for="settings-temperature">{setting.name}</label>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="field-body">
 | 
			
		||||
            <div class="field">
 | 
			
		||||
              <input
 | 
			
		||||
                class="input"
 | 
			
		||||
                type={setting.type}
 | 
			
		||||
                id="settings-{setting.key}"
 | 
			
		||||
                placeholder={String(setting.default)}
 | 
			
		||||
              />
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      {/each}
 | 
			
		||||
    </section>
 | 
			
		||||
 | 
			
		||||
    <footer class="modal-card-foot">
 | 
			
		||||
      <button class="button is-info" on:click={closeSettings}>Close settings</button>
 | 
			
		||||
    </footer>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,13 @@
 | 
			
		|||
    user?: string;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  export type Settings = {
 | 
			
		||||
    key: string;
 | 
			
		||||
    name: string;
 | 
			
		||||
    default: number;
 | 
			
		||||
    type: "number";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  type ResponseOK = {
 | 
			
		||||
    status: "ok";
 | 
			
		||||
    id: string;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue