use gpt function

This commit is contained in:
fiatrete
2023-06-16 15:58:57 +08:00
parent 88e3ed0648
commit 0a4feb1daf
11 changed files with 181 additions and 135 deletions
+4 -1
View File
@@ -37,4 +37,7 @@ async def acall_ai_function(function: str, args: list, description: str, model:
logger.debug(str(messages))
return await gpt.acreate_chat_completion(model=model, messages=messages, temperature=0)
msg_type, msg_content = await gpt.acreate_chat_completion(model=model, messages=messages, temperature=0)
if msg_type == "content":
return msg_content
return 'failed'
+17 -6
View File
@@ -21,6 +21,7 @@ async def acreate_chat_completion_once(
max_tokens: int | None = None,
deployment_id=None,
request_timeout=40,
**kwargs
) -> str:
"""
Create a chat completion and update the cost.
@@ -39,7 +40,8 @@ async def acreate_chat_completion_once(
messages=messages,
temperature=temperature,
max_tokens=max_tokens,
request_timeout=request_timeout
request_timeout=request_timeout,
**kwargs
)
else:
response = await openai.ChatCompletion.acreate(
@@ -47,7 +49,8 @@ async def acreate_chat_completion_once(
messages=messages,
temperature=temperature,
max_tokens=max_tokens,
request_timeout=request_timeout
request_timeout=request_timeout,
**kwargs
)
if CFG.debug_mode:
logger.debug(f"Response: {response}")
@@ -65,12 +68,13 @@ async def acreate_chat_completion(
max_tokens: int = None,
request_timeout: int = 40,
num_retries=3,
on_single_request_timeout: Callable = None
on_single_request_timeout: Callable = None,
**kwargs
):
"""Create a chat completion using the OpenAI API
Args:
messages (List[Message]): The messages to send to the chat completion
messages (List[dict]): The messages to send to the chat completion
model (str, optional): The model to use. Defaults to None.
temperature (float, optional): The temperature to use. Defaults to 0.9.
max_tokens (int, optional): The max tokens to use. Defaults to None.
@@ -100,6 +104,7 @@ async def acreate_chat_completion(
temperature=temperature,
max_tokens=max_tokens,
request_timeout=request_timeout,
**kwargs
)
else:
response = await acreate_chat_completion_once(
@@ -108,6 +113,7 @@ async def acreate_chat_completion(
temperature=temperature,
max_tokens=max_tokens,
request_timeout=request_timeout,
**kwargs
)
break
except RateLimitError:
@@ -129,5 +135,10 @@ async def acreate_chat_completion(
if response is None:
logger.error(f"Failed to get response from GPT after {num_retries} retries")
raise RuntimeError(f"Failed to get response after {num_retries} retries")
resp = response.choices[0].message["content"]
return resp
choice_message = response.choices[0].message
content = choice_message.get("content")
if content is None:
return "function_call", {k: v for k, v in choice_message["function_call"].items()}
else:
return "content", content
+8 -1
View File
@@ -2,6 +2,7 @@
from __future__ import annotations
from typing import List
import json
import tiktoken_async
@@ -33,7 +34,8 @@ async def count_message_tokens(
elif model == "gpt-4":
# !Note: gpt-4 may change over time. Returning num tokens assuming gpt-4-0314.")
return await count_message_tokens(messages, model="gpt-4-0314")
elif model == "gpt-3.5-turbo-0301":
# TODO: OpenAI has not mention how to count tokens for 0613, thus, we use the former method
elif model == "gpt-3.5-turbo-0301" or model == "gpt-3.5-turbo-0613" or model == "gpt-3.5-turbo-16k-0613":
tokens_per_message = (
4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
)
@@ -51,6 +53,11 @@ async def count_message_tokens(
for message in messages:
num_tokens += tokens_per_message
for key, value in message.items():
if not isinstance(value, str):
# TODO: Since openai does not mentioned how to count tokens of 'funciton_call',
# and only string is countable, thus, if the value is not a `str` (`function_call`
# field of a message), we convert it into json
value = json.dumps(value)
num_tokens += len(encoding.encode(value))
if key == "name":
num_tokens += tokens_per_name