跳到主要内容

容器化 Langflow 应用程序

提示

此处显示的所有命令都可以使用 Podman 代替 Docker。欲了解更多信息,请参阅 Podman 文档

在可视化编辑器中设计工作流只是构建使用 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 还可以根据你的环境变量创建全局变量,或者使用环境变量作为缺失全局变量的备选方案

密钥(Secrets)

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

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

存储

默认情况下,Langflow 使用 SQLite 数据库进行存储。如果你希望使用 PostgreSQL,请参阅配置外部 PostgreSQL 数据库

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

工作流 (Flows)

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

  1. 导出与你的应用相关的工作流。

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

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

组件

你在 核心组件 (Core components) Langflow 可视化编辑器中看到的**捆绑组件 (Bundles)** 已自动包含在基础 Langflow Docker 镜像中。

如果你的应用有自定义组件,请将它们包含在你的应用目录中。自定义组件必须放在类别文件夹内,而不是直接放在基目录中:

  1. 在应用目录中创建一个 /components 文件夹。

  2. /components 内部,创建类别子文件夹(例如 /components/data/components/tools)。

  3. 将你的自定义组件文件添加到相应的类别文件夹中。

  4. /components 文件夹复制到你的 Docker 镜像并设置 LANGFLOW_COMPONENTS_PATH 环境变量:


    _10
    COPY components /app/components
    _10
    ENV LANGFLOW_COMPONENTS_PATH=/app/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
# 将工作流、配置目录和 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
# 暴露 7860 端口运行 Langflow 服务器
_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,以便在容器化环境中跟踪应用程序的行为。欲了解更多信息,请参阅日志记录

仅后端模式 (Backend-only mode)

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": "基础提示",
      _10
      "description": "使用 OpenAI 模型执行基础提示词工程。",
      _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 'https://: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 端点发送聊天输入来触发流。有关流触发器的更多示例,请参阅使用 Webhook 触发流创建可以摄取文件的聊天机器人教程。

部署到 Docker Hub 和 Kubernetes

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

Search