当前位置: 首页 > news >正文

Claude Code 接入开源模型实战:SageMaker 部署 Kimi/GLM + LiteLLM 路由降本 70%

Claude Code 接入开源模型实战:SageMaker 部署 Kimi/GLM + LiteLLM 路由降本 70%

上个月团队全员推广 Claude Code,月底账单 Token 费用翻了 4 倍。

说白了,Claude Code 痛点就两个:代码安全烧钱。代码要发到云端 API,金融医疗行业不敢用;Token 用量指数级增长,成本曲线陡得吓人。

我折腾了两周,搞出一套方案——Amazon SageMaker 部署开源模型 + LiteLLM Proxy 智能路由,支线任务分流到私有化模型。实测性价比提升约 3.2 倍,代码不出 VPC。

先看任务拆解:60% Token 花在"杂活"上

Claude Code 执行任务时,会自动拆分成主线任务支线任务

  • 主线任务:代码重构、架构设计、复杂 bug 排查——需要深度推理
  • 支线任务:会话标题生成、Bash 命令描述、Hook 条件评估——格式固定、逻辑简单

翻了一周调用日志,支线任务占 Token 消耗60% 以上。用 Claude Sonnet 处理,大材小用。

整体架构

Claude Code → LiteLLM Proxy (Task Router) ├── 主线 → Amazon Bedrock (Claude Sonnet) └── 支线 → Amazon SageMaker (Kimi/GLM)

LiteLLM Proxy 做统一网关,Task Router 根据 Prompt 特征自动判断。

支线任务在 VPC 内 SageMaker 处理,不出内网。主线走 Amazon Bedrock,有 VPC Endpoint 和 SOC2/ISO27001 认证。

第一步:SageMaker 部署

推理引擎 SGLang,原生支持 SageMaker Inference API。推荐Kimi-K2.5GLM-5

gitclone https://github.com/ybalbert001/claude-code-aws-skills.gitcdclaude-code-aws-skills/skills/sglang-deploy python deploy.py\--model-id kimi-k2.5\--instance-type ml.p5.48xlarge\--endpoint-name kimi-endpoint\--regionus-east-1

踩坑:选了ml.g5.12xlarge,直接 OOM。算好显存需求

第二步:LiteLLM Proxy 配置

config.yaml

# config.yamlgeneral_settings:store_model_in_db:truemaster_key:"sk-your-master-key"router_settings:timeout:180litellm_settings:callbacks:-"stream_anthropic_schema_fixer.hook"-"dynamic_tagging_handler.proxy_handler_instance"model_list:-model_name:sagemaker-kimi-2-5litellm_params:model:sagemaker-chat/kimi-endpointaws_region_name:us-east-1timeout:180max_tokens:8192drop_params:true-model_name:bedrock-claude-sonnet46litellm_params:model:bedrock/anthropic.claude-sonnet-4-6-v1:0aws_region_name:us-west-2timeout:300

callbacks注册了两个 Hook——动态路由和 Schema 修复,后面细讲。

第三步:Docker Compose 启动

# docker-compose.ymlservices:litellm:image:ghcr.io/berriai/litellm:v1.82.3-stablerestart:alwaysvolumes:-./config.yaml:/app/config.yaml-./stream_anthropic_schema_fixer.py:/app/stream_anthropic_schema_fixer.py:ro-./dynamic_tagging_handler.py:/app/dynamic_tagging_handler.py:rocommand:-"--config=/app/config.yaml"ports:-"8080:4000"environment:DATABASE_URL:"postgresql://llmproxy:dbpassword9090@db:5432/litellm"STORE_MODEL_IN_DB:"True"ENABLE_ANTHROPIC_SCHEMA_FIX:"true"env_file:-.envdepends_on:-dbdb:image:postgres:16restart:alwaysenvironment:POSTGRES_USER:llmproxyPOSTGRES_PASSWORD:dbpassword9090POSTGRES_DB:litellmvolumes:-pgdata:/var/lib/postgresql/datavolumes:pgdata:
dockercompose up-d

第四步:Claude Code 对接

