Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: change DirectoryComponent to filter file paths by types #2391

Merged
merged 16 commits into from
Jul 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions .github/workflows/typescript_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,6 @@ jobs:
if: failure()
run: echo "failed=true" >> "$GITHUB_OUTPUT"



- name: Upload blob report to GitHub Actions Artifacts
if: always()
uses: actions/upload-artifact@v4
Expand All @@ -127,12 +125,10 @@ jobs:
path: src/frontend/blob-report
retention-days: 1



merge-reports:
needs: setup-and-test
runs-on: ubuntu-latest
if : ${{ needs.setup-and-test.outputs.failed != 'true' }}
if : ${{ needs.setup-and-test.outputs.failed == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand All @@ -159,3 +155,11 @@ jobs:
name: html-report--attempt-${{ github.run_attempt }}
path: playwright-report
retention-days: 14
delete-reports:
needs: setup-and-test
runs-on: ubuntu-latest
if : ${{ needs.setup-and-test.outputs.failed != 'true' }}
steps:
- uses: geekyeggo/delete-artifact@v5
with:
name: blob-report-*
41 changes: 31 additions & 10 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 0 additions & 7 deletions src/backend/base/langflow/api/v1/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,6 @@ async def retrieve_vertices_order(
first_layer = graph.sort_vertices()
else:
first_layer = graph.sort_vertices()
# When we send vertices to the frontend
# we need to remove them from the predecessors
# so they are not considered for building again
# which duplicates the results
for vertex_id in first_layer:
graph.remove_from_predecessors(vertex_id)
graph.remove_vertex_from_runnables(vertex_id)

# Now vertices is a list of lists
# We need to get the id of each vertex
Expand Down
12 changes: 9 additions & 3 deletions src/backend/base/langflow/components/data/Directory.py
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The component is wrong I think. The types field should be a list field. That's why the self.types requires a call to split but shouldn't.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ogabrielluiz Please verify the corrections applied.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List

from langflow.base.data.utils import parallel_load_data, parse_text_file_to_data, retrieve_file_paths
from langflow.custom import Component
Expand All @@ -23,6 +23,7 @@ class DirectoryComponent(Component):
name="types",
display_name="Types",
info="File types to load. Leave empty to load all types.",
is_list=True,
),
IntInput(
name="depth",
Expand Down Expand Up @@ -67,8 +68,9 @@ class DirectoryComponent(Component):
Output(display_name="Data", name="data", method="load_directory"),
]

def load_directory(self) -> List[Optional[Data]]:
def load_directory(self) -> List[Data]:
path = self.path
types = self.types or [] # self.types is already a list due to is_list=True
depth = self.depth
max_concurrency = self.max_concurrency
load_hidden = self.load_hidden
Expand All @@ -78,6 +80,10 @@ def load_directory(self) -> List[Optional[Data]]:

resolved_path = self.resolve_path(path)
file_paths = retrieve_file_paths(resolved_path, load_hidden, recursive, depth)

if types:
file_paths = [fp for fp in file_paths if any(fp.endswith(ext) for ext in types)]

loaded_data = []

if use_multithreading:
Expand All @@ -86,4 +92,4 @@ def load_directory(self) -> List[Optional[Data]]:
loaded_data = [parse_text_file_to_data(file_path, silent_errors) for file_path in file_paths]
loaded_data = list(filter(None, loaded_data))
self.status = loaded_data
return loaded_data
return loaded_data # type: ignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ async def get_next_runnable_vertices(

"""
async with lock:
self.remove_from_predecessors(vertex.id)
self.remove_vertex_from_runnables(vertex.id)
direct_successors_ready = [
v for v in vertex.successors_ids if self.is_vertex_runnable(v, graph.inactivated_vertices)
]
Expand Down
20 changes: 20 additions & 0 deletions src/backend/base/langflow/main.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
import asyncio
import warnings
from contextlib import asynccontextmanager
Expand All @@ -14,6 +15,7 @@
from pydantic import PydanticDeprecatedSince20
from rich import print as rprint
from starlette.middleware.base import BaseHTTPMiddleware
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor

from langflow.api import router, health_check_router
from langflow.initial_setup.setup import (
Expand Down Expand Up @@ -137,9 +139,27 @@ async def flatten_query_string_lists(request: Request, call_next):

return await call_next(request)

settings = get_settings_service().settings
if prome_port_str := os.environ.get("LANGFLOW_PROMETHEUS_PORT"):
# set here for create_app() entry point
prome_port = int(prome_port_str)
if prome_port > 0 or prome_port < 65535:
rprint(f"[bold green]Starting Prometheus server on port {prome_port}...[/bold green]")
settings.prometheus_enabled = True
settings.prometheus_port = prome_port
else:
raise ValueError(f"Invalid port number {prome_port_str}")

if settings.prometheus_enabled:
from prometheus_client import start_http_server

start_http_server(settings.prometheus_port)

app.include_router(router)
app.include_router(health_check_router)

FastAPIInstrumentor.instrument_app(app)

return app


Expand Down
5 changes: 5 additions & 0 deletions src/backend/base/langflow/services/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ class Settings(BaseSettings):
variable_store: str = "db"
"""The store can be 'db' or 'kubernetes'."""

prometheus_enabled: bool = False
"""If set to True, Langflow will expose Prometheus metrics."""
prometheus_port: int = 9090
"""The port on which Langflow will expose Prometheus metrics. 9090 is the default port."""

remove_api_keys: bool = False
components_path: List[str] = []
langchain_cache: str = "InMemoryCache"
Expand Down
30 changes: 30 additions & 0 deletions src/backend/base/langflow/services/telemetry/opentelemetry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from opentelemetry import metrics
from opentelemetry.exporter.prometheus import PrometheusMetricReader
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.resources import Resource


class OpenTelemetry:
def __init__(self, prometheus_enabled: bool = True):
resource = Resource.create({"service.name": "langflow"})
meter_provider = MeterProvider(resource=resource)
self.prometheus_enabled = prometheus_enabled
if prometheus_enabled:
reader = PrometheusMetricReader()
meter_provider = MeterProvider(resource=resource, metric_readers=[reader])

metrics.set_meter_provider(meter_provider)
self.meter = meter_provider.get_meter("langflow")

self._register_metrics()

def _register_metrics(self):
pass
"""
metrics can be registered in this function
self.counter = self.meter.create_counter(
name = "requests",
unit = "bytes",
description="The number of requests",
)
"""
3 changes: 3 additions & 0 deletions src/backend/base/langflow/services/telemetry/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import httpx
from loguru import logger
from pydantic import BaseModel
from langflow.services.telemetry.opentelemetry import OpenTelemetry

from langflow.services.base import Service
from langflow.services.telemetry.schema import (
Expand Down Expand Up @@ -35,6 +36,8 @@ def __init__(self, settings_service: "SettingsService"):
self.running = False
self.package = get_version_info()["package"]

self.ot = OpenTelemetry(prometheus_enabled=settings_service.settings.prometheus_enabled)

# Check for do-not-track settings
self.do_not_track = (
os.getenv("DO_NOT_TRACK", "False").lower() == "true" or settings_service.settings.do_not_track
Expand Down
Loading