目录一、从阿里云百炼中获取大模型的api key1.1 阿里云百炼平台简介1.2 API Key 获取流程二、Python环境准备2.1 配置环境变量macos系统windows系统2.2 依赖安装pip加速镜像配置核心包HTTP 服务依赖2.3 阿里云百炼 OpenAI 兼容配置参数2.4 代码实现一次性返回与流式输出的 HTTP API创建文件 agent_api.py启动服务启动成功后会显示浏览器测试测试一次性返回接口测试流式输出接口1.1 阿里云百炼平台简介阿里云百炼是大模型服务平台整合了通义千问全系列及主流第三方大模型平台提供与 OpenAI API 完全兼容的接口只需更换 API Key、Base URL 和模型名称即可无缝迁移 OpenAI 代码新用户注册后通常会获得一定的免费调用额度官方控制台地址大模型服务平台百炼控制台其实你可以理解阿里云百炼就是一个中间商大管家集成了所有世面上的主流大模型你想调用什么模型直接找他就行了如下图可以看到各种各样的大模型。1.2 API Key 获取流程访问阿里云百炼控制台首页进入 API Key 管理页面单击“创建 API KEY”按钮在弹窗中配置归属账号和归属业务空间权限配置选择全部授予该 API Key 调用所有模型的权限创建成功后点击 API Key 旁的图标复制密钥二、Python环境准备Python 版本要求必须使用 Python 3.10 或更高版本推荐 3.12。安装Python参考我其它的文章这里不做扩展了。2.1 配置环境变量macos系统echo export DASHSCOPE_API_KEY你的API-KEY ~/.zshrc source ~/.zshrcwindows系统2.2 依赖安装pip加速镜像配置# 临时使用阿里云镜像加速 pip install -i https://mirrors.aliyun.com/pypi/simple/ 包名 # 或者永久配置 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/核心包pip install langchain1.0.3 langchain-core1.2.26 langchain-community0.3.29 langchain-openai1.1.12 langgraph1.0.2 langgraph-prebuilt1.0.2HTTP 服务依赖pip install fastapi uvicorn sse-starlette2.3 阿里云百炼 OpenAI 兼容配置参数API Key从环境变量DASHSCOPE_API_KEY读取Base URLhttps://dashscope.aliyuncs.com/compatible-mode/v1模型名称qwen3.5-plus2.4 代码实现一次性返回与流式输出的 HTTP API创建文件 agent_api.pyimport os import json from fastapi import FastAPI, Query from fastapi.responses import StreamingResponse from langchain_openai import ChatOpenAI from langchain.agents import create_agent # ---------- 1. 初始化 Agent ---------- # 初始化大模型 model ChatOpenAI( modelqwen3.5-plus, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) # 创建 Agent 智能体 agent create_agent( modelmodel, tools[], system_prompt你是一个乐于助人的助手 ) # ---------- 2. 创建 FastAPI 应用 ---------- app FastAPI(titleLangChain Agent API, description浏览器测试 Agent 的一次性回答和流式输出) from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins[*], allow_methods[*], allow_headers[*], ) app.get(/) async def root(): return { usage: GET /chat?message你的问题 → 一次性返回, stream: GET /stream?message你的问题 → 流式返回SSE, example: http://localhost:8000/chat?message你好 } app.get(/chat) async def chat(message: str Query(..., description用户输入的消息)): 一次性返回完整回答 response agent.invoke({messages: [(user, message)]}) reply response[messages][-1].content return {reply: reply} app.get(/stream) async def stream_chat(message: str Query(..., description用户输入的消息)): 流式返回 Agent 回答Server-Sent Events async def event_generator(): # 直接使用 model.stream 而不是 agent.astream for chunk in model.stream([{role: user, content: message}]): if hasattr(chunk, content) and chunk.content: yield fdata: {json.dumps({content: chunk.content})}\n\n yield data: [DONE]\n\n return StreamingResponse(event_generator(), media_typetext/event-stream; charsetutf-8) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)启动服务python agent_api.py启动成功后会显示INFO: Uvicorn running on http://0.0.0.0:8000浏览器测试测试一次性返回接口在浏览器地址栏输入http://localhost:8000/chat?message请用一句话介绍什么是LangChain页面会显示 JSON 格式的回复例如{reply:LangChain 是一个用于构建大语言模型应用的开发框架...}测试流式输出接口创建test.html文件!DOCTYPE html html head meta charsetUTF-8 title流式测试/title /head body input idmsg placeholder输入问题 size50 / button onclickstartStream()发送/button div idoutput stylemargin-top:20px; border:1px solid #ccc; padding:10px;/div script let currentText ; let currentIndex 0; let typingTimeout null; function startStream() { const msg document.getElementById(msg).value; const outputDiv document.getElementById(output); outputDiv.innerHTML ; currentText ; currentIndex 0; if (typingTimeout) { clearTimeout(typingTimeout); typingTimeout null; } const eventSource new EventSource(http://localhost:8000/stream?message${encodeURIComponent(msg)}); eventSource.onmessage (event) { if (event.data [DONE]) { eventSource.close(); } else { const data JSON.parse(event.data); // 追加内容 currentText data.content; // 开始或继续打字机效果 startTyping(outputDiv, 100); } }; } // 打字机效果函数 function startTyping(element, speed) { if (currentIndex currentText.length) { element.innerHTML currentText.charAt(currentIndex); currentIndex; typingTimeout setTimeout(() startTyping(element, speed), speed); } } /script /body /html双击用浏览器打开test.html输入问题后点击发送