|
@@ -1,8 +1,73 @@
|
|
|
<script>
|
|
<script>
|
|
|
import {page} from "$app/state";
|
|
import {page} from "$app/state";
|
|
|
- console.log(page);
|
|
|
|
|
|
|
+ import {PUBLIC_API_URL} from "$env/static/public";
|
|
|
|
|
+
|
|
|
|
|
+ import Message from "./Message.svelte";
|
|
|
|
|
+
|
|
|
|
|
+ let game = $state(page.data.data.game);
|
|
|
|
|
+ let character = $state(page.data.data.character);
|
|
|
|
|
+ let sessions = $state(page.data.data.sessions.sort((a, b) => a.started_at > b.started_at ? 1 : -1));
|
|
|
|
|
+ let turns = $state(page.data.data.turns);
|
|
|
|
|
+ let tokensRemaining = $state(page.data.data.tokens_remaining);
|
|
|
|
|
+ let streaming = $state(false);
|
|
|
|
|
+
|
|
|
|
|
+ const sendMessage = async (text)=>{
|
|
|
|
|
+ let newTurn = {user_text: text};
|
|
|
|
|
+ turns.push(newTurn);
|
|
|
|
|
+
|
|
|
|
|
+ const response = await fetch(`${PUBLIC_API_URL}/game/${game.id}/session/${sessions[0].id}/turn`, {
|
|
|
|
|
+ method: "POST",
|
|
|
|
|
+ headers: {"Content-Type": "application/json"},
|
|
|
|
|
+ credentials: "include",
|
|
|
|
|
+ body: JSON.stringify({content: text})
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ const reader = response.body.getReader();
|
|
|
|
|
+ const decoder = new TextDecoder();
|
|
|
|
|
+ let streamingIndex = turns.length - 1;
|
|
|
|
|
+ let buffer = "";
|
|
|
|
|
+
|
|
|
|
|
+ while(true){
|
|
|
|
|
+ const {done, value} = await reader.read();
|
|
|
|
|
+ if(done) break;
|
|
|
|
|
+
|
|
|
|
|
+ buffer += decoder.decode(value, {stream: true});
|
|
|
|
|
+
|
|
|
|
|
+ const lines = buffer.split("\n\n");
|
|
|
|
|
+ buffer = lines.pop();
|
|
|
|
|
+
|
|
|
|
|
+ for(let i = 0; i < lines.length; i++){
|
|
|
|
|
+ if(!lines[i].startsWith("data: ")) continue;
|
|
|
|
|
+ const payload = JSON.parse(lines[i].slice(6));
|
|
|
|
|
+
|
|
|
|
|
+ if(payload.type === "chunk"){
|
|
|
|
|
+ turns[streamingIndex].llm_text += payload.text;
|
|
|
|
|
+ }else if(payload.type === "done"){
|
|
|
|
|
+ console.log(payload);
|
|
|
|
|
+ streaming = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(turns.length === 0){
|
|
|
|
|
+ console.log("turning");
|
|
|
|
|
+ sendMessage("");
|
|
|
|
|
+ }
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<main>
|
|
<main>
|
|
|
-
|
|
|
|
|
|
|
+ {#each turns as turn, i}
|
|
|
|
|
+ {#if i !== 0}
|
|
|
|
|
+ <Message
|
|
|
|
|
+ turn={turn}
|
|
|
|
|
+ role="user"
|
|
|
|
|
+ />
|
|
|
|
|
+ {/if}
|
|
|
|
|
+ <Message
|
|
|
|
|
+ turn={turn}
|
|
|
|
|
+ role="llm"
|
|
|
|
|
+ streaming={streaming && i === message.length - 1}
|
|
|
|
|
+ />
|
|
|
|
|
+ {/each}
|
|
|
</main>
|
|
</main>
|