fix(proxy): Trae CN 上游换用 trae-api-cn.mchost.guru,修正 404
Some checks are pending
Release / build (push) Waiting to run

- trae-api-cn.mchost.guru/api/agent/v3/llm_utils_chat 才是模型网关
- api.trae.cn 只是账号/OAuth 主机,不暴露 IDE 模型路由
- 请求头对齐参考实现:真实 x-app-id / x-ide-version / 设备指纹
- llm_utils_chat body 收敛为 SOLO 结构(config_name/model/function/stream)
This commit is contained in:
Liuxinyu176 2026-10-09 09:29:40 +08:00
parent 15408a6640
commit d0b79cf1bd
2 changed files with 31 additions and 25 deletions

View File

@ -16,8 +16,8 @@ android {
applicationId = "com.rainy.token"
minSdk = 31
targetSdk = 35
versionCode = 16
versionName = "1.6.6"
versionCode = 17
versionName = "1.6.7"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {

View File

@ -51,9 +51,9 @@ class TraeChatProxy @Inject constructor(
ProviderRegion.valueOf(credential.region.uppercase())
}.getOrNull()
val base = if (effectiveRegion == ProviderRegion.INTL) {
"https://grow-normal.trae.ai"
"https://a0ai-api-sg.byteintlapi.com"
} else {
"https://api.trae.cn"
"https://trae-api-cn.mchost.guru"
}
val upstreamBody = buildUpstreamBody(requestBody, credential)
val requestId = UUID.randomUUID().toString()
@ -63,19 +63,24 @@ class TraeChatProxy @Inject constructor(
.url(base + "/api/agent/v3/llm_utils_chat")
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "text/event-stream")
.addHeader("Authorization", "Cloud-IDE-JWT $jwt")
.addHeader("Authorization", "Cloud-IDE-JWT jwt")
.addHeader("X-Cloudide-Token", jwt)
.addHeader("x-uid", credential.userId ?: "")
.addHeader("x-app-id", "6eefa01c-1036-4c7e-9ca5-d891f63bfcd8")
.addHeader("x-device-id", credential.deviceId ?: credential.checkinDeviceId ?: "")
.addHeader("x-machine-id", credential.deviceId ?: credential.checkinDeviceId ?: "")
.addHeader("x-request-id", requestId)
.addHeader("x-app-id", "trae")
.addHeader("x-ide-version", "1.0.0")
.addHeader("x-ide-version-code", "1000000")
.addHeader("x-ide-version", "3.3.67")
.addHeader("x-ide-version-code", "20260401")
.addHeader("x-ide-version-type", "stable")
.addHeader("x-os-version", "Android")
.addHeader("x-system-type", "Android")
.addHeader("User-Agent", "RainyToken/1.0")
.addHeader("x-device-cpu", "AMD")
.addHeader("x-device-brand", "83DG")
.addHeader("x-device-type", "windows")
.addHeader("x-ide-token", jwt)
.addHeader("x-os-version", "Windows 10")
.addHeader("x-system-type", "Windows")
.addHeader("Connection", "keep-alive")
.addHeader("User-Agent", "")
.post(upstreamBody.toRequestBody("application/json".toMediaType()))
val response = try {
@ -117,19 +122,24 @@ class TraeChatProxy @Inject constructor(
.url(base + "/api/agent/v3/llm_utils_chat")
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "text/event-stream")
.addHeader("Authorization", "Cloud-IDE-JWT $jwt")
.addHeader("Authorization", "Cloud-IDE-JWT jwt")
.addHeader("X-Cloudide-Token", jwt)
.addHeader("x-uid", credential.userId ?: "")
.addHeader("x-app-id", "6eefa01c-1036-4c7e-9ca5-d891f63bfcd8")
.addHeader("x-device-id", credential.deviceId ?: credential.checkinDeviceId ?: "")
.addHeader("x-machine-id", credential.deviceId ?: credential.checkinDeviceId ?: "")
.addHeader("x-request-id", requestId)
.addHeader("x-app-id", "trae")
.addHeader("x-ide-version", "1.0.0")
.addHeader("x-ide-version-code", "1000000")
.addHeader("x-ide-version", "3.3.67")
.addHeader("x-ide-version-code", "20260401")
.addHeader("x-ide-version-type", "stable")
.addHeader("x-os-version", "Android")
.addHeader("x-system-type", "Android")
.addHeader("User-Agent", "RainyToken/1.0")
.addHeader("x-device-cpu", "AMD")
.addHeader("x-device-brand", "83DG")
.addHeader("x-device-type", "windows")
.addHeader("x-ide-token", jwt)
.addHeader("x-os-version", "Windows 10")
.addHeader("x-system-type", "Windows")
.addHeader("Connection", "keep-alive")
.addHeader("User-Agent", "")
.post(upstreamBody.toRequestBody("application/json".toMediaType()))
val response = try {
@ -162,17 +172,13 @@ class TraeChatProxy @Inject constructor(
val sessionId = UUID.randomUUID().toString().replace("-", "")
return buildJsonObject {
put("conversation_id", "")
put("session_id", sessionId)
put("user_id", credential.userId ?: "")
put("device_id", credential.deviceId ?: credential.checkinDeviceId ?: "")
put("agent_type", "solo_work_lite")
put("model_name", model + "__dev")
put("messages", messages)
put("config_name", model)
put("model", model)
put("function", "solo_work_lite")
put("stream", true)
put("request_id", sessionId)
put("messages", messages)
put("session_id", sessionId)
src["tools"]?.let { put("tools", it) }
src["tool_choice"]?.let { put("tool_choice", it) }
(src["max_tokens"] as? JsonPrimitive)?.contentOrNull?.toIntOrNull()?.let {