跳到主要内容

容器化 Langflow 应用程序

提示

Podman can be used instead of Docker for all commands shown here. For more information, see the Podman documentation.

在可视化编辑器中设计工作流只是构建使用 Langflow 的应用程序的第一步。

一旦您拥有了一个功能齐全的工作流,您就可以在更大的应用程序中使用该工作流,例如网站或移动应用程序。 因为 Langflow 既是 IDE 又是运行时,所以您可以使用 Langflow 在本地构建和测试您的工作流,然后在生产环境中打包并提供您的工作流服务。

本指南介绍了使用 Langflow 进行应用程序开发的过程,从初始设置到打包和部署。 本文档不解释如何编写一个完整的应用程序;它仅描述如何在更大应用程序的上下文中包含 Langflow。

目录结构

以下示例描述了一个最小化 Langflow 应用程序的目录结构:


_10
LANGFLOW-APPLICATION/
_10
├── docker.env
_10
├── Dockerfile
_10
├── flows/
_10
│ ├── flow1.json
_10
│ └── flow2.json
_10
├── langflow-config-dir/
_10
├── README.md

该目录包含以下内容:

  • docker.env:此文件作为容器根目录中的 .env 文件复制到 Docker 镜像中。
  • Dockerfile:此文件控制 Langflow 镜像的构建方式。
  • /flows:此文件夹存放您想要托管的工作流,即您的应用程序使用的工作流。
  • /langflow-config-dir:Dockerfile 中引用的此文件夹是您的 Langflow 部署的配置文件、数据库和日志的存放位置。
  • README.md:这是您应用程序文档的典型 README 文件。

这是一个最小化 Langflow 应用程序目录的示例。 您的应用程序可能还有其他文件和文件夹,例如用于自定义组件的 /components 文件夹,或用于其他依赖项的 pyproject.toml 文件。

包管理

基础 Langflow Docker 镜像包含了 Langflow 核心依赖项,因为它使用 langflowai/langflow:latest 作为父镜像。

如果您的应用程序需要额外的依赖项,请为这些额外的依赖项创建一个 pyproject.toml 文件。 更多信息请参见安装自定义依赖项

要将具有额外依赖项的应用程序部署到 Docker,您必须将 pyproject.tomluv.lock 文件复制到 Docker 镜像中。 为此,请在 Langflow 应用程序的 Dockerfile 中添加以下内容:


_10
COPY pyproject.toml uv.lock /app/

环境变量

docker.env 文件是加载到 Docker 镜像中的 .env 文件。 它包含在工作流中使用的或控制 Langflow 行为的 Langflow 环境变量,例如身份验证、数据库存储、API 密钥和服务器配置。 例如:


_10
LANGFLOW_AUTO_LOGIN=True
_10
LANGFLOW_SAVE_DB_IN_CONFIG_DIR=True
_10
LANGFLOW_BASE_URL=http://0.0.0.0:7860
_10
OPENAI_API_KEY=sk-...

您也可以在 Dockerfile 中设置环境变量。 但是,如果您在 docker.env 和 Dockerfile 中都设置了同一个环境变量,Langflow 会使用 docker.env 中设置的值。

Langflow 还可以从您的环境变量创建全局变量,或者在缺少全局变量时使用环境变量作为备份

密钥管理

为了简单起见,Langflow 文档中的示例可能会直接引用 API 密钥和其他敏感值。 在您自己的应用程序中,您应该始终遵循管理密钥的行业最佳实践,例如使用环境变量或密钥管理工具。

有关在 Langflow 中生成身份验证密钥和管理密钥的信息,请参见 API 密钥和身份验证

存储

默认情况下,Langflow 使用 SQLite 数据库进行存储。 如果您更喜欢使用 PostgreSQL,请参见配置外部 PostgreSQL 数据库

有关存储(包括缓存和内存)的更多信息,请参见内存管理选项

工作流

您的本地 Langflow 实例可能拥有许多用于不同应用程序的工作流。 当您将 Langflow 打包为应用程序的依赖项时,您只需包含您的应用程序使用的工作流。

  1. 导出工作流 与您的应用程序相关的工作流。

    如果您有链式工作流(触发其他工作流的工作流),请确保导出所有必要的工作流。

  2. 将导出的 Langflow JSON 文件添加到应用程序目录中的 /flows 文件夹中。

组件

您在 Langflow 可视化编辑器中看到的 核心组件 [Bundles] 会自动包含在基础 Langflow Docker 镜像中。

如果您有任何为您应用程序创建的 自定义组件,您必须将这些组件包含在您的应用程序目录中:

  1. 在您的应用程序目录中创建一个 /components 文件夹。
  2. 将您的自定义组件文件添加到 /components 文件夹。
  3. 在您的 docker.env 中指定 /components 的路径。

Langflow Dockerfile

Dockerfile 决定了您的 Langflow 镜像如何构建,包括依赖项、工作流、组件和配置文件。

至少,您需要指定基础 Langflow 镜像,在容器中创建必要的文件夹,将文件夹和文件复制到容器中,并提供启动命令。


