File size: 5,231 Bytes
bbfa6f6 |
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
#coding=utf-8
import time
import copy
import requests
import openai
from abc import ABC, abstractmethod
class AzureVisionClient():
def __init__(self, ak, max_retries=3):
self.client = openai.AzureOpenAI(
azure_endpoint="https://search-va.byteintl.net/gpt/openapi/online/multimodal/crawl/",
api_version="2023-09-01-preview",
api_key=ak
)
self.max_retries = max_retries
self.model_name = 'gptv'
self.temperature = 0.000000001
self.max_tokens = 3000
def request(self, query, messages=None, img_data=None, vid_data=None):
if messages is None:
messages = []
content = {
"type": "text",
"text": query
}
if img_data:
content = [
content,
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{img_data}"
}
}
]
elif vid_data:
content = [
content,
*map(lambda x: {
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64, {x}"
}
}, vid_data)
]
else:
content = [content]
messages.append({
'role': 'user',
'content': content
})
completion = None
num_cur_retry = 0
while num_cur_retry < self.max_retries:
try:
completion = self.client.chat.completions.create(
model=self.model_name, # gptv 或 openai_gpt-4-vision
max_tokens=self.max_tokens,
temperature=self.temperature,
messages=messages
)
break
except Exception as e:
num_cur_retry += 1
if 'Error code: 429' not in e.message:
completion = None
print(e)
break
if num_cur_retry % 20 == 1:
print('retry times:', num_cur_retry, e)
time.sleep(5)
resp = completion.choices[0].message.content
messages.append({
"role": "assistant",
"content": [{
"type": "text",
"text": completion.choices[0].message.content
}]
})
return resp, messages
class BaseAPIWrapper(ABC):
@abstractmethod
def get_completion(self, user_prompt, system_prompt=None):
pass
class GPTAPIWrapper(BaseAPIWrapper):
def __init__(self, ak, max_retries=1000):
# self.key_pool = key_pool
# self.temperature = temperature
# self.model = model
# self.time_out = time_out
# openai.api_base = "https://search-us.byteintl.net/gpt/openapi/online/v2/crawl"
# openai.api_type = "azure"
# openai.api_version = "2023-06-01-preview"
# openai.api_key = key_pool[0]
self.client = openai.AzureOpenAI(
azure_endpoint="https://search-us.byteintl.net/gpt/openapi/online/v2/crawl",
api_version="2023-06-01-preview",
api_key=ak
)
self.max_retries = max_retries
self.model_name = 'gpt-4-32k-0613'
self.temperature = 0.000000001
self.max_tokens = 3000
def request(self, system_content, usr_question, previous_msg=None, last_answer=None):
if previous_msg is None:
msgs = [
{"role": "system", "content": f"{system_content}"},
{"role": "user", "content": f"{usr_question}"}
]
else:
msgs = copy.deepcopy(previous_msg)
msgs += [
{"role": "assistant", "content": last_answer},
{"role": "user", "content": usr_question}
]
response = self.client.chat.completions.create(
messages=msgs,
temperature=self.temperature,
max_tokens=self.max_tokens,
model=self.model_name,
)
resp = response.choices[0].message.content
# total_tokens = response.usage['total_tokens']
return resp, msgs
def get_completion(self, user_prompt=None, system_prompt=None, previous_msgs=None, last_answer=None):
gpt_cv_nlp = '[]'
key_i = 0
total_tokens = 0
max_try = self.max_retries
# gpt_cv_nlp, total_tokens = self.request(system_prompt, user_prompt)
while max_try > 0:
try:
gpt_cv_nlp, msgs = self.request(system_prompt, user_prompt, previous_msgs, last_answer)
# print('Succ: ', gpt_cv_nlp)
max_try = 0
break
except Exception as e:
print("fail ", max_try, e)
# key = self.key_pool[key_i%2]
# openai.api_key = key
# key_i += 1
time.sleep(1)
max_try -= 1
return gpt_cv_nlp, msgs |