fix(provider): 修复 Windsurf PR 冲突残留

This commit is contained in:
Entropy.Xu
2026-05-21 00:57:46 +08:00
parent 129c7c90c0
commit 65c361115a
9 changed files with 65 additions and 61 deletions

View File

@@ -44,12 +44,11 @@ pub(crate) use aether_ai_formats::api::{
build_core_error_body_for_client_format, convert_standard_chat_response, build_core_error_body_for_client_format, convert_standard_chat_response,
core_error_background_report_kind, core_error_default_client_api_format, core_error_background_report_kind, core_error_default_client_api_format,
core_success_background_report_kind, encode_kiro_sse_events, core_success_background_report_kind, encode_kiro_sse_events,
extract_provider_private_stream_error_body, extract_provider_private_stream_error_body, implicit_sync_finalize_report_kind,
implicit_sync_finalize_report_kind, is_core_error_finalize_kind, is_core_error_finalize_kind, normalize_provider_private_report_context,
normalize_provider_private_report_context, normalize_provider_private_response_value, normalize_provider_private_response_value, provider_private_response_allows_sync_finalize,
provider_private_response_allows_sync_finalize, resolve_claude_stream_spec, resolve_claude_stream_spec, resolve_claude_sync_spec, resolve_gemini_stream_spec,
resolve_claude_sync_spec, resolve_gemini_stream_spec, resolve_gemini_sync_spec, resolve_gemini_sync_spec, resolve_local_image_stream_spec, resolve_local_image_sync_spec,
resolve_local_image_stream_spec, resolve_local_image_sync_spec,
resolve_local_same_format_stream_spec, resolve_local_same_format_sync_spec, resolve_local_same_format_stream_spec, resolve_local_same_format_sync_spec,
resolve_openai_embedding_sync_spec, sanitize_request_path_and_query, AiControlPlanRequest, resolve_openai_embedding_sync_spec, sanitize_request_path_and_query, AiControlPlanRequest,
CanonicalContentPart, CanonicalStreamEvent, CanonicalStreamFrame, ClaudeClientEmitter, CanonicalContentPart, CanonicalStreamEvent, CanonicalStreamFrame, ClaudeClientEmitter,

View File

@@ -24,13 +24,13 @@ use crate::ai_serving::transport::kiro::{
use crate::ai_serving::transport::{ use crate::ai_serving::transport::{
build_grok_browser_headers, build_grok_upstream_url, build_kiro_cross_format_upstream_url, build_grok_browser_headers, build_grok_upstream_url, build_kiro_cross_format_upstream_url,
build_openai_image_headers, build_openai_image_upstream_url, build_openai_image_headers, build_openai_image_upstream_url,
build_standard_provider_request_headers, openai_image_transport_unsupported_reason, build_standard_provider_request_headers, build_windsurf_cascade_headers,
resolve_grok_session_auth, resolve_openai_image_auth, GrokHeaderInput, build_windsurf_cascade_request_body, build_windsurf_cascade_upstream_url,
build_windsurf_cascade_headers, build_windsurf_cascade_request_body, is_windsurf_provider_transport,
build_windsurf_cascade_upstream_url, is_windsurf_provider_transport,
local_windsurf_request_transport_unsupported_reason_with_network, local_windsurf_request_transport_unsupported_reason_with_network,
ProviderOpenAiImageHeadersInput, StandardProviderRequestHeadersInput, WINDSURF_ENVELOPE_NAME, openai_image_transport_unsupported_reason, resolve_grok_session_auth,
GROK_CHAT_PATH, resolve_openai_image_auth, GrokHeaderInput, ProviderOpenAiImageHeadersInput,
StandardProviderRequestHeadersInput, GROK_CHAT_PATH, WINDSURF_ENVELOPE_NAME,
}; };
use crate::ai_serving::{ use crate::ai_serving::{
build_openai_image_request_body_from_gemini_image_request, gemini_request_is_image_generation, build_openai_image_request_body_from_gemini_image_request, gemini_request_is_image_generation,

View File

@@ -44,8 +44,8 @@ use crate::ai_serving::transport::{
is_windsurf_provider_transport, local_standard_transport_unsupported_reason_with_network, is_windsurf_provider_transport, local_standard_transport_unsupported_reason_with_network,
local_windsurf_request_transport_unsupported_reason_with_network, local_windsurf_request_transport_unsupported_reason_with_network,
openai_image_transport_unsupported_reason, resolve_openai_image_auth, GrokHeaderInput, openai_image_transport_unsupported_reason, resolve_openai_image_auth, GrokHeaderInput,
ProviderOpenAiImageHeadersInput, StandardProviderRequestHeadersInput, WINDSURF_ENVELOPE_NAME, ProviderOpenAiImageHeadersInput, StandardProviderRequestHeadersInput, GROK_CHAT_PATH,
GROK_CHAT_PATH, WINDSURF_ENVELOPE_NAME,
}; };
use crate::ai_serving::{ use crate::ai_serving::{
ai_local_execution_contract_for_formats, request_conversion_direct_auth, ai_local_execution_contract_for_formats, request_conversion_direct_auth,

View File

@@ -74,12 +74,11 @@ pub(crate) use aether_provider_transport::{
build_transport_request_url, build_transport_request_url_for_request_body, build_transport_request_url, build_transport_request_url_for_request_body,
build_video_create_headers, build_video_create_request_body, build_video_create_upstream_url, build_video_create_headers, build_video_create_request_body, build_video_create_upstream_url,
build_windsurf_cascade_headers, build_windsurf_cascade_request_body, build_windsurf_cascade_headers, build_windsurf_cascade_request_body,
build_windsurf_cascade_upstream_url, build_windsurf_cascade_upstream_url, candidate_common_transport_skip_reason,
candidate_common_transport_skip_reason, candidate_transport_pair_skip_reason, candidate_transport_pair_skip_reason, classify_same_format_provider_request_behavior,
classify_same_format_provider_request_behavior, ensure_upstream_auth_header, ensure_upstream_auth_header, gemini_files_transport_unsupported_reason,
gemini_files_transport_unsupported_reason, header_rules_are_locally_supported, header_rules_are_locally_supported, header_rules_have_enabled_rules,
header_rules_have_enabled_rules, is_windsurf_provider_transport, is_windsurf_provider_transport, local_gemini_transport_unsupported_reason_with_network,
local_gemini_transport_unsupported_reason_with_network,
local_openai_chat_transport_unsupported_reason, local_openai_chat_transport_unsupported_reason,
local_standard_transport_unsupported_reason_with_network, local_standard_transport_unsupported_reason_with_network,
local_windsurf_request_transport_unsupported_reason_with_network, local_windsurf_request_transport_unsupported_reason_with_network,

View File

@@ -28,9 +28,9 @@ use tokio::time::MissedTickBehavior;
use tracing::{debug, warn}; use tracing::{debug, warn};
use crate::ai_serving::api::{ use crate::ai_serving::api::{
build_core_error_body_for_client_format, implicit_sync_finalize_report_kind, build_core_error_body_for_client_format, extract_provider_private_stream_error_body,
maybe_build_sync_finalize_outcome, extract_provider_private_stream_error_body, implicit_sync_finalize_report_kind, maybe_build_sync_finalize_outcome, LocalCoreSyncErrorKind,
LocalCoreSyncErrorKind, LocalCoreSyncFinalizeOutcome, LocalCoreSyncFinalizeOutcome,
}; };
use crate::api::response::{ use crate::api::response::{
attach_control_metadata_headers, build_client_response, build_client_response_from_parts, attach_control_metadata_headers, build_client_response, build_client_response_from_parts,
@@ -47,10 +47,10 @@ use crate::execution_runtime::submission::{
resolve_local_sync_error_status_code, submit_local_core_error_or_sync_finalize, resolve_local_sync_error_status_code, submit_local_core_error_or_sync_finalize,
}; };
use crate::execution_runtime::transport::{ use crate::execution_runtime::transport::{
build_execution_response_body, build_execution_response_body, build_request_body, collect_response_headers,
build_request_body, collect_response_headers, decode_response_body_bytes, decode_response_body_bytes, format_upstream_request_error, format_wreq_upstream_request_error,
format_upstream_request_error, format_wreq_upstream_request_error, response_body_is_json, response_body_is_json, send_request, DirectHttpResponse, DirectSyncExecutionRuntime,
send_request, DirectHttpResponse, DirectSyncExecutionRuntime, ExecutionRuntimeTransportError, ExecutionRuntimeTransportError,
}; };
use crate::execution_runtime::windsurf::maybe_execute_windsurf_sync; use crate::execution_runtime::windsurf::maybe_execute_windsurf_sync;
use crate::execution_runtime::{ use crate::execution_runtime::{

View File

@@ -1525,11 +1525,11 @@ mod tests {
use super::{ use super::{
build_browser_wreq_client, build_client, build_execution_response_body, build_browser_wreq_client, build_client, build_execution_response_body,
build_request_headers, execute_sync_plan, build_request_headers, execute_sync_plan, record_manual_proxy_request_failure,
record_manual_proxy_request_failure, record_manual_proxy_request_outcome, record_manual_proxy_request_outcome, record_manual_proxy_request_success,
record_manual_proxy_request_success, record_manual_proxy_stream_error, record_manual_proxy_stream_error, resolve_execution_transport_controls,
resolve_execution_transport_controls, response_body_is_json, DirectSyncExecutionRuntime, response_body_is_json, DirectSyncExecutionRuntime, ExecutionRuntimeTransportError,
ExecutionRuntimeTransportError, ExecutionTransportControls, ExecutionTransportControls,
}; };
use crate::constants::{ use crate::constants::{
EXECUTION_RUNTIME_LOOP_GUARD_HEADER, EXECUTION_RUNTIME_LOOP_GUARD_VIA_TOKEN, EXECUTION_RUNTIME_LOOP_GUARD_HEADER, EXECUTION_RUNTIME_LOOP_GUARD_VIA_TOKEN,

View File

@@ -176,11 +176,7 @@ fn extract_admin_provider_oauth_batch_import_entry(
.get("access_token") .get("access_token")
.or_else(|| object.get("accessToken")), .or_else(|| object.get("accessToken")),
); );
let grok_token_alias = if is_grok { let grok_token_alias = if is_grok { object.get("token") } else { None };
object.get("token")
} else {
None
};
let grok_cookie = if is_grok { let grok_cookie = if is_grok {
coerce_admin_provider_oauth_import_str( coerce_admin_provider_oauth_import_str(
object.get("cookie").or_else(|| object.get("cookieHeader")), object.get("cookie").or_else(|| object.get("cookieHeader")),
@@ -204,26 +200,30 @@ fn extract_admin_provider_oauth_batch_import_entry(
refresh_token.as_deref(), refresh_token.as_deref(),
access_token.as_deref().or(session_token.as_deref()), access_token.as_deref().or(session_token.as_deref()),
); );
let windsurf_api_key = is_windsurf.then(|| { let windsurf_api_key = is_windsurf
coerce_admin_provider_oauth_import_str( .then(|| {
object.get("api_key").or_else(|| object.get("apiKey")), coerce_admin_provider_oauth_import_str(
) object.get("api_key").or_else(|| object.get("apiKey")),
}).flatten(); )
let windsurf_token = is_windsurf.then(|| { })
coerce_admin_provider_oauth_import_str( .flatten();
object let windsurf_token = is_windsurf
.get("token") .then(|| {
.or_else(|| object.get("auth_token")) coerce_admin_provider_oauth_import_str(
.or_else(|| object.get("authToken")), object
) .get("token")
}).flatten(); .or_else(|| object.get("auth_token"))
.or_else(|| object.get("authToken")),
)
})
.flatten();
let windsurf_password = is_windsurf let windsurf_password = is_windsurf
.then(|| coerce_admin_provider_oauth_import_str(object.get("password"))) .then(|| coerce_admin_provider_oauth_import_str(object.get("password")))
.flatten(); .flatten();
let raw_credentials = if is_windsurf let raw_credentials = if is_windsurf
&& (windsurf_api_key.is_some() && (windsurf_api_key.is_some()
|| windsurf_token.is_some() || windsurf_token.is_some()
|| windsurf_password.is_some()) || windsurf_password.is_some())
{ {
Some(item.clone()) Some(item.clone())
} else { } else {

View File

@@ -25,10 +25,11 @@ pub use providers::{
grok_supported_quota_windows_for_tier, normalize_chatgpt_web_image_quota_limit, grok_supported_quota_windows_for_tier, normalize_chatgpt_web_image_quota_limit,
AntigravityProviderPoolAdapter, ChatGptWebProviderPoolAdapter, CodexProviderPoolAdapter, AntigravityProviderPoolAdapter, ChatGptWebProviderPoolAdapter, CodexProviderPoolAdapter,
DefaultProviderPoolAdapter, GrokProviderPoolAdapter, KiroPoolQuotaAuthInput, DefaultProviderPoolAdapter, GrokProviderPoolAdapter, KiroPoolQuotaAuthInput,
KiroProviderPoolAdapter, UnsupportedQuotaProviderPoolAdapter, ANTIGRAVITY_FETCH_AVAILABLE_MODELS_PATH, KiroProviderPoolAdapter, UnsupportedQuotaProviderPoolAdapter,
CHATGPT_WEB_CONVERSATION_INIT_PATH, CHATGPT_WEB_DEFAULT_BASE_URL, CODEX_WHAM_USAGE_URL, ANTIGRAVITY_FETCH_AVAILABLE_MODELS_PATH, CHATGPT_WEB_CONVERSATION_INIT_PATH,
KIRO_USAGE_LIMITS_PATH, KIRO_USAGE_SDK_VERSION, WINDSURF_MODEL_CONFIGS_PATH, CHATGPT_WEB_DEFAULT_BASE_URL, CODEX_WHAM_USAGE_URL, KIRO_USAGE_LIMITS_PATH,
WINDSURF_RATE_LIMIT_PATH, WINDSURF_USER_STATUS_PATH, KIRO_USAGE_SDK_VERSION, WINDSURF_MODEL_CONFIGS_PATH, WINDSURF_RATE_LIMIT_PATH,
WINDSURF_USER_STATUS_PATH,
}; };
pub use quota::{ pub use quota::{
provider_pool_key_account_quota_exhausted, provider_pool_key_scheduling_label, provider_pool_key_account_quota_exhausted, provider_pool_key_scheduling_label,
@@ -90,7 +91,14 @@ mod tests {
assert_eq!( assert_eq!(
service.provider_types_for_capability(ProviderPoolCapability::QuotaRefresh), service.provider_types_for_capability(ProviderPoolCapability::QuotaRefresh),
["antigravity", "chatgpt_web", "codex", "grok", "kiro", "windsurf"] [
"antigravity",
"chatgpt_web",
"codex",
"grok",
"kiro",
"windsurf"
]
); );
assert!(service.supports_quota_refresh("codex")); assert!(service.supports_quota_refresh("codex"));
assert!(service.supports_quota_refresh("antigravity")); assert!(service.supports_quota_refresh("antigravity"));
@@ -369,7 +377,6 @@ mod tests {
recent_refresh["providers"], recent_refresh["providers"],
json!(["codex", "grok", "kiro", "windsurf"]) json!(["codex", "grok", "kiro", "windsurf"])
); );
);
} }
#[test] #[test]

View File

@@ -13,9 +13,8 @@ use crate::provider::{ProviderPoolAdapter, ProviderPoolMemberInput};
use crate::providers::{ use crate::providers::{
AntigravityProviderPoolAdapter, ChatGptWebProviderPoolAdapter, CodexProviderPoolAdapter, AntigravityProviderPoolAdapter, ChatGptWebProviderPoolAdapter, CodexProviderPoolAdapter,
DefaultProviderPoolAdapter, GrokProviderPoolAdapter, KiroProviderPoolAdapter, DefaultProviderPoolAdapter, GrokProviderPoolAdapter, KiroProviderPoolAdapter,
WindsurfProviderPoolAdapter, WindsurfProviderPoolAdapter, CLAUDE_CODE_PROVIDER_POOL_ADAPTER,
CLAUDE_CODE_PROVIDER_POOL_ADAPTER, GEMINI_CLI_PROVIDER_POOL_ADAPTER, GEMINI_CLI_PROVIDER_POOL_ADAPTER, VERTEX_AI_PROVIDER_POOL_ADAPTER,
VERTEX_AI_PROVIDER_POOL_ADAPTER,
}; };
#[derive(Clone)] #[derive(Clone)]