Ollama API 复制模型
POST /api/copy 把一个模型复制成新名字,等价于 ollama cp。它不复制权重数据——新名字只是指向同一份底层内容,所以几乎不占额外磁盘。
版本基线 v0.40.12,官方
docs.ollama.com/api/copy。
一、调用
curl http://localhost:11434/api/copy -d '{
"source": "gemma4",
"destination": "gemma4-backup"
}'
返回:
{ "status": "success" }
二、请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
source |
string | 是 | 原模型名 |
destination |
string | 是 | 新模型名 |
三、最常见的四个用途
1. 兼容写死模型名的客户端
很多工具默认请求 gpt-3.5-turbo、claude-3-5-sonnet 这类名字:
## OpenAI 兼容客户端
ollama cp llama3.2 gpt-3.5-turbo
## Anthropic 兼容客户端
ollama cp qwen3-coder claude-3-5-sonnet
复制后即可直接用:
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}]
}'
这是最实用的一条——避免改客户端源码。
2. 推送前改成 用户名/模型名
ollama push 要求模型名带用户名:
ollama cp mymodel myuser/mymodel
ollama push myuser/mymodel
3. 做修改前的备份
curl http://localhost:11434/api/copy -d '{
"source": "my-model",
"destination": "my-model-backup"
}'
之后可以放心 ollama create 覆盖原模型,出问题就复制回来。
4. 一次下载多处命名
同一个大模型需要在不同工具里用不同名字时,复制比重复下载省几十 GB。
四、复制后发生什么
- 新名字出现在
/api/tags列表里,各占一条 digest与原模型相同(指向同一份内容)modified_at是新时间- 删除其中一个不影响另一个(底层内容有引用计数)
五、Python 示例
import requests
def copy_model(src, dst):
r = requests.post("http://localhost:11434/api/copy", json={
"source": src, "destination": dst,
})
r.raise_for_status()
return r.json()
print(copy_model("gemma4", "gemma4-backup"))
## 确认列表里都有
names = [m["name"] for m in requests.get("http://localhost:11434/api/tags").json()["models"]]
print("gemma4" in names, "gemma4-backup" in names)
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 404 | source 不存在 |
ollama list 核对 |
| 400 | destination 已存在 |
先删除或用别的名字 |
| 复制后磁盘没变小 | 本来就共享内容,不占额外空间 | 正常 |
| push 仍失败 | 名字没带用户名 | 复制成 用户名/模型名 格式 |
动手试
## ① 复制一份
curl -s http://localhost:31434/api/copy -d '{"source":"gemma4","destination":"gemma4-backup"}' 2>/dev/null || \
curl -s http://localhost:11434/api/copy -d '{"source":"gemma4","destination":"gemma4-backup"}'
## ② 确认两个都在,且 digest 相同
curl -s http://localhost:11434/api/tags | python -c "
import sys,json
for m in json.load(sys.stdin)['models']:
if m['name'].startswith('gemma4'):
print(m['name'], m['digest'][:12])"
digest 相同 = 共享内容,磁盘占用没翻倍。