aliascc_proxy="ANTHROPIC_API_KEY=sk-your-litellm-key \ ANTHROPIC_BASE_URL=http://your-litellm-host:8080 \ ANTHROPIC_DEFAULT_SONNET_MODEL=bedrock-claude-sonnet46 \ ANTHROPIC_DEFAULT_HAIKU_MODEL=bedrock-claude-haiku45 \ CLAUDE_CODE_SUBAGENT_MODEL=bedrock-claude-sonnet45 \ claude"

cc_proxy启动,开发者完全无感。

第五步:动态路由 Hook——核心部分

LiteLLM Callback Handler 在 API 调用前拦截请求,动态修改目标模型。

# dynamic_tagging_handler.pyfromlitellm.integrations.custom_loggerimportCustomLoggerclassDynamicRoutingHandler(CustomLogger):deflog_pre_api_call(self,kwargs,response_obj,start_time,end_time):"""API 调用前拦截,根据任务类型动态路由"""messages=kwargs.get("messages",[])full_text=self._extract_all_text(messages)task_model=self._detect_task_type(full_text)iftask_model:print(f"[DynamicRouting] Routing to{task_model}")kwargs["model"]=task_modelreturnkwargsdef_extract_all_text(self,messages):"""提取消息中的所有文本"""text_parts=[]formsginmessages:content=msg.get("content","")ifisinstance(content,str):text_parts.append(content)elifisinstance(content,list):forblockincontent:ifblock.get("type")=="text":text_parts.append(block.get("text",""))return" ".join(text_parts)def_detect_task_type(self,text):"""综合判断任务类型,返回目标模型"""ifself._is_hook_evaluator(text):return"sagemaker-kimi-2-5"elifself._is_session_title_generator(text):return"sagemaker-kimi-2-5"elifself._is_bash_description_writer(text):return"sagemaker-kimi-2-5"eliflen(text)>10000:return"bedrock-claude-sonnet46"returnNonedef_is_hook_evaluator(self,text):"""检测 Hook 条件评估任务"""markers=["You are evaluating a hook in Claude Code","hook condition","Return your evaluation as a JSON object",'"satisfied": true']match_count=sum(1forminmarkersifmintext)returnmatch_count>=3def_is_session_title_generator(self,text):return"Generate a short title"intextand"conversation"intextdef_is_bash_description_writer(self,text):return"Describe what this bash command does"intext proxy_handler_instance=DynamicRoutingHandler()

多特征阈值匹配避免误判,实测命中率 95% 以上。

第六步:Streaming Schema 修复

这步坑了我两天。Claude Code 流式解析器严格按 Anthropic Messages API 设计,开源模型返回数据丢字段直接报错。

解决方案是写 Schema 修复 Hook,逐 chunk 补字段:

# stream_anthropic_schema_fixer.pyfromlitellm.integrations.custom_loggerimportCustomLoggerfromtypingimportAsyncGenerator,Optional,Dict,AnyclassAnthropicSchemaFixerHook(CustomLogger):asyncdefasync_post_call_streaming_iterator_hook(self,user_api_key_dict,response:AsyncGenerator,request_data:dict)->AsyncGenerator:"""拦截流式响应,逐 chunk 修复 schema"""last_usage=Noneasyncforchunkinresponse:ifnotisinstance(chunk,bytes):yieldchunkcontinuetry:decoded=chunk.decode("utf-8")ifnotdecoded.startswith("event:"):yieldchunkcontinueevent_type,data_json=self._parse_sse(decoded)modified=Falseifevent_type=="message_start":modified=self._fix_message_start(data_json)elifevent_type=="message_delta":modified,usage=self._fix_message_delta(data_json)ifusage:last_usage=usageelifevent_type=="message_stop":modified=self._fix_message_stop(data_json,last_usage)ifmodified:yieldself._rebuild_sse(event_type,data_json)else:yieldchunkexceptException:yieldchunk hook=AnthropicSchemaFixerHook()