_29
# 使用最新版本的基础 Langflow 镜像
_29
FROM langflowai/langflow:latest
_29
_29
# 在容器中创建文件夹并设置工作目录
_29
RUN mkdir /app/flows
_29
RUN mkdir /app/langflow-config-dir
_29
WORKDIR /app
_29
_29
# 将工作流、langflow-config-dir 和 docker.env 复制到容器中
_29
COPY flows /app/flows
_29
COPY langflow-config-dir /app/langflow-config-dir
_29
COPY docker.env /app/.env
_29
_29
# 可选:将自定义组件复制到容器中
_29
COPY components /app/components
_29
_29
# 可选:使用自定义依赖项
_29
COPY pyproject.toml uv.lock /app/
_29
_29
# 如果在 docker.env 中未设置,则设置环境变量
_29
ENV PYTHONPATH=/app
_29
ENV LANGFLOW_LOAD_FLOWS_PATH=/app/flows
_29
ENV LANGFLOW_CONFIG_DIR=/app/langflow-config-dir
_29
ENV LANGFLOW_COMPONENTS_PATH=/app/components
_29
ENV LANGFLOW_LOG_ENV=container
_29
_29
# 运行 Langflow 服务器的命令,监听 7860 端口
_29
EXPOSE 7860
_29
CMD ["langflow", "run", "--backend-only", "--env-file","/app/.env","--host", "0.0.0.0", "--port", "7860"]

在此 Dockerfile 中直接设置的环境变量指定了 Langflow 的资源路径。 如果这些变量也在 docker.env 中设置了,则 docker.env 中的值将覆盖 Dockerfile 中设置的值。

在此示例中,ENV LANGFLOW_LOG_ENV=container 将序列化 JSON 的日志记录行为设置为 stdout,以便在容器化环境中跟踪应用程序的行为。更多信息请参见日志记录

仅后端模式

CMD 中的 --backend-only 标志以仅后端模式启动 Langflow,这仅提供编程访问。 当将 Langflow 作为不需要访问可视化编辑器的应用程序依赖项运行时,推荐使用此模式。

如果您想同时提供 Langflow 可视化编辑器后端服务,请省略 --backend-only

更多信息请参见在 Docker 上部署 Langflow

测试您的 Langflow Docker 镜像

构建并运行您的 Langflow Docker 镜像进行测试。

此示例在本地运行容器。 有关在 Docker Hub 上发布镜像并远程运行 Langflow 容器的信息,请参见部署到 Docker Hub 和 Kubernetes

  1. 构建 Docker 镜像:


    _10
    docker build -t langflow-pokedex:1.2.0 .

  2. 运行 Docker 容器以启动您的 Langflow 服务器:


    _10
    docker run -p 7860:7860 langflow-pokedex:1.2.0

  3. 要确认容器是否如预期提供工作流服务,请使用 Langflow API 运行工作流:

    1. 打开应用程序 /flows 文件夹中的一个 JSON 文件,然后在 附加元数据和项目信息 中找到该工作流的 id

      会有许多 id 值;请确保获取的是整个工作流的 ID,而不是单个组件的 ID。 如果您的工作流很复杂,请尝试搜索工作流的名称,它通常位于工作流 id 附近。


      _10
      "name": "Basic Prompting",
      _10
      "description": "Perform basic prompting with an OpenAI model.",
      _10
      "id": "e4167236-938f-4aca-845b-21de3f399858",

    2. 使用上一步中的工作流 ID 向 /v1/run/$FLOW_ID 端点发送 POST 请求。

      以下示例运行一个简单的 LLM 聊天工作流,该工作流响应聊天输入字符串。 如有必要,请根据您的工作流修改 payload。 例如,如果您的工作流没有 Chat Input 组件,您必须修改 payload 以提供工作流所需的输入。


      _10
      curl --request POST \
      _10
      --url 'http://localhost:7860/api/v1/run/e4167236-938f-4aca-845b-21de3f399858?stream=true' \
      _10
      --header 'Content-Type: application/json' \
      _10
      --data '{
      _10
      "input_value": "Tell me about Charizard.",
      _10
      "output_type": "chat",
      _10
      "input_type": "chat",
      _10
      "session_id": "charizard_test_request"
      _10
      }'

      关于此示例

      此命令运行 Pokédex 模板工作流。 它提供有关特定宝可梦的聊天输入,使用可选的自定义 session_id,并通过 ?stream=true 启用响应流。

      默认的 会话 ID 是工作流 ID。 自定义会话 ID 可以帮助隔离唯一的对话线程,以保持 LLM 上下文的整洁,并可以帮助在工作流日志中识别特定对话,从而使调试更容易。

      此命令使用响应流,因为 Pokédex 工作流可能会返回大量文本。 要使用批处理,请设置 ?stream=false

    3. 验证请求是否成功以及响应是否有效,具体取决于您运行的特定工作流。

      这确认了您的 Langflow Docker 镜像已正确配置,并且可以通过托管在容器上的 Langflow API 服务器访问此工作流。 当您构建和测试整个应用程序堆栈时,您的前端应用程序可以使用 Langflow API 请求来触发 Langflow 容器提供的工作流,方式与您在上一步中手动测试工作流的方式相同。

      此示例通过向 /v1/run/$FLOW_ID 端点发送聊天输入来触发工作流。 有关触发工作流的更多示例,请参见使用 Webhooks 触发工作流创建一个可以摄取文件的聊天机器人教程。

部署到 Docker Hub 和 Kubernetes

当您准备好向世界分享您的应用程序时,您需要在生产环境中提供 Langflow 服务。 有关部署 Langflow 的更多信息,请参见以下内容:

Search