- Introduction of TRACIE_KO_INTERVIEW_DEFINITION_SPECIALIST
- Re-introduction of EveAIAsset - Make translation services resistent for situation with and without current_event defined. - Ensure first question is asked in eveai_chat_client - Start of version 1.4.0 of TRAICIE_SELECTION_SPECIALIST
This commit is contained in:
@@ -102,35 +102,6 @@ class EditEveAIToolForm(BaseEditComponentForm):
|
||||
pass
|
||||
|
||||
|
||||
class AddEveAIAssetForm(FlaskForm):
|
||||
name = StringField('Name', validators=[DataRequired(), Length(max=50)])
|
||||
description = TextAreaField('Description', validators=[Optional()])
|
||||
type = SelectField('Type', validators=[DataRequired()])
|
||||
valid_from = DateField('Valid From', id='form-control datepicker', validators=[Optional()])
|
||||
valid_to = DateField('Valid To', id='form-control datepicker', validators=[Optional()])
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
types_dict = cache_manager.assets_types_cache.get_types()
|
||||
self.type.choices = [(key, value['name']) for key, value in types_dict.items()]
|
||||
|
||||
|
||||
class EditEveAIAssetForm(FlaskForm):
|
||||
name = StringField('Name', validators=[DataRequired(), Length(max=50)])
|
||||
description = TextAreaField('Description', validators=[Optional()])
|
||||
type = SelectField('Type', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
type_version = StringField('Type Version', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
valid_from = DateField('Valid From', id='form-control datepicker', validators=[Optional()])
|
||||
valid_to = DateField('Valid To', id='form-control datepicker', validators=[Optional()])
|
||||
|
||||
|
||||
class EditEveAIAssetVersionForm(DynamicFormBase):
|
||||
asset_name = StringField('Asset Name', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
asset_type = StringField('Asset Type', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
asset_type_version = StringField('Asset Type Version', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
bucket_name = StringField('Bucket Name', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
|
||||
|
||||
class ExecuteSpecialistForm(DynamicFormBase):
|
||||
id = IntegerField('Specialist ID', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
name = StringField('Specialist Name', validators=[DataRequired()], render_kw={'readonly': True})
|
||||
|
||||
@@ -14,12 +14,11 @@ from werkzeug.utils import secure_filename
|
||||
|
||||
from common.models.document import Embedding, DocumentVersion, Retriever
|
||||
from common.models.interaction import (ChatSession, Interaction, InteractionEmbedding, Specialist, SpecialistRetriever,
|
||||
EveAIAgent, EveAITask, EveAITool, EveAIAssetVersion, SpecialistMagicLink)
|
||||
EveAIAgent, EveAITask, EveAITool, EveAIAsset, SpecialistMagicLink)
|
||||
|
||||
from common.extensions import db, cache_manager
|
||||
from common.models.user import SpecialistMagicLinkTenant
|
||||
from common.services.interaction.specialist_services import SpecialistServices
|
||||
from common.utils.asset_utils import create_asset_stack, add_asset_version_file
|
||||
from common.utils.execution_progress import ExecutionProgressTracker
|
||||
from common.utils.model_logging_utils import set_logging_information, update_logging_information
|
||||
|
||||
@@ -28,7 +27,7 @@ from common.utils.nginx_utils import prefixed_url_for
|
||||
from common.utils.view_assistants import form_validation_failed, prepare_table_for_macro
|
||||
|
||||
from .interaction_forms import (SpecialistForm, EditSpecialistForm, EditEveAIAgentForm, EditEveAITaskForm,
|
||||
EditEveAIToolForm, AddEveAIAssetForm, EditEveAIAssetVersionForm, ExecuteSpecialistForm,
|
||||
EditEveAIToolForm, ExecuteSpecialistForm,
|
||||
SpecialistMagicLinkForm, EditSpecialistMagicLinkForm)
|
||||
|
||||
interaction_bp = Blueprint('interaction_bp', __name__, url_prefix='/interaction')
|
||||
@@ -486,92 +485,7 @@ def handle_tool_selection():
|
||||
return redirect(prefixed_url_for('interaction_bp.edit_specialist'))
|
||||
|
||||
|
||||
# Routes for Asset management ---------------------------------------------------------------------
|
||||
@interaction_bp.route('/add_asset', methods=['GET', 'POST'])
|
||||
@roles_accepted('Super User', 'Partner Admin', 'Tenant Admin')
|
||||
def add_asset():
|
||||
form = AddEveAIAssetForm(request.form)
|
||||
tenant_id = session.get('tenant').get('id')
|
||||
|
||||
if form.validate_on_submit():
|
||||
try:
|
||||
current_app.logger.info(f"Adding asset for tenant {tenant_id}")
|
||||
|
||||
api_input = {
|
||||
'name': form.name.data,
|
||||
'description': form.description.data,
|
||||
'type': form.type.data,
|
||||
'valid_from': form.valid_from.data,
|
||||
'valid_to': form.valid_to.data,
|
||||
}
|
||||
new_asset, new_asset_version = create_asset_stack(api_input, tenant_id)
|
||||
|
||||
return redirect(prefixed_url_for('interaction_bp.edit_asset_version',
|
||||
asset_version_id=new_asset_version.id))
|
||||
except Exception as e:
|
||||
current_app.logger.error(f'Failed to add asset for tenant {tenant_id}: {str(e)}')
|
||||
flash('An error occurred while adding asset', 'error')
|
||||
|
||||
return render_template('interaction/add_asset.html')
|
||||
|
||||
|
||||
@interaction_bp.route('/edit_asset_version/<int:asset_version_id>', methods=['GET', 'POST'])
|
||||
@roles_accepted('Super User', 'Partner Admin', 'Tenant Admin')
|
||||
def edit_asset_version(asset_version_id):
|
||||
asset_version = EveAIAssetVersion.query.get_or_404(asset_version_id)
|
||||
form = EditEveAIAssetVersionForm(asset_version)
|
||||
asset_config = cache_manager.assets_config_cache.get_config(asset_version.asset.type,
|
||||
asset_version.asset.type_version)
|
||||
form.add_dynamic_fields("configuration", asset_config, asset_version.configuration)
|
||||
|
||||
if form.validate_on_submit():
|
||||
# Update the configuration dynamic fields
|
||||
configuration = form.get_dynamic_data("configuration")
|
||||
processed_configuration = {}
|
||||
tenant_id = session.get('tenant').get('id')
|
||||
# if files are returned, we will store the file_names in the configuration, and add the file to the appropriate
|
||||
# bucket, in the appropriate location
|
||||
for field_name, field_value in configuration.items():
|
||||
# Handle file field - check if the value is a FileStorage instance
|
||||
if isinstance(field_value, FileStorage) and field_value.filename:
|
||||
try:
|
||||
# Upload file and retrieve object_name for the file
|
||||
object_name = add_asset_version_file(asset_version, field_name, field_value, tenant_id)
|
||||
|
||||
# Store object reference in configuration instead of file content
|
||||
processed_configuration[field_name] = object_name
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"Failed to upload file for asset version {asset_version.id}: {str(e)}")
|
||||
flash(f"Failed to upload file '{field_value.filename}': {str(e)}", "danger")
|
||||
return render_template('interaction/edit_asset_version.html', form=form,
|
||||
asset_version=asset_version)
|
||||
# Handle normal fields
|
||||
else:
|
||||
processed_configuration[field_name] = field_value
|
||||
|
||||
# Update the asset version with processed configuration
|
||||
asset_version.configuration = processed_configuration
|
||||
|
||||
# Update logging information
|
||||
update_logging_information(asset_version, dt.now(tz.utc))
|
||||
|
||||
try:
|
||||
db.session.commit()
|
||||
flash('Asset uploaded successfully!', 'success')
|
||||
current_app.logger.info(f'Asset Version {asset_version.id} updated successfully')
|
||||
return redirect(prefixed_url_for('interaction_bp.assets'))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(f'Failed to upload asset. Error: {str(e)}', 'danger')
|
||||
current_app.logger.error(f'Failed to update asset version {asset_version.id}. Error: {str(e)}')
|
||||
return render_template('interaction/edit_asset_version.html', form=form)
|
||||
else:
|
||||
form_validation_failed(request, form)
|
||||
|
||||
return render_template('interaction/edit_asset_version.html', form=form)
|
||||
|
||||
|
||||
# Specialist Execution ----------------------------------------------------------------------------
|
||||
@interaction_bp.route('/execute_specialist/<int:specialist_id>', methods=['GET', 'POST'])
|
||||
def execute_specialist(specialist_id):
|
||||
specialist = Specialist.query.get_or_404(specialist_id)
|
||||
@@ -603,6 +517,7 @@ def execute_specialist(specialist_id):
|
||||
return render_template('interaction/execute_specialist.html', form=form)
|
||||
|
||||
|
||||
# Interaction Mgmt --------------------------------------------------------------------------------
|
||||
@interaction_bp.route('/session_interactions_by_session_id/<session_id>', methods=['GET'])
|
||||
@roles_accepted('Super User', 'Partner Admin', 'Tenant Admin')
|
||||
def session_interactions_by_session_id(session_id):
|
||||
|
||||
Reference in New Issue
Block a user