-
Notifications
You must be signed in to change notification settings - Fork 0
/
chat.sh
executable file
·82 lines (65 loc) · 2.41 KB
/
chat.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/bash
API_URL="${API_URL:-http://chatgpt.free-solutions.ch:8080}"
CHAT=(
"Bonjour, Assistant."
"Bonjour. Comment puis je vous aider aujourd'hui?"
)
INSTRUCTION="Une conversation entre un humain curieux et un assistant d'intelligence artificielle. L'assistant donne des réponses utiles, détaillées et polies aux questions de l'humain."
#INSTRUCTION="Une conversation détendue entre un humain curieux et sympa qui parle en français et une intelligence artificielle. L'intelligence artificielle donne des réponses utiles, détaillées et polies en français aux questions de l'humain. Vous prennez en compte les questions et réponses précédentes de la discussion pour aller plus profondément dans le sens du sujet évoqué."
#INSTRUCTION="Une conversation détendue entre un humain curieux et sympa qui parle en français et une intelligence artificielle qui s'exprime en audio et à voix haute.
trim() {
shopt -s extglob
set -- "${1##+([[:space:]])}"
printf "%s" "${1%%+([[:space:]])}"
}
trim_trailing() {
shopt -s extglob
printf "%s" "${1%%+([[:space:]])}"
}
format_prompt() {
echo -n "${INSTRUCTION}"
printf "\n### Human: %s\n### Assistant: %s" "${CHAT[@]}" "$1"
}
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 "${INSTRUCTION}" | wc -l)
chat_completion() {
PROMPT="$(trim_trailing "$(format_prompt "$1")")"
DATA="$(echo -n "$PROMPT" | jq -Rs --argjson n_keep $N_KEEP '{
prompt: .,
temperature: 0.8,
top_k: 40,
top_p: 0.9,
n_keep: $n_keep,
n_predict: 400,
stop: ["\nHuman:","\n### Human:","Humain "],
stream: true
}')"
ANSWER=''
while IFS= read -r LINE; do
if [[ $LINE = data:* ]]; then
CONTENT="$(echo "${LINE:5}" | jq -r '.content')"
printf "%s" "${CONTENT}"
ANSWER+="${CONTENT}"
fi
done < <(curl \
--silent \
--no-buffer \
--request POST \
--url "${API_URL}/completion" \
--header "Content-Type: application/json" \
--data-raw "${DATA}")
printf "\n"
CHAT+=("$1" "$(trim "$ANSWER")")
}
while true; do
read -r -e -p "> " QUESTION
chat_completion "${QUESTION}"
done