Pārlūkot izejas kodu

fix: count down thread in completion db not commit (#1267)

tags/0.3.25
takatost pirms 2 gadiem
vecāks
revīzija
41d4c5b424
Revīzijas autora e-pasta adrese nav piesaistīta nevienam kontam

+ 2
- 2
api/core/conversation_message_task.py Parādīt failu

if not self.conversation: if not self.conversation:
self.is_new_conversation = True self.is_new_conversation = True
self.conversation = Conversation( self.conversation = Conversation(
app_id=self.app_model_config.app_id,
app_id=self.app.id,
app_model_config_id=self.app_model_config.id, app_model_config_id=self.app_model_config.id,
model_provider=self.provider_name, model_provider=self.provider_name,
model_id=self.model_name, model_id=self.model_name,
db.session.commit() db.session.commit()


self.message = Message( self.message = Message(
app_id=self.app_model_config.app_id,
app_id=self.app.id,
model_provider=self.provider_name, model_provider=self.provider_name,
model_id=self.model_name, model_id=self.model_name,
override_model_configs=json.dumps(override_model_configs) if override_model_configs else None, override_model_configs=json.dumps(override_model_configs) if override_model_configs else None,

+ 1
- 7
api/core/model_providers/models/llm/openai_model.py Parādīt failu

raise ModelCurrentlyNotSupportError("Dify Hosted OpenAI GPT-4 currently not support.") raise ModelCurrentlyNotSupportError("Dify Hosted OpenAI GPT-4 currently not support.")


prompts = self._get_prompt_from_messages(messages) prompts = self._get_prompt_from_messages(messages)

try:
return self._client.generate([prompts], stop, callbacks)
finally:
thread_context = api_requestor._thread_context
if hasattr(thread_context, "session") and thread_context.session:
thread_context.session.close()
return self._client.generate([prompts], stop, callbacks)


def get_num_tokens(self, messages: List[PromptMessage]) -> int: def get_num_tokens(self, messages: List[PromptMessage]) -> int:
""" """

+ 18
- 18
api/services/completion_service.py Parādīt failu

generate_worker_thread.start() generate_worker_thread.start()


# wait for 10 minutes to close the thread # wait for 10 minutes to close the thread
cls.countdown_and_close(generate_worker_thread, pubsub, user, generate_task_id)
cls.countdown_and_close(current_app._get_current_object(), generate_worker_thread, pubsub, user, generate_task_id)


return cls.compact_response(pubsub, streaming) return cls.compact_response(pubsub, streaming)


db.session.commit() db.session.commit()


@classmethod @classmethod
def countdown_and_close(cls, worker_thread, pubsub, user, generate_task_id) -> threading.Thread:
def countdown_and_close(cls, flask_app: Flask, worker_thread, pubsub, user, generate_task_id) -> threading.Thread:
# wait for 10 minutes to close the thread # wait for 10 minutes to close the thread
timeout = 600 timeout = 600


def close_pubsub(): def close_pubsub():
sleep_iterations = 0
while sleep_iterations < timeout and worker_thread.is_alive():
if sleep_iterations > 0 and sleep_iterations % 10 == 0:
PubHandler.ping(user, generate_task_id)
with flask_app.app_context():
sleep_iterations = 0
while sleep_iterations < timeout and worker_thread.is_alive():
if sleep_iterations > 0 and sleep_iterations % 10 == 0:
PubHandler.ping(user, generate_task_id)


time.sleep(1)
sleep_iterations += 1
time.sleep(1)
sleep_iterations += 1


if worker_thread.is_alive():
PubHandler.stop(user, generate_task_id)
try:
pubsub.close()
except:
pass
if worker_thread.is_alive():
PubHandler.stop(user, generate_task_id)
try:
pubsub.close()
except:
pass


countdown_thread = threading.Thread(target=close_pubsub) countdown_thread = threading.Thread(target=close_pubsub)
countdown_thread.start() countdown_thread.start()


generate_worker_thread.start() generate_worker_thread.start()


cls.countdown_and_close(generate_worker_thread, pubsub, user, generate_task_id)
cls.countdown_and_close(current_app._get_current_object(), generate_worker_thread, pubsub, user, generate_task_id)


return cls.compact_response(pubsub, streaming) return cls.compact_response(pubsub, streaming)


except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError,
LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError,
ModelCurrentlyNotSupportError) as e: ModelCurrentlyNotSupportError) as e:
db.session.rollback()
PubHandler.pub_error(user, generate_task_id, e) PubHandler.pub_error(user, generate_task_id, e)
except LLMAuthorizationError: except LLMAuthorizationError:
db.session.rollback()
PubHandler.pub_error(user, generate_task_id, LLMAuthorizationError('Incorrect API key provided')) PubHandler.pub_error(user, generate_task_id, LLMAuthorizationError('Incorrect API key provided'))
except Exception as e: except Exception as e:
db.session.rollback()
logging.exception("Unknown Error in completion") logging.exception("Unknown Error in completion")
PubHandler.pub_error(user, generate_task_id, e) PubHandler.pub_error(user, generate_task_id, e)
finally:
db.session.commit()


@classmethod @classmethod
def get_cleaned_inputs(cls, user_inputs: dict, app_model_config: AppModelConfig): def get_cleaned_inputs(cls, user_inputs: dict, app_model_config: AppModelConfig):

Notiek ielāde…
Atcelt
Saglabāt