
Langflow 本地 API 示例测试基座详解make api_examples_local 的完整机制与实战【免费下载链接】langflowLangflow is a powerful tool for building and deploying AI-powered agents and workflows.项目地址: https://gitcode.com/GitHub_Trending/la/langflowLangflow 仓库内置了一个本地 API 示例测试基座local test harness能够一键拉起本地 Langflow 服务、自动完成登录与 API Key 创建、预置测试用项目/Flow然后对docs目录下的全部 curl / Python / JavaScript API 示例脚本做语法检查与真实执行。本文以 版本 1.11.0 的 API-Reference README 为核心结合 Makefile、scripts/test-api-examples-local.sh 及各示例目录中的 runner 脚本源码完整讲解该基座的用法、环境变量、执行流程与跳过策略读完你可以直接在本地验证所有官方 API 示例的可用性并理解其底层调度逻辑。基座定位验证 docs 中全部 API 示例脚本Langflow 的 API 文档docs/docs/API-Reference目录下按端点分组维护着三种语言的示例脚本curl-examples/按api-files/、api-flows/、api-flows-run/、api-logs/、api-monitor/、api-openai-responses/、api-projects/、api-users/、workflows-api/等子目录组织的.sh脚本以及入口 test-curl-examples.shpython-examples/同结构子目录的.py脚本入口为 test-python-examples.shjavascript-examples/.js脚本入口为 test-javascript-examples.sh。scripts/test-api-examples-local.sh 是这三套 runner 的总调度器它先自行启动一个临时 Langflow 后端再注入示例脚本所需的完整环境变量最后逐套执行。文档 README 中描述的正是这套机制。快速上手make api_examples_local按照版本 1.11.0 文档 README 的说明在仓库根目录执行# 运行全部示例套件curl python javascript make api_examples_local # 只运行单一套件 make api_examples_local suitespython make api_examples_local suitesjavascript make api_examples_local suitescurlMakefile 中对应的两个目标定义如下# Comma-separated list; override e.g. suitescurl,javascript,python suites ? curl,python,javascript api_examples_local: ## run docs API sample files against a local Langflow server echo $(GREEN)Running docs API examples locally...$(NC) SUITES$(suites) EXECUTE_MODEtrue ./scripts/test-api-examples-local.sh api_examples_local_syntax: ## syntax-check docs API sample files locally without execution echo $(GREEN)Running docs API example syntax checks locally...$(NC) SUITES$(suites) EXECUTE_MODEfalse ./scripts/test-api-examples-local.sh关键点suites变量是逗号分隔的列表默认值为curl,python,javascript可以任意组合例如suitescurl,javascriptMakefile 中的注释特别指出不能用 GNU make 的$(or ...)来写默认值因为它只返回第一个非空 token因此采用了?赋值。除了完整执行目标api_examples_localEXECUTE_MODEtrue还有一个只做语法检查、不实际执行的api_examples_local_syntaxEXECUTE_MODEfalse适合在没有网络凭据或不想真实调用 API 时快速校验示例脚本的可编译性。底层编排test-api-examples-local.sh 的完整流程调度脚本 scripts/test-api-examples-local.sh 是理解整个基座的核心其执行链条如下。环境变量与端口处理脚本开头定义并读取以下配置均有默认值均可通过环境覆盖变量默认值作用LANGFLOW_HOST127.0.0.1临时服务器绑定地址LANGFLOW_PORT7860临时服务器端口SUITEScurl,python,javascript要运行的示例套件EXECUTE_MODEtrue是否真实执行false时仅语法检查另外脚本会强制导出两个服务端开关见 第 12–15 行export LANGFLOW_AUTO_LOGIN${LANGFLOW_AUTO_LOGIN:-true} # /api/v2/workflows (docs Python workflow examples) requires this. export LANGFLOW_DEVELOPER_API_ENABLEDtrue其中LANGFLOW_DEVELOPER_API_ENABLEDtrue是必需的——workflows-api/下的 Python 示例会调用/api/v2/workflows而该端点受开发者 API 开关控制注释中特别强调始终在基座中开启以免用户级LANGFLOW_DEVELOPER_API_ENABLEDfalse打断测试。端口冲突处理是一个值得注意的细节脚本先通过port_is_in_use()用 socket 探测目标端口若被占用则用pick_free_port()让 OS 分配一个空闲端口继续运行并提示Port was in use; using ...。注释解释了动机——如果端口被占Langflow 可能会自动绑到PORT1而脚本仍按原端口发请求就会打到错误的服务器例如对/api/v2/workflows返回 403。启动服务器与就绪探测基座以纯后端模式启动临时服务器第 79 行LANGFLOW_DEVELOPER_API_ENABLEDtrue uv run langflow run --backend-only \ --host $HOST --port $PORT /tmp/langflow-server.log 21 echo $! /tmp/langflow-server.pid随后轮询GET /health_check等待就绪最多 60 次、每次间隔 2 秒约 2 分钟超时失败时提示查看/tmp/langflow-server.log。脚本注释中说明了一个易踩的坑/health端点由 uvicorn 在 Langflow 应用完全初始化之前就提供响应不能可靠判断服务健康因此就绪探测选用/health_check。脚本退出时通过trap cleanup EXIT终止服务器进程并清理 PID 文件。自动登录与 API Key 创建示例脚本调用大多数/v1端点需要 API Key。基座不要求用户手动配置而是用一段内嵌 Python 脚本自动完成第 101–153 行依次尝试GET /api/v1/auto_login因已开启LANGFLOW_AUTO_LOGIN或POST /api/v1/login默认超级用户langflow/langflow可用LANGFLOW_SUPERUSER/LANGFLOW_SUPERUSER_PASSWORD覆盖最多重试 8 次获取access_token携带Authorization: Bearer token调用POST /api/v1/api_key/创建一个名为local-docs-examples的 API Key将该 Key 导出为LANGFLOW_API_KEY同时导出LANGFLOW_URL与LANGFLOW_SERVER_URL两者指向http://$HOST:$PORT因为部分示例读取任一变量。脚本注释还提到一个并发陷阱此处刻意只通过 HTTP 创建 Key而不是起第二个进程直接连 SQLite——第二个进程在服务运行期间打开同一个 SQLite 数据库会导致 Alembic/initialize_services 阶段出现 database is locked。测试资源预置Bootstrap执行模式下基座还会预置一批示例脚本依赖的资源 ID第 164–255 行POST /api/v1/projects/创建一个随机命名的项目api-example-project-8位hex取回PROJECT_IDPOST /api/v1/flows/创建一个空 Flowdata: {nodes: [], edges: []}取回FLOW_IDPOST /api/v1/build/{flow_id}/flow触发构建取回JOB_IDGET /api/v1/projects/download/{project_id}导出项目 ZIP 到/tmp/langflow-project-import.zip若导出失败脚本注释称部分本地实例可能失败回退使用仓库内固定夹具 docs/docs/API-Reference/fixtures/project-import.zip。最终导出的环境变量为PROJECT_ID # 同时用于 FOLDER_ID很多示例在项目级路由中两者互换使用 FOLDER_ID # PROJECT_ID FLOW_ID JOB_ID PROJECT_IMPORT_FILE # ZIP 导入夹具路径这解释了各 runner 脚本中大量os.environ.get(FLOW_ID)类代码为何能开箱即用。套件分发脚本末尾按逗号拆分SUITES逐个分发到对应 runner第 263–283 行case $suite in curl) bash docs/docs/API-Reference/curl-examples/test-curl-examples.sh $EXAMPLE_MODE_ARGS ;; python) bash docs/docs/API-Reference/python-examples/test-python-examples.sh $EXAMPLE_MODE_ARGS ;; javascript) bash docs/docs/API-Reference/javascript-examples/test-javascript-examples.sh $EXAMPLE_MODE_ARGS ;; *) echo Unknown suite: $suite. Valid values: curl, python, javascript; exit 1 ;; esacEXAMPLE_MODE_ARGS在执行模式下为--execute语法检查模式下不传该参数。出现未知套件名会直接报错退出。各套件 runner 的检查与跳过逻辑三个 runner 都遵循先语法检查、后可选执行、输出 PASS/FAIL/SKIP 汇总的统一模式且执行模式都会先加载仓库根目录的.env如果存在。Python 套件test-python-examples.sh 的行为用rglob(*.py)收集目录下所有.py示例排除自身逐个执行python -m py_compile做语法检查执行模式下用signal.alarm实现单文件超时默认 45 秒可用PY_TIMEOUT_SECONDS覆盖命中特定文件名即跳过SKIP例如流式/长时运行的build-flow-and-stream-events-2.py、stream-llm-token-responses.py、example-streaming-request.py等retrieve-logs-with-optional-parameters.py因/logs端点在本地服务器未实现而跳过reset-password.py因在本地 SQLite 运行下可能返回 500 而跳过注释建议需要时手动运行若LANGFLOW_API_KEY及LANGFLOW_URL/LANGFLOW_SERVER_URL缺失跳过该文件并给出设置提示若脚本内容含占位符FILE_NAME、PATH/TO/FILE、file contents则跳过若脚本引用了FLOW_ID、PROJECT_ID、FOLDER_ID、SESSION_ID、JOB_ID、USER_ID等环境变量而未设置跳过。curl 套件test-curl-examples.sh 的逻辑类似先用bash -n做语法检查执行模式下跳过流式长时脚本example-stream-agui-*.sh、example-stream-langflow-request.sh同样检查LANGFLOW_API_KEY与LANGFLOW_URL/LANGFLOW_SERVER_URL并用正则检测脚本中引用但未设置的FLOW_ID等变量。失败时会打印 stdout/stderr 的最后 12 行辅助定位。汇总与退出码所有 runner 最终输出形如Summary: PASSxx FAILx SKIPx TOTALxx只要存在FAILrunner 即以退出码 1 结束set -euo pipefail使整个make api_examples_local相应失败因此该目标可以直接用作 CI 门禁。哪些示例不在本地基座中执行版本 1.11.0 文档 README 明确列出了本地基座不会执行的示例对应各 runner 的 SKIP 规则或需要额外配置的场景api-build/build-flow-and-stream-events-2.pyapi-build/build-flow-and-stream-events-3.pyapi-flows-run/stream-llm-token-responses.pyapi-openai-responses/example-streaming-request.pyapi-logs/stream-logs.pyapi-logs/retrieve-logs-with-optional-parameters.pyapi-users/reset-password.pyworkflows-api/example-quickstart-sync.py及对应.js/.sh同步模式读取output.textworkflows-api/example-quickstart-stream-tokens.py及对应.js/.sh流式模式打印token事件workflows-api/example-quickstart-background-poll.py及对应.js/.sh后台队列并轮询至完成workflows-api/example-stream-agui-parse.py及对应.js/.sh解析 AG-UI 事件并串联两次运行从源码结构看这些 SKIP 的原因可归为三类流式/长时运行本地易挂起或结果不稳定、依赖本地未实现的端点如/logs、以及本地 SQLite 环境的已知不稳定行为如reset-password可能 500。这些示例仍保留在文档目录中供读者在具备相应条件的部署上手动验证。排障要点综合调度脚本与各 runner 的实现本地运行make api_examples_local遇到问题时可按以下线索排查服务器日志基座启动的服务器日志固定写入/tmp/langflow-server.logrunner 单文件执行输出写入/tmp/langflow-python-example.out、/tmp/langflow-python-example.errcurl 套件对应/tmp/langflow-curl-example.*FAIL 时 runner 已自动打印末尾 12 行端口占用若LANGFLOW_PORT默认 7860被占基座会自动换用空闲端口并在输出中提示若需要固定端口可显式设置LANGFLOW_PORT认证失败基座依赖LANGFLOW_AUTO_LOGINtrue或超级用户凭据LANGFLOW_SUPERUSER/LANGFLOW_SUPERUSER_PASSWORD默认均为langflow登录登录最多重试 8 次仅做语法检查只想校验脚本可编译性、不真实调用 API 时使用make api_examples_local_syntax等价于EXECUTE_MODEfalse此时无需LANGFLOW_API_KEY等资源变量示例引用的固定资源 ID执行模式依赖基座导出的PROJECT_ID/FLOW_ID/FOLDER_ID/JOB_ID/PROJECT_IMPORT_FILE如果你绕过 Makefile 直接运行单个 runner需要自行准备这些变量否则相应示例会被 SKIP。小结make api_examples_local背后的是一套自举式验证设施scripts/test-api-examples-local.sh 负责起服、探测就绪、自动登录签发 API Key、创建项目/Flow 预置资源 ID再由 curl、Python、JavaScript 三个 runner 对docs/docs/API-Reference/下的示例做语法检查与受控执行含超时、SKIP 白名单与统一汇总。这一机制既保证了文档中的 API 示例与真实后端保持同步可运行也为贡献者在改动 API 端点后提供了现成的回归验证手段——运行make api_examples_local suitescurl,python,javascript即可复现文档 README 描述的全量本地验证。【免费下载链接】langflowLangflow is a powerful tool for building and deploying AI-powered agents and workflows.项目地址: https://gitcode.com/GitHub_Trending/la/langflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考