diff --git a/.gitignore b/.gitignore index cbb4ff273..cb403a63b 100644 --- a/.gitignore +++ b/.gitignore @@ -484,7 +484,7 @@ modules.xml # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: -.python-version +# .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. diff --git a/.python-version b/.python-version new file mode 100644 index 000000000..a5c4c7633 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.9.0 diff --git a/backend/.python-version b/backend/.python-version new file mode 100644 index 000000000..a5c4c7633 --- /dev/null +++ b/backend/.python-version @@ -0,0 +1 @@ +3.9.0 diff --git a/backend/adapter_processor/exceptions.py b/backend/adapter_processor/exceptions.py index f2eeeb73e..5bddbb3c2 100644 --- a/backend/adapter_processor/exceptions.py +++ b/backend/adapter_processor/exceptions.py @@ -20,6 +20,14 @@ class InValidAdapterId(APIException): default_detail = "Adapter ID is not Valid." +class InvalidEncryptionKey(APIException): + status_code = 403 + default_detail = ( + "Platform encryption key for storing adapter credentials has changed! " + "Please inform the organization admin to contact support." + ) + + class InternalServiceError(APIException): status_code = 500 default_detail = "Internal Service error" diff --git a/backend/adapter_processor/serializers.py b/backend/adapter_processor/serializers.py index 716016282..80637206e 100644 --- a/backend/adapter_processor/serializers.py +++ b/backend/adapter_processor/serializers.py @@ -4,7 +4,8 @@ from account.serializer import UserSerializer from adapter_processor.adapter_processor import AdapterProcessor from adapter_processor.constants import AdapterKeys -from cryptography.fernet import Fernet +from adapter_processor.exceptions import InvalidEncryptionKey +from cryptography.fernet import Fernet, InvalidToken from django.conf import settings from rest_framework import serializers from rest_framework.serializers import ModelSerializer @@ -62,7 +63,10 @@ def to_representation(self, instance: AdapterInstance) -> dict[str, str]: rep.pop(AdapterKeys.ADAPTER_METADATA_B) - adapter_metadata = instance.get_adapter_meta_data() + try: + adapter_metadata = instance.get_adapter_meta_data() + except InvalidToken: + raise InvalidEncryptionKey rep[AdapterKeys.ADAPTER_METADATA] = adapter_metadata # Retrieve context window if adapter is a LLM # For other adapter types, context_window is not relevant. diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 33de0fed5..373fe9f63 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -130,6 +130,9 @@ services: - ../prompt-service/.env labels: - traefik.enable=false + extra_hosts: + # "host-gateway" is a special string that translates to host docker0 i/f IP. + - "host.docker.internal:host-gateway" x2text-service: image: unstract/x2text-service:${VERSION} diff --git a/frontend/src/components/agency/configure-connector-modal/ConfigureConnectorModal.jsx b/frontend/src/components/agency/configure-connector-modal/ConfigureConnectorModal.jsx index 0b140754b..0f3977546 100644 --- a/frontend/src/components/agency/configure-connector-modal/ConfigureConnectorModal.jsx +++ b/frontend/src/components/agency/configure-connector-modal/ConfigureConnectorModal.jsx @@ -97,6 +97,7 @@ function ConfigureConnectorModal({ activeKey={activeKey} items={tabItems} onChange={onTabChange} + moreIcon={<>} /> {activeKey === "1" && (
- + } + />
{activeTabKey === "1" && } diff --git a/frontend/src/components/custom-tools/document-manager/DocumentManager.jsx b/frontend/src/components/custom-tools/document-manager/DocumentManager.jsx index 5effd670c..59e32d40f 100644 --- a/frontend/src/components/custom-tools/document-manager/DocumentManager.jsx +++ b/frontend/src/components/custom-tools/document-manager/DocumentManager.jsx @@ -240,6 +240,7 @@ function DocumentManager({ generateIndex, handleUpdateTool, handleDocChange }) { activeKey={activeKey} items={items} onChange={handleActiveKeyChange} + moreIcon={<>} />
diff --git a/frontend/src/components/custom-tools/tools-main/ToolsMain.jsx b/frontend/src/components/custom-tools/tools-main/ToolsMain.jsx index 3e4876bbf..d32495fb3 100644 --- a/frontend/src/components/custom-tools/tools-main/ToolsMain.jsx +++ b/frontend/src/components/custom-tools/tools-main/ToolsMain.jsx @@ -162,7 +162,12 @@ function ToolsMain() {
- + } + />
diff --git a/frontend/src/components/deployments/display-code/DisplayCode.jsx b/frontend/src/components/deployments/display-code/DisplayCode.jsx index e932df3a2..342d0e450 100644 --- a/frontend/src/components/deployments/display-code/DisplayCode.jsx +++ b/frontend/src/components/deployments/display-code/DisplayCode.jsx @@ -189,6 +189,7 @@ const DisplayCode = ({ isDialogOpen, setDialogOpen, url }) => { } onChange={handleTabKey} items={TAB_ITEMS} + moreIcon={<>} /> ); diff --git a/platform-service/pdm.lock b/platform-service/pdm.lock index b4f807e62..f6bd5d684 100644 --- a/platform-service/pdm.lock +++ b/platform-service/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "deploy", "test"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:166ddc90745e7d884a72bbfdc11e5cf22ea2d42d8aa9458fa7b0d454725f2a53" +content_hash = "sha256:2e773670f191dd1d818df157b78ad902ac06818327756ef22dfe7ce6b7225627" [[package]] name = "async-timeout" @@ -41,17 +41,6 @@ files = [ {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] -[[package]] -name = "certifi" -version = "2024.6.2" -requires_python = ">=3.6" -summary = "Python package for providing Mozilla's CA Bundle." -groups = ["default"] -files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, -] - [[package]] name = "cffi" version = "1.16.0" @@ -360,17 +349,6 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] -[[package]] -name = "idna" -version = "3.7" -requires_python = ">=3.5" -summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default"] -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - [[package]] name = "importlib-metadata" version = "8.0.0" @@ -632,30 +610,13 @@ files = [ [[package]] name = "setuptools" -version = "70.1.1" +version = "70.2.0" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default"] files = [ - {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, - {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -requires_python = ">=3.8" -summary = "Python HTTP for Humans." -groups = ["default"] -dependencies = [ - "certifi>=2017.4.17", - "charset-normalizer<4,>=2", - "idna<4,>=2.5", - "urllib3<3,>=1.21.1", -] -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, + {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, ] [[package]] diff --git a/platform-service/src/unstract/platform_service/helper.py b/platform-service/src/unstract/platform_service/helper.py index 1233c5fdd..30b6ed335 100644 --- a/platform-service/src/unstract/platform_service/helper.py +++ b/platform-service/src/unstract/platform_service/helper.py @@ -6,7 +6,8 @@ import peewee import requests -from unstract.platform_service.exceptions import CustomException, DBTableV2, FeatureFlag +from unstract.platform_service.constants import DBTableV2, FeatureFlag +from unstract.platform_service.exceptions import CustomException from unstract.flags.feature_flag import check_feature_flag_status diff --git a/platform-service/src/unstract/platform_service/main.py b/platform-service/src/unstract/platform_service/main.py index ff8bdaf1f..9eb7fe233 100644 --- a/platform-service/src/unstract/platform_service/main.py +++ b/platform-service/src/unstract/platform_service/main.py @@ -42,12 +42,10 @@ PG_BE_DATABASE = os.environ.get("PG_BE_DATABASE") ENCRYPTION_KEY = EnvManager.get_required_setting("ENCRYPTION_KEY") MODEL_PRICES_URL = EnvManager.get_required_setting("MODEL_PRICES_URL") -MODEL_PRICES_TTL_IN_DAYS = int( - EnvManager.get_required_setting("MODEL_PRICES_TTL_IN_DAYS") -) +MODEL_PRICES_TTL_IN_DAYS = EnvManager.get_required_setting("MODEL_PRICES_TTL_IN_DAYS") MODEL_PRICES_FILE_PATH = EnvManager.get_required_setting("MODEL_PRICES_FILE_PATH") - EnvManager.raise_for_missing_envs() +MODEL_PRICES_TTL_IN_DAYS = int(MODEL_PRICES_TTL_IN_DAYS) # TODO: Follow Flask best practices and refactor accordingly app = Flask("platform_service") @@ -474,7 +472,7 @@ def custom_tool_instance() -> Any: http://localhost:3001/db/custom_tool_instance/prompt_registry_id=id1 """ bearer_token = get_token_from_auth_header(request) - organization_uid, organization_id = get_organization_from_bearer_token(bearer_token) + _, organization_id = get_organization_from_bearer_token(bearer_token) if not organization_id: return INVALID_ORGANIZATOIN, 403 @@ -486,7 +484,6 @@ def custom_tool_instance() -> Any: db_instance=be_db, organization_id=organization_id, prompt_registry_id=prompt_registry_id, - organization_uid=organization_uid, ) return jsonify(data_dict) except Exception as e: @@ -508,4 +505,4 @@ def handle_custom_exception(error: Any) -> tuple[Response, Any]: if __name__ == "__main__": # Start the server - app.run() + app.run(host="0.0.0.0", port="3001") diff --git a/prompt-service/.python-version b/prompt-service/.python-version new file mode 100644 index 000000000..a5c4c7633 --- /dev/null +++ b/prompt-service/.python-version @@ -0,0 +1 @@ +3.9.0 diff --git a/prompt-service/entrypoint.sh b/prompt-service/entrypoint.sh index 4069e8eca..9a928875d 100755 --- a/prompt-service/entrypoint.sh +++ b/prompt-service/entrypoint.sh @@ -5,7 +5,6 @@ --bind 0.0.0.0:3003 \ --workers 2 \ --threads 2 \ - --worker-class gevent\ --log-level debug \ --timeout 900 \ --access-logfile - \ diff --git a/run-platform.sh b/run-platform.sh index eb7dfa832..a11261fe4 100755 --- a/run-platform.sh +++ b/run-platform.sh @@ -222,6 +222,8 @@ build_services() { } elif [ "$first_setup" = true ] || [ "$opt_upgrade" = true ]; then echo -e "$blue_text""Pulling""$default_text"" docker images tag ""$blue_text""$opt_version""$default_text""." + # Try again on a slow network. + VERSION=$opt_version $docker_compose_cmd -f $script_dir/docker/docker-compose.yaml pull || VERSION=$opt_version $docker_compose_cmd -f $script_dir/docker/docker-compose.yaml pull || { echo -e "$red_text""Failed to pull docker images.""$default_text" echo -e "$red_text""Either version not found or docker is not running.""$default_text"