mirror of
https://github.com/cdryzun/tg_bot_collections.git
synced 2025-04-29 08:37:09 +08:00
Merge pull request #45 from F4ria/answer-reply
Enhance answer_it_handler to process image and replied messages
This commit is contained in:
commit
059db58c5c
@ -5,6 +5,7 @@ import importlib
|
|||||||
import re
|
import re
|
||||||
import traceback
|
import traceback
|
||||||
from functools import update_wrapper
|
from functools import update_wrapper
|
||||||
|
from mimetypes import guess_type
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Callable, TypeVar
|
from typing import Any, Callable, TypeVar
|
||||||
|
|
||||||
@ -114,6 +115,29 @@ def extract_prompt(message: str, bot_name: str) -> str:
|
|||||||
return message.strip()
|
return message.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def remove_prompt_prefix(message: str) -> str:
|
||||||
|
"""
|
||||||
|
Remove "/cmd" or "/cmd@bot_name" or "cmd:"
|
||||||
|
"""
|
||||||
|
message += " "
|
||||||
|
# Explanation of the regex pattern:
|
||||||
|
# ^ - Match the start of the string
|
||||||
|
# ( - Start of the group
|
||||||
|
# / - Literal forward slash
|
||||||
|
# [a-zA-Z] - Any letter (start of the command)
|
||||||
|
# [a-zA-Z0-9_]* - Any number of letters, digits, or underscores
|
||||||
|
# (@\w+)? - Optionally match @ followed by one or more word characters (for bot name)
|
||||||
|
# \s - A single whitespace character (space or newline)
|
||||||
|
# | - OR
|
||||||
|
# [a-zA-Z] - Any letter (start of the command)
|
||||||
|
# [a-zA-Z0-9_]* - Any number of letters, digits, or underscores
|
||||||
|
# :\s - Colon followed by a single whitespace character
|
||||||
|
# ) - End of the group
|
||||||
|
pattern = r"^(/[a-zA-Z][a-zA-Z0-9_]*(@\w+)?\s|[a-zA-Z][a-zA-Z0-9_]*:\s)"
|
||||||
|
|
||||||
|
return re.sub(pattern, "", message).strip()
|
||||||
|
|
||||||
|
|
||||||
def wrap_handler(handler: T, bot: TeleBot) -> T:
|
def wrap_handler(handler: T, bot: TeleBot) -> T:
|
||||||
def wrapper(message: Message, *args: Any, **kwargs: Any) -> None:
|
def wrapper(message: Message, *args: Any, **kwargs: Any) -> None:
|
||||||
try:
|
try:
|
||||||
@ -219,9 +243,10 @@ def enrich_text_with_urls(text: str) -> str:
|
|||||||
|
|
||||||
|
|
||||||
def image_to_data_uri(file_path):
|
def image_to_data_uri(file_path):
|
||||||
|
content_type = guess_type(file_path)[0]
|
||||||
with open(file_path, "rb") as image_file:
|
with open(file_path, "rb") as image_file:
|
||||||
encoded_image = base64.b64encode(image_file.read()).decode("utf-8")
|
encoded_image = base64.b64encode(image_file.read()).decode("utf-8")
|
||||||
return f"data:image/png;base64,{encoded_image}"
|
return f"data:{content_type};base64,{encoded_image}"
|
||||||
|
|
||||||
|
|
||||||
import json
|
import json
|
||||||
@ -452,11 +477,31 @@ class TelegraphAPI:
|
|||||||
|
|
||||||
return new_dom
|
return new_dom
|
||||||
|
|
||||||
|
def upload_image(self, file_name: str) -> str:
|
||||||
|
base_url = "https://telegra.ph"
|
||||||
|
upload_url = f"{base_url}/upload"
|
||||||
|
|
||||||
|
try:
|
||||||
|
content_type = guess_type(file_name)[0]
|
||||||
|
with open(file_name, "rb") as f:
|
||||||
|
response = requests.post(
|
||||||
|
upload_url, files={"file": ("blob", f, content_type)}
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
# [{'src': '/file/xx.jpg'}]
|
||||||
|
response = response.json()
|
||||||
|
image_url = f"{base_url}{response[0]['src']}"
|
||||||
|
return image_url
|
||||||
|
except Exception as e:
|
||||||
|
print(f"upload image: {e}")
|
||||||
|
return "https://telegra.ph/api"
|
||||||
|
|
||||||
|
|
||||||
# `import *` will give you these
|
# `import *` will give you these
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"bot_reply_first",
|
"bot_reply_first",
|
||||||
"bot_reply_markdown",
|
"bot_reply_markdown",
|
||||||
|
"remove_prompt_prefix",
|
||||||
"enrich_text_with_urls",
|
"enrich_text_with_urls",
|
||||||
"image_to_data_uri",
|
"image_to_data_uri",
|
||||||
"TelegraphAPI",
|
"TelegraphAPI",
|
||||||
|
@ -192,8 +192,12 @@ def latest_handle_messages(message: Message, bot: TeleBot):
|
|||||||
"""ignore"""
|
"""ignore"""
|
||||||
chat_id = message.chat.id
|
chat_id = message.chat.id
|
||||||
chat_user_id = message.from_user.id
|
chat_user_id = message.from_user.id
|
||||||
|
# if not text, ignore
|
||||||
|
if message.text is None:
|
||||||
|
return
|
||||||
|
|
||||||
# if is bot command, ignore
|
# if is bot command, ignore
|
||||||
if message.text and message.text.startswith("/"):
|
if message.text.startswith("/"):
|
||||||
return
|
return
|
||||||
# start command ignore
|
# start command ignore
|
||||||
elif message.text.startswith(
|
elif message.text.startswith(
|
||||||
@ -218,9 +222,6 @@ def latest_handle_messages(message: Message, bot: TeleBot):
|
|||||||
# answer_it command ignore
|
# answer_it command ignore
|
||||||
elif message.text.startswith("answer_it"):
|
elif message.text.startswith("answer_it"):
|
||||||
return
|
return
|
||||||
# if not text, ignore
|
|
||||||
elif not message.text:
|
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
if chat_user_dict.get(chat_user_id):
|
if chat_user_dict.get(chat_user_id):
|
||||||
message.text += chat_message_dict[chat_id].text
|
message.text += chat_message_dict[chat_id].text
|
||||||
@ -235,13 +236,40 @@ def answer_it_handler(message: Message, bot: TeleBot) -> None:
|
|||||||
"""answer_it: /answer_it"""
|
"""answer_it: /answer_it"""
|
||||||
# answer the last message in the chat group
|
# answer the last message in the chat group
|
||||||
who = "answer_it"
|
who = "answer_it"
|
||||||
# get the last message in the chat
|
|
||||||
|
|
||||||
chat_id = message.chat.id
|
chat_id = message.chat.id
|
||||||
|
full_answer = ""
|
||||||
|
local_image_path = ""
|
||||||
|
m = ""
|
||||||
|
original_m = ""
|
||||||
|
|
||||||
|
# get the last message in the chat
|
||||||
|
if message.reply_to_message is not None:
|
||||||
|
latest_message = message.reply_to_message
|
||||||
|
else:
|
||||||
latest_message = chat_message_dict.get(chat_id)
|
latest_message = chat_message_dict.get(chat_id)
|
||||||
m = original_m = latest_message.text.strip()
|
|
||||||
|
if latest_message.photo is not None:
|
||||||
|
max_size_photo = max(latest_message.photo, key=lambda p: p.file_size)
|
||||||
|
image_file = bot.get_file(max_size_photo.file_id).file_path
|
||||||
|
downloaded_file = bot.download_file(image_file)
|
||||||
|
local_image_path = "answer_it_temp.jpg"
|
||||||
|
with open(local_image_path, "wb") as temp_file:
|
||||||
|
temp_file.write(downloaded_file)
|
||||||
|
|
||||||
|
m = original_m = remove_prompt_prefix(latest_message.caption.strip())
|
||||||
|
ph_image_url = ph.upload_image(local_image_path)
|
||||||
|
full_answer += f"\n\n"
|
||||||
|
else:
|
||||||
|
m = original_m = remove_prompt_prefix(latest_message.text.strip())
|
||||||
|
|
||||||
|
if not m:
|
||||||
|
bot.reply_to(message, "The message was retrieved, but the prompt is empty.")
|
||||||
|
return
|
||||||
|
|
||||||
m = enrich_text_with_urls(m)
|
m = enrich_text_with_urls(m)
|
||||||
full_answer = f"Question:\n{m}\n" if len(m) < 300 else ""
|
full_answer += f"Question:\n{m}\n" if len(m) < 300 else ""
|
||||||
|
|
||||||
if len(m) > MESSAGE_MAX_LENGTH:
|
if len(m) > MESSAGE_MAX_LENGTH:
|
||||||
a = (
|
a = (
|
||||||
"The message is too long, please shorten it."
|
"The message is too long, please shorten it."
|
||||||
@ -255,27 +283,35 @@ def answer_it_handler(message: Message, bot: TeleBot) -> None:
|
|||||||
#### Answers Thread ####
|
#### Answers Thread ####
|
||||||
executor = ThreadPoolExecutor(max_workers=Stream_Thread)
|
executor = ThreadPoolExecutor(max_workers=Stream_Thread)
|
||||||
if GEMINI_USE_THREAD and GOOGLE_GEMINI_KEY:
|
if GEMINI_USE_THREAD and GOOGLE_GEMINI_KEY:
|
||||||
gemini_future = executor.submit(gemini_answer, latest_message, bot, m)
|
gemini_future = executor.submit(
|
||||||
|
gemini_answer, latest_message, bot, m, local_image_path
|
||||||
|
)
|
||||||
if CHATGPT_USE and CHATGPT_API_KEY:
|
if CHATGPT_USE and CHATGPT_API_KEY:
|
||||||
chatgpt_future = executor.submit(chatgpt_answer, latest_message, bot, m)
|
chatgpt_future = executor.submit(
|
||||||
if COHERE_USE and COHERE_API_KEY:
|
chatgpt_answer, latest_message, bot, m, local_image_path
|
||||||
|
)
|
||||||
|
if COHERE_USE and COHERE_API_KEY and not local_image_path:
|
||||||
cohere_future = executor.submit(cohere_answer, latest_message, bot, m)
|
cohere_future = executor.submit(cohere_answer, latest_message, bot, m)
|
||||||
if QWEN_USE and QWEN_API_KEY:
|
if QWEN_USE and QWEN_API_KEY and not local_image_path:
|
||||||
qwen_future = executor.submit(qwen_answer, latest_message, bot, m)
|
qwen_future = executor.submit(qwen_answer, latest_message, bot, m)
|
||||||
if CLADUE_USE and ANTHROPIC_API_KEY:
|
if CLADUE_USE and ANTHROPIC_API_KEY:
|
||||||
claude_future = executor.submit(claude_answer, latest_message, bot, m)
|
claude_future = executor.submit(
|
||||||
if LLAMA_USE and LLAMA_API_KEY:
|
claude_answer, latest_message, bot, m, local_image_path
|
||||||
|
)
|
||||||
|
if LLAMA_USE and LLAMA_API_KEY and not local_image_path:
|
||||||
llama_future = executor.submit(llama_answer, latest_message, bot, m)
|
llama_future = executor.submit(llama_answer, latest_message, bot, m)
|
||||||
|
|
||||||
#### Complete Message Thread ####
|
#### Complete Message Thread ####
|
||||||
executor2 = ThreadPoolExecutor(max_workers=Complete_Thread)
|
executor2 = ThreadPoolExecutor(max_workers=Complete_Thread)
|
||||||
if CHATGPT_COMPLETE and CHATGPT_API_KEY:
|
if not CHATGPT_USE and CHATGPT_COMPLETE and CHATGPT_API_KEY:
|
||||||
complete_chatgpt_future = executor2.submit(complete_chatgpt, m)
|
complete_chatgpt_future = executor2.submit(
|
||||||
if CLADUE_COMPLETE and ANTHROPIC_API_KEY:
|
complete_chatgpt, m, local_image_path
|
||||||
complete_claude_future = executor2.submit(complete_claude, m)
|
)
|
||||||
if LLAMA_COMPLETE and LLAMA_API_KEY:
|
if not CLADUE_USE and CLADUE_COMPLETE and ANTHROPIC_API_KEY:
|
||||||
|
complete_claude_future = executor2.submit(complete_claude, m, local_image_path)
|
||||||
|
if not LLAMA_USE and LLAMA_COMPLETE and LLAMA_API_KEY and not local_image_path:
|
||||||
complete_llama_future = executor2.submit(complete_llama, m)
|
complete_llama_future = executor2.submit(complete_llama, m)
|
||||||
if COHERE_COMPLETE and COHERE_API_KEY:
|
if not COHERE_USE and COHERE_COMPLETE and COHERE_API_KEY and not local_image_path:
|
||||||
complete_cohere_future = executor2.submit(complete_cohere, m)
|
complete_cohere_future = executor2.submit(complete_cohere, m)
|
||||||
|
|
||||||
#### Gemini Answer Individual ####
|
#### Gemini Answer Individual ####
|
||||||
@ -284,7 +320,12 @@ def answer_it_handler(message: Message, bot: TeleBot) -> None:
|
|||||||
g_s = ""
|
g_s = ""
|
||||||
g_reply_id = bot_reply_first(latest_message, g_who, bot)
|
g_reply_id = bot_reply_first(latest_message, g_who, bot)
|
||||||
try:
|
try:
|
||||||
|
if local_image_path:
|
||||||
|
gemini_image_file = genai.upload_file(path=local_image_path)
|
||||||
|
g_r = convo.send_message([m, gemini_image_file], stream=True)
|
||||||
|
else:
|
||||||
g_r = convo.send_message(m, stream=True)
|
g_r = convo.send_message(m, stream=True)
|
||||||
|
|
||||||
g_start = time.time()
|
g_start = time.time()
|
||||||
g_overall_start = time.time()
|
g_overall_start = time.time()
|
||||||
for e in g_r:
|
for e in g_r:
|
||||||
@ -328,11 +369,11 @@ def answer_it_handler(message: Message, bot: TeleBot) -> None:
|
|||||||
anaswer_chatgpt, chatgpt_chat_id = chatgpt_future.result()
|
anaswer_chatgpt, chatgpt_chat_id = chatgpt_future.result()
|
||||||
full_chat_id_list.append(chatgpt_chat_id)
|
full_chat_id_list.append(chatgpt_chat_id)
|
||||||
full_answer += anaswer_chatgpt
|
full_answer += anaswer_chatgpt
|
||||||
if COHERE_USE and COHERE_API_KEY:
|
if COHERE_USE and COHERE_API_KEY and not local_image_path:
|
||||||
answer_cohere, cohere_chat_id = cohere_future.result()
|
answer_cohere, cohere_chat_id = cohere_future.result()
|
||||||
full_chat_id_list.append(cohere_chat_id)
|
full_chat_id_list.append(cohere_chat_id)
|
||||||
full_answer += answer_cohere
|
full_answer += answer_cohere
|
||||||
if QWEN_USE and QWEN_API_KEY:
|
if QWEN_USE and QWEN_API_KEY and not local_image_path:
|
||||||
answer_qwen, qwen_chat_id = qwen_future.result()
|
answer_qwen, qwen_chat_id = qwen_future.result()
|
||||||
full_chat_id_list.append(qwen_chat_id)
|
full_chat_id_list.append(qwen_chat_id)
|
||||||
full_answer += answer_qwen
|
full_answer += answer_qwen
|
||||||
@ -340,19 +381,19 @@ def answer_it_handler(message: Message, bot: TeleBot) -> None:
|
|||||||
answer_claude, claude_chat_id = claude_future.result()
|
answer_claude, claude_chat_id = claude_future.result()
|
||||||
full_chat_id_list.append(claude_chat_id)
|
full_chat_id_list.append(claude_chat_id)
|
||||||
full_answer += answer_claude
|
full_answer += answer_claude
|
||||||
if LLAMA_USE and LLAMA_API_KEY:
|
if LLAMA_USE and LLAMA_API_KEY and not local_image_path:
|
||||||
answer_llama, llama_chat_id = llama_future.result()
|
answer_llama, llama_chat_id = llama_future.result()
|
||||||
full_chat_id_list.append(llama_chat_id)
|
full_chat_id_list.append(llama_chat_id)
|
||||||
full_answer += answer_llama
|
full_answer += answer_llama
|
||||||
|
|
||||||
#### Complete Messages ####
|
#### Complete Messages ####
|
||||||
if CHATGPT_COMPLETE and CHATGPT_API_KEY:
|
if not CHATGPT_USE and CHATGPT_COMPLETE and CHATGPT_API_KEY:
|
||||||
full_answer += complete_chatgpt_future.result()
|
full_answer += complete_chatgpt_future.result()
|
||||||
if CLADUE_COMPLETE and ANTHROPIC_API_KEY:
|
if not CLADUE_USE and CLADUE_COMPLETE and ANTHROPIC_API_KEY:
|
||||||
full_answer += complete_claude_future.result()
|
full_answer += complete_claude_future.result()
|
||||||
if COHERE_COMPLETE and COHERE_API_KEY:
|
if not COHERE_USE and COHERE_COMPLETE and COHERE_API_KEY and not local_image_path:
|
||||||
full_answer += complete_cohere_future.result()
|
full_answer += complete_cohere_future.result()
|
||||||
if LLAMA_COMPLETE and LLAMA_API_KEY:
|
if not LLAMA_USE and LLAMA_COMPLETE and LLAMA_API_KEY and not local_image_path:
|
||||||
full_answer += complete_llama_future.result()
|
full_answer += complete_llama_future.result()
|
||||||
|
|
||||||
print(full_chat_id_list)
|
print(full_chat_id_list)
|
||||||
@ -391,13 +432,17 @@ def llm_background_ph_update(path: str, full_answer: str, m: str) -> str:
|
|||||||
return full_answer
|
return full_answer
|
||||||
|
|
||||||
|
|
||||||
def gemini_answer(latest_message: Message, bot: TeleBot, m):
|
def gemini_answer(latest_message: Message, bot: TeleBot, m, local_image_path):
|
||||||
"""gemini answer"""
|
"""gemini answer"""
|
||||||
who = "Gemini Pro"
|
who = "Gemini Pro"
|
||||||
# show something, make it more responsible
|
# show something, make it more responsible
|
||||||
reply_id = bot_reply_first(latest_message, who, bot)
|
reply_id = bot_reply_first(latest_message, who, bot)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
if local_image_path:
|
||||||
|
gemini_image_file = genai.upload_file(path=local_image_path)
|
||||||
|
r = convo.send_message([m, gemini_image_file], stream=True)
|
||||||
|
else:
|
||||||
r = convo.send_message(m, stream=True)
|
r = convo.send_message(m, stream=True)
|
||||||
s = ""
|
s = ""
|
||||||
start = time.time()
|
start = time.time()
|
||||||
@ -432,12 +477,25 @@ def gemini_answer(latest_message: Message, bot: TeleBot, m):
|
|||||||
return llm_answer(who, s), reply_id.message_id
|
return llm_answer(who, s), reply_id.message_id
|
||||||
|
|
||||||
|
|
||||||
def chatgpt_answer(latest_message: Message, bot: TeleBot, m):
|
def chatgpt_answer(latest_message: Message, bot: TeleBot, m, local_image_path):
|
||||||
"""chatgpt answer"""
|
"""chatgpt answer"""
|
||||||
who = "ChatGPT Pro"
|
who = "ChatGPT Pro"
|
||||||
reply_id = bot_reply_first(latest_message, who, bot)
|
reply_id = bot_reply_first(latest_message, who, bot)
|
||||||
|
|
||||||
player_message = [{"role": "user", "content": m}]
|
player_message = [{"role": "user", "content": m}]
|
||||||
|
if local_image_path:
|
||||||
|
player_message = [
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": [
|
||||||
|
{"type": "text", "text": m},
|
||||||
|
{
|
||||||
|
"type": "image_url",
|
||||||
|
"image_url": {"url": image_to_data_uri(local_image_path)},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
r = client.chat.completions.create(
|
r = client.chat.completions.create(
|
||||||
@ -472,14 +530,29 @@ def chatgpt_answer(latest_message: Message, bot: TeleBot, m):
|
|||||||
return llm_answer(who, s), reply_id.message_id
|
return llm_answer(who, s), reply_id.message_id
|
||||||
|
|
||||||
|
|
||||||
def claude_answer(latest_message: Message, bot: TeleBot, m):
|
def claude_answer(latest_message: Message, bot: TeleBot, m, local_image_path):
|
||||||
"""claude answer"""
|
"""claude answer"""
|
||||||
who = "Claude Pro"
|
who = "Claude Pro"
|
||||||
reply_id = bot_reply_first(latest_message, who, bot)
|
reply_id = bot_reply_first(latest_message, who, bot)
|
||||||
|
|
||||||
|
player_message = [{"role": "user", "content": m}]
|
||||||
|
if local_image_path:
|
||||||
|
player_message = [
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": [
|
||||||
|
{"type": "text", "text": m},
|
||||||
|
{
|
||||||
|
"type": "image_url",
|
||||||
|
"image_url": {"url": image_to_data_uri(local_image_path)},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
r = claude_client.chat.completions.create(
|
r = claude_client.chat.completions.create(
|
||||||
messages=[{"role": "user", "content": m}],
|
messages=player_message,
|
||||||
max_tokens=4096,
|
max_tokens=4096,
|
||||||
model=ANTHROPIC_MODEL,
|
model=ANTHROPIC_MODEL,
|
||||||
stream=True,
|
stream=True,
|
||||||
@ -710,12 +783,26 @@ def llm_summary(bot, full_answer, ph_s, reply_id) -> str:
|
|||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def complete_chatgpt(m: str) -> str:
|
def complete_chatgpt(m: str, local_image_path: str) -> str:
|
||||||
"""we run chatgpt get the full answer"""
|
"""we run chatgpt get the full answer"""
|
||||||
who = "ChatGPT Pro"
|
who = "ChatGPT Pro"
|
||||||
|
player_message = [{"role": "user", "content": m}]
|
||||||
|
if local_image_path:
|
||||||
|
player_message = [
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": [
|
||||||
|
{"type": "text", "text": m},
|
||||||
|
{
|
||||||
|
"type": "image_url",
|
||||||
|
"image_url": {"url": image_to_data_uri(local_image_path)},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
try:
|
try:
|
||||||
r = client.chat.completions.create(
|
r = client.chat.completions.create(
|
||||||
messages=[{"role": "user", "content": m}],
|
messages=player_message,
|
||||||
max_tokens=4096,
|
max_tokens=4096,
|
||||||
model=CHATGPT_PRO_MODEL,
|
model=CHATGPT_PRO_MODEL,
|
||||||
)
|
)
|
||||||
@ -727,12 +814,27 @@ def complete_chatgpt(m: str) -> str:
|
|||||||
return content
|
return content
|
||||||
|
|
||||||
|
|
||||||
def complete_claude(m: str) -> str:
|
def complete_claude(m: str, local_image_path: str) -> str:
|
||||||
"""we run claude get the full answer"""
|
"""we run claude get the full answer"""
|
||||||
who = "Claude Pro"
|
who = "Claude Pro"
|
||||||
|
|
||||||
|
player_message = [{"role": "user", "content": m}]
|
||||||
|
if local_image_path:
|
||||||
|
player_message = [
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": [
|
||||||
|
{"type": "text", "text": m},
|
||||||
|
{
|
||||||
|
"type": "image_url",
|
||||||
|
"image_url": {"url": image_to_data_uri(local_image_path)},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
try:
|
try:
|
||||||
r = claude_client.chat.completions.create(
|
r = claude_client.chat.completions.create(
|
||||||
messages=[{"role": "user", "content": m}],
|
messages=player_message,
|
||||||
max_tokens=4096,
|
max_tokens=4096,
|
||||||
model=ANTHROPIC_MODEL,
|
model=ANTHROPIC_MODEL,
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user