核心思路:拦截 SSE → 解析 → 按事件类型补字段 → 重编码。修复后流式正常,不会 fallback(非流式下 SageMaker 容易超时)。

实际效果

跑了两周数据:

  • 支线任务占比:约 60%-65% 路由到 SageMaker
  • 成本降低:约 70%,性价比提升约 3.2 倍
  • 代码安全:支线代码不出 VPC
  • 开发者体验:完全无感

踩坑总结

  1. OOM:部署前算显存,实例宁大勿小
  2. Schema 不兼容:Claude Code 更新快,Hook 得跟着调
  3. 路由误判:多特征阈值(≥3),别用单特征
  4. 冷启动:配 provisioned concurrency
  5. 版本锁定:LiteLLM 锁v1.82.3-stable

完整代码和参考链接

  • 代码仓库:https://github.com/ybalbert001/sglang-aws-kit/tree/main/customerize_litellm
  • 部署工具:https://github.com/ybalbert001/claude-code-aws-skills/tree/main/skills/sglang-deploy
  • 亚马逊云科技官博:https://aws.amazon.com/cn/blogs/china/claude-code-open-source-model-enterprise-practice/
  • LiteLLM:https://docs.litellm.ai/
  • SGLang:https://github.com/sgl-project/sglang

方案跑了两周,15 人团队没问题。Kimi-K2.5 和 GLM-5 处理支线很能打,未来能分流的任务只会更多。评论区交流。

http://www.jsqmd.com/news/601954/

相关文章:

  • 2026年柔性气爪品牌推荐:助力产线柔性化升级的实力厂家 - 品牌2026
  • 水墨江南模型Node.js环境配置与API服务开发
  • 09_Elasticsearch知识体系之AgentBuilder与AI增强检索架构
  • 总结2026年干法造粒机选购要点,无锡、济南等地厂家怎么选择 - 工业品网
  • 智慧校园积分兑换柜最新排名 - 聚澜智能
  • 如何快速构建现代开发环境:高效Neovim配置方案LazyVim完整指南
  • 从传统统计方法到深度学习:PyTorch Forecasting的终极演进指南
  • NaViL-9B效果验证:真实办公场景截图识别与内容总结
  • 2026年柔性棱镜抓取:适配多场景的供应商品牌推荐 - 品牌2026
  • 从零开始的密码管理完全指南:SaaS创业公司安全101
  • 项目2|内存池|版本2|高并发内存池
  • 智能配置革命:OpCore-Simplify如何重塑黑苹果安装体验
  • 2026年北美拉斯维加斯美容展- 中国官方代理- 新天国际会展 - 新天国际会展
  • conform.nvim未来路线图:探索这款轻量级Neovim格式化插件的激动人心新功能
  • 从PyMuPDF到fitz:解决pip安装依赖缺失的实战指南
  • 国际品牌系统vs本土专业施工:罐体保温的不同选择路径 - 品牌推荐大师
  • 某安全软件跑飞了。。
  • 智慧校园积分兑换柜-智慧校园积分兑换柜公司推荐 - 聚澜智能
  • OpenClaw配置优化指南:提升Kimi-VL-A3B-Thinking多任务并发性能
  • 【数字图像处理】图像复原实战:从退化模型到逆滤波的清晰之路
  • 英雄联盟回放分析神器:ROFL-Player完全使用指南
  • 最小生成树- # 最大边最小且总边权值最大的生成树
  • Stable Diffusion Videos实战案例:从“蓝莓意面“到“草莓意面“的魔法变身终极指南
  • 2026年潍坊靠谱财务公司排名,售后完善的财务品牌公司盘点 - myqiye
  • 跳跃游戏II-leetcode
  • 2026年全国玻璃钢桥架/不锈钢桥架公司甄选 覆盖多区域且服务完善 - 深度智识库
  • 终极指南:如何在Neovim中配置conform.nvim与Ruff实现Python代码格式化
  • Prescan8.5 百度网盘资源获取与详细安装破解指南
  • 分享校准设备用金属箔电阻生产厂家,选哪个品牌 - 工业品网
  • jenkins发布报gradle error in opening zip file解决