2025-06-30 10:17:18 +02:00
#!/usr/bin/env bash
2023-07-29 03:02:10 +09:00
API_URL = " ${ API_URL :- http : //127.0.0.1 : 8080 } "
CHAT = (
"Hello, Assistant."
"Hello. How may I help you today?"
)
INSTRUCTION = "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions."
trim( ) {
shopt -s extglob
set -- " ${ 1 ##+([[ : space : ]]) } "
printf "%s" " ${ 1 %%+([[ : space : ]]) } "
}
trim_trailing( ) {
shopt -s extglob
printf "%s" " ${ 1 %%+([[ : space : ]]) } "
}
format_prompt( ) {
if [ [ " ${# CHAT [@] } " -eq 0 ] ] ; then
echo -n " [INST] <<SYS>>\n ${ INSTRUCTION } \n<</SYS>> "
else
LAST_INDEX = $(( ${# CHAT [@] } - 1 ))
echo -n " ${ CHAT [ $LAST_INDEX ] } \n[INST] $1 [/INST] "
fi
}
tokenize( ) {
curl \
--silent \
--request POST \
--url " ${ API_URL } /tokenize " \
--header "Content-Type: application/json" \
--data-raw " $( jq -ns --arg content " $1 " '{content:$content}' ) " \
| jq '.tokens[]'
}
N_KEEP = $( tokenize " [INST] <<SYS>>\n ${ INSTRUCTION } \n<</SYS>> " | wc -l)
chat_completion( ) {
PROMPT = " $( trim_trailing " $( format_prompt " $1 " ) " ) "
DATA = " $( echo -n " $PROMPT " | jq -Rs --argjson n_keep $N_KEEP ' {
prompt: .,
temperature: 0.2,
top_k: 40,
top_p: 0.9,
n_keep: $n_keep ,
n_predict: 1024,
stop: [ "[INST]" ] ,
stream: true
} ' ) "
# Create a temporary file to hold the Python output
TEMPFILE = $( mktemp)
exec 3< <( curl \
--silent \
--no-buffer \
--request POST \
--url " ${ API_URL } /completion " \
--header "Content-Type: application/json" \
--data-raw " ${ DATA } " )
python -c "
import json
import sys
answer = ''
while True:
line = sys.stdin.readline( )
if not line:
break
if line.startswith( 'data: ' ) :
json_content = line[ 6:] .strip( )
content = json.loads( json_content) [ 'content' ]
sys.stdout.write( content)
sys.stdout.flush( )
answer += content
answer = answer.rstrip( '\n' )
# Write the answer to the temporary file
with open( '$TEMPFILE' , 'w' ) as f:
f.write( answer)
" <&3
exec 3<& -
# Read the answer from the temporary file
ANSWER = $( cat $TEMPFILE )
# Clean up the temporary file
rm $TEMPFILE
printf "\n"
CHAT += ( " $1 " " $( trim " $ANSWER " ) " )
}
while true; do
echo -en "\033[0;32m" # Green color
read -r -e -p "> " QUESTION
echo -en "\033[0m" # Reset color
chat_completion " ${ QUESTION } "
done