首先需要澄清一点:"Claude 接入 Kiro 鬼点子计划"并不是指 Anthropic 的 Claude 模型官方接入了某个名为"鬼点子计划"的项目。实际情况是:"Kiro 鬼点子计划"是亚马逊云科技(AWS)面向开发者发起的一项创意编程活动,鼓励开发者使用 Kiro IDE 做出"看似荒诞、实则惊艳"的 Demo,冠军最高可获得价值 $2400 的 Kiro 订阅权益,报名截止日期为 2026 年 10 月 22 日。
而 Kiro 本身是 AWS 于 2025 年 7 月推出的 Agentic IDE,内置了 Anthropic Claude 全系列模型(包括 Opus 4.7、Sonnet 4 等),因此开发者可以通过 Kiro 间接使用 Claude 模型进行 AI 辅助编程。社区中广泛讨论的"Claude 接入 Kiro",实质是指通过反向代理或 API 转换的方式,将 Kiro 内置的 Claude 模型额度暴露为标准 API 接口,从而在 Claude Code、Cursor 等第三方工具中调用 Kiro 的模型能力。
本报告将从技术原理、Python 实现、代码解析与亮点四个维度展开分析。
二、技术架构与核心原理
2.1 Kiro 的模型生态
Kiro 基于 Code OSS(VS Code 开源版本)构建,采用"规范驱动开发"(Spec-Driven Development)理念,核心能力包括:
- Spec 模式:将自然语言需求转化为结构化需求文档、系统设计和任务清单,适合复杂项目
- Vibe 模式:对话式即时编码,适合快速原型开发
- 多模型支持:内置 Claude Opus 4.7、Sonnet 4、Titan、Llama 等模型,支持自动路由
- MCP 协议:通过 Model Context Protocol 连接外部工具和数据源
Kiro 采用 Credit 额度池计费,Free 套餐每月 50 credits,Pro 套餐 $20/月含 1000 credits。
2.2 反向代理接入的核心思路
社区方案的通用架构如下:
Claude Code / Cursor / 其他工具 ↓ 反向代理层(AIClient-2-API / kiro2api / Kiro Router Desktop) ↓ Kiro API(OAuth 凭证认证) ↓ Claude 模型(Opus / Sonnet / Haiku)核心原理是:Kiro IDE 内置了 Claude 模型的 API 访问权限,通过 OAuth 凭证认证。开源反向代理工具负责将 Kiro 的私有协议转换为标准的 Anthropic API 格式或 OpenAI API 格式,使得任何支持标准接口的客户端都能透明调用。
2.3 技术挑战
- 协议转换:Kiro 使用私有 API 协议,需转换为 Anthropic
/v1/messages或 OpenAI/v1/chat/completions格式 - 流式响应:Claude Code 等工具依赖 SSE(Server-Sent Events)流式输出,代理层需正确处理
- 凭证管理:Kiro 使用 OAuth Token,需实现自动刷新机制
- 多账号池化:支持多账号轮询以突破单账号额度限制
三、Python 实现:Kiro-Claude 代理服务器
以下是一个简化的 Python 反向代理实现,演示核心思路:
""" Kiro-Claude 反向代理服务器 将 Kiro 内置的 Claude 模型能力转换为标准 Anthropic API 格式 """importasyncioimportjsonimportloggingfromtypingimportAsyncGenerator,Dict,List,OptionalimporthttpxfromfastapiimportFastAPI,Header,HTTPException,Requestfromfastapi.responsesimportStreamingResponse# 配置日志logging.basicConfig(level=logging.INFO)logger=logging.getLogger(__name__)app=FastAPI(title="Kiro-Claude Proxy")# ==================== 配置区 ====================KIRO_API_BASE="https://api.kiro.dev/v1"# Kiro API 基地址(示意)KIRO_OAUTH_TOKEN="your_kiro_oauth_token"# Kiro OAuth TokenPROXY_PORT=8080# 模型映射:Anthropic 模型名 -> Kiro 内部模型标识MODEL_MAPPING={"claude-opus-4-7":"kiro-opus-4.7","claude-sonnet-4":"kiro-sonnet-4","claude-haiku-4":"kiro-haiku-4",}# ==================== 核心类 ====================classKiroClient:"""Kiro API 客户端,负责与 Kiro 后端通信"""def__init__(self,oauth_token:str):self.oauth_token=oauth_token self.client=httpx.AsyncClient(base_url=KIRO_API_BASE,timeout=httpx.Timeout(60.0,connect=10.0),headers={"Authorization":f"Bearer{oauth_token}","Content-Type":"application/json",},)asyncdefcheck_token_valid(self)->bool:"""验证 OAuth Token 是否有效"""try:resp=awaitself.client.get("/auth/me")returnresp.status_code==200exceptExceptionase:logger.error(f"Token 验证失败:{e}")returnFalseasyncdefcreate_completion(self,model:str,messages:List[Dict[str,str]],stream:bool=False,max_tokens:Optional[int]=None,temperature:float=0.7,)->Dict:""" 调用 Kiro API 生成回复(非流式) Args: model: 模型名称(Anthropic 格式) messages: 消息列表 stream: 是否流式输出 max_tokens: 最大输出 token 数 temperature: 温度参数 Returns: 标准 Anthropic API 格式的响应 """# 模型名转换kiro_model=MODEL_MAPPING.get(model)ifnotkiro_model:raiseValueError(f"不支持的模型:{model}")# 构建 Kiro API 请求体payload={"model":kiro_model,"messages":self._convert_messages(messages),"stream":stream,"max_tokens":max_tokensor4096,"temperature":temperature,}logger.info(f"请求模型:{model}->{kiro_model}")resp=awaitself.client.post("/chat/completions",json=payload)resp.raise_for_status()# 转换为 Anthropic 格式returnself._convert_response(resp.json(),model)asyncdefcreate_completion_stream(self,model:str,messages:List[Dict[str,str]],max_tokens:Optional[int]=None,temperature:float=0.7,)->AsyncGenerator[str,None]:""" 流式调用 Kiro API Yields: SSE 格式的数据片段 """kiro_model=MODEL_MAPPING.get(model)ifnotkiro_model:raiseValueError(f"不支持的模型:{model}")payload={"model":kiro_model,"messages":self._convert_messages(messages),"stream":True,"max_tokens":max_tokensor4096,"temperature":temperature,}asyncwithself.client.stream("POST","/chat/completions",json=payload)asresp:resp.raise_for_status()asyncforlineinresp.aiter_lines():ifline.startswith("data: "):# 转换 Kiro 流式格式为 Anthropic SSE 格式try:chunk=json.loads(line[6:])sse_chunk=self._convert_stream_chunk(chunk,model)yieldf"data:{json.dumps(sse_chunk)}\n\n"exceptjson.JSONDecodeError:continue# 发送结束标记yield"data: [DONE]\n\n"# ==================== 格式转换工具方法 ====================@staticmethoddef_convert_messages(messages:List[Dict])->List[Dict]:"""将 Anthropic 消息格式转换为 Kiro 内部格式"""converted=[]formsginmessages:role=msg.get("role","user")content=msg.get("content","")# Anthropic 使用 user/assistant,Kiro 可能使用 user/modelkiro_role="user"ifrole=="user"else"assistant"converted.append({"role":kiro_role,"content":content})returnconverted@staticmethoddef_convert_response(kiro_resp:Dict,original_model:str)->Dict:"""将 Kiro 响应转换为 Anthropic API 格式"""return{"id":f"kiro-{kiro_resp.get('id','unknown')}","object":"chat.completion","created":kiro_resp.get("created"),"model":original_model,"choices":[{"index":0,"message":{"role":"assistant","content":kiro_resp["choices"][0]["message"]["content"],},"finish_reason":kiro_resp["choices"][0].get("finish_reason","stop"),}],"usage":kiro_resp.get("usage",{}),}@staticmethoddef_convert_stream_chunk(kiro_chunk:Dict,original_model:str)->Dict:"""转换流式响应片段"""return{"id":f"kiro-{kiro_chunk.get('id','stream')}","object":"chat.completion.chunk","created":kiro_chunk.get("created"),"model":original_model,"choices":[{"index":0,"delta":{"role":"assistant"ifkiro_chunk.get("is_first")elseNone,"content":kiro_chunk.get("content",""),},"finish_reason":kiro_chunk.get("finish_reason"),}],}# ==================== FastAPI 路由 ====================kiro_client=KiroClient(oauth_token=KIRO_OAUTH_TOKEN)@app.get("/health")asyncdefhealth_check():"""健康检查端点"""valid=awaitkiro_client.check_token_valid()return{"status":"ok"ifvalidelse"token_invalid"}@app.post("/v1/messages")asyncdefanthropic_messages(request:Request):""" 兼容 Anthropic /v1/messages 接口 这是 Claude Code 等工具使用的标准接口 """body=awaitrequest.json()model=body.get("model","claude-sonnet-4")messages=body.get("messages",[])stream=body.get("stream",False)max_tokens=body.get("max_tokens",4096)temperature=body.get("temperature",0.7)try:ifstream:# 流式响应asyncdefevent_generator():asyncforchunkinkiro_client.create_completion_stream(model=model,messages=messages,max_tokens=max_tokens,temperature=temperature,):yieldchunkreturnStreamingResponse(event_generator(),media_type="text/event-stream",headers={"Cache-Control":"no-cache","Connection":"keep-alive","X-Accel-Buffering":"no",# 禁用 Nginx 缓冲},)else:# 非流式响应result=awaitkiro_client.create_completion(model=model,messages=messages,stream=False,max_tokens=max_tokens,temperature=temperature,)returnresultexceptValueErrorase:raiseHTTPException(status_code=400,detail=str(e))excepthttpx.HTTPStatusErrorase:logger.error(f"Kiro API 错误:{e.response.status_code}-{e.response.text}")raiseHTTPException(status_code=e.response.status_code,detail=f"Kiro API 错误:{e.response.text}",)exceptExceptionase:logger.error(f"服务器内部错误:{e}",exc_info=True)raiseHTTPException(status_code=500,detail=str(e))@app.post("/v1/chat/completions")asyncdefopenai_chat_completions(request:Request):""" 兼容 OpenAI /v1/chat/completions 接口 方便 Cursor、Continue 等支持 OpenAI 格式的工具接入 """body=awaitrequest.json()model=body.get("model","claude-sonnet-4")messages=body.get("messages",[])stream=body.get("stream",False)# 复用 Anthropic 接口的逻辑(内部做格式适配)anthropic_messages=[]formsginmessages:anthropic_messages.append({"role":msg["role"],"content":msg["content"]})# 构造 Anthropic 格式请求并转发fake_request=Request(scope=request.scope)fake_request._body=json.dumps({"model":model,"messages":anthropic_messages,"stream":stream,"max_tokens":body.get("max_tokens",4096),"temperature":body.get("temperature",0.7),}).encode()returnawaitanthropic_messages(fake_request)# ==================== 启动入口 ====================if__name__=="__main__":importuvicorn uvicorn.run(app,host="0.0.0.0",port=PROXY_PORT)四、代码解析
4.1 架构设计亮点
分层设计:代码采用清晰的三层架构:
- Client 层(
KiroClient):封装与 Kiro API 的通信细节,包括认证、请求构建、响应转换 - Adapter 层(格式转换方法):负责 Anthropic/OpenAI/Kiro 三种协议之间的双向转换
- API 层(FastAPI 路由):暴露标准接口,处理 HTTP 请求/响应
这种设计使得各层职责单一,便于独立测试和扩展。
4.2 双协议兼容
代码同时实现了:
/v1/messages:Anthropic 原生接口,Claude Code 直接使用/v1/chat/completions:OpenAI 兼容接口,Cursor、Continue 等工具可直接接入
这意味着一套代理服务可以同时服务多种客户端,降低部署成本。
4.3 流式响应处理
流式输出是 AI 编程工具的核心体验。代码中:
- 使用
httpx.AsyncClient.stream()建立长连接 - 逐行解析 Kiro 的 SSE 输出
- 实时转换为 Anthropic 格式并通过
StreamingResponse返回 - 设置
X-Accel-Buffering: no防止 Nginx 缓冲导致延迟
4.4 可扩展性设计
- 模型映射表(
MODEL_MAPPING):新增模型只需添加一行配置 - Token 验证:
check_token_valid()方法可用于健康检查和自动告警 - 多账号池化:可扩展
KiroClient为连接池,实现多账号轮询和故障转移
五、技术亮点总结
| 亮点 | 说明 |
|---|---|
| 协议桥接 | 将 Kiro 私有协议转换为行业标准 API 格式,实现"一次接入,多端复用" |
| 零侵入集成 | 客户端无需修改代码,只需更换 API Base URL 即可使用 |
| 流式低延迟 | 异步流式处理确保首字响应时间(TTFT)接近原生体验 |
| 成本优化 | 利用 Kiro 订阅额度替代按 Token 计费的 Anthropic 官方 API,日常编码场景性价比更高 |
| 安全可控 | OAuth Token 本地管理,请求日志可审计,适合企业内网部署 |
六、注意事项与合规提醒
- 服务条款:使用反向代理方案需仔细阅读 Kiro 和 Anthropic 的服务条款,确保不违反使用限制
- 区域限制:自 2026 年 5 月 1 日起,中国区用户无法使用 Kiro 中的 Claude 模型和 Auto agent
- 稳定性风险:社区方案依赖 Kiro 内部 API,接口变更可能导致代理失效
- 官方替代方案:AWS 已推出官方的 Agent Plugin for AWS Serverless,支持在 Claude Code 中直接安装使用,企业用户建议优先考虑官方方案
七、结语
"Claude 接入 Kiro"本质上是开发者生态中常见的能力复用与协议桥接实践。Kiro 鬼点子计划则体现了 AWS 鼓励开发者探索 AI 编程边界的开放态度。无论是通过社区反向代理方案还是官方插件体系,核心目标都是让开发者更高效地利用 AI 能力。对于技术研究而言,理解其背后的协议转换、流式处理和架构设计思路,比单纯"白嫖额度"更有价值。