AI Agent全栈开发实战:从大模型调用到ES日志分析工具闭环
2026/9/1 4:01:22 网站建设 项目流程

企业在招聘 AI Agent 研发时,越来越倾向于“全栈工程师”这个岗位定位,很多人不理解:Agent 不是一个“对话机器人”吗,为什么要把前端、后端、算法都串起来?本文围绕 AI Agent 从零到工程落地的完整路径,结合一个“通过 ES REST API 做日志分析”的实战项目,把 Agent 核心机制、工具调用、HTTP 接口封装、前端交互串成一条线,帮助想进入 AI Agent 方向的全栈开发者快速建立整体认知。

1. AI Agent 与全栈工程师:这个岗位到底在做什么

1.1 从大模型到 AI Agent:一次能力跃迁

大语言模型(LLM)本身解决的是“文本生成”问题。你给它一句提示词,它返回一段文本。但企业业务不可能只靠文本生成来闭环,比如“帮我查一下最近 30 分钟支付接口的错误日志,分析失败原因”,这一步需要模型具备调用 Elasticsearch、读取日志、筛选字段、统计聚合、形成结论的能力。

AI Agent 就是在 LLM 基础上增加了一层“行动能力”:

  • 感知:接收用户问题,理解目标。
  • 规划:把大目标拆成小步骤。
  • 行动:调用外部工具,例如搜索日志、查数据库、发请求。
  • 观察:读取工具返回结果,判断是否达成目标。
  • 循环:如果没有完成,继续调整策略,直到输出最终结果。

所以 AI Agent 不是一个独立的算法模型,而是一套系统架构。它的核心不再只是“提示词写得好不好”,而是“工具接得多不多、上下文管理得是否合理、执行循环是否稳定”。

1.2 企业为什么需要“远程全栈工程师”做 AI Agent

最近不少团队在招 AI Agent 方向的远程全栈工程师,原因是 Agent 项目的天然属性就是跨端协作:

  • 需要写 Python 核心逻辑,处理 LLM 调用、工具调度、上下文缓冲。
  • 需要写后端 API,把 Agent 能力暴露给上层业务系统。
  • 需要写前端界面,让用户能直观地提交问题、查看 Agent 的思考过程和结果。
  • 需要懂部署运维,Agent 要接入日志系统、监控系统、向量数据库,还要处理网络异常和限流。
  • 需要关注安全和数据隔离,不能把内部日志、用户数据随意传给模型。

传统的前端工程师或后端工程师往往只覆盖其中一部分链路。而 AI Agent 的迭代速度非常快,团队规模却不大,远程协作又极度依赖个人独立闭环能力,所以“全栈工程师”成为香饽饽并不意外。

1.3 一个典型 AI Agent 团队的技术栈

层次常见技术选型作用
模型层OpenAI、DeepSeek、智谱、通义等兼容接口提供推理能力
Agent 编排层LangChain、LlamaIndex、自研循环管理规划、工具调用、记忆
工具层搜索 API、数据库客户端、ES、Webhook让 Agent 能触达外部系统
服务层FastAPI、Flask、Spring Boot把 Agent 封装成 HTTP 服务
前端层React、Vue、简单 HTML + JS提供人机交互入口
数据层Redis、PostgreSQL、向量数据库存储会话、知识库、上下文
可观测性日志、Trace、监控面板定位 Agent 行为异常

从这套技术栈可以看出来,AI Agent 工程化确实“全栈”属性很强。下面我们用一套最小可运行的实战项目,把模型调用、工具注册、执行循环、HTTP 接口、前端输入框全部串起来。

2. 环境准备与项目初始化

2.1 运行环境

本文代码使用 Python 3.10+ 编写,操作系统不限,Windows、Linux、macOS 都可以运行。你需要准备:

  • Python 3.10 或更高版本。
  • 一个可访问的 LLM API 接口,支持 OpenAI 兼容协议。
  • 一个 Elasticsearch 服务,用于存放和查询日志数据。
  • 一个 HTTP 调试工具,例如 Postman、curl,直接使用浏览器也可以。

版本说明:不同模型厂商的接口协议存在差异,但大多数都兼容 OpenAI 的 Chat Completions 风格,本文示例统一使用openai库,通过base_url指向不同的模型服务。如果你的模型厂商协议差异较大,需要按官方文档调整请求格式。

2.2 创建项目目录结构

先创建一个干净的目录,后续所有代码都放在这里。

ai-agent-project/ ├── requirements.txt ├── .env.example ├── agent_core.py ├── log_tool.py ├── main.py └── static/ └── index.html

说明一下各个文件职责:

  • requirements.txt:项目依赖。
  • .env.example:环境变量模板。
  • agent_core.py:Agent 核心循环,负责调度 LLM 和工具。
  • log_tool.py:工具函数,通过 Elasticsearch REST API 查询日志。
  • main.py:FastAPI 服务入口,暴露接口。
  • static/index.html:简单前端页面,用于演示。

2.3 安装依赖

在项目根目录执行:

pip install openai fastapi uvicorn python-dotenv requests pydantic

如果你希望统一维护依赖版本,可以编写requirements.txt文件:

openai>=1.30.0 fastapi>=0.110.0 uvicorn>=0.29.0 python-dotenv>=1.0.0 requests>=2.32.0 pydantic>=2.7.0

然后执行:

pip install -r requirements.txt

2.4 配置环境变量

在项目根目录创建.env.example文件,如下:

OPENAI_API_KEY=你的模型API密钥 OPENAI_BASE_URL=https://api.openai.com/v1 OPENAI_MODEL=gpt-4o-mini ES_URL=http://localhost:9200 ES_USERNAME= ES_PASSWORD= ES_INDEX=app-logs

.env.example复制为.env,填入你自己的配置。注意:.env文件不要提交到 Git 仓库,里面可能有密钥。如果本地 Elasticsearch 未开启安全认证,用户名密码留空即可;如果开启了认证,则填写对应账号密码。

3. AI Agent 核心机制拆解

3.1 LLM 接口调用:一切的基础

Agent 的底层是 LLM 接口调用。我们通过openai库定义一个全局客户端:

import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"), ) MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini")

使用base_url的好处是,如果你的模型服务商提供了兼容 OpenAI 协议的网关,例如 DeepSeek、智谱、通义等,只需要修改环境变量即可,核心代码不用变动。

3.2 工具调用:让模型拥有“手”

大模型本身不能直接查询 Elasticsearch,我们需要把日志检索能力封装成一个工具,并把它以 JSON Schema 的方式描述给模型。模型在推理时,如果认为需要查询日志,会返回一个“工具调用请求”,并填充参数。

工具描述示例:

tools = [ { "type": "function", "function": { "name": "search_logs", "description": "从 Elasticsearch 中检索应用日志,支持 query_string 语法,返回时间倒序的日志条目", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "查询语句,例如 'level:ERROR AND service:order'" }, "index": { "type": "string", "description": "索引名称,默认 app-logs" }, "size": { "type": "integer", "description": "返回日志条数,默认 50" } }, "required": ["query"] } } } ]

这里最核心的是description字段。模型本身不具备调用工具的能力,它只是根据工具描述“猜测”什么时候该调用、怎样填参数。描述越清楚,模型选错工具、填错参数的概率越低。

3.3 记忆与上下文管理

Agent 在多次工具调用之间需要保留完整的对话历史。常见实现方式是将 system 消息、user 消息、assistant 消息和 tool 结果消息依次追加到messages列表,每次调用 LLM 时携带整个列表。

需要注意:

  • 历史越长,Token 消耗越大,响应越慢。
  • 超过模型上下文窗口时,需要做截断或摘要压缩。
  • 生产系统中可以使用 Redis 保存会话历史,避免每次请求都从头构建。

3.4 任务规划与执行循环

一个最简 Agent 执行循环可以描述为:

  1. 把用户问题加入消息列表。
  2. 调用 LLM,传入工具定义。
  3. 判断返回结果是否有tool_calls
  4. 如果有,执行对应工具,把结果以tool角色消息追加到消息列表。
  5. 继续调用 LLM,观察是否已经生成最终答案。
  6. 如果没有工具调用,则返回最终文本。
  7. 如果反复调用超过最大步数,强制终止。

这个循环被很多框架称为 ReAct 模式的简化版:Reason(思考)+ Act(行动),边思考边行动,观察结果后继续思考。

4. 完整实战:用 AI Agent 通过 ES REST API 做日志分析

4.1 需求拆解

我们期望用户输入一句话,例如:

通过 ES REST API 查询最近 30 分钟 payment 服务出现的 ERROR 日志,并分析可能原因。

Agent 需要完成:

  • 理解用户意图。
  • 生成 Elasticsearch query_string 查询语句。
  • 调用search_logs工具。
  • 读取返回结果。
  • 根据日志内容总结错误原因,输出分析结论。

为了演示通用能力,我们这里实现一个“时间过滤 + 关键字查询”的日志检索工具。如果你的日志索引里有自定义时间字段,可以按实际字段调整。

4.2 编写日志工具:log_tool.py

创建log_tool.py文件:

import json import os import requests from dotenv import load_dotenv load_dotenv() ES_URL = os.getenv("ES_URL", "http://localhost:9200") ES_USERNAME = os.getenv("ES_USERNAME", "") ES_PASSWORD = os.getenv("ES_PASSWORD", "") DEFAULT_INDEX = os.getenv("ES_INDEX", "app-logs") def search_logs(query: str, index: str = DEFAULT_INDEX, size: int = 50) -> dict: """ 使用 Elasticsearch REST API 查询日志。 query 支持 query_string 语法,例如: level:ERROR AND service:payment """ if not query: query = "*" url = f"{ES_URL}/{index}/_search" body = { "query": { "query_string": { "query": query } }, "sort": [ {"@timestamp": {"order": "desc"}} ], "size": size } auth = None if ES_USERNAME and ES_PASSWORD: auth = (ES_USERNAME, ES_PASSWORD) response = requests.get(url, auth=auth, json=body, timeout=10) response.raise_for_status() return response.json() def format_logs(hits: list) -> str: """ 把 ES 返回的 hits 转换成容易阅读的文本。 """ lines = [] for hit in hits: source = hit.get("_source", {}) timestamp = source.get("@timestamp", "") level = source.get("level", "") service = source.get("service", "") message = source.get("message", "") lines.append(f"[{timestamp}] [{level}] [{service}] {message}") return "\n".join(lines)

这段代码有几点需要说明:

  • 使用requests直接调用 ES REST API,这样比引入elasticsearch官方客户端更直观,也方便读者理解 Agent 调用的底层逻辑。
  • query_string是 ES 的查询语法,支持ANDOR:等操作符,例如level:ERROR AND service:payment
  • sort@timestamp倒序排序,日志越新的排在越前面。如果你的日志时间字段不是@timestamp,需要改成实际字段名。
  • timeout=10避免工具调用长时间阻塞 Agent 循环。

注意:如果你的 ES 服务使用了自签名 HTTPS 证书,直接请求可能报 SSL 错误。本文示例中不推荐关闭证书校验,生产环境请使用有效证书。

4.3 编写 Agent 核心循环:agent_core.py

接下来是本次实战最核心的文件。创建agent_core.py

import json import os from openai import OpenAI from dotenv import load_dotenv from log_tool import format_logs, search_logs load_dotenv() client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"), ) MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini") SYSTEM_PROMPT = """你是一个日志分析助手。 你可以调用 search_logs 工具查询 Elasticsearch 中的日志数据。 请根据日志内容分析问题原因,并用中文输出结论。 如果日志中没有明显异常,请明确说明没有发现异常。 """ TOOLS = [ { "type": "function", "function": { "name": "search_logs", "description": "从 Elasticsearch 中检索应用日志,支持 query_string 语法,例如 'level:ERROR AND service:payment'", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "查询语句,例如 'level:ERROR AND service:payment'" }, "index": { "type": "string", "description": "索引名称,默认 app-logs" }, "size": { "type": "integer", "description": "返回日志条数,默认 50" } }, "required": ["query"] } } } ] TOOL_MAP = { "search_logs": search_logs, } def run_agent(user_question: str, max_steps: int = 5) -> str: """ 执行 Agent 循环:思考 -> 调用工具 -> 观察结果 -> 生成答案。 """ messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_question}, ] for _ in range(max_steps): response = client.chat.completions.create( model=MODEL, messages=messages, tools=TOOLS, tool_choice="auto", ) assistant_message = response.choices[0].message if not assistant_message.tool_calls: # 模型不再调用工具,说明已经准备好生成最终答案 return assistant_message.content or "" # 先把 assistant 消息加入历史,保留工具调用记录 messages.append(assistant_message) # 遍历工具调用,逐个执行并收集结果 for tool_call in assistant_message.tool_calls: tool_name = tool_call.function.name tool_args = json.loads(tool_call.function.arguments or "{}") print(f"[Agent] 调用工具 {tool_name},参数: {tool_call.function.arguments}") if tool_name not in TOOL_MAP: tool_result = f"未知工具: {tool_name}" else: raw_result = TOOL_MAP[tool_name](**tool_args) # 统一格式化,日志类工具转成易读文本 if tool_name == "search_logs": hits = raw_result.get("hits", {}).get("hits", []) tool_result = format_logs(hits) if not tool_result: tool_result = "没有找到符合条件的日志。" else: tool_result = json.dumps(raw_result, ensure_ascii=False) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": tool_result, }) return "已达到最大执行步数,请缩小查询范围后重试。" if __name__ == "__main__": question = "查询最近 payment 服务的 ERROR 日志,并告诉我主要错误原因。" print(run_agent(question))

核心逻辑集中在run_agent函数中,我拆解一下各部分的职责:

  • SYSTEM_PROMPT:告诉模型它是什么身份、能做什么、输出语言要求。
  • TOOLS:以 JSON Schema 方式描述工具,模型据此判断何时调用。
  • TOOL_MAP:维护工具名称和真实函数之间的映射。
  • messages.append(assistant_message):必须把 assistant 消息加入历史,否则模型不知道它刚刚调用了哪个工具。
  • tool角色的消息必须携带tool_call_id,和 assistant 消息中的tool_call.id对应,否则模型无法关联结果。
  • max_steps是循环上限,防止模型陷入工具调用死循环。

4.4 使用 FastAPI 暴露 HTTP 接口:main.py

Agent 不能只停留在命令行,我们把它封装成 HTTP 服务,方便前端页面或其他系统调用。创建main.py

from fastapi import FastAPI from fastapi.responses import FileResponse from pydantic import BaseModel from agent_core import run_agent app = FastAPI(title="AI Agent 日志分析服务") class AnalyzeRequest(BaseModel): question: str @app.get("/") def index(): return FileResponse("static/index.html") @app.post("/api/agent/analyze") def analyze(payload: AnalyzeRequest): """ 接收用户问题,返回 Agent 分析结果。 """ if not payload.question.strip(): return {"question": payload.question, "result": "问题不能为空"} result = run_agent(payload.question) return {"question": payload.question, "result": result}

这里用pydantic定义请求体结构,FastAPI 会自动完成参数校验。如果请求体不符合格式,会自动返回 422 错误。

启动服务:

uvicorn main:app --host 0.0.0.0 --port 8000

关于0.0.0.0再提醒一句:如果你是在远程开发机上启动,只有需要被其他机器访问时才使用0.0.0.0;如果只是本地调试,使用127.0.0.1更安全。

4.5 编写前端演示页面:static/index.html

作为全栈工程师,前端交互也不能少。我们创建一个极简页面,让用户输入问题并展示 Agent 返回结果:

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>AI Agent 日志分析</title> <style> body { font-family: Arial, sans-serif; max-width: 800px; margin: 40px auto; padding: 0 20px; line-height: 1.6; } textarea { width: 100%; height: 100px; padding: 10px; font-size: 14px; } button { margin-top: 10px; padding: 10px 24px; font-size: 16px; cursor: pointer; } .result { margin-top: 20px; background: #f5f5f5; padding: 16px; border-radius: 6px; white-space: pre-wrap; } </style> </head> <body> <h1>AI Agent 日志分析助手</h1> <textarea id="question" placeholder="请输入日志分析问题,例如:查询 payment 服务的 ERROR 日志并分析原因"></textarea> <br> <button id="submit">开始分析</button> <div class="result" id="result">等待输入…</div> <script> document.getElementById("submit").addEventListener("click", async function () { const question = document.getElementById("question").value; const resultDiv = document.getElementById("result"); resultDiv.textContent = "正在分析中,请稍候…"; try { const response = await fetch("/api/agent/analyze", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({question: question}) }); const data = await response.json(); resultDiv.textContent = data.result; } catch (error) { resultDiv.textContent = "请求出错:" + error.message; } }); </script> </body> </html>

到这里,我们已经有了一条完整的全栈链路:

  • 用户在浏览器输入问题。
  • 前端通过fetch发起 POST 请求。
  • FastAPI 接口调用run_agent
  • Agent 循环中调用 LLM 和search_logs工具。
  • 最终结果返回前端并展示。

4.6 端到端运行验证

第一步:确认 Elasticsearch 中有日志数据。你可以用 curl 检查索引是否存在:

curl http://localhost:9200/app-logs

如果返回 200,说明索引存在。

第二步:启动 FastAPI 服务:

uvicorn main:app --host 127.0.0.1 --port 8000

第三步:用 curl 测试接口:

curl -X POST http://127.0.0.1:8000/api/agent/analyze \ -H "Content-Type: application/json" \ -d '{"question": "查询 payment 服务的 ERROR 日志并分析原因"}'

预期输出是一个 JSON 对象,其中result字段是模型根据工具返回日志生成的文本结论。

如果希望看到 Agent 调用工具的中间过程,可以在启动命令里观察终端输出。agent_core.py中的print会打印每次调用的工具名和参数。

5. 从单机 Agent 到企业级工程化

上面的示例可以在本地跑通,但距离企业级生产使用还有不少工作要做。接下来我们从工程视角,讨论一个 AI Agent 项目在团队里落地时需要注意的关键点。

5.1 工具扩展与注册机制

TOOL_MAP中维护工具是直观的,但工具多了以后会变得很难管理。实际项目中建议抽象一个统一的工具基类或接口:

  • 每个工具有独立的描述、参数 Schema、执行函数。
  • 工具注册通过装饰器或配置文件完成,核心循环不感知具体业务逻辑。
  • 工具执行需要有超时控制、异常捕获、结果大小限制。

工具返回结果如果太大,会占用大量 Token。ES 查询可能返回几千上万条日志,我们通常只保留前几十条,并让模型关注高频错误类型,而不是逐条阅读。

5.2 会话与上下文管理

生产环境通常需要支持多轮对话,不能每次请求都从头开始。可以用 Redis 以session_id作为 key 保存消息历史,每次请求追加新消息。

同时需要设置上下文窗口管理策略:

  • 超出最大 token 数时,丢弃最早的非关键消息。
  • 或者把历史对话做摘要,保留摘要 + 最近几轮对话。
  • 注意不要把其他用户的数据串进当前会话。

远程开发场景下,日志中也不能出现完整 API Key 和用户敏感字段。

5.3 可观测性与 Debug

Agent 的“黑盒感”比普通后端接口更强。模型为什么调用这个工具?参数为什么填成这样?结果为什么不对?这些问题不解决,生产排障无从下手。

建议记录 Agent Trace:

  • 每次请求的系统提示词摘要。
  • 每一步的消息列表变化。
  • 工具调用名称、参数、返回结果大小。
  • 模型输出文本。
  • 总耗时和 Token 消耗。

有了 Trace,后续无论是调优提示词,还是定位上一次异常链路,都会方便很多。

5.4 安全与合规边界

AI Agent 能够调用外部工具,就意味着模型可以执行真实操作。需要严格限制工具权限,遵循最小权限原则:

  • 日志查询类工具设置为只读,禁止传入写操作。
  • 如果工具涉及增删改,必须增加审批确认步骤。
  • API Key 不要写死在代码里,使用环境变量或密钥管理服务。
  • 传入模型的数据要先脱敏,避免手机号、身份证号等敏感信息进入外部模型。
  • 涉及生产环境的任何变更,都要先在测试环境验证,并保留完备的操作审计日志。

尤其要注意:日志分析类 Agent 通常能接触到系统内部异常信息,这些信息在传给第三方 LLM 时存在数据泄露风险。如果数据敏感度很高,需要优先考虑私有化部署的模型服务。

5.5 成本控制

Agent 比普通提示词调用贵得多,原因是:

  • 每次工具调用后都要把完整工具结果传回模型。
  • 多轮工具调用会产生多轮 token 消耗。
  • 工具定义本身也会占用 token。

控制成本的手段包括:

  • 限制max_steps,避免无意义循环。
  • 对工具返回结果做摘要,减少长文本。
  • 采用流式输出提升用户体验。
  • 设置请求级 Token 上限,超限直接返回。
  • 对模型按任务分流,简单分类任务用小模型,复杂分析用大模型。

6. 常见问题与排查思路

下面是 AI Agent 开发过程中最常见的几类问题,我整理成表格,方便快速查阅。

问题现象常见原因解决思路
模型一直不调用工具,直接输出文字工具描述不清晰,或模型不支持 function calling检查 tools 参数是否传递;工具描述要写清使用场景;确认模型版本支持工具调用
模型调用工具后报错,无法继续参数缺失或类型不对查看工具参数是否和定义一致;打印 tool_call.function.arguments,检查 JSON 解析是否成功
Agent 反复调用工具,陷入死循环max_steps 设置过大;工具结果无法帮助模型得出结论限制 max_steps;要求模型“没有合适日志时直接说明”;对工具结果做摘要
ES 查询超时查询词复杂、索引数据量过大、ES 负载高加上 timeout;查询语句增加时间范围过滤;使用 size 限制返回条数
请求 LLM 接口报 401/403API Key 错误或没有权限检查环境变量;确认 service account 权限范围
Tool 消息缺少 tool_call_id消息格式不对,没有把 assistant 消息加入历史确保每个 tool 角色的消息都携带对应 tool_call.id
Token 消耗过快工具结果太多、历史消息太长对结果截断;对历史消息做窗口管理;控制多轮循环
前端页面 404FastAPI 没有正确返回静态文件检查 static 目录路径;确认 index.html 文件名大小写

如果你也遇到模型“答非所问”,优先检查工具调用链路,在核心循环里打印messages列表,往往一眼就能定位是模型没想清楚,还是工具结果被截断了。

7. AI Agent 全栈学习路线建议

如果你正在考虑进入这个方向,或者准备接这种远程岗位,可以从下面几个阶段逐步递进。

第一阶段:打牢 API 基础。

不急着上 LangChain 这类框架,先用openai库手写一个调用,理解 system、user、assistant 三种角色的差异,理解 temperature、max_tokens 参数的含义。

第二阶段:手写工具调用循环。

像本文这样,先实现一个工具,自己控制循环。完成这一步,你对 Agent 原理的理解会超过很多只会调框架封装接口的开发者。

第三阶段:用框架提升效率。

熟悉 LangChain、LlamaIndex 等框架的 Agent 模块,了解 AgentExecutor、Tool、Memory、Callback 等概念。框架能帮你省掉重复代码,但不能替代对底层机制的理解。

第四阶段:工程化落地。

把 Agent 封装成 API,接入日志系统、监控系统,处理多租户与会话隔离,设计权限控制和成本统计。走到这一步,你在团队中已经能独立负责一个 Agent 功能模块了。

第五阶段:纵深优化。

探索多 Agent 协作、向量检索、RAG 知识库、评估集与自动化回归测试。随着 AI Agent 在 2026 年的应用场景越来越多,这些能力会越来越有价值。

最后回到招聘信息这件事本身:企业要找的不是一个“只懂调用模型 API”的人,而是一个能把模型、工具、系统、前端、部署串成闭环的人。本文从日志分析这个 小场景切入,完整演示了闭环的构建方式。你可以把这个项目跑通,然后换一个业务工具,例如查询订单、查询监控指标、读取数据库表结构,逐步积累出自己的 Agent 全栈工具箱。纸上得来终觉浅,建议现在就拉一个 FastAPI 项目,把第一个 Agent 跑起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询