💡 一句话总结:M3 真正的工程价值不在「又一个能打的开源模型」,而在 1M 上下文 + 低成本 API 让「把整个代码库交给模型」从理论变成日常操作。本文给你四段直接能跑的代码。
一、M3 是什么,为什么值得动手
2026 年 6 月 1 日,上海 MiniMax 发布了 M3。和发布会上一堆跑分相比,对开发者真正重要的是三件事:
- 1M token 上下文,靠自研的 MSA(MiniMax Sparse Attention)把超长注意力的计算压到接近线性;
- 原生多模态:文本、图像、视频,甚至屏幕截图驱动的桌面操作(computer use)都在同一个模型里;
- 开放权重 + 低价 API:权重将上 HuggingFace,API 同步上线,价格官方称为同档闭源模型的 5%–10%。
定位很清楚——对标编码与 agentic 场景的前沿能力,但用开源权重和低成本把门槛打下来。下面直接进代码。
二、5 分钟调通 M3
M3 的 API 兼容 OpenAI 协议,最快的方式是通过 OpenRouter(已上线 minimax/minimax-m3),或官方平台。用官方 Python SDK 即可:
from openai import OpenAI
# 方式 A:OpenRouter(多模型聚合,免去单独申请)
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="YOUR_OPENROUTER_KEY",
)
resp = client.chat.completions.create(
model="minimax/minimax-m3",
messages=[
{"role": "system", "content": "你是一个严谨的代码审查助手。"},
{"role": "user", "content": "用 Python 写一个带指数退避的 HTTP 重试装饰器,要求支持 jitter。"},
],
temperature=0.2,
)
print(resp.choices[0].message.content)
切换到官方端点只需要改 base_url 和 api_key,模型名换成官方约定的标识(以官方文档为准)。其余调用方式完全一致。
三、把整个代码库塞进 1M 上下文
这是 M3 最有杀伤力的用法。传统做法是 RAG 检索片段,但片段化会丢掉跨文件的调用关系。有了 1M 上下文,可以把一个中型仓库整体喂进去做全局推理:
import os
from pathlib import Path
from openai import OpenAI
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=os.environ["OPENROUTER_KEY"])
def pack_repo(root: str, exts=(".py", ".ts", ".go"), max_chars=2_800_000):
"""把仓库打平成带路径标注的单个字符串,粗略控制在 1M token 量级。"""
chunks, total = [], 0
for p in sorted(Path(root).rglob("*")):
if p.suffix not in exts or p.is_dir():
continue
if any(seg in p.parts for seg in ("node_modules", ".git", "dist")):
continue
text = p.read_text(encoding="utf-8", errors="ignore")
block = f"\n\n===== FILE: {p} =====\n{text}"
if total + len(block) > max_chars:
break
chunks.append(block)
total += len(block)
return "".join(chunks), total
repo_text, size = pack_repo("./my-service")
print(f"打包字符数:{size}")
resp = client.chat.completions.create(
model="minimax/minimax-m3",
messages=[
{"role": "system", "content": "你看到的是一个完整代码库,回答时必须给出涉及的文件路径。"},
{"role": "user", "content": f"{repo_text}\n\n问题:用户登录态在哪些文件里被校验?有没有重复实现可以合并?"},
],
temperature=0.1,
)
print(resp.choices[0].message.content)
⚠️ 注意:
max_chars到 token 的换算很粗糙——中文/代码大约 1 token ≈ 2–3 字符,英文代码更接近 4 字符。打包前最好用tiktoken或官方 tokenizer 精确计数,避免超限被截断。
实测体感:跨文件的「这个函数在哪被调用」「这两处逻辑能不能合并」这类问题,整库精读明显优于 RAG 片段,因为模型能看到完整的调用链。
四、一个带工具调用的 agentic 循环
M3 主打 agentic,下面是一个最小可用的工具调用循环(function calling 协议同样兼容 OpenAI):
import json
from openai import OpenAI
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key="YOUR_KEY")
tools = [{
"type": "function",
"function": {
"name": "run_shell",
"description": "在沙箱里执行一条 shell 命令并返回 stdout",
"parameters": {
"type": "object",
"properties": {"cmd": {"type": "string"}},
"required": ["cmd"],
},
},
}]
def run_shell(cmd: str) -> str:
import subprocess
# 生产中务必放进容器/沙箱并加白名单,这里仅示意
return subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=20).stdout[:4000]
messages = [{"role": "user", "content": "统计当前目录下有多少个 Python 文件,并告诉我最大的那个。"}]
for _ in range(6): # 限制最大轮数,防止失控
resp = client.chat.completions.create(
model="minimax/minimax-m3", messages=messages, tools=tools, temperature=0,
)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content)
break
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = run_shell(args["cmd"])
messages.append({
"role": "tool", "tool_call_id": call.id, "content": result,
})
关键工程点:一定要设最大轮数上限和工具沙箱。agentic 模型失控时会反复调用工具,没有 for _ in range(6) 这种硬上限,一次任务可能烧掉大量 token。
五、自部署:显存与吞吐怎么估
M3 是 MoE,总参数大、激活参数小。自部署时显存主要被三块吃掉:全部专家权重、1M token 的 KV cache、运行时缓冲。粗略经验:
- 全精度:需要多卡 H100/H200 级别,1M KV cache 本身就是显存大户;
- FP8 / INT4 量化:显存可降到 1/2–1/3,编码任务上质量损失通常可接受;
- 吞吐:MSA 让长上下文 prefill 比稠密注意力快得多,但实现质量决定一切——用官方推荐的推理引擎(vLLM / SGLang 的适配版本),别自己手写 attention kernel。
如果没有多卡环境,最务实的方案是:日常短请求走量化小模型,只在真正需要百万上下文时调 API 或临时拉起自部署实例。
六、五个避坑清单
- token 计数别拍脑袋:1M 上下文很容易被「字符数估算」坑,务必用真实 tokenizer 计数后再发请求。
- 长上下文 ≠ 免费午餐:每次塞满 1M token,成本和延迟都线性上涨,能 RAG 粗筛就先粗筛。
- agentic 循环必须设硬上限:最大轮数 + 工具超时 + token 预算,三者缺一不可。
- computer use 要人在环:发布初期可靠性有限,生产环境务必加动作确认和回滚。
- 量化先小流量灰度:INT4 在编码长链推理上偶尔会崩,上线前用你自己的真实任务集回归一遍,别只信公开跑分。
M3 的意义在于把「整库级别的代码理解」和「低成本 agentic」同时拉到了开源可及的范围。先用 API 把上面四段代码跑通,再决定要不要上自部署——这是性价比最高的上手路径。