import json import warnings import requests from ..smp import * from .gpt import GPT_context_window, OpenAIWrapper url = 'http://ecs.sv.us.alles-apin.openxlab.org.cn/v1/openai/v2/text/chat' headers = { 'Content-Type': 'application/json' } class OpenAIWrapperInternal(OpenAIWrapper): is_api: bool = True def __init__(self, model: str = 'gpt-3.5-turbo-0613', retry: int = 5, wait: int = 3, verbose: bool = True, system_prompt: str = None, temperature: float = 0, timeout: int = 60, max_tokens: int = 1024, img_size: int = 512, img_detail: str = 'low', **kwargs): self.model = model if 'KEYS' in os.environ and osp.exists(os.environ['KEYS']): keys = load(os.environ['KEYS']) headers['alles-apin-token'] = keys.get('alles-apin-token', '') elif 'ALLES' in os.environ: headers['alles-apin-token'] = os.environ['ALLES'] self.headers = headers self.temperature = temperature self.timeout = timeout self.max_tokens = max_tokens assert img_size > 0 or img_size == -1 self.img_size = img_size assert img_detail in ['high', 'low'] self.img_detail = img_detail super(OpenAIWrapper, self).__init__( wait=wait, retry=retry, system_prompt=system_prompt, verbose=verbose, **kwargs) def generate_inner(self, inputs, **kwargs) -> str: input_msgs = self.prepare_inputs(inputs) temperature = kwargs.pop('temperature', self.temperature) max_tokens = kwargs.pop('max_tokens', self.max_tokens) # Held out 100 tokens as buffer context_window = GPT_context_window(self.model) max_tokens = min(max_tokens, context_window - self.get_token_len(inputs)) if 0 < max_tokens <= 100: print('Less than 100 tokens left, may exceed the context window with some additional meta symbols. ') if max_tokens <= 0: return 0, self.fail_msg + 'Input string longer than context window. ', 'Length Exceeded. ' payload = dict( model=self.model, messages=input_msgs, max_tokens=max_tokens, n=1, stop=None, timeout=self.timeout, temperature=temperature, **kwargs) response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=self.timeout * 1.1) ret_code = response.status_code ret_code = 0 if (200 <= int(ret_code) < 300) else ret_code answer = self.fail_msg try: resp_struct = json.loads(response.text) assert resp_struct['msg'] == 'ok' and resp_struct['msgCode'] == '10000', resp_struct answer = resp_struct['data']['choices'][0]['message']['content'].strip() except: pass return ret_code, answer, response class GPT4V_Internal(OpenAIWrapperInternal): def generate(self, message, dataset=None): return super(GPT4V_Internal, self).generate(message)