Kiro Gateway:将Kiro API转换为OpenAI/Anthropic兼容接口的智能代理网关
1. 项目概述一个为Kiro API量身打造的智能代理网关如果你和我一样是个重度依赖AI辅助编程的开发者那你肯定对Claude、GPT这些模型不陌生。但很多时候我们手头的工具——无论是Cursor、Continue.dev这样的IDE插件还是LangChain、OpenAI SDK这类开发框架——它们默认对接的往往是官方的Anthropic或OpenAI API。这就带来了一个痛点你手头明明有Kiro也就是Amazon Q Developer / AWS CodeWhisperer的免费或付费额度里面包含了强大的Claude模型却没法在你习惯的开发工具里直接调用只能被局限在特定的IDE或CLI里使用。Kiro Gateway这个项目就是为了解决这个“割裂感”而生的。它本质上是一个轻量级的代理服务器用Python和FastAPI写成部署在你自己的本地环境或服务器上。它的核心功能就一句话把你本地的Kiro账户权限“翻译”成标准的OpenAI API或Anthropic Messages API。这样一来任何兼容这两个主流接口的工具都能无缝使用你Kiro账户里的模型能力了。我最初接触这个项目是因为团队里有人用Cursor有人用VSCodeContinue还有人直接用脚本调用。大家模型偏好不同但公司统一采购了Kiro的企业版。为了统一开发体验、避免重复购买API额度我花了几天时间研究部署了这个网关。实测下来它非常稳定几乎感受不到延迟而且因为直接复用Kiro的认证体系安全性上也比把密钥到处分发要靠谱得多。2. 核心原理与架构设计拆解2.1 网关的核心工作流程一次请求的“旅程”要理解这个网关的价值得先明白它背后干了什么。我们以一个最常见的场景为例你在Cursor里写代码触发AI补全。请求发起Cursor配置了你的网关地址作为OpenAI API Endpoint向你本地localhost:8000的网关发送一个标准的OpenAI格式的Chat Completion请求。协议转换网关收到请求后第一件事就是“翻译”。它需要把OpenAI API的请求体包括model,messages,stream等参数转换成Kiro后端API能理解的格式。这里有个关键点Kiro的模型命名可能和OpenAI/Anthropic的通用名不同比如claude-3-5-sonnet-20241022网关内部维护了一个映射表来处理这些差异。身份认证这是网关最核心也最巧妙的部分。它不会要求你提供Kiro的API Key事实上Kiro可能根本不提供这种传统的API Key。相反它利用了你本地已经通过Kiro IDE或kiro-cli登录后生成的认证文件通常是JSON或SQLite数据库。网关读取这些文件获取里面的refresh_token并在令牌快过期时自动刷新以此维持一个有效的会话。这意味着你的敏感令牌永远不需要离开你的本地环境。代理与转发网关使用获取到的有效访问令牌access_token将转换后的请求发送到Kiro官方的API端点例如https://api.kiro.dev/v1/messages。如果你的网络环境需要网关还支持配置HTTP/SOCKS5代理来中转这个请求这对某些企业网络或特定地区的用户非常实用。响应回流与再转换Kiro API返回响应通常是流式的SSE数据。网关再充当“翻译官”把Kiro的响应格式重新打包成OpenAI或Anthropic的标准流式或非流式响应原路返回给Cursor。会话维持整个过程中网关会妥善处理请求头、错误码比如自动重试429或5xx错误、以及流式数据的完整性和边界确保上游工具获得稳定、一致的体验。简单说它就是一个高度定制化的、双向的协议转换器认证管理器。它的存在让你常用的AI工具“以为”自己在调用OpenAI但实际上消耗的是你Kiro账户的资源。2.2 为什么选择FastAPI与异步架构项目选用FastAPI不是偶然。作为一个代理网关它面临几个核心挑战高并发可能同时服务多个IDE插件和脚本、低延迟代码补全的体验必须丝滑、以及流式传输的稳定性SSE数据流不能断。FastAPI基于Starlette和Pydantic天生支持异步async/await这对于代理大量I/O操作网络请求、流式响应的场景是性能上的绝配。异步处理意味着在等待Kiro API返回数据时服务器可以腾出资源去处理其他请求而不是干等着这直接提升了网关的吞吐能力和响应速度。Pydantic则负责请求/响应数据的验证和序列化。OpenAI和Anthropic的API规范非常复杂消息体、工具调用function calling、图像内容等嵌套结构很多。用Pydantic定义数据模型能确保进来的请求格式正确出去的响应也符合标准省去了大量手写校验逻辑的麻烦也减少了出错的概率。我自己在早期测试时尝试过同步的Flask方案当处理多个并发的流式请求时延迟和资源占用明显上升。切换到FastAPI的异步端点后即使同时打开Cursor、Claude Desktop和一个测试脚本网关的CPU和内存占用依然保持低位响应也很及时。2.3 认证策略的灵活性与安全性考量网关支持多种认证方式这体现了设计者对不同用户场景的考虑。安全性是这里的重中之重。方式一JSON凭证文件最推荐这是Kiro IDE桌面应用登录后自动生成的。文件通常位于~/.aws/sso/cache/kiro-auth-token.json。网关直接读取这个文件获取refresh_token。它的安全优势在于这个文件受操作系统权限保护且refresh_token本身不能直接用于API调用需要配合客户端ID和密钥通常也在同一目录下另一个文件里才能换到短期的access_token。网关内部集成了完整的OAuth 2.0刷新流程。方式二环境变量适合Docker或CI/CD环境。你可以将REFRESH_TOKEN等直接写入环境变量。但务必注意这意味着令牌以明文形式存在。你需要在部署层面确保环境的安全比如使用Docker secrets或云服务商的安全管理器。方式三AWS SSO集成针对使用AWS IAM Identity Center原SSO登录的企业用户或Builder ID免费用户。网关能自动识别这类凭证文件格式并调用对应的OIDC端点进行令牌刷新。这种方式对用户最透明登录一次kiro-cli就全搞定了。方式四直读SQLite数据库kiro-cli会将令牌加密后存储在本地SQLite数据库中。网关提供了直接读取这个数据库的选项。这种方式避免了手动提取令牌但需要网关进程有读取该数据库文件的权限。重要安全提示无论哪种方式网关本身都需要一个PROXY_API_KEY。这个密钥不是你的Kiro凭证而是用来保护你部署的网关服务本身的。想象一下如果你把网关部署在局域网甚至公网没有这个密钥任何人都可以随意使用你的网关从而消耗你的Kiro额度。所以这个PROXY_API_KEY一定要设成一个足够复杂、唯一的字符串并在连接Cursor等客户端时在API Key字段填入它。3. 从零开始的详细部署与配置指南纸上谈兵终觉浅我们来实际部署一遍。我会以最常用的“本地Python运行”和“Docker部署”两种方式为例把每个步骤和可能遇到的坑都讲清楚。3.1 环境准备与依赖安装首先确保你的系统满足最低要求Python 3.10或更高版本。这是必须的因为项目用到了Python 3.10引入的某些特性比如更严格的类型提示语法。# 1. 克隆项目代码 git clone https://github.com/Jwadow/kiro-gateway.git cd kiro-gateway # 如果你没有git也可以直接从GitHub页面下载ZIP包并解压接下来安装依赖。强烈建议使用虚拟环境避免污染系统级的Python包。# 2. 创建并激活虚拟环境以venv为例 python -m venv venv # 在Linux/macOS上激活 source venv/bin/activate # 在Windows上激活 # venv\Scripts\activate # 3. 安装依赖包 pip install -r requirements.txtrequirements.txt里核心就是fastapi,httpx,pydantic这几个。安装过程通常很顺利。如果遇到速度慢可以临时换用国内镜像源比如pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。3.2 关键配置详解四种凭证方式如何选安装完依赖最重要的一步就是配置。网关的配置文件是一个.env文件你需要从模板复制并修改。cp .env.example .env # 然后用你喜欢的文本编辑器打开 .env 文件打开.env文件你会看到很多配置项。我们聚焦在最关键的认证部分。以下是四种主要方式的选择策略和配置示例场景A我是Kiro IDE个人用户只想在本地电脑上用。这是最常见的情况。你已经在电脑上安装了Kiro IDE并且登录了。找到Kiro IDE生成的凭证文件。它通常在~/.aws/sso/cache/目录下Windows在C:\Users\你的用户名\.aws\sso\cache\文件名类似kiro-auth-token.json。在.env文件中这样配置# 指向你的凭证文件路径 KIRO_CREDS_FILE~/.aws/sso/cache/kiro-auth-token.json # 设置一个强密码来保护你的网关服务 PROXY_API_KEYyour_very_strong_password_here_123!注意路径中的~在Linux/macOS上代表用户目录在Windows的某些环境如PowerShell中可能无法识别建议使用绝对路径如C:/Users/YourName/.aws/sso/cache/kiro-auth-token.json。场景B我使用kiro-cli命令行工具或者公司用的是AWS SSO。如果你是通过kiro-cli login命令登录的或者公司账户走的是AWS单点登录。同样凭证文件在~/.aws/sso/cache/目录下但文件名可能是一串哈希值比如1234567890abcdef.json。你可以配置指向这个文件或者使用更省心的SQLite数据库方式。方式一推荐指向SSO缓存文件# 你需要确认具体的文件名可能是哈希名也可能是 kiro-auth-token.json KIRO_CREDS_FILE~/.aws/sso/cache/1234567890abcdef.json PROXY_API_KEYyour_very_strong_password_here_123! # 对于AWS SSO通常不需要指定 PROFILE_ARN方式二更稳定直读kiro-cli数据库# 数据库路径通常是固定的 KIRO_CLI_DB_FILE~/.local/share/kiro-cli/data.sqlite3 PROXY_API_KEYyour_very_strong_password_here_123!这种方式网关会自己去数据库里读加密的令牌无需你关心文件具体在哪。数据库路径对于Linux/macOS和Windows是不同的项目文档的Docker部分有详细说明。场景C我想用Docker部署或者把令牌放在环境变量里。适合云服务器部署或不想依赖本地文件的场景。你需要手动获取refresh_token。获取refresh_token有点麻烦因为它通常不会直接显示。一个方法是检查上述JSON凭证文件中的refreshToken字段。请谨慎操作不要泄露此令牌。在.env文件中配置REFRESH_TOKENeyJ...你的长串refresh_token PROFILE_ARNarn:aws:codewhisperer:us-east-1:你的账户ID:你的配置文件名 KIRO_REGIONus-east-1 # 通常是 us-east-1 PROXY_API_KEYyour_very_strong_password_here_123!PROFILE_ARN和KIRO_REGION通常可以在Kiro IDE的设置或AWS控制台中找到。这种方式灵活性高但令牌暴露在环境变量中需确保环境安全。3.3 启动服务与验证配置好.env文件后启动就非常简单了。# 默认端口启动 python main.py # 如果8000端口被占用可以指定其他端口 python main.py --port 9000如果一切正常你会看到类似下面的输出INFO: Started server process [12345] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRLC to quit)打开浏览器访问http://localhost:8000或http://localhost:8000/health应该能看到一个简单的健康检查页面返回{status:ok}。这说明网关服务已经成功跑起来了。3.4 Docker化部署更优雅的长期运行方案对于希望服务在后台稳定运行或者打算在服务器上部署的开发者Docker是最佳选择。它解决了环境依赖和进程管理的问题。首先确保你的系统已经安装了Docker和Docker Compose。准备配置和上面一样在项目根目录准备好你的.env文件。修改Docker Compose配置打开docker-compose.yml文件。关键是要把本地的凭证文件或数据库“映射”到容器内部。找到volumes部分根据你的操作系统取消注释对应的行。如果你是Linux/macOS用户volumes: # 映射Kiro IDE凭证目录 - ~/.aws/sso/cache:/home/kiro/.aws/sso/cache:ro # 映射kiro-cli数据库目录 - ~/.local/share/kiro-cli:/home/kiro/.local/share/kiro-cli:ro如果你是Windows用户volumes: # 映射Kiro IDE凭证目录 - ${USERPROFILE}/.aws/sso/cache:/home/kiro/.aws/sso/cache:ro # 映射kiro-cli数据库目录 - ${USERPROFILE}/.local/share/kiro-cli:/home/kiro/.local/share/kiro-cli:ro:ro表示只读映射这样容器可以读取你的凭证但无法修改更安全。启动服务docker-compose up -d这个命令会拉取镜像如果本地没有创建并启动容器在后台运行。管理服务# 查看实时日志 docker-compose logs -f # 重启服务修改配置后 docker-compose restart # 停止并移除容器 docker-compose down # 更新到最新镜像并重启 docker-compose pull docker-compose up -d使用Docker后网关服务就成了一个系统级的后台服务开机自启、崩溃重启都可以通过Docker Compose或系统服务管理器如systemd来轻松管理。4. 客户端配置实战让各种工具连接你的网关网关跑起来了接下来就是让它发挥作用。我们来看看如何配置那些常用的开发工具。4.1 配置Cursor IDECursor是许多开发者的主力配置起来很简单。打开Cursor进入设置Settings。找到Features-AI或者直接搜索“OpenAI”。你会看到OpenAI API Base和OpenAI API Key两个配置项。OpenAI API Base填入你的网关地址例如http://localhost:8000/v1。如果你部署在远程服务器则填入http://你的服务器IP:端口/v1。OpenAI API Key填入你在.env文件中设置的PROXY_API_KEY例如your_very_strong_password_here_123!。保存设置。现在当你在Cursor中使用Chat或Completions时它就会将请求发送到你的网关并使用Kiro的模型来响应。4.2 配置Continue.dev (VSCode插件)Continue是VSCode里非常强大的AI编程助手插件。在VSCode中安装Continue插件。打开VSCode的设置JSON模式编辑settings.json。添加或修改以下配置{ continue.models: [ { title: Claude via Kiro Gateway, provider: openai, model: claude-sonnet-4-5, // 或你喜欢的其他模型 apiBase: http://localhost:8000/v1, apiKey: your_very_strong_password_here_123! } ] }保存后在Continue的聊天界面或代码编辑区就可以选择这个新配置的模型了。4.3 在代码中直接调用Python示例有时我们需要在脚本或应用里集成AI能力。使用官方的OpenAI Python SDK只需稍作修改。from openai import OpenAI # 初始化客户端指向你的网关 client OpenAI( base_urlhttp://localhost:8000/v1, # 注意是 /v1 api_keyyour_very_strong_password_here_123!, # 你的 PROXY_API_KEY # 可选设置超时等参数 timeout30.0, ) # 非流式调用 response client.chat.completions.create( modelclaude-sonnet-4-5, # 指定模型 messages[ {role: system, content: 你是一个专业的代码助手。}, {role: user, content: 用Python写一个快速排序函数。} ], temperature0.7, max_tokens500, ) print(response.choices[0].message.content) # 流式调用适合生成长文本或需要实时显示的场景 stream_response client.chat.completions.create( modelclaude-haiku-4-5, # 换一个更快的模型 messages[{role: user, content: 讲一个简短的笑话。}], streamTrue, ) for chunk in stream_response: if chunk.choices[0].delta.content is not None: print(chunk.choices[0].delta.content, end, flushTrue)关键点base_url必须包含/v1路径因为网关的OpenAI兼容端点挂载在/v1下。api_key就是你的PROXY_API_KEY。4.4 配置网络代理如遇连接问题如果你身处网络受限环境或者公司网络无法直接访问Kiro/AWS的API端点网关提供了代理支持。在你的.env文件中添加一行VPN_PROXY_URLhttp://127.0.0.1:7890 # 或者 socks5://127.0.0.1:1080这个地址需要替换成你本地或公司代理服务器的实际地址和端口。常见的代理客户端如Clash、Sing-box通常会在本地开启一个HTTP代理端口如7890。配置后网关所有对外的Kiro API请求都会通过这个代理转发从而解决网络连通性问题。5. 高级功能、问题排查与调优心得5.1 模型映射与智能解析网关支持相当丰富的模型列表。除了Claude系列根据你的Kiro订阅可能还能访问DeepSeek、MiniMax、Qwen等开源模型。一个很贴心的功能是“智能模型解析”。你不需要记住Kiro内部复杂的模型标识符。网关会自动处理多种命名格式claude-sonnet-4-5claude-sonnet-4.5claude-sonnet-4-5-20250929(带版本号)你只需要在客户端如Cursor的模型配置里填入这些通用名称即可。网关内部会将其转换为Kiro API能识别的正确模型ID。你可以通过访问http://localhost:8000/v1/models来查看当前网关支持的所有模型列表。5.2 流式传输与工具调用Function Calling的稳定性流式传输Streaming是AI应用体验的关键。网关完整支持Server-Sent Events (SSE)。在实际使用中我发现在处理特别长的流式响应时偶尔会遇到连接过早关闭的问题。这通常不是网关的bug而是客户端或中间网络的问题。我的经验是在客户端代码中增加重试逻辑和更长的超时设置。对于工具调用网关也能完美地将OpenAI格式的tools参数转换为Kiro API的格式。测试时建议先用一个简单的天气查询函数作为示例确保整个“请求-工具调用-返回结果”的流程是通的。5.3 调试与日志快速定位问题当你遇到“模型不可用”、“认证失败”或“响应格式错误”时打开调试日志是第一步。在.env中设置DEBUG_MODEerrors然后重启网关。这样只有当请求出错4xx或5xx状态码时网关才会在项目目录下的debug_logs/文件夹中生成详细的日志文件。这些日志非常有用request_body.json: 客户端发来的原始请求。检查模型名、消息格式是否正确。kiro_request_body.json: 网关转换后发给Kiro的请求。可以确认认证令牌、模型ID是否正确。app_logs.txt: 应用处理过程中的日志能看到认证、刷新令牌等关键步骤。error_info.json: 错误详情包括Kiro API返回的错误信息。我遇到最多的问题是403 Forbidden或401 Unauthorized。十有八九是凭证文件路径不对、文件权限不足或者refresh_token已经失效。这时候去查看app_logs.txt通常会看到类似“Failed to refresh token”或“Credential file not found”的错误跟着日志提示去修复即可。5.4 性能调优与生产部署建议对于个人开发本地运行或Docker运行已经足够。但如果你的团队规模较大或者请求量很高可以考虑以下几点优化使用进程管理器即使在服务器上也不建议直接用python main.py。使用gunicorn或uvicorn作为进程管理器配合多个worker进程可以更好地利用多核CPU和处理并发。一个简单的gunicorn配置如下gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000设置资源限制在Docker中可以通过docker-compose.yml为容器设置内存和CPU限制防止单个服务耗尽主机资源。考虑反向代理如果你将服务暴露到公网强烈不建议直接暴露除非你知道风险并做好了安全措施务必在前面加一个Nginx或Caddy作为反向代理。它们可以处理SSL/TLS加密、负载均衡、限流和基本的访问控制比直接暴露FastAPI应用安全得多。监控与告警简单的监控可以通过网关自带的/health端点实现定期检查即可。更复杂的可以集成Prometheus指标。最后再强调一次安全PROXY_API_KEY是保护你服务的唯一屏障务必使用强密码并定期更换。不要将部署了网关的服务器端口随意暴露在公网如果必须暴露请结合Nginx的IP白名单、HTTP Basic Auth等多重手段进行保护。这个网关让你便捷地使用了Kiro的模型但也要对它负责避免被他人滥用。