容器化 Langflow 应用程序
此处显示的所有命令都可以使用 Podman 代替 Docker。欲了解更多信息,请参阅 Podman 文档。
在可视化编辑器中设计工作流只是构建使用 Langflow 的应用程序的第一步。
一旦你拥有一个功能完备的工作流,你就可以在更大的应用程序(如网站或移动应用)中使用该流。由于 Langflow 既是 IDE 又是运行时,你可以使用 Langflow 在本地构建和测试工作流,然后在生产环境中打包并提供服务。
本指南介绍了从初始设置到打包部署的 Langflow 应用开发。本文档不解释如何编写完整的应用程序;它仅描述如何在大型应用程序的上下文中包含 Langflow。
目录结构
以下示例描述了一个最小化 Langflow 应用的目录结构
_10LANGFLOW-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.toml 和 uv.lock 文件复制到 Docker 镜像中。为此,请在 Langflow 应用的 Dockerfile 中添加以下内容
_10COPY pyproject.toml uv.lock /app/
环境变量
docker.env 文件是加载到 Docker 镜像中的 .env 文件。它包含用于工作流或控制 Langflow 行为的 Langflow 环境变量,例如身份验证、数据库存储、API 密钥和服务器配置。例如:
_10LANGFLOW_AUTO_LOGIN=True_10LANGFLOW_SAVE_DB_IN_CONFIG_DIR=True_10LANGFLOW_BASE_URL=http://0.0.0.0:7860_10OPENAI_API_KEY=sk-...
你也可以在 Dockerfile 中设置环境变量。但是,如果你同时在 docker.env 和 Dockerfile 中设置了同一个环境变量,Langflow 将使用 docker.env 中设置的值。
Langflow 还可以根据你的环境变量创建全局变量,或者使用环境变量作为缺失全局变量的备选方案。
密钥(Secrets)
为了简单起见,Langflow 文档中的示例可能会直接引用 API 密钥和其他敏感值。在你自己的应用中,你应该始终遵循管理密钥的行业最佳实践,例如使用环境变量或密钥管理工具。
有关在 Langflow 中生成身份验证密钥和管理密钥的信息,请参阅API 密钥和身份验证。
存储
默认情况下,Langflow 使用 SQLite 数据库进行存储。如果你希望使用 PostgreSQL,请参阅配置外部 PostgreSQL 数据库。
有关存储(包括缓存和内存)的更多信息,请参阅内存管理选项。
工作流 (Flows)
你的本地 Langflow 实例可能拥有许多用于不同应用的工作流。当你将 Langflow 打包为应用的依赖项时,你只想包含应用实际使用的流。
-
导出与你的应用相关的工作流。
如果你有链式流(触发其他流的流),请确保导出*所有*必要的流。
-
将导出的 Langflow JSON 文件添加到应用目录中的
/flows文件夹下。
组件
你在 核心组件 (Core components) 和 Langflow 可视化编辑器中看到的**捆绑组件 (Bundles)** 已自动包含在基础 Langflow Docker 镜像中。
如果你的应用有自定义组件,请将它们包含在你的应用目录中。自定义组件必须放在类别文件夹内,而不是直接放在基目录中:
-
在应用目录中创建一个
/components文件夹。 -
在
/components内部,创建类别子文件夹(例如/components/data,/components/tools)。 -
将你的自定义组件文件添加到相应的类别文件夹中。
-
将
/components文件夹复制到你的 Docker 镜像并设置LANGFLOW_COMPONENTS_PATH环境变量:_10COPY components /app/components_10ENV LANGFLOW_COMPONENTS_PATH=/app/components
Langflow Dockerfile
Dockerfile 决定了 Langflow 镜像的构建方式,包括依赖项、工作流、组件和配置文件。
至少,你需要指定基础 Langflow 镜像、在容器中创建必要的文件夹、将文件夹和文件复制到容器,并提供启动命令。
_29# 使用最新版本的基础 Langflow 镜像_29FROM langflowai/langflow:latest_29_29# 在容器中创建文件夹并设置工作目录_29RUN mkdir /app/flows_29RUN mkdir /app/langflow-config-dir_29WORKDIR /app_29_29# 将工作流、配置目录和 docker.env 复制到容器_29COPY flows /app/flows_29COPY langflow-config-dir /app/langflow-config-dir_29COPY docker.env /app/.env_29_29# 可选:将自定义组件复制到容器_29COPY components /app/components_29_29# 可选:使用自定义依赖项_29COPY pyproject.toml uv.lock /app/_29_29# 如果在 docker.env 中未设置,则设置环境变量_29ENV PYTHONPATH=/app_29ENV LANGFLOW_LOAD_FLOWS_PATH=/app/flows_29ENV LANGFLOW_CONFIG_DIR=/app/langflow-config-dir_29ENV LANGFLOW_COMPONENTS_PATH=/app/components_29ENV LANGFLOW_LOG_ENV=container_29_29# 暴露 7860 端口运行 Langflow 服务器_29EXPOSE 7860_29CMD ["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。
-
构建 Docker 镜像
_10docker build -t langflow-pokedex:1.2.0 . -
运行 Docker 容器以启动 Langflow 服务器
_10docker run -p 7860:7860 langflow-pokedex:1.2.0 -
要确认容器是否按预期提供流服务,请使用 Langflow API 运行一个流
-
打开应用
/flows文件夹中的一个 JSON 文件,然后在附加元数据和项目信息中找到该流的id。这里有很多
id值;请确保获取的是整个工作流的 ID,而不是单个组件的 ID。如果你的流很复杂,请尝试搜索流的名称,它通常位于流的id附近。_10"name": "基础提示",_10"description": "使用 OpenAI 模型执行基础提示词工程。",_10"id": "e4167236-938f-4aca-845b-21de3f399858", -
使用上一步中的流 ID 向
/v1/run/$FLOW_ID端点发送 POST 请求。以下示例运行一个响应聊天输入字符串的简单 LLM 聊天流。如有必要,请根据你的流修改 Payload。例如,如果你的流没有 **Chat Input** 组件,你必须修改 Payload 以提供流所需的预期输入。
_10curl --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。 -
根据你运行的具体流,验证请求是否成功以及响应是否有效。
这确认了你的 Langflow Docker 镜像已正确配置,并且该流可以通过容器上托管的 Langflow API 服务器访问。当你构建和测试整个应用栈时,你的前端应用可以使用 Langflow API 请求来触发 Langflow 容器提供的流,方式与你刚才手动测试流的方式相同。
此示例通过向
/v1/run/$FLOW_ID端点发送聊天输入来触发流。有关流触发器的更多示例,请参阅使用 Webhook 触发流和创建可以摄取文件的聊天机器人教程。
-
部署到 Docker Hub 和 Kubernetes
当你准备好向世界分享你的应用时,你需要在生产环境中提供 Langflow 服务。有关部署 Langflow 的更多信息,请参阅以下内容