从 Claude 到 Kimi:基于 NVIDIA NIM API 的单轮对话代理实现

a simple claude to kimi python proxy script

这是一个轻量级代理服务器,允许通过 Claude 兼容的接口访问 NVIDIA NIM 平台上的 Kimi K2 Instruct 模型。

功能特点:

  • 将 Anthropic Claude 格式的请求转换为 NVIDIA NIM API 格式
  • 支持单轮对话(无状态,不保存对话历史)
  • 将 Kimi K2 的响应转回 Claude 兼容格式

个人开发者可以通过 NVIDIA NIM for Developers 平台获取 API 密钥,
免费访问 Kimi K2 Instruct 等模型进行测试和开发。

设置
.env 文件

NVIDIA_API_KEY=nvapi-SZxxxx-nim-moonshot-key

安装的依赖 requirements.txt

fastapi==0.116.1
openai==1.97.0
python-dotenv==1.1.1
requests==2.32.3
uvicorn==0.35.0
``
single_turn_anthropic_nim_adapter.py 如下
```single_turn_anthropic_nim_adapter.py 
import os, json, requests, uvicorn
from fastapi import FastAPI, Request, Response
from dotenv import load_dotenv

# 加载 .env 文件中的环境变量
load_dotenv()

# 从环境变量获取 API 密钥
API_KEY = os.getenv('NVIDIA_API_KEY')
if not API_KEY:
    raise ValueError("NVIDIA_API_KEY 环境变量未设置。请确保 .env 文件中包含此变量。")

END = "https://integrate.api.nvidia.com/v1/chat/completions"
HEADERS = {"Authorization": f"Bearer {API_KEY}",
            "Content-Type":   "application/json"}

app = FastAPI()

@app.post("/v1/messages")
async def proxy(req: Request):
    body = await req.json()
    print("\n\n===== REQUEST BODY =====")
    print(json.dumps(body, indent=2))
    print("========================\n\n")
    # 把 anthropic 的格式转成 kimi K2 认识的 OpenAI 兼容格式
    payload = {
        "model":  "moonshotai/kimi-k2-instruct",   # 或其他可用的的 model id
        "messages": [{"role": "user",
                    "content": body["messages"][-1]["content"]}]
    }
    try:
        response = requests.post(END, json=payload, headers=HEADERS)
        print(f"API Response: {response.status_code} {response.text}")
        
        if response.status_code != 200:
            return {
                "content": [{"type": "text", "text": f"API Error: {response.status_code} {response.text}"}]
            }
            
        res = response.json()
        # 再把 K2 的 openai 响应转回 anthropic 格式
        return {
            "content": [{"type": "text", "text": res["choices"][0]["message"]["content"]}]
        }
    except Exception as e:
        print(f"Exception: {str(e)}")
        return {
            "content": [{"type": "text", "text": f"Error: {str(e)}"}]
        }

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8088)

claude code 使用时,设置环境变量
set anthropic_base_url=http://localhost:8088
set anthropic_api_key=anything_you_like
可以通过 curl 命令测试
curl -v http://localhost:8088/v1/messages -H "Content-Type: application/json; charset=utf-8" -d "{\"messages\":[{\"role\":\"user\",\"content\":\"\u4f60\u5c3d\u529b\u4e86\u5417\"}]}"
(不支持直接 curl 中文请求)

posted @ 2025-07-22 19:11  geyee  阅读(54)  评论(0)    收藏  举报