快速入门
通过加载模板流程、运行它,然后在 /run
API 端点上提供服务,开始使用 Langflow。
前提条件
-
创建 Langflow API 密钥
Langflow API 密钥是您可以与 Langflow 一起使用的用户特定令牌。
要创建 Langflow API 密钥,请执行以下操作:
-
在 Langflow 中,点击您的用户图标,然后选择 设置。
-
点击 Langflow API 密钥,然后点击 添加新。
-
为您的密钥命名,然后点击 创建 API 密钥。
-
Replicate API 密钥并安全存储。
-
要在请求中使用您的 Langflow API 密钥,请在终端中设置
LANGFLOW_API_KEY
环境变量,然后在请求中包含一个x-api-key
头部或查询参数。 例如:_13# 设置变量_13export LANGFLOW_API_KEY="sk..."_13_13# 发送请求_13curl --request POST \_13--url "http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID" \_13--header "Content-Type: application/json" \_13--header "x-api-key: $LANGFLOW_API_KEY" \_13--data '{_13"output_type": "chat",_13"input_type": "chat",_13"input_value": "Hello"_13}'
-
运行简单代理模板流程
- 在 Langflow 中,点击 新建流程,然后选择 简单代理 模板。
简单代理 模板由一个 代理 组件 连接到 聊天输入 和 聊天输出 组件,一个 计算器 组件,和一个 URL 组件 组成。当您运行此流程时,您通过 聊天输入 组件向代理提交查询,代理使用 计算器 和 URL 工具生成响应,然后通过 聊天输出 组件返回响应。
许多组件都可以作为代理的工具,包括 模型上下文协议 (MCP) 服务器。代理根据给定查询的上下文决定调用哪些工具。
-
在 代理 组件中,直接输入您的 OpenAI API 密钥,或点击 全局 来创建一个 全局变量。
本指南使用 OpenAI 模型进行演示。如果您想使用其他提供商,请更改 模型提供商 和 模型名称 字段,然后为您选择的提供商提供凭据。
-
要运行流程,点击 游乐场。
-
要测试 计算器 工具,向代理询问一个简单的数学问题,例如
我想把 4 和 4 相加。
为了帮助您测试和评估流程,游乐场 显示代理的推理过程,包括它分析提示、选择工具,然后使用工具生成响应。 在这种情况下,数学问题导致代理选择 计算器 工具并使用类似evaluate_expression
的操作。
-
要测试 URL 工具,向代理询问当前事件。 对于此请求,代理选择 URL 工具的
fetch_content
操作,然后返回当前新闻标题的摘要。 -
完成流程测试后,点击 关闭。
既然您已经运行了第一个流程,请尝试以下下一步:
- 通过附加不同的工具或向流程添加更多 组件 来编辑您的 简单代理 流程。
- 从头开始或修改其他模板流程来 构建您自己的流程。
- 将流程集成到您的应用程序中,如 从外部应用程序运行您的流程 中所述。
从外部应用程序运行您的流程
Langflow 是一个 IDE,但也是一个运行时,您可以通过 Langflow API 使用 Python、JavaScript 或 HTTP 调用它。
当您在本地启动 Langflow 时,可以向本地 Langflow 服务器发送请求。 对于生产应用程序,您需要部署一个稳定的 Langflow 实例来处理 API 调用。
例如,您可以使用 /run
端点运行流程并获取结果。
Langflow 提供代码片段帮助您开始使用 Langflow API。
-
编辑流程时,点击 Share,然后点击 API access。
API 访问面板中的默认代码会使用 Langflow 服务器的
url
、headers
和请求数据的payload
构造请求。 代码片段会自动包含该流程的LANGFLOW_SERVER_ADDRESS
和FLOW_ID
值,以及一个包含您LANGFLOW_API_KEY
的脚本(如果您已在终端会话中将其设置为环境变量)。 如果您使用代码连接到不同的服务器或流程,请替换这些值。 默认的 Langflow 服务器地址是http://localhost:7860
。- Python
- JavaScript
- curl
_29import requests_29_29url = "http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID" # 此流程的完整 API 端点 URL_29_29# 请求负载配置_29payload = {_29"output_type": "chat",_29"input_type": "chat",_29"input_value": "hello world!"_29}_29_29# 请求头_29headers = {_29"Content-Type": "application/json",_29"x-api-key": "$LANGFLOW_API_KEY"_29}_29_29try:_29# 发送 API 请求_29response = requests.request("POST", url, json=payload, headers=headers)_29response.raise_for_status() # 对错误状态码引发异常_29_29# 打印响应_29print(response.text)_29_29except requests.exceptions.RequestException as e:_29print(f"Error making API request: {e}")_29except ValueError as e:_29print(f"Error parsing response: {e}")_20const payload = {_20"output_type": "chat",_20"input_type": "chat",_20"input_value": "hello world!",_20"session_id": "user_1"_20};_20_20const options = {_20method: 'POST',_20headers: {_20'Content-Type': 'application/json',_20'x-api-key': 'LANGFLOW_API_KEY'_20},_20body: JSON.stringify(payload)_20};_20_20fetch('http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID', options)_20.then(response => response.json())_20.then(response => console.log(response))_20.catch(err => console.error(err));_11curl --request POST \_11--url 'http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID?stream=false' \_11--header 'Content-Type: application/json' \_11--header "x-api-key: LANGFLOW_API_KEY" \_11--data '{_11"output_type": "chat",_11"input_type": "chat",_11"input_value": "hello world!"_11}'_11_11# 200 响应确认调用成功。 -
Replicate代码片段,将其粘贴到脚本文件中,然后运行该脚本以发送请求。 如果您使用的是 curl 代码片段,可以直接在终端中运行该命令。
如果请求成功,响应将包含有关流程运行的许多详细信息,包括会话 ID、输入、输出、组件、持续时间等。 以下是运行 Simple Agent 模板流程的响应 示例:
结果
_163{_163 "session_id": "29deb764-af3f-4d7d-94a0-47491ed241d6",_163 "outputs": [_163 {_163 "inputs": {_163 "input_value": "hello world!"_163 },_163 "outputs": [_163 {_163 "results": {_163 "message": {_163 "text_key": "text",_163 "data": {_163 "timestamp": "2025-06-16 19:58:23 UTC",_163 "sender": "系统",_163 "sender_name": "OpenAI",_163 "session_id": "29deb764-af3f-4d7d-94a0-47491ed241d6",_163 "text": "你好世界!🌍 今天有什么可以帮您的吗?",_163 "files": [],_163 "error": false,_163 "edit": false,_163 "properties": {_163 "text_color": "",_163 "background_color": "",_163 "edited": false,_163 "source": {_163 "id": "Agent-ZOknz",_163 "display_name": "代理",_163 "source": "gpt-4o-mini"_163 },_163 "icon": "bot",_163 "allow_markdown": false,_163 "positive_feedback": null,_163 "state": "complete",_163 "targets": []_163 },_163 "category": "message",_163 "content_blocks": [_163 {_163 "title": "代理步骤",_163 "contents": [_163 {_163 "type": "text",_163 "duration": 2,_163 "header": {_163 "title": "输入",_163 "icon": "MessageSquare"_163 },_163 "text": "**输入**:hello world!"_163 },_163 {_163 "type": "text",_163 "duration": 226,_163 "header": {_163 "title": "输出",_163 "icon": "MessageSquare"_163 },_163 "text": "你好世界!🌍 今天有什么可以帮您的吗?"_163 }_163 ],_163 "allow_markdown": true,_163 "media_url": null_163 }_163 ],_163 "id": "f3d85d9a-261c-4325-b004-95a1bf5de7ca",_163 "flow_id": "29deb764-af3f-4d7d-94a0-47491ed241d6",_163 "duration": null_163 },_163 "default_value": "",_163 "text": "你好世界!🌍 今天有什么可以帮您的吗?",_163 "sender": "系统",_163 "sender_name": "OpenAI",_163 "files": [],_163 "session_id": "29deb764-af3f-4d7d-94a0-47491ed241d6",_163 "timestamp": "2025-06-16T19:58:23+00:00",_163 "flow_id": "29deb764-af3f-4d7d-94a0-47491ed241d6",_163 "error": false,_163 "edit": false,_163 "properties": {_163 "text_color": "",_163 "background_color": "",_163 "edited": false,_163 "source": {_163 "id": "Agent-ZOknz",_163 "display_name": "代理",_163 "source": "gpt-4o-mini"_163 },_163 "icon": "bot",_163 "allow_markdown": false,_163 "positive_feedback": null,_163 "state": "complete",_163 "targets": []_163 },_163 "category": "message",_163 "content_blocks": [_163 {_163 "title": "代理步骤",_163 "contents": [_163 {_163 "type": "text",_163 "duration": 2,_163 "header": {_163 "title": "输入",_163 "icon": "MessageSquare"_163 },_163 "text": "**输入**:hello world!"_163 },_163 {_163 "type": "text",_163 "duration": 226,_163 "header": {_163 "title": "输出",_163 "icon": "MessageSquare"_163 },_163 "text": "你好世界!🌍 今天有什么可以帮您的吗?"_163 }_163 ],_163 "allow_markdown": true,_163 "media_url": null_163 }_163 ],_163 "duration": null_163 }_163 },_163 "artifacts": {_163 "message": "你好世界!🌍 今天有什么可以帮您的吗?",_163 "sender": "系统",_163 "sender_name": "OpenAI",_163 "files": [],_163 "type": "object"_163 },_163 "outputs": {_163 "message": {_163 "message": "你好世界!🌍 今天有什么可以帮您的吗?",_163 "type": "text"_163 }_163 },_163 "logs": {_163 "message": []_163 },_163 "messages": [_163 {_163 "message": "你好世界!🌍 今天有什么可以帮您的吗?",_163 "sender": "系统",_163``````json_163"sender_name": "AI",_163 "session_id": "29deb764-af3f-4d7d-94a0-47491ed241d6",_163 "stream_url": null,_163 "component_id": "ChatOutput-aF5lw",_163 "files": [],_163 "type": "text"_163 }_163 ],_163 "timedelta": null,_163 "duration": null,_163 "component_display_name": "Chat Output",_163 "component_id": "ChatOutput-aF5lw",_163 "used_frozen_result": false_163 }_163 ]_163 }_163 ]_163}
在生产应用中,你可能想要选择这个响应中的部分内容返回给用户、存储在日志中等等。接下来的步骤演示了如何从Langflow API响应中提取数据以便在你的应用中使用。
从响应中提取数据
以下示例基于 API 窗格的示例代码,创建一个在终端中运行的问答聊天,并存储代理之前的回答。
-
将您的 Simple Agent 流程的
/run
代码片段整合到以下脚本中。 此脚本在您的终端中运行问答聊天,并存储代理之前的回答,以便您进行比较。- Python
- JavaScript
_59import requests_59import json_59_59url = "http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID"_59_59def ask_agent(question):_59payload = {_59"output_type": "chat",_59"input_type": "chat",_59"input_value": question,_59}_59_59headers = {_59"Content-Type": "application/json",_59"x-api-key": "LANGFLOW_API_KEY"_59}_59_59try:_59response = requests.post(url, json=payload, headers=headers)_59response.raise_for_status()_59_59# Get the response message_59data = response.json()_59message = data["outputs"][0]["outputs"][0]["outputs"]["message"]["message"]_59return message_59_59except Exception as e:_59return f"Error: {str(e)}"_59_59def extract_message(data):_59try:_59return data["outputs"][0]["outputs"][0]["outputs"]["message"]["message"]_59except (KeyError, IndexError):_59return None_59_59# Store the previous answer from ask_agent response_59previous_answer = None_59_59# the terminal chat_59while True:_59# Get user input_59print("\nAsk the agent anything, such as 'What is 15 * 7?' or 'What is the capital of France?')")_59print("Type 'quit' to exit or 'compare' to see the previous answer")_59user_question = input("Your question: ")_59_59if user_question.lower() == 'quit':_59break_59elif user_question.lower() == 'compare':_59if previous_answer:_59print(f"\nPrevious answer was: {previous_answer}")_59else:_59print("\nNo previous answer to compare with!")_59continue_59_59# Get and display the answer_59result = ask_agent(user_question)_59print(f"\nAgent's answer: {result}")_59# Store the answer for comparison_59previous_answer = result_74const readline = require('readline');_74_74const rl = readline.createInterface({_74input: process.stdin,_74output: process.stdout_74});_74_74const url = 'http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID';_74_74// Store the previous answer from askAgent response_74let previousAnswer = null;_74_74// the agent flow, with question as input_value_74async function askAgent(question) {_74const payload = {_74"output_type": "chat",_74"input_type": "chat",_74"input_value": question_74};_74_74const options = {_74method: 'POST',_74headers: {_74'Content-Type': 'application/json',_74'x-api-key': 'LANGFLOW_API_KEY'_74},_74body: JSON.stringify(payload)_74};_74_74try {_74const response = await fetch(url, options);_74const data = await response.json();_74_74// Extract the message from the nested response_74const message = data.outputs[0].outputs[0].outputs.message.message;_74return message;_74} catch (error) {_74return `Error: ${error.message}`;_74}_74}_74_74// the terminal chat_74async function startChat() {_74console.log("\nAsk the agent anything, such as 'What is 15 * 7?' or 'What is the capital of France?'");_74console.log("Type 'quit' to exit or 'compare' to see the previous answer");_74_74const askQuestion = () => {_74rl.question('\nYour question: ', async (userQuestion) => {_74if (userQuestion.toLowerCase() === 'quit') {_74rl.close();_74return;_74}_74_74if (userQuestion.toLowerCase() === 'compare') {_74if (previousAnswer) {_74console.log(`\nPrevious answer was: ${previousAnswer}`);_74} else {_74console.log("\nNo previous answer to compare with!");_74}_74askQuestion();_74return;_74}_74_74const result = await askAgent(userQuestion);_74console.log(`\nAgent's answer: ${result}`);_74previousAnswer = result;_74askQuestion();_74});_74};_74_74askQuestion();_74}_74_74startChat(); -
要查看代理之前的回答,请输入
compare
。要关闭终端聊天,请输入exit
。
使用调整项(flow tweaks)为流程运行应用临时覆盖
您可以在请求中包含调整项(tweaks),以临时修改流程参数。 调整项被添加到API请求中,并临时更改您流程中的组件参数。 调整项仅覆盖流程组件的设置,仅对单次运行有效。 它们不会修改底层的流程配置,也不会在运行之间保持。
调整项被添加到/run
端点的payload
中。
为了辅助格式化,您可以在Replicate代码片段之前,在Langflow的**输入模式(Input Schema)**面板中定义调整项。
- 要打开输入模式(Input Schema)面板,从API访问(API access)面板中,点击输入模式(Input Schema)。
- 在**输入模式(Input Schema)面板中,选择您要在下次请求中修改的参数。 在输入模式(Input Schema)**面板中启用参数不会永久更改列出的参数。它只会将参数添加到示例代码片段中。
- 例如,要将LLM提供商从OpenAI更改为Groq,并在请求中包含您的Groq API密钥,请选择模型提供商(Model Providers)、**模型(Model)和Groq API密钥(Groq API Key)**的值。
Langflow根据您的输入参数更新代码片段中的
tweaks
对象,并包含默认值以指导您。 在您的脚本中使用更新后的代码片段,以使用您的覆盖项运行流程。
_12payload = {_12 "output_type": "chat",_12 "input_type": "chat",_12 "input_value": "hello world!",_12 "tweaks": {_12 "Agent-ZOknz": {_12 "agent_llm": "Groq",_12 "api_key": "GROQ_API_KEY",_12 "model_name": "llama-3.1-8b-instant"_12 }_12 }_12}