Merge branch 'dev' of https://github.com/langflow-ai/langflow into dev
This commit is contained in:
commit
a7ea080c88
8 changed files with 93 additions and 16 deletions
20
.github/workflows/docker-build.yml
vendored
20
.github/workflows/docker-build.yml
vendored
|
|
@ -26,18 +26,24 @@ jobs:
|
||||||
setup:
|
setup:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
base_tags: ${{ steps.set-vars.outputs.base_tags }}
|
tags: ${{ steps.set-vars.outputs.tags }}
|
||||||
main_tags: ${{ steps.set-vars.outputs.main_tags }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Set Dockerfile and Tags
|
- name: Set Dockerfile and Tags
|
||||||
id: set-vars
|
id: set-vars
|
||||||
run: |
|
run: |
|
||||||
echo "base_tags=langflowai/langflow:base-${{ inputs.version }}" >> $GITHUB_OUTPUT
|
if [[ "${{ inputs.release_type }}" == "base" ]]; then
|
||||||
echo "main_tags=langflowai/langflow:${{ inputs.version }},langflowai/langflow:1.0-alpha" >> $GITHUB_OUTPUT
|
echo "tags=langflowai/langflow:base-${{ inputs.version }}" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "tags=langflowai/langflow:${{ inputs.version }},langflowai/langflow:1.0-alpha" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
build_base:
|
build_base:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: setup
|
needs: setup
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
platform: [linux/amd64, linux/arm64/v8]
|
||||||
|
file: [./docker/build_and_push.Dockerfile, ./docker/build_and_push_base.Dockerfile]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
|
|
@ -52,9 +58,9 @@ jobs:
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
platforms: "linux/amd64,linux/arm64/v8"
|
platforms: ${{ matrix.platform }}
|
||||||
file: ./docker/build_and_push_base.Dockerfile
|
file: ${{ matrix.file }}
|
||||||
tags: ${{ needs.setup.outputs.base_tags }}
|
tags: ${{ needs.setup.outputs.tags }}
|
||||||
|
|
||||||
build_components:
|
build_components:
|
||||||
if: ${{ inputs.release_type == 'main' }}
|
if: ${{ inputs.release_type == 'main' }}
|
||||||
|
|
|
||||||
2
.github/workflows/lint-js.yml
vendored
2
.github/workflows/lint-js.yml
vendored
|
|
@ -39,7 +39,7 @@ jobs:
|
||||||
if: ${{ steps.setup-node.outputs.cache-hit != 'true' }}
|
if: ${{ steps.setup-node.outputs.cache-hit != 'true' }}
|
||||||
|
|
||||||
- name: Run linters
|
- name: Run linters
|
||||||
uses: wearerequired/lint-action@v1
|
uses: wearerequired/lint-action@v2
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.github_token }}
|
github_token: ${{ secrets.github_token }}
|
||||||
auto_fix: true
|
auto_fix: true
|
||||||
|
|
|
||||||
2
.github/workflows/lint-py.yml
vendored
2
.github/workflows/lint-py.yml
vendored
|
|
@ -41,7 +41,7 @@ jobs:
|
||||||
./.mypy_cache
|
./.mypy_cache
|
||||||
key: ${{ runner.os }}-mypy-${{ hashFiles('**/pyproject.toml') }}
|
key: ${{ runner.os }}-mypy-${{ hashFiles('**/pyproject.toml') }}
|
||||||
- name: Run linters
|
- name: Run linters
|
||||||
uses: wearerequired/lint-action@v1
|
uses: wearerequired/lint-action@v2
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.github_token }}
|
github_token: ${{ secrets.github_token }}
|
||||||
# Enable linters
|
# Enable linters
|
||||||
|
|
|
||||||
|
|
@ -159,11 +159,11 @@ class CustomComponent(Component):
|
||||||
if self.repr_value == "":
|
if self.repr_value == "":
|
||||||
self.repr_value = self.status
|
self.repr_value = self.status
|
||||||
if isinstance(self.repr_value, dict):
|
if isinstance(self.repr_value, dict):
|
||||||
return yaml.dump(self.repr_value)
|
self.repr_value = yaml.dump(self.repr_value)
|
||||||
if isinstance(self.repr_value, str):
|
if isinstance(self.repr_value, BaseModel) and not isinstance(self.repr_value, Data):
|
||||||
return self.repr_value
|
self.repr_value = str(self.repr_value)
|
||||||
if isinstance(self.repr_value, BaseModel) and not isinstance(self.repr_value, Record):
|
elif hasattr(self.repr_value, "to_json"):
|
||||||
return str(self.repr_value)
|
self.repr_value = self.repr_value.to_json()
|
||||||
return self.repr_value
|
return self.repr_value
|
||||||
|
|
||||||
def build_config(self):
|
def build_config(self):
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ from langflow.initial_setup.setup import (
|
||||||
load_flows_from_directory,
|
load_flows_from_directory,
|
||||||
)
|
)
|
||||||
from langflow.interface.utils import setup_llm_caching
|
from langflow.interface.utils import setup_llm_caching
|
||||||
|
from langflow.services.deps import get_settings_service
|
||||||
from langflow.services.plugins.langfuse_plugin import LangfuseInstance
|
from langflow.services.plugins.langfuse_plugin import LangfuseInstance
|
||||||
from langflow.services.utils import initialize_services, teardown_services
|
from langflow.services.utils import initialize_services, teardown_services
|
||||||
from langflow.utils.logger import configure
|
from langflow.utils.logger import configure
|
||||||
|
|
@ -78,6 +79,7 @@ def create_app():
|
||||||
socketio_server = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*", logger=True)
|
socketio_server = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*", logger=True)
|
||||||
lifespan = get_lifespan(socketio_server=socketio_server, version=__version__)
|
lifespan = get_lifespan(socketio_server=socketio_server, version=__version__)
|
||||||
app = FastAPI(lifespan=lifespan, title="Langflow", version=__version__)
|
app = FastAPI(lifespan=lifespan, title="Langflow", version=__version__)
|
||||||
|
setup_sentry(app)
|
||||||
origins = ["*"]
|
origins = ["*"]
|
||||||
|
|
||||||
app.add_middleware(
|
app.add_middleware(
|
||||||
|
|
@ -115,6 +117,20 @@ def mount_socketio(app: FastAPI, socketio_server: socketio.AsyncServer):
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
def setup_sentry(app: FastAPI):
|
||||||
|
settings = get_settings_service().settings
|
||||||
|
if settings.sentry_dsn:
|
||||||
|
import sentry_sdk
|
||||||
|
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
|
||||||
|
|
||||||
|
sentry_sdk.init(
|
||||||
|
dsn=settings.sentry_dsn,
|
||||||
|
traces_sample_rate=settings.sentry_traces_sample_rate,
|
||||||
|
profiles_sample_rate=settings.sentry_profiles_sample_rate,
|
||||||
|
)
|
||||||
|
app.add_middleware(SentryAsgiMiddleware)
|
||||||
|
|
||||||
|
|
||||||
def setup_static_files(app: FastAPI, static_files_dir: Path):
|
def setup_static_files(app: FastAPI, static_files_dir: Path):
|
||||||
"""
|
"""
|
||||||
Setup the static files directory.
|
Setup the static files directory.
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,11 @@ class Settings(BaseSettings):
|
||||||
redis_url: Optional[str] = None
|
redis_url: Optional[str] = None
|
||||||
redis_cache_expire: int = 3600
|
redis_cache_expire: int = 3600
|
||||||
|
|
||||||
|
# Sentry
|
||||||
|
sentry_dsn: Optional[str] = None
|
||||||
|
sentry_traces_sample_rate: Optional[float] = 1.0
|
||||||
|
sentry_profiles_sample_rate: Optional[float] = 1.0
|
||||||
|
|
||||||
# PLUGIN_DIR: Optional[str] = None
|
# PLUGIN_DIR: Optional[str] = None
|
||||||
|
|
||||||
langfuse_secret_key: Optional[str] = None
|
langfuse_secret_key: Optional[str] = None
|
||||||
|
|
|
||||||
53
src/backend/base/poetry.lock
generated
53
src/backend/base/poetry.lock
generated
|
|
@ -2411,7 +2411,6 @@ files = [
|
||||||
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
|
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
|
||||||
{file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
|
{file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
|
||||||
{file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
|
{file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
|
||||||
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
|
|
||||||
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
|
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
|
||||||
{file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
|
{file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
|
||||||
{file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
|
{file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
|
||||||
|
|
@ -2499,6 +2498,56 @@ files = [
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pyasn1 = ">=0.1.3"
|
pyasn1 = ">=0.1.3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sentry-sdk"
|
||||||
|
version = "2.5.1"
|
||||||
|
description = "Python client for Sentry (https://sentry.io)"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
files = [
|
||||||
|
{file = "sentry_sdk-2.5.1-py2.py3-none-any.whl", hash = "sha256:1f87acdce4a43a523ae5aa21a3fc37522d73ebd9ec04b1dbf01aa3d173852def"},
|
||||||
|
{file = "sentry_sdk-2.5.1.tar.gz", hash = "sha256:fbc40a78a8a9c6675133031116144f0d0940376fa6e4e1acd5624c90b0aaf58b"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
certifi = "*"
|
||||||
|
urllib3 = ">=1.26.11"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
aiohttp = ["aiohttp (>=3.5)"]
|
||||||
|
anthropic = ["anthropic (>=0.16)"]
|
||||||
|
arq = ["arq (>=0.23)"]
|
||||||
|
asyncpg = ["asyncpg (>=0.23)"]
|
||||||
|
beam = ["apache-beam (>=2.12)"]
|
||||||
|
bottle = ["bottle (>=0.12.13)"]
|
||||||
|
celery = ["celery (>=3)"]
|
||||||
|
celery-redbeat = ["celery-redbeat (>=2)"]
|
||||||
|
chalice = ["chalice (>=1.16.0)"]
|
||||||
|
clickhouse-driver = ["clickhouse-driver (>=0.2.0)"]
|
||||||
|
django = ["django (>=1.8)"]
|
||||||
|
falcon = ["falcon (>=1.4)"]
|
||||||
|
fastapi = ["fastapi (>=0.79.0)"]
|
||||||
|
flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"]
|
||||||
|
grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"]
|
||||||
|
httpx = ["httpx (>=0.16.0)"]
|
||||||
|
huey = ["huey (>=2)"]
|
||||||
|
huggingface-hub = ["huggingface-hub (>=0.22)"]
|
||||||
|
langchain = ["langchain (>=0.0.210)"]
|
||||||
|
loguru = ["loguru (>=0.5)"]
|
||||||
|
openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"]
|
||||||
|
opentelemetry = ["opentelemetry-distro (>=0.35b0)"]
|
||||||
|
opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"]
|
||||||
|
pure-eval = ["asttokens", "executing", "pure-eval"]
|
||||||
|
pymongo = ["pymongo (>=3.1)"]
|
||||||
|
pyspark = ["pyspark (>=2.4.4)"]
|
||||||
|
quart = ["blinker (>=1.1)", "quart (>=0.16.1)"]
|
||||||
|
rq = ["rq (>=0.6)"]
|
||||||
|
sanic = ["sanic (>=0.8)"]
|
||||||
|
sqlalchemy = ["sqlalchemy (>=1.2)"]
|
||||||
|
starlette = ["starlette (>=0.19.1)"]
|
||||||
|
starlite = ["starlite (>=1.48)"]
|
||||||
|
tornado = ["tornado (>=5)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shellingham"
|
name = "shellingham"
|
||||||
version = "1.5.4"
|
version = "1.5.4"
|
||||||
|
|
@ -3247,4 +3296,4 @@ local = []
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = ">=3.10,<3.13"
|
python-versions = ">=3.10,<3.13"
|
||||||
content-hash = "3c83d086a178cebd83473758459c4f026907268dbf8c9ce45bc4bfb1f340e9a5"
|
content-hash = "72f05330f1e734596d160b45cb68ab2ebf7d0824314bec0566bddb5b2043f4e6"
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ cryptography = "^42.0.5"
|
||||||
asyncer = "^0.0.5"
|
asyncer = "^0.0.5"
|
||||||
pyperclip = "^1.8.2"
|
pyperclip = "^1.8.2"
|
||||||
uncurl = "^0.0.11"
|
uncurl = "^0.0.11"
|
||||||
|
sentry-sdk = "^2.5.1"
|
||||||
|
|
||||||
|
|
||||||
[tool.poetry.extras]
|
[tool.poetry.extras]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue