- Corrections for setting up the test environment
- Correction of some bugs discovered
This commit is contained in:
@@ -36,7 +36,6 @@ class TenantServices:
|
|||||||
tenant_partner = PartnerTenant(
|
tenant_partner = PartnerTenant(
|
||||||
partner_service_id=management_service['id'],
|
partner_service_id=management_service['id'],
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
relationship_type='MANAGED',
|
|
||||||
)
|
)
|
||||||
set_logging_information(tenant_partner, dt.now(tz.utc))
|
set_logging_information(tenant_partner, dt.now(tz.utc))
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ if [ $# -eq 0 ]; then
|
|||||||
SERVICES=()
|
SERVICES=()
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
SERVICES+=("$line")
|
SERVICES+=("$line")
|
||||||
done < <(yq e '.services | keys | .[]' compose_dev.yaml | grep -E '^(nginx|eveai_|flower)')
|
done < <(yq e '.services | keys | .[]' compose_dev.yaml | grep -E '^(nginx|eveai_|flower|prometheus|grafana)')
|
||||||
else
|
else
|
||||||
SERVICES=("$@")
|
SERVICES=("$@")
|
||||||
fi
|
fi
|
||||||
@@ -161,14 +161,14 @@ for SERVICE in "${SERVICES[@]}"; do
|
|||||||
if [[ "$SERVICE" == "nginx" ]]; then
|
if [[ "$SERVICE" == "nginx" ]]; then
|
||||||
./copy_specialist_svgs.sh ../config ../nginx/static/assets
|
./copy_specialist_svgs.sh ../config ../nginx/static/assets
|
||||||
fi
|
fi
|
||||||
if [[ "$SERVICE" == "nginx" || "$SERVICE" == eveai_* || "$SERVICE" == "flower" ]]; then
|
if [[ "$SERVICE" == "nginx" || "$SERVICE" == eveai_* || "$SERVICE" == "flower" || "$SERVICE" == "prometheus" || "$SERVICE" == "grafana" ]]; then
|
||||||
if process_service "$SERVICE"; then
|
if process_service "$SERVICE"; then
|
||||||
echo "Successfully processed $SERVICE"
|
echo "Successfully processed $SERVICE"
|
||||||
else
|
else
|
||||||
echo "Failed to process $SERVICE"
|
echo "Failed to process $SERVICE"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Skipping $SERVICE as it's not nginx or doesn't start with eveai_"
|
echo "Skipping $SERVICE as it's not nginx, flower, prometheus, grafana or doesn't start with eveai_"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -375,6 +375,9 @@ services:
|
|||||||
|
|
||||||
prometheus:
|
prometheus:
|
||||||
image: prom/prometheus:latest
|
image: prom/prometheus:latest
|
||||||
|
build:
|
||||||
|
context: ./prometheus
|
||||||
|
dockerfile: Dockerfile
|
||||||
container_name: prometheus
|
container_name: prometheus
|
||||||
ports:
|
ports:
|
||||||
- "9090:9090"
|
- "9090:9090"
|
||||||
@@ -401,6 +404,9 @@ services:
|
|||||||
|
|
||||||
grafana:
|
grafana:
|
||||||
image: grafana/grafana:latest
|
image: grafana/grafana:latest
|
||||||
|
build:
|
||||||
|
context: ./grafana
|
||||||
|
dockerfile: Dockerfile
|
||||||
container_name: grafana
|
container_name: grafana
|
||||||
ports:
|
ports:
|
||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
# https://github.com/docker/awesome-compose
|
# https://github.com/docker/awesome-compose
|
||||||
|
|
||||||
x-common-variables: &common-variables
|
x-common-variables: &common-variables
|
||||||
DB_HOST: db
|
DB_HOST: minty.ask-eve-ai-local.com
|
||||||
DB_USER: luke
|
DB_USER: luke
|
||||||
DB_PASS: 'Skywalker!'
|
DB_PASS: 'Skywalker!'
|
||||||
DB_NAME: eveai
|
DB_NAME: eveai
|
||||||
@@ -53,6 +53,7 @@ services:
|
|||||||
- eveai_api
|
- eveai_api
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
eveai_app:
|
eveai_app:
|
||||||
image: josakola/eveai_app:${EVEAI_VERSION:-latest}
|
image: josakola/eveai_app:${EVEAI_VERSION:-latest}
|
||||||
@@ -67,8 +68,6 @@ services:
|
|||||||
- eveai_logs:/app/logs
|
- eveai_logs:/app/logs
|
||||||
- crewai_storage:/app/crewai_storage
|
- crewai_storage:/app/crewai_storage
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
redis:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
minio:
|
minio:
|
||||||
@@ -81,6 +80,7 @@ services:
|
|||||||
start_period: 30s
|
start_period: 30s
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
eveai_workers:
|
eveai_workers:
|
||||||
image: josakola/eveai_workers:${EVEAI_VERSION:-latest}
|
image: josakola/eveai_workers:${EVEAI_VERSION:-latest}
|
||||||
@@ -93,14 +93,13 @@ services:
|
|||||||
- eveai_logs:/app/logs
|
- eveai_logs:/app/logs
|
||||||
- crewai_storage:/app/crewai_storage
|
- crewai_storage:/app/crewai_storage
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
redis:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
eveai_chat_workers:
|
eveai_chat_workers:
|
||||||
image: josakola/eveai_chat_workers:${EVEAI_VERSION:-latest}
|
image: josakola/eveai_chat_workers:${EVEAI_VERSION:-latest}
|
||||||
@@ -113,12 +112,11 @@ services:
|
|||||||
- eveai_logs:/app/logs
|
- eveai_logs:/app/logs
|
||||||
- crewai_storage:/app/crewai_storage
|
- crewai_storage:/app/crewai_storage
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
redis:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
eveai_api:
|
eveai_api:
|
||||||
image: josakola/eveai_api:${EVEAI_VERSION:-latest}
|
image: josakola/eveai_api:${EVEAI_VERSION:-latest}
|
||||||
@@ -133,8 +131,6 @@ services:
|
|||||||
- eveai_logs:/app/logs
|
- eveai_logs:/app/logs
|
||||||
- crewai_storage:/app/crewai_storage
|
- crewai_storage:/app/crewai_storage
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
redis:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
minio:
|
minio:
|
||||||
@@ -147,6 +143,7 @@ services:
|
|||||||
start_period: 30s
|
start_period: 30s
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
eveai_beat:
|
eveai_beat:
|
||||||
image: josakola/eveai_beat:${EVEAI_VERSION:-latest}
|
image: josakola/eveai_beat:${EVEAI_VERSION:-latest}
|
||||||
@@ -161,6 +158,7 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
eveai_entitlements:
|
eveai_entitlements:
|
||||||
image: josakola/eveai_entitlements:${EVEAI_VERSION:-latest}
|
image: josakola/eveai_entitlements:${EVEAI_VERSION:-latest}
|
||||||
@@ -173,39 +171,17 @@ services:
|
|||||||
- eveai_logs:/app/logs
|
- eveai_logs:/app/logs
|
||||||
- crewai_storage:/app/crewai_storage
|
- crewai_storage:/app/crewai_storage
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
redis:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
db:
|
|
||||||
hostname: db
|
|
||||||
image: ankane/pgvector
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
- POSTGRES_DB=eveai
|
|
||||||
- POSTGRES_USER=luke
|
|
||||||
- POSTGRES_PASSWORD=Skywalker!
|
|
||||||
volumes:
|
|
||||||
- pgdata:/var/lib/postgresql/data
|
|
||||||
- ./docker/db/init.sql:/docker-entrypoint-initdb.d/init.sql
|
|
||||||
healthcheck:
|
|
||||||
test: [ "CMD-SHELL", "pg_isready -d eveai -U luke" ]
|
|
||||||
interval: 10s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
networks:
|
|
||||||
- eveai-network
|
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:7.2.5
|
image: redis:7.2.5
|
||||||
restart: always
|
restart: no
|
||||||
ports:
|
ports:
|
||||||
- "6379:6379"
|
- "6379:6379"
|
||||||
volumes:
|
volumes:
|
||||||
@@ -228,6 +204,7 @@ services:
|
|||||||
- redis
|
- redis
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
image: minio/minio
|
image: minio/minio
|
||||||
@@ -251,14 +228,14 @@ services:
|
|||||||
start_period: 30s
|
start_period: 30s
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
prometheus:
|
prometheus:
|
||||||
image: prom/prometheus:latest
|
image: josakola/prometheus:${EVEAI_VERSION:-latest}
|
||||||
container_name: prometheus
|
container_name: prometheus
|
||||||
ports:
|
ports:
|
||||||
- "9090:9090"
|
- "9090:9090"
|
||||||
volumes:
|
volumes:
|
||||||
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
|
||||||
- prometheusdata:/prometheus
|
- prometheusdata:/prometheus
|
||||||
command:
|
command:
|
||||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||||
@@ -266,7 +243,7 @@ services:
|
|||||||
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
||||||
- '--web.console.templates=/etc/prometheus/consoles'
|
- '--web.console.templates=/etc/prometheus/consoles'
|
||||||
- '--web.enable-lifecycle'
|
- '--web.enable-lifecycle'
|
||||||
restart: unless-stopped
|
restart: no
|
||||||
networks:
|
networks:
|
||||||
- eveai-network
|
- eveai-network
|
||||||
|
|
||||||
@@ -279,18 +256,17 @@ services:
|
|||||||
- eveai-network
|
- eveai-network
|
||||||
|
|
||||||
grafana:
|
grafana:
|
||||||
image: grafana/grafana:latest
|
image: josakola/grafana:${EVEAI_VERSION:-latest}
|
||||||
container_name: grafana
|
container_name: grafana
|
||||||
ports:
|
ports:
|
||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
volumes:
|
volumes:
|
||||||
- ./docker/grafana/provisioning:/etc/grafana/provisioning
|
|
||||||
- grafanadata:/var/lib/grafana
|
- grafanadata:/var/lib/grafana
|
||||||
environment:
|
environment:
|
||||||
- GF_SECURITY_ADMIN_USER=admin
|
- GF_SECURITY_ADMIN_USER=admin
|
||||||
- GF_SECURITY_ADMIN_PASSWORD=admin
|
- GF_SECURITY_ADMIN_PASSWORD=admin
|
||||||
- GF_USERS_ALLOW_SIGN_UP=false
|
- GF_USERS_ALLOW_SIGN_UP=false
|
||||||
restart: unless-stopped
|
restart: no
|
||||||
depends_on:
|
depends_on:
|
||||||
- prometheus
|
- prometheus
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
13
docker/grafana/Dockerfile
Normal file
13
docker/grafana/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
FROM grafana/grafana:latest
|
||||||
|
|
||||||
|
# Copy dashboard and datasource provisioning configurations
|
||||||
|
COPY provisioning/dashboards /etc/grafana/provisioning/dashboards
|
||||||
|
COPY provisioning/datasources /etc/grafana/provisioning/datasources
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
ENV GF_SECURITY_ADMIN_USER=admin
|
||||||
|
ENV GF_SECURITY_ADMIN_PASSWORD=admin
|
||||||
|
ENV GF_USERS_ALLOW_SIGN_UP=false
|
||||||
|
|
||||||
|
# Expose the Grafana web interface
|
||||||
|
EXPOSE 3000
|
||||||
13
docker/prometheus/Dockerfile
Normal file
13
docker/prometheus/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
FROM prom/prometheus:latest
|
||||||
|
|
||||||
|
COPY prometheus.yml /etc/prometheus/prometheus.yml
|
||||||
|
|
||||||
|
# Expose the Prometheus UI and metrics endpoint
|
||||||
|
EXPOSE 9090
|
||||||
|
|
||||||
|
# Run Prometheus with the config file
|
||||||
|
CMD ["--config.file=/etc/prometheus/prometheus.yml", \
|
||||||
|
"--storage.tsdb.path=/prometheus", \
|
||||||
|
"--web.console.libraries=/etc/prometheus/console_libraries", \
|
||||||
|
"--web.console.templates=/etc/prometheus/consoles", \
|
||||||
|
"--web.enable-lifecycle"]
|
||||||
@@ -78,11 +78,18 @@
|
|||||||
]) }}
|
]) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if current_user.is_authenticated %}
|
{% if current_user.is_authenticated %}
|
||||||
{{ dropdown('Partners', 'partner_exchange', [
|
{% set partner_menu_items = [
|
||||||
{'name': 'Partners', 'url': '/partner/partners', 'roles': ['Super User']},
|
{'name': 'Partners', 'url': '/partner/partners', 'roles': ['Super User']},
|
||||||
{'name': 'Partner Services', 'url': '/partner/partner_services', 'roles': ['Super User']},
|
{'name': 'Partner Services', 'url': '/partner/partner_services', 'roles': ['Super User']}
|
||||||
{'name': 'Edit Partner', 'url': '/partner/partner/' ~ session['partner'].get('id'), 'roles': ['Super User', 'Partner Admin']},
|
] %}
|
||||||
]) }}
|
|
||||||
|
{% if 'partner' in session and session['partner'] %}
|
||||||
|
{% set partner_menu_items = partner_menu_items + [
|
||||||
|
{'name': 'Edit Partner', 'url': '/partner/partner/' ~ session['partner'].get('id'), 'roles': ['Super User', 'Partner Admin']}
|
||||||
|
] %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{{ dropdown('Partners', 'partner_exchange', partner_menu_items) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if current_user.is_authenticated %}
|
{% if current_user.is_authenticated %}
|
||||||
{{ dropdown('Documents', 'note_stack', [
|
{{ dropdown('Documents', 'note_stack', [
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from datetime import datetime as dt, timezone as tz
|
|||||||
from flask import request, redirect, flash, render_template, Blueprint, session, current_app
|
from flask import request, redirect, flash, render_template, Blueprint, session, current_app
|
||||||
from flask_mailman import EmailMessage
|
from flask_mailman import EmailMessage
|
||||||
from flask_security import roles_accepted, current_user
|
from flask_security import roles_accepted, current_user
|
||||||
from sqlalchemy.exc import SQLAlchemyError
|
from sqlalchemy.exc import SQLAlchemyError, IntegrityError
|
||||||
import ast
|
import ast
|
||||||
|
|
||||||
from common.models.user import User, Tenant, Role, TenantDomain, TenantProject, PartnerTenant
|
from common.models.user import User, Tenant, Role, TenantDomain, TenantProject, PartnerTenant
|
||||||
@@ -38,8 +38,8 @@ def log_after_request(response):
|
|||||||
@user_bp.route('/tenant', methods=['GET', 'POST'])
|
@user_bp.route('/tenant', methods=['GET', 'POST'])
|
||||||
@roles_accepted('Super User', 'Partner Admin')
|
@roles_accepted('Super User', 'Partner Admin')
|
||||||
def tenant():
|
def tenant():
|
||||||
if not current_user.has_roles('Partner Admin') and UserServices.can_user_create_tenant():
|
if not UserServices.can_user_create_tenant():
|
||||||
current_app.logger.error(f'User {current_user.email} cannot create tenant in the current user')
|
current_app.logger.error(f'User {current_user.email} cannot create tenant')
|
||||||
flash(f"You don't have the appropriate permissions to create a tenant", 'danger')
|
flash(f"You don't have the appropriate permissions to create a tenant", 'danger')
|
||||||
return redirect(prefixed_url_for('user_bp.select_tenant'))
|
return redirect(prefixed_url_for('user_bp.select_tenant'))
|
||||||
form = TenantForm()
|
form = TenantForm()
|
||||||
@@ -68,6 +68,17 @@ def tenant():
|
|||||||
# Super User chose to associate with partner
|
# Super User chose to associate with partner
|
||||||
TenantServices.associate_tenant_with_partner(new_tenant.id)
|
TenantServices.associate_tenant_with_partner(new_tenant.id)
|
||||||
|
|
||||||
|
except IntegrityError as e:
|
||||||
|
db.session.rollback()
|
||||||
|
# Check for the specific error about duplicate tenant name
|
||||||
|
if "tenant_name_key" in str(e) or "duplicate key value" in str(e):
|
||||||
|
flash(f"A tenant with the name '{form.name.data}' already exists. Please choose a different name.",
|
||||||
|
'danger')
|
||||||
|
else:
|
||||||
|
current_app.logger.error(f'Failed to add tenant to database. Error: {str(e)}')
|
||||||
|
flash(f'Failed to add tenant to database. Error: {str(e)}', 'danger')
|
||||||
|
return render_template('user/tenant.html', form=form)
|
||||||
|
|
||||||
except SQLAlchemyError as e:
|
except SQLAlchemyError as e:
|
||||||
current_app.logger.error(f'Failed to add tenant to database. Error: {str(e)}')
|
current_app.logger.error(f'Failed to add tenant to database. Error: {str(e)}')
|
||||||
flash(f'Failed to add tenant to database. Error: {str(e)}', 'danger')
|
flash(f'Failed to add tenant to database. Error: {str(e)}', 'danger')
|
||||||
@@ -227,8 +238,12 @@ def select_tenant():
|
|||||||
# Start with a base query
|
# Start with a base query
|
||||||
query = Tenant.query
|
query = Tenant.query
|
||||||
|
|
||||||
|
current_app.logger.debug("We proberen het scherm op te bouwen")
|
||||||
|
current_app.logger.debug(f"Session: {session}")
|
||||||
|
|
||||||
# Apply different filters based on user role
|
# Apply different filters based on user role
|
||||||
if current_user.has_roles('Partner Admin') and 'partner' in session:
|
if current_user.has_roles('Partner Admin') and 'partner' in session:
|
||||||
|
current_app.logger.debug("We zitten in partner mode")
|
||||||
# Get the partner's management service
|
# Get the partner's management service
|
||||||
management_service = next((service for service in session['partner']['services']
|
management_service = next((service for service in session['partner']['services']
|
||||||
if service.get('type') == 'MANAGEMENT_SERVICE'), None)
|
if service.get('type') == 'MANAGEMENT_SERVICE'), None)
|
||||||
@@ -251,6 +266,7 @@ def select_tenant():
|
|||||||
# Filter query to only show allowed tenants
|
# Filter query to only show allowed tenants
|
||||||
query = query.filter(Tenant.id.in_(allowed_tenant_ids))
|
query = query.filter(Tenant.id.in_(allowed_tenant_ids))
|
||||||
|
|
||||||
|
current_app.logger.debug("We zitten na partner service selectie")
|
||||||
# Apply form filters (for both Super User and Partner Admin)
|
# Apply form filters (for both Super User and Partner Admin)
|
||||||
if filter_form.validate_on_submit():
|
if filter_form.validate_on_submit():
|
||||||
if filter_form.types.data:
|
if filter_form.types.data:
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
"""Remove relation_type from PartnerTenant
|
||||||
|
|
||||||
|
Revision ID: 9ed466e9756b
|
||||||
|
Revises: 43a9f29fb214
|
||||||
|
Create Date: 2025-05-07 14:11:25.132834
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '9ed466e9756b'
|
||||||
|
down_revision = '43a9f29fb214'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('partner_tenant', schema=None) as batch_op:
|
||||||
|
batch_op.drop_column('relationship_type')
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('partner_tenant', schema=None) as batch_op:
|
||||||
|
batch_op.add_column(sa.Column('relationship_type', sa.VARCHAR(length=20), autoincrement=False, nullable=False))
|
||||||
|
# ### end Alembic commands ###
|
||||||
@@ -15,32 +15,32 @@ Flask-Login~=0.6.3
|
|||||||
flask-mailman~=1.1.1
|
flask-mailman~=1.1.1
|
||||||
Flask-Migrate~=4.1.0
|
Flask-Migrate~=4.1.0
|
||||||
Flask-Principal~=0.4.0
|
Flask-Principal~=0.4.0
|
||||||
Flask-Security-Too~=5.6.1
|
Flask-Security-Too~=5.6.2
|
||||||
Flask-Session~=0.8.0
|
Flask-Session~=0.8.0
|
||||||
Flask-SQLAlchemy~=3.1.1
|
Flask-SQLAlchemy~=3.1.1
|
||||||
Flask-WTF~=1.2.1
|
Flask-WTF~=1.2.1
|
||||||
gevent~=24.11.1
|
gevent~=25.4.2
|
||||||
gevent-websocket~=0.10.1
|
gevent-websocket~=0.10.1
|
||||||
greenlet~=3.0.3
|
greenlet~=3.2.1
|
||||||
gunicorn~=22.0.0
|
gunicorn~=23.0.0
|
||||||
Jinja2~=3.1.6
|
Jinja2~=3.1.6
|
||||||
kombu~=5.3.7
|
kombu~=5.3.7
|
||||||
langchain~=0.3.23
|
langchain~=0.3.25
|
||||||
langchain-anthropic~=0.3.11
|
langchain-anthropic~=0.3.12
|
||||||
langchain-community~=0.3.21
|
langchain-community~=0.3.23
|
||||||
langchain-core~=0.3.52
|
langchain-core~=0.3.58
|
||||||
langchain-mistralai~=0.2.10
|
langchain-mistralai~=0.2.10
|
||||||
langchain-openai~=0.3.13
|
langchain-openai~=0.3.16
|
||||||
langchain-postgres~=0.0.14
|
langchain-postgres~=0.0.14
|
||||||
langchain-text-splitters~=0.3.0
|
langchain-text-splitters~=0.3.8
|
||||||
langcodes~=3.4.0
|
langcodes~=3.4.0
|
||||||
langdetect~=1.0.9
|
langdetect~=1.0.9
|
||||||
langsmith~=0.1.81
|
langsmith~=0.1.81
|
||||||
openai~=1.62.0
|
openai~=1.77.0
|
||||||
pg8000~=1.31.2
|
pg8000~=1.31.2
|
||||||
pgvector~=0.2.5
|
pgvector~=0.2.5
|
||||||
pycryptodome~=3.20.0
|
pycryptodome~=3.20.0
|
||||||
pydantic~=2.9.1
|
pydantic>=2.10.3,<3
|
||||||
PyJWT~=2.10.1
|
PyJWT~=2.10.1
|
||||||
python-dateutil~=2.9.0.post0
|
python-dateutil~=2.9.0.post0
|
||||||
python-engineio~=4.9.1
|
python-engineio~=4.9.1
|
||||||
@@ -57,7 +57,6 @@ urllib3~=2.2.2
|
|||||||
WTForms~=3.2.1
|
WTForms~=3.2.1
|
||||||
wtforms-html5~=0.6.1
|
wtforms-html5~=0.6.1
|
||||||
zxcvbn~=4.4.28
|
zxcvbn~=4.4.28
|
||||||
groq~=0.9.0
|
|
||||||
pydub~=0.25.1
|
pydub~=0.25.1
|
||||||
argparse~=1.4.0
|
argparse~=1.4.0
|
||||||
minio~=7.2.7
|
minio~=7.2.7
|
||||||
@@ -72,7 +71,7 @@ PyPDF2~=3.0.1
|
|||||||
flask-restx~=1.3.0
|
flask-restx~=1.3.0
|
||||||
flask-healthz~=1.0.1
|
flask-healthz~=1.0.1
|
||||||
langsmith~=0.1.121
|
langsmith~=0.1.121
|
||||||
anthropic~=0.34.2
|
anthropic~=0.50.0
|
||||||
prometheus-client~=0.21.1
|
prometheus-client~=0.21.1
|
||||||
prometheus-flask-exporter~=0.23.2
|
prometheus-flask-exporter~=0.23.2
|
||||||
flower~=2.0.1
|
flower~=2.0.1
|
||||||
@@ -84,7 +83,7 @@ typing_extensions~=4.12.2
|
|||||||
babel~=2.16.0
|
babel~=2.16.0
|
||||||
dogpile.cache~=1.3.3
|
dogpile.cache~=1.3.3
|
||||||
python-docx~=1.1.2
|
python-docx~=1.1.2
|
||||||
crewai~=0.114.0
|
crewai~=0.118.0
|
||||||
sseclient~=0.0.27
|
sseclient~=0.0.27
|
||||||
termcolor~=2.5.0
|
termcolor~=2.5.0
|
||||||
mistral-common~=1.5.3
|
mistral-common~=1.5.3
|
||||||
|
|||||||
Reference in New Issue
Block a user