Spaces:
Build error
Build error
| 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 | |