2026 年 8 月的 Python 与 AI 工具链同时出现了三项值得关注的变化:MCP 迎来大规模重写,移除 session 并调整 FastMCP 命名;Claude Opus 5 默认启用 thinking;Python 3.15 发布最后一个 beta 版本。它们分别触及协议状态管理、模型调用成本和 Python 运行时兼容性,不能只当作普通版本号更新处理。
MCP 移除 session,状态需要重新安置
MCP 放弃 session,意味着依赖隐式会话状态的实现需要重新审视。过去由 session 保存的用户身份、工具调用上下文、临时结果或分页游标,不能再默认跟随一条连接存在。
对服务端实现而言,更稳妥的方向是让每次调用都携带完成操作所需的信息:
- 身份与权限从请求认证信息中恢复。
- 业务状态写入数据库、缓存或对象存储。
- 工具调用尽量设计成幂等操作。
- 分页游标和任务 ID 通过响应显式返回。
- 连接中断后,客户端可以凭任务 ID 继续查询,而不是恢复某个内存 session。
FastMCP 的重命名也可能影响导入路径、配置名称、文档链接和脚手架。摘要没有给出新旧 API 的完整映射,因此升级时不应机械执行全局字符串替换。应先检查依赖版本、发行说明以及项目中的导入位置:
python -m pip show mcp fastmcp
rg -n "FastMCP|fastmcp|session" .
python -m pip freeze > requirements.before-mcp-upgrade.txt
其中 rg 用于定位显式依赖 session 或旧 FastMCP 名称的代码。搜索结果还要按用途分类:类型名和导入路径可能需要修改,业务字段名则未必与协议 session 有关。
可以这样实践:把会话内任务改成显式任务资源
下面是一个可直接运行的最小 Python 示例。它不是特定版本 MCP SDK 的正式 API,而是用于演示无会话服务的状态组织方式:客户端提交任务后获得 task_id,后续请求只依赖该 ID,不依赖连接内存。
将代码保存为 stateless_tasks.py,使用 Python 3.11 或更高版本运行:
from __future__ import annotations
import json
import uuid
from dataclasses import asdict, dataclass
from pathlib import Path
STORE = Path("tasks.json")
@dataclass
class Task:
task_id: str
prompt: str
status: str
def load_tasks() -> dict[str, dict[str, str]]:
if not STORE.exists():
return {}
return json.loads(STORE.read_text(encoding="utf-8"))
def save_tasks(tasks: dict[str, dict[str, str]]) -> None:
STORE.write_text(
json.dumps(tasks, ensure_ascii=False, indent=2),
encoding="utf-8",
)
def create_task(prompt: str) -> Task:
tasks = load_tasks()
task = Task(task_id=str(uuid.uuid4()), prompt=prompt, status="queued")
tasks[task.task_id] = asdict(task)
save_tasks(tasks)
return task
def get_task(task_id: str) -> Task | None:
item = load_tasks().get(task_id)
return Task(**item) if item else None
if __name__ == "__main__":
created = create_task("Inspect the repository and summarize failing tests")
print("created:", asdict(created))
restored = get_task(created.task_id)
print("restored:", asdict(restored) if restored else None)
运行命令:
python stateless_tasks.py
cat tasks.json
生产环境应将 JSON 文件替换为 PostgreSQL、Redis 或任务队列,并为任务记录增加租户 ID、过期时间、幂等键和访问控制。不要接受任意 task_id 后直接返回结果,否则显式状态资源会变成越权读取入口。
Claude Opus 5 默认 thinking:行为默认值也是接口变化
Claude Opus 5 默认开启 thinking,最直接的影响未必是回答格式,而是调用延迟、令牌消耗和容量规划。即使应用代码没有变化,模型默认行为发生改变,也可能让超时阈值、预算告警和并发限制失去原有依据。
接入层应记录至少四类数据:模型名称、总耗时、输入输出用量,以及是否显式覆盖 thinking 配置。由于摘要没有提供具体 SDK 参数名,下面使用一个可改造的通用 HTTP 压测脚本;请把 URL、认证头和请求字段替换为实际网关定义。
export LLM_URL="http://localhost:8080/v1/messages"
export LLM_TOKEN="replace-me"
for mode in default explicit_on explicit_off; do
curl --fail-with-body --silent --show-error \
-o "response-${mode}.json" \
-w "mode=${mode} status=%{http_code} total=%{time_total}s\n" \
-X POST "$LLM_URL" \
-H "Authorization: Bearer $LLM_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"model\":\"claude-opus-5\",\"mode\":\"${mode}\",\"prompt\":\"Explain why this database migration can deadlock.\"}"
done
这里的 mode 是示意字段,不代表官方 API。实践重点是同时测量默认行为、显式开启和显式关闭三组请求,并用真实工作负载比较质量、P95 延迟和成本。对代码审查、复杂推理等任务,可以接受更高思考预算;对自动补全、分类和健康检查,则应评估默认 thinking 是否值得。
Python 3.15 最后一个 beta:现在该测试,不该盲目上线
最后一个 beta 是兼容性验证的重要节点,但 beta 仍不是生产稳定版。团队此时应把注意力放在解释器兼容、C 扩展构建、弃用警告和测试框架支持上。
已有 Python 3.15 解释器时,可以用下面的 tox.ini 同时测试当前稳定版本与 3.15。请根据项目实际支持范围调整版本:
[tox]
env_list = py314, py315
[testenv]
package = wheel
wheel_build_env = .pkg
commands = python -W error::DeprecationWarning -m pytest -q
执行:
python -m pip install --upgrade tox pytest
python3.15 --version
tox -e py315
把弃用警告直接提升为错误可能会暴露第三方依赖产生的问题。如果现有项目警告较多,可以先收集清单,再逐步收紧规则:
python3.15 -W default -m pytest -q 2> py315-warnings.log
对包含原生扩展的项目,还应强制从源码构建一次,确认不是因为本机恰好存在缓存 wheel 才通过:
python3.15 -m venv .venv315
. .venv315/bin/activate
python -m pip install --upgrade pip build
python -m pip install --no-binary :all: -e .
python -m pytest -q
升级顺序比升级速度更重要
这三项变化不适合塞进同一个大版本发布。MCP 重写会改变服务状态边界,Claude 默认 thinking 会改变运行成本,Python 3.15 beta 则主要用于提前发现兼容问题。将它们分成独立变更,指标和回滚路径才足够清楚。
建议采用以下检查清单:
- 固定当前 MCP、模型客户端和 Python 依赖版本,保留可复现基线。
- 搜索 session 与 FastMCP 旧名称,区分协议依赖和普通业务命名。
- 将连接内状态迁移为带权限控制和过期策略的显式资源。
- 对 Claude Opus 5 的默认 thinking 建立延迟、质量和成本对照实验。
- 在 CI 中加入 Python 3.15,但暂不替换生产解释器。
- 分别准备协议、模型配置和运行时升级的回滚方案。
真正需要管理的不是三个新版本,而是三种默认假设的变化:连接不再替你保管状态,模型可能自动投入更多推理预算,下一代 Python 也会更严格地暴露旧代码的问题。