|
|
|
@@ -3,7 +3,7 @@ import logging |
|
|
|
import threading |
|
|
|
import time |
|
|
|
import uuid |
|
|
|
from typing import Generator, Union, Any |
|
|
|
from typing import Generator, Union, Any, Optional |
|
|
|
|
|
|
|
from flask import current_app, Flask |
|
|
|
from redis.client import PubSub |
|
|
|
@@ -141,12 +141,12 @@ class CompletionService: |
|
|
|
generate_worker_thread = threading.Thread(target=cls.generate_worker, kwargs={ |
|
|
|
'flask_app': current_app._get_current_object(), |
|
|
|
'generate_task_id': generate_task_id, |
|
|
|
'app_model': app_model, |
|
|
|
'detached_app_model': app_model, |
|
|
|
'app_model_config': app_model_config, |
|
|
|
'query': query, |
|
|
|
'inputs': inputs, |
|
|
|
'user': user, |
|
|
|
'conversation': conversation, |
|
|
|
'detached_user': user, |
|
|
|
'detached_conversation': conversation, |
|
|
|
'streaming': streaming, |
|
|
|
'is_model_config_override': is_model_config_override, |
|
|
|
'retriever_from': args['retriever_from'] if 'retriever_from' in args else 'dev' |
|
|
|
@@ -171,18 +171,22 @@ class CompletionService: |
|
|
|
return user |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def generate_worker(cls, flask_app: Flask, generate_task_id: str, app_model: App, app_model_config: AppModelConfig, |
|
|
|
query: str, inputs: dict, user: Union[Account, EndUser], |
|
|
|
conversation: Conversation, streaming: bool, is_model_config_override: bool, |
|
|
|
def generate_worker(cls, flask_app: Flask, generate_task_id: str, detached_app_model: App, app_model_config: AppModelConfig, |
|
|
|
query: str, inputs: dict, detached_user: Union[Account, EndUser], |
|
|
|
detached_conversation: Optional[Conversation], streaming: bool, is_model_config_override: bool, |
|
|
|
retriever_from: str = 'dev'): |
|
|
|
with flask_app.app_context(): |
|
|
|
try: |
|
|
|
if conversation: |
|
|
|
# fixed the state of the conversation object when it detached from the original session |
|
|
|
conversation = db.session.query(Conversation).filter_by(id=conversation.id).first() |
|
|
|
# fixed the state of the model object when it detached from the original session |
|
|
|
user = db.session.merge(detached_user) |
|
|
|
app_model = db.session.merge(detached_app_model) |
|
|
|
|
|
|
|
# run |
|
|
|
if detached_conversation: |
|
|
|
conversation = db.session.merge(detached_conversation) |
|
|
|
else: |
|
|
|
conversation = None |
|
|
|
|
|
|
|
try: |
|
|
|
# run |
|
|
|
Completion.generate( |
|
|
|
task_id=generate_task_id, |
|
|
|
app=app_model, |
|
|
|
@@ -210,12 +214,14 @@ class CompletionService: |
|
|
|
db.session.commit() |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def countdown_and_close(cls, flask_app: Flask, worker_thread, pubsub, user, generate_task_id) -> threading.Thread: |
|
|
|
def countdown_and_close(cls, flask_app: Flask, worker_thread, pubsub, detached_user, generate_task_id) -> threading.Thread: |
|
|
|
# wait for 10 minutes to close the thread |
|
|
|
timeout = 600 |
|
|
|
|
|
|
|
def close_pubsub(): |
|
|
|
with flask_app.app_context(): |
|
|
|
user = db.session.merge(detached_user) |
|
|
|
|
|
|
|
sleep_iterations = 0 |
|
|
|
while sleep_iterations < timeout and worker_thread.is_alive(): |
|
|
|
if sleep_iterations > 0 and sleep_iterations % 10 == 0: |
|
|
|
@@ -279,11 +285,11 @@ class CompletionService: |
|
|
|
generate_worker_thread = threading.Thread(target=cls.generate_more_like_this_worker, kwargs={ |
|
|
|
'flask_app': current_app._get_current_object(), |
|
|
|
'generate_task_id': generate_task_id, |
|
|
|
'app_model': app_model, |
|
|
|
'detached_app_model': app_model, |
|
|
|
'app_model_config': app_model_config, |
|
|
|
'message': message, |
|
|
|
'detached_message': message, |
|
|
|
'pre_prompt': pre_prompt, |
|
|
|
'user': user, |
|
|
|
'detached_user': user, |
|
|
|
'streaming': streaming |
|
|
|
}) |
|
|
|
|
|
|
|
@@ -294,10 +300,15 @@ class CompletionService: |
|
|
|
return cls.compact_response(pubsub, streaming) |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def generate_more_like_this_worker(cls, flask_app: Flask, generate_task_id: str, app_model: App, |
|
|
|
app_model_config: AppModelConfig, message: Message, pre_prompt: str, |
|
|
|
user: Union[Account, EndUser], streaming: bool): |
|
|
|
def generate_more_like_this_worker(cls, flask_app: Flask, generate_task_id: str, detached_app_model: App, |
|
|
|
app_model_config: AppModelConfig, detached_message: Message, pre_prompt: str, |
|
|
|
detached_user: Union[Account, EndUser], streaming: bool): |
|
|
|
with flask_app.app_context(): |
|
|
|
# fixed the state of the model object when it detached from the original session |
|
|
|
user = db.session.merge(detached_user) |
|
|
|
app_model = db.session.merge(detached_app_model) |
|
|
|
message = db.session.merge(detached_message) |
|
|
|
|
|
|
|
try: |
|
|
|
# run |
|
|
|
Completion.generate_more_like_this( |