
NBA Agent 实战基于 FastAPI、BallDontLie 与 OpenAI 的 AI 篮球比赛预测与投注洞察机器人【免费下载链接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!项目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents本篇技术指南以 oTTomator 仓库中的 nba-agent 项目 为主体完整拆解一个AI 驱动 NBA 比赛预测与投注洞察机器人的设计与实现。该 Agent 通过自然语言接收用户提问如预测今天凯尔特人的比赛自动解析比赛日期、识别球队、抓取实时赛程/战绩/伤病/赔率数据并调用大语言模型生成带胜率与置信度的比赛分析和投注参考。读完本文你将掌握该机器人的整体架构、FastAPI 接口设计、5 个核心环境变量的配置、数据管道调用链以及从源码 nba_agent.py 延伸出的完整部署与二次开发路径。项目概览一个端到端的体育预测 AgentNBA Agent 是一个 AI 驱动的 NBA 比赛预测与投注洞察机器人其定位是帮助用户在赛前获得数据驱动的决策参考。它不只是简单返回赛程而是把实时数据抓取与大模型推理结合起来既评估即将到来的对阵、潜在赛果与相关统计数据也输出投注赔率视角的分析为体育竞猜爱好者提供结构化参考。原文档 README.md 明确列出的功能特性包括实时 NBA 比赛预测基于当日或指定日期的赛程生成逐场预测投注赔率与分析抓取实时盘口数据让分盘、大小分并整合进预测结果球队专属洞察支持按球队维度过滤与聚焦分析历史比赛数据分析通过历史统计与战绩数据支撑分析结论交互式 Web 界面内置聊天式前端零门槛使用。在技术栈上项目由四个层次构成层次技术选型仓库证据后端框架FastAPI Pythonnba_agent.py前端界面HTML CSS JavaScripttemplates/index.html数据存储Supabase会话消息持久化nba_agent.py外部 APIBallDontLie API篮球数据 OpenAI API推理生成nba_agent.py从仓库结构看项目还保留了早期原型 agent_trial/nba_agent_1.py共 954 行面向 2023-24 赛季而主程序 nba_agent.py共 722 行则是面向 2024-25 赛季的生产版本二者在赛季号、OpenAI 客户端初始化方式同步OpenAIvs 异步AsyncOpenAI和 CORS 配置上有所差异适合对照阅读以理解演进过程。系统架构与一次预测请求的完整链路整个机器人以 FastAPI 应用为中枢核心执行逻辑集中在NBAPredictor类中。一次典型请求What are the predictions for the Celtics game today?的完整调用链如下鉴权verify_token校验请求头中的 Bearer Token 与API_BEARER_TOKEN环境变量是否一致nba_agent.py会话持久化先把用户提问写入 Supabasemessages表store_messagenba_agent.py日期解析NBAPredictor.parse_game_date将自然语言中的时间today / tomorrow / Jan 27 等转换为YYYY-MM-DDnba_agent.py赛程抓取get_games(date)调用 BallDontLie/games接口获取当日比赛列表nba_agent.py球队意图识别在内置的 30 支球队别名映射表中匹配提问中出现的球队名若命中则过滤赛程nba_agent.py逐场分析对每场比赛执行analyze_matchup并行获取双方伤病get_team_injuries、联盟战绩get_standings与盘口数据get_betting_oddsnba_agent.pyAI 生成_generate_prediction把战绩、伤病等结构化上下文注入 Prompt调用gpt-4-turbo-preview生成格式化的胜者、分析与置信度nba_agent.py结果回写与返回将 AI 回复连同结构化数据日期、场次数、逐场预测写回 Supabase最后返回AgentResponse(successTrue)nba_agent.py。从源码结构看第 46 步的多个数据获取调用大量使用httpx.AsyncClient与asyncio.to_thread体现了数据管道并行化 大模型调用异步化的设计思路。快速开始依赖安装与环境变量配置原文档给出的三步启动流程克隆仓库 → 安装依赖 → 配置环境变量 → 运行在此展开说明每一步都有仓库中的具体文件与之对应。1. 安装依赖项目依赖集中在 requirements.txt核心依赖及其用途如下依赖版本约束用途fastapi0.68.0,0.69.0Web 框架与自动文档uvicorn0.15.0,0.16.0ASGI 服务器supabase1.0.3Supabase 客户端消息持久化openai1.3.0OpenAI 大模型调用httpx0.24.0异步 HTTP 客户端抓取篮球数据requests2.31.0同步 HTTP 客户端赛程/伤病接口dateparser1.1.8自然语言日期解析python-dotenv0.19.0加载.env环境变量pydantic1.10.0,2.0.0请求/响应模型校验python-multipart0.0.6表单解析支持python-telegram-bot20.0Telegram 集成预留依赖安装命令与原文档一致pip install -r requirements.txt。2. 配置五个必需环境变量在项目根目录创建.env文件配置以下变量。需要特别说明的是这 5 个变量并非可选配置——主程序在启动阶段就做了强制校验required_vars [ BALLDONTLIE_API_KEY, OPENAI_API_KEY, API_BEARER_TOKEN, SUPABASE_URL, SUPABASE_SERVICE_KEY ] missing_vars [var for var in required_vars if not os.getenv(var)] if missing_vars: raise ValueError(fMissing required environment variables: {, .join(missing_vars)})以上代码来自 nba_agent.py任一变量缺失进程会直接抛出ValueError并拒绝启动。各变量职责如下BALLDONTLIE_API_KEYBallDontLie API 的鉴权 Key用于访问赛程、战绩、伤病、赔率、球员场均等篮球数据接口默认基址https://api.balldontlie.io/v1见 nba_agent.pyOPENAI_API_KEYOpenAI 平台 API Key用于初始化OpenAI客户端并调用gpt-4-turbo-preview生成预测文本API_BEARER_TOKEN自定义的接口访问令牌调用方必须以Authorization: Bearer token形式传入否则返回 401见 verify_tokenSUPABASE_URL与SUPABASE_SERVICE_KEYSupabase 项目地址与服务端密钥用于初始化create_client并操作messages表做会话持久化见 nba_agent.py。BALLDONTLIE_API_KEYyour_balldontlie_key OPENAI_API_KEYyour_openai_key API_BEARER_TOKENyour_custom_bearer_token SUPABASE_URLhttps://your-project.supabase.co SUPABASE_SERVICE_KEYyour_service_role_key3. 启动服务原文档给出的启动命令为uvicorn nba_agent:app --reload主程序内置的入口也支持直接以脚本方式运行python nba_agent.py此时 uvicorn 会监听0.0.0.0:8001nba_agent.py代码注释明确提示如需可自行修改端口。启动成功后访问http://localhost:8001即可看到聊天界面。API 设计请求/响应模型与端点鉴权请求与响应模型Agent 的输入输出由两个 Pydantic 模型约束nba_agent.pyclass AgentRequest(BaseModel): query: str # 用户提问如 What are the predictions for todays NBA games? user_id: str # 用户标识 request_id: str # 请求唯一标识用于追踪 session_id: str # 会话标识用于关联历史消息 class AgentResponse(BaseModel): success: bool # 是否处理成功该请求模型遵循 oTTomator Live Agent Studio 平台 Agent 的通用契约session_id与request_id同时用于 Supabase 会话记录与日志追踪。端点与鉴权POST/api/nba_agent唯一的主预测端点nba_agent.py依赖verify_token完成 Bearer 鉴权未携带或携带错误 Token 时分别返回 500服务端未配置 Token与 401Token 不匹配GET /返回聊天界面 HTMLnba_agent.py直接读取templates/index.html渲染。前端 JavaScript 以Authorization: Bearer test123调用接口templates/index.html即默认演示环境中的API_BEARER_TOKEN为test123生产环境务必替换。注意主版本 nba_agent.py 的 CORS 配置为allow_origins[*]全放行而早期原型 agent_trial/nba_agent_1.py 则限定为https://nbaagent-production.up.railway.app与http://localhost:8001后者更适合作为生产环境的收紧参考。核心引擎 NBAPredictor多源数据管道深度解析NBAPredictor类nba_agent.py是所有预测能力的载体初始化时配置 BallDontLie 基址、API Key 与 OpenAI 客户端。它对外暴露的核心数据方法可归纳为四类赛程与战绩get_games(date)同步requests.get请求/games接口以dates[]参数传入YYYY-MM-DD格式日期返回当日比赛列表nba_agent.pyget_standings(season2024)异步请求/standings把返回列表按team.id转成字典字段覆盖胜场/负场、分区、分区排名、主场战绩、客场战绩、近 10 场与连胜/连败如W3、L2等nba_agent.py。伤病与球队信息get_team_injuries(team_id)同步请求/player_injuries按team_ids[]过滤返回球队当前伤病名单nba_agent.py_is_notable_player与_get_season_averages通过/season_averages接口判断球员是否关键球员阈值包括场均得分 ≥ 10、篮板 ≥ 5、助攻 ≥ 4 或出场时间 ≥ 20 分钟用于衡量伤停对球队实力的影响nba_agent.py_get_advanced_stats与_get_team_leaders请求/stats/advanced与/leaders接口可获取进阶数据与球队各项统计领跑者得分/篮板/助攻/抢断/盖帽是扩展分析深度的预留能力nba_agent.py。投注赔率get_betting_odds(game_id, game_date)异步请求/odds接口支持按game_id或date过滤非 200 状态码时返回空列表而非抛异常保证单场赔率缺失不阻塞整体流程nba_agent.py_parse_odds_data解析原始赔率数据提取type spread的away_spread让分盘与type over/under的over_under大小分盘且要求live字段为真nba_agent.py_analyze_over_under基于双方场均得分之和与盘口总分对比给出 OVER / UNDER 的简单规则判断nba_agent.py。这些方法的调用关系在 analyze_matchup 中被串联先取赛季 → 并行拉取双方伤病 → 拉取联盟战绩 → 拉取本场赔率 → 汇总传入_generate_prediction最终返回matchup、prediction与完整data三个字段。自然语言日期解析从Jan 27到 YYYY-MM-DDparse_game_datenba_agent.py是 Agent 理解用户语义的关键一环其设计要点包括时区基准以US/EasternNBA 官方时间区作为基准时区获取当前时间避免跨时区用户提问导致今天错位相对日期命中tomorrow/yesterday/today/tonight关键字时基于美东时间做 ±1 天或取当天计算绝对日期抽取用正则(?i)(jan|january|...|dec|december)\s\d{1,2}从查询中抽取月份日片段兜底解析抽不到日期片段时把整句查询交给dateparser.parse配置项包括时区US/Eastern、返回时区感知对象RETURN_AS_TIMEZONE_AWARE: True、倾向未来日期PREFER_DATES_FROM: future失败反馈解析失败时抛出带引导性的错误信息提示用户请指定日期例如 Jan 29 或 January 29该提示会作为 AI 回复直接返回给用户nba_agent.py。最终统一以strftime(%Y-%m-%d)输出作为/games接口的dates[]参数。球队识别与意图路由30 支球队的别名映射为了支持预测凯尔特人今天的比赛这类球队维度的提问源码内置了一张覆盖全部 30 支球队的别名映射表nba_agent.py每条记录包含球队规范名与常见变体例如规范名匹配变体celticsboston, celticssixersphiladelphia, philly, 76ers, sixerslakersla lakers, lal, lakerswarriorsgolden state, gsw, warriorsmavericksdallas, mavs, mavericksthunderoklahoma, okc, thunder匹配逻辑为遍历映射表只要提问中出现任一变体小写化后做子串匹配即命中球队命中后用同一组变体去过滤当日比赛列表nba_agent.py。路由结果决定回复前缀命中球队且有比赛 → Heres my prediction for the {Team} game on {date}:;命中球队但当日无赛 → 明确告知没有找到该球队在指定日期的比赛;未命中球队 → 返回当日全部场次预测I found N games scheduled for {date}...。该逻辑位于主端点 nba_agent 中是整个预测流程的意图路由层。AI 预测生成Prompt 工程与输出格式约束_generate_predictionnba_agent.py是整个 Agent 的大脑其设计核心是严格约束大模型输出格式便于程序化解析分析型 Prompt把对阵双方、当前战绩如凯尔特人: 32-15、伤病人数等结构化数据拼入 Prompt要求模型按固定三段式输出Winner: [Team Name] ([Win Probability]%) Analysis: 3-4 sentences analyzing key factors including records, matchup advantages, and injury impact Confidence: High/Medium/Low系统角色与生成参数系统提示词设定为You are an expert NBA analyst使用gpt-4-turbo-preview模型temperature0.7、max_tokens200并通过asyncio.to_thread把同步的 OpenAI 调用放到线程池执行避免阻塞事件循环nba_agent.py结果格式化逐行提取Winner:/Analysis:/Confidence:前缀行组装成 客队 (Away) 主队 (Home) 预测正文的展示格式盘口附加在预测末尾追加Betting Lines:区块从最新更新的赔率数据中提取客队让分如Team -3.5与大小分如O 224.5用last_update字段比较选取最新盘口nba_agent.py。需要注意_parse_odds_data要求赔率记录的live字段为真才参与解析而_generate_prediction内部遍历时不再要求live——两处逻辑存在差异二次开发时若发现盘口缺失可优先排查 BallDontLie/odds返回数据中live与type字段的实际取值。Supabase 会话记忆让 Agent 记住上下文Agent 通过 Supabase 的messages表实现会话级记忆nba_agent.pystore_message(session_id, message_type, content, data)把消息对象type、content、可选data插入表内type取值为human用户提问或ai模型回复data中附带request_id及预测的日期、场次数等结构化信息fetch_conversation_history(session_id, limit10)按created_at倒序取最近 N 条记录后反转成时间正序供上下文注入使用。在主端点中用户提问会先于处理被持久化AI 回复连同响应数据在流程末尾统一写入nba_agent.py 与 nba_agent.py实现有问必录、有答必存。这一设计使 Agent 天然兼容 Live Agent Studio 平台的会话管理机制。交互式 Web 界面前端为单文件聊天界面 templates/index.html382 行内嵌样式与脚本欢迎与引导顶部 NBA 主题色深蓝#1d428a 红#c9082a的欢迎横幅内置 4 条示例提问帮助用户快速上手index.htmlWhat are the predictions for todays NBA games?What are the predictions for tomorrows games?What are the predictions for the Celtics game today?What are the predictions for the NBA games on Jan 27?预测卡片渲染formatPrediction函数按拆分多条预测识别Winner:行生成卡片式布局让分盘与大小分盘以不同颜色的 pill 样式区分index.html交互体验含打字指示器typing indicator、加载动画与回车发送请求地址为window.location.origin /api/nba_agent演示 Token 为test123。部署Dockerfile 与 Procfile 双通道项目同时提供了容器化与平台化两种部署方式Dockerfile基于ottomator/base-python:latest基础镜像通过ARG PORT8001支持构建期指定端口ENV PORT与EXPOSE ${PORT}先复制requirements.txt安装依赖以利用 Docker 缓存再复制应用代码最终以uvicorn nba_agent:app --host 0.0.0.0 --port ${PORT}启动Procfile声明web: uvicorn nba_agent:app --host 0.0.0.0 --port $PORT兼容 Railway、Heroku 等读取$PORT环境的 PaaS 平台项目作者线上部署地址即 Railway 域名见 README.md。本地调试推荐uvicorn nba_agent:app --reload自动重载便于迭代生产部署推荐 Dockerfile 或 Procfile 通道并务必把API_BEARER_TOKEN与两个 Supabase 密钥作为部署平台的环境变量注入切忌写死在代码或前端中。已知限制与二次开发建议基于源码可以确认以下限制二次开发时需特别注意赛季号硬编码_get_current_nba_season直接返回2024面向 2024-25 赛季nba_agent.pyget_standings、_get_season_averages等接口同样硬编码赛季值。跨赛季使用需同步更新这些常量未来可改为根据比赛日期动态推导CORS 全放开主版本allow_origins[*]适用于公开演示生产环境建议参考 agent_trial/nba_agent_1.py 收紧为白名单前端 Token 硬编码演示界面内置test123仅限本地联调上线必须改为服务端安全注入语义能力边界日期解析依赖英文月份关键字与dateparser对中文或非常规表述支持有限球队匹配为子串匹配可能对凯尔特人 vs 湖人这类含两队名提问仅命中先出现的球队可扩展方向源码中已预留球员场均、进阶统计、球队领跑者等接口_get_season_averages、_get_advanced_stats、_get_team_leaders与fetch_conversation_history会话上下文可进一步把历史对话与更细粒度的球员/进阶数据注入 Prompt提升分析深度。小结NBA Agent 是一个结构清晰、可完整落地运行的实时数据 大模型推理型体育预测 AgentFastAPI 提供标准化的 Bearer 鉴权接口NBAPredictor聚合赛程、战绩、伤病、赔率四类实时数据parse_game_date与球队别名映射完成自然语言意图理解gpt-4-turbo-preview以严格格式输出胜者/分析/置信度Supabase 负责全量会话持久化前端聊天界面与 Docker/Procfile 双部署通道则覆盖了从演示到上线的完整链路。无论你想复刻一个体育预测机器人还是借鉴多源数据管道 大模型格式化输出的 Agent 设计范式nba_agent.py 与 README.md 都是值得通读的参考实现。【免费下载链接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!项目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考