Commit 45f57907 authored by dmMaze's avatar dmMaze
Browse files

add timeout and model override for chatgpt, close #280, #275

parent 62436ae6
Loading
Loading
Loading
Loading
+27 −18
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ class GPTTranslator(BaseTranslator):
            ],
            'select': 'gpt35-turbo'
        },
        'override model': '',
        'prompt template': {
            'type': 'editor',
            'content': 'Please help me to translate the following text from a manga to {to_lang} (if it\'s already in {to_lang} or looks like gibberish you have to output it as it is instead):\n',
@@ -64,6 +65,7 @@ class GPTTranslator(BaseTranslator):
        'top p': 1,
        # 'return prompt': False,
        'retry attempts': 5,
        'retry timeout': 15,
        '3rd party api url': ''
    }

@@ -110,6 +112,10 @@ class GPTTranslator(BaseTranslator):
    def retry_attempts(self) -> int:
        return int(self.params['retry attempts'])
    
    @property
    def retry_timeout(self) -> int:
        return int(self.params['retry timeout'])
    
    @property
    def chat_system_template(self) -> str:
        to_lang = self.lang_map[self.lang_target]
@@ -208,7 +214,6 @@ class GPTTranslator(BaseTranslator):
        # return_prompt = self.params['return prompt']
        chat_sample = self.chat_sample
        for prompt, num_src in self._assemble_prompts(queries, from_lang, to_lang):
            ratelimit_attempt = 0
            retry_attempt = 0
            while True:
                try:
@@ -218,28 +223,28 @@ class GPTTranslator(BaseTranslator):
                        raise InvalidNumTranslations
                    break
                except openai.error.RateLimitError: # Server returned ratelimit response
                    ratelimit_attempt += 1
                    if ratelimit_attempt >= 3:
                    retry_attempt += 1
                    if retry_attempt >= self.retry_attempts:
                        new_translations = [''] * num_src
                        break
                    self.logger.warn(f'Restarting request due to ratelimiting by openai servers. Attempt: {ratelimit_attempt}')
                    time.sleep(2)
                    self.logger.warn(f'Restarting request due to ratelimiting by openai servers. Attempt: {retry_attempt}, sleep for {self.retry_timeout} secs...')
                    time.sleep(self.retry_timeout)
                except openai.error.APIError: # Server returned 500 error (probably server load)
                    retry_attempt += 1
                    if retry_attempt >= self.retry_attempts:
                        self.logger.error('OpenAI encountered a server error, possibly due to high server load. Use a different translator or try again later.')
                        new_translations = [''] * num_src
                        break
                    self.logger.warn(f'Restarting request due to a server error. Attempt: {retry_attempt}')
                    time.sleep(1)
                    self.logger.warn(f'Restarting request due to a server error. Attempt: {retry_attempt}, sleep for {self.retry_timeout} secs...')
                    time.sleep(self.retry_timeout)
                except openai.error.ServiceUnavailableError:
                    retry_attempt += 1
                    if retry_attempt >= self.retry_attempts:
                        self.logger.error('OpenAI encountered a server error, possibly due to high server load. Use a different translator or try again later.')
                        new_translations = [''] * num_src
                        break
                    self.logger.warn(f'Restarting request due to a server error. Attempt: {retry_attempt}')
                    time.sleep(2)
                    self.logger.warn(f'Restarting request due to a server error. Attempt: {retry_attempt}, sleep for {self.retry_timeout} secs...')
                    time.sleep(self.retry_timeout)
                except InvalidNumTranslations:
                    retry_attempt += 1
                    message = f'number of translations does not match to source:\nprompt:\n    {prompt}\ntranslations:\n  {new_translations}\nopenai response:\n  {response}'
@@ -248,7 +253,7 @@ class GPTTranslator(BaseTranslator):
                        new_translations = [''] * num_src
                        break
                    self.logger.warn(message + '\n' + f'Restarting request. Attempt: {retry_attempt}')

                    # time.sleep(self.retry_timeout)
            # if return_prompt:
            #     new_translations = new_translations[:-1]

@@ -311,12 +316,16 @@ class GPTTranslator(BaseTranslator):
        openai.api_key = self.params['api key']
        openai.api_base = self.api_url
        
        model = self.model
        override_model = self.params['override model'].strip()
        if override_model != '':
            model: str = override_model
        else:
            model:str = self.model
            if model == 'gpt3':
                return self._request_translation_gpt3(prompt)
            elif model == 'gpt35-turbo':
            return self._request_translation_with_chat_sample(prompt, 'gpt-3.5-turbo-0613', chat_sample)
                model = 'gpt-3.5-turbo'
            elif model == 'gpt4':
            return self._request_translation_with_chat_sample(prompt, 'gpt-4-0613', chat_sample)
        else:
            raise Exception(f'Invalid GPT model: {model}')
 No newline at end of file
                model = 'gpt-4'

        return self._request_translation_with_chat_sample(prompt, model, chat_sample)
 No newline at end of file
+35 −29
Original line number Diff line number Diff line
@@ -884,9 +884,15 @@ class MainWindow(FramelessWindow):
        override_writing_mode = pcfg.let_writing_mode_flag == 1
        gf = self.textPanel.formatpanel.global_format

        inpaint_only = pcfg.module.enable_inpaint
        inpaint_only = inpaint_only and not (pcfg.module.enable_detect or pcfg.module.enable_ocr or pcfg.module.enable_translate)
        
        if not inpaint_only:
            for blk in blk_list:
                if override_fnt_size:
                    blk.font_size = pt2px(gf.size)
                elif blk._detected_font_size > 0 and not pcfg.module.enable_detect:
                    blk.font_size = blk._detected_font_size
                if override_fnt_stroke:
                    blk.default_stroke_width = gf.stroke_width
                    blk.stroke_decide_by_colordiff = False
+9 −0
Original line number Diff line number Diff line
@@ -504,6 +504,15 @@ def merge_config_module_params(config_params: Dict, module_keys: List, get_modul
                            and cfg_param[mk]['options'] != mparam['options']:
                            LOGGER.info(f'Update {mk} options')
                            cfg_param[mk]['options'] = mparam['options']
            
            cfg_key_list = list(cfg_param.keys())
            module_key_list = list(module_params.keys())
            if cfg_key_list != module_key_list:
                LOGGER.info(f'Reorder param dict in config')
                new_params = {key: cfg_param[key] for key in module_key_list}
                cfg_param.clear()
                cfg_param.update(new_params)

    return config_params

class ModuleManager(QObject):