feat: swap openai for Groq via openai-compatible base_url
This commit is contained in:
parent
377016478e
commit
7f5ca81c71
3 changed files with 22 additions and 25 deletions
|
|
@ -20,5 +20,7 @@ CHROME_PATH = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'
|
||||||
# Токен Picovoice
|
# Токен Picovoice
|
||||||
PICOVOICE_TOKEN = os.getenv('PICOVOICE_TOKEN')
|
PICOVOICE_TOKEN = os.getenv('PICOVOICE_TOKEN')
|
||||||
|
|
||||||
# Токен OpenAI
|
# Токен Groq
|
||||||
OPENAI_TOKEN = os.getenv('OPENAI_TOKEN')
|
GROQ_TOKEN = os.getenv('GROQ_TOKEN')
|
||||||
|
GROQ_BASE_URL = "https://api.groq.com/openai/v1"
|
||||||
|
GROQ_MODEL = "llama-3.3-70b-versatile"
|
||||||
|
|
|
||||||
2
dev.env
2
dev.env
|
|
@ -1,2 +1,2 @@
|
||||||
PICOVOICE_TOKEN=<тут ключ-picovoice>
|
PICOVOICE_TOKEN=<тут ключ-picovoice>
|
||||||
OPENAI_TOKEN=<тут ключ-openai>
|
GROQ_TOKEN=<тут ключ-groq>
|
||||||
|
|
|
||||||
39
main.py
39
main.py
|
|
@ -10,7 +10,7 @@ import time
|
||||||
from ctypes import POINTER, cast
|
from ctypes import POINTER, cast
|
||||||
|
|
||||||
import openai
|
import openai
|
||||||
from openai import error
|
from openai import OpenAI
|
||||||
import pvporcupine
|
import pvporcupine
|
||||||
import simpleaudio as sa
|
import simpleaudio as sa
|
||||||
import vosk
|
import vosk
|
||||||
|
|
@ -37,8 +37,7 @@ VA_CMD_LIST = yaml.safe_load(
|
||||||
system_message = {"role": "system", "content": "Ты голосовой ассистент из железного человека."}
|
system_message = {"role": "system", "content": "Ты голосовой ассистент из железного человека."}
|
||||||
message_log = [system_message]
|
message_log = [system_message]
|
||||||
|
|
||||||
# init openai
|
client = OpenAI(api_key=config.GROQ_TOKEN, base_url=config.GROQ_BASE_URL)
|
||||||
openai.api_key = config.OPENAI_TOKEN
|
|
||||||
|
|
||||||
# PORCUPINE
|
# PORCUPINE
|
||||||
porcupine = pvporcupine.create(
|
porcupine = pvporcupine.create(
|
||||||
|
|
@ -59,33 +58,29 @@ q = queue.Queue()
|
||||||
def gpt_answer():
|
def gpt_answer():
|
||||||
global message_log
|
global message_log
|
||||||
|
|
||||||
model_engine = "gpt-3.5-turbo"
|
|
||||||
max_tokens = 256 # default 1024
|
|
||||||
try:
|
try:
|
||||||
response = openai.ChatCompletion.create(
|
response = client.chat.completions.create(
|
||||||
model=model_engine,
|
model=config.GROQ_MODEL,
|
||||||
messages=message_log,
|
messages=message_log,
|
||||||
max_tokens=max_tokens,
|
max_tokens=256,
|
||||||
temperature=0.7,
|
temperature=0.7,
|
||||||
top_p=1,
|
top_p=1,
|
||||||
stop=None
|
stop=None,
|
||||||
)
|
)
|
||||||
except (error.TryAgain, error.ServiceUnavailableError):
|
except openai.BadRequestError as ex:
|
||||||
return "ChatGPT перегружен!"
|
code = getattr(ex, "code", None) or ""
|
||||||
except openai.OpenAIError as ex:
|
message = str(ex)
|
||||||
# если ошибка - это макс длина контекста, то возвращаем ответ с очищенным контекстом
|
if code == "context_length_exceeded" or "context_length_exceeded" in message:
|
||||||
if ex.code == "context_length_exceeded":
|
|
||||||
message_log = [system_message, message_log[-1]]
|
message_log = [system_message, message_log[-1]]
|
||||||
return gpt_answer()
|
return gpt_answer()
|
||||||
else:
|
return "Запрос отклонён моделью."
|
||||||
return "OpenAI токен не рабочий."
|
except openai.RateLimitError:
|
||||||
|
return "Лимит запросов исчерпан."
|
||||||
|
except openai.APIConnectionError:
|
||||||
|
return "Не могу связаться с сервером."
|
||||||
|
except openai.APIError:
|
||||||
|
return "Groq токен не рабочий."
|
||||||
|
|
||||||
# Find the first response from the chatbot that has text in it (some responses may not have text)
|
|
||||||
for choice in response.choices:
|
|
||||||
if "text" in choice:
|
|
||||||
return choice.text
|
|
||||||
|
|
||||||
# If no response with text is found, return the first response's content (which may be empty)
|
|
||||||
return response.choices[0].message.content
|
return response.choices[0].message.content
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue