本文能帮你解决的
你会得到一个带请求/响应校验、环境变量管理、自动生成接口文档的最小可行 Agent 后端。 内容速览· 一个让本地 LLM“开口接客”的痛点场景· 用餐厅点餐比喻拆解 Agent 到底是个啥· FastAPI Ollama Pydantic 的最小实战代码· 请求生命周期从你的问题到 Agent 那句回答· 几个一偷懒就翻车的坑帮你提前绕开 第一部分那把“钥匙”到底在哪儿看个案例小媛说他在本地把 Llama3 跑起来了想给自己的客服系统加个自动回复接口。需求不复杂前端扔一段用户问题过来后端问 Ollama然后把答案送回去。她觉得这应该半小时搞定。结果呢她先是卡在“怎么把每次的提问包装成 API”然后又纠结“返回的结果该用啥格式”最后看着一堆手动拼的 JSON schema 叹了口气。这就是典型的手里有发动机却没给车架和轮胎。FastAPI 正好就是那套车架帮我们把发动机LLM稳稳地装上去还顺带送个仪表盘Swagger。 第二部分Agent 这套“套餐”到底怎么理解先别急着敲代码咱们聊聊 Agent 的本质。我特别喜欢用快餐店点餐来打比方‍ LLM—— 就是后厨那个万能大厨你提啥要求他都能给整出个菜。 工具—— 是大厨手边的锅铲、烤箱、菜刀。没有工具他只能干聊有了工具他才能查天气、调数据库、执行函数。 编排逻辑—— 是前台那张点餐流程单先确认需求再选择合适的工具最后让大厨出餐错了还要打回重做。所以一个最简化的 Agent 接口不是直接把用户的话丢给 Ollama 完事而是要在代码里体现这三层。今天我们先把基础路走通让“大厨”先能出餐后面再加“工具”就容易了。⚡ 第三部分动手从零搭一个 /chat 端点先晒一下我们的目标——一个跑在本地、用 Swagger 就能聊天的接口。你发一段话它回一段话背后调的是 Ollama。咱们的项目目录就简简单单几个文件├── main.py # 主服务入口 ├── models.py # 请求/响应模型 ├── config.py # 环境变量配置 └── pyproject.toml好咱们先来搞定环境。我默认你已经装好了 Ollama 并且拉取了模型比如 llama3。然后一行命令把依赖装齐uv add fastapi[standard] httpx对你没看错连httpx都得装一会儿我们要用它去异步调 Ollama 的 API这时候就别用 requests 同步请求了一上量接口直接卡成 PPT。接下来重点来了定义请求和响应模型。打开 models.py用Pydantic来管住进出。我喜欢把这事儿交给 Pydantic比手写字典强一万倍——自动校验还能直接喂给 Swagger。from pydantic import BaseModel class ChatRequest(BaseModel): message: str class ChatResponse(BaseModel): reply: str这里再说个容易翻车的点模型里字段如果写成 msg 这种简写回头对接前端的人会恨你一辈子。老老实实把可读性拉满。然后是 config.py咱们用 pydantic-settings 管理环境变量。这样不用把地址硬编码在代码里随时可以通过 .env 或环境变量覆盖。from pydantic_settings import BaseSettings class Settings(BaseSettings): ollama_base_url: str http://localhost:11434 model_name: str llama3 class Config: env_file .env settings Settings()官方文档虽然默认就支持 .env但根据以往的经验一定要在根目录放一个 .env 文件并且记得加进 .gitignore。不然某天队友的 API Key 就被你公之于众了那场面可太尴尬。主角来了main.py。我们先搭个骨架再用依赖注入把 settings 传进去给 /chat 端点用。from fastapi import FastAPI, Depends from models import ChatRequest, ChatResponse from config import Settings, settings import httpx app FastAPI(titleAI Agent 接口, version0.1.0) def get_settings(): return settings app.post(/chat, response_modelChatResponse) async def chat( req: ChatRequest, config: Settings Depends(get_settings) ): async with httpx.AsyncClient() as client: resp await client.post( f{config.ollama_base_url}/api/generate, json{ model: config.model_name, prompt: req.message, stream: False }, timeout30.0 ) resp.raise_for_status() data resp.json() return ChatResponse(replydata[response])你可能会问“就这Agent 的‘工具’和‘编排’呢”别急今天咱们先把大厨请出来。后面几篇我会慢慢给这个骨架添上“菜单”——工具调用逻辑让它可以查天气、搜文档。现在先跑起来体验一下从零到一的快感。最后啰嗦一句启动命令就一行 fastapi run main.py 。然后打开 http://localhost:8000/docs 你会看到一个自带交互界面的 Swagger。直接在里面 Try it out 测试看到回复的那一瞬间你心里一定会喊一声“舒坦”。 第四部分一个请求的完整生命周期为了让你心里更有谱我把整个过程拆成五步❶ 前端或 Swagger把 用户的一句话 按 ChatRequest 格式发到 /chat❷ FastAPI 自动校验字段不对就立刻返回 422 错误省得垃圾数据钻进大模型❸ 依赖注入 把 Settings 对象默默准备好代码里直接用❹ 用 httpx 异步调用 Ollama 的 /api/generate把大厨喊醒❺ Ollama 返回的 response 字段塞进 ChatResponseSwagger 自动渲染成漂亮的 JSON 文档你瞧整个链路清晰得就像一条笔直的大路每个弯拐在哪里一目了然。以后想加缓存、加日志、加工具只要顺着这条路插进去就行。⚠️ 注意事项与进阶思考· 千万别在公网暴露 Ollama 的 11434 端口这家伙默认没鉴权· 生产环境一定要加请求频率限制大模型慢分分钟把你的 FastAPI 线程池打满。· stream: False 用着爽但做打字机效果时记得换成流式响应那又是另一个好玩的话题。· 接下来我会在这个例子上逐步加上工具调用比如用搜索引擎的 API让 Agent 真的“动手干活”。

相关新闻

从 Demo 到上线,Agent 还差一套工程化底座

从 Demo 到上线,Agent 还差一套工程化底座

海外 Agent 基础设施正在快速平台化。Vercel、Cloudflare、GitHub 这些开发者平台不只是在接模型,而是在补部署、长任务运行、沙箱、观测、模型网关、权限和成本治理。 国内现在不缺模型,也不缺 Agent 框架,缺的是一套足够顺手的工程化底座。…

2026/6/26 6:22:50阅读更多 →
C*-单群与受限子代数:算子代数视角下的结构新刻画

C*-单群与受限子代数:算子代数视角下的结构新刻画

1. 项目概述:从“C盘清理”到“C*代数”的思维跃迁最近在网上冲浪,发现一个有趣的现象:当人们搜索“C*”时,搜索引擎和社区的热门联想词,几乎清一色地被“C盘清理”、“C语言环境配置”这类非常具体、实操性极强的计算…

2026/6/26 6:22:50阅读更多 →
手机号码定位终极指南:3分钟免费查询归属地,地图精准标注

手机号码定位终极指南:3分钟免费查询归属地,地图精准标注

手机号码定位终极指南:3分钟免费查询归属地,地图精准标注 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitco…

2026/6/26 6:17:50阅读更多 →
Egg.js接口自动化测试实战:用Supertest告别手动调试

Egg.js接口自动化测试实战:用Supertest告别手动调试

1. 项目概述:为什么我们需要告别“手动”接口调试?如果你是一名后端开发者,或者正在构建一个需要前后端协作的Web应用,那么“接口调试”这个环节你一定不陌生。想象一下这个场景:你刚写完一个用户登录的API&#xff0c…

2026/6/26 9:13:08阅读更多 →
VMware环境Kubernetes集群搭建实战(企业级生产就绪版):含vSAN存储对接、HAProxy负载均衡与Cert-Manager证书自动续期

VMware环境Kubernetes集群搭建实战(企业级生产就绪版):含vSAN存储对接、HAProxy负载均衡与Cert-Manager证书自动续期

更多请点击: https://codechina.net 第一章:VMware环境Kubernetes集群搭建实战(企业级生产就绪版)概述 在现代混合云架构中,VMware vSphere 作为主流虚拟化平台,承载着大量企业核心工作负载。将 Kubernete…

2026/6/26 9:13:08阅读更多 →
USART 完全笔记 —— STM32 标准库实现

USART 完全笔记 —— STM32 标准库实现

一、USART 是什么?先建立直觉 USART 全称 Universal Synchronous/Asynchronous Receiver/Transmitter, 通用同步/异步收发器。 日常说的「串口」、「UART」指的都是它的异步模式(不带时钟线), 这也是嵌入式开发中 99% 的场景。 和其他协议的直观对比 SPI:4 根线,全双…

2026/6/26 9:13:08阅读更多 →
Playwright录制视频黑屏封面问题:原理分析与三种解决方案

Playwright录制视频黑屏封面问题:原理分析与三种解决方案

1. 项目概述:当Playwright遇上黑屏封面 最近在做一个自动化测试项目,需要把网页操作录制成视频,方便回溯和演示。我毫不犹豫地选择了Playwright,毕竟它在处理现代Web应用、处理各种弹窗和异步加载方面确实是一把好手。脚本跑起来…

2026/6/26 9:13:08阅读更多 →
记一次诡异的“幽灵数据”:数据库有,但接口查不到

记一次诡异的“幽灵数据”:数据库有,但接口查不到

记一次诡异的“幽灵数据”:数据库有,但接口查不到 作为一名开发者,最让人头疼的莫过于遇到数据不一致的问题。最近,我就遇到了一个诡异的现象:数据库里明明有某条记录,但通过接口查询却怎么也查不到。这条…

2026/6/26 9:13:08阅读更多 →
【仅限企业运维总监查看】VMware与Hyper-V并行部署红线清单(含Intel TME、AMD SME加密内存冲突检测表·限时开放下载)

【仅限企业运维总监查看】VMware与Hyper-V并行部署红线清单(含Intel TME、AMD SME加密内存冲突检测表·限时开放下载)

更多请点击: https://kaifayun.com 第一章:VMware与Hyper-V并行部署的合规性边界与红线定义 在企业虚拟化基础设施中,VMware vSphere 与 Microsoft Hyper-V 同时运行于同一物理主机或共享硬件资源(如 CPU、内存、存储控制器&…

2026/6/26 9:08:08阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/25 9:39:54阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/25 9:01:34阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言:企业运维痛点与资源价值自博通收购 VMware 之后,原 VMware 公开免费下载渠道全面关闭,企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像,必须注册博通账号、绑定有效授权才能下载,无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言,与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java,Kotlin提供了多种注解来优化互操作体验,其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时,发现其mmap的实现非常精妙,特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数,并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →