将 GeminiCLI 和 Antigravity 转换为 OpenAI 、GEMINI 和 Claude API 接口
This report summarizes scanner evidence for su-kaka/gcli2api, a Python project with 5,236 GitHub stars. SynthScan examined 36,633 lines of code across 72 source files, recording 700 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 24.3 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 302 finding(s).
Are imports declared and package/API names verified? 23 finding(s).
Are wrappers, guards, and repeated structures necessary? 536 finding(s).
Which changes need focused human review? 700 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 700 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web.py | 59 | except Exception: | CODE |
| LOW | web.py | 93 | except Exception as e: | CODE |
| LOW⚡ | web.py | 111 | except Exception as e: | CODE |
| LOW⚡ | web.py | 120 | except Exception as e: | CODE |
| LOW⚡ | web.py | 129 | except Exception as e: | CODE |
| LOW | web.py | 150 | except Exception as e: | CODE |
| LOW | web.py | 165 | except Exception as e: | CODE |
| LOW | web.py | 172 | except Exception as e: | CODE |
| LOW | config.py | 67 | except Exception: | CODE |
| LOW | config.py | 88 | except Exception: | CODE |
| LOW⚡ | log.py | 68 | except Exception: | CODE |
| LOW⚡ | log.py | 108 | except Exception as e: | CODE |
| LOW⚡ | log.py | 146 | except Exception as e: | CODE |
| LOW⚡ | log.py | 151 | except Exception: | CODE |
| LOW⚡ | log.py | 160 | except Exception: | CODE |
| LOW | log.py | 87 | except Exception as e: | CODE |
| LOW | log.py | 172 | except Exception: | CODE |
| MEDIUM | src/auth.py | 102 | def patched_validate(params): | CODE |
| MEDIUM | src/auth.py | 952 | def shutdown_server_async(): | CODE |
| LOW⚡ | src/auth.py | 506 | except Exception as e: | CODE |
| LOW⚡ | src/auth.py | 510 | except Exception as e: | CODE |
| LOW⚡ | src/auth.py | 761 | except Exception as e: | CODE |
| LOW⚡ | src/auth.py | 765 | except Exception as e: | CODE |
| LOW | src/auth.py | 87 | except Exception as e: | CODE |
| LOW | src/auth.py | 142 | except Exception: | CODE |
| LOW | src/auth.py | 253 | except Exception as e: | CODE |
| LOW | src/auth.py | 298 | except Exception as e: | CODE |
| LOW | src/auth.py | 336 | except Exception as e: | CODE |
| LOW | src/auth.py | 870 | except Exception as e: | CODE |
| LOW | src/auth.py | 882 | except Exception as e: | CODE |
| LOW | src/auth.py | 902 | except Exception as e: | CODE |
| LOW | src/auth.py | 906 | except Exception as e: | CODE |
| LOW | src/auth.py | 941 | except Exception as e: | CODE |
| LOW | src/auth.py | 963 | except Exception as e: | CODE |
| LOW | src/auth.py | 977 | except Exception as e: | CODE |
| LOW | src/auth.py | 1009 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 129 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 150 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 168 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 177 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 189 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 239 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 300 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 350 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 354 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 374 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 397 | except Exception as e: | CODE |
| LOW | src/credential_manager.py | 425 | except Exception as e2: | CODE |
| LOW | src/keeplive.py | 30 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 113 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 243 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 315 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 344 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 369 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 386 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 400 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 439 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 460 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 465 | except Exception as e: | CODE |
| LOW | src/google_oauth_api.py | 505 | except Exception as e: | CODE |
| 244 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | web.py | 48 | except (OSError, AttributeError): | CODE |
| HIGH | web.py | 59 | except Exception: | CODE |
| HIGH | web.py | 158 | except asyncio.CancelledError: | CODE |
| HIGH | config.py | 88 | except Exception: | CODE |
| HIGH | config.py | 143 | except ValueError: | CODE |
| HIGH | config.py | 158 | except ValueError: | CODE |
| HIGH | config.py | 179 | except ValueError: | CODE |
| HIGH | config.py | 197 | except ValueError: | CODE |
| HIGH | config.py | 227 | except ValueError: | CODE |
| HIGH | config.py | 493 | except ValueError: | CODE |
| HIGH | log.py | 68 | except Exception: | CODE |
| HIGH | log.py | 172 | except Exception: | CODE |
| HIGH | log.py | 160 | except Exception: | CODE |
| HIGH | log.py | 151 | except Exception: | CODE |
| HIGH | src/auth.py | 105 | except Warning: | CODE |
| HIGH | src/auth.py | 142 | except Exception: | CODE |
| HIGH | src/keeplive.py | 68 | except asyncio.CancelledError: | CODE |
| HIGH | src/panel/utils.py | 48 | except ValueError: | CODE |
| HIGH | src/panel/logs.py | 232 | except WebSocketDisconnect: | CODE |
| HIGH | src/panel/logs.py | 153 | except Exception: | CODE |
| HIGH | src/panel/logs.py | 229 | except asyncio.CancelledError: | CODE |
| HIGH | src/converter/anti_truncation.py | 197 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | src/converter/anti_truncation.py | 618 | except ValueError: | CODE |
| HIGH | src/storage/psql_manager.py | 707 | except ValueError: | CODE |
| HIGH | src/storage/sqlite_manager.py | 967 | except ValueError: | CODE |
| HIGH | src/storage/mongodb_manager.py | 1073 | except ValueError: | CODE |
| HIGH | src/api/geminicli.py | 549 | except Exception: | CODE |
| HIGH | src/api/geminicli.py | 561 | except Exception: | CODE |
| HIGH | src/api/geminicli.py | 249 | except Exception: | CODE |
| HIGH | src/api/antigravity.py | 653 | except Exception: | CODE |
| HIGH | src/api/antigravity.py | 664 | except Exception: | CODE |
| HIGH | src/api/antigravity.py | 351 | except Exception: | CODE |
| HIGH | src/router/base_router.py | 61 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config.py | 185 | async def get_anti_truncation_max_attempts() -> int: | CODE |
| LOW | config.py | 304 | async def get_compatibility_mode_enabled() -> bool: | CODE |
| LOW | config.py | 322 | async def get_return_thoughts_to_frontend() -> bool: | CODE |
| LOW | config.py | 358 | async def get_antigravity_switch_credential_enabled() -> bool: | CODE |
| LOW | config.py | 410 | async def get_resource_manager_api_url() -> str: | CODE |
| LOW | config.py | 429 | async def get_service_usage_api_url() -> str: | CODE |
| LOW | tests/test_gemini_fix.py | 4 | def test_antigravity_claude_tools_keep_schema_in_parameters(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 24 | def test_parallel_tool_calls_get_distinct_stream_indices(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 37 | def test_tool_calls_in_one_chunk_are_numbered_consecutively(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 53 | def test_stream_index_is_isolated_per_response_id(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 65 | def test_stream_index_released_after_finish_reason(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 75 | def test_unparsable_tool_call_arguments_keep_function_call(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 115 | def test_streaming_tool_call_finishes_with_tool_calls_reason(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 144 | def test_convert_openai_request_merges_adjacent_same_role_contents(): | CODE |
| LOW | tests/test_openai2gemini_tool_calls.py | 186 | def test_clean_schema_removes_boolean_enum_and_stringifies_enum(): | CODE |
| LOW⚡ | front/common.js | 1458 | function refreshAntigravityCredsList() { AppState.antigravityCreds.refresh(); } | CODE |
| LOW⚡ | front/common.js | 1459 | function applyAntigravityStatusFilter() { AppState.antigravityCreds.applyStatusFilter(); } | CODE |
| LOW⚡ | front/common.js | 1461 | function changeAntigravityPageSize() { AppState.antigravityCreds.changePageSize(); } | CODE |
| LOW⚡ | front/common.js | 1462 | function toggleAntigravityFileSelection(filename) { | CODE |
| LOW⚡ | front/common.js | 1470 | function toggleSelectAllAntigravity() { | CODE |
| LOW | front/common.js | 792 | async function toggleAntigravityCredDetails(pathId) { | CODE |
| LOW | front/common.js | 1202 | async function getAntigravityCredentials() { | CODE |
| LOW | front/common.js | 1239 | function downloadAntigravityCredentials() { | CODE |
| LOW | front/common.js | 1283 | function toggleAntigravityCallbackUrlSection() { | CODE |
| LOW | front/common.js | 1351 | async function processAntigravityCallbackUrl() { | CODE |
| LOW | front/common.js | 1502 | async function downloadAllAntigravityCreds() { | CODE |
| LOW | front/common.js | 1526 | function handleAntigravityFileSelect(event) { AppState.antigravityUploadFiles.handleFileSelect(event); } | CODE |
| LOW | front/common.js | 1527 | function handleAntigravityFileDrop(event) { | CODE |
| LOW | front/common.js | 1584 | async function fetchAntigravityUserEmail(filename) { | CODE |
| LOW | front/common.js | 1641 | async function verifyAntigravityProjectId(filename) { | CODE |
| LOW | front/common.js | 1726 | async function testAntigravityCredential(filename) { | CODE |
| LOW | front/common.js | 1818 | async function toggleAntigravityQuotaDetails(pathId) { | CODE |
| LOW | front/common.js | 1942 | async function toggleAntigravityErrorDetails(pathId) { | CODE |
| LOW | front/common.js | 2189 | async function batchVerifyAntigravityProjectIds() { | CODE |
| LOW | front/common.js | 2371 | async function refreshAllAntigravityEmails() { | CODE |
| LOW | front/common.js | 2423 | async function deduplicateAntigravityByEmail() { | CODE |
| LOW⚡ | src/auth.py | 515 | async def asyncio_complete_auth_flow( | CODE |
| LOW⚡ | src/auth.py | 770 | async def complete_auth_flow_from_callback_url( | CODE |
| LOW | src/auth.py | 45 | def _prepare_credentials_data(credentials: Credentials, project_id: str, mode: str = "geminicli", subscription_tier: str | CODE |
| LOW | src/auth.py | 78 | def _cleanup_auth_flow_server(state: str): | CODE |
| LOW | src/auth.py | 122 | def cleanup_auth_flows_for_memory(): | CODE |
| LOW | src/credential_manager.py | 113 | async def add_antigravity_credential(self, credential_name: str, credential_data: Dict[str, Any]): | CODE |
| LOW | src/credential_manager.py | 433 | def _is_permanent_refresh_failure(self, error_msg: str, status_code: Optional[int] = None) -> bool: | CODE |
| LOW | src/google_oauth_api.py | 374 | async def fetch_user_email_from_file(cred_data: Dict[str, Any]) -> Optional[str]: | CODE |
| LOW | src/google_oauth_api.py | 534 | async def fetch_project_id_and_tier( | CODE |
| LOW | src/utils.py | 77 | def get_base_model_from_feature_model(model_name: str) -> str: | CODE |
| LOW | src/storage_adapter.py | 53 | async def get_all_credential_states(self, mode: str = "geminicli") -> Dict[str, Dict[str, Any]]: | CODE |
| LOW | src/storage_adapter.py | 195 | async def get_all_credential_states(self, mode: str = "geminicli") -> Dict[str, Dict[str, Any]]: | CODE |
| LOW | src/storage_adapter.py | 224 | async def export_credential_to_json(self, filename: str, output_path: str = None) -> bool: | CODE |
| LOW | src/storage_adapter.py | 246 | async def import_credential_from_json(self, json_path: str, filename: str = None) -> bool: | CODE |
| LOW⚡ | src/panel/creds.py | 39 | async def extract_json_files_from_zip(zip_file: UploadFile) -> List[dict]: | CODE |
| LOW⚡ | src/panel/creds.py | 91 | async def clear_all_model_cooldowns_for_credential( | CODE |
| LOW⚡ | src/panel/creds.py | 105 | async def upload_credentials_common( | CODE |
| LOW⚡ | src/panel/creds.py | 1057 | async def deduplicate_credentials_by_email( | CODE |
| LOW | src/panel/creds.py | 301 | async def download_all_creds_common(mode: str = "geminicli") -> Response: | CODE |
| LOW | src/panel/creds.py | 377 | async def refresh_all_user_emails_common(mode: str = "geminicli") -> JSONResponse: | CODE |
| LOW | src/panel/creds.py | 445 | async def deduplicate_credentials_by_email_common(mode: str = "geminicli") -> JSONResponse: | CODE |
| LOW | src/panel/creds.py | 532 | async def verify_credential_project_common(filename: str, mode: str = "geminicli") -> JSONResponse: | CODE |
| LOW | src/panel/creds.py | 1090 | async def verify_credential_project( | CODE |
| LOW | src/panel/creds.py | 1223 | async def configure_preview_channel( | CODE |
| 97 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | log.py | 22 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 26 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 32 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 34 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 58 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 60 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 112 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | log.py | 114 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM | log.py | 203 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM | log.py | 205 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM | log.py | 224 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM | log.py | 226 | # ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | src/panel/creds.py | 34 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | src/panel/creds.py | 36 | # ============================================================================= | COMMENT |
| MEDIUM | src/panel/creds.py | 636 | # ============================================================================= | COMMENT |
| MEDIUM | src/panel/creds.py | 638 | # ============================================================================= | COMMENT |
| MEDIUM | src/panel/utils.py | 17 | # ============================================================================= | COMMENT |
| MEDIUM | src/panel/utils.py | 19 | # ============================================================================= | COMMENT |
| MEDIUM | src/panel/utils.py | 98 | # ============================================================================= | COMMENT |
| MEDIUM | src/panel/utils.py | 100 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 27 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 29 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 189 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 191 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 389 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 391 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 581 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 583 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 706 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/converter/anthropic2gemini.py | 708 | # ============================================================================ | COMMENT |
| MEDIUM | src/converter/anthropic2gemini.py | 263 | # ============================================================================ | COMMENT |
| MEDIUM | src/converter/anthropic2gemini.py | 265 | # ============================================================================ | COMMENT |
| MEDIUM | src/converter/anthropic2gemini.py | 356 | # ============================================================================ | COMMENT |
| MEDIUM | src/converter/anthropic2gemini.py | 358 | # ============================================================================ | COMMENT |
| MEDIUM | src/converter/anthropic2gemini.py | 622 | # ============================================================================ | COMMENT |
| MEDIUM | src/converter/anthropic2gemini.py | 624 | # ============================================================================ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web.py | 52 | CODE | |
| LOW | web.py | 64 | CODE | |
| LOW | log.py | 119 | CODE | |
| LOW | src/token_estimator.py | 7 | CODE | |
| LOW | src/token_estimator.py | 13 | CODE | |
| LOW | src/auth.py | 122 | CODE | |
| LOW | src/auth.py | 233 | CODE | |
| LOW | src/auth.py | 369 | CODE | |
| LOW | src/auth.py | 515 | CODE | |
| LOW | src/auth.py | 770 | CODE | |
| LOW | src/auth.py | 986 | CODE | |
| LOW | src/credential_manager.py | 243 | CODE | |
| LOW | src/credential_manager.py | 303 | CODE | |
| LOW | src/credential_manager.py | 358 | CODE | |
| LOW | src/credential_manager.py | 433 | CODE | |
| LOW | src/google_oauth_api.py | 405 | CODE | |
| LOW | src/google_oauth_api.py | 634 | CODE | |
| LOW | src/google_oauth_api.py | 716 | CODE | |
| LOW | src/google_oauth_api.py | 128 | CODE | |
| LOW | src/utils.py | 86 | CODE | |
| LOW | src/utils.py | 148 | CODE | |
| LOW | src/task_manager.py | 58 | CODE | |
| LOW | src/storage_adapter.py | 83 | CODE | |
| LOW | src/storage_adapter.py | 283 | CODE | |
| LOW | src/panel/auth.py | 80 | CODE | |
| LOW | src/panel/auth.py | 132 | CODE | |
| LOW | src/panel/version.py | 18 | CODE | |
| LOW | src/panel/config_routes.py | 94 | CODE | |
| LOW | src/panel/creds.py | 39 | CODE | |
| LOW | src/panel/creds.py | 105 | CODE | |
| LOW | src/panel/creds.py | 301 | CODE | |
| LOW | src/panel/creds.py | 445 | CODE | |
| LOW | src/panel/creds.py | 769 | CODE | |
| LOW | src/panel/creds.py | 872 | CODE | |
| LOW | src/panel/creds.py | 1223 | CODE | |
| LOW | src/panel/creds.py | 1451 | CODE | |
| LOW | src/panel/logs.py | 27 | CODE | |
| LOW | src/panel/logs.py | 98 | CODE | |
| LOW | src/converter/antigravity_fix.py | 74 | CODE | |
| LOW | src/converter/antigravity_fix.py | 262 | CODE | |
| LOW | src/converter/antigravity_fix.py | 308 | CODE | |
| LOW | src/converter/antigravity_fix.py | 441 | CODE | |
| LOW | src/converter/antigravity_fix.py | 670 | CODE | |
| LOW | src/converter/anti_truncation.py | 134 | CODE | |
| LOW | src/converter/anti_truncation.py | 225 | CODE | |
| LOW | src/converter/anti_truncation.py | 352 | CODE | |
| LOW | src/converter/anti_truncation.py | 836 | CODE | |
| LOW | src/converter/fake_stream.py | 162 | CODE | |
| LOW | src/converter/fake_stream.py | 356 | CODE | |
| LOW | src/converter/utils.py | 60 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 128 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 267 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 407 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 536 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 585 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 924 | CODE | |
| LOW | src/converter/gemini_fix.py | 120 | CODE | |
| LOW | src/converter/gemini_fix.py | 233 | CODE | |
| LOW | src/converter/openai2gemini.py | 122 | CODE | |
| LOW | src/converter/openai2gemini.py | 219 | CODE | |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/utils.py | 158 | 统一的灵活认证函数,支持多种认证方式 此函数可以直接用作 FastAPI 的 Depends 依赖 支持的认证方式: - URL 参数: key - HTTP 头部: Autho | STRING |
| HIGH | src/utils.py | 267 | 简化的控制面板密码验证函数 直接验证Bearer token是否等于控制面板密码 Args: credentials: HTTPAuthorizationCredentials 自动注入 | STRING |
| HIGH | src/panel/utils.py | 137 | 验证 mode 参数 Args: mode: 模式字符串 ("geminicli" 或 "antigravity") Returns: str: 验证后的 mode 字符串 | STRING |
| HIGH | src/converter/thoughtSignature_fix.py | 35 | 将 thoughtSignature 编码到工具调用ID中,以便往返保留。 Args: tool_id: 原始工具调用ID signature: thoughtSignature(可选) | STRING |
| HIGH | src/converter/thoughtSignature_fix.py | 57 | 从编码的ID中提取原始工具ID和thoughtSignature。 Args: encoded_id: 编码的工具调用ID Returns: (原始工具ID, thoughtSi | STRING |
| HIGH | src/api/geminicli.py | 47 | 从凭证数据准备请求头和最终payload Args: payload: 原始请求payload credential_data: 凭证数据字典 target_url | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/token_estimator.py | 2 | CODE | |
| LOW | src/credential_manager.py | 6 | CODE | |
| LOW | src/panel/__init__.py | 29 | CODE | |
| LOW | src/panel/__init__.py | 29 | CODE | |
| LOW | src/panel/__init__.py | 29 | CODE | |
| LOW | src/panel/__init__.py | 29 | CODE | |
| LOW | src/converter/anthropic2gemini.py | 6 | CODE | |
| LOW | src/router/geminicli/gemini.py | 33 | CODE | |
| LOW | src/router/geminicli/gemini.py | 51 | CODE | |
| LOW | src/router/geminicli/openai.py | 35 | CODE | |
| LOW | src/router/geminicli/openai.py | 53 | CODE | |
| LOW | src/router/geminicli/anthropic.py | 15 | CODE | |
| LOW | src/router/geminicli/anthropic.py | 35 | CODE | |
| LOW | src/router/geminicli/anthropic.py | 53 | CODE | |
| LOW | src/router/antigravity/gemini.py | 15 | CODE | |
| LOW | src/router/antigravity/gemini.py | 35 | CODE | |
| LOW | src/router/antigravity/gemini.py | 53 | CODE | |
| LOW | src/router/antigravity/openai.py | 35 | CODE | |
| LOW | src/router/antigravity/openai.py | 53 | CODE | |
| LOW | src/router/antigravity/anthropic.py | 15 | CODE | |
| LOW | src/router/antigravity/anthropic.py | 23 | CODE | |
| LOW | src/router/antigravity/anthropic.py | 35 | CODE | |
| LOW | src/router/antigravity/anthropic.py | 53 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | log.py | 321 | # 2. 设置日志文件: export LOG_FILE=log.txt (或在 .env 中设置) | COMMENT |
| LOW | docker-compose.yml | 21 | # Optional: Google credentials from environment | COMMENT |
| LOW | docker-compose.yml | 41 | - ./data/creds:/app/creds | COMMENT |
| LOW | docker-compose.yml | 61 | # image: mongo:7 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/panel/creds.py | 659 | CODE | |
| LOW | src/storage/psql_manager.py | 612 | CODE | |
| LOW | src/storage/sqlite_manager.py | 837 | CODE | |
| LOW | src/storage/mongodb_manager.py | 1017 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | log.py | 308 | __all__ = ["log", "set_log_level", "LOG_LEVELS"] | CODE |
| LOW | src/panel/__init__.py | 31 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install.sh | 294 | # Check if web.py exists | COMMENT |