@ -1,6 +1,6 @@
import { useState } from 'react'
const API_URL = 'http://127.0.0.1:808 0'
const API_URL = 'http://127.0.0.1:500 0'
type Message = {
sender : string
@ -8,16 +8,18 @@ type Message = {
}
async function completion ( prompt : string , callback : ( res : string ) = > void ) {
const result = await fetch ( ` ${ API_URL } /completion ` , {
const result = await fetch ( ` ${ API_URL } /generate ` , {
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
} ,
body : JSON.stringify ( {
prompt : prompt ,
temperature : 0.2 ,
top_k : 40 ,
top_p : 0.9 ,
n_predict : 256 ,
stop : [ '\n### Human:' ] , // stop completion after generating this
stream : true ,
prompt : ` A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.
# # # Human : Hello , Assistant .
# # # Assistant : Hello. How may I help you today ?
# # # Human : $ { prompt } ` ,
model : 'ggml-model-q4_0' ,
} ) ,
} )
@ -36,12 +38,17 @@ async function completion(prompt: string, callback: (res: string) => void) {
let decoder = new TextDecoder ( )
let str = decoder . decode ( value )
if ( str . startsWith ( 'data: ' ) ) {
const message = JSON . parse ( str . substring ( 6 ) )
callback ( message . content )
if ( message . stop ) {
let re = /}{/g
str = '[' + str . replace ( re , '},{' ) + ']'
let messages = JSON . parse ( str )
for ( const message of messages ) {
const choice = message . choices [ 0 ]
if ( choice . finish_reason === 'stop' ) {
break
}
callback ( choice . text )
}
}
@ -63,10 +70,20 @@ export default function () {
< section className = 'mx-auto mb-10 w-full max-w-xl flex-1 break-words' >
{ messages . map ( ( m , i ) = > (
< div className = 'my-4 flex gap-4' key = { i } >
< div className = 'flex-none pr-1 text-lg' > { m . sender === 'human' ? '👩' : '🤖' } < / div >
< div className = 'flex-none pr-1 text-lg' >
{ m . sender === 'human' ? (
< div className = 'bg-neutral-200 text-neutral-700 text-sm h-6 w-6 rounded-md flex items-center justify-center mt-px' >
H
< / div >
) : (
< div className = 'bg-blue-600 text-white text-sm h-6 w-6 rounded-md flex items-center justify-center mt-0.5' >
L
< / div >
) }
< / div >
< div className = 'flex-1 text-gray-800' >
{ m . content }
{ m . sender === 'bot' && < span className = 'relative -top-[3px] left-1 text-[10px] text-blue-600' > ⬤ < / span > }
{ m . sender === 'bot' && < span className = 'relative -top-[3px] left-1 text-[10px]' > ⬤ < / span > }
< / div >
< / div >
) ) }