* UN-2793 [FEAT] Add retry logic with exponential backoff to SDK1 Implemented automatic retry logic for platform and prompt service calls with configurable exponential backoff, comprehensive test coverage, and CI integration. Features: - Exponential backoff with jitter for transient failures - Configurable via environment variables (MAX_RETRIES, MAX_TIME, BASE_DELAY, etc.) - Retries ConnectionError, Timeout, HTTPError (502/503/504), OSError - 67 tests with 100% pass rate - CI integration with test reporting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * [SECURITY] Use full commit SHA for sticky-pull-request-comment action Replace tag reference with full commit SHA for better security: - marocchino/sticky-pull-request-comment@v2 → @7737449 (v2.9.4) This prevents potential supply chain attacks where tags could be moved to point to malicious code. Commit SHAs are immutable. Fixes SonarQube security hotspot for external GitHub action. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * [FIX] Allow retryable HTTP errors (502/503/504) to propagate for retry Fixed HTTPError handling in _get_adapter_configuration to check status codes and re-raise retryable errors (502, 503, 504) so the retry decorator can handle them. Non-retryable errors are still converted to SdkError as before. Changes: - Check HTTPError status code before converting to SdkError - Re-raise HTTPError for 502/503/504 to allow retry decorator to retry - Added parametrized test for all retryable status codes (502, 503, 504) - All 12 platform tests pass This fixes a bug where 502/503/504 errors were not being retried because they were converted to SdkError before the retry decorator could see them. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * [FIX] Use pytest.approx() for floating point comparisons in tests Replaced direct equality comparisons (==) with pytest.approx() for floating point values to avoid precision issues and satisfy SonarQube code quality check (python:S1244). Changes in test_retry_utils.py: - test_exponential_backoff_without_jitter: Use pytest.approx() for 1.0, 2.0, 4.0, 8.0 - test_max_delay_cap: Use pytest.approx() for 5.0 This is the proper way to compare floating point values in tests, accounting for floating point precision limitations. All 4 TestCalculateDelay tests pass. Fixes SonarQube: python:S1244 - Do not perform equality checks with floating point values. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * minor: Addressed code smells, ruff fixes * misc: Fixed tox config for sdk1 tests * misc: Ruff issues fixed * misc: tox tests fixed * prompt service lock file for venv * updated lock files for backend and prompt-service * UN-2793 [FEAT] Update to unstract-sdk v0.78.0 with retry logic support (#1567) [FEAT] Update unstract-sdk to v0.78.0 across all services and tools - Updated unstract-sdk dependency from v0.77.3 to v0.78.0 in all pyproject.toml files - Main repository, backend, workers, platform-service, prompt-service - filesystem and tool-registry modules - Updated tool requirements.txt files (structure, classifier, text_extractor) - Bumped tool versions in properties.json: - Structure tool: 0.0.88 → 0.0.89 - Classifier tool: 0.0.68 → 0.0.69 - Text extractor tool: 0.0.64 → 0.0.65 - Updated tool versions in backend/sample.env and public_tools.json - Regenerated all uv.lock files with new SDK version This update brings in the retry logic with exponential backoff from unstract-sdk v0.78.0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com> --------- Signed-off-by: Chandrasekharan M <117059509+chandrasekharan-zipstack@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
63 lines
1.6 KiB
TOML
63 lines
1.6 KiB
TOML
[project]
|
|
name = "unstract-prompt-service"
|
|
version = "0.0.1"
|
|
description = "Unstract's prompt studio helper"
|
|
authors = [{ name = "Zipstack Inc.", email = "devsupport@zipstack.com" }]
|
|
requires-python = ">=3.12,<3.13"
|
|
readme = "README.md"
|
|
# license = {text = "MIT"}
|
|
|
|
dependencies = [
|
|
"peewee~=3.16",
|
|
"nltk~=3.8",
|
|
"flask~=3.0",
|
|
"llama-index==0.13.2",
|
|
"python-dotenv==1.0.1",
|
|
"json-repair~=0.42.0",
|
|
"requests>=2.28,<3.0",
|
|
"unstract-sdk[aws,gcs,azure]~=0.78.0",
|
|
"redis>=5.0.3,<5.3",
|
|
"unstract-core",
|
|
"unstract-flags",
|
|
"unstract-sdk1[aws,gcs,azure]"
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
unstract-flags = { path = "../unstract/flags", editable = true }
|
|
unstract-core = { path = "../unstract/core", editable = true }
|
|
unstract-sdk1 = { path = "../unstract/sdk1", editable = true }
|
|
|
|
[dependency-groups]
|
|
test = [
|
|
"pytest~=8.0.1",
|
|
"pytest-dotenv==0.5.2",
|
|
"pytest-mock~=3.14.0",
|
|
"python-dotenv==1.0.1",
|
|
"flask-WTF~=1.1",
|
|
]
|
|
deploy = [
|
|
"gunicorn~=23.0",
|
|
# OpenTelemetry for tracing and profiling
|
|
"opentelemetry-distro",
|
|
"opentelemetry-exporter-otlp",
|
|
]
|
|
dev = ["poethepoet>=0.33.1", "debugpy>=1.8.14"]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["src/unstract"]
|
|
|
|
[tool.poe]
|
|
envfile = ".env"
|
|
|
|
[tool.poe.tasks.prompt-service]
|
|
cmd = "./entrypoint.sh"
|
|
help = "Runs the Unstract prompt service (Gunicorn)"
|
|
|
|
[tool.poe.tasks.prompt-service-flask]
|
|
cmd = "uv run flask --app src/unstract/prompt_service/run.py run --port 3003"
|
|
help = "Runs the Unstract prompt service (Flask)"
|