MCP 无会话化、Claude 默认思考与 Python 3.15:2026 年 8 月开发者升级指南

2026-08-03 43 预计阅读时间: 1 分钟
来源: realpython.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

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 也会更严格地暴露旧代码的问题。


相关推荐