#!/bin/bash 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] <>\n${INSTRUCTION}\n<>" 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] <>\n${INSTRUCTION}\n<>" | 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