mutao 1 mese fa
commit
f182e97fb9
100 ha cambiato i file con 18904 aggiunte e 0 eliminazioni
  1. BIN
      .codex-artifacts/juheai-astra-20260915/assets/astra-core-neptune.jpg
  2. BIN
      .codex-artifacts/juheai-astra-20260915/assets/astra-core.jpg
  3. BIN
      .codex-artifacts/juheai-astra-20260915/assets/cover-halo.jpg
  4. 26 0
      .codex-artifacts/juheai-astra-20260915/assets/credits.json
  5. 50 0
      .codex-artifacts/juheai-astra-20260915/assets/imagegen-prompts.md
  6. 21 0
      .codex-artifacts/juheai-astra-20260915/assets/sources.md
  7. BIN
      .codex-artifacts/juheai-astra-20260915/assets/speed-light.jpg
  8. 134 0
      .codex-artifacts/juheai-astra-20260915/build-result-v1.json
  9. 134 0
      .codex-artifacts/juheai-astra-20260915/build-result-交付版.json
  10. 134 0
      .codex-artifacts/juheai-astra-20260915/build-result-初稿.json
  11. 300 0
      .codex-artifacts/juheai-astra-20260915/build_deck.mjs
  12. BIN
      .codex-artifacts/juheai-astra-20260915/candidate-v1.pptx
  13. 114 0
      .codex-artifacts/juheai-astra-20260915/candidate-v1.pptx.inspect.ndjson
  14. BIN
      .codex-artifacts/juheai-astra-20260915/candidate-交付版.pptx
  15. 114 0
      .codex-artifacts/juheai-astra-20260915/candidate-交付版.pptx.inspect.ndjson
  16. BIN
      .codex-artifacts/juheai-astra-20260915/candidate-初稿.pptx
  17. 114 0
      .codex-artifacts/juheai-astra-20260915/candidate-初稿.pptx.inspect.ndjson
  18. BIN
      .codex-artifacts/juheai-astra-20260915/first-pass-v1.pptx
  19. 53 0
      .codex-artifacts/juheai-astra-20260915/inspect_rendered.mjs
  20. 0 0
      .codex-artifacts/juheai-astra-20260915/presentation-v1.json
  21. 0 0
      .codex-artifacts/juheai-astra-20260915/presentation-交付版.json
  22. 0 0
      .codex-artifacts/juheai-astra-20260915/presentation-初稿.json
  23. 625 0
      .codex-artifacts/juheai-astra-20260915/render-check-交付版.json
  24. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-1.png
  25. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-10.png
  26. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-2.png
  27. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-3.png
  28. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-4.png
  29. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-5.png
  30. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-6.png
  31. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-7.png
  32. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-8.png
  33. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-v1/slide-9.png
  34. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-1.png
  35. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-10.png
  36. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-2.png
  37. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-3.png
  38. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-4.png
  39. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-5.png
  40. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-6.png
  41. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-7.png
  42. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-8.png
  43. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-9.png
  44. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-1.png
  45. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-10.png
  46. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-2.png
  47. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-3.png
  48. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-4.png
  49. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-5.png
  50. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-6.png
  51. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-7.png
  52. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-8.png
  53. BIN
      .codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-9.png
  54. BIN
      .codex-artifacts/juheai-astra-20260915/second-pass-初稿.pptx
  55. 794 0
      .codex-artifacts/juheai-astra-20260915/text-metrics-v1.json
  56. 1058 0
      .codex-artifacts/juheai-astra-20260915/text-metrics-交付版.json
  57. 1058 0
      .codex-artifacts/juheai-astra-20260915/text-metrics-初稿.json
  58. 132 0
      .codex-artifacts/juheai-astra-20260915/validation-v1.json
  59. 132 0
      .codex-artifacts/juheai-astra-20260915/validation-交付版.json
  60. 132 0
      .codex-artifacts/juheai-astra-20260915/validation-初稿.json
  61. 85 0
      .dockerignore
  62. 22 0
      .gitattributes
  63. 44 0
      .github/audit-exceptions.yml
  64. 111 0
      .github/workflows/backend-ci.yml
  65. 69 0
      .github/workflows/cla.yml
  66. 306 0
      .github/workflows/release.yml
  67. 60 0
      .github/workflows/security-scan.yml
  68. 159 0
      .gitignore
  69. 89 0
      .goreleaser.simple.yaml
  70. 212 0
      .goreleaser.yaml
  71. 175 0
      ACCOUNT_PROTECTION_REVIEW_2026-09-14.md
  72. 73 0
      CLA.md
  73. 346 0
      DEV_GUIDE.md
  74. 4013 0
      DIRECTORY_TREE.txt
  75. 162 0
      Dockerfile
  76. 63 0
      Dockerfile.goreleaser
  77. 187 0
      LATEST_REVIEW_2026-09-15.md
  78. 165 0
      LICENSE
  79. 71 0
      LOCAL_ASSESSMENT_B_RESULTS_2026-09-14.md
  80. 53 0
      LOCAL_PROTECTION_STATUS_2026-09-14.md
  81. 57 0
      LOCAL_REPAIR_RESULTS_2026-09-14.md
  82. 70 0
      LOCAL_UI_BUGFIX_RESULTS_2026-09-15.md
  83. 62 0
      MODE1_LOCAL_HANDOFF.md
  84. 42 0
      Makefile
  85. 85 0
      OPTIONAL_CONTROLS_RESULTS_2026-09-15.md
  86. 109 0
      PROJECT_REVIEW_2026-09-14.md
  87. 913 0
      README.md
  88. 805 0
      README_CN.md
  89. 753 0
      README_JA.md
  90. 221 0
      REVIEW_BUGS_USABILITY_OPTIONS_2026-09-14.md
  91. 48 0
      SERVER_DEPLOYMENT_2026-09-15.md
  92. 59 0
      SITE_TUNING_RESULTS_2026-09-14.md
  93. 45 0
      SITE_TUNING_REVIEW_2026-09-14.md
  94. 4013 0
      SOURCE_MANIFEST.json
  95. 32 0
      assets/logo.svg
  96. BIN
      assets/partners/logos/RoxyBrowser.png
  97. BIN
      assets/partners/logos/aigocode.png
  98. BIN
      assets/partners/logos/aimzoon.jpg
  99. BIN
      assets/partners/logos/apikey-fun.png
  100. BIN
      assets/partners/logos/apimart.jpg

BIN
.codex-artifacts/juheai-astra-20260915/assets/astra-core-neptune.jpg


BIN
.codex-artifacts/juheai-astra-20260915/assets/astra-core.jpg


BIN
.codex-artifacts/juheai-astra-20260915/assets/cover-halo.jpg


+ 26 - 0
.codex-artifacts/juheai-astra-20260915/assets/credits.json

@@ -0,0 +1,26 @@
+{
+  "cover-halo": {
+    "title": "A Splendor Seldom Seen",
+    "credit": "NASA/JPL-Caltech/Space Science Institute",
+    "page": "https://images.nasa.gov/details/PIA14934",
+    "url": "https://images-assets.nasa.gov/image/PIA14934/PIA14934~orig.jpg"
+  },
+  "astra-core": {
+    "title": "Pulsar Artist Concept",
+    "credit": "NASA/JPL-Caltech",
+    "page": "https://photojournal.jpl.nasa.gov/catalog/PIA21085",
+    "url": "https://images-assets.nasa.gov/image/PIA21085/PIA21085~orig.jpg"
+  },
+  "speed-light": {
+    "title": "ISS-30 Star trail composite",
+    "credit": "NASA / Don Pettit",
+    "page": "https://images.nasa.gov/details/jsc2012e039800_alt",
+    "url": "https://images-assets.nasa.gov/image/jsc2012e039800_alt/jsc2012e039800_alt~orig.jpg"
+  },
+  "astra-core-neptune": {
+    "title": "Crescents of Neptune and Triton",
+    "credit": "NASA/JPL",
+    "page": "https://images.nasa.gov/details/PIA02215",
+    "url": "https://images-assets.nasa.gov/image/PIA02215/PIA02215~orig.jpg"
+  }
+}

+ 50 - 0
.codex-artifacts/juheai-astra-20260915/assets/imagegen-prompts.md

@@ -0,0 +1,50 @@
+# 聚合AI · Astra 发布会背景提示词
+
+Generation method: built-in image_gen.
+
+Status: All three requests failed before producing any image. The tool returned HTTP 404 / model_not_available: 模型 gpt-image-2 不在当前 API Key 的可用模型范围内.
+
+No raster asset or original image path exists. No CLI fallback or alternate model was used.
+
+## cover-halo.png
+
+```text
+Use case: stylized-concept
+Asset type: presentation background for a premium AI aggregation platform product launch deck, 16:9 landscape, requested high resolution 2048x1152.
+Scene/backdrop: perfectly minimal near-black #060910 studio void.
+Subject: a small set of ultra-fine ice-silver and electric-blue light streams gracefully gathering into one elegant three-dimensional orbital halo, with strong open negative space inside its silhouette and a refined metallic optical sheen.
+Style/medium: premium abstract CGI, meticulous cinematic product-render quality, restrained luxury technology aesthetic.
+Composition/framing: the entire halo and every visible light stream are confined to the right half of the canvas; focal center at x=75%, y=50%; generous dark padding around the halo. The left 52% of the image MUST remain flat, clean, almost uniform near-black #060910 for Chinese text to be laid over later. Absolutely no light spill or objects into the left region.
+Lighting/mood: controlled ice-silver highlights, subtle tiny electric-blue accents; quiet, confident, restrained glow.
+Color palette: near-black #060910, ice silver, a little electric blue only.
+Constraints: no text of any kind, no letters, no logos, no watermark, no UI, no charts, no frames. No purple, no dense star field, no cyberpunk city, no extra objects. One complete image, not a collage.
+```
+
+## astra-core.png
+
+```text
+Use case: stylized-concept
+Asset type: presentation background for a premium AI aggregation platform product launch deck, 16:9 landscape, requested high resolution 2048x1152.
+Scene/backdrop: perfectly minimal near-black #060910 studio void.
+Subject: an abstract transparent optical glass spherical core in close view, paired with one exquisitely thin ice-silver and pale electric-blue elliptical light ring. Refined glass refraction with an elegant distinct optical form, highly restrained luminosity.
+Style/medium: premium abstract CGI, meticulous high-end product rendering, luxury technology aesthetic.
+Composition/framing: sphere center at x=72%, y=52%; all meaningful visual material confined to the right 45% of canvas. Left 50% is flat, clean, calm near-black #060910 usable for Chinese slide typography. Keep full sphere and elliptical ring clear with generous dark margins. Do not center composition.
+Lighting/mood: controlled silver edge lighting, little blue, quiet and precise, no excessive flare.
+Color palette: near-black #060910, ice silver, a little electric blue only.
+Constraints: no text of any kind, no letters, no logos, no watermark, no UI, no charts. No purple, no dense star field, no cyberpunk city, no extra objects. One image, not a collage.
+```
+
+## speed-light.png
+
+```text
+Use case: stylized-concept
+Asset type: presentation background for a premium AI aggregation platform product launch deck, 16:9 landscape, requested high resolution 2048x1152.
+Scene/backdrop: perfectly minimal near-black #060910 studio void.
+Subject: a few very thin smooth ice-silver and pale electric-blue light trails moving horizontally across the lower half of the canvas and converging elegantly in the lower right corner. The precise continuous lines suggest speed and fluid delivery, with subtle three-dimensional depth and optical finish.
+Style/medium: premium abstract CGI, high-end product launch background, refined luxury technology aesthetic.
+Composition/framing: all light lines and their convergence sit below y=52%, with main convergence near x=87%, y=77%; leave the whole upper 42% and upper-left very clean near-black space for slide headlines. Wide asymmetrical composition with a small number of decisive lines, no clutter.
+Lighting/mood: restrained ice silver, subtle electric blue highlights, smooth speed without explosion or excessive motion blur.
+Color palette: near-black #060910, ice silver, a little electric blue only.
+Constraints: no text of any kind, no letters, no logos, no watermark, no UI, no charts. No purple, no dense star field, no cyberpunk city, no extra objects. One image, not a collage.
+```
+

+ 21 - 0
.codex-artifacts/juheai-astra-20260915/assets/sources.md

@@ -0,0 +1,21 @@
+# 聚合AI · Astra 背景图源
+
+以下原图由 NASA Image and Video Library 官方 API 返回的 canonical URL 下载,原始文件未作图像编辑。来源、标题和署名保存在 `credits.json`,供演示文稿讲者备注引用。
+
+| 文件 | NASA ID | 原图尺寸 | 标题 | 署名 |
+| --- | --- | --- | --- | --- |
+| cover-halo.jpg | PIA14934 | 6672 × 3104 | A Splendor Seldom Seen | NASA/JPL-Caltech/Space Science Institute |
+| astra-core.jpg | PIA21085 | 3840 × 2160 | Pulsar Artist Concept | NASA/JPL-Caltech |
+| speed-light.jpg | jsc2012e039800_alt | 4126 × 2746 | ISS-30 Star trail composite | NASA / Don Pettit |
+| astra-core-neptune.jpg | PIA02215 | 800 × 600 | Crescents of Neptune and Triton | NASA/JPL |
+
+`astra-core.jpg` 为候选素材,因紫色较多不采用;`astra-core-neptune.jpg` 为低分辨率候选素材,最终是否采用由版式决定。
+
+官方媒体规范已核对:
+
+- https://www.nasa.gov/nasa-brand-center/images-and-media/
+- https://www.nasa.gov/nasa-brand-center/advertising-guidelines/
+
+NASA 公开媒体可按规范用于广告,但不得明示或暗示 NASA 为商业产品或服务背书;应注明影像来源,并留意素材所标第三方权利。此处仅作为装饰性影像使用,不使用 NASA 标志,不暗示官方合作或背书。
+
+原计划使用内置 image_gen 制作三张定制背景;三个请求均因 `404 model_not_available` 失败,未生成图像,也未使用 CLI 或其他模型。改用上述 NASA 原图。提示词另存于 `imagegen-prompts.md`。

BIN
.codex-artifacts/juheai-astra-20260915/assets/speed-light.jpg


+ 134 - 0
.codex-artifacts/juheai-astra-20260915/build-result-v1.json

@@ -0,0 +1,134 @@
+{
+  "finalPath": "C:\\Users\\30214\\Desktop\\sub2本地\\sub2新站\\output\\presentations\\聚合AI_Astra_方案一_v1.pptx",
+  "receiptPath": "C:\\Users\\30214\\Desktop\\sub2本地\\sub2新站\\.codex-artifacts\\juheai-astra-20260915\\validation-v1.json",
+  "schemaVersion": "presentation-finalization.v1",
+  "finalSha256": "4f1a5d7624b6d21d3afa077df25f2c4dec4e89a23556256fe8f2e2c907cb04e5",
+  "byteCount": 2760085,
+  "packageIntegrity": {
+    "chart_count": 0,
+    "claim_boundary": "Structural package checks only; no slide text, notes, formulas, chart values, or native PowerPoint execution were inspected.",
+    "finding_count": 0,
+    "findings": [],
+    "notes_parts_skipped": 10,
+    "relationship_part_count": 25,
+    "slide_count": 10,
+    "status": "pass",
+    "exitCode": 0,
+    "findingCount": 0,
+    "warnings": []
+  },
+  "presentationLayout": {
+    "finding_count": 0,
+    "findings": [],
+    "font_policy": {
+      "checked_text_script_count": 109,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 109
+      },
+      "passed": true,
+      "performed": true
+    },
+    "slide_count": 10,
+    "slide_size_in": [
+      13.3333,
+      7.5
+    ],
+    "warning_count": 0,
+    "warnings": [],
+    "exitCode": 0,
+    "findingCount": 0,
+    "fontPolicy": {
+      "checked_text_script_count": 109,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 109
+      },
+      "passed": true,
+      "performed": true
+    }
+  },
+  "fontSelection": {
+    "basis": "design",
+    "approvedFamilies": [
+      "Microsoft YaHei"
+    ],
+    "scriptFonts": {},
+    "referenceSha256": null,
+    "referenceFontsVerifiedInEncodedText": false,
+    "checked_text_script_count": 109,
+    "native_font_rendering_verified": false,
+    "observed_font_families": [
+      "Microsoft YaHei"
+    ],
+    "observed_font_use_counts": {
+      "Microsoft YaHei": 109
+    },
+    "passed": true,
+    "performed": true
+  },
+  "firstPartyImport": {
+    "performed": true,
+    "passed": true,
+    "slideCount": 10,
+    "sha256": "4f1a5d7624b6d21d3afa077df25f2c4dec4e89a23556256fe8f2e2c907cb04e5",
+    "runtimeNodeModules": "C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules",
+    "nodeExecutable": "C:\\Users\\30214\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin\\node.exe"
+  },
+  "nativeTableArithmetic": {
+    "performed": true,
+    "checked_column_count": 0,
+    "checks": [],
+    "claim_boundary": "Displayed-value arithmetic with rounding tolerance; not source-data verification.",
+    "eligible_table_count": 0,
+    "finding_count": 0,
+    "findings": [],
+    "native_table_count": 0,
+    "passed": true,
+    "schema_version": "presentation-native-table-arithmetic.v1",
+    "skipped_tables": [],
+    "slide_count": 10,
+    "warning_count": 0,
+    "warnings": []
+  },
+  "nativeChartTitles": {
+    "performed": true,
+    "checks": [],
+    "finding_count": 0,
+    "findings": [],
+    "native_chart_count": 0,
+    "native_powerpoint_verified": false,
+    "passed": true,
+    "presentation_sha256": "4f1a5d7624b6d21d3afa077df25f2c4dec4e89a23556256fe8f2e2c907cb04e5",
+    "schema_version": "presentation-native-chart-titles.v1",
+    "slide_count": 10,
+    "source_text_emitted": false,
+    "unresolved_linked_title_count": 0
+  },
+  "sourceDerivedPolicyFlags": [
+    "--expected-slide-size-emu",
+    "12192000,6858000",
+    "--validate-bullet-geometry",
+    "--validate-heading-fit",
+    "--cover-role",
+    "none",
+    "--expected-slide-count",
+    "10",
+    "--approved-font-family",
+    "Microsoft YaHei"
+  ],
+  "nativeChartValidation": {
+    "detectedOwnerSlides": [],
+    "detectedChartCount": 0,
+    "targetApplication": "portable",
+    "sourceChartOwnersExplicitlyDeclared": true,
+    "validatorRan": false,
+    "passed": true
+  }
+}

+ 134 - 0
.codex-artifacts/juheai-astra-20260915/build-result-交付版.json

@@ -0,0 +1,134 @@
+{
+  "finalPath": "C:\\Users\\30214\\Desktop\\sub2本地\\sub2新站\\output\\presentations\\聚合AI_Astra_方案一.pptx",
+  "receiptPath": "C:\\Users\\30214\\Desktop\\sub2本地\\sub2新站\\.codex-artifacts\\juheai-astra-20260915\\validation-交付版.json",
+  "schemaVersion": "presentation-finalization.v1",
+  "finalSha256": "858cece6b34c5c7b5252babbb3110f4d9c355f90dc07b070ccdecad120f25e1f",
+  "byteCount": 2760406,
+  "packageIntegrity": {
+    "chart_count": 0,
+    "claim_boundary": "Structural package checks only; no slide text, notes, formulas, chart values, or native PowerPoint execution were inspected.",
+    "finding_count": 0,
+    "findings": [],
+    "notes_parts_skipped": 10,
+    "relationship_part_count": 25,
+    "slide_count": 10,
+    "status": "pass",
+    "exitCode": 0,
+    "findingCount": 0,
+    "warnings": []
+  },
+  "presentationLayout": {
+    "finding_count": 0,
+    "findings": [],
+    "font_policy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    },
+    "slide_count": 10,
+    "slide_size_in": [
+      13.3333,
+      7.5
+    ],
+    "warning_count": 0,
+    "warnings": [],
+    "exitCode": 0,
+    "findingCount": 0,
+    "fontPolicy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    }
+  },
+  "fontSelection": {
+    "basis": "design",
+    "approvedFamilies": [
+      "Microsoft YaHei"
+    ],
+    "scriptFonts": {},
+    "referenceSha256": null,
+    "referenceFontsVerifiedInEncodedText": false,
+    "checked_text_script_count": 111,
+    "native_font_rendering_verified": false,
+    "observed_font_families": [
+      "Microsoft YaHei"
+    ],
+    "observed_font_use_counts": {
+      "Microsoft YaHei": 111
+    },
+    "passed": true,
+    "performed": true
+  },
+  "firstPartyImport": {
+    "performed": true,
+    "passed": true,
+    "slideCount": 10,
+    "sha256": "858cece6b34c5c7b5252babbb3110f4d9c355f90dc07b070ccdecad120f25e1f",
+    "runtimeNodeModules": "C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules",
+    "nodeExecutable": "C:\\Users\\30214\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin\\node.exe"
+  },
+  "nativeTableArithmetic": {
+    "performed": true,
+    "checked_column_count": 0,
+    "checks": [],
+    "claim_boundary": "Displayed-value arithmetic with rounding tolerance; not source-data verification.",
+    "eligible_table_count": 0,
+    "finding_count": 0,
+    "findings": [],
+    "native_table_count": 0,
+    "passed": true,
+    "schema_version": "presentation-native-table-arithmetic.v1",
+    "skipped_tables": [],
+    "slide_count": 10,
+    "warning_count": 0,
+    "warnings": []
+  },
+  "nativeChartTitles": {
+    "performed": true,
+    "checks": [],
+    "finding_count": 0,
+    "findings": [],
+    "native_chart_count": 0,
+    "native_powerpoint_verified": false,
+    "passed": true,
+    "presentation_sha256": "858cece6b34c5c7b5252babbb3110f4d9c355f90dc07b070ccdecad120f25e1f",
+    "schema_version": "presentation-native-chart-titles.v1",
+    "slide_count": 10,
+    "source_text_emitted": false,
+    "unresolved_linked_title_count": 0
+  },
+  "sourceDerivedPolicyFlags": [
+    "--expected-slide-size-emu",
+    "12192000,6858000",
+    "--validate-bullet-geometry",
+    "--validate-heading-fit",
+    "--cover-role",
+    "none",
+    "--expected-slide-count",
+    "10",
+    "--approved-font-family",
+    "Microsoft YaHei"
+  ],
+  "nativeChartValidation": {
+    "detectedOwnerSlides": [],
+    "detectedChartCount": 0,
+    "targetApplication": "portable",
+    "sourceChartOwnersExplicitlyDeclared": true,
+    "validatorRan": false,
+    "passed": true
+  }
+}

+ 134 - 0
.codex-artifacts/juheai-astra-20260915/build-result-初稿.json

@@ -0,0 +1,134 @@
+{
+  "finalPath": "C:\\Users\\30214\\Desktop\\sub2本地\\sub2新站\\output\\presentations\\聚合AI_Astra_方案一_初稿.pptx",
+  "receiptPath": "C:\\Users\\30214\\Desktop\\sub2本地\\sub2新站\\.codex-artifacts\\juheai-astra-20260915\\validation-初稿.json",
+  "schemaVersion": "presentation-finalization.v1",
+  "finalSha256": "ecbcfa1dae05b0ee173af821dca8c2373e6355072d136b47eb3284d4c0388dcf",
+  "byteCount": 2760475,
+  "packageIntegrity": {
+    "chart_count": 0,
+    "claim_boundary": "Structural package checks only; no slide text, notes, formulas, chart values, or native PowerPoint execution were inspected.",
+    "finding_count": 0,
+    "findings": [],
+    "notes_parts_skipped": 10,
+    "relationship_part_count": 25,
+    "slide_count": 10,
+    "status": "pass",
+    "exitCode": 0,
+    "findingCount": 0,
+    "warnings": []
+  },
+  "presentationLayout": {
+    "finding_count": 0,
+    "findings": [],
+    "font_policy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    },
+    "slide_count": 10,
+    "slide_size_in": [
+      13.3333,
+      7.5
+    ],
+    "warning_count": 0,
+    "warnings": [],
+    "exitCode": 0,
+    "findingCount": 0,
+    "fontPolicy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    }
+  },
+  "fontSelection": {
+    "basis": "design",
+    "approvedFamilies": [
+      "Microsoft YaHei"
+    ],
+    "scriptFonts": {},
+    "referenceSha256": null,
+    "referenceFontsVerifiedInEncodedText": false,
+    "checked_text_script_count": 111,
+    "native_font_rendering_verified": false,
+    "observed_font_families": [
+      "Microsoft YaHei"
+    ],
+    "observed_font_use_counts": {
+      "Microsoft YaHei": 111
+    },
+    "passed": true,
+    "performed": true
+  },
+  "firstPartyImport": {
+    "performed": true,
+    "passed": true,
+    "slideCount": 10,
+    "sha256": "ecbcfa1dae05b0ee173af821dca8c2373e6355072d136b47eb3284d4c0388dcf",
+    "runtimeNodeModules": "C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules",
+    "nodeExecutable": "C:\\Users\\30214\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin\\node.exe"
+  },
+  "nativeTableArithmetic": {
+    "performed": true,
+    "checked_column_count": 0,
+    "checks": [],
+    "claim_boundary": "Displayed-value arithmetic with rounding tolerance; not source-data verification.",
+    "eligible_table_count": 0,
+    "finding_count": 0,
+    "findings": [],
+    "native_table_count": 0,
+    "passed": true,
+    "schema_version": "presentation-native-table-arithmetic.v1",
+    "skipped_tables": [],
+    "slide_count": 10,
+    "warning_count": 0,
+    "warnings": []
+  },
+  "nativeChartTitles": {
+    "performed": true,
+    "checks": [],
+    "finding_count": 0,
+    "findings": [],
+    "native_chart_count": 0,
+    "native_powerpoint_verified": false,
+    "passed": true,
+    "presentation_sha256": "ecbcfa1dae05b0ee173af821dca8c2373e6355072d136b47eb3284d4c0388dcf",
+    "schema_version": "presentation-native-chart-titles.v1",
+    "slide_count": 10,
+    "source_text_emitted": false,
+    "unresolved_linked_title_count": 0
+  },
+  "sourceDerivedPolicyFlags": [
+    "--expected-slide-size-emu",
+    "12192000,6858000",
+    "--validate-bullet-geometry",
+    "--validate-heading-fit",
+    "--cover-role",
+    "none",
+    "--expected-slide-count",
+    "10",
+    "--approved-font-family",
+    "Microsoft YaHei"
+  ],
+  "nativeChartValidation": {
+    "detectedOwnerSlides": [],
+    "detectedChartCount": 0,
+    "targetApplication": "portable",
+    "sourceChartOwnersExplicitlyDeclared": true,
+    "validatorRan": false,
+    "passed": true
+  }
+}

+ 300 - 0
.codex-artifacts/juheai-astra-20260915/build_deck.mjs

@@ -0,0 +1,300 @@
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import { pathToFileURL } from 'node:url';
+import { Presentation, PresentationFile } from '@oai/artifact-tool';
+import { createCanvas } from '@napi-rs/canvas';
+
+const workspaceDir = 'C:/Users/30214/Desktop/sub2本地/sub2新站';
+const buildDir = path.join(workspaceDir, '.codex-artifacts/juheai-astra-20260915');
+const assetDir = path.join(buildDir, 'assets');
+const outputDir = path.join(workspaceDir, 'output/presentations');
+const skillDir = 'C:/Users/30214/.codex/plugins/cache/openai-primary-runtime/presentations/26.909.12148/skills/presentations';
+const pythonExecutable = 'C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe';
+const revision = process.argv[2] || 'v1';
+const finalPath = path.join(outputDir, revision === '交付版' ? '聚合AI_Astra_方案一.pptx' : `聚合AI_Astra_方案一_${revision}.pptx`);
+const renderDir = path.join(buildDir, `rendered-${revision}`);
+const { resolvePresentationFont, finalizePresentation } = await import(pathToFileURL(path.join(skillDir, 'container_tools/artifact_tool_utils.mjs')).href);
+const font = resolvePresentationFont({ fontFamily: 'Microsoft YaHei' });
+const fontPolicy = { basis: 'design', families: [font] };
+
+const C = { black: '#000000', white: '#F0F4FA', silver: '#B6C3D1', muted: '#8C9BAE', blue: '#88D6FF', dim: '#344554' };
+const presentation = Presentation.create({ slideSize: { width: 1280, height: 720 } });
+const measureContext = createCanvas(1280, 720).getContext('2d');
+const textChecks = [];
+const pendingFolios = [];
+const assets = {};
+const imageCredits = {};
+const source = (rel, line) => `${workspaceDir}/${rel}:${line}`;
+const SOURCES = {
+  platform: source('frontend/src/views/HomeView.vue', 62),
+  protocols: source('backend/internal/server/routes/gateway.go', 196),
+  gemini: source('backend/internal/server/routes/gateway.go', 339),
+  clients: source('frontend/src/components/keys/UseKeyModal.vue', 941),
+  astra: source('frontend/src/components/keys/UseKeyModal.vue', 1328),
+  reasoning: source('backend/internal/service/openai_gateway_request_body.go', 1022),
+  retryTest: source('backend/internal/service/openai_astra_pro_retry_test.go', 64),
+  failover: source('backend/internal/handler/openai_gateway_handler.go', 883),
+  failoverTest: source('backend/internal/handler/openai_responses_astra_pro_failover_test.go', 140),
+  stream: source('backend/internal/service/openai_gateway_forward.go', 1207),
+  usage: source('frontend/src/views/user/UsageView.vue', 650),
+  monitor: source('frontend/src/views/user/ChannelStatusV2View.vue', 196),
+  key: source('frontend/src/views/user/KeysView.vue', 205),
+};
+
+async function loadAsset(name, required = false) {
+  for (const ext of ['jpg', 'jpeg', 'png', 'webp']) {
+    const file = path.join(assetDir, `${name}.${ext}`);
+    try {
+      const bytes = await fs.readFile(file);
+      return { bytes, contentType: ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : `image/${ext}`, file };
+    } catch (error) {
+      if (error.code !== 'ENOENT') throw error;
+    }
+  }
+  if (required) throw new Error(`Missing required asset: ${name}`);
+  return null;
+}
+
+function text(slide, name, value, left, top, width, height, size, opts = {}) {
+  measureContext.font = `${opts.bold ? 'bold' : 'normal'} ${size}px "${font}"`;
+  const metrics = measureContext.measureText(value);
+  const measuredHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;
+  textChecks.push({ slide: presentation.slides.items.indexOf(slide) + 1, name, value, left, top, width, height, color: opts.color ?? C.white, measuredWidth: metrics.width, measuredHeight });
+  if (metrics.width > width - 2 || measuredHeight > height || left < 0 || top < 0 || left + width > 1280 || top + height > 720) {
+    throw new Error(`Text does not fit: ${name}: ${metrics.width}x${measuredHeight} in ${width}x${height}`);
+  }
+  const box = slide.shapes.add({
+    name,
+    geometry: 'textbox',
+    position: { left, top, width, height },
+    fill: 'none',
+    line: { fill: 'none', width: 0 },
+  });
+  box.text = value;
+  box.text.style = {
+    typeface: font,
+    fontSize: size,
+    bold: opts.bold ?? false,
+    color: opts.color ?? C.white,
+    alignment: opts.align ?? 'left',
+    verticalAlignment: 'middle',
+    autoFit: 'none',
+    wrap: 'none',
+    insets: { left: 0, right: 0, top: 0, bottom: 0 },
+  };
+  return box;
+}
+
+function art(slide, name, left, top, width, height, fit = 'contain') {
+  const asset = assets[name];
+  if (!asset) return;
+  slide.images.add({
+    blob: asset.bytes,
+    contentType: asset.contentType,
+    alt: imageCredits[name]?.title || `Space image background: ${name}`,
+    fit,
+    position: { left, top, width, height },
+  });
+}
+
+function notes(slide, narration, references = [], artNames = []) {
+  const credit = artNames.filter(x => imageCredits[x]).map(x => {
+    const a = imageCredits[x];
+    return `Visual source: ${a.title}. ${a.credit || ''} ${a.page || ''} ${a.url || ''}`.trim();
+  });
+  slide.speakerNotes.textFrame.setText([
+    narration,
+    ...references.map(ref => `Source: ${ref}`),
+    ...credit,
+  ].join('\n\n'));
+}
+
+function slideBase(page, withFolio = true) {
+  const slide = presentation.slides.add();
+  slide.background.fill = C.black;
+  if (withFolio) pendingFolios.push({ slide, page });
+  return slide;
+}
+
+function title(slide, value) {
+  return text(slide, 'slide-title', value, 76, 72, 1128, 84, 48, { bold: true });
+}
+
+async function build() {
+  await fs.mkdir(outputDir, { recursive: true });
+  await fs.mkdir(renderDir, { recursive: true });
+  for (const name of ['cover-halo', 'astra-core', 'speed-light']) assets[name] = await loadAsset(name, name === 'cover-halo');
+  Object.assign(imageCredits, JSON.parse(await fs.readFile(path.join(assetDir, 'credits.json'), 'utf8')));
+
+  // 1. Platform first. Astra is the promoted model within the platform.
+  {
+    const s = slideBase(1, false);
+    art(s, 'cover-halo', 575, 58, 705, 590);
+    text(s, 'brand', '聚合AI', 76, 164, 650, 120, 88, { bold: true });
+    text(s, 'featured-model', 'Astra 主推模型', 80, 306, 540, 80, 40);
+    text(s, 'brand-promise', '不降智,稳定,高速', 80, 440, 550, 55, 30, { color: C.silver });
+    text(s, 'platform-value', '多模型选择,统一接入', 80, 596, 540, 44, 24, { color: C.blue });
+    notes(s, '聚合AI是平台品牌,Astra是本次重点介绍的模型。平台聚合多种模型接入方式,让用户在熟悉的工具中完成调用。品牌名称和“不降智,稳定,高速”的定位来自用户。', [SOURCES.platform, SOURCES.protocols], ['cover-halo']);
+  }
+
+  // 2. Clear aggregation identity and protocol compatibility.
+  {
+    const s = slideBase(2);
+    title(s, '多模型,一个入口');
+    text(s, 'platform-explanation', '模型接入、API Key、调用记录与费用管理,集中在聚合AI。', 78, 174, 1120, 56, 26, { color: C.silver });
+    text(s, 'featured-model-label', '本站主推', 80, 316, 480, 42, 24, { color: C.blue });
+    text(s, 'astra-word', 'Astra', 76, 354, 510, 112, 88, { bold: true });
+    text(s, 'protocol-label', '支持多种接入协议', 682, 282, 510, 43, 24, { color: C.muted });
+    text(s, 'protocol-openai', 'OpenAI 兼容', 682, 342, 510, 53, 34);
+    text(s, 'protocol-anthropic', 'Anthropic Messages', 682, 412, 510, 53, 34);
+    text(s, 'protocol-gemini', 'Gemini 原生', 682, 482, 510, 53, 34);
+    text(s, 'platform-takeaway', '按任务选择模型,沿用熟悉的工具。', 80, 595, 1070, 46, 26, { color: C.silver });
+    notes(s, '聚合AI提供多种协议路由,统一管理密钥和用量。OpenAI兼容包括Responses和Chat Completions,另有Anthropic Messages与Gemini原生路由。可用模型以账号分组、权限和控制台列表为准。', [SOURCES.platform, SOURCES.protocols, SOURCES.gemini]);
+  }
+
+  // 3. A quiet model hero, with task-oriented positioning.
+  {
+    const s = slideBase(3);
+    text(s, 'model-section-label', '聚合AI 主推模型', 80, 88, 730, 50, 28, { color: C.blue });
+    text(s, 'astra-hero', 'ASTRA', 72, 178, 1128, 181, 136, { bold: true });
+    text(s, 'astra-positioning', '把 Astra 接入你的工作流', 80, 367, 740, 66, 36);
+    text(s, 'astra-settings', '按所选模型与推理设置发起调用。', 80, 445, 760, 55, 26, { color: C.silver });
+    text(s, 'task-coding', '编码协作', 80, 586, 218, 44, 26, { color: C.blue });
+    text(s, 'task-analysis', '复杂分析', 303, 586, 218, 44, 26, { color: C.silver });
+    text(s, 'task-agent', 'Agent 任务', 526, 586, 300, 44, 26, { color: C.silver });
+    notes(s, 'Astra是用户指定的主推模型。项目客户端配置包含Astra模型标识,转发代码保留相应推理参数。编码协作、复杂分析与Agent任务是本页给出的使用方向,不构成与其他模型的能力排名或测试结论。', [SOURCES.astra, SOURCES.reasoning]);
+  }
+
+  // 4. Explain “不降智” narrowly and concretely.
+  {
+    const s = slideBase(4);
+    title(s, '不降智,保留 Astra 推理设置');
+    text(s, 'preserve-model', 'Astra 按设定调用', 76, 256, 630, 95, 56, { bold: true });
+    text(s, 'preserve-reasoning', '保留推理设置', 76, 366, 630, 95, 56, { bold: true, color: C.blue });
+    text(s, 'settings-body-1', 'Astra 请求重试或故障切换时,', 739, 263, 469, 44, 27, { color: C.silver });
+    text(s, 'settings-body-2', '继续保留指定推理设置。', 739, 308, 469, 44, 27, { color: C.silver });
+    text(s, 'mode-rejected-1', '推理设置不受支持时,', 739, 412, 469, 44, 27, { color: C.silver });
+    text(s, 'mode-rejected-2', '明确提示原因。', 739, 457, 469, 44, 27, { color: C.silver });
+    notes(s, '这里把“不降智”具体解释为Astra指定推理参数的保留。代码及现有测试覆盖pro/max参数在重试与账号切换时保留,并在上游拒绝指定模式时保留错误。测试也覆盖特定重试和故障切换路径中Astra模型标识不变;项目允许显式模型映射,不将这项测试泛化为所有配置下模型标识永不改变。引用测试文件属于实现依据,本次未运行线上质量测试;不把转发设置等同于上游每次回答质量保证。', [SOURCES.reasoning, SOURCES.retryTest, SOURCES.failoverTest]);
+  }
+
+  // 5. An honest workflow example, not a fabricated model response.
+  {
+    const s = slideBase(5);
+    title(s, 'Astra 工作流示例');
+    text(s, 'sample-task-line-1', '为已有项目增加登录能力', 76, 229, 1128, 77, 48, { bold: true });
+    text(s, 'sample-task-line-2', '兼顾权限、异常处理与验证', 76, 313, 1128, 77, 48, { color: C.blue });
+    text(s, 'context-label', '给模型的上下文', 78, 466, 550, 45, 28);
+    text(s, 'context-body-1', '现有代码、技术栈、约束', 78, 523, 550, 44, 26, { color: C.silver });
+    text(s, 'context-body-2', '与验收要求。', 78, 565, 550, 44, 26, { color: C.silver });
+    text(s, 'review-label', '你要检查的结果', 683, 466, 520, 45, 28);
+    text(s, 'review-body-1', '实现方案、代码修改、验证步骤', 683, 523, 520, 44, 26, { color: C.silver });
+    text(s, 'review-body-2', '与边界说明。', 683, 565, 520, 44, 26, { color: C.silver });
+    notes(s, '这一页是面向开发者的任务示例,展示如何组织输入与检查输出,不是Astra实际跑出的回答,也不是性能或正确率测评。讲解时可结合真实项目补充上下文,由用户核验模型给出的方案和代码。', [SOURCES.platform]);
+  }
+
+  // 6. Conditional recovery rather than an invented SLA.
+  {
+    const s = slideBase(6);
+    title(s, '稳定调用,异常自动处理');
+    text(s, 'recovery-condition', '请求条件允许时,平台识别可重试故障,并尝试切换合适账号。', 78, 173, 1128, 57, 26, { color: C.silver });
+    const columns = [
+      { x: 78, n: '01', label: '识别异常', detail: '判断请求是否可以重试' },
+      { x: 471, n: '02', label: '切换账号', detail: '选择当前可用的账号' },
+      { x: 864, n: '03', label: '保持设置', detail: '继续保留 Astra 推理参数' },
+    ];
+    for (const { x, n, label, detail } of columns) {
+      text(s, `recovery-number-${n}`, n, x, 299, 320, 99, 76, { color: C.blue });
+      text(s, `recovery-label-${n}`, label, x, 420, 330, 57, 36, { bold: true });
+      text(s, `recovery-detail-${n}`, detail, x, 488, 340, 49, 24, { color: C.silver });
+    }
+    text(s, 'recovery-monitor', '渠道状态与成功率可查看。', 78, 602, 1040, 40, 25, { color: C.muted });
+    notes(s, '自动重试与切换有明确条件,包括错误允许重试、请求可安全回放、存在合适账号并且未达到上限。页面不承诺零中断或无限重试。渠道监控提供状态及成功率,具体结果受样本、时间窗口和上游状态影响。', [SOURCES.failover, SOURCES.failoverTest, SOURCES.monitor]);
+  }
+
+  // 7. Streaming and observable latency, with no invented measurement.
+  {
+    const s = slideBase(7);
+    art(s, 'speed-light', 685, 448, 519, 181, 'cover');
+    title(s, '高速响应,进度看得见');
+    text(s, 'stream-label', '流式输出', 78, 244, 520, 69, 44, { bold: true, color: C.blue });
+    text(s, 'stream-description-1', '开启流式请求,', 78, 331, 555, 49, 27, { color: C.silver });
+    text(s, 'stream-description-2', '生成内容逐步返回。', 78, 378, 555, 49, 27, { color: C.silver });
+    text(s, 'latency-label', '响应可查', 685, 244, 518, 69, 44, { bold: true });
+    text(s, 'latency-description-1', '首 Token 与总耗时,', 685, 331, 518, 49, 27, { color: C.silver });
+    text(s, 'latency-description-2', '可在用量记录中核对。', 685, 378, 518, 49, 27, { color: C.silver });
+    text(s, 'stream-closing-1', '使用过程更直观,', 78, 526, 550, 44, 26, { color: C.silver });
+    text(s, 'stream-closing-2', '响应表现有记录。', 78, 569, 550, 44, 26, { color: C.silver });
+    notes(s, '流式输出要求客户端开启stream并且相应上游协议支持。用量记录展示首Token时间和总耗时。本页不引用未经采集的速度数字,不把渠道监控中TPM除以60得到的窗口吞吐量当作单请求生成速度。', [SOURCES.stream, SOURCES.usage, SOURCES.monitor], ['speed-light']);
+  }
+
+  // 8. Return to the wider value of an AI aggregation platform.
+  {
+    const s = slideBase(8);
+    title(s, '多模型接入,调用清楚可查');
+    text(s, 'models-label', '按任务选模型', 78, 275, 552, 69, 40, { bold: true, color: C.blue });
+    text(s, 'models-description-1', '通过控制台查看可用模型,', 78, 365, 552, 49, 27, { color: C.silver });
+    text(s, 'models-description-2', '选择适合当前任务的配置。', 78, 412, 552, 49, 27, { color: C.silver });
+    text(s, 'usage-label', '按记录看消耗', 684, 275, 520, 69, 40, { bold: true });
+    text(s, 'usage-description-1', '模型、Token 和实际扣费,', 684, 365, 520, 49, 27, { color: C.silver });
+    text(s, 'usage-description-2', '每笔调用都可核对。', 684, 412, 520, 49, 27, { color: C.silver });
+    text(s, 'key-control', 'API Key 的额度、有效期与访问权限可分别设置。', 78, 579, 1128, 54, 26, { color: C.muted });
+    notes(s, '聚合平台统一提供模型列表、密钥管理与调用记录。用量记录包括输入输出及缓存Token和实际费用。可用模型按账号分组与权限确定,费用以实际配置和用量记录为准。', [SOURCES.platform, SOURCES.usage, SOURCES.key]);
+  }
+
+  // 9. An actionable onboarding sequence without an invented URL.
+  {
+    const s = slideBase(9);
+    title(s, '接入你正在用的工具');
+    text(s, 'compatibility', '支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。', 78, 173, 1128, 57, 26, { color: C.silver });
+    const rows = [
+      ['01', '填写接入地址', '复制控制台提供的 Base URL', 288],
+      ['02', '配置 API Key', '创建密钥,并选择所需的分组与额度', 407],
+      ['03', '选择 Astra', '按控制台模型名称配置,开始调用', 526],
+    ];
+    for (const [n, label, detail, y] of rows) {
+      text(s, `onboard-number-${n}`, n, 78, y, 140, 75, 52, { color: C.blue });
+      text(s, `onboard-label-${n}`, label, 233, y + 6, 450, 62, 34, { bold: true });
+      text(s, `onboard-detail-${n}`, detail, 704, y + 9, 500, 54, 25, { color: C.silver });
+    }
+    notes(s, '项目提供客户端配置辅助。适用于支持自定义Base URL的客户端和SDK。实际地址、密钥和模型标识从控制台复制,密钥权限需要覆盖所选模型分组。这里不公开任何用户密钥,也不填入未确认的站点域名。', [SOURCES.clients, SOURCES.astra, SOURCES.key]);
+  }
+
+  // 10. Close on the platform brand, not on a standalone model identity.
+  {
+    const s = slideBase(10, false);
+    art(s, 'cover-halo', 610, 76, 670, 559);
+    text(s, 'closing-brand', '聚合AI', 76, 164, 650, 116, 84, { bold: true });
+    text(s, 'closing-positioning', 'Astra 主推,多模型聚合', 80, 302, 910, 74, 40);
+    text(s, 'closing-promise', '不降智,稳定,高速', 80, 430, 850, 60, 32, { color: C.blue });
+    text(s, 'closing-cta', '创建 API Key,连接你的常用工具。', 80, 584, 1060, 51, 27, { color: C.silver });
+    notes(s, '总结聚合AI的定位:Astra为主推模型,多模型聚合作为平台价值。用户可以在控制台创建API Key,并按对应协议接入常用工具。', [SOURCES.platform, SOURCES.clients], ['cover-halo']);
+  }
+
+  for (const { slide, page } of pendingFolios) {
+    text(slide, `folio-${page}`, String(page), 1180, 653, 28, 25, 17, { color: C.muted, align: 'right' });
+  }
+  const candidatePath = path.join(buildDir, `candidate-${revision}.pptx`);
+  await fs.writeFile(path.join(buildDir, `text-metrics-${revision}.json`), JSON.stringify(textChecks, null, 2));
+  await (await PresentationFile.exportPptx(presentation)).save(candidatePath);
+  const result = await finalizePresentation({
+    workspaceDir,
+    candidatePath,
+    finalPath,
+    pythonExecutable,
+    integrityValidatorPath: path.join(skillDir, 'container_tools/inspect_presentation_package_integrity.py'),
+    layoutValidatorPath: path.join(skillDir, 'container_tools/inspect_presentation_layout_geometry.py'),
+    layoutArgs: ['--expected-slide-size-emu', '12192000,6858000', '--validate-bullet-geometry', '--validate-heading-fit'],
+    explicitTotalSlideCount: 10,
+    requiredNativeTableOwnerSlides: [],
+    requiredNativeChartOwnerSlides: [],
+    fontPolicy,
+    verifyArtifactToolImport: true,
+    receiptPath: path.join(buildDir, `validation-${revision}.json`),
+  });
+  await fs.writeFile(path.join(buildDir, `presentation-${revision}.json`), JSON.stringify(presentation.toProto()));
+  await fs.writeFile(path.join(buildDir, `build-result-${revision}.json`), JSON.stringify(result, null, 2));
+  console.log(JSON.stringify({ finalPath, candidatePath, renderDir, slideCount: presentation.slides.items.length, font }, null, 2));
+}
+
+await build();

BIN
.codex-artifacts/juheai-astra-20260915/candidate-v1.pptx


+ 114 - 0
.codex-artifacts/juheai-astra-20260915/candidate-v1.pptx.inspect.ndjson

@@ -0,0 +1,114 @@
+{"kind":"deck","id":"pr/uhgaao","name":"Deck"}
+{"kind":"layout","layoutId":"d96dbbba-87b9-4faa-b757-94ca26fb1e5e","name":"Master","type":"master"}
+{"kind":"layout","layoutId":"ef24f38c-9e20-43ab-98b7-c50df1bfce35","name":"Title Slide","type":"title"}
+{"kind":"slide","id":"sl/b7171k","slide":1,"title":"聚合AI","textShapes":4}
+{"kind":"textbox","id":"sh/w3ux8bmd","slide":1,"name":"brand","text":"聚合AI","textPreview":"聚合AI","textChars":4,"textLines":1,"bbox":[76,164,650,120]}
+{"kind":"textbox","id":"sh/x43yhgny","slide":1,"name":"featured-model","text":"Astra 主推模型","textPreview":"Astra 主推模型","textChars":10,"textLines":1,"bbox":[80,306,540,80]}
+{"kind":"textbox","id":"sh/i5wfal4j","slide":1,"name":"brand-promise","text":"不降智,稳定,高速","textPreview":"不降智,稳定,高速","textChars":9,"textLines":1,"bbox":[80,440,550,55]}
+{"kind":"textbox","id":"sh/jq5gj654","slide":1,"name":"platform-value","text":"多模型选择,统一接入","textPreview":"多模型选择,统一接入","textChars":10,"textLines":1,"bbox":[80,596,540,44]}
+{"kind":"image","id":"im/m9gnelsj","slide":1,"name":"","alt":"Space image background: cover-halo","bbox":[575,58,705,590]}
+{"kind":"notes","id":"nt/b7171k","slide":1,"text":"聚合AI是平台品牌,Astra是本次重点介绍的模型。平台聚合多种模型接入方式,让用户在熟悉的工具中完成调用。品牌名称和“不降智,稳定,高速”的定位来自用户。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:196"}
+{"kind":"slide","id":"sl/8llwoc","slide":2,"title":"2","textShapes":10}
+{"kind":"textbox","id":"sh/fm1wjyhc","slide":2,"name":"folio-2","text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/gnuds3yx","slide":2,"name":"slide-title","text":"多模型,一个入口","textPreview":"多模型,一个入口","textChars":8,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/ho3el8zi","slide":2,"name":"platform-explanation","text":"模型接入、API Key、调用记录与费用管理,集中在聚合AI。","textPreview":"模型接入、API Key、调用记录与费用管理,集中在聚合AI。","textChars":31,"textLines":1,"bbox":[78,174,1120,56]}
+{"kind":"textbox","id":"sh/2pcvudgn","slide":2,"name":"featured-model-label","text":"本站主推","textPreview":"本站主推","textChars":4,"textLines":1,"bbox":[80,316,480,42]}
+{"kind":"textbox","id":"sh/3qlwnih8","slide":2,"name":"astra-word","text":"Astra","textPreview":"Astra","textChars":5,"textLines":1,"bbox":[76,354,510,112]}
+{"kind":"textbox","id":"sh/4rudwnyt","slide":2,"name":"protocol-label","text":"支持多种接入协议","textPreview":"支持多种接入协议","textChars":8,"textLines":1,"bbox":[682,282,510,43]}
+{"kind":"textbox","id":"sh/ps3epsze","slide":2,"name":"protocol-openai","text":"OpenAI 兼容","textPreview":"OpenAI 兼容","textChars":9,"textLines":1,"bbox":[682,342,510,53]}
+{"kind":"textbox","id":"sh/it8vit0j","slide":2,"name":"protocol-anthropic","text":"Anthropic Messages","textPreview":"Anthropic Messages","textChars":18,"textLines":1,"bbox":[682,412,510,53]}
+{"kind":"textbox","id":"sh/juhcbeh4","slide":2,"name":"protocol-gemini","text":"Gemini 原生","textPreview":"Gemini 原生","textChars":9,"textLines":1,"bbox":[682,482,510,53]}
+{"kind":"textbox","id":"sh/nyxkrm9k","slide":2,"name":"platform-takeaway","text":"按任务选择模型,沿用熟悉的工具。","textPreview":"按任务选择模型,沿用熟悉的工具。","textChars":16,"textLines":1,"bbox":[80,595,1070,46]}
+{"kind":"notes","id":"nt/8llwoc","slide":2,"text":"聚合AI提供多种协议路由,统一管理密钥和用量。OpenAI兼容包括Responses和Chat Completions,另有Anthropic Messages与Gemini原生路由。可用模型以账号分组、权限和控制台列表为准。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:196\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:339"}
+{"kind":"slide","id":"sl/sx1d08","slide":3,"title":"3","textShapes":8}
+{"kind":"textbox","id":"sh/gvi98vap","slide":3,"name":"folio-3","text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/fu98zqt4","slide":3,"name":"model-section-label","text":"聚合AI 主推模型","textPreview":"聚合AI 主推模型","textChars":9,"textLines":1,"bbox":[80,88,730,50]}
+{"kind":"textbox","id":"sh/etgr6lcj","slide":3,"name":"astra-hero","text":"ASTRA","textPreview":"ASTRA","textChars":5,"textLines":1,"bbox":[72,178,1128,181]}
+{"kind":"textbox","id":"sh/pkra50b6","slide":3,"name":"astra-positioning","text":"把 Astra 接入你的工作流","textPreview":"把 Astra 接入你的工作流","textChars":15,"textLines":1,"bbox":[80,367,740,66]}
+{"kind":"textbox","id":"sh/oji9cfal","slide":3,"name":"astra-settings","text":"按所选模型与推理设置发起调用。","textPreview":"按所选模型与推理设置发起调用。","textChars":15,"textLines":1,"bbox":[80,445,760,55]}
+{"kind":"textbox","id":"sh/3i983at0","slide":3,"name":"task-coding","text":"编码协作","textPreview":"编码协作","textChars":4,"textLines":1,"bbox":[80,586,218,44]}
+{"kind":"textbox","id":"sh/2h0ra5sv","slide":3,"name":"task-analysis","text":"复杂分析","textPreview":"复杂分析","textChars":4,"textLines":1,"bbox":[303,586,218,44]}
+{"kind":"textbox","id":"sh/5o7qtgb2","slide":3,"name":"task-agent","text":"Agent 任务","textPreview":"Agent 任务","textChars":8,"textLines":1,"bbox":[526,586,300,44]}
+{"kind":"notes","id":"nt/sx1d08","slide":3,"text":"Astra是用户指定的主推模型。项目客户端配置包含Astra模型标识,转发代码保留相应推理参数。编码协作、复杂分析与Agent任务是本页给出的使用方向,不构成与其他模型的能力排名或测试结论。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:1328\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_request_body.go:1022"}
+{"kind":"slide","id":"sl/56blbb","slide":4,"title":"4","textShapes":8}
+{"kind":"textbox","id":"sh/98fepsr2","slide":4,"name":"folio-4","text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/m5ofudsr","slide":4,"name":"slide-title","text":"不降智,落实到每次转发","textPreview":"不降智,落实到每次转发","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/n6xwni9c","slide":4,"name":"preserve-model","text":"保留模型选择","textPreview":"保留模型选择","textChars":6,"textLines":1,"bbox":[76,256,630,95]}
+{"kind":"textbox","id":"sh/wbqxknat","slide":4,"name":"preserve-reasoning","text":"保留推理设置","textPreview":"保留推理设置","textChars":6,"textLines":1,"bbox":[76,366,630,95]}
+{"kind":"textbox","id":"sh/xwzytsre","slide":4,"name":"settings-body-1","text":"Astra 请求在转发、重试与账号","textPreview":"Astra 请求在转发、重试与账号","textChars":17,"textLines":1,"bbox":[739,263,469,44]}
+{"kind":"textbox","id":"sh/a9ofixsn","slide":4,"name":"settings-body-2","text":"切换过程中保留模型和推理参数。","textPreview":"切换过程中保留模型和推理参数。","textChars":15,"textLines":1,"bbox":[739,308,469,44]}
+{"kind":"textbox","id":"sh/vaxgr298","slide":4,"name":"mode-rejected-1","text":"上游拒绝指定推理模式时,","textPreview":"上游拒绝指定推理模式时,","textChars":12,"textLines":1,"bbox":[739,412,469,44]}
+{"kind":"textbox","id":"sh/cfmxo3ap","slide":4,"name":"mode-rejected-2","text":"返回明确错误。","textPreview":"返回明确错误。","textChars":7,"textLines":1,"bbox":[739,457,469,44]}
+{"kind":"notes","id":"nt/56blbb","slide":4,"text":"这里把“不降智”解释为本站转发实现中对Astra模型和推理设置的保留。代码及现有测试覆盖pro/max参数在重试与账号切换时保留,并在上游拒绝指定模式时保留错误。引用测试文件属于实现依据,本次未运行线上质量测试;不把转发设置等同于上游每次回答质量保证。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_request_body.go:1022\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_astra_pro_retry_test.go:64\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_responses_astra_pro_failover_test.go:140"}
+{"kind":"slide","id":"sl/jypkz0","slide":5,"title":"5","textShapes":10}
+{"kind":"textbox","id":"sh/o7ut4n61","slide":5,"name":"folio-5","text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/36lcvipg","slide":5,"name":"slide-title","text":"Astra 工作流示例","textPreview":"Astra 工作流示例","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/25cb2dov","slide":5,"name":"sample-task-line-1","text":"为已有项目增加登录能力","textPreview":"为已有项目增加登录能力","textChars":11,"textLines":1,"bbox":[76,229,1128,77]}
+{"kind":"textbox","id":"sh/dwnu1s7i","slide":5,"name":"sample-task-line-2","text":"兼顾权限、异常处理与验证","textPreview":"兼顾权限、异常处理与验证","textChars":12,"textLines":1,"bbox":[76,313,1128,77]}
+{"kind":"textbox","id":"sh/cvet8n6x","slide":5,"name":"context-label","text":"给模型的上下文","textPreview":"给模型的上下文","textChars":7,"textLines":1,"bbox":[78,466,550,45]}
+{"kind":"textbox","id":"sh/bu5czipc","slide":5,"name":"context-body-1","text":"现有代码、技术栈、约束","textPreview":"现有代码、技术栈、约束","textChars":11,"textLines":1,"bbox":[78,523,550,44]}
+{"kind":"textbox","id":"sh/q9cb6xor","slide":5,"name":"context-body-2","text":"与验收要求。","textPreview":"与验收要求。","textChars":6,"textLines":1,"bbox":[78,565,550,44]}
+{"kind":"textbox","id":"sh/t0jap87e","slide":5,"name":"review-label","text":"你要检查的结果","textPreview":"你要检查的结果","textChars":7,"textLines":1,"bbox":[683,466,520,45]}
+{"kind":"textbox","id":"sh/szatw36t","slide":5,"name":"review-body-1","text":"实现方案、代码修改、验证步骤","textPreview":"实现方案、代码修改、验证步骤","textChars":14,"textLines":1,"bbox":[683,523,520,44]}
+{"kind":"textbox","id":"sh/ahwvil8z","slide":5,"name":"review-body-2","text":"与边界说明。","textPreview":"与边界说明。","textChars":6,"textLines":1,"bbox":[683,565,520,44]}
+{"kind":"notes","id":"nt/jypkz0","slide":5,"text":"这一页是面向开发者的任务示例,展示如何组织输入与检查输出,不是Astra实际跑出的回答,也不是性能或正确率测评。讲解时可结合真实项目补充上下文,由用户核验模型给出的方案和代码。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62"}
+{"kind":"slide","id":"sl/75cpbk","slide":6,"title":"6","textShapes":13}
+{"kind":"textbox","id":"sh/mhov2h8z","slide":6,"name":"folio-6","text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/9kzexw7q","slide":6,"name":"slide-title","text":"稳定,来自可恢复的调用","textPreview":"稳定,来自可恢复的调用","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/8jqd4rq5","slide":6,"name":"recovery-condition","text":"请求条件允许时,平台识别可重试故障,并尝试切换合适账号。","textPreview":"请求条件允许时,平台识别可重试故障,并尝试切换合适账号。","textChars":28,"textLines":1,"bbox":[78,173,1128,57]}
+{"kind":"textbox","id":"sh/vmhwz6pg","slide":6,"name":"recovery-number-01","text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[78,299,320,99]}
+{"kind":"textbox","id":"sh/al8v618v","slide":6,"name":"recovery-label-01","text":"识别异常","textPreview":"识别异常","textChars":4,"textLines":1,"bbox":[78,420,330,57]}
+{"kind":"textbox","id":"sh/xoze1g7m","slide":6,"name":"recovery-detail-01","text":"判断请求是否可以重试","textPreview":"判断请求是否可以重试","textChars":10,"textLines":1,"bbox":[78,488,340,49]}
+{"kind":"textbox","id":"sh/wnqd8bq1","slide":6,"name":"recovery-number-02","text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[471,299,320,99]}
+{"kind":"textbox","id":"sh/rqdcn2pc","slide":6,"name":"recovery-label-02","text":"切换账号","textPreview":"切换账号","textChars":4,"textLines":1,"bbox":[471,420,330,57]}
+{"kind":"textbox","id":"sh/qp4vux8r","slide":6,"name":"recovery-detail-02","text":"选择当前可用的账号","textPreview":"选择当前可用的账号","textChars":9,"textLines":1,"bbox":[471,488,340,49]}
+{"kind":"textbox","id":"sh/wr2pk7e5","slide":6,"name":"recovery-number-03","text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[864,299,320,99]}
+{"kind":"textbox","id":"sh/hsv6dcfq","slide":6,"name":"recovery-label-03","text":"保持设置","textPreview":"保持设置","textChars":4,"textLines":1,"bbox":[864,420,330,57]}
+{"kind":"textbox","id":"sh/upknixwf","slide":6,"name":"recovery-detail-03","text":"继续保留 Astra 推理参数","textPreview":"继续保留 Astra 推理参数","textChars":15,"textLines":1,"bbox":[864,488,340,49]}
+{"kind":"textbox","id":"sh/vqtob2x0","slide":6,"name":"recovery-monitor","text":"渠道状态与成功率可查看。","textPreview":"渠道状态与成功率可查看。","textChars":12,"textLines":1,"bbox":[78,602,1040,40]}
+{"kind":"notes","id":"nt/75cpbk","slide":6,"text":"自动重试与切换有明确条件,包括错误允许重试、请求可安全回放、存在合适账号并且未达到上限。页面不承诺零中断或无限重试。渠道监控提供状态及成功率,具体结果受样本、时间窗口和上游状态影响。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_gateway_handler.go:883\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_responses_astra_pro_failover_test.go:140\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/ChannelStatusV2View.vue:196"}
+{"kind":"slide","id":"sl/mb9ur8","slide":7,"title":"7","textShapes":10}
+{"kind":"textbox","id":"sh/n6xofuds","slide":7,"name":"folio-7","text":"7","textPreview":"7","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/9sf6h4vy","slide":7,"name":"slide-title","text":"高速响应,进度看得见","textPreview":"高速响应,进度看得见","textChars":10,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/at8na9cj","slide":7,"name":"stream-label","text":"流式输出","textPreview":"流式输出","textChars":4,"textLines":1,"bbox":[78,244,520,69]}
+{"kind":"textbox","id":"sh/buhojed4","slide":7,"name":"stream-description-1","text":"开启流式请求,","textPreview":"开启流式请求,","textChars":7,"textLines":1,"bbox":[78,331,555,49]}
+{"kind":"textbox","id":"sh/wvqpcju9","slide":7,"name":"stream-description-2","text":"生成内容逐步返回。","textPreview":"生成内容逐步返回。","textChars":9,"textLines":1,"bbox":[78,378,555,49]}
+{"kind":"textbox","id":"sh/xwz6lovu","slide":7,"name":"latency-label","text":"响应可查","textPreview":"响应可查","textChars":4,"textLines":1,"bbox":[685,244,518,69]}
+{"kind":"textbox","id":"sh/qx4ny5cz","slide":7,"name":"latency-description-1","text":"首 Token 与总耗时,","textPreview":"首 Token 与总耗时,","textChars":13,"textLines":1,"bbox":[685,331,518,49]}
+{"kind":"textbox","id":"sh/rydo7adk","slide":7,"name":"latency-description-2","text":"可在用量记录中核对。","textPreview":"可在用量记录中核对。","textChars":10,"textLines":1,"bbox":[685,378,518,49]}
+{"kind":"textbox","id":"sh/by9ofyhc","slide":7,"name":"stream-closing-1","text":"使用过程更直观,","textPreview":"使用过程更直观,","textChars":8,"textLines":1,"bbox":[78,526,550,44]}
+{"kind":"textbox","id":"sh/ax0nmt0r","slide":7,"name":"stream-closing-2","text":"响应表现有记录。","textPreview":"响应表现有记录。","textChars":8,"textLines":1,"bbox":[78,569,550,44]}
+{"kind":"image","id":"im/x8fmlwnu","slide":7,"name":"","alt":"Space image background: speed-light","bbox":[685,448,519,181]}
+{"kind":"notes","id":"nt/mb9ur8","slide":7,"text":"流式输出要求客户端开启stream并且相应上游协议支持。用量记录展示首Token时间和总耗时。本页不引用未经采集的速度数字,不把渠道监控中TPM除以60得到的窗口吞吐量当作单请求生成速度。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_forward.go:1207\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/UsageView.vue:650\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/ChannelStatusV2View.vue:196"}
+{"kind":"slide","id":"sl/p8d4pc","slide":8,"title":"8","textShapes":9}
+{"kind":"textbox","id":"sh/d4n2pcv6","slide":8,"name":"folio-8","text":"8","textPreview":"8","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/q1w3ehwv","slide":8,"name":"slide-title","text":"多模型接入,调用清楚可查","textPreview":"多模型接入,调用清楚可查","textChars":12,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/r25knmdg","slide":8,"name":"models-label","text":"按任务选模型","textPreview":"按任务选模型","textChars":6,"textLines":1,"bbox":[78,275,552,69]}
+{"kind":"textbox","id":"sh/4zulc7ep","slide":8,"name":"models-description-1","text":"通过控制台查看可用模型,","textPreview":"通过控制台查看可用模型,","textChars":12,"textLines":1,"bbox":[78,365,552,49]}
+{"kind":"textbox","id":"sh/p032lcva","slide":8,"name":"models-description-2","text":"选择适合当前任务的配置。","textPreview":"选择适合当前任务的配置。","textChars":12,"textLines":1,"bbox":[78,412,552,49]}
+{"kind":"textbox","id":"sh/2dc3axwj","slide":8,"name":"usage-label","text":"按记录看消耗","textPreview":"按记录看消耗","textChars":6,"textLines":1,"bbox":[684,275,520,69]}
+{"kind":"textbox","id":"sh/3ylkj2x4","slide":8,"name":"usage-description-1","text":"模型、Token 和实际扣费,","textPreview":"模型、Token 和实际扣费,","textChars":15,"textLines":1,"bbox":[684,365,520,49]}
+{"kind":"textbox","id":"sh/gbu18net","slide":8,"name":"usage-description-2","text":"每笔调用都可核对。","textPreview":"每笔调用都可核对。","textChars":9,"textLines":1,"bbox":[684,412,520,49]}
+{"kind":"textbox","id":"sh/hc32hsfe","slide":8,"name":"key-control","text":"API Key 的额度、有效期与访问权限可分别设置。","textPreview":"API Key 的额度、有效期与访问权限可分别设置。","textChars":26,"textLines":1,"bbox":[78,579,1128,54]}
+{"kind":"notes","id":"nt/p8d4pc","slide":8,"text":"聚合平台统一提供模型列表、密钥管理与调用记录。用量记录包括输入输出及缓存Token和实际费用。可用模型按账号分组与权限确定,费用以实际配置和用量记录为准。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/UsageView.vue:650\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/KeysView.vue:205"}
+{"kind":"slide","id":"sl/q7z4nh","slide":9,"title":"9","textShapes":12}
+{"kind":"textbox","id":"sh/25w3e5o3","slide":9,"name":"folio-9","text":"9","textPreview":"9","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/p8n2p0nu","slide":9,"name":"slide-title","text":"接入你正在用的工具","textPreview":"接入你正在用的工具","textChars":9,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/o7elgf69","slide":9,"name":"compatibility","text":"支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。","textPreview":"支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。","textChars":30,"textLines":1,"bbox":[78,173,1128,57]}
+{"kind":"textbox","id":"sh/f25kjq5s","slide":9,"name":"onboard-number-01","text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[78,288,140,75]}
+{"kind":"textbox","id":"sh/e1w3alo7","slide":9,"name":"onboard-label-01","text":"填写接入地址","textPreview":"填写接入地址","textChars":6,"textLines":1,"bbox":[233,294,450,62]}
+{"kind":"textbox","id":"sh/14n2l0ni","slide":9,"name":"onboard-detail-01","text":"复制控制台提供的 Base URL","textPreview":"复制控制台提供的 Base URL","textChars":17,"textLines":1,"bbox":[704,297,500,54]}
+{"kind":"textbox","id":"sh/03elcv6x","slide":9,"name":"onboard-number-02","text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[78,407,140,75]}
+{"kind":"textbox","id":"sh/relkfq5g","slide":9,"name":"onboard-label-02","text":"配置 API Key","textPreview":"配置 API Key","textChars":10,"textLines":1,"bbox":[233,413,450,62]}
+{"kind":"textbox","id":"sh/qdcj6lov","slide":9,"name":"onboard-detail-02","text":"创建密钥,并选择所需的分组与额度","textPreview":"创建密钥,并选择所需的分组与额度","textChars":16,"textLines":1,"bbox":[704,416,500,54]}
+{"kind":"textbox","id":"sh/ozapobil","slide":9,"name":"onboard-number-03","text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[78,526,140,75]}
+{"kind":"textbox","id":"sh/p0j6hgj6","slide":9,"name":"onboard-label-03","text":"选择 Astra","textPreview":"选择 Astra","textChars":8,"textLines":1,"bbox":[233,532,450,62]}
+{"kind":"textbox","id":"sh/2x8nm10f","slide":9,"name":"onboard-detail-03","text":"按控制台模型名称配置,开始调用","textPreview":"按控制台模型名称配置,开始调用","textChars":15,"textLines":1,"bbox":[704,535,500,54]}
+{"kind":"notes","id":"nt/q7z4nh","slide":9,"text":"项目提供客户端配置辅助。适用于支持自定义Base URL的客户端和SDK。实际地址、密钥和模型标识从控制台复制,密钥权限需要覆盖所选模型分组。这里不公开任何用户密钥,也不填入未确认的站点域名。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:941\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:1328\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/KeysView.vue:205"}
+{"kind":"slide","id":"sl/xctwjk","slide":10,"title":"聚合AI","textShapes":4}
+{"kind":"textbox","id":"sh/03ihcr6h","slide":10,"name":"closing-brand","text":"聚合AI","textPreview":"聚合AI","textChars":4,"textLines":1,"bbox":[76,164,650,116]}
+{"kind":"textbox","id":"sh/14rilwn2","slide":10,"name":"closing-positioning","text":"Astra 主推,多模型聚合","textPreview":"Astra 主推,多模型聚合","textChars":14,"textLines":1,"bbox":[80,302,910,74]}
+{"kind":"textbox","id":"sh/m50ze14n","slide":10,"name":"closing-promise","text":"不降智,稳定,高速","textPreview":"不降智,稳定,高速","textChars":9,"textLines":1,"bbox":[80,430,850,60]}
+{"kind":"textbox","id":"sh/n6t0nm5s","slide":10,"name":"closing-cta","text":"创建 API Key,连接你的常用工具。","textPreview":"创建 API Key,连接你的常用工具。","textChars":20,"textLines":1,"bbox":[80,584,1060,51]}
+{"kind":"image","id":"im/ydwvu9kj","slide":10,"name":"","alt":"Space image background: cover-halo","bbox":[610,76,670,559]}
+{"kind":"notes","id":"nt/xctwjk","slide":10,"text":"总结聚合AI的定位:Astra为主推模型,多模型聚合作为平台价值。用户可以在控制台创建API Key,并按对应协议接入常用工具。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:941"}

BIN
.codex-artifacts/juheai-astra-20260915/candidate-交付版.pptx


+ 114 - 0
.codex-artifacts/juheai-astra-20260915/candidate-交付版.pptx.inspect.ndjson

@@ -0,0 +1,114 @@
+{"kind":"deck","id":"pr/sow4u9","name":"Deck"}
+{"kind":"layout","layoutId":"801575cb-0f83-492a-b2b9-62cb5bfb87de","name":"Master","type":"master"}
+{"kind":"layout","layoutId":"74dbe088-7a8a-4d5a-9efb-5eff00efb63e","name":"Title Slide","type":"title"}
+{"kind":"slide","id":"sl/36qzx4","slide":1,"title":"聚合AI","textShapes":4}
+{"kind":"textbox","id":"sh/365kbuls","slide":1,"name":"brand","text":"聚合AI","textPreview":"聚合AI","textChars":4,"textLines":1,"bbox":[76,164,650,120]}
+{"kind":"textbox","id":"sh/25w32pk7","slide":1,"name":"featured-model","text":"Astra 主推模型","textPreview":"Astra 主推模型","textChars":10,"textLines":1,"bbox":[80,306,540,80]}
+{"kind":"textbox","id":"sh/dw7mh43u","slide":1,"name":"brand-promise","text":"不降智,稳定,高速","textPreview":"不降智,稳定,高速","textChars":9,"textLines":1,"bbox":[80,440,550,55]}
+{"kind":"textbox","id":"sh/cvel8j29","slide":1,"name":"platform-value","text":"多模型选择,统一接入","textPreview":"多模型选择,统一接入","textChars":10,"textLines":1,"bbox":[80,596,540,44]}
+{"kind":"image","id":"im/hsn6h87i","slide":1,"name":"","alt":"A Splendor Seldom Seen","bbox":[575,58,705,590]}
+{"kind":"notes","id":"nt/36qzx4","slide":1,"text":"聚合AI是平台品牌,Astra是本次重点介绍的模型。平台聚合多种模型接入方式,让用户在熟悉的工具中完成调用。品牌名称和“不降智,稳定,高速”的定位来自用户。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:196\n\nVisual source: A Splendor Seldom Seen. NASA/JPL-Caltech/Space Science Institute https://images.nasa.gov/details/PIA14934 https://images-assets.nasa.gov/image/PIA14934/PIA14934~orig.jpg"}
+{"kind":"slide","id":"sl/3ajvso","slide":2,"title":"多模型,一个入口","textShapes":10}
+{"kind":"textbox","id":"sh/07up8va9","slide":2,"name":"slide-title","text":"多模型,一个入口","textPreview":"多模型,一个入口","textChars":8,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/z6lofq9o","slide":2,"name":"platform-explanation","text":"模型接入、API Key、调用记录与费用管理,集中在聚合AI。","textPreview":"模型接入、API Key、调用记录与费用管理,集中在聚合AI。","textChars":31,"textLines":1,"bbox":[78,174,1120,56]}
+{"kind":"textbox","id":"sh/y5c76ls3","slide":2,"name":"featured-model-label","text":"本站主推","textPreview":"本站主推","textChars":4,"textLines":1,"bbox":[80,316,480,42]}
+{"kind":"textbox","id":"sh/d436dgri","slide":2,"name":"astra-word","text":"Astra","textPreview":"Astra","textChars":5,"textLines":1,"bbox":[76,354,510,112]}
+{"kind":"textbox","id":"sh/cjup4vax","slide":2,"name":"protocol-label","text":"支持多种接入协议","textPreview":"支持多种接入协议","textChars":8,"textLines":1,"bbox":[682,282,510,43]}
+{"kind":"textbox","id":"sh/bilobq9s","slide":2,"name":"protocol-openai","text":"OpenAI 兼容","textPreview":"OpenAI 兼容","textChars":9,"textLines":1,"bbox":[682,342,510,53]}
+{"kind":"textbox","id":"sh/qhc72ls7","slide":2,"name":"protocol-anthropic","text":"Anthropic Messages","textPreview":"Anthropic Messages","textChars":18,"textLines":1,"bbox":[682,412,510,53]}
+{"kind":"textbox","id":"sh/pg369grm","slide":2,"name":"protocol-gemini","text":"Gemini 原生","textPreview":"Gemini 原生","textChars":9,"textLines":1,"bbox":[682,482,510,53]}
+{"kind":"textbox","id":"sh/ofap0ba1","slide":2,"name":"platform-takeaway","text":"按任务选择模型,沿用熟悉的工具。","textPreview":"按任务选择模型,沿用熟悉的工具。","textChars":16,"textLines":1,"bbox":[80,595,1070,46]}
+{"kind":"textbox","id":"sh/alonup43","slide":2,"name":"folio-2","text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/3ajvso","slide":2,"text":"聚合AI提供多种协议路由,统一管理密钥和用量。OpenAI兼容包括Responses和Chat Completions,另有Anthropic Messages与Gemini原生路由。可用模型以账号分组、权限和控制台列表为准。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:196\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:339"}
+{"kind":"slide","id":"sl/byhaz7","slide":3,"title":"聚合AI 主推模型","textShapes":8}
+{"kind":"textbox","id":"sh/l0vmhg7m","slide":3,"name":"model-section-label","text":"聚合AI 主推模型","textPreview":"聚合AI 主推模型","textChars":9,"textLines":1,"bbox":[80,88,730,50]}
+{"kind":"textbox","id":"sh/yd43618v","slide":3,"name":"astra-hero","text":"ASTRA","textPreview":"ASTRA","textChars":5,"textLines":1,"bbox":[72,178,1128,181]}
+{"kind":"textbox","id":"sh/jed4f6pg","slide":3,"name":"astra-positioning","text":"把 Astra 接入你的工作流","textPreview":"把 Astra 接入你的工作流","textChars":15,"textLines":1,"bbox":[80,367,740,66]}
+{"kind":"textbox","id":"sh/8365cbqd","slide":3,"name":"astra-settings","text":"按所选模型与推理设置发起调用。","textPreview":"按所选模型与推理设置发起调用。","textChars":15,"textLines":1,"bbox":[80,445,760,55]}
+{"kind":"textbox","id":"sh/t4fmlg7i","slide":3,"name":"task-coding","text":"编码协作","textPreview":"编码协作","textChars":4,"textLines":1,"bbox":[80,586,218,44]}
+{"kind":"textbox","id":"sh/614na187","slide":3,"name":"task-analysis","text":"复杂分析","textPreview":"复杂分析","textChars":4,"textLines":1,"bbox":[303,586,218,44]}
+{"kind":"textbox","id":"sh/72d4j6ps","slide":3,"name":"task-agent","text":"Agent 任务","textPreview":"Agent 任务","textChars":8,"textLines":1,"bbox":[526,586,300,44]}
+{"kind":"textbox","id":"sh/o72l0rqt","slide":3,"name":"folio-3","text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/byhaz7","slide":3,"text":"Astra是用户指定的主推模型。项目客户端配置包含Astra模型标识,转发代码保留相应推理参数。编码协作、复杂分析与Agent任务是本页给出的使用方向,不构成与其他模型的能力排名或测试结论。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:1328\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_request_body.go:1022"}
+{"kind":"slide","id":"sl/0qtl3g","slide":4,"title":"不降智,保留 Astra 推理设置","textShapes":8}
+{"kind":"textbox","id":"sh/9ozepwz6","slide":4,"name":"slide-title","text":"不降智,保留 Astra 推理设置","textPreview":"不降智,保留 Astra 推理设置","textChars":17,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/ml8vehgf","slide":4,"name":"preserve-model","text":"Astra 按设定调用","textPreview":"Astra 按设定调用","textChars":11,"textLines":1,"bbox":[76,256,630,95]}
+{"kind":"textbox","id":"sh/nmhwnmh0","slide":4,"name":"preserve-reasoning","text":"保留推理设置","textPreview":"保留推理设置","textChars":6,"textLines":1,"bbox":[76,366,630,95]}
+{"kind":"textbox","id":"sh/wraxkryh","slide":4,"name":"settings-body-1","text":"Astra 请求重试或故障切换时,","textPreview":"Astra 请求重试或故障切换时,","textChars":17,"textLines":1,"bbox":[739,263,469,44]}
+{"kind":"textbox","id":"sh/xsjetwz2","slide":4,"name":"settings-body-2","text":"继续保留指定推理设置。","textPreview":"继续保留指定推理设置。","textChars":11,"textLines":1,"bbox":[739,308,469,44]}
+{"kind":"textbox","id":"sh/ap8fi1gr","slide":4,"name":"mode-rejected-1","text":"推理设置不受支持时,","textPreview":"推理设置不受支持时,","textChars":10,"textLines":1,"bbox":[739,412,469,44]}
+{"kind":"textbox","id":"sh/vq1wr6hw","slide":4,"name":"mode-rejected-2","text":"明确提示原因。","textPreview":"明确提示原因。","textChars":7,"textLines":1,"bbox":[739,457,469,44]}
+{"kind":"textbox","id":"sh/kfaxobyt","slide":4,"name":"folio-4","text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/0qtl3g","slide":4,"text":"这里把“不降智”具体解释为Astra指定推理参数的保留。代码及现有测试覆盖pro/max参数在重试与账号切换时保留,并在上游拒绝指定模式时保留错误。测试也覆盖特定重试和故障切换路径中Astra模型标识不变;项目允许显式模型映射,不将这项测试泛化为所有配置下模型标识永不改变。引用测试文件属于实现依据,本次未运行线上质量测试;不把转发设置等同于上游每次回答质量保证。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_request_body.go:1022\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_astra_pro_retry_test.go:64\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_responses_astra_pro_failover_test.go:140"}
+{"kind":"slide","id":"sl/2ngacd","slide":5,"title":"Astra 工作流示例","textShapes":10}
+{"kind":"textbox","id":"sh/nq9oz2xc","slide":5,"name":"slide-title","text":"Astra 工作流示例","textPreview":"Astra 工作流示例","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/orips7ex","slide":5,"name":"sample-task-line-1","text":"为已有项目增加登录能力","textPreview":"为已有项目增加登录能力","textChars":11,"textLines":1,"bbox":[76,229,1128,77]}
+{"kind":"textbox","id":"sh/psr61cfi","slide":5,"name":"sample-task-line-2","text":"兼顾权限、异常处理与验证","textPreview":"兼顾权限、异常处理与验证","textChars":12,"textLines":1,"bbox":[76,313,1128,77]}
+{"kind":"textbox","id":"sh/elg72xwv","slide":5,"name":"context-label","text":"给模型的上下文","textPreview":"给模型的上下文","textChars":7,"textLines":1,"bbox":[78,466,550,45]}
+{"kind":"textbox","id":"sh/fmpov2xg","slide":5,"name":"context-body-1","text":"现有代码、技术栈、约束","textPreview":"现有代码、技术栈、约束","textChars":11,"textLines":1,"bbox":[78,523,550,44]}
+{"kind":"textbox","id":"sh/0nyp47e1","slide":5,"name":"context-body-2","text":"与验收要求。","textPreview":"与验收要求。","textChars":6,"textLines":1,"bbox":[78,565,550,44]}
+{"kind":"textbox","id":"sh/1o76xcf6","slide":5,"name":"review-label","text":"你要检查的结果","textPreview":"你要检查的结果","textChars":7,"textLines":1,"bbox":[683,466,520,45]}
+{"kind":"textbox","id":"sh/yh07y1wz","slide":5,"name":"review-body-1","text":"实现方案、代码修改、验证步骤","textPreview":"实现方案、代码修改、验证步骤","textChars":14,"textLines":1,"bbox":[683,523,520,44]}
+{"kind":"textbox","id":"sh/zit87mxk","slide":5,"name":"review-body-2","text":"与边界说明。","textPreview":"与边界说明。","textChars":6,"textLines":1,"bbox":[683,565,520,44]}
+{"kind":"textbox","id":"sh/jm14jelo","slide":5,"name":"folio-5","text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/2ngacd","slide":5,"text":"这一页是面向开发者的任务示例,展示如何组织输入与检查输出,不是Astra实际跑出的回答,也不是性能或正确率测评。讲解时可结合真实项目补充上下文,由用户核验模型给出的方案和代码。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62"}
+{"kind":"slide","id":"sl/da8b9e","slide":6,"title":"稳定调用,异常自动处理","textShapes":13}
+{"kind":"textbox","id":"sh/ni18zitk","slide":6,"name":"slide-title","text":"稳定调用,异常自动处理","textPreview":"稳定调用,异常自动处理","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/ojup8nap","slide":6,"name":"recovery-condition","text":"请求条件允许时,平台识别可重试故障,并尝试切换合适账号。","textPreview":"请求条件允许时,平台识别可重试故障,并尝试切换合适账号。","textChars":28,"textLines":1,"bbox":[78,173,1128,57]}
+{"kind":"textbox","id":"sh/pk3q1sba","slide":6,"name":"recovery-number-01","text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[78,299,320,99]}
+{"kind":"textbox","id":"sh/ets72dsn","slide":6,"name":"recovery-label-01","text":"识别异常","textPreview":"识别异常","textChars":4,"textLines":1,"bbox":[78,420,330,57]}
+{"kind":"textbox","id":"sh/fu18vit8","slide":6,"name":"recovery-detail-01","text":"判断请求是否可以重试","textPreview":"判断请求是否可以重试","textChars":10,"textLines":1,"bbox":[78,488,340,49]}
+{"kind":"textbox","id":"sh/gvap43at","slide":6,"name":"recovery-number-02","text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[471,299,320,99]}
+{"kind":"textbox","id":"sh/1gjqx8be","slide":6,"name":"recovery-label-02","text":"切换账号","textPreview":"切换账号","textChars":4,"textLines":1,"bbox":[471,420,330,57]}
+{"kind":"textbox","id":"sh/ypc7exs7","slide":6,"name":"recovery-detail-02","text":"选择当前可用的账号","textPreview":"选择当前可用的账号","textChars":9,"textLines":1,"bbox":[471,488,340,49]}
+{"kind":"textbox","id":"sh/zq58729c","slide":6,"name":"recovery-number-03","text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[864,299,320,99]}
+{"kind":"textbox","id":"sh/rqtkj2l0","slide":6,"name":"recovery-label-03","text":"保持设置","textPreview":"保持设置","textChars":4,"textLines":1,"bbox":[864,420,330,57]}
+{"kind":"textbox","id":"sh/6p03qxkf","slide":6,"name":"recovery-detail-03","text":"继续保留 Astra 推理参数","textPreview":"继续保留 Astra 推理参数","textChars":15,"textLines":1,"bbox":[864,488,340,49]}
+{"kind":"textbox","id":"sh/tcbmlc36","slide":6,"name":"recovery-monitor","text":"渠道状态与成功率可查看。","textPreview":"渠道状态与成功率可查看。","textChars":12,"textLines":1,"bbox":[78,602,1040,40]}
+{"kind":"textbox","id":"sh/sr2ls72l","slide":6,"name":"folio-6","text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/da8b9e","slide":6,"text":"自动重试与切换有明确条件,包括错误允许重试、请求可安全回放、存在合适账号并且未达到上限。页面不承诺零中断或无限重试。渠道监控提供状态及成功率,具体结果受样本、时间窗口和上游状态影响。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_gateway_handler.go:883\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_responses_astra_pro_failover_test.go:140\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/ChannelStatusV2View.vue:196"}
+{"kind":"slide","id":"sl/6bxptb","slide":7,"title":"高速响应,进度看得见","textShapes":10}
+{"kind":"textbox","id":"sh/7edojy9g","slide":7,"name":"slide-title","text":"高速响应,进度看得见","textPreview":"高速响应,进度看得见","textChars":10,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/md4nat8v","slide":7,"name":"stream-label","text":"流式输出","textPreview":"流式输出","textChars":4,"textLines":1,"bbox":[78,244,520,69]}
+{"kind":"textbox","id":"sh/lcv6hora","slide":7,"name":"stream-description-1","text":"开启流式请求,","textPreview":"开启流式请求,","textChars":7,"textLines":1,"bbox":[78,331,555,49]}
+{"kind":"textbox","id":"sh/krm58jqp","slide":7,"name":"stream-description-2","text":"生成内容逐步返回。","textPreview":"生成内容逐步返回。","textChars":9,"textLines":1,"bbox":[78,378,555,49]}
+{"kind":"textbox","id":"sh/zqt4fe94","slide":7,"name":"latency-label","text":"响应可查","textPreview":"响应可查","textChars":4,"textLines":1,"bbox":[685,244,518,69]}
+{"kind":"textbox","id":"sh/ypkn698j","slide":7,"name":"latency-description-1","text":"首 Token 与总耗时,","textPreview":"首 Token 与总耗时,","textChars":13,"textLines":1,"bbox":[685,331,518,49]}
+{"kind":"textbox","id":"sh/xobmd4re","slide":7,"name":"latency-description-2","text":"可在用量记录中核对。","textPreview":"可在用量记录中核对。","textChars":10,"textLines":1,"bbox":[685,378,518,49]}
+{"kind":"textbox","id":"sh/cn254jqt","slide":7,"name":"stream-closing-1","text":"使用过程更直观,","textPreview":"使用过程更直观,","textChars":8,"textLines":1,"bbox":[78,526,550,44]}
+{"kind":"textbox","id":"sh/itczq5sj","slide":7,"name":"stream-closing-2","text":"响应表现有记录。","textPreview":"响应表现有记录。","textChars":8,"textLines":1,"bbox":[78,569,550,44]}
+{"kind":"textbox","id":"sh/3ul0jato","slide":7,"name":"folio-7","text":"7","textPreview":"7","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"image","id":"im/dkf2l03e","slide":7,"name":"","alt":"ISS-30 Star trail composite","bbox":[685,448,519,181]}
+{"kind":"notes","id":"nt/6bxptb","slide":7,"text":"流式输出要求客户端开启stream并且相应上游协议支持。用量记录展示首Token时间和总耗时。本页不引用未经采集的速度数字,不把渠道监控中TPM除以60得到的窗口吞吐量当作单请求生成速度。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_forward.go:1207\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/UsageView.vue:650\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/ChannelStatusV2View.vue:196\n\nVisual source: ISS-30 Star trail composite. NASA / Don Pettit https://images.nasa.gov/details/jsc2012e039800_alt https://images-assets.nasa.gov/image/jsc2012e039800_alt/jsc2012e039800_alt~orig.jpg"}
+{"kind":"slide","id":"sl/se3ube","slide":8,"title":"多模型接入,调用清楚可查","textShapes":9}
+{"kind":"textbox","id":"sh/9kzalc7q","slide":8,"name":"slide-title","text":"多模型接入,调用清楚可查","textPreview":"多模型接入,调用清楚可查","textChars":12,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/2horax8f","slide":8,"name":"models-label","text":"按任务选模型","textPreview":"按任务选模型","textChars":6,"textLines":1,"bbox":[78,275,552,69]}
+{"kind":"textbox","id":"sh/nihsj2pk","slide":8,"name":"models-description-1","text":"通过控制台查看可用模型,","textPreview":"通过控制台查看可用模型,","textChars":12,"textLines":1,"bbox":[78,365,552,49]}
+{"kind":"textbox","id":"sh/0f6987q9","slide":8,"name":"models-description-2","text":"选择适合当前任务的配置。","textPreview":"选择适合当前任务的配置。","textChars":12,"textLines":1,"bbox":[78,412,552,49]}
+{"kind":"textbox","id":"sh/1gfahc7u","slide":8,"name":"usage-label","text":"按记录看消耗","textPreview":"按记录看消耗","textChars":6,"textLines":1,"bbox":[684,275,520,69]}
+{"kind":"textbox","id":"sh/edor6x83","slide":8,"name":"usage-description-1","text":"模型、Token 和实际扣费,","textPreview":"模型、Token 和实际扣费,","textChars":15,"textLines":1,"bbox":[684,365,520,49]}
+{"kind":"textbox","id":"sh/fexsf2po","slide":8,"name":"usage-description-2","text":"每笔调用都可核对。","textPreview":"每笔调用都可核对。","textChars":9,"textLines":1,"bbox":[684,412,520,49]}
+{"kind":"textbox","id":"sh/kbatkrqd","slide":8,"name":"key-control","text":"API Key 的额度、有效期与访问权限可分别设置。","textPreview":"API Key 的额度、有效期与访问权限可分别设置。","textChars":26,"textLines":1,"bbox":[78,579,1128,54]}
+{"kind":"textbox","id":"sh/lcjatw7y","slide":8,"name":"folio-8","text":"8","textPreview":"8","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/se3ube","slide":8,"text":"聚合平台统一提供模型列表、密钥管理与调用记录。用量记录包括输入输出及缓存Token和实际费用。可用模型按账号分组与权限确定,费用以实际配置和用量记录为准。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/UsageView.vue:650\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/KeysView.vue:205"}
+{"kind":"slide","id":"sl/r0rj7p","slide":9,"title":"接入你正在用的工具","textShapes":12}
+{"kind":"textbox","id":"sh/1wr2l03m","slide":9,"name":"slide-title","text":"接入你正在用的工具","textPreview":"接入你正在用的工具","textChars":9,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/e90jalkv","slide":9,"name":"compatibility","text":"支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。","textPreview":"支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。","textChars":30,"textLines":1,"bbox":[78,173,1128,57]}
+{"kind":"textbox","id":"sh/fa9kjqlg","slide":9,"name":"onboard-number-01","text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[78,288,140,75]}
+{"kind":"textbox","id":"sh/s7y18b25","slide":9,"name":"onboard-label-01","text":"填写接入地址","textPreview":"填写接入地址","textChars":6,"textLines":1,"bbox":[233,294,450,62]}
+{"kind":"textbox","id":"sh/t8r2hg3q","slide":9,"name":"onboard-detail-01","text":"复制控制台提供的 Base URL","textPreview":"复制控制台提供的 Base URL","textChars":17,"textLines":1,"bbox":[704,297,500,54]}
+{"kind":"textbox","id":"sh/65gj6lkz","slide":9,"name":"onboard-number-02","text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[78,407,140,75]}
+{"kind":"textbox","id":"sh/r6pkf6lk","slide":9,"name":"onboard-label-02","text":"配置 API Key","textPreview":"配置 API Key","textChars":10,"textLines":1,"bbox":[233,413,450,62]}
+{"kind":"textbox","id":"sh/k3y14b2t","slide":9,"name":"onboard-detail-02","text":"创建密钥,并选择所需的分组与额度","textPreview":"创建密钥,并选择所需的分组与额度","textChars":16,"textLines":1,"bbox":[704,416,500,54]}
+{"kind":"textbox","id":"sh/5472dg3e","slide":9,"name":"onboard-number-03","text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[78,526,140,75]}
+{"kind":"textbox","id":"sh/5szmdgjy","slide":9,"name":"onboard-label-03","text":"选择 Astra","textPreview":"选择 Astra","textChars":8,"textLines":1,"bbox":[233,532,450,62]}
+{"kind":"textbox","id":"sh/47qlkb2d","slide":9,"name":"onboard-detail-03","text":"按控制台模型名称配置,开始调用","textPreview":"按控制台模型名称配置,开始调用","textChars":15,"textLines":1,"bbox":[704,535,500,54]}
+{"kind":"textbox","id":"sh/j6h4b618","slide":9,"name":"folio-9","text":"9","textPreview":"9","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"notes","id":"nt/r0rj7p","slide":9,"text":"项目提供客户端配置辅助。适用于支持自定义Base URL的客户端和SDK。实际地址、密钥和模型标识从控制台复制,密钥权限需要覆盖所选模型分组。这里不公开任何用户密钥,也不填入未确认的站点域名。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:941\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:1328\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/KeysView.vue:205"}
+{"kind":"slide","id":"sl/pukp5p","slide":10,"title":"聚合AI","textShapes":4}
+{"kind":"textbox","id":"sh/q5o3m50z","slide":10,"name":"closing-brand","text":"聚合AI","textPreview":"聚合AI","textChars":4,"textLines":1,"bbox":[76,164,650,116]}
+{"kind":"textbox","id":"sh/r6x4va1k","slide":10,"name":"closing-positioning","text":"Astra 主推,多模型聚合","textPreview":"Astra 主推,多模型聚合","textChars":14,"textLines":1,"bbox":[80,302,910,74]}
+{"kind":"textbox","id":"sh/436lkvi9","slide":10,"name":"closing-promise","text":"不降智,稳定,高速","textPreview":"不降智,稳定,高速","textChars":9,"textLines":1,"bbox":[80,430,850,60]}
+{"kind":"textbox","id":"sh/p4fmt0ju","slide":10,"name":"closing-cta","text":"创建 API Key,连接你的常用工具。","textPreview":"创建 API Key,连接你的常用工具。","textChars":20,"textLines":1,"bbox":[80,584,1060,51]}
+{"kind":"image","id":"im/cr2x4r6x","slide":10,"name":"","alt":"A Splendor Seldom Seen","bbox":[610,76,670,559]}
+{"kind":"notes","id":"nt/pukp5p","slide":10,"text":"总结聚合AI的定位:Astra为主推模型,多模型聚合作为平台价值。用户可以在控制台创建API Key,并按对应协议接入常用工具。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:941\n\nVisual source: A Splendor Seldom Seen. NASA/JPL-Caltech/Space Science Institute https://images.nasa.gov/details/PIA14934 https://images-assets.nasa.gov/image/PIA14934/PIA14934~orig.jpg"}

BIN
.codex-artifacts/juheai-astra-20260915/candidate-初稿.pptx


+ 114 - 0
.codex-artifacts/juheai-astra-20260915/candidate-初稿.pptx.inspect.ndjson

@@ -0,0 +1,114 @@
+{"kind":"deck","id":"pr/ljk25z","name":"Deck"}
+{"kind":"layout","layoutId":"8a3f9ec9-08b6-4108-b0a0-8bd9609d589a","name":"Master","type":"master"}
+{"kind":"layout","layoutId":"f936f511-c063-4e10-8807-bf505ef20285","name":"Title Slide","type":"title"}
+{"kind":"slide","id":"sl/hor7gm","slide":1,"title":"聚合AI","textShapes":4}
+{"kind":"textbox","id":"sh/vu1gjixw","slide":1,"name":"brand","text":"聚合AI","textPreview":"聚合AI","textChars":4,"textLines":1,"bbox":[76,164,650,120]}
+{"kind":"textbox","id":"sh/at8fqxgb","slide":1,"name":"featured-model","text":"Astra 主推模型","textPreview":"Astra 主推模型","textChars":10,"textLines":1,"bbox":[80,306,540,80]}
+{"kind":"textbox","id":"sh/9szyhsfq","slide":1,"name":"brand-promise","text":"不降智,稳定,高速","textPreview":"不降智,稳定,高速","textChars":9,"textLines":1,"bbox":[80,440,550,55]}
+{"kind":"textbox","id":"sh/8rqxony5","slide":1,"name":"platform-value","text":"多模型选择,统一接入","textPreview":"多模型选择,统一接入","textChars":10,"textLines":1,"bbox":[80,596,540,44]}
+{"kind":"image","id":"im/p0j258r2","slide":1,"name":"","alt":"A Splendor Seldom Seen","bbox":[575,58,705,590]}
+{"kind":"notes","id":"nt/hor7gm","slide":1,"text":"聚合AI是平台品牌,Astra是本次重点介绍的模型。平台聚合多种模型接入方式,让用户在熟悉的工具中完成调用。品牌名称和“不降智,稳定,高速”的定位来自用户。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:196\n\nVisual source: A Splendor Seldom Seen. NASA/JPL-Caltech/Space Science Institute https://images.nasa.gov/details/PIA14934 https://images-assets.nasa.gov/image/PIA14934/PIA14934~orig.jpg"}
+{"kind":"slide","id":"sl/7sri24","slide":2,"title":"2","textShapes":10}
+{"kind":"textbox","id":"sh/pc7u1o7i","slide":2,"name":"folio-2","text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/2pgvq987","slide":2,"name":"slide-title","text":"多模型,一个入口","textPreview":"多模型,一个入口","textChars":8,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/3apczepc","slide":2,"name":"platform-explanation","text":"模型接入、API Key、调用记录与费用管理,集中在聚合AI。","textPreview":"模型接入、API Key、调用记录与费用管理,集中在聚合AI。","textChars":31,"textLines":1,"bbox":[78,174,1120,56]}
+{"kind":"textbox","id":"sh/cfidw3q9","slide":2,"name":"featured-model-label","text":"本站主推","textPreview":"本站主推","textChars":4,"textLines":1,"bbox":[80,316,480,42]}
+{"kind":"textbox","id":"sh/dgru587u","slide":2,"name":"astra-word","text":"Astra","textPreview":"Astra","textChars":5,"textLines":1,"bbox":[76,354,510,112]}
+{"kind":"textbox","id":"sh/qdgvut83","slide":2,"name":"protocol-label","text":"支持多种接入协议","textPreview":"支持多种接入协议","textChars":8,"textLines":1,"bbox":[682,282,510,43]}
+{"kind":"textbox","id":"sh/bepc3ypo","slide":2,"name":"protocol-openai","text":"OpenAI 兼容","textPreview":"OpenAI 兼容","textChars":9,"textLines":1,"bbox":[682,342,510,53]}
+{"kind":"textbox","id":"sh/sjetkzqp","slide":2,"name":"protocol-anthropic","text":"Anthropic Messages","textPreview":"Anthropic Messages","textChars":18,"textLines":1,"bbox":[682,412,510,53]}
+{"kind":"textbox","id":"sh/tknut47a","slide":2,"name":"protocol-gemini","text":"Gemini 原生","textPreview":"Gemini 原生","textChars":9,"textLines":1,"bbox":[682,482,510,53]}
+{"kind":"textbox","id":"sh/1on29wve","slide":2,"name":"platform-takeaway","text":"按任务选择模型,沿用熟悉的工具。","textPreview":"按任务选择模型,沿用熟悉的工具。","textChars":16,"textLines":1,"bbox":[80,595,1070,46]}
+{"kind":"notes","id":"nt/7sri24","slide":2,"text":"聚合AI提供多种协议路由,统一管理密钥和用量。OpenAI兼容包括Responses和Chat Completions,另有Anthropic Messages与Gemini原生路由。可用模型以账号分组、权限和控制台列表为准。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:196\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/gateway.go:339"}
+{"kind":"slide","id":"sl/r32n9z","slide":3,"title":"3","textShapes":8}
+{"kind":"textbox","id":"sh/etsvydcv","slide":3,"name":"folio-3","text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/1gje9sv6","slide":3,"name":"model-section-label","text":"聚合AI 主推模型","textPreview":"聚合AI 主推模型","textChars":9,"textLines":1,"bbox":[80,88,730,50]}
+{"kind":"textbox","id":"sh/gfad0nul","slide":3,"name":"astra-hero","text":"ASTRA","textPreview":"ASTRA","textChars":5,"textLines":1,"bbox":[72,178,1128,181]}
+{"kind":"textbox","id":"sh/rqhc3id4","slide":3,"name":"astra-positioning","text":"把 Astra 接入你的工作流","textPreview":"把 Astra 接入你的工作流","textChars":15,"textLines":1,"bbox":[80,367,740,66]}
+{"kind":"textbox","id":"sh/6p8vudcj","slide":3,"name":"astra-settings","text":"按所选模型与推理设置发起调用。","textPreview":"按所选模型与推理设置发起调用。","textChars":15,"textLines":1,"bbox":[80,445,760,55]}
+{"kind":"textbox","id":"sh/tszu58va","slide":3,"name":"task-coding","text":"编码协作","textPreview":"编码协作","textChars":4,"textLines":1,"bbox":[80,586,218,44]}
+{"kind":"textbox","id":"sh/srqdwnup","slide":3,"name":"task-analysis","text":"复杂分析","textPreview":"复杂分析","textChars":4,"textLines":1,"bbox":[303,586,218,44]}
+{"kind":"textbox","id":"sh/jmhczyd8","slide":3,"name":"task-agent","text":"Agent 任务","textPreview":"Agent 任务","textChars":8,"textLines":1,"bbox":[526,586,300,44]}
+{"kind":"notes","id":"nt/r32n9z","slide":3,"text":"Astra是用户指定的主推模型。项目客户端配置包含Astra模型标识,转发代码保留相应推理参数。编码协作、复杂分析与Agent任务是本页给出的使用方向,不构成与其他模型的能力排名或测试结论。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:1328\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_request_body.go:1022"}
+{"kind":"slide","id":"sl/c5ljx3","slide":4,"title":"4","textShapes":8}
+{"kind":"textbox","id":"sh/vedojal0","slide":4,"name":"folio-4","text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/gfmpcf25","slide":4,"name":"slide-title","text":"不降智,保留 Astra 推理设置","textPreview":"不降智,保留 Astra 推理设置","textChars":17,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/hgvqlk3q","slide":4,"name":"preserve-model","text":"Astra 按设定调用","textPreview":"Astra 按设定调用","textChars":11,"textLines":1,"bbox":[76,256,630,95]}
+{"kind":"textbox","id":"sh/69k76543","slide":4,"name":"preserve-reasoning","text":"保留推理设置","textPreview":"保留推理设置","textChars":6,"textLines":1,"bbox":[76,366,630,95]}
+{"kind":"textbox","id":"sh/7atofalo","slide":4,"name":"settings-body-1","text":"Astra 请求重试或故障切换时,","textPreview":"Astra 请求重试或故障切换时,","textChars":17,"textLines":1,"bbox":[739,263,469,44]}
+{"kind":"textbox","id":"sh/8b2p8v29","slide":4,"name":"settings-body-2","text":"继续保留指定推理设置。","textPreview":"继续保留指定推理设置。","textChars":11,"textLines":1,"bbox":[739,308,469,44]}
+{"kind":"textbox","id":"sh/tcb6h03u","slide":4,"name":"mode-rejected-1","text":"推理设置不受支持时,","textPreview":"推理设置不受支持时,","textChars":10,"textLines":1,"bbox":[739,412,469,44]}
+{"kind":"textbox","id":"sh/q547ipkn","slide":4,"name":"mode-rejected-2","text":"明确提示原因。","textPreview":"明确提示原因。","textChars":7,"textLines":1,"bbox":[739,457,469,44]}
+{"kind":"notes","id":"nt/c5ljx3","slide":4,"text":"这里把“不降智”具体解释为Astra指定推理参数的保留。代码及现有测试覆盖pro/max参数在重试与账号切换时保留,并在上游拒绝指定模式时保留错误。测试也覆盖特定重试和故障切换路径中Astra模型标识不变;项目允许显式模型映射,不将这项测试泛化为所有配置下模型标识永不改变。引用测试文件属于实现依据,本次未运行线上质量测试;不把转发设置等同于上游每次回答质量保证。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_request_body.go:1022\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_astra_pro_retry_test.go:64\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_responses_astra_pro_failover_test.go:140"}
+{"kind":"slide","id":"sl/qxnimu","slide":5,"title":"5","textShapes":10}
+{"kind":"textbox","id":"sh/4fqxcji5","slide":5,"name":"folio-5","text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/3exw3ehk","slide":5,"name":"slide-title","text":"Astra 工作流示例","textPreview":"Astra 工作流示例","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/idofat0f","slide":5,"name":"sample-task-line-1","text":"为已有项目增加登录能力","textPreview":"为已有项目增加登录能力","textChars":11,"textLines":1,"bbox":[76,229,1128,77]}
+{"kind":"textbox","id":"sh/hcfe1ozu","slide":5,"name":"sample-task-line-2","text":"兼顾权限、异常处理与验证","textPreview":"兼顾权限、异常处理与验证","textChars":12,"textLines":1,"bbox":[76,313,1128,77]}
+{"kind":"textbox","id":"sh/gb6d8ji9","slide":5,"name":"context-label","text":"给模型的上下文","textPreview":"给模型的上下文","textChars":7,"textLines":1,"bbox":[78,466,550,45]}
+{"kind":"textbox","id":"sh/vaxwzeho","slide":5,"name":"context-body-1","text":"现有代码、技术栈、约束","textPreview":"现有代码、技术栈、约束","textChars":11,"textLines":1,"bbox":[78,523,550,44]}
+{"kind":"textbox","id":"sh/u9ov6903","slide":5,"name":"context-body-2","text":"与验收要求。","textPreview":"与验收要求。","textChars":6,"textLines":1,"bbox":[78,565,550,44]}
+{"kind":"textbox","id":"sh/18jed8zy","slide":5,"name":"review-label","text":"你要检查的结果","textPreview":"你要检查的结果","textChars":7,"textLines":1,"bbox":[683,466,520,45]}
+{"kind":"textbox","id":"sh/07ax43id","slide":5,"name":"review-body-1","text":"实现方案、代码修改、验证步骤","textPreview":"实现方案、代码修改、验证步骤","textChars":14,"textLines":1,"bbox":[683,523,520,44]}
+{"kind":"textbox","id":"sh/mlkrex8f","slide":5,"name":"review-body-2","text":"与边界说明。","textPreview":"与边界说明。","textChars":6,"textLines":1,"bbox":[683,565,520,44]}
+{"kind":"notes","id":"nt/qxnimu","slide":5,"text":"这一页是面向开发者的任务示例,展示如何组织输入与检查输出,不是Astra实际跑出的回答,也不是性能或正确率测评。讲解时可结合真实项目补充上下文,由用户核验模型给出的方案和代码。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62"}
+{"kind":"slide","id":"sl/tl83xf","slide":6,"title":"6","textShapes":13}
+{"kind":"textbox","id":"sh/jex0rqxw","slide":6,"name":"folio-6","text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/4f61kvyh","slide":6,"name":"slide-title","text":"稳定调用,异常自动处理","textPreview":"稳定调用,异常自动处理","textChars":11,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/5gfitgf2","slide":6,"name":"recovery-condition","text":"请求条件允许时,平台识别可重试故障,并尝试切换合适账号。","textPreview":"请求条件允许时,平台识别可重试故障,并尝试切换合适账号。","textChars":28,"textLines":1,"bbox":[78,173,1128,57]}
+{"kind":"textbox","id":"sh/6hojmlg7","slide":6,"name":"recovery-number-01","text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[78,299,320,99]}
+{"kind":"textbox","id":"sh/rix0vqxs","slide":6,"name":"recovery-label-01","text":"识别异常","textPreview":"识别异常","textChars":4,"textLines":1,"bbox":[78,420,330,57]}
+{"kind":"textbox","id":"sh/sjq1ovyd","slide":6,"name":"recovery-detail-01","text":"判断请求是否可以重试","textPreview":"判断请求是否可以重试","textChars":10,"textLines":1,"bbox":[78,488,340,49]}
+{"kind":"textbox","id":"sh/tkzix0fy","slide":6,"name":"recovery-number-02","text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[471,299,320,99]}
+{"kind":"textbox","id":"sh/el8jq5gj","slide":6,"name":"recovery-label-02","text":"切换账号","textPreview":"切换账号","textChars":4,"textLines":1,"bbox":[471,420,330,57]}
+{"kind":"textbox","id":"sh/fmh0zax4","slide":6,"name":"recovery-detail-02","text":"选择当前可用的账号","textPreview":"选择当前可用的账号","textChars":9,"textLines":1,"bbox":[471,488,340,49]}
+{"kind":"textbox","id":"sh/nuh8vql0","slide":6,"name":"recovery-number-03","text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[864,299,320,99]}
+{"kind":"textbox","id":"sh/2t8r2l4f","slide":6,"name":"recovery-label-03","text":"保持设置","textPreview":"保持设置","textChars":4,"textLines":1,"bbox":[864,420,330,57]}
+{"kind":"textbox","id":"sh/pwzqxg36","slide":6,"name":"recovery-detail-03","text":"继续保留 Astra 推理参数","textPreview":"继续保留 Astra 推理参数","textChars":15,"textLines":1,"bbox":[864,488,340,49]}
+{"kind":"textbox","id":"sh/ovq94vml","slide":6,"name":"recovery-monitor","text":"渠道状态与成功率可查看。","textPreview":"渠道状态与成功率可查看。","textChars":12,"textLines":1,"bbox":[78,602,1040,40]}
+{"kind":"notes","id":"nt/tl83xf","slide":6,"text":"自动重试与切换有明确条件,包括错误允许重试、请求可安全回放、存在合适账号并且未达到上限。页面不承诺零中断或无限重试。渠道监控提供状态及成功率,具体结果受样本、时间窗口和上游状态影响。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_gateway_handler.go:883\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/handler/openai_responses_astra_pro_failover_test.go:140\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/ChannelStatusV2View.vue:196"}
+{"kind":"slide","id":"sl/paubxr","slide":7,"title":"7","textShapes":10}
+{"kind":"textbox","id":"sh/472h0j2d","slide":7,"name":"folio-7","text":"7","textPreview":"7","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/250zy9k7","slide":7,"name":"slide-title","text":"高速响应,进度看得见","textPreview":"高速响应,进度看得见","textChars":10,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/dwbixo3u","slide":7,"name":"stream-label","text":"流式输出","textPreview":"流式输出","textChars":4,"textLines":1,"bbox":[78,244,520,69]}
+{"kind":"textbox","id":"sh/cv2h4j29","slide":7,"name":"stream-description-1","text":"开启流式请求,","textPreview":"开启流式请求,","textChars":7,"textLines":1,"bbox":[78,331,555,49]}
+{"kind":"textbox","id":"sh/rut0vylo","slide":7,"name":"stream-description-2","text":"生成内容逐步返回。","textPreview":"生成内容逐步返回。","textChars":9,"textLines":1,"bbox":[78,378,555,49]}
+{"kind":"textbox","id":"sh/q9kz2tk3","slide":7,"name":"latency-label","text":"响应可查","textPreview":"响应可查","textChars":4,"textLines":1,"bbox":[685,244,518,69]}
+{"kind":"textbox","id":"sh/t0ryl43q","slide":7,"name":"latency-description-1","text":"首 Token 与总耗时,","textPreview":"首 Token 与总耗时,","textChars":13,"textLines":1,"bbox":[685,331,518,49]}
+{"kind":"textbox","id":"sh/szyhsz25","slide":7,"name":"latency-description-2","text":"可在用量记录中核对。","textPreview":"可在用量记录中核对。","textChars":10,"textLines":1,"bbox":[685,378,518,49]}
+{"kind":"textbox","id":"sh/2t8ji983","slide":7,"name":"stream-closing-1","text":"使用过程更直观,","textPreview":"使用过程更直观,","textChars":8,"textLines":1,"bbox":[78,526,550,44]}
+{"kind":"textbox","id":"sh/nu1kbe9o","slide":7,"name":"stream-closing-2","text":"响应表现有记录。","textPreview":"响应表现有记录。","textChars":8,"textLines":1,"bbox":[78,569,550,44]}
+{"kind":"image","id":"im/ehwrip83","slide":7,"name":"","alt":"ISS-30 Star trail composite","bbox":[685,448,519,181]}
+{"kind":"notes","id":"nt/paubxr","slide":7,"text":"流式输出要求客户端开启stream并且相应上游协议支持。用量记录展示首Token时间和总耗时。本页不引用未经采集的速度数字,不把渠道监控中TPM除以60得到的窗口吞吐量当作单请求生成速度。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/openai_gateway_forward.go:1207\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/UsageView.vue:650\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/ChannelStatusV2View.vue:196\n\nVisual source: ISS-30 Star trail composite. NASA / Don Pettit https://images.nasa.gov/details/jsc2012e039800_alt https://images-assets.nasa.gov/image/jsc2012e039800_alt/jsc2012e039800_alt~orig.jpg"}
+{"kind":"slide","id":"sl/addzs3","slide":8,"title":"8","textShapes":9}
+{"kind":"textbox","id":"sh/10fe1wfy","slide":8,"name":"folio-8","text":"8","textPreview":"8","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/ex4f6hg7","slide":8,"name":"slide-title","text":"多模型接入,调用清楚可查","textPreview":"多模型接入,调用清楚可查","textChars":12,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/fyxwzmxs","slide":8,"name":"models-label","text":"按任务选模型","textPreview":"按任务选模型","textChars":6,"textLines":1,"bbox":[78,275,552,69]}
+{"kind":"textbox","id":"sh/svmx47y1","slide":8,"name":"models-description-1","text":"通过控制台查看可用模型,","textPreview":"通过控制台查看可用模型,","textChars":12,"textLines":1,"bbox":[78,365,552,49]}
+{"kind":"textbox","id":"sh/twvexcfm","slide":8,"name":"models-description-2","text":"选择适合当前任务的配置。","textPreview":"选择适合当前任务的配置。","textChars":12,"textLines":1,"bbox":[78,412,552,49]}
+{"kind":"textbox","id":"sh/6t4f2xgb","slide":8,"name":"usage-label","text":"按记录看消耗","textPreview":"按记录看消耗","textChars":6,"textLines":1,"bbox":[684,275,520,69]}
+{"kind":"textbox","id":"sh/rudwv2xw","slide":8,"name":"usage-description-1","text":"模型、Token 和实际扣费,","textPreview":"模型、Token 和实际扣费,","textChars":15,"textLines":1,"bbox":[684,365,520,49]}
+{"kind":"textbox","id":"sh/crqxgbyl","slide":8,"name":"usage-description-2","text":"每笔调用都可核对。","textPreview":"每笔调用都可核对。","textChars":9,"textLines":1,"bbox":[684,412,520,49]}
+{"kind":"textbox","id":"sh/dszy9gf6","slide":8,"name":"key-control","text":"API Key 的额度、有效期与访问权限可分别设置。","textPreview":"API Key 的额度、有效期与访问权限可分别设置。","textChars":26,"textLines":1,"bbox":[78,579,1128,54]}
+{"kind":"notes","id":"nt/addzs3","slide":8,"text":"聚合平台统一提供模型列表、密钥管理与调用记录。用量记录包括输入输出及缓存Token和实际费用。可用模型按账号分组与权限确定,费用以实际配置和用量记录为准。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/UsageView.vue:650\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/KeysView.vue:205"}
+{"kind":"slide","id":"sl/0twrj6","slide":9,"title":"9","textShapes":12}
+{"kind":"textbox","id":"sh/t8jyd87i","slide":9,"name":"folio-9","text":"9","textPreview":"9","textChars":1,"textLines":1,"bbox":[1180,653,28,25]}
+{"kind":"textbox","id":"sh/65szitor","slide":9,"name":"slide-title","text":"接入你正在用的工具","textPreview":"接入你正在用的工具","textChars":9,"textLines":1,"bbox":[76,72,1128,84]}
+{"kind":"textbox","id":"sh/r61gbypc","slide":9,"name":"compatibility","text":"支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。","textPreview":"支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。","textChars":30,"textLines":1,"bbox":[78,173,1128,57]}
+{"kind":"textbox","id":"sh/gbuho36t","slide":9,"name":"onboard-number-01","text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[78,288,140,75]}
+{"kind":"textbox","id":"sh/1c3yh87e","slide":9,"name":"onboard-label-01","text":"填写接入地址","textPreview":"填写接入地址","textChars":6,"textLines":1,"bbox":[233,294,450,62]}
+{"kind":"textbox","id":"sh/e9szmto3","slide":9,"name":"onboard-detail-01","text":"复制控制台提供的 Base URL","textPreview":"复制控制台提供的 Base URL","textChars":17,"textLines":1,"bbox":[704,297,500,54]}
+{"kind":"textbox","id":"sh/fa1gfypo","slide":9,"name":"onboard-number-02","text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[78,407,140,75]}
+{"kind":"textbox","id":"sh/ozuhsn65","slide":9,"name":"onboard-label-02","text":"配置 API Key","textPreview":"配置 API Key","textChars":10,"textLines":1,"bbox":[233,413,450,62]}
+{"kind":"textbox","id":"sh/p03yls7q","slide":9,"name":"onboard-detail-02","text":"创建密钥,并选择所需的分组与额度","textPreview":"创建密钥,并选择所需的分组与额度","textChars":16,"textLines":1,"bbox":[704,416,500,54]}
+{"kind":"textbox","id":"sh/h476dwbm","slide":9,"name":"onboard-number-03","text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[78,526,140,75]}
+{"kind":"textbox","id":"sh/g3e54ru1","slide":9,"name":"onboard-label-03","text":"选择 Astra","textPreview":"选择 Astra","textChars":8,"textLines":1,"bbox":[233,532,450,62]}
+{"kind":"textbox","id":"sh/f25obmtg","slide":9,"name":"onboard-detail-03","text":"按控制台模型名称配置,开始调用","textPreview":"按控制台模型名称配置,开始调用","textChars":15,"textLines":1,"bbox":[704,535,500,54]}
+{"kind":"notes","id":"nt/0twrj6","slide":9,"text":"项目提供客户端配置辅助。适用于支持自定义Base URL的客户端和SDK。实际地址、密钥和模型标识从控制台复制,密钥权限需要覆盖所选模型分组。这里不公开任何用户密钥,也不填入未确认的站点域名。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:941\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:1328\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/KeysView.vue:205"}
+{"kind":"slide","id":"sl/bn1uek","slide":10,"title":"聚合AI","textShapes":4}
+{"kind":"textbox","id":"sh/rmtwfix8","slide":10,"name":"closing-brand","text":"聚合AI","textPreview":"聚合AI","textChars":4,"textLines":1,"bbox":[76,164,650,116]}
+{"kind":"textbox","id":"sh/6lkvmdwn","slide":10,"name":"closing-positioning","text":"Astra 主推,多模型聚合","textPreview":"Astra 主推,多模型聚合","textChars":14,"textLines":1,"bbox":[80,302,910,74]}
+{"kind":"textbox","id":"sh/5kbed8fi","slide":10,"name":"closing-promise","text":"不降智,稳定,高速","textPreview":"不降智,稳定,高速","textChars":9,"textLines":1,"bbox":[80,430,850,60]}
+{"kind":"textbox","id":"sh/4j2dk3ex","slide":10,"name":"closing-cta","text":"创建 API Key,连接你的常用工具。","textPreview":"创建 API Key,连接你的常用工具。","textChars":20,"textLines":1,"bbox":[80,584,1060,51]}
+{"kind":"image","id":"im/l8ri5gf2","slide":10,"name":"","alt":"A Splendor Seldom Seen","bbox":[610,76,670,559]}
+{"kind":"notes","id":"nt/bn1uek","slide":10,"text":"总结聚合AI的定位:Astra为主推模型,多模型聚合作为平台价值。用户可以在控制台创建API Key,并按对应协议接入常用工具。\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/HomeView.vue:62\n\nSource: C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/UseKeyModal.vue:941\n\nVisual source: A Splendor Seldom Seen. NASA/JPL-Caltech/Space Science Institute https://images.nasa.gov/details/PIA14934 https://images-assets.nasa.gov/image/PIA14934/PIA14934~orig.jpg"}

BIN
.codex-artifacts/juheai-astra-20260915/first-pass-v1.pptx


+ 53 - 0
.codex-artifacts/juheai-astra-20260915/inspect_rendered.mjs

@@ -0,0 +1,53 @@
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import sharp from 'sharp';
+
+const buildDir = 'C:/Users/30214/Desktop/sub2本地/sub2新站/.codex-artifacts/juheai-astra-20260915';
+const revision = process.argv[2] || '初稿';
+const metrics = JSON.parse(await fs.readFile(path.join(buildDir, `text-metrics-${revision}.json`), 'utf8'));
+const checks = [];
+const failures = [];
+const collisions = [];
+
+for (let slideNumber = 1; slideNumber <= 10; slideNumber++) {
+  const file = path.join(buildDir, `rendered-${revision}`, `slide-${slideNumber}.png`);
+  const { data, info } = await sharp(file).removeAlpha().raw().toBuffer({ resolveWithObject: true });
+  const scaleX = info.width / 1280;
+  const scaleY = info.height / 720;
+  const slideTexts = metrics.filter(x => x.slide === slideNumber);
+  for (const item of slideTexts) {
+    const expected = [1, 3, 5].map(i => Number.parseInt(item.color.slice(i, i + 2), 16));
+    const x1 = Math.max(0, Math.floor(item.left * scaleX));
+    const y1 = Math.max(0, Math.floor(item.top * scaleY));
+    const x2 = Math.min(info.width, Math.ceil((item.left + item.width) * scaleX));
+    const y2 = Math.min(info.height, Math.ceil((item.top + item.height) * scaleY));
+    let pixelsWithTextColor = 0;
+    for (let y = y1; y < y2; y++) {
+      for (let x = x1; x < x2; x++) {
+        const offset = (y * info.width + x) * info.channels;
+        if (Math.abs(data[offset] - expected[0]) < 28 && Math.abs(data[offset + 1] - expected[1]) < 28 && Math.abs(data[offset + 2] - expected[2]) < 28) pixelsWithTextColor++;
+      }
+    }
+    const pass = pixelsWithTextColor >= 12;
+    checks.push({ slide: slideNumber, name: item.name, text: item.value, pixelsWithTextColor, pass });
+    if (!pass) failures.push({ slide: slideNumber, name: item.name, reason: 'No visible text-color pixels' });
+  }
+  const boxes = slideTexts.map(item => ({
+    name: item.name,
+    left: item.name.startsWith('folio-') ? item.left + item.width - item.measuredWidth : item.left,
+    right: item.name.startsWith('folio-') ? item.left + item.width : item.left + item.measuredWidth,
+    top: item.top + (item.height - item.measuredHeight) / 2,
+    bottom: item.top + (item.height + item.measuredHeight) / 2,
+  }));
+  for (let a = 0; a < boxes.length; a++) {
+    for (let b = a + 1; b < boxes.length; b++) {
+      const x = Math.min(boxes[a].right, boxes[b].right) - Math.max(boxes[a].left, boxes[b].left);
+      const y = Math.min(boxes[a].bottom, boxes[b].bottom) - Math.max(boxes[a].top, boxes[b].top);
+      if (x > 1 && y > 1) collisions.push({ slide: slideNumber, first: boxes[a].name, second: boxes[b].name, overlapWidth: x, overlapHeight: y });
+    }
+  }
+}
+const result = { claimBoundary: 'Pixel presence and measured text geometry only. No human visual review or OCR.', slideCount: 10, textRegionsChecked: checks.length, failures, collisions, checks };
+await fs.writeFile(path.join(buildDir, `render-check-${revision}.json`), JSON.stringify(result, null, 2));
+console.log(JSON.stringify({ slideCount: 10, textRegionsChecked: checks.length, failures, collisions }, null, 2));
+if (failures.length || collisions.length) process.exitCode = 1;

File diff suppressed because it is too large
+ 0 - 0
.codex-artifacts/juheai-astra-20260915/presentation-v1.json


File diff suppressed because it is too large
+ 0 - 0
.codex-artifacts/juheai-astra-20260915/presentation-交付版.json


File diff suppressed because it is too large
+ 0 - 0
.codex-artifacts/juheai-astra-20260915/presentation-初稿.json


+ 625 - 0
.codex-artifacts/juheai-astra-20260915/render-check-交付版.json

@@ -0,0 +1,625 @@
+{
+  "claimBoundary": "Pixel presence and measured text geometry only. No human visual review or OCR.",
+  "slideCount": 10,
+  "textRegionsChecked": 88,
+  "failures": [],
+  "collisions": [],
+  "checks": [
+    {
+      "slide": 1,
+      "name": "brand",
+      "text": "聚合AI",
+      "pixelsWithTextColor": 23678,
+      "pass": true
+    },
+    {
+      "slide": 1,
+      "name": "featured-model",
+      "text": "Astra 主推模型",
+      "pixelsWithTextColor": 5897,
+      "pass": true
+    },
+    {
+      "slide": 1,
+      "name": "brand-promise",
+      "text": "不降智,稳定,高速",
+      "pixelsWithTextColor": 3829,
+      "pass": true
+    },
+    {
+      "slide": 1,
+      "name": "platform-value",
+      "text": "多模型选择,统一接入",
+      "pixelsWithTextColor": 2501,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "slide-title",
+      "text": "多模型,一个入口",
+      "pixelsWithTextColor": 12790,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "platform-explanation",
+      "text": "模型接入、API Key、调用记录与费用管理,集中在聚合AI。",
+      "pixelsWithTextColor": 8100,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "featured-model-label",
+      "text": "本站主推",
+      "pixelsWithTextColor": 1119,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "astra-word",
+      "text": "Astra",
+      "pixelsWithTextColor": 14159,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "protocol-label",
+      "text": "支持多种接入协议",
+      "pixelsWithTextColor": 2172,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "protocol-openai",
+      "text": "OpenAI 兼容",
+      "pixelsWithTextColor": 3472,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "protocol-anthropic",
+      "text": "Anthropic Messages",
+      "pixelsWithTextColor": 4846,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "protocol-gemini",
+      "text": "Gemini 原生",
+      "pixelsWithTextColor": 3025,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "platform-takeaway",
+      "text": "按任务选择模型,沿用熟悉的工具。",
+      "pixelsWithTextColor": 5311,
+      "pass": true
+    },
+    {
+      "slide": 2,
+      "name": "folio-2",
+      "text": "2",
+      "pixelsWithTextColor": 70,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "model-section-label",
+      "text": "聚合AI 主推模型",
+      "pixelsWithTextColor": 3072,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "astra-hero",
+      "text": "ASTRA",
+      "pixelsWithTextColor": 50540,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "astra-positioning",
+      "text": "把 Astra 接入你的工作流",
+      "pixelsWithTextColor": 6744,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "astra-settings",
+      "text": "按所选模型与推理设置发起调用。",
+      "pixelsWithTextColor": 5430,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "task-coding",
+      "text": "编码协作",
+      "pixelsWithTextColor": 1470,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "task-analysis",
+      "text": "复杂分析",
+      "pixelsWithTextColor": 1399,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "task-agent",
+      "text": "Agent 任务",
+      "pixelsWithTextColor": 1640,
+      "pass": true
+    },
+    {
+      "slide": 3,
+      "name": "folio-3",
+      "text": "3",
+      "pixelsWithTextColor": 65,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "slide-title",
+      "text": "不降智,保留 Astra 推理设置",
+      "pixelsWithTextColor": 26817,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "preserve-model",
+      "text": "Astra 按设定调用",
+      "pixelsWithTextColor": 22915,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "preserve-reasoning",
+      "text": "保留推理设置",
+      "pixelsWithTextColor": 21766,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "settings-body-1",
+      "text": "Astra 请求重试或故障切换时,",
+      "pixelsWithTextColor": 5231,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "settings-body-2",
+      "text": "继续保留指定推理设置。",
+      "pixelsWithTextColor": 4580,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "mode-rejected-1",
+      "text": "推理设置不受支持时,",
+      "pixelsWithTextColor": 3715,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "mode-rejected-2",
+      "text": "明确提示原因。",
+      "pixelsWithTextColor": 2688,
+      "pass": true
+    },
+    {
+      "slide": 4,
+      "name": "folio-4",
+      "text": "4",
+      "pixelsWithTextColor": 57,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "slide-title",
+      "text": "Astra 工作流示例",
+      "pixelsWithTextColor": 14763,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "sample-task-line-1",
+      "text": "为已有项目增加登录能力",
+      "pixelsWithTextColor": 26009,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "sample-task-line-2",
+      "text": "兼顾权限、异常处理与验证",
+      "pixelsWithTextColor": 16296,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "context-label",
+      "text": "给模型的上下文",
+      "pixelsWithTextColor": 2581,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "context-body-1",
+      "text": "现有代码、技术栈、约束",
+      "pixelsWithTextColor": 3319,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "context-body-2",
+      "text": "与验收要求。",
+      "pixelsWithTextColor": 1903,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "review-label",
+      "text": "你要检查的结果",
+      "pixelsWithTextColor": 3347,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "review-body-1",
+      "text": "实现方案、代码修改、验证步骤",
+      "pixelsWithTextColor": 4417,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "review-body-2",
+      "text": "与边界说明。",
+      "pixelsWithTextColor": 1794,
+      "pass": true
+    },
+    {
+      "slide": 5,
+      "name": "folio-5",
+      "text": "5",
+      "pixelsWithTextColor": 64,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "slide-title",
+      "text": "稳定调用,异常自动处理",
+      "pixelsWithTextColor": 24985,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-condition",
+      "text": "请求条件允许时,平台识别可重试故障,并尝试切换合适账号。",
+      "pixelsWithTextColor": 9041,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-number-01",
+      "text": "01",
+      "pixelsWithTextColor": 3071,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-label-01",
+      "text": "识别异常",
+      "pixelsWithTextColor": 5036,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-detail-01",
+      "text": "判断请求是否可以重试",
+      "pixelsWithTextColor": 2992,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-number-02",
+      "text": "02",
+      "pixelsWithTextColor": 3638,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-label-02",
+      "text": "切换账号",
+      "pixelsWithTextColor": 5226,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-detail-02",
+      "text": "选择当前可用的账号",
+      "pixelsWithTextColor": 2721,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-number-03",
+      "text": "03",
+      "pixelsWithTextColor": 3604,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-label-03",
+      "text": "保持设置",
+      "pixelsWithTextColor": 5575,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-detail-03",
+      "text": "继续保留 Astra 推理参数",
+      "pixelsWithTextColor": 3256,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "recovery-monitor",
+      "text": "渠道状态与成功率可查看。",
+      "pixelsWithTextColor": 3811,
+      "pass": true
+    },
+    {
+      "slide": 6,
+      "name": "folio-6",
+      "text": "6",
+      "pixelsWithTextColor": 82,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "slide-title",
+      "text": "高速响应,进度看得见",
+      "pixelsWithTextColor": 22431,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "stream-label",
+      "text": "流式输出",
+      "pixelsWithTextColor": 7909,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "stream-description-1",
+      "text": "开启流式请求,",
+      "pixelsWithTextColor": 2382,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "stream-description-2",
+      "text": "生成内容逐步返回。",
+      "pixelsWithTextColor": 3351,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "latency-label",
+      "text": "响应可查",
+      "pixelsWithTextColor": 8026,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "latency-description-1",
+      "text": "首 Token 与总耗时,",
+      "pixelsWithTextColor": 2908,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "latency-description-2",
+      "text": "可在用量记录中核对。",
+      "pixelsWithTextColor": 3564,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "stream-closing-1",
+      "text": "使用过程更直观,",
+      "pixelsWithTextColor": 2786,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "stream-closing-2",
+      "text": "响应表现有记录。",
+      "pixelsWithTextColor": 2583,
+      "pass": true
+    },
+    {
+      "slide": 7,
+      "name": "folio-7",
+      "text": "7",
+      "pixelsWithTextColor": 46,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "slide-title",
+      "text": "多模型接入,调用清楚可查",
+      "pixelsWithTextColor": 26779,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "models-label",
+      "text": "按任务选模型",
+      "pixelsWithTextColor": 10277,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "models-description-1",
+      "text": "通过控制台查看可用模型,",
+      "pixelsWithTextColor": 4746,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "models-description-2",
+      "text": "选择适合当前任务的配置。",
+      "pixelsWithTextColor": 4579,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "usage-label",
+      "text": "按记录看消耗",
+      "pixelsWithTextColor": 9966,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "usage-description-1",
+      "text": "模型、Token 和实际扣费,",
+      "pixelsWithTextColor": 3800,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "usage-description-2",
+      "text": "每笔调用都可核对。",
+      "pixelsWithTextColor": 3433,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "key-control",
+      "text": "API Key 的额度、有效期与访问权限可分别设置。",
+      "pixelsWithTextColor": 7043,
+      "pass": true
+    },
+    {
+      "slide": 8,
+      "name": "folio-8",
+      "text": "8",
+      "pixelsWithTextColor": 84,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "slide-title",
+      "text": "接入你正在用的工具",
+      "pixelsWithTextColor": 19990,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "compatibility",
+      "text": "支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。",
+      "pixelsWithTextColor": 8932,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-number-01",
+      "text": "01",
+      "pixelsWithTextColor": 1359,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-label-01",
+      "text": "填写接入地址",
+      "pixelsWithTextColor": 6697,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-detail-01",
+      "text": "复制控制台提供的 Base URL",
+      "pixelsWithTextColor": 4122,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-number-02",
+      "text": "02",
+      "pixelsWithTextColor": 1656,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-label-02",
+      "text": "配置 API Key",
+      "pixelsWithTextColor": 5481,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-detail-02",
+      "text": "创建密钥,并选择所需的分组与额度",
+      "pixelsWithTextColor": 5326,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-number-03",
+      "text": "03",
+      "pixelsWithTextColor": 1620,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-label-03",
+      "text": "选择 Astra",
+      "pixelsWithTextColor": 4392,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "onboard-detail-03",
+      "text": "按控制台模型名称配置,开始调用",
+      "pixelsWithTextColor": 5068,
+      "pass": true
+    },
+    {
+      "slide": 9,
+      "name": "folio-9",
+      "text": "9",
+      "pixelsWithTextColor": 74,
+      "pass": true
+    },
+    {
+      "slide": 10,
+      "name": "closing-brand",
+      "text": "聚合AI",
+      "pixelsWithTextColor": 21556,
+      "pass": true
+    },
+    {
+      "slide": 10,
+      "name": "closing-positioning",
+      "text": "Astra 主推,多模型聚合",
+      "pixelsWithTextColor": 8874,
+      "pass": true
+    },
+    {
+      "slide": 10,
+      "name": "closing-promise",
+      "text": "不降智,稳定,高速",
+      "pixelsWithTextColor": 4419,
+      "pass": true
+    },
+    {
+      "slide": 10,
+      "name": "closing-cta",
+      "text": "创建 API Key,连接你的常用工具。",
+      "pixelsWithTextColor": 5470,
+      "pass": true
+    }
+  ]
+}

BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-1.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-10.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-2.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-3.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-4.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-5.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-6.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-7.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-8.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-v1/slide-9.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-1.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-10.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-2.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-3.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-4.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-5.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-6.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-7.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-8.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-交付版/slide-9.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-1.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-10.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-2.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-3.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-4.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-5.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-6.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-7.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-8.png


BIN
.codex-artifacts/juheai-astra-20260915/rendered-初稿/slide-9.png


BIN
.codex-artifacts/juheai-astra-20260915/second-pass-初稿.pptx


+ 794 - 0
.codex-artifacts/juheai-astra-20260915/text-metrics-v1.json

@@ -0,0 +1,794 @@
+[
+  {
+    "slide": 1,
+    "name": "brand",
+    "value": "聚合AI",
+    "width": 650,
+    "height": 120,
+    "measuredWidth": 271.69000244140625,
+    "measuredHeight": 87
+  },
+  {
+    "slide": 1,
+    "name": "featured-model",
+    "value": "Astra 主推模型",
+    "width": 540,
+    "height": 80,
+    "measuredWidth": 270.7799987792969,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 1,
+    "name": "brand-promise",
+    "value": "不降智,稳定,高速",
+    "width": 550,
+    "height": 55,
+    "measuredWidth": 270,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 1,
+    "name": "platform-value",
+    "value": "多模型选择,统一接入",
+    "width": 540,
+    "height": 44,
+    "measuredWidth": 240,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "folio-2",
+    "value": "2",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 2,
+    "name": "slide-title",
+    "value": "多模型,一个入口",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 384,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 2,
+    "name": "platform-explanation",
+    "value": "模型接入、API Key、调用记录与费用管理,集中在聚合AI。",
+    "width": 1120,
+    "height": 56,
+    "measuredWidth": 692.1199951171875,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 2,
+    "name": "featured-model-label",
+    "value": "本站主推",
+    "width": 480,
+    "height": 42,
+    "measuredWidth": 96,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "astra-word",
+    "value": "Astra",
+    "width": 510,
+    "height": 112,
+    "measuredWidth": 234.17999267578125,
+    "measuredHeight": 68
+  },
+  {
+    "slide": 2,
+    "name": "protocol-label",
+    "value": "支持多种接入协议",
+    "width": 510,
+    "height": 43,
+    "measuredWidth": 192,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "protocol-openai",
+    "value": "OpenAI 兼容",
+    "width": 510,
+    "height": 53,
+    "measuredWidth": 201.63999938964844,
+    "measuredHeight": 35
+  },
+  {
+    "slide": 2,
+    "name": "protocol-anthropic",
+    "value": "Anthropic Messages",
+    "width": 510,
+    "height": 53,
+    "measuredWidth": 330.0199890136719,
+    "measuredHeight": 36
+  },
+  {
+    "slide": 2,
+    "name": "protocol-gemini",
+    "value": "Gemini 原生",
+    "width": 510,
+    "height": 53,
+    "measuredWidth": 193.5399932861328,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 2,
+    "name": "platform-takeaway",
+    "value": "按任务选择模型,沿用熟悉的工具。",
+    "width": 1070,
+    "height": 46,
+    "measuredWidth": 416,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "folio-3",
+    "value": "3",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 3,
+    "name": "model-section-label",
+    "value": "聚合AI 主推模型",
+    "width": 730,
+    "height": 50,
+    "measuredWidth": 204.22000122070312,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 3,
+    "name": "astra-hero",
+    "value": "ASTRA",
+    "width": 1128,
+    "height": 181,
+    "measuredWidth": 466.3699951171875,
+    "measuredHeight": 106
+  },
+  {
+    "slide": 3,
+    "name": "astra-positioning",
+    "value": "把 Astra 接入你的工作流",
+    "width": 740,
+    "height": 66,
+    "measuredWidth": 398.3599853515625,
+    "measuredHeight": 35
+  },
+  {
+    "slide": 3,
+    "name": "astra-settings",
+    "value": "按所选模型与推理设置发起调用。",
+    "width": 760,
+    "height": 55,
+    "measuredWidth": 390,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-coding",
+    "value": "编码协作",
+    "width": 218,
+    "height": 44,
+    "measuredWidth": 104,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-analysis",
+    "value": "复杂分析",
+    "width": 218,
+    "height": 44,
+    "measuredWidth": 104,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-agent",
+    "value": "Agent 任务",
+    "width": 300,
+    "height": 44,
+    "measuredWidth": 135.0800018310547,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 4,
+    "name": "folio-4",
+    "value": "4",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 4,
+    "name": "slide-title",
+    "value": "不降智,落实到每次转发",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 4,
+    "name": "preserve-model",
+    "value": "保留模型选择",
+    "width": 630,
+    "height": 95,
+    "measuredWidth": 336,
+    "measuredHeight": 55
+  },
+  {
+    "slide": 4,
+    "name": "preserve-reasoning",
+    "value": "保留推理设置",
+    "width": 630,
+    "height": 95,
+    "measuredWidth": 336,
+    "measuredHeight": 55
+  },
+  {
+    "slide": 4,
+    "name": "settings-body-1",
+    "value": "Astra 请求在转发、重试与账号",
+    "width": 469,
+    "height": 44,
+    "measuredWidth": 371.7799987792969,
+    "measuredHeight": 21
+  },
+  {
+    "slide": 4,
+    "name": "settings-body-2",
+    "value": "切换过程中保留模型和推理参数。",
+    "width": 469,
+    "height": 44,
+    "measuredWidth": 405,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 4,
+    "name": "mode-rejected-1",
+    "value": "上游拒绝指定推理模式时,",
+    "width": 469,
+    "height": 44,
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 4,
+    "name": "mode-rejected-2",
+    "value": "返回明确错误。",
+    "width": 469,
+    "height": 44,
+    "measuredWidth": 189,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "folio-5",
+    "value": "5",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 5,
+    "name": "slide-title",
+    "value": "Astra 工作流示例",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 382.0299987792969,
+    "measuredHeight": 38
+  },
+  {
+    "slide": 5,
+    "name": "sample-task-line-1",
+    "value": "为已有项目增加登录能力",
+    "width": 1128,
+    "height": 77,
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 5,
+    "name": "sample-task-line-2",
+    "value": "兼顾权限、异常处理与验证",
+    "width": 1128,
+    "height": 77,
+    "measuredWidth": 576,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 5,
+    "name": "context-label",
+    "value": "给模型的上下文",
+    "width": 550,
+    "height": 45,
+    "measuredWidth": 196,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 5,
+    "name": "context-body-1",
+    "value": "现有代码、技术栈、约束",
+    "width": 550,
+    "height": 44,
+    "measuredWidth": 286,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "context-body-2",
+    "value": "与验收要求。",
+    "width": 550,
+    "height": 44,
+    "measuredWidth": 156,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "review-label",
+    "value": "你要检查的结果",
+    "width": 520,
+    "height": 45,
+    "measuredWidth": 196,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 5,
+    "name": "review-body-1",
+    "value": "实现方案、代码修改、验证步骤",
+    "width": 520,
+    "height": 44,
+    "measuredWidth": 364,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 5,
+    "name": "review-body-2",
+    "value": "与边界说明。",
+    "width": 520,
+    "height": 44,
+    "measuredWidth": 156,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 6,
+    "name": "folio-6",
+    "value": "6",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 6,
+    "name": "slide-title",
+    "value": "稳定,来自可恢复的调用",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 6,
+    "name": "recovery-condition",
+    "value": "请求条件允许时,平台识别可重试故障,并尝试切换合适账号。",
+    "width": 1128,
+    "height": 57,
+    "measuredWidth": 728,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-01",
+    "value": "01",
+    "width": 320,
+    "height": 99,
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-01",
+    "value": "识别异常",
+    "width": 330,
+    "height": 57,
+    "measuredWidth": 144,
+    "measuredHeight": 36
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-01",
+    "value": "判断请求是否可以重试",
+    "width": 340,
+    "height": 49,
+    "measuredWidth": 240,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-02",
+    "value": "02",
+    "width": 320,
+    "height": 99,
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-02",
+    "value": "切换账号",
+    "width": 330,
+    "height": 57,
+    "measuredWidth": 144,
+    "measuredHeight": 37
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-02",
+    "value": "选择当前可用的账号",
+    "width": 340,
+    "height": 49,
+    "measuredWidth": 216,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-03",
+    "value": "03",
+    "width": 320,
+    "height": 99,
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-03",
+    "value": "保持设置",
+    "width": 330,
+    "height": 57,
+    "measuredWidth": 144,
+    "measuredHeight": 37
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-03",
+    "value": "继续保留 Astra 推理参数",
+    "width": 340,
+    "height": 49,
+    "measuredWidth": 265.57000732421875,
+    "measuredHeight": 24
+  },
+  {
+    "slide": 6,
+    "name": "recovery-monitor",
+    "value": "渠道状态与成功率可查看。",
+    "width": 1040,
+    "height": 40,
+    "measuredWidth": 300,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "folio-7",
+    "value": "7",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 7,
+    "name": "slide-title",
+    "value": "高速响应,进度看得见",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 480,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 7,
+    "name": "stream-label",
+    "value": "流式输出",
+    "width": 520,
+    "height": 69,
+    "measuredWidth": 176,
+    "measuredHeight": 44
+  },
+  {
+    "slide": 7,
+    "name": "stream-description-1",
+    "value": "开启流式请求,",
+    "width": 555,
+    "height": 49,
+    "measuredWidth": 189,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 7,
+    "name": "stream-description-2",
+    "value": "生成内容逐步返回。",
+    "width": 555,
+    "height": 49,
+    "measuredWidth": 243,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 7,
+    "name": "latency-label",
+    "value": "响应可查",
+    "width": 518,
+    "height": 69,
+    "measuredWidth": 176,
+    "measuredHeight": 44
+  },
+  {
+    "slide": 7,
+    "name": "latency-description-1",
+    "value": "首 Token 与总耗时,",
+    "width": 518,
+    "height": 49,
+    "measuredWidth": 253.69000244140625,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "latency-description-2",
+    "value": "可在用量记录中核对。",
+    "width": 518,
+    "height": 49,
+    "measuredWidth": 270,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 7,
+    "name": "stream-closing-1",
+    "value": "使用过程更直观,",
+    "width": 550,
+    "height": 44,
+    "measuredWidth": 208,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "stream-closing-2",
+    "value": "响应表现有记录。",
+    "width": 550,
+    "height": 44,
+    "measuredWidth": 208,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 8,
+    "name": "folio-8",
+    "value": "8",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 8,
+    "name": "slide-title",
+    "value": "多模型接入,调用清楚可查",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 576,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 8,
+    "name": "models-label",
+    "value": "按任务选模型",
+    "width": 552,
+    "height": 69,
+    "measuredWidth": 240,
+    "measuredHeight": 40
+  },
+  {
+    "slide": 8,
+    "name": "models-description-1",
+    "value": "通过控制台查看可用模型,",
+    "width": 552,
+    "height": 49,
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "models-description-2",
+    "value": "选择适合当前任务的配置。",
+    "width": 552,
+    "height": 49,
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "usage-label",
+    "value": "按记录看消耗",
+    "width": 520,
+    "height": 69,
+    "measuredWidth": 240,
+    "measuredHeight": 40
+  },
+  {
+    "slide": 8,
+    "name": "usage-description-1",
+    "value": "模型、Token 和实际扣费,",
+    "width": 520,
+    "height": 49,
+    "measuredWidth": 326.70001220703125,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "usage-description-2",
+    "value": "每笔调用都可核对。",
+    "width": 520,
+    "height": 49,
+    "measuredWidth": 243,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 8,
+    "name": "key-control",
+    "value": "API Key 的额度、有效期与访问权限可分别设置。",
+    "width": 1128,
+    "height": 54,
+    "measuredWidth": 569.8800048828125,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 9,
+    "name": "folio-9",
+    "value": "9",
+    "width": 28,
+    "height": 25,
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 9,
+    "name": "slide-title",
+    "value": "接入你正在用的工具",
+    "width": 1128,
+    "height": 84,
+    "measuredWidth": 432,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 9,
+    "name": "compatibility",
+    "value": "支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。",
+    "width": 1128,
+    "height": 57,
+    "measuredWidth": 735.010009765625,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-01",
+    "value": "01",
+    "width": 140,
+    "height": 75,
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-01",
+    "value": "填写接入地址",
+    "width": 450,
+    "height": 62,
+    "measuredWidth": 204,
+    "measuredHeight": 34
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-01",
+    "value": "复制控制台提供的 Base URL",
+    "width": 500,
+    "height": 54,
+    "measuredWidth": 317.8699951171875,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-02",
+    "value": "02",
+    "width": 140,
+    "height": 75,
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-02",
+    "value": "配置 API Key",
+    "width": 450,
+    "height": 62,
+    "measuredWidth": 210.0399932861328,
+    "measuredHeight": 32
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-02",
+    "value": "创建密钥,并选择所需的分组与额度",
+    "width": 500,
+    "height": 54,
+    "measuredWidth": 400,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-03",
+    "value": "03",
+    "width": 140,
+    "height": 75,
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-03",
+    "value": "选择 Astra",
+    "width": 450,
+    "height": 62,
+    "measuredWidth": 168.61000061035156,
+    "measuredHeight": 34
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-03",
+    "value": "按控制台模型名称配置,开始调用",
+    "width": 500,
+    "height": 54,
+    "measuredWidth": 375,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 10,
+    "name": "closing-brand",
+    "value": "聚合AI",
+    "width": 650,
+    "height": 116,
+    "measuredWidth": 259.3399963378906,
+    "measuredHeight": 83
+  },
+  {
+    "slide": 10,
+    "name": "closing-positioning",
+    "value": "Astra 主推,多模型聚合",
+    "width": 910,
+    "height": 74,
+    "measuredWidth": 430.7799987792969,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 10,
+    "name": "closing-promise",
+    "value": "不降智,稳定,高速",
+    "width": 850,
+    "height": 60,
+    "measuredWidth": 288,
+    "measuredHeight": 33
+  },
+  {
+    "slide": 10,
+    "name": "closing-cta",
+    "value": "创建 API Key,连接你的常用工具。",
+    "width": 1060,
+    "height": 51,
+    "measuredWidth": 429.79998779296875,
+    "measuredHeight": 27
+  }
+]

+ 1058 - 0
.codex-artifacts/juheai-astra-20260915/text-metrics-交付版.json

@@ -0,0 +1,1058 @@
+[
+  {
+    "slide": 1,
+    "name": "brand",
+    "value": "聚合AI",
+    "left": 76,
+    "top": 164,
+    "width": 650,
+    "height": 120,
+    "color": "#F0F4FA",
+    "measuredWidth": 271.69000244140625,
+    "measuredHeight": 87
+  },
+  {
+    "slide": 1,
+    "name": "featured-model",
+    "value": "Astra 主推模型",
+    "left": 80,
+    "top": 306,
+    "width": 540,
+    "height": 80,
+    "color": "#F0F4FA",
+    "measuredWidth": 270.7799987792969,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 1,
+    "name": "brand-promise",
+    "value": "不降智,稳定,高速",
+    "left": 80,
+    "top": 440,
+    "width": 550,
+    "height": 55,
+    "color": "#B6C3D1",
+    "measuredWidth": 270,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 1,
+    "name": "platform-value",
+    "value": "多模型选择,统一接入",
+    "left": 80,
+    "top": 596,
+    "width": 540,
+    "height": 44,
+    "color": "#88D6FF",
+    "measuredWidth": 240,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "slide-title",
+    "value": "多模型,一个入口",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 384,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 2,
+    "name": "platform-explanation",
+    "value": "模型接入、API Key、调用记录与费用管理,集中在聚合AI。",
+    "left": 78,
+    "top": 174,
+    "width": 1120,
+    "height": 56,
+    "color": "#B6C3D1",
+    "measuredWidth": 692.1199951171875,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 2,
+    "name": "featured-model-label",
+    "value": "本站主推",
+    "left": 80,
+    "top": 316,
+    "width": 480,
+    "height": 42,
+    "color": "#88D6FF",
+    "measuredWidth": 96,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "astra-word",
+    "value": "Astra",
+    "left": 76,
+    "top": 354,
+    "width": 510,
+    "height": 112,
+    "color": "#F0F4FA",
+    "measuredWidth": 234.17999267578125,
+    "measuredHeight": 68
+  },
+  {
+    "slide": 2,
+    "name": "protocol-label",
+    "value": "支持多种接入协议",
+    "left": 682,
+    "top": 282,
+    "width": 510,
+    "height": 43,
+    "color": "#8C9BAE",
+    "measuredWidth": 192,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "protocol-openai",
+    "value": "OpenAI 兼容",
+    "left": 682,
+    "top": 342,
+    "width": 510,
+    "height": 53,
+    "color": "#F0F4FA",
+    "measuredWidth": 201.63999938964844,
+    "measuredHeight": 35
+  },
+  {
+    "slide": 2,
+    "name": "protocol-anthropic",
+    "value": "Anthropic Messages",
+    "left": 682,
+    "top": 412,
+    "width": 510,
+    "height": 53,
+    "color": "#F0F4FA",
+    "measuredWidth": 330.0199890136719,
+    "measuredHeight": 36
+  },
+  {
+    "slide": 2,
+    "name": "protocol-gemini",
+    "value": "Gemini 原生",
+    "left": 682,
+    "top": 482,
+    "width": 510,
+    "height": 53,
+    "color": "#F0F4FA",
+    "measuredWidth": 193.5399932861328,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 2,
+    "name": "platform-takeaway",
+    "value": "按任务选择模型,沿用熟悉的工具。",
+    "left": 80,
+    "top": 595,
+    "width": 1070,
+    "height": 46,
+    "color": "#B6C3D1",
+    "measuredWidth": 416,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "model-section-label",
+    "value": "聚合AI 主推模型",
+    "left": 80,
+    "top": 88,
+    "width": 730,
+    "height": 50,
+    "color": "#88D6FF",
+    "measuredWidth": 204.22000122070312,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 3,
+    "name": "astra-hero",
+    "value": "ASTRA",
+    "left": 72,
+    "top": 178,
+    "width": 1128,
+    "height": 181,
+    "color": "#F0F4FA",
+    "measuredWidth": 466.3699951171875,
+    "measuredHeight": 106
+  },
+  {
+    "slide": 3,
+    "name": "astra-positioning",
+    "value": "把 Astra 接入你的工作流",
+    "left": 80,
+    "top": 367,
+    "width": 740,
+    "height": 66,
+    "color": "#F0F4FA",
+    "measuredWidth": 398.3599853515625,
+    "measuredHeight": 35
+  },
+  {
+    "slide": 3,
+    "name": "astra-settings",
+    "value": "按所选模型与推理设置发起调用。",
+    "left": 80,
+    "top": 445,
+    "width": 760,
+    "height": 55,
+    "color": "#B6C3D1",
+    "measuredWidth": 390,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-coding",
+    "value": "编码协作",
+    "left": 80,
+    "top": 586,
+    "width": 218,
+    "height": 44,
+    "color": "#88D6FF",
+    "measuredWidth": 104,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-analysis",
+    "value": "复杂分析",
+    "left": 303,
+    "top": 586,
+    "width": 218,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 104,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-agent",
+    "value": "Agent 任务",
+    "left": 526,
+    "top": 586,
+    "width": 300,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 135.0800018310547,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 4,
+    "name": "slide-title",
+    "value": "不降智,保留 Astra 推理设置",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 636.3300170898438,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 4,
+    "name": "preserve-model",
+    "value": "Astra 按设定调用",
+    "left": 76,
+    "top": 256,
+    "width": 630,
+    "height": 95,
+    "color": "#F0F4FA",
+    "measuredWidth": 445.70001220703125,
+    "measuredHeight": 43
+  },
+  {
+    "slide": 4,
+    "name": "preserve-reasoning",
+    "value": "保留推理设置",
+    "left": 76,
+    "top": 366,
+    "width": 630,
+    "height": 95,
+    "color": "#88D6FF",
+    "measuredWidth": 336,
+    "measuredHeight": 55
+  },
+  {
+    "slide": 4,
+    "name": "settings-body-1",
+    "value": "Astra 请求重试或故障切换时,",
+    "left": 739,
+    "top": 263,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 371.7799987792969,
+    "measuredHeight": 21
+  },
+  {
+    "slide": 4,
+    "name": "settings-body-2",
+    "value": "继续保留指定推理设置。",
+    "left": 739,
+    "top": 308,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 297,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 4,
+    "name": "mode-rejected-1",
+    "value": "推理设置不受支持时,",
+    "left": 739,
+    "top": 412,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 270,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 4,
+    "name": "mode-rejected-2",
+    "value": "明确提示原因。",
+    "left": 739,
+    "top": 457,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 189,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "slide-title",
+    "value": "Astra 工作流示例",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 382.0299987792969,
+    "measuredHeight": 38
+  },
+  {
+    "slide": 5,
+    "name": "sample-task-line-1",
+    "value": "为已有项目增加登录能力",
+    "left": 76,
+    "top": 229,
+    "width": 1128,
+    "height": 77,
+    "color": "#F0F4FA",
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 5,
+    "name": "sample-task-line-2",
+    "value": "兼顾权限、异常处理与验证",
+    "left": 76,
+    "top": 313,
+    "width": 1128,
+    "height": 77,
+    "color": "#88D6FF",
+    "measuredWidth": 576,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 5,
+    "name": "context-label",
+    "value": "给模型的上下文",
+    "left": 78,
+    "top": 466,
+    "width": 550,
+    "height": 45,
+    "color": "#F0F4FA",
+    "measuredWidth": 196,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 5,
+    "name": "context-body-1",
+    "value": "现有代码、技术栈、约束",
+    "left": 78,
+    "top": 523,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 286,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "context-body-2",
+    "value": "与验收要求。",
+    "left": 78,
+    "top": 565,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 156,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "review-label",
+    "value": "你要检查的结果",
+    "left": 683,
+    "top": 466,
+    "width": 520,
+    "height": 45,
+    "color": "#F0F4FA",
+    "measuredWidth": 196,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 5,
+    "name": "review-body-1",
+    "value": "实现方案、代码修改、验证步骤",
+    "left": 683,
+    "top": 523,
+    "width": 520,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 364,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 5,
+    "name": "review-body-2",
+    "value": "与边界说明。",
+    "left": 683,
+    "top": 565,
+    "width": 520,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 156,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 6,
+    "name": "slide-title",
+    "value": "稳定调用,异常自动处理",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 6,
+    "name": "recovery-condition",
+    "value": "请求条件允许时,平台识别可重试故障,并尝试切换合适账号。",
+    "left": 78,
+    "top": 173,
+    "width": 1128,
+    "height": 57,
+    "color": "#B6C3D1",
+    "measuredWidth": 728,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-01",
+    "value": "01",
+    "left": 78,
+    "top": 299,
+    "width": 320,
+    "height": 99,
+    "color": "#88D6FF",
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-01",
+    "value": "识别异常",
+    "left": 78,
+    "top": 420,
+    "width": 330,
+    "height": 57,
+    "color": "#F0F4FA",
+    "measuredWidth": 144,
+    "measuredHeight": 36
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-01",
+    "value": "判断请求是否可以重试",
+    "left": 78,
+    "top": 488,
+    "width": 340,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 240,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-02",
+    "value": "02",
+    "left": 471,
+    "top": 299,
+    "width": 320,
+    "height": 99,
+    "color": "#88D6FF",
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-02",
+    "value": "切换账号",
+    "left": 471,
+    "top": 420,
+    "width": 330,
+    "height": 57,
+    "color": "#F0F4FA",
+    "measuredWidth": 144,
+    "measuredHeight": 37
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-02",
+    "value": "选择当前可用的账号",
+    "left": 471,
+    "top": 488,
+    "width": 340,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 216,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-03",
+    "value": "03",
+    "left": 864,
+    "top": 299,
+    "width": 320,
+    "height": 99,
+    "color": "#88D6FF",
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-03",
+    "value": "保持设置",
+    "left": 864,
+    "top": 420,
+    "width": 330,
+    "height": 57,
+    "color": "#F0F4FA",
+    "measuredWidth": 144,
+    "measuredHeight": 37
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-03",
+    "value": "继续保留 Astra 推理参数",
+    "left": 864,
+    "top": 488,
+    "width": 340,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 265.57000732421875,
+    "measuredHeight": 24
+  },
+  {
+    "slide": 6,
+    "name": "recovery-monitor",
+    "value": "渠道状态与成功率可查看。",
+    "left": 78,
+    "top": 602,
+    "width": 1040,
+    "height": 40,
+    "color": "#8C9BAE",
+    "measuredWidth": 300,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "slide-title",
+    "value": "高速响应,进度看得见",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 480,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 7,
+    "name": "stream-label",
+    "value": "流式输出",
+    "left": 78,
+    "top": 244,
+    "width": 520,
+    "height": 69,
+    "color": "#88D6FF",
+    "measuredWidth": 176,
+    "measuredHeight": 44
+  },
+  {
+    "slide": 7,
+    "name": "stream-description-1",
+    "value": "开启流式请求,",
+    "left": 78,
+    "top": 331,
+    "width": 555,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 189,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 7,
+    "name": "stream-description-2",
+    "value": "生成内容逐步返回。",
+    "left": 78,
+    "top": 378,
+    "width": 555,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 243,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 7,
+    "name": "latency-label",
+    "value": "响应可查",
+    "left": 685,
+    "top": 244,
+    "width": 518,
+    "height": 69,
+    "color": "#F0F4FA",
+    "measuredWidth": 176,
+    "measuredHeight": 44
+  },
+  {
+    "slide": 7,
+    "name": "latency-description-1",
+    "value": "首 Token 与总耗时,",
+    "left": 685,
+    "top": 331,
+    "width": 518,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 253.69000244140625,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "latency-description-2",
+    "value": "可在用量记录中核对。",
+    "left": 685,
+    "top": 378,
+    "width": 518,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 270,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 7,
+    "name": "stream-closing-1",
+    "value": "使用过程更直观,",
+    "left": 78,
+    "top": 526,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 208,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "stream-closing-2",
+    "value": "响应表现有记录。",
+    "left": 78,
+    "top": 569,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 208,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 8,
+    "name": "slide-title",
+    "value": "多模型接入,调用清楚可查",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 576,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 8,
+    "name": "models-label",
+    "value": "按任务选模型",
+    "left": 78,
+    "top": 275,
+    "width": 552,
+    "height": 69,
+    "color": "#88D6FF",
+    "measuredWidth": 240,
+    "measuredHeight": 40
+  },
+  {
+    "slide": 8,
+    "name": "models-description-1",
+    "value": "通过控制台查看可用模型,",
+    "left": 78,
+    "top": 365,
+    "width": 552,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "models-description-2",
+    "value": "选择适合当前任务的配置。",
+    "left": 78,
+    "top": 412,
+    "width": 552,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "usage-label",
+    "value": "按记录看消耗",
+    "left": 684,
+    "top": 275,
+    "width": 520,
+    "height": 69,
+    "color": "#F0F4FA",
+    "measuredWidth": 240,
+    "measuredHeight": 40
+  },
+  {
+    "slide": 8,
+    "name": "usage-description-1",
+    "value": "模型、Token 和实际扣费,",
+    "left": 684,
+    "top": 365,
+    "width": 520,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 326.70001220703125,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "usage-description-2",
+    "value": "每笔调用都可核对。",
+    "left": 684,
+    "top": 412,
+    "width": 520,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 243,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 8,
+    "name": "key-control",
+    "value": "API Key 的额度、有效期与访问权限可分别设置。",
+    "left": 78,
+    "top": 579,
+    "width": 1128,
+    "height": 54,
+    "color": "#8C9BAE",
+    "measuredWidth": 569.8800048828125,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 9,
+    "name": "slide-title",
+    "value": "接入你正在用的工具",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 432,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 9,
+    "name": "compatibility",
+    "value": "支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。",
+    "left": 78,
+    "top": 173,
+    "width": 1128,
+    "height": 57,
+    "color": "#B6C3D1",
+    "measuredWidth": 735.010009765625,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-01",
+    "value": "01",
+    "left": 78,
+    "top": 288,
+    "width": 140,
+    "height": 75,
+    "color": "#88D6FF",
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-01",
+    "value": "填写接入地址",
+    "left": 233,
+    "top": 294,
+    "width": 450,
+    "height": 62,
+    "color": "#F0F4FA",
+    "measuredWidth": 204,
+    "measuredHeight": 34
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-01",
+    "value": "复制控制台提供的 Base URL",
+    "left": 704,
+    "top": 297,
+    "width": 500,
+    "height": 54,
+    "color": "#B6C3D1",
+    "measuredWidth": 317.8699951171875,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-02",
+    "value": "02",
+    "left": 78,
+    "top": 407,
+    "width": 140,
+    "height": 75,
+    "color": "#88D6FF",
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-02",
+    "value": "配置 API Key",
+    "left": 233,
+    "top": 413,
+    "width": 450,
+    "height": 62,
+    "color": "#F0F4FA",
+    "measuredWidth": 210.0399932861328,
+    "measuredHeight": 32
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-02",
+    "value": "创建密钥,并选择所需的分组与额度",
+    "left": 704,
+    "top": 416,
+    "width": 500,
+    "height": 54,
+    "color": "#B6C3D1",
+    "measuredWidth": 400,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-03",
+    "value": "03",
+    "left": 78,
+    "top": 526,
+    "width": 140,
+    "height": 75,
+    "color": "#88D6FF",
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-03",
+    "value": "选择 Astra",
+    "left": 233,
+    "top": 532,
+    "width": 450,
+    "height": 62,
+    "color": "#F0F4FA",
+    "measuredWidth": 168.61000061035156,
+    "measuredHeight": 34
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-03",
+    "value": "按控制台模型名称配置,开始调用",
+    "left": 704,
+    "top": 535,
+    "width": 500,
+    "height": 54,
+    "color": "#B6C3D1",
+    "measuredWidth": 375,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 10,
+    "name": "closing-brand",
+    "value": "聚合AI",
+    "left": 76,
+    "top": 164,
+    "width": 650,
+    "height": 116,
+    "color": "#F0F4FA",
+    "measuredWidth": 259.3399963378906,
+    "measuredHeight": 83
+  },
+  {
+    "slide": 10,
+    "name": "closing-positioning",
+    "value": "Astra 主推,多模型聚合",
+    "left": 80,
+    "top": 302,
+    "width": 910,
+    "height": 74,
+    "color": "#F0F4FA",
+    "measuredWidth": 430.7799987792969,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 10,
+    "name": "closing-promise",
+    "value": "不降智,稳定,高速",
+    "left": 80,
+    "top": 430,
+    "width": 850,
+    "height": 60,
+    "color": "#88D6FF",
+    "measuredWidth": 288,
+    "measuredHeight": 33
+  },
+  {
+    "slide": 10,
+    "name": "closing-cta",
+    "value": "创建 API Key,连接你的常用工具。",
+    "left": 80,
+    "top": 584,
+    "width": 1060,
+    "height": 51,
+    "color": "#B6C3D1",
+    "measuredWidth": 429.79998779296875,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 2,
+    "name": "folio-2",
+    "value": "2",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 3,
+    "name": "folio-3",
+    "value": "3",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 4,
+    "name": "folio-4",
+    "value": "4",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 5,
+    "name": "folio-5",
+    "value": "5",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 6,
+    "name": "folio-6",
+    "value": "6",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 7,
+    "name": "folio-7",
+    "value": "7",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 8,
+    "name": "folio-8",
+    "value": "8",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 9,
+    "name": "folio-9",
+    "value": "9",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  }
+]

+ 1058 - 0
.codex-artifacts/juheai-astra-20260915/text-metrics-初稿.json

@@ -0,0 +1,1058 @@
+[
+  {
+    "slide": 1,
+    "name": "brand",
+    "value": "聚合AI",
+    "left": 76,
+    "top": 164,
+    "width": 650,
+    "height": 120,
+    "color": "#F0F4FA",
+    "measuredWidth": 271.69000244140625,
+    "measuredHeight": 87
+  },
+  {
+    "slide": 1,
+    "name": "featured-model",
+    "value": "Astra 主推模型",
+    "left": 80,
+    "top": 306,
+    "width": 540,
+    "height": 80,
+    "color": "#F0F4FA",
+    "measuredWidth": 270.7799987792969,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 1,
+    "name": "brand-promise",
+    "value": "不降智,稳定,高速",
+    "left": 80,
+    "top": 440,
+    "width": 550,
+    "height": 55,
+    "color": "#B6C3D1",
+    "measuredWidth": 270,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 1,
+    "name": "platform-value",
+    "value": "多模型选择,统一接入",
+    "left": 80,
+    "top": 596,
+    "width": 540,
+    "height": 44,
+    "color": "#88D6FF",
+    "measuredWidth": 240,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "folio-2",
+    "value": "2",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 2,
+    "name": "slide-title",
+    "value": "多模型,一个入口",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 384,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 2,
+    "name": "platform-explanation",
+    "value": "模型接入、API Key、调用记录与费用管理,集中在聚合AI。",
+    "left": 78,
+    "top": 174,
+    "width": 1120,
+    "height": 56,
+    "color": "#B6C3D1",
+    "measuredWidth": 692.1199951171875,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 2,
+    "name": "featured-model-label",
+    "value": "本站主推",
+    "left": 80,
+    "top": 316,
+    "width": 480,
+    "height": 42,
+    "color": "#88D6FF",
+    "measuredWidth": 96,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "astra-word",
+    "value": "Astra",
+    "left": 76,
+    "top": 354,
+    "width": 510,
+    "height": 112,
+    "color": "#F0F4FA",
+    "measuredWidth": 234.17999267578125,
+    "measuredHeight": 68
+  },
+  {
+    "slide": 2,
+    "name": "protocol-label",
+    "value": "支持多种接入协议",
+    "left": 682,
+    "top": 282,
+    "width": 510,
+    "height": 43,
+    "color": "#8C9BAE",
+    "measuredWidth": 192,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 2,
+    "name": "protocol-openai",
+    "value": "OpenAI 兼容",
+    "left": 682,
+    "top": 342,
+    "width": 510,
+    "height": 53,
+    "color": "#F0F4FA",
+    "measuredWidth": 201.63999938964844,
+    "measuredHeight": 35
+  },
+  {
+    "slide": 2,
+    "name": "protocol-anthropic",
+    "value": "Anthropic Messages",
+    "left": 682,
+    "top": 412,
+    "width": 510,
+    "height": 53,
+    "color": "#F0F4FA",
+    "measuredWidth": 330.0199890136719,
+    "measuredHeight": 36
+  },
+  {
+    "slide": 2,
+    "name": "protocol-gemini",
+    "value": "Gemini 原生",
+    "left": 682,
+    "top": 482,
+    "width": 510,
+    "height": 53,
+    "color": "#F0F4FA",
+    "measuredWidth": 193.5399932861328,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 2,
+    "name": "platform-takeaway",
+    "value": "按任务选择模型,沿用熟悉的工具。",
+    "left": 80,
+    "top": 595,
+    "width": 1070,
+    "height": 46,
+    "color": "#B6C3D1",
+    "measuredWidth": 416,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "folio-3",
+    "value": "3",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 3,
+    "name": "model-section-label",
+    "value": "聚合AI 主推模型",
+    "left": 80,
+    "top": 88,
+    "width": 730,
+    "height": 50,
+    "color": "#88D6FF",
+    "measuredWidth": 204.22000122070312,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 3,
+    "name": "astra-hero",
+    "value": "ASTRA",
+    "left": 72,
+    "top": 178,
+    "width": 1128,
+    "height": 181,
+    "color": "#F0F4FA",
+    "measuredWidth": 466.3699951171875,
+    "measuredHeight": 106
+  },
+  {
+    "slide": 3,
+    "name": "astra-positioning",
+    "value": "把 Astra 接入你的工作流",
+    "left": 80,
+    "top": 367,
+    "width": 740,
+    "height": 66,
+    "color": "#F0F4FA",
+    "measuredWidth": 398.3599853515625,
+    "measuredHeight": 35
+  },
+  {
+    "slide": 3,
+    "name": "astra-settings",
+    "value": "按所选模型与推理设置发起调用。",
+    "left": 80,
+    "top": 445,
+    "width": 760,
+    "height": 55,
+    "color": "#B6C3D1",
+    "measuredWidth": 390,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-coding",
+    "value": "编码协作",
+    "left": 80,
+    "top": 586,
+    "width": 218,
+    "height": 44,
+    "color": "#88D6FF",
+    "measuredWidth": 104,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-analysis",
+    "value": "复杂分析",
+    "left": 303,
+    "top": 586,
+    "width": 218,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 104,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 3,
+    "name": "task-agent",
+    "value": "Agent 任务",
+    "left": 526,
+    "top": 586,
+    "width": 300,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 135.0800018310547,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 4,
+    "name": "folio-4",
+    "value": "4",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 4,
+    "name": "slide-title",
+    "value": "不降智,保留 Astra 推理设置",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 636.3300170898438,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 4,
+    "name": "preserve-model",
+    "value": "Astra 按设定调用",
+    "left": 76,
+    "top": 256,
+    "width": 630,
+    "height": 95,
+    "color": "#F0F4FA",
+    "measuredWidth": 445.70001220703125,
+    "measuredHeight": 43
+  },
+  {
+    "slide": 4,
+    "name": "preserve-reasoning",
+    "value": "保留推理设置",
+    "left": 76,
+    "top": 366,
+    "width": 630,
+    "height": 95,
+    "color": "#88D6FF",
+    "measuredWidth": 336,
+    "measuredHeight": 55
+  },
+  {
+    "slide": 4,
+    "name": "settings-body-1",
+    "value": "Astra 请求重试或故障切换时,",
+    "left": 739,
+    "top": 263,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 371.7799987792969,
+    "measuredHeight": 21
+  },
+  {
+    "slide": 4,
+    "name": "settings-body-2",
+    "value": "继续保留指定推理设置。",
+    "left": 739,
+    "top": 308,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 297,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 4,
+    "name": "mode-rejected-1",
+    "value": "推理设置不受支持时,",
+    "left": 739,
+    "top": 412,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 270,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 4,
+    "name": "mode-rejected-2",
+    "value": "明确提示原因。",
+    "left": 739,
+    "top": 457,
+    "width": 469,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 189,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "folio-5",
+    "value": "5",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 5,
+    "name": "slide-title",
+    "value": "Astra 工作流示例",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 382.0299987792969,
+    "measuredHeight": 38
+  },
+  {
+    "slide": 5,
+    "name": "sample-task-line-1",
+    "value": "为已有项目增加登录能力",
+    "left": 76,
+    "top": 229,
+    "width": 1128,
+    "height": 77,
+    "color": "#F0F4FA",
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 5,
+    "name": "sample-task-line-2",
+    "value": "兼顾权限、异常处理与验证",
+    "left": 76,
+    "top": 313,
+    "width": 1128,
+    "height": 77,
+    "color": "#88D6FF",
+    "measuredWidth": 576,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 5,
+    "name": "context-label",
+    "value": "给模型的上下文",
+    "left": 78,
+    "top": 466,
+    "width": 550,
+    "height": 45,
+    "color": "#F0F4FA",
+    "measuredWidth": 196,
+    "measuredHeight": 29
+  },
+  {
+    "slide": 5,
+    "name": "context-body-1",
+    "value": "现有代码、技术栈、约束",
+    "left": 78,
+    "top": 523,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 286,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "context-body-2",
+    "value": "与验收要求。",
+    "left": 78,
+    "top": 565,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 156,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 5,
+    "name": "review-label",
+    "value": "你要检查的结果",
+    "left": 683,
+    "top": 466,
+    "width": 520,
+    "height": 45,
+    "color": "#F0F4FA",
+    "measuredWidth": 196,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 5,
+    "name": "review-body-1",
+    "value": "实现方案、代码修改、验证步骤",
+    "left": 683,
+    "top": 523,
+    "width": 520,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 364,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 5,
+    "name": "review-body-2",
+    "value": "与边界说明。",
+    "left": 683,
+    "top": 565,
+    "width": 520,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 156,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 6,
+    "name": "folio-6",
+    "value": "6",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 6,
+    "name": "slide-title",
+    "value": "稳定调用,异常自动处理",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 528,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 6,
+    "name": "recovery-condition",
+    "value": "请求条件允许时,平台识别可重试故障,并尝试切换合适账号。",
+    "left": 78,
+    "top": 173,
+    "width": 1128,
+    "height": 57,
+    "color": "#B6C3D1",
+    "measuredWidth": 728,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-01",
+    "value": "01",
+    "left": 78,
+    "top": 299,
+    "width": 320,
+    "height": 99,
+    "color": "#88D6FF",
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-01",
+    "value": "识别异常",
+    "left": 78,
+    "top": 420,
+    "width": 330,
+    "height": 57,
+    "color": "#F0F4FA",
+    "measuredWidth": 144,
+    "measuredHeight": 36
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-01",
+    "value": "判断请求是否可以重试",
+    "left": 78,
+    "top": 488,
+    "width": 340,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 240,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-02",
+    "value": "02",
+    "left": 471,
+    "top": 299,
+    "width": 320,
+    "height": 99,
+    "color": "#88D6FF",
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-02",
+    "value": "切换账号",
+    "left": 471,
+    "top": 420,
+    "width": 330,
+    "height": 57,
+    "color": "#F0F4FA",
+    "measuredWidth": 144,
+    "measuredHeight": 37
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-02",
+    "value": "选择当前可用的账号",
+    "left": 471,
+    "top": 488,
+    "width": 340,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 216,
+    "measuredHeight": 25
+  },
+  {
+    "slide": 6,
+    "name": "recovery-number-03",
+    "value": "03",
+    "left": 864,
+    "top": 299,
+    "width": 320,
+    "height": 99,
+    "color": "#88D6FF",
+    "measuredWidth": 89.13999938964844,
+    "measuredHeight": 60
+  },
+  {
+    "slide": 6,
+    "name": "recovery-label-03",
+    "value": "保持设置",
+    "left": 864,
+    "top": 420,
+    "width": 330,
+    "height": 57,
+    "color": "#F0F4FA",
+    "measuredWidth": 144,
+    "measuredHeight": 37
+  },
+  {
+    "slide": 6,
+    "name": "recovery-detail-03",
+    "value": "继续保留 Astra 推理参数",
+    "left": 864,
+    "top": 488,
+    "width": 340,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 265.57000732421875,
+    "measuredHeight": 24
+  },
+  {
+    "slide": 6,
+    "name": "recovery-monitor",
+    "value": "渠道状态与成功率可查看。",
+    "left": 78,
+    "top": 602,
+    "width": 1040,
+    "height": 40,
+    "color": "#8C9BAE",
+    "measuredWidth": 300,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "folio-7",
+    "value": "7",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 7,
+    "name": "slide-title",
+    "value": "高速响应,进度看得见",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 480,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 7,
+    "name": "stream-label",
+    "value": "流式输出",
+    "left": 78,
+    "top": 244,
+    "width": 520,
+    "height": 69,
+    "color": "#88D6FF",
+    "measuredWidth": 176,
+    "measuredHeight": 44
+  },
+  {
+    "slide": 7,
+    "name": "stream-description-1",
+    "value": "开启流式请求,",
+    "left": 78,
+    "top": 331,
+    "width": 555,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 189,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 7,
+    "name": "stream-description-2",
+    "value": "生成内容逐步返回。",
+    "left": 78,
+    "top": 378,
+    "width": 555,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 243,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 7,
+    "name": "latency-label",
+    "value": "响应可查",
+    "left": 685,
+    "top": 244,
+    "width": 518,
+    "height": 69,
+    "color": "#F0F4FA",
+    "measuredWidth": 176,
+    "measuredHeight": 44
+  },
+  {
+    "slide": 7,
+    "name": "latency-description-1",
+    "value": "首 Token 与总耗时,",
+    "left": 685,
+    "top": 331,
+    "width": 518,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 253.69000244140625,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "latency-description-2",
+    "value": "可在用量记录中核对。",
+    "left": 685,
+    "top": 378,
+    "width": 518,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 270,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 7,
+    "name": "stream-closing-1",
+    "value": "使用过程更直观,",
+    "left": 78,
+    "top": 526,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 208,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 7,
+    "name": "stream-closing-2",
+    "value": "响应表现有记录。",
+    "left": 78,
+    "top": 569,
+    "width": 550,
+    "height": 44,
+    "color": "#B6C3D1",
+    "measuredWidth": 208,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 8,
+    "name": "folio-8",
+    "value": "8",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 8,
+    "name": "slide-title",
+    "value": "多模型接入,调用清楚可查",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 576,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 8,
+    "name": "models-label",
+    "value": "按任务选模型",
+    "left": 78,
+    "top": 275,
+    "width": 552,
+    "height": 69,
+    "color": "#88D6FF",
+    "measuredWidth": 240,
+    "measuredHeight": 40
+  },
+  {
+    "slide": 8,
+    "name": "models-description-1",
+    "value": "通过控制台查看可用模型,",
+    "left": 78,
+    "top": 365,
+    "width": 552,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "models-description-2",
+    "value": "选择适合当前任务的配置。",
+    "left": 78,
+    "top": 412,
+    "width": 552,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 324,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "usage-label",
+    "value": "按记录看消耗",
+    "left": 684,
+    "top": 275,
+    "width": 520,
+    "height": 69,
+    "color": "#F0F4FA",
+    "measuredWidth": 240,
+    "measuredHeight": 40
+  },
+  {
+    "slide": 8,
+    "name": "usage-description-1",
+    "value": "模型、Token 和实际扣费,",
+    "left": 684,
+    "top": 365,
+    "width": 520,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 326.70001220703125,
+    "measuredHeight": 27
+  },
+  {
+    "slide": 8,
+    "name": "usage-description-2",
+    "value": "每笔调用都可核对。",
+    "left": 684,
+    "top": 412,
+    "width": 520,
+    "height": 49,
+    "color": "#B6C3D1",
+    "measuredWidth": 243,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 8,
+    "name": "key-control",
+    "value": "API Key 的额度、有效期与访问权限可分别设置。",
+    "left": 78,
+    "top": 579,
+    "width": 1128,
+    "height": 54,
+    "color": "#8C9BAE",
+    "measuredWidth": 569.8800048828125,
+    "measuredHeight": 28
+  },
+  {
+    "slide": 9,
+    "name": "folio-9",
+    "value": "9",
+    "left": 1180,
+    "top": 653,
+    "width": 28,
+    "height": 25,
+    "color": "#8C9BAE",
+    "measuredWidth": 9.970000267028809,
+    "measuredHeight": 14
+  },
+  {
+    "slide": 9,
+    "name": "slide-title",
+    "value": "接入你正在用的工具",
+    "left": 76,
+    "top": 72,
+    "width": 1128,
+    "height": 84,
+    "color": "#F0F4FA",
+    "measuredWidth": 432,
+    "measuredHeight": 48
+  },
+  {
+    "slide": 9,
+    "name": "compatibility",
+    "value": "支持自定义服务地址的客户端或 SDK,可沿用熟悉的工作方式。",
+    "left": 78,
+    "top": 173,
+    "width": 1128,
+    "height": 57,
+    "color": "#B6C3D1",
+    "measuredWidth": 735.010009765625,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-01",
+    "value": "01",
+    "left": 78,
+    "top": 288,
+    "width": 140,
+    "height": 75,
+    "color": "#88D6FF",
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-01",
+    "value": "填写接入地址",
+    "left": 233,
+    "top": 294,
+    "width": 450,
+    "height": 62,
+    "color": "#F0F4FA",
+    "measuredWidth": 204,
+    "measuredHeight": 34
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-01",
+    "value": "复制控制台提供的 Base URL",
+    "left": 704,
+    "top": 297,
+    "width": 500,
+    "height": 54,
+    "color": "#B6C3D1",
+    "measuredWidth": 317.8699951171875,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-02",
+    "value": "02",
+    "left": 78,
+    "top": 407,
+    "width": 140,
+    "height": 75,
+    "color": "#88D6FF",
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-02",
+    "value": "配置 API Key",
+    "left": 233,
+    "top": 413,
+    "width": 450,
+    "height": 62,
+    "color": "#F0F4FA",
+    "measuredWidth": 210.0399932861328,
+    "measuredHeight": 32
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-02",
+    "value": "创建密钥,并选择所需的分组与额度",
+    "left": 704,
+    "top": 416,
+    "width": 500,
+    "height": 54,
+    "color": "#B6C3D1",
+    "measuredWidth": 400,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 9,
+    "name": "onboard-number-03",
+    "value": "03",
+    "left": 78,
+    "top": 526,
+    "width": 140,
+    "height": 75,
+    "color": "#88D6FF",
+    "measuredWidth": 60.9900016784668,
+    "measuredHeight": 42
+  },
+  {
+    "slide": 9,
+    "name": "onboard-label-03",
+    "value": "选择 Astra",
+    "left": 233,
+    "top": 532,
+    "width": 450,
+    "height": 62,
+    "color": "#F0F4FA",
+    "measuredWidth": 168.61000061035156,
+    "measuredHeight": 34
+  },
+  {
+    "slide": 9,
+    "name": "onboard-detail-03",
+    "value": "按控制台模型名称配置,开始调用",
+    "left": 704,
+    "top": 535,
+    "width": 500,
+    "height": 54,
+    "color": "#B6C3D1",
+    "measuredWidth": 375,
+    "measuredHeight": 26
+  },
+  {
+    "slide": 10,
+    "name": "closing-brand",
+    "value": "聚合AI",
+    "left": 76,
+    "top": 164,
+    "width": 650,
+    "height": 116,
+    "color": "#F0F4FA",
+    "measuredWidth": 259.3399963378906,
+    "measuredHeight": 83
+  },
+  {
+    "slide": 10,
+    "name": "closing-positioning",
+    "value": "Astra 主推,多模型聚合",
+    "left": 80,
+    "top": 302,
+    "width": 910,
+    "height": 74,
+    "color": "#F0F4FA",
+    "measuredWidth": 430.7799987792969,
+    "measuredHeight": 31
+  },
+  {
+    "slide": 10,
+    "name": "closing-promise",
+    "value": "不降智,稳定,高速",
+    "left": 80,
+    "top": 430,
+    "width": 850,
+    "height": 60,
+    "color": "#88D6FF",
+    "measuredWidth": 288,
+    "measuredHeight": 33
+  },
+  {
+    "slide": 10,
+    "name": "closing-cta",
+    "value": "创建 API Key,连接你的常用工具。",
+    "left": 80,
+    "top": 584,
+    "width": 1060,
+    "height": 51,
+    "color": "#B6C3D1",
+    "measuredWidth": 429.79998779296875,
+    "measuredHeight": 27
+  }
+]

+ 132 - 0
.codex-artifacts/juheai-astra-20260915/validation-v1.json

@@ -0,0 +1,132 @@
+{
+  "schemaVersion": "presentation-finalization.v1",
+  "finalSha256": "4f1a5d7624b6d21d3afa077df25f2c4dec4e89a23556256fe8f2e2c907cb04e5",
+  "byteCount": 2760085,
+  "packageIntegrity": {
+    "chart_count": 0,
+    "claim_boundary": "Structural package checks only; no slide text, notes, formulas, chart values, or native PowerPoint execution were inspected.",
+    "finding_count": 0,
+    "findings": [],
+    "notes_parts_skipped": 10,
+    "relationship_part_count": 25,
+    "slide_count": 10,
+    "status": "pass",
+    "exitCode": 0,
+    "findingCount": 0,
+    "warnings": []
+  },
+  "presentationLayout": {
+    "finding_count": 0,
+    "findings": [],
+    "font_policy": {
+      "checked_text_script_count": 109,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 109
+      },
+      "passed": true,
+      "performed": true
+    },
+    "slide_count": 10,
+    "slide_size_in": [
+      13.3333,
+      7.5
+    ],
+    "warning_count": 0,
+    "warnings": [],
+    "exitCode": 0,
+    "findingCount": 0,
+    "fontPolicy": {
+      "checked_text_script_count": 109,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 109
+      },
+      "passed": true,
+      "performed": true
+    }
+  },
+  "fontSelection": {
+    "basis": "design",
+    "approvedFamilies": [
+      "Microsoft YaHei"
+    ],
+    "scriptFonts": {},
+    "referenceSha256": null,
+    "referenceFontsVerifiedInEncodedText": false,
+    "checked_text_script_count": 109,
+    "native_font_rendering_verified": false,
+    "observed_font_families": [
+      "Microsoft YaHei"
+    ],
+    "observed_font_use_counts": {
+      "Microsoft YaHei": 109
+    },
+    "passed": true,
+    "performed": true
+  },
+  "firstPartyImport": {
+    "performed": true,
+    "passed": true,
+    "slideCount": 10,
+    "sha256": "4f1a5d7624b6d21d3afa077df25f2c4dec4e89a23556256fe8f2e2c907cb04e5",
+    "runtimeNodeModules": "C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules",
+    "nodeExecutable": "C:\\Users\\30214\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin\\node.exe"
+  },
+  "nativeTableArithmetic": {
+    "performed": true,
+    "checked_column_count": 0,
+    "checks": [],
+    "claim_boundary": "Displayed-value arithmetic with rounding tolerance; not source-data verification.",
+    "eligible_table_count": 0,
+    "finding_count": 0,
+    "findings": [],
+    "native_table_count": 0,
+    "passed": true,
+    "schema_version": "presentation-native-table-arithmetic.v1",
+    "skipped_tables": [],
+    "slide_count": 10,
+    "warning_count": 0,
+    "warnings": []
+  },
+  "nativeChartTitles": {
+    "performed": true,
+    "checks": [],
+    "finding_count": 0,
+    "findings": [],
+    "native_chart_count": 0,
+    "native_powerpoint_verified": false,
+    "passed": true,
+    "presentation_sha256": "4f1a5d7624b6d21d3afa077df25f2c4dec4e89a23556256fe8f2e2c907cb04e5",
+    "schema_version": "presentation-native-chart-titles.v1",
+    "slide_count": 10,
+    "source_text_emitted": false,
+    "unresolved_linked_title_count": 0
+  },
+  "sourceDerivedPolicyFlags": [
+    "--expected-slide-size-emu",
+    "12192000,6858000",
+    "--validate-bullet-geometry",
+    "--validate-heading-fit",
+    "--cover-role",
+    "none",
+    "--expected-slide-count",
+    "10",
+    "--approved-font-family",
+    "Microsoft YaHei"
+  ],
+  "nativeChartValidation": {
+    "detectedOwnerSlides": [],
+    "detectedChartCount": 0,
+    "targetApplication": "portable",
+    "sourceChartOwnersExplicitlyDeclared": true,
+    "validatorRan": false,
+    "passed": true
+  }
+}

+ 132 - 0
.codex-artifacts/juheai-astra-20260915/validation-交付版.json

@@ -0,0 +1,132 @@
+{
+  "schemaVersion": "presentation-finalization.v1",
+  "finalSha256": "858cece6b34c5c7b5252babbb3110f4d9c355f90dc07b070ccdecad120f25e1f",
+  "byteCount": 2760406,
+  "packageIntegrity": {
+    "chart_count": 0,
+    "claim_boundary": "Structural package checks only; no slide text, notes, formulas, chart values, or native PowerPoint execution were inspected.",
+    "finding_count": 0,
+    "findings": [],
+    "notes_parts_skipped": 10,
+    "relationship_part_count": 25,
+    "slide_count": 10,
+    "status": "pass",
+    "exitCode": 0,
+    "findingCount": 0,
+    "warnings": []
+  },
+  "presentationLayout": {
+    "finding_count": 0,
+    "findings": [],
+    "font_policy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    },
+    "slide_count": 10,
+    "slide_size_in": [
+      13.3333,
+      7.5
+    ],
+    "warning_count": 0,
+    "warnings": [],
+    "exitCode": 0,
+    "findingCount": 0,
+    "fontPolicy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    }
+  },
+  "fontSelection": {
+    "basis": "design",
+    "approvedFamilies": [
+      "Microsoft YaHei"
+    ],
+    "scriptFonts": {},
+    "referenceSha256": null,
+    "referenceFontsVerifiedInEncodedText": false,
+    "checked_text_script_count": 111,
+    "native_font_rendering_verified": false,
+    "observed_font_families": [
+      "Microsoft YaHei"
+    ],
+    "observed_font_use_counts": {
+      "Microsoft YaHei": 111
+    },
+    "passed": true,
+    "performed": true
+  },
+  "firstPartyImport": {
+    "performed": true,
+    "passed": true,
+    "slideCount": 10,
+    "sha256": "858cece6b34c5c7b5252babbb3110f4d9c355f90dc07b070ccdecad120f25e1f",
+    "runtimeNodeModules": "C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules",
+    "nodeExecutable": "C:\\Users\\30214\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin\\node.exe"
+  },
+  "nativeTableArithmetic": {
+    "performed": true,
+    "checked_column_count": 0,
+    "checks": [],
+    "claim_boundary": "Displayed-value arithmetic with rounding tolerance; not source-data verification.",
+    "eligible_table_count": 0,
+    "finding_count": 0,
+    "findings": [],
+    "native_table_count": 0,
+    "passed": true,
+    "schema_version": "presentation-native-table-arithmetic.v1",
+    "skipped_tables": [],
+    "slide_count": 10,
+    "warning_count": 0,
+    "warnings": []
+  },
+  "nativeChartTitles": {
+    "performed": true,
+    "checks": [],
+    "finding_count": 0,
+    "findings": [],
+    "native_chart_count": 0,
+    "native_powerpoint_verified": false,
+    "passed": true,
+    "presentation_sha256": "858cece6b34c5c7b5252babbb3110f4d9c355f90dc07b070ccdecad120f25e1f",
+    "schema_version": "presentation-native-chart-titles.v1",
+    "slide_count": 10,
+    "source_text_emitted": false,
+    "unresolved_linked_title_count": 0
+  },
+  "sourceDerivedPolicyFlags": [
+    "--expected-slide-size-emu",
+    "12192000,6858000",
+    "--validate-bullet-geometry",
+    "--validate-heading-fit",
+    "--cover-role",
+    "none",
+    "--expected-slide-count",
+    "10",
+    "--approved-font-family",
+    "Microsoft YaHei"
+  ],
+  "nativeChartValidation": {
+    "detectedOwnerSlides": [],
+    "detectedChartCount": 0,
+    "targetApplication": "portable",
+    "sourceChartOwnersExplicitlyDeclared": true,
+    "validatorRan": false,
+    "passed": true
+  }
+}

+ 132 - 0
.codex-artifacts/juheai-astra-20260915/validation-初稿.json

@@ -0,0 +1,132 @@
+{
+  "schemaVersion": "presentation-finalization.v1",
+  "finalSha256": "ecbcfa1dae05b0ee173af821dca8c2373e6355072d136b47eb3284d4c0388dcf",
+  "byteCount": 2760475,
+  "packageIntegrity": {
+    "chart_count": 0,
+    "claim_boundary": "Structural package checks only; no slide text, notes, formulas, chart values, or native PowerPoint execution were inspected.",
+    "finding_count": 0,
+    "findings": [],
+    "notes_parts_skipped": 10,
+    "relationship_part_count": 25,
+    "slide_count": 10,
+    "status": "pass",
+    "exitCode": 0,
+    "findingCount": 0,
+    "warnings": []
+  },
+  "presentationLayout": {
+    "finding_count": 0,
+    "findings": [],
+    "font_policy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    },
+    "slide_count": 10,
+    "slide_size_in": [
+      13.3333,
+      7.5
+    ],
+    "warning_count": 0,
+    "warnings": [],
+    "exitCode": 0,
+    "findingCount": 0,
+    "fontPolicy": {
+      "checked_text_script_count": 111,
+      "native_font_rendering_verified": false,
+      "observed_font_families": [
+        "Microsoft YaHei"
+      ],
+      "observed_font_use_counts": {
+        "Microsoft YaHei": 111
+      },
+      "passed": true,
+      "performed": true
+    }
+  },
+  "fontSelection": {
+    "basis": "design",
+    "approvedFamilies": [
+      "Microsoft YaHei"
+    ],
+    "scriptFonts": {},
+    "referenceSha256": null,
+    "referenceFontsVerifiedInEncodedText": false,
+    "checked_text_script_count": 111,
+    "native_font_rendering_verified": false,
+    "observed_font_families": [
+      "Microsoft YaHei"
+    ],
+    "observed_font_use_counts": {
+      "Microsoft YaHei": 111
+    },
+    "passed": true,
+    "performed": true
+  },
+  "firstPartyImport": {
+    "performed": true,
+    "passed": true,
+    "slideCount": 10,
+    "sha256": "ecbcfa1dae05b0ee173af821dca8c2373e6355072d136b47eb3284d4c0388dcf",
+    "runtimeNodeModules": "C:/Users/30214/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules",
+    "nodeExecutable": "C:\\Users\\30214\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin\\node.exe"
+  },
+  "nativeTableArithmetic": {
+    "performed": true,
+    "checked_column_count": 0,
+    "checks": [],
+    "claim_boundary": "Displayed-value arithmetic with rounding tolerance; not source-data verification.",
+    "eligible_table_count": 0,
+    "finding_count": 0,
+    "findings": [],
+    "native_table_count": 0,
+    "passed": true,
+    "schema_version": "presentation-native-table-arithmetic.v1",
+    "skipped_tables": [],
+    "slide_count": 10,
+    "warning_count": 0,
+    "warnings": []
+  },
+  "nativeChartTitles": {
+    "performed": true,
+    "checks": [],
+    "finding_count": 0,
+    "findings": [],
+    "native_chart_count": 0,
+    "native_powerpoint_verified": false,
+    "passed": true,
+    "presentation_sha256": "ecbcfa1dae05b0ee173af821dca8c2373e6355072d136b47eb3284d4c0388dcf",
+    "schema_version": "presentation-native-chart-titles.v1",
+    "slide_count": 10,
+    "source_text_emitted": false,
+    "unresolved_linked_title_count": 0
+  },
+  "sourceDerivedPolicyFlags": [
+    "--expected-slide-size-emu",
+    "12192000,6858000",
+    "--validate-bullet-geometry",
+    "--validate-heading-fit",
+    "--cover-role",
+    "none",
+    "--expected-slide-count",
+    "10",
+    "--approved-font-family",
+    "Microsoft YaHei"
+  ],
+  "nativeChartValidation": {
+    "detectedOwnerSlides": [],
+    "detectedChartCount": 0,
+    "targetApplication": "portable",
+    "sourceChartOwnersExplicitlyDeclared": true,
+    "validatorRan": false,
+    "passed": true
+  }
+}

+ 85 - 0
.dockerignore

@@ -0,0 +1,85 @@
+# =============================================================================
+# Docker Ignore File for Sub2API
+# =============================================================================
+
+# Git
+.git
+.gitignore
+.gitattributes
+
+# Documentation
+*.md
+!deploy/DOCKER.md
+docs/
+# admin-compliance gate (LegalDocumentView.vue) build-time imports
+# docs/legal/*.md?raw into the frontend bundle; keep that subtree in the
+# Docker build context even though docs/ is otherwise excluded.
+!docs/legal/
+!docs/legal/*.md
+
+# IDE
+.idea/
+.vscode/
+*.swp
+*.swo
+
+# OS files
+.DS_Store
+Thumbs.db
+
+# Build artifacts
+dist/
+build/
+
+# Node modules (will be installed in container)
+frontend/node_modules/
+node_modules/
+
+# Go build cache (will be built in container)
+backend/vendor/
+
+# Test files
+*_test.go
+**/*.test.js
+coverage/
+.nyc_output/
+
+# Environment files
+.env
+.env.*
+!.env.example
+
+# 本地闭源插件目录可能包含发布签名私钥,绝不能进入 Docker 构建上下文。
+/plugins/
+
+# Local config
+config.yaml
+config.local.yaml
+
+# Logs
+*.log
+logs/
+
+# Temporary files
+tmp/
+temp/
+*.tmp
+
+# Deploy files (not needed in image)
+deploy/install.sh
+deploy/sub2api.service
+deploy/sub2api-sudoers
+deploy/data/
+deploy/postgres_data/
+deploy/redis_data/
+
+# GoReleaser
+.goreleaser.yaml
+
+# GitHub
+.github/
+
+# Claude files
+.claude/
+issues/
+CLAUDE.md

+ 22 - 0
.gitattributes

@@ -0,0 +1,22 @@
+# 确保所有 SQL 迁移文件使用 LF 换行符
+backend/migrations/*.sql text eol=lf
+
+# Go 源代码文件
+*.go text eol=lf
+
+# 前端 源代码文件
+*.ts text eol=lf
+*.tsx text eol=lf
+*.js text eol=lf
+*.jsx text eol=lf
+*.vue text eol=lf
+
+# Shell 脚本
+*.sh text eol=lf
+
+# YAML/YML 配置文件
+*.yaml text eol=lf
+*.yml text eol=lf
+
+# Dockerfile
+Dockerfile text eol=lf

+ 44 - 0
.github/audit-exceptions.yml

@@ -0,0 +1,44 @@
+version: 1
+exceptions:
+  - package: xlsx
+    advisory: "GHSA-4r6h-8v6p-xvw6"
+    severity: high
+    reason: "Admin export only; switched to dynamic import to reduce exposure (CVE-2023-30533)"
+    mitigation: "Load only on export; restrict export permissions and data scope"
+    expires_on: "2026-10-06"
+    owner: "security@your-domain"
+  - package: xlsx
+    advisory: "GHSA-5pgg-2g8v-p4x9"
+    severity: high
+    reason: "Admin export only; switched to dynamic import to reduce exposure (CVE-2024-22363)"
+    mitigation: "Load only on export; restrict export permissions and data scope"
+    expires_on: "2026-10-06"
+    owner: "security@your-domain"
+  - package: lodash
+    advisory: "GHSA-r5fr-rjxr-66jc"
+    severity: high
+    reason: "lodash _.template not used with untrusted input; only internal admin UI templates"
+    mitigation: "No user-controlled template strings; plan to migrate to lodash-es tree-shaken imports"
+    expires_on: "2026-07-02"
+    owner: "security@your-domain"
+  - package: lodash-es
+    advisory: "GHSA-r5fr-rjxr-66jc"
+    severity: high
+    reason: "lodash-es _.template not used with untrusted input; only internal admin UI templates"
+    mitigation: "No user-controlled template strings; plan to migrate to native JS alternatives"
+    expires_on: "2026-07-02"
+    owner: "security@your-domain"
+  - package: axios
+    advisory: "GHSA-3p68-rc4w-qgx5"
+    severity: critical
+    reason: "NO_PROXY bypass not exploitable; all API calls go to known endpoints via server-side proxy"
+    mitigation: "Proxy configuration not user-controlled; upgrade when axios releases fix"
+    expires_on: "2026-07-10"
+    owner: "security@your-domain"
+  - package: nanoid
+    advisory: "GHSA-2v37-7h3g-55p8"
+    severity: high
+    reason: "Custom generator with size=0 not used; all nanoid calls use default size or positive values"
+    mitigation: "No zero-size custom generators in codebase; upgrade when nanoid releases fix"
+    expires_on: "2026-10-13"
+    owner: "security@your-domain"

+ 111 - 0
.github/workflows/backend-ci.yml

@@ -0,0 +1,111 @@
+name: CI
+
+on:
+  push:
+  pull_request:
+
+permissions:
+  contents: read
+
+jobs:
+  shell:
+    runs-on: macos-15
+    steps:
+      - uses: actions/checkout@v6
+      - name: Check deployment scripts
+        run: |
+          /bin/bash -n deploy/apple-container.sh
+          /bin/bash deploy/tests/apple-container-test.sh
+          /bin/sh deploy/tests/docker-compose-security-test.sh
+          /bin/sh deploy/tests/docker-compose-gateway-env-test.sh
+          /bin/sh deploy/tests/docker-runtime-resources-test.sh
+          /bin/sh deploy/test-caddyfile-cache.sh
+
+  test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v6
+      - uses: actions/setup-go@v6
+        with:
+          go-version-file: backend/go.mod
+          check-latest: false
+          cache: true
+          cache-dependency-path: backend/go.sum
+      - name: Verify Go version
+        run: |
+          go version | grep -q 'go1.27.0'
+      - name: Unit tests
+        working-directory: backend
+        run: make test-unit
+      - name: Integration tests
+        working-directory: backend
+        run: make test-integration
+
+  protection-database:
+    runs-on: ubuntu-latest
+    timeout-minutes: 20
+    services:
+      postgres:
+        image: postgres:16
+        env:
+          POSTGRES_USER: protection_review
+          POSTGRES_PASSWORD: local-ci-only
+          POSTGRES_DB: relay_protection_test
+        ports: ['5432:5432']
+        options: >-
+          --health-cmd 'pg_isready -U protection_review -d relay_protection_test'
+          --health-interval 5s --health-timeout 5s --health-retries 20
+    env:
+      REQUIRE_DATABASE_TESTS: '1'
+      PROTECTION_TEST_DSN: postgres://protection_review:local-ci-only@127.0.0.1:5432/relay_protection_test?sslmode=disable
+      USER_CLEANUP_TEST_DSN: postgres://protection_review:local-ci-only@127.0.0.1:5432/relay_protection_test?sslmode=disable
+      INTELLIGENT_TESTS_TEST_DSN: postgres://protection_review:local-ci-only@127.0.0.1:5432/relay_protection_test?sslmode=disable
+    steps:
+      - uses: actions/checkout@v6
+      - uses: actions/setup-go@v6
+        with:
+          go-version-file: backend/go.mod
+          cache-dependency-path: backend/go.sum
+      - name: Run protection, hierarchy, cleanup and queue database tests
+        working-directory: backend
+        run: go test -tags=protectionintegration ./internal/repository ./internal/service -run 'Test(AccountProtection|AccountTraffic|GroupDetailStats|ProtectionTransitionDatabase|ProtectedProxy|RateLimitObservation|UserHierarchy|UserResource|UserCleanup|Intelligent)' -count=1 -timeout=10m
+
+  frontend:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v6
+      - name: Setup pnpm
+        uses: pnpm/action-setup@v6
+        with:
+          version: 9
+      - name: Setup Node.js
+        uses: actions/setup-node@v6
+        with:
+          node-version: '20'
+          cache: 'pnpm'
+          cache-dependency-path: frontend/pnpm-lock.yaml
+      - name: Install frontend dependencies
+        working-directory: frontend
+        run: pnpm install --frozen-lockfile
+      - name: Frontend typecheck and critical vitest
+        run: make test-frontend
+
+  golangci-lint:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v6
+      - uses: actions/setup-go@v6
+        with:
+          go-version-file: backend/go.mod
+          check-latest: false
+          cache: true
+          cache-dependency-path: backend/go.sum
+      - name: Verify Go version
+        run: |
+          go version | grep -q 'go1.27.0'
+      - name: golangci-lint
+        uses: golangci/golangci-lint-action@v9
+        with:
+          version: v2.13
+          args: --timeout=30m
+          working-directory: backend

+ 69 - 0
.github/workflows/cla.yml

@@ -0,0 +1,69 @@
+name: "CLA Assistant"
+
+on:
+  issue_comment:
+    types: [created]
+  pull_request_target:
+    types: [opened, reopened, closed, synchronize]
+
+permissions:
+  actions: write
+  contents: write
+  pull-requests: write
+  statuses: write
+
+env:
+  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
+
+jobs:
+  cla-check:
+    if: |
+      github.repository == 'Wei-Shaw/sub2api' &&
+      (
+        github.event_name == 'issue_comment' ||
+        (github.event_name == 'pull_request_target' && github.event.action != 'closed')
+      )
+    runs-on: ubuntu-latest
+    steps:
+      - name: "CLA Assistant"
+        if: |
+          (github.event.comment.body == 'recheck' ||
+           github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') ||
+          github.event_name == 'pull_request_target'
+        uses: contributor-assistant/github-action@v2.6.1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          path-to-signatures: "cla.json"
+          path-to-document: "https://github.com/Wei-Shaw/sub2api/blob/main/CLA.md"
+          branch: "cla-signatures"
+          allowlist: "dependabot[bot],renovate[bot],bot*"
+          lock-pullrequest-aftermerge: false
+          custom-notsigned-prcomment: |
+            Thank you for your contribution! Before we can merge this PR, we need $you to sign our [Contributor License Agreement (CLA)](https://github.com/Wei-Shaw/sub2api/blob/main/CLA.md).
+
+            **To sign**, please reply with the following comment:
+
+            > I have read the CLA Document and I hereby sign the CLA
+
+            You only need to sign once — it will be valid for all your future contributions to this project.
+          custom-pr-sign-comment: "I have read the CLA Document and I hereby sign the CLA"
+          custom-allsigned-prcomment: "All contributors have signed the CLA. ✅"
+
+  cla-lock:
+    if: |
+      github.repository == 'Wei-Shaw/sub2api' &&
+      github.event_name == 'pull_request_target' &&
+      github.event.action == 'closed' &&
+      github.event.pull_request.merged == true
+    runs-on: ubuntu-latest
+    steps:
+      - name: "Lock merged PR"
+        uses: contributor-assistant/github-action@v2.6.1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          path-to-signatures: "cla.json"
+          path-to-document: "https://github.com/Wei-Shaw/sub2api/blob/main/CLA.md"
+          branch: "cla-signatures"
+          lock-pullrequest-aftermerge: true

+ 306 - 0
.github/workflows/release.yml

@@ -0,0 +1,306 @@
+name: Release
+
+on:
+  push:
+    tags:
+      - 'v*'
+  workflow_dispatch:
+    inputs:
+      tag:
+        description: 'Tag to release (e.g., v1.0.0)'
+        required: true
+        type: string
+      simple_release:
+        description: 'Simple release: only x86_64 GHCR image, skip other artifacts'
+        required: false
+        type: boolean
+        default: false
+
+# 环境变量:合并 workflow_dispatch 输入和 repository variable
+# tag push 触发时读取 vars.SIMPLE_RELEASE,workflow_dispatch 时使用输入参数
+env:
+  SIMPLE_RELEASE: ${{ github.event.inputs.simple_release == 'true' || vars.SIMPLE_RELEASE == 'true' }}
+
+permissions:
+  contents: write
+  packages: write
+
+jobs:
+  # Update VERSION file with tag version
+  update-version:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v6
+
+      - name: Update VERSION file
+        run: |
+          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
+            VERSION=${{ github.event.inputs.tag }}
+            VERSION=${VERSION#v}
+          else
+            VERSION=${GITHUB_REF#refs/tags/v}
+          fi
+          echo "$VERSION" > backend/cmd/server/VERSION
+          echo "Updated VERSION file to: $VERSION"
+
+      - name: Upload VERSION artifact
+        uses: actions/upload-artifact@v7
+        with:
+          name: version-file
+          path: backend/cmd/server/VERSION
+          retention-days: 1
+
+  build-frontend:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v6
+
+      - name: Setup pnpm
+        uses: pnpm/action-setup@v6
+        with:
+          version: 9
+
+      - name: Setup Node.js
+        uses: actions/setup-node@v6
+        with:
+          node-version: '20'
+          cache: 'pnpm'
+          cache-dependency-path: frontend/pnpm-lock.yaml
+
+      - name: Install dependencies
+        run: pnpm install --frozen-lockfile
+        working-directory: frontend
+
+      - name: Build frontend
+        run: pnpm run build
+        working-directory: frontend
+
+      - name: Upload frontend artifact
+        uses: actions/upload-artifact@v7
+        with:
+          name: frontend-dist
+          path: backend/internal/web/dist/
+          retention-days: 1
+
+  release:
+    needs: [update-version, build-frontend]
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v6
+        with:
+          fetch-depth: 0
+          ref: ${{ github.event.inputs.tag || github.ref }}
+
+      - name: Download VERSION artifact
+        uses: actions/download-artifact@v8
+        with:
+          name: version-file
+          path: backend/cmd/server/
+
+      - name: Download frontend artifact
+        uses: actions/download-artifact@v8
+        with:
+          name: frontend-dist
+          path: backend/internal/web/dist/
+
+      - name: Setup Go
+        uses: actions/setup-go@v6
+        with:
+          go-version-file: backend/go.mod
+          check-latest: false
+          cache-dependency-path: backend/go.sum
+
+      - name: Verify Go version
+        run: |
+          go version | grep -q 'go1.27.0'
+
+      # Docker setup for GoReleaser
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v3
+
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v3
+
+      - name: Login to DockerHub
+        if: ${{ env.DOCKERHUB_USERNAME != '' }}
+        uses: docker/login-action@v3
+        env:
+          DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v3
+        with:
+          registry: ghcr.io
+          username: ${{ github.repository_owner }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Fetch tags with annotations
+        run: |
+          # 确保获取完整的 annotated tag 信息
+          git fetch --tags --force
+
+      - name: Get tag message
+        id: tag_message
+        run: |
+          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
+            TAG_NAME=${{ github.event.inputs.tag }}
+          else
+            TAG_NAME=${GITHUB_REF#refs/tags/}
+          fi
+          echo "Processing tag: $TAG_NAME"
+
+          # 获取完整的 tag message(跳过第一行标题)
+          TAG_MESSAGE=$(git tag -l --format='%(contents:body)' "$TAG_NAME")
+
+          # 调试输出
+          echo "Tag message length: ${#TAG_MESSAGE}"
+          echo "Tag message preview:"
+          echo "$TAG_MESSAGE" | head -10
+
+          # 使用 EOF 分隔符处理多行内容
+          echo "message<<EOF" >> $GITHUB_OUTPUT
+          echo "$TAG_MESSAGE" >> $GITHUB_OUTPUT
+          echo "EOF" >> $GITHUB_OUTPUT
+
+      - name: Set lowercase owner for GHCR
+        id: lowercase
+        run: echo "owner=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
+
+      - name: Run GoReleaser
+        uses: goreleaser/goreleaser-action@v7
+        with:
+          version: '~> v2'
+          args: release --clean --skip=validate ${{ env.SIMPLE_RELEASE == 'true' && '--config=.goreleaser.simple.yaml' || '' }}
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          TAG_MESSAGE: ${{ steps.tag_message.outputs.message }}
+          GITHUB_REPO_OWNER: ${{ github.repository_owner }}
+          GITHUB_REPO_OWNER_LOWER: ${{ steps.lowercase.outputs.owner }}
+          GITHUB_REPO_NAME: ${{ github.event.repository.name }}
+          DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME || 'skip' }}
+
+      # Update DockerHub description
+      - name: Update DockerHub description
+        if: ${{ env.SIMPLE_RELEASE != 'true' && env.DOCKERHUB_USERNAME != '' }}
+        uses: peter-evans/dockerhub-description@v5
+        env:
+          DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+          repository: ${{ secrets.DOCKERHUB_USERNAME }}/sub2api
+          short-description: "Sub2API - AI API Gateway Platform"
+          readme-filepath: ./deploy/DOCKER.md
+
+      # Send Telegram notification
+      - name: Send Telegram Notification
+        if: ${{ env.SIMPLE_RELEASE != 'true' }}
+        env:
+          TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
+          TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
+          DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
+        continue-on-error: true
+        run: |
+          # 检查必要的环境变量
+          if [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ]; then
+            echo "Telegram credentials not configured, skipping notification"
+            exit 0
+          fi
+
+          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
+            TAG_NAME=${{ github.event.inputs.tag }}
+          else
+            TAG_NAME=${GITHUB_REF#refs/tags/}
+          fi
+          VERSION=${TAG_NAME#v}
+          REPO="${{ github.repository }}"
+          GHCR_IMAGE="ghcr.io/${REPO,,}"  # ${,,} converts to lowercase
+
+          # 获取 tag message 内容并转义 Markdown 特殊字符
+          TAG_MESSAGE='${{ steps.tag_message.outputs.message }}'
+          TAG_MESSAGE=$(echo "$TAG_MESSAGE" | sed 's/\([_*`\[]\)/\\\1/g')
+
+          # 限制消息长度(Telegram 消息限制 4096 字符,预留空间给头尾固定内容)
+          if [ ${#TAG_MESSAGE} -gt 3500 ]; then
+            TAG_MESSAGE="${TAG_MESSAGE:0:3500}..."
+          fi
+
+          # 构建消息内容
+          MESSAGE="🚀 *Sub2API 新版本发布!*"$'\n'$'\n'
+          MESSAGE+="📦 版本号: \`${VERSION}\`"$'\n'$'\n'
+
+          # 添加更新内容
+          if [ -n "$TAG_MESSAGE" ]; then
+            MESSAGE+="${TAG_MESSAGE}"$'\n'$'\n'
+          fi
+
+          MESSAGE+="🐳 *Docker 部署:*"$'\n'
+          MESSAGE+="\`\`\`bash"$'\n'
+          # 根据是否配置 DockerHub 动态生成
+          if [ -n "$DOCKERHUB_USERNAME" ]; then
+            DOCKER_IMAGE="${DOCKERHUB_USERNAME}/sub2api"
+            MESSAGE+="# Docker Hub"$'\n'
+            MESSAGE+="docker pull ${DOCKER_IMAGE}:${VERSION}"$'\n'
+            MESSAGE+="# GitHub Container Registry"$'\n'
+          fi
+          MESSAGE+="docker pull ${GHCR_IMAGE}:${VERSION}"$'\n'
+          MESSAGE+="\`\`\`"$'\n'$'\n'
+          MESSAGE+="🔗 *相关链接:*"$'\n'
+          MESSAGE+="• [GitHub Release](https://github.com/${REPO}/releases/tag/${TAG_NAME})"$'\n'
+          if [ -n "$DOCKERHUB_USERNAME" ]; then
+            MESSAGE+="• [Docker Hub](https://hub.docker.com/r/${DOCKER_IMAGE})"$'\n'
+          fi
+          MESSAGE+="• [GitHub Packages](https://github.com/${REPO}/pkgs/container/sub2api)"$'\n'$'\n'
+          MESSAGE+="#Sub2API #Release #${TAG_NAME//./_}"
+
+          # 发送消息
+          curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
+            -H "Content-Type: application/json" \
+            -d "$(jq -n \
+              --arg chat_id "${TELEGRAM_CHAT_ID}" \
+              --arg text "${MESSAGE}" \
+              '{
+                chat_id: $chat_id,
+                text: $text,
+                parse_mode: "Markdown",
+                disable_web_page_preview: true
+              }')"
+
+  sync-version-file:
+    needs: [release]
+    if: ${{ needs.release.result == 'success' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout default branch
+        uses: actions/checkout@v6
+        with:
+          ref: ${{ github.event.repository.default_branch }}
+
+      - name: Sync VERSION file to released tag
+        run: |
+          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
+            VERSION=${{ github.event.inputs.tag }}
+            VERSION=${VERSION#v}
+          else
+            VERSION=${GITHUB_REF#refs/tags/v}
+          fi
+
+          CURRENT_VERSION=$(tr -d '\r\n' < backend/cmd/server/VERSION || true)
+          if [ "$CURRENT_VERSION" = "$VERSION" ]; then
+            echo "VERSION file already matches $VERSION"
+            exit 0
+          fi
+
+          echo "$VERSION" > backend/cmd/server/VERSION
+
+          git config user.name "github-actions[bot]"
+          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+          git add backend/cmd/server/VERSION
+          git commit -m "chore: sync VERSION to ${VERSION} [skip ci]"
+          git push origin HEAD:${{ github.event.repository.default_branch }}

+ 60 - 0
.github/workflows/security-scan.yml

@@ -0,0 +1,60 @@
+name: Security Scan
+
+on:
+  push:
+  pull_request:
+  schedule:
+    - cron: '0 3 * * 1'
+
+permissions:
+  contents: read
+
+jobs:
+  backend-security:
+    runs-on: ubuntu-latest
+    timeout-minutes: 15
+    steps:
+      - uses: actions/checkout@v6
+      - name: Set up Go
+        uses: actions/setup-go@v6
+        with:
+          go-version-file: backend/go.mod
+          check-latest: false
+          cache-dependency-path: backend/go.sum
+      - name: Verify Go version
+        run: |
+          go version | grep -q 'go1.27.0'
+      - name: Run govulncheck
+        working-directory: backend
+        run: |
+          go install golang.org/x/vuln/cmd/govulncheck@latest
+          govulncheck ./...
+
+  frontend-security:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v6
+      - name: Set up pnpm
+        uses: pnpm/action-setup@v6
+        with:
+          version: 9
+      - name: Set up Node.js
+        uses: actions/setup-node@v6
+        with:
+          node-version: '20'
+          cache: 'pnpm'
+          cache-dependency-path: frontend/pnpm-lock.yaml
+      - name: Install dependencies
+        working-directory: frontend
+        run: pnpm install --frozen-lockfile
+      - name: Run pnpm audit
+        working-directory: frontend
+        run: |
+          pnpm audit --prod --audit-level=high --json > audit.json || true
+      - name: Check audit exceptions
+        run: |
+          python -m pip install 'PyYAML==6.0.2'
+          python -m unittest discover -s tools -p 'test_check_pnpm_audit_exceptions.py'
+          python tools/check_pnpm_audit_exceptions.py \
+            --audit frontend/audit.json \
+            --exceptions .github/audit-exceptions.yml

+ 159 - 0
.gitignore

@@ -0,0 +1,159 @@
+# 本地杂项文档、测试数据和外部项目副本
+/docs-local/
+.codex
+
+# ===================
+# Go 后端
+# ===================
+# 二进制文件
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+backend/bin/
+backend/server
+backend/sub2api
+backend/main
+
+# Go 测试二进制
+*.test
+
+# 测试覆盖率
+*.out
+coverage.html
+
+# 依赖(使用 go mod)
+vendor/
+
+# Go 编译缓存
+backend/.gocache/
+
+# ===================
+# Node.js / Vue 前端
+# ===================
+node_modules/
+frontend/node_modules/
+frontend/dist/
+*.local
+*.tsbuildinfo
+vite.config.d.ts
+vite.config.js.timestamp-*
+
+# 日志
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# ===================
+# 环境配置
+# ===================
+.env
+.env.local
+.env.*.local
+*.env
+!.env.example
+docker-compose.override.yml
+
+# ===================
+# IDE / 编辑器
+# ===================
+.idea/
+.vscode/
+*.swp
+*.swo
+*~
+.project
+.settings/
+.classpath
+
+# ===================
+# 操作系统
+# ===================
+.DS_Store
+Thumbs.db
+Desktop.ini
+
+# ===================
+# 临时文件
+# ===================
+tmp/
+temp/
+*.tmp
+*.temp
+*.log
+*.bak
+.cache/
+.dev/
+.serena/
+
+# ===================
+# 构建产物
+# ===================
+dist/
+build/
+release/
+
+# 后端嵌入的前端构建产物
+# Keep a placeholder file so `//go:embed all:dist` always has a match in CI/lint,
+# while still ignoring generated frontend build outputs.
+backend/internal/web/dist/
+!backend/internal/web/dist/
+backend/internal/web/dist/*
+!backend/internal/web/dist/.keep
+
+# 后端运行时缓存数据
+backend/data/
+
+# ===================
+# 本地配置文件(包含敏感信息)
+# ===================
+backend/config.yaml
+deploy/config.yaml
+backend/.installed
+
+# ===================
+# 其他
+# ===================
+tests
+!deploy/tests/
+!deploy/tests/**
+CLAUDE.md
+.claude
+scripts
+!backend/scripts/
+!backend/scripts/resolve-version.sh
+.code-review-state
+#openspec/
+code-reviews/
+AGENTS.md
+backend/cmd/server/server
+deploy/docker-compose.override.yml
+.gocache/
+vite.config.js
+docs/*
+!docs/PAYMENT.md
+!docs/PAYMENT_CN.md
+!docs/ADMIN_PAYMENT_INTEGRATION_API.md
+!docs/ASYNC_IMAGE_TASKS.md
+!docs/BATCH_IMAGE_MVP.md
+!docs/COMPOSITE_GROUPS.md
+!docs/PLUGIN_DEVELOPMENT.md
+!docs/channel-monitor-v2-safe-defaults.md
+!docs/legal/
+!docs/legal/*.md
+!docs/screenshots/
+docs/screenshots/*
+!docs/screenshots/mobile-account-actions-menu.png
+.serena/
+.codex/
+frontend/coverage/
+aicodex
+output/
+.codegraph/
+
+# Vitest / Vite cache at repo root
+.vite/
+# 本地闭源插件开发目录及构建产物不进入 Sub2API 仓库
+/plugins/

+ 89 - 0
.goreleaser.simple.yaml

@@ -0,0 +1,89 @@
+# 简化版 GoReleaser 配置 - 仅发布 x86_64 GHCR 镜像
+version: 2
+
+project_name: sub2api
+
+before:
+  hooks:
+    - go mod tidy -C backend
+
+builds:
+  - id: sub2api
+    dir: backend
+    main: ./cmd/server
+    binary: sub2api
+    flags:
+      - -tags=embed
+    env:
+      - CGO_ENABLED=0
+    goos:
+      - linux
+    goarch:
+      - amd64
+    ldflags:
+      - -s -w
+      - -X main.Commit={{.Commit}}
+      - -X main.Date={{.Date}}
+      - -X main.BuildType=release
+
+# 跳过 archives
+archives: []
+
+# 跳过 checksum
+checksum:
+  disable: true
+
+changelog:
+  disable: true
+
+# 仅 GHCR x86_64 镜像
+dockers:
+  - id: ghcr-amd64
+    goos: linux
+    goarch: amd64
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-amd64"
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}"
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:latest"
+    dockerfile: Dockerfile.goreleaser
+    use: buildx
+    extra_files:
+      - deploy/docker-entrypoint.sh
+      - backend/resources
+    build_flag_templates:
+      - "--platform=linux/amd64"
+      - "--label=org.opencontainers.image.version={{ .Version }}"
+      - "--label=org.opencontainers.image.revision={{ .Commit }}"
+      - "--label=org.opencontainers.image.source=https://github.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }}"
+
+# 跳过 manifests(单架构不需要)
+docker_manifests: []
+
+release:
+  github:
+    owner: "{{ .Env.GITHUB_REPO_OWNER }}"
+    name: "{{ .Env.GITHUB_REPO_NAME }}"
+  draft: false
+  prerelease: auto
+  name_template: "Sub2API {{.Version}} (Simple)"
+  # 跳过上传二进制包
+  skip_upload: true
+  header: |
+    > AI API Gateway Platform - 将 AI 订阅配额分发和管理
+    > ⚡ Simple Release: 仅包含 x86_64 GHCR 镜像
+
+    {{ .Env.TAG_MESSAGE }}
+
+  footer: |
+    ---
+
+    ## 📥 Installation
+
+    **Docker (x86_64 only):**
+    ```bash
+    docker pull ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}
+    ```
+
+    ## 📚 Documentation
+
+    - [GitHub Repository](https://github.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }})

+ 212 - 0
.goreleaser.yaml

@@ -0,0 +1,212 @@
+version: 2
+
+project_name: sub2api
+
+before:
+  hooks:
+    - go mod tidy -C backend
+
+builds:
+  - id: sub2api
+    dir: backend
+    main: ./cmd/server
+    binary: sub2api
+    flags:
+      - -tags=embed
+    env:
+      - CGO_ENABLED=0
+    goos:
+      - linux
+      - windows
+      - darwin
+    goarch:
+      - amd64
+      - arm64
+    ignore:
+      - goos: windows
+        goarch: arm64
+    ldflags:
+      - -s -w
+      - -X main.Commit={{.Commit}}
+      - -X main.Date={{.Date}}
+      - -X main.BuildType=release
+
+archives:
+  - id: default
+    format: tar.gz
+    name_template: >-
+      {{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}
+    format_overrides:
+      - goos: windows
+        format: zip
+    files:
+      - LICENSE*
+      - README*
+      - deploy/*
+
+checksum:
+  name_template: 'checksums.txt'
+  algorithm: sha256
+
+changelog:
+  # 禁用自动 changelog,完全使用 tag 消息
+  disable: true
+
+# Docker images
+dockers:
+  # DockerHub images (skipped if DOCKERHUB_USERNAME is 'skip')
+  - id: amd64
+    goos: linux
+    goarch: amd64
+    skip_push: '{{ if eq .Env.DOCKERHUB_USERNAME "skip" }}true{{ else }}false{{ end }}'
+    image_templates:
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-amd64"
+    dockerfile: Dockerfile.goreleaser
+    use: buildx
+    extra_files:
+      - deploy/docker-entrypoint.sh
+      - backend/resources
+    build_flag_templates:
+      - "--platform=linux/amd64"
+      - "--label=org.opencontainers.image.version={{ .Version }}"
+      - "--label=org.opencontainers.image.revision={{ .Commit }}"
+
+  - id: arm64
+    goos: linux
+    goarch: arm64
+    skip_push: '{{ if eq .Env.DOCKERHUB_USERNAME "skip" }}true{{ else }}false{{ end }}'
+    image_templates:
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-arm64"
+    dockerfile: Dockerfile.goreleaser
+    use: buildx
+    extra_files:
+      - deploy/docker-entrypoint.sh
+      - backend/resources
+    build_flag_templates:
+      - "--platform=linux/arm64"
+      - "--label=org.opencontainers.image.version={{ .Version }}"
+      - "--label=org.opencontainers.image.revision={{ .Commit }}"
+
+  # GHCR images (owner must be lowercase)
+  - id: ghcr-amd64
+    goos: linux
+    goarch: amd64
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-amd64"
+    dockerfile: Dockerfile.goreleaser
+    use: buildx
+    extra_files:
+      - deploy/docker-entrypoint.sh
+      - backend/resources
+    build_flag_templates:
+      - "--platform=linux/amd64"
+      - "--label=org.opencontainers.image.version={{ .Version }}"
+      - "--label=org.opencontainers.image.revision={{ .Commit }}"
+      - "--label=org.opencontainers.image.source=https://github.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }}"
+
+  - id: ghcr-arm64
+    goos: linux
+    goarch: arm64
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-arm64"
+    dockerfile: Dockerfile.goreleaser
+    use: buildx
+    extra_files:
+      - deploy/docker-entrypoint.sh
+      - backend/resources
+    build_flag_templates:
+      - "--platform=linux/arm64"
+      - "--label=org.opencontainers.image.version={{ .Version }}"
+      - "--label=org.opencontainers.image.revision={{ .Commit }}"
+      - "--label=org.opencontainers.image.source=https://github.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }}"
+
+# Docker manifests for multi-arch support
+docker_manifests:
+  # DockerHub manifests (skipped if DOCKERHUB_USERNAME is 'skip')
+  - name_template: "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}"
+    skip_push: '{{ if eq .Env.DOCKERHUB_USERNAME "skip" }}true{{ else }}false{{ end }}'
+    image_templates:
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-amd64"
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-arm64"
+
+  - name_template: "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:latest"
+    skip_push: '{{ if eq .Env.DOCKERHUB_USERNAME "skip" }}true{{ else }}false{{ end }}'
+    image_templates:
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-amd64"
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-arm64"
+
+  - name_template: "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Major }}.{{ .Minor }}"
+    skip_push: '{{ if eq .Env.DOCKERHUB_USERNAME "skip" }}true{{ else }}false{{ end }}'
+    image_templates:
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-amd64"
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-arm64"
+
+  - name_template: "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Major }}"
+    skip_push: '{{ if eq .Env.DOCKERHUB_USERNAME "skip" }}true{{ else }}false{{ end }}'
+    image_templates:
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-amd64"
+      - "{{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}-arm64"
+
+  # GHCR manifests (owner must be lowercase)
+  - name_template: "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}"
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-amd64"
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-arm64"
+
+  - name_template: "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:latest"
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-amd64"
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-arm64"
+
+  - name_template: "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Major }}.{{ .Minor }}"
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-amd64"
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-arm64"
+
+  - name_template: "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Major }}"
+    image_templates:
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-amd64"
+      - "ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}-arm64"
+
+release:
+  github:
+    owner: "{{ .Env.GITHUB_REPO_OWNER }}"
+    name: "{{ .Env.GITHUB_REPO_NAME }}"
+  draft: false
+  prerelease: auto
+  name_template: "Sub2API {{.Version}}"
+  # 完全使用 tag 消息作为 release 内容(通过环境变量传入)
+  header: |
+    > AI API Gateway Platform - 将 AI 订阅配额分发和管理
+
+    {{ .Env.TAG_MESSAGE }}
+
+  footer: |
+
+    ---
+
+    ## 📥 Installation
+
+    **Docker:**
+    ```bash
+    {{ if ne .Env.DOCKERHUB_USERNAME "skip" -}}
+    # Docker Hub
+    docker pull {{ .Env.DOCKERHUB_USERNAME }}/sub2api:{{ .Version }}
+
+    {{ end -}}
+    # GitHub Container Registry
+    docker pull ghcr.io/{{ .Env.GITHUB_REPO_OWNER_LOWER }}/sub2api:{{ .Version }}
+    ```
+
+    **One-line install (Linux):**
+    ```bash
+    curl -sSL https://raw.githubusercontent.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }}/main/deploy/install.sh | sudo bash
+    ```
+
+    **Manual download:**
+    Download the appropriate archive for your platform from the assets below.
+
+    ## 📚 Documentation
+
+    - [GitHub Repository](https://github.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }})
+    - [Installation Guide](https://github.com/{{ .Env.GITHUB_REPO_OWNER }}/{{ .Env.GITHUB_REPO_NAME }}/blob/main/deploy/README.md)

+ 175 - 0
ACCOUNT_PROTECTION_REVIEW_2026-09-14.md

@@ -0,0 +1,175 @@
+# 账号保护配置专项分析
+
+> 本文件保留修改前的审查证据。当前本地修复与最终验证见 [本地修复结果](LOCAL_REPAIR_RESULTS_2026-09-14.md),服务器未更新。
+
+日期:2026-09-14。范围:当前本地源码的默认配置、应用/切换/还原、普通及批量保存、HTTP/WSS 转发和前端展示。
+
+结论:目前主要问题是保护配置没有在所有状态和转发路径上保持一致,不是缺少更多策略参数。已通过本地真实 WSS 回显和配置服务测试复现多个缺陷。优先修复身份应用、切换原子性和配置保存,再开展策略效果对比。
+
+本次只增加专项报告和隔离复现材料,没有修改业务代码或线上账号。没有验证真实上游模型质量、风控或封号效果。
+
+## 配置究竟控制什么
+
+| 字段/层级 | 实际含义 | 需要注意 |
+| --- | --- | --- |
+| `extra.anti_degradation` | 新保护开关,DTO/界面主要按它判断 | 不是运行时逐项验收结果 |
+| `extra.anti_degrade` | 策略标记、并发上限、应用时间和还原快照 | 只有 mode1 使用正式 `policy_version`;不同路径的解析规则不统一 |
+| `protection_scope` / `protection_mode` | 能力范围与策略名称 | 两者不能代替设备身份、TLS 和语义检查的实际状态 |
+| `codex_fingerprint_mode` | `device`、`session`、`full` 或 `off` | 不改变账号上游权限或模型能力 |
+| `codex_fingerprint_seed` | 系统管理的持久随机种子 | 正常启停会保留;新建/复制会重新生成;不应显示或导出为诊断信息 |
+| TLS 账号配置 | 开关、内置模板或自定义模板 ID | 还受全局开关及插件路由影响 |
+| `concurrency` + marker 中的 `max_concurrency` | 当前并发及策略保护上限 | 保存更大并发可能被重新压回策略上限;16/8/4 是工程配置,不是上游证明的安全值 |
+
+创建入口在 `backend/internal/repository/account_repo.go:140` 统一调用 `PrepareNewAccountProtection`:
+
+- 独立 OpenAI OAuth/Setup Token 且非随机代理:默认 mode1 v3、device、标准传输,并发取原有较低值或最高 16。
+- 其他类型、影子账号、随机代理账号:默认 `generic_v1`,仅持久限制并发,不具备 mode1 同等身份和语义守卫。
+- 导入/复制也走该默认逻辑,传入的保护标记、开关和种子会先被清除;不会原样保留导入文件中的保护策略。
+- 已存在且没有新标记的旧账号不会只因读取而自动启用。
+
+## 策略对照
+
+以下是注册表声明的目标值,不能据此认定所有运行路径已实现。
+
+| 策略 | 身份策略 | TLS 目标 | 并发上限 | mode1 语义检查 |
+| --- | --- | --- | ---: | --- |
+| 原生基线 | 恢复应用前配置 | 恢复应用前配置 | 恢复快照 | 不因“原生基线”额外开启 |
+| 最小兼容 `minimal_compat` | device | standard | 8 | 无 |
+| 会话兼容 `session_standard` | session | standard | 8 | 无 |
+| 初代兼容 `legacy` | session | nodejs24 | 16 | 无 |
+| 兼容架构 v3 `mode1` | device | standard | 16,保留较低原值 | 有,主要在 Responses HTTP/WS |
+| 完整收敛 `mode2` | full | nodejs22 | 8 | 无 |
+| Node.js 24 对照 `tls_node24` | device | nodejs24 | 8 | 无 |
+| 低并发稳定 `low_concurrency` | session | standard | 4 | 无 |
+| 通用保护 `generic` | 保留原身份配置 | 保留原传输配置 | 16,保留较低原值 | 无 |
+
+`device` 固定设备标识;`session` 将会话 ID 收敛为账号固定值,按客户端 session 派生 thread,客户端不提供 session 时 thread 会回退到固定 session;`full` 将会话和线程都收敛为固定值。因此 session/full 是诊断变量,不应理解为“数值更高、保护更强”。
+
+“关闭”调用的是还原快照。如果应用保护前就已手动配置指纹或 TLS,关闭后仍可能启用这些手动配置。再次打开开关使用默认策略,并不记住上次选择的 legacy/mode2。模式一与其他策略的设备 ID 派生前缀也不同,即使种子不变,切换模式也可能改变最终设备 ID;这会影响对照实验的控制变量。
+
+## 1. P1:原生 WSS 没有一致应用保护身份
+
+位置:`backend/internal/service/openai_ws_v2_passthrough_adapter.go:765`、`:1032`;`openai_codex_fingerprint.go:37`、`:57`;`openai_ws_forwarder_payload.go:148`。
+
+原生 WS 透传路径只调用按账号隔离元数据的 `applyCodexAccountIdentityClientMetadataRaw`,没有像 HTTP 路径一样解析和共享策略指纹 IDs。头部构造器却会在 mode1 下另外生成固定设备 ID。
+
+实际本地 WSS 复现:
+
+- mode1:握手头的安装 ID 是 `6e9606b6-1807-4ada-bea7-80417e796b8a`,回显请求体的安装 ID 是 `3c8fb157-5088-4dea-a666-5be6d685c4ca`,二者不相同。这些仅为本地测试生成的标识。
+- mode2、legacy:同样的请求体没有应用对应固定身份;在测试客户端只提供 body 身份、没有安装 ID 头时,上游握手头也没有补出策略安装 ID。
+- 请求仍可以正常完成并收到 `response.completed`,现有 mode1 语义守卫不比较这些身份字段,因而不能发现该问题。
+
+影响:同一配置在 HTTP 和原生 WSS 下的身份行为不同。“HTTP 正常、WS 异常”可能与此有关,但本次没有证明真实上游因此拒绝请求或降低输出质量。
+
+解决:HTTP、HTTP→WS、原生 WS 池和透传路径使用同一策略解析结果;在生成首帧/握手头前计算稳定身份,首帧和后续帧都应用对应元数据转换。明确连接级稳定字段与每轮字段的生命周期,不通过修改 TLS 参数掩盖身份不一致。
+
+验收:对每种策略抓取本地真实 HTTP/WSS 的头和帧体,校验设备/会话/线程规则一致;覆盖首帧、后续帧、重连、不同 API Key、账号切换及客户端缺省身份字段。
+
+## 2. P1:切换策略不是原子操作,失败后会留下保护关闭状态
+
+位置:`backend/internal/service/account_anti_degrade.go:302`,尤其第 317 行附近。
+
+当前执行顺序是“提交还原旧策略 → 再读账号 → 再提交新策略”。这两个更新各自提交和刷新调度快照,并没有包在同一事务中,也没有策略版本条件更新。
+
+本地在第二次更新注入失败,真实保护服务返回错误后,重新读取账号得到 `AntiDegradationEnabled() == false`。前端失败分支仅显示错误,不重新加载账号,因此还可能继续显示旧策略。
+
+影响:数据库错误、取消或并发操作可能让账号停留在原生配置;即使最终切换成功,中间提交也可能被并发请求看见。代码注释中的“安全切换”不能证明事务原子性。
+
+解决:在单个事务内锁定账号、验证目标资格、从原始快照计算目标配置,最后一次写入并提交;增加策略 revision/CAS 校验,处理并发启停。调度 outbox 与配置在同一事务提交,缓存只发布最终状态。前端失败后重新读取权威状态。
+
+验收:在校验、写入和提交处注入失败,账号都保留原策略及完整快照;并发应用/关闭要么有序完成,要么返回明确冲突,不能产生隐式关闭窗口。
+
+## 3. P1:旧账号首次启用保护可能被迟到的无标记快照覆盖
+
+位置:`backend/internal/repository/account_protection.go:31`、`:71`;`account_repo.go:576`、`:595`。
+
+最终保存阶段先根据“传入的旧账号对象”是否包含保护字段,决定要不要读取数据库中的保护状态。若旧请求在首次启用前读到 `extra=nil` 或没有任何保护键,`accountMayHaveManagedProtection` 返回 false,直接跳过数据库保护合并,之后整对象保存仍执行 `SetExtra(extra)`。
+
+本地 SQL mock 边界测试已复现:数据库准备了已启用 mode1 的记录,传入无保护字段的快照后,合并函数不查询已提交状态,输出仍未启用;同样的旧快照如果显式含 `anti_degradation:false`,则会正确读取并保留当前保护。这解释了为什么现有 stale-write 用例通过仍会漏掉此场景。
+
+解决:是否保护必须依据锁定后的数据库记录,不能依据传入对象。将当前保护字段合并进已有行锁查询,或者全部更新统一读取受管状态;身份种子也应在同一最终边界保留。
+
+验收:真实 PostgreSQL 中,让凭据刷新/编辑先读到无标记旧行,再启用保护,最后释放迟到写入;保护、身份和并发均不得回退。本次验证了合并函数缺口,没有执行真实数据库竞态验收。
+
+## 4. P1/P2:不同策略受到的保存保护不一致
+
+位置:`backend/internal/service/account_protection.go:120`;`account_mode1_protection.go:53`;`backend/internal/repository/account_protection.go:15`。
+
+已复现的 P1:开启 mode2 后,通过普通 `UpdateAccount` 提交 `codex_fingerprint_mode=off`、`enable_tls_fingerprint=false`,保存成功;账号继续显示保护开启和 mode2,但指纹模式实际已变为 off。`ProtectionManagedKeys` 排除了 mode2,配置有效性校验也只针对 mode1。
+
+另一个有明确源码证据的 P2:单账号 Go 合并会保护新增的最小兼容/会话兼容等策略,但用于 `UpdateExtra`/`BulkUpdate` 的 SQL 只为带版本标记的策略及 legacy 保留完整受管字段,漏掉 mode2 和新增诊断策略。批量保存可能保留策略名却覆盖其底层参数。本次未连接 PostgreSQL执行该 SQL 分支,不能把这部分称为数据库实测。
+
+解决:所有策略从同一注册表声明受管字段和不变量;普通保存、key 合并、批量更新和后台刷新执行一致规则。对受管字段修改返回明确错误或明确回显拒绝项,避免“保存成功”但实际值不一致。
+
+验收:对所有策略 × 所有写入入口测试,策略标记与身份/TLS/并发始终一致;mode2 不得只剩一个开启徽标。
+
+## 5. P2:非 mode1 的还原会丢失原 TLS 配置
+
+位置:`backend/internal/service/account_anti_degrade.go:348`、`:443`、`:453`。
+
+两种已复现的路径:
+
+1. 原账号 TLS=true、绑定模板 9;应用最小兼容后关闭 TLS,再还原。模板恢复了,但开关仍为 false。还原代码只处理快照为 false,没有处理 true。
+2. 原账号绑定模板 9;应用 legacy 后还原。绑定 ID 变为 0,因为应用内置模板时没有保存原 ID,而还原在快照缺少该键时直接删除它。
+
+同一个通用还原分支也服务 generic 等非 mode1 策略,因此风险不限于 UI 中的某一个按钮。对照测试显示 mode1 自身完整快照的 TLS、模板和并发还原可以通过。
+
+解决:统一使用完整、带字段存在信息的快照,区分“原来没有键”和“原来存在且为 false/null”。还原所有被该策略接管的字段;没有接管或没有快照的字段不能无条件删除。切换与普通关闭复用同一纯配置变换函数。
+
+验收:每种策略从 TLS 开/关、自定义模板、内置模板和无模板状态应用再还原,除了系统管理种子/审计时间外,相关配置逐字段恢复。
+
+## 6. P2:generic 被当作 mode1,正常升级路径被阻断
+
+位置:`backend/internal/service/account_anti_degrade.go:38`、`:135`;`account_mode1_protection.go:175`。
+
+`generic` 是系统真实保存的模式,却不在 `normalizeAntiDegradeMode` 认可的策略中,因此读取时变成 mode1。随机代理 OpenAI 账号默认得到 generic;之后改成固定代理,再选择 mode1,会收到 `MODE1_NOT_ELIGIBLE / 当前模式一配置无效`。
+
+这不是账号真的损坏,而是枚举与归一化规则不一致。已通过真实 AdminService 配置流程复现。现在绕行需要先还原/关闭再重新启用,但该操作涉及前述还原与切换缺陷,不适合作为长期方案。
+
+解决:把 generic 作为合法持久态保留;区分默认参数与持久状态解析;对“generic → mode1”进行资格校验后原子迁移,不把未知状态伪装成 mode1。
+
+## 7. P2:策略适用条件只是展示字段,缺少强制校验
+
+位置:`backend/internal/service/anti_degrade_strategies.go:18`、`account_anti_degrade.go:163`、`:302`;前端 `EditAccountModal.vue:3951`。
+
+注册表的 `requires_openai_oauth`、`diagnostic_only` 和风险等级没有形成完整的后端执行约束;前端只按 `apply_supported` 展示按钮,没有过滤平台。已复现 Gemini API Key 账号成功应用声明为 OpenAI 专属的最小兼容策略,实际仅并发变化,却保存为对应策略名。
+
+另外,未知模式如 `mode_typo` 会被静默改为 mode1并应用,已复现。
+
+解决:同一资格判断服务同时供预览和应用使用,按平台、类型、影子身份、代理条件返回明确可用性;未知非空模式返回 400。诊断策略明确展示实际改变的身份维度及风险,不让未支持的平台挂上同名能力标签。
+
+## 8. P2:配置预览没有解释全局开关和插件覆盖后的有效传输
+
+位置:`backend/internal/service/openai_plugin_transport.go:18`、`openai_ws_pool.go:864`、`openai_ws_v2_passthrough_adapter.go:878`;预览服务没有注入全局配置/插件状态。
+
+已复现:legacy 预览返回 `tls_profile=nodejs24`,全局 TLS 指纹关闭时,真正发送请求却走标准传输。全局关闭生效本身符合设计;不足之处是预览只说明账号目标配置,没有显示它被全局开关屏蔽。插件路由也可能接管 HTTP 传输,不能从账号模板字段推断插件实际握手。
+
+解决:返回 `configured`(账号配置)、`effective`(按全局开关/插件计算的计划)、`observed`(最近实际传输证据,可为空)三种状态,并标明原因。没有握手证据就显示“未验证”,不要把模板名当作观测结果。
+
+## 配置使用与排查建议
+
+1. 先记录具体账号的平台/类型、是否影子、策略名与版本、当前及策略并发、指纹模式、TLS 全局与账号开关、代理模式和 WS 接入模式。分享记录时去掉 token、密码、完整代理 URL 和身份种子。
+2. 针对现有故障,先区分 HTTP、HTTP→WS、原生 WSS,以及 `MODE1_CONFIGURATION_INVALID`、`MODE1_LOSSY_TRANSFORM`、上游 401/429 等错误。只有先确定失败层,策略对照才有意义。
+3. 修复前不要把模式二/完整收敛视为日常默认。它会改变会话/线程关系,且本轮发现保存及原生 WSS 不一致。
+4. mode1 v3 是当前独立 OpenAI 账号的代码默认;不需要为了让它“更有效”而强开实验 TLS。它的 device、会话隔离和语义检查也必须先补齐 WSS 实现。API Key/Gemini 等账号应明确显示通用并发保护。
+5. “原生基线”目前是还原旧快照,不一定是所有指纹都关闭。进行基线对照前核对实际字段;保存原始配置后在隔离测试账号上验证还原行为。
+6. 固定代理模式仅避免系统随机挑选代理,不保证代理供应商不换出口 IP;并发上限也不等于 TPM/RPM/上游配额控制。不要用这些配置推断账号一定不会降额或被限制。
+7. 当前测试历史只有保护布尔值,缺少具体策略版本、TLS、代理和有效并发快照;应补齐执行快照后再比较质量,且保持账号、实际模型、请求内容及并发一致。
+
+## 推荐修复次序
+
+第一批:统一 HTTP/WSS 的身份应用;将应用/还原/切换改成单事务;取消依赖旧快照字段的保护跳过优化。
+
+第二批:统一所有策略及所有保存入口的受管字段规则,修复 TLS 快照还原、generic 解析和资格检查。
+
+第三批:界面展示实际能力及全局覆盖原因,简化默认选项,把诊断策略单独标识,补充测试执行快照和跨协议验收。
+
+建议把策略解析为一个明确的执行计划,包含:策略 ID/版本、身份模式、会话隔离规则、TLS 计划、有效并发、语义守卫范围。保存时验证一次不变量,实际出站各路径消费同一计划,避免再增加散落的 `if mode1` 特判。
+
+## 本次验证材料
+
+- 隔离复现目录:`verification/account-protection-review/`,包含源码、Go overlay、说明和 service 原始日志。
+- 14 个叶子用例:12 个期望未满足、2 个对照通过。多个用例对应同一类缺陷;并非“12 个线上事故”。TLS 预览用例表达的是可观测性要求。
+- 配置复现使用真实保护/AdminService 和内存仓库;WSS 使用真实本地 TLS WebSocket 与帧回显;旧快照用例使用 SQL mock 验证最终保护合并边界。
+- 既有 service/repository 保护相关定向回归仍通过;前端相关 3 文件、20 项测试通过。它们没有覆盖本轮新增的失败场景。
+- 未连接生产数据库或真实上游,未执行生产策略切换;没有把 mock 成功或 HTTP 200 当作质量/风控保证。

+ 73 - 0
CLA.md

@@ -0,0 +1,73 @@
+# Sub2API Individual Contributor License Agreement (v1.0)
+
+Thank you for your interest in contributing to Sub2API ("the Project"). This Contributor License Agreement ("Agreement") documents the rights granted by contributors to the Project.
+
+By signing this Agreement, you accept and agree to the following terms and conditions for your present and future contributions submitted to the Project.
+
+## 1. Definitions
+
+- **"You" (or "Your")** means the copyright owner or legal entity authorized by the copyright owner that is making this Agreement.
+- **"Contribution"** means any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to the Project for inclusion in, or documentation of, any of the products owned or managed by the Project. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Project or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Project for the purpose of discussing and improving the Project, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."
+- **"Project Owner"** means Wesley Liddick, or any individual or legal entity to whom Wesley Liddick has explicitly assigned or transferred ownership of the Project in writing, and their respective successors and assigns.
+
+## 2. Grant of Copyright License
+
+Subject to the terms and conditions of this Agreement, You hereby grant to the Project Owner a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. This license includes, without limitation, the right to sublicense, assign, and transfer these rights to any third party, including without limitation any successor, assignee, or acquiring entity of the Project or the Project Owner, and to use Your Contributions under any license, including proprietary or commercial licenses.
+
+## 3. Moral Rights
+
+To the fullest extent permitted by applicable law, You irrevocably waive and agree not to assert any moral rights (including rights of attribution and integrity) that You may have in Your Contributions, and agree that the Project Owner and its licensees may use, modify, and distribute Your Contributions without attribution or other obligations arising from moral rights.
+
+## 4. Grant of Patent License
+
+Subject to the terms and conditions of this Agreement, You hereby grant to the Project Owner a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer Your Contributions, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Project to which such Contribution(s) was submitted.
+
+## 5. Representations and Warranties
+
+You represent and warrant that:
+
+(a) You are legally entitled to grant the above licenses.
+
+(b) If Your employer(s) has rights to intellectual property that You create that includes Your Contributions, You have received permission to make Contributions on behalf of that employer, or that Your employer has waived such rights for Your Contributions to the Project.
+
+(c) Each of Your Contributions is Your original creation, or You have sufficient rights to submit it under the terms of this Agreement. You agree to provide, upon request, reasonable documentation or explanation of any third-party materials included in Your Contributions.
+
+## 6. No Warranty
+
+Your Contributions are provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support.
+
+## 7. No Obligation
+
+You understand that the decision to include Your Contribution in any product or project is entirely at the discretion of the Project Owner, and this Agreement does not obligate the Project Owner to use Your Contribution.
+
+## 8. Retention of Rights
+
+You retain ownership of the copyright in Your Contributions. This Agreement does not transfer any copyright or other intellectual property rights from You to the Project Owner. This Agreement only grants the licenses described above.
+
+## 9. Term and Termination
+
+This Agreement shall remain in effect indefinitely. You may terminate this Agreement prospectively by providing written notice to the Project Owner, but such termination shall not affect the licenses granted for Contributions submitted prior to the effective date of termination. The licenses granted herein for Contributions submitted prior to termination are perpetual and irrevocable.
+
+## 10. Electronic Signature
+
+You agree that Your electronic signature (including but not limited to typing a specific phrase in a pull request, issue, or other electronic communication) is legally binding and has the same force and effect as a handwritten signature. You consent to the use of electronic means to enter into this Agreement and acknowledge that this Agreement is enforceable as if executed in a traditional written format.
+
+## 11. General Provisions
+
+**Entire Agreement.** This Agreement constitutes the entire agreement between You and the Project Owner with respect to Your Contributions and supersedes all prior or contemporaneous understandings regarding such subject matter.
+
+**Severability.** If any provision of this Agreement is held to be unenforceable or invalid, that provision will be enforced to the maximum extent possible and the remaining provisions will remain in full force and effect.
+
+**No Waiver.** The failure of the Project Owner to enforce any provision of this Agreement shall not constitute a waiver of that provision or any other provision.
+
+**Amendment.** This Agreement may only be modified by a written instrument signed by both parties. Modifications to this Agreement apply only to Contributions submitted after the modified Agreement is published and accepted by You. Prior Contributions remain governed by the version of the Agreement in effect at the time of submission.
+
+**Notification.** Notices under this Agreement shall be sent to the Project Owner via a GitHub issue on the Project repository. Notices are effective upon receipt.
+
+---
+
+**By signing this CLA, you acknowledge that you have read and understood this Agreement and agree to be bound by its terms.**
+
+To sign, reply in the pull request with:
+
+> I have read the CLA Document and I hereby sign the CLA

+ 346 - 0
DEV_GUIDE.md

@@ -0,0 +1,346 @@
+# sub2api 项目开发指南
+
+> 本文档记录项目环境配置、常见坑点和注意事项,供 Claude Code 和团队成员参考。
+
+## 一、项目基本信息
+
+| 项目 | 说明 |
+|------|------|
+| **上游仓库** | Wei-Shaw/sub2api |
+| **Fork 仓库** | bayma888/sub2api-bmai |
+| **技术栈** | Go 后端 (Ent ORM + Gin) + Vue3 前端 (pnpm) |
+| **数据库** | PostgreSQL 16 + Redis |
+| **包管理** | 后端: go modules, 前端: **pnpm**(不是 npm) |
+
+## 二、本地环境配置
+
+### PostgreSQL 16 (Windows 服务)
+
+| 配置项 | 值 |
+|--------|-----|
+| 端口 | 5432 |
+| psql 路径 | `C:\Program Files\PostgreSQL\16\bin\psql.exe` |
+| pg_hba.conf | `C:\Program Files\PostgreSQL\16\data\pg_hba.conf` |
+| 数据库凭据 | user=`sub2api`, password=`sub2api`, dbname=`sub2api` |
+| 超级用户 | user=`postgres`, password=`postgres` |
+
+### Redis
+
+| 配置项 | 值 |
+|--------|-----|
+| 端口 | 6379 |
+| 密码 | 无 |
+
+### 开发工具
+
+```bash
+# golangci-lint(CI 用 v2.13,本地建议装同一版以免版本差异带来的噪音)
+go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.13
+
+# pnpm (前端包管理)
+npm install -g pnpm
+```
+
+## 三、CI/CD 流水线
+
+### GitHub Actions Workflows
+
+| Workflow | 触发条件 | 检查内容 |
+|----------|----------|----------|
+| **backend-ci.yml** | push, pull_request | 单元测试 + 集成测试 + golangci-lint v2.13 |
+| **security-scan.yml** | push, pull_request, 每周一 | govulncheck + gosec + pnpm audit |
+| **release.yml** | tag `v*` | 构建发布(PR 不触发) |
+
+### CI 要求
+
+- Go 版本必须是 **1.27.0**:三个 workflow 都用 `go-version-file: backend/go.mod` 取版本,随后硬断言 `go version | grep -q 'go1.27.0'`。升级 Go 时要同时改 `backend/go.mod`、`backend-ci.yml`(两处)、`release.yml`、`security-scan.yml` 里的这句断言,**以及三个 Dockerfile 里的 Go 构建镜像**(`Dockerfile` / `deploy/Dockerfile` 的 `ARG GOLANG_IMAGE`、`backend/Dockerfile` 的 `FROM golang:`)。前者漏了 CI 会在版本校验步骤直接失败;**后者漏了 CI 不会报,而是等到有人用这些 Dockerfile 构建时才失败**(`go.mod requires go >= X (running Y; GOTOOLCHAIN=local)`)。
+- 前端使用 `pnpm install --frozen-lockfile`,必须提交 `pnpm-lock.yaml`
+
+### 本地测试命令
+
+```bash
+# 后端单元测试
+cd backend && go test -tags=unit ./...
+
+# 后端集成测试
+cd backend && go test -tags=integration ./...
+
+# 代码质量检查
+cd backend && golangci-lint run ./...
+
+# 前端依赖安装(必须用 pnpm)
+cd frontend && pnpm install
+```
+
+## 四、常见坑点 & 解决方案
+
+### 坑 1:pnpm-lock.yaml 必须同步提交
+
+**问题**:`package.json` 新增依赖后,CI 的 `pnpm install --frozen-lockfile` 失败。
+
+**原因**:上游 CI 使用 pnpm,lock 文件不同步会报错。
+
+**解决**:
+```bash
+cd frontend
+pnpm install  # 更新 pnpm-lock.yaml
+git add pnpm-lock.yaml
+git commit -m "chore: update pnpm-lock.yaml"
+```
+
+---
+
+### 坑 2:npm 和 pnpm 的 node_modules 冲突
+
+**问题**:之前用 npm 装过 `node_modules`,pnpm install 报 `EPERM` 错误。
+
+**解决**:
+```bash
+cd frontend
+rm -rf node_modules  # 或 PowerShell: Remove-Item -Recurse -Force node_modules
+pnpm install
+```
+
+---
+
+### 坑 3:PowerShell 中 bcrypt hash 的 `$` 被转义
+
+**问题**:bcrypt hash 格式如 `$2a$10$xxx...`,PowerShell 把 `$2a` 当变量解析,导致数据丢失。
+
+**解决**:将 SQL 写入文件,用 `psql -f` 执行:
+```bash
+# 错误示范(PowerShell 会吃掉 $)
+psql -c "INSERT INTO users ... VALUES ('$2a$10$...')"
+
+# 正确做法
+echo "INSERT INTO users ... VALUES ('\$2a\$10\$...')" > temp.sql
+psql -U sub2api -h 127.0.0.1 -d sub2api -f temp.sql
+```
+
+---
+
+### 坑 4:psql 不支持中文路径
+
+**问题**:`psql -f "D:\中文路径\file.sql"` 报错找不到文件。
+
+**解决**:复制到纯英文路径再执行:
+```bash
+cp "D:\中文路径\file.sql" "C:\temp.sql"
+psql -f "C:\temp.sql"
+```
+
+---
+
+### 坑 5:PostgreSQL 密码重置流程
+
+**场景**:忘记 PostgreSQL 密码。
+
+**步骤**:
+1. 修改 `C:\Program Files\PostgreSQL\16\data\pg_hba.conf`
+   ```
+   # 将 scram-sha-256 改为 trust
+   host    all    all    127.0.0.1/32    trust
+   ```
+2. 重启 PostgreSQL 服务
+   ```powershell
+   Restart-Service postgresql-x64-16
+   ```
+3. 无密码登录并重置
+   ```bash
+   psql -U postgres -h 127.0.0.1
+   ALTER USER sub2api WITH PASSWORD 'sub2api';
+   ALTER USER postgres WITH PASSWORD 'postgres';
+   ```
+4. 改回 `scram-sha-256` 并重启
+
+---
+
+### 坑 6:Go interface 新增方法后 test stub 必须补全
+
+**问题**:给 interface 新增方法后,编译报错 `does not implement interface (missing method XXX)`。
+
+**原因**:所有测试文件中实现该 interface 的 stub/mock 都必须补上新方法。
+
+**解决**:
+```bash
+# 搜索所有实现该 interface 的 struct
+cd backend
+grep -r "type.*Stub.*struct" internal/
+grep -r "type.*Mock.*struct" internal/
+
+# 逐一补全新方法
+```
+
+---
+
+### 坑 7:Windows 上 psql 连 localhost 的 IPv6 问题
+
+**问题**:psql 连 `localhost` 先尝试 IPv6 (::1),可能报错后再回退 IPv4。
+
+**建议**:直接用 `127.0.0.1` 代替 `localhost`。
+
+---
+
+### 坑 8:Windows 没有 make 命令
+
+**问题**:CI 里用 `make test-unit`,本地 Windows 没有 make。
+
+**解决**:直接用 Makefile 里的原始命令:
+```bash
+# 代替 make test-unit
+go test -tags=unit ./...
+
+# 代替 make test-integration
+go test -tags=integration ./...
+```
+
+---
+
+### 坑 9:Ent Schema 修改后必须重新生成
+
+**问题**:修改 `ent/schema/*.go` 后,代码不生效。
+
+**解决**:
+```bash
+cd backend
+go generate ./ent  # 重新生成 ent 代码(json.RawMessage 字段会生成为同类型的 jsontext.Value,属预期)
+git add ent/       # 生成的文件也要提交
+```
+
+---
+
+### 坑 10:前端测试看似正常,但后端调用失败(模型映射被批量误改)
+
+**典型现象**:
+- 前端按钮点测看起来正常;
+- 实际通过 API/客户端调用时返回 `Service temporarily unavailable` 或提示无可用账号;
+- 常见于 OpenAI 账号(例如 Codex 模型)在批量修改后突然不可用。
+
+**根因**:
+- OpenAI 账号编辑页默认不显式展示映射规则,容易让人误以为“没映射也没关系”;
+- 但在**批量修改同时选中不同平台账号**(OpenAI + Antigravity/Gemini)时,模型白名单/映射可能被跨平台策略覆盖;
+- 结果是 OpenAI 账号的关键模型映射丢失或被改坏,后端选不到可用账号。
+
+**修复方案(按优先级)**:
+1. **快速修复(推荐)**:在批量修改中补回正确的透传映射(例如 `gpt-5.3-codex -> gpt-5.3-codex-spark`)。
+2. **彻底重建**:删除并重新添加全部相关账号(最稳但成本高)。
+
+**关键经验**:
+- 如果某模型已被软件内置默认映射覆盖,通常不需要额外再加透传;
+- 但当上游模型更新快于本仓库默认映射时,**手动批量添加透传映射**是最简单、最低风险的临时兜底方案;
+- 批量操作前尽量按平台分组,不要混选不同平台账号。
+
+---
+
+### 坑 11:PR 提交前检查清单
+
+提交 PR 前务必本地验证:
+
+- [ ] `go test -tags=unit ./...` 通过
+- [ ] `go test -tags=integration ./...` 通过
+- [ ] `golangci-lint run ./...` 无新增问题
+- [ ] `pnpm-lock.yaml` 已同步(如果改了 package.json)
+- [ ] 所有 test stub 补全新接口方法(如果改了 interface)
+- [ ] Ent 生成的代码已提交(如果改了 schema)
+
+## 五、常用命令速查
+
+### 数据库操作
+
+```bash
+# 连接数据库
+psql -U sub2api -h 127.0.0.1 -d sub2api
+
+# 查看所有用户
+psql -U postgres -h 127.0.0.1 -c "\du"
+
+# 查看所有数据库
+psql -U postgres -h 127.0.0.1 -c "\l"
+
+# 执行 SQL 文件
+psql -U sub2api -h 127.0.0.1 -d sub2api -f migration.sql
+```
+
+### Git 操作
+
+```bash
+# 同步上游
+git fetch upstream
+git checkout main
+git merge upstream/main
+git push origin main
+
+# 创建功能分支
+git checkout -b feature/xxx
+
+# Rebase 到最新 main
+git fetch upstream
+git rebase upstream/main
+```
+
+### 前端操作
+
+```bash
+# 安装依赖(必须用 pnpm)
+cd frontend
+pnpm install
+
+# 开发服务器
+pnpm dev
+
+# 构建
+pnpm build
+```
+
+### 后端操作
+
+```bash
+# 运行服务器
+cd backend
+go run ./cmd/server/
+
+# 生成 Ent 代码
+go generate ./ent
+
+# 运行测试
+go test -tags=unit ./...
+go test -tags=integration ./...
+
+# Lint 检查
+golangci-lint run ./...
+```
+
+## 六、项目结构速览
+
+```
+sub2api-bmai/
+├── backend/
+│   ├── cmd/server/          # 主程序入口
+│   ├── ent/                 # Ent ORM 生成代码
+│   │   └── schema/          # 数据库 Schema 定义
+│   ├── internal/
+│   │   ├── handler/         # HTTP 处理器
+│   │   ├── service/         # 业务逻辑
+│   │   ├── repository/      # 数据访问层
+│   │   └── server/          # 服务器配置
+│   ├── migrations/          # 数据库迁移脚本
+│   └── config.yaml          # 配置文件
+├── frontend/
+│   ├── src/
+│   │   ├── api/             # API 调用
+│   │   ├── components/      # Vue 组件
+│   │   ├── views/           # 页面视图
+│   │   ├── types/           # TypeScript 类型
+│   │   └── i18n/            # 国际化
+│   ├── package.json         # 依赖配置
+│   └── pnpm-lock.yaml       # pnpm 锁文件(必须提交)
+└── .claude/
+    └── CLAUDE.md            # 本文档
+```
+
+## 七、参考资源
+
+- [上游仓库](https://github.com/Wei-Shaw/sub2api)
+- [Ent 文档](https://entgo.io/docs/getting-started)
+- [Vue3 文档](https://vuejs.org/)
+- [pnpm 文档](https://pnpm.io/)

+ 4013 - 0
DIRECTORY_TREE.txt

@@ -0,0 +1,4013 @@
+Source root: C:\Users\30214\Desktop\sub2本地\sub2新站
+Excluded: .git, node_modules, generated web/dist, private env/config/access files
+
+.dockerignore
+.gitattributes
+.github/audit-exceptions.yml
+.github/workflows/backend-ci.yml
+.github/workflows/cla.yml
+.github/workflows/release.yml
+.github/workflows/security-scan.yml
+.gitignore
+.goreleaser.simple.yaml
+.goreleaser.yaml
+CLA.md
+DEV_GUIDE.md
+Dockerfile
+Dockerfile.goreleaser
+LICENSE
+MODE1_LOCAL_HANDOFF.md
+Makefile
+README.md
+README_CN.md
+README_JA.md
+assets/logo.svg
+assets/partners/logos/RoxyBrowser.png
+assets/partners/logos/aigocode.png
+assets/partners/logos/aimzoon.jpg
+assets/partners/logos/apikey-fun.png
+assets/partners/logos/apimart.jpg
+assets/partners/logos/axisnow.jpg
+assets/partners/logos/bestproxy.png
+assets/partners/logos/bmoplus.jpg
+assets/partners/logos/cctk.jpg
+assets/partners/logos/codex-everywhere.jpg
+assets/partners/logos/cola-proxy.jpg
+assets/partners/logos/ctok.png
+assets/partners/logos/duckip.png
+assets/partners/logos/etok.png
+assets/partners/logos/fastaitoken.jpg
+assets/partners/logos/fennoai.jpg
+assets/partners/logos/haoai.png
+assets/partners/logos/lanox.jpg
+assets/partners/logos/nagora.png
+assets/partners/logos/openmodel.jpg
+assets/partners/logos/pateway.png
+assets/partners/logos/pincc-logo.png
+assets/partners/logos/poixe.png
+assets/partners/logos/ppdog.png
+assets/partners/logos/pptoken.png
+assets/partners/logos/proxy4free.png
+assets/partners/logos/qiniu.jpg
+assets/partners/logos/rapidproxy.jpg
+assets/partners/logos/runapi.png
+assets/partners/logos/silkapi.png
+assets/partners/logos/swiftprox.png
+assets/partners/logos/veilx.png
+backend/.dockerignore
+backend/.golangci.yml
+backend/Dockerfile
+backend/Makefile
+backend/cmd/cleanup-ingress-reject-logs/README.md
+backend/cmd/cleanup-ingress-reject-logs/main.go
+backend/cmd/cleanup-ingress-reject-logs/main_test.go
+backend/cmd/jwtgen/main.go
+backend/cmd/profit-preview/main.go
+backend/cmd/profit-preview/main_test.go
+backend/cmd/server/VERSION
+backend/cmd/server/main.go
+backend/cmd/server/wire.go
+backend/cmd/server/wire_gen.go
+backend/cmd/server/wire_gen_test.go
+backend/dev-docs/upstream-error-proxy-attribution.md
+backend/ent/account.go
+backend/ent/account/account.go
+backend/ent/account/where.go
+backend/ent/account_create.go
+backend/ent/account_delete.go
+backend/ent/account_query.go
+backend/ent/account_update.go
+backend/ent/accountgroup.go
+backend/ent/accountgroup/accountgroup.go
+backend/ent/accountgroup/where.go
+backend/ent/accountgroup_create.go
+backend/ent/accountgroup_delete.go
+backend/ent/accountgroup_query.go
+backend/ent/accountgroup_update.go
+backend/ent/announcement.go
+backend/ent/announcement/announcement.go
+backend/ent/announcement/where.go
+backend/ent/announcement_create.go
+backend/ent/announcement_delete.go
+backend/ent/announcement_query.go
+backend/ent/announcement_update.go
+backend/ent/announcementread.go
+backend/ent/announcementread/announcementread.go
+backend/ent/announcementread/where.go
+backend/ent/announcementread_create.go
+backend/ent/announcementread_delete.go
+backend/ent/announcementread_query.go
+backend/ent/announcementread_update.go
+backend/ent/apikey.go
+backend/ent/apikey/apikey.go
+backend/ent/apikey/where.go
+backend/ent/apikey_create.go
+backend/ent/apikey_delete.go
+backend/ent/apikey_query.go
+backend/ent/apikey_update.go
+backend/ent/authidentity.go
+backend/ent/authidentity/authidentity.go
+backend/ent/authidentity/where.go
+backend/ent/authidentity_create.go
+backend/ent/authidentity_delete.go
+backend/ent/authidentity_query.go
+backend/ent/authidentity_update.go
+backend/ent/authidentitychannel.go
+backend/ent/authidentitychannel/authidentitychannel.go
+backend/ent/authidentitychannel/where.go
+backend/ent/authidentitychannel_create.go
+backend/ent/authidentitychannel_delete.go
+backend/ent/authidentitychannel_query.go
+backend/ent/authidentitychannel_update.go
+backend/ent/batchimageevent.go
+backend/ent/batchimageevent/batchimageevent.go
+backend/ent/batchimageevent/where.go
+backend/ent/batchimageevent_create.go
+backend/ent/batchimageevent_delete.go
+backend/ent/batchimageevent_query.go
+backend/ent/batchimageevent_update.go
+backend/ent/batchimageitem.go
+backend/ent/batchimageitem/batchimageitem.go
+backend/ent/batchimageitem/where.go
+backend/ent/batchimageitem_create.go
+backend/ent/batchimageitem_delete.go
+backend/ent/batchimageitem_query.go
+backend/ent/batchimageitem_update.go
+backend/ent/batchimagejob.go
+backend/ent/batchimagejob/batchimagejob.go
+backend/ent/batchimagejob/where.go
+backend/ent/batchimagejob_create.go
+backend/ent/batchimagejob_delete.go
+backend/ent/batchimagejob_query.go
+backend/ent/batchimagejob_update.go
+backend/ent/channelmonitor.go
+backend/ent/channelmonitor/channelmonitor.go
+backend/ent/channelmonitor/where.go
+backend/ent/channelmonitor_create.go
+backend/ent/channelmonitor_delete.go
+backend/ent/channelmonitor_query.go
+backend/ent/channelmonitor_update.go
+backend/ent/channelmonitordailyrollup.go
+backend/ent/channelmonitordailyrollup/channelmonitordailyrollup.go
+backend/ent/channelmonitordailyrollup/where.go
+backend/ent/channelmonitordailyrollup_create.go
+backend/ent/channelmonitordailyrollup_delete.go
+backend/ent/channelmonitordailyrollup_query.go
+backend/ent/channelmonitordailyrollup_update.go
+backend/ent/channelmonitorhistory.go
+backend/ent/channelmonitorhistory/channelmonitorhistory.go
+backend/ent/channelmonitorhistory/where.go
+backend/ent/channelmonitorhistory_create.go
+backend/ent/channelmonitorhistory_delete.go
+backend/ent/channelmonitorhistory_query.go
+backend/ent/channelmonitorhistory_update.go
+backend/ent/channelmonitorrequesttemplate.go
+backend/ent/channelmonitorrequesttemplate/channelmonitorrequesttemplate.go
+backend/ent/channelmonitorrequesttemplate/where.go
+backend/ent/channelmonitorrequesttemplate_create.go
+backend/ent/channelmonitorrequesttemplate_delete.go
+backend/ent/channelmonitorrequesttemplate_query.go
+backend/ent/channelmonitorrequesttemplate_update.go
+backend/ent/client.go
+backend/ent/compositemodelroute.go
+backend/ent/compositemodelroute/compositemodelroute.go
+backend/ent/compositemodelroute/where.go
+backend/ent/compositemodelroute_create.go
+backend/ent/compositemodelroute_delete.go
+backend/ent/compositemodelroute_query.go
+backend/ent/compositemodelroute_update.go
+backend/ent/driver_access.go
+backend/ent/ent.go
+backend/ent/enttest/enttest.go
+backend/ent/errorpassthroughrule.go
+backend/ent/errorpassthroughrule/errorpassthroughrule.go
+backend/ent/errorpassthroughrule/where.go
+backend/ent/errorpassthroughrule_create.go
+backend/ent/errorpassthroughrule_delete.go
+backend/ent/errorpassthroughrule_query.go
+backend/ent/errorpassthroughrule_update.go
+backend/ent/generate.go
+backend/ent/group.go
+backend/ent/group/group.go
+backend/ent/group/where.go
+backend/ent/group_create.go
+backend/ent/group_delete.go
+backend/ent/group_query.go
+backend/ent/group_update.go
+backend/ent/hook/hook.go
+backend/ent/idempotencyrecord.go
+backend/ent/idempotencyrecord/idempotencyrecord.go
+backend/ent/idempotencyrecord/where.go
+backend/ent/idempotencyrecord_create.go
+backend/ent/idempotencyrecord_delete.go
+backend/ent/idempotencyrecord_query.go
+backend/ent/idempotencyrecord_update.go
+backend/ent/identityadoptiondecision.go
+backend/ent/identityadoptiondecision/identityadoptiondecision.go
+backend/ent/identityadoptiondecision/where.go
+backend/ent/identityadoptiondecision_create.go
+backend/ent/identityadoptiondecision_delete.go
+backend/ent/identityadoptiondecision_query.go
+backend/ent/identityadoptiondecision_update.go
+backend/ent/intercept/intercept.go
+backend/ent/migrate/auth_identity_fk_ondelete_test.go
+backend/ent/migrate/migrate.go
+backend/ent/migrate/schema.go
+backend/ent/mutation.go
+backend/ent/paymentauditlog.go
+backend/ent/paymentauditlog/paymentauditlog.go
+backend/ent/paymentauditlog/where.go
+backend/ent/paymentauditlog_create.go
+backend/ent/paymentauditlog_delete.go
+backend/ent/paymentauditlog_query.go
+backend/ent/paymentauditlog_update.go
+backend/ent/paymentorder.go
+backend/ent/paymentorder/paymentorder.go
+backend/ent/paymentorder/where.go
+backend/ent/paymentorder_create.go
+backend/ent/paymentorder_delete.go
+backend/ent/paymentorder_query.go
+backend/ent/paymentorder_update.go
+backend/ent/paymentproviderinstance.go
+backend/ent/paymentproviderinstance/paymentproviderinstance.go
+backend/ent/paymentproviderinstance/where.go
+backend/ent/paymentproviderinstance_create.go
+backend/ent/paymentproviderinstance_delete.go
+backend/ent/paymentproviderinstance_query.go
+backend/ent/paymentproviderinstance_update.go
+backend/ent/pendingauthsession.go
+backend/ent/pendingauthsession/pendingauthsession.go
+backend/ent/pendingauthsession/where.go
+backend/ent/pendingauthsession_create.go
+backend/ent/pendingauthsession_delete.go
+backend/ent/pendingauthsession_query.go
+backend/ent/pendingauthsession_update.go
+backend/ent/predicate/predicate.go
+backend/ent/promocode.go
+backend/ent/promocode/promocode.go
+backend/ent/promocode/where.go
+backend/ent/promocode_create.go
+backend/ent/promocode_delete.go
+backend/ent/promocode_query.go
+backend/ent/promocode_update.go
+backend/ent/promocodeusage.go
+backend/ent/promocodeusage/promocodeusage.go
+backend/ent/promocodeusage/where.go
+backend/ent/promocodeusage_create.go
+backend/ent/promocodeusage_delete.go
+backend/ent/promocodeusage_query.go
+backend/ent/promocodeusage_update.go
+backend/ent/proxy.go
+backend/ent/proxy/proxy.go
+backend/ent/proxy/where.go
+backend/ent/proxy_create.go
+backend/ent/proxy_delete.go
+backend/ent/proxy_query.go
+backend/ent/proxy_update.go
+backend/ent/redeemcode.go
+backend/ent/redeemcode/redeemcode.go
+backend/ent/redeemcode/where.go
+backend/ent/redeemcode_create.go
+backend/ent/redeemcode_delete.go
+backend/ent/redeemcode_query.go
+backend/ent/redeemcode_update.go
+backend/ent/runtime.go
+backend/ent/runtime/runtime.go
+backend/ent/schema/account.go
+backend/ent/schema/account_group.go
+backend/ent/schema/announcement.go
+backend/ent/schema/announcement_read.go
+backend/ent/schema/api_key.go
+backend/ent/schema/auth_identity.go
+backend/ent/schema/auth_identity_channel.go
+backend/ent/schema/auth_identity_schema_test.go
+backend/ent/schema/batch_image_event.go
+backend/ent/schema/batch_image_item.go
+backend/ent/schema/batch_image_job.go
+backend/ent/schema/channel_monitor.go
+backend/ent/schema/channel_monitor_daily_rollup.go
+backend/ent/schema/channel_monitor_history.go
+backend/ent/schema/channel_monitor_request_template.go
+backend/ent/schema/composite_model_route.go
+backend/ent/schema/error_passthrough_rule.go
+backend/ent/schema/group.go
+backend/ent/schema/idempotency_record.go
+backend/ent/schema/identity_adoption_decision.go
+backend/ent/schema/mixins/soft_delete.go
+backend/ent/schema/mixins/time.go
+backend/ent/schema/payment_audit_log.go
+backend/ent/schema/payment_order.go
+backend/ent/schema/payment_provider_instance.go
+backend/ent/schema/pending_auth_session.go
+backend/ent/schema/promo_code.go
+backend/ent/schema/promo_code_usage.go
+backend/ent/schema/proxy.go
+backend/ent/schema/redeem_code.go
+backend/ent/schema/security_policy_keyword.go
+backend/ent/schema/security_secret.go
+backend/ent/schema/setting.go
+backend/ent/schema/subscription_plan.go
+backend/ent/schema/tls_fingerprint_profile.go
+backend/ent/schema/usage_cleanup_task.go
+backend/ent/schema/usage_log.go
+backend/ent/schema/user.go
+backend/ent/schema/user_allowed_group.go
+backend/ent/schema/user_attribute_definition.go
+backend/ent/schema/user_attribute_value.go
+backend/ent/schema/user_platform_quota.go
+backend/ent/schema/user_subscription.go
+backend/ent/securitypolicykeyword.go
+backend/ent/securitypolicykeyword/securitypolicykeyword.go
+backend/ent/securitypolicykeyword/where.go
+backend/ent/securitypolicykeyword_create.go
+backend/ent/securitypolicykeyword_delete.go
+backend/ent/securitypolicykeyword_query.go
+backend/ent/securitypolicykeyword_update.go
+backend/ent/securitysecret.go
+backend/ent/securitysecret/securitysecret.go
+backend/ent/securitysecret/where.go
+backend/ent/securitysecret_create.go
+backend/ent/securitysecret_delete.go
+backend/ent/securitysecret_query.go
+backend/ent/securitysecret_update.go
+backend/ent/setting.go
+backend/ent/setting/setting.go
+backend/ent/setting/where.go
+backend/ent/setting_create.go
+backend/ent/setting_delete.go
+backend/ent/setting_query.go
+backend/ent/setting_update.go
+backend/ent/subscriptionplan.go
+backend/ent/subscriptionplan/subscriptionplan.go
+backend/ent/subscriptionplan/where.go
+backend/ent/subscriptionplan_create.go
+backend/ent/subscriptionplan_delete.go
+backend/ent/subscriptionplan_query.go
+backend/ent/subscriptionplan_update.go
+backend/ent/tlsfingerprintprofile.go
+backend/ent/tlsfingerprintprofile/tlsfingerprintprofile.go
+backend/ent/tlsfingerprintprofile/where.go
+backend/ent/tlsfingerprintprofile_create.go
+backend/ent/tlsfingerprintprofile_delete.go
+backend/ent/tlsfingerprintprofile_query.go
+backend/ent/tlsfingerprintprofile_update.go
+backend/ent/tx.go
+backend/ent/tx_context.go
+backend/ent/usagecleanuptask.go
+backend/ent/usagecleanuptask/usagecleanuptask.go
+backend/ent/usagecleanuptask/where.go
+backend/ent/usagecleanuptask_create.go
+backend/ent/usagecleanuptask_delete.go
+backend/ent/usagecleanuptask_query.go
+backend/ent/usagecleanuptask_update.go
+backend/ent/usagelog.go
+backend/ent/usagelog/usagelog.go
+backend/ent/usagelog/where.go
+backend/ent/usagelog_create.go
+backend/ent/usagelog_delete.go
+backend/ent/usagelog_query.go
+backend/ent/usagelog_update.go
+backend/ent/user.go
+backend/ent/user/user.go
+backend/ent/user/where.go
+backend/ent/user_create.go
+backend/ent/user_delete.go
+backend/ent/user_query.go
+backend/ent/user_update.go
+backend/ent/userallowedgroup.go
+backend/ent/userallowedgroup/userallowedgroup.go
+backend/ent/userallowedgroup/where.go
+backend/ent/userallowedgroup_create.go
+backend/ent/userallowedgroup_delete.go
+backend/ent/userallowedgroup_query.go
+backend/ent/userallowedgroup_update.go
+backend/ent/userattributedefinition.go
+backend/ent/userattributedefinition/userattributedefinition.go
+backend/ent/userattributedefinition/where.go
+backend/ent/userattributedefinition_create.go
+backend/ent/userattributedefinition_delete.go
+backend/ent/userattributedefinition_query.go
+backend/ent/userattributedefinition_update.go
+backend/ent/userattributevalue.go
+backend/ent/userattributevalue/userattributevalue.go
+backend/ent/userattributevalue/where.go
+backend/ent/userattributevalue_create.go
+backend/ent/userattributevalue_delete.go
+backend/ent/userattributevalue_query.go
+backend/ent/userattributevalue_update.go
+backend/ent/userplatformquota.go
+backend/ent/userplatformquota/userplatformquota.go
+backend/ent/userplatformquota/where.go
+backend/ent/userplatformquota_create.go
+backend/ent/userplatformquota_delete.go
+backend/ent/userplatformquota_query.go
+backend/ent/userplatformquota_update.go
+backend/ent/usersubscription.go
+backend/ent/usersubscription/usersubscription.go
+backend/ent/usersubscription/where.go
+backend/ent/usersubscription_create.go
+backend/ent/usersubscription_delete.go
+backend/ent/usersubscription_query.go
+backend/ent/usersubscription_update.go
+backend/go.mod
+backend/go.sum
+backend/internal/config/config.go
+backend/internal/config/config_test.go
+backend/internal/config/env_reachability_test.go
+backend/internal/config/image_storage_env_test.go
+backend/internal/config/proxy_probe_config_test.go
+backend/internal/config/validate_dingtalk.go
+backend/internal/config/validate_dingtalk_test.go
+backend/internal/config/webauthn_test.go
+backend/internal/config/wire.go
+backend/internal/domain/announcement.go
+backend/internal/domain/channel_monitor_quota.go
+backend/internal/domain/codex_models_manifest_config.go
+backend/internal/domain/constants.go
+backend/internal/domain/constants_test.go
+backend/internal/domain/model_allowlist.go
+backend/internal/domain/openai_messages_dispatch.go
+backend/internal/domain/reasoning_effort.go
+backend/internal/handler/admin/account_codex_agent_identity_import_test.go
+backend/internal/handler/admin/account_codex_import.go
+backend/internal/handler/admin/account_codex_import_test.go
+backend/internal/handler/admin/account_data.go
+backend/internal/handler/admin/account_data_handler_test.go
+backend/internal/handler/admin/account_handler.go
+backend/internal/handler/admin/account_handler_available_models_test.go
+backend/internal/handler/admin/account_handler_batch_delete_test.go
+backend/internal/handler/admin/account_handler_duplicate_test.go
+backend/internal/handler/admin/account_handler_grok_refresh_test.go
+backend/internal/handler/admin/account_handler_list_test.go
+backend/internal/handler/admin/account_handler_long_context_billing_test.go
+backend/internal/handler/admin/account_handler_mixed_channel_test.go
+backend/internal/handler/admin/account_handler_passthrough_test.go
+backend/internal/handler/admin/account_handler_simple_mode_test.go
+backend/internal/handler/admin/account_handler_spark_shadow_test.go
+backend/internal/handler/admin/account_health_handler.go
+backend/internal/handler/admin/account_ollama_cloud_usage.go
+backend/internal/handler/admin/account_ollama_cloud_usage_test.go
+backend/internal/handler/admin/account_shadow_parent.go
+backend/internal/handler/admin/account_shadow_parent_test.go
+backend/internal/handler/admin/account_today_stats_cache.go
+backend/internal/handler/admin/account_upstream_billing_probe.go
+backend/internal/handler/admin/account_upstream_billing_probe_test.go
+backend/internal/handler/admin/account_upstream_billing_rates.go
+backend/internal/handler/admin/admin_basic_handlers_test.go
+backend/internal/handler/admin/admin_helpers_test.go
+backend/internal/handler/admin/admin_service_stub_test.go
+backend/internal/handler/admin/affiliate_handler.go
+backend/internal/handler/admin/announcement_handler.go
+backend/internal/handler/admin/announcement_handler_sort_test.go
+backend/internal/handler/admin/anti_degrade_handler.go
+backend/internal/handler/admin/antigravity_oauth_handler.go
+backend/internal/handler/admin/apikey_handler.go
+backend/internal/handler/admin/apikey_handler_test.go
+backend/internal/handler/admin/audit_log_handler.go
+backend/internal/handler/admin/backup_handler.go
+backend/internal/handler/admin/batch_update_credentials_test.go
+backend/internal/handler/admin/billing_export_handler.go
+backend/internal/handler/admin/channel_handler.go
+backend/internal/handler/admin/channel_handler_test.go
+backend/internal/handler/admin/channel_monitor_duplicate_test.go
+backend/internal/handler/admin/channel_monitor_handler.go
+backend/internal/handler/admin/channel_monitor_template_handler.go
+backend/internal/handler/admin/cn_provider_handler.go
+backend/internal/handler/admin/compliance_handler.go
+backend/internal/handler/admin/content_moderation_handler.go
+backend/internal/handler/admin/dashboard_handler.go
+backend/internal/handler/admin/dashboard_handler_cache_test.go
+backend/internal/handler/admin/dashboard_handler_request_type_test.go
+backend/internal/handler/admin/dashboard_handler_user_breakdown_test.go
+backend/internal/handler/admin/dashboard_query_cache.go
+backend/internal/handler/admin/dashboard_snapshot_v2_handler.go
+backend/internal/handler/admin/data_management_handler.go
+backend/internal/handler/admin/data_management_handler_test.go
+backend/internal/handler/admin/error_passthrough_handler.go
+backend/internal/handler/admin/gemini_oauth_handler.go
+backend/internal/handler/admin/global_pricing_handler.go
+backend/internal/handler/admin/global_pricing_handler_test.go
+backend/internal/handler/admin/grok_import_probe.go
+backend/internal/handler/admin/grok_import_probe_handler_test.go
+backend/internal/handler/admin/grok_import_probe_test.go
+backend/internal/handler/admin/grok_media_eligibility_handler.go
+backend/internal/handler/admin/grok_media_eligibility_handler_test.go
+backend/internal/handler/admin/grok_oauth_handler.go
+backend/internal/handler/admin/grok_oauth_handler_test.go
+backend/internal/handler/admin/group_handler.go
+backend/internal/handler/admin/group_handler_duplicate_test.go
+backend/internal/handler/admin/group_handler_limit_test.go
+backend/internal/handler/admin/group_handler_openai_fast_test.go
+backend/internal/handler/admin/group_handler_platform_test.go
+backend/internal/handler/admin/group_handler_reasoning_effort_test.go
+backend/internal/handler/admin/group_handler_simple_mode_test.go
+backend/internal/handler/admin/id_list_utils.go
+backend/internal/handler/admin/id_list_utils_test.go
+backend/internal/handler/admin/idempotency_helper.go
+backend/internal/handler/admin/idempotency_helper_test.go
+backend/internal/handler/admin/margin_handler.go
+backend/internal/handler/admin/openai_oauth_handler.go
+backend/internal/handler/admin/openai_oauth_handler_reset_quota_test.go
+backend/internal/handler/admin/openai_oauth_handler_spark_shadow_test.go
+backend/internal/handler/admin/ops_alerts_handler.go
+backend/internal/handler/admin/ops_auth_cache_health_handler.go
+backend/internal/handler/admin/ops_dashboard_handler.go
+backend/internal/handler/admin/ops_handler.go
+backend/internal/handler/admin/ops_ingress_reject_handler.go
+backend/internal/handler/admin/ops_ingress_reject_handler_test.go
+backend/internal/handler/admin/ops_realtime_handler.go
+backend/internal/handler/admin/ops_runtime_logging_handler_test.go
+backend/internal/handler/admin/ops_settings_handler.go
+backend/internal/handler/admin/ops_snapshot_v2_handler.go
+backend/internal/handler/admin/ops_system_log_handler.go
+backend/internal/handler/admin/ops_system_log_handler_test.go
+backend/internal/handler/admin/ops_ws_handler.go
+backend/internal/handler/admin/payment_handler.go
+backend/internal/handler/admin/payment_handler_test.go
+backend/internal/handler/admin/plugin_handler.go
+backend/internal/handler/admin/promo_handler.go
+backend/internal/handler/admin/proxy_data.go
+backend/internal/handler/admin/proxy_data_handler_test.go
+backend/internal/handler/admin/proxy_handler.go
+backend/internal/handler/admin/proxy_partial_update_test.go
+backend/internal/handler/admin/redeem_export_handler_test.go
+backend/internal/handler/admin/redeem_handler.go
+backend/internal/handler/admin/redeem_handler_test.go
+backend/internal/handler/admin/scheduled_test_handler.go
+backend/internal/handler/admin/search_truncate_test.go
+backend/internal/handler/admin/security_policy_handler.go
+backend/internal/handler/admin/setting_handler.go
+backend/internal/handler/admin/setting_handler_audit.go
+backend/internal/handler/admin/setting_handler_auth_source_defaults_test.go
+backend/internal/handler/admin/setting_handler_codex_whitelist_test.go
+backend/internal/handler/admin/setting_handler_dingtalk_test.go
+backend/internal/handler/admin/setting_handler_email.go
+backend/internal/handler/admin/setting_handler_email_test.go
+backend/internal/handler/admin/setting_handler_partial_payload_test.go
+backend/internal/handler/admin/setting_handler_platform_quota_test.go
+backend/internal/handler/admin/setting_handler_runtime.go
+backend/internal/handler/admin/setting_handler_stepup_switch_test.go
+backend/internal/handler/admin/setting_handler_update.go
+backend/internal/handler/admin/snapshot_cache.go
+backend/internal/handler/admin/snapshot_cache_test.go
+backend/internal/handler/admin/spend_guard_handler.go
+backend/internal/handler/admin/subscription_handler.go
+backend/internal/handler/admin/system_handler.go
+backend/internal/handler/admin/system_handler_test.go
+backend/internal/handler/admin/ticket_handler.go
+backend/internal/handler/admin/tiered_routing_handler.go
+backend/internal/handler/admin/tls_fingerprint_profile_handler.go
+backend/internal/handler/admin/usage_cleanup_handler_test.go
+backend/internal/handler/admin/usage_handler.go
+backend/internal/handler/admin/usage_handler_request_type_test.go
+backend/internal/handler/admin/usage_handler_search_users_test.go
+backend/internal/handler/admin/usage_handler_sort_test.go
+backend/internal/handler/admin/usage_query_cache.go
+backend/internal/handler/admin/usage_query_cache_test.go
+backend/internal/handler/admin/user_attribute_handler.go
+backend/internal/handler/admin/user_handler.go
+backend/internal/handler/admin/user_handler_activity_test.go
+backend/internal/handler/admin/user_handler_batch_limits_test.go
+backend/internal/handler/admin/user_handler_get_deleted_test.go
+backend/internal/handler/admin/user_handler_list_apikey_group_test.go
+backend/internal/handler/admin/user_handler_role_stepup_test.go
+backend/internal/handler/admin/user_platform_quota_admin_test.go
+backend/internal/handler/admin/user_platform_quotas_handler_test.go
+backend/internal/handler/announcement_handler.go
+backend/internal/handler/api_key_handler.go
+backend/internal/handler/api_key_handler_validation_test.go
+backend/internal/handler/auth_captcha_request_test.go
+backend/internal/handler/auth_current_user_test.go
+backend/internal/handler/auth_dingtalk_client.go
+backend/internal/handler/auth_dingtalk_client_test.go
+backend/internal/handler/auth_dingtalk_oauth.go
+backend/internal/handler/auth_dingtalk_oauth_test.go
+backend/internal/handler/auth_email_oauth.go
+backend/internal/handler/auth_email_oauth_test.go
+backend/internal/handler/auth_handler.go
+backend/internal/handler/auth_linuxdo_oauth.go
+backend/internal/handler/auth_linuxdo_oauth_test.go
+backend/internal/handler/auth_oauth_captcha_start.go
+backend/internal/handler/auth_oauth_captcha_start_test.go
+backend/internal/handler/auth_oauth_logout_test.go
+backend/internal/handler/auth_oauth_pending_flow.go
+backend/internal/handler/auth_oauth_pending_flow_test.go
+backend/internal/handler/auth_oauth_test_helpers_test.go
+backend/internal/handler/auth_oidc_oauth.go
+backend/internal/handler/auth_oidc_oauth_test.go
+backend/internal/handler/auth_session_revocation_test.go
+backend/internal/handler/auth_wechat_oauth.go
+backend/internal/handler/auth_wechat_oauth_test.go
+backend/internal/handler/available_channel_handler.go
+backend/internal/handler/available_channel_handler_test.go
+backend/internal/handler/batch_image_handler.go
+backend/internal/handler/channel_monitor_user_handler.go
+backend/internal/handler/channel_monitor_v2_handler.go
+backend/internal/handler/channel_monitor_v2_handler_test.go
+backend/internal/handler/chat_completions_image_model_test.go
+backend/internal/handler/composite_platform.go
+backend/internal/handler/composite_platform_test.go
+backend/internal/handler/concurrency_error_response.go
+backend/internal/handler/concurrency_error_response_test.go
+backend/internal/handler/content_moderation_helper.go
+backend/internal/handler/dto/account_mapper_redact_test.go
+backend/internal/handler/dto/announcement.go
+backend/internal/handler/dto/api_key_mapper_last_used_test.go
+backend/internal/handler/dto/channel_monitor.go
+backend/internal/handler/dto/credentials_redact.go
+backend/internal/handler/dto/credentials_redact_test.go
+backend/internal/handler/dto/group_mapper_codex_manifest_test.go
+backend/internal/handler/dto/group_mapper_openai_fast_test.go
+backend/internal/handler/dto/group_mapper_profit_visibility_test.go
+backend/internal/handler/dto/mappers.go
+backend/internal/handler/dto/mappers_deleted_user_test.go
+backend/internal/handler/dto/mappers_usage_test.go
+backend/internal/handler/dto/mode1_seed_redact_test.go
+backend/internal/handler/dto/notify_email_entry.go
+backend/internal/handler/dto/public_settings_injection_schema_test.go
+backend/internal/handler/dto/settings.go
+backend/internal/handler/dto/types.go
+backend/internal/handler/dto/user_mapper_activity_test.go
+backend/internal/handler/endpoint.go
+backend/internal/handler/endpoint_test.go
+backend/internal/handler/failover_loop.go
+backend/internal/handler/failover_loop_profit_veto_test.go
+backend/internal/handler/failover_loop_test.go
+backend/internal/handler/gateway_handler.go
+backend/internal/handler/gateway_handler_billing_error_test.go
+backend/internal/handler/gateway_handler_cancellation_test.go
+backend/internal/handler/gateway_handler_chat_completions.go
+backend/internal/handler/gateway_handler_error_fallback_test.go
+backend/internal/handler/gateway_handler_intercept_test.go
+backend/internal/handler/gateway_handler_responses.go
+backend/internal/handler/gateway_handler_stream_failover_test.go
+backend/internal/handler/gateway_handler_usage_test.go
+backend/internal/handler/gateway_handler_warmup_intercept_unit_test.go
+backend/internal/handler/gateway_helper.go
+backend/internal/handler/gateway_helper_backoff_test.go
+backend/internal/handler/gateway_helper_fastpath_test.go
+backend/internal/handler/gateway_helper_hotpath_test.go
+backend/internal/handler/gateway_helper_test.go
+backend/internal/handler/gateway_key_billing.go
+backend/internal/handler/gateway_key_billing_test.go
+backend/internal/handler/gateway_model_allowlist_listing_test.go
+backend/internal/handler/gateway_models_test.go
+backend/internal/handler/gateway_web_search.go
+backend/internal/handler/gemini_cli_session_test.go
+backend/internal/handler/gemini_v1beta_handler.go
+backend/internal/handler/gemini_v1beta_handler_test.go
+backend/internal/handler/grok_audio.go
+backend/internal/handler/grok_audio_billing_test.go
+backend/internal/handler/grok_media.go
+backend/internal/handler/grok_media_test.go
+backend/internal/handler/handler.go
+backend/internal/handler/idempotency_helper.go
+backend/internal/handler/idempotency_helper_test.go
+backend/internal/handler/image_concurrency_limiter.go
+backend/internal/handler/image_concurrency_limiter_test.go
+backend/internal/handler/image_task_admin_toggle_test.go
+backend/internal/handler/image_task_handler.go
+backend/internal/handler/image_task_handler_test.go
+backend/internal/handler/logging.go
+backend/internal/handler/model_plaza_handler.go
+backend/internal/handler/model_plaza_handler_test.go
+backend/internal/handler/no_account_error.go
+backend/internal/handler/no_account_error_test.go
+backend/internal/handler/openai_alpha_search.go
+backend/internal/handler/openai_automation_bootstrap_test.go
+backend/internal/handler/openai_body_limit_failover_test.go
+backend/internal/handler/openai_chat_completions.go
+backend/internal/handler/openai_client_disconnect_test.go
+backend/internal/handler/openai_codex_models_handler.go
+backend/internal/handler/openai_codex_models_handler_test.go
+backend/internal/handler/openai_delegation_bootstrap_test.go
+backend/internal/handler/openai_embeddings.go
+backend/internal/handler/openai_gateway_cn_dispatch_test.go
+backend/internal/handler/openai_gateway_compact_body_signal_test.go
+backend/internal/handler/openai_gateway_compact_log_test.go
+backend/internal/handler/openai_gateway_count_tokens.go
+backend/internal/handler/openai_gateway_credential_failover_loop_test.go
+backend/internal/handler/openai_gateway_credential_failover_test.go
+backend/internal/handler/openai_gateway_cyber_test.go
+backend/internal/handler/openai_gateway_endpoint_normalization_test.go
+backend/internal/handler/openai_gateway_first_output_timeout_test.go
+backend/internal/handler/openai_gateway_handler.go
+backend/internal/handler/openai_gateway_handler_test.go
+backend/internal/handler/openai_gateway_reasoning_failover.go
+backend/internal/handler/openai_gateway_reasoning_failover_test.go
+backend/internal/handler/openai_gateway_usage_context_test.go
+backend/internal/handler/openai_gateway_ws_failover_resume_test.go
+backend/internal/handler/openai_gateway_ws_model_allowlist_test.go
+backend/internal/handler/openai_grok_image_intent_gate_test.go
+backend/internal/handler/openai_image_intent_hint_test.go
+backend/internal/handler/openai_images.go
+backend/internal/handler/openai_images_controls_test.go
+backend/internal/handler/openai_images_failover_test.go
+backend/internal/handler/openai_live.go
+backend/internal/handler/openai_live_test.go
+backend/internal/handler/openai_models_handler.go
+backend/internal/handler/openai_models_handler_test.go
+backend/internal/handler/openai_profit_slot_recheck_test.go
+backend/internal/handler/openai_profit_veto_budget_test.go
+backend/internal/handler/openai_quota_platform_contract_test.go
+backend/internal/handler/openai_responses_astra_pro_failover_test.go
+backend/internal/handler/openai_responses_failover_cancel_test.go
+backend/internal/handler/openai_responses_image_intent_benchmark_test.go
+backend/internal/handler/openai_responses_input_tokens_test.go
+backend/internal/handler/openai_service_tier_validation_test.go
+backend/internal/handler/openai_stream_validation.go
+backend/internal/handler/openai_stream_validation_test.go
+backend/internal/handler/openai_ws_client_close_attribution_test.go
+backend/internal/handler/openai_ws_turn_pricing_test.go
+backend/internal/handler/openai_ws_v2_passthrough_cyber_test.go
+backend/internal/handler/openai_x_search.go
+backend/internal/handler/openai_x_search_test.go
+backend/internal/handler/ops_capture_writer_nil_test.go
+backend/internal/handler/ops_error_logger.go
+backend/internal/handler/ops_error_logger_attribution_test.go
+backend/internal/handler/ops_error_logger_cyber_test.go
+backend/internal/handler/ops_error_logger_test.go
+backend/internal/handler/ops_ingress_reject_capture_test.go
+backend/internal/handler/ops_platform_test.go
+backend/internal/handler/page_handler.go
+backend/internal/handler/page_handler_test.go
+backend/internal/handler/passkey_handler.go
+backend/internal/handler/passkey_handler_test.go
+backend/internal/handler/payment_handler.go
+backend/internal/handler/payment_handler_resume_test.go
+backend/internal/handler/payment_webhook_handler.go
+backend/internal/handler/payment_webhook_handler_test.go
+backend/internal/handler/quotaview/helpers.go
+backend/internal/handler/quotaview/helpers_test.go
+backend/internal/handler/redeem_handler.go
+backend/internal/handler/request_body_limit.go
+backend/internal/handler/request_body_limit_test.go
+backend/internal/handler/request_body_parse_log.go
+backend/internal/handler/request_body_parse_log_test.go
+backend/internal/handler/request_body_read_log.go
+backend/internal/handler/request_body_read_log_test.go
+backend/internal/handler/security_audit_errors.go
+backend/internal/handler/security_audit_errors_test.go
+backend/internal/handler/security_audit_helper.go
+backend/internal/handler/security_audit_helper_test.go
+backend/internal/handler/security_audit_media_submit_test.go
+backend/internal/handler/security_audit_order_test.go
+backend/internal/handler/security_policy_helper.go
+backend/internal/handler/security_policy_helper_test.go
+backend/internal/handler/setting_handler.go
+backend/internal/handler/setting_handler_public_test.go
+backend/internal/handler/stream_error_event.go
+backend/internal/handler/stream_error_event_test.go
+backend/internal/handler/subscription_handler.go
+backend/internal/handler/totp_handler.go
+backend/internal/handler/usage_handler.go
+backend/internal/handler/usage_handler_daily_test.go
+backend/internal/handler/usage_handler_request_type_test.go
+backend/internal/handler/usage_handler_sort_test.go
+backend/internal/handler/usage_record_submit_task_test.go
+backend/internal/handler/usage_record_task_fallback_test.go
+backend/internal/handler/user_handler.go
+backend/internal/handler/user_handler_test.go
+backend/internal/handler/user_msg_queue_helper.go
+backend/internal/handler/user_platform_quotas_handler_test.go
+backend/internal/handler/wire.go
+backend/internal/integration/e2e_gateway_test.go
+backend/internal/integration/e2e_helpers_test.go
+backend/internal/integration/e2e_user_flow_test.go
+backend/internal/middleware/rate_limiter.go
+backend/internal/middleware/rate_limiter_integration_test.go
+backend/internal/middleware/rate_limiter_test.go
+backend/internal/model/error_passthrough_rule.go
+backend/internal/model/error_passthrough_rule_test.go
+backend/internal/model/tls_fingerprint_profile.go
+backend/internal/payment/amount.go
+backend/internal/payment/amount_test.go
+backend/internal/payment/crypto.go
+backend/internal/payment/crypto_test.go
+backend/internal/payment/currency.go
+backend/internal/payment/fee.go
+backend/internal/payment/fee_test.go
+backend/internal/payment/load_balancer.go
+backend/internal/payment/load_balancer_test.go
+backend/internal/payment/provider/airwallex.go
+backend/internal/payment/provider/airwallex_test.go
+backend/internal/payment/provider/alipay.go
+backend/internal/payment/provider/alipay_test.go
+backend/internal/payment/provider/easypay.go
+backend/internal/payment/provider/easypay_query_test.go
+backend/internal/payment/provider/easypay_refund_test.go
+backend/internal/payment/provider/easypay_sign_test.go
+backend/internal/payment/provider/easypay_url_test.go
+backend/internal/payment/provider/factory.go
+backend/internal/payment/provider/stripe.go
+backend/internal/payment/provider/stripe_test.go
+backend/internal/payment/provider/wxpay.go
+backend/internal/payment/provider/wxpay_test.go
+backend/internal/payment/registry.go
+backend/internal/payment/registry_test.go
+backend/internal/payment/types.go
+backend/internal/payment/wire.go
+backend/internal/payment/wire_test.go
+backend/internal/pkg/anthropicfp/dateline.go
+backend/internal/pkg/anthropicfp/dateline_test.go
+backend/internal/pkg/antigravity/claude_types.go
+backend/internal/pkg/antigravity/claude_types_test.go
+backend/internal/pkg/antigravity/client.go
+backend/internal/pkg/antigravity/client_test.go
+backend/internal/pkg/antigravity/gemini_types.go
+backend/internal/pkg/antigravity/oauth.go
+backend/internal/pkg/antigravity/oauth_test.go
+backend/internal/pkg/antigravity/request_transformer.go
+backend/internal/pkg/antigravity/request_transformer_test.go
+backend/internal/pkg/antigravity/response_transformer.go
+backend/internal/pkg/antigravity/response_transformer_test.go
+backend/internal/pkg/antigravity/schema_cleaner.go
+backend/internal/pkg/antigravity/stream_transformer.go
+backend/internal/pkg/antigravity/usage_contract_test.go
+backend/internal/pkg/apicompat/anthropic_responses_test.go
+backend/internal/pkg/apicompat/anthropic_to_responses.go
+backend/internal/pkg/apicompat/anthropic_to_responses_response.go
+backend/internal/pkg/apicompat/anthropic_to_responses_stream_test.go
+backend/internal/pkg/apicompat/chatcompletions_anthropic_bridge.go
+backend/internal/pkg/apicompat/chatcompletions_anthropic_bridge_test.go
+backend/internal/pkg/apicompat/chatcompletions_anthropic_reasoning_passback_test.go
+backend/internal/pkg/apicompat/chatcompletions_reasoning_alias_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_bridge.go
+backend/internal/pkg/apicompat/chatcompletions_responses_bridge_custom_tools_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_bridge_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_reasoning_cache_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_request_invariants_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_stream_lifecycle_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_test.go
+backend/internal/pkg/apicompat/chatcompletions_responses_tool_output_media_test.go
+backend/internal/pkg/apicompat/chatcompletions_to_responses.go
+backend/internal/pkg/apicompat/chatcompletions_x_search_test.go
+backend/internal/pkg/apicompat/response_format.go
+backend/internal/pkg/apicompat/responses_anthropic_cache_creation_test.go
+backend/internal/pkg/apicompat/responses_client_tools.go
+backend/internal/pkg/apicompat/responses_client_tools_item_id_helper_test.go
+backend/internal/pkg/apicompat/responses_client_tools_item_id_test.go
+backend/internal/pkg/apicompat/responses_client_tools_test.go
+backend/internal/pkg/apicompat/responses_created_at_wire_test.go
+backend/internal/pkg/apicompat/responses_namespace.go
+backend/internal/pkg/apicompat/responses_namespace_test.go
+backend/internal/pkg/apicompat/responses_stream_event_wire.go
+backend/internal/pkg/apicompat/responses_stream_event_wire_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic.go
+backend/internal/pkg/apicompat/responses_to_anthropic_cc_chain_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic_instructions_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic_invalid_blocks_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic_parallel_tool_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic_read_tool_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic_request.go
+backend/internal/pkg/apicompat/responses_to_anthropic_tool_pairing_test.go
+backend/internal/pkg/apicompat/responses_to_anthropic_tools_test.go
+backend/internal/pkg/apicompat/responses_to_chatcompletions.go
+backend/internal/pkg/apicompat/responses_to_chatcompletions_codex_events_test.go
+backend/internal/pkg/apicompat/responses_to_chatcompletions_tool_name_test.go
+backend/internal/pkg/apicompat/responses_tool_search_discoveries.go
+backend/internal/pkg/apicompat/service_tier_passthrough_test.go
+backend/internal/pkg/apicompat/streaming_stop_reason_test.go
+backend/internal/pkg/apicompat/testdata/issue5302/nonstream_reasoning.json
+backend/internal/pkg/apicompat/testdata/issue5302/reasoning_content_precedence.json
+backend/internal/pkg/apicompat/testdata/issue5302/stream_reasoning.json
+backend/internal/pkg/apicompat/types.go
+backend/internal/pkg/claude/cli_version.go
+backend/internal/pkg/claude/cli_version_test.go
+backend/internal/pkg/claude/constants.go
+backend/internal/pkg/claude/constants_cli_version_test.go
+backend/internal/pkg/claude/constants_model_test.go
+backend/internal/pkg/claude/effort_catalog.go
+backend/internal/pkg/claude/effort_catalog_test.go
+backend/internal/pkg/ctxkey/ctxkey.go
+backend/internal/pkg/errors/errors.go
+backend/internal/pkg/errors/errors_test.go
+backend/internal/pkg/errors/http.go
+backend/internal/pkg/errors/types.go
+backend/internal/pkg/gemini/models.go
+backend/internal/pkg/gemini/models_test.go
+backend/internal/pkg/geminicli/codeassist_types.go
+backend/internal/pkg/geminicli/constants.go
+backend/internal/pkg/geminicli/drive_client.go
+backend/internal/pkg/geminicli/drive_client_test.go
+backend/internal/pkg/geminicli/models.go
+backend/internal/pkg/geminicli/models_test.go
+backend/internal/pkg/geminicli/oauth.go
+backend/internal/pkg/geminicli/oauth_test.go
+backend/internal/pkg/geminicli/sanitize.go
+backend/internal/pkg/geminicli/token_types.go
+backend/internal/pkg/googleapi/error.go
+backend/internal/pkg/googleapi/error_test.go
+backend/internal/pkg/googleapi/status.go
+backend/internal/pkg/httpclient/pool.go
+backend/internal/pkg/httpclient/pool_test.go
+backend/internal/pkg/httputil/body.go
+backend/internal/pkg/httputil/body_lenient_json_test.go
+backend/internal/pkg/httputil/body_test.go
+backend/internal/pkg/httputil/preread_body_test.go
+backend/internal/pkg/ip/ip.go
+backend/internal/pkg/ip/ip_test.go
+backend/internal/pkg/logger/config_adapter.go
+backend/internal/pkg/logger/logger.go
+backend/internal/pkg/logger/logger_test.go
+backend/internal/pkg/logger/options.go
+backend/internal/pkg/logger/options_test.go
+backend/internal/pkg/logger/slog_handler.go
+backend/internal/pkg/logger/slog_handler_test.go
+backend/internal/pkg/logger/stdlog_bridge_test.go
+backend/internal/pkg/oauth/oauth.go
+backend/internal/pkg/oauth/oauth_test.go
+backend/internal/pkg/openai/allowed_client.go
+backend/internal/pkg/openai/allowed_client_freeform_test.go
+backend/internal/pkg/openai/allowed_client_skip_test.go
+backend/internal/pkg/openai/allowed_client_test.go
+backend/internal/pkg/openai/allowed_client_whitelistable_test.go
+backend/internal/pkg/openai/constants.go
+backend/internal/pkg/openai/constants_test.go
+backend/internal/pkg/openai/engine_fingerprint_signal.go
+backend/internal/pkg/openai/engine_fingerprint_signal_test.go
+backend/internal/pkg/openai/instructions.txt
+backend/internal/pkg/openai/instructions_gpt5_1.txt
+backend/internal/pkg/openai/instructions_gpt5_2.txt
+backend/internal/pkg/openai/instructions_gpt5_5.txt
+backend/internal/pkg/openai/instructions_gpt6_astra.txt
+backend/internal/pkg/openai/instructions_test.go
+backend/internal/pkg/openai/oauth.go
+backend/internal/pkg/openai/oauth_test.go
+backend/internal/pkg/openai/request.go
+backend/internal/pkg/openai/request_codex_version_test.go
+backend/internal/pkg/openai/request_identity_test.go
+backend/internal/pkg/openai/request_test.go
+backend/internal/pkg/openai/request_version_test.go
+backend/internal/pkg/openai_compat/upstream_capability.go
+backend/internal/pkg/openai_compat/upstream_capability_test.go
+backend/internal/pkg/pagination/pagination.go
+backend/internal/pkg/pagination/pagination_test.go
+backend/internal/pkg/proxyurl/parse.go
+backend/internal/pkg/proxyurl/parse_test.go
+backend/internal/pkg/proxyutil/dialer.go
+backend/internal/pkg/proxyutil/dialer_test.go
+backend/internal/pkg/proxyutil/dialer_timeout_test.go
+backend/internal/pkg/redissession/store.go
+backend/internal/pkg/redissession/store_test.go
+backend/internal/pkg/requestmodel/requestmodel.go
+backend/internal/pkg/requestmodel/requestmodel_test.go
+backend/internal/pkg/response/response.go
+backend/internal/pkg/response/response_test.go
+backend/internal/pkg/servertiming/collector.go
+backend/internal/pkg/servertiming/collector_test.go
+backend/internal/pkg/servertiming/http.go
+backend/internal/pkg/servertiming/http_test.go
+backend/internal/pkg/sysutil/restart.go
+backend/internal/pkg/timezone/timezone.go
+backend/internal/pkg/timezone/timezone_test.go
+backend/internal/pkg/tlsfingerprint/builtin_profiles.go
+backend/internal/pkg/tlsfingerprint/dialer.go
+backend/internal/pkg/tlsfingerprint/dialer_capture_test.go
+backend/internal/pkg/tlsfingerprint/dialer_integration_test.go
+backend/internal/pkg/tlsfingerprint/dialer_test.go
+backend/internal/pkg/tlsfingerprint/profile.go
+backend/internal/pkg/tlsfingerprint/test_types_test.go
+backend/internal/pkg/tlsfingerprint/transport.go
+backend/internal/pkg/tlsfingerprint/transport_local_test.go
+backend/internal/pkg/usagestats/account_stats.go
+backend/internal/pkg/usagestats/usage_log_types.go
+backend/internal/pkg/usagestats/usage_log_types_test.go
+backend/internal/pkg/websearch/brave.go
+backend/internal/pkg/websearch/brave_test.go
+backend/internal/pkg/websearch/helpers.go
+backend/internal/pkg/websearch/helpers_test.go
+backend/internal/pkg/websearch/manager.go
+backend/internal/pkg/websearch/manager_test.go
+backend/internal/pkg/websearch/provider.go
+backend/internal/pkg/websearch/tavily.go
+backend/internal/pkg/websearch/tavily_test.go
+backend/internal/pkg/websearch/types.go
+backend/internal/pkg/xai/billing.go
+backend/internal/pkg/xai/billing_test.go
+backend/internal/pkg/xai/cli_identity.go
+backend/internal/pkg/xai/cli_identity_test.go
+backend/internal/pkg/xai/models.go
+backend/internal/pkg/xai/models_test.go
+backend/internal/pkg/xai/oauth.go
+backend/internal/pkg/xai/oauth_redis_fallback_test.go
+backend/internal/pkg/xai/oauth_test.go
+backend/internal/pkg/xai/quota.go
+backend/internal/pkg/xai/quota_test.go
+backend/internal/pkg/xai/sso_device.go
+backend/internal/pkg/xai/sso_device_test.go
+backend/internal/pkg/xai/subscription_tier.go
+backend/internal/pkg/xai/subscription_tier_test.go
+backend/internal/pkg/xai/usage.go
+backend/internal/pkg/xai/usage_test.go
+backend/internal/platform/liveattestation/attestation.go
+backend/internal/platform/liveattestation/attestation_darwin.go
+backend/internal/platform/liveattestation/attestation_unsupported.go
+backend/internal/platform/liveattestation/attestation_unsupported_test.go
+backend/internal/repository/account_repo.go
+backend/internal/repository/account_repo_auto_pause_test.go
+backend/internal/repository/account_repo_codex_fingerprint_seed_test.go
+backend/internal/repository/account_repo_compact_extra_test.go
+backend/internal/repository/account_repo_duplicate_integration_test.go
+backend/internal/repository/account_repo_grok_billing_test.go
+backend/internal/repository/account_repo_integration_test.go
+backend/internal/repository/account_repo_model_availability_test.go
+backend/internal/repository/account_repo_ollama_cloud_usage.go
+backend/internal/repository/account_repo_ollama_cloud_usage_integration_test.go
+backend/internal/repository/account_repo_ollama_cloud_usage_test.go
+backend/internal/repository/account_repo_schedulable_projection_integration_test.go
+backend/internal/repository/account_repo_schedulable_projection_test.go
+backend/internal/repository/account_repo_sort_integration_test.go
+backend/internal/repository/account_repo_spark_shadow_test.go
+backend/internal/repository/account_repo_temp_unsched_test.go
+backend/internal/repository/account_repo_test.go
+backend/internal/repository/account_repo_upstream_billing_probe_cas_test.go
+backend/internal/repository/account_repo_upstream_billing_probe_due_integration_test.go
+backend/internal/repository/account_repo_upstream_billing_probe_due_test.go
+backend/internal/repository/account_repo_upstream_billing_probe_test.go
+backend/internal/repository/account_repo_upstream_billing_probe_update_test.go
+backend/internal/repository/aes_encryptor.go
+backend/internal/repository/aes_encryptor_test.go
+backend/internal/repository/affiliate_repo.go
+backend/internal/repository/affiliate_repo_integration_test.go
+backend/internal/repository/affiliate_repo_test.go
+backend/internal/repository/aliyun_captcha_verifier.go
+backend/internal/repository/aliyun_captcha_verifier_test.go
+backend/internal/repository/allowed_groups_contract_integration_test.go
+backend/internal/repository/announcement_read_repo.go
+backend/internal/repository/announcement_repo.go
+backend/internal/repository/announcement_repo_sort_test.go
+backend/internal/repository/api_key_cache.go
+backend/internal/repository/api_key_cache_integration_test.go
+backend/internal/repository/api_key_cache_subscriber_test.go
+backend/internal/repository/api_key_cache_test.go
+backend/internal/repository/api_key_legacy_compat_test.go
+backend/internal/repository/api_key_repo.go
+backend/internal/repository/api_key_repo_codex_manifest_projection_integration_test.go
+backend/internal/repository/api_key_repo_integration_test.go
+backend/internal/repository/api_key_repo_last_used_unit_test.go
+backend/internal/repository/api_key_repo_lost_update_integration_test.go
+backend/internal/repository/api_key_repo_messages_dispatch_unit_test.go
+backend/internal/repository/api_key_repo_model_allowlist_projection_integration_test.go
+backend/internal/repository/api_key_repo_openai_fast_projection_integration_test.go
+backend/internal/repository/api_key_repo_profit_projection_integration_test.go
+backend/internal/repository/api_key_repo_sort_integration_test.go
+backend/internal/repository/audit_log_repo.go
+backend/internal/repository/auth_cache_invalidation_outbox_integration_test.go
+backend/internal/repository/auth_cache_invalidation_outbox_repo.go
+backend/internal/repository/auth_cache_invalidation_outbox_repo_test.go
+backend/internal/repository/auth_cache_invalidation_profit_integration_test.go
+backend/internal/repository/auth_identity_compat_backfill_integration_test.go
+backend/internal/repository/auth_identity_legacy_migration_integration_test.go
+backend/internal/repository/backup_pg_dumper.go
+backend/internal/repository/backup_pg_dumper_test.go
+backend/internal/repository/backup_s3_store.go
+backend/internal/repository/backup_s3_store_test.go
+backend/internal/repository/batch_image_download_limiter.go
+backend/internal/repository/batch_image_download_limiter_test.go
+backend/internal/repository/batch_image_queue.go
+backend/internal/repository/batch_image_queue_test.go
+backend/internal/repository/batch_image_repo.go
+backend/internal/repository/batch_image_repo_integration_test.go
+backend/internal/repository/billing_cache.go
+backend/internal/repository/billing_cache_integration_test.go
+backend/internal/repository/billing_cache_jitter_test.go
+backend/internal/repository/billing_cache_test.go
+backend/internal/repository/billing_cache_user_platform_quota_test.go
+backend/internal/repository/channel_cache.go
+backend/internal/repository/channel_cache_test.go
+backend/internal/repository/channel_monitor_duplicate_test.go
+backend/internal/repository/channel_monitor_quota_integration_test.go
+backend/internal/repository/channel_monitor_repo.go
+backend/internal/repository/channel_monitor_template_duplicate_metadata_integration_test.go
+backend/internal/repository/channel_monitor_template_duplicate_metadata_unit_test.go
+backend/internal/repository/channel_monitor_template_repo.go
+backend/internal/repository/channel_monitor_v2_aggregation.go
+backend/internal/repository/channel_monitor_v2_repo.go
+backend/internal/repository/channel_monitor_v2_repo_test.go
+backend/internal/repository/channel_repo.go
+backend/internal/repository/channel_repo_account_stats_pricing.go
+backend/internal/repository/channel_repo_pricing.go
+backend/internal/repository/channel_repo_pricing_time_test.go
+backend/internal/repository/channel_repo_test.go
+backend/internal/repository/claude_oauth_service.go
+backend/internal/repository/claude_oauth_service_test.go
+backend/internal/repository/claude_usage_service.go
+backend/internal/repository/claude_usage_service_test.go
+backend/internal/repository/codex_fingerprint_seed_migration_integration_test.go
+backend/internal/repository/composite_model_route_repo.go
+backend/internal/repository/concurrency_cache.go
+backend/internal/repository/concurrency_cache_benchmark_test.go
+backend/internal/repository/concurrency_cache_integration_test.go
+backend/internal/repository/concurrency_cache_live_test.go
+backend/internal/repository/content_moderation_hash_cache.go
+backend/internal/repository/content_moderation_repo.go
+backend/internal/repository/content_moderation_repo_test.go
+backend/internal/repository/custom_group_usage_rollup_repo.go
+backend/internal/repository/custom_group_usage_timezone_test.go
+backend/internal/repository/dashboard_aggregation_group_usage_test.go
+backend/internal/repository/dashboard_aggregation_repo.go
+backend/internal/repository/dashboard_cache.go
+backend/internal/repository/dashboard_cache_test.go
+backend/internal/repository/db_pool.go
+backend/internal/repository/db_pool_test.go
+backend/internal/repository/decompress_response_test.go
+backend/internal/repository/email_cache.go
+backend/internal/repository/email_cache_integration_test.go
+backend/internal/repository/email_cache_test.go
+backend/internal/repository/ent.go
+backend/internal/repository/ent_init_retry_test.go
+backend/internal/repository/error_passthrough_cache.go
+backend/internal/repository/error_passthrough_repo.go
+backend/internal/repository/error_translate.go
+backend/internal/repository/fixtures_integration_test.go
+backend/internal/repository/gateway_cache.go
+backend/internal/repository/gateway_cache_cyber_test.go
+backend/internal/repository/gateway_cache_integration_test.go
+backend/internal/repository/gateway_cache_live_test.go
+backend/internal/repository/gateway_cache_reasoning_test.go
+backend/internal/repository/gateway_routing_integration_test.go
+backend/internal/repository/gemini_drive_client.go
+backend/internal/repository/gemini_oauth_client.go
+backend/internal/repository/gemini_token_cache.go
+backend/internal/repository/gemini_token_cache_integration_test.go
+backend/internal/repository/gemini_token_cache_test.go
+backend/internal/repository/geminicli_codeassist_client.go
+backend/internal/repository/github_release_service.go
+backend/internal/repository/github_release_service_test.go
+backend/internal/repository/global_model_pricing_repo.go
+backend/internal/repository/grok_oauth_client.go
+backend/internal/repository/grok_oauth_client_test.go
+backend/internal/repository/group_model_allowlist_repair_migration_integration_test.go
+backend/internal/repository/group_repo.go
+backend/internal/repository/group_repo_duplicate_integration_test.go
+backend/internal/repository/group_repo_integration_test.go
+backend/internal/repository/group_repo_sort_integration_test.go
+backend/internal/repository/group_usage_rollup_trigger_integration_test.go
+backend/internal/repository/http_upstream.go
+backend/internal/repository/http_upstream_benchmark_test.go
+backend/internal/repository/http_upstream_dial_timeout_test.go
+backend/internal/repository/http_upstream_http2_keepalive_test.go
+backend/internal/repository/http_upstream_test.go
+backend/internal/repository/http_upstream_tls_local_test.go
+backend/internal/repository/idempotency_repo.go
+backend/internal/repository/idempotency_repo_integration_test.go
+backend/internal/repository/identity_cache.go
+backend/internal/repository/identity_cache_integration_test.go
+backend/internal/repository/identity_cache_test.go
+backend/internal/repository/image_storage_s3.go
+backend/internal/repository/image_task_store.go
+backend/internal/repository/image_task_store_test.go
+backend/internal/repository/inprocess_transport_test.go
+backend/internal/repository/integration_harness_test.go
+backend/internal/repository/internal500_counter_cache.go
+backend/internal/repository/leader_lock_cache.go
+backend/internal/repository/leader_lock_cache_test.go
+backend/internal/repository/migrations_runner.go
+backend/internal/repository/migrations_runner_checksum_test.go
+backend/internal/repository/migrations_runner_extra_test.go
+backend/internal/repository/migrations_runner_notx_test.go
+backend/internal/repository/migrations_schema_integration_test.go
+backend/internal/repository/openai_403_counter_cache.go
+backend/internal/repository/openai_long_context_billing_migration_integration_test.go
+backend/internal/repository/openai_oauth_service.go
+backend/internal/repository/openai_oauth_service_test.go
+backend/internal/repository/ops_error_where_test.go
+backend/internal/repository/ops_ingress_reject_repo.go
+backend/internal/repository/ops_ingress_reject_repo_test.go
+backend/internal/repository/ops_repo.go
+backend/internal/repository/ops_repo_alerts.go
+backend/internal/repository/ops_repo_args_test.go
+backend/internal/repository/ops_repo_dashboard.go
+backend/internal/repository/ops_repo_dashboard_timeout_test.go
+backend/internal/repository/ops_repo_error_where_test.go
+backend/internal/repository/ops_repo_get_error_log_by_id_integration_test.go
+backend/internal/repository/ops_repo_histograms.go
+backend/internal/repository/ops_repo_latency_histogram_buckets.go
+backend/internal/repository/ops_repo_latency_histogram_buckets_test.go
+backend/internal/repository/ops_repo_metrics.go
+backend/internal/repository/ops_repo_metrics_test.go
+backend/internal/repository/ops_repo_openai_token_stats.go
+backend/internal/repository/ops_repo_openai_token_stats_test.go
+backend/internal/repository/ops_repo_preagg.go
+backend/internal/repository/ops_repo_realtime_traffic.go
+backend/internal/repository/ops_repo_replay_cleanup_test.go
+backend/internal/repository/ops_repo_request_details.go
+backend/internal/repository/ops_repo_system_logs_test.go
+backend/internal/repository/ops_repo_trends.go
+backend/internal/repository/ops_repo_window_stats.go
+backend/internal/repository/ops_write_pressure_integration_test.go
+backend/internal/repository/pagination.go
+backend/internal/repository/passkey_repo.go
+backend/internal/repository/passkey_session_store.go
+backend/internal/repository/plugin_repo.go
+backend/internal/repository/plugin_repo_integration_test.go
+backend/internal/repository/pricing_service.go
+backend/internal/repository/pricing_service_test.go
+backend/internal/repository/promo_code_repo.go
+backend/internal/repository/proxy_backup_reference_integration_test.go
+backend/internal/repository/proxy_expiry_integration_test.go
+backend/internal/repository/proxy_expiry_test.go
+backend/internal/repository/proxy_latency_cache.go
+backend/internal/repository/proxy_probe_service.go
+backend/internal/repository/proxy_probe_service_test.go
+backend/internal/repository/proxy_repeated_expiry_integration_test.go
+backend/internal/repository/proxy_repo.go
+backend/internal/repository/proxy_repo_integration_test.go
+backend/internal/repository/proxy_repo_sort_integration_test.go
+backend/internal/repository/proxy_repo_upstream_billing_probe_test.go
+backend/internal/repository/redeem_cache.go
+backend/internal/repository/redeem_cache_integration_test.go
+backend/internal/repository/redeem_cache_test.go
+backend/internal/repository/redeem_code_repo.go
+backend/internal/repository/redeem_code_repo_integration_test.go
+backend/internal/repository/redeem_code_repo_sort_integration_test.go
+backend/internal/repository/redis.go
+backend/internal/repository/redis_test.go
+backend/internal/repository/refresh_token_cache.go
+backend/internal/repository/req_client_pool.go
+backend/internal/repository/req_client_pool_test.go
+backend/internal/repository/rpm_cache.go
+backend/internal/repository/s3_client.go
+backend/internal/repository/scheduled_test_repo.go
+backend/internal/repository/scheduler_cache.go
+backend/internal/repository/scheduler_cache_integration_test.go
+backend/internal/repository/scheduler_cache_last_used_unit_test.go
+backend/internal/repository/scheduler_cache_rate_multiplier_unit_test.go
+backend/internal/repository/scheduler_cache_test.go
+backend/internal/repository/scheduler_cache_unit_test.go
+backend/internal/repository/scheduler_mode1_projection_test.go
+backend/internal/repository/scheduler_outbox_repo.go
+backend/internal/repository/scheduler_outbox_repo_test.go
+backend/internal/repository/scheduler_snapshot_outbox_integration_test.go
+backend/internal/repository/security_policy_repo.go
+backend/internal/repository/security_policy_session_store.go
+backend/internal/repository/security_policy_session_store_test.go
+backend/internal/repository/security_secret_bootstrap.go
+backend/internal/repository/security_secret_bootstrap_test.go
+backend/internal/repository/server_timing_redis.go
+backend/internal/repository/server_timing_redis_test.go
+backend/internal/repository/server_timing_sql.go
+backend/internal/repository/server_timing_sql_test.go
+backend/internal/repository/session_limit_cache.go
+backend/internal/repository/session_limit_cache_integration_test.go
+backend/internal/repository/setting_repo.go
+backend/internal/repository/setting_repo_integration_test.go
+backend/internal/repository/simple_mode_admin_concurrency.go
+backend/internal/repository/simple_mode_default_groups.go
+backend/internal/repository/simple_mode_default_groups_integration_test.go
+backend/internal/repository/soft_delete_ent_integration_test.go
+backend/internal/repository/sql_scan.go
+backend/internal/repository/temp_unsched_cache.go
+backend/internal/repository/temp_unsched_cache_health_test.go
+backend/internal/repository/tencent_captcha_service.go
+backend/internal/repository/tencent_captcha_service_test.go
+backend/internal/repository/timeout_counter_cache.go
+backend/internal/repository/tls_fingerprint_profile_cache.go
+backend/internal/repository/tls_fingerprint_profile_repo.go
+backend/internal/repository/totp_cache.go
+backend/internal/repository/turnstile_service.go
+backend/internal/repository/turnstile_service_test.go
+backend/internal/repository/update_cache.go
+backend/internal/repository/update_cache_integration_test.go
+backend/internal/repository/upstream_billing_probe_persistence_integration_test.go
+backend/internal/repository/usage_billing_repo.go
+backend/internal/repository/usage_billing_repo_integration_test.go
+backend/internal/repository/usage_billing_repo_unit_test.go
+backend/internal/repository/usage_cleanup_repo.go
+backend/internal/repository/usage_cleanup_repo_ent_test.go
+backend/internal/repository/usage_cleanup_repo_test.go
+backend/internal/repository/usage_log_effective_platform_test.go
+backend/internal/repository/usage_log_repo.go
+backend/internal/repository/usage_log_repo_breakdown_test.go
+backend/internal/repository/usage_log_repo_dashboard.go
+backend/internal/repository/usage_log_repo_deleted_user_integration_test.go
+backend/internal/repository/usage_log_repo_group_summary_test.go
+backend/internal/repository/usage_log_repo_insert.go
+backend/internal/repository/usage_log_repo_insert_shape_unit_test.go
+backend/internal/repository/usage_log_repo_integration_test.go
+backend/internal/repository/usage_log_repo_query.go
+backend/internal/repository/usage_log_repo_request_type_test.go
+backend/internal/repository/usage_log_repo_sort_integration_test.go
+backend/internal/repository/usage_log_repo_stats.go
+backend/internal/repository/usage_log_repo_stats_integration_test.go
+backend/internal/repository/usage_log_repo_trend.go
+backend/internal/repository/usage_log_repo_unit_test.go
+backend/internal/repository/usage_log_session_id_integration_test.go
+backend/internal/repository/usage_log_session_id_unit_test.go
+backend/internal/repository/user_attribute_repo.go
+backend/internal/repository/user_group_rate_repo.go
+backend/internal/repository/user_msg_queue_cache.go
+backend/internal/repository/user_msg_queue_cache_integration_test.go
+backend/internal/repository/user_platform_quota_adapter_test.go
+backend/internal/repository/user_platform_quota_repo.go
+backend/internal/repository/user_platform_quota_repo_integration_test.go
+backend/internal/repository/user_platform_quota_repo_test.go
+backend/internal/repository/user_platform_quota_service_adapter.go
+backend/internal/repository/user_platform_quota_upsert_test.go
+backend/internal/repository/user_profile_identity_repo.go
+backend/internal/repository/user_profile_identity_repo_contract_test.go
+backend/internal/repository/user_profile_identity_repo_unit_test.go
+backend/internal/repository/user_repo.go
+backend/internal/repository/user_repo_apikey_group_filter_integration_test.go
+backend/internal/repository/user_repo_delete_atomicity_integration_test.go
+backend/internal/repository/user_repo_email_alias_test.go
+backend/internal/repository/user_repo_email_identity_integration_test.go
+backend/internal/repository/user_repo_email_lookup_unit_test.go
+backend/internal/repository/user_repo_include_deleted_integration_test.go
+backend/internal/repository/user_repo_integration_test.go
+backend/internal/repository/user_repo_invitation_claim_test.go
+backend/internal/repository/user_repo_lost_update_integration_test.go
+backend/internal/repository/user_repo_redeem_adjustment_test.go
+backend/internal/repository/user_repo_sort_integration_test.go
+backend/internal/repository/user_rpm_cache.go
+backend/internal/repository/user_subscription_lock_test.go
+backend/internal/repository/user_subscription_repo.go
+backend/internal/repository/user_subscription_repo_integration_test.go
+backend/internal/repository/wire.go
+backend/internal/securityaudit/coordinator.go
+backend/internal/securityaudit/coordinator_legacy.go
+backend/internal/securityaudit/coordinator_test.go
+backend/internal/securityaudit/prompt_config.go
+backend/internal/securityaudit/prompt_config_integration_test.go
+backend/internal/securityaudit/prompt_config_store.go
+backend/internal/securityaudit/prompt_config_test.go
+backend/internal/securityaudit/prompt_enqueue.go
+backend/internal/securityaudit/prompt_event_repository.go
+backend/internal/securityaudit/prompt_guard.go
+backend/internal/securityaudit/prompt_guard_test.go
+backend/internal/securityaudit/prompt_handler.go
+backend/internal/securityaudit/prompt_handler_test.go
+backend/internal/securityaudit/prompt_issue_summary.go
+backend/internal/securityaudit/prompt_logging.go
+backend/internal/securityaudit/prompt_logging_test.go
+backend/internal/securityaudit/prompt_metrics.go
+backend/internal/securityaudit/prompt_metrics_test.go
+backend/internal/securityaudit/prompt_module.go
+backend/internal/securityaudit/prompt_outbound_security.go
+backend/internal/securityaudit/prompt_outbound_security_test.go
+backend/internal/securityaudit/prompt_payload_store.go
+backend/internal/securityaudit/prompt_payload_store_integration_test.go
+backend/internal/securityaudit/prompt_qwen3guard.go
+backend/internal/securityaudit/prompt_qwen3guard_test.go
+backend/internal/securityaudit/prompt_repository.go
+backend/internal/securityaudit/prompt_repository_integration_test.go
+backend/internal/securityaudit/prompt_repository_test.go
+backend/internal/securityaudit/prompt_scanner.go
+backend/internal/securityaudit/prompt_service.go
+backend/internal/securityaudit/prompt_service_test.go
+backend/internal/securityaudit/prompt_snapshot.go
+backend/internal/securityaudit/prompt_snapshot_test.go
+backend/internal/securityaudit/prompt_types.go
+backend/internal/securityaudit/prompt_worker.go
+backend/internal/securityaudit/prompt_worker_test.go
+backend/internal/server/api_contract_test.go
+backend/internal/server/http.go
+backend/internal/server/http_ingress_test.go
+backend/internal/server/middleware/admin_auth.go
+backend/internal/server/middleware/admin_auth_test.go
+backend/internal/server/middleware/admin_compliance.go
+backend/internal/server/middleware/admin_compliance_test.go
+backend/internal/server/middleware/admin_only.go
+backend/internal/server/middleware/api_key_auth.go
+backend/internal/server/middleware/api_key_auth_google.go
+backend/internal/server/middleware/api_key_auth_google_test.go
+backend/internal/server/middleware/api_key_auth_image_task_test.go
+backend/internal/server/middleware/api_key_auth_test.go
+backend/internal/server/middleware/audit_log.go
+backend/internal/server/middleware/audit_log_test.go
+backend/internal/server/middleware/auth_subject.go
+backend/internal/server/middleware/backend_mode_guard.go
+backend/internal/server/middleware/backend_mode_guard_test.go
+backend/internal/server/middleware/client_request_id.go
+backend/internal/server/middleware/client_request_id_test.go
+backend/internal/server/middleware/cors.go
+backend/internal/server/middleware/cors_test.go
+backend/internal/server/middleware/group_model_allowlist.go
+backend/internal/server/middleware/group_model_allowlist_test.go
+backend/internal/server/middleware/ingress_reject.go
+backend/internal/server/middleware/ingress_reject_access_sampler.go
+backend/internal/server/middleware/ingress_reject_access_sampler_test.go
+backend/internal/server/middleware/ingress_reject_test.go
+backend/internal/server/middleware/invalid_auth_abuse_test.go
+backend/internal/server/middleware/jwt_auth.go
+backend/internal/server/middleware/jwt_auth_test.go
+backend/internal/server/middleware/logger.go
+backend/internal/server/middleware/middleware.go
+backend/internal/server/middleware/misc_coverage_test.go
+backend/internal/server/middleware/openai_fast_policy_forwarding_test.go
+backend/internal/server/middleware/optional_jwt_auth.go
+backend/internal/server/middleware/optional_jwt_auth_test.go
+backend/internal/server/middleware/panel_rate_limit.go
+backend/internal/server/middleware/panel_rate_limit_test.go
+backend/internal/server/middleware/recovery.go
+backend/internal/server/middleware/recovery_test.go
+backend/internal/server/middleware/request_access_logger_test.go
+backend/internal/server/middleware/request_body_limit.go
+backend/internal/server/middleware/request_logger.go
+backend/internal/server/middleware/request_metadata.go
+backend/internal/server/middleware/security_headers.go
+backend/internal/server/middleware/security_headers_test.go
+backend/internal/server/middleware/server_timing.go
+backend/internal/server/middleware/server_timing_test.go
+backend/internal/server/middleware/session_binding.go
+backend/internal/server/middleware/session_binding_test.go
+backend/internal/server/middleware/step_up.go
+backend/internal/server/middleware/step_up_test.go
+backend/internal/server/middleware/wire.go
+backend/internal/server/router.go
+backend/internal/server/routes/admin.go
+backend/internal/server/routes/auth.go
+backend/internal/server/routes/auth_rate_limit_integration_test.go
+backend/internal/server/routes/auth_rate_limit_test.go
+backend/internal/server/routes/channel_monitor_feature_gate_test.go
+backend/internal/server/routes/common.go
+backend/internal/server/routes/composite_platform_test.go
+backend/internal/server/routes/gateway.go
+backend/internal/server/routes/gateway_codex_models_test.go
+backend/internal/server/routes/gateway_key_billing_test.go
+backend/internal/server/routes/gateway_model_allowlist_test.go
+backend/internal/server/routes/gateway_models_pinned_test.go
+backend/internal/server/routes/gateway_test.go
+backend/internal/server/routes/model_plaza.go
+backend/internal/server/routes/ops_ingress_reject_routes_test.go
+backend/internal/server/routes/payment.go
+backend/internal/server/routes/prompt_audit_route_coverage_test.go
+backend/internal/server/routes/user.go
+backend/internal/service/account.go
+backend/internal/service/account_anthropic_passthrough_test.go
+backend/internal/service/account_anti_degrade.go
+backend/internal/service/account_anti_degrade_test.go
+backend/internal/service/account_base_url_test.go
+backend/internal/service/account_billing_rate_multiplier_test.go
+backend/internal/service/account_codex_cli_only_app_server_test.go
+backend/internal/service/account_codex_fingerprint_seed_lifecycle_test.go
+backend/internal/service/account_credential_shadow_skip_test.go
+backend/internal/service/account_credentials_persistence.go
+backend/internal/service/account_credentials_redact.go
+backend/internal/service/account_credentials_redact_test.go
+backend/internal/service/account_expiry_service.go
+backend/internal/service/account_grok_media_eligibility.go
+backend/internal/service/account_grok_media_eligibility_test.go
+backend/internal/service/account_group.go
+backend/internal/service/account_header_override.go
+backend/internal/service/account_header_override_test.go
+backend/internal/service/account_health.go
+backend/internal/service/account_health_service_test.go
+backend/internal/service/account_health_test.go
+backend/internal/service/account_intercept_warmup_test.go
+backend/internal/service/account_load_factor_test.go
+backend/internal/service/account_long_context_billing_test.go
+backend/internal/service/account_mode1_protection.go
+backend/internal/service/account_mode1_protection_test.go
+backend/internal/service/account_mode1_v3_test.go
+backend/internal/service/account_openai_compact_test.go
+backend/internal/service/account_openai_passthrough_test.go
+backend/internal/service/account_pool_mode_test.go
+backend/internal/service/account_pool_retry_status_codes_test.go
+backend/internal/service/account_proxy_selection.go
+backend/internal/service/account_proxy_selection_test.go
+backend/internal/service/account_quota_reset_test.go
+backend/internal/service/account_quota_schedulable_test.go
+backend/internal/service/account_repository_refresh_candidates_unit_test.go
+backend/internal/service/account_rpm_test.go
+backend/internal/service/account_scheduling_threshold_eval.go
+backend/internal/service/account_scheduling_threshold_eval_test.go
+backend/internal/service/account_scheduling_threshold_integration_test.go
+backend/internal/service/account_scheduling_threshold_reason.go
+backend/internal/service/account_scheduling_threshold_reason_test.go
+backend/internal/service/account_service.go
+backend/internal/service/account_service_delete_test.go
+backend/internal/service/account_spark_shadow_test.go
+backend/internal/service/account_stats_pricing.go
+backend/internal/service/account_stats_pricing_test.go
+backend/internal/service/account_test_models_test.go
+backend/internal/service/account_test_service.go
+backend/internal/service/account_test_service_antigravity_test.go
+backend/internal/service/account_test_service_cn_adaptive.go
+backend/internal/service/account_test_service_cn_adaptive_test.go
+backend/internal/service/account_test_service_gemini_test.go
+backend/internal/service/account_test_service_grok_test.go
+backend/internal/service/account_test_service_openai_compact_test.go
+backend/internal/service/account_test_service_openai_image_test.go
+backend/internal/service/account_test_service_openai_test.go
+backend/internal/service/account_usage_service.go
+backend/internal/service/account_usage_service_batch_test.go
+backend/internal/service/account_usage_service_fable_test.go
+backend/internal/service/account_usage_service_spark_shadow_test.go
+backend/internal/service/account_usage_service_test.go
+backend/internal/service/account_usage_session_window_test.go
+backend/internal/service/account_websearch_test.go
+backend/internal/service/account_wildcard_test.go
+backend/internal/service/adaptive_api_protocol_test.go
+backend/internal/service/admin_account.go
+backend/internal/service/admin_account_concurrency_test.go
+backend/internal/service/admin_account_upstream_billing_probe_test.go
+backend/internal/service/admin_balance_history_test.go
+backend/internal/service/admin_compliance.go
+backend/internal/service/admin_compliance_test.go
+backend/internal/service/admin_group.go
+backend/internal/service/admin_group_duplicate.go
+backend/internal/service/admin_group_duplicate_test.go
+backend/internal/service/admin_group_platform_cache_test.go
+backend/internal/service/admin_proxy.go
+backend/internal/service/admin_proxy_date_validation_test.go
+backend/internal/service/admin_proxy_partial_update_test.go
+backend/internal/service/admin_service.go
+backend/internal/service/admin_service_apikey_test.go
+backend/internal/service/admin_service_auth_identity_binding_test.go
+backend/internal/service/admin_service_batch_limits_test.go
+backend/internal/service/admin_service_bulk_update_test.go
+backend/internal/service/admin_service_clear_error_test.go
+backend/internal/service/admin_service_composite_group_test.go
+backend/internal/service/admin_service_create_user_test.go
+backend/internal/service/admin_service_credentials_merge_test.go
+backend/internal/service/admin_service_delete_test.go
+backend/internal/service/admin_service_duplicate_account_test.go
+backend/internal/service/admin_service_email_identity_sync_test.go
+backend/internal/service/admin_service_get_deleted_test.go
+backend/internal/service/admin_service_group_model_allowlist_test.go
+backend/internal/service/admin_service_group_rate_test.go
+backend/internal/service/admin_service_group_test.go
+backend/internal/service/admin_service_list_users_test.go
+backend/internal/service/admin_service_overages_test.go
+backend/internal/service/admin_service_proxy_quality_test.go
+backend/internal/service/admin_service_reset_quota_test.go
+backend/internal/service/admin_service_role_test.go
+backend/internal/service/admin_service_rpm_status_test.go
+backend/internal/service/admin_service_search_test.go
+backend/internal/service/admin_service_spark_shadow_test.go
+backend/internal/service/admin_service_update_balance_test.go
+backend/internal/service/admin_service_update_user_rpm_test.go
+backend/internal/service/admin_user.go
+backend/internal/service/affiliate_service.go
+backend/internal/service/affiliate_service_test.go
+backend/internal/service/aliyun_captcha_service.go
+backend/internal/service/aliyun_captcha_service_test.go
+backend/internal/service/announcement.go
+backend/internal/service/announcement_service.go
+backend/internal/service/announcement_service_test.go
+backend/internal/service/announcement_targeting_test.go
+backend/internal/service/anthropic_apikey_auth.go
+backend/internal/service/anthropic_apikey_auth_ollama_test.go
+backend/internal/service/anthropic_session.go
+backend/internal/service/anthropic_session_test.go
+backend/internal/service/antigravity_credits_overages.go
+backend/internal/service/antigravity_credits_overages_test.go
+backend/internal/service/antigravity_default_test_stubs_test.go
+backend/internal/service/antigravity_gateway_claude.go
+backend/internal/service/antigravity_gateway_compat.go
+backend/internal/service/antigravity_gateway_compat_stream.go
+backend/internal/service/antigravity_gateway_compat_test.go
+backend/internal/service/antigravity_gateway_gemini.go
+backend/internal/service/antigravity_gateway_retry.go
+backend/internal/service/antigravity_gateway_service.go
+backend/internal/service/antigravity_gateway_service_test.go
+backend/internal/service/antigravity_gateway_streaming.go
+backend/internal/service/antigravity_gateway_upstream.go
+backend/internal/service/antigravity_image_test.go
+backend/internal/service/antigravity_internal500_penalty.go
+backend/internal/service/antigravity_internal500_penalty_test.go
+backend/internal/service/antigravity_model_mapping_test.go
+backend/internal/service/antigravity_oauth_service.go
+backend/internal/service/antigravity_oauth_service_test.go
+backend/internal/service/antigravity_privacy_service.go
+backend/internal/service/antigravity_privacy_service_test.go
+backend/internal/service/antigravity_quota_fetcher.go
+backend/internal/service/antigravity_quota_fetcher_test.go
+backend/internal/service/antigravity_quota_scope.go
+backend/internal/service/antigravity_rate_limit_test.go
+backend/internal/service/antigravity_single_account_retry_test.go
+backend/internal/service/antigravity_smart_retry_test.go
+backend/internal/service/antigravity_subscription_service.go
+backend/internal/service/antigravity_subscription_test.go
+backend/internal/service/antigravity_thinking_test.go
+backend/internal/service/antigravity_token_provider.go
+backend/internal/service/antigravity_token_provider_test.go
+backend/internal/service/antigravity_token_refresher.go
+backend/internal/service/api_key.go
+backend/internal/service/api_key_auth_cache.go
+backend/internal/service/api_key_auth_cache_codex_manifest_test.go
+backend/internal/service/api_key_auth_cache_impl.go
+backend/internal/service/api_key_auth_cache_invalidate.go
+backend/internal/service/api_key_auth_cache_openai_fast_test.go
+backend/internal/service/api_key_auth_cache_pricing_test.go
+backend/internal/service/api_key_auth_cache_profit_test.go
+backend/internal/service/api_key_auth_cache_version_test.go
+backend/internal/service/api_key_group_visibility_test.go
+backend/internal/service/api_key_rate_limit_test.go
+backend/internal/service/api_key_service.go
+backend/internal/service/api_key_service_cache_test.go
+backend/internal/service/api_key_service_delete_test.go
+backend/internal/service/api_key_service_quota_test.go
+backend/internal/service/api_key_service_touch_last_used_test.go
+backend/internal/service/api_key_service_update_fields_test.go
+backend/internal/service/api_key_service_validation_test.go
+backend/internal/service/audit_log.go
+backend/internal/service/audit_log_service.go
+backend/internal/service/audit_log_test.go
+backend/internal/service/auth_cache_invalidation_outbox.go
+backend/internal/service/auth_cache_invalidation_outbox_test.go
+backend/internal/service/auth_cache_invalidation_test.go
+backend/internal/service/auth_email_binding.go
+backend/internal/service/auth_email_oauth_auto.go
+backend/internal/service/auth_email_oauth_auto_test.go
+backend/internal/service/auth_oauth_email_flow.go
+backend/internal/service/auth_oauth_email_flow_test.go
+backend/internal/service/auth_oauth_first_bind.go
+backend/internal/service/auth_pending_identity_service.go
+backend/internal/service/auth_pending_identity_service_test.go
+backend/internal/service/auth_service.go
+backend/internal/service/auth_service_captcha_test.go
+backend/internal/service/auth_service_email_bind_test.go
+backend/internal/service/auth_service_identity_sync_test.go
+backend/internal/service/auth_service_invitation_race_test.go
+backend/internal/service/auth_service_platform_quota_test.go
+backend/internal/service/auth_service_register_test.go
+backend/internal/service/auth_service_test.go
+backend/internal/service/auth_service_turnstile_register_test.go
+backend/internal/service/backup_archive.go
+backend/internal/service/backup_archive_test.go
+backend/internal/service/backup_service.go
+backend/internal/service/backup_service_test.go
+backend/internal/service/balance_notify_check_test.go
+backend/internal/service/balance_notify_email_body_test.go
+backend/internal/service/balance_notify_service.go
+backend/internal/service/balance_notify_service_test.go
+backend/internal/service/batch_image.go
+backend/internal/service/batch_image_billing_hold.go
+backend/internal/service/batch_image_billing_recovery.go
+backend/internal/service/batch_image_billing_recovery_test.go
+backend/internal/service/batch_image_cleanup.go
+backend/internal/service/batch_image_cleanup_test.go
+backend/internal/service/batch_image_download.go
+backend/internal/service/batch_image_download_test.go
+backend/internal/service/batch_image_mvp_smoke_test.go
+backend/internal/service/batch_image_processor.go
+backend/internal/service/batch_image_processor_test.go
+backend/internal/service/batch_image_provider.go
+backend/internal/service/batch_image_provider_gemini.go
+backend/internal/service/batch_image_provider_gemini_test.go
+backend/internal/service/batch_image_provider_vertex.go
+backend/internal/service/batch_image_provider_vertex_test.go
+backend/internal/service/batch_image_public.go
+backend/internal/service/batch_image_public_test.go
+backend/internal/service/batch_image_queue.go
+backend/internal/service/batch_image_settlement.go
+backend/internal/service/batch_image_settlement_test.go
+backend/internal/service/batch_image_test.go
+backend/internal/service/batch_image_worker.go
+backend/internal/service/batch_image_worker_runtime.go
+backend/internal/service/batch_image_worker_runtime_redis_test.go
+backend/internal/service/batch_image_worker_runtime_test.go
+backend/internal/service/batch_image_worker_test.go
+backend/internal/service/bedrock_request.go
+backend/internal/service/bedrock_request_test.go
+backend/internal/service/bedrock_signer.go
+backend/internal/service/bedrock_signer_test.go
+backend/internal/service/bedrock_stream.go
+backend/internal/service/bedrock_stream_test.go
+backend/internal/service/billing_cache_port.go
+backend/internal/service/billing_cache_service.go
+backend/internal/service/billing_cache_service_balance_test.go
+backend/internal/service/billing_cache_service_rpm_test.go
+backend/internal/service/billing_cache_service_singleflight_test.go
+backend/internal/service/billing_cache_service_test.go
+backend/internal/service/billing_cache_service_user_platform_quota_test.go
+backend/internal/service/billing_context_schedule.go
+backend/internal/service/billing_context_schedule_test.go
+backend/internal/service/billing_export.go
+backend/internal/service/billing_export_test.go
+backend/internal/service/billing_search_audio_cost_test.go
+backend/internal/service/billing_service.go
+backend/internal/service/billing_service_image_test.go
+backend/internal/service/billing_service_rate_multiplier_test.go
+backend/internal/service/billing_service_test.go
+backend/internal/service/billing_service_unified_test.go
+backend/internal/service/billing_token_cost_request.go
+backend/internal/service/billing_token_cost_request_test.go
+backend/internal/service/channel.go
+backend/internal/service/channel_available.go
+backend/internal/service/channel_available_test.go
+backend/internal/service/channel_bedrock_cc_test.go
+backend/internal/service/channel_monitor_aggregator.go
+backend/internal/service/channel_monitor_challenge.go
+backend/internal/service/channel_monitor_checker.go
+backend/internal/service/channel_monitor_checker_body_test.go
+backend/internal/service/channel_monitor_const.go
+backend/internal/service/channel_monitor_duplicate_test.go
+backend/internal/service/channel_monitor_probe_retirement_test.go
+backend/internal/service/channel_monitor_quota_fetcher.go
+backend/internal/service/channel_monitor_quota_fetcher_test.go
+backend/internal/service/channel_monitor_quota_mode_test.go
+backend/internal/service/channel_monitor_runner.go
+backend/internal/service/channel_monitor_runner_test.go
+backend/internal/service/channel_monitor_service.go
+backend/internal/service/channel_monitor_service_grok_test.go
+backend/internal/service/channel_monitor_ssrf.go
+backend/internal/service/channel_monitor_template_service.go
+backend/internal/service/channel_monitor_template_types.go
+backend/internal/service/channel_monitor_types.go
+backend/internal/service/channel_monitor_v2.go
+backend/internal/service/channel_monitor_v2_aggregator.go
+backend/internal/service/channel_monitor_v2_aggregator_test.go
+backend/internal/service/channel_monitor_v2_error_taxonomy.go
+backend/internal/service/channel_monitor_v2_test.go
+backend/internal/service/channel_monitor_validate.go
+backend/internal/service/channel_pricing_multipliers_test.go
+backend/internal/service/channel_service.go
+backend/internal/service/channel_service_test.go
+backend/internal/service/channel_test.go
+backend/internal/service/channel_websearch_test.go
+backend/internal/service/claude_code_detection_test.go
+backend/internal/service/claude_code_validator.go
+backend/internal/service/claude_code_validator_test.go
+backend/internal/service/claude_opus5_test.go
+backend/internal/service/claude_token_provider.go
+backend/internal/service/claude_token_provider_test.go
+backend/internal/service/cn_provider_balance_check_service.go
+backend/internal/service/cn_provider_balance_check_service_test.go
+backend/internal/service/cn_provider_balance_service.go
+backend/internal/service/cn_provider_balance_service_test.go
+backend/internal/service/cn_provider_foraccount_test.go
+backend/internal/service/cn_provider_probe_url.go
+backend/internal/service/cn_provider_probe_url_test.go
+backend/internal/service/cn_provider_quota_service.go
+backend/internal/service/cn_providers_test.go
+backend/internal/service/codex_image_generation_bridge.go
+backend/internal/service/composite_model_route.go
+backend/internal/service/composite_platform.go
+backend/internal/service/composite_platform_test.go
+backend/internal/service/composite_route_resolver.go
+backend/internal/service/composite_route_resolver_test.go
+backend/internal/service/concurrency_service.go
+backend/internal/service/concurrency_service_test.go
+backend/internal/service/concurrency_slot_cleanup_test.go
+backend/internal/service/content_moderation.go
+backend/internal/service/content_moderation_cyber_test.go
+backend/internal/service/content_moderation_email.go
+backend/internal/service/content_moderation_input.go
+backend/internal/service/content_moderation_input_test.go
+backend/internal/service/content_moderation_keyword_matcher.go
+backend/internal/service/content_moderation_keyword_matcher_test.go
+backend/internal/service/content_moderation_proxy_test.go
+backend/internal/service/content_moderation_redact.go
+backend/internal/service/content_moderation_runtime_cache_test.go
+backend/internal/service/content_moderation_test.go
+backend/internal/service/credential_shadow.go
+backend/internal/service/credential_shadow_test.go
+backend/internal/service/credentials_sanitize.go
+backend/internal/service/credentials_sanitize_test.go
+backend/internal/service/crs_sync_helpers_test.go
+backend/internal/service/crs_sync_long_context_billing_test.go
+backend/internal/service/crs_sync_service.go
+backend/internal/service/crs_sync_spark_shadow_test.go
+backend/internal/service/custom_channel_time_pricing.go
+backend/internal/service/custom_channel_time_pricing_test.go
+backend/internal/service/custom_group_usage_rollup.go
+backend/internal/service/custom_group_usage_rollup_test.go
+backend/internal/service/dashboard_aggregation_service.go
+backend/internal/service/dashboard_aggregation_service_test.go
+backend/internal/service/dashboard_service.go
+backend/internal/service/dashboard_service_test.go
+backend/internal/service/data_management_grpc.go
+backend/internal/service/data_management_grpc_test.go
+backend/internal/service/data_management_service.go
+backend/internal/service/data_management_service_test.go
+backend/internal/service/deepseek_pricing_test.go
+backend/internal/service/deferred_service.go
+backend/internal/service/digest_session_store.go
+backend/internal/service/digest_session_store_test.go
+backend/internal/service/domain_constants.go
+backend/internal/service/domain_constants_test.go
+backend/internal/service/email_html_escape_test.go
+backend/internal/service/email_message.go
+backend/internal/service/email_message_test.go
+backend/internal/service/email_queue_service.go
+backend/internal/service/email_service.go
+backend/internal/service/email_service_smtp_test.go
+backend/internal/service/error_passthrough_runtime.go
+backend/internal/service/error_passthrough_runtime_test.go
+backend/internal/service/error_passthrough_service.go
+backend/internal/service/error_passthrough_service_test.go
+backend/internal/service/error_policy_integration_test.go
+backend/internal/service/error_policy_test.go
+backend/internal/service/force_cache_billing_test.go
+backend/internal/service/gateway_account_selection_test.go
+backend/internal/service/gateway_anthropic_apikey_passthrough_benchmark_test.go
+backend/internal/service/gateway_anthropic_apikey_passthrough_test.go
+backend/internal/service/gateway_anthropic_passthrough.go
+backend/internal/service/gateway_anthropic_vertex_beta_filter_test.go
+backend/internal/service/gateway_anthropic_vertex_service_account_test.go
+backend/internal/service/gateway_bedrock.go
+backend/internal/service/gateway_beta_test.go
+backend/internal/service/gateway_billing_block.go
+backend/internal/service/gateway_billing_header.go
+backend/internal/service/gateway_billing_header_test.go
+backend/internal/service/gateway_body_order_test.go
+backend/internal/service/gateway_cached_tokens_test.go
+backend/internal/service/gateway_channel_restriction_fallback_test.go
+backend/internal/service/gateway_channel_restriction_load_aware_test.go
+backend/internal/service/gateway_channel_restriction_test.go
+backend/internal/service/gateway_claude_oauth_body.go
+backend/internal/service/gateway_context_management_test.go
+backend/internal/service/gateway_count_tokens.go
+backend/internal/service/gateway_dateline_normalization_test.go
+backend/internal/service/gateway_debug_env_test.go
+backend/internal/service/gateway_fallbacks_sanitize_test.go
+backend/internal/service/gateway_forward.go
+backend/internal/service/gateway_forward_as_chat_completions.go
+backend/internal/service/gateway_forward_as_chat_completions_test.go
+backend/internal/service/gateway_forward_as_responses.go
+backend/internal/service/gateway_forward_as_responses_test.go
+backend/internal/service/gateway_forward_partial_usage_test.go
+backend/internal/service/gateway_group_isolation_test.go
+backend/internal/service/gateway_hotpath_optimization_test.go
+backend/internal/service/gateway_messages_cache.go
+backend/internal/service/gateway_messages_cache_json_test.go
+backend/internal/service/gateway_model_availability.go
+backend/internal/service/gateway_model_availability_test.go
+backend/internal/service/gateway_multiplatform_test.go
+backend/internal/service/gateway_non_streaming_response_test.go
+backend/internal/service/gateway_oauth_metadata_test.go
+backend/internal/service/gateway_pool_mode_retry_test.go
+backend/internal/service/gateway_profit_control.go
+backend/internal/service/gateway_profit_control_v2_test.go
+backend/internal/service/gateway_prompt_test.go
+backend/internal/service/gateway_record_usage_test.go
+backend/internal/service/gateway_request.go
+backend/internal/service/gateway_request_invalid_json_test.go
+backend/internal/service/gateway_request_pricing.go
+backend/internal/service/gateway_request_pricing_test.go
+backend/internal/service/gateway_request_test.go
+backend/internal/service/gateway_sanitize_test.go
+backend/internal/service/gateway_scheduling.go
+backend/internal/service/gateway_service.go
+backend/internal/service/gateway_service_antigravity_whitelist_test.go
+backend/internal/service/gateway_service_bedrock_beta_test.go
+backend/internal/service/gateway_service_bedrock_model_support_test.go
+backend/internal/service/gateway_service_benchmark_test.go
+backend/internal/service/gateway_service_selection_failure_stats_test.go
+backend/internal/service/gateway_service_streaming_test.go
+backend/internal/service/gateway_service_subscription_billing_test.go
+backend/internal/service/gateway_soonest_reset_test.go
+backend/internal/service/gateway_streaming_test.go
+backend/internal/service/gateway_tool_rewrite.go
+backend/internal/service/gateway_tool_rewrite_test.go
+backend/internal/service/gateway_upstream_request.go
+backend/internal/service/gateway_upstream_response.go
+backend/internal/service/gateway_upstream_transport_error.go
+backend/internal/service/gateway_upstream_transport_error_test.go
+backend/internal/service/gateway_usage_billing.go
+backend/internal/service/gateway_usage_billing_fallback_test.go
+backend/internal/service/gateway_usage_billing_request_id_test.go
+backend/internal/service/gateway_waiting_queue_test.go
+backend/internal/service/gateway_websearch_block_filter.go
+backend/internal/service/gateway_websearch_block_filter_test.go
+backend/internal/service/gateway_websearch_emulation.go
+backend/internal/service/gateway_websearch_emulation_test.go
+backend/internal/service/gemini_chat_completions_compat_service.go
+backend/internal/service/gemini_chat_completions_compat_service_test.go
+backend/internal/service/gemini_error_policy_skipped_write_test.go
+backend/internal/service/gemini_error_policy_test.go
+backend/internal/service/gemini_image_output_accounting.go
+backend/internal/service/gemini_image_output_accounting_test.go
+backend/internal/service/gemini_messages_compat_service.go
+backend/internal/service/gemini_messages_compat_service_test.go
+backend/internal/service/gemini_multiplatform_test.go
+backend/internal/service/gemini_native_signature_cleaner.go
+backend/internal/service/gemini_native_signature_cleaner_test.go
+backend/internal/service/gemini_oauth.go
+backend/internal/service/gemini_oauth_service.go
+backend/internal/service/gemini_oauth_service_test.go
+backend/internal/service/gemini_quota.go
+backend/internal/service/gemini_session.go
+backend/internal/service/gemini_session_integration_test.go
+backend/internal/service/gemini_session_test.go
+backend/internal/service/gemini_token_cache.go
+backend/internal/service/gemini_token_provider.go
+backend/internal/service/gemini_token_refresher.go
+backend/internal/service/gemini_upstream_url.go
+backend/internal/service/gemini_upstream_url_test.go
+backend/internal/service/geminicli_codeassist.go
+backend/internal/service/generate_session_hash_test.go
+backend/internal/service/global_model_pricing.go
+backend/internal/service/global_model_pricing_test.go
+backend/internal/service/grok_audio.go
+backend/internal/service/grok_audio_test.go
+backend/internal/service/grok_base_url_mode_test.go
+backend/internal/service/grok_credential_failure.go
+backend/internal/service/grok_credential_failure_test.go
+backend/internal/service/grok_free_quota_gate.go
+backend/internal/service/grok_free_quota_gate_test.go
+backend/internal/service/grok_media.go
+backend/internal/service/grok_media_content_test.go
+backend/internal/service/grok_media_image_geometry.go
+backend/internal/service/grok_media_image_geometry_test.go
+backend/internal/service/grok_media_video_billing_test.go
+backend/internal/service/grok_model_quota_block.go
+backend/internal/service/grok_oauth_reconciliation.go
+backend/internal/service/grok_oauth_reconciliation_test.go
+backend/internal/service/grok_oauth_service.go
+backend/internal/service/grok_oauth_service_test.go
+backend/internal/service/grok_observed_models.go
+backend/internal/service/grok_p2_test.go
+backend/internal/service/grok_quota_fetcher.go
+backend/internal/service/grok_quota_fetcher_test.go
+backend/internal/service/grok_quota_service.go
+backend/internal/service/grok_quota_service_test.go
+backend/internal/service/grok_search_count.go
+backend/internal/service/grok_search_count_test.go
+backend/internal/service/grok_spending_reauth.go
+backend/internal/service/grok_stream_idle.go
+backend/internal/service/grok_stream_idle_test.go
+backend/internal/service/grok_team_rate_limit.go
+backend/internal/service/grok_team_rate_limit_test.go
+backend/internal/service/grok_token_provider.go
+backend/internal/service/grok_token_provider_test.go
+backend/internal/service/grok_token_refresher.go
+backend/internal/service/grok_token_refresher_test.go
+backend/internal/service/grok_upstream_errors.go
+backend/internal/service/grok_upstream_errors_test.go
+backend/internal/service/grok_upstream_failure.go
+backend/internal/service/grok_upstream_failure_test.go
+backend/internal/service/grok_upstream_headers.go
+backend/internal/service/grok_upstream_headers_test.go
+backend/internal/service/grok_upstream_url.go
+backend/internal/service/grok_upstream_url_test.go
+backend/internal/service/group.go
+backend/internal/service/group_capacity_service.go
+backend/internal/service/group_capacity_service_test.go
+backend/internal/service/group_codex_models_manifest.go
+backend/internal/service/group_model_allowlist.go
+backend/internal/service/group_model_allowlist_test.go
+backend/internal/service/group_peak_rate_test.go
+backend/internal/service/group_profit_platform_test.go
+backend/internal/service/group_service.go
+backend/internal/service/group_test.go
+backend/internal/service/header_util.go
+backend/internal/service/http_upstream_port.go
+backend/internal/service/http_upstream_profile.go
+backend/internal/service/http_upstream_profile_test.go
+backend/internal/service/idempotency.go
+backend/internal/service/idempotency_cleanup_service.go
+backend/internal/service/idempotency_cleanup_service_test.go
+backend/internal/service/idempotency_observability.go
+backend/internal/service/idempotency_test.go
+backend/internal/service/identity_service.go
+backend/internal/service/identity_service_order_test.go
+backend/internal/service/identity_service_user_agent_validation_test.go
+backend/internal/service/identity_service_version_floor_test.go
+backend/internal/service/image_billing_multiplier.go
+backend/internal/service/image_billing_size.go
+backend/internal/service/image_billing_size_test.go
+backend/internal/service/image_generation_intent.go
+backend/internal/service/image_generation_intent_benchmark_test.go
+backend/internal/service/image_generation_intent_explicit_test.go
+backend/internal/service/image_generation_intent_grok_test.go
+backend/internal/service/image_generation_intent_test.go
+backend/internal/service/image_output_accounting.go
+backend/internal/service/image_output_accounting_test.go
+backend/internal/service/image_storage.go
+backend/internal/service/image_storage_settings.go
+backend/internal/service/image_storage_settings_test.go
+backend/internal/service/image_storage_test.go
+backend/internal/service/image_task.go
+backend/internal/service/image_task_test.go
+backend/internal/service/internal500_counter.go
+backend/internal/service/invalid_auth_abuse_limiter.go
+backend/internal/service/invalid_auth_abuse_limiter_test.go
+backend/internal/service/json_time.go
+backend/internal/service/json_time_validation_test.go
+backend/internal/service/kimi_anthropic_usage_test.go
+backend/internal/service/leader_lock.go
+backend/internal/service/leader_lock_test.go
+backend/internal/service/legacy_api_key.go
+backend/internal/service/legacy_api_key_test.go
+backend/internal/service/margin_service.go
+backend/internal/service/margin_service_test.go
+backend/internal/service/media_price_config.go
+backend/internal/service/metadata_userid.go
+backend/internal/service/metadata_userid_test.go
+backend/internal/service/model_not_found_error.go
+backend/internal/service/model_not_found_error_test.go
+backend/internal/service/model_plaza_service.go
+backend/internal/service/model_plaza_service_test.go
+backend/internal/service/model_pricing_resolver.go
+backend/internal/service/model_pricing_resolver_channel_normalized_test.go
+backend/internal/service/model_pricing_resolver_test.go
+backend/internal/service/model_rate_limit.go
+backend/internal/service/model_rate_limit_test.go
+backend/internal/service/models_list_response_limit.go
+backend/internal/service/models_list_response_limit_test.go
+backend/internal/service/notification_email_service.go
+backend/internal/service/notification_email_service_test.go
+backend/internal/service/notify_email_entry.go
+backend/internal/service/notify_email_entry_test.go
+backend/internal/service/oauth_refresh_api.go
+backend/internal/service/oauth_refresh_api_test.go
+backend/internal/service/oauth_service.go
+backend/internal/service/oauth_service_test.go
+backend/internal/service/ollama_cloud_messages_max_tokens.go
+backend/internal/service/ollama_cloud_messages_max_tokens_test.go
+backend/internal/service/ollama_cloud_usage.go
+backend/internal/service/ollama_cloud_usage_parser.go
+backend/internal/service/ollama_cloud_usage_test.go
+backend/internal/service/openai_403_counter.go
+backend/internal/service/openai_access_state_failover_test.go
+backend/internal/service/openai_account_model_transient.go
+backend/internal/service/openai_account_model_transient_test.go
+backend/internal/service/openai_account_runtime_block_fastpath.go
+backend/internal/service/openai_account_runtime_block_fastpath_test.go
+backend/internal/service/openai_account_runtime_transient_test.go
+backend/internal/service/openai_account_scheduler.go
+backend/internal/service/openai_account_scheduler_benchmark_test.go
+backend/internal/service/openai_account_scheduler_compact_test.go
+backend/internal/service/openai_account_scheduler_reset_test.go
+backend/internal/service/openai_account_scheduler_spark_route_test.go
+backend/internal/service/openai_account_scheduler_test.go
+backend/internal/service/openai_account_scheduler_upstream_cost_test.go
+backend/internal/service/openai_account_scheduler_ws_snapshot_test.go
+backend/internal/service/openai_agent_identity.go
+backend/internal/service/openai_agent_identity_compat_test.go
+backend/internal/service/openai_agent_identity_test.go
+backend/internal/service/openai_alpha_search.go
+backend/internal/service/openai_alpha_search_billing_test.go
+backend/internal/service/openai_alpha_search_test.go
+backend/internal/service/openai_apikey_health_breaker.go
+backend/internal/service/openai_apikey_health_breaker_test.go
+backend/internal/service/openai_apikey_responses_probe.go
+backend/internal/service/openai_apikey_responses_probe_test.go
+backend/internal/service/openai_apikey_responses_probe_verdict_test.go
+backend/internal/service/openai_astra_pro_mode_test.go
+backend/internal/service/openai_astra_pro_retry_test.go
+backend/internal/service/openai_bulk_account_settings.go
+backend/internal/service/openai_capacity_shed_test.go
+backend/internal/service/openai_channel_restriction_test.go
+backend/internal/service/openai_chatgpt_headers.go
+backend/internal/service/openai_chatgpt_headers_test.go
+backend/internal/service/openai_client_restriction_detector.go
+backend/internal/service/openai_client_restriction_detector_hardening_test.go
+backend/internal/service/openai_client_restriction_detector_test.go
+backend/internal/service/openai_client_transport.go
+backend/internal/service/openai_client_transport_test.go
+backend/internal/service/openai_codex_account_identity.go
+backend/internal/service/openai_codex_account_identity_test.go
+backend/internal/service/openai_codex_astra_image_test.go
+backend/internal/service/openai_codex_fingerprint.go
+backend/internal/service/openai_codex_fingerprint_test.go
+backend/internal/service/openai_codex_function_call_id_test.go
+backend/internal/service/openai_codex_identity.go
+backend/internal/service/openai_codex_identity_test.go
+backend/internal/service/openai_codex_instructions_template.go
+backend/internal/service/openai_codex_message_item_id_test.go
+backend/internal/service/openai_codex_model_metadata.go
+backend/internal/service/openai_codex_model_metadata_test.go
+backend/internal/service/openai_codex_models_pinned.go
+backend/internal/service/openai_codex_models_pinned_test.go
+backend/internal/service/openai_codex_models_service.go
+backend/internal/service/openai_codex_models_service_test.go
+backend/internal/service/openai_codex_pat_service.go
+backend/internal/service/openai_codex_pat_service_test.go
+backend/internal/service/openai_codex_tool_names.go
+backend/internal/service/openai_codex_tool_names_test.go
+backend/internal/service/openai_codex_transform.go
+backend/internal/service/openai_codex_transform_additions_test.go
+backend/internal/service/openai_codex_transform_test.go
+backend/internal/service/openai_codex_turn_state.go
+backend/internal/service/openai_codex_turn_state_test.go
+backend/internal/service/openai_codex_version_consistency_test.go
+backend/internal/service/openai_codex_version_sync_service.go
+backend/internal/service/openai_codex_version_sync_service_test.go
+backend/internal/service/openai_compact_body_signal.go
+backend/internal/service/openai_compact_body_signal_test.go
+backend/internal/service/openai_compact_fallback.go
+backend/internal/service/openai_compact_fallback_test.go
+backend/internal/service/openai_compact_model_mapping_test.go
+backend/internal/service/openai_compact_probe.go
+backend/internal/service/openai_compact_probe_test.go
+backend/internal/service/openai_compact_service_tier_test.go
+backend/internal/service/openai_compact_sse_keepalive.go
+backend/internal/service/openai_compact_sse_keepalive_test.go
+backend/internal/service/openai_compact_stream_bridge.go
+backend/internal/service/openai_compact_stream_bridge_test.go
+backend/internal/service/openai_compact_stream_failure_created_at_test.go
+backend/internal/service/openai_compaction_context.go
+backend/internal/service/openai_compat_model.go
+backend/internal/service/openai_compat_model_test.go
+backend/internal/service/openai_compat_prompt_cache_key.go
+backend/internal/service/openai_compat_prompt_cache_key_test.go
+backend/internal/service/openai_content_session_seed.go
+backend/internal/service/openai_content_session_seed_benchmark_test.go
+backend/internal/service/openai_content_session_seed_test.go
+backend/internal/service/openai_cursor_warmup_pipeline_test.go
+backend/internal/service/openai_cyber_policy.go
+backend/internal/service/openai_cyber_policy_test.go
+backend/internal/service/openai_cyber_session_block.go
+backend/internal/service/openai_cyber_session_block_test.go
+backend/internal/service/openai_cyber_transcript.go
+backend/internal/service/openai_embeddings.go
+backend/internal/service/openai_embeddings_test.go
+backend/internal/service/openai_encrypted_content_lineage.go
+backend/internal/service/openai_encrypted_content_lineage_test.go
+backend/internal/service/openai_endpoint_url.go
+backend/internal/service/openai_endpoint_url_test.go
+backend/internal/service/openai_failover_cached_body_test.go
+backend/internal/service/openai_fast_policy_test.go
+backend/internal/service/openai_fast_policy_ws_test.go
+backend/internal/service/openai_fast_service_tier_test.go
+backend/internal/service/openai_first_output_timeout.go
+backend/internal/service/openai_first_output_timeout_test.go
+backend/internal/service/openai_gateway_403_reset_test.go
+backend/internal/service/openai_gateway_anthropic_native_pump.go
+backend/internal/service/openai_gateway_anthropic_native_pump_test.go
+backend/internal/service/openai_gateway_apikey_item_id_test.go
+backend/internal/service/openai_gateway_cc_pipeline.go
+backend/internal/service/openai_gateway_cc_tool_call_identity.go
+backend/internal/service/openai_gateway_cc_tool_call_identity_test.go
+backend/internal/service/openai_gateway_chat_completions.go
+backend/internal/service/openai_gateway_chat_completions_anthropic_native.go
+backend/internal/service/openai_gateway_chat_completions_cancellation_test.go
+backend/internal/service/openai_gateway_chat_completions_raw.go
+backend/internal/service/openai_gateway_chat_completions_raw_test.go
+backend/internal/service/openai_gateway_chat_completions_test.go
+backend/internal/service/openai_gateway_cn_fixes_test.go
+backend/internal/service/openai_gateway_compat_buffered_read_failover_test.go
+backend/internal/service/openai_gateway_compat_cyber_test.go
+backend/internal/service/openai_gateway_count_tokens.go
+backend/internal/service/openai_gateway_count_tokens_test.go
+backend/internal/service/openai_gateway_forward.go
+backend/internal/service/openai_gateway_grok.go
+backend/internal/service/openai_gateway_grok_405_test.go
+backend/internal/service/openai_gateway_grok_cache.go
+backend/internal/service/openai_gateway_grok_cache_test.go
+backend/internal/service/openai_gateway_grok_cache_tool_test.go
+backend/internal/service/openai_gateway_grok_chat_bridge.go
+backend/internal/service/openai_gateway_grok_chat_bridge_test.go
+backend/internal/service/openai_gateway_grok_chat_image_tools.go
+backend/internal/service/openai_gateway_grok_compact.go
+backend/internal/service/openai_gateway_grok_inline_image_tool_test.go
+backend/internal/service/openai_gateway_grok_model_input.go
+backend/internal/service/openai_gateway_grok_model_input_test.go
+backend/internal/service/openai_gateway_grok_search_billing_test.go
+backend/internal/service/openai_gateway_grok_sse_filter.go
+backend/internal/service/openai_gateway_grok_sse_filter_test.go
+backend/internal/service/openai_gateway_grok_test.go
+backend/internal/service/openai_gateway_grok_tool_protocol.go
+backend/internal/service/openai_gateway_grok_tool_protocol_test.go
+backend/internal/service/openai_gateway_messages.go
+backend/internal/service/openai_gateway_messages_anthropic_native.go
+backend/internal/service/openai_gateway_messages_anthropic_native_test.go
+backend/internal/service/openai_gateway_messages_chat_fallback.go
+backend/internal/service/openai_gateway_messages_chat_fallback_test.go
+backend/internal/service/openai_gateway_messages_failed_response_test.go
+backend/internal/service/openai_gateway_messages_transport_failover_test.go
+backend/internal/service/openai_gateway_messages_usage_test.go
+backend/internal/service/openai_gateway_model_availability.go
+backend/internal/service/openai_gateway_ollama_cloud_cc_reasoning.go
+backend/internal/service/openai_gateway_ollama_cloud_cc_reasoning_test.go
+backend/internal/service/openai_gateway_ollama_cloud_max_tokens.go
+backend/internal/service/openai_gateway_ollama_cloud_max_tokens_test.go
+backend/internal/service/openai_gateway_passthrough.go
+backend/internal/service/openai_gateway_passthrough_flush_test.go
+backend/internal/service/openai_gateway_passthrough_function_args_test.go
+backend/internal/service/openai_gateway_passthrough_image_intent_benchmark_test.go
+backend/internal/service/openai_gateway_passthrough_image_intent_test.go
+backend/internal/service/openai_gateway_record_usage_test.go
+backend/internal/service/openai_gateway_request_body.go
+backend/internal/service/openai_gateway_request_body_reasoning_test.go
+backend/internal/service/openai_gateway_response_failed_passthrough_test.go
+backend/internal/service/openai_gateway_response_flush_test.go
+backend/internal/service/openai_gateway_response_handling.go
+backend/internal/service/openai_gateway_response_handling_image_usage_test.go
+backend/internal/service/openai_gateway_response_handling_type_test.go
+backend/internal/service/openai_gateway_responses_anthropic_native.go
+backend/internal/service/openai_gateway_responses_chat_fallback.go
+backend/internal/service/openai_gateway_responses_chat_fallback_test.go
+backend/internal/service/openai_gateway_responses_client_tools_test.go
+backend/internal/service/openai_gateway_responses_empty_completed_test.go
+backend/internal/service/openai_gateway_scheduling.go
+backend/internal/service/openai_gateway_search_surcharge_test.go
+backend/internal/service/openai_gateway_service.go
+backend/internal/service/openai_gateway_service_codex_cli_only_test.go
+backend/internal/service/openai_gateway_service_codex_snapshot_test.go
+backend/internal/service/openai_gateway_service_hotpath_test.go
+backend/internal/service/openai_gateway_service_session_isolation_test.go
+backend/internal/service/openai_gateway_service_shadow_token_test.go
+backend/internal/service/openai_gateway_service_test.go
+backend/internal/service/openai_gateway_service_tool_correction_test.go
+backend/internal/service/openai_gateway_upstream_errors.go
+backend/internal/service/openai_gateway_usage.go
+backend/internal/service/openai_gateway_usage_integrity.go
+backend/internal/service/openai_gateway_usage_integrity_test.go
+backend/internal/service/openai_gpt56_max_test.go
+backend/internal/service/openai_guardian_affinity.go
+backend/internal/service/openai_guardian_affinity_test.go
+backend/internal/service/openai_image_dimensions.go
+backend/internal/service/openai_image_generation_controls_test.go
+backend/internal/service/openai_image_intent_hint.go
+backend/internal/service/openai_image_intent_hint_test.go
+backend/internal/service/openai_images.go
+backend/internal/service/openai_images_actual_size_test.go
+backend/internal/service/openai_images_b64_backfill.go
+backend/internal/service/openai_images_b64_backfill_test.go
+backend/internal/service/openai_images_incomplete_test.go
+backend/internal/service/openai_images_json_keepalive.go
+backend/internal/service/openai_images_json_keepalive_test.go
+backend/internal/service/openai_images_model_test.go
+backend/internal/service/openai_images_oauth_unavailable_cooldown_test.go
+backend/internal/service/openai_images_responses.go
+backend/internal/service/openai_images_test.go
+backend/internal/service/openai_images_tool_cooldown_test.go
+backend/internal/service/openai_images_upstream_context_test.go
+backend/internal/service/openai_json_decode.go
+backend/internal/service/openai_json_optimization_benchmark_test.go
+backend/internal/service/openai_live.go
+backend/internal/service/openai_live_attestation.go
+backend/internal/service/openai_live_lifecycle_test.go
+backend/internal/service/openai_live_test.go
+backend/internal/service/openai_live_types.go
+backend/internal/service/openai_messages_bridge.go
+backend/internal/service/openai_messages_continuation.go
+backend/internal/service/openai_messages_digest_session.go
+backend/internal/service/openai_messages_dispatch.go
+backend/internal/service/openai_messages_dispatch_test.go
+backend/internal/service/openai_messages_replay_guard.go
+backend/internal/service/openai_messages_replay_guard_test.go
+backend/internal/service/openai_messages_todo_guard.go
+backend/internal/service/openai_mode1_integrity.go
+backend/internal/service/openai_mode1_integrity_test.go
+backend/internal/service/openai_mode1_semantics.go
+backend/internal/service/openai_mode1_v3_ws_test.go
+backend/internal/service/openai_model_alias.go
+backend/internal/service/openai_model_alias_test.go
+backend/internal/service/openai_model_mapping.go
+backend/internal/service/openai_model_mapping_test.go
+backend/internal/service/openai_models_list.go
+backend/internal/service/openai_models_list_test.go
+backend/internal/service/openai_nonstreaming_terminal_failure_failover_test.go
+backend/internal/service/openai_oauth_model_support_test.go
+backend/internal/service/openai_oauth_passthrough_test.go
+backend/internal/service/openai_oauth_service.go
+backend/internal/service/openai_oauth_service_auth_url_test.go
+backend/internal/service/openai_oauth_service_refresh_test.go
+backend/internal/service/openai_oauth_service_state_test.go
+backend/internal/service/openai_opencode_session.go
+backend/internal/service/openai_opencode_session_test.go
+backend/internal/service/openai_passthrough_normalization_test.go
+backend/internal/service/openai_passthrough_preoutput_keepalive_test.go
+backend/internal/service/openai_plugin_transport.go
+backend/internal/service/openai_previous_response_id.go
+backend/internal/service/openai_previous_response_id_test.go
+backend/internal/service/openai_privacy_retry_test.go
+backend/internal/service/openai_privacy_service.go
+backend/internal/service/openai_profit_control.go
+backend/internal/service/openai_profit_control_legacy_diagnostics_test.go
+backend/internal/service/openai_profit_control_paths_test.go
+backend/internal/service/openai_profit_control_pricing_test.go
+backend/internal/service/openai_profit_control_test.go
+backend/internal/service/openai_proxy_stream_circuit.go
+backend/internal/service/openai_proxy_stream_circuit_test.go
+backend/internal/service/openai_quota_auto_reset.go
+backend/internal/service/openai_quota_auto_reset_config.go
+backend/internal/service/openai_quota_auto_reset_test.go
+backend/internal/service/openai_quota_reset_credits.go
+backend/internal/service/openai_quota_reset_credits_test.go
+backend/internal/service/openai_quota_reset_workflow.go
+backend/internal/service/openai_quota_service.go
+backend/internal/service/openai_quota_spark_window_test.go
+backend/internal/service/openai_raw_stream_truncation.go
+backend/internal/service/openai_reasoning_effort_candidates_test.go
+backend/internal/service/openai_reasoning_effort_policy.go
+backend/internal/service/openai_reasoning_effort_policy_test.go
+backend/internal/service/openai_request_body_limit_failover_test.go
+backend/internal/service/openai_response_terminal_usage_compat_test.go
+backend/internal/service/openai_responses_ingress_compat.go
+backend/internal/service/openai_responses_ingress_compat_test.go
+backend/internal/service/openai_responses_input_compat.go
+backend/internal/service/openai_responses_input_compat_test.go
+backend/internal/service/openai_responses_input_tokens_test.go
+backend/internal/service/openai_responses_item_id.go
+backend/internal/service/openai_responses_item_id_test.go
+backend/internal/service/openai_responses_lite_tools.go
+backend/internal/service/openai_responses_lite_tools_test.go
+backend/internal/service/openai_responses_namespace.go
+backend/internal/service/openai_responses_namespace_forward_test.go
+backend/internal/service/openai_responses_namespace_test.go
+backend/internal/service/openai_responses_rejected_field_retry.go
+backend/internal/service/openai_responses_rejected_field_retry_test.go
+backend/internal/service/openai_responses_stream_output_items_test.go
+backend/internal/service/openai_responses_tool_schema.go
+backend/internal/service/openai_responses_tool_schema_test.go
+backend/internal/service/openai_routing_hint.go
+backend/internal/service/openai_routing_hint_test.go
+backend/internal/service/openai_setup_token_compat_test.go
+backend/internal/service/openai_silent_refusal.go
+backend/internal/service/openai_spark_shadow_parent_health_test.go
+backend/internal/service/openai_sse_concatenated_json_test.go
+backend/internal/service/openai_sse_data.go
+backend/internal/service/openai_sse_json_documents.go
+backend/internal/service/openai_sticky_compat.go
+backend/internal/service/openai_sticky_compat_test.go
+backend/internal/service/openai_stream_read_error.go
+backend/internal/service/openai_subscription_test.go
+backend/internal/service/openai_team_linked_error.go
+backend/internal/service/openai_token_provider.go
+backend/internal/service/openai_token_provider_test.go
+backend/internal/service/openai_tool_continuation.go
+backend/internal/service/openai_tool_continuation_test.go
+backend/internal/service/openai_tool_corrector.go
+backend/internal/service/openai_tool_corrector_test.go
+backend/internal/service/openai_upstream_client_error.go
+backend/internal/service/openai_upstream_client_error_test.go
+backend/internal/service/openai_upstream_transport_error.go
+backend/internal/service/openai_upstream_transport_error_handle_test.go
+backend/internal/service/openai_upstream_transport_error_test.go
+backend/internal/service/openai_visible_ttft_test.go
+backend/internal/service/openai_ws_account_sticky_test.go
+backend/internal/service/openai_ws_client.go
+backend/internal/service/openai_ws_client_read.go
+backend/internal/service/openai_ws_client_read_test.go
+backend/internal/service/openai_ws_client_test.go
+backend/internal/service/openai_ws_fallback_test.go
+backend/internal/service/openai_ws_forwarder.go
+backend/internal/service/openai_ws_forwarder_benchmark_test.go
+backend/internal/service/openai_ws_forwarder_client_cancel_test.go
+backend/internal/service/openai_ws_forwarder_hotpath_optimization_test.go
+backend/internal/service/openai_ws_forwarder_ingress.go
+backend/internal/service/openai_ws_forwarder_ingress_session_test.go
+backend/internal/service/openai_ws_forwarder_ingress_test.go
+backend/internal/service/openai_ws_forwarder_logutil.go
+backend/internal/service/openai_ws_forwarder_logutil_test.go
+backend/internal/service/openai_ws_forwarder_payload.go
+backend/internal/service/openai_ws_forwarder_retry_payload_test.go
+backend/internal/service/openai_ws_forwarder_success_test.go
+backend/internal/service/openai_ws_forwarder_support.go
+backend/internal/service/openai_ws_forwarder_test.go
+backend/internal/service/openai_ws_forwarder_v2.go
+backend/internal/service/openai_ws_forwarder_v2_test.go
+backend/internal/service/openai_ws_http_bridge.go
+backend/internal/service/openai_ws_http_bridge_isolation_test.go
+backend/internal/service/openai_ws_http_bridge_resume_test.go
+backend/internal/service/openai_ws_http_bridge_test.go
+backend/internal/service/openai_ws_ingress_capacity_shed_test.go
+backend/internal/service/openai_ws_mode1_tls_test.go
+backend/internal/service/openai_ws_ops_failure_test.go
+backend/internal/service/openai_ws_passthrough_turn_pricing_test.go
+backend/internal/service/openai_ws_pool.go
+backend/internal/service/openai_ws_pool_benchmark_test.go
+backend/internal/service/openai_ws_pool_test.go
+backend/internal/service/openai_ws_protocol_forward_test.go
+backend/internal/service/openai_ws_protocol_resolver.go
+backend/internal/service/openai_ws_protocol_resolver_test.go
+backend/internal/service/openai_ws_ratelimit_signal_test.go
+backend/internal/service/openai_ws_replay_allocation_test.go
+backend/internal/service/openai_ws_session_preemption.go
+backend/internal/service/openai_ws_session_preemption_test.go
+backend/internal/service/openai_ws_state_store.go
+backend/internal/service/openai_ws_state_store_test.go
+backend/internal/service/openai_ws_v2/caddy_adapter.go
+backend/internal/service/openai_ws_v2/entry.go
+backend/internal/service/openai_ws_v2/metrics.go
+backend/internal/service/openai_ws_v2/passthrough_relay.go
+backend/internal/service/openai_ws_v2/passthrough_relay_internal_test.go
+backend/internal/service/openai_ws_v2/passthrough_relay_test.go
+backend/internal/service/openai_ws_v2_passthrough_adapter.go
+backend/internal/service/openai_ws_v2_passthrough_adapter_effort_test.go
+backend/internal/service/openai_ws_v2_passthrough_lifecycle_test.go
+backend/internal/service/ops_account_availability.go
+backend/internal/service/ops_advisory_lock.go
+backend/internal/service/ops_aggregation_service.go
+backend/internal/service/ops_alert_evaluator_service.go
+backend/internal/service/ops_alert_evaluator_service_test.go
+backend/internal/service/ops_alert_models.go
+backend/internal/service/ops_alerts.go
+backend/internal/service/ops_cleanup_executor.go
+backend/internal/service/ops_cleanup_overlay_test.go
+backend/internal/service/ops_cleanup_service.go
+backend/internal/service/ops_cleanup_service_test.go
+backend/internal/service/ops_concurrency.go
+backend/internal/service/ops_dashboard.go
+backend/internal/service/ops_dashboard_models.go
+backend/internal/service/ops_errors.go
+backend/internal/service/ops_health_score.go
+backend/internal/service/ops_health_score_test.go
+backend/internal/service/ops_histograms.go
+backend/internal/service/ops_ingress_reject.go
+backend/internal/service/ops_ingress_reject_test.go
+backend/internal/service/ops_log_runtime.go
+backend/internal/service/ops_log_runtime_test.go
+backend/internal/service/ops_metrics_collector.go
+backend/internal/service/ops_metrics_collector_memory_test.go
+backend/internal/service/ops_metrics_collector_projection_test.go
+backend/internal/service/ops_metrics_collector_test.go
+backend/internal/service/ops_models.go
+backend/internal/service/ops_openai_token_stats.go
+backend/internal/service/ops_openai_token_stats_models.go
+backend/internal/service/ops_openai_token_stats_test.go
+backend/internal/service/ops_port.go
+backend/internal/service/ops_query_mode.go
+backend/internal/service/ops_query_mode_test.go
+backend/internal/service/ops_queue_sanitize_test.go
+backend/internal/service/ops_realtime.go
+backend/internal/service/ops_realtime_models.go
+backend/internal/service/ops_realtime_traffic.go
+backend/internal/service/ops_realtime_traffic_models.go
+backend/internal/service/ops_repo_mock_test.go
+backend/internal/service/ops_request_details.go
+backend/internal/service/ops_runtime_snapshot_test.go
+backend/internal/service/ops_scheduled_report_service.go
+backend/internal/service/ops_scheduled_report_service_test.go
+backend/internal/service/ops_service.go
+backend/internal/service/ops_service_batch_test.go
+backend/internal/service/ops_service_redaction_test.go
+backend/internal/service/ops_service_user_error_test.go
+backend/internal/service/ops_settings.go
+backend/internal/service/ops_settings_advanced_test.go
+backend/internal/service/ops_settings_models.go
+backend/internal/service/ops_system_log_service.go
+backend/internal/service/ops_system_log_service_test.go
+backend/internal/service/ops_system_log_sink.go
+backend/internal/service/ops_system_log_sink_backoff_test.go
+backend/internal/service/ops_system_log_sink_test.go
+backend/internal/service/ops_trend_models.go
+backend/internal/service/ops_trends.go
+backend/internal/service/ops_upstream_context.go
+backend/internal/service/ops_upstream_context_test.go
+backend/internal/service/ops_user_error.go
+backend/internal/service/ops_user_error_cyber_test.go
+backend/internal/service/ops_user_error_test.go
+backend/internal/service/ops_window_stats.go
+backend/internal/service/overload_cooldown_test.go
+backend/internal/service/parse_integral_number_unit.go
+backend/internal/service/passkey.go
+backend/internal/service/passkey_test.go
+backend/internal/service/payment_amounts.go
+backend/internal/service/payment_config_limits.go
+backend/internal/service/payment_config_limits_test.go
+backend/internal/service/payment_config_plans.go
+backend/internal/service/payment_config_plans_validation_test.go
+backend/internal/service/payment_config_providers.go
+backend/internal/service/payment_config_providers_test.go
+backend/internal/service/payment_config_service.go
+backend/internal/service/payment_config_service_test.go
+backend/internal/service/payment_currency.go
+backend/internal/service/payment_fulfillment.go
+backend/internal/service/payment_fulfillment_order_not_found_test.go
+backend/internal/service/payment_fulfillment_test.go
+backend/internal/service/payment_order.go
+backend/internal/service/payment_order_expiry_service.go
+backend/internal/service/payment_order_jsapi_test.go
+backend/internal/service/payment_order_lifecycle.go
+backend/internal/service/payment_order_lifecycle_test.go
+backend/internal/service/payment_order_provider_snapshot.go
+backend/internal/service/payment_order_provider_snapshot_test.go
+backend/internal/service/payment_order_result_test.go
+backend/internal/service/payment_refund.go
+backend/internal/service/payment_refund_test.go
+backend/internal/service/payment_resume_lookup.go
+backend/internal/service/payment_resume_lookup_test.go
+backend/internal/service/payment_resume_service.go
+backend/internal/service/payment_resume_service_test.go
+backend/internal/service/payment_service.go
+backend/internal/service/payment_stats.go
+backend/internal/service/payment_stats_test.go
+backend/internal/service/payment_visible_method_instances.go
+backend/internal/service/payment_webhook_provider.go
+backend/internal/service/payment_webhook_provider_test.go
+backend/internal/service/plugin_compatibility.go
+backend/internal/service/plugin_compatibility_test.go
+backend/internal/service/plugin_manager.go
+backend/internal/service/plugin_manager_routing_test.go
+backend/internal/service/plugin_manifest.go
+backend/internal/service/plugin_package.go
+backend/internal/service/plugin_package_test.go
+backend/internal/service/plugin_runtime.go
+backend/internal/service/plugin_runtime_integration_test.go
+backend/internal/service/plugin_security_regression_test.go
+backend/internal/service/post_billing_platform_test.go
+backend/internal/service/pricing_service.go
+backend/internal/service/pricing_service_hot_reload_test.go
+backend/internal/service/pricing_service_override_test.go
+backend/internal/service/pricing_service_test.go
+backend/internal/service/pricing_stub_helpers_test.go
+backend/internal/service/profit_control_threshold_helpers_test.go
+backend/internal/service/profit_preview.go
+backend/internal/service/profit_preview_test.go
+backend/internal/service/promo_code.go
+backend/internal/service/promo_code_repository.go
+backend/internal/service/promo_service.go
+backend/internal/service/prompts/codex_opencode_bridge.txt
+backend/internal/service/prompts/tool_remap_message.txt
+backend/internal/service/proxy.go
+backend/internal/service/proxy_expiry_service.go
+backend/internal/service/proxy_fallback.go
+backend/internal/service/proxy_fallback_test.go
+backend/internal/service/proxy_latency_cache.go
+backend/internal/service/proxy_service.go
+backend/internal/service/proxy_test.go
+backend/internal/service/proxy_update_probe_invalidation_test.go
+backend/internal/service/quota_fetcher.go
+backend/internal/service/rate_limit_429_cooldown_test.go
+backend/internal/service/ratelimit_cn_providers.go
+backend/internal/service/ratelimit_service.go
+backend/internal/service/ratelimit_service_401_db_fallback_test.go
+backend/internal/service/ratelimit_service_401_test.go
+backend/internal/service/ratelimit_service_403_html_test.go
+backend/internal/service/ratelimit_service_403_test.go
+backend/internal/service/ratelimit_service_anthropic_test.go
+backend/internal/service/ratelimit_service_anthropic_window_limit_test.go
+backend/internal/service/ratelimit_service_clear_test.go
+backend/internal/service/ratelimit_service_model_not_found_test.go
+backend/internal/service/ratelimit_service_openai_image_test.go
+backend/internal/service/ratelimit_service_openai_team_linked_test.go
+backend/internal/service/ratelimit_service_openai_test.go
+backend/internal/service/ratelimit_service_scheduling_threshold_test.go
+backend/internal/service/ratelimit_session_window_test.go
+backend/internal/service/redeem_admin_fulfillment_test.go
+backend/internal/service/redeem_code.go
+backend/internal/service/redeem_code_test.go
+backend/internal/service/redeem_rate_limit_test.go
+backend/internal/service/redeem_service.go
+backend/internal/service/redeem_service_batch_update_test.go
+backend/internal/service/redeem_service_redeem_test.go
+backend/internal/service/refresh_policy.go
+backend/internal/service/refresh_token_cache.go
+backend/internal/service/registration_email_alias.go
+backend/internal/service/registration_email_alias_test.go
+backend/internal/service/registration_email_policy.go
+backend/internal/service/registration_email_policy_test.go
+backend/internal/service/request_metadata.go
+backend/internal/service/request_metadata_test.go
+backend/internal/service/response_header_filter.go
+backend/internal/service/response_model_billing_test.go
+backend/internal/service/rpm_cache.go
+backend/internal/service/scheduled_test_port.go
+backend/internal/service/scheduled_test_runner_service.go
+backend/internal/service/scheduled_test_service.go
+backend/internal/service/scheduler_cache.go
+backend/internal/service/scheduler_events.go
+backend/internal/service/scheduler_layered_filter_test.go
+backend/internal/service/scheduler_outbox.go
+backend/internal/service/scheduler_shuffle_test.go
+backend/internal/service/scheduler_snapshot_batch_query_test.go
+backend/internal/service/scheduler_snapshot_bulk_event_test.go
+backend/internal/service/scheduler_snapshot_cancellation_test.go
+backend/internal/service/scheduler_snapshot_full_rebuild_lifecycle_test.go
+backend/internal/service/scheduler_snapshot_full_rebuild_test.go
+backend/internal/service/scheduler_snapshot_group_lifecycle_test.go
+backend/internal/service/scheduler_snapshot_hydration_test.go
+backend/internal/service/scheduler_snapshot_outbox_cleanup_test.go
+backend/internal/service/scheduler_snapshot_retirement_test.go
+backend/internal/service/scheduler_snapshot_service.go
+backend/internal/service/security_policy.go
+backend/internal/service/security_policy_seeds.go
+backend/internal/service/security_policy_service.go
+backend/internal/service/security_policy_session.go
+backend/internal/service/security_policy_test.go
+backend/internal/service/service_tier_billing.go
+backend/internal/service/service_tier_billing_test.go
+backend/internal/service/session_binding.go
+backend/internal/service/session_id.go
+backend/internal/service/session_id_test.go
+backend/internal/service/session_limit_cache.go
+backend/internal/service/session_limit_release_test.go
+backend/internal/service/setting.go
+backend/internal/service/setting_features.go
+backend/internal/service/setting_gateway_runtime.go
+backend/internal/service/setting_oauth.go
+backend/internal/service/setting_openai_apikey_health.go
+backend/internal/service/setting_panel_rate_limit.go
+backend/internal/service/setting_panel_rate_limit_test.go
+backend/internal/service/setting_parse.go
+backend/internal/service/setting_public.go
+backend/internal/service/setting_service.go
+backend/internal/service/setting_service_auth_source_defaults_test.go
+backend/internal/service/setting_service_backend_mode_test.go
+backend/internal/service/setting_service_claude_oauth_system_prompt_test.go
+backend/internal/service/setting_service_codex_policy_test.go
+backend/internal/service/setting_service_codex_validate_test.go
+backend/internal/service/setting_service_oidc_config_test.go
+backend/internal/service/setting_service_platform_quota_test.go
+backend/internal/service/setting_service_platform_threshold_test.go
+backend/internal/service/setting_service_public_test.go
+backend/internal/service/setting_service_update_test.go
+backend/internal/service/setting_service_user_error_persist_test.go
+backend/internal/service/setting_service_wechat_config_test.go
+backend/internal/service/setting_update.go
+backend/internal/service/setting_user_error_view_test.go
+backend/internal/service/settings_view.go
+backend/internal/service/shadow_routing.go
+backend/internal/service/shadow_routing_test.go
+backend/internal/service/slice_helpers.go
+backend/internal/service/spark_shadow_integration_test.go
+backend/internal/service/spend_guard.go
+backend/internal/service/spend_guard_test.go
+backend/internal/service/sql_errors.go
+backend/internal/service/sse_scanner_buffer_pool.go
+backend/internal/service/sse_scanner_buffer_pool_test.go
+backend/internal/service/sticky_session_test.go
+backend/internal/service/subscription_assign_idempotency_test.go
+backend/internal/service/subscription_calculate_progress_test.go
+backend/internal/service/subscription_daily_midnight_reset_test.go
+backend/internal/service/subscription_expiry_service.go
+backend/internal/service/subscription_expiry_service_test.go
+backend/internal/service/subscription_maintenance_queue.go
+backend/internal/service/subscription_maintenance_queue_test.go
+backend/internal/service/subscription_monthly_window_test.go
+backend/internal/service/subscription_renewal_lock_test.go
+backend/internal/service/subscription_reset_quota_test.go
+backend/internal/service/subscription_revoke_cache_test.go
+backend/internal/service/subscription_service.go
+backend/internal/service/support_ticket.go
+backend/internal/service/support_ticket_test.go
+backend/internal/service/system_operation_lock_service.go
+backend/internal/service/system_operation_lock_service_test.go
+backend/internal/service/temp_unsched.go
+backend/internal/service/temp_unsched_test.go
+backend/internal/service/tencent_captcha_service.go
+backend/internal/service/tencent_captcha_service_test.go
+backend/internal/service/tencent_captcha_settings_test.go
+backend/internal/service/testdata/ollama_settings_usage.html
+backend/internal/service/testdata/security_monitor_system_prompt.txt
+backend/internal/service/testhelpers_test.go
+backend/internal/service/thinking_protocol.go
+backend/internal/service/thinking_protocol_filter_integration_test.go
+backend/internal/service/thinking_protocol_test.go
+backend/internal/service/tiered_routing.go
+backend/internal/service/tiered_routing_test.go
+backend/internal/service/timing_wheel_service.go
+backend/internal/service/timing_wheel_service_test.go
+backend/internal/service/tls_fingerprint_profile_service.go
+backend/internal/service/token_cache_invalidator.go
+backend/internal/service/token_cache_invalidator_test.go
+backend/internal/service/token_cache_key.go
+backend/internal/service/token_cache_key_test.go
+backend/internal/service/token_refresh_pool_health_test.go
+backend/internal/service/token_refresh_service.go
+backend/internal/service/token_refresh_service_candidates_test.go
+backend/internal/service/token_refresh_service_test.go
+backend/internal/service/token_refresher.go
+backend/internal/service/token_refresher_test.go
+backend/internal/service/totp_service.go
+backend/internal/service/totp_verification_method_test.go
+backend/internal/service/turnstile_service.go
+backend/internal/service/update_service.go
+backend/internal/service/update_service_test.go
+backend/internal/service/upgrade024_custom_regression_test.go
+backend/internal/service/upstream_billing_probe.go
+backend/internal/service/upstream_billing_probe_multiplatform_test.go
+backend/internal/service/upstream_billing_probe_test.go
+backend/internal/service/upstream_models.go
+backend/internal/service/upstream_models_test.go
+backend/internal/service/upstream_path_guard.go
+backend/internal/service/upstream_path_guard_test.go
+backend/internal/service/upstream_request_id.go
+backend/internal/service/upstream_request_id_test.go
+backend/internal/service/upstream_response_limit.go
+backend/internal/service/upstream_response_limit_test.go
+backend/internal/service/upstream_response_model.go
+backend/internal/service/upstream_response_model_bench_test.go
+backend/internal/service/upstream_response_model_test.go
+backend/internal/service/usage_billing.go
+backend/internal/service/usage_billing_quantize_test.go
+backend/internal/service/usage_cleanup.go
+backend/internal/service/usage_cleanup_service.go
+backend/internal/service/usage_cleanup_service_test.go
+backend/internal/service/usage_log.go
+backend/internal/service/usage_log_create_result.go
+backend/internal/service/usage_log_cyber_test.go
+backend/internal/service/usage_log_helpers.go
+backend/internal/service/usage_log_test.go
+backend/internal/service/usage_record_worker_pool.go
+backend/internal/service/usage_record_worker_pool_test.go
+backend/internal/service/usage_service.go
+backend/internal/service/user.go
+backend/internal/service/user_attribute.go
+backend/internal/service/user_attribute_service.go
+backend/internal/service/user_can_bind_group_test.go
+backend/internal/service/user_group_rate.go
+backend/internal/service/user_group_rate_resolver.go
+backend/internal/service/user_group_rate_resolver_test.go
+backend/internal/service/user_msg_queue_service.go
+backend/internal/service/user_msg_queue_service_test.go
+backend/internal/service/user_platform_quota_flusher.go
+backend/internal/service/user_platform_quota_flusher_test.go
+backend/internal/service/user_platform_quota_port.go
+backend/internal/service/user_rpm_cache.go
+backend/internal/service/user_service.go
+backend/internal/service/user_service_email_identity_sync_test.go
+backend/internal/service/user_service_test.go
+backend/internal/service/user_service_update_fields_test.go
+backend/internal/service/user_subscription.go
+backend/internal/service/user_subscription_daily_quota_test.go
+backend/internal/service/user_subscription_days_remaining_test.go
+backend/internal/service/user_subscription_port.go
+backend/internal/service/user_subscription_reset_time_test.go
+backend/internal/service/vertex_service_account.go
+backend/internal/service/vertex_service_account_test.go
+backend/internal/service/video_billing.go
+backend/internal/service/video_billing_resolution.go
+backend/internal/service/video_billing_test.go
+backend/internal/service/websearch_config.go
+backend/internal/service/websearch_config_test.go
+backend/internal/service/wire.go
+backend/internal/service/wire_test.go
+backend/internal/setup/cli.go
+backend/internal/setup/handler.go
+backend/internal/setup/setup.go
+backend/internal/setup/setup_test.go
+backend/internal/testutil/fixtures.go
+backend/internal/testutil/httptest.go
+backend/internal/testutil/redis.go
+backend/internal/testutil/stubs.go
+backend/internal/util/httputil/httputil.go
+backend/internal/util/logredact/redact.go
+backend/internal/util/logredact/redact_test.go
+backend/internal/util/responseheaders/responseheaders.go
+backend/internal/util/responseheaders/responseheaders_test.go
+backend/internal/util/urlvalidator/validator.go
+backend/internal/util/urlvalidator/validator_test.go
+backend/internal/web/embed_off.go
+backend/internal/web/embed_on.go
+backend/internal/web/embed_test.go
+backend/internal/web/html_cache.go
+backend/internal/web/static_cache.go
+backend/internal/web/static_cache_test.go
+backend/migrations/001_init.sql
+backend/migrations/002_account_type_migration.sql
+backend/migrations/003_subscription.sql
+backend/migrations/004_add_redeem_code_notes.sql
+backend/migrations/005_schema_parity.sql
+backend/migrations/006_add_users_allowed_groups_compat.sql
+backend/migrations/006_fix_invalid_subscription_expires_at.sql
+backend/migrations/006b_guard_users_allowed_groups.sql
+backend/migrations/007_add_user_allowed_groups.sql
+backend/migrations/008_seed_default_group.sql
+backend/migrations/009_fix_usage_logs_cache_columns.sql
+backend/migrations/010_add_usage_logs_aggregated_indexes.sql
+backend/migrations/011_remove_duplicate_unique_indexes.sql
+backend/migrations/012_add_user_subscription_soft_delete.sql
+backend/migrations/013_log_orphan_allowed_groups.sql
+backend/migrations/014_drop_legacy_allowed_groups.sql
+backend/migrations/015_fix_settings_unique_constraint.sql
+backend/migrations/016_soft_delete_partial_unique_indexes.sql
+backend/migrations/018_user_attributes.sql
+backend/migrations/019_migrate_wechat_to_attributes.sql
+backend/migrations/020_add_temp_unschedulable.sql
+backend/migrations/024_add_gemini_tier_id.sql
+backend/migrations/026_ops_metrics_aggregation_tables.sql
+backend/migrations/027_usage_billing_consistency.sql
+backend/migrations/028_add_account_notes.sql
+backend/migrations/028_add_usage_logs_user_agent.sql
+backend/migrations/028_group_image_pricing.sql
+backend/migrations/029_add_group_claude_code_restriction.sql
+backend/migrations/029_usage_log_image_fields.sql
+backend/migrations/030_add_account_expires_at.sql
+backend/migrations/031_add_ip_address.sql
+backend/migrations/032_add_api_key_ip_restriction.sql
+backend/migrations/033_add_promo_codes.sql
+backend/migrations/033_ops_monitoring_vnext.sql
+backend/migrations/034_ops_upstream_error_events.sql
+backend/migrations/034_usage_dashboard_aggregation_tables.sql
+backend/migrations/035_usage_logs_partitioning.sql
+backend/migrations/036_ops_error_logs_add_is_count_tokens.sql
+backend/migrations/036_scheduler_outbox.sql
+backend/migrations/037_add_account_rate_multiplier.sql
+backend/migrations/037_ops_alert_silences.sql
+backend/migrations/038_ops_errors_resolution_retry_results_and_standardize_classification.sql
+backend/migrations/039_ops_job_heartbeats_add_last_result.sql
+backend/migrations/040_add_group_model_routing.sql
+backend/migrations/041_add_model_routing_enabled.sql
+backend/migrations/042_add_usage_cleanup_tasks.sql
+backend/migrations/042b_add_ops_system_metrics_switch_count.sql
+backend/migrations/043_add_usage_cleanup_cancel_audit.sql
+backend/migrations/043b_add_group_invalid_request_fallback.sql
+backend/migrations/044_add_user_totp.sql
+backend/migrations/044b_add_group_mcp_xml_inject.sql
+backend/migrations/045_add_accounts_extra_index.sql
+backend/migrations/045_add_announcements.sql
+backend/migrations/045_add_api_key_quota.sql
+backend/migrations/046_add_sora_accounts.sql
+backend/migrations/046_add_usage_log_reasoning_effort.sql
+backend/migrations/046b_add_group_supported_model_scopes.sql
+backend/migrations/047_add_sora_pricing_and_media_type.sql
+backend/migrations/047_add_user_group_rate_multipliers.sql
+backend/migrations/048_add_error_passthrough_rules.sql
+backend/migrations/049_unify_antigravity_model_mapping.sql
+backend/migrations/050_map_opus46_to_opus45.sql
+backend/migrations/051_migrate_opus45_to_opus46_thinking.sql
+backend/migrations/052_add_group_sort_order.sql
+backend/migrations/052_migrate_upstream_to_apikey.sql
+backend/migrations/053_add_security_secrets.sql
+backend/migrations/053_add_skip_monitoring_to_error_passthrough.sql
+backend/migrations/054_drop_legacy_cache_columns.sql
+backend/migrations/054_ops_system_logs.sql
+backend/migrations/055_add_cache_ttl_overridden.sql
+backend/migrations/056_add_api_key_last_used_at.sql
+backend/migrations/057_add_idempotency_records.sql
+backend/migrations/058_add_sonnet46_to_model_mapping.sql
+backend/migrations/059_add_gemini31_pro_to_model_mapping.sql
+backend/migrations/060_add_gemini31_flash_image_to_model_mapping.sql
+backend/migrations/060_add_usage_log_openai_ws_mode.sql
+backend/migrations/061_add_usage_log_request_type.sql
+backend/migrations/062_add_scheduler_and_usage_composite_indexes_notx.sql
+backend/migrations/063_add_sora_client_tables.sql
+backend/migrations/064_add_api_key_rate_limits.sql
+backend/migrations/065_add_search_trgm_indexes.sql
+backend/migrations/066_add_scheduled_test_tables.sql
+backend/migrations/067_add_account_load_factor.sql
+backend/migrations/068_add_announcement_notify_mode.sql
+backend/migrations/069_add_group_messages_dispatch.sql
+backend/migrations/070_add_scheduled_test_auto_recover.sql
+backend/migrations/070_add_usage_log_service_tier.sql
+backend/migrations/071_add_gemini25_flash_image_to_model_mapping.sql
+backend/migrations/071_add_usage_billing_dedup.sql
+backend/migrations/072_add_usage_billing_dedup_created_at_brin_notx.sql
+backend/migrations/073_add_usage_billing_dedup_archive.sql
+backend/migrations/074_add_usage_log_endpoints.sql
+backend/migrations/075_add_usage_log_upstream_model.sql
+backend/migrations/075_map_haiku45_to_sonnet46.sql
+backend/migrations/076_add_usage_log_upstream_model_index_notx.sql
+backend/migrations/077_add_usage_log_requested_model.sql
+backend/migrations/078_add_usage_log_requested_model_index_notx.sql
+backend/migrations/079_ops_error_logs_add_endpoint_fields.sql
+backend/migrations/080_create_tls_fingerprint_profiles.sql
+backend/migrations/081_add_group_account_filter.sql
+backend/migrations/081_create_channels.sql
+backend/migrations/082_refactor_channel_pricing.sql
+backend/migrations/083_channel_model_mapping.sql
+backend/migrations/084_channel_billing_model_source.sql
+backend/migrations/085_channel_restrict_and_per_request_price.sql
+backend/migrations/086_channel_platform_pricing.sql
+backend/migrations/087_usage_log_billing_mode.sql
+backend/migrations/088_channel_billing_model_source_channel_mapped.sql
+backend/migrations/089_usage_log_image_output_tokens.sql
+backend/migrations/090_drop_sora.sql
+backend/migrations/091_add_group_messages_dispatch_model_config.sql
+backend/migrations/092_payment_orders.sql
+backend/migrations/093_payment_audit_logs.sql
+backend/migrations/094_removed_payment_channels.sql
+backend/migrations/095_channel_features.sql
+backend/migrations/095_subscription_plans.sql
+backend/migrations/096_payment_provider_instances.sql
+backend/migrations/097_fix_settings_updated_at_default.sql
+backend/migrations/098_migrate_purchase_subscription_to_custom_menu.sql
+backend/migrations/099_fix_migrated_purchase_menu_label_icon.sql
+backend/migrations/100_remove_easypay_from_enabled_payment_types.sql
+backend/migrations/101_add_account_stats_pricing.sql
+backend/migrations/101_add_balance_notify_fields.sql
+backend/migrations/101_add_channel_features_config.sql
+backend/migrations/101_add_payment_mode.sql
+backend/migrations/102_add_balance_notify_threshold_type.sql
+backend/migrations/102_add_out_trade_no_to_payment_orders.sql
+backend/migrations/103_add_allow_user_refund.sql
+backend/migrations/104_migrate_notify_emails_to_struct.sql
+backend/migrations/105_migrate_websearch_emulation_to_tristate.sql
+backend/migrations/106_add_account_stats_pricing_intervals.sql
+backend/migrations/107_add_account_cost_to_dashboard_tables.sql
+backend/migrations/108_auth_identity_foundation_core.sql
+backend/migrations/108a_widen_auth_identity_migration_report_type.sql
+backend/migrations/109_auth_identity_compat_backfill.sql
+backend/migrations/110_pending_auth_and_provider_default_grants.sql
+backend/migrations/111_payment_routing_and_scheduler_flags.sql
+backend/migrations/112_add_payment_order_provider_key_snapshot.sql
+backend/migrations/113_normalize_legacy_wechat_provider_key.sql
+backend/migrations/114_auth_identity_migration_report_resolution.sql
+backend/migrations/115_auth_identity_legacy_external_backfill.sql
+backend/migrations/116_auth_identity_legacy_external_safety_reports.sql
+backend/migrations/117_add_payment_order_provider_snapshot.sql
+backend/migrations/118_wechat_dual_mode_and_auth_source_defaults.sql
+backend/migrations/119_enforce_payment_orders_out_trade_no_unique.sql
+backend/migrations/120_enforce_payment_orders_out_trade_no_unique_notx.sql
+backend/migrations/120a_align_payment_orders_out_trade_no_index_name.sql
+backend/migrations/121_auth_identity_migration_report_type_widen.sql
+backend/migrations/122_pending_auth_completion_token_cleanup.sql
+backend/migrations/123_fix_legacy_auth_source_grant_on_signup_defaults.sql
+backend/migrations/124_backfill_legacy_oidc_security_flags.sql
+backend/migrations/125_add_channel_monitors.sql
+backend/migrations/125_add_group_rpm_limit.sql
+backend/migrations/126_add_channel_monitor_aggregation.sql
+backend/migrations/126_add_user_rpm_limit.sql
+backend/migrations/127_add_user_group_rpm_override.sql
+backend/migrations/127_drop_channel_monitor_deleted_at.sql
+backend/migrations/128_add_channel_monitor_request_templates.sql
+backend/migrations/129_seed_claude_code_template.sql
+backend/migrations/130_add_user_affiliates.sql
+backend/migrations/131_affiliate_rebate_hardening.sql
+backend/migrations/132_affiliate_custom_settings.sql
+backend/migrations/133_affiliate_rebate_freeze.sql
+backend/migrations/134_affiliate_ledger_audit_snapshots.sql
+backend/migrations/134_image_generation_group_controls.sql
+backend/migrations/135_allow_email_oauth_provider_types.sql
+backend/migrations/135_content_moderation.sql
+backend/migrations/136_add_dingtalk_provider_type.sql
+backend/migrations/136_remove_ops_retry_replay.sql
+backend/migrations/136_usage_log_image_size_metadata.sql
+backend/migrations/137_redeem_code_expires_at.sql
+backend/migrations/138_channel_monitor_openai_api_mode.sql
+backend/migrations/139_seed_openai_monitor_templates.sql
+backend/migrations/140_extend_user_provider_default_grants_check.sql
+backend/migrations/141_subscription_expiry_notify_enabled.sql
+backend/migrations/142_user_platform_quotas.sql
+backend/migrations/143_group_models_list_config.sql
+backend/migrations/144_add_opus48_to_model_mapping.sql
+backend/migrations/145_deleted_api_key_audit.sql
+backend/migrations/145_ops_metrics_ttft_sample_count.sql
+backend/migrations/147_ops_error_log_api_key_prefix.sql
+backend/migrations/148_add_ops_error_logs_user_time_index_notx.sql
+backend/migrations/149_proxy_expiry_fallback.sql
+backend/migrations/150_account_group_scheduler_indexes_notx.sql
+backend/migrations/151_account_autopause_expiry_index_notx.sql
+backend/migrations/151_channel_monitor_jitter.sql
+backend/migrations/152_scheduler_outbox_dedup_key.sql
+backend/migrations/153_scheduler_outbox_pending_dedup_key_index_notx.sql
+backend/migrations/154_account_spark_shadow.sql
+backend/migrations/154_add_ops_system_logs_api_key_id.sql
+backend/migrations/154a_account_spark_shadow_indexes_notx.sql
+backend/migrations/155_add_ops_system_logs_api_key_id_index_notx.sql
+backend/migrations/156_content_moderation_matched_keyword.sql
+backend/migrations/157_user_platform_quotas_add_grok.sql
+backend/migrations/158_add_group_peak_rate_multiplier.sql
+backend/migrations/158_enable_grok_media_generation_groups.sql
+backend/migrations/159_batch_image_foundation.sql
+backend/migrations/160_add_user_frozen_balance.sql
+backend/migrations/160_batch_image_provider_refs.sql
+backend/migrations/161_batch_image_pricing_snapshot.sql
+backend/migrations/162_add_group_batch_image_generation_gate.sql
+backend/migrations/163_batch_image_default_discount_and_hold_ratio.sql
+backend/migrations/164_batch_image_download_and_user_delete.sql
+backend/migrations/165_hide_pre_upstream_batch_image_failures.sql
+backend/migrations/166_batch_image_task_name.sql
+backend/migrations/167_clear_auto_batch_image_task_names.sql
+backend/migrations/168_restore_empty_batch_image_task_names.sql
+backend/migrations/169_batch_image_parent_batch.sql
+backend/migrations/170_add_grok_video_pricing_controls.sql
+backend/migrations/171_allow_video_usage_without_image_size.sql
+backend/migrations/172_composite_model_routes.sql
+backend/migrations/172_video_per_second_billing_metadata.sql
+backend/migrations/173_allow_cyber_blocked_usage_request_type.sql
+backend/migrations/174_add_usage_log_long_context_billing.sql
+backend/migrations/174_add_usage_logs_api_key_latest_ip_index_notx.sql
+backend/migrations/174_group_web_search_price_per_call.sql
+backend/migrations/175_add_ops_system_logs_host.sql
+backend/migrations/175_default_openai_long_context_billing.sql
+backend/migrations/175a_add_ops_system_logs_host_index_notx.sql
+backend/migrations/176_channel_monitor_grok_provider.sql
+backend/migrations/177_add_subscription_plan_currency.sql
+backend/migrations/178_channel_image_input_price.sql
+backend/migrations/179_usage_log_image_input_tokens.sql
+backend/migrations/180_audit_logs.sql
+backend/migrations/181_group_duplicate_operation_id.sql
+backend/migrations/181_prompt_audit.sql
+backend/migrations/182_prompt_audit_full_prompt.sql
+backend/migrations/183_ops_ingress_reject_aggregates.sql
+backend/migrations/184_auth_cache_invalidation_outbox.sql
+backend/migrations/185_group_reasoning_effort_policy.sql
+backend/migrations/186_alipay_mobile_precreate_deep_link.sql
+backend/migrations/186_group_auth_cache_image_generation.sql
+backend/migrations/187_add_usage_log_session_id.sql
+backend/migrations/188_allow_live_usage_request_type.sql
+backend/migrations/189_add_group_allow_live.sql
+backend/migrations/190_add_users_email_alias_dedup_index_notx.sql
+backend/migrations/191_passkey_credentials.sql
+backend/migrations/192_group_profit_control.sql
+backend/migrations/193_group_profit_control_auth_cache_invalidation.sql
+backend/migrations/194_add_usage_log_upstream_response_model.sql
+backend/migrations/194_channel_monitor_v2.sql
+backend/migrations/195_add_usage_log_upstream_model_mismatch_index_notx.sql
+backend/migrations/195_channel_monitor_mode.sql
+backend/migrations/196_channel_monitor_v2_ignored_error_categories.sql
+backend/migrations/197_channel_monitor_v2_seed_popular_models.sql
+backend/migrations/198_channel_monitor_v2_health_thresholds.sql
+backend/migrations/199_channel_monitor_v2_fixed_rollups.sql
+backend/migrations/200_channel_monitor_v2_rollup_permissions.sql
+backend/migrations/201_channel_monitor_v2_refresh_5m.sql
+backend/migrations/202_channel_monitor_v2_full_table_permissions.sql
+backend/migrations/203_channel_monitor_v2_default_ignore_and_cache.sql
+backend/migrations/204_channel_monitor_hide_throughput.sql
+backend/migrations/205_channel_monitor_v2_reset_factory_cache_thresholds.sql
+backend/migrations/206_channel_monitor_v2_privacy_defaults.sql
+backend/migrations/217_group_video_model_prices.sql
+backend/migrations/218_group_audio_voice_pricing.sql
+backend/migrations/219_group_search_price_per_1k.sql
+backend/migrations/220_clear_non_grok_video_generation_config.sql
+backend/migrations/221_group_model_pricing.sql
+backend/migrations/222_group_usage_daily_rollups.sql
+backend/migrations/223_group_usage_rollup_timezone.sql
+backend/migrations/224_user_platform_quotas_add_cn_providers.sql
+backend/migrations/225_backfill_codex_fingerprint_seed.sql
+backend/migrations/225_channel_model_time_pricing.sql
+backend/migrations/226_add_usage_log_effective_model_indexes_notx.sql
+backend/migrations/226_channel_monitor_quota_mode.sql
+backend/migrations/227_composite_routes_add_cn_providers.sql
+backend/migrations/228_channel_pricing_multipliers.sql
+backend/migrations/229_plugins.sql
+backend/migrations/230_plugin_artifacts.sql
+backend/migrations/231_add_usage_log_native_compaction_v2.sql
+backend/migrations/231_add_usage_log_requested_reasoning_effort.sql
+backend/migrations/231_user_restrict_public_groups.sql
+backend/migrations/232_add_usage_log_upstream_request_id.sql
+backend/migrations/232_channel_cache_write_1h_pricing.sql
+backend/migrations/232_group_force_openai_fast.sql
+backend/migrations/232_group_reasoning_effort_over_limit.sql
+backend/migrations/233_add_usage_log_upstream_request_id_index_notx.sql
+backend/migrations/233_group_free_openai_fast.sql
+backend/migrations/234_channel_max_reasoning_effort_multiplier.sql
+backend/migrations/234_group_codex_models_manifest_config.sql
+backend/migrations/235_account_proxy_mode_check.sql
+backend/migrations/235_group_model_allowlist.sql
+backend/migrations/236_group_model_allowlist_repair.sql
+backend/migrations/237_add_minimax_platform.sql
+backend/migrations/237_group_security_policy.sql
+backend/migrations/238_content_moderation_overturned.sql
+backend/migrations/241_security_policy_keyword_deleted_at_index.sql
+backend/migrations/242_global_model_pricing.sql
+backend/migrations/243_support_tickets.sql
+backend/migrations/244_legacy_api_key_read_compat.sql
+backend/migrations/README.md
+backend/migrations/account_proxy_mode_check_migration_test.go
+backend/migrations/auth_identity_payment_migrations_regression_test.go
+backend/migrations/channel_monitor_grok_provider_migration_test.go
+backend/migrations/channel_monitor_quota_mode_migration_test.go
+backend/migrations/channel_pricing_multipliers_migration_test.go
+backend/migrations/composite_routes_cn_providers_migration_test.go
+backend/migrations/group_force_openai_fast_migration_test.go
+backend/migrations/group_free_openai_fast_migration_test.go
+backend/migrations/group_model_allowlist_repair_migration_test.go
+backend/migrations/group_usage_rollup_migration_test.go
+backend/migrations/latest_api_key_ip_index_test.go
+backend/migrations/migrations.go
+backend/migrations/minimax_platform_migration_test.go
+backend/migrations/openai_long_context_billing_migration_test.go
+backend/migrations/plugins_migration_test.go
+backend/migrations/usage_log_effective_model_index_test.go
+backend/migrations/user_platform_quota_cn_providers_migration_test.go
+backend/pkg/pluginapi/README.md
+backend/pkg/pluginapi/docs/development.md
+backend/pkg/pluginapi/docs/package-format.md
+backend/pkg/pluginapi/docs/security.md
+backend/pkg/pluginapi/docs/ui-bridge.md
+backend/pkg/pluginapi/v1/manifest.schema.json
+backend/pkg/pluginapi/v1/manifest_schema_test.go
+backend/pkg/pluginapi/v1/plugin.pb.go
+backend/pkg/pluginapi/v1/plugin.proto
+backend/pkg/pluginapi/v1/plugin_grpc.pb.go
+backend/pkg/pluginapi/v1/runtime.go
+backend/resources/model-pricing/README.md
+backend/resources/model-pricing/model_prices_and_context_window.json
+backend/scripts/finalize-ingress-reject-cleanup.sql
+backend/scripts/resolve-version.sh
+deploy/.gitignore
+deploy/APPLE_CONTAINER.md
+deploy/Caddyfile
+deploy/DATAMANAGEMENTD_CN.md
+deploy/DOCKER.md
+deploy/Dockerfile
+deploy/EDGE_SECURITY.md
+deploy/Makefile
+deploy/README.md
+deploy/apple-container.sh
+deploy/build-relay.sh
+deploy/build_image.sh
+deploy/codex-instructions.md.tmpl
+deploy/compose.relay.yml
+deploy/config.example.yaml
+deploy/docker-compose.dev.yml
+deploy/docker-compose.local.yml
+deploy/docker-compose.standalone.yml
+deploy/docker-compose.yml
+deploy/docker-deploy.sh
+deploy/docker-entrypoint.sh
+deploy/init-relay-env.py
+deploy/install-datamanagementd.sh
+deploy/install.sh
+deploy/relay.env.example
+deploy/smoke-relay.py
+deploy/sub2api-datamanagementd.service
+deploy/sub2api.service
+deploy/test-caddyfile-cache.sh
+deploy/tests/apple-container-test.sh
+deploy/tests/docker-compose-gateway-env-test.sh
+deploy/tests/docker-compose-security-test.sh
+deploy/tests/docker-runtime-resources-test.sh
+deploy/tests/fixtures/bin/container
+deploy/tests/fixtures/bin/curl
+deploy/tests/install-github-token-test.sh
+docs/ADMIN_PAYMENT_INTEGRATION_API.md
+docs/ASYNC_IMAGE_TASKS.md
+docs/BATCH_IMAGE_MVP.md
+docs/BF-001-mode1-regression.md
+docs/BROWSER_VERIFICATION.md
+docs/COMPOSITE_GROUPS.md
+docs/PAYMENT.md
+docs/PAYMENT_CN.md
+docs/PLUGIN_DEVELOPMENT.md
+docs/PRODUCT_DECISIONS.md
+docs/REBUILD_PROGRESS.md
+docs/RELAY_DEPLOYMENT.md
+docs/channel-monitor-v2-safe-defaults.md
+docs/legal/admin-compliance.en.md
+docs/legal/admin-compliance.zh.md
+frontend/.eslintignore
+frontend/.eslintrc.cjs
+frontend/.npmrc
+frontend/audit.json
+frontend/index.html
+frontend/package.json
+frontend/pnpm-lock.yaml
+frontend/postcss.config.js
+frontend/public/logo.svg
+frontend/public/relay-mark.svg
+frontend/src/App.vue
+frontend/src/__tests__/integration/data-import.spec.ts
+frontend/src/__tests__/integration/navigation.spec.ts
+frontend/src/__tests__/integration/proxy-data-import.spec.ts
+frontend/src/__tests__/integration/usage-reasoning-effort.spec.ts
+frontend/src/__tests__/setup.ts
+frontend/src/api/__tests__/admin.accounts.antiDegrade.spec.ts
+frontend/src/api/__tests__/admin.accounts.duplicate.spec.ts
+frontend/src/api/__tests__/admin.accounts.ollamaCloudUsage.spec.ts
+frontend/src/api/__tests__/admin.accounts.upstreamBillingProbe.spec.ts
+frontend/src/api/__tests__/admin.channelMonitor.duplicate.spec.ts
+frontend/src/api/__tests__/admin.grok.spec.ts
+frontend/src/api/__tests__/admin.groups.duplicate.spec.ts
+frontend/src/api/__tests__/admin.groups.usage-summary.spec.ts
+frontend/src/api/__tests__/admin.proxies.spec.ts
+frontend/src/api/__tests__/admin.system.rollback.spec.ts
+frontend/src/api/__tests__/admin.users.spec.ts
+frontend/src/api/__tests__/adminUIRequest.spec.ts
+frontend/src/api/__tests__/auth-captcha-oauth-start.spec.ts
+frontend/src/api/__tests__/auth-oauth-adoption.spec.ts
+frontend/src/api/__tests__/channelMonitorV2.spec.ts
+frontend/src/api/__tests__/client.spec.ts
+frontend/src/api/__tests__/codex.spec.ts
+frontend/src/api/__tests__/passkey.spec.ts
+frontend/src/api/__tests__/payment.spec.ts
+frontend/src/api/__tests__/settings.authSourceDefaults.spec.ts
+frontend/src/api/__tests__/settings.paymentVisibleMethods.spec.ts
+frontend/src/api/__tests__/settings.wechatConnect.spec.ts
+frontend/src/api/__tests__/tokenRefresh.spec.ts
+frontend/src/api/__tests__/user.spec.ts
+frontend/src/api/admin/accountHealth.ts
+frontend/src/api/admin/accounts.ts
+frontend/src/api/admin/affiliates.ts
+frontend/src/api/admin/announcements.ts
+frontend/src/api/admin/antigravity.ts
+frontend/src/api/admin/apiKeys.ts
+frontend/src/api/admin/audit.ts
+frontend/src/api/admin/backup.ts
+frontend/src/api/admin/channelMonitor.ts
+frontend/src/api/admin/channelMonitorTemplate.ts
+frontend/src/api/admin/channels.ts
+frontend/src/api/admin/cnProviders.ts
+frontend/src/api/admin/compliance.ts
+frontend/src/api/admin/dashboard.ts
+frontend/src/api/admin/dataManagement.ts
+frontend/src/api/admin/errorPassthrough.ts
+frontend/src/api/admin/gemini.ts
+frontend/src/api/admin/globalPricing.ts
+frontend/src/api/admin/grok.ts
+frontend/src/api/admin/groups.ts
+frontend/src/api/admin/index.ts
+frontend/src/api/admin/margins.ts
+frontend/src/api/admin/ops.ts
+frontend/src/api/admin/payment.ts
+frontend/src/api/admin/plugins.ts
+frontend/src/api/admin/promo.ts
+frontend/src/api/admin/proxies.ts
+frontend/src/api/admin/redeem.ts
+frontend/src/api/admin/riskControl.ts
+frontend/src/api/admin/scheduledTests.ts
+frontend/src/api/admin/securityPolicy.ts
+frontend/src/api/admin/settings.ts
+frontend/src/api/admin/spendGuard.ts
+frontend/src/api/admin/subscriptions.ts
+frontend/src/api/admin/system.ts
+frontend/src/api/admin/tickets.ts
+frontend/src/api/admin/tieredRouting.ts
+frontend/src/api/admin/tlsFingerprintProfile.ts
+frontend/src/api/admin/usage.ts
+frontend/src/api/admin/userAttributes.ts
+frontend/src/api/admin/users.ts
+frontend/src/api/adminUIRequest.ts
+frontend/src/api/announcements.ts
+frontend/src/api/auth.ts
+frontend/src/api/batchImage.ts
+frontend/src/api/billing.ts
+frontend/src/api/channelMonitor.ts
+frontend/src/api/channelMonitorV2.ts
+frontend/src/api/channels.ts
+frontend/src/api/client.ts
+frontend/src/api/codex.ts
+frontend/src/api/groups.ts
+frontend/src/api/index.ts
+frontend/src/api/keys.ts
+frontend/src/api/modelPlaza.ts
+frontend/src/api/passkey.ts
+frontend/src/api/payment.ts
+frontend/src/api/redeem.ts
+frontend/src/api/setup.ts
+frontend/src/api/subscriptions.ts
+frontend/src/api/tickets.ts
+frontend/src/api/tokenRefresh.ts
+frontend/src/api/totp.ts
+frontend/src/api/url.ts
+frontend/src/api/usage.ts
+frontend/src/api/user.ts
+frontend/src/assets/icons/airwallex.svg
+frontend/src/assets/icons/alipay.svg
+frontend/src/assets/icons/easypay.svg
+frontend/src/assets/icons/payment.svg
+frontend/src/assets/icons/stripe.svg
+frontend/src/assets/icons/wxpay.svg
+frontend/src/components/AliyunCaptchaWidget.vue
+frontend/src/components/CaptchaChallenge.vue
+frontend/src/components/Guide/steps.ts
+frontend/src/components/TencentCaptchaGate.vue
+frontend/src/components/TurnstileWidget.vue
+frontend/src/components/__tests__/AliyunCaptchaWidget.spec.ts
+frontend/src/components/__tests__/ApiKeyCreate.spec.ts
+frontend/src/components/__tests__/Dashboard.spec.ts
+frontend/src/components/__tests__/LoginForm.spec.ts
+frontend/src/components/__tests__/TencentCaptchaGate.spec.ts
+frontend/src/components/__tests__/TurnstileWidget.spec.ts
+frontend/src/components/account/AccountCapacityCell.vue
+frontend/src/components/account/AccountGroupsCell.vue
+frontend/src/components/account/AccountQuotaInfo.vue
+frontend/src/components/account/AccountStatsModal.vue
+frontend/src/components/account/AccountStatusIndicator.vue
+frontend/src/components/account/AccountTestModal.vue
+frontend/src/components/account/AccountTodayStatsCell.vue
+frontend/src/components/account/AccountUsageCell.vue
+frontend/src/components/account/BulkEditAccountModal.vue
+frontend/src/components/account/CNProviderBalanceCell.vue
+frontend/src/components/account/CNProviderQuotaCell.vue
+frontend/src/components/account/CapacityBadge.vue
+frontend/src/components/account/CnBaseUrlPresets.vue
+frontend/src/components/account/CreateAccountModal.vue
+frontend/src/components/account/EditAccountModal.vue
+frontend/src/components/account/GrokBaseUrlPresets.vue
+frontend/src/components/account/GrokQuotaProbeCell.vue
+frontend/src/components/account/HeaderOverrideEditor.vue
+frontend/src/components/account/HeaderOverrideJsonTools.vue
+frontend/src/components/account/ModelWhitelistSelector.vue
+frontend/src/components/account/OAuthAuthorizationFlow.vue
+frontend/src/components/account/OllamaCloudUsageCell.vue
+frontend/src/components/account/OllamaCloudUsageSettings.vue
+frontend/src/components/account/OpenAIQuotaResetCell.vue
+frontend/src/components/account/QuotaBadge.vue
+frontend/src/components/account/QuotaDimensionRow.vue
+frontend/src/components/account/QuotaLimitCard.vue
+frontend/src/components/account/QuotaNotifyToggle.vue
+frontend/src/components/account/ReAuthAccountModal.vue
+frontend/src/components/account/SyncFromCrsModal.vue
+frontend/src/components/account/TempUnschedStatusModal.vue
+frontend/src/components/account/UpstreamBillingRateCell.vue
+frontend/src/components/account/UpstreamRequestIdHeaderField.vue
+frontend/src/components/account/UsageProgressBar.vue
+frontend/src/components/account/__tests__/AccountStatusIndicator.spec.ts
+frontend/src/components/account/__tests__/AccountTestModal.spec.ts
+frontend/src/components/account/__tests__/AccountUsageCell.spec.ts
+frontend/src/components/account/__tests__/BulkEditAccountModal.spec.ts
+frontend/src/components/account/__tests__/CNProviderBalanceCell.spec.ts
+frontend/src/components/account/__tests__/CNProviderQuotaCell.spec.ts
+frontend/src/components/account/__tests__/CreateAccountModal.grok.spec.ts
+frontend/src/components/account/__tests__/CreateAccountModal.spec.ts
+frontend/src/components/account/__tests__/EditAccountModal.antiDegrade.spec.ts
+frontend/src/components/account/__tests__/EditAccountModal.grokMediaEligibility.spec.ts
+frontend/src/components/account/__tests__/EditAccountModal.grokUpstream.spec.ts
+frontend/src/components/account/__tests__/EditAccountModal.spec.ts
+frontend/src/components/account/__tests__/GrokQuotaProbeCell.spec.ts
+frontend/src/components/account/__tests__/ModelWhitelistSelector.spec.ts
+frontend/src/components/account/__tests__/OllamaCloudUsageCell.spec.ts
+frontend/src/components/account/__tests__/OllamaCloudUsageSettings.spec.ts
+frontend/src/components/account/__tests__/OpenAIQuotaResetCell.spark_shadow.spec.ts
+frontend/src/components/account/__tests__/UpstreamBillingRateCell.spec.ts
+frontend/src/components/account/__tests__/UpstreamRequestIdHeaderField.spec.ts
+frontend/src/components/account/__tests__/UsageProgressBar.spec.ts
+frontend/src/components/account/__tests__/accountExpiry.spec.ts
+frontend/src/components/account/__tests__/credentialsBuilder.cnAdaptive.spec.ts
+frontend/src/components/account/__tests__/credentialsBuilder.spec.ts
+frontend/src/components/account/__tests__/longContextBilling.spec.ts
+frontend/src/components/account/accountExpiry.ts
+frontend/src/components/account/credentialsBuilder.ts
+frontend/src/components/account/index.ts
+frontend/src/components/account/longContextBilling.ts
+frontend/src/components/admin/AdminComplianceDialog.vue
+frontend/src/components/admin/ErrorPassthroughRulesModal.vue
+frontend/src/components/admin/TLSFingerprintProfilesModal.vue
+frontend/src/components/admin/account/AccountActionMenu.vue
+frontend/src/components/admin/account/AccountBulkActionsBar.vue
+frontend/src/components/admin/account/AccountStatsModal.vue
+frontend/src/components/admin/account/AccountTableActions.vue
+frontend/src/components/admin/account/AccountTableFilters.vue
+frontend/src/components/admin/account/AccountTestModal.vue
+frontend/src/components/admin/account/ImportDataModal.vue
+frontend/src/components/admin/account/ReAuthAccountModal.vue
+frontend/src/components/admin/account/ScheduledTestsPanel.vue
+frontend/src/components/admin/account/__tests__/AccountActionMenu.position.spec.ts
+frontend/src/components/admin/account/__tests__/AccountActionMenu.spark_shadow.spec.ts
+frontend/src/components/admin/account/__tests__/AccountBulkActionsBar.spec.ts
+frontend/src/components/admin/account/__tests__/AccountTestModal.spec.ts
+frontend/src/components/admin/account/__tests__/ReAuthAccountModal.grok.spec.ts
+frontend/src/components/admin/announcements/AnnouncementReadStatusDialog.vue
+frontend/src/components/admin/announcements/AnnouncementTargetingEditor.vue
+frontend/src/components/admin/announcements/__tests__/AnnouncementReadStatusDialog.spec.ts
+frontend/src/components/admin/channel/IntervalRow.vue
+frontend/src/components/admin/channel/ModelTagInput.vue
+frontend/src/components/admin/channel/PricingEntryCard.vue
+frontend/src/components/admin/channel/TimePricingSection.vue
+frontend/src/components/admin/channel/__tests__/PricingEntryCard.timePricing.spec.ts
+frontend/src/components/admin/channel/__tests__/TimePricingSection.spec.ts
+frontend/src/components/admin/channel/__tests__/types.spec.ts
+frontend/src/components/admin/channel/types.ts
+frontend/src/components/admin/group/CodexManifestAccountsField.vue
+frontend/src/components/admin/group/GroupRPMOverridesModal.vue
+frontend/src/components/admin/group/GroupRateMultipliersModal.vue
+frontend/src/components/admin/group/ReasoningEffortPolicyFields.vue
+frontend/src/components/admin/group/__tests__/CodexManifestAccountsField.spec.ts
+frontend/src/components/admin/group/__tests__/ReasoningEffortPolicyFields.spec.ts
+frontend/src/components/admin/monitor/MonitorActionsCell.spec.ts
+frontend/src/components/admin/monitor/MonitorActionsCell.vue
+frontend/src/components/admin/monitor/MonitorAdvancedRequestConfig.vue
+frontend/src/components/admin/monitor/MonitorFiltersBar.vue
+frontend/src/components/admin/monitor/MonitorFormDialog.vue
+frontend/src/components/admin/monitor/MonitorKeyPickerDialog.vue
+frontend/src/components/admin/monitor/MonitorPrimaryModelCell.vue
+frontend/src/components/admin/monitor/MonitorRunResultDialog.vue
+frontend/src/components/admin/monitor/MonitorTemplateApplyPickerDialog.vue
+frontend/src/components/admin/monitor/MonitorTemplateManagerDialog.vue
+frontend/src/components/admin/monitor/__tests__/MonitorPrimaryModelCell.spec.ts
+frontend/src/components/admin/payment/AdminOrderDetail.vue
+frontend/src/components/admin/payment/AdminOrderTable.vue
+frontend/src/components/admin/payment/AdminRefundDialog.vue
+frontend/src/components/admin/payment/DailyRevenueChart.vue
+frontend/src/components/admin/payment/OrderStatsCards.vue
+frontend/src/components/admin/payment/PaymentMethodChart.vue
+frontend/src/components/admin/payment/TopUsersLeaderboard.vue
+frontend/src/components/admin/payment/__tests__/orderCurrencyDisplay.spec.ts
+frontend/src/components/admin/proxy/ImportDataModal.vue
+frontend/src/components/admin/usage/UsageCleanupDialog.vue
+frontend/src/components/admin/usage/UsageExportProgress.vue
+frontend/src/components/admin/usage/UsageFilters.vue
+frontend/src/components/admin/usage/UsageStatsCards.vue
+frontend/src/components/admin/usage/UsageTable.vue
+frontend/src/components/admin/usage/UserTokenRanking.vue
+frontend/src/components/admin/usage/__tests__/UsageFilters.spec.ts
+frontend/src/components/admin/usage/__tests__/UsageStatsCards.spec.ts
+frontend/src/components/admin/usage/__tests__/UsageTable.spec.ts
+frontend/src/components/admin/usage/__tests__/UserTokenRanking.spec.ts
+frontend/src/components/admin/user/BulkEditUserModal.vue
+frontend/src/components/admin/user/GroupReplaceModal.vue
+frontend/src/components/admin/user/UserAllowedGroupsModal.vue
+frontend/src/components/admin/user/UserApiKeysModal.vue
+frontend/src/components/admin/user/UserBalanceHistoryModal.vue
+frontend/src/components/admin/user/UserBalanceModal.vue
+frontend/src/components/admin/user/UserCreateModal.vue
+frontend/src/components/admin/user/UserEditModal.vue
+frontend/src/components/admin/user/UserPlatformQuotaModal.vue
+frontend/src/components/admin/user/__tests__/BulkEditUserModal.spec.ts
+frontend/src/components/admin/user/__tests__/UserEditModal.spec.ts
+frontend/src/components/admin/user/__tests__/UserPlatformQuotaModal.spec.ts
+frontend/src/components/auth/DingTalkOAuthSection.vue
+frontend/src/components/auth/EmailOAuthButtons.vue
+frontend/src/components/auth/GitHubMark.vue
+frontend/src/components/auth/GoogleMark.vue
+frontend/src/components/auth/LinuxDoOAuthSection.vue
+frontend/src/components/auth/LoginAgreementPrompt.vue
+frontend/src/components/auth/OidcOAuthSection.vue
+frontend/src/components/auth/PendingOAuthCreateAccountForm.vue
+frontend/src/components/auth/TotpLoginModal.vue
+frontend/src/components/auth/TotpStepUpDialog.vue
+frontend/src/components/auth/WechatOAuthSection.vue
+frontend/src/components/auth/__tests__/EmailOAuthButtons.spec.ts
+frontend/src/components/auth/__tests__/OAuthLoginSections.spec.ts
+frontend/src/components/auth/__tests__/PendingOAuthCreateAccountForm.spec.ts
+frontend/src/components/auth/__tests__/TotpLoginModal.spec.ts
+frontend/src/components/auth/__tests__/WechatOAuthSection.spec.ts
+frontend/src/components/channels/AvailableChannelsTable.vue
+frontend/src/components/channels/PricingRow.vue
+frontend/src/components/channels/SupportedModelChip.vue
+frontend/src/components/channels/__tests__/AvailableChannelsTable.spec.ts
+frontend/src/components/channels/__tests__/SupportedModelChip.spec.ts
+frontend/src/components/charts/EndpointDistributionChart.vue
+frontend/src/components/charts/GroupDistributionChart.vue
+frontend/src/components/charts/ModelDistributionChart.vue
+frontend/src/components/charts/TokenUsageTrend.vue
+frontend/src/components/charts/UserBreakdownSubTable.vue
+frontend/src/components/charts/__tests__/GroupDistributionChart.spec.ts
+frontend/src/components/charts/__tests__/ModelDistributionChart.spec.ts
+frontend/src/components/charts/__tests__/TokenUsageTrend.spec.ts
+frontend/src/components/common/AnnouncementBell.vue
+frontend/src/components/common/AnnouncementPopup.vue
+frontend/src/components/common/AutoRefreshButton.vue
+frontend/src/components/common/BaseDialog.vue
+frontend/src/components/common/ConfirmDialog.vue
+frontend/src/components/common/DataTable.vue
+frontend/src/components/common/DateRangePicker.vue
+frontend/src/components/common/EmptyState.vue
+frontend/src/components/common/ExportProgressDialog.vue
+frontend/src/components/common/GrokFreeIcon.vue
+frontend/src/components/common/GroupBadge.vue
+frontend/src/components/common/GroupCapacityBadge.vue
+frontend/src/components/common/GroupOptionItem.vue
+frontend/src/components/common/GroupSelector.vue
+frontend/src/components/common/HelpTooltip.vue
+frontend/src/components/common/ImageUpload.vue
+frontend/src/components/common/Input.vue
+frontend/src/components/common/IpGeoBatchToolbar.vue
+frontend/src/components/common/IpGeoCell.vue
+frontend/src/components/common/LoadingSpinner.vue
+frontend/src/components/common/LocaleSwitcher.vue
+frontend/src/components/common/ModelIcon.vue
+frontend/src/components/common/MonitorQuotaView.vue
+frontend/src/components/common/NavigationProgress.vue
+frontend/src/components/common/Pagination.vue
+frontend/src/components/common/PlatformIcon.vue
+frontend/src/components/common/PlatformTypeBadge.vue
+frontend/src/components/common/ProxyAdBanner.vue
+frontend/src/components/common/ProxySelector.vue
+frontend/src/components/common/README.md
+frontend/src/components/common/SearchInput.vue
+frontend/src/components/common/Select.vue
+frontend/src/components/common/Skeleton.vue
+frontend/src/components/common/StatCard.vue
+frontend/src/components/common/StatusBadge.vue
+frontend/src/components/common/SubscriptionProgressMini.vue
+frontend/src/components/common/TextArea.vue
+frontend/src/components/common/Toast.vue
+frontend/src/components/common/Toggle.vue
+frontend/src/components/common/VersionBadge.vue
+frontend/src/components/common/__tests__/AnnouncementPopup.spec.ts
+frontend/src/components/common/__tests__/BaseDialog.spec.ts
+frontend/src/components/common/__tests__/DataTable.spec.ts
+frontend/src/components/common/__tests__/DateRangePicker.spec.ts
+frontend/src/components/common/__tests__/GroupOptionItem.spec.ts
+frontend/src/components/common/__tests__/GroupSelector.spec.ts
+frontend/src/components/common/__tests__/HelpTooltip.spec.ts
+frontend/src/components/common/__tests__/IpGeoCell.spec.ts
+frontend/src/components/common/__tests__/MonitorQuotaView.spec.ts
+frontend/src/components/common/__tests__/NavigationProgress.spec.ts
+frontend/src/components/common/__tests__/PlatformTypeBadge.grok.spec.ts
+frontend/src/components/common/__tests__/Select.spec.ts
+frontend/src/components/common/index.ts
+frontend/src/components/common/types.ts
+frontend/src/components/icons/Icon.vue
+frontend/src/components/icons/index.ts
+frontend/src/components/keys/EndpointPopover.vue
+frontend/src/components/keys/UseKeyModal.vue
+frontend/src/components/keys/__tests__/EndpointPopover.spec.ts
+frontend/src/components/keys/__tests__/UseKeyModal.spec.ts
+frontend/src/components/layout/AppHeader.vue
+frontend/src/components/layout/AppLayout.vue
+frontend/src/components/layout/AppSidebar.vue
+frontend/src/components/layout/AuthLayout.vue
+frontend/src/components/layout/EXAMPLES.md
+frontend/src/components/layout/INTEGRATION.md
+frontend/src/components/layout/README.md
+frontend/src/components/layout/TablePageLayout.vue
+frontend/src/components/layout/__tests__/AppSidebar.spec.ts
+frontend/src/components/layout/__tests__/TablePageLayout.spec.ts
+frontend/src/components/layout/__tests__/docUrlSanitization.spec.ts
+frontend/src/components/layout/__tests__/siteLogoSanitization.spec.ts
+frontend/src/components/layout/index.ts
+frontend/src/components/modelPlaza/ModelPlazaContent.vue
+frontend/src/components/modelPlaza/PlazaFilterBar.vue
+frontend/src/components/modelPlaza/PlazaGroupSection.vue
+frontend/src/components/modelPlaza/PlazaModelPricingTable.vue
+frontend/src/components/modelPlaza/PlazaNavBar.vue
+frontend/src/components/modelPlaza/__tests__/PlazaGroupSection.spec.ts
+frontend/src/components/modelPlaza/__tests__/PlazaModelPricingTable.spec.ts
+frontend/src/components/payment/AmountInput.vue
+frontend/src/components/payment/OrderStatusBadge.vue
+frontend/src/components/payment/OrderTable.vue
+frontend/src/components/payment/PaymentMethodSelector.vue
+frontend/src/components/payment/PaymentProviderDialog.vue
+frontend/src/components/payment/PaymentProviderList.vue
+frontend/src/components/payment/PaymentQRDialog.vue
+frontend/src/components/payment/PaymentStatusPanel.vue
+frontend/src/components/payment/ProviderCard.vue
+frontend/src/components/payment/StripePaymentInline.vue
+frontend/src/components/payment/SubscriptionPlanCard.vue
+frontend/src/components/payment/ToggleSwitch.vue
+frontend/src/components/payment/__tests__/PaymentMethodSelector.spec.ts
+frontend/src/components/payment/__tests__/PaymentProviderDialog.spec.ts
+frontend/src/components/payment/__tests__/PaymentQRDialog.spec.ts
+frontend/src/components/payment/__tests__/PaymentStatusPanel.spec.ts
+frontend/src/components/payment/__tests__/SubscriptionPlanCard.spec.ts
+frontend/src/components/payment/__tests__/alipayDeepLink.spec.ts
+frontend/src/components/payment/__tests__/currency.spec.ts
+frontend/src/components/payment/__tests__/paymentFlow.spec.ts
+frontend/src/components/payment/__tests__/providerConfig.spec.ts
+frontend/src/components/payment/__tests__/validity.spec.ts
+frontend/src/components/payment/alipayDeepLink.ts
+frontend/src/components/payment/currency.ts
+frontend/src/components/payment/orderUtils.ts
+frontend/src/components/payment/paymentFlow.ts
+frontend/src/components/payment/providerConfig.ts
+frontend/src/components/payment/validity.ts
+frontend/src/components/relay/RelayBrand.vue
+frontend/src/components/relay/RelayQuickStart.vue
+frontend/src/components/user/MonitorDetailDialog.vue
+frontend/src/components/user/PlatformCostCell.vue
+frontend/src/components/user/PlatformUsageBreakdown.vue
+frontend/src/components/user/UserAttributeForm.vue
+frontend/src/components/user/UserAttributesConfigModal.vue
+frontend/src/components/user/UserConcurrencyCell.vue
+frontend/src/components/user/UserErrorDetailModal.vue
+frontend/src/components/user/UserErrorRequestsTable.vue
+frontend/src/components/user/UserPlatformQuotaCell.vue
+frontend/src/components/user/__tests__/MonitorCard.quota.spec.ts
+frontend/src/components/user/__tests__/UserPlatformQuotaCell.spec.ts
+frontend/src/components/user/dashboard/UserDashboardCharts.vue
+frontend/src/components/user/dashboard/UserDashboardQuickActions.vue
+frontend/src/components/user/dashboard/UserDashboardRecentUsage.vue
+frontend/src/components/user/dashboard/UserDashboardStats.vue
+frontend/src/components/user/monitor/MonitorAvailabilityRow.vue
+frontend/src/components/user/monitor/MonitorCard.vue
+frontend/src/components/user/monitor/MonitorCardGrid.vue
+frontend/src/components/user/monitor/MonitorHero.vue
+frontend/src/components/user/monitor/MonitorMetricPair.vue
+frontend/src/components/user/monitor/MonitorTimeline.vue
+frontend/src/components/user/monitor/ProviderIcon.vue
+frontend/src/components/user/profile/ProfileAccountBindingsCard.vue
+frontend/src/components/user/profile/ProfileAvatarCard.vue
+frontend/src/components/user/profile/ProfileBalanceNotifyCard.vue
+frontend/src/components/user/profile/ProfileEditForm.vue
+frontend/src/components/user/profile/ProfileIdentityBindingsSection.vue
+frontend/src/components/user/profile/ProfileInfoCard.vue
+frontend/src/components/user/profile/ProfilePasskeyCard.vue
+frontend/src/components/user/profile/ProfilePasswordForm.vue
+frontend/src/components/user/profile/ProfileTotpCard.vue
+frontend/src/components/user/profile/TotpDisableDialog.vue
+frontend/src/components/user/profile/TotpSetupModal.vue
+frontend/src/components/user/profile/__tests__/ProfileAvatarCard.spec.ts
+frontend/src/components/user/profile/__tests__/ProfileIdentityBindingsSection.spec.ts
+frontend/src/components/user/profile/__tests__/ProfileInfoCard.spec.ts
+frontend/src/components/user/profile/__tests__/ProfilePasswordForm.spec.ts
+frontend/src/components/user/profile/__tests__/totp-timer-cleanup.spec.ts
+frontend/src/composables/__tests__/useAntigravityOAuth.spec.ts
+frontend/src/composables/__tests__/useClipboard.spec.ts
+frontend/src/composables/__tests__/useForm.spec.ts
+frontend/src/composables/__tests__/useGrokOAuth.spec.ts
+frontend/src/composables/__tests__/useKeyedDebouncedSearch.spec.ts
+frontend/src/composables/__tests__/useModelWhitelist.spec.ts
+frontend/src/composables/__tests__/useNavigationLoading.spec.ts
+frontend/src/composables/__tests__/useOpenAIOAuth.spec.ts
+frontend/src/composables/__tests__/usePersistedPageSize.spec.ts
+frontend/src/composables/__tests__/useRelayEndpoint.spec.ts
+frontend/src/composables/__tests__/useRoutePrefetch.spec.ts
+frontend/src/composables/__tests__/useStepUp.spec.ts
+frontend/src/composables/__tests__/useSwipeSelect.spec.ts
+frontend/src/composables/__tests__/useTableLoader.spec.ts
+frontend/src/composables/useAccountOAuth.ts
+frontend/src/composables/useAntigravityOAuth.ts
+frontend/src/composables/useAutoRefresh.ts
+frontend/src/composables/useBatchImageAccess.ts
+frontend/src/composables/useChannelMonitorFormat.ts
+frontend/src/composables/useClipboard.ts
+frontend/src/composables/useForm.ts
+frontend/src/composables/useGeminiOAuth.ts
+frontend/src/composables/useGrokOAuth.ts
+frontend/src/composables/useKeyedDebouncedSearch.ts
+frontend/src/composables/useModelWhitelist.ts
+frontend/src/composables/useNavigationLoading.ts
+frontend/src/composables/useOnboardingTour.ts
+frontend/src/composables/useOpenAIOAuth.ts
+frontend/src/composables/usePersistedPageSize.ts
+frontend/src/composables/useQuotaNotifyState.ts
+frontend/src/composables/useRelayBrand.ts
+frontend/src/composables/useRelayEndpoint.ts
+frontend/src/composables/useRoutePrefetch.ts
+frontend/src/composables/useStepUp.ts
+frontend/src/composables/useSwipeSelect.ts
+frontend/src/composables/useTableLoader.ts
+frontend/src/composables/useTableSelection.ts
+frontend/src/constants/__tests__/platforms.spec.ts
+frontend/src/constants/account.ts
+frontend/src/constants/channel.ts
+frontend/src/constants/channelMonitor.ts
+frontend/src/constants/platforms.ts
+frontend/src/features/channel-monitor-v2/FilterMultiSelect.vue
+frontend/src/features/channel-monitor-v2/MetricCell.vue
+frontend/src/features/channel-monitor-v2/MonitorRankBadge.vue
+frontend/src/features/channel-monitor-v2/MonitorSettingsPanel.vue
+frontend/src/features/channel-monitor-v2/MonitorTrendChart.vue
+frontend/src/features/channel-monitor-v2/RelayPulseMatrix.vue
+frontend/src/features/channel-monitor-v2/__tests__/MetricCell.spec.ts
+frontend/src/features/channel-monitor-v2/__tests__/RelayPulseMatrix.spec.ts
+frontend/src/features/channel-monitor-v2/__tests__/designSystem.structure.spec.ts
+frontend/src/features/channel-monitor-v2/__tests__/monitorFormat.spec.ts
+frontend/src/features/channel-monitor-v2/__tests__/monitorZoom.spec.ts
+frontend/src/features/channel-monitor-v2/monitorFormat.ts
+frontend/src/features/channel-monitor-v2/monitorZoom.ts
+frontend/src/features/prompt-audit/PromptAuditView.vue
+frontend/src/features/prompt-audit/__tests__/PromptAuditView.spec.ts
+frontend/src/features/prompt-audit/__tests__/api.spec.ts
+frontend/src/features/prompt-audit/__tests__/components.spec.ts
+frontend/src/features/prompt-audit/__tests__/integrationSurface.spec.ts
+frontend/src/features/prompt-audit/__tests__/viewModel.spec.ts
+frontend/src/features/prompt-audit/api.ts
+frontend/src/features/prompt-audit/components/EndpointPool.vue
+frontend/src/features/prompt-audit/components/EventDetailDialog.vue
+frontend/src/features/prompt-audit/components/EventWorkspace.vue
+frontend/src/features/prompt-audit/components/FilterDeleteDialog.vue
+frontend/src/features/prompt-audit/components/PolicyPanel.vue
+frontend/src/features/prompt-audit/components/RuntimeOverview.vue
+frontend/src/features/prompt-audit/types.ts
+frontend/src/features/prompt-audit/viewModel.ts
+frontend/src/i18n/__tests__/ipGeoLocales.spec.ts
+frontend/src/i18n/__tests__/localeKeyCompleteness.spec.ts
+frontend/src/i18n/__tests__/localesMessageCompile.spec.ts
+frontend/src/i18n/__tests__/localesNoKeyCollision.spec.ts
+frontend/src/i18n/__tests__/openaiFastPolicyLocales.spec.ts
+frontend/src/i18n/__tests__/opsLocaleKeys.spec.ts
+frontend/src/i18n/__tests__/riskControlLocales.spec.ts
+frontend/src/i18n/__tests__/usageServiceTierLocales.spec.ts
+frontend/src/i18n/__tests__/wsModeLocaleDesc.spec.ts
+frontend/src/i18n/index.ts
+frontend/src/i18n/locales/en/admin/accounts.ts
+frontend/src/i18n/locales/en/admin/audit.ts
+frontend/src/i18n/locales/en/admin/channels.ts
+frontend/src/i18n/locales/en/admin/index.ts
+frontend/src/i18n/locales/en/admin/ops.ts
+frontend/src/i18n/locales/en/admin/overview.ts
+frontend/src/i18n/locales/en/admin/plugins.ts
+frontend/src/i18n/locales/en/admin/promptAudit.ts
+frontend/src/i18n/locales/en/admin/resources.ts
+frontend/src/i18n/locales/en/admin/settings.ts
+frontend/src/i18n/locales/en/batchImage.ts
+frontend/src/i18n/locales/en/channelMonitorV2.ts
+frontend/src/i18n/locales/en/common.ts
+frontend/src/i18n/locales/en/dashboard.ts
+frontend/src/i18n/locales/en/index.ts
+frontend/src/i18n/locales/en/landing.ts
+frontend/src/i18n/locales/en/misc.ts
+frontend/src/i18n/locales/zh/admin/accounts.ts
+frontend/src/i18n/locales/zh/admin/audit.ts
+frontend/src/i18n/locales/zh/admin/channels.ts
+frontend/src/i18n/locales/zh/admin/index.ts
+frontend/src/i18n/locales/zh/admin/ops.ts
+frontend/src/i18n/locales/zh/admin/overview.ts
+frontend/src/i18n/locales/zh/admin/plugins.ts
+frontend/src/i18n/locales/zh/admin/promptAudit.ts
+frontend/src/i18n/locales/zh/admin/resources.ts
+frontend/src/i18n/locales/zh/admin/settings.ts
+frontend/src/i18n/locales/zh/batchImage.ts
+frontend/src/i18n/locales/zh/channelMonitorV2.ts
+frontend/src/i18n/locales/zh/common.ts
+frontend/src/i18n/locales/zh/dashboard.ts
+frontend/src/i18n/locales/zh/index.ts
+frontend/src/i18n/locales/zh/landing.ts
+frontend/src/i18n/locales/zh/misc.ts
+frontend/src/main.ts
+frontend/src/router/README.md
+frontend/src/router/__tests__/feature-access.spec.ts
+frontend/src/router/__tests__/guards.spec.ts
+frontend/src/router/__tests__/title.spec.ts
+frontend/src/router/__tests__/wechat-route.spec.ts
+frontend/src/router/index.ts
+frontend/src/router/meta.d.ts
+frontend/src/router/setupRedirect.ts
+frontend/src/router/title.ts
+frontend/src/stores/README.md
+frontend/src/stores/__tests__/app.spec.ts
+frontend/src/stores/__tests__/auth.spec.ts
+frontend/src/stores/__tests__/subscriptions.spec.ts
+frontend/src/stores/adminCompliance.ts
+frontend/src/stores/adminSettings.ts
+frontend/src/stores/announcements.ts
+frontend/src/stores/app.ts
+frontend/src/stores/auth.ts
+frontend/src/stores/index.ts
+frontend/src/stores/onboarding.ts
+frontend/src/stores/payment.ts
+frontend/src/stores/subscriptions.ts
+frontend/src/style.css
+frontend/src/styles/announcement-markdown.css
+frontend/src/styles/onboarding.css
+frontend/src/styles/relay.css
+frontend/src/types/global.d.ts
+frontend/src/types/index.ts
+frontend/src/types/payment.ts
+frontend/src/utils/__tests__/accountSelection.spec.ts
+frontend/src/utils/__tests__/accountUsageRefresh.spec.ts
+frontend/src/utils/__tests__/authError.spec.ts
+frontend/src/utils/__tests__/billingMode.spec.ts
+frontend/src/utils/__tests__/branding.spec.ts
+frontend/src/utils/__tests__/ccswitchImport.spec.ts
+frontend/src/utils/__tests__/codexCatalogConfig.spec.ts
+frontend/src/utils/__tests__/device.spec.ts
+frontend/src/utils/__tests__/embedded-url.spec.ts
+frontend/src/utils/__tests__/floatingPanel.spec.ts
+frontend/src/utils/__tests__/formatCompactNumber.spec.ts
+frontend/src/utils/__tests__/formatDateLocalInput.spec.ts
+frontend/src/utils/__tests__/formatDateTimeLocalInput.spec.ts
+frontend/src/utils/__tests__/formatDateTimeToMinute.spec.ts
+frontend/src/utils/__tests__/formatMultiplier.spec.ts
+frontend/src/utils/__tests__/formatReasoningEffort.spec.ts
+frontend/src/utils/__tests__/intervalPrices.spec.ts
+frontend/src/utils/__tests__/ipGeoLookup.spec.ts
+frontend/src/utils/__tests__/latencyHealth.spec.ts
+frontend/src/utils/__tests__/oauthAffiliate.spec.ts
+frontend/src/utils/__tests__/openaiWsMode.spec.ts
+frontend/src/utils/__tests__/proxyExpiry.spec.ts
+frontend/src/utils/__tests__/proxyParser.spec.ts
+frontend/src/utils/__tests__/registrationEmailPolicy.spec.ts
+frontend/src/utils/__tests__/stableObjectKey.spec.ts
+frontend/src/utils/__tests__/subscriptionQuota.spec.ts
+frontend/src/utils/__tests__/tablePreferences.spec.ts
+frontend/src/utils/__tests__/usageServiceTier.spec.ts
+frontend/src/utils/accountSelection.ts
+frontend/src/utils/accountUsageRefresh.ts
+frontend/src/utils/apiError.ts
+frontend/src/utils/authError.ts
+frontend/src/utils/billingMode.ts
+frontend/src/utils/branding.ts
+frontend/src/utils/ccswitchImport.ts
+frontend/src/utils/codexCatalogConfig.ts
+frontend/src/utils/device.ts
+frontend/src/utils/embedded-url.ts
+frontend/src/utils/errorBadges.ts
+frontend/src/utils/errorCategory.ts
+frontend/src/utils/featureFlags.ts
+frontend/src/utils/floatingPanel.ts
+frontend/src/utils/format.ts
+frontend/src/utils/formatters.ts
+frontend/src/utils/imageUsage.ts
+frontend/src/utils/ipGeoLookup.ts
+frontend/src/utils/latencyHealth.ts
+frontend/src/utils/maskApiKey.ts
+frontend/src/utils/oauthAffiliate.ts
+frontend/src/utils/openaiWsMode.ts
+frontend/src/utils/peak-rate.ts
+frontend/src/utils/platformColors.ts
+frontend/src/utils/pricing.ts
+frontend/src/utils/proxyExpiry.ts
+frontend/src/utils/proxyParser.ts
+frontend/src/utils/registrationEmailPolicy.ts
+frontend/src/utils/sanitize.ts
+frontend/src/utils/stableObjectKey.ts
+frontend/src/utils/subscriptionQuota.ts
+frontend/src/utils/tablePreferences.ts
+frontend/src/utils/tencentCaptcha.ts
+frontend/src/utils/url.ts
+frontend/src/utils/usageLoadQueue.ts
+frontend/src/utils/usagePricing.ts
+frontend/src/utils/usageRequestType.ts
+frontend/src/utils/usageServiceTier.ts
+frontend/src/views/HomeView.vue
+frontend/src/views/KeyUsageView.vue
+frontend/src/views/ModelPlazaView.vue
+frontend/src/views/NotFoundView.vue
+frontend/src/views/__tests__/HomeView.compact.spec.ts
+frontend/src/views/__tests__/KeyUsageView.spec.ts
+frontend/src/views/admin/AccountHealthView.vue
+frontend/src/views/admin/AccountsView.vue
+frontend/src/views/admin/AnnouncementsView.vue
+frontend/src/views/admin/AuditLogView.vue
+frontend/src/views/admin/BackupView.vue
+frontend/src/views/admin/ChannelMonitorView.vue
+frontend/src/views/admin/ChannelsView.vue
+frontend/src/views/admin/DashboardView.vue
+frontend/src/views/admin/GlobalPricingView.vue
+frontend/src/views/admin/GroupsView.vue
+frontend/src/views/admin/MarginView.vue
+frontend/src/views/admin/PluginsView.vue
+frontend/src/views/admin/PromoCodesView.vue
+frontend/src/views/admin/ProxiesView.vue
+frontend/src/views/admin/RedeemView.vue
+frontend/src/views/admin/RiskControlView.vue
+frontend/src/views/admin/SettingsView.vue
+frontend/src/views/admin/SpendGuardView.vue
+frontend/src/views/admin/SubscriptionsView.vue
+frontend/src/views/admin/TicketsAdminView.vue
+frontend/src/views/admin/TieredRoutingView.vue
+frontend/src/views/admin/UsageView.vue
+frontend/src/views/admin/UsersView.vue
+frontend/src/views/admin/__tests__/AccountsView.bulkEdit.spec.ts
+frontend/src/views/admin/__tests__/AccountsView.lite.spec.ts
+frontend/src/views/admin/__tests__/AccountsView.priorityColumn.spec.ts
+frontend/src/views/admin/__tests__/AccountsView.schedulerScore.spec.ts
+frontend/src/views/admin/__tests__/AccountsView.selectAllResults.spec.ts
+frontend/src/views/admin/__tests__/AccountsView.sparkShadow.spec.ts
+frontend/src/views/admin/__tests__/AccountsView.usageWindowsHint.spec.ts
+frontend/src/views/admin/__tests__/BackupView.spec.ts
+frontend/src/views/admin/__tests__/ChannelMonitorView.checkModeBadge.spec.ts
+frontend/src/views/admin/__tests__/ChannelMonitorView.duplicate.spec.ts
+frontend/src/views/admin/__tests__/ChannelMonitorView.grok.spec.ts
+frontend/src/views/admin/__tests__/DashboardView.spec.ts
+frontend/src/views/admin/__tests__/FeatureSettings.locale.spec.ts
+frontend/src/views/admin/__tests__/GroupsView.codexManifest.spec.ts
+frontend/src/views/admin/__tests__/GroupsView.columnSettings.spec.ts
+frontend/src/views/admin/__tests__/GroupsView.compositePlatforms.spec.ts
+frontend/src/views/admin/__tests__/GroupsView.duplicate.spec.ts
+frontend/src/views/admin/__tests__/MonitorFormDialog.accountSelector.spec.ts
+frontend/src/views/admin/__tests__/PluginsView.spec.ts
+frontend/src/views/admin/__tests__/ProxiesView.ipv6.spec.ts
+frontend/src/views/admin/__tests__/RedeemView.batchUpdate.spec.ts
+frontend/src/views/admin/__tests__/RiskControlView.spec.ts
+frontend/src/views/admin/__tests__/SettingsView.spec.ts
+frontend/src/views/admin/__tests__/SubscriptionsView.userUsageLink.spec.ts
+frontend/src/views/admin/__tests__/UsageView.spec.ts
+frontend/src/views/admin/__tests__/UsersView.spec.ts
+frontend/src/views/admin/__tests__/apiKeyGroupFilterOptions.spec.ts
+frontend/src/views/admin/__tests__/channelPlatformOptions.spec.ts
+frontend/src/views/admin/__tests__/codexFingerprintSignals.spec.ts
+frontend/src/views/admin/__tests__/groupModelAllowlist.spec.ts
+frontend/src/views/admin/__tests__/groupModelAllowlistLayout.spec.ts
+frontend/src/views/admin/__tests__/groupsImagePricing.spec.ts
+frontend/src/views/admin/__tests__/groupsMessagesDispatch.spec.ts
+frontend/src/views/admin/__tests__/groupsOpenAIFast.spec.ts
+frontend/src/views/admin/__tests__/groupsProfitControl.spec.ts
+frontend/src/views/admin/__tests__/groupsReasoningEffort.spec.ts
+frontend/src/views/admin/__tests__/groupsSupportedModelScopes.spec.ts
+frontend/src/views/admin/__tests__/groupsVideoModelPricing.spec.ts
+frontend/src/views/admin/__tests__/modelAllowlistCandidates.spec.ts
+frontend/src/views/admin/__tests__/platformFilterCatalogUsage.spec.ts
+frontend/src/views/admin/affiliates/AdminAffiliateInvitesView.vue
+frontend/src/views/admin/affiliates/AdminAffiliateRebatesView.vue
+frontend/src/views/admin/affiliates/AdminAffiliateRecordsTable.vue
+frontend/src/views/admin/affiliates/AdminAffiliateTransfersView.vue
+frontend/src/views/admin/apiKeyGroupFilterOptions.ts
+frontend/src/views/admin/codexFingerprintSignals.ts
+frontend/src/views/admin/groupModelAllowlist.ts
+frontend/src/views/admin/groupsImagePricing.ts
+frontend/src/views/admin/groupsMessagesDispatch.ts
+frontend/src/views/admin/groupsOpenAIFast.ts
+frontend/src/views/admin/groupsProfitControl.ts
+frontend/src/views/admin/groupsReasoningEffort.ts
+frontend/src/views/admin/groupsSupportedModelScopes.ts
+frontend/src/views/admin/groupsVideoModelPricing.ts
+frontend/src/views/admin/modelAllowlistCandidates.ts
+frontend/src/views/admin/ops/OpsDashboard.vue
+frontend/src/views/admin/ops/components/OpsAlertEventsCard.vue
+frontend/src/views/admin/ops/components/OpsAlertRulesCard.vue
+frontend/src/views/admin/ops/components/OpsConcurrencyCard.vue
+frontend/src/views/admin/ops/components/OpsDashboardHeader.vue
+frontend/src/views/admin/ops/components/OpsDashboardSkeleton.vue
+frontend/src/views/admin/ops/components/OpsEmailNotificationCard.vue
+frontend/src/views/admin/ops/components/OpsErrorDetailModal.vue
+frontend/src/views/admin/ops/components/OpsErrorDetailsModal.vue
+frontend/src/views/admin/ops/components/OpsErrorDistributionChart.vue
+frontend/src/views/admin/ops/components/OpsErrorLogTable.vue
+frontend/src/views/admin/ops/components/OpsErrorTrendChart.vue
+frontend/src/views/admin/ops/components/OpsLatencyChart.vue
+frontend/src/views/admin/ops/components/OpsOpenAITokenStatsCard.vue
+frontend/src/views/admin/ops/components/OpsRequestDetailsModal.vue
+frontend/src/views/admin/ops/components/OpsRuntimeSettingsCard.vue
+frontend/src/views/admin/ops/components/OpsSettingsDialog.vue
+frontend/src/views/admin/ops/components/OpsSwitchRateTrendChart.vue
+frontend/src/views/admin/ops/components/OpsSystemLogTable.vue
+frontend/src/views/admin/ops/components/OpsThroughputTrendChart.vue
+frontend/src/views/admin/ops/components/__tests__/OpsErrorDetailModal.spec.ts
+frontend/src/views/admin/ops/components/__tests__/OpsErrorLogTable.spec.ts
+frontend/src/views/admin/ops/components/__tests__/OpsErrorScopeCharts.spec.ts
+frontend/src/views/admin/ops/components/__tests__/OpsOpenAITokenStatsCard.spec.ts
+frontend/src/views/admin/ops/components/__tests__/OpsSystemLogTable.spec.ts
+frontend/src/views/admin/ops/components/__tests__/OpsThroughputTrendChart.spec.ts
+frontend/src/views/admin/ops/types.ts
+frontend/src/views/admin/ops/utils/__tests__/errorDetailResponse.spec.ts
+frontend/src/views/admin/ops/utils/__tests__/opsErrorParams.spec.ts
+frontend/src/views/admin/ops/utils/__tests__/opsFormatters.spec.ts
+frontend/src/views/admin/ops/utils/errorDetailResponse.ts
+frontend/src/views/admin/ops/utils/opsErrorParams.ts
+frontend/src/views/admin/ops/utils/opsFormatters.ts
+frontend/src/views/admin/orders/AdminOrdersView.vue
+frontend/src/views/admin/orders/AdminPaymentDashboardView.vue
+frontend/src/views/admin/orders/AdminPaymentPlansView.vue
+frontend/src/views/admin/orders/PlanEditDialog.vue
+frontend/src/views/admin/orders/__tests__/AdminPaymentPlansView.spec.ts
+frontend/src/views/admin/orders/__tests__/PlanEditDialog.spec.ts
+frontend/src/views/admin/settings/EmailTemplateEditor.vue
+frontend/src/views/admin/settings/OpenAIFastPolicyUserSelector.vue
+frontend/src/views/admin/settings/__tests__/OpenAIFastPolicyUserSelector.spec.ts
+frontend/src/views/auth/DingTalkCallbackView.vue
+frontend/src/views/auth/DingTalkEmailCompletionView.vue
+frontend/src/views/auth/EmailVerifyView.vue
+frontend/src/views/auth/ForgotPasswordView.vue
+frontend/src/views/auth/LinuxDoCallbackView.vue
+frontend/src/views/auth/LoginView.vue
+frontend/src/views/auth/OAuthCallbackView.vue
+frontend/src/views/auth/OidcCallbackView.vue
+frontend/src/views/auth/README.md
+frontend/src/views/auth/RegisterView.vue
+frontend/src/views/auth/ResetPasswordView.vue
+frontend/src/views/auth/USAGE_EXAMPLES.md
+frontend/src/views/auth/VISUAL_GUIDE.md
+frontend/src/views/auth/WechatCallbackView.vue
+frontend/src/views/auth/WechatPaymentCallbackView.vue
+frontend/src/views/auth/__tests__/EmailVerifyView.spec.ts
+frontend/src/views/auth/__tests__/LinuxDoCallbackView.spec.ts
+frontend/src/views/auth/__tests__/LoginView.spec.ts
+frontend/src/views/auth/__tests__/OAuthCallbackView.spec.ts
+frontend/src/views/auth/__tests__/OidcCallbackView.spec.ts
+frontend/src/views/auth/__tests__/RegisterView.spec.ts
+frontend/src/views/auth/__tests__/TencentCaptchaActionGate.spec.ts
+frontend/src/views/auth/__tests__/TencentCaptchaForgotPassword.spec.ts
+frontend/src/views/auth/__tests__/WechatCallbackView.spec.ts
+frontend/src/views/auth/__tests__/WechatPaymentCallbackView.spec.ts
+frontend/src/views/auth/index.ts
+frontend/src/views/public/LegalDocumentView.vue
+frontend/src/views/setup/SetupWizardView.vue
+frontend/src/views/user/AffiliateView.vue
+frontend/src/views/user/AirwallexPaymentView.vue
+frontend/src/views/user/AvailableChannelsView.vue
+frontend/src/views/user/BatchImageGuideView.vue
+frontend/src/views/user/BillingView.vue
+frontend/src/views/user/ChannelStatusV1View.vue
+frontend/src/views/user/ChannelStatusV2View.vue
+frontend/src/views/user/ChannelStatusView.vue
+frontend/src/views/user/CustomPageView.vue
+frontend/src/views/user/DashboardView.vue
+frontend/src/views/user/KeysView.vue
+frontend/src/views/user/PaymentQRCodeView.vue
+frontend/src/views/user/PaymentResultView.vue
+frontend/src/views/user/PaymentView.vue
+frontend/src/views/user/ProfileView.vue
+frontend/src/views/user/RedeemView.vue
+frontend/src/views/user/StripePaymentView.vue
+frontend/src/views/user/StripePopupView.vue
+frontend/src/views/user/SubscriptionsView.vue
+frontend/src/views/user/TicketsView.vue
+frontend/src/views/user/UsageView.vue
+frontend/src/views/user/UserOrdersView.vue
+frontend/src/views/user/__tests__/AffiliateView.spec.ts
+frontend/src/views/user/__tests__/AirwallexPaymentView.spec.ts
+frontend/src/views/user/__tests__/ChannelStatusView.mode.spec.ts
+frontend/src/views/user/__tests__/CustomPageView.spec.ts
+frontend/src/views/user/__tests__/DashboardView.relay.spec.ts
+frontend/src/views/user/__tests__/KeysView.spec.ts
+frontend/src/views/user/__tests__/PaymentResultView.spec.ts
+frontend/src/views/user/__tests__/PaymentView.spec.ts
+frontend/src/views/user/__tests__/ProfileView.spec.ts
+frontend/src/views/user/__tests__/StripePaymentView.spec.ts
+frontend/src/views/user/__tests__/UsageView.spec.ts
+frontend/src/views/user/__tests__/paymentUx.spec.ts
+frontend/src/views/user/__tests__/paymentWechatResume.spec.ts
+frontend/src/views/user/__tests__/stripeLazyLoading.spec.ts
+frontend/src/views/user/paymentUx.ts
+frontend/src/views/user/paymentWechatResume.ts
+frontend/src/vite-env.d.ts
+frontend/tailwind.config.js
+frontend/tsconfig.json
+frontend/tsconfig.node.json
+frontend/vite.config.ts
+frontend/vitest.config.ts
+openspec/changes/add-openai-compatible-prompt-audit/.openspec.yaml
+openspec/changes/add-openai-compatible-prompt-audit/README.md
+openspec/changes/add-openai-compatible-prompt-audit/design.md
+openspec/changes/add-openai-compatible-prompt-audit/implementation-evidence.md
+openspec/changes/add-openai-compatible-prompt-audit/implementation-guide.md
+openspec/changes/add-openai-compatible-prompt-audit/proposal.md
+openspec/changes/add-openai-compatible-prompt-audit/source-baseline.md
+openspec/changes/add-openai-compatible-prompt-audit/source-feature-map.md
+openspec/changes/add-openai-compatible-prompt-audit/source-freeze/MANIFEST.md
+openspec/changes/add-openai-compatible-prompt-audit/source-freeze/aicodex-prompt-audit-tracked.patch
+openspec/changes/add-openai-compatible-prompt-audit/specs/prompt-input-audit/spec.md
+openspec/changes/add-openai-compatible-prompt-audit/specs/prompt-input-guard/spec.md
+openspec/changes/add-openai-compatible-prompt-audit/specs/security-audit-console/spec.md
+openspec/changes/add-openai-compatible-prompt-audit/tasks.md
+openspec/changes/add-openai-compatible-prompt-audit/verification.md
+openspec/changes/codex-manifest-pinned-accounts/.openspec.yaml
+openspec/changes/codex-manifest-pinned-accounts/design.md
+openspec/changes/codex-manifest-pinned-accounts/proposal.md
+openspec/changes/codex-manifest-pinned-accounts/specs/codex-manifest-cache/spec.md
+openspec/changes/codex-manifest-pinned-accounts/specs/codex-manifest-pinned-accounts/spec.md
+openspec/changes/codex-manifest-pinned-accounts/tasks.md
+openspec/changes/codex-manifest-pinned-accounts/verification.md
+skills/sub2api-admin/SKILL.md
+skills/sub2api-admin/agents/openai.yaml
+skills/sub2api-admin/references/admin-cli.md
+skills/sub2api-admin/scripts/sub2api-admin.js
+tools/archive-mode1-local.py
+tools/package-relay.py
+upgrade024-release-manifest.json
+verification/backend-build.log
+verification/backend-tests.jsonl
+verification/final-focused-tests.log
+verification/frontend-build.log
+verification/frontend-tests.json
+verification/frontend-tests.log
+verification/go-vet.log
+verification/rebuild/backend-compatibility.jsonl
+verification/rebuild/backend-focused-final.jsonl
+verification/rebuild/deployed-source-sha256.json
+verification/rebuild/final-state.json
+verification/rebuild/frontend-protection-tests.json
+verification/rebuild/frontend-site-tests.json
+verification/rebuild/go-vet.log
+verification/rebuild/mode1-agent-final.log
+verification/rebuild/server-release-build.log
+verification/rebuild/server-smoke-final.json
+verification/rebuild/server-smoke-initial.json
+verification/rebuild/source-comparison.json
+verification/rebuild/upgrade-regression-reproduction.log
+verification/rebuild/upgrade-regression-reproduction_test.go.txt
+verification/rebuild/upstream-readiness.json
+verification/rebuild/ws-pool-repeated.log
+verification/rebuild/ws-v3-repeated.log
+澄川新站说明.md
+DIRECTORY_TREE.txt
+SOURCE_MANIFEST.json

+ 162 - 0
Dockerfile

@@ -0,0 +1,162 @@
+# syntax=docker/dockerfile:1.7
+# =============================================================================
+# Sub2API Multi-Stage Dockerfile
+# =============================================================================
+# Stage 1: Build frontend
+# Stage 2: Build Go backend with embedded frontend
+# Stage 3: Final minimal image
+# =============================================================================
+
+ARG NODE_IMAGE=node:24-alpine
+ARG GOLANG_IMAGE=golang:1.27.0-alpine
+ARG ALPINE_IMAGE=alpine:3.21
+ARG POSTGRES_IMAGE=postgres:18-alpine
+ARG GOPROXY=https://goproxy.cn,direct
+ARG GOSUMDB=sum.golang.google.cn
+ARG NPM_CONFIG_REGISTRY=
+
+# -----------------------------------------------------------------------------
+# Stage 1: Frontend Builder
+# -----------------------------------------------------------------------------
+# --platform=$BUILDPLATFORM: the frontend output is JS (arch-neutral), so build
+# it on the native host arch instead of under QEMU emulation for the target.
+FROM --platform=${BUILDPLATFORM} ${NODE_IMAGE} AS frontend-builder
+ARG NPM_CONFIG_REGISTRY
+
+WORKDIR /app/frontend
+
+# Install pnpm (pinned to v9 to match CI and keep builds reproducible)
+RUN corepack enable && corepack prepare pnpm@9 --activate
+
+# Install dependencies first (better caching)
+COPY frontend/package.json frontend/pnpm-lock.yaml ./
+RUN --mount=type=cache,id=sub2api-pnpm-store,target=/root/.local/share/pnpm/store \
+    if [ -n "${NPM_CONFIG_REGISTRY}" ]; then pnpm config set registry "${NPM_CONFIG_REGISTRY}"; fi && \
+    pnpm install --frozen-lockfile --prefer-offline
+
+# Copy frontend source and build.
+# LegalDocumentView.vue (admin-compliance gate) build-time imports
+# ../../../../docs/legal/*.md?raw, so docs/legal/ must sit beside frontend/
+# in the image (WORKDIR /app/frontend -> resolves to /app/docs/legal/*.md).
+# Copy only that subtree to keep the build dependency minimal.
+COPY frontend/ ./
+COPY docs/legal/ /app/docs/legal/
+ENV NODE_OPTIONS=--max-old-space-size=3072
+RUN pnpm run build
+
+# -----------------------------------------------------------------------------
+# Stage 2: Backend Builder
+# -----------------------------------------------------------------------------
+# --platform=$BUILDPLATFORM: run the Go toolchain on the native host arch and
+# cross-compile to the target arch below. The binary is CGO_ENABLED=0, so this
+# is a clean pure-Go cross-compile — no QEMU emulation of go mod download / go
+# build (emulated networking here was dropping module fetches with EOF).
+FROM --platform=${BUILDPLATFORM} ${GOLANG_IMAGE} AS backend-builder
+
+# Build arguments for version info (set by CI)
+ARG VERSION=
+ARG COMMIT=docker
+ARG DATE
+ARG GOPROXY
+ARG GOSUMDB
+# Populated by buildx from the --platform target (e.g. linux/amd64).
+ARG TARGETOS
+ARG TARGETARCH
+
+ENV GOPROXY=${GOPROXY}
+ENV GOSUMDB=${GOSUMDB}
+
+# Install build dependencies
+RUN apk add --no-cache git ca-certificates tzdata
+
+WORKDIR /app/backend
+
+# Copy go mod files first (better caching)
+COPY backend/go.mod backend/go.sum ./
+# Cache mount keeps the module cache across builds so a transient CDN blip on
+# retry resumes instead of re-fetching every zip from scratch.
+RUN --mount=type=cache,id=sub2api-gomod,target=/go/pkg/mod \
+    go mod download
+
+# Copy backend source first
+COPY backend/ ./
+
+# Copy frontend dist from previous stage (must be after backend copy to avoid being overwritten)
+COPY --from=frontend-builder /app/backend/internal/web/dist ./internal/web/dist
+
+# Build the binary (BuildType=release for CI builds, embed frontend)
+# Version precedence: build arg VERSION > exact git tag > cmd/server/VERSION
+RUN --mount=type=cache,id=sub2api-gomod,target=/go/pkg/mod \
+    --mount=type=cache,id=sub2api-gobuild,target=/root/.cache/go-build \
+    VERSION_VALUE="${VERSION}" && \
+    if [ -z "${VERSION_VALUE}" ]; then VERSION_VALUE="$(./scripts/resolve-version.sh)"; fi && \
+    DATE_VALUE="${DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}" && \
+    CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build \
+    -tags embed \
+    -ldflags="-s -w -X main.Version=${VERSION_VALUE} -X main.Commit=${COMMIT} -X main.Date=${DATE_VALUE} -X main.BuildType=release" \
+    -trimpath \
+    -o /app/sub2api \
+    ./cmd/server
+
+# -----------------------------------------------------------------------------
+# Stage 3: PostgreSQL Client (version-matched with docker-compose)
+# -----------------------------------------------------------------------------
+FROM ${POSTGRES_IMAGE} AS pg-client
+
+# -----------------------------------------------------------------------------
+# Stage 4: Final Runtime Image
+# -----------------------------------------------------------------------------
+FROM ${ALPINE_IMAGE}
+
+# Labels
+LABEL maintainer="Wei-Shaw <github.com/Wei-Shaw>"
+LABEL description="Sub2API - AI API Gateway Platform"
+LABEL org.opencontainers.image.source="https://github.com/Wei-Shaw/sub2api"
+
+# Install runtime dependencies
+RUN apk add --no-cache \
+    ca-certificates \
+    tzdata \
+    su-exec \
+    libpq \
+    zstd-libs \
+    lz4-libs \
+    krb5-libs \
+    libldap \
+    libedit \
+    && rm -rf /var/cache/apk/*
+
+# Copy pg_dump and psql from the same postgres image used in docker-compose
+# This ensures version consistency between backup tools and the database server
+COPY --from=pg-client /usr/local/bin/pg_dump /usr/local/bin/pg_dump
+COPY --from=pg-client /usr/local/bin/psql /usr/local/bin/psql
+COPY --from=pg-client /usr/local/lib/libpq.so.5* /usr/local/lib/
+
+# Create non-root user
+RUN addgroup -g 1000 sub2api && \
+    adduser -u 1000 -G sub2api -s /bin/sh -D sub2api
+
+# Set working directory
+WORKDIR /app
+
+# Copy binary/resources with ownership to avoid extra full-layer chown copy
+COPY --from=backend-builder --chown=sub2api:sub2api /app/sub2api /app/sub2api
+COPY --from=backend-builder --chown=sub2api:sub2api /app/backend/resources /app/resources
+
+# Create data directory
+RUN mkdir -p /app/data && chown sub2api:sub2api /app/data
+
+# Copy entrypoint script (fixes volume permissions then drops to sub2api)
+COPY deploy/docker-entrypoint.sh /app/docker-entrypoint.sh
+RUN chmod +x /app/docker-entrypoint.sh
+
+# Expose port (can be overridden by SERVER_PORT env var)
+EXPOSE 8080
+
+# Health check
+HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
+    CMD wget -q -T 5 -O /dev/null http://localhost:${SERVER_PORT:-8080}/health || exit 1
+
+# Run the application (entrypoint fixes /app/data ownership then execs as sub2api)
+ENTRYPOINT ["/app/docker-entrypoint.sh"]
+CMD ["/app/sub2api"]

+ 63 - 0
Dockerfile.goreleaser

@@ -0,0 +1,63 @@
+# =============================================================================
+# Sub2API Dockerfile for GoReleaser
+# =============================================================================
+# This Dockerfile is used by GoReleaser to build Docker images.
+# It only packages the pre-built binary, no compilation needed.
+# =============================================================================
+
+ARG ALPINE_IMAGE=alpine:3.21
+ARG POSTGRES_IMAGE=postgres:18-alpine
+
+FROM ${POSTGRES_IMAGE} AS pg-client
+
+FROM ${ALPINE_IMAGE}
+
+LABEL maintainer="Wei-Shaw <github.com/Wei-Shaw>"
+LABEL description="Sub2API - AI API Gateway Platform"
+LABEL org.opencontainers.image.source="https://github.com/Wei-Shaw/sub2api"
+
+# Install runtime dependencies
+RUN apk add --no-cache \
+    ca-certificates \
+    tzdata \
+    curl \
+    su-exec \
+    libpq \
+    zstd-libs \
+    lz4-libs \
+    krb5-libs \
+    libldap \
+    libedit \
+    && rm -rf /var/cache/apk/*
+
+# Copy pg_dump and psql from a version-matched PostgreSQL image so backup and
+# restore work in the runtime container without requiring Docker socket access.
+COPY --from=pg-client /usr/local/bin/pg_dump /usr/local/bin/pg_dump
+COPY --from=pg-client /usr/local/bin/psql /usr/local/bin/psql
+COPY --from=pg-client /usr/local/lib/libpq.so.5* /usr/local/lib/
+
+# Create non-root user
+RUN addgroup -g 1000 sub2api && \
+    adduser -u 1000 -G sub2api -s /bin/sh -D sub2api
+
+WORKDIR /app
+
+# Copy the pre-built binary and runtime fallback resources from GoReleaser
+COPY sub2api /app/sub2api
+COPY --chown=sub2api:sub2api backend/resources /app/resources
+
+# Create data directory
+RUN mkdir -p /app/data && chown -R sub2api:sub2api /app
+
+# Copy entrypoint script (fixes volume permissions then drops to sub2api)
+COPY deploy/docker-entrypoint.sh /app/docker-entrypoint.sh
+RUN chmod +x /app/docker-entrypoint.sh
+
+EXPOSE 8080
+
+HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
+    CMD curl -f http://localhost:${SERVER_PORT:-8080}/health || exit 1
+
+# Run the application (entrypoint fixes /app/data ownership then execs as sub2api)
+ENTRYPOINT ["/app/docker-entrypoint.sh"]
+CMD ["/app/sub2api"]

+ 187 - 0
LATEST_REVIEW_2026-09-15.md

@@ -0,0 +1,187 @@
+# 最新版本地审查:账号编辑布局与逻辑缺陷
+
+本次按用户要求只审查本地代码、复现问题并提出方案,没有连接服务器,没有调用真实上游,没有修改业务代码,也没有部署。
+
+核对本地发布源码包的 SHA-256 清单:3,940 个后端及前端源码文件完全一致。以下结论针对 `optional-controls-20260915` 发布源码,不代表重新检查了服务器运行状态。
+
+结论:账号编辑的问题同时涉及布局、表单状态和保存方式,不能只靠增加弹窗宽度解决。优先修复旧配置回写与保存竞争,再调整信息分区。
+
+## 已复现的缺陷
+
+### R01 · P1:重新打开同一账号,普通保存仍可能回写旧流量策略
+
+位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L4385)、同文件第 6126 行。
+
+触发:先独立保存“严格 RPM 开启”,关闭弹窗;该账号随后被更新为关闭;重新打开同一账号,传入的账号数据已是关闭状态。普通保存仍将旧的 `savedTrafficPolicy` 合入请求,重新写成开启。
+
+原因:缓存只在账号 ID 改变时清除,不随重新打开、较新的账号快照或实际配置更新而失效。它无条件覆盖普通表单的 extra。
+
+本地复现:传入更新后的关闭配置,最终提交 `strict_rpm_enabled=true`。
+
+方案:用账号版本和本次编辑会话管理草稿;成功独立保存后更新共同的数据源,不长期保留一个优先级高于新快照的覆盖对象。普通保存只提交真正修改的字段,可辅以版本冲突检测。
+
+### R02 · P1:独立保存与页脚保存可以同时执行
+
+位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L3100)、[AccountTrafficControls.vue](frontend/src/components/account/AccountTrafficControls.vue#L75)。
+
+触发:点击“保存流量控制”,请求尚未完成时再点页脚保存。父组件不知道子组件正在保存,会立即发出第二个更新请求,并允许关闭编辑。
+
+本地复现:故意挂起流量保存后,普通账号更新请求仍立即发出。根据返回顺序,可能显示部分成功、丢失保存反馈,或让旧 extra 在后写入时覆盖新策略。
+
+方案:共享提交状态并阻止并行修改;更完整的方案是统一草稿与保存事务。保留独立保存时,需要明确处理部分成功、等待中的关闭和顺序冲突。
+
+### R03 · P2:页脚保存会静默丢弃尚未保存的流量草稿
+
+位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L188)、同文件第 5346 行。
+
+触发:启用 RPM 或修改参数后,直接点击大弹窗页脚的保存,而没有点击区域内“保存流量控制”。账号保存成功并关闭,流量修改并未提交,也没有未保存提示。
+
+本地复现:修改严格 RPM 开关后普通保存,既没有提交该配置,也没有阻止关闭。
+
+方案:统一保存;或者将流量控制真正移出主表单,明确标注独立生效,关闭和主保存时提示尚未保存的草稿。
+
+### R04 · P2:切换保护策略会覆盖未保存的并发编辑
+
+位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L4135)。
+
+触发:将并发从 128 改成 256,未普通保存时应用另一策略。策略接口只知道原已保存值 128,返回后 `syncAntiDegradeState` 将输入框覆盖成 128。
+
+本地复现:界面输入 256,切换完成后回到 128。后端“保留已保存并发”仍然成立;这里是前端草稿丢失。
+
+方案:区分草稿字段与服务端已保存字段,仅更新策略管理的身份/TLS 字段。应用策略前也可要求先处理脏表单,但不能直接无提示回填整张表单。
+
+### R05 · P2:独立区域的无效输入会阻塞主表单;关闭开关也可能保存失败
+
+位置:[AccountTrafficControls.vue](frontend/src/components/account/AccountTrafficControls.vue#L7)、第 73 行;[account_traffic_policy.go](backend/internal/service/account_traffic_policy.go#L48)。
+
+两条触发路径:
+
+- RPM 填入 0,折叠该区域后保存账号名等普通设置。子区域仍属于主 `<form>`,原生校验判定整个表单无效。折叠只隐藏界面,不隔离表单校验。
+- 编辑出无效 RPM 后关闭该功能,输入框消失。前端只校验开启的功能,后端仍拒绝隐藏的无效值,因此“关闭并保存”失败。
+
+本地复现:折叠后的外层表单 `checkValidity()` 为 false;关闭状态携带 RPM=0 仍返回 `ACCOUNT_TRAFFIC_INVALID`。
+
+方案:独立保存区使用独立的表单归属;关闭功能时保留最近有效参数或明确恢复默认。后端格式校验可以保留,前端不要提交隐藏的非法草稿。前后端的错误提示应定位具体字段。
+
+### R06 · P2:旧状态刷新可以覆盖刚保存的新状态
+
+位置:[AccountTrafficControls.vue](frontend/src/components/account/AccountTrafficControls.vue#L66)。
+
+触发:先发出较慢的“刷新状态”,随后启用并保存流量控制。保存完成后旧 GET 最后返回。`refreshState()` 和 `save()` 不增加请求版本,旧响应仍有资格覆盖 `activePolicy`。
+
+本地复现:保存后界面可同时出现勾选开启、已保存,以及“当前未启用流量控制”的旧状态提示。这里是展示错误,不表示该旧 GET 改写了数据库。
+
+方案:刷新、保存统一版本号;保存成功使之前的 GET 失效,或中止旧请求。刷新按钮需有独立请求中状态,避免连续点击产生乱序请求。
+
+### R07 · P2:嵌套弹窗按 Esc 会关闭父级编辑
+
+位置:[BaseDialog.vue](frontend/src/components/common/BaseDialog.vue#L109)、第 148 行。
+
+触发:在账号编辑里打开策略预览或确认框,按一次 Esc。所有显示中的 BaseDialog 都监听 document 的键盘事件,没有最上层判断,父子都会发送关闭事件。
+
+本地复现:按一次 Esc 后,父级账号编辑的显示状态也变为 false,存在草稿丢失风险。
+
+方案:统一弹窗栈,只有栈顶响应 Esc;焦点返回所属父弹窗,关闭父弹窗前统一处理未保存草稿。
+
+### R08 · P2:关闭子弹窗会解除父弹窗的页面滚动锁
+
+位置:[BaseDialog.vue](frontend/src/components/common/BaseDialog.vue#L137)、第 155 行。
+
+每个实例关闭或卸载都直接删除 body 的 `modal-open`,没有统计仍打开的弹窗。账号编辑尚在显示,关闭策略预览后背景页面已可滚动。
+
+本地复现:父弹窗保留时关闭子弹窗,body 滚动锁被移除。
+
+方案:滚动锁交由弹窗栈统一管理,或者用引用计数;同时补充焦点约束与无障碍标识检查。
+
+### R09 · P2:仅观察模式在配置变化后仍可能拒绝请求
+
+位置:[account_traffic_cache.go](backend/internal/repository/account_traffic_cache.go#L34)、[account_traffic_service.go](backend/internal/service/account_traffic_service.go#L96)。
+
+触发:账号只有自适应“只显示建议”开启,在已有长连接运行时修改失败阈值。Redis 同步新签名后,旧连接携带的计划会得到配置已变化的拒绝;服务层无条件将 `Allowed=false` 转为限流错误。
+
+本地复现:仅将观察阈值更新,缓存拒绝旧计划;服务层确实返回 `ACCOUNT_TRAFFIC_LIMIT`。两个测试分别覆盖缓存决策和服务决策。
+
+方案:配置变化后读取最新策略;若新旧均为纯观察,停止或更新该次观测而不阻断业务。不能简单按旧策略无条件放行,否则可能绕过管理员刚开启的严格限制。
+
+### R10 · P2:部分 WebSocket 结束事件漏计上游 429
+
+位置:[account_traffic_ws.go](backend/internal/service/account_traffic_ws.go#L38),HTTP SSE 的相似判断在 [account_traffic_service.go](backend/internal/service/account_traffic_service.go#L270)。
+
+当前对 `response.done` 且 `response.status=failed` 直接计作 499,没有继续解析其中的错误原因。项目已有代码支持这些终止事件及嵌套错误字段。
+
+本地复现输入:`response.done` + `status=failed` + `response.error.code=rate_limit_exceeded`,记录结果为 499,预期为 429。自适应观测可能遗漏本应参与降速的上游错误。
+
+方案:统一终止事件分类器,先读取结构化失败原因,再区分成功、取消、不完整、429、5xx。HTTP、WebSocket 和账号测试复用同一套规则,并以支持的事件格式做对照测试。
+
+### R11 · P2:调低 RPM 后 Retry-After 可能小于实际等待时间
+
+位置:[account_traffic_cache.go](backend/internal/repository/account_traffic_cache.go#L53)。
+
+触发:在 0、10、20 秒各接受一次请求,第 30 秒将 RPM 从 3 调成 1。必须等到第 80 秒最后一条旧请求退出窗口,才有新的名额。
+
+本地复现:实际应等待 50 秒,返回 30 秒。算法只看最早的一条请求,没有按超出新额度的数量选取过期边界,调用方按提示重试仍会再次被拒绝。
+
+方案:按 `当前窗口请求数 - 新上限` 选择决定可准入时刻的记录,再与令牌桶等待时间取最大值。
+
+## 静态确认的覆盖缺口
+
+### R12 · P2:Grok 实时语音的 RPM 按连接计数,没有按模型轮次计数
+
+位置:[grok_audio.go](backend/internal/service/grok_audio.go#L192)、第 264 行。
+
+当前在打开实时连接时申请一次 permit,连接关闭才结束;客户端消息循环直接转发 `WriteJSON`,没有在后续生成轮次再次申请 RPM。长连接的多轮生成不能获得与普通 HTTP / OpenAI 透传轮次一致的严格 RPM 语义。
+
+这是调用链静态确认,未连接真实 Grok 复测。自动语音活动触发与客户端显式生成事件需要分别定义额度口径。
+
+方案:按协议轮次执行准入;无法对自动轮次可靠拦截时,应限制不支持的模式或明确展示“只限制会话建立频率”,不能让管理员误以为全部生成请求都已纳入硬限制。
+
+## 账号编辑布局问题
+
+### U01 · 桌面策略栏发生宽度争抢
+
+位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L51)、第 70、91 行;[BaseDialog.vue](frontend/src/components/common/BaseDialog.vue#L94)。
+
+外层到 lg 断点改为横排,右侧整个操作组 `flex-shrink-0`,其中策略按钮容器又允许占到 `max-w-3xl`。账号弹窗本身是 `max-w-4xl`,还要扣除左右内边距、开关、还原按钮和间距。左侧说明只有 `min-w-0`,容易被挤成很窄的一列,右侧也可能溢出。这能从布局约束解释“桌面编辑布局很不好”。
+
+应把标题与总开关放一行,当前策略摘要另占一行;策略选择放在下一行或独立选择器,不与长说明抢宽度。断点应依据弹窗可用空间,而不只是整个窗口宽度。
+
+### U02 · 常用策略和诊断策略混排,信息重复
+
+`visibleAntiDegradeStrategies` 没有按 `category/diagnostic_only` 折叠诊断策略。策略名称还在账号摘要、状态徽标、当前模式和按钮中重复出现。管理员难以快速区分“已生效”“可选项”“诊断用项”。
+
+应常显当前策略和默认标识,将诊断策略放入高级区域;把说明展开、预览差异与应用操作分清。
+
+### U03 · 同一任务的设置分散
+
+流量控制在编辑页顶部(约第 188 行),固定并发输入在大量平台字段之后(约第 1783 行)。同一组限制有两套数值和保存路径,子组件只收到账号 ID,读取的是已保存上限。
+
+例如同一弹窗将并发上限从 128 改为 256,自适应最低值仍按旧上限 128 校验,需要先保存并重新进入才能协调调整。这是当前数据流静态确认,独立于已经允许修改并发数的后端实现。
+
+应将固定上限、建议值、当前有效值、RPM 和自适应放在同一分区,明确哪些是编辑值、已保存值和运行值。
+
+### U04 · 文案仍残留旧恢复含义
+
+关闭保护的确认框仍写“还原……并发设置”(第 121 行),但当前明确保留管理员并发。完整性选项用 `mode1` 等内部名称,说明较长。应修正文案并使用与界面策略名一致的名称,避免让用户误判关闭的影响。
+
+本次布局结论基于模板/CSS 与组件交互复现,没有完成截图像素测量或多尺寸浏览器验收;不将截图中无法直接核实的细节当作事实。
+
+## 可选布局方案
+
+| 方案 | 组织方式 | 代价与适用范围 |
+| --- | --- | --- |
+| A:小幅整理 | 保留长弹窗;策略上下排列,诊断项折叠,并发与流量控制合并成一块 | 改动较小,仍有长页面和复杂平台字段 |
+| B:分区标签页,推荐 | 基本信息 / 连接与模型 / 保护与流量 / 计费与高级;顶部固定账号摘要,底部统一保存和未保存提示 | 需要整理共享草稿与提交逻辑,最能解决本轮保存和操作问题 |
+| C:完整账号设置页 | 弹窗只保留快速编辑,复杂设置进入独立页面,可带分区导航 | 扩展空间最大,路由和进入流程改动更多 |
+
+推荐先修 R01/R02,随后采用 B。账号固定并发继续由管理员自定义;推荐值仅用于填入,自动模式仍受管理员上限约束。方案 B 的“统一保存”应由后端一次提交或明确的可恢复提交过程支持,不能只把多个独立保存按钮隐藏起来。
+
+## 本地验证与边界
+
+- 既有相关前端测试:41 项通过、0 失败。并未重跑先前的全量测试;本次审查重点是缺失的边界场景。
+- 新增隔离复现:前端 8 条、后端 5 条断言失败,共 13 条;失败是当前缺陷证据,不是编译失败。其中 R09 有两条断言,不能把断言数当作问题数量。
+- R01—R11 具有组件/服务/缓存复现证据;R12 与 U01—U04 以调用链及模板/CSS 静态证据为主。
+- B 方案仍将答案正确性与格式分别显示;旧判定待复核、历史原始答复保留,未发现恢复成“答案正确仍按格式自动判降智”的旧逻辑。
+- 分组统计的三种金额口径及避免连接重复累计的 SQL 结构仍在;本轮未启动业务数据库复测大数据量性能。
+- 没有向服务器发送请求、登录后台、启用策略或调用上游。本轮仅新增审查报告、复现文件和证据。
+
+复现入口与结果见 [审查验证说明](verification/latest-review-20260915/README.md)。

+ 165 - 0
LICENSE

@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.

+ 71 - 0
LOCAL_ASSESSMENT_B_RESULTS_2026-09-14.md

@@ -0,0 +1,71 @@
+# B 方案与鹈鹕图片:本地实施记录
+
+日期:2026-09-14。根据本次确认实施 B 方案及关联 bug 修复。修改仅在本地源码;没有连接、部署或更新远程服务器,没有调用真实上游账号,也没有改写真实业务数据库。
+
+## 现在的评分和显示
+
+执行状态、最终答案、格式和能力证据分开保存、显示。新评估版本为 2,模型正常完成输出后使用 `completed`;不再因格式不同生成 `suspected_degradation`。
+
+| 情况 | 答案判断 | 格式判断 | 分数含义 |
+| --- | --- | --- | --- |
+| `ANSWER: 12` | 正确 | 符合 | 最终答案 100 |
+| `12`、Markdown、代码块、允许单位、`12.0`、全角数字 | 正确 | 按独立格式要求判断 | 最终答案 100 |
+| 唯一明确的最终答案是 `11`,标准答案是 `12` | 不一致 | 单独判断 | 最终答案 0 |
+| 多个冲突答案、未知单位、无法抽取 | 需复核 | 单独判断 | 不评分 |
+| 认证、网络、参数、模型错误或限流 | 不评估答案 | 不评估格式 | 不评分 |
+| 安全可显示的 SVG | 图像内容未自动评估 | 结构可显示或经过调整 | 不给图像能力分 |
+
+数值比较使用受控的精确数值归一化,支持配置单位;文本题保持规范化后的文本比较。不会靠“全文出现标准数字”就放行。完整推导尚未验证,所有单次结果都明确说明不足以判断模型能力下降。
+
+鹈鹕卡片、管理员详情和公开账号结果接入生成图片组件。图片来自该次答复的 SVG,支持适应容器和按画布尺寸展开;源码折叠保留。对旧记录没有已保存图片的情况,可通过带权限检查的图片接口从完整答复生成只读预览。
+
+SVG 静态样式可以转为安全属性,支持有界的本地图形引用展开;脚本、事件、外部资源、嵌入 HTML、动画等被过滤。循环引用、过大或损坏的 SVG、无基本可显示图形的结果不会冒充图片成功。内容是否真的是鹈鹕骑车仍需看图复核。
+
+## 关联修复
+
+- 保护账号切换随机代理:单账号、批量入口拒绝冲突请求,数据库事务内再次检查,避免随机模式被忽略而固定代理却被清空。
+- 账号编辑:受策略管理的身份/TLS 与随机代理控件锁定;并发字段展示并限制策略上限。保护开关改为描述实际设置作用,不承诺答题质量。
+- 默认保护策略继续为 `legacy`(初代兼容),已有明确选定的策略保留。
+- 慢轮询:管理员和公开结果页的静默请求都参与进行中去重,不再被每五秒的新轮询反复取消或挤掉。公开历史翻页也拒绝迟到的旧结果。设置和分组错误独立显示,手动刷新可恢复元数据。
+- 明确模型选择:不再把显式 `gpt-5.4`、`gpt-5.4-mini` 自动换成另一模型;请求模型与执行模型分别留档。已知不适合文本/SVG 的媒体模型被过滤或拒绝。
+- 提交与复用:快速测试幂等签名包含模型;相同配置明确提示复用,进行中任务的配置不同则报告冲突;仅新任务占用队列容量。
+- 流响应:无 delta 时可以提取 Responses 终态中的文本,已有 delta 时不重复追加。
+- 错误分类:HTTP 状态优先,`max_tokens` 等请求参数错误不再归入账号认证异常。
+- 并发准入:普通账号测试、智能测试与业务请求共享账号并发槽;智能测试容量不足时延后排队,不发送上游请求。
+- 操作入口:管理员可以取消未执行任务;取消或重评会使先前查询失效,防止迟到的查询覆盖操作结果。已开始执行的请求不提供虚假的“已取消”保证。
+- 历史与统计:当前任务与最近结束的结果分开;排队、运行和取消不抹掉上一份结果。答案待复核、执行异常分别统计,移除跨模型混算的“连续降智”暗示。摘要查询不再读取原始响应和完整输入配置。
+- 设置:增加答案类型、单位、独立格式要求及草稿试判;统一常用中文字符长度限制,保留未保存草稿。试判不调用模型、不创建测试任务。
+- 详情:展示判定依据、标准答案和抽取值;复制诊断包含记录 ID、评估和配置快照。公开接口仅投影允许公开的判定字段。
+- 用户清理:保留后端明确错误,显示预览有效期;过期后要求重新预览和确认,保留原有清理权限与确认流程。
+
+## 旧记录怎样处理
+
+旧判定保持原样,界面提示旧规则和待复核。管理员可在详情中选择“按 B 方案重新评估(不调用模型)”。它使用该次已保存的答复与原始题目配置,不使用今天改过的题目;保存原判定、重评时间和审计记录,不覆盖原始响应、题目或配置。
+
+缺少完整答复、已截断或未完成执行的记录不会强行重评。重评权限、重复操作、历史快照和公开字段隔离均有验证。本次未对服务器历史进行任何重评。
+
+## 验证证据
+
+| 验证 | 结果 |
+| --- | --- |
+| 前端全量 Vitest(最终版本) | 2,050 项通过,0 失败 |
+| 后端全量 `-tags=unit ./...` | 19,361 个测试/子测试通过,27 跳过 |
+| 最后改动相关后端回归 | 184 个测试/子测试通过;2 个数据库用例在普通单元运行中跳过 |
+| 隔离 PostgreSQL 与关联服务专项 | 94 个测试/子测试通过,0 失败、0 跳过;覆盖新迁移、队列/取消/重评、统计、权限、保护事务及清理 |
+| 最后图片与刷新改动相关前端回归 | 20 项通过;覆盖历史图片权限加载、内容类型、尺寸、过期请求和资源释放 |
+| 新操作与图片 HTTP 接口专项 | 5 项通过;覆盖管理员权限、历史 SVG 安全预览、无模型调用的草稿试判 |
+| Vue 类型检查、ESLint | 通过 |
+| 前端生产构建 | 通过;产物仅输出到本机临时目录 |
+| 浏览器组件验证 | 卡片、详情、原图的 SVG 均解码完成并有可见尺寸;原图按 600 × 420 画布展开;正确答案和格式差异同时展示 |
+
+测试计数包含父测试和子测试,专项与全量有交集,不能相加当作独立用例总数。浏览器使用 `frontend/verification/assessment` 的真实组件与明确标注的合成答复,并阻断 API 网络调用;它验证显示链路,不代表真实上游绘画质量。
+
+临时 PostgreSQL 仅绑定 127.0.0.1,数据库名为 `relay_assessment_test`,测试完成后已停止。本机图片验证服务也已停止。没有改动本地现有业务数据库。构建仍提示已有的大分包、Browserslist 数据及 Node 弃用警告,未为消除提示而升级依赖。
+
+## 后续范围与版本说明
+
+新增迁移 `backend/migrations/248_intelligent_assessment_v2.sql`。未来正式上线时需要让后端、前端与数据库迁移配套;外部客户端若依赖旧状态枚举,也应识别 `completed` 等新执行状态。本次未执行正式上线。
+
+尚未加入 C 方案的多题基线、长期趋势、完整推导判分或图像内容裁判;未知模型别名是否可用仍以真实上游结果为准。历史保留期自动删除、逐条发布/撤回结果、策略与代理联合预览属于可选扩展,本次未启用。
+
+Git 当前仍无已跟踪文件,本次没有创建提交或宣称完成可回滚的发布基线。源码、测试、迁移和本报告保存在当前本地工作目录。

+ 53 - 0
LOCAL_PROTECTION_STATUS_2026-09-14.md

@@ -0,0 +1,53 @@
+# 账号保护:本地修改状态
+
+> 本文件记录上一轮默认模式调整。后续修复与最终验证见 [本地修复结果](LOCAL_REPAIR_RESULTS_2026-09-14.md)。
+
+日期:2026-09-14。本次按用户要求将默认模式改为“初代兼容”,并修复与默认启停直接相关的配置还原和模式解析问题。只修改本地源码,未连接/部署服务器、未执行数据库迁移、未批量修改任何现有账号。
+
+前两轮是审查与复现,没有修复业务代码。以下列出的“已完成”才是本轮实际修改并验证的内容。
+
+## 已完成
+
+1. **默认初代兼容。** 新建、导入、复制以及关闭后重新开启保护,适用账号默认保存 `mode=legacy`。OpenAI OAuth/Setup Token 使用 session 指纹、nodejs24 TLS 模板;Anthropic OAuth/Setup Token 使用 nodejs24 TLS,保留原身份机制。并发保持原有更低限制,否则上限 16。随机代理、影子账号、API Key 及其他不适用类型继续使用通用并发保护。
+2. **前后端默认入口一致。** 后端不传 mode 的预览/应用、前端 API 默认参数及编辑弹窗默认选择都改为 legacy;按钮排在策略列表首位并标注“默认”。仍可显式选择 mode1 或其他现有策略。
+3. **保留存量选择。** 已开启的 mode1/mode2/其他策略不会因新默认值或普通读取而转换;重复调用开启接口保持当前开启策略。历史缺少 mode 的标记仍按原规则读取,避免升级解释漂移。
+4. **TLS 还原修复。** 新应用策略保存完整受管配置快照;还原会恢复原 TLS 开关和自定义模板 ID。历史稀疏快照中未记录的字段不再被无条件删除。已修复“原来 TLS=true,还原后仍为 false”及“还原 legacy 丢失自定义模板 ID”两条复现。
+5. **generic 识别修复。** 持久态 generic 不再被改写为 mode1;随机代理账号改为固定代理后,可以显式选择 mode1,正常路径不再误报“模式一配置无效”。
+6. **未知策略拒绝。** 未知的非空模式返回 `400 / UNKNOWN_PROTECTION_STRATEGY`,不会自动应用默认策略。只有省略模式才使用新默认值。
+
+说明:TLS 模板配置仍受全局 TLS 开关和插件传输控制。本次没有开启服务器的全局开关,也没有证明真实上游握手或模型效果。如果历史缺陷已经删除了某账号的原始模板信息,本次修复不能凭空恢复丢失的数据,需依据此前备份核对。
+
+## 仍未解决
+
+| 问题 | 当前状态与下一步 |
+| --- | --- |
+| 原生 WSS 身份不一致 | **仍可复现,包括初代兼容。** mode1 的头/体设备 ID 不同;legacy/mode2 未完整应用声明身份。需要统一 HTTP/WSS/测试出站的身份计划并覆盖首帧及后续帧。默认值修改不能替代此修复。 |
+| 策略切换非原子 | **仍可复现。** 先提交还原再提交新策略;第二步失败会留下保护关闭状态。需要单事务及版本冲突检查,缓存只发布最终状态。 |
+| 无标记旧快照覆盖新保护 | **仍可复现。** 最终合并函数依据传入对象跳过读取已启用策略。需要以锁定后的数据库状态为准。 |
+| mode2 与批量保存保护不统一 | **mode2 普通编辑仍可复现;SQL 批量遗漏为源码已确认。** 需要统一全部策略的受管字段集合。 |
+| 平台适用条件未强制执行 | **仍可复现。** 最小兼容等显式策略仍能应用到不支持的平台。此次未知模式已拒绝,但不等于完整资格校验已完成。 |
+| TLS 预览不显示全局覆盖原因 | **可观测性缺口仍在。** 账号预览可以显示 nodejs24,实际因全局关闭而走标准传输。需区分配置目标、有效计划和实际观测。 |
+| 智能测试缺少执行策略快照 | 仍只保存保护布尔值和题目配置,不能完整重现实际策略/TLS/代理/并发。初代身份在智能测试入口的接入范围也需要进一步统一验收。 |
+
+此外,项目总审查中的普通管理员系统操作权限、管理账号资源权限、定制站更新源、Live 零费用结算、缺失安全检查脚本及 CI 数据库覆盖问题,本轮均未修复。前次全量测试中与本任务无关的失败也不宣称已经解决。
+
+## 验证结果
+
+- 后端:保护/模式一/指纹/默认值/账号创建复制相关定向测试在 service、repository、admin handler 三个包以 `-tags=unit` 执行通过。
+- 后端:service/repository/admin handler 的 `go vet` 通过;`go build ./cmd/server` 通过,输出到本机临时目录。
+- 前端:账号相关 27 个文件、369 项测试通过,包含普通编辑、新建、批量修改、保护组件/API 和语言键检查。
+- 前端:`vue-tsc --noEmit`、改动文件 ESLint、Vite 生产构建通过,构建用时 18.27 秒,输出到本机临时目录。
+- 专项复现:原 14 个场景由 2 通过/12 失败变为 **6 通过/8 失败**。四条旧失败转为通过:标准策略 TLS 开关还原、legacy 自定义模板还原、generic 转 mode1、未知策略拒绝。剩余失败如上表,未通过修改断言掩盖。
+- 复验日志:[after-legacy-default.log](verification/account-protection-review/after-legacy-default.log)。模式一对照用例已改为显式选 mode1,防止默认改变后测试目标也跟着改变;原始修复前日志保留。
+- 本次没有真实 PostgreSQL 集成/竞态验收,也没有访问真实上游。不能将定向回归和编译通过表述为全项目全量通过。
+
+## 主要改动文件
+
+- `backend/internal/service/account_protection.go`:默认创建/启用策略改为 legacy,保留不适用类型的通用保护。
+- `backend/internal/service/account_anti_degrade.go`:默认选择常量、持久态与请求默认值分离、未知值拒绝、完整快照及兼容旧快照的还原。
+- `backend/internal/service/anti_degrade_strategies.go`:初代兼容默认描述与非诊断默认定位。
+- `frontend/src/utils/accountProtection.ts`:前端共享默认模式常量。
+- `frontend/src/api/admin/accounts.ts`、`frontend/src/components/account/EditAccountModal.vue`:API 默认值、预选、排序及默认标注。
+- 对应 Go/Vue 测试,以及当前文档和专项复验材料。
+
+现有 Git 仓库尚无提交,本次没有创建提交、发布包或服务器版本。后续如要部署,应先处理上述高优先级问题并完成独立数据库和真实调用验收。

+ 57 - 0
LOCAL_REPAIR_RESULTS_2026-09-14.md

@@ -0,0 +1,57 @@
+# 本地修复结果
+
+日期:2026-09-14。默认保护仍为“初代兼容”。本次只修改和验证本地源码,没有连接、部署或更新服务器,没有迁移生产数据库或改动生产账号。
+
+## 已修复的账号保护问题
+
+| 问题 | 本次结果 |
+| --- | --- |
+| HTTP 与原生 WSS 身份不一致 | 原生 WS 首帧、后续帧和握手头使用共享身份转换;安装 ID 的两种写法同步,session/thread 等别名按同一策略处理。本地真实 WSS 回显已验证 mode1、mode2、legacy。 |
+| 不同会话复用不兼容连接 | 已启用保护的 device 策略也将会话、线程和会话头纳入 WS 连接池兼容条件。最小兼容和 TLS 对照策略新增回归。 |
+| 切换策略失败后关闭保护 | 在内存中计算还原及目标策略,最后仅提交一次更新;写入时在数据库行锁下比较账号版本,冲突返回 409。配置更新与调度 outbox 同一事务,失败不发布中间关闭状态。 |
+| 无标记旧快照覆盖新保护 | 最终保存始终读取锁定后的当前保护字段,取消按旧对象是否含标记决定跳过检查的分支。 |
+| mode2、批量更新等保护不一致 | 所有已注册策略共享受管字段规则;单账号、JSONB 局部更新和批量更新均保留策略、身份、TLS 与并发限制。真实数据库逐一测试全部可应用策略。 |
+| 不支持的平台仍能应用专属策略 | 后端在修改前校验平台、类型、影子及代理条件,前端过滤不适用策略。非法模式继续返回明确错误。 |
+| 预览只显示模板,无法解释实际路径 | 预览新增配置目标、有效传输计划、全局开关/插件覆盖原因和有效并发。没有握手记录时明确标为未观测。兼容读取旧 mode1 v2 的 nodejs24 配置。 |
+| 智能测试无法还原执行条件 | 每次测试固定一份账号副本,执行快照保存策略/版本、身份、有效 TLS、模板摘要、代理引用、并发、实际模型、账号版本及输入摘要;写入既有 config_snapshot JSONB,不需要新表迁移。普通连通性测试与智能测试均应用已选保护身份。 |
+
+前一轮已修复的默认选择、TLS 完整还原、generic 识别和未知策略拒绝继续保留。存量已开启策略不会因默认值改变而自动换成初代兼容。
+
+## 其他已处理问题
+
+- 系统更新、回滚、重启增加超级管理员校验,并接入现有二次验证;普通管理员不会进入这些操作。
+- 管理员 Key 与订阅的变更在最终数据库写入阶段检查资源所有者和操作者角色,并与角色变更共用事务锁。已验证普通管理员不能修改管理员资源,以及等待期间被降级的操作者不能继续写入。
+- 定制发行版构造的更新服务停止访问原版更新源;在线更新和回滚接口返回明确的托管升级要求,避免替换定制程序。后续使用验证过的源码/镜像更新。
+- Live 新会话在 handler 与 service 两层被阻止,管理页面禁用新开启入口,能力接口返回不可用,防止继续产生未结算会话。
+- 恢复 pnpm 审计豁免检查脚本:无效 JSON/审计失败、缺少详情、过期豁免和未知高危项都无法通过。增加 9 项脚本测试。
+- CI 增加专用 PostgreSQL job,配置保护、角色、用户清理和智能测试 DSN;该 job 缺少环境时失败,不再悄悄跳过。前端 CI 改为执行全量测试。
+- 修复旧测试的认证 store 初始化、实际翻译断言、供应商数量及 API 契约字段。首页 URL 测试改为验证危险地址的实际处理和渲染。
+- TLS 构造器测试验证配置复制隔离;备份进程测试使用跨平台辅助进程,消除 Windows 对 sh 的依赖。
+- 补齐 MiniMax 在前端/域模型已声明、但后端遗漏的协议与默认地址分支;账号测试与正常转发使用相同模型别名归一化。Grok 资格测试保留“未证明付费额度就不放行”的行为,没有为通过测试放宽资格判断。
+
+## 验证结果
+
+| 检查 | 结果 |
+| --- | --- |
+| 前端全量测试 | 278 文件、2039 项通过,0 失败 |
+| 后端全量单元测试 | 19339 个测试/子测试通过,0 失败;26 个按测试条件跳过 |
+| 独立 PostgreSQL 专项 | 79 个测试/子测试通过,0 失败、0 跳过 |
+| 后续 WS/保护/权限定向回归 | 686 个测试/子测试通过,0 失败、0 跳过 |
+| 原专项复现场景 | 原 14 个叶子场景全部通过;包含父测试后报告为 17 个通过 |
+| 静态及构建检查 | 前端类型检查、全量 ESLint、生产构建通过;后端目标包 go vet、编译通过;Wire 接线重新生成通过 |
+| 审计脚本与工作流 | 9 项脚本测试通过;现有审计文件校验通过;工作流 YAML 解析通过 |
+
+后端 JSON 汇总位于 `verification/account-protection-review/final-*.json`,保留修改前及中间阶段的失败日志。后续新增连接池隔离检查在定向回归中执行;没有反复扩大与本次变更无关的测试。
+
+数据库验证使用本机新建、仅监听 127.0.0.1:56439 的 PostgreSQL 16.15 实例与合成数据,每个测试使用独立 schema。验证完成后实例已停止,未连接现有数据库。
+
+本地编译产物:后端 `C:/Users/30214/AppData/Local/Temp/sub2-protection-repairs.exe`;前端 `C:/Users/30214/AppData/Local/Temp/sub2-protection-repairs-frontend`。它们是验证产物,没有发布或替换服务器程序。
+
+## 仍需明确的限制
+
+1. **Live 目前暂停开放。** 未结算消耗入口已封堵,但完整的预占、扣费、异常中断结算和对账尚未实现。本次没有自行设定价格或对任何用户计费。
+2. **在线原地更新/回滚目前关闭。** 独立发行渠道没有在本次建立,采用源码/镜像部署流程。
+3. 尚未验证真实上游账号、真实支付回调、模型输出质量或服务器运行状态;不能由本地 WSS/数据库测试推断这些已经通过。
+4. 没有执行完整的 Docker 集成测试、race 或 golangci-lint;已完成的检查如上。CI 配置已修改,但本次没有触发远程 CI、提交或发布。现有审计文件校验不等同于一次最新依赖漏洞扫描。
+
+原审查记录保留用于追溯;当前修复状态以本文件为准。

+ 70 - 0
LOCAL_UI_BUGFIX_RESULTS_2026-09-15.md

@@ -0,0 +1,70 @@
+# 账号编辑与流量控制:本地修复结果
+
+已按本地审查报告修复问题,并采用分区编辑方案。此次没有连接服务器、没有部署、没有访问实际业务数据库或调用真实上游。服务器仍是之前发布的版本,本地修复尚未上线。
+
+## 账号编辑的新组织方式
+
+账号信息摘要位于顶部,下面分为“基本信息”“连接与模型”“保护与流量”“计费与高级”。切换分区只切换显示,不销毁草稿。诊断策略默认折叠,当前正在使用的诊断策略仍可见;策略按钮与说明不再挤在同一横排中。
+
+固定并发、完整性检查、RPM、自适应并发集中在“保护与流量”。固定并发仍由管理员自由设置,所有策略都不再以 4 / 8 / 16 锁定上限。建议参数只填入,管理员可以继续修改。
+
+RPM、自适应与并发随底部的账号保存一次提交,不再在账号编辑中使用第二个独立保存按钮。策略预览、应用、保护开关和还原保留独立立即生效的操作,界面明确说明其影响;应用策略会保留未保存的并发等编辑草稿。
+
+## 审查问题的处理
+
+| 问题 | 本地处理结果 |
+| --- | --- |
+| R01 旧流量配置回写 | 移除跨编辑会话保留的 `savedTrafficPolicy` 覆盖对象;重新打开按账号快照初始化草稿 |
+| R02 两套保存竞争 | 账号编辑统一提交;保存期间禁止重复提交和策略修改,输入控件禁用 |
+| R03 普通保存丢流量草稿 | 流量修改随账号提交;脏表单显示未保存提示,取消时先确认 |
+| R04 策略切换覆盖并发输入 | 只在并发没有被手动修改时回填服务端值;脏表单不会被同账号刷新整体覆盖 |
+| R05 隐藏输入阻塞 / 无法关闭 | 独立组件模式隔离表单归属;停用时规范化隐藏的非法数值;统一编辑时校验失败会切到对应分区 |
+| R06 旧刷新覆盖新状态 | 保存和刷新使用递增请求版本及取消机制;旧请求不能覆盖已保存的新状态,刷新有进行中标识 |
+| R07 Esc 连关父子弹窗 | 新增共享弹窗栈,仅最上层响应 Esc,补充焦点循环和唯一标题 ID |
+| R08 子弹窗解除背景滚动锁 | 滚动锁按仍打开的弹窗统一维护,不由单个子弹窗直接清除 |
+| R09 纯观察旧计划被拒绝 | Redis 明确区分当前策略是否执行硬限制;新旧都为观察时跳过旧观测,不阻断业务;新策略开启硬限制时仍拒绝旧计划 |
+| R10 结束事件漏计 429 | HTTP SSE 与 WebSocket 共用终止事件分类,读取嵌套失败原因;429、5xx、取消、不完整和成功分别处理 |
+| R11 调低 RPM 后等待偏短 | 按需要退出窗口的请求数量选取时间边界;示例已从错误的 30 秒修正为 50 秒 |
+| R12 实时语音计数口径缺口 | 采用明确拒绝不支持组合的方案,详见下一节;不把按连接统计冒充逐轮硬限制 |
+
+关闭保护的提示已修正为“还原身份与传输,保留管理员并发”。完整性选项使用与界面一致的策略名称说明默认行为。
+
+另外补修了两处相关问题:本地流量拒绝不再报告为账号调度健康失败;Grok 实时语音的握手超时上下文与会话生命周期分开,结束握手不会取消仍在运行的纯观察会话。普通账号保存也会同步流量控制的缓存版本。
+
+## Grok 实时语音的明确限制
+
+当前代码无法保证在 Grok 自动语音生成的每个轮次开始前执行原子准入。因此,账号开启严格 RPM 或自动并发时,实时语音入口会在拨号前返回明确的配置不兼容错误;不会将其归为账号故障。
+
+管理员可使用 HTTP 语音接口,或将该账号设为仅观察(关闭严格 RPM 和自动并发)。仅观察的实时语音仍按会话统计。对应提示已经放在 Grok 账号的流量设置中。这是功能限制的显式处理,尚未实现自动语音逐轮硬限制。
+
+## 验证结果
+
+| 验证 | 结果 |
+| --- | --- |
+| 前端全量 Vitest | 2,072 项通过,0 失败 |
+| 后端全量 `go test -tags=unit ./...` | 19,410 个测试及子测试通过,0 失败,29 跳过 |
+| Vue 类型检查 | 通过 |
+| 前端 ESLint | 通过 |
+| 前端生产构建 | 通过,输出到本机临时目录 |
+| 后端构建 | 通过,输出到本机临时目录 |
+
+新回归测试进入正常用例目录,覆盖统一提交、重复保存、重新打开、并发草稿、草稿关闭确认、状态乱序、表单归属、弹窗栈、观察配置切换、调低 RPM、结束事件分类和 Grok 不支持组合拒绝。对已经移除的独立保存操作,用“一次提交完成且没有第二次写入”的断言替代旧复现。
+
+原审查中失败的日志和 overlay 用例保留为历史证据。关闭功能时的处理选择了前端规范化,因此没有为通过历史的后端断言而放宽所有配置校验;观察模式也不会对任意拒绝无条件放行。应以本次常规回归结果判断修复状态。
+
+本轮未重复执行实际 PostgreSQL 专项,因为没有新增表结构或迁移;数据库依赖测试在全量 unit 中的跳过不能算作通过。前端构建仍有既有的包体积与浏览器兼容数据提醒,不影响构建成功。
+
+## 验收边界与下一步
+
+浏览器工具返回 `Codex auth token is unavailable`,无法取得本地浏览器会话。本次没有完成多分辨率目视验收,不能用组件测试替代截图验收。该问题来自浏览器工具认证,不是项目登录或服务器故障,也没有因此连接服务器排查。
+
+本地修改涉及共享弹窗组件,虽然全量前端测试通过,仍应在浏览器可用时检查账号编辑、嵌套确认、深色模式和窄屏布局。没有修改默认“初代兼容”、B 方案评分口径和鹈鹕图片展示逻辑。
+
+产物:
+
+- 前端:`C:/Users/30214/AppData/Local/Temp/sub2-ui-repairs-20260915`
+- 后端:`C:/Users/30214/AppData/Local/Temp/sub2-ui-repairs-20260915.exe`
+- 前端全量证据:`verification/latest-review-20260915/fix-frontend-full.json`
+- 原审查:`LATEST_REVIEW_2026-09-15.md`
+
+这些是本地修复和验证产物,未上传或替换服务器程序。

+ 62 - 0
MODE1_LOCAL_HANDOFF.md

@@ -0,0 +1,62 @@
+# OpenAI 账号模式一:本地实现与验证
+
+日期:2026-09-11。仅本地实现,没有连接或部署服务器。
+
+## 来源与工作目录
+
+- 冻结源码来源:`C:\Users\ROG\Desktop\sub2备份源码\server-deployed-20260911-173007\source.tar.gz`
+- 来源归档 SHA-256:`a10b287a742e2e417705ac27e6232c01dc66b8e5af05da156565ba415248a7ff`
+- 开发目录:`C:\Users\ROG\Documents\ChatGPT\sub2升级\work\mode1-local`
+- 创建开发副本时,3947 个源文件与原清单逐文件哈希一致。冻结归档和旧 `Desktop\sub2` 未修改。
+- 本目录属于外层未提交仓库,没有宣称 Git Commit、合并或线上版本更新。
+
+## 模式一的实际行为
+
+用户选择:整体账号身份独立;TLS 使用固定模板,不要求每账号 JA3/JA4 唯一。
+
+1. 显式应用模式一保存 `extra.anti_degrade`,其中 `mode=mode1`、`policy_version=2`、`max_concurrency` 为保护上限。已有旧方案必须先还原再显式应用,升级不自动更换存量账号身份。
+2. 复用系统管理的随机 UUID 种子 `codex_fingerprint_seed`。首次启用缺种子时,真实 AdminService 更新流程创建种子;普通编辑、关闭、重开保留合法种子。新版模式一使用该种子派生设备 ID,两个账号即使具有同一个旧 `openai_device_id` 也不会复用该旧设备 ID。复制账号沿用原有创建新种子的逻辑。API DTO 不展示种子。
+3. 指纹模式是 `device`,不使用 `session/full` 合并不同用户或对话。HTTP 与原生 WS 使用相同种子派生设备身份;会话头使用既有账号/API Key 隔离函数。客户端仍需提供可持续的会话标识;不能从任意无状态输入猜出真实对话归属。
+4. 模式一固定 `nodejs24` 兼容模板。模板实际通过 uTLS 发出;HTTP、账号测试、WS 池、后台预热和原生 WS 透传接入同一传输策略。不是从模板名称推断生效。
+5. 直连、HTTP CONNECT、HTTPS CONNECT、SOCKS5/SOCKS5h 均有 TLS 路径。HTTPS 代理外层证书和上游目标内层证书分别校验。明文、不支持的 ALPN、TLS 失败不静默降级。
+6. TLS HTTP 池强制按账号、代理和模板内容摘要隔离;HTTP Transport 自身按目标地址管理连接。WS 复用条件另含目标地址和会话身份。配置变更让新请求使用新池;旧闲置池按 TTL 回收,不强杀在途请求。
+7. `Mode1EffectiveConcurrency()` 在调度、WS 连接池和 handler 等待路径持续执行上限;已有更低并发优先。不限或高于16时,应用默认保护上限16。这是可配置工程上限,不是经上游证明的“安全数值”。沿用已有配额、排队、429/退避系统,本次没有新增上游限额预测算法。
+8. Responses HTTP 和 WS 比较转换前后关键语义字段:模型、input、instructions、reasoning、tools、tool_choice、text、previous_response_id、输出预算和 session。发现丢失或更改则报 `MODE1_LOSSY_TRANSFORM`。新版模式一禁用部分通过删除推理项继续重试的恢复分支。
+9. 普通账号保存保护模式一受管字段;部分更新和批量更新不得移除受管策略。调度缓存保留策略、TLS 和 proxy_mode,避免投影丢字段绕过检查。错误版本或损坏标记在传输层明确失败。
+10. 前端区分配置状态与实际握手事实。两个按钮始终可见,模式二明确为旧方案;应用/还原按服务端返回值同步,关闭重开和旧 props 不得伪造成功或覆盖新状态。预览不是线上握手证明。
+
+## 接口与主要文件
+
+- 原接口继续使用:`GET /api/v1/admin/accounts/:id/anti-degrade?mode=mode1`、`POST .../apply?mode=mode1`、`POST .../revert`。
+- `backend/internal/service/account_mode1_protection.go`:新策略、状态校验、管理字段保护、有效并发。
+- `backend/internal/service/account_anti_degrade.go`:预览、应用、还原接入。
+- `backend/internal/service/openai_mode1_integrity.go`:请求语义守卫。
+- `backend/internal/service/openai_plugin_transport.go`:真实 HTTP 和账号测试接入。
+- `backend/internal/service/openai_ws_client.go`、`openai_ws_pool.go`、`openai_ws_forwarder_ingress.go`、`openai_ws_forwarder_v2.go`、`openai_ws_v2_passthrough_adapter.go`:原生 WS 接入、会话隔离和保真校验。
+- `backend/internal/pkg/tlsfingerprint/transport.go`、`profile.go`、`dialer.go`:握手、代理、证书、配置摘要和克隆。
+- `backend/internal/repository/http_upstream.go`:真实 HTTP TLS 池。
+- `frontend/src/components/account/EditAccountModal.vue`:前端入口及状态同步。
+
+## 本地验证证据
+
+仅使用本机回环测试端点和既有依赖;未向真实 OpenAI 或原服务器发送测试请求。
+
+- 后端联合目标回归:209 个测试/子测试通过、0失败、0跳过;记录 `verification/backend-tests.jsonl`。涉及 service、repository、tlsfingerprint、admin handler 编译与目标测试。
+- 随后的种子 DTO 隐藏、重复旧设备身份、Redis 并发槽位验证:三个包目标测试通过;记录 `verification/final-focused-tests.log`。
+- 前端关联回归:87项通过(新模式组件/API、旧编辑/Grok、i18n),类型检查、定向 ESLint 通过。对应日志在 `verification` 中留档。
+- 本地 Vite 构建通过:`verification/frontend-build.log`。
+- 后端 `go build ./cmd/server` 和带 `embed` 标签构建通过;目标包 `go vet` 通过。
+- 真实本地 ClientHello 测试覆盖密码套件顺序、曲线、ALPN、可信/不可信证书、代理隧道、取消、不降级、池隔离、模板变更,以及 WSS 101 Upgrade 与多轮消息回显。
+- 种子生命周期测试经真实 AdminService + 测试仓库执行,并模拟数据库 JSON 序列化/重新读取。未安装新 PostgreSQL 实例或执行生产数据库迁移;不是全新服务器安装验收。
+- `-race` 尝试在本机 runtime/cgo 编译阶段失败,未获得竞态运行结果。
+
+## 明确边界
+
+- 这是固定兼容 TLS 模板,不能宣称已经匹配当前官方 Codex 客户端抓包,也不能宣称已证明防风控或模型质量改善。
+- 当前自定义 TLS Transport 使用 HTTP/1.1(含 WSS Upgrade)。显式 h2 返回不支持,不伪装成已协商 h2。
+- 旧别名自动替换,例如 `gpt-5.1 → gpt-5.4`,会被严格模式拒绝;不支持的旧请求需明确修正,而不是静默改模型。Messages/Chat Completions等跨协议转换未增加与 Responses 同等范围的逐字段守卫,不宣称全网关语义审计完成。
+- 已绑定不支持策略的外部插件会明确拒绝,不能无声绕过插件或TLS。
+- 随机代理与模式一固定出口冲突:要求先选固定代理或直连。没有新增专属分组代理链或上游凭据加密。
+- 稳定身份和连接保真不能证明上游隐藏策略;模型质量对照评测尚未进行。不得用模板存在、HTTP200、测试名称或配置开关代替实际效果证明。
+
+后续仅在用户授权后考虑部署;本次交付只在本地目录和归档。

+ 42 - 0
Makefile

@@ -0,0 +1,42 @@
+.PHONY: build build-backend build-frontend test test-backend test-frontend test-frontend-critical
+
+FRONTEND_CRITICAL_VITEST := \
+	src/i18n/__tests__/localeKeyCompleteness.spec.ts \
+	src/api/__tests__/client.spec.ts \
+	src/api/__tests__/tokenRefresh.spec.ts \
+	src/api/__tests__/channelMonitorV2.spec.ts \
+	src/views/auth/__tests__/LinuxDoCallbackView.spec.ts \
+	src/views/auth/__tests__/WechatCallbackView.spec.ts \
+	src/views/user/__tests__/PaymentView.spec.ts \
+	src/views/user/__tests__/PaymentResultView.spec.ts \
+	src/views/user/__tests__/ChannelStatusView.mode.spec.ts \
+	src/components/user/profile/__tests__/ProfileInfoCard.spec.ts \
+	src/views/admin/__tests__/SettingsView.spec.ts \
+	src/features/channel-monitor-v2/__tests__/designSystem.structure.spec.ts \
+	src/features/channel-monitor-v2/__tests__/monitorFormat.spec.ts \
+	src/features/channel-monitor-v2/__tests__/monitorZoom.spec.ts
+
+# 一键编译前后端
+build: build-backend build-frontend
+
+# 编译后端(复用 backend/Makefile)
+build-backend:
+	@$(MAKE) -C backend build
+
+# 编译前端(需要已安装依赖)
+build-frontend:
+	@pnpm --dir frontend run build
+
+# 运行测试(后端 + 前端)
+test: test-backend test-frontend
+
+test-backend:
+	@$(MAKE) -C backend test
+
+test-frontend:
+	@pnpm --dir frontend run lint:check
+	@pnpm --dir frontend run typecheck
+	@pnpm --dir frontend run test:run
+
+test-frontend-critical:
+	@pnpm --dir frontend exec vitest run $(FRONTEND_CRITICAL_VITEST)

+ 85 - 0
OPTIONAL_CONTROLS_RESULTS_2026-09-15.md

@@ -0,0 +1,85 @@
+# 可选流量策略与完整统计:本地交付记录
+
+本轮将原先列出的严格 RPM、自适应并发、独立完整性检查、完整分组统计实现为可选功能,并按管理员要求解除保护策略对并发数的预设锁定。最后补充“一键填入建议参数”,建议仍可编辑,不会自动开启或保存。
+
+全部修改仅在本地完成。未连接或部署远程服务器,未改写实际业务数据库,未调用真实上游账号。默认保护策略仍是“初代兼容”。
+
+本文件更新了 `SITE_TUNING_RESULTS_2026-09-14.md` 中“严格 RPM / 自动调节尚未实现”“分组 stats 返回 501”“mode1 完整性不可关闭”的历史状态;旧报告保留作审查记录。
+
+## 入口与默认行为
+
+| 功能 | 操作位置 | 默认与自定义 |
+| --- | --- | --- |
+| 严格 RPM、突发预算 | 账号编辑 → 可选流量控制 | 默认关闭;RPM、突发额度可编辑,独立保存 |
+| 自适应并发 | 同一区域 → 启用自适应并发 | 默认关闭;可选只显示建议或自动降速、缓慢恢复 |
+| 建议参数 | 同一区域 → 填入建议参数 | 只填数值;保留开关和运行方式,不自动保存;填入后可继续改 |
+| 账号并发上限 | 账号编辑原有并发输入 | 所有策略可编辑,不再锁为 4 / 8 / 16;切换、撤销策略保留当前正数配置 |
+| 请求完整性 | 账号编辑 → 请求完整性选项 | 关闭 / 仅观察 / 严格拦截独立选择;mode1 也可显式关闭 |
+| 完整分组统计 | 分组管理 → 勾选“完整统计” → 行内“统计” | 显示开关默认关闭,浏览器记住偏好;只在打开统计弹窗后查询 |
+
+流量控制关闭时不参与新增 Redis 准入。完整性“跟随策略默认”保留兼容行为:初代兼容先观察,mode1 默认严格;显式选择优先于策略默认。本轮没有批量改变已有账号的配置。
+
+## 建议参数与管理员控制
+
+建议起点:每分钟 60 次、突发 5 次、最低并发 1;60 秒内出现 3 次上游 429 / 5xx 后建议降速,稳定 60 秒且至少成功完成 3 次后逐步恢复。
+
+这些数值是起步配置,不是对真实上游额度的测量。管理员可修改 RPM、突发额度、账号并发上限、自适应最低并发、失败次数、失败统计窗口、恢复周期。自动模式只调整运行时有效并发,不改写管理员保存的并发上限;每次减半至最低值,恢复时每周期增加 1 个名额。最低值会随管理员后来调低的上限收敛,不会反过来限制管理员修改上限。
+
+RPM 目前采用管理员设定值,动态调节作用于并发;不会自行猜测并提高账号 RPM。输入保留正整数及合理技术范围校验,保护策略不再附加固定并发上限。
+
+## 实现与修复
+
+1. **原子准入。** Redis Lua 在一次事务内检查滚动 60 秒请求数、令牌桶突发预算及自动并发名额。相同账号跨客户端共享预算;本地拒绝不消耗新的请求令牌。使用 Redis 时间,减少节点时钟差异。
+2. **正常业务与测试共享。** 模型 HTTP 请求、应用层重试、普通及智能账号测试、OpenAI 插件调用、WebSocket 转发及透传的模型轮次接入控制。嵌套传输不重复计数。模型目录、配额等 GET 查询不计入模型请求预算;一次应用请求内部的 TCP/TLS 重试不单独视为模型请求。
+3. **流式生命周期。** HTTP 流读取完成、关闭或取消时释放名额;WebSocket 每个 response.create 单独计数,控制帧不计数,完成、失败和取消事件释放名额。短暂写入超时上下文不会被误当作整轮生命周期。
+4. **恢复证据。** 流中的 429 / 5xx 纳入失败观测;响应中断、取消、不完整和未知错误不当作恢复成功,后续 `[DONE]` 分隔符不能把失败改成成功。
+5. **故障行为。** 严格 RPM / 自动并发无法确认准入时返回可重试错误;仅建议模式在缓存不可用或续租失败时继续原请求,不因观测故障降低吞吐。租约失效时执行模式取消受控请求,避免失去并发计数后无限放行。
+6. **错误含义。** 本地拒绝按请求范围处理,不将其当作账号凭据故障;HTTP 保留等待提示,WebSocket 返回本地错误原因及建议等待信息。智能测试在尚未收到实际上游响应时可按限流等待重新排队。
+7. **修改一致性。** 账号单独编辑、批量编辑、策略切换和撤销均保留可编辑并发,并同步保护标记。旧策略任务结束不会覆盖新配置的自动调整状态。账号编辑弹窗保存普通设置时保留刚独立保存的流量策略。
+8. **完整性独立。** 包括透传首帧、后续帧在内的已接入路径读取账号选择;身份与 TLS 策略不再强制锁定完整性开关。
+
+## 分组金额口径
+
+| 展示字段 | 计算口径 | 使用边界 |
+| --- | --- | --- |
+| 实际计费用量 | 历史用量记录 `SUM(actual_cost)` | 包含余额扣减与订阅消耗,订阅消耗不是现金收入 |
+| 账面费用 | `SUM(total_cost)` | 使用记录中的标准定价 |
+| 上游账号成本(本地统计) | `SUM(COALESCE(account_stats_cost,total_cost) * COALESCE(account_rate_multiplier,1))` | 使用历史记录保存的成本与倍率,不是上游发票 |
+
+用量按历史 `usage_logs.group_id` 归属,不随密钥之后转组或删除而重归属。零计费记录纳入请求数,但不当作成功率。密钥数和绑定账号数表示当前状态,排除已删除对象;启用密钥数另排除禁用和过期。各聚合分开执行,避免连接多张表后重复累计费用。支持时间范围、全部历史、空数据和错误提示,接口不再返回占位零值。
+
+## 验证
+
+| 验证项 | 结果 |
+| --- | --- |
+| 后端全量 `go test -tags=unit ./...` | 19,403 个测试及子测试通过,0 失败,29 跳过 |
+| 最终修改后的流量 / 策略 / WebSocket / handler 专项 | 53 个测试及子测试通过,0 失败、0 跳过 |
+| 前端最终全量 Vitest | 2,061 项通过,0 失败、0 跳过 |
+| 本轮独立 PostgreSQL 专项(前序执行) | 116 个测试及子测试通过,0 失败、0 跳过;使用本机独立合成数据库 |
+| Vue 类型检查、ESLint | 通过 |
+| 后端与前端生产构建 | 通过,产物位于本机临时目录 |
+
+后端全量之后补充了 WebSocket 本地提示及 SSE 失败结束标记处理,最终专项覆盖这些改动;专项与全量数量不可相加当作独立用例数。原子准入测试覆盖两组缓存客户端同时发起 40 次请求、额度为 1 时仅准入 1 次。策略测试覆盖手动设置大于预设值、再次修改、切换与撤销后保留数值。前端测试覆盖建议只填入、管理员再次自定义、独立启停和保存。
+
+本轮最新页面的浏览器目视验收未完成:浏览器工具返回 `unsupported Codex auth method: apikey`,无法取得浏览器会话。组件测试和生产构建通过,但不能据此声称已完成最新页面截图验收。此前完成的 B 方案 v3 评分和鹈鹕 SVG 展示保留,未调用真实模型补测。
+
+构建仍有浏览器兼容数据较旧、部分前端包较大的非阻断提示;这些不影响本轮构建,后续可独立做依赖维护和页面拆包。
+
+## 剩余边界
+
+- 观测来自 Redis 当前缓存周期,非持久监控历史;状态长期无流量约 24 小时过期,缓存重置会重建计数与预算。请求次数、错误次数和平均响应耗时不是完整的排队等待时间分布。
+- 严格并发租约每 30 秒续租、120 秒失效。动态上限只约束后续准入;正常调整不会中断已经准入的任务。已建立的旧配置长连接遇到配置版本变化可能需要重连。
+- 未验证真实上游账号的限流概率、握手兼容性或模型能力。保护和流量策略不能保证上游不降质、不限流。
+- 独立流量保存已避免同一弹窗覆盖;多个旧编辑窗口并发提交普通账号完整配置仍沿用现有最后写入语义,不等同于所有账号配置都具备版本冲突检测。
+- 本轮复用账号 JSON 配置和 Redis,无新增数据库迁移;未来上线仍需核对之前的 `248_intelligent_assessment_v2.sql`,配套更新前后端。本轮未执行上线。
+
+## 备份与本地环境
+
+原调整前归档继续保留,没有重复覆盖:
+
+- `C:/Users/30214/Desktop/sub2本地/sub2新站-调整前-20260914-213426-complete.tar.gz`
+- `C:/Users/30214/Desktop/sub2备份/sub2新站-调整前-20260914-213426-complete.tar.gz`
+
+前序已验证两份完整归档一致,SHA-256 为 `4C7A328E9A265C668451B198D4EF40DFBE66D17C4F3C4B3FDE39BFC5DD20A71A`。归档不包含未读取的服务器数据库。
+
+本机测试 PostgreSQL 当前未运行;本轮临时组件服务结束后停止,测试产物保留在临时目录供复核。仓库仍没有已跟踪文件的 Git 基线,本轮未代为提交整个项目。

+ 109 - 0
PROJECT_REVIEW_2026-09-14.md

@@ -0,0 +1,109 @@
+# 项目审查与解决方案
+
+> 本文件保留修复前的审查证据。当前状态见 [本地修复结果](LOCAL_REPAIR_RESULTS_2026-09-14.md),未部署服务器。
+
+审查日期:2026-09-14。对象:当前 `sub2新站` 源码。结论:前端可构建,但权限边界、更新来源和 Live 计费存在需要优先处理的问题,当前全量测试也未通过,不宜据此认定达到正式发布条件。
+
+本次进行了源码检查、前端类型检查/ESLint/构建、前后端测试。没有修改业务代码、操作线上服务器或执行生产数据库迁移。安全问题依据本地调用链确认,没有向线上发送越权或破坏性请求。仓库尚无提交,全部源码为未跟踪文件,因此本报告不是 Git 差异审查,也无法仅凭 Git 判断问题首次引入的版本。
+
+## 1. P1:普通管理员可以调用系统更新、回滚和重启
+
+**证据**:`backend/internal/server/middleware/user_hierarchy.go:108` 的超级管理员限制仅覆盖管理密钥、备份、数据管理、设置及插件写入;`backend/internal/server/routes/admin.go:703` 注册的 `/system/update`、`/system/rollback`、`/system/restart` 未受该限制。处理器没有再检查超级管理员身份。重启最终调用 `backend/internal/pkg/sysutil/restart.go`,在 Linux 执行 `os.Exit(0)`。
+
+**触发与影响**:已经完成后台协议确认、拥有有效普通管理员 JWT 的用户可以提交上述请求。重启会中断服务;更新/回滚在可写二进制部署下可以替换程序,影响远超普通账号管理权限。系统操作锁和幂等机制不能替代授权。
+
+**解决方案**:对系统变更接口显式挂载超级管理员权限检查,并复用敏感操作二次验证。处理器或服务入口保留独立身份检查;前端同步隐藏无权限按钮。
+
+**验收**:普通管理员调用三个接口均返回 403,更新服务/重启函数调用次数为零;超级管理员在满足二次验证后可正常使用。测试使用替身,不实际更新或退出进程。
+
+## 2. P1:管理员账号保护可通过 API Key、订阅接口绕过
+
+**证据**:`user_hierarchy.go:37` 只对 `/api/v1/admin/users` 下的写请求检查目标用户角色。`backend/internal/server/routes/admin.go:223` 的 `PUT /admin/api-keys/:id` 和第 715 行的订阅管理接口均在该范围之外。`backend/internal/service/admin_group.go:1342` 直接读取任意 Key 并修改分组,未检查 Key 所属用户是否为管理员;`subscription_service.go` 的撤销、分配等操作也没有等价的操作者/目标角色校验。
+
+**触发与影响**:普通管理员取得另一管理员的 Key ID 后,提交 `{"group_id":0}` 即可进入解绑流程;同样可以通过订阅 ID 撤销管理账号订阅。与项目文档“普通管理员不能操作超级管理员”的边界冲突。这里的 API Key 是网关调用 Key,不应混同于全局管理密钥。
+
+**解决方案**:建立按资源所有者授权的公共入口:先把 Key ID、订阅 ID 解析为用户 ID,再校验操作者与目标角色。将认证操作者传入这些管理服务,并在最终写入事务内重新确认角色,避免只补路径黑名单。普通用户自助操作、兑换和系统分配使用各自明确的权限入口。
+
+**验收**:普通管理员可以管理普通用户资源,不能修改任何管理员的 Key/订阅;批量接口和并发角色变更同样受限,拒绝后数据库和缓存均无变更。
+
+## 3. P1:定制站的内置更新仍会下载原版程序
+
+**证据**:`backend/internal/service/update_service.go:33` 将更新仓库固定为 `Wei-Shaw/sub2api`,第 165 行的更新流程下载该仓库发行资产并替换当前可执行文件。第 656 行的版本解析对 `chengchuan-features-20260912`、`relay-v3-dev` 这类版本会得到零值版本。`docs/MANAGEMENT_FEATURES.md` 已明确记录旧程序与 `super_admin` 的回滚兼容要求,但内置更新不执行这些步骤。
+
+**触发与影响**:可写二进制部署中,点击更新可能将澄川定制程序替换为上游发行版,丢失定制功能,并产生角色和数据库兼容风险。当前 Docker 部署是否允许写入程序目录,本次未在服务器验证;只读目录可能使更新报错,并不能修正更新来源。
+
+**解决方案**:定制版本先在服务端禁用原版在线更新/下载回滚,返回明确的部署说明。后续建立独立发行渠道,使用可比较的版本号,校验产品标识、资产校验和和数据库兼容版本。容器部署通过固定镜像标签或摘要更新,回滚按定制站流程执行。
+
+**验收**:定制版本不会请求或应用原版更新资产;不兼容发行包在替换前被拒绝;回滚后登录、角色、保护策略和新增表仍兼容。
+
+## 4. P1(启用 Live 时):Live 会话绕过实际费用结算
+
+**证据**:`backend/internal/handler/openai_live.go:82` 只在建连前检查支付资格;`backend/internal/service/openai_live.go:827` 的结束流程直接写用量日志,没有调用常规结算管道,费用与 token 数均保持零值。现有 `openai_live_lifecycle_test.go:268` 甚至明确断言 `TotalCost`、`ActualCost` 为零。
+
+**触发与影响**:分组启用 `allow_live` 且用户通过初始资格检查后,可以持续消耗上游会话资源,本地余额和订阅消耗不随该会话结算。并发限制和会话时长上限不能替代累计计费。本次未确认线上是否启用了该功能;如果产品有意免费,仍需单独制定免费额度与成本上限。
+
+**解决方案**:在结算完成前对收费分组关闭 Live。确定计费口径后接入预占、增量用量/时长核算、余额不足终止及最终幂等结算,覆盖断线、重启和租约到期。明确免费的场景使用独立预算策略。
+
+**验收**:正常结束和异常结束均只结算一次;低余额无法无限续开;余额、订阅、Key 限额及上游成本记录一致。
+
+## 5. P2:智能测试记录不能还原具体保护策略
+
+**证据**:`backend/internal/service/intelligent_test_types.go:8` 的 `ConfigSnapshot` 仅保存提示词、模型、评估器、答案与超时;第 22 行的记录只用 `AntiDegradation bool` 描述保护状态。`backend/migrations/247_intelligent_tests.sql:29` 也没有策略版本、身份模式、TLS、代理、并发快照字段。`intelligent_test_runner.go:104` 执行时读取当前账号,随后再次读取账号进行实际调用。
+
+**触发与影响**:同一账号从 `legacy` 切换到 `mode1` 或其他策略后,历史记录都只显示保护开启,无法可靠区分测试时到底使用哪种策略。排队期间改配置还会改变实际执行条件。这削弱了项目策略矩阵要求的对照实验与故障复盘能力。
+
+**解决方案**:新增不可变的执行快照,保存策略 ID/版本、身份模式、TLS 模板摘要、代理引用、有效并发、实际模型和提示词摘要。快照必须来自真正发送请求所用的同一份账号副本;分别保存提交时和执行时状态,明确排队期间变更的处理规则。不得保存凭据、身份种子或带认证信息的代理 URL。
+
+**验收**:连续运行不同策略,历史详情能区分并重现执行条件;排队后改变策略不会造成记录与实际调用不一致;公开用户接口不泄露内部快照。
+
+## 6. P2:全量测试不通过,部分测试与重构后的代码脱节
+
+**本次实测**:
+
+- 前端:278 个测试文件,272 通过、6 失败;2036 项测试,1991 通过、45 失败。
+- 36 项 `SettingsView` 测试和 1 项 `GroupsView.codexManifest` 测试未初始化/模拟新增的认证 Pinia store。实际应用在 `frontend/src/main.ts` 已安装 Pinia,因此这些失败不能直接推断为生产页面崩溃。
+- 4 项首页安全测试仍用字符串搜索要求 `HomeView.vue` 直接调用 `sanitizeUrl`,而实际代码已迁移到 `useRelayBrand.ts`;该处仍在净化 URL,本次没有据此报告 XSS。
+- 其余前端失败包括 3 项订阅卡翻译断言、1 项渠道供应商数量断言。
+- 后端 `go test -tags=unit ./... -timeout=180s` 退出码为 1,失败包为 `internal/pkg/tlsfingerprint`、`internal/repository`、`internal/server`、`internal/service`。
+- TLS 两项测试仍要求指针相等,而构造器已主动克隆 Profile;API 契约测试遗漏新增安全策略字段。服务测试还存在 Grok 媒体资格、OpenAI 模型别名、MiniMax 协议/地址等预期与实现不一致,需按产品契约逐项确认。
+- 3 项备份测试因本机 Windows PATH 中没有 `sh` 失败,属于环境限制,不据此判定 Linux 备份失效。
+
+**解决方案**:修复测试的依赖注入与授权场景;安全测试改为检验危险 URL 的实际渲染行为,TLS 测试验证克隆值与外部修改隔离;按明确的接口/模型契约修复代码或断言,不批量接受快照。为依赖 shell 的测试明确 Linux 执行环境或替换为跨平台测试辅助进程。
+
+**验收**:全量前端测试和 Linux 后端单元测试通过,且保留危险 URL、跨角色操作和真实协议负例。`SettingsView.spec.ts` 已在根 Makefile 的 CI 必测清单中,当前失败会阻断前端 CI。
+
+## 7. P2:前端依赖安全检查引用了缺失脚本
+
+**证据**:`.github/workflows/security-scan.yml:56` 调用 `tools/check_pnpm_audit_exceptions.py`,当前源码中该文件不存在。上一步 `pnpm audit ... || true` 依赖该脚本决定最终结果。
+
+**影响**:依赖安装成功后,安全工作流会在脚本调用处失败,无法得到有效的漏洞豁免判定。这是检查失效/阻断,不是“已确认当前依赖可被利用”。
+
+**解决方案**:恢复并纳入版本管理的检查脚本,校验审计 JSON、豁免编号/包名/到期日;审计请求失败、JSON 无效或未豁免高危项均应让 CI 失败。评估已过期的豁免,而不是仅延长日期。
+
+**验收**:分别用无问题、允许且未过期、过期、未知高危、无效 JSON 的样本验证退出码;干净检出可执行该工作流。
+
+## 8. P2:新增数据库并发与清理测试没有接入 CI
+
+**证据**:`.github/workflows/backend-ci.yml:37` 仅执行 `make test-unit` 和 `make test-integration`。账号保护/角色事务测试使用单独的 `protectionintegration` build tag;用户清理、智能测试和账号保护还分别要求 `USER_CLEANUP_TEST_DSN`、`INTELLIGENT_TESTS_TEST_DSN`、`PROTECTION_TEST_DSN`。CI 没有配置这些变量,测试缺少 DSN 时调用 `t.Skip`。
+
+**影响**:即使普通单元测试与集成测试将来全绿,清理并发、互相降级、排队幂等和迁移保护仍可能没有执行。历史验证日志不能代替当前提交的验收。
+
+**解决方案**:增加独立 PostgreSQL 测试 job,创建专用测试数据库、设置上述 DSN,并显式运行 `-tags=protectionintegration`。在该 job 中缺少测试环境应报错;检查 JSON 测试报告,确保关键用例确实执行而非跳过。涉及删除/迁移的测试只对专用数据库执行。
+
+**验收**:CI 报告能看到三个功能的数据库用例、并发用例和迁移用例执行成功,关键测试零跳过。
+
+## 修复顺序
+
+1. 先收紧系统与资源所有者权限;禁用定制站的原版在线更新;收费环境关闭尚未结算的 Live。
+2. 修复现有失败测试、恢复安全检查脚本,并把数据库验证接入 CI,建立可以信任的发布门槛。
+3. 补齐智能测试执行快照,再按固定账号/模型/输入/代理开展保护策略对照。
+
+每项修复建议单独提交,安全变更先用本地替身和隔离数据库验收,再进入测试部署。当前 Git 没有提交,开始修复前应先建立不含秘密的源码基线,并确认部署版本与该基线的对应关系。
+
+## 验证范围与限制
+
+- 已通过:前端 `vue-tsc --noEmit`、全量 ESLint 错误检查、语言键测试、Vite 生产构建,以及 4 个后端包的账号保护/智能测试/权限定向回归。前端定向 426 项也通过,但已被更完整的全量结果补充。
+- Vite 构建输出在临时目录 `C:/Users/30214/AppData/Local/Temp/sub2-review-20260914-frontend`,用时 16.68 秒。账号管理页面脚本约 788 KB、gzip 167 KB,建议后续按功能拆分;没有将构建体积提示当作功能故障。
+- 没有新装或升级依赖,没有用本机 pnpm 11 重写锁文件;ESLint 通过直接调用现有安装版本完成,避免 PowerShell 未加引号的逗号参数影响检查。
+- 本次未执行真实 PostgreSQL 集成验收、Linux/race 检查、真实上游调用、支付回调、线上 HTTPS/端口检查和最新依赖漏洞扫描。因此不对这些部分给出“已安全/已通过”的结论。
+- 未对整个大型仓库逐行穷尽检查;上述问题是本轮有具体证据和可操作方案的发现。

+ 913 - 0
README.md

@@ -0,0 +1,913 @@
+<div align="center">
+
+<img src="assets/logo.svg" alt="Sub2API Logo" width="128" />
+
+# Sub2API
+
+[![Go](https://img.shields.io/badge/Go-1.27.0-00ADD8.svg)](https://golang.org/)
+[![Vue](https://img.shields.io/badge/Vue-3.4+-4FC08D.svg)](https://vuejs.org/)
+[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-15+-336791.svg)](https://www.postgresql.org/)
+[![Redis](https://img.shields.io/badge/Redis-7+-DC382D.svg)](https://redis.io/)
+[![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg)](https://www.docker.com/)
+
+<a href="https://trendshift.io/repositories/21823" target="_blank"><img src="https://trendshift.io/api/badge/repositories/21823" alt="Wei-Shaw%2Fsub2api | Trendshift" width="250" height="55"/></a>
+
+**AI API Gateway Platform for Subscription Quota Distribution**
+
+English | [中文](README_CN.md) | [日本語](README_JA.md)
+
+</div>
+
+## ⚠️ Important Notice
+
+Please read the following carefully before using this project:
+
+- **🚨 Terms of Service Risk**: Using this project may violate the terms of service of Anthropic and other upstream providers. Please review the relevant providers' user agreements before use; all risks arising from such use are borne solely by the user.
+- **⚖️ Compliant Use**: Use this project only in compliance with the laws and regulations of your country or region. Any unlawful use is strictly prohibited.
+- **📖 Disclaimer**: This project is provided for technical learning and research purposes only. The authors assume no liability for account bans, service interruptions, data loss, or any other direct or indirect damages resulting from the use of this project.
+- **🚫 No Commercial Authorization**: The developers of this project have never authorized any individual or organization to conduct any form of commercial operation based on this project. Any commercial activity conducted in the name of or based on this project is unrelated to this project and its developers, and all resulting disputes, losses, and legal liabilities shall be borne solely by the party conducting such activity.
+
+## ❤️ Sponsors
+
+> [Want to appear here?](mailto:support@sub2api.org)
+
+<table>
+
+<tr>
+<td width="180"><a href="https://cctk.ai/register?aff=SUB2API"><img src="assets/partners/logos/cctk.jpg" alt="CCTK.AI" width="150"></a></td>
+<td>Thanks to CCTK.AI for sponsoring this project! <a href="https://cctk.ai/register?aff=SUB2API">CCTK.AI</a> is an AI API gateway focused on stability and cost-effectiveness, offering fast relay services for Claude, OpenAI, Gemini, and other popular models. It works seamlessly with Claude Code, Codex, and other mainstream coding tools, delivering the same model capabilities at a fraction of the official cost. Register via <a href="https://cctk.ai/register?aff=SUB2API">this link</a> for faster, more stable, and more affordable AI API access.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.openmodel.ai?ref=sub2api"><img src="assets/partners/logos/openmodel.jpg" alt="openmodel" width="150"></a></td>
+<td>One API, every top model! <a href="https://www.openmodel.ai?ref=sub2api">OpenModel</a> is a production-grade, high-availability AI API gateway that makes your applications truly fast and stable: automatic failover, smart routing to the best-performing channel, and a production-grade SLA. An SLA that far surpasses any single provider — making stability your core competitive advantage. Works directly with Claude Code, Codex, and Gemini CLI. Register via this link to get started.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://etok.ai"><img src="assets/partners/logos/etok.png" alt="ETok" width="150"></a></td>
+<td>Thanks to ETok.ai for sponsoring this project! ETok.ai is dedicated to building a one-stop AI programming tool service platform. We offer professional Claude Code packages and technical community services, with support for Google Gemini and OpenAI Codex. Through carefully designed plans and a professional tech community, we provide developers with reliable service guarantees and continuous technical support, making AI-assisted programming a true productivity tool. Click <a href="https://etok.ai">here</a> to register!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://apikey.fun/register?aff=SUB2API"><img src="assets/partners/logos/apikey-fun.png" alt="APIKEY.FUN" width="150"></a></td>
+<td>Thanks to APIKEY.FUN for sponsoring this project! <a href="https://apikey.fun/register?aff=SUB2API">APIKEY.FUN</a> is one of the core contributors to the sub2api open-source project, dedicated to providing open, stable, and cost-effective AI API access. The platform supports API relay services for Claude, OpenAI, Gemini, and other popular models, with pricing starting from as low as 7% of the original rate. Register via the exclusive link: <a href="https://apikey.fun/register?aff=SUB2API">APIKEY</a> to enjoy up to 5% off on all recharges.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://aigocode.com/invite/SUB2API"><img src="assets/partners/logos/aigocode.png" alt="AIGoCode" width="150"></a></td>
+<td>Thanks to AIGoCode for sponsoring this project! AIGoCode is an all-in-one platform that integrates Claude Code, Codex, and the latest Gemini models, providing you with stable, efficient, and highly cost-effective AI coding services. The platform offers flexible subscription plans, zero risk of account suspension, direct access with no VPN required, and lightning-fast responses. AIGoCode has prepared a special benefit for sub2api users: if you register via <a href="https://aigocode.com/invite/SUB2API">this link</a>, you'll receive an extra 10% bonus credit on your first top-up!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://codex-everywhere.com"><img src="assets/partners/logos/codex-everywhere.jpg" alt="CodexEverywhere" width="150"></a></td>
+<td>Real GPT-5.6 series at 3% of OpenAI pricing — <a href="https://codex-everywhere.com">CodexEverywhere</a> is democratizing access to frontier models for developers worldwide. We believe in transparency and honesty, with model quality verified by active community oversight for months. USD and crypto friendly. Start with a free $20 trial at <a href="https://codex-everywhere.com">codex-everywhere.com</a>.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://shop.bmoplus.com/?utm_source=github"><img src="assets/partners/logos/bmoplus.jpg" alt="bmoplus" width="150"></a></td>
+<td>Huge thanks to BmoPlus for sponsoring this project! BmoPlus is a highly reliable AI account provider built strictly for heavy AI users and developers. They offer rock-solid, ready-to-use accounts and official top-up services for ChatGPT Plus / ChatGPT Pro (Full Warranty) / Claude Pro / Super Grok / Gemini Pro. By registering and ordering through <a href="https://shop.bmoplus.com/?utm_source=github">BmoPlus - Premium AI Accounts & Top-ups</a>, users can unlock the mind-blowing rate of 10% of the official GPT subscription price (90% OFF)</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://bestproxy.com/?keyword=a2e8iuol"><img src="assets/partners/logos/bestproxy.png" alt="bestproxy" width="150"></a></td>
+<td>Thanks to Bestproxy for sponsoring this project! <a href="https://bestproxy.com/?keyword=a2e8iuol">Bestproxy</a> provides high-purity residential IPs with dedicated one-IP-per-account support. By combining real home networks with fingerprint isolation, it enables link environment isolation and reduces the probability of association-based risk control.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://pateway.ai/?ch=1tsfr51"><img src="assets/partners/logos/pateway.png" alt="pateway" width="150"></a></td>
+<td>Thanks to PatewayAI for sponsoring this project! <a href="https://pateway.ai/?ch=1tsfr51">PatewayAI</a> is a premium API relay built for heavy AI developers, offering the full Claude and Codex series sourced 100% from official providers, with transparent token-level billing. Enterprise plans include high concurrency, dedicated management, contracts, and invoicing. Register now to get $3 in trial credits, top-ups from 60% off, and referral bonuses up to $150.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://api.pptoken.cc/register?promo=SUB2API"><img src="assets/partners/logos/pptoken.png" alt="pptoken" width="150"></a></td>
+<td>Thanks to PPToken.cc for sponsoring this project! <a href="https://api.pptoken.cc/register?promo=SUB2API">PPToken.cc</a> specializes in GPT model API relay services, supporting Codex, Claude Code, OpenAI-compatible clients, and Gemini CLI integration. Top-ups are 1:1 (¥1 = $1 credit); GPT models start at 0.16x rate multiplier, with overall cost at roughly 2.2% of official pricing and first-token latency around 1 second — ideal for developers seeking low-cost, high-speed access to GPT model capabilities. Technical support: 24/7 real human responses (no bots), @tech in the group chat and get a reply within 10 minutes. Sponsor benefit: the first 200 users who register via the <a href="https://api.pptoken.cc/register?promo=SUB2API">exclusive registration link</a> and enter promo code `SUB2API` can claim free Codex / Claude Code trial credits — no minimum spend, no card required.
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://veilx.io/#/hello/SJRBRVDV"><img src="assets/partners/logos/veilx.png" alt="veilx" width="150"></a></td>
+<td>Thanks to Veilx for sponsoring this project! <a href="https://veilx.io/#/hello/SJRBRVDV">Veilx</a> CDN is purpose-built for large-scale AI API traffic, deeply optimized for relay services and call chains across OpenAI, Claude, Gemini, and scenarios like chat, image generation, embeddings, and streaming — delivering lower latency and higher stability under heavy concurrency. It also offers China three-network optimized return lines, making it ideal for global AI relay platforms, overseas AI SaaS, and cross-border high-concurrency deployments.
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://roxybrowser.com/invite/bgGKG7"><img src="assets/partners/logos/RoxyBrowser.png" alt="veilx" width="150"></a></td>
+<td>Thanks to RoxyBrowser for sponsoring this project! <a href="https://roxybrowser.com/invite/bgGKG7">RoxyBrowser</a> RoxyBrowser is the perfect partner for Sub2API: it features a built-in native Roxy AI Agent and high-quality native residential IPs, supports batch automation via simple commands, and significantly boosts security and efficiency for multi-account management! Click <a href="https://roxybrowser.com/invite/bgGKG7">this link</a> to sign up and receive a free residential IP package plus a 10% lifetime discount.
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.proxy4free.com/?keyword=4yjqecpc"><img src="assets/partners/logos/proxy4free.png" alt="proxy4free" width="150"></a></td>
+<td>Thanks to Proxy4Free for sponsoring this project! Proxy4Free is a data proxy service provider for developers and AI applications, offering residential proxies, static residential proxies, ISP proxies, and datacenter proxies for scenarios such as Web Scraping, Browser Automation, and AI Agents. With global IP resources, stable connections, and flexible switching, it helps developers improve data collection success rates and reduce the risk of IP bans. Register via <a href="https://www.proxy4free.com/?keyword=4yjqecpc">this link</a> to get started and easily build more stable and efficient automation workflows.
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="http://www.fastaitoken.com/register"><img src="assets/partners/logos/fastaitoken.jpg" alt="fastaitoken" width="150"></a></td>
+<td>🎉 Thanks to FastAIToken for sponsoring this project! <a href="http://www.fastaitoken.com/register">FastAIToken</a> is an AI API aggregation platform for developers, supporting mainstream large models such as OpenAI, Claude, and Gemini. Top-up at 1:1 — 1 CNY = 1 USD of API credit — letting developers use the world's leading large model services at lower cost and with greater convenience.<br>
+
+🚀 The platform offers a variety of channels to choose from: an ultra-low-price 0.02x OpenAI promotional group (limited time), groups as low as 0.25x OpenAI, 0.7x Claude with 95% fixed cache, and a 1.2x Claude Max channel. It also provides a public status page showing real-time availability, latency, and operating status of each group for transparent and reliable service, plus 7×24 human technical support (not bots) with fast responses to developer needs.
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="http://aimzoon.com"><img src="assets/partners/logos/aimzoon.jpg" alt="aimzoon" width="150"></a></td>
+<td>Thanks to Aimzoon for sponsoring this project! <a href="http://aimzoon.com">Aimzoon</a> provides stable, cost-effective AI API access services, enabling developers to quickly connect popular AI services to coding tools such as Codex, Claude Code, and Gemini CLI. No complex configuration — faster onboarding, more stable calls, and lower costs. Ongoing promotions including discounted Codex rates and special pricing, with free trial credits upon registration, bringing AI coding into your daily workflow. <a href="http://aimzoon.com">Click here</a> to register and try it out!
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://nagora.ai/"><img src="assets/partners/logos/nagora.png" alt="Nagora" width="150"></a></td>
+<td><a href="https://nagora.ai/">Nagora</a> is a multi-model AI API gateway built for developers and teams. With a single account and API key, you can access more than 26 leading text and image models through one unified interface. It is compatible with OpenAI, Anthropic, and Gemini protocols and integrates seamlessly with development tools such as Claude Code, Codex, and Gemini CLI. The platform provides intelligent routing, automatic failover, transparent pricing, and consolidated billing, along with budget management, rate limiting, and concurrency controls. This makes AI usage more reliable and manageable across individual development, team collaboration, and production environments. No changes to your existing application are required. Simply replace the Base URL and API key to complete the integration in as little as one minute.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://s.qiniu.com/u6rQrq"><img src="assets/partners/logos/qiniu.jpg" alt="Qiniu AI" width="150"></a></td>
+<td>Thanks to Qiniu AI for sponsoring this project! Qiniu AI is the enterprise-grade large-model MaaS platform under Qiniu Cloud (02567.HK), offering one-stop access to 150+ mainstream models worldwide, compatible with the protocols of major global model providers, and covering full-modality capabilities including text, image, audio, video, and file processing, serving over 1.69 million enterprises and developers. Qiniu AI offers an exclusive benefit for Sub2API users: register via <a href="https://s.qiniu.com/u6rQrq">this link</a> — enterprise users get 12 million tokens free, and developers get 3 million tokens free.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://api.fenno.ai/s/dC4k"><img src="assets/partners/logos/fennoai.jpg" alt="FennoAI" width="150"></a></td>
+<td>Thanks to FennoAI for sponsoring this project! FennoAI is a high-stability, high-performance API relay provider for enterprise R&D teams and developers, compatible with the OpenAI and Anthropic protocols and seamlessly integrating with mainstream AI coding tools such as Codex, Claude Code, and OpenCode. The platform delivers enterprise-grade stability, supporting call volumes of 100 billion tokens per day, and supports business-to-business settlement and invoicing for both domestic and overseas entities to meet enterprise R&D and procurement needs. As an exclusive benefit for Sub2API users, purchase a subscription via the <a href="https://api.fenno.ai/s/dC4k">exclusive link</a> to get $50 worth of Coding Plan credit for only $1.99. Referral rewards are also available: invite friends to purchase and earn up to 20% commission — the more you invite, the more you earn.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://lanox.ai/?c=6"><img src="assets/partners/logos/lanox.jpg" alt="LanoX AI" width="150"></a></td>
+<td>Thank you to LanoX AI for sponsoring this project! <a href="https://lanox.ai/?c=6">LanoX AI</a> provides stable, cost-effective global model access services for developers, teams, and enterprises. 🎁 New User Benefits — Claim millions of free tokens, plus 500+ free models for easier low-cost testing, validation, and deployment 🧠 Global Leading Models — GPT · Claude · Gemini · Qwen · Grok... 🎬 Multimodal Creation — Seedance 2.0 · GPT Image · Gemini Nano Banana 🛡️ Enterprise-Grade Reliability — High availability 💎 native capability output 💎 no intelligence degradation 💎 no model mixing 💎 transparent usage and billing 💎 💰 Lower API Costs — Top-tier models from as low as 10% of official pricing, with clear documentation, simple integration, invoicing support, and enterprise-scale batch usage 🏢 Enterprise Choice — Ideal for AI products, Agents, content platforms, and R&D teams with high-volume model usage</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.rapidproxy.io/?ref=sub2api"><img src="assets/partners/logos/rapidproxy.jpg" alt="RapidProxy" width="150"></a></td>
+<td><a href="https://www.rapidproxy.io/?ref=sub2api">RapidProxy</a> is a data collection proxy solution built for developers, providing stable and reliable residential proxy services. With 90M+ global residential IPs and 200+ country coverage, intelligent rotation, and precise geo-targeting, it helps projects such as web scraping, AI data training, SEO monitoring, and e-commerce data analysis break through access restrictions and improve data collection efficiency. It supports mainstream automation frameworks such as Playwright, Selenium, and Puppeteer, with prices as low as $0.65/GB — <a href="https://www.rapidproxy.io/?ref=sub2api">start your free test now</a>.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://hao.ai"><img src="assets/partners/logos/haoai.png" alt="hao.ai" width="150"></a></td>
+<td><a href="https://hao.ai">hao.ai</a> is a high-speed, stable unified large-model API gateway for developers and teams. With a single API Key and a unified interface, you can access mainstream models such as GPT, Claude, and xAI Grok, with compatibility for common protocols and SDKs including OpenAI and Anthropic. The platform provides model routing, failover, team management, and complete request logs, with model prices as low as 15% of official reference pricing, helping users build AI applications more simply, more reliably, and at lower cost.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.swiftproxy.net/?ref=sub2api"><img src="assets/partners/logos/swiftprox.png" alt="Swiftproxy" width="150"></a></td>
+<td>Swiftproxy is a high-performance proxy solution built for developers, providing stable and reliable residential and static residential proxy services. With 90M+ clean residential IPs, global coverage, flexible rotation, and precise geo-targeting, it helps projects such as web scraping, AI automation, browser automation, SEO monitoring, and multi-account management overcome access restrictions and improve workflow efficiency. It supports HTTP(S) and SOCKS5 protocols, integrates with popular automation tools like Playwright, Selenium, and Puppeteer, with dynamic proxy traffic that never expires until used and free testing available — <a href="https://www.swiftproxy.net/?ref=sub2api">start your free test now</a>!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.duckip.cn/?keyword=cu7oog6y"><img src="assets/partners/logos/duckip.png" alt="DuckIP" width="150"></a></td>
+<td><a href="https://www.duckip.cn/?keyword=cu7oog6y">DuckIP</a> - 90M+ global residential network resources across 195+ countries and regions, with rotation and sticky sessions for public data collection, RAG updates, model evaluation, and multi-region data workloads. 🟢Residential Proxy - 20% Off; 🟢Static Residential Proxy - Starting at ¥50.00/IP; 🟢Unlimited Residential Proxy - Starting at ¥19.8/Hour. ✅Get 500M Free Trial.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://go.apimart.ai/gh-sub2api"><img src="assets/partners/logos/apimart.jpg" alt="APIMart" width="150"></a></td>
+<td>Thanks to APIMart for sponsoring this project! <a href="https://go.apimart.ai/gh-sub2api">APIMart</a> is a low-cost API platform for AI image and video generation — GPT-Image-2 from $0.006 per image, with 160+ images per dollar. One async API covers both image and video: submit a task, get an ID, and retrieve results via polling or callback. Batch tens of thousands of images without timeouts, and switch models without changing code. Pay as you go with no monthly fee — <a href="https://go.apimart.ai/gh-sub2api">sign up here</a> to get started.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.axisnow.io/"><img src="assets/partners/logos/axisnow.jpg" alt="AxisNow" width="150"></a></td>
+<td>Thanks to AxisNow for sponsoring this project! <a href="https://www.axisnow.io/">AxisNow</a> protects and accelerates websites and APIs, delivering an optimal access experience across mainland China and globally, while extending acceleration and security capabilities to native/mobile apps through client SDKs — <strong>self-hosted private-deployment CDN</strong> | <strong>subscription-based DDoS-protected CDN</strong> | <strong>autonomous, flexibly composable CDN network</strong>.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://pp.dog/register?aff=SUB2API"><img src="assets/partners/logos/ppdog.png" alt="PP.dog" width="150"></a></td>
+<td><a href="https://pp.dog/register?aff=SUB2API">PP.dog</a> is a source-level API gateway with its own massive account pool, purpose-built as an upstream relay for downstream transit stations and high-frequency developers — saving you the hassle of building and maintaining your own account pool. ✅ Direct from source: self-operated account pool with no middleman markup; 🧧 Cost crusher: combined rate multiplier as low as 0.03x, just 0.35% of official pricing; 🚀 Blazing fast: first-token latency < 1s, on par with the official native API. <a href="https://www.pp.dog/register?aff=SUB2API">Get started with PP.dog now</a></td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://colaproxy.com/?utm_source=sub2api&utm_medium=sub2api&ref=sub2api"><img src="assets/partners/logos/cola-proxy.jpg" alt="ColaProxy" width="150"></a></td>
+<td>ColaProxy provides high-quality residential proxies built for web scraping, automation, and multi-account management. Get a free trial with non-expiring traffic, pricing starting as low as $0.3/GB, unlimited concurrent connections, and intelligent IP rotation for a smoother, more stable proxy experience. Use discount code COLA10 to get 10% off and start scaling your projects with reliable residential proxies today. <a href="https://colaproxy.com/?utm_source=sub2api&utm_medium=sub2api&ref=sub2api">Get started with ColaProxy</a></td>
+</tr>
+
+</table>
+
+## Overview
+
+Sub2API is an AI API gateway platform designed to distribute and manage API quotas from AI product subscriptions. Users can access upstream AI services through platform-generated API Keys, while the platform handles authentication, billing, load balancing, and request forwarding.
+
+## Features
+
+- **Multi-Account Management** - Support multiple upstream account types (OAuth, API Key)
+- **API Key Distribution** - Generate and manage API Keys for users
+- **Precise Billing** - Token-level usage tracking and cost calculation
+- **Smart Scheduling** - Intelligent account selection with sticky sessions
+- **Concurrency Control** - Per-user and per-account concurrency limits
+- **Rate Limiting** - Configurable request and token rate limits
+- **Built-in Payment System** - Supports EasyPay, Alipay, WeChat Pay, and Stripe for user self-service top-up, no separate payment service needed ([Configuration Guide](docs/PAYMENT.md))
+- **Admin Dashboard** - Web interface for monitoring and management
+- **Composite Groups** - Admin routing layer that resolves requested models to concrete providers for multi-provider groups ([Operator Guide](docs/COMPOSITE_GROUPS.md))
+- **External System Integration** - Embed external systems (e.g. ticketing) via iframe to extend the admin dashboard
+
+## Ecosystem
+
+Community projects that extend or integrate with Sub2API:
+
+| Project | Description | Features |
+|---------|-------------|----------|
+| ~~[Sub2ApiPay](https://github.com/touwaeriol/sub2apipay)~~ | ~~Self-service payment system~~ | **Now Built-in** — Payment is now integrated into Sub2API, no separate deployment needed. See [Payment Configuration Guide](docs/PAYMENT.md) |
+| [sub2api-mobile](https://github.com/ckken/sub2api-mobile) | Mobile admin console | Cross-platform app (iOS/Android/Web) for user management, account management, monitoring dashboard, and multi-backend switching; built with Expo + React Native |
+
+## Tech Stack
+
+| Component | Technology |
+|-----------|------------|
+| Backend | Go 1.27.0, Gin, Ent |
+| Frontend | Vue 3.4+, Vite 5+, TailwindCSS |
+| Database | PostgreSQL 15+ |
+| Cache/Queue | Redis 7+ |
+
+---
+
+## Nginx Reverse Proxy Note
+
+When using Nginx as a reverse proxy for Sub2API (or CRS) with Codex CLI, add the following to the `http` block in your Nginx configuration:
+
+```nginx
+underscores_in_headers on;
+```
+
+Nginx drops headers containing underscores by default (e.g. `session_id`), which breaks sticky session routing in multi-account setups.
+
+---
+
+## Deployment
+
+### Method 1: Script Installation (Recommended)
+
+One-click installation script that downloads pre-built binaries from GitHub Releases.
+
+#### Prerequisites
+
+- Linux server (amd64 or arm64)
+- PostgreSQL 15+ (installed and running)
+- Redis 7+ (installed and running)
+- Root privileges
+
+#### Installation Steps
+
+```bash
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash
+```
+
+The script will:
+1. Detect your system architecture
+2. Download the latest release
+3. Install binary to `/opt/sub2api`
+4. Create systemd service
+5. Configure system user and permissions
+
+#### Post-Installation
+
+```bash
+# 1. Start the service
+sudo systemctl start sub2api
+
+# 2. Enable auto-start on boot
+sudo systemctl enable sub2api
+
+# 3. Open Setup Wizard in browser
+# http://YOUR_SERVER_IP:8080
+```
+
+The Setup Wizard will guide you through:
+- Database configuration
+- Redis configuration
+- Admin account creation
+
+#### Upgrade
+
+You can upgrade directly from the **Admin Dashboard** by clicking the **Check for Updates** button in the top-left corner.
+
+The web interface will:
+- Check for new versions automatically
+- Download and apply updates with one click
+- Support rollback if needed
+
+#### Useful Commands
+
+```bash
+# Check status
+sudo systemctl status sub2api
+
+# View logs
+sudo journalctl -u sub2api -f
+
+# Restart service
+sudo systemctl restart sub2api
+
+# Uninstall
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash -s -- uninstall -y
+```
+
+---
+
+### Method 2: Docker Compose (Recommended)
+
+Deploy with Docker Compose, including PostgreSQL and Redis containers.
+
+#### Prerequisites
+
+- Docker 20.10+
+- Docker Compose v2+
+
+#### Quick Start (One-Click Deployment)
+
+Use the automated deployment script for easy setup:
+
+```bash
+# Create deployment directory
+mkdir -p sub2api-deploy && cd sub2api-deploy
+
+# Download and run deployment preparation script
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh | bash
+
+# Start services
+docker compose up -d
+
+# View logs
+docker compose logs -f sub2api
+```
+
+**What the script does:**
+- Downloads `docker-compose.local.yml` (saved as `docker-compose.yml`) and `.env.example`
+- Generates secure credentials (JWT_SECRET, TOTP_ENCRYPTION_KEY, POSTGRES_PASSWORD)
+- Creates `.env` file with auto-generated secrets
+- Creates data directories (uses local directories for easy backup/migration)
+- Displays generated credentials for your reference
+
+#### Manual Deployment
+
+If you prefer manual setup:
+
+```bash
+# 1. Clone the repository
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api/deploy
+
+# 2. Copy environment configuration
+cp .env.example .env
+chmod 600 .env
+
+# 3. Edit configuration (generate secure passwords)
+nano .env
+```
+
+**Required configuration in `.env`:**
+
+```bash
+# PostgreSQL password (REQUIRED)
+POSTGRES_PASSWORD=your_secure_password_here
+
+# JWT Secret (RECOMMENDED - keeps users logged in after restart)
+JWT_SECRET=your_jwt_secret_here
+
+# TOTP Encryption Key (RECOMMENDED - preserves 2FA after restart)
+TOTP_ENCRYPTION_KEY=your_totp_key_here
+
+# Optional: Admin account
+ADMIN_EMAIL=admin@example.com
+ADMIN_PASSWORD=your_admin_password
+
+# Optional: Custom port
+SERVER_PORT=8080
+```
+
+**Generate secure secrets:**
+```bash
+# Generate JWT_SECRET
+openssl rand -hex 32
+
+# Generate TOTP_ENCRYPTION_KEY
+openssl rand -hex 32
+
+# Generate POSTGRES_PASSWORD
+openssl rand -hex 32
+```
+
+```bash
+# 4. Create data directories (for local version)
+mkdir -p data postgres_data redis_data
+
+# 5. Start all services
+# Option A: Local directory version (recommended - easy migration)
+docker compose -f docker-compose.local.yml up -d
+
+# Option B: Named volumes version (simple setup)
+docker compose up -d
+
+# 6. Check status
+docker compose -f docker-compose.local.yml ps
+
+# 7. View logs
+docker compose -f docker-compose.local.yml logs -f sub2api
+```
+
+#### Deployment Versions
+
+| Version | Data Storage | Migration | Best For |
+|---------|-------------|-----------|----------|
+| **docker-compose.local.yml** | Local directories | ✅ Easy (tar entire directory) | Production, frequent backups |
+| **docker-compose.yml** | Named volumes | ⚠️ Requires docker commands | Simple setup |
+
+**Recommendation:** Use `docker-compose.local.yml` (deployed by script) for easier data management.
+
+#### Access
+
+Open `http://YOUR_SERVER_IP:8080` in your browser.
+
+If admin password was auto-generated, find it in logs:
+```bash
+docker compose -f docker-compose.local.yml logs sub2api | grep "admin password"
+```
+
+#### Upgrade
+
+```bash
+# Pull latest image and recreate container
+docker compose -f docker-compose.local.yml pull
+docker compose -f docker-compose.local.yml up -d
+```
+
+#### Easy Migration (Local Directory Version)
+
+When using `docker-compose.local.yml`, migrate to a new server easily:
+
+```bash
+# On source server
+docker compose -f docker-compose.local.yml down
+cd ..
+tar czf sub2api-complete.tar.gz sub2api-deploy/
+
+# Transfer to new server
+scp sub2api-complete.tar.gz user@new-server:/path/
+
+# On new server
+tar xzf sub2api-complete.tar.gz
+cd sub2api-deploy/
+docker compose -f docker-compose.local.yml up -d
+```
+
+#### Useful Commands
+
+```bash
+# Stop all services
+docker compose -f docker-compose.local.yml down
+
+# Restart
+docker compose -f docker-compose.local.yml restart
+
+# View all logs
+docker compose -f docker-compose.local.yml logs -f
+
+# Remove all data (caution!)
+docker compose -f docker-compose.local.yml down
+rm -rf data/ postgres_data/ redis_data/
+```
+
+---
+
+### Method 3: Apple container (macOS)
+
+Apple-silicon Macs running macOS 26 can run the full Sub2API, PostgreSQL, and Redis stack with Apple `container` 1.1.0 or newer:
+
+```bash
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api/deploy
+./apple-container.sh init
+./apple-container.sh up
+./apple-container.sh status
+```
+
+This is an operator-managed local workflow; Docker Compose remains the recommended production path. See [deploy/APPLE_CONTAINER.md](deploy/APPLE_CONTAINER.md) for lifecycle commands, persistence, upgrades, and runtime limitations.
+
+---
+
+### Method 4: Build from Source
+
+Build and run from source code for development or customization.
+
+#### Prerequisites
+
+- Go 1.21+
+- Node.js 18+
+- PostgreSQL 15+
+- Redis 7+
+
+#### Build Steps
+
+```bash
+# 1. Clone the repository
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api
+
+# 2. Install pnpm (if not already installed)
+npm install -g pnpm
+
+# 3. Build frontend
+cd frontend
+pnpm install
+pnpm run build
+# Output will be in ../backend/internal/web/dist/
+
+# 4. Build backend with embedded frontend
+cd ../backend
+VERSION="$(./scripts/resolve-version.sh)"
+go build -tags embed -ldflags="-X main.Version=${VERSION}" -o sub2api ./cmd/server
+
+# 5. Create configuration file
+cp ../deploy/config.example.yaml ./config.yaml
+
+# 6. Edit configuration
+nano config.yaml
+```
+
+> **Note:** The `-tags embed` flag embeds the frontend into the binary. Without this flag, the binary will not serve the frontend UI.
+
+**Key configuration in `config.yaml`:**
+
+```yaml
+server:
+  host: "0.0.0.0"
+  port: 8080
+  mode: "release"
+
+database:
+  host: "localhost"
+  port: 5432
+  user: "postgres"
+  password: "your_password"
+  dbname: "sub2api"
+
+redis:
+  host: "localhost"
+  port: 6379
+  username: ""
+  password: ""
+
+jwt:
+  secret: "change-this-to-a-secure-random-string"
+  expire_hour: 24
+
+default:
+  user_concurrency: 5
+  user_balance: 0
+  api_key_prefix: "sk-"
+  rate_multiplier: 1.0
+```
+
+Additional security-related options are available in `config.yaml`:
+
+- `cors.allowed_origins` for CORS allowlist
+- `security.url_allowlist` for upstream/pricing/CRS host allowlists
+- `security.url_allowlist.enabled` to disable URL validation (use with caution)
+- `security.url_allowlist.allow_insecure_http` to allow HTTP URLs when validation is disabled
+- `security.url_allowlist.allow_private_hosts` to allow private/local IP addresses
+- `security.response_headers.enabled` to enable configurable response header filtering (disabled uses default allowlist)
+- `security.csp` to control Content-Security-Policy headers
+- `billing.circuit_breaker` to fail closed on billing errors
+- `security.trust_forwarded_ip_for_api_key_acl` enables legacy raw forwarded-header takeover (enabled by default for upgrade compatibility); disable it to enforce `server.trusted_proxies`, which should contain only the exact proxy CIDRs that connect directly to Sub2API
+- `security.forwarded_client_ip_headers` configures up to 16 third-party CDN client-IP header names; they are checked in order before the built-in headers only while legacy takeover is enabled
+- `turnstile.required` to require Turnstile in release mode
+
+Custom client-IP headers can be set in YAML or as a comma-separated environment variable:
+
+```bash
+SECURITY_FORWARDED_CLIENT_IP_HEADERS=True-Client-IP,X-CDN-Client-IP
+```
+
+Header names are validated, canonicalized, and de-duplicated. The admin security settings can update the list without a restart; new installations persist YAML/environment defaults and existing installations backfill a missing database value. When legacy takeover is disabled, all custom and built-in raw forwarding headers are ignored and Gin uses only `server.trusted_proxies`. While takeover is enabled, firewall the origin to CDN/proxy addresses and make the edge overwrite every trusted client-IP header. See [`deploy/EDGE_SECURITY.md`](deploy/EDGE_SECURITY.md) for the complete migration and trust-boundary rules.
+
+**⚠️ Security Warning: HTTP URL Configuration**
+
+When `security.url_allowlist.enabled=false`, the system performs minimal URL validation and **allows HTTP URLs by default** (dev-friendly mode; Docker Compose deployments use the same default). For production, explicitly tighten this to HTTPS-only:
+
+```yaml
+security:
+  url_allowlist:
+    enabled: false                # Disable allowlist checks
+    allow_insecure_http: false    # HTTPS only (recommended for production)
+```
+
+**Or via environment variable:**
+
+```bash
+SECURITY_URL_ALLOWLIST_ENABLED=false
+SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=false
+```
+
+**Risks of allowing HTTP:**
+- API keys and data transmitted in **plaintext** (vulnerable to interception)
+- Susceptible to **man-in-the-middle (MITM) attacks**
+- **NOT suitable for production** environments
+
+**When to use HTTP:**
+- ✅ Development/testing with local servers (http://localhost)
+- ✅ Internal networks with trusted endpoints
+- ✅ Testing account connectivity before obtaining HTTPS
+- ❌ Production environments (use HTTPS only)
+
+**Example error for HTTP URLs when `allow_insecure_http: false` is set:**
+```
+Invalid base URL: invalid url scheme: http
+```
+
+If you disable URL validation or response header filtering, harden your network layer:
+- Enforce an egress allowlist for upstream domains/IPs
+- Block private/loopback/link-local ranges
+- Enforce TLS-only outbound traffic
+- Strip sensitive upstream response headers at the proxy
+
+#### OpenAI Responses WebSocket ingress limits
+
+`gateway.openai_ws` bounds the lifetime and aggregate count of client-facing
+Responses WebSocket sessions. These safeguards apply independently from
+per-turn user and account concurrency slots, which are released between turns.
+
+```yaml
+gateway:
+  openai_ws:
+    # Total time to receive and decompress the first client message.
+    client_first_message_timeout_seconds: 30
+    # Close a client socket idle between completed turns; 0 disables this safeguard.
+    ingress_inter_turn_idle_timeout_seconds: 300
+    # Distributed API-key limit for live client ingress sessions; 0 disables it.
+    max_ingress_connections_per_api_key: 64
+```
+
+The first-message timeout is a total read deadline. Deployments that accept
+large contexts or image-heavy requests over slower links can raise it to
+120-300 seconds. It expires before HTTP bridge routing, so bridge mode does not
+override this limit.
+
+The connection cap is coordinated through Redis using a 60-second lease that
+is refreshed every 20 seconds. A process that cannot confirm a lease for a
+full lease lifetime closes its local WebSocket rather than continuing outside
+the global cap.
+
+Enable the v2 mode router before selecting an account-level WS mode such as
+`http_bridge`:
+
+```yaml
+gateway:
+  openai_ws:
+    mode_router_v2_enabled: true
+```
+
+Or set `GATEWAY_OPENAI_WS_MODE_ROUTER_V2_ENABLED=true` in the environment.
+Use `http_bridge` for client-WebSocket/upstream-HTTP operation when rolling out
+or mitigating upstream WebSocket issues.
+
+#### Force OpenAI upstream HTTP/SSE
+
+When an egress proxy or network repeatedly reconnects OpenAI Responses
+WebSockets, set the global fallback in the persisted deployment configuration:
+
+```yaml
+gateway:
+  openai_ws:
+    force_http: true
+```
+
+For Compose and Apple container deployments, the equivalent `.env` setting is:
+
+```bash
+GATEWAY_OPENAI_WS_FORCE_HTTP=true
+```
+
+This selects HTTP/SSE for OpenAI upstream Responses traffic that would
+otherwise use WebSocket. It does not change the client-facing protocol or force
+HTTP/1.1; configure `gateway.openai_http2.enabled` (or
+`GATEWAY_OPENAI_HTTP2_ENABLED=false`) separately when a proxy is incompatible
+with HTTP/2. Unlike the account-level `http_bridge` mode, this global fallback
+takes effect without enabling `mode_router_v2_enabled`. Keep the setting in the
+deployment's persisted `.env` or `config.yaml`, rather than inside a running
+container, so it is read again after an image update or container recreation.
+
+#### ⚠️ Important: Creating the Admin Account
+
+The initial admin account is **only created via the setup wizard** (served at `http://<host>:8080` on first run). The `default.admin_email` / `default.admin_password` fields in `config.yaml` are **not used** to create it — they exist in the template for historical reasons.
+
+Because step 5 above pre-creates `config.yaml`, the setup wizard will be **skipped on first run**: the server detects an existing config and boots straight into normal mode with an empty `users` table, so the first login attempt fails with `invalid email or password`.
+
+**Two ways to create the admin account:**
+
+1. **Recommended — let the wizard generate `config.yaml`:** Skip step 5 (do not run the `cp`). Start `./sub2api` directly; the setup wizard at `http://localhost:8080` walks you through database, Redis, and admin account setup, then writes `config.yaml` for you.
+
+2. **If you already created `config.yaml`:** Temporarily move it aside so the wizard can trigger on first run, then restore it afterwards:
+   ```bash
+   mv config.yaml config.yaml.bak
+   ./sub2api        # wizard runs at http://localhost:8080 and writes a fresh config.yaml
+   # stop the server (Ctrl+C) once the wizard completes, then restore your config:
+   mv config.yaml.bak config.yaml
+   ./sub2api        # restart in normal mode and log in with the admin you just created
+   ```
+
+```bash
+# 6. Run the application
+./sub2api
+```
+
+#### Development Mode
+
+```bash
+# Backend (with hot reload)
+cd backend
+go run ./cmd/server
+
+# Frontend (with hot reload)
+cd frontend
+pnpm run dev
+```
+
+#### Code Generation
+
+When editing `backend/ent/schema`, regenerate Ent + Wire:
+
+```bash
+cd backend
+go generate ./ent
+go generate ./cmd/server
+```
+
+---
+
+## Simple Mode
+
+Simple Mode is designed for individual developers or internal teams who want quick access without full SaaS features.
+
+- Enable: Set environment variable `RUN_MODE=simple`
+- Difference: Hides SaaS-related features and skips billing process
+- Security note: In production, you must also set `SIMPLE_MODE_CONFIRM=true` to allow startup
+
+---
+
+## Asynchronous Image Tasks
+
+Long-running OpenAI/Grok image generation and editing can be submitted through `/v1/images/generations/async` or `/v1/images/edits/async`, then polled at `/v1/images/tasks/{task_id}` without holding a CDN connection open. See [Asynchronous Image Tasks](docs/ASYNC_IMAGE_TASKS.md) for request and response examples.
+
+---
+
+## Grok / xAI Support
+
+Sub2API supports both Grok subscription accounts through xAI OAuth and standard xAI API-key accounts. Both account types forward OpenAI-compatible Responses traffic to xAI.
+
+### Supported Scope
+
+- Platform name: `grok`
+- Account types: OAuth subscription accounts and xAI API-key accounts
+- Public Responses targets: `/v1/responses`, `/responses`, and `/backend-api/codex/responses`, forwarded to the Grok subscription proxy for OAuth accounts or `https://api.x.ai/v1/responses` for API-key accounts
+- Public Claude-compatible target: `/v1/messages`, converted to xAI Responses and returned as Anthropic Messages output for Claude CLI style clients
+- Public Chat Completions targets: `/v1/chat/completions` and `/chat/completions`, forwarded to the account-type-specific xAI upstream
+- Codex CLI style Responses WebSocket ingress is accepted on the Responses targets and bridged to xAI HTTP/SSE Responses upstream
+- Text models: `grok-4.5`, `grok-4.3`, `grok-build-0.1`, `grok-composer-2.5-fast`, `grok-4.20-0309-reasoning`, `grok-4.20-0309-non-reasoning`, and `grok-4.20-multi-agent-0309`
+- Media targets for Grok groups: `/v1/images/generations`, `/images/generations`, `/v1/images/edits`, `/images/edits`, `/v1/videos/generations`, `/videos/generations`, `/v1/videos/edits`, `/videos/edits`, `/v1/videos/extensions`, `/videos/extensions`, `/v1/videos/{request_id}`, and `/videos/{request_id}`. Generation, editing, and extension requests require the group image-generation permission.
+- Media models: `grok-imagine`, `grok-imagine-image-quality`, `grok-imagine-image`, `grok-imagine-image-2.0`, `grok-imagine-edit`, `grok-imagine-video`, and `grok-imagine-video-1.5`
+- JSON image-edit and video-generation requests accept image references in `image`, `images`, `reference_images`, and `mask` objects. Use `url` for xAI-compatible payloads; the legacy `image_url` field remains accepted and is normalized to `url` before forwarding.
+- Out of scope for this provider: TTS, transcription, browser automation, cookies, and Grok web scraping
+
+### OAuth Configuration
+
+The Grok OAuth flow uses PKCE and does not require committing private secrets. The default client details follow the public xAI OAuth flow used by compatible clients, and every value can be overridden by environment variable:
+
+| Variable | Default |
+|----------|---------|
+| `XAI_OAUTH_CLIENT_ID` | Public xAI OAuth client ID |
+| `XAI_OAUTH_SCOPE` | `openid profile email offline_access grok-cli:access api:access` |
+| `XAI_OAUTH_REDIRECT_URI` | `http://127.0.0.1:56121/callback` |
+| `XAI_OAUTH_AUTHORIZE_URL` | `https://auth.x.ai/oauth2/authorize` |
+| `XAI_OAUTH_TOKEN_URL` | `https://auth.x.ai/oauth2/token` |
+| `XAI_BASE_URL` | `https://api.x.ai/v1`; runtime-diagnostics override (account `base_url` controls request forwarding) |
+| `XAI_GROK_CLI_VERSION` | `0.2.114`; optional override for the client identity sent to `cli-chat-proxy.grok.com`. The pinned value is also the floor: an override below it is dropped |
+
+Administrators can create Grok OAuth or API-key accounts from the dashboard. OAuth authorization and reauthorization are also available through the admin API:
+
+| Endpoint | Purpose |
+|----------|---------|
+| `POST /api/v1/admin/grok/oauth/auth-url` | Generate an xAI OAuth authorization URL |
+| `POST /api/v1/admin/grok/oauth/exchange-code` | Exchange a callback URL, query string, or code for OAuth credentials |
+| `POST /api/v1/admin/grok/oauth/refresh-token` | Validate or refresh a Grok refresh token |
+| `POST /api/v1/admin/grok/accounts/:id/refresh` | Refresh an existing Grok account |
+
+OAuth credential storage reuses the existing account JSON fields: `access_token`, `refresh_token`, `token_type`, `expires_at`, `base_url`, optional `email`, optional `subscription_tier`, and `entitlement_status`. OAuth inference defaults to `https://cli-chat-proxy.grok.com/v1`; existing OAuth accounts that stored the old `https://api.x.ai/v1` default are redirected to the subscription proxy at runtime. Explicit custom upstreams remain unchanged.
+
+For API-key accounts, select **Grok → API Key** in the create-account dialog. The official base URL defaults to `https://api.x.ai/v1`; credentials use the existing `base_url` and `api_key` account fields. OAuth accounts continue to use the subscription flow above.
+
+### Grok Build CLI Configuration
+
+1. In the Sub2API admin dashboard, add either a `grok` OAuth account and complete xAI authorization, or add a Grok API-key account.
+2. Create a Grok group, attach the account to it, then create a Sub2API API key assigned to that group.
+3. In the user API-key page, click **Use Key** and select **Grok CLI**. The modal generates the correct file and base URL for macOS/Linux or Windows. It also provides an OpenCode configuration on the **OpenCode** tab.
+4. If configuring manually, save the following as `~/.grok/config.toml` (Windows: `%USERPROFILE%\.grok\config.toml`):
+
+```toml
+[models]
+default = "grok"
+web_search = "grok"
+
+[model."grok"]
+model = "grok-4.5"
+base_url = "https://your-sub2api.example.com/v1"
+name = "Grok 4.5"
+api_key = "sk-your-sub2api-key"
+api_backend = "responses"
+context_window = 1000000
+supports_backend_search = true
+```
+
+Back up an existing `config.toml` before merging the entry. The file contains a Sub2API API key, so keep it private and restrict its permissions where supported. Verify the effective configuration and make a smoke request:
+
+```bash
+grok inspect
+grok -p "Reply with sub2api-ok" -m grok
+```
+
+The `base_url` above is the public Sub2API URL ending in `/v1`, not `api.x.ai` or the internal xAI OAuth proxy URL.
+
+### Usage And Quota Display
+
+xAI quota is passive. Sub2API does not invent subscription quota values; it records whitelisted xAI rate-limit headers from successful or rate-limited upstream responses when xAI sends them. Before the first usable upstream response, the dashboard shows quota as unknown and still displays local Sub2API usage stats.
+
+`401` responses temporarily remove accounts with invalid credentials from scheduling. `403` responses are treated as access or entitlement failures instead of token-refresh loops. `429` responses use `Retry-After` or a short cooldown to temporarily remove the account from scheduling.
+
+New Grok image and video generation requests use a media-specific eligibility check. API-key accounts remain eligible. OAuth accounts with explicit Free or forbidden billing evidence are excluded from new media generation. Missing or malformed observations are probed before dispatch; a successful but incomplete billing response is treated as `billing_inconclusive` and remains eligible for backwards compatibility, because an unknown billing schema is not proof that the account lacks media entitlement. Operators can quarantine a known-bad account with `extra.grok_media_eligible=false` or force-enable a verified account with `true`. Imports run the billing-first quota probe proactively. Chat requests and video status lookups are not affected by this media-only quarantine. If no eligible account remains, the media endpoint returns HTTP `503` with error type `grok_media_no_eligible_account`.
+
+Administrators can override automatic media eligibility through the account create/update API by setting `extra.grok_media_eligible` to `false` (exclude) or `true` (force eligible). On update, set it to `null` to remove the override and return to automatic probe-based behavior; omitting the field preserves the current override. A weekly allowance period alone is not treated as a paid tier signal. Successful image responses must contain at least one actual image output; empty HTTP `200` responses trigger account failover instead of being counted and returned as successful generations.
+
+---
+
+## Antigravity Support
+
+Sub2API supports [Antigravity](https://antigravity.so/) accounts. After authorization, dedicated endpoints are available for Claude and Gemini models.
+
+### Dedicated Endpoints
+
+| Endpoint | Model |
+|----------|-------|
+| `/antigravity/v1/messages` | Claude models |
+| `/antigravity/v1beta/` | Gemini models |
+
+### Claude Code Configuration
+
+```bash
+export ANTHROPIC_BASE_URL="http://localhost:8080/antigravity"
+export ANTHROPIC_AUTH_TOKEN="sk-xxx"
+```
+
+### Hybrid Scheduling Mode
+
+Antigravity accounts support optional **hybrid scheduling**. When enabled, the general endpoints `/v1/messages` and `/v1beta/` will also route requests to Antigravity accounts.
+
+> **⚠️ Warning**: Anthropic Claude and Antigravity Claude **cannot be mixed within the same conversation context**. Use groups to isolate them properly.
+
+---
+
+## Project Structure
+
+```
+sub2api/
+├── backend/                  # Go backend service
+│   ├── cmd/server/           # Application entry
+│   ├── internal/             # Internal modules
+│   │   ├── config/           # Configuration
+│   │   ├── model/            # Data models
+│   │   ├── service/          # Business logic
+│   │   ├── handler/          # HTTP handlers
+│   │   └── gateway/          # API gateway core
+│   └── resources/            # Static resources
+│
+├── frontend/                 # Vue 3 frontend
+│   └── src/
+│       ├── api/              # API calls
+│       ├── stores/           # State management
+│       ├── views/            # Page components
+│       └── components/       # Reusable components
+│
+└── deploy/                   # Deployment files
+    ├── docker-compose.yml    # Docker Compose configuration
+    ├── .env.example          # Environment variables for Docker Compose
+    ├── config.example.yaml   # Full config file for binary deployment
+    └── install.sh            # One-click installation script
+```
+
+## Star History
+
+<a href="https://star-history.dera.page/#Wei-Shaw/sub2api&Date">
+ <picture>
+   <source media="(prefers-color-scheme: dark)" srcset="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date&theme=dark" />
+   <source media="(prefers-color-scheme: light)" srcset="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date" />
+   <img alt="Star History Chart" src="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date" />
+ </picture>
+</a>
+
+---
+
+## License
+
+This project is licensed under the [GNU Lesser General Public License v3.0](LICENSE) (or later).
+
+Copyright (c) 2026 Wesley Liddick
+
+---
+
+<div align="center">
+
+**If you find this project useful, please give it a star!**
+
+</div>

+ 805 - 0
README_CN.md

@@ -0,0 +1,805 @@
+<div align="center">
+
+<img src="assets/logo.svg" alt="Sub2API Logo" width="128" />
+
+# Sub2API
+
+[![Go](https://img.shields.io/badge/Go-1.27.0-00ADD8.svg)](https://golang.org/)
+[![Vue](https://img.shields.io/badge/Vue-3.4+-4FC08D.svg)](https://vuejs.org/)
+[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-15+-336791.svg)](https://www.postgresql.org/)
+[![Redis](https://img.shields.io/badge/Redis-7+-DC382D.svg)](https://redis.io/)
+[![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg)](https://www.docker.com/)
+
+<a href="https://trendshift.io/repositories/21823" target="_blank"><img src="https://trendshift.io/api/badge/repositories/21823" alt="Wei-Shaw%2Fsub2api | Trendshift" width="250" height="55"/></a>
+
+**AI API 网关平台 - 订阅配额分发管理**
+
+[English](README.md) | 中文 | [日本語](README_JA.md)
+
+</div>
+
+
+## ⚠️ 重要提醒
+
+使用本项目前,请务必仔细阅读以下内容:
+
+- **🚨 服务条款风险**:使用本项目可能违反 Anthropic 等上游服务商的服务条款。请在使用前仔细阅读相关服务商的用户协议,由此产生的一切风险由用户自行承担。
+- **⚖️ 合规使用**:请在符合您所在国家或地区法律法规的前提下使用本项目,严禁将其用于任何违法违规用途。
+- **📖 免责声明**:本项目仅供技术学习与研究使用,作者不对因使用本项目导致的账户封禁、服务中断、数据丢失或其他任何直接或间接损失承担责任。
+- **🚫 无商业授权**:本项目从未授权任何个人或组织基于本项目开展任何形式的商业化运营。任何以本项目名义或基于本项目从事的商业行为均与本项目及其开发者无关,由此产生的一切纠纷、损失和法律责任由行为主体自行承担。
+
+## ❤️ 赞助商
+
+> [想出现在这里?](mailto:support@sub2api.org)
+
+<table>
+
+<tr>
+<td width="180"><a href="https://cctk.ai/register?aff=SUB2API"><img src="assets/partners/logos/cctk.jpg" alt="CCTK.AI" width="150"></a></td>
+<td>感谢 CCTK.AI 赞助了本项目!<a href="https://cctk.ai/register?aff=SUB2API">CCTK.AI</a> 是一个专注于稳定与性价比的 AI API 网关平台,提供 Claude、OpenAI、Gemini 等主流模型的高速中转服务,无缝兼容 Claude Code、Codex 等主流编程工具,以远低于官方的成本获得同等的模型能力。点击<a href="https://cctk.ai/register?aff=SUB2API">此链接</a>注册,即刻体验更快、更稳、更省的 AI API 接入。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.openmodel.ai?ref=sub2api"><img src="assets/partners/logos/openmodel.jpg" alt="openmodel" width="150"></a></td>
+<td>一个API,顶级模型随便用!<a href="https://www.openmodel.ai?ref=sub2api">OpenModel</a> 专注于生产级、高可用的 AI API 网关,让你的应用真正做到高速稳定:自动故障转移、智能选最优渠道、生产级 SLA 保障。远超单一供应商的 SLA,让稳定性成为您的核心竞争力。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://etok.ai"><img src="assets/partners/logos/etok.png" alt="ETok" width="150"></a></td>
+<td>感谢 ETok.ai 赞助了本项目!ETok.ai 致力于打造一站式 AI 编程工具服务平台。我们提供 Claude Code 专业套餐及技术社群服务,同时支持 Google Gemini 和 OpenAI Codex。通过精心设计的套餐方案和专业的技术社群,为开发者提供稳定的服务保障和持续的技术支持,让 AI 辅助编程真正成为开发者的生产力工具。点击<a href="https://etok.ai">这里</a>注册!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://apikey.fun/register?aff=SUB2API"><img src="assets/partners/logos/apikey-fun.png" alt="APIKEY.FUN" width="150"></a></td>
+<td>感谢 APIKEY.FUN 赞助了本项目!<a href="https://apikey.fun/register?aff=SUB2API">APIKEY.FUN</a> 是 sub2api 开源项目的核心贡献者之一,致力于提供开放、稳定、高性价比的 AI API 接入服务。平台支持 Claude、OpenAI、Gemini 等热门模型的 API 中转服务,价格低至官方原价的 7%。通过专属链接 <a href="https://apikey.fun/register?aff=SUB2API">APIKEY</a> 注册,可享受充值最高 95 折优惠。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://aigocode.com/invite/SUB2API"><img src="assets/partners/logos/aigocode.png" alt="AIGoCode" width="150"></a></td>
+<td>感谢 AIGoCode 赞助了本项目!AIGoCode 是一站式集成 Claude Code、Codex 以及最新 Gemini 模型的综合平台,为您提供稳定、高效、高性价比的 AI 编程服务。平台提供灵活的订阅方案,零封号风险,免 VPN 直连,响应极速。AIGoCode 为 sub2api 用户准备了专属福利:通过<a href="https://aigocode.com/invite/SUB2API">此链接</a>注册,首次充值可额外获得 10% 赠送额度!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://codex-everywhere.com"><img src="assets/partners/logos/codex-everywhere.jpg" alt="CodexEverywhere" width="150"></a></td>
+<td>Real GPT-5.6 series at 3% of OpenAI pricing — <a href="https://codex-everywhere.com">CodexEverywhere</a> is democratizing access to frontier models for developers worldwide. We believe in transparency and honesty, with model quality verified by active community oversight for months. USD and crypto friendly. Start with a free $20 trial at <a href="https://codex-everywhere.com">codex-everywhere.com</a>.</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://shop.bmoplus.com/?utm_source=github"><img src="assets/partners/logos/bmoplus.jpg" alt="bmoplus" width="150"></a></td>
+<td>感谢 BmoPlus 赞助了本项目!BmoPlus 是一家专为AI订阅重度用户打造的可靠 AI 账号代充服务商,提供稳定的 ChatGPT Plus / ChatGPT Pro(全程质保) / Claude Pro / Super Grok / Gemini Pro 的官方代充&成品账号。 通过<a href="https://shop.bmoplus.com/?utm_source=github">BmoPlus AI成品号专卖/代充</a>注册下单的用户,可享GPT 官网订阅一折 的震撼价格!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://bestproxy.com/?keyword=a2e8iuol"><img src="assets/partners/logos/bestproxy.png" alt="bestproxy" width="150"></a></td>
+<td>感谢 Bestproxy 赞助了本项目!<a href="https://bestproxy.com/?keyword=a2e8iuol">Bestproxy</a> 是一家提供高纯度住宅IP,支持一号一IP独享,结合真实家庭网络与指纹隔离,可实现链路环境隔离,降低关联风控概率。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://pateway.ai/?ch=1tsfr51"><img src="assets/partners/logos/pateway.png" alt="pateway" width="150"></a></td>
+<td>感谢 PatewayAI 赞助了本项目!PatewayAI 是一家面向重度 AI 开发者、专注官方直连的高品质模型 API 中转服务商。提供 Claude 全系列与 Codex 系列模型,100% 官方源直供,不掺假不注水,欢迎检验。计费透明,Token 级账单可逐笔核验。
+同时支持企业级高并发,并为企业客户提供了专业的管理平台,企业客户可签订正式合同并开具发票,更多详情进入官网获取联系方式。
+现在通过 <a href="https://pateway.ai/?ch=1tsfr51">此链接</a> 注册即送 $3 试用额度,用户充值低至 6 折,邀请好友双向赠送,邀请奖励可达 $150。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://api.pptoken.cc/register?promo=SUB2API"><img src="assets/partners/logos/pptoken.png" alt="pptoken" width="150"></a></td>
+<td>感谢 PPToken.cc 赞助本项目! <a href="https://api.pptoken.cc/register?promo=SUB2API">PPToken.cc</a> 主打 GPT 系列模型 API 中转服务,支持 Codex、Claude Code、OpenAI 兼容客户端及 Gemini CLI 等工具接入。充值 1:1,1 元=1 美元额度;GPT 模型最低 0.16 倍倍率,综合成本约为官方价格的 0.22 折,最快首字 Token 约 1 秒,适合开发者低成本、高响应速度接入 GPT 模型能力。技术支持: 7×24 小时真人响应(不是机器人),群内@技术,10 分钟内有回复 。赞助商福利:前 200 名用户通过 <a href="https://api.pptoken.cc/register?promo=SUB2API">[专属注册链接]</a> 注册,输入优惠码 `SUB2API`,可领取 Codex / Claude Code 免费试用额度,无门槛、不绑卡。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://veilx.io/#/hello/SJRBRVDV"><img src="assets/partners/logos/veilx.png" alt="veilx" width="150"></a></td>
+<td>感谢 Veilx 赞助本项目! <a href="https://veilx.io/#/hello/SJRBRVDV">Veilx</a> CDN 专为超大规模 API 请求场景打造,针对 AI 中转站业务与 AI API 调用链路进行了深度优化,轻松应对高并发、高频请求与大流量传输,为开发者与企业提供更快、更稳、更低延迟的加速体验。无论是 OpenAI、Claude、Gemini 等 AI 接口中转,还是聊天、绘图、Embedding、流式输出等复杂场景,Veilx 都能显著提升响应速度与连接稳定性,有效降低网络波动带来的超时与失败问题。同时,Veilx 提供中国三网优化回国极速线路,大幅提升中国大陆地区访问海外 AI 服务的速度与稳定性,特别适合全球 AI 中转平台、海外 AI SaaS、跨境业务与高并发 API 系统部署。专为 AI API 而生,让你的 AI 中转服务更快、更稳、更省心。<a href="https://veilx.io/#/hello/SJRBRVDV">购买地址</a>
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://roxybrowser.com/invite/bgGKG7"><img src="assets/partners/logos/RoxyBrowser.png" alt="RoxyBrowser" width="150"></a></td>
+<td>感谢 RoxyBrowser 赞助本项目!<a href="https://roxybrowser.com/invite/bgGKG7">RoxyBrowser</a> 是 Sub2API 的理想搭档:内置原生 Roxy AI Agent 与高质量原生住宅 IP,支持通过简单命令实现批量自动化,显著提升多账号管理的安全性与效率!点击<a href="https://roxybrowser.com/invite/bgGKG7">此链接</a>注册,可领取免费住宅 IP 套餐与终身 9 折优惠。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.proxy4free.com/?keyword=4yjqecpc"><img src="assets/partners/logos/proxy4free.png" alt="proxy4free" width="150"></a></td>
+<td>感谢 Proxy4Free 赞助本项目!Proxy4Free 是面向开发者和 AI 应用的数据代理服务商,提供住宅代理、静态住宅代理、ISP 代理及数据中心代理等多种代理解决方案,适用于 Web Scraping、Browser Automation、AI Agent 等场景。支持全球 IP 资源、稳定连接与灵活切换,帮助开发者提升数据采集成功率,降低 IP 封禁风险。通过<a href="https://www.proxy4free.com/?keyword=4yjqecpc">此链接注册</a>即可开始体验,轻松构建更稳定、高效的自动化工作流。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="http://www.fastaitoken.com/register"><img src="assets/partners/logos/fastaitoken.jpg" alt="fastaitoken" width="150"></a></td>
+<td>🎉 感谢 FastAIToken 对本项目的赞助! <a href="http://www.fastaitoken.com/register">FastAIToken</a> 是面向开发者的 AI API 聚合平台,支持 OpenAI、Claude、Gemini 等主流大模型,充值 1:1,1 元 = 1 美元 API 额度,让开发者以更低成本、更便捷地使用全球领先的大模型服务。<br>
+
+🚀 平台提供多种渠道自由选择:超级低价的0.02x OpenAI 福利分组(限时)、低至 0.25x OpenAI 分组、0.7x Claude 95%固定缓存、1.2x Claude Max 渠道;同时提供公开状态页,实时展示各分组的可用率、延迟及运行状态,服务透明可靠,并提供 7×24 小时真人技术支持(非机器人),快速响应开发者需求。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="http://aimzoon.com"><img src="assets/partners/logos/aimzoon.jpg" alt="aimzoon" width="150"></a></td>
+<td>感谢 Aimzoon 对本项目的赞助! <a href="http://aimzoon.com">Aimzoon</a> 提供稳定、高性价比的 AI API 接入服务,支持开发者将常用 AI 服务快速接入 Codex、Claude Code、Gemini CLI 等编程工具。无需复杂配置,更快接入,更稳调用,更省成本。codex倍率优惠,特价倍率等促销不断,注册即送免费体验额度,让 AI 编程真正进入日常工作流。<a href="http://aimzoon.com">点击这里</a>注册体验!
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://nagora.ai/"><img src="assets/partners/logos/nagora.png" alt="Nagora" width="150"></a></td>
+<td><a href="https://nagora.ai/">Nagora</a> 是专为开发者和团队打造的多模型 AI API 网关。通过一个账户和一枚 API Key,即可统一调用 26+ 款主流文本与图像模型,兼容 OpenAI、Anthropic 与 Gemini 协议,并可无缝接入 Claude Code、Codex、Gemini CLI 等开发工具。平台提供智能路由、自动故障转移、透明计费与统一账单,同时支持预算、限速、并发控制,让个人开发、团队协作和生产环境中的 AI 调用更稳定、更可控。无需改造现有应用,只需替换 Base URL 与 API Key,最快 1 分钟即可完成接入。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://s.qiniu.com/u6rQrq"><img src="assets/partners/logos/qiniu.jpg" alt="七牛云AI" width="150"></a></td>
+<td>感谢 七牛云AI 赞助本项目!七牛云AI 是七牛云(02567.HK)旗下企业级大模型 MaaS 平台,一站式调用全球 150+ 主流模型,兼容全球主流模型厂商协议,覆盖文本、图像、音频、视频、文件处理等全模态处理能力,服务超过169万企业及开发者用户。七牛云 AI 为 Sub2API 的用户提供了专属福利:通过<a href="https://s.qiniu.com/u6rQrq">此链接</a>注册,企业用户免费领1200万Token,开发者免费领300万Token。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://api.fenno.ai/s/dC4k"><img src="assets/partners/logos/fennoai.jpg" alt="FennoAI" width="150"></a></td>
+<td>感谢 FennoAI 赞助本项目!FennoAI 是一家面向企业研发团队和开发者的高稳定、高性能 API 中转服务商,兼容 OpenAI 与 Anthropic 协议,可无缝接入 Codex、Claude Code、OpenCode 等主流 AI 编程工具。平台具备企业级稳定性,可支撑千亿 Token/日的调用规模,并支持境内外主体公对公结算及开票,满足企业级研发与采购需求。作为 Sub2API 用户专属福利,通过<a href="https://api.fenno.ai/s/dC4k">专属链接</a>购买订阅,仅需 1.99 美元即可获得价值 50 美元的 Coding Plan 额度。同时支持邀请奖励,邀请好友购买最高可获得 20% 返佣,邀请越多,奖励越高。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://lanox.ai/?c=6"><img src="assets/partners/logos/lanox.jpg" alt="LanoX AI" width="150"></a></td>
+<td>感谢 LanoX AI 对本项目的赞助!<a href="https://lanox.ai/?c=6">LanoX AI</a> 为开发者、团队与企业提供稳定、高性价比的全球模型接入服务。 🎁 新用户福利 — 免费领取 百万 Token ,更有500+ 免费模型 — 低成本测试、验证、部署更轻松 🧠 全球主流模型 — GPT · Claude · Gemini · Qwen · Grok... 🎬 多模态创作 — Seedance 2.0 · GPT Image · Gemini Nano Banana 🛡️ 企业级稳定服务 — 高可用💎原生能力输出💎不降智💎不混模💎调用与计费透明💎 💰 更低调用成本 — 顶级模型低至官方价 1 折起,文档清晰、接入简单、支持开票与企业批量调用 🏢 企业优选 — 适用于 AI 产品、Agent、内容平台、研发团队批量调用</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.rapidproxy.io/?ref=sub2api"><img src="assets/partners/logos/rapidproxy.jpg" alt="RapidProxy" width="150"></a></td>
+<td><a href="https://www.rapidproxy.io/?ref=sub2api">RapidProxy</a> 是面向开发者的数据采集代理解决方案,提供稳定可靠的住宅代理服务。通过 9000 万+全球住宅 IP和 200+国家覆盖、智能轮换机制和精准地区定位能力,帮助爬虫、AI 数据训练、SEO 监控、电商数据分析等项目突破访问限制,提高数据采集效率。支持 Playwright、Selenium、Puppeteer 等主流自动化框架,价格低至 $0.65/GB,<a href="https://www.rapidproxy.io/?ref=sub2api">立即免费测试吧</a>。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://hao.ai"><img src="assets/partners/logos/haoai.png" alt="hao.ai" width="150"></a></td>
+<td><a href="https://hao.ai">hao.ai</a> 是面向开发者与团队的高速、稳定大模型统一 API 网关。通过一个 API Key 和统一接口,即可接入 GPT、Claude、xAI Grok 等主流模型,兼容 OpenAI、Anthropic 等常用协议与 SDK。平台提供模型路由、故障回退、团队管理及完整调用日志,模型价格低至官方参考价的 1.5 折,帮助用户更简单、更稳定、更低成本地构建 AI 应用。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.swiftproxy.net/?ref=sub2api"><img src="assets/partners/logos/swiftprox.png" alt="Swiftproxy" width="150"></a></td>
+<td>Swiftproxy 是面向开发者的高性能代理解决方案,提供稳定可靠的住宅代理和静态住宅代理服务。拥有 9000 万+ 纯净住宅 IP,覆盖全球,支持灵活轮换和精准地理定位,帮助网页抓取、AI 自动化、浏览器自动化、SEO 监控和多账号管理等项目突破访问限制,提升工作流效率。支持 HTTP(S) 和 SOCKS5 协议,兼容 Playwright、Selenium、Puppeteer 等主流自动化工具,动态代理流量用完为止永不过期,支持免费测试 — <a href="https://www.swiftproxy.net/?ref=sub2api">立即开始免费测试</a>!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.duckip.cn/?keyword=cu7oog6y"><img src="assets/partners/logos/duckip.png" alt="DuckIP" width="150"></a></td>
+<td><a href="https://www.duckip.cn/?keyword=cu7oog6y">DuckIP</a> - 9000 万+ 全球住宅网络资源,覆盖 195+ 国家和地区,支持轮换和粘性会话,适用于公共数据采集、RAG 更新、模型评估和多区域数据工作负载。🟢住宅代理 - 8 折优惠;🟢静态住宅代理 - ¥50.00/IP 起;🟢无限住宅代理 - ¥19.8/小时 起。✅免费领取 500M 试用流量。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://go.apimart.ai/gh-sub2api"><img src="assets/partners/logos/apimart.jpg" alt="APIMart" width="150"></a></td>
+<td>感谢 APIMart 赞助了本项目!<a href="https://go.apimart.ai/gh-sub2api">APIMart</a> 是专注于 AI 图片/视频生成的低价 API 平台,GPT-Image-2 低至 $0.006/张,1 美元可生成 160+ 张图片。图片、视频一套异步 API 通吃:提交任务获取 ID,通过轮询或回调获取结果;批量生成上万张图片也不会超时,切换模型无需修改代码。按量付费、无月费,通过<a href="https://go.apimart.ai/gh-sub2api">此注册链接</a>注册即可开始使用。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.axisnow.io/"><img src="assets/partners/logos/axisnow.jpg" alt="AxisNow" width="150"></a></td>
+<td>感谢 AxisNow 赞助了本项目!<a href="https://www.axisnow.io/">AxisNow</a> 保护并加速网站与 API,兼顾中国大陆及全球的访问体验,并通过客户端 SDK,将加速与安全能力延伸至原生/移动 App — <strong>自建私有部署 CDN</strong>|<strong>订阅式高防 CDN</strong>|<strong>自主可控、灵活组合的 CDN 网络</strong>。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://pp.dog/register?aff=SUB2API"><img src="assets/partners/logos/ppdog.png" alt="PP.dog" width="150"></a></td>
+<td><a href="https://pp.dog/register?aff=SUB2API">PP.dog</a> 是自建账号池的源头 API 网关,专注为下游中转站与高频开发者提供 API 网关中继服务,帮您省去自建号池的一切麻烦——✅ 源头直供:自持海量账号池,无中间商赚差价;🧧 成本屠夫:综合倍率低至 0.03x,成本仅为官方的千分之3.5;🚀 极速体验:首 Token 延迟 < 1s,流畅媲美官方原生 API。<a href="https://www.pp.dog/register?aff=SUB2API">立即接入PP.dog</a></td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://colaproxy.com/?utm_source=sub2api&utm_medium=sub2api&ref=sub2api"><img src="assets/partners/logos/cola-proxy.jpg" alt="ColaProxy" width="150"></a></td>
+<td>ColaProxy 提供专为网页抓取、自动化和多账号管理打造的高质量住宅代理。免费试用,流量永不过期,价格低至 $0.3/GB,支持无限并发连接和智能 IP 轮换,带来更流畅、更稳定的代理体验。使用优惠码 COLA10 立享 9 折优惠,立即开始使用可靠的住宅代理扩展您的项目。<a href="https://colaproxy.com/?utm_source=sub2api&utm_medium=sub2api&ref=sub2api">立即开始使用 ColaProxy</a></td>
+</tr>
+
+</table>
+
+## 项目概述
+
+Sub2API 是一个 AI API 网关平台,用于分发和管理 AI 产品订阅的 API 配额。用户通过平台生成的 API Key 调用上游 AI 服务,平台负责鉴权、计费、负载均衡和请求转发。
+
+## 核心功能
+
+- **多账号管理** - 支持多种上游账号类型(OAuth、API Key)
+- **API Key 分发** - 为用户生成和管理 API Key
+- **精确计费** - Token 级别的用量追踪和成本计算
+- **智能调度** - 智能账号选择,支持粘性会话
+- **并发控制** - 用户级和账号级并发限制
+- **速率限制** - 可配置的请求和 Token 速率限制
+- **内置支付系统** - 支持 EasyPay 易支付、支付宝官方、微信官方、Stripe,用户自助充值,无需独立部署支付服务([配置指南](docs/PAYMENT_CN.md))
+- **管理后台** - Web 界面进行监控和管理
+- **外部系统集成** - 支持通过 iframe 嵌入外部系统(如工单等),扩展管理后台功能
+
+## 生态项目
+
+围绕 Sub2API 的社区扩展与集成项目:
+
+| 项目 | 说明 | 功能 |
+|------|------|------|
+| ~~[Sub2ApiPay](https://github.com/touwaeriol/sub2apipay)~~ | ~~自助支付系统~~ | **已内置** — 支付功能已集成到 Sub2API 中,无需独立部署。详见 [支付配置指南](docs/PAYMENT_CN.md) |
+| [sub2api-mobile](https://github.com/ckken/sub2api-mobile) | 移动端管理控制台 | 跨平台应用(iOS/Android/Web),支持用户管理、账号管理、监控看板、多后端切换;基于 Expo + React Native 构建 |
+
+## 技术栈
+
+| 组件 | 技术 |
+|------|------|
+| 后端 | Go 1.27.0, Gin, Ent |
+| 前端 | Vue 3.4+, Vite 5+, TailwindCSS |
+| 数据库 | PostgreSQL 15+ |
+| 缓存/队列 | Redis 7+ |
+
+---
+
+## Nginx 反向代理注意事项
+
+通过 Nginx 反向代理 Sub2API(或 CRS 服务)并搭配 Codex CLI 使用时,需要在 Nginx 配置的 `http` 块中添加:
+
+```nginx
+underscores_in_headers on;
+```
+
+Nginx 默认会丢弃名称中含下划线的请求头(如 `session_id`),这会导致多账号环境下的粘性会话功能失效。
+
+---
+
+## 部署方式
+
+### 方式一:脚本安装(推荐)
+
+一键安装脚本,自动从 GitHub Releases 下载预编译的二进制文件。
+
+#### 前置条件
+
+- Linux 服务器(amd64 或 arm64)
+- PostgreSQL 15+(已安装并运行)
+- Redis 7+(已安装并运行)
+- Root 权限
+
+#### 安装步骤
+
+```bash
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash
+```
+
+脚本会自动:
+1. 检测系统架构
+2. 下载最新版本
+3. 安装二进制文件到 `/opt/sub2api`
+4. 创建 systemd 服务
+5. 配置系统用户和权限
+
+#### 安装后配置
+
+```bash
+# 1. 启动服务
+sudo systemctl start sub2api
+
+# 2. 设置开机自启
+sudo systemctl enable sub2api
+
+# 3. 在浏览器中打开设置向导
+# http://你的服务器IP:8080
+```
+
+设置向导将引导你完成:
+- 数据库配置
+- Redis 配置
+- 管理员账号创建
+
+#### 升级
+
+可以直接在 **管理后台** 左上角点击 **检测更新** 按钮进行在线升级。
+
+网页升级功能支持:
+- 自动检测新版本
+- 一键下载并应用更新
+- 支持回滚
+
+#### 常用命令
+
+```bash
+# 查看状态
+sudo systemctl status sub2api
+
+# 查看日志
+sudo journalctl -u sub2api -f
+
+# 重启服务
+sudo systemctl restart sub2api
+
+# 卸载
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash -s -- uninstall -y
+```
+
+---
+
+### 方式二:Docker Compose(推荐)
+
+使用 Docker Compose 部署,包含 PostgreSQL 和 Redis 容器。
+
+#### 前置条件
+
+- Docker 20.10+
+- Docker Compose v2+
+
+#### 快速开始(一键部署)
+
+使用自动化部署脚本快速搭建:
+
+```bash
+# 创建部署目录
+mkdir -p sub2api-deploy && cd sub2api-deploy
+
+# 下载并运行部署准备脚本
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh | bash
+
+# 启动服务
+docker compose up -d
+
+# 查看日志
+docker compose logs -f sub2api
+```
+
+**脚本功能:**
+- 下载 `docker-compose.local.yml`(本地保存为 `docker-compose.yml`)和 `.env.example`
+- 自动生成安全凭证(JWT_SECRET、TOTP_ENCRYPTION_KEY、POSTGRES_PASSWORD)
+- 创建 `.env` 文件并填充自动生成的密钥
+- 创建数据目录(使用本地目录,便于备份和迁移)
+- 显示生成的凭证供你记录
+
+#### 手动部署
+
+如果你希望手动配置:
+
+```bash
+# 1. 克隆仓库
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api/deploy
+
+# 2. 复制环境配置文件
+cp .env.example .env
+chmod 600 .env
+
+# 3. 编辑配置(生成安全密码)
+nano .env
+```
+
+**`.env` 必须配置项:**
+
+```bash
+# PostgreSQL 密码(必需)
+POSTGRES_PASSWORD=your_secure_password_here
+
+# JWT 密钥(推荐 - 重启后保持用户登录状态)
+JWT_SECRET=your_jwt_secret_here
+
+# TOTP 加密密钥(推荐 - 重启后保留双因素认证)
+TOTP_ENCRYPTION_KEY=your_totp_key_here
+
+# 可选:管理员账号
+ADMIN_EMAIL=admin@example.com
+ADMIN_PASSWORD=your_admin_password
+
+# 可选:自定义端口
+SERVER_PORT=8080
+```
+
+**生成安全密钥:**
+```bash
+# 生成 JWT_SECRET
+openssl rand -hex 32
+
+# 生成 TOTP_ENCRYPTION_KEY
+openssl rand -hex 32
+
+# 生成 POSTGRES_PASSWORD
+openssl rand -hex 32
+```
+
+```bash
+# 4. 创建数据目录(本地版)
+mkdir -p data postgres_data redis_data
+
+# 5. 启动所有服务
+# 选项 A:本地目录版(推荐 - 易于迁移)
+docker compose -f docker-compose.local.yml up -d
+
+# 选项 B:命名卷版(简单设置)
+docker compose up -d
+
+# 6. 查看状态
+docker compose -f docker-compose.local.yml ps
+
+# 7. 查看日志
+docker compose -f docker-compose.local.yml logs -f sub2api
+```
+
+#### 部署版本对比
+
+| 版本 | 数据存储 | 迁移便利性 | 适用场景 |
+|------|---------|-----------|---------|
+| **docker-compose.local.yml** | 本地目录 | ✅ 简单(打包整个目录) | 生产环境、频繁备份 |
+| **docker-compose.yml** | 命名卷 | ⚠️ 需要 docker 命令 | 简单设置 |
+
+**推荐:** 使用 `docker-compose.local.yml`(脚本部署)以便更轻松地管理数据。
+
+#### 启用“数据管理”功能(datamanagementd)
+
+如需启用管理后台“数据管理”,需要额外部署宿主机数据管理进程 `datamanagementd`。
+
+关键点:
+
+- 主进程固定探测:`/tmp/sub2api-datamanagement.sock`
+- 只有该 Socket 可连通时,数据管理功能才会开启
+- Docker 场景需将宿主机 Socket 挂载到容器同路径
+
+详细部署步骤见:`deploy/DATAMANAGEMENTD_CN.md`
+
+#### 访问
+
+在浏览器中打开 `http://你的服务器IP:8080`
+
+如果管理员密码是自动生成的,在日志中查找:
+```bash
+docker compose -f docker-compose.local.yml logs sub2api | grep "admin password"
+```
+
+#### 升级
+
+```bash
+# 拉取最新镜像并重建容器
+docker compose -f docker-compose.local.yml pull
+docker compose -f docker-compose.local.yml up -d
+```
+
+#### 轻松迁移(本地目录版)
+
+使用 `docker-compose.local.yml` 时,可以轻松迁移到新服务器:
+
+```bash
+# 源服务器
+docker compose -f docker-compose.local.yml down
+cd ..
+tar czf sub2api-complete.tar.gz sub2api-deploy/
+
+# 传输到新服务器
+scp sub2api-complete.tar.gz user@new-server:/path/
+
+# 新服务器
+tar xzf sub2api-complete.tar.gz
+cd sub2api-deploy/
+docker compose -f docker-compose.local.yml up -d
+```
+
+#### 常用命令
+
+```bash
+# 停止所有服务
+docker compose -f docker-compose.local.yml down
+
+# 重启
+docker compose -f docker-compose.local.yml restart
+
+# 查看所有日志
+docker compose -f docker-compose.local.yml logs -f
+
+# 删除所有数据(谨慎!)
+docker compose -f docker-compose.local.yml down
+rm -rf data/ postgres_data/ redis_data/
+```
+
+---
+
+### 方式三:Apple container(macOS)
+
+Apple 芯片 Mac 在 macOS 26 上可使用 Apple `container` 1.1.0 或更高版本运行完整的 Sub2API、PostgreSQL 和 Redis:
+
+```bash
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api/deploy
+./apple-container.sh init
+./apple-container.sh up
+./apple-container.sh status
+```
+
+该方式面向本地开发和人工运维,不提供持续重启监管;生产部署仍推荐 Docker Compose。生命周期命令、持久化、升级和运行时限制见 [deploy/APPLE_CONTAINER.md](deploy/APPLE_CONTAINER.md)。
+
+---
+
+### 方式四:源码编译
+
+从源码编译安装,适合开发或定制需求。
+
+#### 前置条件
+
+- Go 1.21+
+- Node.js 18+
+- PostgreSQL 15+
+- Redis 7+
+
+#### 编译步骤
+
+```bash
+# 1. 克隆仓库
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api
+
+# 2. 安装 pnpm(如果还没有安装)
+npm install -g pnpm
+
+# 3. 编译前端
+cd frontend
+pnpm install
+pnpm run build
+# 构建产物输出到 ../backend/internal/web/dist/
+
+# 4. 编译后端(嵌入前端)
+cd ../backend
+VERSION="$(./scripts/resolve-version.sh)"
+go build -tags embed -ldflags="-X main.Version=${VERSION}" -o sub2api ./cmd/server
+
+# 5. 创建配置文件
+cp ../deploy/config.example.yaml ./config.yaml
+
+# 6. 编辑配置
+nano config.yaml
+```
+
+> **注意:** `-tags embed` 参数会将前端嵌入到二进制文件中。不使用此参数编译的程序将不包含前端界面。
+
+**`config.yaml` 关键配置:**
+
+```yaml
+server:
+  host: "0.0.0.0"
+  port: 8080
+  mode: "release"
+
+database:
+  host: "localhost"
+  port: 5432
+  user: "postgres"
+  password: "your_password"
+  dbname: "sub2api"
+
+redis:
+  host: "localhost"
+  port: 6379
+  password: ""
+
+jwt:
+  secret: "change-this-to-a-secure-random-string"
+  expire_hour: 24
+
+default:
+  user_concurrency: 5
+  user_balance: 0
+  api_key_prefix: "sk-"
+  rate_multiplier: 1.0
+```
+
+`config.yaml` 还支持以下安全相关配置:
+
+- `cors.allowed_origins` 配置 CORS 白名单
+- `security.url_allowlist` 配置上游/价格数据/CRS 主机白名单
+- `security.url_allowlist.enabled` 可关闭 URL 校验(慎用)
+- `security.url_allowlist.allow_insecure_http` 关闭校验时允许 HTTP URL
+- `security.url_allowlist.allow_private_hosts` 允许私有/本地 IP 地址
+- `security.response_headers.enabled` 可启用可配置响应头过滤(关闭时使用默认白名单)
+- `security.csp` 配置 Content-Security-Policy
+- `billing.circuit_breaker` 计费异常时 fail-closed
+- `security.trust_forwarded_ip_for_api_key_acl` 控制旧版原始转发头接管(为升级兼容默认开启);关闭后严格使用 `server.trusted_proxies`,其中只应填写直接连接 Sub2API 的精确代理 CIDR
+- `security.forwarded_client_ip_headers` 最多配置 16 个第三方 CDN 客户端 IP 请求头;仅在旧版接管开启时按顺序优先于内置请求头解析
+- `turnstile.required` 在 release 模式强制启用 Turnstile
+
+自定义客户端 IP 请求头可通过 YAML 配置,也可使用逗号分隔的环境变量:
+
+```bash
+SECURITY_FORWARDED_CLIENT_IP_HEADERS=True-Client-IP,X-CDN-Client-IP
+```
+
+请求头名称会经过合法性校验、规范化和大小写无关去重。管理员可在安全设置中动态更新列表,无需重启;新安装会持久化 YAML/环境变量默认值,旧安装缺少数据库字段时会自动回填。关闭旧版接管后,自定义头和内置原始转发头均被忽略,只使用 `server.trusted_proxies`。开启接管时必须限制源站仅允许 CDN/代理访问,并确保边缘代理覆盖所有受信客户端 IP 请求头。完整迁移规则和信任边界见 [`deploy/EDGE_SECURITY.md`](deploy/EDGE_SECURITY.md)。
+
+**网关防御纵深建议(重点)**
+
+- `gateway.upstream_response_read_max_bytes`:限制非流式上游响应读取大小(默认 `8MB`),用于防止异常响应导致内存放大。
+- `gateway.proxy_probe_response_read_max_bytes`:限制代理探测响应读取大小(默认 `1MB`)。
+- `gateway.gemini_debug_response_headers`:默认 `false`,仅在排障时短时开启,避免高频请求日志开销。
+- `/auth/register`、`/auth/login`、`/auth/login/2fa`、`/auth/send-verify-code` 已提供服务端兜底限流(Redis 故障时 fail-close)。
+- 推荐将 WAF/CDN 作为第一层防护,服务端限流与响应读取上限作为第二层兜底;两层同时保留,避免旁路流量与误配置风险。
+
+**⚠️ 安全警告:HTTP URL 配置**
+
+当 `security.url_allowlist.enabled=false` 时,系统仅执行最小 URL 校验,且**默认允许 HTTP URL**(开发友好模式,Docker Compose 部署的默认值一致)。生产环境建议显式收紧为仅允许 HTTPS:
+
+```yaml
+security:
+  url_allowlist:
+    enabled: false                # 禁用白名单检查
+    allow_insecure_http: false    # 仅允许 HTTPS(生产环境推荐)
+```
+
+**或通过环境变量:**
+
+```bash
+SECURITY_URL_ALLOWLIST_ENABLED=false
+SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=false
+```
+
+**允许 HTTP 的风险:**
+- API 密钥和数据以**明文传输**(可被截获)
+- 易受**中间人攻击 (MITM)**
+- **不适合生产环境**
+
+**适用场景:**
+- ✅ 开发/测试环境的本地服务器(http://localhost)
+- ✅ 内网可信端点
+- ✅ 获取 HTTPS 前测试账号连通性
+- ❌ 生产环境(仅使用 HTTPS)
+
+**设置 `allow_insecure_http: false` 后,HTTP URL 会返回如下错误:**
+```
+Invalid base URL: invalid url scheme: http
+```
+
+如关闭 URL 校验或响应头过滤,请加强网络层防护:
+- 出站访问白名单限制上游域名/IP
+- 阻断私网/回环/链路本地地址
+- 强制仅允许 TLS 出站
+- 在反向代理层移除敏感响应头
+
+#### ⚠️ 重要:创建管理员账号
+
+初始管理员账号**只能通过 setup 向导创建**(首次启动时访问 `http://<host>:8080`)。`config.yaml` 中的 `default.admin_email` / `default.admin_password` 字段**不会被用来创建管理员**——它们只是出于历史原因保留在模板里。
+
+由于上面第 5 步预先创建了 `config.yaml`,**setup 向导在首次启动时会被跳过**:服务检测到 config 已存在,会直接进入正常模式,此时 `users` 表为空,首次登录会返回 `invalid email or password`。
+
+**创建管理员的两种方式:**
+
+1. **推荐——让向导自动生成 `config.yaml`:** 跳过上面的第 5 步(不要执行 `cp`)。直接运行 `./sub2api`,访问 `http://localhost:8080`,向导会引导你完成数据库、Redis 和管理员账号配置,并自动写出 `config.yaml`。
+
+2. **如果你已经创建了 `config.yaml`:** 首次启动前先把它临时移走以触发向导,完成后再恢复:
+   ```bash
+   mv config.yaml config.yaml.bak
+   ./sub2api        # 向导在 http://localhost:8080 启动,并生成新的 config.yaml
+   # 向导完成后 Ctrl+C 停服,再恢复你的配置:
+   mv config.yaml.bak config.yaml
+   ./sub2api        # 重启进入正常模式,用刚创建的管理员登录
+   ```
+
+```bash
+# 6. 运行应用
+./sub2api
+```
+
+#### HTTP/2 (h2c) 与 HTTP/1.1 回退
+
+后端明文端口默认支持 h2c,并保留 HTTP/1.1 回退用于 WebSocket 与旧客户端。浏览器通常不支持 h2c,性能收益主要在反向代理或内网链路。
+
+**反向代理示例(Caddy):**
+
+```caddyfile
+transport http {
+	versions h2c h1
+}
+```
+
+**验证:**
+
+```bash
+# h2c prior knowledge
+curl --http2-prior-knowledge -I http://localhost:8080/health
+# HTTP/1.1 回退
+curl --http1.1 -I http://localhost:8080/health
+# WebSocket 回退验证(需管理员 token)
+websocat -H="Sec-WebSocket-Protocol: sub2api-admin, jwt.<ADMIN_TOKEN>" ws://localhost:8080/api/v1/admin/ops/ws/qps
+```
+
+#### 开发模式
+
+```bash
+# 后端(支持热重载)
+cd backend
+go run ./cmd/server
+
+# 前端(支持热重载)
+cd frontend
+pnpm run dev
+```
+
+#### 代码生成
+
+修改 `backend/ent/schema` 后,需要重新生成 Ent + Wire:
+
+```bash
+cd backend
+go generate ./ent
+go generate ./cmd/server
+```
+
+---
+
+## OpenAI 图片模型
+
+支持 `gpt-image-2.5-flare`、`gpt-image-2.5-sunburst` 及其 `2026-09-08` 日期快照,可通过 `/v1/images/generations`、`/v1/images/edits` 调用。`quality` 支持 `xhigh`、`max`、`auto`,合法自定义尺寸和图片 usage 明细保持透传。
+
+OAuth / Setup Token 图片请求使用 Responses 主控模型调用 `image_generation` 工具,默认主控为 `gpt-5.6-luna`。可设置 `SUB2API_IMAGES_MAIN_MODEL` 切换为账号支持的文本模型;Docker Compose 用户修改 `.env` 后执行 `docker compose up -d` 重建容器。该配置不会替换所选图片模型,也不会覆盖 `/v1/responses` 请求中已经提供的文本主控模型。
+
+升级后,无模型限制的账号自动支持新模型。已有显式账号映射或分组白名单需要加入两个 2.5 模型(日期快照按需加入);升级不会自动扩大管理员设置的模型权限。新模型内置价格包含官方文本输入、图片输入和图片输出 token 费率,远端价格表尚未更新时使用内置 2.5 价格;实际按次或按 token 计费仍由既有分组/渠道配置决定。
+
+## 简易模式
+
+简易模式适合个人开发者或内部团队快速使用,不依赖完整 SaaS 功能。
+
+- 启用方式:设置环境变量 `RUN_MODE=simple`
+- 功能差异:隐藏 SaaS 相关功能,跳过计费流程
+- 安全注意事项:生产环境需同时设置 `SIMPLE_MODE_CONFIRM=true` 才允许启动
+
+---
+
+## Antigravity 使用说明
+
+Sub2API 支持 [Antigravity](https://antigravity.so/) 账户,授权后可通过专用端点访问 Claude 和 Gemini 模型。
+
+### 专用端点
+
+| 端点 | 模型 |
+|------|------|
+| `/antigravity/v1/messages` | Claude 模型 |
+| `/antigravity/v1beta/` | Gemini 模型 |
+
+### Claude Code 配置示例
+
+```bash
+export ANTHROPIC_BASE_URL="http://localhost:8080/antigravity"
+export ANTHROPIC_AUTH_TOKEN="sk-xxx"
+```
+
+### 混合调度模式
+
+Antigravity 账户支持可选的**混合调度**功能。开启后,通用端点 `/v1/messages` 和 `/v1beta/` 也会调度该账户。
+
+> **⚠️ 注意**:Anthropic Claude 和 Antigravity Claude **不能在同一上下文中混合使用**,请通过分组功能做好隔离。
+
+---
+
+## 项目结构
+
+```
+sub2api/
+├── backend/                  # Go 后端服务
+│   ├── cmd/server/           # 应用入口
+│   ├── internal/             # 内部模块
+│   │   ├── config/           # 配置管理
+│   │   ├── model/            # 数据模型
+│   │   ├── service/          # 业务逻辑
+│   │   ├── handler/          # HTTP 处理器
+│   │   └── gateway/          # API 网关核心
+│   └── resources/            # 静态资源
+│
+├── frontend/                 # Vue 3 前端
+│   └── src/
+│       ├── api/              # API 调用
+│       ├── stores/           # 状态管理
+│       ├── views/            # 页面组件
+│       └── components/       # 通用组件
+│
+└── deploy/                   # 部署文件
+    ├── docker-compose.yml    # Docker Compose 配置
+    ├── .env.example          # Docker Compose 环境变量
+    ├── config.example.yaml   # 二进制部署完整配置文件
+    └── install.sh            # 一键安装脚本
+```
+
+## Star History
+
+<a href="https://star-history.dera.page/#Wei-Shaw/sub2api&Date">
+ <picture>
+   <source media="(prefers-color-scheme: dark)" srcset="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date&theme=dark" />
+   <source media="(prefers-color-scheme: light)" srcset="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date" />
+   <img alt="Star History Chart" src="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date" />
+ </picture>
+</a>
+
+---
+
+## 许可证
+
+本项目基于 [GNU 宽通用公共许可证 v3.0](LICENSE)(或更高版本)授权。
+
+Copyright (c) 2026 Wesley Liddick
+
+---
+
+<div align="center">
+
+**如果觉得有用,请给个 Star 支持一下!**
+
+</div>

+ 753 - 0
README_JA.md

@@ -0,0 +1,753 @@
+<div align="center">
+
+<img src="assets/logo.svg" alt="Sub2API Logo" width="128" />
+
+# Sub2API
+
+[![Go](https://img.shields.io/badge/Go-1.27.0-00ADD8.svg)](https://golang.org/)
+[![Vue](https://img.shields.io/badge/Vue-3.4+-4FC08D.svg)](https://vuejs.org/)
+[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-15+-336791.svg)](https://www.postgresql.org/)
+[![Redis](https://img.shields.io/badge/Redis-7+-DC382D.svg)](https://redis.io/)
+[![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg)](https://www.docker.com/)
+
+<a href="https://trendshift.io/repositories/21823" target="_blank"><img src="https://trendshift.io/api/badge/repositories/21823" alt="Wei-Shaw%2Fsub2api | Trendshift" width="250" height="55"/></a>
+
+**サブスクリプションクォータ配分のための AI API ゲートウェイプラットフォーム**
+
+[English](README.md) | [中文](README_CN.md) | 日本語
+
+</div>
+
+## ⚠️ 重要なお知らせ
+
+本プロジェクトをご利用になる前に、以下の内容を必ずよくお読みください:
+
+- **🚨 利用規約のリスク**:本プロジェクトの使用は、Anthropic をはじめとする上流プロバイダーの利用規約に違反する可能性があります。ご利用前に各プロバイダーのユーザー規約を必ずご確認ください。使用により生じるすべてのリスクはユーザーご自身が負うものとします。
+- **⚖️ 法令遵守**:お住まいの国または地域の法令を遵守した上で本プロジェクトをご利用ください。いかなる違法な目的での使用も固く禁じます。
+- **📖 免責事項**:本プロジェクトは技術的な学習および研究の目的でのみ提供されます。本プロジェクトの使用により生じたアカウントの停止、サービスの中断、データの損失、その他一切の直接的または間接的な損害について、作者は一切の責任を負いません。
+- **🚫 商用利用の非許諾**:本プロジェクトの開発者は、いかなる個人または組織に対しても、本プロジェクトを利用したいかなる形態の商業運営も一切許諾していません。本プロジェクトの名義で、または本プロジェクトに基づいて行われる商業行為はすべて本プロジェクトおよびその開発者とは無関係であり、それにより生じる一切の紛争、損失、法的責任は行為者自身が負うものとします。
+
+## ❤️ スポンサー
+
+> [こちらに掲載しませんか?](mailto:support@sub2api.org)
+
+<table>
+
+<tr>
+<td width="180"><a href="https://cctk.ai/register?aff=SUB2API"><img src="assets/partners/logos/cctk.jpg" alt="CCTK.AI" width="150"></a></td>
+<td>CCTK.AI のご支援に感謝します!<a href="https://cctk.ai/register?aff=SUB2API">CCTK.AI</a> は安定性とコストパフォーマンスにこだわった AI API ゲートウェイで、Claude、OpenAI、Gemini など主要モデルの高速中継サービスを提供しています。Claude Code や Codex などの主要なコーディングツールにシームレスに対応し、公式価格を大きく下回るコストで同等のモデル能力を利用できます。<a href="https://cctk.ai/register?aff=SUB2API">こちらのリンク</a>から登録して、より速く、より安定した、よりお得な AI API 接続をお試しください。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.openmodel.ai?ref=sub2api"><img src="assets/partners/logos/openmodel.jpg" alt="openmodel" width="150"></a></td>
+<td>1つの API で、トップモデルを使い放題!<a href="https://www.openmodel.ai?ref=sub2api">OpenModel</a> は本番環境グレードで高可用性の AI API ゲートウェイに特化し、アプリを真に高速・安定させます:自動フェイルオーバー、最適なチャネルへのスマートルーティング、本番グレードの SLA 保証。単一プロバイダーをはるかに上回る SLA で、安定性をあなたの核心的な競争力にします。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://etok.ai"><img src="assets/partners/logos/etok.png" alt="ETok" width="150"></a></td>
+<td>ETok.ai のご支援に感謝します!ETok.ai はワンストップ AI プログラミングツールサービスプラットフォームの構築に取り組んでいます。Claude Code の専用プランと技術コミュニティサービスを提供し、Google Gemini や OpenAI Codex もサポートしています。丁寧に設計されたプランと専門的な技術コミュニティを通じて、開発者に安定したサービス保証と継続的な技術サポートを提供し、AI アシスト プログラミングを真の生産性向上ツールにします。<a href="https://etok.ai">こちら</a>から登録!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://apikey.fun/register?aff=SUB2API"><img src="assets/partners/logos/apikey-fun.png" alt="APIKEY.FUN" width="150"></a></td>
+<td>APIKEY.FUN のご支援に感謝します!<a href="https://apikey.fun/register?aff=SUB2API">APIKEY.FUN</a> は sub2api オープンソースプロジェクトのコアコントリビューターの一つであり、オープンで安定した、コストパフォーマンスに優れた AI API アクセスサービスの提供に取り組んでいます。プラットフォームは Claude、OpenAI、Gemini など人気モデルの API 中継サービスをサポートし、価格は公式料金のわずか 7% から。専用リンク <a href="https://apikey.fun/register?aff=SUB2API">APIKEY</a> から登録すると、すべてのチャージで永久 5% 割引をご利用いただけます。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://aigocode.com/invite/SUB2API"><img src="assets/partners/logos/aigocode.png" alt="AIGoCode" width="150"></a></td>
+<td>AIGoCode のご支援に感謝します!AIGoCode は Claude Code、Codex、最新の Gemini モデルを統合したオールインワンプラットフォームで、安定的かつ効率的でコストパフォーマンスに優れた AI コーディングサービスを提供します。柔軟なサブスクリプションプラン、アカウント停止リスクゼロ、VPN 不要の直接アクセス、超高速レスポンスが特長です。AIGoCode は sub2api ユーザー向けに特別特典を用意しています:<a href="https://aigocode.com/invite/SUB2API">こちらのリンク</a>から登録すると、初回チャージ時に 10% のボーナスクレジットを追加プレゼント!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://codex-everywhere.com"><img src="assets/partners/logos/codex-everywhere.jpg" alt="CodexEverywhere" width="150"></a></td>
+<td>OpenAI 公式価格のわずか 3% で本物の GPT-5.6 シリーズを提供 — <a href="https://codex-everywhere.com">CodexEverywhere</a> は世界中の開発者にフロンティアモデルへのアクセスを民主化しています。私たちは透明性と誠実さを信条とし、モデル品質は数か月にわたるアクティブなコミュニティの監視によって検証されています。USD および暗号通貨に対応。<a href="https://codex-everywhere.com">codex-everywhere.com</a> で $20 の無料トライアルから始めましょう。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://shop.bmoplus.com/?utm_source=github"><img src="assets/partners/logos/bmoplus.jpg" alt="bmoplus" width="150"></a></td>
+<td>本プロジェクトにご支援いただいた BmoPlus に感謝いたします!BmoPlusは、AIサブスクリプションのヘビーユーザー向けに特化した信頼性の高いAIアカウントサービスプロバイダーであり、安定した ChatGPT Plus / ChatGPT Pro (完全保証) / Claude Pro / Super Grok / Gemini Pro の公式代行チャージおよび即納アカウントを提供しています。こちらの<a href="https://shop.bmoplus.com/?utm_source=github">BmoPlus AIアカウント専門店/代行チャージ</a>経由でご登録・ご注文いただいたユーザー様は、GPTを 公式サイト価格の約1割(90% OFF) という驚異的な価格でご利用いただけます!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://bestproxy.com/?keyword=a2e8iuol"><img src="assets/partners/logos/bestproxy.png" alt="bestproxy" width="150"></a></td>
+<td>Bestproxy のご支援に感謝します!<a href="https://bestproxy.com/?keyword=a2e8iuol">Bestproxy</a> は高純度の住宅IPを提供し、1アカウント1IP専有をサポートしています。実際の家庭ネットワークとフィンガープリント分離を組み合わせることで、リンク環境の分離を実現し、関連付けによるリスク管理の確率を低減します。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://pateway.ai/?ch=1tsfr51"><img src="assets/partners/logos/pateway.png" alt="pateway" width="150"></a></td>
+<td>PatewayAI のご支援に感謝します!PatewayAI は、ヘビーAI開発者向けに公式直結を重視した高品質モデルAPIリレーサービスプロバイダーです。Claude 全シリーズおよび Codex シリーズモデルを提供し、100%公式ソースから直接供給 — 偽りなし、水増しなし、検証歓迎。課金は完全透明で、トークン単位の請求書を1件ずつ監査可能です。
+エンタープライズ級の高同時接続にも対応し、法人顧客向けに専用管理プラットフォームを提供しています。法人顧客は正式な契約を締結し、請求書の発行が可能です。詳細は公式サイトでお問い合わせください。
+<a href="https://pateway.ai/?ch=1tsfr51">こちらのリンク</a>から登録すると、$3 のトライアルクレジットがもらえます。チャージは最大40%オフ、友達紹介で双方にボーナス付与 — 紹介報酬は最大 $150。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://api.pptoken.cc/register?promo=SUB2API"><img src="assets/partners/logos/pptoken.png" alt="pptoken" width="150"></a></td>
+<td>PPToken.cc のご支援に感謝します!<a href="https://api.pptoken.cc/register?promo=SUB2API">PPToken.cc</a> は GPT シリーズモデルの API 中継サービスを専門としており、Codex、Claude Code、OpenAI 互換クライアント、Gemini CLI などのツール接続をサポートしています。チャージは 1:1(1元=1ドル分のクレジット)、GPT モデルは最低 0.16 倍のレート倍率で、総合コストは公式価格の約 2.2% 、最速ファーストトークンは約1秒 — 開発者が低コスト・高速レスポンスで GPT モデル機能にアクセスするのに最適です。テクニカルサポート:24時間365日リアルな人間が対応(ボットではありません)、グループ内で @技術 すれば 10 分以内に返信。スポンサー特典:先着 200 名のユーザーが<a href="https://api.pptoken.cc/register?promo=SUB2API">専用登録リンク</a>から登録し、プロモコード `SUB2API` を入力すると、Codex / Claude Code の無料トライアルクレジットを獲得できます — 最低利用額なし、カード登録不要。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://veilx.io/#/hello/SJRBRVDV"><img src="assets/partners/logos/veilx.png" alt="veilx" width="150"></a></td>
+<td>Veilx のご支援に感謝します!<a href="https://veilx.io/#/hello/SJRBRVDV">Veilx</a> CDN は超大規模 API リクエストシナリオ向けに設計されており、AI 中継サービスと AI API 呼び出しチェーンに対して深く最適化されています。高並列・高頻度リクエスト・大容量トラフィックに容易に対応し、開発者と企業により高速で安定した、低レイテンシの加速体験を提供します。OpenAI、Claude、Gemini などの AI インターフェース中継はもちろん、チャット、画像生成、Embedding、ストリーミング出力などの複雑なシナリオでも、Veilx は応答速度と接続安定性を大幅に向上させ、ネットワーク変動によるタイムアウトや失敗を効果的に削減します。さらに、Veilx は中国三大ネットワーク最適化の高速回線を提供しており、中国本土から海外 AI サービスへのアクセス速度と安定性を大幅に向上させます。グローバル AI 中継プラットフォーム、海外 AI SaaS、越境ビジネス、高並列 API システム展開に特に適しています。AI API のために生まれ、あなたの AI 中継サービスをより速く、より安定して、より安心に。<a href="https://veilx.io/#/hello/SJRBRVDV">購入リンク</a>
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://roxybrowser.com/invite/bgGKG7"><img src="assets/partners/logos/RoxyBrowser.png" alt="RoxyBrowser" width="150"></a></td>
+<td>RoxyBrowser のご支援に感謝します!<a href="https://roxybrowser.com/invite/bgGKG7">RoxyBrowser</a> は Sub2API の理想的なパートナーです:ネイティブ統合された Roxy AI Agent と高品質なネイティブ住宅 IP を搭載し、シンプルなコマンドで一括自動化をサポート、マルチアカウント管理のセキュリティと効率を大幅に向上させます!<a href="https://roxybrowser.com/invite/bgGKG7">このリンク</a>から登録すると、無料の住宅 IP パッケージと生涯 10% 割引を獲得できます。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.proxy4free.com/?keyword=4yjqecpc"><img src="assets/partners/logos/proxy4free.png" alt="proxy4free" width="150"></a></td>
+<td>Proxy4Free のご支援に感謝します!Proxy4Free は開発者と AI アプリケーション向けのデータプロキシサービスプロバイダーで、住宅プロキシ、静的住宅プロキシ、ISP プロキシ、データセンタープロキシなど多様なプロキシソリューションを提供しており、Web Scraping、Browser Automation、AI Agent などのシナリオに適しています。グローバル IP リソース、安定した接続、柔軟な切り替えをサポートし、開発者のデータ収集成功率の向上と IP ブロックリスクの低減を支援します。<a href="https://www.proxy4free.com/?keyword=4yjqecpc">こちらのリンクから登録</a>して、より安定した効率的な自動化ワークフローを簡単に構築しましょう。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="http://www.fastaitoken.com/register"><img src="assets/partners/logos/fastaitoken.jpg" alt="fastaitoken" width="150"></a></td>
+<td>🎉 FastAIToken のご支援に感謝します!<a href="http://www.fastaitoken.com/register">FastAIToken</a> は開発者向けの AI API アグリゲーションプラットフォームで、OpenAI、Claude、Gemini などの主要な大規模モデルに対応しています。チャージは 1:1(1 元 = 1 米ドル分の API クレジット)で、開発者がより低コスト・より手軽に世界トップクラスの大規模モデルサービスを利用できます。<br>
+
+🚀 プラットフォームでは多彩なチャネルを自由に選択できます:超低価格の 0.02x OpenAI 特典グループ(期間限定)、最低 0.25x の OpenAI グループ、0.7x Claude(95% 固定キャッシュ)、1.2x Claude Max チャネル。さらに、各グループの可用率・レイテンシ・稼働状況をリアルタイムで表示する公開ステータスページを提供し、透明で信頼できるサービスを実現。7×24 時間の有人テクニカルサポート(ボットではありません)により、開発者のニーズに迅速に対応します。
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="http://aimzoon.com"><img src="assets/partners/logos/aimzoon.jpg" alt="aimzoon" width="150"></a></td>
+<td>Aimzoon のご支援に感謝します!<a href="http://aimzoon.com">Aimzoon</a> は安定してコストパフォーマンスに優れた AI API 接続サービスを提供し、開発者が主要な AI サービスを Codex、Claude Code、Gemini CLI などのコーディングツールへ素早く接続できるようにします。複雑な設定は不要で、より速い接続、より安定した呼び出し、より低いコストを実現。Codex レート割引や特価レートなどのキャンペーンも随時開催中、登録するだけで無料お試しクレジットをプレゼント。AI コーディングを日常のワークフローへ。<a href="http://aimzoon.com">こちら</a>から登録してお試しください!
+</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://nagora.ai/"><img src="assets/partners/logos/nagora.png" alt="Nagora" width="150"></a></td>
+<td><a href="https://nagora.ai/">Nagora</a>は、開発者やチーム向けに設計されたマルチモデルAI APIゲートウェイです。1つのアカウントと1つのAPIキーだけで、26種類以上の主要なテキストモデルおよび画像モデルを一元的に利用できます。OpenAI、Anthropic、Geminiの各プロトコルに対応し、Claude Code、Codex、Gemini CLIなどの開発ツールにもシームレスに接続できます。 プラットフォームには、インテリジェントルーティング、自動フェイルオーバー、透明性の高い料金体系、請求の一元管理に加え、予算管理、レート制限、同時実行数の制御機能が備わっています。これにより、個人開発、チームでの共同作業、本番環境におけるAI APIの利用を、より安定的かつ柔軟に管理できます。 既存のアプリケーションを改修する必要はありません。Base URLとAPIキーを置き換えるだけで、最短1分で導入を完了できます。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://s.qiniu.com/u6rQrq"><img src="assets/partners/logos/qiniu.jpg" alt="Qiniu AI" width="150"></a></td>
+<td>七牛云AI のご支援に感謝します!七牛云AI は、七牛云(02567.HK)傘下のエンタープライズ向け大規模モデル MaaS プラットフォームです。世界の主要モデル 150+ をワンストップで利用でき、グローバル主要モデルプロバイダーのプロトコルに対応し、テキスト、画像、音声、動画、ファイル処理などのフルモーダル処理能力をカバー。169万を超える企業・開発者ユーザーにサービスを提供しています。Sub2API ユーザー向けの限定特典として、<a href="https://s.qiniu.com/u6rQrq">こちらのリンク</a>から登録すると、企業ユーザーは 1200万 Token、開発者は 300万 Token を無料で獲得できます。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://api.fenno.ai/s/dC4k"><img src="assets/partners/logos/fennoai.jpg" alt="FennoAI" width="150"></a></td>
+<td>FennoAI のご支援に感謝します!FennoAI は、企業の研究開発チームと開発者向けの高安定・高性能 API 中継サービスプロバイダーです。OpenAI と Anthropic のプロトコルに対応し、Codex、Claude Code、OpenCode などの主要 AI コーディングツールにシームレスに接続できます。エンタープライズ級の安定性を備え、1 日あたり千億規模の Token 呼び出しに対応。国内外法人間の企業間決済と請求書発行もサポートし、企業の研究開発・調達ニーズに応えます。Sub2API ユーザー限定特典として、<a href="https://api.fenno.ai/s/dC4k">専用リンク</a>からサブスクリプションを購入すると、わずか 1.99 ドルで 50 ドル相当の Coding Plan クレジットを獲得できます。さらに招待報酬にも対応しており、友達の購入で最大 20% の還元を獲得可能。招待が多いほど、報酬も増えます。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://lanox.ai/?c=6"><img src="assets/partners/logos/lanox.jpg" alt="LanoX AI" width="150"></a></td>
+<td>本プロジェクトをご支援いただいている <a href="https://lanox.ai/?c=6">LanoX AI</a> に感謝します!LanoX AI は、開発者、チーム、企業向けに、安定性とコストパフォーマンスに優れたグローバルモデル接続サービスを提供しています。 🎁 新規ユーザー特典 — 数百万 Token を無料で獲得可能。さらに 500+ の無料モデルで、低コストなテスト、検証、デプロイをより簡単に 🧠 世界の主要モデル — GPT · Claude · Gemini · Qwen · Grok... 🎬 マルチモーダル制作 — Seedance 2.0 · GPT Image · Gemini Nano Banana 🛡️ エンタープライズ級の安定性 — 高可用性 💎 ネイティブ能力の出力 💎 性能劣化なし 💎 モデル混在なし 💎 利用量と課金が透明 💎 💰 より低い利用コスト — トップモデルを公式価格の 1 割から利用可能。明確なドキュメント、簡単な接続、請求書発行、企業向け一括利用に対応 🏢 企業に最適 — AI プロダクト、Agent、コンテンツプラットフォーム、大量利用する開発チームに最適</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.rapidproxy.io/?ref=sub2api"><img src="assets/partners/logos/rapidproxy.jpg" alt="RapidProxy" width="150"></a></td>
+<td><a href="https://www.rapidproxy.io/?ref=sub2api">RapidProxy</a> は開発者向けのデータ収集プロキシソリューションであり、安定して信頼できる住宅用プロキシサービスを提供します。9,000 万以上のグローバル住宅 IP と 200 以上の国・地域のカバー、インテリジェントなローテーション機構、精密な地域ターゲティング機能により、クローラー、AI データ学習、SEO モニタリング、EC データ分析などのプロジェクトがアクセス制限を突破し、データ収集の効率を高めます。Playwright、Selenium、Puppeteer などの主要な自動化フレームワークに対応し、料金は $0.65/GB から。<a href="https://www.rapidproxy.io/?ref=sub2api">今すぐ無料でお試しください</a>。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://hao.ai"><img src="assets/partners/logos/haoai.png" alt="hao.ai" width="150"></a></td>
+<td><a href="https://hao.ai">hao.ai</a> は、開発者とチーム向けの高速で安定した大規模モデル統合 API ゲートウェイです。1 つの API Key と統一されたインターフェースで、GPT、Claude、xAI Grok などの主要モデルに接続でき、OpenAI や Anthropic などの一般的なプロトコルと SDK に対応しています。プラットフォームはモデルルーティング、フェイルオーバー、チーム管理、完全な呼び出しログを提供し、モデル価格は公式参考価格の 1.5 割から。よりシンプルに、より安定して、より低コストに AI アプリケーションを構築できます。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.swiftproxy.net/?ref=sub2api"><img src="assets/partners/logos/swiftprox.png" alt="Swiftproxy" width="150"></a></td>
+<td>Swiftproxy は開発者向けの高性能プロキシソリューションで、安定して信頼できるレジデンシャルおよび静的レジデンシャルプロキシサービスを提供します。9,000 万以上のクリーンな住宅 IP を保有し、グローバルカバレッジ、柔軟なローテーション、精密なジオターゲティングにより、Web スクレイピング、AI オートメーション、ブラウザ自動化、SEO モニタリング、マルチアカウント管理などのプロジェクトがアクセス制限を克服し、ワークフロー効率を向上させます。HTTP(S) および SOCKS5 プロトコルに対応し、Playwright、Selenium、Puppeteer などの主要な自動化ツールと統合可能。動的プロキシトラフィックは使い切るまで期限切れなし、無料テストも利用可能 — <a href="https://www.swiftproxy.net/?ref=sub2api">今すぐ無料テストを開始</a>!</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.duckip.cn/?keyword=cu7oog6y"><img src="assets/partners/logos/duckip.png" alt="DuckIP" width="150"></a></td>
+<td><a href="https://www.duckip.cn/?keyword=cu7oog6y">DuckIP</a> - 195 以上の国と地域にわたる 9,000 万以上のグローバルレジデンシャルネットワークリソース。ローテーションとスティッキーセッションに対応し、パブリックデータ収集、RAG 更新、モデル評価、マルチリージョンデータワークロードに最適。🟢レジデンシャルプロキシ - 20% オフ;🟢スタティックレジデンシャルプロキシ - ¥50.00/IP から;🟢無制限レジデンシャルプロキシ - ¥19.8/時間 から。✅500M 無料トライアルを取得。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://go.apimart.ai/gh-sub2api"><img src="assets/partners/logos/apimart.jpg" alt="APIMart" width="150"></a></td>
+<td>APIMart のご支援に感謝します!<a href="https://go.apimart.ai/gh-sub2api">APIMart</a> は AI 画像・動画生成に特化した低価格 API プラットフォームです。GPT-Image-2 は 1 枚 $0.006 から、1 ドルで 160 枚以上の画像を生成できます。画像と動画の両方に対応する非同期 API を 1 つで利用でき、タスクを送信して ID を取得し、ポーリングまたはコールバックで結果を取得できます。数万枚規模のバッチ処理でもタイムアウトせず、モデルを変更してもコードの変更は不要です。月額料金なしの従量課金制で、<a href="https://go.apimart.ai/gh-sub2api">こちらの登録リンク</a>からすぐに利用を開始できます。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://www.axisnow.io/"><img src="assets/partners/logos/axisnow.jpg" alt="AxisNow" width="150"></a></td>
+<td>AxisNow のご支援に感謝します!<a href="https://www.axisnow.io/">AxisNow</a> はウェブサイトと API を保護・高速化し、中国本土および世界中で快適なアクセス体験を実現します。クライアント SDK により、ネイティブ/モバイルアプリにも高速化・セキュリティ機能を拡張できます — <strong>自社構築・プライベートデプロイ CDN</strong>|<strong>サブスクリプション型高防御 CDN</strong>|<strong>自律制御で柔軟に組み合わせられる CDN ネットワーク</strong>。</td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://pp.dog/register?aff=SUB2API"><img src="assets/partners/logos/ppdog.png" alt="PP.dog" width="150"></a></td>
+<td><a href="https://pp.dog/register?aff=SUB2API">PP.dog</a> は自社運用の大規模アカウントプールを持つソースレベルの API ゲートウェイで、下流の中継ステーションや高頻度開発者向けに API ゲートウェイリレーサービスを提供し、アカウントプールの自主構築にかかるすべての手間を省きます。✅ ソース直供:自社運用の大規模アカウントプール、中間マージンなし;🧧 コスト最強:総合レート倍率わずか 0.03x、コストは公式の 0.35% のみ;🚀 超高速体験:ファーストトークンレイテンシ 1 秒未満、公式ネイティブ API に匹敵するスムーズさ。<a href="https://www.pp.dog/register?aff=SUB2API">今すぐ PP.dog に接続</a></td>
+</tr>
+
+<tr>
+<td width="180"><a href="https://colaproxy.com/?utm_source=sub2api&utm_medium=sub2api&ref=sub2api"><img src="assets/partners/logos/cola-proxy.jpg" alt="ColaProxy" width="150"></a></td>
+<td>ColaProxy は、Web スクレイピング、自動化、マルチアカウント管理向けに構築された高品質な住宅プロキシを提供します。有効期限なしのトラフィックで無料トライアルが利用でき、料金は $0.3/GB から、無制限の同時接続とインテリジェントな IP ローテーションにより、よりスムーズで安定したプロキシ体験を実現します。割引コード COLA10 で 10% オフ、信頼性の高い住宅プロキシでプロジェクトを今すぐスケールしましょう。<a href="https://colaproxy.com/?utm_source=sub2api&utm_medium=sub2api&ref=sub2api">ColaProxy を始める</a></td>
+</tr>
+
+</table>
+
+## 概要
+
+Sub2API は、AI 製品のサブスクリプションから API クォータを配分・管理するために設計された AI API ゲートウェイプラットフォームです。ユーザーはプラットフォームが生成した API キーを通じて上流の AI サービスにアクセスでき、プラットフォームは認証、課金、負荷分散、リクエスト転送を処理します。
+
+## 機能
+
+- **マルチアカウント管理** - 複数の上流アカウントタイプ(OAuth、APIキー)をサポート
+- **APIキー配布** - ユーザー向けの APIキーの生成と管理
+- **精密な課金** - トークンレベルの使用量追跡とコスト計算
+- **スマートスケジューリング** - スティッキーセッション付きのインテリジェントなアカウント選択
+- **同時実行制御** - ユーザーごと・アカウントごとの同時実行数制限
+- **レート制限** - 設定可能なリクエスト数およびトークンレート制限
+- **内蔵決済システム** - EasyPay、Alipay、WeChat Pay、Stripe に対応。ユーザーのセルフサービスチャージが可能で、別途決済サービスのデプロイは不要([設定ガイド](docs/PAYMENT.md))
+- **管理ダッシュボード** - 監視・管理のための Web インターフェース
+- **外部システム連携** - 外部システム(チケット管理など)を iframe 経由で管理ダッシュボードに埋め込み可能
+
+## エコシステム
+
+Sub2API を拡張・統合するコミュニティプロジェクト:
+
+| プロジェクト | 説明 | 機能 |
+|---------|-------------|----------|
+| ~~[Sub2ApiPay](https://github.com/touwaeriol/sub2apipay)~~ | ~~セルフサービス決済システム~~ | **内蔵済み** — 決済機能は Sub2API に統合されました。別途デプロイは不要です。[決済設定ガイド](docs/PAYMENT.md)をご参照ください |
+| [sub2api-mobile](https://github.com/ckken/sub2api-mobile) | モバイル管理コンソール | ユーザー管理、アカウント管理、監視ダッシュボード、マルチバックエンド切り替えが可能なクロスプラットフォームアプリ(iOS/Android/Web)。Expo + React Native で構築 |
+
+## 技術スタック
+
+| コンポーネント | 技術 |
+|-----------|------------|
+| バックエンド | Go 1.27.0, Gin, Ent |
+| フロントエンド | Vue 3.4+, Vite 5+, TailwindCSS |
+| データベース | PostgreSQL 15+ |
+| キャッシュ/キュー | Redis 7+ |
+
+---
+
+## Nginx リバースプロキシに関する注意
+
+Sub2API(または CRS)を Nginx でリバースプロキシし、Codex CLI と組み合わせて使用する場合、Nginx の `http` ブロックに以下の設定を追加してください:
+
+```nginx
+underscores_in_headers on;
+```
+
+Nginx はデフォルトでアンダースコアを含むヘッダー(例: `session_id`)を破棄するため、マルチアカウント構成でのスティッキーセッションルーティングに支障をきたします。
+
+---
+
+## デプロイ
+
+### 方法1: スクリプトによるインストール(推奨)
+
+GitHub Releases からビルド済みバイナリをダウンロードするワンクリックインストールスクリプトです。
+
+#### 前提条件
+
+- Linux サーバー(amd64 または arm64)
+- PostgreSQL 15+(インストール済みかつ稼働中)
+- Redis 7+(インストール済みかつ稼働中)
+- root 権限
+
+#### インストール手順
+
+```bash
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash
+```
+
+スクリプトは以下を実行します:
+1. システムアーキテクチャの検出
+2. 最新リリースのダウンロード
+3. バイナリを `/opt/sub2api` にインストール
+4. systemd サービスの作成
+5. システムユーザーと権限の設定
+
+#### インストール後の作業
+
+```bash
+# 1. サービスを起動
+sudo systemctl start sub2api
+
+# 2. 起動時の自動起動を有効化
+sudo systemctl enable sub2api
+
+# 3. ブラウザでセットアップウィザードを開く
+# http://YOUR_SERVER_IP:8080
+```
+
+セットアップウィザードでは以下の設定を行います:
+- データベース設定
+- Redis 設定
+- 管理者アカウントの作成
+
+#### アップグレード
+
+**管理ダッシュボード**の左上にある**アップデートを確認**ボタンをクリックすることで、ダッシュボードから直接アップグレードできます。
+
+Web インターフェースでは以下が可能です:
+- 新しいバージョンの自動確認
+- ワンクリックでのアップデートのダウンロードと適用
+- 必要に応じたロールバック
+
+#### よく使うコマンド
+
+```bash
+# ステータスを確認
+sudo systemctl status sub2api
+
+# ログを表示
+sudo journalctl -u sub2api -f
+
+# サービスを再起動
+sudo systemctl restart sub2api
+
+# アンインストール
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash -s -- uninstall -y
+```
+
+---
+
+### 方法2: Docker Compose(推奨)
+
+PostgreSQL と Redis のコンテナを含む Docker Compose でデプロイします。
+
+#### 前提条件
+
+- Docker 20.10+
+- Docker Compose v2+
+
+#### クイックスタート(ワンクリックデプロイ)
+
+自動デプロイスクリプトを使用して簡単にセットアップできます:
+
+```bash
+# デプロイ用ディレクトリを作成
+mkdir -p sub2api-deploy && cd sub2api-deploy
+
+# デプロイ準備スクリプトをダウンロードして実行
+curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh | bash
+
+# サービスを起動
+docker compose up -d
+
+# ログを表示
+docker compose logs -f sub2api
+```
+
+**スクリプトの動作内容:**
+- `docker-compose.local.yml`(`docker-compose.yml` として保存)と `.env.example` をダウンロード
+- セキュアな認証情報(JWT_SECRET、TOTP_ENCRYPTION_KEY、POSTGRES_PASSWORD)を自動生成
+- 自動生成されたシークレットで `.env` ファイルを作成
+- データディレクトリを作成(バックアップ・移行が容易なローカルディレクトリを使用)
+- 生成された認証情報を参照用に表示
+
+#### 手動デプロイ
+
+手動でセットアップする場合:
+
+```bash
+# 1. リポジトリをクローン
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api/deploy
+
+# 2. 環境設定ファイルをコピー
+cp .env.example .env
+chmod 600 .env
+
+# 3. 設定を編集(セキュアなパスワードを生成)
+nano .env
+```
+
+**`.env` の必須設定:**
+
+```bash
+# PostgreSQL パスワード(必須)
+POSTGRES_PASSWORD=your_secure_password_here
+
+# JWT シークレット(推奨 - 再起動後もユーザーのログイン状態を保持)
+JWT_SECRET=your_jwt_secret_here
+
+# TOTP 暗号化キー(推奨 - 再起動後も二要素認証を維持)
+TOTP_ENCRYPTION_KEY=your_totp_key_here
+
+# オプション: 管理者アカウント
+ADMIN_EMAIL=admin@example.com
+ADMIN_PASSWORD=your_admin_password
+
+# オプション: カスタムポート
+SERVER_PORT=8080
+```
+
+**セキュアなシークレットの生成方法:**
+```bash
+# JWT_SECRET を生成
+openssl rand -hex 32
+
+# TOTP_ENCRYPTION_KEY を生成
+openssl rand -hex 32
+
+# POSTGRES_PASSWORD を生成
+openssl rand -hex 32
+```
+
+```bash
+# 4. データディレクトリを作成(ローカルバージョンの場合)
+mkdir -p data postgres_data redis_data
+
+# 5. すべてのサービスを起動
+# オプション A: ローカルディレクトリバージョン(推奨 - 移行が容易)
+docker compose -f docker-compose.local.yml up -d
+
+# オプション B: 名前付きボリュームバージョン(シンプルなセットアップ)
+docker compose up -d
+
+# 6. ステータスを確認
+docker compose -f docker-compose.local.yml ps
+
+# 7. ログを表示
+docker compose -f docker-compose.local.yml logs -f sub2api
+```
+
+#### デプロイバージョン
+
+| バージョン | データストレージ | 移行 | 推奨用途 |
+|---------|-------------|-----------|----------|
+| **docker-compose.local.yml** | ローカルディレクトリ | ✅ 容易(ディレクトリ全体を tar) | 本番環境、頻繁なバックアップ |
+| **docker-compose.yml** | 名前付きボリューム | ⚠️ docker コマンドが必要 | シンプルなセットアップ |
+
+**推奨:** データ管理が容易な `docker-compose.local.yml`(スクリプトによるデプロイ)を使用してください。
+
+#### アクセス
+
+ブラウザで `http://YOUR_SERVER_IP:8080` を開いてください。
+
+管理者パスワードが自動生成された場合は、ログで確認できます:
+```bash
+docker compose -f docker-compose.local.yml logs sub2api | grep "admin password"
+```
+
+#### アップグレード
+
+```bash
+# 最新イメージをプルしてコンテナを再作成
+docker compose -f docker-compose.local.yml pull
+docker compose -f docker-compose.local.yml up -d
+```
+
+#### 簡単な移行(ローカルディレクトリバージョン)
+
+`docker-compose.local.yml` を使用している場合、新しいサーバーへの移行が簡単です:
+
+```bash
+# 移行元サーバーにて
+docker compose -f docker-compose.local.yml down
+cd ..
+tar czf sub2api-complete.tar.gz sub2api-deploy/
+
+# 新しいサーバーに転送
+scp sub2api-complete.tar.gz user@new-server:/path/
+
+# 移行先サーバーにて
+tar xzf sub2api-complete.tar.gz
+cd sub2api-deploy/
+docker compose -f docker-compose.local.yml up -d
+```
+
+#### よく使うコマンド
+
+```bash
+# すべてのサービスを停止
+docker compose -f docker-compose.local.yml down
+
+# 再起動
+docker compose -f docker-compose.local.yml restart
+
+# すべてのログを表示
+docker compose -f docker-compose.local.yml logs -f
+
+# すべてのデータを削除(注意!)
+docker compose -f docker-compose.local.yml down
+rm -rf data/ postgres_data/ redis_data/
+```
+
+---
+
+### 方法3: Apple container(macOS)
+
+Apple シリコン搭載 Mac と macOS 26 では、Apple `container` 1.1.0 以降を使用して Sub2API、PostgreSQL、Redis の完全なスタックを実行できます:
+
+```bash
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api/deploy
+./apple-container.sh init
+./apple-container.sh up
+./apple-container.sh status
+```
+
+これはローカル開発および手動運用向けです。本番環境では引き続き Docker Compose を推奨します。ライフサイクル、永続化、アップグレード、制限については [deploy/APPLE_CONTAINER.md](deploy/APPLE_CONTAINER.md) を参照してください。
+
+---
+
+### 方法4: ソースからビルド
+
+開発やカスタマイズのためにソースコードからビルドして実行します。
+
+#### 前提条件
+
+- Go 1.21+
+- Node.js 18+
+- PostgreSQL 15+
+- Redis 7+
+
+#### ビルド手順
+
+```bash
+# 1. リポジトリをクローン
+git clone https://github.com/Wei-Shaw/sub2api.git
+cd sub2api
+
+# 2. pnpm をインストール(未インストールの場合)
+npm install -g pnpm
+
+# 3. フロントエンドをビルド
+cd frontend
+pnpm install
+pnpm run build
+# 出力先: ../backend/internal/web/dist/
+
+# 4. フロントエンドを組み込んだバックエンドをビルド
+cd ../backend
+VERSION="$(./scripts/resolve-version.sh)"
+go build -tags embed -ldflags="-X main.Version=${VERSION}" -o sub2api ./cmd/server
+
+# 5. 設定ファイルを作成
+cp ../deploy/config.example.yaml ./config.yaml
+
+# 6. 設定を編集
+nano config.yaml
+```
+
+> **注意:** `-tags embed` フラグはフロントエンドをバイナリに組み込みます。このフラグがない場合、バイナリはフロントエンド UI を提供しません。
+
+**`config.yaml` の主要設定:**
+
+```yaml
+server:
+  host: "0.0.0.0"
+  port: 8080
+  mode: "release"
+
+database:
+  host: "localhost"
+  port: 5432
+  user: "postgres"
+  password: "your_password"
+  dbname: "sub2api"
+
+redis:
+  host: "localhost"
+  port: 6379
+  password: ""
+
+jwt:
+  secret: "change-this-to-a-secure-random-string"
+  expire_hour: 24
+
+default:
+  user_concurrency: 5
+  user_balance: 0
+  api_key_prefix: "sk-"
+  rate_multiplier: 1.0
+```
+
+`config.yaml` では追加のセキュリティ関連オプションも利用できます:
+
+- `cors.allowed_origins` - CORS 許可リスト
+- `security.url_allowlist` - 上流/価格/CRS ホストの許可リスト
+- `security.url_allowlist.enabled` - URL バリデーションの無効化(注意して使用)
+- `security.url_allowlist.allow_insecure_http` - バリデーション無効時に HTTP URL を許可
+- `security.url_allowlist.allow_private_hosts` - プライベート/ローカル IP アドレスを許可
+- `security.response_headers.enabled` - 設定可能なレスポンスヘッダーフィルタリングを有効化(無効時はデフォルトの許可リストを使用)
+- `security.csp` - Content-Security-Policy ヘッダーの制御
+- `billing.circuit_breaker` - 課金エラー時にフェイルクローズ
+- `security.trust_forwarded_ip_for_api_key_acl` - 従来の生転送ヘッダーによる上書きを制御(アップグレード互換性のため既定で有効)。無効にすると `server.trusted_proxies` を厳格に使用し、Sub2API に直接接続するプロキシの正確な CIDR のみを指定
+- `security.forwarded_client_ip_headers` - サードパーティ CDN のクライアント IP ヘッダーを最大 16 個指定。従来モードが有効な場合のみ、設定順で組み込みヘッダーより先に評価
+- `turnstile.required` - リリースモードでの Turnstile 必須化
+
+カスタムクライアント IP ヘッダーは YAML またはカンマ区切りの環境変数で設定できます:
+
+```bash
+SECURITY_FORWARDED_CLIENT_IP_HEADERS=True-Client-IP,X-CDN-Client-IP
+```
+
+ヘッダー名は検証、正規化、大小文字を区別しない重複排除が行われます。管理画面のセキュリティ設定から再起動せずに更新でき、新規インストールでは YAML/環境変数の既定値を保存し、既存環境ではデータベース値がない場合に補完します。従来モードを無効にするとカスタムおよび組み込みの生転送ヘッダーはすべて無視され、`server.trusted_proxies` のみを使用します。有効にする場合はオリジンへの接続元を CDN/プロキシに制限し、エッジで信頼する全クライアント IP ヘッダーを上書きしてください。移行規則と信頼境界の詳細は [`deploy/EDGE_SECURITY.md`](deploy/EDGE_SECURITY.md) を参照してください。
+
+**⚠️ セキュリティ警告: HTTP URL 設定**
+
+`security.url_allowlist.enabled=false` の場合、システムは最小限の URL バリデーションのみを行い、**デフォルトで HTTP URL を許可**します(開発フレンドリーモード。Docker Compose デプロイのデフォルトも同じです)。本番環境では、以下のように明示的に HTTPS のみに制限することを推奨します:
+
+```yaml
+security:
+  url_allowlist:
+    enabled: false                # 許可リストチェックを無効化
+    allow_insecure_http: false    # HTTPS のみ許可(本番環境推奨)
+```
+
+**または環境変数で設定:**
+
+```bash
+SECURITY_URL_ALLOWLIST_ENABLED=false
+SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=false
+```
+
+**HTTP を許可するリスク:**
+- API キーとデータが**平文**で送信される(傍受の危険性)
+- **中間者攻撃(MITM)**を受けやすい
+- **本番環境には不適切**
+
+**HTTP を使用すべき場面:**
+- ✅ ローカルサーバーでの開発・テスト(http://localhost)
+- ✅ 信頼できるエンドポイントを持つ内部ネットワーク
+- ✅ HTTPS 取得前のアカウント接続テスト
+- ❌ 本番環境(HTTPS のみを使用)
+
+**`allow_insecure_http: false` 設定時に HTTP URL で表示されるエラー例:**
+```
+Invalid base URL: invalid url scheme: http
+```
+
+URL バリデーションまたはレスポンスヘッダーフィルタリングを無効にする場合は、ネットワーク層を強化してください:
+- 上流ドメイン/IP のエグレス許可リストを適用
+- プライベート/ループバック/リンクローカル範囲をブロック
+- TLS のみのアウトバウンドトラフィックを強制
+- プロキシで機密性の高い上流レスポンスヘッダーを除去
+
+#### ⚠️ 重要:管理者アカウントの作成
+
+初期管理者アカウントは**セットアップウィザード経由でのみ作成**されます(初回起動時に `http://<host>:8080` にアクセス)。`config.yaml` の `default.admin_email` / `default.admin_password` フィールドは**管理者作成には使われません**。テンプレートに残っているのは歴史的経緯によるものです。
+
+上記ステップ 5 で事前に `config.yaml` を作成しているため、**初回起動時にセットアップウィザードはスキップされます**。サーバーは既存の config を検出して通常モードで直接起動し、この時点では `users` テーブルが空のため、初回ログインは `invalid email or password` を返します。
+
+**管理者アカウントを作成する 2 つの方法:**
+
+1. **推奨 — ウィザードに `config.yaml` を自動生成させる:** 上記ステップ 5 をスキップします(`cp` を実行しない)。`./sub2api` を直接起動し、`http://localhost:8080` にアクセスすると、セットアップウィザードがデータベース・Redis・管理者アカウントの設定を案内し、`config.yaml` を自動生成します。
+
+2. **すでに `config.yaml` を作成してしまった場合:** 初回起動前に一時的に退避してウィザードを発生させ、完了後に戻します:
+   ```bash
+   mv config.yaml config.yaml.bak
+   ./sub2api        # ウィザードが http://localhost:8080 で起動し、新しい config.yaml を生成します
+   # ウィザード完了後、Ctrl+C でサーバーを停止し、設定を復元します:
+   mv config.yaml.bak config.yaml
+   ./sub2api        # 通常モードで再起動し、作成した管理者でログインします
+   ```
+
+```bash
+# 6. アプリケーションを実行
+./sub2api
+```
+
+#### 開発モード
+
+```bash
+# バックエンド(ホットリロード付き)
+cd backend
+go run ./cmd/server
+
+# フロントエンド(ホットリロード付き)
+cd frontend
+pnpm run dev
+```
+
+#### コード生成
+
+`backend/ent/schema` を編集した場合、Ent + Wire を再生成してください:
+
+```bash
+cd backend
+go generate ./ent
+go generate ./cmd/server
+```
+
+---
+
+## シンプルモード
+
+シンプルモードは、フル SaaS 機能を必要とせず、素早くアクセスしたい個人開発者や社内チーム向けに設計されています。
+
+- 有効化: 環境変数 `RUN_MODE=simple` を設定
+- 違い: SaaS 関連機能を非表示にし、課金プロセスをスキップ
+- セキュリティに関する注意: 本番環境では `SIMPLE_MODE_CONFIRM=true` も設定する必要があります
+
+---
+
+## Antigravity サポート
+
+Sub2API は [Antigravity](https://antigravity.so/) アカウントをサポートしています。認証後、Claude および Gemini モデル用の専用エンドポイントが利用可能になります。
+
+### 専用エンドポイント
+
+| エンドポイント | モデル |
+|----------|-------|
+| `/antigravity/v1/messages` | Claude モデル |
+| `/antigravity/v1beta/` | Gemini モデル |
+
+### Claude Code の設定
+
+```bash
+export ANTHROPIC_BASE_URL="http://localhost:8080/antigravity"
+export ANTHROPIC_AUTH_TOKEN="sk-xxx"
+```
+
+### ハイブリッドスケジューリングモード
+
+Antigravity アカウントはオプションの**ハイブリッドスケジューリング**をサポートしています。有効にすると、汎用エンドポイント `/v1/messages` および `/v1beta/` も Antigravity アカウントにリクエストをルーティングします。
+
+> **⚠️ 警告**: Anthropic Claude と Antigravity Claude は**同じ会話コンテキスト内で混在させることはできません**。グループを使用して適切に分離してください。
+
+---
+
+## プロジェクト構成
+
+```
+sub2api/
+├── backend/                  # Go バックエンドサービス
+│   ├── cmd/server/           # アプリケーションエントリ
+│   ├── internal/             # 内部モジュール
+│   │   ├── config/           # 設定
+│   │   ├── model/            # データモデル
+│   │   ├── service/          # ビジネスロジック
+│   │   ├── handler/          # HTTP ハンドラー
+│   │   └── gateway/          # API ゲートウェイコア
+│   └── resources/            # 静的リソース
+│
+├── frontend/                 # Vue 3 フロントエンド
+│   └── src/
+│       ├── api/              # API 呼び出し
+│       ├── stores/           # 状態管理
+│       ├── views/            # ページコンポーネント
+│       └── components/       # 再利用可能なコンポーネント
+│
+└── deploy/                   # デプロイファイル
+    ├── docker-compose.yml    # Docker Compose 設定
+    ├── .env.example          # Docker Compose 用環境変数
+    ├── config.example.yaml   # バイナリデプロイ用フル設定ファイル
+    └── install.sh            # ワンクリックインストールスクリプト
+```
+
+## スター履歴
+
+<a href="https://star-history.dera.page/#Wei-Shaw/sub2api&Date">
+ <picture>
+   <source media="(prefers-color-scheme: dark)" srcset="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date&theme=dark" />
+   <source media="(prefers-color-scheme: light)" srcset="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date" />
+   <img alt="Star History Chart" src="https://star-history.dera.page/svg?repos=Wei-Shaw/sub2api&type=Date" />
+ </picture>
+</a>
+
+---
+
+## ライセンス
+
+本プロジェクトは [GNU Lesser General Public License v3.0](LICENSE)(またはそれ以降のバージョン)の下でライセンスされています。
+
+Copyright (c) 2026 Wesley Liddick
+
+---
+
+<div align="center">
+
+**このプロジェクトが役に立ったら、ぜひスターをお願いします!**
+
+</div>

+ 221 - 0
REVIEW_BUGS_USABILITY_OPTIONS_2026-09-14.md

@@ -0,0 +1,221 @@
+# 完整源码审查:bug、易用性、操作流程与账号测试
+
+日期:2026-09-14。本轮仅审查并提出方案,未修改业务代码、配置或服务器,也未调用真实上游账号。新增的诊断用例放在本机临时目录,通过 Go overlay 和提取原前端函数运行,不进入项目构建。
+
+结论:当前最突出的问题是测试结论的含义不准确,以及用户选择、后台实际执行、页面显示之间仍有不一致。前一轮解决了传输身份和配置保存等问题,但没有解决本轮发现的判分语义问题;测试全绿不能证明产品判定合理。
+
+## 一、为什么答案正确仍显示“疑似降智”
+
+**已确认的根因:标准答案评估器把格式不合规、无法抽取答案和答案不匹配都保存为 `suspected_degradation`,分数均为 0。**
+
+实际判断条件不是只看数学结果。它要求全文只能有一行符合 `ANSWER: 答案` 的文本,这行必须是最后一个非空行,抽取后的字符串还必须与配置的标准答案完全一致。代码支持英文大小写和中文冒号,但不进行单位、Markdown、全角数字或数值等价归一化。
+
+位置:[评分器](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_evaluator.go:40)、[状态写回](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_service.go:242)、[显示文案](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/display.ts:4)。
+
+使用配置标准答案 `12`,直接运行当前评估器得到:
+
+| 模型输出 | 当前结果 | 当前原因 |
+| --- | --- | --- |
+| `ANSWER: 12` | 成功,100 分 | 满足格式及字符串比较 |
+| `12` | 疑似降智,0 分 | 没有规定前缀 |
+| `最后盒子里有12颗糖。` | 疑似降智,0 分 | 没有规定前缀 |
+| `ANSWER: 12颗` | 疑似降智,0 分 | 单位使字符串不相等 |
+| `**ANSWER: 12**` | 疑似降智,0 分 | Markdown 加粗导致匹配失败 |
+| 代码块中的 `ANSWER: 12` | 疑似降智,0 分 | 最后一行是代码块结束标记 |
+| `ANSWER: 12` 后再补一句说明 | 疑似降智,0 分 | 最后一行不符合协议 |
+| 连续两行 `ANSWER: 12` | 疑似降智,0 分 | 规定只能出现一次 |
+| `ANSWER: 12.0` 或 `ANSWER: 12` | 疑似降智,0 分 | 未做数值/字符归一化 |
+| 错误推导后写 `ANSWER: 12` | 成功,100 分 | 完全不检查推导过程 |
+
+这解释了“题目结果正确,但显示疑似降智”的确定性触发方式。格式遵循可以单独评价,但当前界面把这些不同性质的问题合并成能力风险,结论过强。
+
+现有测试还把直接输出 `12` 应得到 `suspected_degradation` 写成了预期,因此之前测试通过并不能发现这个产品逻辑问题。参见 [现有评估测试](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner_test.go:155)。
+
+**对具体那条记录的判断边界**:本次没有读取你看到的那条服务器记录。如果输出确实只有一个末行 `ANSWER: 12`、快照里的标准答案也是 `12`,当前评估器会判成功;此时应核对该记录的 `evaluation.reason`、`actual_answer`、`expected_answer`、配置快照和记录 ID,确认是否看到了旧记录、另一测试类型的汇总风险或尚未刷新的页面。不能仅凭截图上的最终数字确定具体分支。
+
+## 二、其他已发现的问题
+
+等级说明:P1 优先处理,可能改变真实运行行为或导致错误结论;P2 影响可靠性、操作判断或效率。“复现”使用合成数据;“源码确认”表示调用链可确认,但没有操作真实数据库或服务器。
+
+### B01 · P1:受保护账号选择随机代理,可能清空固定代理
+
+**服务层已复现。** 编辑页勾选随机代理会同时提交 `extra.proxy_mode=random` 和 `proxy_id=0`。后端受管字段保护保留原固定模式,但后续仍处理 `proxy_id=0`,清空固定代理。
+
+合成账号原为初代兼容、固定代理 ID 9;请求后返回:`random=false`、`proxy_id=null`、保护模式仍为 `legacy`。因此账号可能回到直连或默认出口,未得到用户所选的随机代理。
+
+位置:[前端关联字段提交](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/EditAccountModal.vue:6067)、[受管字段合并](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/admin_account.go:698)、[清空代理](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/admin_account.go:754)。数据库保存路径也会按空 ProxyID 清除关联,但本次没有对数据库或真实出口做修改验证。
+
+可选处理:直接拒绝与保护策略冲突的整次操作,并保留原代理;或提供独立的“切换代理与保护策略”预览流程,一次确认全部关联变化。不能仅忽略其中一个字段。
+
+### B02 · P1:慢接口会被自动刷新反复取消
+
+**已用原前端 `load()` 函数复现。** 静默刷新不设置 `loading=true`,每 5 秒定时器仍会发起下一次请求;`load()` 开始时又取消前一次请求。接口耗时持续超过 5 秒时,列表可能一直停留在旧结果。
+
+诊断中连续触发三次静默刷新,产生三次请求、取消两次、没有结果落到页面;停止刷新后最后一次请求才可显示结果。这会放大“后台已经完成,界面却仍显示旧状态”的问题。
+
+位置:[load 函数](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/IntelligentTestsView.vue:95)、[定时刷新](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/IntelligentTestsView.vue:155)。
+
+可选处理:请求完成后再安排下一次刷新;或增加独立的请求进行中标记,静默请求也参与去重。用户改筛选时仍可主动取消旧请求。
+
+### B03 · P1:用户明确选择的测试模型可能被静默替换
+
+**已复现。** OpenAI OAuth 测试中,明确传入 `gpt-5.4` 或 `gpt-5.4-mini` 会变为 `gpt-5.3-codex`。代码没有区分“留空使用默认值”与“管理员主动选择了这个模型”,并会覆盖配置快照中的模型。
+
+影响:测试结果不能直接用于评价用户选择的模型,单靠最终记录也难以恢复原请求意图。本条只说明本地改写行为,不判断真实上游当前支持哪些模型。
+
+位置:[模型替换](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner.go:32)、[快照覆盖](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner.go:121)。
+
+可选处理:仅为空值选择默认模型;显式模型不可用时返回清晰错误。确需兼容映射时,同时保存并展示“请求模型、实际模型、映射原因”。
+
+### B04 · P2:同账号同测试类型的任务复用忽略模型与题目差异
+
+**源码确认。** 新任务的唯一性只按账号、测试类型和进行中状态判断;即使新请求指定了另一模型,后台也可能返回旧任务 ID。虽然接口有 `reused`,两个提交入口都仍提示“已加入队列/已提交 N 个任务”。
+
+影响:管理员以为新模型/新配置已开始测试,实际拿到旧模型/旧配置的任务和结果。
+
+位置:[进行中任务复用](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_queue.go:110)、[提交提示](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/IntelligentTestsView.vue:136)。
+
+可选处理:参数相同时明确提示复用;参数不同则拒绝并说明冲突,或排在现有任务之后。不要以新的提交成功文案掩盖旧任务复用。
+
+### B05 · P2:换模型后重试仍复用旧幂等键
+
+**前端签名已复现,后端冲突分支已确认。** 快速测试签名只包含账号和测试类型,不包含所选模型;后端请求指纹却包含模型。若首次请求已提交但响应丢失,管理员换模型后重试会复用旧键,触发 409 冲突。
+
+位置:[快速测试签名](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/QuickTestDialog.vue:54)、[模型覆盖参数](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/QuickTestDialog.vue:58)、[后端指纹](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_queue.go:25)。
+
+可选处理:签名覆盖完整、规范化后的提交参数;仅原样重试复用旧键,任何参数变化生成新键,并区分“重试提交”与“重新运行”。
+
+### B06 · P2:SVG 结构通过被显示成满分成功,不能代表画对了
+
+**已复现。** `<svg><rect/></svg>`、零宽高矩形及一个简单圆都能得到 100 分。评估器只检查结构、安全词汇及是否存在图形节点,不检查鹈鹕、自行车、部件关系或可见画面。
+
+位置:[SVG 评分](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_evaluator.go:29)、[形状计数检查](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_evaluator.go:166)。
+
+结构检查本身有价值;问题在于“满分成功”容易被理解为图像或模型能力满分。方案是单独显示“SVG 结构通过,内容未评估”,或另设内容审核。任何方案都应保留现有 SVG 安全过滤。
+
+### B07 · P2:参数错误会被误分类成账号认证异常
+
+**已复现。** HTTP 400 的 `max_output_tokens must be positive`、`max_tokens exceeds request limit` 都被归类为 `account_error`,因为分类器只要发现 `token` 字样就按账号问题处理。
+
+位置:[错误分类](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner.go:296)。
+
+影响:运营可能去刷新授权、停用或更换本来正常的账号。可选处理是优先使用 HTTP 状态及结构化错误码,再区分请求参数、认证、模型、网络、限流和评估异常,最后才使用受限关键词兜底。
+
+### B08 · P2:正确文本只出现在终态事件时,会被当作无输出
+
+**已复现,属于兼容性条件触发。** 给现有流解析器输入带 `output_text=ANSWER: 12` 的 `response.completed`、不提供 delta,解析结果是“完成=true,抽取文本为空”。后续智能测试因空结果判失败。
+
+位置:[Responses 流解析](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/account_test_service.go:2880)、[空输出拒绝](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner.go:183)。
+
+可选处理:在没有累计文本时从终态输出提取文本,避免重复拼接。若仅支持严格 delta 流,也应显示“响应格式不兼容”,不能把它解释为账号能力问题。本条通常产生“测试失败”,并非“疑似降智”的直接分支。
+
+### B09 · P2:测试任务没有共享正常业务的账号并发准入
+
+**源码确认,尚未做真实负载实验。** 智能队列限制自身的进行中任务,但 AccountTestService 没有使用正常网关的账号并发槽。传给 HTTPUpstream 的并发参数是连接池大小,不等同于 HTTP/2、WSS 和不同传输池之间共享的请求准入。
+
+因此正常业务已占满账号额度时,测试仍可能额外发送请求,尤其在低并发策略或混合 HTTP/WSS 场景下影响正常用户。
+
+位置:[测试执行](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner.go:104)、[HTTP 参数含义](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/http_upstream.go:192)、[队列自身限制](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_queue.go:156)。
+
+可选处理:测试共享账号准入并降低优先级;或使用明确预留的测试容量/专用测试账号。界面展示等待原因和容量占用。
+
+## 三、易用性、操作性和逻辑性问题
+
+### U01:开始重测就可能让“异常账号”统计下降
+
+账号卡片和概览均取最新任务,包含 queued/running。对原异常记录启动重测后,最新状态变为 queued,旧异常就可能不再计入概览,但这时尚无成功结果。风险统计又按账号/测试类型合并不同模型、题目及保护策略的历史,缺少可比较条件。
+
+建议分别呈现“当前任务状态”和“最近完成的评估结果”,能力趋势按模型、题目版本、评估器版本及策略分组。位置:[概览](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_repo.go:238)、[历史异常聚合](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_repo.go:286)。
+
+### U02:设置/筛选元数据加载失败后,刷新可能无法恢复
+
+测试类型与分组只在组件挂载时加载。测试页的“刷新”主要更新账号列表;静默刷新成功还会清除共用错误。若首次读取测试设置失败,错误提示可能消失,但运行按钮仍缺失或不可用。其他窗口更改测试开关后,本页也可能长期保留旧按钮状态。
+
+建议给元数据单独的错误与重试状态,手动刷新同步更新设置和列表。位置:[初始化元数据](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/IntelligentTestsView.vue:148)、[共用错误清除](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/IntelligentTestsView.vue:109)。
+
+### U03:判定原因不够可见,复制的信息也不完整
+
+卡片展示答复预览和“疑似降智”,但不直接展示评估原因、抽取答案与标准答案。详情中的原因又藏在后续区域;公开结果不带这些评估字段。复制测试信息还省略了记录 ID、评估原因、配置快照和保护策略,影响定位你反馈的这类问题。
+
+另外,任何空分数都显示“待评估”,包括已经终止且永远不会继续评分的认证/网络失败。建议改为“未评估:原因”,并在卡片就显示判定依据;提供脱敏诊断导出。位置:[详情及复制](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/TestDetailDialog.vue:10)、[卡片](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/TestResultCard.vue:23)。
+
+### U04:设置页没有完整展示实际评分协议,长度限制也不一致
+
+“标准答案校验”说明未完整提示唯一 `ANSWER` 行、末行要求及严格字符串比较,也没有“粘贴答复试判”入口。修改题目但沿用旧标准答案会导致新答复继续失败,用户只能花上游用量后排查。
+
+前端题目允许 16000 个字符,后端限制 16000 字节;例如 6000 个常见汉字可在前端输入,却超过后端字节限制。标准答案前端 maxlength=500,后端上限为 200 字节。
+
+建议统一限制单位、实时计数,显示具体协议及例子,并提供不调用模型的本地规则试判。位置:[设置表单](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/TestSettingsPanel.vue:18)、[后端限制](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_service.go:91)。
+
+### U05:任务操作缺少取消、清晰复用反馈和明确的模型适用范围
+
+当前测试管理路由没有针对单个排队任务的取消入口。批量误选题目/模型后,操作人员只能等待,或通过关闭整个测试类型影响更多任务。
+
+快速测试又直接显示模型目录,没有按题目输出类型过滤。两个现有评估器都消费文本/SVG;选择原生图像等模型可能实际产生上游用量,但其 image 事件不进入文本评分器,导致无效测试。
+
+建议至少支持取消尚未发送的排队任务,显示新建/复用/冲突的任务明细,并根据测试所需输出类型过滤模型;批量执行前展示实际模型、题目版本和数量。位置:[管理路由](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/server/routes/relay_management.go:18)、[快速模型选择](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/QuickTestDialog.vue:6)、[文本事件解析](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/intelligent_test_runner.go:284)。
+
+### U06:账号编辑中可操作的字段,保存后可能被静默忽略
+
+保护开启时,指纹、TLS 和并发输入仍可编辑,但后端保留受管字段并重新限制并发。用户能选择并保存某值,却未必得到该值;操作成功提示没有说明哪些修改被保留或拒绝。
+
+建议把受管字段设为只读并显示控制它的策略,或在保存前列出“将应用/不会应用”的变更;涉及代理的字段需按 B01 整体处理。位置:[并发](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/EditAccountModal.vue:1771)、[指纹选择](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/EditAccountModal.vue:2375)、[受管字段](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/service/account_protection.go:119)。
+
+### U07:保护开关文案容易被理解为模型质量保证
+
+关闭确认提示可能发生“模型能力下降、错误路由”,而具体策略主要控制身份、TLS、并发及部分语义转换。通用并发保护也使用“防降智已开启”的主标签,具体范围仅在提示中解释。
+
+建议按实际能力显示“并发保护/身份策略/语义检查”,将基线测试中的关闭状态呈现为中性选择;只有真实路由或认证异常才提示对应风险。位置:[关闭提示](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/ProtectionToggle.vue:12)、[异常风险文案](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_repo.go:317)。
+
+### U08:用户清理会丢失后端错误原因,预览过期后难以操作
+
+API 客户端拒绝的是带 `message/code` 的普通对象;清理组件只识别 `instanceof Error`,因此预览过期、权限不足、锁等待等明确错误可能都变成泛化重试提示。预览有 expires_at,但界面未显示到期状态或倒计时。
+
+建议统一错误提取,针对预览过期提供“重新预览”,针对繁忙提示稍后重试;避免用户一直重复提交已经失效的预览。位置:[错误对象](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/client.ts:247)、[清理错误处理](C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/user/UserCleanupControl.vue:78)。
+
+### U09:列表读取过重,测试历史缺少保留策略
+
+账号卡片和历史列表先从数据库读取包含 raw_response、完整配置、输入及图片的全部记录,再在 Go 中清空部分字段。页面每 5 秒刷新,原始响应较大时会产生不必要的数据库传输和内存压力。当前代码也未发现 account_tests 与幂等请求表的自动保留期清理;2000 的限制仅限制进行中的队列。
+
+建议列表查询只选摘要字段,图片和详情按需加载;原始响应与结果历史分别配置保留期和大小预算。此项是源码可确认的扩展性风险,本次没有进行生产负载测量。位置:[完整列定义](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_repo.go:22)、[事后裁剪](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/internal/repository/intelligent_test_repo.go:57)、[建表及索引](C:/Users/30214/Desktop/sub2本地/sub2新站/backend/migrations/247_intelligent_tests.sql:14)。
+
+### U10:交付版本和运维文档仍需纳入可追溯流程
+
+当前 Git 跟踪文件数为 0;运行手册、策略矩阵等文档又被 `.gitignore` 的 `docs/*` 规则排除。直接使用 `git add .` 建立版本时,这些手册不会自动进入提交,影响后续检出、部署和回滚核对。
+
+可选保留源码包及校验清单,或建立经过筛选的 Git 基线并修正文档忽略规则。本轮没有执行提交或修改忽略规则。Live 暂停开放、在线原地更新/回滚关闭仍是明确的功能限制,不当成已恢复的能力。
+
+## 四、可选方案:如何处理“正确却被判疑似降智”
+
+代理关联字段、慢刷新取消和幂等键等确定性 bug,应进入独立修复清单。判分标准可以选择以下方案。
+
+| 方案 | 具体做法 | 优点 | 代价及限制 |
+| --- | --- | --- | --- |
+| A:最小调整 | 保留严格评分器,将展示改为“规则未通过/需要复核”;立即显示格式原因、标准答案和抽取值;不把 0/100 当能力分 | 改动较小、兼容现有记录与接口 | 仍会拒绝 `12颗`、`12.0` 等等价输出;旧状态码仍可能被外部客户端误读 |
+| **B:可解释的多维评估(推荐)** | 分开记录执行状态、答案正确性、格式合规和能力信号;按答案类型做受控归一化;歧义答案标“无法自动判定”;设置页提供试判 | 直接解决当前体验问题,结果可解释,算术等题不必增加上游调用 | 需要明确数值、单位、文本等比较规则,以及接口/历史版本兼容 |
+| C:完整能力评测 | 在 B 基础上加入多题、多轮、同模型同配置基线及趋势;复杂图像/语义结果引入人工复核或可选裁判 | 更适合评价账号长期变化 | 开发与运行成本更高;裁判本身也可能误判,不能用少量题直接证明上游降智 |
+
+B 的预期展示示例:**执行完成;数值答案正确;格式不符合;能力下降证据不足。**
+
+不建议只搜索输出中有没有 `12`,这会把题目复述、被否定的答案和错误推导一起放行。数值等价规则也不能直接套在所有文本或单位题上。
+
+## 五、其他方面的可选方案
+
+| 方面 | 较轻方案 | 更完整方案 |
+| --- | --- | --- |
+| SVG 测试 | 仅显示“结构与安全检查通过”,内容标未评估,移除能力满分暗示 | 增加图像内容人工复核/视觉评价,与结构检查分开保存 |
+| 历史误判 | 原结果保留,明确显示旧规则版本,新规则只处理新测试 | 使用已保存答复和配置快照重新评估,保留原判定、新判定及原因;完整输出缺失时标待人工复核,不再次消耗上游用量 |
+| 测试操作 | 修复轮询、完整参数幂等键、复用提示,支持取消未执行任务 | 统一任务中心,共享业务准入、优先级和容量预算,展示每批执行计划 |
+| 账号保护编辑 | 锁定受管字段;冲突的代理切换整次拒绝并保留原配置 | 提供策略/代理联动预览与单次确认,明确每个变化的生效范围 |
+| 结果公开 | 只公开经过明确选择的结果与中性结论 | 增加每次发布/撤回和复核记录,避免题目变化后整类历史自动暴露 |
+
+我的建议是采用 **B + 历史保留式重评**,SVG 先采用结构检查的中性表述;同时优先处理 B01、B02、B03、B04、B05,避免测试实际行为与用户选择继续不一致。上述均为可选方案,本轮未应用。
+
+## 六、本轮证据与范围
+
+- 深入检查了题目配置→任务提交/复用→模型选择→出站请求→流解析→评估→持久化→列表、详情及公开展示链路,以及账号编辑、清理操作、错误处理、刷新和版本交付。
+- 临时 Go 用例直接调用当前评分器、流解析器、错误分类器、模型选择函数和实际 AdminService;均只使用合成输入与内存仓库,无真实上游请求、无真实账号写入。
+- 前端诊断提取当前 load 函数和签名表达式运行,复现慢请求被取消及模型变化签名不变。
+- 本轮没有重跑前后端全量测试,也没有声称逐行穷尽整个大型仓库。重点是发现已有测试没有表达的业务和交互问题。
+- 未获取具体服务器误判记录,未做浏览器像素级验收或生产负载实验。它们不会被写成已证实的线上事故。
+- 项目内本轮只新增本审查报告;临时诊断位于 `C:/Users/30214/AppData/Local/Temp/sub2-assessment-review-20260914`。

+ 48 - 0
SERVER_DEPLOYMENT_2026-09-15.md

@@ -0,0 +1,48 @@
+# 2026-09-15 服务器部署结果
+
+已按用户授权将本地修复部署到 https://juhe.pub。新版本为 `optional-controls-20260915`,服务器 `107.149.55.60`,部署连接核对既有 SSH 主机指纹。登录密码仅在连接时输入,没有保存在项目、源码归档或本报告中。
+
+## 当前版本
+
+- 镜像:`chengchuan-relay:optional-controls-20260915`
+- 镜像 ID:`sha256:bc0a061f84b8be362b443c3ff2e7fdff255b5ea4a80cb907961ea742192c8b19`
+- 构建时间:2026-09-15 02:33:07 UTC。
+- 当前 Compose 目录:`/opt/chengchuan-relay/releases/optional-controls-20260915/source/deploy`。后续操作应使用此目录,旧说明中的 `source/deploy`、`feature-source-next/deploy` 是历史部署目录。
+- 发布源码包:项目外 `交付包/relay-optional-controls-20260915-source.tar.gz`,4,001 个文件逐项 SHA-256 验证;压缩包 SHA-256 为 `c67137e3567f9b59d7069af74bd52d489edbf7e85625f5c4f1df1a2955ed444f`。
+
+## 生效内容和默认状态
+
+本次同时上线本地报告中的账号保护修复、B 方案 v3 评分、鹈鹕 SVG 展示、测试队列与轮询修复、可选 RPM / 自适应并发、独立完整性控制和真实分组统计。
+
+线上全部账号的并发数、代理和 extra 配置在切换前后摘要一致,没有批量切换策略或覆盖管理员设置。严格 RPM 开启账号数为 0,自适应并发开启账号数为 0;管理员可在账号编辑的“可选流量控制”启用,建议参数可继续自定义。分组管理勾选“完整统计”后显示入口。
+
+第 248 号迁移 `248_intelligent_assessment_v2.sql` 已执行,新增队列调度字段并扩展测试状态约束;既有迁移文件未改动。历史测试结论没有自动批量重评;需要时从详情手动复核。
+
+## 验证结果
+
+1. 服务器构建完整前后端镜像成功,含前端类型检查和 i18n 检查。
+2. 将部署前数据库备份恢复到隔离容器,验证新迁移与重复执行;用户、账号、密钥、用量行以及历史测试原始字段保持一致。隔离网络禁止测试副本访问真实上游。
+3. 新镜像在隔离环境的 20 项 HTTP/API 检查通过。
+4. 线上切换后的 20 项 HTTPS 检查通过,覆盖健康、前端入口与资源、未认证拒绝、现有管理员登录、流量配置读取、分组统计与日期校验、账号测试中心。
+5. 线上规则试判确认 `**ANSWER: 12颗**` 显示 `completed / correct / non_compliant`,评分版本 3,答案正确性与格式分别判断。该请求只运行规则,不调用模型、不改写历史测试。
+6. 本机外部访问 `https://juhe.pub/health` 返回 200 和 `{"status":"ok"}`,服务器 HTTPS 登录页返回 200。
+
+切换及首次完整检查耗时约 8.3 秒,不等同于精确停机时长。仅重建应用容器,PostgreSQL 和 Redis 的容器 ID 保持不变。未执行真实上游模型、支付、发信或图片生成测试;最新页面的浏览器目视验收仍受此前浏览器工具认证错误限制。
+
+## 备份与回滚
+
+服务器私有备份目录:`/opt/chengchuan-relay/backups/before-optional-controls-20260915`。
+
+保留部署前源码、应用数据、私有环境设置、部署前数据库 dump,以及停止旧应用后制作的 `database-at-cutover.dump`。数据库备份目录索引已用 pg_restore 检查。旧镜像另加标签 `chengchuan-relay:rollback-optional-controls-20260915`,原镜像也保留。
+
+普通应用回滚可从新部署目录执行:
+
+```sh
+RELAY_VERSION=rollback-optional-controls-20260915 docker compose --env-file .env -f compose.relay.yml up -d --no-deps --no-build --wait app
+```
+
+第 248 号迁移主要为兼容扩展,旧镜像回滚不需要自动还原数据库;新状态在旧测试界面显示可能有限制。不得使用删除卷命令更新,也不应在产生新业务数据后直接覆盖数据库备份。备份包含私有业务数据,应保留原目录权限。
+
+本次临时应用、数据库副本、Redis 和隔离网络已清理;原有测试容器、线上容器及业务卷未删除。被清理的是可从保留备份重建的验证副本。
+
+服务器证据目录:`/opt/chengchuan-relay/evidence/optional-controls-20260915`。本地可复核副本见 `verification/deployment-20260915/`。

+ 59 - 0
SITE_TUNING_RESULTS_2026-09-14.md

@@ -0,0 +1,59 @@
+# 本地调整结果与后续选项
+
+本轮按“备份留档 → 整体审查 → 本地修复 → 验证”的顺序执行。没有连接或部署远程服务器,没有改写实际业务数据库,也没有调用真实上游账号。
+
+## 调整前备份
+
+主存档:[完整备份](C:/Users/30214/Desktop/sub2本地/sub2新站-调整前-20260914-213426-complete.tar.gz)
+
+指定目录副本:[桌面 sub2备份 中的副本](C:/Users/30214/Desktop/sub2备份/sub2新站-调整前-20260914-213426-complete.tar.gz)
+
+[备份说明与恢复注意事项](C:/Users/30214/Desktop/sub2备份/备份说明-20260914-213426.md)
+
+71,005 个实际文件与 3,162 个链接已逐项回读验证;原始文件共 625,374,688 字节,压缩包 185,027,691 字节。归档包含隐藏文件、源码、已有文档和依赖,内部依赖链接使用相对目标。包内 `BACKUP_MANIFEST.json` 保存逐文件 SHA-256。两份存档在修改前后均核对为同一 SHA-256:
+
+`4C7A328E9A265C668451B198D4EF40DFBE66D17C4F3C4B3FDE39BFC5DD20A71A`
+
+这是本地项目文件备份,不包含未读取的服务器数据库。制作过程中未完成的两个临时压缩包已清理,原项目文件没有删除。
+
+## 本轮已完成
+
+整体审查的原始证据与范围见 [调整前审查](SITE_TUNING_REVIEW_2026-09-14.md)。
+
+1. **429 重试与冷却。** 显式 Retry-After 被识别为等待边界,账号在该时间前不走普通瞬时 429 的立即重试路径;返回给调用方的等待头保留。无明确等待信号的 OAuth 429 重试同时受次数和总时长约束,默认最多三次同账号重试,按逐步延长并加正向随机偏移的间隔执行。不能把上游要求的 90 秒压成 8 秒,也不能为了塞进截止时间而提前请求。
+2. **冷却只延长。** 通用 `SetRateLimited` 接入已有的原子“仅延长”写入。并发的短冷却不能覆盖较长冷却;明确的手动恢复入口仍可清除限制。
+3. **测试遵守冷却。** 智能测试执行前检查账号限流、过载、临时暂停和所选模型冷却。存在限制时延后排队、显示原因与下次检查时间,不发送上游请求。普通连接测试明确提示稍后重试。共享并发准入继续保留。
+4. **成功测试不整体恢复。** 普通连接测试成功后仅报告该次观测,不再清除所有模型或其他请求刚写入的限制。需要恢复时使用已有的手动恢复入口。
+5. **排队公平性。** 队列按可执行时间、任务 ID 排序。反复延后的小 ID 任务不会持续压住其他已经在等待的任务;延后写入也校验执行租约是否仍归该 worker 所有。
+6. **评分边界修复。** 否定、假设、含糊结论及引用行不再因为出现标准数字就放行;JSON 重复答案键保留全部候选,冲突时需复核。单位规则明确分为“不接受单位”“只接受指定单位”“沿用旧题兼容规则”。
+7. **评分版本升级。** 当前规则为 v3,仍属于 B 方案。v2 记录继续显示原判定,可以从详情按新规则重评,原始答复、题目快照和原判定保留。没有自动批量改写历史。
+8. **独立完整性控制。** 账号编辑新增关闭、仅观察、严格拦截选项,独立于身份与 TLS。已开启保护的 OpenAI OAuth/Setup Token 默认先观察转换差异;mode1 原有强制检查不能通过普通编辑关闭。选项进入调度缓存与测试执行快照,在已接入的 Responses/WSS 路径执行检查,日志不记录请求正文、凭据或对话内容。
+9. **统计诚实性与 CI。** 未实现的分组 stats 接口不再伪装成功返回全部零值,改为明确的 `501 / GROUP_STATS_UNAVAILABLE`;现有分组用量汇总接口仍可使用。数据库专项 CI 纳入 ProtectedProxy、RateLimitObservation 等新增测试前缀。
+
+默认身份策略仍为“初代兼容”。本轮没有把账号切换到其他 TLS/身份策略,也没有给所有账号强加统一的 RPM 数值或自动提高/降低已保存的并发上限。
+
+## 已完成的验证
+
+| 验证 | 结果 |
+| --- | --- |
+| 前端全量 Vitest | 2,054 项通过,0 失败 |
+| 后端全量单元测试 `-tags=unit ./...` | 19,371 个测试/子测试通过,0 失败,29 跳过 |
+| 最终独立数据库专项 | 105 个测试/子测试通过,0 失败、0 跳过 |
+| Vue 类型检查与 ESLint | 通过 |
+| 后端构建与前端生产构建 | 通过,产物写入本机临时目录 |
+| 浏览器组件验收 | 冷却原因、下次检查、最近完成结果同时展示;不接受单位时隐藏单位输入;详情显示 legacy + nodejs24 + 仅观察;鹈鹕图片已解码并可显示 |
+
+数据库专项使用仅绑定 127.0.0.1 的新临时 PostgreSQL 和 `relay_tuning_test` 数据库,覆盖冷却并发、队列延后/取消/公平性、保护事务、管理权限、评分重评和用户清理。测试后 PostgreSQL 与本地界面验证服务均已停止,临时验证页已关闭。
+
+测试计数含父测试与子测试,不能把专项与全量相加当作独立用例数。浏览器使用真实组件和明确标注的本地合成答复,API 网络调用被阻断;不据此声称已经验证真实上游握手、限流概率或模型质量。
+
+## 需要后续选择的策略
+
+| 方面 | 可选方案 | 建议 |
+| --- | --- | --- |
+| 严格 RPM | 保持当前软限制;或新增按账号配置的原子硬限制与突发预算 | 先采集每账号请求频率、429 率和等待时间,再决定数值。原子硬限制尚未实现/启用。 |
+| 自适应并发 | 只提示建议降低;或允许在管理员上限内自动降速、缓慢恢复 | 先采用只提示,避免吞吐在无人知晓时变化。自动调节尚未实现/启用。 |
+| 完整性拦截 | 仅观察;或对选定账号开启严格拦截 | 控制已实现,默认兼容阶段仅观察。严格拦截可能拒绝尚未纳入允许转换的合法请求,应先核对差异。 |
+| 完整分组统计 | 用户实际扣费、账面费用、上游账号成本分别展示 | 需要明确字段口径后再实现完整 stats,不能把占位零值当真。 |
+
+这些可选项不阻塞本轮已授权的确定性修复。本轮没有发布、提交 Git 基线、删除测试历史或改变结果公开范围;新 JSON 字段复用现有结构,无新增数据库迁移,但正式上线仍需此前的 `248_intelligent_assessment_v2.sql` 与本轮前后端配套。

+ 45 - 0
SITE_TUNING_REVIEW_2026-09-14.md

@@ -0,0 +1,45 @@
+# 调整前整体审查与实施清单
+
+本轮顺序:先对当前项目全量备份并复制到桌面“sub2备份”,逐文件与副本校验通过;再冻结本审查结论,然后修改。整个过程只在本地执行,不部署、不写远程服务器或真实业务数据库。
+
+## 备份基线
+
+`C:/Users/30214/Desktop/sub2本地/sub2新站-调整前-20260914-213426-complete.tar.gz`
+
+副本:`C:/Users/30214/Desktop/sub2备份/sub2新站-调整前-20260914-213426-complete.tar.gz`
+
+两份 SHA-256:`4C7A328E9A265C668451B198D4EF40DFBE66D17C4F3C4B3FDE39BFC5DD20A71A`。71,005 个实际文件、3,162 个链接已逐项回读校验;归档内含 `BACKUP_MANIFEST.json`。此基线包含此前 B 方案与图片显示修复,也包含下述本轮待修问题。
+
+## 整体审查覆盖
+
+检查了管理路由与角色保护、账号策略保存/还原、HTTP/WSS 重试与冷却、账号测试和队列、答案/SVG 评估、结果显示与设置操作、分组统计、更新/Live 功能边界及 CI 选择范围。前几轮的权限保护、定制站在线更新禁用、未结算 Live 禁用、共享并发、策略原子切换、图片安全显示等仍在代码中,不作为新的未修问题重复列出。
+
+没有把未被调用的 TODO 当作线上缺陷,也没有将源码审查等同于穷尽整个项目或实际生产负载验收。
+
+## 本轮确定性问题及执行方案
+
+| 编号 | 优先级 | 当前问题与依据 | 执行方案 |
+| --- | --- | --- | --- |
+| T01 | P1 | OAuth 429 把 Retry-After: 90 秒截为 8 秒;带截止时间的重试绕过普通次数限制。见 `openai_account_runtime_block_fastpath.go`、`handler/failover_loop.go`。 | 同时尊重上游最早重试时间、次数与总时长;退避逐步延长并错开,预算不足不提前重试。 |
+| T02 | P1 | 通用 SetRateLimited 直接覆盖恢复时间,迟到的短冷却可能缩短已保存的长冷却。 | 复用原子“仅延长”写入;保持明确恢复入口独立,并用并发数据库用例验证。 |
+| T03 | P1 | 共享并发不等于遵守冷却,智能测试没有统一检查账号/模型的限流窗口。 | 执行前检查冷却,排队任务延后至可重试时间,展示具体等待原因;普通连接测试也不提前撞冷却窗口。 |
+| T04 | P1 | 普通连接测试成功后调用 RecoverAccountState,清除所有模型的冷却,可能误清其他模型或并发新增限制。 | 成功测试只报告观测,不自动整体清除状态;手动恢复继续使用明确入口。 |
+| T05 | P1 | 自然语言答案提取会把“因此答案不是12”“没有12颗糖”提为 12;JSON 重复答案键也可能被覆盖。 | 否定、假设、引用等歧义结果转人工复核;保留重复候选检查,不能因尾值正确放行冲突答案。 |
+| T06 | P2 | 清空单位仍可能触发旧糖果题自动推断“颗”。 | 区分不接受单位、指定单位、旧题兼容;旧快照保留原语义,新设置按明确选项执行。评分规则升级版本,旧 B 记录仍可保留式重评。 |
+| T07 | P2 | 请求完整性检查绑定 mode1;无法在 legacy 身份/TLS 下独立观察转换损失。 | 拆出独立观察/拦截控制,默认身份策略保持初代兼容;兼容阶段先观察,不自动把全部旧账号切到严格拦截。 |
+| T08 | P2 | 分组 stats 管理接口直接返回占位零值,甚至没有用分组 ID 获取真实统计。 | 停止将未实现统计伪装成成功零值;明确返回功能未提供,不编造费用口径。 |
+| T09 | P2 | protection-database CI 正则遗漏新增加的 ProtectedProxy 前缀用例;本地通过不保证 CI 执行。 | 补齐本轮相关用例和 CI 必测范围,并验证测试在独立环境中确实执行。 |
+
+## 可选策略,准备好后再由用户选择
+
+- 严格 RPM:现有 Anthropic RPM 是软限制,OpenAI 尚未统一采用同一原子频率准入。严格频率阈值、突发额度与故障时排队/拒绝的取舍需要明确;本轮不会给所有现有账号强加未经测量的统一额度。
+- 自动容量调整:可先建议降并发,或允许在管理员上限内自动降速、缓慢恢复。自动调整幅度和触发条件需要业务偏好,不自动改写现有并发上限。
+- 完整性严格拦截:先观察字段转换差异,再选启用范围;身份/TLS 策略与该选项分开。
+- 完整分组统计:明确“费用”使用用户扣费、上游成本还是账面金额后,可接入对应汇总,替代目前占位接口。
+- 历史保留期、逐条公开/撤回、多题长期基线与图像内容裁判保持为后续功能,不自动删除历史、不改变公开范围。
+
+## 验收计划
+
+所有改动要通过针对性回归;涉及冷却写入和队列的变更使用新的本机临时 PostgreSQL 实例测试,测试结束后停止。再执行前端全量、类型与 lint、后端相关及全量单元测试和临时目录构建。不得调用真实上游账号,不把本地合成用例称作线上效果证明。
+
+实施结果和实际验证数字将另写本轮结果报告;此文件保留调整前的问题证据。

+ 4013 - 0
SOURCE_MANIFEST.json

@@ -0,0 +1,4013 @@
+{
+  "algorithm": "sha256",
+  "files": {
+    ".dockerignore": "92d7bef819acf5536be8a674776e0a5dc2659b30223cc1d29ca4e42359433c52",
+    ".gitattributes": "1e7e4dd88806c211173003844b25304bac2ba04d0c2dc4afbb7a5e181fd3bf7c",
+    ".github/audit-exceptions.yml": "174b013263e865382b750c87aac06215ddc4635ac07e8a65c30529cd87a5e30f",
+    ".github/workflows/backend-ci.yml": "2f21bb3296e0487dfeaa69dde5683b169d907ec61bdafc2ab6b718a76d3ad3a2",
+    ".github/workflows/cla.yml": "cb797d735c2dff6c383d1f5c4e417d9727752579345d8cb7d29d0dd1e6189650",
+    ".github/workflows/release.yml": "f0345c6bfefdc866ed247f34f00c2d151bf42b7d7e8fecffa6c1f83d61e94605",
+    ".github/workflows/security-scan.yml": "0dad696bd4c13f7396e934f706b7ad49c7eec2997bd3090faf17ec1257689147",
+    ".gitignore": "492b0ca2c20bf89ece6b496eb3d55fae3e27470f72176ce28a176ac45a63b895",
+    ".goreleaser.simple.yaml": "6cd3c751704ee592db2b1d91ef93ca87b93487c185545e79985c64f9c13d350f",
+    ".goreleaser.yaml": "1a32e8ff228768eeec1a81000f8d55b717436be3c99dbd4a0791a17aa5281745",
+    "CLA.md": "8d44ce005572a6026c1f6ca176c6e56c6533d9608c73c3f80aaafca1ced19ad6",
+    "DEV_GUIDE.md": "394861d5e480e1fbb7be373b4067e9b270447641373d74ad63bc8e0d54eb0e17",
+    "Dockerfile": "4f220215a1e6c9bb0bb18071cc3e5f724699262cf370133a9e2d76b037037995",
+    "Dockerfile.goreleaser": "d930c927560641d2dda75d56d608ce1d5ae39b32f98db293788b5ec1e23a9af5",
+    "LICENSE": "a5681bf9b05db14d86776930017c647ad9e6e56ff6bbcfdf21e5848288dfaf1b",
+    "MODE1_LOCAL_HANDOFF.md": "872c6adfb1c6abc51ac21bb38fa76e1594de9aaa604cbc31fc147527e177c9b0",
+    "Makefile": "8cb505d0b6734dc3257d96db62e8e3239b0a73da1ba5a609015879d5d12ded5d",
+    "README.md": "feea5b253d288fe1750f162bd1d11c1ed95edd915d519835383276d2a6acf2f0",
+    "README_CN.md": "5e5616aa825e5c9bd8abb59e7ea3d8076c2b9fa9084b7e0e33a4e011ce5b0d44",
+    "README_JA.md": "8042744673b6acc47ba19e67f7dfebab08e93c2588d9f79e78f468888d9302d3",
+    "assets/logo.svg": "ce1f2ac07efcfff80904a9582578b5db8fdd14a3118a5c7b58f408ed06df18e1",
+    "assets/partners/logos/RoxyBrowser.png": "260714a21c6d955e8f40074de985deb2aff97ced833e556d2d3b72fb9dc7cf59",
+    "assets/partners/logos/aigocode.png": "880b50b77771be2f3896fd3c93dfc7f492b3ef81f2e1c660dabfe72e62abc868",
+    "assets/partners/logos/aimzoon.jpg": "4999a736921e84a774c39fa5f359a8d861459476b18aaacfa0c812a24bd26f8b",
+    "assets/partners/logos/apikey-fun.png": "ba11dcb884cc06069e9f13b28b05917b35a7d037e2872c3998b69d567c4aeea8",
+    "assets/partners/logos/apimart.jpg": "29995c71318c9a866fd6a5448f10212babed3b00c3993dd3d662422c2e6099e7",
+    "assets/partners/logos/axisnow.jpg": "167b032efc5cac067df4a445b02e3340f13b4d182ee8e5b95c06c6870728d1a5",
+    "assets/partners/logos/bestproxy.png": "58f1344d07a1bae0aee9d209eaca07d168813ed0249b253869276d51fe1616db",
+    "assets/partners/logos/bmoplus.jpg": "c00179742fbaba218559d9098264cafc0ac48a3f013cb7201784a9965663e81f",
+    "assets/partners/logos/cctk.jpg": "e3161534970bb96b0d25c4397cb8982c3003d0c7f2ea8c11d9f9c7a3a1f0daa6",
+    "assets/partners/logos/codex-everywhere.jpg": "2b06315f148f148eca3933604cf07b705d188c56159e77dc98d6f4c89197870b",
+    "assets/partners/logos/cola-proxy.jpg": "19806249de1f50c4fd2095b5c83822e22ab92e09d210c7a23faebe525533cfc9",
+    "assets/partners/logos/ctok.png": "d5c137c6cc68981d8485517a899f1f833be7f136e9b7ec8aec4e53468bef3041",
+    "assets/partners/logos/duckip.png": "1009605201082a7ceba066fd46eee8641025caded6bcc771c47ea8359f4c76ee",
+    "assets/partners/logos/etok.png": "7ff9be47142c372910b730748210e121777b1998e5d5b298eb3d3c37674468fa",
+    "assets/partners/logos/fastaitoken.jpg": "25cfd0d020ebb61f7d06969007c9ba4154a8359516f0a32bab63e6613b3f3e4f",
+    "assets/partners/logos/fennoai.jpg": "856aeed0b85c1e3b24a6838109b8d75dfa0e7ab80713d4285acb44e9c8d42b3b",
+    "assets/partners/logos/haoai.png": "9447cda5aaf511a067374cdbd7ed57e91e3a1d74bd31e89be156841f3568097e",
+    "assets/partners/logos/lanox.jpg": "44db85f98aeb436594e7867271a22d2f96e47d304fe9a87095bb85f66aefee5c",
+    "assets/partners/logos/nagora.png": "5296cc26e76012a12b621087e9bec98c0107accd78758737def76591f663f599",
+    "assets/partners/logos/openmodel.jpg": "a721d1fd75ef50b5c1f4dc7b57894d81f9d1f941ad4cdb19041e90bd9ba53ecf",
+    "assets/partners/logos/pateway.png": "b5b7fed8b61b2ee4b0c9e92932e57f90afe0044d44ed3f687bdde904ed329c36",
+    "assets/partners/logos/pincc-logo.png": "3a3752a166d3f7df4facafbe422bf4ad95738f18d1e9608d138239d75939494b",
+    "assets/partners/logos/poixe.png": "6f47bcf9a993e29c605889c2eb513cbb10309330e961a9909bfd3f158ec5788f",
+    "assets/partners/logos/ppdog.png": "fb88f82a9d3453979208fe7b50f194522e410d4c885a8ccf737375f77f6cafed",
+    "assets/partners/logos/pptoken.png": "d6ec5665b315ffa15bd34a7fe67f2134614380413e2380f1186bb4eff8f670cf",
+    "assets/partners/logos/proxy4free.png": "2a962a1e725558f80deec0696b8e56697a0944bbcd20a8ce299cf52f19a93d60",
+    "assets/partners/logos/qiniu.jpg": "63571eaa57298170b08a0fcbce899853950de2e05e562886306b34f36d2b40fa",
+    "assets/partners/logos/rapidproxy.jpg": "d662f21749a3387bcf3365261b2b7f4c6e50e2df6b526379b5ef53b73b2b0846",
+    "assets/partners/logos/runapi.png": "f52a6bc88b3057d00cb28a6392cc6a008424b9eee2cf9234d359e871723f538d",
+    "assets/partners/logos/silkapi.png": "82205954b5b644d4f213ee1a6cd5b7f62b2ac594351fbaa9ae7e179b98cfd655",
+    "assets/partners/logos/swiftprox.png": "b9d0f4e054ba2fc0bfb358a5207b4d6ea4d964fbd873c04de8106cc00b78b554",
+    "assets/partners/logos/veilx.png": "4b636d893e19dc99ebe1f4381f48b5d06cf1e28cc07207b6882db7b023dd7d06",
+    "backend/.dockerignore": "44a0e1876e9e2ed5c2b4cd18762fa3d5d2611532264ba80d619a5360239b3fea",
+    "backend/.golangci.yml": "ed037798aa38c9e377aafa2fad35c12dc95b1edb29f18ec61f0a08b4bfbd5599",
+    "backend/Dockerfile": "4504ea263c1ecacc43822817bbefd183654e80f5492b31a39c9ef440283c5966",
+    "backend/Makefile": "bdcaa1a9b2b722153b4269d619df89499b1bd6e8db22f79ac047b479ba6c8b66",
+    "backend/cmd/cleanup-ingress-reject-logs/README.md": "89fd2a610915925760b14e58cb437ef7ee9d69d6df8057acfd4eab5d22507e05",
+    "backend/cmd/cleanup-ingress-reject-logs/main.go": "1bbaad2349b94ef86fe39f4c1fff79e4e7d05061c2748d510c1245bf753ce75c",
+    "backend/cmd/cleanup-ingress-reject-logs/main_test.go": "25b7f04905bdad113fcaf221ef5e8da9e13913caecc6b1343529c923c770057a",
+    "backend/cmd/jwtgen/main.go": "29a587e1c2a533f9b2786ab195ed19aa9a75b2c458c4c67eee1eb48869172886",
+    "backend/cmd/profit-preview/main.go": "cd59aa964071daf98db39a23f6ec1d34103d6190817c1f59072ebe6a9b257859",
+    "backend/cmd/profit-preview/main_test.go": "e9074da89d1a1aaed2aeb1981af9187955c7ee5543f5b7858d91489c3a61c69b",
+    "backend/cmd/server/VERSION": "1725bfa6524c5265e7c171cf06568417d39b947fff49c242f03859479c82334b",
+    "backend/cmd/server/main.go": "0d29c161513c785f7ce419aeee8fcfdd50f9dece99a1c53bcafedea37c92820d",
+    "backend/cmd/server/wire.go": "340e3ef051a97b913282f06c52b008a424252d2932d29a158d649cc50ec853c3",
+    "backend/cmd/server/wire_gen.go": "70776b165eaf9ab1ec40c8b59e5a8dee866a3d193dc2ecd793c51085076054b0",
+    "backend/cmd/server/wire_gen_test.go": "523a55ff25d6fd68f7461fe0e357faea6954f21f5af010305f8c9d02f6510b42",
+    "backend/dev-docs/upstream-error-proxy-attribution.md": "5328a268581378571bbd7d9081e79ad7bdec2941799ea1e38b93e80e8440f03c",
+    "backend/ent/account.go": "3627afdaaa561ad64281a8c7bee6c17d8f38f5d28e3ee402cb9ac1d8f3fcc7c9",
+    "backend/ent/account/account.go": "3072fadf996b297e2f18bef7a4d2936463efaad9fe8b0ad7592f5856d855b1cf",
+    "backend/ent/account/where.go": "71a163687ff1711ca0026483877a069e907c8d61437f0d63c196b152ae92fb1b",
+    "backend/ent/account_create.go": "f8dd5aba4a8ff6d1e9f00e443ab7e083cee001f6601c26003b15233312125a41",
+    "backend/ent/account_delete.go": "8bc27c9d5973825a7149d8903833f273a58cd4e31042d1241861bb542a8ac635",
+    "backend/ent/account_query.go": "3e7206f1337fe404da42d1f422c16d446df9b3cd8f7dce61a461aa9ce92c953b",
+    "backend/ent/account_update.go": "dcd3b1d90fbfaf57ea7a37ae8ecb91578decf6d29896e755e32a5fab513ae5e9",
+    "backend/ent/accountgroup.go": "4bc243dedd7cb769d48d81fe20d143d91b56662309e45abc5acabcc2a0ce503d",
+    "backend/ent/accountgroup/accountgroup.go": "a8323702375ecbe96166c20888999ab73bebe2ab8f19dbd690987d67d02e97b2",
+    "backend/ent/accountgroup/where.go": "19d9bc27e523f4946dfebd951e590e199f1b267ec52c4ed4ad746827ba4eea22",
+    "backend/ent/accountgroup_create.go": "906debc58219f6103662ab2c4dbaee2e7f58f78a564a3ef23020154973d228f9",
+    "backend/ent/accountgroup_delete.go": "ce03ee1adb7728c0f9230972aea1f1bc0fb27472051430e0e63dccb628696458",
+    "backend/ent/accountgroup_query.go": "1989d0c912afbbae4419bd93a7903891a368d40f321e90a77230805839c6bf0b",
+    "backend/ent/accountgroup_update.go": "43f9bb75a46f1fc83ebb6cb610167e57cbf09bbda3b68a0c0154016ecc49b40d",
+    "backend/ent/announcement.go": "c46ec8afef8362f235a8d030f69ce9b99f44c6384c144d5f7714479748e1648b",
+    "backend/ent/announcement/announcement.go": "146df1f94b83bc29635b4d59b703feafa845a6ce1054f7b5d410f71489c31ef4",
+    "backend/ent/announcement/where.go": "0598b7ef6caab3d657819132ce3ac25fab89107edead248d632f2c2df26a5b5c",
+    "backend/ent/announcement_create.go": "ea5bd44138dfb317aa0e54bc740670f1df9f241e468fae558d7332b49bae7f36",
+    "backend/ent/announcement_delete.go": "399afa179eb48da3d0d34ae6b86dd12867c8322769447079f8ab643f4f05dbef",
+    "backend/ent/announcement_query.go": "49df37ec9184ea6d1878ee07e50d9bd61eea6d01aa409ade512e112d278a8598",
+    "backend/ent/announcement_update.go": "5cc150f388f14dfcb72819c1bf756a4fcd7e9fd209d9c94bec0e9eb6bca794b3",
+    "backend/ent/announcementread.go": "0f069707e2a1cb29d3611ac40684cfdc009aa553aa8a5f1a5ec023cd2ce63c81",
+    "backend/ent/announcementread/announcementread.go": "4e449c6530f37e53730532cbf348118068a69d1955dc3cf29b53c014575f65bd",
+    "backend/ent/announcementread/where.go": "b43d4de2a1c6ca15c31664f77b392875f92e626694cdccb6f89eae86c3e5bea9",
+    "backend/ent/announcementread_create.go": "ae628ac37c8e064c3ea761d75e9b56f0cabc0f70d3ce4e35b9f539b63f2a4188",
+    "backend/ent/announcementread_delete.go": "8e7fd5505134ffe023e23533583d48affbade7771d55ff654159c0e33b8a89ac",
+    "backend/ent/announcementread_query.go": "d2dc7ede6925c30c129c7630b3823e7bb4b0a10818f481fc89bfc8341399abd7",
+    "backend/ent/announcementread_update.go": "5042498f147b1d0eba859425f8dfee0b57342366acbbae5e6cc5a79ea8fd0fb3",
+    "backend/ent/apikey.go": "1c15b4be7d4de00bd7f09c25ee0e7e34b05384bdf48aee9da231d5e4cfa19682",
+    "backend/ent/apikey/apikey.go": "3f157f12a29e8959b6b6917bc617b53f82eef13228a9e06e20cd4c7004ff1a3c",
+    "backend/ent/apikey/where.go": "a38d626328f7f495661a58c3ec42b3ecc16961d8cf16f0f2af94ae34f274e12c",
+    "backend/ent/apikey_create.go": "c98c190e0c940e7051f5f5a7b11fe3c05f61fc0f5b049411e118296e44408b12",
+    "backend/ent/apikey_delete.go": "6269b1fced62c88556c33f32c834664ee75fd08b3323e50d696b82699214b13a",
+    "backend/ent/apikey_query.go": "f579e4867b1e64171ad7df7d8bfa541c1de8979d428dc86685a76723754e89c3",
+    "backend/ent/apikey_update.go": "243c680ab15aafdde21cfce5ac174ded04a11a7d1452426900072f87ac902cc9",
+    "backend/ent/authidentity.go": "4884ba8c9ff74c31ab332cf2c552e1cf2722024927cfc03fbda2e84145d2defa",
+    "backend/ent/authidentity/authidentity.go": "892a3ed7ab25479765b11963e5a004107d5310226fe74b6dc89c6ea98fa2651c",
+    "backend/ent/authidentity/where.go": "fec4aba7ce7ed9bd5676fcc34e95aa99e3f563dcd23f1c9a9bbf226496e14b71",
+    "backend/ent/authidentity_create.go": "69bf8a861da1555a6db96f466073fa3ac23b70defb38725277e10d3093e80b73",
+    "backend/ent/authidentity_delete.go": "01233f917ee149f0513a67b34fb5b289cf63efb05a354ac43325de24013def9a",
+    "backend/ent/authidentity_query.go": "f76e6291416cb9abd267990379cdc4cef927f87c5e11a1324e4cdfce870eb32a",
+    "backend/ent/authidentity_update.go": "0674146ce686b651be62450eda5d05d97de332e611befb0a93c8fbefe912af08",
+    "backend/ent/authidentitychannel.go": "a730b39f595eb687683bf32dd531b4ee8cc638c796c564f1a355079f13d7cd4c",
+    "backend/ent/authidentitychannel/authidentitychannel.go": "84a0123b141ec92586dd38eb0b1e92e65ad38cbccae800faa2412788ecfb5f9d",
+    "backend/ent/authidentitychannel/where.go": "134d74a7905305025be52841b69516e10e6a161b2807653fb0eb724261299ffb",
+    "backend/ent/authidentitychannel_create.go": "91bcb023e8c16f716ddd52708dabd148a8ec92212927622c10663063b49cb716",
+    "backend/ent/authidentitychannel_delete.go": "109454abef99bfb1bdaa8c4eaf5e003f0f3bceb370b1f806dc8489943d5d14b9",
+    "backend/ent/authidentitychannel_query.go": "1db538e917dd20707768ebe073a950790b40eb5772aca3c73f59f92080cc81b0",
+    "backend/ent/authidentitychannel_update.go": "cc5d6147f7993d83366ba9a73170a188c336adf0ac899629579f7493533e9c0e",
+    "backend/ent/batchimageevent.go": "738d9223340b25d7d20f33a33e092441c48ca2443e93eb6e1dc240a81eb53fac",
+    "backend/ent/batchimageevent/batchimageevent.go": "07604642c40ab113075f32878169c17b0dc798521cad13a0a3febfdd0463c33b",
+    "backend/ent/batchimageevent/where.go": "558b1ad325361c4a10b0e06f37a78d6917a935df77f0cb84fb33b4934f610ea0",
+    "backend/ent/batchimageevent_create.go": "8b964079bf563e3fd636be6279e8553a905636cddd9a030ce5e289eded4705a4",
+    "backend/ent/batchimageevent_delete.go": "20f66d1e3a4bedde31c084f16a7effa96aba2b12a25df4c9b8a9da966d92edc1",
+    "backend/ent/batchimageevent_query.go": "46223530712c7433cd1e6627f1948c9a2f0a8c29bac179f9359a22e09efbc746",
+    "backend/ent/batchimageevent_update.go": "92c1b06e0350f567ebe7f3091ad571942db628115a11df38963eca30abb5aefb",
+    "backend/ent/batchimageitem.go": "5d34c795d595e52b50b50ad7a790a48c4af20c198f68f5f999d6560b7fe65d6f",
+    "backend/ent/batchimageitem/batchimageitem.go": "b9cd2575bb03ee51fcd4ffa0f30e7162b228f6d57bb739feb7dd9a9963eef278",
+    "backend/ent/batchimageitem/where.go": "b8e6cb734386ab33db787dcfb911e85137f85c9c591f56ff94aa5257e4fc6006",
+    "backend/ent/batchimageitem_create.go": "8bd66410acd0f2dd4497e029712c2792d840ec51535f1e6601f1efe1888a3d5d",
+    "backend/ent/batchimageitem_delete.go": "2f92bcd0c864c47ee14448981e400c14d101e69d2f028454e504a6f238df3351",
+    "backend/ent/batchimageitem_query.go": "5799d7cad5d846734460b742c0168799ef4ddf1d6e9614ac323406a4345b82bb",
+    "backend/ent/batchimageitem_update.go": "e0dea9f2fae312019565924e76c08483b3fe5ac7c5c1ffe19ac0ab0cabef6677",
+    "backend/ent/batchimagejob.go": "649a38ada96edc411f335b2fa27598331d74060e4f6d8307b89f49102b5381e9",
+    "backend/ent/batchimagejob/batchimagejob.go": "952be6ba8f67cbfa11de4533e30061a606aaccdfa394e8eca2c18c1911fc538e",
+    "backend/ent/batchimagejob/where.go": "8af1c62210c1225a6c943ebf546c0e8ad063970effb060d35317d4415bd00eb6",
+    "backend/ent/batchimagejob_create.go": "0485a854df73ba397bf17ce919182504cb80ff25d0006a2cdff529aacc32a501",
+    "backend/ent/batchimagejob_delete.go": "e11ce721c8394fc73050256ca7d576fc69021535b06a77bb7ff207eaf65c5130",
+    "backend/ent/batchimagejob_query.go": "a2fd89423c1ab766c07a3f6c6f852649a50726a007f686ee8684452b04c357db",
+    "backend/ent/batchimagejob_update.go": "10dbbe09eba5fb0f3933b8958f64e9c68b4e867b941ac3c6083fa09f6db79c48",
+    "backend/ent/channelmonitor.go": "4912a94e02fefd3801400aa6b8f44707b3f7a34f3d141fd36b7844169a2ca668",
+    "backend/ent/channelmonitor/channelmonitor.go": "8e60bcde21f256fb04c0506580932e6562edfcf5394452b9e7b85840e1bffac5",
+    "backend/ent/channelmonitor/where.go": "ba42f151dc32519c575cae1aa0fc603411244ec14d19cac1f8b5e624c534b1c5",
+    "backend/ent/channelmonitor_create.go": "3643533b6eaf306100d53edb3ee7ed1e38567daf0508b24be64938082614e250",
+    "backend/ent/channelmonitor_delete.go": "c75dd1dac963dcecb81a88f70e0b1aa50d7b2164fa2abf505ee1a7d8ec8338f0",
+    "backend/ent/channelmonitor_query.go": "5fa3166700d94611608f0d2f8cc19d412d4d5927a7c8004b23ecc8829c40646f",
+    "backend/ent/channelmonitor_update.go": "81f59dd10430fc5db6b978950abe2fad01fa200afd55e0897569ac1e11d499db",
+    "backend/ent/channelmonitordailyrollup.go": "e22bf172afb8045aef109bf02c223ac07a6e7eb0abcdeffa659c0e84b70b17d8",
+    "backend/ent/channelmonitordailyrollup/channelmonitordailyrollup.go": "021750bd14b06e1b2d6a1fe8d7db4adea7f3f41470569a8207e821178d7ae079",
+    "backend/ent/channelmonitordailyrollup/where.go": "ebb65f108e3eee25ec6522b31d25040b63bb788cff42cf564d20b7e147380db6",
+    "backend/ent/channelmonitordailyrollup_create.go": "bca3bd0703d42a849d9c604fc7720cf6b166ee4cdc756323681b7cbef6f2fa64",
+    "backend/ent/channelmonitordailyrollup_delete.go": "f75cf40b150e7b6a2cad73f119ed7e6a01e0aff4b2bf805f5fc257598fb3f7e0",
+    "backend/ent/channelmonitordailyrollup_query.go": "06030bf5dfe01d539ee4d3b3c9d926dc85f608b8f4b2059c4b0dc9508a0ea9ae",
+    "backend/ent/channelmonitordailyrollup_update.go": "d3bdb8e383baedd49681067fa2950a8a36aa86adcc3424a26a492f701e33f467",
+    "backend/ent/channelmonitorhistory.go": "e41f5481c0d9dc119a8411f1d7af76eda009c0519b73ff11b07579ac4faf4103",
+    "backend/ent/channelmonitorhistory/channelmonitorhistory.go": "fb7f9a04d0af2ec3de25e35fd937ab0df0f1e993497801b3e9e1007e7d687576",
+    "backend/ent/channelmonitorhistory/where.go": "0c89322daafce3f12f367a9d1e8bb0d29c2ef75a7e65e0fd34b10911f52bf4a0",
+    "backend/ent/channelmonitorhistory_create.go": "225d7feaae50ef81b99d4ce17916da6fa5cf28ceaa729c4959abb96de8c73db6",
+    "backend/ent/channelmonitorhistory_delete.go": "1b42ae286b13544920be2e80d96e7a54659a99dc32eba1415e3e5ce99735e11d",
+    "backend/ent/channelmonitorhistory_query.go": "a6d3bc5d7277caa6a340a8a9c79bb4bdc03159ad63da8f5358031c989320f4a8",
+    "backend/ent/channelmonitorhistory_update.go": "28cc38be797ad4f6e1baeab777dc6e5dc216ada73674db168bd7c00dc9cb23cc",
+    "backend/ent/channelmonitorrequesttemplate.go": "94cdc58af34abcb2e2dd3d47f40907dc147f96817e41ec6a7d4e18196d7c573d",
+    "backend/ent/channelmonitorrequesttemplate/channelmonitorrequesttemplate.go": "59d77994309a5cd08fcb24130b0776480327c3a8b4a739c97f44b117bcf989c6",
+    "backend/ent/channelmonitorrequesttemplate/where.go": "42f379006586c0aaa0795765d4615261af596f9c6afae06a53563f5dabe05c7d",
+    "backend/ent/channelmonitorrequesttemplate_create.go": "8a694a76833c9fbb1c69e6fd1149f7decddada55a7196e812251fa5b2c4bb646",
+    "backend/ent/channelmonitorrequesttemplate_delete.go": "20a90cef668b0340965a09e9a49dc39912a122e4fb4203a872e59cc68fae638f",
+    "backend/ent/channelmonitorrequesttemplate_query.go": "8d74e3b9461520382cd4b1ff7043e3e4a8b019c93eaef41d636062351a902151",
+    "backend/ent/channelmonitorrequesttemplate_update.go": "a1f625fda0fba3d6b3a98fd1c35d09228e950c5251441e72afbde226910db8d9",
+    "backend/ent/client.go": "d9689d6e0f60642fcebfeba961fe587e2fa3f70c2c1e301242bbcd30642d61e2",
+    "backend/ent/compositemodelroute.go": "b131ff98ee8113eddcd5f59155e1849d1eb8f6d3cb77e6716b9a55cf08fef282",
+    "backend/ent/compositemodelroute/compositemodelroute.go": "6362ff8c2b829ef9897ef09946fcc985c982f9a431cf43150c06d824bad2e680",
+    "backend/ent/compositemodelroute/where.go": "4c820fdf38d36c8c3ef49ab8dec7bb003482fd0e60bce7715d507cbdc752d3c7",
+    "backend/ent/compositemodelroute_create.go": "5a0678d2fce005faf2029b7d6a98c904c7ea8117e135d72e6319a4fc14952833",
+    "backend/ent/compositemodelroute_delete.go": "f0de34332e700931f6d372803bfd61a27a13b671ddcd31fef41e329867b7565b",
+    "backend/ent/compositemodelroute_query.go": "a7da1bb8801aeaa2cae6fee891e01895d14aca58e283ca72bb705cf27400b400",
+    "backend/ent/compositemodelroute_update.go": "cd072eadb166f4bde94a2256d1111bc87300019decdd7cc0c98712f322d48eb3",
+    "backend/ent/driver_access.go": "3e7d997409cc913ae0c8b80b975d4750bdd8c705ac1e8eaaa6acf01ca5ef7458",
+    "backend/ent/ent.go": "6b46fd6f84d392356b284bd76138d182247237673b27ed422cb41970fc38217c",
+    "backend/ent/enttest/enttest.go": "0976bf060491bd1ed188fdad65e13f20b9db04f2d2ce7973978e1bfb54af8afd",
+    "backend/ent/errorpassthroughrule.go": "dc627f1edf1c561fd63691ad8ff3d11ff9edbfe27442691ae2bbf315f9893cd1",
+    "backend/ent/errorpassthroughrule/errorpassthroughrule.go": "8230f88df77b26ac78d1b181c254179f9a38747abfce6810965b2439d8a64c28",
+    "backend/ent/errorpassthroughrule/where.go": "37e5175dabdb83f251654b3d3292470bf233383507835953c5281101609aa6c6",
+    "backend/ent/errorpassthroughrule_create.go": "4b17c6d35511a44857b77d472f2a856a9ba02bdf442fbe985fedb969d2a297c5",
+    "backend/ent/errorpassthroughrule_delete.go": "2e9ada23847ac4b754cc53afd02c7910b54750ffeb4978f70e7ca8b6011cb953",
+    "backend/ent/errorpassthroughrule_query.go": "9be597c652229d9be30df62fddf0d46e940b8e8d8fd06564cbc88f4945de04ef",
+    "backend/ent/errorpassthroughrule_update.go": "a9f72274445a69eb3b3ab5c6a5cb72af9ca92889cfb33bff1d5f1bf9b47e2ee9",
+    "backend/ent/generate.go": "881d119de5f8a9d886f360777222cf01441ed3085e820d742357f4f0d44cc558",
+    "backend/ent/group.go": "fb507742ec4ba8768a078f8255c1f30aaffba7ae98fddf85d521ce617179fcf3",
+    "backend/ent/group/group.go": "a26e724257a94f7571af969d4c0f40ec578cccb3d487ca47b53f6d141911531f",
+    "backend/ent/group/where.go": "61e20f1b12ea22d90beec72964dcb2666c02dde9781625297a00634578a1713a",
+    "backend/ent/group_create.go": "40f0d878b0f5c653493ec9c01b32dc1b4584e6c88d7115147a45bc0d86c1b15d",
+    "backend/ent/group_delete.go": "24d4cfd74f7fb6fec34085508b2b0a11e88cd668361c9a345ac67c0aeef5c01b",
+    "backend/ent/group_query.go": "c50409bb88fb65ef2b6c02132a2acecd9dada1d044df53ce608db716f4b2fc4b",
+    "backend/ent/group_update.go": "774b1e17815958063b2024ed49c1f0eb9078ebdbff29ae2222a26428bd61516a",
+    "backend/ent/hook/hook.go": "701bc6518de31023be628fe5fc1e9e509c357f87a6e826d61b3ad9831e87adf4",
+    "backend/ent/idempotencyrecord.go": "839ea072f98aacc3c5c226ed240c7c341102d40ee9092a0f2470f7a89d7571b9",
+    "backend/ent/idempotencyrecord/idempotencyrecord.go": "9bf7c739b0ec04ce35029155071bef4704e14982c0519dbfdf832167e60fb4c0",
+    "backend/ent/idempotencyrecord/where.go": "4a431d9049454095bc83179c944fa84d969b6e6c767e7c77899bac0f98b7671a",
+    "backend/ent/idempotencyrecord_create.go": "90e9e374b43b79d044e1b3fab0b21ebad21b8c2459de4b6354e39bd4c9baa458",
+    "backend/ent/idempotencyrecord_delete.go": "8f814a47a5ec46405b397d962383820356f36df78dcf20de0bf52b697d2cf851",
+    "backend/ent/idempotencyrecord_query.go": "7e48ce4ed752678a6a17ca97cf70031d0aaa5a56ee2a7da7f095e0a64e9a926e",
+    "backend/ent/idempotencyrecord_update.go": "ab9e1a05eb4aa37d37183f7995309f880a1432ceec366c96aa3e8b6df24c0a0a",
+    "backend/ent/identityadoptiondecision.go": "a098edc182ca19c8518b50cd99ff3fdfb3de1a8420323cd3d83dbc7d0a8be5da",
+    "backend/ent/identityadoptiondecision/identityadoptiondecision.go": "aa77672ed5c4c3838342490db3c4d387a2a1f9d98371d107779a515f41c81b60",
+    "backend/ent/identityadoptiondecision/where.go": "529d67949ab3405153aa61af12f3579df8f7de3f84b6c2f4c85a2fcafece42f1",
+    "backend/ent/identityadoptiondecision_create.go": "b9f975d154c038e2cbe94af6f3c9c21f3e826aad4a399e7ecf48c4f1dbb7b9b7",
+    "backend/ent/identityadoptiondecision_delete.go": "2660e38fb78bc9292f4b0ad7c8cfaa8de41930d237a95e3e26095d33d8b230c0",
+    "backend/ent/identityadoptiondecision_query.go": "5c9f1f4462282d8378b0f382c6d3e42cc6312836dc56cc84cc0d10964c130b7c",
+    "backend/ent/identityadoptiondecision_update.go": "00d6a1b38658579df0baef8e286e62944dcc800b5860f7116c641f7f3afbf440",
+    "backend/ent/intercept/intercept.go": "1b56e23e29883e511504a2c6ff8e2e649ba374b81773ef34c1f326f532176332",
+    "backend/ent/migrate/auth_identity_fk_ondelete_test.go": "09bebc11f1005e794d6862ac8ef68b55b3f040f68d46dc547a4bc8fdf968cc5a",
+    "backend/ent/migrate/migrate.go": "ecad9fce48563ec2f7d6bbaab5e564825163c823ff38058b393845ba5ccf1f66",
+    "backend/ent/migrate/schema.go": "21bb7508769f9a8107829927b2063d9d9c48c34b7c36ca570168409e5b2a40dc",
+    "backend/ent/mutation.go": "c86aeb630ff1d01ba3ab42f47878de35e0192c79799a4957f237cfcfdc306e15",
+    "backend/ent/paymentauditlog.go": "54e4e715d9531f0dd493a874b2e2996e3e46d506c3a137618db4321c1e927a56",
+    "backend/ent/paymentauditlog/paymentauditlog.go": "df181d796e5caf8186ee10ae5030862300e951a01e0a1d314e5d3bc7cf0ef78e",
+    "backend/ent/paymentauditlog/where.go": "91211a79e2fd4d3c5e9cbc08dcd5915edc997909af1f0bf864d29a6769ebc298",
+    "backend/ent/paymentauditlog_create.go": "aa6c51f2d848d298a2a9a9205ab798c815df8adc6d6eb9b4b4a5e2dbb0cbff6d",
+    "backend/ent/paymentauditlog_delete.go": "ac2cc25b34e6841a6d06202219edfd11e6f0d81140b54e91533f5b1ea6e22a24",
+    "backend/ent/paymentauditlog_query.go": "b4bd82773e6c2918cfce86c8c1a2abc192279996d28286190eb4fa46b9b1a19a",
+    "backend/ent/paymentauditlog_update.go": "dc38a3946377ad9dcc0c6c1d6b92103b6f47830f6db79986b53420529502eecd",
+    "backend/ent/paymentorder.go": "b360500c56556fa151ab77b700ec10654ecc76747d557c0666b49cf53248f570",
+    "backend/ent/paymentorder/paymentorder.go": "d32a4271bfe5a37aa1cdcd037e8cf5a8f48e366b1575ceda20912b466bda9bcf",
+    "backend/ent/paymentorder/where.go": "60b5d384f003817efb7879a86e12e6c46ce73a8f5d10490b33dc86dade2e31a2",
+    "backend/ent/paymentorder_create.go": "b5771a86ae9528aea2a6c9679bf696a48de68ebb47d6f8aa9ff7ef1d5e5a6841",
+    "backend/ent/paymentorder_delete.go": "60531b6fd18d275ce0110821a4ca1d25f85b75357dfef8264922cce6f1e9d8d4",
+    "backend/ent/paymentorder_query.go": "436fb411820eedd1818201ac210c2a7fd40fe5f808105bba8bd9d902e0850896",
+    "backend/ent/paymentorder_update.go": "ac76b35cfe860804ba347f847b088f590f25170ecfe5c8d11236ab5ceb05f1e7",
+    "backend/ent/paymentproviderinstance.go": "7dc74a98c85c5fc3dd282a8e2b31a07e30db668e0bd381efdf55c99316ddfb80",
+    "backend/ent/paymentproviderinstance/paymentproviderinstance.go": "bdedb38b0b39bc0768b61ff09af81c48acad6f6140700069bae2185aa8d8388e",
+    "backend/ent/paymentproviderinstance/where.go": "489f8706fd8b51acd6e560c22223958209d99bad9592203054b31fd88a997d6d",
+    "backend/ent/paymentproviderinstance_create.go": "ecc58138cfe10f9f5a2caf8c257f7574a4717239984576e04aa34225190acace",
+    "backend/ent/paymentproviderinstance_delete.go": "9d8e0d60696529dfc57ea6e10c8b6559b9aa908d38c5c58088d77911614ecaee",
+    "backend/ent/paymentproviderinstance_query.go": "a9b66761e2a8cfad9fefbfa352e7753f77f2ca9dacbdb8ad02ee1ddf1fe5f49d",
+    "backend/ent/paymentproviderinstance_update.go": "bd36ea66ef2185b63adff641f346ad57c0c30cab80d35226f13659128de33344",
+    "backend/ent/pendingauthsession.go": "347b18763c4b1eddf34f9e494a1cb799a01faa10d29fef5f795caf5e848d029f",
+    "backend/ent/pendingauthsession/pendingauthsession.go": "044b8220c3bda6a8c0b0844e5b307acc9390ddc7186bed17f8d3e9dd53bea846",
+    "backend/ent/pendingauthsession/where.go": "875e572e496ac9e47eb8d001117c8dd738264cdfa35b7c7e5bdf5402e0239979",
+    "backend/ent/pendingauthsession_create.go": "6d47094433540e9c049aab469850495788e6c7ce2d05efebde53e7e366a68fa3",
+    "backend/ent/pendingauthsession_delete.go": "5d1b9fb3714edd2574e15f21bbe9ae03e3d6f30b2b07a3e210b8e735f9d384b9",
+    "backend/ent/pendingauthsession_query.go": "cad171eecd7c38cf1f04fbd8f3146940d74a37686b2de648699a70610beeb8f6",
+    "backend/ent/pendingauthsession_update.go": "878b83532bcc4f8604dd911638254b6dc9de454e60486b7e01f0ea117ce475a5",
+    "backend/ent/predicate/predicate.go": "2e7d5dbc9a0dbacd69f346c5ce33ae6a7b6a402ad5469fe01bc1fd50a1bec869",
+    "backend/ent/promocode.go": "6269c4479fae92c2f7d2e47c76ad30e15c457115fd996f526b0fdc5c27598179",
+    "backend/ent/promocode/promocode.go": "b57483ca7731276c4e762a774d908f07b10b8f80212e1a339632c8255d3a55a6",
+    "backend/ent/promocode/where.go": "1cfbd0003479f39aedc4ee79acaccfd2b92a64fe365cbc67573d7c18705abdbe",
+    "backend/ent/promocode_create.go": "668bfa54e24c93a5b5aaefe1f4932a38f0fb104d71b1b2447f54c563b8cd7cd5",
+    "backend/ent/promocode_delete.go": "31d46d0f55792d42f3698c5591c7bec1a553d0016c7f7761831876cc84c4c7fd",
+    "backend/ent/promocode_query.go": "377c79b39e2be3d110b02c4282ce14bd0ea903b9ed6432236b74f4d55423ff35",
+    "backend/ent/promocode_update.go": "a8fcca79f8bcd373672dc9810cf23ecf1253a72b848f1b21b12a5bc3b2043624",
+    "backend/ent/promocodeusage.go": "644f2c9561c6e7c73a285086b5a673c17dadc51919faec4700c0dc3c7f0c3c0d",
+    "backend/ent/promocodeusage/promocodeusage.go": "64cb277f88afaa559f39139c6624f411f3b03e63ab714767e8a30fcaeea97b80",
+    "backend/ent/promocodeusage/where.go": "974d33e4b25a4910c92583825c637fa4ca48071b4d39e710b612122e5e85b14a",
+    "backend/ent/promocodeusage_create.go": "194dec4027aa0c532b269db757b6b57185421b204635868cd4c8b0d368c7ba67",
+    "backend/ent/promocodeusage_delete.go": "3a45a9dd3c67aec71723d883e45fa5fbdd7672ab2d7f0a7702706385a7c6dfe1",
+    "backend/ent/promocodeusage_query.go": "38466dd1005fbcbd02de685a298eb1ff18836087dc7d1f663ce3b522a6eee71c",
+    "backend/ent/promocodeusage_update.go": "bbdeb893d7ebfae1b9326c961e46346faff9b8d3b08ad78f0d4ba62b3d3b2048",
+    "backend/ent/proxy.go": "65a70903dee8443026d0c0e65b5469696612b62682c961372149de318d195639",
+    "backend/ent/proxy/proxy.go": "f6af0493ec105b54aa31aef45d73467ae9b0b77169a075dde11af2ffa103d6d8",
+    "backend/ent/proxy/where.go": "536d9f223f8ec6b4e02ca78fceccd551a2e687b43861d56fea6ee2a38a79d979",
+    "backend/ent/proxy_create.go": "68ca18e01ef4614b7ee1bc842c9fee57320975e71a788f5c73f0ed80b2c16a75",
+    "backend/ent/proxy_delete.go": "75c2fa0b843e914b2c91812b79d9a46f452102082691aab66c0ff6009bf619e9",
+    "backend/ent/proxy_query.go": "61b09cdbf82cd45a5a8a0195ec6ac35281cfe3a53410fe1ae246fd3da4290213",
+    "backend/ent/proxy_update.go": "582fb2104d42dadbd2a12558447083fc6c676f4a327a6341060fe0ff5bf54e10",
+    "backend/ent/redeemcode.go": "b78f8fb81095a39ac405fa2feb668b58abc62db8c4712524b9bfac1f69646d9a",
+    "backend/ent/redeemcode/redeemcode.go": "d69fb70c5e226f9a7e1e354534723512fcf5285d28398e78dbd085026ec2f3cd",
+    "backend/ent/redeemcode/where.go": "05b6d7c8649962ee9095d9314d9f8d2ca37282a2e0bc8762afe484d8156cf506",
+    "backend/ent/redeemcode_create.go": "e48b5aecde91d5ecbcffe4d209d24afea39a372608e6464a4ce222a5de20a200",
+    "backend/ent/redeemcode_delete.go": "d077f188b0192a935d5524d1e0c72af0f45da7abef368eb2543c749ad58f54eb",
+    "backend/ent/redeemcode_query.go": "b1fda1e23461b53fe306620eabc9c7ca846b0b070edfc63068d626f150dc578c",
+    "backend/ent/redeemcode_update.go": "bed76a16e2ea187ab32ec48730c665d3f91d772c81bfa0c7f722523ec52b06ac",
+    "backend/ent/runtime.go": "e3fbe82ecd2441faafa4213becf0dc3577121d4ee6f489f583c53d9322710864",
+    "backend/ent/runtime/runtime.go": "d90bcfedc93c697639377b46f290c6efb98b1c64a7912be9d6ec343329c5bc88",
+    "backend/ent/schema/account.go": "dfc1cd50c5d0736234fe5c5553f49a12e8153801a7a06a9ccd6ffa4dc7917ff2",
+    "backend/ent/schema/account_group.go": "209d0c71aef796416844d64ebe7aa13b57468494f2c48df4eaad4fc68b3a5e2d",
+    "backend/ent/schema/announcement.go": "c7b7fbaf283ec84fa6acd000de63f522d400e9b7f3352779c1546979ab9e62ab",
+    "backend/ent/schema/announcement_read.go": "d7a6ad02c28ec66bac7948f53e6477e7abad914d69ee96cce7ccec8ad776b794",
+    "backend/ent/schema/api_key.go": "a44131c73291b90081cc9e93848f995bed2e26369b0c38da3a65c7e472e205dd",
+    "backend/ent/schema/auth_identity.go": "499e0b02102d0264a2bb6e07e3a02504b8f946de717cbc86e744501b8a9ff28b",
+    "backend/ent/schema/auth_identity_channel.go": "660a965811e65a2e1b2507a5bfb04fa59b92f67cfd2fcbff8d106d98073fae51",
+    "backend/ent/schema/auth_identity_schema_test.go": "1b9f45f9c8e8e5ca6e30f517285110dcf1dc3cc178e999649374ea3feda41668",
+    "backend/ent/schema/batch_image_event.go": "a77d3988686a2971668253227e502b5a609a00f1e015ab323245ad0dc5eb9721",
+    "backend/ent/schema/batch_image_item.go": "4d57d2d5f210779d3455bc0b5a39fb9b420b2770fd5a331d3315c6277ac94849",
+    "backend/ent/schema/batch_image_job.go": "01d5b7e423f17591f74f5cd982827e367d6fb3c2da95320769a85c4041071cfc",
+    "backend/ent/schema/channel_monitor.go": "7fb9fd79d19807c2cef20807f8c7689667bcb32b9df8ddcceb1784290f0f918c",
+    "backend/ent/schema/channel_monitor_daily_rollup.go": "9317ccef924a68a7cd347df491ef4952f62cda05f3059cc4100087bdcd3a8b0c",
+    "backend/ent/schema/channel_monitor_history.go": "c417c608574cefdd9766e2cbbd1fee6e19b3649f4506c7e19394df0e9a3deffc",
+    "backend/ent/schema/channel_monitor_request_template.go": "4fd34ca1965d48c1d5174132a9805ea1bdcfd72ea87854e37c6472ce8c0a85b4",
+    "backend/ent/schema/composite_model_route.go": "eae0dbf26ba7217ae73df79564a52eec82cfa61db4f84968114f8293e7d0868d",
+    "backend/ent/schema/error_passthrough_rule.go": "5a9ac183e52d1d9179064ded3085470010d37ccff608fe815abf32c717209835",
+    "backend/ent/schema/group.go": "83824a99bba2d8dabc6f0d0cd6113693c0795cf01571760c23cbf33bd2b8a797",
+    "backend/ent/schema/idempotency_record.go": "97d39453da93a2c29dd181c60415024051e7abc1f7f6cbb359ff4451b3a482f4",
+    "backend/ent/schema/identity_adoption_decision.go": "e2ce101ceed71186695ee415f1555dacffaa4ec612084305c8dd33b936ff73b7",
+    "backend/ent/schema/mixins/soft_delete.go": "cfa2588dc84452a37ec084dfa88f11e8e09864bc990829a7b23c6a41c174fafd",
+    "backend/ent/schema/mixins/time.go": "e07761a1312ea64edce5e1cd4e63e2dcd3ea3753258e5ba83f8b50a3339a7e05",
+    "backend/ent/schema/payment_audit_log.go": "8729a8bd8cc038f66e11a6d00732f1808c526406660f515757f320a3a3036b6d",
+    "backend/ent/schema/payment_order.go": "3bd061fdf838c0264ba8f2c756671d87326b4d32a50a6f1be2a9d3291e155456",
+    "backend/ent/schema/payment_provider_instance.go": "90fcdeac829bfc65212cc02ea1ded7a3dd0eac46964d39546d33ea78d873b7a5",
+    "backend/ent/schema/pending_auth_session.go": "c2850638620478689da1976e65bfa8f5ba02cfc3a848091e6eaf003786936f5e",
+    "backend/ent/schema/promo_code.go": "9a5c3c5b1bf15cd33b2f074160107b039933427c7c077d5da08e435d0cb27a59",
+    "backend/ent/schema/promo_code_usage.go": "833a872bb339c56931ee0070fe3d404d4c26d3320d19305feececd32c09b0c76",
+    "backend/ent/schema/proxy.go": "cc71c68a58915e361f04811019de57693d6f6b51f62b03942c23adc2e696d88b",
+    "backend/ent/schema/redeem_code.go": "80db58da371352aaeb027f6a98b8527a176c84c64ffba873c855c77307e4a188",
+    "backend/ent/schema/security_policy_keyword.go": "694fbb224d52b1f271e2be325afc8a6a697aee861db42fd829f025efc5156a95",
+    "backend/ent/schema/security_secret.go": "ec1f2a22cc1d7fc7654153647b246241c883683a268d7c4d5b44fea70282dfd6",
+    "backend/ent/schema/setting.go": "b237b73537116ad7c02487f9ac5068e25c7b42e497437f2b967be91f413c8ce3",
+    "backend/ent/schema/subscription_plan.go": "a131adc9a1b37d5dcda960f5f5c9ceac75e437a455af479da5d76a418e04acd4",
+    "backend/ent/schema/tls_fingerprint_profile.go": "f8d0046e9cdb8177a34053ff47f883de96df44e407610cf582d034999744819e",
+    "backend/ent/schema/usage_cleanup_task.go": "67bc7e2b1488f472f2d64db378936a2cb3e481edee4d2dff3cf821f0663bc26a",
+    "backend/ent/schema/usage_log.go": "d8ef79f914070d7875d1ece895226cc6c408d63fea20ce0d29a0b3cda80befa2",
+    "backend/ent/schema/user.go": "91e76482045d7b268511f8e9f6e5d6b2053ea60fcc630f19a5086b35530d66f1",
+    "backend/ent/schema/user_allowed_group.go": "1d714b0005f3a5c7214754bb6f1859c8011d1c940243e53d3d989c1a2b3b7f89",
+    "backend/ent/schema/user_attribute_definition.go": "03a10c44fb26dc038314cff41d0c79fbe2d9aece580b95ce7832f88ba037811e",
+    "backend/ent/schema/user_attribute_value.go": "1c0da2c7e95fb82d1cb151a2db0ec7acb79b7e4ee722b62a14155791fd372e89",
+    "backend/ent/schema/user_platform_quota.go": "19d853a57ef9fb6e83df75cc94f7097fa495a254ecf147f3dfff04c07d4c5e56",
+    "backend/ent/schema/user_subscription.go": "58ab438b5f33b127bdf4c4ba5f6f906113d99f289726c51cdee79d018f10c3b1",
+    "backend/ent/securitypolicykeyword.go": "d2c0613d1a4827ced43c7c03be2828dbca24074cf309d50c005db502b24ad7c0",
+    "backend/ent/securitypolicykeyword/securitypolicykeyword.go": "f682ff9fa984c776f1c9eb91088c598393515689251f565e692df610c6c5bd37",
+    "backend/ent/securitypolicykeyword/where.go": "52cbd38d5b379c5c02018fc8e50383cdf4f935d5a052c09431dce1cab11fd402",
+    "backend/ent/securitypolicykeyword_create.go": "af0efeb8bbb110371b60dcd10c2896e430336abb196de9bb6a9c2fe5277314f4",
+    "backend/ent/securitypolicykeyword_delete.go": "93c87ee8c830c81af70a7ad11d2f50f1ff1d1f21296abeb0e3acdfb3903b2cd6",
+    "backend/ent/securitypolicykeyword_query.go": "58fe31d0f5f07cec5617cee09171eb0ea60832b15e42216ea2491d5dc29de013",
+    "backend/ent/securitypolicykeyword_update.go": "e99d11b5e3e1123a9fe6269e9404a9261332d17b402ae06984dd952c39033103",
+    "backend/ent/securitysecret.go": "8a617d7ddc1db169bc480c718855fcb7575fa7c15b337177b063e680f1ee5c28",
+    "backend/ent/securitysecret/securitysecret.go": "9b729850bd5cf52ece23c2ff8dbd63b7b6c8fdf425cee257d830115d264d769b",
+    "backend/ent/securitysecret/where.go": "2544966aa3abc38c5f8e4c92e4b22827f3cb5f2e7a5747410ac2ef6eea6fe3d6",
+    "backend/ent/securitysecret_create.go": "51ad2d9030ea985e1b806d2161c6bde705f6b596248cd0b819fd0d55f547d069",
+    "backend/ent/securitysecret_delete.go": "4e5d3f59d2d7733ee94b81e5d83559160750c06886f5fbecb428df9ee98119dc",
+    "backend/ent/securitysecret_query.go": "1f70ac2dd963c369dd5fc5b6e879057db80767b05071cc36400e4d15c4ee13a0",
+    "backend/ent/securitysecret_update.go": "0efeb1440613723a34c9cc9abd4da3d6611224695780e190f076627018f08261",
+    "backend/ent/setting.go": "050a98f27aa301ffbd6944afe833c1bf176b96179b5f16050b30e12991f24db5",
+    "backend/ent/setting/setting.go": "f82316d9cdd5fedc4a9d07a0de75d24493f4e9d22d73b7544890193378c89f55",
+    "backend/ent/setting/where.go": "b41fbcc4695437fed97be935cf07cc0be86871b2bd57f51658a28168c10a4d06",
+    "backend/ent/setting_create.go": "6bd4ce7dd0b4f2fb0072e5575fc409e7b279f0245deb84fda3e52aac4081d572",
+    "backend/ent/setting_delete.go": "243acd1b3f8151e3950cd0fd7c8f16334fc91df6fbd950c94d26b68c72a90325",
+    "backend/ent/setting_query.go": "21f002646c4a834a6fdafa564da41b369944bf44df20a2c517cb2bbe2dfd61b0",
+    "backend/ent/setting_update.go": "3486742420c596dd4c1df7155755645cca4ab8651dba96cd775bd868d9f3853c",
+    "backend/ent/subscriptionplan.go": "0ba4681eab01c525e33f6a4b0cf681c6359d76d84a6d07d84f8159163d256a08",
+    "backend/ent/subscriptionplan/subscriptionplan.go": "f9ebc8a28191cba51d0f0a8ab47a86adfd1326f3e117f6bfd89db39ae72f863f",
+    "backend/ent/subscriptionplan/where.go": "f002aef17b437a6e136423b674eda44b0dcf20026c9ec683b0fab33c6064eabb",
+    "backend/ent/subscriptionplan_create.go": "6a9b4f01ad6aa3d85a213050b705e2fb5056872b10e709472a60aa0075db0116",
+    "backend/ent/subscriptionplan_delete.go": "64d909c8b5426b7101dfe99fcccd6c5efebe70439bedac841a99126e3ded2298",
+    "backend/ent/subscriptionplan_query.go": "abc84f60863ac14e65fd23bdf1f2c112a78573511f47e8101e17b38b06b8695a",
+    "backend/ent/subscriptionplan_update.go": "cded858fb3a539d74e9d52ea4cec4d60862321884eec54ec212c2acb23272896",
+    "backend/ent/tlsfingerprintprofile.go": "97747e5e1f98793146adff008ab05a73c9f48abd87734a9a097c2ff71b7df485",
+    "backend/ent/tlsfingerprintprofile/tlsfingerprintprofile.go": "d47f3e8eec40b8568909a13cbbea170479eba628a6c4307ddc9dbce7580cd374",
+    "backend/ent/tlsfingerprintprofile/where.go": "3a0593c7e20ac62c365d33ae43314a8a3424208dbb7c1d21be31503419ff4de9",
+    "backend/ent/tlsfingerprintprofile_create.go": "aedf8537c9c38e43c7b498c4622dbe698f8f9b964bb282952ea0b7461d5f3876",
+    "backend/ent/tlsfingerprintprofile_delete.go": "10741f357ca9e3152d5c8514c4fbe3e83e90dc9936cae886631b9f365594bb50",
+    "backend/ent/tlsfingerprintprofile_query.go": "5fe20249fb9712d3c8f736aa63652a5d554ddadad8dc65362904481ee8fee5c4",
+    "backend/ent/tlsfingerprintprofile_update.go": "05f4d0f8cc3b147a7013139b237899e84b7e84204297a505062e9aa066cf2169",
+    "backend/ent/tx.go": "97c3c66dbdd0db7d0ecd57267200de09e8aec6970f3540aa0b6d066eee68a200",
+    "backend/ent/tx_context.go": "39205503771449cc1b92cf941fc66f4bd9b91bd6860611af7ca148fd0b662bfc",
+    "backend/ent/usagecleanuptask.go": "24a3b9aca4a5284b52555f2f18b3ded119ae03f554b5a3a350208b78d2577307",
+    "backend/ent/usagecleanuptask/usagecleanuptask.go": "763e6cc146a2ac5f7d0d3fdf19e9a2f6f8c48bbfd9f7c116f60126d229e2a81e",
+    "backend/ent/usagecleanuptask/where.go": "f077e8267a06927a8b3efee0d0bcfec23ffa9721852199e87f8a1f0884b13573",
+    "backend/ent/usagecleanuptask_create.go": "d612af8a0a3c9c2788c392dba97516280128d35f0d6ec338d4b8296976024f59",
+    "backend/ent/usagecleanuptask_delete.go": "5bcb6dac39831cd422ec4bec0dc6c0468ea065552e6b4f181bc14dc82f50776e",
+    "backend/ent/usagecleanuptask_query.go": "8056c5e43c945e47ee2f5bb37b76701d7addd03a410fc8d1e5e27de91fc5aa46",
+    "backend/ent/usagecleanuptask_update.go": "49b946e4316d78bf0c6a92def65f4eec750395263d21a7d70ee3521155471184",
+    "backend/ent/usagelog.go": "c4630ecb7f3175c1de2aa48b511170662e0ecba84fa44917a06391592ffab72e",
+    "backend/ent/usagelog/usagelog.go": "d95688da0929164f52722f8f371e7912e6ab6c2442913c6f5c1a9caded989b5e",
+    "backend/ent/usagelog/where.go": "1af5cdec12f64fb4cd6c762a7a6a89078e4138124c00cf012c0436de2d0b8b90",
+    "backend/ent/usagelog_create.go": "45c8236527c6695df113eab1301a242e108cf673c0499b7fa279ddd361de092c",
+    "backend/ent/usagelog_delete.go": "6f911c52d39830b082936a0e7b922d8b33872684edb2bfb746de7bf1c7ea6d29",
+    "backend/ent/usagelog_query.go": "44b5cd4f25e075fd3f11819e16a097cf93ad4a4df3bf110cc87718d0275f7079",
+    "backend/ent/usagelog_update.go": "965081e0622f55d63a2c2e4d96035a5fc8ba1ffeb2e06d8b07fd554e43baa720",
+    "backend/ent/user.go": "37062e3cdba608de4ee5d8118dfe35d28ec81a4466335e07b9f3d5492119d26d",
+    "backend/ent/user/user.go": "1011110ba4ffe5062901fa042ab0fbbbbb1bb32b1f75e1f9dc8502226ccfff1a",
+    "backend/ent/user/where.go": "b79056bd45f4c349f687779516cc3f780ed292edbb38f4f1b94965529c7d77e8",
+    "backend/ent/user_create.go": "99c1f70f9d080484b34fa06465eeee6ce1d9aabf1523d830be658ab7d68739de",
+    "backend/ent/user_delete.go": "c8313d71c0a02f93d81ba2b92e0d395b87b4602da4e26eb3e9d0fc04b29cc204",
+    "backend/ent/user_query.go": "9fcd46a4168d0f593b998715b4c2ee1b1ca56d5244b31029540db10a436bd500",
+    "backend/ent/user_update.go": "4d7b650e35863d0eee3b80265769c05693aded499b138188035f712076e1e498",
+    "backend/ent/userallowedgroup.go": "69a4d7f7b71cd42c090d1d7a8f38a2d830ae78b82172e101a43993cd47fdbc5f",
+    "backend/ent/userallowedgroup/userallowedgroup.go": "c1fd817686b782253613fbec68bacc6a4b0e9957cb284b8d305e63e1e5d836bf",
+    "backend/ent/userallowedgroup/where.go": "c968db882a6e725af14531ee47026f51e55fd8779f62f241625d7bb9c5772f54",
+    "backend/ent/userallowedgroup_create.go": "058daa8e95041dc8b3705cb8c0318d8cd92abbf4fa4ac000351b6f37af600c9a",
+    "backend/ent/userallowedgroup_delete.go": "b27233b6f65c8e90c9a63140f1ea2dedc25ba9bf8c454b1c4f73ed186a87d419",
+    "backend/ent/userallowedgroup_query.go": "aa84ab9c5a833e66020cfe47b042fbb62d3597181a8eb327b696a6af7e71531e",
+    "backend/ent/userallowedgroup_update.go": "2b213e1e1cc3b0c28a468e9bf05d57627be14473dc94f28e5f1a11efdabab564",
+    "backend/ent/userattributedefinition.go": "bdc3eec7058bb4d1393a038a30eba4162a8b5ab82d6fabd2091c1ae96d5ab235",
+    "backend/ent/userattributedefinition/userattributedefinition.go": "76edd269760cca56f25472449dd30be04ca0dab1f7d9673440d0c6b81bedc317",
+    "backend/ent/userattributedefinition/where.go": "1b2ebfc4a716acafb5130a8b8b1726a668a85385bd940bb34103b3841bc6537e",
+    "backend/ent/userattributedefinition_create.go": "1dfce62fa0c09e74524e4786828b26de71dcf18816bec9fa7d872634415e4ab6",
+    "backend/ent/userattributedefinition_delete.go": "d5c2b67eb9aa2bdab1a026710a694064ae74a5395bb41ae1590467e250342799",
+    "backend/ent/userattributedefinition_query.go": "7300fdb7714f519ba7d9db28bfbb61129a97d9af2084be2134135841b6bf7279",
+    "backend/ent/userattributedefinition_update.go": "ff32f5e75cad90d3a39a4aafef23cf3b043405c2ef33b931238af4b8d5516f15",
+    "backend/ent/userattributevalue.go": "5c2c1216b64cfd6065e1fb3128c24737816b9695d2f3b7dbc934402f343a226f",
+    "backend/ent/userattributevalue/userattributevalue.go": "9e1bbdb906809390dc35b1c728fdda6a77ce0a7180cc42cbbc3e39e614a4560b",
+    "backend/ent/userattributevalue/where.go": "8e89e704f0ef31894cd2c9e5324efbcc704bdfeba45d0b2094a63b86564b9e69",
+    "backend/ent/userattributevalue_create.go": "0ffeca2ee523480c069b5cd7eec78945110fc484ca94adcdcb6a2f9c884704f7",
+    "backend/ent/userattributevalue_delete.go": "3fe5ad5d0aae2b4a312577ce04af2eae24065c464f9250f90e6853a13dec3d7d",
+    "backend/ent/userattributevalue_query.go": "eac1c6eede93ba8ad9ca40fe098077b3e1a8602e733c77118923e6f0b8d8e18d",
+    "backend/ent/userattributevalue_update.go": "7593cc0ed7dad1f74033920a0eebdf92ec15847a13f0f09df17bd7aa5c92f211",
+    "backend/ent/userplatformquota.go": "5a79c6667cad55c988e253121ad2bf6483f3095f661e5a8456586069f478e61d",
+    "backend/ent/userplatformquota/userplatformquota.go": "9565a136ed255c94f4845234ecbef05b4ccc9c152815540e7877242799ab8444",
+    "backend/ent/userplatformquota/where.go": "58cdbb2cbee9bfd26b50ad9655b36c9ac9277f2d9ea0ddbbc196c0136a3465dc",
+    "backend/ent/userplatformquota_create.go": "381068a8ec056548ce470ceba37a5fe21fe555d1a20511a7c11ac81160257907",
+    "backend/ent/userplatformquota_delete.go": "16e4d15f9ceb24c85678054a0fe1138838672fe688a177d9f6c8e1f60ffe9ea0",
+    "backend/ent/userplatformquota_query.go": "e6aba899fcf1a77b104bae6bae451ea1f7f03ea3cedd1ebc5b88c92d1e1fe9ab",
+    "backend/ent/userplatformquota_update.go": "2b1f72c149555c59b419f132c4c7281f4b75f2dfa809b69d33908cb4b92020a7",
+    "backend/ent/usersubscription.go": "fd46ba264eb16c9440ab7b6f6f5276797fd2b8447ab0151b4ce92007f29d1ec4",
+    "backend/ent/usersubscription/usersubscription.go": "792c4cc62d3ac1d418c0b12be3eb856a9743195ef0e67706b090c8389f94b839",
+    "backend/ent/usersubscription/where.go": "16fe6b031181290bd8cc092a181700ccfc0433bd4fda107912563f5775fb3e4d",
+    "backend/ent/usersubscription_create.go": "25a4aaecfe15bc8609dabf66f48fd2b79caaf7150cad505b91b2384acc591b3f",
+    "backend/ent/usersubscription_delete.go": "5e820dba2731130c12d89a477228ffc94127d33ab634258127d7d833f493829e",
+    "backend/ent/usersubscription_query.go": "28504340bd0be8645a8d62e52b45d2c9ee697370f7843d10a546f3f111a9a000",
+    "backend/ent/usersubscription_update.go": "cacb6079d57bdc202fd497d69def09f3625498885a95375e936c293bcec75a69",
+    "backend/go.mod": "65b8c7c7fecf647ec60db230ac4fa7fb1847db6569ae527cc4670ea7f1242c34",
+    "backend/go.sum": "15e1a3a9bd56c9f2690435530e1d560c07a52ddbe1293a6ad6248c2aaced66f7",
+    "backend/internal/config/config.go": "51798e76cab319eb4786dc0112dd4d2b882e6ecf884f0413f64e9e599fd9d969",
+    "backend/internal/config/config_test.go": "9f3a8f5bde86cf128a1367513877aa87daefe1b09712d649370ab338fec92310",
+    "backend/internal/config/env_reachability_test.go": "789a33f69914263f03db8cdb11702b13ed6d180880b8e2f726b4fec0f75f0615",
+    "backend/internal/config/image_storage_env_test.go": "dd6b09cb0b8e0109cc89b875c6579c523ddc285e58c42d802d1da26dc543b8b7",
+    "backend/internal/config/proxy_probe_config_test.go": "6ab6e046630b9f7fbed8117680dab91ae0861f268391ad6977763a5f907fe89a",
+    "backend/internal/config/validate_dingtalk.go": "96f1f7d2d177f9325cb6d352f2f5190a07e284079ef404fcd9a750d758fc8002",
+    "backend/internal/config/validate_dingtalk_test.go": "f8624d895b0f388f524fac6752c90b5cb23a6396322685f0fe3d99640cadce48",
+    "backend/internal/config/webauthn_test.go": "2e9b04859d0227597e4308e7cc3736646f218fcbd1a405a79becbf8b208ef096",
+    "backend/internal/config/wire.go": "a9699f3a3666a613f3bcfdee695ec7118dbb58ea9efbc58681796926338c1d2d",
+    "backend/internal/domain/announcement.go": "47971003a1e02d43e1fcd114421e4decf4e5d7c26cc941c862eab58d1c669936",
+    "backend/internal/domain/channel_monitor_quota.go": "e4a6db08122fa32e4b659adfccbcbe873f70a0ded44e8f867de9954ed11e3ff6",
+    "backend/internal/domain/codex_models_manifest_config.go": "57c7d5cddbff9ec38241866e41e82004bc518ae28b5ea44d26e6dc15cf71a1ea",
+    "backend/internal/domain/constants.go": "6921ecde8ed1c00bde269efc869abb4886ca94fec7588e40672b176fe8d635f0",
+    "backend/internal/domain/constants_test.go": "348534424bfe35fad4e52e6fc63a9b0fdf62bc09b66ddfb4b04e30fd600d3a12",
+    "backend/internal/domain/model_allowlist.go": "a73c748912aa39affa6e051d6ef1a4fe86b304311464f6be2c0a24b49142ebca",
+    "backend/internal/domain/openai_messages_dispatch.go": "c26623f1ae4c35a7ee9691feab637d1cc58860a62f5ef169e5721d8f775e2ab4",
+    "backend/internal/domain/reasoning_effort.go": "368dcb4ec3b208503a4ddc2bfe660988921aa0e565bc968a4e86c48c0afa1bcb",
+    "backend/internal/handler/admin/account_codex_agent_identity_import_test.go": "6293507e8ff83c1283bf96bea47ab9c17c9770400a6bb448b19709412fea609e",
+    "backend/internal/handler/admin/account_codex_import.go": "f1b555983cc626978c74b83e7231d7a4c876ca47da2164ef648572ceb0ad3373",
+    "backend/internal/handler/admin/account_codex_import_test.go": "1799d4c50e18bb5976519fb12030a0d6f2c5e5d576803d288874cab3d3a4dd58",
+    "backend/internal/handler/admin/account_data.go": "bf6d2ab9bc1acd07f94d2ac39dd385669fdccd8077f7bedef276790a83085fff",
+    "backend/internal/handler/admin/account_data_handler_test.go": "7a8152438db7ba67106a1f9b5bdd9794d269dfbe18cb2863c58269d0ebd6f528",
+    "backend/internal/handler/admin/account_handler.go": "e62dcfab595e52618c106e570d9319195e157cf32600e6dc875c2679d9ebfc4f",
+    "backend/internal/handler/admin/account_handler_available_models_test.go": "cb6209a240c7e05454bf39a299ac7e3158e34ddf5f55db92d810ca729afae004",
+    "backend/internal/handler/admin/account_handler_batch_delete_test.go": "1533e02dae30806f5b7fa6e6faf29be209c9e2188e335336b1e9c7f04383f7dd",
+    "backend/internal/handler/admin/account_handler_duplicate_test.go": "69d1a2fbfaabf272b955d6bef474108cefa40be1a884d3431e076393ffc05729",
+    "backend/internal/handler/admin/account_handler_grok_refresh_test.go": "591114ab4a346d951b7823fc2b92a7c9d3c85f504f5c4469e80a9ebd99e34d79",
+    "backend/internal/handler/admin/account_handler_list_test.go": "2f093c7a0ad2eea25ba8cffe3e0c0e4763da1b4171a9d9ca87084e9dfbdc4204",
+    "backend/internal/handler/admin/account_handler_long_context_billing_test.go": "566d380e52db1438bcf2b8a9c4390b15d7395f4a470fba349a6b133597675b9c",
+    "backend/internal/handler/admin/account_handler_mixed_channel_test.go": "bae50ab62055072dbb5163bd6af430ba76ef287a25aa7d62a124f565c0902ff1",
+    "backend/internal/handler/admin/account_handler_passthrough_test.go": "3f3f535621b1e46366195c7391ad786aad48c86d981801345ab3a608e627db93",
+    "backend/internal/handler/admin/account_handler_simple_mode_test.go": "4d182270260e85282d83d59efd215748459a2be8252590e9af02c2bd3984a40a",
+    "backend/internal/handler/admin/account_handler_spark_shadow_test.go": "992b4190ae8a0bff7568f9b2ca7f88f37f7cd894d801f4f1d8a7f648a9bf191e",
+    "backend/internal/handler/admin/account_health_handler.go": "7a0685dac658147663ce334aea062b502173531e3c1596af799930e69bbde3b5",
+    "backend/internal/handler/admin/account_ollama_cloud_usage.go": "5693aa5067f408407d51c715b359657d13d0eef924b9b4f7af32a13c91f6af3a",
+    "backend/internal/handler/admin/account_ollama_cloud_usage_test.go": "e4cce75f4154b0e2e8f8b7a4749a5c59aa9b92e157e7de431d1f2f2b31d90e1a",
+    "backend/internal/handler/admin/account_shadow_parent.go": "ed27b273acf850c6ab70d0fb267a859e3e069c63e484b4eb862613a77f7c459c",
+    "backend/internal/handler/admin/account_shadow_parent_test.go": "02ac4f1f0b723f64bc6b9a6b20ef8701193f9d0b3f5fa1efa560aee84e5a4ae9",
+    "backend/internal/handler/admin/account_today_stats_cache.go": "98b70021971756a48401ca19df232ec8440712299ac0d2756ce909de993b1074",
+    "backend/internal/handler/admin/account_upstream_billing_probe.go": "505cb44af23d2dce26ffa233b558607413c1032ff5ab3410502d6e22dbfd882c",
+    "backend/internal/handler/admin/account_upstream_billing_probe_test.go": "004224aabb0c2cb2c8b8d354ef9febb0931c199317a0665a93401a9f00c21eec",
+    "backend/internal/handler/admin/account_upstream_billing_rates.go": "17a5877dcd15a50051e68869663837ef3c467449dcd026d622b924edd604055d",
+    "backend/internal/handler/admin/admin_basic_handlers_test.go": "9709fc1e14c300ae10a3b63a8991b0765841d4d1720b910f336571a47775405e",
+    "backend/internal/handler/admin/admin_helpers_test.go": "7355693d25edfd83e4fbeac6eb130c3f9d7e00d387ec4dc3b4100f86d6a202f5",
+    "backend/internal/handler/admin/admin_service_stub_test.go": "6cd779bd8718c631c3bc1a22030259a3e442168b472100c9cda2b4a543520ce3",
+    "backend/internal/handler/admin/affiliate_handler.go": "4b908b6bfb9fd4c809fbcd2dfb9c0caa1d7484f416e1175eab1e0ba417544616",
+    "backend/internal/handler/admin/announcement_handler.go": "3ec7a59fcf81d85c06ac06467b32a1243092377fc0addaf83e3c181ce47d8804",
+    "backend/internal/handler/admin/announcement_handler_sort_test.go": "04c250c01e5786498175872b9a8351e3aa6b591c17c5517a12c6eaa558d7be4f",
+    "backend/internal/handler/admin/anti_degrade_handler.go": "bb94979f400af3b699c5db225486fb58ff55d8fef4719c1466227de2957ae9d5",
+    "backend/internal/handler/admin/antigravity_oauth_handler.go": "c47c66c111768e0f0a2c8a1efc5bc4b9c966f8af4cc8b654e8d5f92ca3a3cba8",
+    "backend/internal/handler/admin/apikey_handler.go": "3e829a4e2c427d5b85ee6c5fa705b9889b8f4c24b439973d1f48519d023bfbee",
+    "backend/internal/handler/admin/apikey_handler_test.go": "1b7b75fdb705569273cb8d5a56ec6f3c05c28db61ec14477c44ef5ac55801c57",
+    "backend/internal/handler/admin/audit_log_handler.go": "67907b1b924e83af688d6c321c84e9dfb6d7efc8904b4f6d81f52214b95d1893",
+    "backend/internal/handler/admin/backup_handler.go": "60888382f40cbb791f14e556f8c9fc5d999f81216af0fdf5a6e08a283270e077",
+    "backend/internal/handler/admin/batch_update_credentials_test.go": "c05e12d068af25d62669534529ef4d22e2f740e795c749ab44df9c2fca3d84ff",
+    "backend/internal/handler/admin/billing_export_handler.go": "1b1f58a4eb3559549220f39a86c6afda32b605c615132cbeedb4fd925cf3234f",
+    "backend/internal/handler/admin/channel_handler.go": "9598e4d1dfa926925c0dcc5446bbbb065c4e47ab07d4027aa5d98efe0afed3bc",
+    "backend/internal/handler/admin/channel_handler_test.go": "2c98cdade415303e0c4972cffacb93fd92e98493aa31772df446c21fc9e44d2d",
+    "backend/internal/handler/admin/channel_monitor_duplicate_test.go": "6dc1472435926752b8ea2a0255c5463096ae822b45bfcc66e3d80c3a28357188",
+    "backend/internal/handler/admin/channel_monitor_handler.go": "1161a0fcaf8186bcab4725061e63ae6757c7035c912a8a711d28e3dca383febd",
+    "backend/internal/handler/admin/channel_monitor_template_handler.go": "35b26caa7bb6b029f31a8900baad9ede6b50aa2feb4da47d948e4739b28b5cfe",
+    "backend/internal/handler/admin/cn_provider_handler.go": "0bb8befb97725a53cce2365ee89f7e206685b7ee7904f0ecfc0d7d1aa5fc2bcf",
+    "backend/internal/handler/admin/compliance_handler.go": "06f0c9403bb7befe700bde22ec7d21b196d3872799385b96e2cd6c27e906a75e",
+    "backend/internal/handler/admin/content_moderation_handler.go": "9552529ef23cea8c394fb44d235a5ddd132dd2d5c1e0134c9419ee144f443bfe",
+    "backend/internal/handler/admin/dashboard_handler.go": "b934f0d946d8fd30b441ef23607f9847d5c11c5d14301dddb6f74aff75ef7368",
+    "backend/internal/handler/admin/dashboard_handler_cache_test.go": "76f735c0cdd83aa2ad3a8e605369b90076ec51a55608895a327b6d55fa045c1f",
+    "backend/internal/handler/admin/dashboard_handler_request_type_test.go": "8a3b451a0aa3fc3e025b8f7a794b4ef90ba03d55c7522629d63727c36b2f2d4a",
+    "backend/internal/handler/admin/dashboard_handler_user_breakdown_test.go": "7d3c6369db90b331c345a96ceeee342e9489735a59c40b10b7e84fe8274a86cc",
+    "backend/internal/handler/admin/dashboard_query_cache.go": "e5883fa869eaff51459a667071a3ee215ffe179c4162cf48704933133ab0a543",
+    "backend/internal/handler/admin/dashboard_snapshot_v2_handler.go": "f61bf6ac73cb814acd52d5f63c9c6183bf4ec29ba0c3643e1b1d3878fb6c60a9",
+    "backend/internal/handler/admin/data_management_handler.go": "90a7e9c551be8888b580c3b4e62dfc691c4d15473a6b1d5421a3f4918e997999",
+    "backend/internal/handler/admin/data_management_handler_test.go": "48979bfa9ce748984538522482b91ed5bea625f6a66cfb8457e7d11aa3a8fd89",
+    "backend/internal/handler/admin/error_passthrough_handler.go": "4677230d6f56c9f55cc9b64b75ec6c57b001e38be75050e2a5ba07f6c1640137",
+    "backend/internal/handler/admin/gemini_oauth_handler.go": "4b5cbd54571f85da61776f954fc17060125706c99a86daa5ddf4f7f117fd6bcc",
+    "backend/internal/handler/admin/global_pricing_handler.go": "415ed9313bde2891bd01d8d109f82f68f6037fa0dc69eed2443877ea07ddb6ba",
+    "backend/internal/handler/admin/global_pricing_handler_test.go": "9bfb3e153d19dccd8ef8f70e2b0f9de60853b9671f6e2232e2d4111e5f23b3fa",
+    "backend/internal/handler/admin/grok_import_probe.go": "6a0e5c981dfac81e49ecc0237f41ccb9071683c17b5ff36eb495d65c3120a71e",
+    "backend/internal/handler/admin/grok_import_probe_handler_test.go": "ec23881f1e0d7d1b4c19cfdd0c88b48091a6adc68ec9bd3c03bca7e3188c3503",
+    "backend/internal/handler/admin/grok_import_probe_test.go": "be51abc3d3f8ad633feaa39bcbf139aadce54509776f8e3205f724215782d070",
+    "backend/internal/handler/admin/grok_media_eligibility_handler.go": "72fa09a3d1e6f18fb5c87577cf8f612b64f8b6929a1dfe282e693a61c3f111d7",
+    "backend/internal/handler/admin/grok_media_eligibility_handler_test.go": "7ce0f13cbf94765c62a5d7362abb13cfb420b37fecf6dd6c7f38989e63501b37",
+    "backend/internal/handler/admin/grok_oauth_handler.go": "03d5c5cb8c61cb23439ae477903c27392c272f69e095e5b8d4600907fbb5d725",
+    "backend/internal/handler/admin/grok_oauth_handler_test.go": "a5a3c187be2a8cdf53fb5182e0d6b2c1db0d525676050a10e2044323a0b6a0b5",
+    "backend/internal/handler/admin/group_handler.go": "8fedd0ba598e53eb4c08dcf187f328f59ca0e6e696074577fc11c06b001a4cfa",
+    "backend/internal/handler/admin/group_handler_duplicate_test.go": "a568de95f70ce0e276f621b2cc76081ad1eaca47beb8bc56c583876df66f879d",
+    "backend/internal/handler/admin/group_handler_limit_test.go": "e844248362cf7a3e2fbfaf819afc5e5707653fafe8811424464c237d5abe3a69",
+    "backend/internal/handler/admin/group_handler_openai_fast_test.go": "72b36d1b83437d370da9e062adbe1899ba8ded7bb22f70fe06422d3d7a39e012",
+    "backend/internal/handler/admin/group_handler_platform_test.go": "783fe599e1c518ce779d38224ee88cf3c91d5f9929c28787d94c066ef8820cbb",
+    "backend/internal/handler/admin/group_handler_reasoning_effort_test.go": "810bf2a9a0a9e521702e94e142f4dc671df6ef5e5c041ea9f04ac3e2d346b46f",
+    "backend/internal/handler/admin/group_handler_simple_mode_test.go": "69155fe80e2584407cb275764cb6bef616f6eb8af6720cd0a2a115850f417899",
+    "backend/internal/handler/admin/id_list_utils.go": "7ab98719bb1bf0cc4e88024dd62c77b8622a9af3eccb0dcf801d8cd4bfd5797f",
+    "backend/internal/handler/admin/id_list_utils_test.go": "cce857155864a51cbaa14b69e7387ec31388bee103aba72689fa05816903355b",
+    "backend/internal/handler/admin/idempotency_helper.go": "48e34532b9bbd4b388a7b4bc6b6419b2c68ff8ee8247bf3939ec46b176c434b3",
+    "backend/internal/handler/admin/idempotency_helper_test.go": "be97ef483237e7ec2d1624f26a05400b4cc054b537910152843d385ef8696d9f",
+    "backend/internal/handler/admin/margin_handler.go": "97af9efe5b5a87c9492d6c565e9b39c79c96c36871ed70468ecd3eeb3c639f27",
+    "backend/internal/handler/admin/openai_oauth_handler.go": "c16646fa40a03af7171336082e8c9b3fa29c8049296cbb30cb9ab92cb234e35d",
+    "backend/internal/handler/admin/openai_oauth_handler_reset_quota_test.go": "3ca77fc30467cce9b63010e108e0ff85491ce9dbd85e1cc1dfa93df93bd24e2a",
+    "backend/internal/handler/admin/openai_oauth_handler_spark_shadow_test.go": "9c88082b4479f19217aa5dfc9d6251d9a0e53bd8cb4a8d3213b6bc2e404f1763",
+    "backend/internal/handler/admin/ops_alerts_handler.go": "6a0919674e6547ce271a01d795b17fc8a35dc5883aa2914055691203ba66e9a4",
+    "backend/internal/handler/admin/ops_auth_cache_health_handler.go": "66fa43689b7b3a48b6d6ddf9f64540e872080d870a5c2bfc88a4ee82b04e1913",
+    "backend/internal/handler/admin/ops_dashboard_handler.go": "a9667deee37200e81bfbbd5d8f19b56467a9b131c29b03190f88fb25936adac7",
+    "backend/internal/handler/admin/ops_handler.go": "99131f870b2c1abceec478827f48bb86823137b04c912f7f0277eff7dda1d0dc",
+    "backend/internal/handler/admin/ops_ingress_reject_handler.go": "11cc95c94f0d4c1b4e0840a4970f6b8c7623a99887d43e6837dcd57a3a0e5772",
+    "backend/internal/handler/admin/ops_ingress_reject_handler_test.go": "7a9e946d4c267ea9468df1bf1a431172a34c8948b1febd1303841bba89d67237",
+    "backend/internal/handler/admin/ops_realtime_handler.go": "1a165241ee786b40d1d909ea452164e9aa10c0d35010cbb039e5a8515f7dad62",
+    "backend/internal/handler/admin/ops_runtime_logging_handler_test.go": "162de66bf5c89ee0c95de9b9ece5b5cffe79fc166295819089867c743ef1f77f",
+    "backend/internal/handler/admin/ops_settings_handler.go": "638e19170f2e0dbcb6810621b1eda7fac67391b498706f1585a5e538b8094370",
+    "backend/internal/handler/admin/ops_snapshot_v2_handler.go": "3958eda6de96609ecc017a677582b0aff752cd0c3a3e27a7d2659cdce84fa9d1",
+    "backend/internal/handler/admin/ops_system_log_handler.go": "869487754781e2f0f9d791e954cf9e37ae73f94fff0644cbc3441d93dbe4ac56",
+    "backend/internal/handler/admin/ops_system_log_handler_test.go": "714e635735a48b6f13d6463f046c6a90096c2fe6e029e95d16fbaab78cf699c3",
+    "backend/internal/handler/admin/ops_ws_handler.go": "d689ad50680232c9764e2630df321b277538e65e53da0825c7baccccea02aa33",
+    "backend/internal/handler/admin/payment_handler.go": "ffbba895fb850c84d47fc45a7101dca715ef4d090fb38694425417d4eb821d3c",
+    "backend/internal/handler/admin/payment_handler_test.go": "a629b74e6e7e0433ba1c1b506fa7ab855b663d670188997bd9e1ec75ae41c95a",
+    "backend/internal/handler/admin/plugin_handler.go": "4cd07220ac40167fd8fb0b778b04ab834b63c8297241447d316058c89d8f46d4",
+    "backend/internal/handler/admin/promo_handler.go": "9f2a7049868cccddcb6c2c0d666ecd25dafff5f9b5c9c96b853212c09f721644",
+    "backend/internal/handler/admin/proxy_data.go": "7334bef89c764ca0218ecd26501bc4d542b7fcceaac1b77451ea85681055eedb",
+    "backend/internal/handler/admin/proxy_data_handler_test.go": "02332303d5a1cc8efaae76abc8690fdd0e45d12ba0b22f6a59cd9425b90e4af7",
+    "backend/internal/handler/admin/proxy_handler.go": "d8ea6fa83bc85624194faccf57a4e76222abbc21f29b703de8c8ad8577c5ccfe",
+    "backend/internal/handler/admin/proxy_partial_update_test.go": "554389e6e71231b95d6e8aba18478e76bd23fedd7e73bf2e448455a6ab13f0cc",
+    "backend/internal/handler/admin/redeem_export_handler_test.go": "833e3f75f00a592dbf15af228963aa4abc0949e7e4f9bec3e8da7147622fe06e",
+    "backend/internal/handler/admin/redeem_handler.go": "71002659a64743d0e371357db13efdfa0b1282f370042bef7f9c5a0e3af15943",
+    "backend/internal/handler/admin/redeem_handler_test.go": "56aac5a9ff41941d86faae73b1ca284386242ceff6b09954a1669df68735d0c5",
+    "backend/internal/handler/admin/scheduled_test_handler.go": "ac8a6612b3f0d09a77f430cf9692401f7b1fbed689a1df8bc7eacd3ed50ad4b2",
+    "backend/internal/handler/admin/search_truncate_test.go": "07c168dbd5e58aa1d586f3d95fa52dd9a0ff72dbad8c5ab9cc0a9a632e36ea34",
+    "backend/internal/handler/admin/security_policy_handler.go": "f5e6cdac9d2dd3da836d29e31d1529eed1aa528db091fb58e3ad75f91cb194e3",
+    "backend/internal/handler/admin/setting_handler.go": "e87e23f7c47e822671fcd9ef408e6cfda662c11a6d054947393c1ef011c6fcfc",
+    "backend/internal/handler/admin/setting_handler_audit.go": "8978b78b2b40ffecb79c95bbaec594927367e48c2d473e44dade7388fadebebc",
+    "backend/internal/handler/admin/setting_handler_auth_source_defaults_test.go": "3c1920b38e06ac1d1a4adffd748a429a65e65aa5d619369288bf206cc1a2eb36",
+    "backend/internal/handler/admin/setting_handler_codex_whitelist_test.go": "0651115388de69f7970ef03e20185ca4a07acecb29607cc83e33ade54bcac102",
+    "backend/internal/handler/admin/setting_handler_dingtalk_test.go": "8ac1fefe46cb63af7605d8dd15653d1fcf3cc5297577df4967299b1a632a23d7",
+    "backend/internal/handler/admin/setting_handler_email.go": "5e762464dfa34ee161d40009a1bf4e478e4e5f136068e389b82c9478d5420299",
+    "backend/internal/handler/admin/setting_handler_email_test.go": "4c18b80e995f48e91f44f1497b3cfc131912f9d72cbbcc828fd690a924287baa",
+    "backend/internal/handler/admin/setting_handler_partial_payload_test.go": "58a6378442ff8ec1caa5febd30fe5c7ac3ee930ce9af38883d78568637a86c9f",
+    "backend/internal/handler/admin/setting_handler_platform_quota_test.go": "ccd1ef816ec3c26ff185f6faeda5e730940551eabcc681de43611548de945c5b",
+    "backend/internal/handler/admin/setting_handler_runtime.go": "84473c6abc0c731e93a082f1f5df8685cd7cf8c2e0635fc0bdfdaa5f1b250348",
+    "backend/internal/handler/admin/setting_handler_stepup_switch_test.go": "74e83cac008260fb216d112e3ee467303527e7446f04f058f25958178a64860c",
+    "backend/internal/handler/admin/setting_handler_update.go": "bfe439033012b02a69d08fdb50372669e747422479b00dbf15b90727e1d58efa",
+    "backend/internal/handler/admin/snapshot_cache.go": "fd50a5de4e1e445c87c70570815f7b880ca334aa4a7e7dfeabf18e6d81c130fe",
+    "backend/internal/handler/admin/snapshot_cache_test.go": "adf68d7ade89b036208d3ea37f0213287617f58670d442d2e7b3417b1c091161",
+    "backend/internal/handler/admin/spend_guard_handler.go": "dc5aee68c280d0faa37ced14e6993bbeeabe391f4928608e4445fcffa1295635",
+    "backend/internal/handler/admin/subscription_handler.go": "6ab84e7d22efbb987d504e0f20b7241ab11e0d807115a41f2184f0040604db05",
+    "backend/internal/handler/admin/system_handler.go": "95c376f7ff8aea22697831d53f2e1c045f933058e1169fbcff57b3a6692ba87d",
+    "backend/internal/handler/admin/system_handler_test.go": "e45e05957746b51eb5996e663d59e2109f61d1a0ac5d4a3a1f7a4e7c956a1071",
+    "backend/internal/handler/admin/ticket_handler.go": "8c3b473fa77f917d515b3bdf1fb5749358846e00a99cd14251370c3096374928",
+    "backend/internal/handler/admin/tiered_routing_handler.go": "ec95017c3adf43b98b7d3ea3ae0b5d5da3ef7f5ba288fdcef9302da8e648a72d",
+    "backend/internal/handler/admin/tls_fingerprint_profile_handler.go": "ff6d0d968090bb78f7236e699d00e6f3aa58533083dc574abe5a48f5893ea77a",
+    "backend/internal/handler/admin/usage_cleanup_handler_test.go": "f541b69f82963c1c91c35a56dd79825c1fa3bbb2b0b8bf7a2a9f672faa585701",
+    "backend/internal/handler/admin/usage_handler.go": "fbd272d5540b1de6fabddaac94e8301b4de42b4434e913fd53f24d80ea0a29a0",
+    "backend/internal/handler/admin/usage_handler_request_type_test.go": "e1bf88b65feb29d8f329c9da302a06f810a2ce6ca0118d06a8159f01f923d47a",
+    "backend/internal/handler/admin/usage_handler_search_users_test.go": "cc0a64434f7966039e28dfa60e8cc9370a9960fe346b862dbab9d290673be837",
+    "backend/internal/handler/admin/usage_handler_sort_test.go": "7e85fec1e4787b525269e9c5bb8c2243e19976c032469a2cca16389963bec705",
+    "backend/internal/handler/admin/usage_query_cache.go": "f1a2af67cbb76c3d3e6b00c614839e6531541cdb94a4fdb4f8abbb0cddc61942",
+    "backend/internal/handler/admin/usage_query_cache_test.go": "7d069460b1713d7bf9781eb9e5a78109aba9b208f40074b98ef461fd5d57d884",
+    "backend/internal/handler/admin/user_attribute_handler.go": "44ee4d2266af58fd942302f57cc5f66a7dd87a7f4320acf05db0c0872230b4e5",
+    "backend/internal/handler/admin/user_handler.go": "27e76b76b9552b0a997590d554fa5088aff6e78a6d20e2eaba2fe8da14c03e90",
+    "backend/internal/handler/admin/user_handler_activity_test.go": "f4dc298e99a4b0a9b1b75791245b3872fa7ad39865262e775f7ffe308b08cce5",
+    "backend/internal/handler/admin/user_handler_batch_limits_test.go": "4ddc09741380ea505df235a1546d0f0ad3ff92ea74d6bb76c69241865b21c575",
+    "backend/internal/handler/admin/user_handler_get_deleted_test.go": "fddba8324167733c7b060cb274c8078ae541c61e3d0acdc36b4f88619ba230ab",
+    "backend/internal/handler/admin/user_handler_list_apikey_group_test.go": "3c3731ae290eacd848dfae876308c39e8c1f34b520070226c9ba3c012924df13",
+    "backend/internal/handler/admin/user_handler_role_stepup_test.go": "828f4895f836c93de0299c18fc5d53e44e79590232138a67d8536d4d15a5b697",
+    "backend/internal/handler/admin/user_platform_quota_admin_test.go": "886d7f17a8ca78d294515c0a1ecff9f84f65c7d765ec60aaabae4dd877f21b61",
+    "backend/internal/handler/admin/user_platform_quotas_handler_test.go": "084c6fddb2a10b2513ad049982b81e6f3e9a91db2a1a38ab66e82fd1876a4e87",
+    "backend/internal/handler/announcement_handler.go": "e49efd4665d691c46679d91eac4cb754452cffa64b9f83a8b03d359bfec4e468",
+    "backend/internal/handler/api_key_handler.go": "c90e3b91225c9e86395fe6f24cd46da55492c348c6a4756100d8ddbcf5c229ec",
+    "backend/internal/handler/api_key_handler_validation_test.go": "c7a6ea51e9084a3e95d22e7e83b158d7a8ddbb8403831ed5b45432cc4ecede03",
+    "backend/internal/handler/auth_captcha_request_test.go": "0ef34caa43c8ea163f1ec0c1aa1d270c7dd7d4e803fda44961f0d3c7e84e2326",
+    "backend/internal/handler/auth_current_user_test.go": "47ed41f8a533b2537cda513c4ddd555653ef11acb05737b3e4cb4e403c9d2c8d",
+    "backend/internal/handler/auth_dingtalk_client.go": "8d03cc73761f359494cf31a8d11fb52d141085a4938743517e363f041d05f89b",
+    "backend/internal/handler/auth_dingtalk_client_test.go": "16f283ca1e061b924ad0d0bf02843399b3a099c39b89071ea44e237d9885ed5e",
+    "backend/internal/handler/auth_dingtalk_oauth.go": "a362a900c390f22ee23e4a72de90d82aee00f6f012fc006182eebca2b8e36276",
+    "backend/internal/handler/auth_dingtalk_oauth_test.go": "bac61fe092d4d56262d7efda639fde0e2059d7f6b190cbd78b873092130ac4d2",
+    "backend/internal/handler/auth_email_oauth.go": "c286e2c599b3e37c58a2d248149f432649521722da791c909533f28377ff0712",
+    "backend/internal/handler/auth_email_oauth_test.go": "8b51e7006604a4298b23d382676e804ca7ab0b4a6b261c56d2c241a3cd4d9527",
+    "backend/internal/handler/auth_handler.go": "772ca95f629cfacfd1e8f9d8f193e40257f53a4a6848917b82445a280ebdf0f4",
+    "backend/internal/handler/auth_linuxdo_oauth.go": "d947ee9020deb21f3f7ac8e2e455856a7326ee293215550479088667f0b2416f",
+    "backend/internal/handler/auth_linuxdo_oauth_test.go": "4a3a276979044b96224018d678c1140e40b9151edcc28056d6edf683e4aa996f",
+    "backend/internal/handler/auth_oauth_captcha_start.go": "66b0c7af7a08b5cc8e59af9f6af6edafac1e76dcc8cfa4fa9840986ccf10a9aa",
+    "backend/internal/handler/auth_oauth_captcha_start_test.go": "943eeb74420411f2c2a95878fabe7b7cad2772d33bc45d988e931c9e065ef1cc",
+    "backend/internal/handler/auth_oauth_logout_test.go": "cf638c3e93393ee09348b688b03bce6ee653bc9dd4cc65fd4fc2aa8aab063326",
+    "backend/internal/handler/auth_oauth_pending_flow.go": "7a9255d0cc3130af37f36640a4d992e2049e873be0f3787c02c7f3cbba837b70",
+    "backend/internal/handler/auth_oauth_pending_flow_test.go": "12b436824e53c34d46e7507733775643b2dfb929ff9f06fe14dd47c002b65566",
+    "backend/internal/handler/auth_oauth_test_helpers_test.go": "d03fc5b9fd0cd145430269b57d6004908694742295477b5f771a7f10bf6d7498",
+    "backend/internal/handler/auth_oidc_oauth.go": "2c1e77c6c3afffd11ee6eee9b1961e9416334fcef564a3f8e6d10a50ea6c9616",
+    "backend/internal/handler/auth_oidc_oauth_test.go": "b5dc8a54a951a3fb3a9a052965911533ce05d0b473d81393217d11a8328c19a6",
+    "backend/internal/handler/auth_session_revocation_test.go": "04e15b5107e1a33849fe87738e3fcd9da8fe2480a0dae40a50600a1e38dbb25f",
+    "backend/internal/handler/auth_wechat_oauth.go": "c861d9981001c2110b13a76a2a6daada15b6825ca3b44cfa4f31f5678c509639",
+    "backend/internal/handler/auth_wechat_oauth_test.go": "b26507f91c2d35a796ce2e3b4068759738984ade1fa657872a54fceedd4b002c",
+    "backend/internal/handler/available_channel_handler.go": "e0ef52ec9ddcf06c1c61d4ed8ab5f8d27d3ce8a05119b4b38b7dcf7338ee5994",
+    "backend/internal/handler/available_channel_handler_test.go": "c50f2d2048dd41339aa360a7863e7fcb5d45f212c0d5e0dcbe3e66a863bfff04",
+    "backend/internal/handler/batch_image_handler.go": "92deb66110647516ee4726ea8221854ca0ed45a67f6135e8e21b7298ffe8031b",
+    "backend/internal/handler/channel_monitor_user_handler.go": "23179ec5eb54b1a19888dde2f52ab5e431cc2e915c944b1ccf1a3ee237b0df64",
+    "backend/internal/handler/channel_monitor_v2_handler.go": "6c578ae2ae32ac2435926791cc9625a3d6c18c350ad5bac93fbdd3f89ee2d479",
+    "backend/internal/handler/channel_monitor_v2_handler_test.go": "c4370bad62f5bbe99c5e2dacb63e2d22ab5282cdf74944af44d72eb6f67e1e6c",
+    "backend/internal/handler/chat_completions_image_model_test.go": "ad893e583f7231c1d77c9fe29be00b77f37a8e27857c4c012990319d9887d277",
+    "backend/internal/handler/composite_platform.go": "0ad0d296950bb54bad376ea08293695a0e4fb42a39a93ed6ec01295bff8a1d04",
+    "backend/internal/handler/composite_platform_test.go": "4bc64bdea47f2dc6ce03b439d7beffde2674a0d44fc2cb70692b748a52ab89a6",
+    "backend/internal/handler/concurrency_error_response.go": "f03b1e46d8150fe1008b52a382292b74ebd54bf97636c0c0c3b11b406f8ae7f9",
+    "backend/internal/handler/concurrency_error_response_test.go": "22e5909c245f5a69443a91e66c1af7a8088f5036374f2d7016fe456bab49add7",
+    "backend/internal/handler/content_moderation_helper.go": "7ecff893cdaffdabdd9a7b64461fc47e2e86f7bd4d1f68bca6f952ce2a76d1d0",
+    "backend/internal/handler/dto/account_mapper_redact_test.go": "fad3540be3949cbe4490d0ee96ef865431f761dc5e9b9a256cca4eefd0d3eb35",
+    "backend/internal/handler/dto/announcement.go": "b5d3745d43d038cb8d44a5db583a831efd2289ec4a1641f24aa2e2989a26bda8",
+    "backend/internal/handler/dto/api_key_mapper_last_used_test.go": "e8092becbb00fef4c41d8fb099b469744911eec9803854efb72d3fab352cbffb",
+    "backend/internal/handler/dto/channel_monitor.go": "ab3f85e5b57cdec3aec2ad2405312d631b19ad92bbe3540a3e85057b3b1db256",
+    "backend/internal/handler/dto/credentials_redact.go": "7c8e2566ab1333d63fb19351d5adcc2162c732e9078c3d97f128d2dde844d27d",
+    "backend/internal/handler/dto/credentials_redact_test.go": "0599efc56f97147d234daa1a6efdc701418003c92dec1263c421093dd785e2f2",
+    "backend/internal/handler/dto/group_mapper_codex_manifest_test.go": "18216aaa03990fb18954a9e06420597bd7ea7a36b9b34b5286504a9ebbb0c604",
+    "backend/internal/handler/dto/group_mapper_openai_fast_test.go": "f9d1b5f0e268ca0b0524653a042ca716bf8f07b46c249cf16897d5848c0cdd3f",
+    "backend/internal/handler/dto/group_mapper_profit_visibility_test.go": "564200c0592045fdf727ba3bd24da1c92b0b2bd6bbda9eaedaca767f3350d48b",
+    "backend/internal/handler/dto/mappers.go": "737616f3e0e8d25268df827ac774007a2a4fb343a621f4955f6319347875e1fc",
+    "backend/internal/handler/dto/mappers_deleted_user_test.go": "7faa9071b20b2f68fed559fee177edfd89e021dd042ae26fd7ccfa7e0da2f63d",
+    "backend/internal/handler/dto/mappers_usage_test.go": "8b8db525e7ca6c14844b73f7acf0d5e410028cbb6058f055b541234917c8ff0e",
+    "backend/internal/handler/dto/mode1_seed_redact_test.go": "3fd5aef9a416a1f166e118ccbfde5d6ef62270df0878b9f0d8a49fd2ba07f48f",
+    "backend/internal/handler/dto/notify_email_entry.go": "9c30263ab13b076e3d32d25efe540e0c2a6680ab9f891d76208a360ff48db6b6",
+    "backend/internal/handler/dto/public_settings_injection_schema_test.go": "25d54564a1dc5371523007a1f775a907b0b4c97c3c0007044580e069cd350f0c",
+    "backend/internal/handler/dto/settings.go": "27ee8fb674aaf3f5e960f04595f4ff7817499012f9e2daa53c41fd4dc2fc27f7",
+    "backend/internal/handler/dto/types.go": "d6d7e6600c8820c112cc7150da702d89cd7cec035009a531ee67c3fa49c7e795",
+    "backend/internal/handler/dto/user_mapper_activity_test.go": "e8a7940465eacfbe15daa335a14213f41866ecdb77e20b3e8e95290e8180ee13",
+    "backend/internal/handler/endpoint.go": "a9f7ce8fbfbc6942ead79d8ff4ecf9c0931e1e3daf791a8c38322b6ff119fe0d",
+    "backend/internal/handler/endpoint_test.go": "2d260c5ba7b34e0df8bfed51684302e4009369d22ae25f20a4649960413977d6",
+    "backend/internal/handler/failover_loop.go": "bc9733c415df26c41f618e1afe21653724253e9596ab75f037aea42b27f2c82c",
+    "backend/internal/handler/failover_loop_profit_veto_test.go": "2d0fc0a3d86a0e207a24b58024a41ee62d6a3e4fcad2cbddd96b4d71df9f9e8c",
+    "backend/internal/handler/failover_loop_test.go": "30a611e7ff3cb680d45588ac6ab0c3499b2b0faf53c838da345c862125f06fe0",
+    "backend/internal/handler/gateway_handler.go": "99223b6beca4f987580e52e88ee6c912cb011003bd7bcf3d2f6ac29147fc5d46",
+    "backend/internal/handler/gateway_handler_billing_error_test.go": "c9c42270a0932906974a163548008b1156acfdf2d657daac487918aa1994596d",
+    "backend/internal/handler/gateway_handler_cancellation_test.go": "754d112572ac59a61a7d7160b1c8a5e1257bc3545f5e3da949998d5484280642",
+    "backend/internal/handler/gateway_handler_chat_completions.go": "9f31abc63ba0a2adc9883c3180f52e0e568246ec183c25a51878f851c9e37927",
+    "backend/internal/handler/gateway_handler_error_fallback_test.go": "d3816e6942810c546874625e1bf173bf7a4b8fe09b0332fb7406675c85f1f03d",
+    "backend/internal/handler/gateway_handler_intercept_test.go": "7d7a53b34bce074f95937e22651d0a08944127d51dc95898ad9fed708df8dd4c",
+    "backend/internal/handler/gateway_handler_responses.go": "b87e493c41ce1c1ec5e21d854e6ca8e9addf132399c04665fe85ed047ce49076",
+    "backend/internal/handler/gateway_handler_stream_failover_test.go": "897be717a6031823d4224a348cfd57630e9d6a3152de96fe854a9eadd043ef9d",
+    "backend/internal/handler/gateway_handler_usage_test.go": "85bb6c2e279fa7e735155b1efc8f5302c6fc36349a2064173b29ab368d871a19",
+    "backend/internal/handler/gateway_handler_warmup_intercept_unit_test.go": "d4fb2dbeaa7e027e9367cde3d986ed1f5baa3077f75bb0abb6423eb5e4b13755",
+    "backend/internal/handler/gateway_helper.go": "18ba089a95681c8ab61ebcec03acaaad8feea993db9dc3386791809b287ce5e4",
+    "backend/internal/handler/gateway_helper_backoff_test.go": "ab005fa164e3dc8ed6b7f12a65535ddcdc4b82febbdd822239a822f5477e54dd",
+    "backend/internal/handler/gateway_helper_fastpath_test.go": "30e90736ba15cc5dfa7dffb85c47c4ce564cf940aa08e4923e90d89daa75b300",
+    "backend/internal/handler/gateway_helper_hotpath_test.go": "6b9f9ab1da4e55131714d84e998b566cbefe832a92e61907105ffba3b981d9c3",
+    "backend/internal/handler/gateway_helper_test.go": "923028de4528911385d9f1232feeddeaf24198757012801db9527ea536e53204",
+    "backend/internal/handler/gateway_key_billing.go": "51c78c078de0d353917349a617f50312518c2175e12488baf49bd5bfb2c6d9ac",
+    "backend/internal/handler/gateway_key_billing_test.go": "f985d0efb7c84e04a8f11241be25e1efd84a4ec9e06e7c3ff305e2d970c1e5b3",
+    "backend/internal/handler/gateway_model_allowlist_listing_test.go": "01a2ef921fd5b23d198f574c9363cdfb15492ab38fbe51852a6b415bd3ea60a0",
+    "backend/internal/handler/gateway_models_test.go": "ffc300303397099b4b733919f74dab2e940355bb623eaffd80abd329394a6b3c",
+    "backend/internal/handler/gateway_web_search.go": "e25c65e78b6ec9e4ba67ec035e0a93f9d8774c525966dad0bbc10d2ac91b209f",
+    "backend/internal/handler/gemini_cli_session_test.go": "fc29b4a3721964d15833aeeb8ab356dc4b92c2aa10922dacff87b330cb42ebf6",
+    "backend/internal/handler/gemini_v1beta_handler.go": "0387bdc0c4c07e2804ff05fee6eb57b214de090c07215c5dd83b2dcca6548a9d",
+    "backend/internal/handler/gemini_v1beta_handler_test.go": "88c6eeaf81c7ef776eb5669461cb89f0f11af6c27ea7883264a598a5a6d94261",
+    "backend/internal/handler/grok_audio.go": "f4904abaf8e9761487c6dba06fe5af1cd9ee0789092c066d6836620318b40ba3",
+    "backend/internal/handler/grok_audio_billing_test.go": "dc0ec8b59b63321cf5e79e0c5bd283fdf0a42e340e06aad04036f386b37f2126",
+    "backend/internal/handler/grok_media.go": "908c53e34227e96b03ad131c707faaec02ed2f7cc236c050ded492fd837543b8",
+    "backend/internal/handler/grok_media_test.go": "ebf81ed33ce7aa14fadb9796000b98ed57d2ca45752d432c47670ec0f978ddd2",
+    "backend/internal/handler/handler.go": "19e2cea4d2e235f5a3bc638f957b0d811203ab0ee3b14193e5d2d3c0f47f1986",
+    "backend/internal/handler/idempotency_helper.go": "8b6ac6821289cfe10b70600d4ce454c0c56edb901924e3f883031535ae4dfe4b",
+    "backend/internal/handler/idempotency_helper_test.go": "4a19ce29662a935fca5d754c97d10e91b3177dec5f70f8f4e02eda3e472ca3e9",
+    "backend/internal/handler/image_concurrency_limiter.go": "a04fd664ee88136374806b2de37ec40bf01cab60ea9f8512d7dc8b3d72500f5a",
+    "backend/internal/handler/image_concurrency_limiter_test.go": "6faf9a412ec35aac7a53bd5a3e037d641afd34817b56eaa37d8bf64cf87c3d60",
+    "backend/internal/handler/image_task_admin_toggle_test.go": "d8685152d86464d074f8dd00c10f89c6b0df0e1fafb82edbc07882929a17d9a6",
+    "backend/internal/handler/image_task_handler.go": "7138e1953441f1b0eaf0f7ce318bfb247ffd8f27d20e654747af9dc966a93053",
+    "backend/internal/handler/image_task_handler_test.go": "f7da69c072be30c47d15bc55803c64a706791a891041b58c48a0245261339e36",
+    "backend/internal/handler/logging.go": "822b1c6aed073fff04d5df16856fe7626928b717c049c149d41dfb67f9704a36",
+    "backend/internal/handler/model_plaza_handler.go": "42be862d8620a183072f59139839cf6cac44b11051a8d3ec7e436ea2fe288c5b",
+    "backend/internal/handler/model_plaza_handler_test.go": "4d601227f6ace31b3a592978bf7017c7b9cf1e9498cb3bb2e2fac51a2a244c61",
+    "backend/internal/handler/no_account_error.go": "538d43be9794f293a435ec0e9a8f5a5e9188ec7de04859d97b6bc75dadc47e1b",
+    "backend/internal/handler/no_account_error_test.go": "e975689513c6cbf00389649840251544341be10a5367faaab29825a59e674928",
+    "backend/internal/handler/openai_alpha_search.go": "131a0ad70e17683d0b8a105c5da872a95be5c12e39d5a16fa59e577cb2d57592",
+    "backend/internal/handler/openai_automation_bootstrap_test.go": "53a0adb941a05d84768a0703d2d1b4ecbcc10e7b16af6507ba070e96164d8f26",
+    "backend/internal/handler/openai_body_limit_failover_test.go": "1389b06deb93038b63ea1b815204d0d5e669c0d0debd8275a0cc3802d4016cdc",
+    "backend/internal/handler/openai_chat_completions.go": "fccbc95a6827d1ef22343b1ab7ca99a1fd06882739683a899f4597f9c6d8e658",
+    "backend/internal/handler/openai_client_disconnect_test.go": "f47d6fb717287e04218fc115f94fbe63589132b46db15fa8c8f8a82951f59643",
+    "backend/internal/handler/openai_codex_models_handler.go": "06a3b76241082c03e633f6ae24bc976d3dd8256972f7400b14d53da740099ab8",
+    "backend/internal/handler/openai_codex_models_handler_test.go": "989a4bd4f74c01f3a9c14d38a27c8cd03015bb3973d2da0fdc6f1e3309a2ce21",
+    "backend/internal/handler/openai_delegation_bootstrap_test.go": "ac6566b670d6014675d3f4a7f62be2af1d76c8ed21e4f18e79b5dac7a57d4597",
+    "backend/internal/handler/openai_embeddings.go": "42c5b81fd5fe9325a600dd70773d5600f9fa20ecbc4d6d5bd5529c85ff41fae1",
+    "backend/internal/handler/openai_gateway_cn_dispatch_test.go": "34943bf74ade0f61a3092458d45d4a131834e7994c84e5f4e08b900698fbb798",
+    "backend/internal/handler/openai_gateway_compact_body_signal_test.go": "ae006c300fa2fb9ff28b5fab209af29f3548292236da47032425d399eb62ab81",
+    "backend/internal/handler/openai_gateway_compact_log_test.go": "2b9f16cf765f0da800cf4e68d9beaeeeb004e49e641d7d359ca432291c223bb8",
+    "backend/internal/handler/openai_gateway_count_tokens.go": "9de42177d51a829caa1629f9a872c8db472bf9cce3250fef3f7b27dc8d4b7db8",
+    "backend/internal/handler/openai_gateway_credential_failover_loop_test.go": "6edd5736361506e6a2ba31dc608fe8630f1e332f2a5d372dca8901d5ddba2c0c",
+    "backend/internal/handler/openai_gateway_credential_failover_test.go": "9e5d1f2a43f9822f6f902fbdb2c0077e95d6a148b8d5d0e6e88e6b8fafe09640",
+    "backend/internal/handler/openai_gateway_cyber_test.go": "973de642f3edf4fcdc66bb50633a3ba37fa57892aacd8660698ea91f9ddcec72",
+    "backend/internal/handler/openai_gateway_endpoint_normalization_test.go": "7216f8360ad38b3dea10446c14603d39de72207b98c750eb7ebc8bbca931bf1a",
+    "backend/internal/handler/openai_gateway_first_output_timeout_test.go": "c5d949cf5f1a79c2053032101bdf18ad75a750c12f57584058e20aeaffc33eae",
+    "backend/internal/handler/openai_gateway_handler.go": "e1466d35a61461c9f010dfec346bc4935307d7eb8d683379a27271cbce697567",
+    "backend/internal/handler/openai_gateway_handler_test.go": "51d40fb83a785530a8c4300f9c283095eaff0792bafc0d3bf66fa2a3cee0ddfc",
+    "backend/internal/handler/openai_gateway_reasoning_failover.go": "196e70d42432ff07f671f96b986be6a27b796fa24578b12e8afd73973c26550d",
+    "backend/internal/handler/openai_gateway_reasoning_failover_test.go": "369a70f99f4297d1b27c5b71c7cb095f99c0476a797eacf32dbaefc853834696",
+    "backend/internal/handler/openai_gateway_usage_context_test.go": "9aa7a9f284f40b17a6fbf2682ee6a689c9047c3c94a480a312cbd141d98c3328",
+    "backend/internal/handler/openai_gateway_ws_failover_resume_test.go": "e5a31d0b8c68d8e6283704ed0d8861048351c68464943b3aa797e3b2ce698ee7",
+    "backend/internal/handler/openai_gateway_ws_model_allowlist_test.go": "6b588c9343395aef29fc8275a8d88a939d26eeae0c6e06b8eefceeb16722dce2",
+    "backend/internal/handler/openai_grok_image_intent_gate_test.go": "bc39d1a0e15b02b49b9cc29e56e0f23f9acae10f936dd0f0d5e7c86ec6dac8b2",
+    "backend/internal/handler/openai_image_intent_hint_test.go": "615648f2cfc92257db16a56b74e84e1473f705b7d525176a8c02ccc535eb0757",
+    "backend/internal/handler/openai_images.go": "01ca86c8ec3bc01a777c01b96268f4abf8e78c2ebdd7dce7fb49b7a480b16723",
+    "backend/internal/handler/openai_images_controls_test.go": "edbf26e6c173e432b873f6f3588108cd859aa08c1392e9d1d74af1fae52d49f2",
+    "backend/internal/handler/openai_images_failover_test.go": "527f2eeb34350389d9c8f3915739d6c0a2c1d3acff0977b31b689ce7a5318267",
+    "backend/internal/handler/openai_live.go": "e847801682c10b815b6beab0237d6a6c2c566c5d6c6e60868a53318fc2678994",
+    "backend/internal/handler/openai_live_test.go": "e8c84c7826ea11920ebc3fa0600c45664f6c5773edb64a7bee67093c9b5c38fe",
+    "backend/internal/handler/openai_models_handler.go": "32775a523695bde094b749d08e877a75576a47ca131dadb610cf6ec05e5d8ce9",
+    "backend/internal/handler/openai_models_handler_test.go": "fa0f9128a01e4952025c7fed28580faa4c33359d71a40c9d9ad122b0c7159023",
+    "backend/internal/handler/openai_profit_slot_recheck_test.go": "f5a58dff417cf65bab5941b428d0418e27b9f287bbe19d03a6917222e2971112",
+    "backend/internal/handler/openai_profit_veto_budget_test.go": "067710f35090b76edb84164f88787801e933db1c0a14a0931fd640f7b7abc67e",
+    "backend/internal/handler/openai_quota_platform_contract_test.go": "0d20ed3189ed00a6e4df3ae7a6a6d6656e3a740632a5abba77e571c49966501b",
+    "backend/internal/handler/openai_responses_astra_pro_failover_test.go": "96e9b066bb2ce8fdb28b125bdbd73c4d3cee4a0a44a1d36acfa3b83a279a298d",
+    "backend/internal/handler/openai_responses_failover_cancel_test.go": "c148fe31a5429c073eaaacbb91f07d0688f06740619e598528969ec0787dae5a",
+    "backend/internal/handler/openai_responses_image_intent_benchmark_test.go": "a0e11b43e5e44444b11faed330e745e6dfc50ffe28f2b4d992fc66de928b9236",
+    "backend/internal/handler/openai_responses_input_tokens_test.go": "c70bedd67bb118f0bdc30e094ffeecc100823fe185e80f1da88a58de065bb8d8",
+    "backend/internal/handler/openai_service_tier_validation_test.go": "00d8bc30f3c0ada1a0c232ed87679c4b19445274a5a8ab35c73cc50a58effd4a",
+    "backend/internal/handler/openai_stream_validation.go": "e530ed4fa37545fef28910ca542ab3df64172dbac4de85cfc9a8bf458ff6dcfa",
+    "backend/internal/handler/openai_stream_validation_test.go": "9ea9743741b57e223055697c7c547a2d06c6c3f0061ad5607749dff9303407c3",
+    "backend/internal/handler/openai_ws_client_close_attribution_test.go": "9708a787b304109533f0ef13dbf583950f099820f554cf0cb1e686f8408ef9e0",
+    "backend/internal/handler/openai_ws_turn_pricing_test.go": "2f93dc8c5dfe7d6d83c7c5fa413633c101d55498bef1a5ac6f30f59c80bb573a",
+    "backend/internal/handler/openai_ws_v2_passthrough_cyber_test.go": "a62d866634960782a142add2e0c45e399eca126f978ef8a2add8b982a38b3cbf",
+    "backend/internal/handler/openai_x_search.go": "0d63afecf5cb94846837b1e85bb2ac7975458053df61b02e99168b16d7bf01a1",
+    "backend/internal/handler/openai_x_search_test.go": "9f66a241bbddd3364e15fb9af629464a2efe5435f889883491e98185e5689d5c",
+    "backend/internal/handler/ops_capture_writer_nil_test.go": "512156ea079d18aae48996a54babac6aa8d06067f7d5b7082e88c5b44eaeb491",
+    "backend/internal/handler/ops_error_logger.go": "7781e3a47af9654f5956e69ecafd61c7da689590366041253bad3e80a32c005a",
+    "backend/internal/handler/ops_error_logger_attribution_test.go": "b885bf2a3d57172e37ff5555f5060706445bd0d23cee80849f4a73cbd20befb6",
+    "backend/internal/handler/ops_error_logger_cyber_test.go": "39dcd1fdd2e872dc686aeb8d7c94ea1cf2600246ddf993246dd58b71cd923a7e",
+    "backend/internal/handler/ops_error_logger_test.go": "4348a99e09e9d94c0a8bad1924d9846c3820c687c7304875ba1edbac60926f14",
+    "backend/internal/handler/ops_ingress_reject_capture_test.go": "405fb6df3f00a08ddd06aec8e8aa3cf46ed7d2dc8267a0ba9f4c50306895c0c1",
+    "backend/internal/handler/ops_platform_test.go": "7660036b51f4e2648ed8d78f25f6dd48af1b9b26298848f92828a526da670a0b",
+    "backend/internal/handler/page_handler.go": "a4d1026e1fde2b2c7611cd0e9b6f0d1c7ccb8d8175cba646999c5cfc6b881643",
+    "backend/internal/handler/page_handler_test.go": "db63c33117bcde803b276ad544ad14ff116a3b321a6eb76690369fd3f8c5a78e",
+    "backend/internal/handler/passkey_handler.go": "de9b593dcc0f9007d755b02f23accc3c6ffbb70771ccbb679bd9dd806846ab5b",
+    "backend/internal/handler/passkey_handler_test.go": "d0e3678d9c45fec40fd40ccd121555b20aea1b14da79c55cd33e6e054e17c822",
+    "backend/internal/handler/payment_handler.go": "1a6e64b783b2fa61d8d7952a0bb5c7fbae86b27c9d6206b7de3e95fc8098612f",
+    "backend/internal/handler/payment_handler_resume_test.go": "129aaa23c50245110b7f3ecbdb6cee297031142f34bef5aa065d08e1e3b3de9e",
+    "backend/internal/handler/payment_webhook_handler.go": "e260b12720611398344dfca6ea149ed3f64c408d5d6b44ad4f5d4a822b151c62",
+    "backend/internal/handler/payment_webhook_handler_test.go": "6e6584f7ec18279a6b6b358fee28dd01c060b191ae046b7ed65593844365aafa",
+    "backend/internal/handler/quotaview/helpers.go": "1f5d1ec30bd7ff405c200c7dafc109de73b9ca69ccbb6b8b88772db88b8d6ee1",
+    "backend/internal/handler/quotaview/helpers_test.go": "1cf468df00eaa7aa19e433a7ebd18bfc768cea94d2f24bfa5889e122b559aea8",
+    "backend/internal/handler/redeem_handler.go": "e8bc5007ceb3250379f4048de490477e47942d87288cb64e1a3b7008205ed01b",
+    "backend/internal/handler/request_body_limit.go": "5a56a58037f2a2fa703dc208a87ffc55d3662c366c6eeb9ae5738177750fe00c",
+    "backend/internal/handler/request_body_limit_test.go": "710fb6425e20982b557e47d464136f8229bef3f2b9426bb5b1a3097d621009c1",
+    "backend/internal/handler/request_body_parse_log.go": "14348c9540b372b2fb2b6702feee267ebccebb2c75447f8a36fcdbf5ef07b852",
+    "backend/internal/handler/request_body_parse_log_test.go": "e3a21825b381a4121e1177c50cd46c6d8c25c97b0fd299239e82d1cfff55bcfa",
+    "backend/internal/handler/request_body_read_log.go": "3904a2001250b7186027d8e7a08923e1ff59bab5d2ec9d16dad90daa23bc22ca",
+    "backend/internal/handler/request_body_read_log_test.go": "537decff363b0b4f04730a5f60357e9d4e679f4f598de5d25936b8a865638335",
+    "backend/internal/handler/security_audit_errors.go": "73bd4c4b69f44f9a94cab39548362c84dcd9840c6888ddcb9991d089bec95915",
+    "backend/internal/handler/security_audit_errors_test.go": "fdb2027863dc1d8524eb0f0ee10d5aa14f463dc4c32a17982b7cf148f2838e8b",
+    "backend/internal/handler/security_audit_helper.go": "5997845bce848e86f6063235b7ba9ab5ddebe9581ea38fea826435392bd10994",
+    "backend/internal/handler/security_audit_helper_test.go": "67d38095ee25a67d3435e454126e3ba1145b0a2045ce66c660195e48979397da",
+    "backend/internal/handler/security_audit_media_submit_test.go": "27d6a74ffaeb2b551fae5bbff23c13efe343452c6ce76036cf61ed08b9b3968a",
+    "backend/internal/handler/security_audit_order_test.go": "74116f62d74ba55f3344e4ec8ce2de6408816bd6fcdb5699b3e884113649235f",
+    "backend/internal/handler/security_policy_helper.go": "ca50378e8c51bdb6d97ff2954d4a243281b486aa6cc3e80527619f2f0487fa78",
+    "backend/internal/handler/security_policy_helper_test.go": "edb5a01e31efc51132ee3dbfbd64c18afc0cf46f8423ff5112bd98870b296ffb",
+    "backend/internal/handler/setting_handler.go": "efac43ee09c8323f22ce2d0650c524d7808202685c9a2379e9172b635dcd4b5d",
+    "backend/internal/handler/setting_handler_public_test.go": "93144ca4516e7eb38e85c1561680a86ccc9ebfa360ca5586b4e8f9f254fafafa",
+    "backend/internal/handler/stream_error_event.go": "981d5f38127bb97eb12a4fdc7cedf557ef3e4c3f01e4c3c11e3c65017bf0c9e7",
+    "backend/internal/handler/stream_error_event_test.go": "b0bba994cb209814d608761d33caa106c36bc4ee9ba9ca594b4c276e7aa0921e",
+    "backend/internal/handler/subscription_handler.go": "41e65234d80253b0e4634dad18788060cce9494a8108f06b340685513fb6d1e0",
+    "backend/internal/handler/totp_handler.go": "d1f2cb78250d2518e6c191bb3d688ebade11e6499f63d34823f6ee231bd8b1f2",
+    "backend/internal/handler/usage_handler.go": "6b83a427f468616a51bbf457ff13f368c6a3a483e47058e51e8b238af9910148",
+    "backend/internal/handler/usage_handler_daily_test.go": "2a11e607f80bf86ccd603593c68c1908a0356ddc87b322641919d83b53f4c0ad",
+    "backend/internal/handler/usage_handler_request_type_test.go": "8db320795f012f38ed9ccce5ec5012c23211f5be9fc63c37f10eb230c3fa9370",
+    "backend/internal/handler/usage_handler_sort_test.go": "1beede18ce22f4bc429c528ebe80add5880d01e906c4a9412bfbc8d447e4a648",
+    "backend/internal/handler/usage_record_submit_task_test.go": "cf11072794ab7610d1d6661fb1da99c29379381d23a78aaa26e8b5015ca4c934",
+    "backend/internal/handler/usage_record_task_fallback_test.go": "db59fff039797a1cd3109c4fe052b678ad1e002fbe4079bfb4d28b3844a0d80c",
+    "backend/internal/handler/user_handler.go": "34e5fca3549dafb28cb71a96370fdd26603c460cf60a8b05211b8b5cd2a91ab3",
+    "backend/internal/handler/user_handler_test.go": "b8165c492a5787811019c8a6574d63d1120b5c204a0269dc58ab54ddbc1876a4",
+    "backend/internal/handler/user_msg_queue_helper.go": "b68331e3c1d161613cfdfc3a624041467c8122d42153fe1172779e40b7dae341",
+    "backend/internal/handler/user_platform_quotas_handler_test.go": "da2fe4639fd76b2650bee4ba44bb4bfc37f43a95661032ae4337536aac3bd579",
+    "backend/internal/handler/wire.go": "2e60382bdcf2dd6a0de5edf7ece6c0926510eeef438f39c3025a6d6ad6261571",
+    "backend/internal/integration/e2e_gateway_test.go": "f441ad9771ac52395b733be9cad1056948058f6b897e2a8f55d96f34b038b0af",
+    "backend/internal/integration/e2e_helpers_test.go": "c4f0d6e3f3638e797a4ec2f1ca9cb053e4eca835fa27fb293234cd3e5dc543ee",
+    "backend/internal/integration/e2e_user_flow_test.go": "2dc6b2d982a029a7a17971f2f32e51f230e4932739933f13397ef4ee9dea1513",
+    "backend/internal/middleware/rate_limiter.go": "c9c64d7a021861f96850a40f3fd105edf12e26afd7d5fe4a8385bb93ab2230fb",
+    "backend/internal/middleware/rate_limiter_integration_test.go": "4853a56a5b965018a9f95b31b67f8188c4f3f3fb9368c7ef7ab48f6ffef3d0f5",
+    "backend/internal/middleware/rate_limiter_test.go": "31a78dd628287c16ffa4dc74ce4a9ad78378e9f6e7354c6715a9a595596c8cae",
+    "backend/internal/model/error_passthrough_rule.go": "6f02495a976072465273296b48d61a05a5c6502fcd5e19a2008417e26989a4b5",
+    "backend/internal/model/error_passthrough_rule_test.go": "3f5e0cd3a3723be645b3319f79f48cf7b5da7a6479c20ba5d619eb974aba54f7",
+    "backend/internal/model/tls_fingerprint_profile.go": "95c384c115f9100b2dc3c62222cf694cd19b026421aa74fdc93ceaf6cd4a11e0",
+    "backend/internal/payment/amount.go": "c2887bf85b4d394b71ca77c2c6ce38d86e4d49029173997f1ebb171a990b4528",
+    "backend/internal/payment/amount_test.go": "0b61d56443a201806a7de2186a234725247816aa44c6cf0940e265187cb6f23b",
+    "backend/internal/payment/crypto.go": "db135d0ccab10648acf1042062e2bbd8093f6f8d546ecdf2e4328504d0559919",
+    "backend/internal/payment/crypto_test.go": "c351bcbe68e110cf4edae06ab0e6d77e1134d33fcdfa1c8403b38bb6b1b04c7f",
+    "backend/internal/payment/currency.go": "0813c724612422908b8835930185cc55283bdf1726b5600b977a7306765e32f8",
+    "backend/internal/payment/fee.go": "f7885cc9a952b12fea614a828f582fb00e1e609cdf777818f7035c4eb506e1fc",
+    "backend/internal/payment/fee_test.go": "ef308df6a6b40e68338600c4a38853cfe258418bfdfb30ee21740a90d01bb906",
+    "backend/internal/payment/load_balancer.go": "49d0eb1187831186e2d4ec4d299352e0531ebdcd52508bbfc4a3909a9d1756d5",
+    "backend/internal/payment/load_balancer_test.go": "5b0ec41a47e43f7adb1c21b4bc9c582e7cd990c596491f88bb7a4c9feb6f9d5a",
+    "backend/internal/payment/provider/airwallex.go": "c0d12bc93827d223286de8fe15b3ecbd6de21cd4cd076460f085c39deaa86e25",
+    "backend/internal/payment/provider/airwallex_test.go": "0d8673af17287e0b66b1f8906e39c1613b24866b929cbd6991c2094281bad61e",
+    "backend/internal/payment/provider/alipay.go": "03988a61e8fdc29cd9c22e12b84064c8e51d0f0cfb3b47e877acf8700a5be9b0",
+    "backend/internal/payment/provider/alipay_test.go": "50b8a1c063a11f928fceb3a184948109d7cd11e231e4ca49576efc7cd21d7196",
+    "backend/internal/payment/provider/easypay.go": "4a43b898c5f876b53b223b400e90bb4a74c23a862a28c7235585ac1fd60c9155",
+    "backend/internal/payment/provider/easypay_query_test.go": "485ba11eedfc734d2701c7ebcca2353fc71d3544bf9ff55ab3280719a06db0de",
+    "backend/internal/payment/provider/easypay_refund_test.go": "47c5389f7fa40db51daa534f4f177b04b81e2bb148e6766b8ed5fb7ae5d2f5a9",
+    "backend/internal/payment/provider/easypay_sign_test.go": "89d3fccd48012296555f0dca32bf3425966fa3b6042ea5f704c8001360ebeaf8",
+    "backend/internal/payment/provider/easypay_url_test.go": "08e98ac82c6f5e576fd6bb98f0eaa083347e96455814176ec1d390d05ca1ceba",
+    "backend/internal/payment/provider/factory.go": "9c2ee9df85865393bc911d369bd6b36635158a5ff9698457b3e0ce423cf039ee",
+    "backend/internal/payment/provider/stripe.go": "5a50eebe6627fbc85f66b417b4de2a570bbe92b9ba9ddc80386e7f38ac5ba2de",
+    "backend/internal/payment/provider/stripe_test.go": "7bbc20648027a27d7c511071b0e6df6b096305151a1150409b117cbc665dd6a0",
+    "backend/internal/payment/provider/wxpay.go": "fcd2408053978abfcb0a1b098ea441f2311228b46fdc7d89ba9d525ba99dc852",
+    "backend/internal/payment/provider/wxpay_test.go": "813bdea42e6e3c30a263400751b6ef3b701fb1a5e48cc950fe32e17f0be9b38d",
+    "backend/internal/payment/registry.go": "2382636695ccc2b1f058d39f7586f0080c6c111f5a4c583fa6cab1f625987c4b",
+    "backend/internal/payment/registry_test.go": "f4e3f5bfb7bc8b1ce189ed17f4046b4cbc9fb2ac0f37d1434cef1596d038c659",
+    "backend/internal/payment/types.go": "f582d1dcd0f088efcc0a6ebb2bdf97d96017e1fa72fc27a3f29b040b8412d467",
+    "backend/internal/payment/wire.go": "9c276b4fbc67b8ecfdc67bdcbe5c8a47465a6f9bcfd6f0c2b9335d0cc8d353bb",
+    "backend/internal/payment/wire_test.go": "c0f6e249d9084d2931a1386d2f4613c691f59a3918ce9c3ff2ef7099fc9c0b0d",
+    "backend/internal/pkg/anthropicfp/dateline.go": "d784fe29a024489d3174b6a598717b1adef003b0fc685d17a2e8467685e7bdb7",
+    "backend/internal/pkg/anthropicfp/dateline_test.go": "96c49da8ae9803ba721f3c555b1ac7c1709d2decf0bc4ebb51616a5a4915f8e5",
+    "backend/internal/pkg/antigravity/claude_types.go": "f1687b9876de0a27029e5f28521afcc15c3a25171283b82ce1d8fa51a22881fb",
+    "backend/internal/pkg/antigravity/claude_types_test.go": "642d259b948c3b0e7a9c21c42cc47bd75f2d36ba6d0efce07177dcc7068d12f9",
+    "backend/internal/pkg/antigravity/client.go": "a8fcc39b3805ebfd4c0056eeb37ffe6bce5b6398f896cfdba924f9c328e340ef",
+    "backend/internal/pkg/antigravity/client_test.go": "0d24f942a978c7a5b98016f5d3dbbfb4ec87b62aa7123ccf1a2746533d76bd32",
+    "backend/internal/pkg/antigravity/gemini_types.go": "9cbf27347b517e8b1b205fde4cdb4828c06610a77ba5cbf2139308882dc897c7",
+    "backend/internal/pkg/antigravity/oauth.go": "3cfe48a2fb0b9a1e7df2a591d4c95ac777613be8c3d29436418065c2db94239a",
+    "backend/internal/pkg/antigravity/oauth_test.go": "641cbe61f7c166e775d54de8734b06beb5a85e1edb06d35751245e0deb3f3585",
+    "backend/internal/pkg/antigravity/request_transformer.go": "3d20cdd33a8ba3f85f36489853a6379b677e6e6448ff89ebbe7be1143b00c396",
+    "backend/internal/pkg/antigravity/request_transformer_test.go": "452ddc99af2e4a8a301d046f00c4d9ea00f93612cc288d9eaec911f1f8b429d9",
+    "backend/internal/pkg/antigravity/response_transformer.go": "912fc7bf224db513aae3713c6eaf9f36fc1220c88fe6a8dfedb9a4a0b0dddb96",
+    "backend/internal/pkg/antigravity/response_transformer_test.go": "d74ade527ac7d2969ef49de1181b768ba1fa4bb8941a40fa69af448220b0b567",
+    "backend/internal/pkg/antigravity/schema_cleaner.go": "6dd0f31d88a66e5dbf28c46abe764146a8c024097df8deba2861696f440d1360",
+    "backend/internal/pkg/antigravity/stream_transformer.go": "59dce9528eb6a168cfa7cbd657c179c51ec3579b2207ba0c5c3f57ff37998a77",
+    "backend/internal/pkg/antigravity/usage_contract_test.go": "94ce2414dff20359be9a3c0abe4a87171f929f6fc4fd70711ced7845276e229b",
+    "backend/internal/pkg/apicompat/anthropic_responses_test.go": "b7d5bf4ba9ae4db9d28ba08a5b6025329c7c9eab617893f7d88f5aef5835c37e",
+    "backend/internal/pkg/apicompat/anthropic_to_responses.go": "a77f5636445e05a9bc2deaed122d2c07da5ebe1482a5cdefbfa113d97937c7d0",
+    "backend/internal/pkg/apicompat/anthropic_to_responses_response.go": "86e8497811099b8a35fadc43ad281ba5731c4157767999ccb4d9ddf0b50a7fe8",
+    "backend/internal/pkg/apicompat/anthropic_to_responses_stream_test.go": "a2a2f5a5bc9b3342079763801c8d3775279135a3aa81182adf4b70ad45184308",
+    "backend/internal/pkg/apicompat/chatcompletions_anthropic_bridge.go": "5bbf7854af4f6d879e82bca0b7bdec0906a6ef685872cefa86af43197966bc89",
+    "backend/internal/pkg/apicompat/chatcompletions_anthropic_bridge_test.go": "dddb15feca615bbdd3774c06de714c695a6f1c73cdb7214349b118c61247d9e0",
+    "backend/internal/pkg/apicompat/chatcompletions_anthropic_reasoning_passback_test.go": "a604842a3b8c460831f3c4b880673f1023eee1e686e80de5ad1411c19e08d541",
+    "backend/internal/pkg/apicompat/chatcompletions_reasoning_alias_test.go": "8e19f9dcaafd22418ffed1aca6f773a20cd61739865f0d0ed6655679d2c0cc62",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_bridge.go": "e18e3dc2bb560357922f7ede64a0e8220fc23fbb9870f66e82cb5af31b65009d",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_bridge_custom_tools_test.go": "7972f5932e27a49d05bddcbf5c7df87a1352527dbd9460a4d555d338dac5ed96",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_bridge_test.go": "2d859c58024d35fcce4abc11cd726e88c0541a13b197f4e27fc3b5cb32babf66",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_reasoning_cache_test.go": "517ebbf7ba18fb48195e8f6526d8bae2ac2f5abdd816d5b474433c22a50b2b45",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_request_invariants_test.go": "2227000c237ec6cbe6284c458609caf42edf5dee943969741cc379f4c55b270e",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_stream_lifecycle_test.go": "6f7e3f3d7709401190cb4c8b85cfae01c949cdd2d9b82ddccc507b47f643e066",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_test.go": "b48ca3af76b8159c1c7b9b5a7d8b6720a8ce64e2179c9afccb46a80e30aaf0e3",
+    "backend/internal/pkg/apicompat/chatcompletions_responses_tool_output_media_test.go": "a41ce948736ef11da53faa7c439b93bd47c9ec08869b65d2035a0e8a1ae5f4e9",
+    "backend/internal/pkg/apicompat/chatcompletions_to_responses.go": "b813a91b01ee08b4bfd9b59886d4269114a1c2edbcef5251d733cabbc592cedc",
+    "backend/internal/pkg/apicompat/chatcompletions_x_search_test.go": "4c78763f1e723f99c8e21fff8382d8f3a73c6c247a3165f19c6c565b26a3f224",
+    "backend/internal/pkg/apicompat/response_format.go": "9857340bb0538c214c07ded1ee89817d0973dcbb1ac45bb1828e5693ed7463f5",
+    "backend/internal/pkg/apicompat/responses_anthropic_cache_creation_test.go": "16a95e7c02415cc91a8b296f8d94a079a4396d573cd8c6dfe7473e19ebf94f75",
+    "backend/internal/pkg/apicompat/responses_client_tools.go": "3017206885d49ff886b7369914b21e54d9bdacd645fe9f49ce0c21e205db3e4c",
+    "backend/internal/pkg/apicompat/responses_client_tools_item_id_helper_test.go": "9d48da0c230aaa57bc2c83c67300c06e67ebb07d22b3d3db8328c8edd9d655f3",
+    "backend/internal/pkg/apicompat/responses_client_tools_item_id_test.go": "16a7ce9c2bc677b64b2801d615818eb25fe02678b0d994f02907f22efeecdcf9",
+    "backend/internal/pkg/apicompat/responses_client_tools_test.go": "e7aa3ee5b957a10599fa5607c84cca8a8a55a7fa45f96fcf0f5a5ceee5052f58",
+    "backend/internal/pkg/apicompat/responses_created_at_wire_test.go": "965546b257596728b3f622ab6dc5b1a3013012a26e5940ce081d5ee2201249b2",
+    "backend/internal/pkg/apicompat/responses_namespace.go": "36136e47c58cb206abef2084f829cbaa756f15d2b998440d783b056c23cc3a03",
+    "backend/internal/pkg/apicompat/responses_namespace_test.go": "f08e3c303b0d6faf21546a3f3a057109715813b3ed467703cbcf8c6c36b4ddb9",
+    "backend/internal/pkg/apicompat/responses_stream_event_wire.go": "45fdb28fa71d2db569b6102debcad66ccda9626b16c130d3f61ec1384ebd02ae",
+    "backend/internal/pkg/apicompat/responses_stream_event_wire_test.go": "800eb0fe05a2958e7c19434b544a069444719e6bca3bc8fd373a23b2e38bd576",
+    "backend/internal/pkg/apicompat/responses_to_anthropic.go": "039ed4c03fca210d0050d351adf678c1c66aeddac3911d8fbc7c1106b2a5a5c1",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_cc_chain_test.go": "bcb3e74fd8ec91c47df6fc0f49219817b5df6e9f32a2187f9dfc2b410c8b046b",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_instructions_test.go": "f5ec096ab39a636a95cac9e2552a5cda80857837a18f102a84fde66ef7f443a7",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_invalid_blocks_test.go": "63336e24c73afe2c4e26204412193efccf45826a183a0042952f7c96808a77b8",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_parallel_tool_test.go": "8a5606ca4645fd49c73ea7ec417f975a9194de5f0125830a529b21f0792b33e1",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_read_tool_test.go": "904def1370b16cecbbded6ffffd19367fecd0f8fa98e3dc559c54610975e6774",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_request.go": "ec6a592b7bbb6d816dfa603d888eeb46540a74023fbf09fb508c3a18952ca344",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_tool_pairing_test.go": "27f2475e739127c3d17b5c87cfd567c85b7b61163ffae20756477b5cc26d853a",
+    "backend/internal/pkg/apicompat/responses_to_anthropic_tools_test.go": "68e59999f81b8ab63a89de8f903d82cd9f30f0dfdc628100cfb8ed702e4f5271",
+    "backend/internal/pkg/apicompat/responses_to_chatcompletions.go": "e2d8c3836d7bf4806156b45cb4cbe641f034d84627c2fd4bf79e791c470058a7",
+    "backend/internal/pkg/apicompat/responses_to_chatcompletions_codex_events_test.go": "8f2c95bcde44270e477c72d4502f1de27a90f1958fdb1473a69b65ab121b5118",
+    "backend/internal/pkg/apicompat/responses_to_chatcompletions_tool_name_test.go": "3fcc3fff7bb9e03972bc7382e2caf4521c1123d721fd86747fe72a05dfc7d2b1",
+    "backend/internal/pkg/apicompat/responses_tool_search_discoveries.go": "f42c74bc5f1686710590761501419e7f36b82d5dda8e1745cd4b71b899c2b04e",
+    "backend/internal/pkg/apicompat/service_tier_passthrough_test.go": "b0390581a1eb811dcf869bd73d5b7723ff9362f425ba4bb340e99e62e880a677",
+    "backend/internal/pkg/apicompat/streaming_stop_reason_test.go": "ebdf1e2798de886eef3e8104b4a373f7f6151c7a00b945d32635410a342d2a47",
+    "backend/internal/pkg/apicompat/testdata/issue5302/nonstream_reasoning.json": "829255fe5c3cc3e8e873a53463d47e0f68d0955c2e2f3897641a36e21c9cc777",
+    "backend/internal/pkg/apicompat/testdata/issue5302/reasoning_content_precedence.json": "eaf0e20b51166badb39d5c3aeb32144f191fffe2df7a3b5bb5d62e5e243d097d",
+    "backend/internal/pkg/apicompat/testdata/issue5302/stream_reasoning.json": "f476ffadbcae1b104b38d5bfce5426e5db4cae19837a00d21ddfb404e8abdeff",
+    "backend/internal/pkg/apicompat/types.go": "0598c0d01dbe18990d59812ca7ed6b4daad7040a48c6f8f077474dcfc2dc737b",
+    "backend/internal/pkg/claude/cli_version.go": "6cd1f21bf456395337c6020281ee3eb5c83e897d43baaf7c3433dfad6755e8d9",
+    "backend/internal/pkg/claude/cli_version_test.go": "9a011c568a65416fbbafc4e1ec28b607b584849ee75460fdcd6ce470484e5c2d",
+    "backend/internal/pkg/claude/constants.go": "429bde833995e388aa432c7ab135fadd389ee6a490e1d752d12e793a2db3f168",
+    "backend/internal/pkg/claude/constants_cli_version_test.go": "5268cb342d9adbed63cb7d7d58ea2a9ab838824bf8a2dfd0c830189b090be49a",
+    "backend/internal/pkg/claude/constants_model_test.go": "ab2fd42de7385ca8a09f66b5d81003aba3ff9d8c704af04a3fcbec58f3ffe7b8",
+    "backend/internal/pkg/claude/effort_catalog.go": "f2fd37a2049096ff868dc8114cd1137af013488904e897a9eabeb12efe654cc7",
+    "backend/internal/pkg/claude/effort_catalog_test.go": "7479800aa2c9e9277bdc803bea4c1ce93eeae7877f92e3ff2719a67eae791ed3",
+    "backend/internal/pkg/ctxkey/ctxkey.go": "2007b4a2c12aeefb46a7ec4302c04b0c3aad0e52413c6ffd4ef76f03ab75c5a1",
+    "backend/internal/pkg/errors/errors.go": "631a3e14a7120471cb3e11a328af439379350f023172ff75e1410c860bb72425",
+    "backend/internal/pkg/errors/errors_test.go": "b67e9b5049f80bee57601b8c4850ca2b7f3ecc1142fae374ccee26208242a1b5",
+    "backend/internal/pkg/errors/http.go": "e206ee307b2f54c85b1bd0cfed76ca0f805451f73f6ed128fc1411ac8c117699",
+    "backend/internal/pkg/errors/types.go": "9cbe2f0eee91eab85194363668784c17948ef8bac5b4caeb55a09eb3fb014569",
+    "backend/internal/pkg/gemini/models.go": "019133e01aee8e59d84381baa118cbba2549ab3abf95795ea1257db3aee573d3",
+    "backend/internal/pkg/gemini/models_test.go": "0b6102496dc31d151dd0ae5b74038745cb9505ac66596d9f9766f657465d4e10",
+    "backend/internal/pkg/geminicli/codeassist_types.go": "77bc3fb578675cf7b40f4fd590b52860cb9147d392ed95f5b9ffd2fd7819409c",
+    "backend/internal/pkg/geminicli/constants.go": "030c4e19279e1e2e4a6227ca0b98b708f38ea7fcfb7801266428acbba7c90e5c",
+    "backend/internal/pkg/geminicli/drive_client.go": "3167feb37b895b594930a12cb3a970df9bff31b29c6277fc00a8dc3ceda8f44e",
+    "backend/internal/pkg/geminicli/drive_client_test.go": "7dc78e16bba3ec27d6b31111a74c06d0fd000670e60ab06878c63f5acacf801f",
+    "backend/internal/pkg/geminicli/models.go": "fc287114d103d6c9d507ed0196a1d348c59eaca705d214c844af3d61dd4a48c7",
+    "backend/internal/pkg/geminicli/models_test.go": "289deb0c5c5e9c2bbaff9d060aac47596d30f4bc85b044598f436aed3d0f69f0",
+    "backend/internal/pkg/geminicli/oauth.go": "14626e092f83e01e52618b56ff0791d239a7bdea2d7c5a4de5d1338578c3e20e",
+    "backend/internal/pkg/geminicli/oauth_test.go": "1302f350aca7de471fc8fdf1cc8e5da9712511c78ac91e40a12af7cbc5515a74",
+    "backend/internal/pkg/geminicli/sanitize.go": "356a5b6db9091e9512cf13afc04bdb4e5e06c5fb9a70d14c26bc2be57b36f4f1",
+    "backend/internal/pkg/geminicli/token_types.go": "a74c08a1922cc2f8e027d960de98aa6fd66d3cf02eccc458a5162950a183db71",
+    "backend/internal/pkg/googleapi/error.go": "4b630478c26cb5cc2329539e2b0d7ca4528f44aa91baf9431f3f9344594b280e",
+    "backend/internal/pkg/googleapi/error_test.go": "54f77017f962353a85f2f84a576774895057f209cadf7d89cb5a6148dad528c3",
+    "backend/internal/pkg/googleapi/status.go": "077bce8d66451fe395c9cdf294f16cc9ef3d5450e0f6ad73bf872b2b7a784d5c",
+    "backend/internal/pkg/httpclient/pool.go": "2ebff57cdf4f405513928d907cbd5331f6da3460153e19c32fe7a4ad92435766",
+    "backend/internal/pkg/httpclient/pool_test.go": "ccfb8bccf466d0b2d74ab556c46ef563fdde78e3ef02b660b5088d407e6fc62c",
+    "backend/internal/pkg/httputil/body.go": "684e65bb138f2fa9b138c6129330e3b8087a4e9b33c2442634da2285c4081163",
+    "backend/internal/pkg/httputil/body_lenient_json_test.go": "9add698868206a61c4bfe64eac75c3bf15fbcb10dc56e006d2ed591c8a181573",
+    "backend/internal/pkg/httputil/body_test.go": "877ba4e2a06c6375bc67ed968c9e6c85954e51af5ba815e039c3239784408b0b",
+    "backend/internal/pkg/httputil/preread_body_test.go": "3d96d09e4048b1a61f46396fa99125e3d627ab2bde0a998965bc037c1bce1b5e",
+    "backend/internal/pkg/ip/ip.go": "4802ce380d18131d83fd0ab6c5bfd7dbe040e0d0ae3658ce50337c078bcf92f8",
+    "backend/internal/pkg/ip/ip_test.go": "7e286987b81bbbcc847c174f9a9ea2a2da9db640ad7144da2828da9c592bc1fa",
+    "backend/internal/pkg/logger/config_adapter.go": "0c6052259f32c8d4e83c22cea3438c736668e20462f783778713f0d18eb7813b",
+    "backend/internal/pkg/logger/logger.go": "0d85aaefcc4694ee9dd602b2f565ab9b904ad9260cc0d03831fcbab0ba715a23",
+    "backend/internal/pkg/logger/logger_test.go": "0de060dba52c9bfac8e966eef1d6efcf97dc95535a2776cd0e55ee632792df9e",
+    "backend/internal/pkg/logger/options.go": "4cc4100319c3b16d3109a3d16612a635639e5031b158266342903dc14126f2ed",
+    "backend/internal/pkg/logger/options_test.go": "e91c0a1b8b90f87e0449ed2c35ff8d555073fb8d2b386818867a79cdc390c937",
+    "backend/internal/pkg/logger/slog_handler.go": "1563a0564c8d0710efcafdea4c259892a7ce3fd0e3e808aeb929cfd124a0100b",
+    "backend/internal/pkg/logger/slog_handler_test.go": "0e173b12c66beb6197c1cf1d5d5483b3cc2b1f4ee9077a7fdabbc10f7de5c276",
+    "backend/internal/pkg/logger/stdlog_bridge_test.go": "5a6217b4a2372127c299f406634d8e25670e4e80bbedf9bbb1307b29c8fd2878",
+    "backend/internal/pkg/oauth/oauth.go": "02367d429dd6a8f41e306b975f75e32d6f6dce43a88bdb10a3c75c08465f9fb9",
+    "backend/internal/pkg/oauth/oauth_test.go": "33b37f93bcd10869b67af2a52dbb2b83e187d43ec5e2e56c01e87dbed309b86f",
+    "backend/internal/pkg/openai/allowed_client.go": "054ea0914b080cf9c36b95e5d12d36427db3485d639a630c347218d25b984a5d",
+    "backend/internal/pkg/openai/allowed_client_freeform_test.go": "ab75ff5d7e188c8e233dd78a05651ee8a65fe3a73e71171cd3117b9b70eb6025",
+    "backend/internal/pkg/openai/allowed_client_skip_test.go": "35ba43717fba9cdf93cb3fe9a88bf14c8c6734dbad9d114f45a64d2d650ddc9d",
+    "backend/internal/pkg/openai/allowed_client_test.go": "fa6b5b004411f4e06b9fae48b0db36b99cac68a9321e3efff2293a76eb3040b3",
+    "backend/internal/pkg/openai/allowed_client_whitelistable_test.go": "a9b2b9f35b86bc07226d0f0d2f007f647ec60924f18b0deaec9abf77c8acbb0b",
+    "backend/internal/pkg/openai/constants.go": "c0be52b3a19cabdf43b519f2c6284620229c603c86b945d216f6fff19036d102",
+    "backend/internal/pkg/openai/constants_test.go": "2d5b9fff7a4f758bbac80f444eb7f271d61657bc3daf95724422d80aec7f2c93",
+    "backend/internal/pkg/openai/engine_fingerprint_signal.go": "77959e3a644290aa5a3e4209430c5675f36bd78adcced322d8ce6e1b4182c564",
+    "backend/internal/pkg/openai/engine_fingerprint_signal_test.go": "9d87f0ab3ef23b8a6f7c92828a1354f63f17756113d34f4fb0651526a5dee8bf",
+    "backend/internal/pkg/openai/instructions.txt": "42842be69650ae563d212695e8d3f3591534908fd8ca33b63f742daf41f88b65",
+    "backend/internal/pkg/openai/instructions_gpt5_1.txt": "a2e9567a159ee2c777c540caae2e6e697942dbc89f5fb45e77dce36c73d7455d",
+    "backend/internal/pkg/openai/instructions_gpt5_2.txt": "c9b2fa097ac69cae82c3d2ae12271083890a96521c55ad8dc14cae5168ad3f39",
+    "backend/internal/pkg/openai/instructions_gpt5_5.txt": "c2a980bc28af132eb89e0b4c68ae884043faae83a1afd3fd4889f7e8a1ada7b0",
+    "backend/internal/pkg/openai/instructions_gpt6_astra.txt": "152dfaeeb552876190962be1c12c93d426840ff12691f648261554a7675a6698",
+    "backend/internal/pkg/openai/instructions_test.go": "0dcfbd334b92d4eda7c24f9df2949c75e7d2dc0a34586b3df380c49663f54351",
+    "backend/internal/pkg/openai/oauth.go": "d080a475211b3e8a37d8e34529182914f5a63933fe4807d4ea86ad4dd8b98053",
+    "backend/internal/pkg/openai/oauth_test.go": "1531fff325dd3bee9b2b9bf619d0dcf9360ce84159317ca615929e06ef77f43f",
+    "backend/internal/pkg/openai/request.go": "81d91fff7219e6524cab7f8f801d1367402e02ed3ef41440e745f1704ee4eb1e",
+    "backend/internal/pkg/openai/request_codex_version_test.go": "0b705ddeaa69a5bd24a20473ef8fb9542bbd4b44701856c792c0a0d49509fb2a",
+    "backend/internal/pkg/openai/request_identity_test.go": "d0d259499def9135d112e0d67ab0bbffcdc60596def079e2ab0d250c34d37666",
+    "backend/internal/pkg/openai/request_test.go": "51383ce1a6e86229d681e43c92c2840ff7c0b4bb39b5c592dca9e23924b42f27",
+    "backend/internal/pkg/openai/request_version_test.go": "63be9c709dde171d0d416baf3bd6bdf7983cf83ca5f13930b0b6da455c88838e",
+    "backend/internal/pkg/openai_compat/upstream_capability.go": "12ce8c0da5f78d979101d26f5bbf394abe72e188f064d21ed3f6a2bd65e17c1a",
+    "backend/internal/pkg/openai_compat/upstream_capability_test.go": "228074ee4f0e1042a2a6768416aff5f7ea903e0b3812cc37737ecdc137e7200e",
+    "backend/internal/pkg/pagination/pagination.go": "583098c33af1b0c9ebca6e17eb5325243d88ca22b6c55cf2c0bf7dee9063eb7d",
+    "backend/internal/pkg/pagination/pagination_test.go": "60caf1bbbc344e77afcad30d73290e75e1bcf3b35400de71098c6f21f7b792eb",
+    "backend/internal/pkg/proxyurl/parse.go": "3ed1dea67cd14f64da60e20892dea331f4204bab9148eccdfd5b3716e5e58bcc",
+    "backend/internal/pkg/proxyurl/parse_test.go": "a3f6df285a1593984dce8886b8e18419d61c1caade4c595d2ef18fdb57b162fe",
+    "backend/internal/pkg/proxyutil/dialer.go": "0c6f79225516a49401e060e049c8e429d96c07b9f0a216549028558d1f351222",
+    "backend/internal/pkg/proxyutil/dialer_test.go": "a2b21e528fe6de97c321bf8bd872e0058b7e1bf1ef3b1e5dc6094e465061299a",
+    "backend/internal/pkg/proxyutil/dialer_timeout_test.go": "ef42a77f4a00cb60e0dd97ea1f1eb5bbc4ebf3b60c4af8dcf62dfc2b1d867ee4",
+    "backend/internal/pkg/redissession/store.go": "67adaf1c0ff854be90e0f3380233b3d98b2935d7098fa207f51bf9c1be705615",
+    "backend/internal/pkg/redissession/store_test.go": "7d05cc986e2c380a77ba5774d3b3c1a63e7d79fc022a3ca0da6d6c396b6ff04c",
+    "backend/internal/pkg/requestmodel/requestmodel.go": "a61aee3bfee77df05a01e1c561e15c9f2aa2d3eecf2c2e568042d533838ab8c8",
+    "backend/internal/pkg/requestmodel/requestmodel_test.go": "649d5482c883d4596a825f252802c2ef60eec8d7acb0344049a03ae8c25a1880",
+    "backend/internal/pkg/response/response.go": "38b5dc41d4b75111f950346f19531a95d34458756d53bc90235c81fb03de2d50",
+    "backend/internal/pkg/response/response_test.go": "6ec249e64a2d212543c59a28c005f3da6c11f80ac940c02e7c432b29cfdf1733",
+    "backend/internal/pkg/servertiming/collector.go": "2fdbebcdc32854d47e1004d7d02315e467e12307455db89445c89bb3d5c03faf",
+    "backend/internal/pkg/servertiming/collector_test.go": "aa4ce259a1ddadbff00cad4a7b8b658dc31f20727662fd70ca5df964a17cf1be",
+    "backend/internal/pkg/servertiming/http.go": "5cda2f1aafadc9b63d23fc57561bde271efc9467643cbfe5226753284dbfb2c8",
+    "backend/internal/pkg/servertiming/http_test.go": "f846972b9e7b7d75f03c5241b5076322a5f433ae0d6d6f3ba3b5190e35b717bf",
+    "backend/internal/pkg/sysutil/restart.go": "2ead99bf048ad23a6196d4f3756149a2925525e6c9e30587ee0db8e6df734168",
+    "backend/internal/pkg/timezone/timezone.go": "947e15e61e9dbbed9a5e70501856d762515b485d6c76e5cdde89f21a12d21263",
+    "backend/internal/pkg/timezone/timezone_test.go": "9741f49cb48048de51ef768b66105043d370ec64d401b30df73c10317195adab",
+    "backend/internal/pkg/tlsfingerprint/builtin_profiles.go": "82610ba093552910f4ff7ae9f0ac318467a48022ff5463521cffb32ea23aef93",
+    "backend/internal/pkg/tlsfingerprint/dialer.go": "933c8e9eda280dac354f0769a459cd27ee820ccb7a75a873625d17dda7ba3f7c",
+    "backend/internal/pkg/tlsfingerprint/dialer_capture_test.go": "ce58f79fff09315d957b1a8080773fb6f8a98c251f9b04c6acb2d2e9c767d394",
+    "backend/internal/pkg/tlsfingerprint/dialer_integration_test.go": "d6ec906185cf075bf6f09ff8c347b5df1d0b1ea70130c43b533372a2eb85005a",
+    "backend/internal/pkg/tlsfingerprint/dialer_test.go": "c74c8e67c8ef34093cbb864d4a3f8bc738db1dea49c9be7f894d8f599268457b",
+    "backend/internal/pkg/tlsfingerprint/profile.go": "9c4feb7b65a299e64c4da7da3dec0c232b3c32d05f42ee3262238c82ece8c3e9",
+    "backend/internal/pkg/tlsfingerprint/test_types_test.go": "5a0a6e44c05c6ba8037296e5c2d91bea8b41d519bb53053ebe55785d16ed78ab",
+    "backend/internal/pkg/tlsfingerprint/transport.go": "8af5cabafefcbb4ef3920ce53297e2319bb6ffd0c6bc50f9a95adc9146c6378a",
+    "backend/internal/pkg/tlsfingerprint/transport_local_test.go": "9acd098b2e7bf069ab808eba43d7a520ac58444029d03366a7d54d6eca541d43",
+    "backend/internal/pkg/usagestats/account_stats.go": "f0669df51d7bd82fd8b07d6a4e8275dbb8a17e00940e84d4432bf7b06fc9c355",
+    "backend/internal/pkg/usagestats/usage_log_types.go": "dfee7da5c5d8888d95bd63d747c039fc658da9c54adcda3cb20ec2ec68cb8b68",
+    "backend/internal/pkg/usagestats/usage_log_types_test.go": "0a42eb890f5d7059fc1ee19d30836d0b951ffc7594552848d43b0ffe721c99e9",
+    "backend/internal/pkg/websearch/brave.go": "96a5c728cfde63563ee817be2d7b414060e456b6dac686509086b91fc3ff6894",
+    "backend/internal/pkg/websearch/brave_test.go": "1380276fc33cba062955bb4c2438b7b65c2f665ddd2c759b5c030b458741260b",
+    "backend/internal/pkg/websearch/helpers.go": "6a53dd65e8e411b17c7715b9817947b28df77e0dd5085450a873e705a6ffc43a",
+    "backend/internal/pkg/websearch/helpers_test.go": "f5a954dcc42178f6c40e5590fc080cd8a3d1a603185902823a7b34bc545ceafa",
+    "backend/internal/pkg/websearch/manager.go": "54e76fbbd5e74e41131737bdd9d1cb51f73dd2fdcd794b52ed6b6c4347c04a52",
+    "backend/internal/pkg/websearch/manager_test.go": "75c0cc400450975001daaca5328f8829b68daab9825216ca817493217591e1ae",
+    "backend/internal/pkg/websearch/provider.go": "29afdbcaa79c8da12882d00a2b4d5c5ec858bf1524a7ad1850ecff015a10d76f",
+    "backend/internal/pkg/websearch/tavily.go": "522a2dc1f853fc4c5cdbcbbc1ff891bd3cfdc10d220c2488d671f5c4ac548745",
+    "backend/internal/pkg/websearch/tavily_test.go": "946f0043255be3d10468be8b9bd5447b9b707ba3f6e63cd634d87cce58424f3b",
+    "backend/internal/pkg/websearch/types.go": "73916f2169fdd14c3fb30d00679fdb7f7b1e40ead4d3c7425304c03f482ea81c",
+    "backend/internal/pkg/xai/billing.go": "78307ff2ff958ace7e5d36d17190102dafabbf8369385ce7358bceee6a4c2241",
+    "backend/internal/pkg/xai/billing_test.go": "f3b72891cd16f8f6926fa09a7ef9a69cda2f91b36661eea6e1028addb0347910",
+    "backend/internal/pkg/xai/cli_identity.go": "fc2768cfcca65763adbfe26ccbdb2b75880a802ec7d896ab389588417a428e9f",
+    "backend/internal/pkg/xai/cli_identity_test.go": "e7f3f57d986e6e9bac6368c4074c7109e3cc3fb080e7aebb112fe28ec6cbe691",
+    "backend/internal/pkg/xai/models.go": "8c41285d061a4cd9995074e86e798c1308207ffcf1655e357748ad416520e7ed",
+    "backend/internal/pkg/xai/models_test.go": "456906f20fd351d1b6f18e26d4030ac5d5f23103ba04bff43f05bf1f4e457bf3",
+    "backend/internal/pkg/xai/oauth.go": "ee0c44317227226630e4bcff64b11b092d0bcd2d0d708e43305ab74fe7d4f32f",
+    "backend/internal/pkg/xai/oauth_redis_fallback_test.go": "1122fc892d20c027fd5ecb2627bee81a29ffa78ef9722d7797d7b2fda816e73a",
+    "backend/internal/pkg/xai/oauth_test.go": "43338aad52eb6edf8c6b677f5dc3f38151432244a9b41b9351b637a68cf2ae17",
+    "backend/internal/pkg/xai/quota.go": "4dfe6bccc115156a63793e4c7c172c4c37a081fd26e79fa44ed3e79ac03872b2",
+    "backend/internal/pkg/xai/quota_test.go": "8dea28ae2d85e90350815ced1cf4908b2c79bee83fa0039350af37aa23947f10",
+    "backend/internal/pkg/xai/sso_device.go": "89d2108c7b4b6c4da2dd310623bcefb73138c3512f3b84104f9d68e54cae8c9b",
+    "backend/internal/pkg/xai/sso_device_test.go": "20360fbd6fcc8904eecc47369896c8c6c7f309d987439a9ab875411073d029a0",
+    "backend/internal/pkg/xai/subscription_tier.go": "acb6b8058e33735bda9c551425e1ce4983dc80f2de2914fb78d46de91de899af",
+    "backend/internal/pkg/xai/subscription_tier_test.go": "a372ae0b3bc736d430982d090aff8aea4a95897a7805916b42221e5db96146e7",
+    "backend/internal/pkg/xai/usage.go": "4bab21ae6537e8b03261779ea558209cf704d27694634c912a2b11bd4a067c6e",
+    "backend/internal/pkg/xai/usage_test.go": "64df29eede9e84e733d2bc8f1f9c0c4e21abeb580be694e187fcb1765aae2f99",
+    "backend/internal/platform/liveattestation/attestation.go": "3a3b250eceeb733328eda7e70299b08ac527e03d2a9aa5d937c93ad043fd7ee3",
+    "backend/internal/platform/liveattestation/attestation_darwin.go": "ed0151f0ee5a630f0ffb0c134589f8073990752f44f0ffb9d625b7409c7d34de",
+    "backend/internal/platform/liveattestation/attestation_unsupported.go": "b4e12d2e7bf803d20b484aa57dff6d10e0bcaa1ade88343e6a7653ee7dff0eda",
+    "backend/internal/platform/liveattestation/attestation_unsupported_test.go": "0f933360c24b2dc2df60156f3b6b3672892480f2f438bf8f0156f8f04c798e3c",
+    "backend/internal/repository/account_repo.go": "8827a3679765646d41c9dc067a42bc1e4518007f971891abdd8f394f09a81f20",
+    "backend/internal/repository/account_repo_auto_pause_test.go": "8574ad7a554eece524e8dc889f7d590beabf35ac99a17a254cb840ab2e5d8735",
+    "backend/internal/repository/account_repo_codex_fingerprint_seed_test.go": "8362d6d6e1b59a037cc3f6c0015d56986ee9fc3baaae5767d0976cd548691e1d",
+    "backend/internal/repository/account_repo_compact_extra_test.go": "d585596062d237410a0683574237f5b4b358248386acf0292a13d38cd765c17c",
+    "backend/internal/repository/account_repo_duplicate_integration_test.go": "af6f9b2c9d6cfdf19b6fa42949acede707d63e5c1beb5b55b815af05566eeaa7",
+    "backend/internal/repository/account_repo_grok_billing_test.go": "4254907be182f5d6c02134139b2b119340cc7efadad60d4353c45c6fdc4bbab1",
+    "backend/internal/repository/account_repo_integration_test.go": "2154a3b8fc927e12735b6a553056d1695ae17f52720344dbe995ec1952400a22",
+    "backend/internal/repository/account_repo_model_availability_test.go": "d44533a872c81fc942b4a837227f74c488e889c30635122e2df7fcd76973ba25",
+    "backend/internal/repository/account_repo_ollama_cloud_usage.go": "b0130b88cb5e3155467e11772033690d95f38fdebd99ce2ac5894943c2819eec",
+    "backend/internal/repository/account_repo_ollama_cloud_usage_integration_test.go": "7097dc8af736c83f7b38edb4e87983b0f6bd74095ff05609520ad1ea3f02ca7c",
+    "backend/internal/repository/account_repo_ollama_cloud_usage_test.go": "71179c8a30fa9875896b491b3318cbb5dd9474efb91602341224736b06953a42",
+    "backend/internal/repository/account_repo_schedulable_projection_integration_test.go": "a89d9483ff73ae3a101dbb254ab78fcea2fd4a700e5102df538c0ea43f04afc5",
+    "backend/internal/repository/account_repo_schedulable_projection_test.go": "14bf063a88f9fe1291a3ad642816efa2625d35fda9e941d8a640127713463b23",
+    "backend/internal/repository/account_repo_sort_integration_test.go": "62f034ace9fc12e484ea684aee4f149afd6784d19b64c67e2c552a06811ebe3f",
+    "backend/internal/repository/account_repo_spark_shadow_test.go": "351e9a71e3b36e5e26ec6f9ab61fa910ba44c3dfe429a5466e37dd88e3734239",
+    "backend/internal/repository/account_repo_temp_unsched_test.go": "b3149d87e6fe4de69fb6634ff757dcca85b3cbf11869d2204cf3501c0c40697c",
+    "backend/internal/repository/account_repo_test.go": "f357d520daa356b1397602b590d328ab52d43f51af9e710df12a6b6ce4d833c8",
+    "backend/internal/repository/account_repo_upstream_billing_probe_cas_test.go": "629800fa457ce6de9f90fe194d2ee597e00a5e7d2ae273b11dac884038ea89b7",
+    "backend/internal/repository/account_repo_upstream_billing_probe_due_integration_test.go": "d1504359022c3928b25c7021abe793f1cfd249b1e339f41f2e58de2d6d6be17d",
+    "backend/internal/repository/account_repo_upstream_billing_probe_due_test.go": "c5c1e9b59b0ebc9e730046636a24706bec8149c0dcbbf8aa49ee771e6e7485c3",
+    "backend/internal/repository/account_repo_upstream_billing_probe_test.go": "bb8470576eefdd7359544624488ceaab5d784375f229505befa5044a4bf1a52b",
+    "backend/internal/repository/account_repo_upstream_billing_probe_update_test.go": "5ac8d112b22f013586d4329051c92309bd637b39deef0a79b1839f7efe8e97cf",
+    "backend/internal/repository/aes_encryptor.go": "8965d6d89a8c7209a18a5dd9feb264d28249db1ec8be230fe2bb5173e68a69c7",
+    "backend/internal/repository/aes_encryptor_test.go": "b89c008accc584551486d049eddba7eb7625273cc3888ebb8a2ba805c309a251",
+    "backend/internal/repository/affiliate_repo.go": "ff64c3337a0828f0d2c232b5a8ca89f53bbd0a8a02b95f3038070d64c9060816",
+    "backend/internal/repository/affiliate_repo_integration_test.go": "e471e383eba7a98a89beae0804416ca275af8f251fa0d56cd93fc5e34c81f816",
+    "backend/internal/repository/affiliate_repo_test.go": "da4f0832de3325ba9dde041b7f2e8bbc93f5675a46c7eab4c853cf0949e8f95d",
+    "backend/internal/repository/aliyun_captcha_verifier.go": "dc1cfe89f4a9de6e8cadc9168829681f1e7dc4820bc98aa034890bc6a931d66e",
+    "backend/internal/repository/aliyun_captcha_verifier_test.go": "e87fae31bf61a99e9e8cb71b7776d449c56438e8468ccaa266e0a429fc1dfb3b",
+    "backend/internal/repository/allowed_groups_contract_integration_test.go": "de22354f12a6d60155ce1b9339b13a3426b6ca004fedb58ba979d8f65ee7a9f2",
+    "backend/internal/repository/announcement_read_repo.go": "e25812d1bb948fa550a7407f282a6cbf4e1f823b9f6934caf359f95fe72dc6f8",
+    "backend/internal/repository/announcement_repo.go": "852215a881b1ab4a861fe32f226efeb155f1f98ab0b259ec1ca8a3945fe4455c",
+    "backend/internal/repository/announcement_repo_sort_test.go": "245137034c039118727a890cb14dae16d0996170cba8a4bc9b6f2cd1d385a48e",
+    "backend/internal/repository/api_key_cache.go": "b3d25373b09ebb47e416cccc5312656629fd1c325442fad869087255695fa603",
+    "backend/internal/repository/api_key_cache_integration_test.go": "b701cdf56acb0badd40021e7207113b3e40aad3c96957e02dbdf3ee2b57adea8",
+    "backend/internal/repository/api_key_cache_subscriber_test.go": "4c0980bed89b60e66124942963d7d32fb30d08b36cf785d5eebd0df64d6885ad",
+    "backend/internal/repository/api_key_cache_test.go": "905f26ba43fb225f3c32a27a19f26d19b1616e02242440788513f3c35c6611d8",
+    "backend/internal/repository/api_key_legacy_compat_test.go": "06c7c28d140b09639fb7c9a23003a18aa0ef30fbc8150283992451ef1e5b91a7",
+    "backend/internal/repository/api_key_repo.go": "b0f21981d1cd7171836c9d41accfc04546a92ae7c7dc6d974b22c8fe134f6dca",
+    "backend/internal/repository/api_key_repo_codex_manifest_projection_integration_test.go": "bfe7cb79150758f8e566c7aa82d2ef2912e548d9ff67f4361befb542ec491149",
+    "backend/internal/repository/api_key_repo_integration_test.go": "de5faeb328146a470e12b200855f6d8b04982f5a99649e622606d29bce3c5eb5",
+    "backend/internal/repository/api_key_repo_last_used_unit_test.go": "d441bfcb3ffe801438987fdcfb77a2603159aa2485b00fc1286ab41fe62341b0",
+    "backend/internal/repository/api_key_repo_lost_update_integration_test.go": "79f73f5a3556e2fef0fca2ac2bcd24bad6e5bbcff48f6542f89ada80557e8e52",
+    "backend/internal/repository/api_key_repo_messages_dispatch_unit_test.go": "1c486e8db91c0608dfa5e3a999e97884ca8198fd70deccdae408556b82e37152",
+    "backend/internal/repository/api_key_repo_model_allowlist_projection_integration_test.go": "92da1442e6831cfe3c289f3c8537dea2f300a73e4aa3f13601e6d7c8022927b6",
+    "backend/internal/repository/api_key_repo_openai_fast_projection_integration_test.go": "cc3f25127d25b187fab1a4656ef73b56fc9770d328113ddd7a92cabcaee5eaad",
+    "backend/internal/repository/api_key_repo_profit_projection_integration_test.go": "213e6bc9ff375db3326a3cb99c544ab209afe1cfd7f6c57c52bbe08c962bbad6",
+    "backend/internal/repository/api_key_repo_sort_integration_test.go": "e565eb11d04e9e11d5697f55399298af0116bde56bf0b599f9e77706bb0b1efb",
+    "backend/internal/repository/audit_log_repo.go": "9dcec1838542deeb5cd0f486fd80ce759fe51792fa80f8df6bbe2739b218420c",
+    "backend/internal/repository/auth_cache_invalidation_outbox_integration_test.go": "af7a528d84414c2d5138b792cda59a5f4928fb235f7a9d194ae5037aac6e23db",
+    "backend/internal/repository/auth_cache_invalidation_outbox_repo.go": "2071572094e3f3042ff6e746818a5494cab0e0ac8699947fcbb096d5f6b13156",
+    "backend/internal/repository/auth_cache_invalidation_outbox_repo_test.go": "20a639dbb614249bf93b15d4b31a77553e788343106e800cb9e9c7e9573c5f18",
+    "backend/internal/repository/auth_cache_invalidation_profit_integration_test.go": "eb6569a03ebfc9c6d46f3d57dbb0584e14773a1db2396b48896db56c6dc9920c",
+    "backend/internal/repository/auth_identity_compat_backfill_integration_test.go": "74df666bbc2ec576ba0b6433eac64ee0cfa581419ac4b7978c429a4da13c816a",
+    "backend/internal/repository/auth_identity_legacy_migration_integration_test.go": "6fc330e00e2355aa197b7a932d1a3f82576f56e2e95e53bd2fb632ac4cc861d7",
+    "backend/internal/repository/backup_pg_dumper.go": "0be3cedc01be44b0bff265fab3b44b2c607be07043df16fe829a48430fd2a47d",
+    "backend/internal/repository/backup_pg_dumper_test.go": "11a4d994c1bea8493df55102834eff0d8fd418a333c6c8c4191a949d7f7d1dba",
+    "backend/internal/repository/backup_s3_store.go": "7d1eaac7643e39cf22c0d53e59d9eec7cae9192a956662c7dab302cfb46e441a",
+    "backend/internal/repository/backup_s3_store_test.go": "5ba1bd95194775a43b82cb26e5def85fb2acc870c372496e3e00f9aaf0ca2a8b",
+    "backend/internal/repository/batch_image_download_limiter.go": "810023586f63bb296099cff7b96bc8118e4256920fe8bddbc00c2b8671e19238",
+    "backend/internal/repository/batch_image_download_limiter_test.go": "316598b4ef8a6e1062efea13b4f6f073b49583e15909e27189acae71403e27a0",
+    "backend/internal/repository/batch_image_queue.go": "4212fb72e9c9afbb382802a08985badf3835cf8609a8efa46445a09164c3a6c5",
+    "backend/internal/repository/batch_image_queue_test.go": "a6c11855724045b9767540dd45802dcd285211c5e2027d24c4defcef70b1b04f",
+    "backend/internal/repository/batch_image_repo.go": "e832b3291ae8afdf565efe019312cb2e6c1257b75948e28d1db0d1b74de9f770",
+    "backend/internal/repository/batch_image_repo_integration_test.go": "5fb293457ffa49c29db8406bff9006c6b93258e35cd898bfc7b9bfe0be697d13",
+    "backend/internal/repository/billing_cache.go": "234266ef1569c0afd6dd48ba682be65a089df65ff2f3d615bbb237853a52a7ad",
+    "backend/internal/repository/billing_cache_integration_test.go": "6c5f892f553b69432a12ede2c14a40bbcee0faa9e0b3c6d33233f95302c42a6e",
+    "backend/internal/repository/billing_cache_jitter_test.go": "865a2488d83de305a32c48a9781a5c883e03b2f2b109baa5fd2ffef160fac53e",
+    "backend/internal/repository/billing_cache_test.go": "51a10eeb3f8a9eb03872ede70191b660717ad3dff054f81a43ff9b515582e620",
+    "backend/internal/repository/billing_cache_user_platform_quota_test.go": "4e80c7af340b8474b812c890456e7d48279bd08303ecaee7ab078e7a707708ea",
+    "backend/internal/repository/channel_cache.go": "c10ebe377301bf2e3b87512b017e0626106d005edae9276cdaa37d4446fa6aab",
+    "backend/internal/repository/channel_cache_test.go": "333c6aa87a73c0072a586d6d8f17693c3f0b418c0aa351e3f08551afb1b733e5",
+    "backend/internal/repository/channel_monitor_duplicate_test.go": "459e514c647394082c4e39b393a6dd8a9a5d0fe8a9d9baaeaf8b7f8dc5dba4e2",
+    "backend/internal/repository/channel_monitor_quota_integration_test.go": "232a9b47b6290baae3bdb9be6b81815abd2a40c9b8ee65a409b1dc0c79f253de",
+    "backend/internal/repository/channel_monitor_repo.go": "1478bf5c7428caff279cc7ea215f3ad754390bdf805cfeab700fa62d1b31c52c",
+    "backend/internal/repository/channel_monitor_template_duplicate_metadata_integration_test.go": "329e13b836947a25e79fc0b16832b3ac9f084dd822820612b518328316d91d31",
+    "backend/internal/repository/channel_monitor_template_duplicate_metadata_unit_test.go": "be15e8f998eb1da192d2d8a2ac707461c7298242adf3fea771bdd1a5ed2f5fa9",
+    "backend/internal/repository/channel_monitor_template_repo.go": "a44070ab91481c79a1734ce7098fde7aa726d26c5be92aa949ae10a4c7b16bfd",
+    "backend/internal/repository/channel_monitor_v2_aggregation.go": "272dfd4b505cc4efea2f9f14e9a80c57dbf64d7cc301c4683d792b0f0b04059e",
+    "backend/internal/repository/channel_monitor_v2_repo.go": "52e2fd96330fe09894a5da5c59eafc19f53be159d78af0041491d576f2c9514f",
+    "backend/internal/repository/channel_monitor_v2_repo_test.go": "f3a01b6f0799bc1036c7a68930eb69593067d3946b389a3282dad05057da1616",
+    "backend/internal/repository/channel_repo.go": "00db4a987eb3f3f9b6992207b813ce7e51c712fd4a583524a4c29147d7c1a1e8",
+    "backend/internal/repository/channel_repo_account_stats_pricing.go": "8038b88930d93396aa5690fc9ce990508a88f4b3f0e4e05a27b3fe12d3faff00",
+    "backend/internal/repository/channel_repo_pricing.go": "2e3c0a27f5083c90e58b60b0b3dd1a80fe4eb4348941de59e36d1ca6041ca782",
+    "backend/internal/repository/channel_repo_pricing_time_test.go": "7a12b32bac6fce9f6e9c49056b94b74075acd5809b2276f8c231bed202c87d4b",
+    "backend/internal/repository/channel_repo_test.go": "17cf610235246aad617a5729fd8087835fa4f6217c3415d3398cd8b16fa24ded",
+    "backend/internal/repository/claude_oauth_service.go": "fd88eb8ddba0ab06ff7e904cda1db8f4b25a1fc69ad1fe54d0e59929d3d41a62",
+    "backend/internal/repository/claude_oauth_service_test.go": "2cf9cd44af238ff7bb01c5aae05affe744157a879cd18912a776ed9400615474",
+    "backend/internal/repository/claude_usage_service.go": "19101965aa6c510d267ea5ca90d72afbd5bd69029cd5745d774ea4c2ba00c620",
+    "backend/internal/repository/claude_usage_service_test.go": "01b9fad3efe537cb2419bede08cf780b7dd7904d47b7702aeb35ba84c2aa32e2",
+    "backend/internal/repository/codex_fingerprint_seed_migration_integration_test.go": "cc57ff16457ea13f6580bd22bf9909acbd21ffcc9fd506815b82502ae13bda04",
+    "backend/internal/repository/composite_model_route_repo.go": "a733902cd27d513a77a7425355ed31ad23aef39d6f66c22ce56402029e694ce5",
+    "backend/internal/repository/concurrency_cache.go": "18baec9e04ef85ef6875718a40eb78b35714fc2a545f07f50abdaedb6ddf94d7",
+    "backend/internal/repository/concurrency_cache_benchmark_test.go": "f5dad243b0d4323530859e740ee5db37dfbd812c10d8737ece0c070c71135de5",
+    "backend/internal/repository/concurrency_cache_integration_test.go": "aa835349d5845af5f981a45671f1738e97efd9f7b3906c9061fe6c9d57229b29",
+    "backend/internal/repository/concurrency_cache_live_test.go": "a49ec39d83f96507ce2c0f9ed40953cb9b9b967fe309286b157fb9b5fb4732d8",
+    "backend/internal/repository/content_moderation_hash_cache.go": "0637f7c459eb4c5e9e58808f4b0c487b720dbe8ca4cd6f386bb47d0e6d2e0ee5",
+    "backend/internal/repository/content_moderation_repo.go": "1d0d5fb18650eba3a5ef1de385df4f0e65a3839c775b390409d724c13e591536",
+    "backend/internal/repository/content_moderation_repo_test.go": "44dece9110b1c7bfa1a4a499bff214f05bd647ba4b3ad911e094dc905ea535ce",
+    "backend/internal/repository/custom_group_usage_rollup_repo.go": "90922d8124244cf16ba97062bf3b61e5ae329e48b07c9eb08bac5d5004b610ad",
+    "backend/internal/repository/custom_group_usage_timezone_test.go": "b8896efb6e150581c6ec158731519a9c592ec3849044b051ca5423fd377d6adb",
+    "backend/internal/repository/dashboard_aggregation_group_usage_test.go": "4e4367e2792461f0f74c2543b1ae91517a64c8ce07813bedf4f5c9269b4e32d3",
+    "backend/internal/repository/dashboard_aggregation_repo.go": "791215054114bb3c9a403aaad7f530a710489f9169d2055ebfd6b755a7b03bb5",
+    "backend/internal/repository/dashboard_cache.go": "ec8c22d0e2d8058ee62e5343ffa7c45bff7254cd04d6c5482a5b1a7a8201c3f9",
+    "backend/internal/repository/dashboard_cache_test.go": "83040f384eb591e7aed616452553bf7d25554ac6b8adcf620d8c1dd1598319b6",
+    "backend/internal/repository/db_pool.go": "bd7182fa00e75764f7a7bd3617aa3d8d7e421eec2c6b925e0dae9104c1237d9f",
+    "backend/internal/repository/db_pool_test.go": "bba8647319da1de49e1636f790158c2003385ca2a68bcd0536400cae10e8ac35",
+    "backend/internal/repository/decompress_response_test.go": "4d344cffa685ba72b240fd6d68931a864e83bdbf897d30b6705429aa5508f362",
+    "backend/internal/repository/email_cache.go": "6bebc8c37e18edb4feaf9f9c846192089e0d80ddd4271921668329ad8d1e1a75",
+    "backend/internal/repository/email_cache_integration_test.go": "207f796b63374caa5267095d048e51f6c5f1aca7eac676f1e0445305220d09c3",
+    "backend/internal/repository/email_cache_test.go": "faa66259370521d11ed22653c390ddc8d00c2c163485c0aacf9bfadd36c108df",
+    "backend/internal/repository/ent.go": "2f0ee852a07caeab287b739816613e2f96c2ccaa2a3a1df96eee3ef7a8669800",
+    "backend/internal/repository/ent_init_retry_test.go": "cee3b02a54e5e8121630432286c2c758e803446664427a8874e2fe611af67dd0",
+    "backend/internal/repository/error_passthrough_cache.go": "95118ef7737037c6eb020c78b576d01f498e6164b8de59143a7c25a154b2b590",
+    "backend/internal/repository/error_passthrough_repo.go": "ec7e7d2114cbe6473e99d3e63e75d776a2e852ff7ae17f36087184ada704660c",
+    "backend/internal/repository/error_translate.go": "2946ba5d2dec1f799462a972277577dc125faaac6b5c5719b554b4649baa4284",
+    "backend/internal/repository/fixtures_integration_test.go": "34b4d877fa3ceb17e866588f68da96a940a6f9c967fa3ac0c17fb52cb4dd164a",
+    "backend/internal/repository/gateway_cache.go": "f3fac2207d25a6abcb3e4ffa50c6d88abea2476e4604d8d51d9bd7385b8913fb",
+    "backend/internal/repository/gateway_cache_cyber_test.go": "aba29c320cd3ec0edcedcd504f3537bc83877b01cb8aa3635089a2d5cee58eb9",
+    "backend/internal/repository/gateway_cache_integration_test.go": "e88c200ab73361ff0de87bb3547f7a37bfaeaa40dec26f9a890b34f24596d5ec",
+    "backend/internal/repository/gateway_cache_live_test.go": "da16a32047e2133302374b2fc2b829ec1431634128bdde2ce32015a63a5c8d36",
+    "backend/internal/repository/gateway_cache_reasoning_test.go": "47dedda76b4b0b9080178d81e1f1bb282e54f4835a89217315219edeac15d026",
+    "backend/internal/repository/gateway_routing_integration_test.go": "9a2b109d6bce1666bca9131c3145858d43c6e89f1654df26d5ed31bb2136cf8d",
+    "backend/internal/repository/gemini_drive_client.go": "811684a2e44f3aadcd0df88065a947fab0fe500fd3b437d8f670c66250b5897e",
+    "backend/internal/repository/gemini_oauth_client.go": "8f759054d337828f4af5cba0a0804a586bdd260e78d5719061f23a08a9745e39",
+    "backend/internal/repository/gemini_token_cache.go": "f185143beedd7d0d63970d8e2adc129afddcc91272d52aab4607176849e56c19",
+    "backend/internal/repository/gemini_token_cache_integration_test.go": "03e2819b89c5869a74d90001ff5dbdcd7f61785a6557b9dddec3fd165123bdf6",
+    "backend/internal/repository/gemini_token_cache_test.go": "7b57d135684735ea5f0efe7dfa17b685c16976bff3598f32892d305d196667e5",
+    "backend/internal/repository/geminicli_codeassist_client.go": "471580c6077a003a46a7a08fc0e74cf197fe2ddb6ef765d94eff2b12ece82400",
+    "backend/internal/repository/github_release_service.go": "7a13f7b91b487cb59717b822c9a1134ca0ceb0914ac6093daae26af9f953f0aa",
+    "backend/internal/repository/github_release_service_test.go": "8ac508edb358f2c391c85fc304407900c33cd437334f6bafee00a006fd963c56",
+    "backend/internal/repository/global_model_pricing_repo.go": "bf09b63ab80b848b21b6ed0c1e16e23977121f7774bf87e35383a563653cd83d",
+    "backend/internal/repository/grok_oauth_client.go": "fe6ee8960019419d28075c5531a60405788f6d38114a97e5863f513f7b0a0e16",
+    "backend/internal/repository/grok_oauth_client_test.go": "140991803ab86c7af3e9e8708a8d6450bebe6d2e34826005152f888b8bedbad4",
+    "backend/internal/repository/group_model_allowlist_repair_migration_integration_test.go": "df58981e1e0640f9cc65f6683ac042702e250b6ec8e0754958904249cf563be6",
+    "backend/internal/repository/group_repo.go": "a359b0624956f06f724cbe37b0fe28187b1439010e8f2d7b63ed8bb91a79e861",
+    "backend/internal/repository/group_repo_duplicate_integration_test.go": "78cfd93982c1d9de6010f50a238acef7c0e9a897f755d32a1cc30b1a61b65b00",
+    "backend/internal/repository/group_repo_integration_test.go": "b45510d13f4958de85986985a19ad58457a9316d41818b86ddcb489f7065a340",
+    "backend/internal/repository/group_repo_sort_integration_test.go": "941740a2f946254801a49e390bbb0dd8775290199ecf8149442ca1f4cb404385",
+    "backend/internal/repository/group_usage_rollup_trigger_integration_test.go": "37e682e0fa4ed17ce7b6092433e5b6f51e9f94d247c9f67f5295aea107bb5e68",
+    "backend/internal/repository/http_upstream.go": "09ce688b43c657be5d44b3407cedfe26e6933bfb07b12b88f83aba250d971e6c",
+    "backend/internal/repository/http_upstream_benchmark_test.go": "53edc99efc6bbf37d644348d023cb06278c6eb319c3d0016abf37ab982530fba",
+    "backend/internal/repository/http_upstream_dial_timeout_test.go": "0f3bfc537b42f59d46c485c283c64936cb03849433227ab1bf85afb7d5deabb0",
+    "backend/internal/repository/http_upstream_http2_keepalive_test.go": "3b5a826788f0a4d44acf4790a7e770d46527188a2e9494d924016b8c43e3e5e4",
+    "backend/internal/repository/http_upstream_test.go": "cc4dfad232ef67d732b2b0e127320523a10e962ad3a12ba3c087d4c6c5836618",
+    "backend/internal/repository/http_upstream_tls_local_test.go": "bc0a2e1913d23a96083d8c94aa1f336fd312e8896198a7badc330bd02bcdd5e7",
+    "backend/internal/repository/idempotency_repo.go": "a68cecbfd35cf69cfd7dc1f976ea9ec0ebaf0b461b855572fb2e4109c25a0055",
+    "backend/internal/repository/idempotency_repo_integration_test.go": "944fac1b1e63be0ff90e3d0f385c6d92e93df41115b2ec60605a3ef24479e299",
+    "backend/internal/repository/identity_cache.go": "17d5830a4efd321cddcf08e93b8a7cb8dcf3d9deda292ccfed2b265c15adbcb9",
+    "backend/internal/repository/identity_cache_integration_test.go": "1203714ef596030a3cef95f32d491f8528abe65fd8689006c4a1dc0d5bb20b49",
+    "backend/internal/repository/identity_cache_test.go": "eacf9d7973d4d06490701f970033c44031a3b10520c252d936adc1df2e07ec82",
+    "backend/internal/repository/image_storage_s3.go": "24aa11f728130a0f94e8c2043df71ccd98574d7b6be25322ee8a4c79f2aa6bea",
+    "backend/internal/repository/image_task_store.go": "198dbd0b3e222d05a1511c548712a41ce267a7e67640950940775fdeada65220",
+    "backend/internal/repository/image_task_store_test.go": "b9739d2c329ca7993ac2bedc4e87623eeccb50ff013ab8a77963c87d04638c10",
+    "backend/internal/repository/inprocess_transport_test.go": "f6b78e546ed6c2b03d3065db69c3f06097564ca6ef3e75de1ea5ad83d07748f6",
+    "backend/internal/repository/integration_harness_test.go": "fd04a2bdf4282d1e3d7814a3d500d3a0402ce571dadb321d46204809430d240d",
+    "backend/internal/repository/internal500_counter_cache.go": "be999d88f04e6b8d376b9abf8dee4546610c39f7c8eb4ebdd8e1e643b5cd69ce",
+    "backend/internal/repository/leader_lock_cache.go": "97c6a4f21fb842687a162d30669e454e608de29090a98a9eeedb6648a49a8be8",
+    "backend/internal/repository/leader_lock_cache_test.go": "d6fe8c07b7b16be856917ad8367b75b5c5d1071cb4235336aeaf52cf5181d1dd",
+    "backend/internal/repository/migrations_runner.go": "d18d93efe65bba309bc1184037cb2a24ddfcb3c954c2100de834a67ad6ed40d1",
+    "backend/internal/repository/migrations_runner_checksum_test.go": "a3945e6dd6253b1b97e501fc9b2ff9408c5acd517925822cf22ccf31ba7981e7",
+    "backend/internal/repository/migrations_runner_extra_test.go": "f842faad1c01f0bf043bc01711299f351a9f4631773dbe541ffec310111cefab",
+    "backend/internal/repository/migrations_runner_notx_test.go": "9034c94fb711444df073e9e6d7981f591c8efe88d742661b090df16fe5b45cd0",
+    "backend/internal/repository/migrations_schema_integration_test.go": "3be1f474a77b3d5699fa02684e64f15c71f992874419a49dddf3eb4577e1837c",
+    "backend/internal/repository/openai_403_counter_cache.go": "b3a893c47573d4aae6bce18cee1355e6c83ae694b1c5ed2686186bedc71efafc",
+    "backend/internal/repository/openai_long_context_billing_migration_integration_test.go": "7fc133f2dbd29dcfe65ff05e9f143778e40efed7e2c1600a3ffbbf1de7476719",
+    "backend/internal/repository/openai_oauth_service.go": "b59d39225286b25809e5eddf09fd6d034d2b6681bd19efadb4eb3abdeaacdad6",
+    "backend/internal/repository/openai_oauth_service_test.go": "d5de05b9b8f2ef70cd23dbfd261ddf97cae89bedfb98052952881b2e28162314",
+    "backend/internal/repository/ops_error_where_test.go": "22347c600a8c95aff62ed208bc9271150b5f083f4ff8f8433b7752848aa84ce9",
+    "backend/internal/repository/ops_ingress_reject_repo.go": "23840db8d507cd002e8f23b80ed7d1ad9510c17145c752aed4f40b0eab5aa5ea",
+    "backend/internal/repository/ops_ingress_reject_repo_test.go": "6b5ca71b1aafc43717aa803c0016d54377f07b19e1d38afe00ae3eabe28b8bd1",
+    "backend/internal/repository/ops_repo.go": "a5e240d163b138cba7346da74ecbac60f6e467f4fe8f53415c3a7af046d57a79",
+    "backend/internal/repository/ops_repo_alerts.go": "e20609846fe9f6e82c0fad075391442c90175932aa24c2b6cc43ca8861e73680",
+    "backend/internal/repository/ops_repo_args_test.go": "62743634d7b8ac042afcf0c776962b079014cddb69e1c21bcbf1ab070f2ba7af",
+    "backend/internal/repository/ops_repo_dashboard.go": "24d156cf61fd79debb7f1f6042cc9b0a33711ca06c6d0e7258d9541b45f5b2c7",
+    "backend/internal/repository/ops_repo_dashboard_timeout_test.go": "329a74da1d55743726df5c95218d973583da816d6f37d6287393a459a7a7c4c7",
+    "backend/internal/repository/ops_repo_error_where_test.go": "590a87d36103602b6c1a7f972124cc60fa20cd98e50d7334f604ad4ccabea3d3",
+    "backend/internal/repository/ops_repo_get_error_log_by_id_integration_test.go": "8d2fb4d80a5c927d97fa925e2d4ab29905f16b9f972411b8d11756f3b1010a27",
+    "backend/internal/repository/ops_repo_histograms.go": "5472125ded0c1046b72ec995d6d46cfd1252cc01d661c1d95d679ec710d901e2",
+    "backend/internal/repository/ops_repo_latency_histogram_buckets.go": "25face0d270833252e04a9e1e0df6d8f9b3e3b3bbd1feed1d4cc85a3eddf5b90",
+    "backend/internal/repository/ops_repo_latency_histogram_buckets_test.go": "04a15295a773f9d0121badb8bd7dd68c46ca5db244cc4a1bd6bd635ebdedcdda",
+    "backend/internal/repository/ops_repo_metrics.go": "44bad44d0ac93fead619efea1ef9925e94e1f8bb3d3cf52ffa210587016c2a4f",
+    "backend/internal/repository/ops_repo_metrics_test.go": "9c7c2a972636c70435b536614986c74559f89e7281cdd0dadeff81ad1627d105",
+    "backend/internal/repository/ops_repo_openai_token_stats.go": "d2fb26a60752048efd45d33688094464227e553885eff4f81aa3ef585546056a",
+    "backend/internal/repository/ops_repo_openai_token_stats_test.go": "3dde821f54e1c8cb81e95a52382a399cdaf41378bfb4fcaf6774c8b63944133d",
+    "backend/internal/repository/ops_repo_preagg.go": "a2bce33e47f90d95c2e1d01dba81087717badda2b035e034f10aea04f2eedd20",
+    "backend/internal/repository/ops_repo_realtime_traffic.go": "e0c06dedfe52f09db6681745097975b088a08f5920d9b29124cc4b55637c4560",
+    "backend/internal/repository/ops_repo_replay_cleanup_test.go": "1e2b18ee20abbcdc45cb12a9feb8685dded663f8f4653ad34cf6afa87d3258d4",
+    "backend/internal/repository/ops_repo_request_details.go": "fd6208b35780dd0a855a23d23f25fef0e25c496fa2d6d21282b9b6b5c309abe7",
+    "backend/internal/repository/ops_repo_system_logs_test.go": "54d2f20f55b6c509d4101b733f275cb24c2d831461764b9eb9661cefc644da64",
+    "backend/internal/repository/ops_repo_trends.go": "302c7f8465f774ce55c188123675096cd2c93fbea75aab8f55a7f931d0dc74be",
+    "backend/internal/repository/ops_repo_window_stats.go": "fe8e8c8c6b8ae8a632979a6e0bacd0199c6841290278aa796d4fe04a445740f6",
+    "backend/internal/repository/ops_write_pressure_integration_test.go": "e2ca93871a9a7c4f3f1da1b5444241f9e8fa028c9b1b24b03c9fb7e40549c879",
+    "backend/internal/repository/pagination.go": "c78a5aba13bc8caaf91235d968b59a89ef5389692e6ec87ff76a06a7c4c88e4b",
+    "backend/internal/repository/passkey_repo.go": "0120c86e30963598caf327ea5db9f993850dba8e7732a2350e73cd97bdcb40a3",
+    "backend/internal/repository/passkey_session_store.go": "fd60f687bbea04e39d0d400cac5f0401a5c88099c26c11e008333df2c4622e96",
+    "backend/internal/repository/plugin_repo.go": "d589463ad3d991fd1f77603dd4f62ffaf72cd452eedd4f1a73280e65529c3b0d",
+    "backend/internal/repository/plugin_repo_integration_test.go": "29cf066dd91d176c859d962653cf9867c0726e7de9c0761ed28eedbee8402c28",
+    "backend/internal/repository/pricing_service.go": "ba753b9cc008becb2916f446f304ef290e2f1803ceebfc0c3303d37a1b6a4dc2",
+    "backend/internal/repository/pricing_service_test.go": "89ec7aa7c895735c239de3b9179415c9127ae7da3557f5d20e8e0cc32ac1c5d0",
+    "backend/internal/repository/promo_code_repo.go": "12da0b84a7503756339c1b817f7408f24526594dd2018cff47da716207d79877",
+    "backend/internal/repository/proxy_backup_reference_integration_test.go": "8d6d9fcbb04a9e3a467949859e96a93bdc5890b769a85676216165c8a4eeb326",
+    "backend/internal/repository/proxy_expiry_integration_test.go": "399789d231bb156e1949cfdf676fcd6b52dca500bf06d70c60fe551b449d30b0",
+    "backend/internal/repository/proxy_expiry_test.go": "4152f6622d75b74bcb83b226ab1338a15e1bbf94684a9065b02a103b87932244",
+    "backend/internal/repository/proxy_latency_cache.go": "9c274b64ee0ffab19877d7e5e0f3de056b0b91e7b35088b8e3ae3b79ea3ac6db",
+    "backend/internal/repository/proxy_probe_service.go": "b0ad58301f5274fa4a7cfad26f7ea17fea5f829b6625024d522d029d236e6133",
+    "backend/internal/repository/proxy_probe_service_test.go": "3ee378381a8a6a37c9a2ac66de51070e11ec72feb03a2112e0483dcae5c72811",
+    "backend/internal/repository/proxy_repeated_expiry_integration_test.go": "c76b7c1e4a7da8fd62943f73bb2d371ad91455a87c2d11e0fb69fda43750c979",
+    "backend/internal/repository/proxy_repo.go": "5c1614c96f3f9db8e443ef0b39a0cb1ca24dc44e7de92c232a00f6af139a96fe",
+    "backend/internal/repository/proxy_repo_integration_test.go": "6ad66fff7c13f078a74b33adc832dca8a36fd642d8cd2e133074a4161c8dcd81",
+    "backend/internal/repository/proxy_repo_sort_integration_test.go": "a0fd2bbc4d98419c53327cd95cbae0022e7dc4b4e540770a4840b783d79077fe",
+    "backend/internal/repository/proxy_repo_upstream_billing_probe_test.go": "eb1d2c0d8f9465c80fe90dfc8ea32aba499ce7c522195a0536e54df9b99e1e82",
+    "backend/internal/repository/redeem_cache.go": "cdda2b76811e45ab0d724505a293bd760dd919f2b18f5141598c21f6c0dc3a5e",
+    "backend/internal/repository/redeem_cache_integration_test.go": "233e9f4cf2d208a45735b9a95eca9a84f5353dd824cc2e531892a9372148268b",
+    "backend/internal/repository/redeem_cache_test.go": "62c44bffeba7be129b71bd6c83db0be017e519338f36de2d73710c41712297bd",
+    "backend/internal/repository/redeem_code_repo.go": "c82e2c3cb9a28beb56bc21226900ef87f3f4e9bc097f7885543f93d53ed72973",
+    "backend/internal/repository/redeem_code_repo_integration_test.go": "288efff0bd8d779f070c3c72641e754ec149714e61d75b10b5426fedd0979016",
+    "backend/internal/repository/redeem_code_repo_sort_integration_test.go": "3159381e8b92b1c1bb77cd9305c459a2e37d2410b84dac6424cc9ac4790e527c",
+    "backend/internal/repository/redis.go": "6a805051a92567bbf1e759010b7167737792b65f10016816b891e6bc358ead17",
+    "backend/internal/repository/redis_test.go": "70c8633f8e081187826b853e445d24bf79fe221fa6770fb8017a853601e7fb4a",
+    "backend/internal/repository/refresh_token_cache.go": "0f8b9f7356ca554aa8df4c77780842a7427a5de8e831279230f0bdc8b00a82c7",
+    "backend/internal/repository/req_client_pool.go": "a7b0bf43f8ede56bdd206804bb19e6f8e4f62c1352e00c34fe8bb31fcec55ead",
+    "backend/internal/repository/req_client_pool_test.go": "5fefe312cd56d7edaac5df38af1230dbdd6fcf356bb0a93bba2867e41c90a52e",
+    "backend/internal/repository/rpm_cache.go": "0f96035b831dc4552bd6693fc71c3be3cf40d89ae6768dca83a88fdfb7d1708c",
+    "backend/internal/repository/s3_client.go": "4765fff9e1e38a093dc66be5efff0e0c1258b49936203eea4e2fa1d263142554",
+    "backend/internal/repository/scheduled_test_repo.go": "37f8d67dff682ea587ba3f64fcbc0dac5ebdc09ff0471812699fd0f8a3505cd2",
+    "backend/internal/repository/scheduler_cache.go": "47e14cb24054792bf051cb910570d20a37ab6f6938fa865b2e832ec05167f974",
+    "backend/internal/repository/scheduler_cache_integration_test.go": "e54c6439f2271ab440a714bc960965ac52f15dd29e48086b7c189e6694a7ec5d",
+    "backend/internal/repository/scheduler_cache_last_used_unit_test.go": "24fdd757318d13cf2be2f96d6441f85a067c926bac1d30153e832f7ac1eba027",
+    "backend/internal/repository/scheduler_cache_rate_multiplier_unit_test.go": "85465c4c9f86d9cf4be9a6f2a51d8ca7a15b1531f6f5f81d6aa97c560bd40976",
+    "backend/internal/repository/scheduler_cache_test.go": "ca3daf25e55034ad1742edc7d7666868af8fffd6c7a735f17452e6029e4876bb",
+    "backend/internal/repository/scheduler_cache_unit_test.go": "07301231e5224d5698310af3b79c312ecd166360f936383e919278ae99b0a32a",
+    "backend/internal/repository/scheduler_mode1_projection_test.go": "6b443c258655ffc93d09369326b202973c2444f6907fab8a9fa079583165904f",
+    "backend/internal/repository/scheduler_outbox_repo.go": "ef0f7d1976a949e8661b2ff614ff3e18df11ac1275947c1a5070f4a0cf924573",
+    "backend/internal/repository/scheduler_outbox_repo_test.go": "5f95eae01e52cf1cb67ffde8aae1c924ce5367fa62cca5e17bf3eeb918fb6b64",
+    "backend/internal/repository/scheduler_snapshot_outbox_integration_test.go": "3bbd4468b8bcb589b482ad9e4377442b8b2900c40fc691305a6039f5cc6c45f7",
+    "backend/internal/repository/security_policy_repo.go": "6965a63fa502bd2173a76937363d1cb64b0678970c5c3079f50b1fe2c89f478e",
+    "backend/internal/repository/security_policy_session_store.go": "797341fc73f04ef5d516ac11a143b6f43428700bfe79ad0f65da588a1217d8fd",
+    "backend/internal/repository/security_policy_session_store_test.go": "94b98c144a02f116ccdb08fff9e71f098d61688ca852a49229d80b4833e6a595",
+    "backend/internal/repository/security_secret_bootstrap.go": "dae587774fc2822d8dd784629c3ca8e2afaf0c296095efebaa2960c12f7e30a8",
+    "backend/internal/repository/security_secret_bootstrap_test.go": "100cb47334e6e7b3ad84e27d80c0ff9a7c0d9ce8298e2980d9e72e3f27e81b80",
+    "backend/internal/repository/server_timing_redis.go": "9024635989d3aeba131bcf1b064412d9d0a84bb6926a3f35760b0298dce2e1f0",
+    "backend/internal/repository/server_timing_redis_test.go": "81582d3bc3fca496bccebb7ae1fe255cdfbab6432c61f4c6b00717ff42565a49",
+    "backend/internal/repository/server_timing_sql.go": "364070925d76bf9bc9294f7e899e487adcb61ef2b5dc9a341b599c91687bc712",
+    "backend/internal/repository/server_timing_sql_test.go": "86e188a75c92f76ffd1b79dd22482647583e483d468350e847942f705474ee0f",
+    "backend/internal/repository/session_limit_cache.go": "d7986f48f5e3db51f7de3941dfd243838379367423d8b9091e67141e1af4b04a",
+    "backend/internal/repository/session_limit_cache_integration_test.go": "0ec12fa5dd3a7855794c7d2729cadf38aab710a05c0956b9cca31becb3cd8fea",
+    "backend/internal/repository/setting_repo.go": "060afdb248be3c2b962b60a526e97aed2d26b04a1d754f6e6c211434af39182f",
+    "backend/internal/repository/setting_repo_integration_test.go": "e434458e185f9d797d51b07d8184f2af4871a76f2b232bc5667a01b9b59089a2",
+    "backend/internal/repository/simple_mode_admin_concurrency.go": "ae9b8cefecd5fb86903a5bf188e42c97f07deb3af6ab13b6cdb2004152618b14",
+    "backend/internal/repository/simple_mode_default_groups.go": "f97420b2b184b5a7ec02651dfcfcfb468bdb111cf925cf01f61917bcebc8206c",
+    "backend/internal/repository/simple_mode_default_groups_integration_test.go": "45a7f454857abc8fae0dc8b50291742113d16bb5644f6e272b026bb3b1788c89",
+    "backend/internal/repository/soft_delete_ent_integration_test.go": "1f55904554a405b3da290051810d095a90d8bad9460d888001118d4a4b790a41",
+    "backend/internal/repository/sql_scan.go": "285c07fd819f1b4a5f768d67e623bb72e4addf8469b1a801b9d04bbaeb59daa6",
+    "backend/internal/repository/temp_unsched_cache.go": "b4b8ef5fd5aa2ad5d34b47f2ca3f71d2a39164cb103e403b9fd124d408628415",
+    "backend/internal/repository/temp_unsched_cache_health_test.go": "80815d215c5990cfad8407de583aebf69467c7d6fdf9e06fa3a84ab13a395a08",
+    "backend/internal/repository/tencent_captcha_service.go": "b8adec49c69ba91aa144b6b1a9f7b325baaf6cf9e35b86b7f464da84c9c3251e",
+    "backend/internal/repository/tencent_captcha_service_test.go": "dcfca6fd716fe20605d77cae2a8273568290978490331afbca29c15853d7c8d3",
+    "backend/internal/repository/timeout_counter_cache.go": "1349a2d1c835107104e8db46e8f3277bb457727d1dc3bbc889c92cce76bdd755",
+    "backend/internal/repository/tls_fingerprint_profile_cache.go": "294a36e55693b58aaf04505dad91dd517031101254e3167d50d042e9b9a44191",
+    "backend/internal/repository/tls_fingerprint_profile_repo.go": "426d41ff7bb0460044c1e08b7992ffe09099cbd039f26df728a584e1e2aaaebd",
+    "backend/internal/repository/totp_cache.go": "e5618e25682297084f2fe3e7c7f04c46ea7fbe7f597e9d3cb6057519dca32b0b",
+    "backend/internal/repository/turnstile_service.go": "40a8c52a6fcfac4dbf8c63719776bdc93a071b9b3850a68de1c472e042f6c093",
+    "backend/internal/repository/turnstile_service_test.go": "903a59f5ffa92f973b70f0c62c5b1bb24f4602f3d5c8d412da238e4b2bfd78c1",
+    "backend/internal/repository/update_cache.go": "665b452ebedde03fe8dbe638aff8415a925a2f46d9c0f3ee96b906f24bbf187a",
+    "backend/internal/repository/update_cache_integration_test.go": "1d5cedb6a9f0c346cd1d80c124005fc3665f525fb9d28503b367f18e700373d3",
+    "backend/internal/repository/upstream_billing_probe_persistence_integration_test.go": "eb318302fe6ddd257ec1c9bf4dc7302ebb6ab1dad131c9c75cb046cea466b154",
+    "backend/internal/repository/usage_billing_repo.go": "0ab1ae66cf4d70e6de51605574a7ecf988e514a1b965df39859456796f93a71d",
+    "backend/internal/repository/usage_billing_repo_integration_test.go": "2bb60fe119a928ae95c678856d73c78306e0e901ecefaca308c27e83f71e6014",
+    "backend/internal/repository/usage_billing_repo_unit_test.go": "8568a5e0d51904cea0706b2621f860a3979636cc7a801713723254a70a45dab4",
+    "backend/internal/repository/usage_cleanup_repo.go": "886a5a7badf4e18ffde92da922486bd053b5effce07fdb3c2da3129e1124b059",
+    "backend/internal/repository/usage_cleanup_repo_ent_test.go": "2f1bd67d91f179d9b76cb6edca874257a2054187deb2b8a3d2406d36181fe1c7",
+    "backend/internal/repository/usage_cleanup_repo_test.go": "01ae937480480c089e10e2c784833c0e88229c2af62abc5f863987fd88bdb44f",
+    "backend/internal/repository/usage_log_effective_platform_test.go": "8b482c0a8b66a4513e8d1e85a6e1daa58b4913ec0a6a8010d1e9b7b009e0d8a4",
+    "backend/internal/repository/usage_log_repo.go": "99e8f2ee1bc7567af97ccefe9c41b99cc0a156b4468cf8bdd107bb11e9dadad4",
+    "backend/internal/repository/usage_log_repo_breakdown_test.go": "49c4529befbb842d4eac6c2de1435f1ea13af073e2c157e342cfa32e909debd6",
+    "backend/internal/repository/usage_log_repo_dashboard.go": "a4787c4135fc2a7a889a9e05ce455b86ba5c698ba7b66f7799661aaa8ba09aa6",
+    "backend/internal/repository/usage_log_repo_deleted_user_integration_test.go": "36d1883013e4f388c78960cb8b02f6c4287dc391b8a58a091c757c8040274f21",
+    "backend/internal/repository/usage_log_repo_group_summary_test.go": "9427fbad8af43f338a8f1deab6632140ee5fad93a24561b9fdf1d06fb9bfb34b",
+    "backend/internal/repository/usage_log_repo_insert.go": "5e10557e70be455a904bd40f3a695fd39d2aad5fe3b01eb1cb639d829ac11954",
+    "backend/internal/repository/usage_log_repo_insert_shape_unit_test.go": "51857680a5c64a0eee1148e7d02228c9c7400d2f0c0e48f78954a1f76cd2ae1d",
+    "backend/internal/repository/usage_log_repo_integration_test.go": "84103d561fa0c615d15c6798911d0d696d0171a3f6d9336a1d295f12a4efe795",
+    "backend/internal/repository/usage_log_repo_query.go": "3a2f19dc92a1c5f807d1dbf30ee482284573e658770e1d923ff0bca32f7b01a1",
+    "backend/internal/repository/usage_log_repo_request_type_test.go": "ccaf104a600936ccc3e92333816fa4191cfcd5bfe908537fd274afbe615430bb",
+    "backend/internal/repository/usage_log_repo_sort_integration_test.go": "e142387e03ab587b8725648026b2893a23fb96d905f6f4de03fa54805c804f55",
+    "backend/internal/repository/usage_log_repo_stats.go": "ac4befd926342bd4cbd29a945904842959528d0970dfc98000c9106280544567",
+    "backend/internal/repository/usage_log_repo_stats_integration_test.go": "694c9757bff7e11d77a78ee2c2a5d8eba00db6a68622e093ca0ab02fca9f7484",
+    "backend/internal/repository/usage_log_repo_trend.go": "0a53e4679d85d1a2d017573e6c47d5542a2be63284b9eed8d51d3f84b9ea97ec",
+    "backend/internal/repository/usage_log_repo_unit_test.go": "aae512cdd760aa70ae1af5f6d8633cca98cfc7eb43d71b634f9b7e68d2fdd43d",
+    "backend/internal/repository/usage_log_session_id_integration_test.go": "a367bb7ee81d13785b4e35aeedb1bc8c558eda591470f4b1c13a4675e6f6caef",
+    "backend/internal/repository/usage_log_session_id_unit_test.go": "c718e954eb6861833cc0cf5dddfe53e52410b9d0183ee7ee1043bbbb3f86a738",
+    "backend/internal/repository/user_attribute_repo.go": "ce8c7f554bc86bf64d4e8cff03258b2332486c0200769168bfbf0082c3a94148",
+    "backend/internal/repository/user_group_rate_repo.go": "ba9503cf9a7a9531ac4b2fa922c088802b30b27520e1b83fd130cf281805de55",
+    "backend/internal/repository/user_msg_queue_cache.go": "ba19ebf634931fc9d9f9f4ab95db44d71cf38c7e16f2ebd2a12cc2fa1b6a7787",
+    "backend/internal/repository/user_msg_queue_cache_integration_test.go": "9816b090d123582f0f75f0abd01bfea8c3c15d3522eec4689bbf3011ab39c4c4",
+    "backend/internal/repository/user_platform_quota_adapter_test.go": "657dc118f96e92083754306a0c704a991ce2f5a04dcf65e80dccde34b71ea354",
+    "backend/internal/repository/user_platform_quota_repo.go": "6c728655a8f78cc0cb40929e0c0e53eb14d85770920090dbf409fa0c296f089a",
+    "backend/internal/repository/user_platform_quota_repo_integration_test.go": "ce9abb24540b230582948c6766b5da1807d4ba56da13f4a86c5cf05f462ca264",
+    "backend/internal/repository/user_platform_quota_repo_test.go": "7bcd3cd9c61fcab57b2b9fb5190a4f496ce66c1fad74a53ba409994edd405d6d",
+    "backend/internal/repository/user_platform_quota_service_adapter.go": "f46788af234bcfef9745836e4d0f5d5975da9d4b8911140e5cdd55ad540727b2",
+    "backend/internal/repository/user_platform_quota_upsert_test.go": "1d3a7a221cdac0059ea539aa3c6fee2a32724ebfd903a6b17ca6fc5e2647b372",
+    "backend/internal/repository/user_profile_identity_repo.go": "3200ddf84f6f2b85cacdc7a28f0cbed0c634a86d4f1e79332998a1f5f6a59da6",
+    "backend/internal/repository/user_profile_identity_repo_contract_test.go": "f13e128b827a2d25d0d2b5869875eef06f3c52cc241d26328e4c9f589e047f29",
+    "backend/internal/repository/user_profile_identity_repo_unit_test.go": "c146d4e1aa42777a47f68dadced0ebca614b0818ba261ae517aa1bf2eddee6d7",
+    "backend/internal/repository/user_repo.go": "a1eb30fe6f3937af35229f4e09d68e25ec71a4643c28367236cdac90f87c94fd",
+    "backend/internal/repository/user_repo_apikey_group_filter_integration_test.go": "f9db02a4e157854e3f3740263e31bb18d1d9903f930c21ec587e08a0ea32b909",
+    "backend/internal/repository/user_repo_delete_atomicity_integration_test.go": "302c54592245dc434d0b5451fa7a3bbd9258b66d76ffeb44313ed2b2d808c86f",
+    "backend/internal/repository/user_repo_email_alias_test.go": "9c665a4f325889f8e3d4705d7bcea4b7215e1e694db66564c56ea938745bf805",
+    "backend/internal/repository/user_repo_email_identity_integration_test.go": "e1c77d4dbbeac907d271aa2a6dfdfb2f852e9fd9fbe9648bda9c6c156f0e519b",
+    "backend/internal/repository/user_repo_email_lookup_unit_test.go": "e66dbba10436e75ad9b4eb743855e6c129141e8dc093c6d2df52a5b90f35e660",
+    "backend/internal/repository/user_repo_include_deleted_integration_test.go": "48929517cf2c488a16388acd343b86b12d197b2ce0ce0a48eca2677b1ea29d8c",
+    "backend/internal/repository/user_repo_integration_test.go": "94096641509ef4e87be205ea1b33e25c1e35d8c1fc7186739a9311b1df0a9aff",
+    "backend/internal/repository/user_repo_invitation_claim_test.go": "c0cb7c20b54ffad6d6100ad179d650a0424e8043a0c49e707f25278c5bc560a1",
+    "backend/internal/repository/user_repo_lost_update_integration_test.go": "e4268d8b3baedbad3f87005e33013c85cc362580e0949b5a015d514f2ff9c756",
+    "backend/internal/repository/user_repo_redeem_adjustment_test.go": "1364c23177bd86c03dc8f26096f07bd3d620191e3a8157fde459e8698d91094a",
+    "backend/internal/repository/user_repo_sort_integration_test.go": "1b8da5286c93efa1b2bd3ce028eaf6b3668471aab86b0367b78d6c6055f8da93",
+    "backend/internal/repository/user_rpm_cache.go": "a78f20ff8d90f95890ceaf880346e571ea3f26fb94d5c87e0da1d63040f0b7c4",
+    "backend/internal/repository/user_subscription_lock_test.go": "4e08119f10366d7859de2b5b62d5f1da206f4026c46876adb0a5f0a9eabaaf86",
+    "backend/internal/repository/user_subscription_repo.go": "12ce7309fa1733ecc718ee6e5622b132fd5a6b414d40b3ea2b9d575c077ac135",
+    "backend/internal/repository/user_subscription_repo_integration_test.go": "711e6875a2cc03b6dff71ac1be46d7b631bec09ff14160ba93d351b541ef78ec",
+    "backend/internal/repository/wire.go": "c71439904f8d98b44e96b86a65a6e015800437494b6226058c286260fd92821e",
+    "backend/internal/securityaudit/coordinator.go": "5860fdf6ecf731428d8d6a78b4ba17e493889fddbc10b59c2b1628314be4d68c",
+    "backend/internal/securityaudit/coordinator_legacy.go": "752f56c3ebf4978bb6e45cf38db137d007ab15f884af489ea9605d4a54e3bfd8",
+    "backend/internal/securityaudit/coordinator_test.go": "1ab535d4cde3c843181ba7e438550020a35b715db7077fe0ef23e07aca44f35b",
+    "backend/internal/securityaudit/prompt_config.go": "381d6119833d4e5d315f32c5bcb6e33747e01fa6266bf144276abfc791f5cc72",
+    "backend/internal/securityaudit/prompt_config_integration_test.go": "8b1505e432877ab03cc231e1255087834e5ce5f5e852da6119a085fd8a5a2edb",
+    "backend/internal/securityaudit/prompt_config_store.go": "dcdaf62702854e8c0d33caff9b09d8ecc4c5ff668e622254b42ff6b5549b0bd0",
+    "backend/internal/securityaudit/prompt_config_test.go": "c3421ede524f68ac3907b18ebade750185e456c38f775a761fe47fd7646c1f01",
+    "backend/internal/securityaudit/prompt_enqueue.go": "da3be8c233eec074938befc7132082fabc2942d964290c038b137d050c2cb082",
+    "backend/internal/securityaudit/prompt_event_repository.go": "678c894a23d809f6e17a0d41bc3220c5e1d6d2a65cc59f33c443ca19c764b7d0",
+    "backend/internal/securityaudit/prompt_guard.go": "59fd4ab39eba3090e4683c7c824437afa625df4569dabcf32c9828a5f97c3b3e",
+    "backend/internal/securityaudit/prompt_guard_test.go": "380e655447521ebdf40687103656b040d78a6b82818a05a4e82b99c184d5325f",
+    "backend/internal/securityaudit/prompt_handler.go": "08c239d2a55d085ef005d005a262636e377c272719aa38af7ecb43d4a2108426",
+    "backend/internal/securityaudit/prompt_handler_test.go": "349fceb6e3a34014c558ceb1501e4a47494cc37c12a3d82fe86631a4a94bea67",
+    "backend/internal/securityaudit/prompt_issue_summary.go": "e2f1f3170275766f7fb17e34b866fd734486c6418f266847d95ef428239d3602",
+    "backend/internal/securityaudit/prompt_logging.go": "83aa8ed2495eba202d0c3d0fee155c7568de09bc259bb51d17f9e405240c63e9",
+    "backend/internal/securityaudit/prompt_logging_test.go": "0aa274e9a6138a46d3fcc24887b9e5a5b03e210e50ef7fe57d2c3659bc58610a",
+    "backend/internal/securityaudit/prompt_metrics.go": "eda1f4f6d3271d73b64cf6378a3314ecc079d2b8116bb6aaa431337afcb64de3",
+    "backend/internal/securityaudit/prompt_metrics_test.go": "728c536f5e92809021b47287c7025107c81591667765193a7ece9914e1b63c9c",
+    "backend/internal/securityaudit/prompt_module.go": "a8262b0d62cf691843d7e6e8e89273c71aa927eb530fbec95cd8869f7f7f4183",
+    "backend/internal/securityaudit/prompt_outbound_security.go": "c7177a47f7519a36ff0af72a5e3eb441b35aa45344d7da280184ded3e4329cf7",
+    "backend/internal/securityaudit/prompt_outbound_security_test.go": "6be47ad785c846c1803815746fc268fde00955ca06b091f189607943992d5978",
+    "backend/internal/securityaudit/prompt_payload_store.go": "9452ea32800515899d44c8f73418233658ada07e2cb177e63546e002293a80db",
+    "backend/internal/securityaudit/prompt_payload_store_integration_test.go": "d721151b9142200bd2ce1f2c25d1f209afa268b3a2ff38a7cd1195acddb965e0",
+    "backend/internal/securityaudit/prompt_qwen3guard.go": "cf285bb708b1d962cc343f53fed7fe908c1b00f14a6ae1c8baa634467753057a",
+    "backend/internal/securityaudit/prompt_qwen3guard_test.go": "59b272c0003fba8a35fd1d9484d4c5bc3b57adda7a1cd92df039c98a4269d4bd",
+    "backend/internal/securityaudit/prompt_repository.go": "10458bf978e3412afdc91b62e165c4465cc142a5ab42a044e60688e480f4fcab",
+    "backend/internal/securityaudit/prompt_repository_integration_test.go": "ae7e4b7d460f4a05bb1197a27d252f8e1ef7229c7f6d3125ea12c50d77347901",
+    "backend/internal/securityaudit/prompt_repository_test.go": "fd6a290ec15cee37f6f1af0d9723ce6ef3d63ee028f038e065259923b897cbed",
+    "backend/internal/securityaudit/prompt_scanner.go": "b0422d22a85904a28644a5a3194721dea8c255dddb8fc2ab9b3b12d8ad36f888",
+    "backend/internal/securityaudit/prompt_service.go": "dd1ac88e59f90b7abcf73027da5cae0dcbb683504ce24db13aee16e6db7c4bc2",
+    "backend/internal/securityaudit/prompt_service_test.go": "7fcdc95fb5472971d73f716a3a04b7fe3d091d4c93814ecd4795525b4012f388",
+    "backend/internal/securityaudit/prompt_snapshot.go": "f9935be5d6a0730ff6605a7d707d511ebe1b16776720d73ffa4a142758a599e3",
+    "backend/internal/securityaudit/prompt_snapshot_test.go": "3ef1343079008466dbc23b7a16c9ab59198088899a0b9c7ef837ddd00dd59fb4",
+    "backend/internal/securityaudit/prompt_types.go": "0f425b127db2bfac8f9f0ed61b2f7af442a09185cf1faebca02a6dd218ab28fc",
+    "backend/internal/securityaudit/prompt_worker.go": "692d4330f0407d595a7ce793dbdb9f737c9a1463de479d58bf65f7a76edd09c8",
+    "backend/internal/securityaudit/prompt_worker_test.go": "ae99edc52524e78e1c03708c3c906613e27442fd74b17ac3e0ee33072ae8089f",
+    "backend/internal/server/api_contract_test.go": "c3252d29e91edd584ea06bd827c3d515f3fc710d480a0b30414568db0f7add56",
+    "backend/internal/server/http.go": "dbb4e5f8aaddbf59631451792635df2d280985870ae9baf5b9bd646f7199df4e",
+    "backend/internal/server/http_ingress_test.go": "c5ea8b07c2874054365adc0a127b12e7ed7fd996ac3e8c230a1def45e7130261",
+    "backend/internal/server/middleware/admin_auth.go": "0d8c59565948688b52f737c24349c9f1cb57c05469ac14089c950c061c45ca01",
+    "backend/internal/server/middleware/admin_auth_test.go": "91cc2646c8c32e6915626474378996e1f48f6d0639553928c49dac6a3438d15c",
+    "backend/internal/server/middleware/admin_compliance.go": "3420c027413fa7627e16328c08297e896ae2fb779fc5244c688610fdbc0c6728",
+    "backend/internal/server/middleware/admin_compliance_test.go": "32257a229a6f45b27c83a4f6613b2858b345c28240666fe666065a98f76a25ee",
+    "backend/internal/server/middleware/admin_only.go": "65daa94303eac3c4c366b5d560362cef34c80afcfc062c99999ee35e7570a51b",
+    "backend/internal/server/middleware/api_key_auth.go": "a178445990e84b6ca35d06951ef6e8380926bf66ea34189cce64ab75114203e1",
+    "backend/internal/server/middleware/api_key_auth_google.go": "5cc1b0f0b339eadd9e9afd9961a89fd5467be4eca7fc15b855cca3d6f641b1e5",
+    "backend/internal/server/middleware/api_key_auth_google_test.go": "69363207997d3229d3c3d7e65f7d746a13ef263d7e9d75d19506a5bdf36592e4",
+    "backend/internal/server/middleware/api_key_auth_image_task_test.go": "f3a77a9317f126ac09865e6264356341766aeda7240c6aa52ffb824af42385b5",
+    "backend/internal/server/middleware/api_key_auth_test.go": "d784424cb5be6d56360476be1d7f95daff3109345a531679b43961f5274ba1ab",
+    "backend/internal/server/middleware/audit_log.go": "3d481edb59d541604e75fdf44f0346bd6b053c9c08d7dee938296b60655dc9ae",
+    "backend/internal/server/middleware/audit_log_test.go": "19a4dd865b357e3be0598c0b72d8a70f730e100ee4c24280d579bb7c89c3d54c",
+    "backend/internal/server/middleware/auth_subject.go": "a6ac62cf8bd1c6ac1acdbc643e1b55e18d73897c13298ef03286533216643173",
+    "backend/internal/server/middleware/backend_mode_guard.go": "1f11edac06a8a6bb2127ca99cdb25680ee3934a5565484dae3dbab70e8cb0738",
+    "backend/internal/server/middleware/backend_mode_guard_test.go": "24e18945b34b0d1161a4074520357918c3b3b0e013c3ab35e6130e7bc65c21c2",
+    "backend/internal/server/middleware/client_request_id.go": "18677149e9a3b86b1429af0a6ded145089f589ad36df02abb474dd7f2668b867",
+    "backend/internal/server/middleware/client_request_id_test.go": "6298f8835ab650701959ba59fc8bc2dd07531268c8dd5b52d5c250c0179b47c8",
+    "backend/internal/server/middleware/cors.go": "4c9fb70786ab052e64f08c114c036f2e68d650e1e3b845d0234720384e2e0766",
+    "backend/internal/server/middleware/cors_test.go": "4718a0a5e238b835ae0e47ae0be9ba678e5465a6cc66892c13706fc8b3b1a6d5",
+    "backend/internal/server/middleware/group_model_allowlist.go": "dcf2702c4045db6afde0f072e8670053ece3b665fe676df09a0dda47a6fbe3ba",
+    "backend/internal/server/middleware/group_model_allowlist_test.go": "c02d04b623f63227a5861c5aee15ed46ad4b9833efaa17cae2d751d43076b174",
+    "backend/internal/server/middleware/ingress_reject.go": "eb6f69d679cf9bb95d7dd30ccdefc4f4d06eb1d89147686994ef4bb1ed145e14",
+    "backend/internal/server/middleware/ingress_reject_access_sampler.go": "45ab8104cfe3e4c7a67f1752d55453eb4a227dedee89c1ea2892e1b81626bace",
+    "backend/internal/server/middleware/ingress_reject_access_sampler_test.go": "4dc60238c800bf8dcfc8a15afbc86993a2700e2af451f884fde7db12b0590ceb",
+    "backend/internal/server/middleware/ingress_reject_test.go": "934dce30d829ee4e840f94098d61bacd4d95dc872d5a04d49c04bfce0ab0059e",
+    "backend/internal/server/middleware/invalid_auth_abuse_test.go": "42c76fd78b885b4039d588d2f72a7e7fa783cf78288f98b71536d785fdc9eaa9",
+    "backend/internal/server/middleware/jwt_auth.go": "045d6afe27fccab3ee59d94041eb9cbaea0d458e02bef96a260fb402b2cf41ac",
+    "backend/internal/server/middleware/jwt_auth_test.go": "e708f517fea2b1d6283554153ab59d6689e6b6bd299319aadfb8a69cd0251fa9",
+    "backend/internal/server/middleware/logger.go": "5bed268a6f8bf0f764ebf3bc85e8cf05b22a4eaa118a98062f5730b6f35e4f4d",
+    "backend/internal/server/middleware/middleware.go": "54f4e3dc376142e268fbc7e65fa5868fc06a0b60c4a5f6cd72f3bc73cb74e591",
+    "backend/internal/server/middleware/misc_coverage_test.go": "8f738327b75034417db53ef0127f9d7d23957b1a69e57f450aac3e55e19e0d98",
+    "backend/internal/server/middleware/openai_fast_policy_forwarding_test.go": "6476a8e7a3fab8f8823f011526eb2a5a837967605f180c9ca77da6beba6dacdd",
+    "backend/internal/server/middleware/optional_jwt_auth.go": "c4f38403095c3580da56d72f1bbfaaf29c9f2ef55a848299dd765b76ecbf0490",
+    "backend/internal/server/middleware/optional_jwt_auth_test.go": "0e4d90d144012def194a4ed24ae86b00e27599349111bdd85b7952341e11259d",
+    "backend/internal/server/middleware/panel_rate_limit.go": "0fb6ac7cb5a7b44d6d3145d02937dba13cb844213d96d383e026973130fdc08a",
+    "backend/internal/server/middleware/panel_rate_limit_test.go": "d0542f31dd3f0c740c31255d03a9620f8de126aa6a3d995b53e38a0f50ff2026",
+    "backend/internal/server/middleware/recovery.go": "090a2a3cd76f8e40a820052b15fdc2dd7501df7bb91229fabe8a743fb6697ab6",
+    "backend/internal/server/middleware/recovery_test.go": "e3698cc3e576a0a3e0915bb7642eb6d5cd97306304b7733d4b512281a8afb8de",
+    "backend/internal/server/middleware/request_access_logger_test.go": "85d95b109a93bef0f9c83ae4c939dded7e8bba35f82b0b77bd1f2b84c6f4e6f3",
+    "backend/internal/server/middleware/request_body_limit.go": "e60c117a9141b263224be47393e9dd5b651aaab57aac79a18d2e3f6b09f90bb0",
+    "backend/internal/server/middleware/request_logger.go": "01873a0168b6ecf3ac3858d1fbddce0520c97abee8f0ff3640862eb0b2f973d9",
+    "backend/internal/server/middleware/request_metadata.go": "4ed03171fdad251742ede5f1a5537f56dfd70a2e27b0f7699dda57d59f0f7329",
+    "backend/internal/server/middleware/security_headers.go": "239590bccf7a10c21115a26750696546364f7057b833511d19768421ae87a563",
+    "backend/internal/server/middleware/security_headers_test.go": "77c3f33672549e1e071149b28345d0b38ec75024d70c8286152471ed8e464d59",
+    "backend/internal/server/middleware/server_timing.go": "15d241bb0381c12dd8caad4dbf673a8733e6b4b57e83dd476135d12b4f7558a1",
+    "backend/internal/server/middleware/server_timing_test.go": "92d050d2deb465159848e8bc5f3b3d1a23684617d9b9705eade86900b355b2ae",
+    "backend/internal/server/middleware/session_binding.go": "3f2d3c5ff91134addcdb60daf9db1f9f4191871716159f880887330bedca5412",
+    "backend/internal/server/middleware/session_binding_test.go": "957ad11f2377f58582eb0f868d633b381b5c857ca5390da8d51f93bd2394e451",
+    "backend/internal/server/middleware/step_up.go": "15a7cf995a9b0f90eb7c3f599d29102d3f04a2799bde7c92644cf215b3c0f301",
+    "backend/internal/server/middleware/step_up_test.go": "b344af02c6a5221d7d529a8c9b3c32004018dfa0a8c8bd802b438c32b560bab2",
+    "backend/internal/server/middleware/wire.go": "f15241c280cd6387715591349942b7f9d2841337b4ea95933e34efb076bd9d7a",
+    "backend/internal/server/router.go": "be854b34522f8b4e2e4ae6ac223000526544da466fa3ffde8e6d6613e542a4d5",
+    "backend/internal/server/routes/admin.go": "ff2dd9137658f77b25b438da84f3fb4460df67d6940371e628d5cc07adb3ec7a",
+    "backend/internal/server/routes/auth.go": "df989b29580838f5e242dbd8f1b29f908bedb1b18d737a18a3ffef4ace2d6b19",
+    "backend/internal/server/routes/auth_rate_limit_integration_test.go": "48987185a023b74aff6d813ef8d4e5b56cc3131206be0fdfa9e4861c5ddfa067",
+    "backend/internal/server/routes/auth_rate_limit_test.go": "82060c3ebabdf8b26b7187e880d537aac7f9ac15f425d1ac8550c918b4fde5be",
+    "backend/internal/server/routes/channel_monitor_feature_gate_test.go": "c0413f85aa290b41a5051e7c55cc0284eac3f679ecca01052006a6150faf63f9",
+    "backend/internal/server/routes/common.go": "9dda148e1d69179f9430a96cd9bcdc3f0b2180d93291f18dd0c31dd9caf1311a",
+    "backend/internal/server/routes/composite_platform_test.go": "5e759993a2bcce325c0b34c4adb084c3b9398568a2623986fe3ddccc0f29f160",
+    "backend/internal/server/routes/gateway.go": "d770fd07a94322a613954552f417b2b25613f3e2af8319da453d1c3cce425923",
+    "backend/internal/server/routes/gateway_codex_models_test.go": "2481dcac2811e35f18c7796acf254bf5e30cf7e96f0bc58b7fd082716af8862b",
+    "backend/internal/server/routes/gateway_key_billing_test.go": "093e13e91f4abe6c5ccc928a1fa075a452e443068274f265419cf86d542889d1",
+    "backend/internal/server/routes/gateway_model_allowlist_test.go": "d49c8d175017ae96a879effbd265b7a6db2ee27a47e1484fcf61b7e07edbb403",
+    "backend/internal/server/routes/gateway_models_pinned_test.go": "76b6fcda6531946eadbc2ad2f2c286164357a15a7432524a0f52993d00060e9a",
+    "backend/internal/server/routes/gateway_test.go": "750894e259f98d021ce4459c95bebad288ff0fc3fc0b4af3d414692e697a6876",
+    "backend/internal/server/routes/model_plaza.go": "f2b122ccece86e535293ee60c1aa2805c6c1879b05a77e685a36e8204c7dc2fb",
+    "backend/internal/server/routes/ops_ingress_reject_routes_test.go": "2b617a0afeaa9eeef3ff8411ff79344aba36e0e13ea62886cfe8382e921ad8b8",
+    "backend/internal/server/routes/payment.go": "2a9d69148ffbee198bf790547046acf271ceb6f582894d49b3bc16736f5420c0",
+    "backend/internal/server/routes/prompt_audit_route_coverage_test.go": "47fce01dc69c8d75ecbf442281e81978bc2bf078b96bf10ee47f776fa79c5da9",
+    "backend/internal/server/routes/user.go": "efc0e5e941d962c81ba7f3d315bb44bf4027265b0f9095c6063dd0aa2397b40d",
+    "backend/internal/service/account.go": "9b699dc8656f2e2026a508eac3581d9321ba3352b5d36a42a7a92cd9bb7530e7",
+    "backend/internal/service/account_anthropic_passthrough_test.go": "1099061ef0b660d56e59b2848292662b648674ea869380148e837e588cfacb38",
+    "backend/internal/service/account_anti_degrade.go": "6518b58bec34c9133cc4e2aca7cf8f066b20de30c70566f463da97f22c069a56",
+    "backend/internal/service/account_anti_degrade_test.go": "ca074ed426231dfbc2932863dbdca3baed4a1de4a395c5e7d66a40089d46a25c",
+    "backend/internal/service/account_base_url_test.go": "83c232aa8ff981bc2ed20d745f102d212b14e90921cade45fe8f79e97b520359",
+    "backend/internal/service/account_billing_rate_multiplier_test.go": "978a602410cfa8bff3f5346965dd5af8e53ccc0b7a7ce098641434b25d817eea",
+    "backend/internal/service/account_codex_cli_only_app_server_test.go": "0edfedd5bfe781d48f6e7e5b0a882416aa4bd1d933463113d1e05f3d790becc3",
+    "backend/internal/service/account_codex_fingerprint_seed_lifecycle_test.go": "a8bd978e521cfb3490702ff7782aefc3a544a1b0339feb5a0228db552e2000e9",
+    "backend/internal/service/account_credential_shadow_skip_test.go": "b30bf3824287a5997413c185f5bfcdb445ba7b09171c4c1213bf77052abd9b74",
+    "backend/internal/service/account_credentials_persistence.go": "1a0e8d462c9c046e2688a9b9239feddc28a3dc3d41d500c0a16840af741fdf86",
+    "backend/internal/service/account_credentials_redact.go": "895d10736ff1a92959828388b715239a4701b8a4a977b9a540f926c1a44f87dc",
+    "backend/internal/service/account_credentials_redact_test.go": "c6487dfc1bd319498772ceb26922256f173ecff3a0f0eaa353c6ada98a3927b5",
+    "backend/internal/service/account_expiry_service.go": "80e9e49d0c4a93783fa93f4baa7b5aeb8241950d77bac265ea3174128d52760c",
+    "backend/internal/service/account_grok_media_eligibility.go": "1e6fdf5be8f0b239932746dba7201526a2785c85b8cbcfc1b8e639090f84e8bc",
+    "backend/internal/service/account_grok_media_eligibility_test.go": "e956acdf99bd178746b6ad7402b1696e48867223b54f0ddc34db259d59b53666",
+    "backend/internal/service/account_group.go": "cb38d1e6de27d9f72668eb3b92195b307dd1549800d4d81082631139f4257084",
+    "backend/internal/service/account_header_override.go": "5c67399cb9b093a3c7964f3709b9d38647fe6c087e478b20721bd90b0c5c772c",
+    "backend/internal/service/account_header_override_test.go": "9735541f148d8aefe3c36d6abefe2173600ad5388ede99bec04c1e149b54a681",
+    "backend/internal/service/account_health.go": "e161784bea5c469e8fa6f45dfb54b9b5f0663d293fbfbaf5b2346fd941bbf322",
+    "backend/internal/service/account_health_service_test.go": "8ce0e3112a05bde96176bd673730a99681f6d1847a26731ccaad30430bf7f41a",
+    "backend/internal/service/account_health_test.go": "c5ce9d59b6f75fd49fea9d685f249b8abb4ea47e971c3864cb93888da9bb2707",
+    "backend/internal/service/account_intercept_warmup_test.go": "cfbbee18dfb2483d55e082d922ba4893d48f17e7dbe2ba026cea89598e35a65a",
+    "backend/internal/service/account_load_factor_test.go": "76a8f961306410a4c434f87c89df093cd0630d7399740e1aa591355bff261719",
+    "backend/internal/service/account_long_context_billing_test.go": "64782a52996f4a191855044abce6e223027a17f7522851672c4830f207ad584e",
+    "backend/internal/service/account_mode1_protection.go": "0aacf9d0afe68e3940bca1c1026ba98608ad34c9d79f853edbc76c760db7a831",
+    "backend/internal/service/account_mode1_protection_test.go": "c8d23f01ff1a19164ffedb8617a63a86b93c0550e803cada2f05b947623bb909",
+    "backend/internal/service/account_mode1_v3_test.go": "ffce9d1896543f0d4bfbc1a9e6fe467d07973e11937815f9dd065ac959728411",
+    "backend/internal/service/account_openai_compact_test.go": "82bf8dd49db3f4c4f5558f52b77339f0b21988c42c43a6a50167dbe39dc3bc08",
+    "backend/internal/service/account_openai_passthrough_test.go": "debde85f042b9c3d5b01cb04818537b30ead3ab66da03f9129a4c3522c5f2b71",
+    "backend/internal/service/account_pool_mode_test.go": "9ecba2f6c0b88fec4424652c7cd436ed85c42ab896dfb0a8e8e3870d2ba8932b",
+    "backend/internal/service/account_pool_retry_status_codes_test.go": "de505f970002ed6ca4a4a967aed7563a9ab8d943fcfe484fa4ab7e133156eca7",
+    "backend/internal/service/account_proxy_selection.go": "38d76ce52a148eaf3894c568b9451625746861868be7707c49dd85937a4c2929",
+    "backend/internal/service/account_proxy_selection_test.go": "57b3e666f1c175ed4768ecfde1361360a829dedd6610aba63443e97dac7a7cd8",
+    "backend/internal/service/account_quota_reset_test.go": "ca114b71055f7ed1da098d3b45c2ce60d29d360be3f1f60f8824dec3a66c53d1",
+    "backend/internal/service/account_quota_schedulable_test.go": "12a72b5e766df01437a9134fcedf356dcdecb6932f7bb1819f520caed73f022b",
+    "backend/internal/service/account_repository_refresh_candidates_unit_test.go": "b7d22cf8c170770f1108548c5f91e3497bc2dc58b161538f6d75df3c86fbf7ba",
+    "backend/internal/service/account_rpm_test.go": "019e603c08406a5647732250dbdd71ca24717044e6ae61064ace0333b654da1a",
+    "backend/internal/service/account_scheduling_threshold_eval.go": "38c5a54ba987d8fd4cd9911a4f55e169d4ed277b6bfb944e9dce9ddcfeaeb8bb",
+    "backend/internal/service/account_scheduling_threshold_eval_test.go": "5356d571a556461404bfc19bc6ff08e575302c92ca7709bbd6ce73ccedc2bd66",
+    "backend/internal/service/account_scheduling_threshold_integration_test.go": "9ba8856ddecef88d0e5e00f3c6f8ae02ba99eb4a0707096071c0a596357bb077",
+    "backend/internal/service/account_scheduling_threshold_reason.go": "c2fa6d8ca4af9b4212743c1ee5b2a018621ad355c5b969155be7dfbe1771f8a3",
+    "backend/internal/service/account_scheduling_threshold_reason_test.go": "9b1d36dbd1a6ac405b23b3de3a376f07e597b70fb6777230bb8886b55caba227",
+    "backend/internal/service/account_service.go": "54d8e942fb2f3e7042786e2fcf1c3614453ad103577eee4d162dab13949c6dab",
+    "backend/internal/service/account_service_delete_test.go": "28982ba050c8db34041ee9787a13d0643270a8d945e4c9491176ffeecafffbce",
+    "backend/internal/service/account_spark_shadow_test.go": "6a4aa7faab1bab085e5af9ce31c85257a2f83f5eb3765c22b6f4ce40ce7c86e6",
+    "backend/internal/service/account_stats_pricing.go": "86a4c4f73a04742bf20b5d74a820304ea4e67293b06da7e738c80296d2c9d207",
+    "backend/internal/service/account_stats_pricing_test.go": "c0d78b4b7e798f8c89af926efc354b69e0a82306f9e0583e92216a8bf76b0b00",
+    "backend/internal/service/account_test_models_test.go": "1eba4db3f1d889c91139254d683a401501b91a6757f53c0711456d25106a91c6",
+    "backend/internal/service/account_test_service.go": "f2aca34dc34f2a68114604e892ee5d7a7fcbbf66606099a75ec2cbcadfa761cd",
+    "backend/internal/service/account_test_service_antigravity_test.go": "0d24e70f1cb7a0cd4120743598f5215f8454604e143b953a3cbd7b68026fa97b",
+    "backend/internal/service/account_test_service_cn_adaptive.go": "19868ecc1655302bcc1f8dd1d8d258b5cdbd7730873b8ec7b4dfe96024c9786e",
+    "backend/internal/service/account_test_service_cn_adaptive_test.go": "fa4f2647a5d7475f90b865a47fb09c9b1c4bc9dcd4be7fb24eb7e3a32c80d694",
+    "backend/internal/service/account_test_service_gemini_test.go": "9889839c92152c0800d1e8d3b1bcc664ae531ef52d1d1a5fd4fde48272054f13",
+    "backend/internal/service/account_test_service_grok_test.go": "4061cdd42affe447b3babe2f71f9b6cbe4b5afdb918a7d499ea9908b2ed0eabc",
+    "backend/internal/service/account_test_service_openai_compact_test.go": "500cf93eef886aaec192e48ee4d8b1549b589903e7b3351f1aa10ef5de5af72e",
+    "backend/internal/service/account_test_service_openai_image_test.go": "f1ac12ef7b92c320a4977abeb6af6cb75cbde46a2b61d5af3a16c409d4236600",
+    "backend/internal/service/account_test_service_openai_test.go": "e998a1ab588833ca9412d171d3fb37fdc3091829e8f23be7bb62024d14594c32",
+    "backend/internal/service/account_usage_service.go": "62d6053960ba9ece4c985659c8fbdcc0313ef4ad73b2657710aa2b8347e64827",
+    "backend/internal/service/account_usage_service_batch_test.go": "3a6ec07ce8d3d90f556b3eb565813200679690bcc9d5c095d5adde4103e3ba25",
+    "backend/internal/service/account_usage_service_fable_test.go": "a96f1aaec600c9ac95a7db88c409eb6f3bcaa4d9aad6b00294cbd05c5d550097",
+    "backend/internal/service/account_usage_service_spark_shadow_test.go": "3dea6adccaf579a6c8223fd38565f5320db5a3f4c53b99fa19e9b9bc40615f70",
+    "backend/internal/service/account_usage_service_test.go": "2dc762276fad6c871fe004f732f6da22fbe88f2b6eecfdbff5712085ff4c8efd",
+    "backend/internal/service/account_usage_session_window_test.go": "d7af31eba6276e9240a6abf1139caf513b8e1fe4759d71c2264fb645576ce6df",
+    "backend/internal/service/account_websearch_test.go": "b1b0f59d6bfdca0835246c9090fe20bff1700e2502edd138401a42d570a1bac5",
+    "backend/internal/service/account_wildcard_test.go": "0ca0ad06fdfc7ae454955b278194eee09587e0e731e4bc5e5b93cfe8e635c2e1",
+    "backend/internal/service/adaptive_api_protocol_test.go": "60eab86cf071412e725039dcd8992f884576cf4907fefdc100b1eebcca2d11d4",
+    "backend/internal/service/admin_account.go": "eb0b0d0f0680860305178d6e7b32db9f32b83fba671fa951ebc0368008a64af7",
+    "backend/internal/service/admin_account_concurrency_test.go": "d04246056d0c76615f77006dbd4d3c05d2c2a3c8b968400617d8bc7e97a1b5de",
+    "backend/internal/service/admin_account_upstream_billing_probe_test.go": "20806c1bf7bb132a15dc3a2b30355344475bd7a0b9705f2f04be4518e8fec54a",
+    "backend/internal/service/admin_balance_history_test.go": "6715b2843b56e319759a1804020ef5e4211f9ad4fbaf88aaec91f363a8a33968",
+    "backend/internal/service/admin_compliance.go": "39c1a81fb46fd10562fff33bb84ccb15a483a21d1512c4bd91eb489d44b5a545",
+    "backend/internal/service/admin_compliance_test.go": "992934319329c64a04d52fcf19ae69effc74282c87356f5c5f4728f38b992514",
+    "backend/internal/service/admin_group.go": "e3ca471c3773dd69e4c79c9e94d1b689e200a1d636786146ee4a3981f4be6e12",
+    "backend/internal/service/admin_group_duplicate.go": "de7baffb2e0725e17d8fabb438a34dea7afcfb7fb0533144590e2687479a503f",
+    "backend/internal/service/admin_group_duplicate_test.go": "6f1c6c1a34bc58e99d33d77c63c953c50677c5ce866175a0ff4cea61d5675e37",
+    "backend/internal/service/admin_group_platform_cache_test.go": "b000b8cf1275a8ec7f8cb5a09612cb556e1130ef4ecbfd50fdb90d69f72f6d5b",
+    "backend/internal/service/admin_proxy.go": "49b50aff8e1bd680ef7b00db5c451bc3bd4ee6bf125c149c7c7af34c4926be20",
+    "backend/internal/service/admin_proxy_date_validation_test.go": "078657153d6d52b3305ff159441eb283a751ef835860e48f06862849f49e3254",
+    "backend/internal/service/admin_proxy_partial_update_test.go": "f6f42080c813d11b12574265f6466a09685f569702ebcb6cca4143bc4b22b578",
+    "backend/internal/service/admin_service.go": "3bac07103254c02efc9413f16b54d61ef82ca2f4d9cf7b2c1b644d97403c32bb",
+    "backend/internal/service/admin_service_apikey_test.go": "20f45d7495d8a6ebc7928a92ea7acc666b1feeb4ea050734f6129ceca82b68de",
+    "backend/internal/service/admin_service_auth_identity_binding_test.go": "c3cb76ae43803414613be9191fe9aa6f642f3655b9122daefe8782745bc9c92d",
+    "backend/internal/service/admin_service_batch_limits_test.go": "aadcf9ee4de3c7e3aaffb49b7c3b33c0f2395c25320d2787b5a7855b6d11702b",
+    "backend/internal/service/admin_service_bulk_update_test.go": "2dbdf7dea9efec501a361386737a3290d8d96b1bf217287bb5d513ea95f24a02",
+    "backend/internal/service/admin_service_clear_error_test.go": "9b4aa207dad3beb51a80b4ee8a58224e6eca1c9576d90ee5c6511ab79051aaa7",
+    "backend/internal/service/admin_service_composite_group_test.go": "202c3ea926baa196d9bfe16490dc27d0ff70d45ddb2c1837d83dfea0306318c5",
+    "backend/internal/service/admin_service_create_user_test.go": "efaba612ceca436cedc2264d1ec1f2f40aff7cfba7fc70ddcc8f78a342ca5df6",
+    "backend/internal/service/admin_service_credentials_merge_test.go": "8ed1d3d174d8f76468d8edd27787c53d9aea809a4e2f65582923d744c4e15120",
+    "backend/internal/service/admin_service_delete_test.go": "4a5aeb61b249b577181b66ccc7baf02ba7a72d06e0060f00013a0cc9230a4df8",
+    "backend/internal/service/admin_service_duplicate_account_test.go": "723181d7af0675df63849902c5a0590093bce48fdab2554df1d5aa1198367025",
+    "backend/internal/service/admin_service_email_identity_sync_test.go": "4c7c97afd61aab77c001c1270185533f484ea9e7fd3671e78b620abc2344ee65",
+    "backend/internal/service/admin_service_get_deleted_test.go": "b1ccbfb201748b2982c291e27c512995990544aeb57c5dd698e7db9f54c98b06",
+    "backend/internal/service/admin_service_group_model_allowlist_test.go": "baaedc4469dea6f17a7b34be0ffe59b7fe05dcc6bf4054fb0d940d3a3849fb8b",
+    "backend/internal/service/admin_service_group_rate_test.go": "39b3832ff8b567e19e2c2501d2317bd66f79b3f8627de4681389c7b6681a4c60",
+    "backend/internal/service/admin_service_group_test.go": "3f8f2bbecaacf5976c01e49337a4fccfdcc1aad70bb34145fc9a5c5525f97296",
+    "backend/internal/service/admin_service_list_users_test.go": "c54dee9c79710027353209789d4af98354dd47962cb5c19e917a6df2e27c9b4f",
+    "backend/internal/service/admin_service_overages_test.go": "08b2cdf434354897fb6fc3561ac8cf7af64b86093e04ea46750703af103e7621",
+    "backend/internal/service/admin_service_proxy_quality_test.go": "e881dc5569f6b8322903d72c3a5af8ef8fb6d3d531216b6feaafba310bfcd187",
+    "backend/internal/service/admin_service_reset_quota_test.go": "985dbb5d20bc6f0a0268e7db04014d940cfab79dcf432144e55af6b965c7b310",
+    "backend/internal/service/admin_service_role_test.go": "92c812d45a7a5042a6d6e7c07109342d52cef52f1f160d1bdced1c1e7adfd0e1",
+    "backend/internal/service/admin_service_rpm_status_test.go": "8e96b0fe985a9ba2e70bbc77a143e360e1b98f0d3baa1e27cdee31f1b99dff6f",
+    "backend/internal/service/admin_service_search_test.go": "e8073994fe7ef32c12c2de17cfe5e8057511c23e5911f98a48ece9b2a9e00d3b",
+    "backend/internal/service/admin_service_spark_shadow_test.go": "5503287b0ef33be237834359d9997391e54d90258cc10556e23b1405eb9401f4",
+    "backend/internal/service/admin_service_update_balance_test.go": "dbd01bcc3ed20b2d082cf09d57f778e0dd92befe59808268822e902491205e53",
+    "backend/internal/service/admin_service_update_user_rpm_test.go": "7e4279ad10899cd1b9a4b440bb3e935d36be764cc344b068666ca26ed5ec020b",
+    "backend/internal/service/admin_user.go": "f05c4413ee901ce3002329021c3b91f82b1c8a89f6fa92608dfea87c1d4bc3f2",
+    "backend/internal/service/affiliate_service.go": "04cc335209d4fa6ea51c2a026ee091a37699ce951bf4717069c792ca189a3e40",
+    "backend/internal/service/affiliate_service_test.go": "6c9f80bd0b6dfcbb741677820e8272279e94c274a5280eaf04ac4d81cf1c0783",
+    "backend/internal/service/aliyun_captcha_service.go": "3b06fc073411bad24f9bdda17a099765447a1455a01ac5566f57fe72fea315bf",
+    "backend/internal/service/aliyun_captcha_service_test.go": "dc4ee934f5d6887cdee597da19840372aa4265d6f3652f168af0c3e32c1754fe",
+    "backend/internal/service/announcement.go": "a1882f67049ea89a1eaa925f5ee050812c58bfdf5e0a708eea3f3c5c057fa5cb",
+    "backend/internal/service/announcement_service.go": "ebdb99d0e448840c87e58c9db702fd3e990ea08edb030144938b64eb2f203d78",
+    "backend/internal/service/announcement_service_test.go": "5b7eb1f1a2171ad2034ab864c8850ee81f2d186b7f1417f868a5ff6da2472c35",
+    "backend/internal/service/announcement_targeting_test.go": "952dee915e43acf9019097b4ff14baa45fbd715cba7df39bc12a701e8931c51d",
+    "backend/internal/service/anthropic_apikey_auth.go": "fd73ab3326fcea51c20982848d05d6ae81765b882f36d4b050121f5ad22c0636",
+    "backend/internal/service/anthropic_apikey_auth_ollama_test.go": "d65b243212495162c3fd81053d00a3bde0d4001ad2dc20f5798c31f1d03b6396",
+    "backend/internal/service/anthropic_session.go": "fe20910121dd434dc22e2beadfa52c30bfc20560af4d86a250cb988addc24bcc",
+    "backend/internal/service/anthropic_session_test.go": "2884f3ecd4b3e64688d40066f4e3b8b686e26d09e429464fd9b841f0a3f15af7",
+    "backend/internal/service/antigravity_credits_overages.go": "dd0201acd25c85bc7930e17065e9b41567b49ce238050e900484d01fec584bc1",
+    "backend/internal/service/antigravity_credits_overages_test.go": "b1e78282670a33fb02ef6e3eee704064e84bf62139eee186d3d62cf4f1153108",
+    "backend/internal/service/antigravity_default_test_stubs_test.go": "477ad43f6e3e56cb48af12ab7af3d9abf40f92adeba3a7d3e8988ca553fa0688",
+    "backend/internal/service/antigravity_gateway_claude.go": "4f29574db706142c7fcbd140fa986db34f68a91e06e451d2a1d58587649e0814",
+    "backend/internal/service/antigravity_gateway_compat.go": "2c2166a3510c2da65f6339cf8e70e5cde626330dbb74f8571a5f677efacec4ad",
+    "backend/internal/service/antigravity_gateway_compat_stream.go": "ded49335de951a7ccaacf894ed47a4f5e782f88b3383fbadc67eec6ab62f7802",
+    "backend/internal/service/antigravity_gateway_compat_test.go": "f1a4e6bc31896a04c75b1235fbbf4d3601983c27ceecb1e888e661fabd57004a",
+    "backend/internal/service/antigravity_gateway_gemini.go": "2ebcaaa850644827a9a0b965c147bc901e8b33b80398d3f5dc7e112813202ec5",
+    "backend/internal/service/antigravity_gateway_retry.go": "28a6c254e73c3d1a29fe0373241630e8d45ac0925ca69acbf4502be2e81c2248",
+    "backend/internal/service/antigravity_gateway_service.go": "e91ec79f5dce2f0deb541ff9bdb8c5cfc9dbcd7aef1ed32c14e50e91703a9f9a",
+    "backend/internal/service/antigravity_gateway_service_test.go": "68e01ad6f621500367cbca827793c0fa40166a7900438f4b4e4460a59fbe21c7",
+    "backend/internal/service/antigravity_gateway_streaming.go": "6a1fcd6f90bb275751d8a6c45ce35163c65e65f16806b807c6c1c745e1692cf4",
+    "backend/internal/service/antigravity_gateway_upstream.go": "f4854556f29dcaf1e1e6b8257da4f87a51335abb6e47db5eb8578675187c6bdf",
+    "backend/internal/service/antigravity_image_test.go": "04bf42128c70867aa47bd73ccb8a066b6b4c86431aaef289c4f101bec7d59b2c",
+    "backend/internal/service/antigravity_internal500_penalty.go": "ab28597e5975f08b3e8d00d7f2e4202fb0ec3f0152a254e4fb6eca12a7961e10",
+    "backend/internal/service/antigravity_internal500_penalty_test.go": "0a1936a950c8cf251ff3d9562cbcc5f940189245b5442d496279318fe8c74ffc",
+    "backend/internal/service/antigravity_model_mapping_test.go": "8d1498b1606cb4c6dddb7b08f8a5180d35260700421e4d7c8c1d2fe4a462fb50",
+    "backend/internal/service/antigravity_oauth_service.go": "7a7f616f4734b40e2fcb6953c8ee38e1ff9439366f61a7014e6c02d9cbd85d51",
+    "backend/internal/service/antigravity_oauth_service_test.go": "f7ac1b20101be2f774288465330c1991c323eacae14b946b4d4f99cdef094d69",
+    "backend/internal/service/antigravity_privacy_service.go": "63d8ea1785eb472fe73b73296277679b20e3bb48e1a33aff83129563fabecbe6",
+    "backend/internal/service/antigravity_privacy_service_test.go": "40b9303a4b5bd8c0b333df68082eee292c27c62b8d389d1943950b94bef06804",
+    "backend/internal/service/antigravity_quota_fetcher.go": "095683d1f47bfdf924cc5cbccb5c864970a0d653da294c1a20d1e9d40f886642",
+    "backend/internal/service/antigravity_quota_fetcher_test.go": "c22579052c1dbb05d58f85a5cb97fb8aee3ea13a23cb6efc3aaa28f529dddda9",
+    "backend/internal/service/antigravity_quota_scope.go": "3c815a49fb7595e66c5f56fe9efde3dd82f5b0c3af47ad865daf4e89d4b46dea",
+    "backend/internal/service/antigravity_rate_limit_test.go": "bb2e1e6abf57d81a6be2f358e42528418b34035fbe0cabeece498c3cc44812a9",
+    "backend/internal/service/antigravity_single_account_retry_test.go": "964792c8e3959df13f698a901f5c1dd15b9b30fc2364060c154068c06ade3879",
+    "backend/internal/service/antigravity_smart_retry_test.go": "a6c740722fcce159fc7d04e515f3703283d6f8714d7764c56181aa1c3d7e33a3",
+    "backend/internal/service/antigravity_subscription_service.go": "da00006536ae31ffe5f7911409f78220ebebefd3013e30dbdd6d165eb0be9fac",
+    "backend/internal/service/antigravity_subscription_test.go": "3346565f020642b19f7c652ce0bd29591fede9951e473ba3982650af0c0e64f3",
+    "backend/internal/service/antigravity_thinking_test.go": "1575b16ff439c3930bc31f9369dcf1768785939ebe2a877660de82f33bb7fd7a",
+    "backend/internal/service/antigravity_token_provider.go": "205b7bbf579109f776ce0e0cd3c762f5d3c8949cb2d8919898b5983c8c6a98ab",
+    "backend/internal/service/antigravity_token_provider_test.go": "17101b4e4c5fcb4c2d15c88f176d9b6e3dd9d63b9c8eeb1b89cd33d65d593901",
+    "backend/internal/service/antigravity_token_refresher.go": "c0542eed77f3f0ae9f437e1f4de74f9b9c118f1fb1cd3c1f9634dfe327edc8f0",
+    "backend/internal/service/api_key.go": "35fdcacba46fa4c6a00da356b9fa4cc576fb7c329c2797eae0441605bf0dd171",
+    "backend/internal/service/api_key_auth_cache.go": "1679e4dc6e07e7a5d3e7a3116723a580fbc6aff0f1b313ad42916ff887fe12ec",
+    "backend/internal/service/api_key_auth_cache_codex_manifest_test.go": "fba7fa4c628fdc7c545b631d2c46709fe2f7b63e36f7bb3a538c037e2cbde3dc",
+    "backend/internal/service/api_key_auth_cache_impl.go": "73af20bc02e6e568b86d22c0c0f495dc40b14875655b43a328059075035823d5",
+    "backend/internal/service/api_key_auth_cache_invalidate.go": "8722f1d948c7999a14a8fb5031188f787f2890cf01dc7fca2bb04245140622f6",
+    "backend/internal/service/api_key_auth_cache_openai_fast_test.go": "987be126d757dea8c93b1fc20ada1122324e5b9312dbaec2a2557fffa2f4ce6d",
+    "backend/internal/service/api_key_auth_cache_pricing_test.go": "dd4ec1cc70dfc9c3274ef4f51b662048d0ae1fa24815a447764b79597744c0fd",
+    "backend/internal/service/api_key_auth_cache_profit_test.go": "0d51850cd756dccf7b868ce26a48cc21ea8ff1614b481e317d49893735a821da",
+    "backend/internal/service/api_key_auth_cache_version_test.go": "49fdc3adad85fa5d0bee2a3f3804158a63f4f399dd08bb1e303a9bbea290d1aa",
+    "backend/internal/service/api_key_group_visibility_test.go": "20dd7c79eea4d7ae0795522c935edb173ac1eec24084d63b57ed5aa834a34041",
+    "backend/internal/service/api_key_rate_limit_test.go": "aec7a56b434691af4f9c381bcf6352eaef8751834a94a2a81d8969f7c7934d11",
+    "backend/internal/service/api_key_service.go": "d42dbd579298062890f15c06fe753f6c968b491b1a3c8f9f21b0bd93df7630e7",
+    "backend/internal/service/api_key_service_cache_test.go": "b7b3795485b56c78c914687f8c5ef188a171551ecb0c65aeb8d1ee6f0257f5bc",
+    "backend/internal/service/api_key_service_delete_test.go": "a6f77345649b9e36f66c72f0d7fb2f1cad2d97c544f233bffd86a930a82d285a",
+    "backend/internal/service/api_key_service_quota_test.go": "0920067c9fd41b09090710fcc68abb72c6121284cb874683db205db18a394ae5",
+    "backend/internal/service/api_key_service_touch_last_used_test.go": "a3d0a1c9895b3370b524f1a0aa712c10c9c013bd5b7e0bde9f9996a9ffc4801b",
+    "backend/internal/service/api_key_service_update_fields_test.go": "b452ab77de01b9774e8c58927fe2f1f50e2fafdb746fc46669f6e66a6b592829",
+    "backend/internal/service/api_key_service_validation_test.go": "b515e12d2f4aec2ea7c9189be288fef0e9a75c21f182b8ae6f80dda68e1cba7a",
+    "backend/internal/service/audit_log.go": "3ad37413005bf24f6c58f8b247c1ecef6eb71c4236bd2207c62efd8d94db6f36",
+    "backend/internal/service/audit_log_service.go": "33aa38f9d08562f51431a3b82f877fb201c0ac0ea9bbe3aa49b59fbe86c5b226",
+    "backend/internal/service/audit_log_test.go": "bd942e34a6abb56d31f36e6c153f62489feaa7643ea44c3f37bc4940a187647e",
+    "backend/internal/service/auth_cache_invalidation_outbox.go": "73691b6029dda4d3b2caf9364bcc4b93779b25afefa318e82475c16db9960508",
+    "backend/internal/service/auth_cache_invalidation_outbox_test.go": "345286783bd9636b69b406c470aea41f0b95aba4f289f55d8cae127eaf1c3aa4",
+    "backend/internal/service/auth_cache_invalidation_test.go": "287b3e342c3550a0e7ed5e11d623f75ae2ef3a577802054ace8a3ae64b088f2d",
+    "backend/internal/service/auth_email_binding.go": "db21ffa41c73ee94a68f956f14df232c0e9829aca57d52948a073fd4059b1495",
+    "backend/internal/service/auth_email_oauth_auto.go": "cc49ed96964c328b760e316e47364e08fb5e0a6677607c0515ca12ea30d096c2",
+    "backend/internal/service/auth_email_oauth_auto_test.go": "159bb0fd8107393d4a2bcd6824bce690e29e4efeb6213f57fb21fe6287da0e7e",
+    "backend/internal/service/auth_oauth_email_flow.go": "8985a15d472784045e873010efb365273170f0bc9c5d5ed969aff833e5c93378",
+    "backend/internal/service/auth_oauth_email_flow_test.go": "57cc5da82b649fab58fa9ae8229598175011b80f2e5c1d047b77af1d259f5e14",
+    "backend/internal/service/auth_oauth_first_bind.go": "0b333b40ef1eb7634d5a9b1757393aa1d58412c92f833ac2493c3543edda01f6",
+    "backend/internal/service/auth_pending_identity_service.go": "2bfcfd296a2e6179d5174ed91170fbd169ec0c56ae5af8f9b37b45662272b007",
+    "backend/internal/service/auth_pending_identity_service_test.go": "863660f9025635684ec4e509dcd9a46912104e59e74d5ab2b097cf1730335411",
+    "backend/internal/service/auth_service.go": "11ae7c3223585a5875defa9c397fa2831366d51d234d56d7bb6606381114bc17",
+    "backend/internal/service/auth_service_captcha_test.go": "585ff8caea897264cdfddd585fac9a142bc2e0e86846717da4ea68030e1b7862",
+    "backend/internal/service/auth_service_email_bind_test.go": "a220bfcdaeeb8887ad05435fe0c93aa981469dc61b4b55f96850bfab00cc6dcb",
+    "backend/internal/service/auth_service_identity_sync_test.go": "6674999009877631951d6adaa44af5c4c5a4972203a981821cb1620ec9943c94",
+    "backend/internal/service/auth_service_invitation_race_test.go": "3e382569f1e661764a4176da5dec838f5d94f361b0333fee09d5f7b716390fa3",
+    "backend/internal/service/auth_service_platform_quota_test.go": "3b35e22db39e5233d02f86c90613a59836a0892904a4a6b920b42ccbfd6019de",
+    "backend/internal/service/auth_service_register_test.go": "f7c751f4bd7a546ddf17847145364fe4a5ea2eecd3693587fd87bffa4497e7f5",
+    "backend/internal/service/auth_service_test.go": "eaba686a3ff249b24eaa9d5e3ac90089d62a2ae8a3e01fbf61757ae1bfc0e3a2",
+    "backend/internal/service/auth_service_turnstile_register_test.go": "5b6df2fc138e8b4b86250ff02468f500baf354c94c487def85d52eff36e2d19a",
+    "backend/internal/service/backup_archive.go": "d64ee44ad0a0180b9e7b1ff58dd5ba3520678f0acbcf68c9caf4a158d437927a",
+    "backend/internal/service/backup_archive_test.go": "1b3155022e790ed9a4d56f5b71b9f5411ebb07a5301b7d530942db6107b17f05",
+    "backend/internal/service/backup_service.go": "6900379784556b7e883bf6768dd0c83eafd8bfe261234381407273ddb3179e3a",
+    "backend/internal/service/backup_service_test.go": "a9c6bc12b76a061d8683ed51759a8a204c0eaec8edb7d53cf67ac141700f9dec",
+    "backend/internal/service/balance_notify_check_test.go": "3bde1b3000f45862589a3085e1f8023e59222d21615471e6d0511a68a211348a",
+    "backend/internal/service/balance_notify_email_body_test.go": "ae0a3b83a635bf3e220ba496c8e6cf1565c4c53d399d40f10bf67a3e27d39df0",
+    "backend/internal/service/balance_notify_service.go": "4defa1d5e027c68b290333bcb354bc34cc7810a1aa806ff49d47540e4819fd59",
+    "backend/internal/service/balance_notify_service_test.go": "80638db07e304e3d736d4a2e58124e07e3971defc548949dd1e06c24e76ed546",
+    "backend/internal/service/batch_image.go": "9da54ca47956da071cb0dae4f64fa61ac6396f66ddac8b35bc4daf126c3600ca",
+    "backend/internal/service/batch_image_billing_hold.go": "39612c5dadc560e4cddfcaa5eb30348ab2e0f1e1a5fb2909cdbb2bbd4df35f28",
+    "backend/internal/service/batch_image_billing_recovery.go": "61394df95dfc5271400a7181db1735233cb8c10bbe1aff3672a3a22867b703e3",
+    "backend/internal/service/batch_image_billing_recovery_test.go": "8c675ceffe9611bdb336023f2df43148da692ef624f0e663591a14de3b9d2d30",
+    "backend/internal/service/batch_image_cleanup.go": "68e1bcd9df39cd466423448fdd4309e3de3c369c781284c81321133b14d7e9e0",
+    "backend/internal/service/batch_image_cleanup_test.go": "4f0c8464335434892022658d5ac7e2cb3238d4e90b89afcb5b45d8c00c809b88",
+    "backend/internal/service/batch_image_download.go": "056ef3e6ec19159d6fee340e7f1de53bb72d29a45e568b7148d1743ee51ee0a6",
+    "backend/internal/service/batch_image_download_test.go": "edb93f5af60909087b67d6d022eba23f07f56cbc8dfda33914efe5b5fe3dbd6e",
+    "backend/internal/service/batch_image_mvp_smoke_test.go": "9c9c52e9f00c977da14fc1d5224cdf523832277cb0a1f9cbde3143d2b4651fec",
+    "backend/internal/service/batch_image_processor.go": "871497420c6626279c6cf714600aaded87f66c880c4c39c9f247e176bbec88a9",
+    "backend/internal/service/batch_image_processor_test.go": "f8bd6125fb9bd8fd7d3f44c1babeea81e9d6e387bb024fe30906baa319b96107",
+    "backend/internal/service/batch_image_provider.go": "641d63f3c00535a332e1f9640f03334b8070b90e235cac04cff90471e3241b66",
+    "backend/internal/service/batch_image_provider_gemini.go": "9b4a42d713e10dda9dfc7b7df6f6689f2c056ffb148fda282c41adbc9e90f60c",
+    "backend/internal/service/batch_image_provider_gemini_test.go": "d01a1fc1ff97e7a56495b4df397dffb2792d2c9c182e302593cb5cd516ada2d4",
+    "backend/internal/service/batch_image_provider_vertex.go": "3e20ece6f54bb5bcd83ed773b3b9a36f2b6fdd6446c3a1a6b57b3055e09e2884",
+    "backend/internal/service/batch_image_provider_vertex_test.go": "fdf84c8cb55825bee1c554b3669d26626025543c29b52b9caeeaaba036f92103",
+    "backend/internal/service/batch_image_public.go": "b49bb650fa5adfa45a9028427341a5db4204b32e263a2444bc21244eda602523",
+    "backend/internal/service/batch_image_public_test.go": "8bddb4ff8c76c595f34bf732ae91e174eadbf16c4e15a5a83a67f2f7423694d5",
+    "backend/internal/service/batch_image_queue.go": "ce4abce893b7c62d81fe08b3e1cae4b71eca81cb3e35c081e126d320294a2d8a",
+    "backend/internal/service/batch_image_settlement.go": "eb8fea58dbc98329e92be4f46ee0e09af46f96f9a4ff2c6727c7534a68f5d4fa",
+    "backend/internal/service/batch_image_settlement_test.go": "d98c070a10f4434b4fe34165e322a4128e2579724ff87246eb22ff95dffd65f6",
+    "backend/internal/service/batch_image_test.go": "33ebe9a3cd1b13d3f62be406c57714916ddaeb33d363faa8ddb51752f6d9558a",
+    "backend/internal/service/batch_image_worker.go": "9deea38dd86e4d1a0d0651c91d51a437897b525acb163436abf59361741bf5ff",
+    "backend/internal/service/batch_image_worker_runtime.go": "dfc4b0ba3f53c13b72d6247c680486af52a0a31d102cf7b8af11479c5c7933fa",
+    "backend/internal/service/batch_image_worker_runtime_redis_test.go": "2a343f7a029e2f15dea964ea6b1e47e6ad5f3cf5c2a7ce0458db735e5678bd41",
+    "backend/internal/service/batch_image_worker_runtime_test.go": "b2faff598e859d451a75a0e72cfa573c756c9d86677423fd0d8cc104bf599a8d",
+    "backend/internal/service/batch_image_worker_test.go": "4b33949e10716ca635be6fdd583cebb45b73c46db56b80fa792d8dbe9d542c9a",
+    "backend/internal/service/bedrock_request.go": "13acf43b4ab86227820a78b2af4e1956ba813e705e110e9e2d8c859c76b884d3",
+    "backend/internal/service/bedrock_request_test.go": "08c04ac5017d181190dbe98f3cfa64f6d7781b615122bab355e21b5978e5b8f4",
+    "backend/internal/service/bedrock_signer.go": "4d2099320ea10ae3fb24441803d239c60e7804759c38b32d973d4d3fe3f4893f",
+    "backend/internal/service/bedrock_signer_test.go": "493e1184a72ef8acc12e3c47a0699938b5012cd715866d6532ddda0cd13f188f",
+    "backend/internal/service/bedrock_stream.go": "d6a0a99e41581d5c2ecaa39cc078a9437f0ecbbf5a56fcd57f519f2139585dc2",
+    "backend/internal/service/bedrock_stream_test.go": "3962c91fa9a6dd13109931de792c70770d15d173a3eb7b3b244a1fd748697889",
+    "backend/internal/service/billing_cache_port.go": "7c98e1ebb3346094fdc4f0b075c36ac477487ebe32403eefd25048754ce2e9f1",
+    "backend/internal/service/billing_cache_service.go": "ee10aca9bfbf04aa0c87df135d59069dece574636181e49162496202041c6764",
+    "backend/internal/service/billing_cache_service_balance_test.go": "e44a3a3d7902d0a83f65680c6963bad624b71d7420ebd893b9e2c9f796aa2527",
+    "backend/internal/service/billing_cache_service_rpm_test.go": "f96789f89316b9166eddc0c695172d7054b4333524230c5f130699e55507e6ac",
+    "backend/internal/service/billing_cache_service_singleflight_test.go": "fa0f9937c3a6e65de6a3c9fbf90e160a173bd780f7c2c3d9f663d51658cb77d4",
+    "backend/internal/service/billing_cache_service_test.go": "047e588a66a6351ea4fccf7414f16be486fe62d7caa73ee1409b7e44ca8d5979",
+    "backend/internal/service/billing_cache_service_user_platform_quota_test.go": "ad0888c0160df0cf89f6b2cd99b42dcd3cb7c51a79e0c3f13f54bc9a16c290b2",
+    "backend/internal/service/billing_context_schedule.go": "fde2a2caba8aad22b869bfa52dd77806744ddfcc6eeb6550326373ebe39acf32",
+    "backend/internal/service/billing_context_schedule_test.go": "aa8b39f73d8b5f250f392ce66217530a6dc2f1d88326816adc77189805748de4",
+    "backend/internal/service/billing_export.go": "d9c90f30f7836e164d043c15b23bfb12fda9d58beb1ec6e2b28f3cb3e41854b6",
+    "backend/internal/service/billing_export_test.go": "853b6f9734625c3dee9ea1c93934d201a814a51224babe5752f0695e61466e23",
+    "backend/internal/service/billing_search_audio_cost_test.go": "11d0bb3f281c783a95f5f14a0cd9095a659414ae2dcfc227e5676bddef6b2fc9",
+    "backend/internal/service/billing_service.go": "7776308d6bce0c1b325987f03051890d6147604eaa4c0412a85f1b98218f972c",
+    "backend/internal/service/billing_service_image_test.go": "b29aecf267ee0ddbafac65bc8d99db1347bfccb905e8c66d2a5f9bfd2012f42b",
+    "backend/internal/service/billing_service_rate_multiplier_test.go": "172a2d9207b052e0980db25f218e0866761920ac0df5e18429e24bb951e72bc3",
+    "backend/internal/service/billing_service_test.go": "63d130c098a430274694f04cea2c9038ffc79c1efef04eab4a425effc3078ec5",
+    "backend/internal/service/billing_service_unified_test.go": "b05f6766d41a4b8e0328d8f653f8303e8ee03183f153cb15f57fb3a031af598e",
+    "backend/internal/service/billing_token_cost_request.go": "7650e8372fb148ab60f3f31dea8bfc0af53a58cfdefe572e6e4daf10e7993f2e",
+    "backend/internal/service/billing_token_cost_request_test.go": "0a04beed3977387f2996b527d14164e75c6a14e0498a9c9141098b6c3abf2934",
+    "backend/internal/service/channel.go": "c597ab8ae8db2db7a7c7e62acf3ca887c523f5d716857680d4730de669ceaf25",
+    "backend/internal/service/channel_available.go": "82716614a97b3f78b81b213f65ca859b5f11b6b43e4c0aa16b7aa8740fcd1e03",
+    "backend/internal/service/channel_available_test.go": "c3dc082e7974cc11a55feec988f3d0f604bcd1bb41d0ae2e9fc08278bee1eef1",
+    "backend/internal/service/channel_bedrock_cc_test.go": "37c79566ebc7304413c6f963fad9b28a8c9a096886b0f012352126127d5c576d",
+    "backend/internal/service/channel_monitor_aggregator.go": "2b212f95eaaee029f8b684757e1961ef2e8bdbb57e30c3188dee95d5c8d48c16",
+    "backend/internal/service/channel_monitor_challenge.go": "162d38e4ad72a51b51eb42022873bf8137584924042403c073abd2c357f5c31e",
+    "backend/internal/service/channel_monitor_checker.go": "213dc2cea497f016767003bc9d5baa11c94e64c57dbf854e6ae349c45118513c",
+    "backend/internal/service/channel_monitor_checker_body_test.go": "1453725c400cf35743370c6b8d9955466dff57eaf1eabdb032ab4d47c58731f3",
+    "backend/internal/service/channel_monitor_const.go": "da4e2a70c98ceabb801e409824f9916befa6d279fe5e51830ed61d949ac8abc6",
+    "backend/internal/service/channel_monitor_duplicate_test.go": "131ffb4fa0d19bfeffb3c0ebe7a6c5e3cb7fbb5620dce5584fd4d492903b8a1a",
+    "backend/internal/service/channel_monitor_probe_retirement_test.go": "11e5cc6a1b4d8447039bb7f92d7a2adaedc6ba95286a198dd0d7af00d898bb1e",
+    "backend/internal/service/channel_monitor_quota_fetcher.go": "a59992101e3836df9e09662afa47896d5a2f29241f2a13df27712f108fc92c18",
+    "backend/internal/service/channel_monitor_quota_fetcher_test.go": "57ce3f7825f2560516ed8d62ee63ff87edd7799b05b9f1943411e05a5dbff483",
+    "backend/internal/service/channel_monitor_quota_mode_test.go": "5d50055257266a2cd7a1ca66a86fea77c31280acf36544c0d73cbb6e9b490789",
+    "backend/internal/service/channel_monitor_runner.go": "4df3cedeb2ed33140bd0c5b36c145875fa0e445058d9c3d9ef8ef7762b237893",
+    "backend/internal/service/channel_monitor_runner_test.go": "0e75bfad42baad5898eafac2f1cde99c99968b0808c7c19a360fde7d777bedab",
+    "backend/internal/service/channel_monitor_service.go": "72621e8cd509d2afa3ddc90891ba5aaf91ae00664530486071a85a5a22e3ea7c",
+    "backend/internal/service/channel_monitor_service_grok_test.go": "a0ea11098e4aaa255d240bd28fa2537095b6ea9fe385310dd14a44dc8123b1cd",
+    "backend/internal/service/channel_monitor_ssrf.go": "a3a0d0bc0e6264acda25362dd8c21d8ee4387dbc27494afe64e9da48b21f17c9",
+    "backend/internal/service/channel_monitor_template_service.go": "fc70a5881f183070c8599e39bced9d0875b5489157d0c871ea66065070921341",
+    "backend/internal/service/channel_monitor_template_types.go": "11a423a97d133cece2342d9fcfa2bcb752563eefbf265f24d43426c1c42642a8",
+    "backend/internal/service/channel_monitor_types.go": "ac2c4fc58a318d4631a97c6039ff205cf28784f66460c06d24ee287162f74409",
+    "backend/internal/service/channel_monitor_v2.go": "a48e0fa20ead31c1768725f3932a963d0a681938396bd567814af0942c2cddb6",
+    "backend/internal/service/channel_monitor_v2_aggregator.go": "673bd8799e52649144b56679cd451d2410b3f2975ee2dfe23878a7850130feba",
+    "backend/internal/service/channel_monitor_v2_aggregator_test.go": "a9ee8946989fc3c5bb5dc82e7bd7e3c4e7ed2100d3184b23406614a935e12654",
+    "backend/internal/service/channel_monitor_v2_error_taxonomy.go": "7ab090db16948465ea827f7606f3758414877ca2da7ee0f33bbc420b1926684a",
+    "backend/internal/service/channel_monitor_v2_test.go": "672ceeaeef080a72a8b689eb4c03622ddf6032512cbf1ba959bd7c1d6b5e2843",
+    "backend/internal/service/channel_monitor_validate.go": "3c4f5559b97ecde4320ab4eb87e1f8ffe5e0502b832f323b46ce3f229a49d1e2",
+    "backend/internal/service/channel_pricing_multipliers_test.go": "3328375fc3f92a82040c0f2e20d4e617acf6db1395a142fda700e8bddcb33839",
+    "backend/internal/service/channel_service.go": "4ce349ece4c52b6b578ac9209dc43f582971671658b9e9c4988241e0c1e6b985",
+    "backend/internal/service/channel_service_test.go": "eb8be1a71463f2b5bdd5c52bcc3034a6697e240b1c6b4ef503bc470364bb52a0",
+    "backend/internal/service/channel_test.go": "cd4b856186599df5c84c4d9185429d8d863bd8006245307e8153d28df52268d0",
+    "backend/internal/service/channel_websearch_test.go": "3a3db61b8c066e4b88d7c50cf3ba28ef58d3f1364e7f341e2d366614ea41dd40",
+    "backend/internal/service/claude_code_detection_test.go": "96733888166d1fedc68a13011a63418dbd784fc33c63821612ec23c2b7204143",
+    "backend/internal/service/claude_code_validator.go": "2dcd2890f593466f568f56ca7d069f11585b248ebb4befa042cd49838a6095f9",
+    "backend/internal/service/claude_code_validator_test.go": "5a465adc996fab2bd99bd957e9008d975d841619043688f3b9b9e4dacae76e68",
+    "backend/internal/service/claude_opus5_test.go": "eadcb5ab866a2bbf6c031d701a9cfd53cea72aaa1012481c035acbac56b4cf9d",
+    "backend/internal/service/claude_token_provider.go": "d21f14ad6645b728dea2b8a1b48d00ed85899dd357cb4810763ecfc8e171ed53",
+    "backend/internal/service/claude_token_provider_test.go": "2ca87c8d44303c0e7cd2c29910d3a49e2ea3e7589f80ce44b88b8e1a3d7b44d6",
+    "backend/internal/service/cn_provider_balance_check_service.go": "fc86359f0a957341ec84c25bb4a2017dec2b0203954ca0570fdc419c41be1298",
+    "backend/internal/service/cn_provider_balance_check_service_test.go": "19da0a3e1d5096cb8f34570c86393f2a9e2ad33bc24232a909938b0ad90c872f",
+    "backend/internal/service/cn_provider_balance_service.go": "cd108066722e46fbd38b1b3dfe5d00d2c54c8c28a95bb0e8e8cb3b0ea87c8967",
+    "backend/internal/service/cn_provider_balance_service_test.go": "4247fb4fa64ccf0b4483163b2842a75053c4cb89153abd88d0885896b4c13d6b",
+    "backend/internal/service/cn_provider_foraccount_test.go": "bed36f7651c85c6e3338860f5bb8e8e34f44b9640cd1a36423c37d90705a8af0",
+    "backend/internal/service/cn_provider_probe_url.go": "c08ad79774e9f5b36bad0702e312f00fa6db64d651b7634a0743040d24b68cdd",
+    "backend/internal/service/cn_provider_probe_url_test.go": "8fccffcca0678a34ad427a689b5078eeaa9816583e9748ee6f5725dc0319ff59",
+    "backend/internal/service/cn_provider_quota_service.go": "e99a8492f6d1ed3e9a14d406affb557b003e45ba38d083f459cd09081c652436",
+    "backend/internal/service/cn_providers_test.go": "5e536a48d72bad5249e819c1fdfd60c5e2b4701cb8139a047530951caa9a7451",
+    "backend/internal/service/codex_image_generation_bridge.go": "7752cbacd097fe971898d0a27d0d3ae5dbbb64ba78088623457a7ee9e49d36cc",
+    "backend/internal/service/composite_model_route.go": "25ecf87e4701beabd92b976b5122ea7fb65f15425fc5e31b83e8a2336adb3e6a",
+    "backend/internal/service/composite_platform.go": "07f9b194e5843dbb15a234a43667c493426a735b73119c40f88ca71dda0c52cc",
+    "backend/internal/service/composite_platform_test.go": "cc33ec820c5bf20b99ff3860a19a8ee7bc8fb4978838364c88642c27d2b34b53",
+    "backend/internal/service/composite_route_resolver.go": "3b4df94ac4d8b02a8299a53640ba299d22086ed39779fdfce079075761783118",
+    "backend/internal/service/composite_route_resolver_test.go": "e5f077fe9de936b8ac13c99b3a1dd6bc622d68c06101a1af87a23ac87b097717",
+    "backend/internal/service/concurrency_service.go": "2fc0db74eb333a3a9a021778b02228efbf1b49a1a23ea0b47dadfeeed52e906b",
+    "backend/internal/service/concurrency_service_test.go": "8967b3ba5f5755df9e94a6c2197d6dde53482a7b70d9c3fc875aeea7cbcc9a0c",
+    "backend/internal/service/concurrency_slot_cleanup_test.go": "7fade4acaa078bfa62ddf4f1bfe03d845d098d2ecc962ac3cb9a32985295ac11",
+    "backend/internal/service/content_moderation.go": "c5196f960eca7040fcda6801a5abcdb4835488cfbdc3c6118d95f106a7917681",
+    "backend/internal/service/content_moderation_cyber_test.go": "5a22dc91c8883d5fd95c94b8c022943ca4997a063792ca0be91d219916ec7f0c",
+    "backend/internal/service/content_moderation_email.go": "62088a04593829c623acba4e0fa75cef8d72a6113f4ddec4dc3bf221149c4ec9",
+    "backend/internal/service/content_moderation_input.go": "2e24af15b7048439a6353d31deaac05a4adb9ebac9db8d06bd87115ce9098d28",
+    "backend/internal/service/content_moderation_input_test.go": "da2bc5157620f1a8548ccd28d19524e0824bbcc839dad4bc355ba4ef248f346b",
+    "backend/internal/service/content_moderation_keyword_matcher.go": "e1bedd675f9f1e6c80d39be6bfbcafff21e368df8c6754d9955e1caf7a33eed6",
+    "backend/internal/service/content_moderation_keyword_matcher_test.go": "2934a2927171f7a0ea41ebd558903614c02752c6129c00bd2fd6165ece703105",
+    "backend/internal/service/content_moderation_proxy_test.go": "3c4260e01431dfb5337947b3b2671d070f2e45d4c1b8cba5d48aa14c66f1ac9a",
+    "backend/internal/service/content_moderation_redact.go": "781f2e0769b87202494316bb27497e9fe25b56f099b0bf28e3c49e65fa035365",
+    "backend/internal/service/content_moderation_runtime_cache_test.go": "e3f33502e269015c62f338fb4cfe392a1830c6eabb0610983c5be7a70853448e",
+    "backend/internal/service/content_moderation_test.go": "4d1d495e1500a3b55866cc14ff8753fc0837d08c46d07f4a33e01ef222b3a061",
+    "backend/internal/service/credential_shadow.go": "444e094f1b0ddb8b97f280920686e3580b3b4b195f860e40a600530a07392944",
+    "backend/internal/service/credential_shadow_test.go": "67232f1de51a465307199c61ee8ddac942603ffd73f737adad5fa4dcb9b689f2",
+    "backend/internal/service/credentials_sanitize.go": "b4431f582fe7efcc8f84348de5e82c163739d04d2499ffe17eef0f631422cbd0",
+    "backend/internal/service/credentials_sanitize_test.go": "6e8763e2b8c027983469475318aa336bcd8db454dffa96675edd3c655ee34d39",
+    "backend/internal/service/crs_sync_helpers_test.go": "0a54bbcee7586f0a78c40423384ad0d025243788c74b005597f1cbdba93a94fd",
+    "backend/internal/service/crs_sync_long_context_billing_test.go": "0e137aab433a0c511c23f2f79d6cb3d3804107bc6e63da88291cbc74a21ccfe6",
+    "backend/internal/service/crs_sync_service.go": "ec743ab649c06fae6746a87d57f9463587f19a025fda3572d3ad773b3d13f6ff",
+    "backend/internal/service/crs_sync_spark_shadow_test.go": "e3e793c1c5cf5848aa731625076e20d12541aedf98fa736b9d538a0e14e4699f",
+    "backend/internal/service/custom_channel_time_pricing.go": "31fbfa49dc90db78cbf1930e1f979fdb0c4d512ff55c4684d07a5aa650b503fa",
+    "backend/internal/service/custom_channel_time_pricing_test.go": "85478d454d14afd07505db1b859bf60729230ae73147e1db7cdc20e87c52285d",
+    "backend/internal/service/custom_group_usage_rollup.go": "98e81828b9e81b1adf1584b3de88b851af56d77d54d8319867ccc27157721930",
+    "backend/internal/service/custom_group_usage_rollup_test.go": "f1d1abe0bd8819f8bd6fd351c7cc36cca6393381af4202c083c900ab9e2ddb9d",
+    "backend/internal/service/dashboard_aggregation_service.go": "042c2d1fe10683dc068d19542895b8dcd8ec400f01e30a59ee927f5e5d371419",
+    "backend/internal/service/dashboard_aggregation_service_test.go": "ce72d64f8957ecb3eec99a62b33ac75f67791ec510d8fe4bce7fb8a2b90c3842",
+    "backend/internal/service/dashboard_service.go": "6419928bba35e23165dcd61952a47457a35b431f36dd6317965c2c380ded128d",
+    "backend/internal/service/dashboard_service_test.go": "336c9895d887b8a7cc5e26f7fad0a98274439d250ededc010448ccbbdf51d63b",
+    "backend/internal/service/data_management_grpc.go": "73e036b67e4597ff0155937d09551ede7f3aae0ec53c61e9c9d83a9d1368d7b4",
+    "backend/internal/service/data_management_grpc_test.go": "507f22bc9177203dbc67bc7acb8252a656442d36e73deddd50f89ce6678171b7",
+    "backend/internal/service/data_management_service.go": "7556dfbee4a3a3c6ab63780a7233535291c7473b4b04e64f73d6daf55b77a895",
+    "backend/internal/service/data_management_service_test.go": "ff30fde220f5a5638195edc84a38120e5fb168745b7ddbb3541b0c7870a30fc0",
+    "backend/internal/service/deepseek_pricing_test.go": "57a597bf2fcd5988c86c559aaca32ee3a75c5b13132cb40c01070774a3a7d8a3",
+    "backend/internal/service/deferred_service.go": "e6d7f1a89097e1896a98be02888fb52dfa51154cff4f73051c84dc55f3b56663",
+    "backend/internal/service/digest_session_store.go": "9040103d87fadc503a2dc83082549e452d07e4c52801d99e16622c2d4953efbb",
+    "backend/internal/service/digest_session_store_test.go": "de7fe8c6579a14cbda48ed463f0b24dbc8ccb908f392acfae29efffbb6b43826",
+    "backend/internal/service/domain_constants.go": "3283fc9c88db59f8570e4e6e84803afa467e0d60506d57b11a5be0ffa2517fc5",
+    "backend/internal/service/domain_constants_test.go": "fb49704f4910126543ff0ccf93dcea8046ca992b9fadcec69d1dab3c5291cbf2",
+    "backend/internal/service/email_html_escape_test.go": "65245592e6b8edc0c76745a0731adae449d2206944ae46ba6488aa57c51e360e",
+    "backend/internal/service/email_message.go": "126fcc9b8864b7c989a49a529422e48480bac8cb09a6356e597bac0108183683",
+    "backend/internal/service/email_message_test.go": "a2ccba7f9a4f399845f0b3bbe813387f71872a4bdef1a105a81827bc4bde978e",
+    "backend/internal/service/email_queue_service.go": "c43644ec56807c54914c44d26f482b056b894b98a4e2aa4c7bea22852c2015f5",
+    "backend/internal/service/email_service.go": "455dd2c81e89cd1b6da1dacc0dbc72c1202836a8515e0ad2961b00f7339a86e2",
+    "backend/internal/service/email_service_smtp_test.go": "e4444d4552cd8c616b6e52931819ae7df84c6217215487765a11e9f0c871e753",
+    "backend/internal/service/error_passthrough_runtime.go": "41ef87e652ae2ceec2a7dfd48e8898eeb4e54b613f960fec5fae323349e88521",
+    "backend/internal/service/error_passthrough_runtime_test.go": "80f5a5a86e4847ce9a02bbc828e04df7a7212e83a5e11c5b6b743cf474ccca51",
+    "backend/internal/service/error_passthrough_service.go": "08787ea4fb4068cb325aba2ee654a023880adeca6ee73b291228e48eb6edd163",
+    "backend/internal/service/error_passthrough_service_test.go": "5221856405df26d3f0f74f4acb3789a6eedde885f45bb68c15d5e2e60f84320a",
+    "backend/internal/service/error_policy_integration_test.go": "7aa61e61dcfb055d24d43261c3a4a1d0b7089da720229573a93a8827a9192697",
+    "backend/internal/service/error_policy_test.go": "7ee593a31b55273d6e0dd85566ad1b54a5494834048d1c8b9d215634f97f56f4",
+    "backend/internal/service/force_cache_billing_test.go": "a55c96835566809c3b9366859918aa5df244a6a524716af2da5aa732a805e13d",
+    "backend/internal/service/gateway_account_selection_test.go": "13680f0bfbb2e6fda63b2e09257e12a863e07c75e28b418da6bb87292dd10457",
+    "backend/internal/service/gateway_anthropic_apikey_passthrough_benchmark_test.go": "aafac67200c4eb63d7ea0323f999af630c9a171fdedb564c2ac288b363b7591b",
+    "backend/internal/service/gateway_anthropic_apikey_passthrough_test.go": "2990e393dd8ca7cdde33046751234afddfbc434cad3045eaa8da3255f9afd51d",
+    "backend/internal/service/gateway_anthropic_passthrough.go": "437047a020530e7aa06380b08d1fd015fe036aa80a1c9c907f04e088dc3f5bf1",
+    "backend/internal/service/gateway_anthropic_vertex_beta_filter_test.go": "ebc9796fc850888811453c0bb58dc859955489317ebaf28b9d4c451da5b58aa5",
+    "backend/internal/service/gateway_anthropic_vertex_service_account_test.go": "73df5be19e48340aa7032806a1f02e54d82ef0f2451b2e66613ceca494cff315",
+    "backend/internal/service/gateway_bedrock.go": "5ffb28e5466acb9dc29c6f94e4bc570f1c8d83ab24a98e18e4cfeb44c0837003",
+    "backend/internal/service/gateway_beta_test.go": "8fd33767c7146401bd48f9495a09600ad8db770bbc466abbc094d996141e3f25",
+    "backend/internal/service/gateway_billing_block.go": "3713dcee8cc715311d30a9af42c8e520435f71f75aefe81fafdca1e7931a870b",
+    "backend/internal/service/gateway_billing_header.go": "300993ff0866927503bc11c8dcaf004a66452dab4cc059c403ddf40fcaaa3987",
+    "backend/internal/service/gateway_billing_header_test.go": "2eb08a75fb55b3b6cad349dc33a46c20e074d954d0129fba27c79225a44e30be",
+    "backend/internal/service/gateway_body_order_test.go": "1b16cbe0eb49d5117aba135628bba47372ae5f82b9b0180348497da8c02f03e6",
+    "backend/internal/service/gateway_cached_tokens_test.go": "4bb6fdebe3e4de1095a43d7899782f4295fe6b44e3dc97f9b84dde44ba6a6fdb",
+    "backend/internal/service/gateway_channel_restriction_fallback_test.go": "14285eebfd45e4da3f0c364c787ca3134ecc018866f457f59b68f6b9b1fb4ace",
+    "backend/internal/service/gateway_channel_restriction_load_aware_test.go": "20fb139436c7cbffcb5b037a13583b6bdc986ae2431b69c5041f1ae0f99a4afe",
+    "backend/internal/service/gateway_channel_restriction_test.go": "31e2c279c948da39b6eb49b1d38ee4faf3fb09a82ed79be763c55c75259dd189",
+    "backend/internal/service/gateway_claude_oauth_body.go": "a3d2617d215467da711b67aa1ba758d2e79e24760fd895067813eaf9755f1a88",
+    "backend/internal/service/gateway_context_management_test.go": "17349e7274a9fcbefc34003c83d62aa5ed521daf6a36683a8734ef73048273fe",
+    "backend/internal/service/gateway_count_tokens.go": "4a9b68c5258a52573c72bb338c250119a01b0f6e87cac8a522658e7172c58c57",
+    "backend/internal/service/gateway_dateline_normalization_test.go": "da6f1a396edf19a94f6431e5460b82a5b4dc5431adf979c0b82dde3f9c8a2970",
+    "backend/internal/service/gateway_debug_env_test.go": "53037c844030d6b7a830a4b0abe2cb806557d04c707e398d297f79de5f8144c7",
+    "backend/internal/service/gateway_fallbacks_sanitize_test.go": "2aaafa2f260c0c259a55cb3c0d74f5578f4d16c5ae301131dd6c811c26686ce3",
+    "backend/internal/service/gateway_forward.go": "1b5407113721abcba5ee78f195f57797b6959965f1b0368a0c9d47e05856ee2e",
+    "backend/internal/service/gateway_forward_as_chat_completions.go": "3f77474a266f9323363ca1aa4f3d0836c056af9f770426b2ad2190f84cd76c5a",
+    "backend/internal/service/gateway_forward_as_chat_completions_test.go": "2e1a3f7d3f23d8e2e69d2449f16266fb325e48fae79106f3d8d2481505c8c4bd",
+    "backend/internal/service/gateway_forward_as_responses.go": "7efd28b01e3622bd441e3a2b32436f3dfef1d2824928fee45ee044e28b75f6f9",
+    "backend/internal/service/gateway_forward_as_responses_test.go": "a1b707741307eb3c4a19d335ba0242beec165520636def8058b780d8e9efebe9",
+    "backend/internal/service/gateway_forward_partial_usage_test.go": "1675602a2a921581f02e5a5a7d95921a837a844935941e613449bf999cc07892",
+    "backend/internal/service/gateway_group_isolation_test.go": "30774c49faf7c31b5d505daad06c6ebbb98e4547acf20940578c9de4fd554a77",
+    "backend/internal/service/gateway_hotpath_optimization_test.go": "d15dccdb3a35f72d704c0647e4115c928a74ee28655a9cb9040fadb9d3f4c64a",
+    "backend/internal/service/gateway_messages_cache.go": "4c4b30c84bcbdffb40c040bb20575c663b678578e22de9c3eec9282ebe1c76e9",
+    "backend/internal/service/gateway_messages_cache_json_test.go": "d8e7f13401409748136850f161a6c93660dc90254aa5cbd49cce736dcb937bbc",
+    "backend/internal/service/gateway_model_availability.go": "426e80ae6f5bb66b0c3511cb686a14a60cf5bff46789c5d4266d0be4d4281f81",
+    "backend/internal/service/gateway_model_availability_test.go": "17533b666af7d50799747242b846cc5b414461f4232a46d40f326c0f94747c35",
+    "backend/internal/service/gateway_multiplatform_test.go": "9f4b6fc02e70557595937e32c8a51d4c020352792558e6210367d22bb53234ec",
+    "backend/internal/service/gateway_non_streaming_response_test.go": "e909261c2131f8097e418bda0f1443ba1e5d2f04cfbaed352bdb15f2289d6fcc",
+    "backend/internal/service/gateway_oauth_metadata_test.go": "f87ca13d72fd13398cbb4ebc13210c06b08a79ffde9f887667665e0e5dcaad10",
+    "backend/internal/service/gateway_pool_mode_retry_test.go": "ca62cdc501686058e2a3b4992f852d866749022af87291d1f2b627366b7ba581",
+    "backend/internal/service/gateway_profit_control.go": "5864900783b7ec99177c896d46920d4c54f0d897f730b3d910463dbca29b1beb",
+    "backend/internal/service/gateway_profit_control_v2_test.go": "3893432a29e4a6d3a1395f82b2e23645fd1304796f4c240767d25b29e6aa99c2",
+    "backend/internal/service/gateway_prompt_test.go": "6124f74ef0ca92f9e13a9d26ce8f839977b920107d34a411b2184c594d05068e",
+    "backend/internal/service/gateway_record_usage_test.go": "7e461c1a3595fffc20537d55dd60f6e54aa3404b27c25033eed1ae14cfcd9ce5",
+    "backend/internal/service/gateway_request.go": "4195a186902cb249a50b39de5a3e051dd21752f736b3b392f485199487e2c7a6",
+    "backend/internal/service/gateway_request_invalid_json_test.go": "f25d7d9ced6b4a45a5f01215a9bbc8c5f1da5257437f477a969ca05da51f2dda",
+    "backend/internal/service/gateway_request_pricing.go": "0195ed31f3b9013f8d799e876b3cb585147688387af6395f927274145441dee5",
+    "backend/internal/service/gateway_request_pricing_test.go": "718fd2db3a4171e0cdf8f9a12662a38007eabbff7bf2e9226b127f28459ffe2b",
+    "backend/internal/service/gateway_request_test.go": "1073d33fb3eb31f3996e248ab2fa5a23d2bd2635cdbcf97b22ac10444e5df00c",
+    "backend/internal/service/gateway_sanitize_test.go": "0f95fd744b01d712a7d567602e130ec1a2107d9beebae97af9e2791ef6b00385",
+    "backend/internal/service/gateway_scheduling.go": "894fbe4a032f5659c86c74d51c5fb2601fc007a1b0c5d9bac00d7f7a7f75a2a6",
+    "backend/internal/service/gateway_service.go": "b25c87966a4343132e106a84a8c0bdaf1c2a073a9d5356f19df39d0ed18263b4",
+    "backend/internal/service/gateway_service_antigravity_whitelist_test.go": "6268d74ce0b0cab55ea852b5388964eef5030e770fb3e300e5f2610a08442394",
+    "backend/internal/service/gateway_service_bedrock_beta_test.go": "6ba4a9477f03771e446721da9a062dad952f45f7274b11f8efdb88e785ecace6",
+    "backend/internal/service/gateway_service_bedrock_model_support_test.go": "068e175df18ea7e8606a84724239fd6fe33e40dc92991af55d4e6f2161cbe78a",
+    "backend/internal/service/gateway_service_benchmark_test.go": "6f659a61493d69ec8aeec1fce0016c0ebfa4f6b3f6ba0fdc9de2c081aca97efe",
+    "backend/internal/service/gateway_service_selection_failure_stats_test.go": "b131ccd55c38ff687aa7f34f39c7ac8eb490fcc323173907720ff59177f12d05",
+    "backend/internal/service/gateway_service_streaming_test.go": "0083d89e0310bd39085ab58b3ba6c484ef236901919e58ce84d987847de63d4c",
+    "backend/internal/service/gateway_service_subscription_billing_test.go": "8c1fdb97af1e8d5fd2de0cf7e541413ed75dd57fceea1fe4a47e0d1f9d62888a",
+    "backend/internal/service/gateway_soonest_reset_test.go": "bbd0087ad9891f11b75c23383721cd048adbeab4316b9cb553709467d06518e0",
+    "backend/internal/service/gateway_streaming_test.go": "98843b96e3081d26ee2609f2312d5830715192e464e00295c7172fbd0fc8b3c9",
+    "backend/internal/service/gateway_tool_rewrite.go": "2311ddf94eb50688a59ce13bba41e35ed2489e8db22641187915e572f1ce452d",
+    "backend/internal/service/gateway_tool_rewrite_test.go": "6403f3a1bef35d8eaeb9128980b273ec84ddd006cb6ce8ad10447712168dde83",
+    "backend/internal/service/gateway_upstream_request.go": "a12b3fbdb28016d0be94facce654f9e3e65e5ba9cac40350ff15b73bd01ba3c3",
+    "backend/internal/service/gateway_upstream_response.go": "1fdc736bf78c83ed6f7648f3641a506e4fceaf776c0900653a82a2a85d404448",
+    "backend/internal/service/gateway_upstream_transport_error.go": "044259aecce6373e3a261aa46e69d0a1f13c4d0c8a290e7b2809fd88c09f7063",
+    "backend/internal/service/gateway_upstream_transport_error_test.go": "a2ff958d67ab5b531840428e2caba407b5cec0a719dba710180f12f7260b79cc",
+    "backend/internal/service/gateway_usage_billing.go": "ca5e208b861eddecc5172c5880efb0c1afab9fc4d3c83887d16c3a53a056f046",
+    "backend/internal/service/gateway_usage_billing_fallback_test.go": "950a1f0bb0ca65cabf18e845aa9936689f787c0c3ad51dee98e16cb20eef5ae4",
+    "backend/internal/service/gateway_usage_billing_request_id_test.go": "93ea98c0c5d63090d9efd74217a23c705415bc70cf3bc8befd45c09566bf65cd",
+    "backend/internal/service/gateway_waiting_queue_test.go": "c5b7a5346522a9069e3ef04afa5b11303b568eee2340b2eae8c1ff3abc60c1af",
+    "backend/internal/service/gateway_websearch_block_filter.go": "0f75e2b63f59726887d4c15b8337bde333fbccde6c4e5ba061dafb96cf96cb13",
+    "backend/internal/service/gateway_websearch_block_filter_test.go": "4e583c5af788b7c50521b67f4700c3b5aa3623c5890878aa84d4d5c4eebbcf23",
+    "backend/internal/service/gateway_websearch_emulation.go": "6fbec78f8d3e3deb456ed442a481ddac4a412498ec4fb453f96460156b24e47d",
+    "backend/internal/service/gateway_websearch_emulation_test.go": "47e75079b5bf91a47d781ea8e6d56f7eded918dbc0728202926570aa7ebb52b1",
+    "backend/internal/service/gemini_chat_completions_compat_service.go": "d3f85daac90ce1d6b402e1440bc4135f60915d1800fa83954c45f4e60bb60636",
+    "backend/internal/service/gemini_chat_completions_compat_service_test.go": "4b1f9efd0c70000a11fa39c670d04b391d17484d13329b0102caa66fbd8a0901",
+    "backend/internal/service/gemini_error_policy_skipped_write_test.go": "682ea7f33fb753a7b630801f3d0097ec35e2ea1a6e2669facd060f598ad1291d",
+    "backend/internal/service/gemini_error_policy_test.go": "6dc978b220e650d9f9a650dc1c62dc9fe2a8c42d37c3865e9465630946c75726",
+    "backend/internal/service/gemini_image_output_accounting.go": "df59f8f55eca58640e5d31c6e48d7f969627f686d9d12ac6bf2ddceb3019972d",
+    "backend/internal/service/gemini_image_output_accounting_test.go": "fb6868f66345d0bdca4a8f8f5b15e20ba2ee693558af3a335e42681321ec25cb",
+    "backend/internal/service/gemini_messages_compat_service.go": "72b18063dd4792093e01f4a59e009f38251ef8e7be81a32a26be959e2486c602",
+    "backend/internal/service/gemini_messages_compat_service_test.go": "141bc91fd7328a82dff7beae897577a2fd63871725c93ff5767843444bac22c9",
+    "backend/internal/service/gemini_multiplatform_test.go": "3744b05eabd3aef322747706e68e6c69958ef16075ed68dfd1df76f48bbe98c6",
+    "backend/internal/service/gemini_native_signature_cleaner.go": "8cd95b97c2f195a6ce27348b0574d0eccd248706fe71ab24113f9a9a716f4d23",
+    "backend/internal/service/gemini_native_signature_cleaner_test.go": "57b7d8bae54296941e43293826d2c887ec4fff80dce95ad25ac189b1d03057c9",
+    "backend/internal/service/gemini_oauth.go": "0399024af3f09a06887e9118e4e7c077c872bb40da51f0d354e7c60f107879a8",
+    "backend/internal/service/gemini_oauth_service.go": "c972a1b07d06b0d02effa17187df311873faab04bb14fd6495230d6aba262586",
+    "backend/internal/service/gemini_oauth_service_test.go": "012362900b675dcbd6b221ce3f5495b3bbc7d6476a85f05bc3924ebab17231fe",
+    "backend/internal/service/gemini_quota.go": "6236a619ac45d95db8d92ad08adffe4458c522982bdaae5171b259cfdd21a7f7",
+    "backend/internal/service/gemini_session.go": "34c180a49cab6e24b85fa4ab483af13e6277865c965bd91c1dbf1668fff78571",
+    "backend/internal/service/gemini_session_integration_test.go": "f18d42342c05b3933e1e9b72a4f0887be2aa0a6a3328e32392061a2ae43cad3d",
+    "backend/internal/service/gemini_session_test.go": "b147eff6085dfae6acba9d17ec80648884ed884998b62d1c340e57f0a4fa1afb",
+    "backend/internal/service/gemini_token_cache.go": "aff36f66c54c8899aecea3dc34d8c06f2fe687ba40bd52d20a44671036c6e29e",
+    "backend/internal/service/gemini_token_provider.go": "53c11514c6651e8bf6e8f58646dae0bf1246343a374a8556587ac85f454ad5dc",
+    "backend/internal/service/gemini_token_refresher.go": "ea51f5862044701ea9211816a6e72f25b27000b38c395eabcb4664dab922d8a7",
+    "backend/internal/service/gemini_upstream_url.go": "26d362ee4869ffec02c8c6446fd146c74fc2961583633e5627bf26e4a3423066",
+    "backend/internal/service/gemini_upstream_url_test.go": "4569c961af8a5006ee9d5ff50256896e41bc94e907447559df63978f8576ed3d",
+    "backend/internal/service/geminicli_codeassist.go": "42cfe5b9b81bf232ff5b39503f7edc089c9f37ba0e38542311fbe309c600bb38",
+    "backend/internal/service/generate_session_hash_test.go": "236bf6e09fef95b0a57b44a6e5ac27faa79e0527badb19759374c192c2ac5f9b",
+    "backend/internal/service/global_model_pricing.go": "079e5b8ce2d3f44a69615412a24ac636966632021b7368f47faa080658639d6e",
+    "backend/internal/service/global_model_pricing_test.go": "e268498298c2ba807674bf3978238abce8adfc20aad3a5580874ae648ab167bb",
+    "backend/internal/service/grok_audio.go": "90be4a47ef824bb6821a7cd2b0bcf5a691465394c5aaca8a3bb38b5a1fad2336",
+    "backend/internal/service/grok_audio_test.go": "92c41f3323b71f0e8fdac33edc17ce3428b0084f1e2a2df0cb44400e9d19fdf6",
+    "backend/internal/service/grok_base_url_mode_test.go": "449418def1eaf7933d182513fc7d5eaaef234ee83ccbc32fab3910318170f1b0",
+    "backend/internal/service/grok_credential_failure.go": "b8b3c8e4374728505994ed92bff267b1fae52aa819d324d238293c86f086be7c",
+    "backend/internal/service/grok_credential_failure_test.go": "533213a1a299e87a1d76f792f8f83d5a9029d69d192604a5e3161f2f91d0fb9c",
+    "backend/internal/service/grok_free_quota_gate.go": "1c2122f0d2a79d7fd53e4e3ba2cf6c7e585abfc04682ca4c6ebcf5f052f70769",
+    "backend/internal/service/grok_free_quota_gate_test.go": "173d7762f3f4ee6572411e9d528a1ea104c04d47d886c080ffa78b6147beac72",
+    "backend/internal/service/grok_media.go": "25564d5c4549315e7b827f12c50b9718cffe9e5a318c3d34fd757d519cf27718",
+    "backend/internal/service/grok_media_content_test.go": "485dec9206360ed5d529657894aeacfa1de9fb610c126ffd0e494624e365eec0",
+    "backend/internal/service/grok_media_image_geometry.go": "2a53c8da69214a348551d54d11facefd21bf5289fc17ef8dfad8cff7f8c857ea",
+    "backend/internal/service/grok_media_image_geometry_test.go": "78352c0974e14dcffa56d1c4b104749699fe2ae41528848707901ca219b8e599",
+    "backend/internal/service/grok_media_video_billing_test.go": "e6ab61fb899cbc674b6493650118ea27ab6d82e38b21879ca993863fdd15aa30",
+    "backend/internal/service/grok_model_quota_block.go": "e8975bcee3fd2040415aaee82940cd29bbbd48d14472773a0239c8a37a1aa8a1",
+    "backend/internal/service/grok_oauth_reconciliation.go": "db1fff101fea6c6ce56f1a1394f2f4c61b0a365924b6b982d136af58141861fb",
+    "backend/internal/service/grok_oauth_reconciliation_test.go": "cf6f779434bab9129daae26467a0f0c0c501dae86153b9b68657ac00161d0c03",
+    "backend/internal/service/grok_oauth_service.go": "9bba6134e61c4a71c9c7de7fb0ae60674be3f18062006e31b10727e74ce2e8c6",
+    "backend/internal/service/grok_oauth_service_test.go": "ff65c7271c736bb4ee4aafcc3f538ac6b0ae2951bba62099b3e4b3db0b3a2f0a",
+    "backend/internal/service/grok_observed_models.go": "ebcef3b10eccf93ddd26e972bfb8dbf0e4f11fbb5efe65506a86a171bf9ac35b",
+    "backend/internal/service/grok_p2_test.go": "cb56be8dd15aaee0bdce03efe1b3d9b4d48449e42625e9cae0fc4aa9d56068e4",
+    "backend/internal/service/grok_quota_fetcher.go": "b02d42570a2ab3c39fabf91403ef487ea0ac04d73eff0b4efa746045f0552bfd",
+    "backend/internal/service/grok_quota_fetcher_test.go": "4d23c568996b4af87515a4ea46a5b49917a07afc07508d3add9a6181d25cde57",
+    "backend/internal/service/grok_quota_service.go": "4b85466528f0a0613d3ee711c0313718b3d2244cca36dcf69ac1264bd1e25475",
+    "backend/internal/service/grok_quota_service_test.go": "75f1f4cecc937d60043918279f635071f46867289ad8af3a244ec1b84801667b",
+    "backend/internal/service/grok_search_count.go": "d983589a3495893566a3d716851d1d455ce45715d6d5cf878e6ffd3f99f488f6",
+    "backend/internal/service/grok_search_count_test.go": "8e9ee375a13f8a9b710261958acccb2366551827e8fcf0a9d2e7d49a41ac4b00",
+    "backend/internal/service/grok_spending_reauth.go": "a529a114b2c49654d4d8e36fd6aeb30f41de22ae30502e776200006701660c4d",
+    "backend/internal/service/grok_stream_idle.go": "085a9368fdf90f719d5e2ca33da89b997219958210b0ef09cb3dcf13d34bc86b",
+    "backend/internal/service/grok_stream_idle_test.go": "83dadfc60355f76068f785382859a0e54f625dc8fae394d8931c04cd8d403c32",
+    "backend/internal/service/grok_team_rate_limit.go": "645a235a5c642b742071b005a2c71e1bc7b4f620e437436f0feaaf0abb56341c",
+    "backend/internal/service/grok_team_rate_limit_test.go": "b34fa3c771b2b99cd6ac6d856fb0f088bc79c44a0be5f782891f6e42ed44a7d8",
+    "backend/internal/service/grok_token_provider.go": "a706d56757fedcc4076957ad0590c2b3b0962c95b445ee10272774ebf19a2056",
+    "backend/internal/service/grok_token_provider_test.go": "04e5bbe314d44cd3534cc9ed1a602ffdbae7b7fd799c6970e8272460f5aaa1d2",
+    "backend/internal/service/grok_token_refresher.go": "55285595f88096555dab044821ec6399ab24aeb900348ed19d9bceee7d9f52bc",
+    "backend/internal/service/grok_token_refresher_test.go": "027474da22fdf12915c7304d54bfc942220ebac0684cbab727abcf92e7baea48",
+    "backend/internal/service/grok_upstream_errors.go": "c18acef917031e98857aae1ad51badd306c41708d9f6f39fe46995629124545f",
+    "backend/internal/service/grok_upstream_errors_test.go": "6023851403885c14d447a0cee8b151c965bc870a3edfa7ed81eae8337fc2e4ff",
+    "backend/internal/service/grok_upstream_failure.go": "08c74781791322d104ba5078d528af6f1979291f29cacb5dbb5ae5d3276ee8a4",
+    "backend/internal/service/grok_upstream_failure_test.go": "1c853fe687fef4c939543a55490e725add2b22ab5408d16cbe137152b5d4df41",
+    "backend/internal/service/grok_upstream_headers.go": "bd4ac72da2ffe76fe5afef4361afe57a9a493513ff39a395851f626cd2ad1e05",
+    "backend/internal/service/grok_upstream_headers_test.go": "31a2bcb694d06b8a0ae1a697ceac26700184a30abb8a9909e18d901039329923",
+    "backend/internal/service/grok_upstream_url.go": "b98c3826f8ef4602325eceaa2fbec37918d75fc95abf16363ef74ad2589b599a",
+    "backend/internal/service/grok_upstream_url_test.go": "02e231a229d0554b59d140390d92e6a4174624a3fd3de64abd7c20b02abc4a39",
+    "backend/internal/service/group.go": "7bf901babce31e345331e4f3da1ba83648e2644dc7a8c1792e53618cb83931a8",
+    "backend/internal/service/group_capacity_service.go": "862d7f77a5a96cbe96909108146ef264638349220aa032e9298d217eec61470d",
+    "backend/internal/service/group_capacity_service_test.go": "29e30cc88e9ae44dc21a055d26e6bcf415cc43d920b97b3255afaf042f4a83f2",
+    "backend/internal/service/group_codex_models_manifest.go": "2571244107e7d27878b8c496b736e371db420676eb9db390a0a808d439b8de40",
+    "backend/internal/service/group_model_allowlist.go": "238154aa100b664285bdde789485490028a516a37625e2db1f578e06b6bd8246",
+    "backend/internal/service/group_model_allowlist_test.go": "adc64bd2a084794b4d42b1f826a83025f9d03333d5c690313d4570d3df98d5be",
+    "backend/internal/service/group_peak_rate_test.go": "cd8c2c211842b73d4ba39591d679f12600bd90a77b50c588bf55dcde6ae1f727",
+    "backend/internal/service/group_profit_platform_test.go": "98893854b35eccf787bce92a0e3a070c0260ced3fab835ad567fe738a8fd18ca",
+    "backend/internal/service/group_service.go": "2f71567c671f7e811ee392a4c148121d1812b52b35f5e90f7b8308724d9587dd",
+    "backend/internal/service/group_test.go": "a091bdae6c2f33ebf2bf03336f25ae3f8bb737eb90954323c4d91bef53eff2fe",
+    "backend/internal/service/header_util.go": "397215b5d1062c430171e1f32a72ab85b77955466448fa1b5c2748020dcbc724",
+    "backend/internal/service/http_upstream_port.go": "099765f8a3909531b37c4f31869e5c4d624c3145ad04308134092e05459e3582",
+    "backend/internal/service/http_upstream_profile.go": "54feaf949fda023387771de527cd537fa22bb5aa132df34686422a2d016ecd72",
+    "backend/internal/service/http_upstream_profile_test.go": "c400fd6451a749a79fe166f152ae69a4b6f6e90ec65a17adef58102f7882f93e",
+    "backend/internal/service/idempotency.go": "7515ddbeb932820d0139557e5f38a9171079ba4519050c8920aa129c2b5c6c82",
+    "backend/internal/service/idempotency_cleanup_service.go": "11d702416b6ff6154311f8d2013ba12a1914edf16a07752c986e582606977125",
+    "backend/internal/service/idempotency_cleanup_service_test.go": "740b3427f1a860f7966d567f18c8f6ba9992c433b4c9b62fd22c087612320a30",
+    "backend/internal/service/idempotency_observability.go": "80ae00509d434ebf3dc73cde90f1edf86a14d51ff623e56b9cb6c504a0a857a0",
+    "backend/internal/service/idempotency_test.go": "cee3ea93fc5bdd5c4d48a58b26f038e34aa40c0cc49204058e46d91421d84244",
+    "backend/internal/service/identity_service.go": "51cc920fc2338a8db5759d321f326dc8af01b24990aae6d5b3cebd62514ce66e",
+    "backend/internal/service/identity_service_order_test.go": "cc85e81f47a102a393511a32b5228de5291a59a481be17bed51271660f747c50",
+    "backend/internal/service/identity_service_user_agent_validation_test.go": "dc478685a9cd07c83609cc71a75667147e6e51378b767c9fc1d0535efbca891f",
+    "backend/internal/service/identity_service_version_floor_test.go": "dffa608ca60a21faef68f08b149995087661c34037790ff53a66dbf53858690e",
+    "backend/internal/service/image_billing_multiplier.go": "5805e530b1059a467e3e90edd2421e117e5e5467011857e90e06bd585702b0d9",
+    "backend/internal/service/image_billing_size.go": "2693f534e03dae4f7b96db235ce5c53168c2a7ef4b2db06e76df2658005086af",
+    "backend/internal/service/image_billing_size_test.go": "b0db7066692aa20eba95df5c4521990b273a01de8d489b478abb823ca03994c0",
+    "backend/internal/service/image_generation_intent.go": "ac71d11f58305415165f4827e928d698ae592e2c557c4854b1b70e75d764f7d3",
+    "backend/internal/service/image_generation_intent_benchmark_test.go": "1a5d8fa3fcf5d3b8da2bab258e554e3e0cf167fd4ac8458fdceb7108c16e81a9",
+    "backend/internal/service/image_generation_intent_explicit_test.go": "735008c6562a8f325dee374626d8b85dcb47c9e479193a070a0427ae589869eb",
+    "backend/internal/service/image_generation_intent_grok_test.go": "b35b029581ce7c4ef9d43b4456b65bc27664aa47a2d01485d48d4603780bce9c",
+    "backend/internal/service/image_generation_intent_test.go": "05bbf97adafc6523fed411b28dca31a3cb5994ce75b6447be638f245b6ce70be",
+    "backend/internal/service/image_output_accounting.go": "f96fa8f266ca137ddbb54b8c2a84c898fb2a877b5afdeb5b652dc4f143976a03",
+    "backend/internal/service/image_output_accounting_test.go": "00e0c634e3a29543ea12e45c9a0ec074c1dec4e72983ab4e76db492a612e96ce",
+    "backend/internal/service/image_storage.go": "b579024c6c5dd1cf65bf1ab1ee45f02b862a1147411eca788746d900f723c889",
+    "backend/internal/service/image_storage_settings.go": "1f4db29f8a444b8875f6071937644e6a87a225fdb7c05008251d90aa9480f529",
+    "backend/internal/service/image_storage_settings_test.go": "7d6d5c8d124a495f52ff666a5e81a2e0a77c3c45e2f4ae5cee82a78508a47020",
+    "backend/internal/service/image_storage_test.go": "e0864d68112b423f6dadd117cec0f833c68192e7bb03f75b7c02e0cd4657e679",
+    "backend/internal/service/image_task.go": "991330803dfa9c7b6524213be4d08435fef12df519436a5a28d9cd6d4799790e",
+    "backend/internal/service/image_task_test.go": "4600382b5049a3d1cbece903be75d6b17ad0dc8d2b9084c557f76675cb710e57",
+    "backend/internal/service/internal500_counter.go": "a312adc7ad1bb9ce82e973c76119bf4031ec4f2fc1f9a63a614d8b7ed84c4a44",
+    "backend/internal/service/invalid_auth_abuse_limiter.go": "f1786b0c37914fdcc12fa9e38156b21106076f31c832f4a59f24d72398c5723d",
+    "backend/internal/service/invalid_auth_abuse_limiter_test.go": "1b58ed73ea704f38d4841a55dfbdb54ca4d0c66f1e6fb696d3b8ad0bf9158652",
+    "backend/internal/service/json_time.go": "ef26439b243295363691a21f04cb0b38106c3173f6700fa6d041ac69e4ed8f37",
+    "backend/internal/service/json_time_validation_test.go": "36c0639ebbd92900caad7aad53ac503b8d1e5b89a66f142e06270d9912b62c8b",
+    "backend/internal/service/kimi_anthropic_usage_test.go": "8c1646c432c29bc1bd897c22d1d185bf72a260f4293f44f2f18a3d853830cb7d",
+    "backend/internal/service/leader_lock.go": "74acbebefe196b1fba2d7e2d155c6059723eb0d8595786cebf3febc2cb5d87ef",
+    "backend/internal/service/leader_lock_test.go": "0390a112e32b7acc745ae906febc237c167e16ffe11d05a3cdfc9f9a030d5211",
+    "backend/internal/service/legacy_api_key.go": "765282d26116af86631cfce0e467d77df81f9c1cac8e7069130fa0bdba926e69",
+    "backend/internal/service/legacy_api_key_test.go": "0418722e07cd421bd310c3bc3949a1e8a04777522d035e29b872775a7f45cbae",
+    "backend/internal/service/margin_service.go": "9cb340248fcecb7e433cbf8d7ed45caebfac09dad1ee4f9c127dade3b57218a2",
+    "backend/internal/service/margin_service_test.go": "2f9024adea83e9a92f30b2a1dc6b8db9aa9d06418ee43510eaa3f13a04f16e93",
+    "backend/internal/service/media_price_config.go": "64b071b773f163359165fb489b2aadb4b53c4bb790e88c637f75f015642bf59d",
+    "backend/internal/service/metadata_userid.go": "a2aa593b96ed5de447bdbee3eab7f78e3d96831db0bd4fe842e1c1fa1a42363a",
+    "backend/internal/service/metadata_userid_test.go": "7c3a9ff5678b1be65dfccaf6571cb778916a0879522165a2bb8c924e74e0cbef",
+    "backend/internal/service/model_not_found_error.go": "3a0bc19459e66d4d68d923325c564a7727c3ba0c42a751f31dc069f6462a3756",
+    "backend/internal/service/model_not_found_error_test.go": "9f3189ad1fd7e9c171d451cf9b40d22e6041596a3dc68c30d2edc7f72b404d1b",
+    "backend/internal/service/model_plaza_service.go": "6173bf1deb1d9b438572f3f5562908120fdc45184007ed1977e2354ba0ca8427",
+    "backend/internal/service/model_plaza_service_test.go": "5c15488e88ee21d2b9c341271bb186451e033e87d106dcc709503cf5ecc08bd9",
+    "backend/internal/service/model_pricing_resolver.go": "a513a6255c21323f5cfeed037368ce6d6510b50b05cd72aa26e770e21766dbf1",
+    "backend/internal/service/model_pricing_resolver_channel_normalized_test.go": "6b592377070213bf3c7bd5ce59772832d1553c9be1321a9081e7697101695b44",
+    "backend/internal/service/model_pricing_resolver_test.go": "c9b8bc9069aa8fb81e80ce1621d45e25b450a29ef6674b2e9bd4bf37c6237904",
+    "backend/internal/service/model_rate_limit.go": "93350609e0e1e35066a28c2e98aca1dffaf45a089b0706e3ff32220b37506ee0",
+    "backend/internal/service/model_rate_limit_test.go": "44fe4f3584de8fcda12d0fd20bc858d251297746bb5d7f0497b9372f9d3fd65f",
+    "backend/internal/service/models_list_response_limit.go": "e2bcf98ce49e3a4ec3f8b43268c33282c9b3ddbd02de3aa0ebcac44322cb06b9",
+    "backend/internal/service/models_list_response_limit_test.go": "f85104479014b8a5e1327b157460c0e28bb3207f422db10d48a788b1aeeaf3d4",
+    "backend/internal/service/notification_email_service.go": "ce85a885ff901bf40b9675b97ff687ef3b8820d0c8f306c580295fe4d2568386",
+    "backend/internal/service/notification_email_service_test.go": "5ad2a8b2af3dc7ea2599b4ff5178548ce2286c979f916f44fbe5c6bb2df71c61",
+    "backend/internal/service/notify_email_entry.go": "b66117e27e6d7fef58ff17c415e5a270420d77d36be87bbc41ecde11f185de2d",
+    "backend/internal/service/notify_email_entry_test.go": "6e5ee748ec4478fddb969cfe001e72c3b87112b2f1facf6bf0718fdb69db6bf9",
+    "backend/internal/service/oauth_refresh_api.go": "60e98afb0fecb99ad27adb197ac311d78d65a42a7e752f5aabf9be7cc1566270",
+    "backend/internal/service/oauth_refresh_api_test.go": "3be9fe6abad0467c3b8ccf6b33ed3bd4065dbe001656b838fb2c9edcdeea2177",
+    "backend/internal/service/oauth_service.go": "7b946d4f7eead8650c877d6ad0cc6e9315e879e1d9527882e116dcc03df0ac22",
+    "backend/internal/service/oauth_service_test.go": "54b83b12cdba00e17e96243d02a512ec50dfea1c1e35d166fbcb07c14d891cde",
+    "backend/internal/service/ollama_cloud_messages_max_tokens.go": "e4dae45af005ac2a3d187d09e87eacb4404c0b61df327f00161827d33474381b",
+    "backend/internal/service/ollama_cloud_messages_max_tokens_test.go": "ed17ca135c65131ba8d17d5949954b82aa78a8d1ced211c70e34581cd61ed746",
+    "backend/internal/service/ollama_cloud_usage.go": "64701785f804e5a619b95b0c81f8e6832d877c0a2221fea9ea95009773abef88",
+    "backend/internal/service/ollama_cloud_usage_parser.go": "4a2881d6a426dc27a23fc9a10cc67a815e4c09fd3906e1da56ee5bcf0a57f23b",
+    "backend/internal/service/ollama_cloud_usage_test.go": "75da6c8365a55399b4ab5b64ed37b2ca404b710964a3eba9cec6139d2bb4646f",
+    "backend/internal/service/openai_403_counter.go": "dd4f692e1ec014d5799b1c474078782c21a9109f672efc25a5c77d2e9c227286",
+    "backend/internal/service/openai_access_state_failover_test.go": "9dad43d47a66bdbd0638d20268fa57b1a9a80d0d40fb26e200feea0ac4a75bd3",
+    "backend/internal/service/openai_account_model_transient.go": "ac6442c779d2c85288b5fd19649fba55879fbe77ec960945dbcaf9e1f9699128",
+    "backend/internal/service/openai_account_model_transient_test.go": "77b1d27918e27e39defc22891855c9e111ae627f3ed3276028d9aefa19421960",
+    "backend/internal/service/openai_account_runtime_block_fastpath.go": "26b346dba854ce6b03de6c7b7d74f228acd2f1edd72f739be75c28a1e71edce9",
+    "backend/internal/service/openai_account_runtime_block_fastpath_test.go": "42c5de3b65f989674de68d1d5576844ca66df45bfc862e5467ac4763e9208d05",
+    "backend/internal/service/openai_account_runtime_transient_test.go": "a71ee635fa12db681561d5f9b3310d94f2a7a05e12f1e95108ccc352f5160cfb",
+    "backend/internal/service/openai_account_scheduler.go": "ea3489e8d23eaf947a4099ea3ad335856d2b66fb501c7e6c0bc14b2c199eb915",
+    "backend/internal/service/openai_account_scheduler_benchmark_test.go": "90b503a2ea7756ebe30c89c4b100b36990c7509bf06e226b8ea4ffde5de48b56",
+    "backend/internal/service/openai_account_scheduler_compact_test.go": "cc02a4cce6e1864f2f501f4a987ef988e7aef48379de28cb097a465a644fe03a",
+    "backend/internal/service/openai_account_scheduler_reset_test.go": "9c225bf13cf3e13f161a3b60f45cd4d2225cdec6b4369875e19564d9e2f28f73",
+    "backend/internal/service/openai_account_scheduler_spark_route_test.go": "f06514147d11cfb000634d874ee427b18a0466f8b16cbfd2fcbcad17d5294c8c",
+    "backend/internal/service/openai_account_scheduler_test.go": "a7d12f775f84f77201274f95fafc6f3a8721b50b5a5e33ac22f2fd47ee5e8fb8",
+    "backend/internal/service/openai_account_scheduler_upstream_cost_test.go": "4fcfbe2a5adaf48f1b01ebe270d80b74e4c073ac6f9ac7b799e36dabe8285dbd",
+    "backend/internal/service/openai_account_scheduler_ws_snapshot_test.go": "d11125d2ddbd02b2977b3c243dc45c8c56bf42b2aba24ae047b6fa13f28bd754",
+    "backend/internal/service/openai_agent_identity.go": "2d40a70a453de5aa8bca8aebb42a4d0b7fc81dada426112b411f66ae899bc7f2",
+    "backend/internal/service/openai_agent_identity_compat_test.go": "3fba7b490e0f537e57a5591e6d62e51abd692735d2c4002410e896be32674764",
+    "backend/internal/service/openai_agent_identity_test.go": "285013945428640e432a29c2cbbcbedc009a6165ed34bfa218c028fff45f7063",
+    "backend/internal/service/openai_alpha_search.go": "a6e51eb390bcea081605275096faff53638fb749a3c1075656fcedb5dcc36f48",
+    "backend/internal/service/openai_alpha_search_billing_test.go": "9f54c2070f0a9fca1e37a242b76ad7620402a71b04bf8c21c30ffa361051c575",
+    "backend/internal/service/openai_alpha_search_test.go": "8768f175db1dcd829f83c633f234ef03c50aa0c5aeafc89fc71e376e83ecf3a3",
+    "backend/internal/service/openai_apikey_health_breaker.go": "c6a910626a30766f4285c8514fdea39276446fc7c9f04104649252a80a052978",
+    "backend/internal/service/openai_apikey_health_breaker_test.go": "36b0f764b0c5cc13341b8de5c2b2e33e039e0c1a9a628ec3f98a5a475ec4d927",
+    "backend/internal/service/openai_apikey_responses_probe.go": "6846592660865e2a7c01a2c12568b3b5a2fb3bfff08aa6f21dd9fc3d4390c72b",
+    "backend/internal/service/openai_apikey_responses_probe_test.go": "7b5dfcdf7a40f7f134f090483b1d1e81fba80643478228a731a1a12fb5c5d191",
+    "backend/internal/service/openai_apikey_responses_probe_verdict_test.go": "cc282e36486da7721f2e6d6e7f39282fe6607cf55c49075b20819bb6c07006da",
+    "backend/internal/service/openai_astra_pro_mode_test.go": "cf05648f28c73fd9927c61e253d77eb484649997a0c99b054c431eda36282130",
+    "backend/internal/service/openai_astra_pro_retry_test.go": "eb5c72c2ca023f9f573f9a94d2846ecd9aaa349ac14c46113bdd642d7708b627",
+    "backend/internal/service/openai_bulk_account_settings.go": "11387f2ad5d5a9c91af99249a6f8e79e76818b308eeefa4480133aafbcdb75ba",
+    "backend/internal/service/openai_capacity_shed_test.go": "13270946c7fc373b140e2c6bf5a255752b6afc4c487ad2e19c48523d1a937145",
+    "backend/internal/service/openai_channel_restriction_test.go": "fa256b8bdc3a14e34899a5e8f132ef4837718ea83da0bb09ed216e1a6f492061",
+    "backend/internal/service/openai_chatgpt_headers.go": "c2afd14da908a3f17b61688f896d7993415a638ff70a6add94abc5b8dbfced80",
+    "backend/internal/service/openai_chatgpt_headers_test.go": "a83d7bf2c4813569b3507d9138fbde7fdd89c65ed187ab565e60f194e5e4d256",
+    "backend/internal/service/openai_client_restriction_detector.go": "119a5181b7fdd982990644e93af658b419c5dabaf6c46945894e852e1a294144",
+    "backend/internal/service/openai_client_restriction_detector_hardening_test.go": "5d1f473624feff376424a8e1da5c5f1c1b79b4ec519849b28045394264e7707b",
+    "backend/internal/service/openai_client_restriction_detector_test.go": "78fcb3bbf23d203242e93c5d11f33abe324ebea929b4929ffa3f80c31ff774b1",
+    "backend/internal/service/openai_client_transport.go": "ba2bcad9eafb7b10b124a10860e0eae4b3035a0151240a287d069e6d4cc287f2",
+    "backend/internal/service/openai_client_transport_test.go": "8ae588df8c8392cb9e5f34d3ace16cb37417570611e6e528dc5a95978b6fede0",
+    "backend/internal/service/openai_codex_account_identity.go": "ca7963946092834fffe3e50bdffdb819de0e55168fa4ef1163448d13f2d561e9",
+    "backend/internal/service/openai_codex_account_identity_test.go": "c40e795b884701fffdd457c112dce86335b3e120b1da6036c237e5da63bc8e50",
+    "backend/internal/service/openai_codex_astra_image_test.go": "f2a63ddcdc18c97c6af230da59c5f4820b98d02539ca9ca70e6fa8350d7cd16e",
+    "backend/internal/service/openai_codex_fingerprint.go": "881a526f0e25431b644f0d4031b713e7284c924558adb568ea83c8f35ffd754f",
+    "backend/internal/service/openai_codex_fingerprint_test.go": "3325b32eea278e22fa3a1e9135b857d0889baf60a1c98d0b3b79c955edde757a",
+    "backend/internal/service/openai_codex_function_call_id_test.go": "d5680a93dec6424160304e93b3e6fdc31d794a651e576cac60b5a76d97ca468c",
+    "backend/internal/service/openai_codex_identity.go": "878825b65ca5a7562938eec9c1af9d1d54eca70030bedf0cdf1ac0d9fd428e2a",
+    "backend/internal/service/openai_codex_identity_test.go": "063ab4e2cb8f757aa98118a034a37a6d72255ce4b7fa2fcf860dadf59c7081bc",
+    "backend/internal/service/openai_codex_instructions_template.go": "5b92c2d813421e9c3148458ab57c4f819a3e54d7017e0303f4e7f16217c2e185",
+    "backend/internal/service/openai_codex_message_item_id_test.go": "6c77da24d3b5869ae5863822f1f252416006046ff155cc8d1f61dbecae9bcde7",
+    "backend/internal/service/openai_codex_model_metadata.go": "d3e2ddd5dd201cef733fbe9b082e34ab86f70f424243c790e24349c0c2b529d8",
+    "backend/internal/service/openai_codex_model_metadata_test.go": "fe17be02489cd4edf130dda17d493bd8ae64b71b6dd913c947f4175f3cf7723d",
+    "backend/internal/service/openai_codex_models_pinned.go": "b8243fa53231c6fde3632bc4de87ab3399acb1fcffa2b9df7c539bb4c0bc59e4",
+    "backend/internal/service/openai_codex_models_pinned_test.go": "5a90db601ab18b66aef07a1f2f4d1388651e9564fe8596e39b60afb49925d66b",
+    "backend/internal/service/openai_codex_models_service.go": "3fe2ada1427012638e9c6daddf44d80e0d42977ae2e8114ee26e439a3827dcc6",
+    "backend/internal/service/openai_codex_models_service_test.go": "e8bd176e015006f817aa605964ae123f5016a7d34c59bbe0aba787731eee3223",
+    "backend/internal/service/openai_codex_pat_service.go": "3ffe221174feea1d6a083ab848e04d5f5a39ff0a4e9c71893e14a6c89ea47401",
+    "backend/internal/service/openai_codex_pat_service_test.go": "16535be41c8336653950e85859f4cca30fbeba6855e2277577ba094763b53dde",
+    "backend/internal/service/openai_codex_tool_names.go": "1912aa670039377337435cb9331849916d88336006d52f67a28ae1efe69d4cf1",
+    "backend/internal/service/openai_codex_tool_names_test.go": "e86fcc354522db0cc37c78f3305f601ed0b89588ef35848a920c05c8e43c11b9",
+    "backend/internal/service/openai_codex_transform.go": "39da22a01c2a35c3eb626bcddedc1336a42308c3ff2c1d3d8cae1eb35a6feb5e",
+    "backend/internal/service/openai_codex_transform_additions_test.go": "531a304d18d26eb2390a27994ad86f0f3628c02a690b0f6a177502cc906e9102",
+    "backend/internal/service/openai_codex_transform_test.go": "75084087bc134d1db273e17903d3122b869a4957c02750ac464505bc7acb904a",
+    "backend/internal/service/openai_codex_turn_state.go": "75dd44e7680c5b3123deda623016859f43967eb9e4daf1a27f2e79642ec67407",
+    "backend/internal/service/openai_codex_turn_state_test.go": "fe08c58e0127152354740390260ab6e7bcca3646b65ffd897813922bcc1aca9a",
+    "backend/internal/service/openai_codex_version_consistency_test.go": "9b40a85d1691db10ddac3c1c78b722769974495b40be01f7a4ca31dd00924d1f",
+    "backend/internal/service/openai_codex_version_sync_service.go": "677845f2ce6082ca3c9a651669efda3e6db43f3f7140dc29e715f71cd5625b83",
+    "backend/internal/service/openai_codex_version_sync_service_test.go": "8625f60f10fb5a4c7bd91a71caa481d71e2b82225787def313e2a58171b00dc4",
+    "backend/internal/service/openai_compact_body_signal.go": "023fb72c5af190f8bdeff15fdcea5ac23182494b77ccf97bc82a4e1efaa16905",
+    "backend/internal/service/openai_compact_body_signal_test.go": "3dedea64a72428144ad980031e33c63c57acc330b1c8424a744de8b6fb4e4255",
+    "backend/internal/service/openai_compact_fallback.go": "2096d1da637c5739ac3d924f927fcae0f1e57eda3bbaee1eb684a18723711c24",
+    "backend/internal/service/openai_compact_fallback_test.go": "134f4389a1e15118d4f9f682ea7526a788b1d5b7d25cdbb03cf824ad99ff29cc",
+    "backend/internal/service/openai_compact_model_mapping_test.go": "1b5b5708c43f2d60a5e9edc7153de3c8290aff8a25251cc7ac333e062d38e905",
+    "backend/internal/service/openai_compact_probe.go": "b8f83e10086625e442acbf3acac3897fc9c5cfc541233522f588159c9670d2fc",
+    "backend/internal/service/openai_compact_probe_test.go": "b2e09d0ef26a9ecadc2ce3ee5d3df518fd72dc0fcba5cf7de1512edcf0b3f74b",
+    "backend/internal/service/openai_compact_service_tier_test.go": "0b224287f9432cdb429cc1d0bc0fdefcbd97c81d3b2112ea4cf4fba3cffd9e25",
+    "backend/internal/service/openai_compact_sse_keepalive.go": "57f68c88cc7cbd5847d228394faeac53a81900bb6195e0d0acc497f5316c5dcb",
+    "backend/internal/service/openai_compact_sse_keepalive_test.go": "c436ebe45363de031c55e6e48735577ba2273735428a3d4e00305cf8c55f0c41",
+    "backend/internal/service/openai_compact_stream_bridge.go": "1354b951c4c99103f60ce9e9ccdf95729580cb469896dca1cbc1f864f0b14bc3",
+    "backend/internal/service/openai_compact_stream_bridge_test.go": "db1636172ad9c608b7ded8da1bcd3a6cc71eb7fce80a5bdd014c299e73f4b67e",
+    "backend/internal/service/openai_compact_stream_failure_created_at_test.go": "71bbdb3bb26816a0a70fbb2eb9a8ee59f8cb3ceb4fb8ead5885b33a955e4314d",
+    "backend/internal/service/openai_compaction_context.go": "d8c150f4cb2f49478a09c1829685f9afd0d60642b495051a78d4e90d2d5a629c",
+    "backend/internal/service/openai_compat_model.go": "c4ab3a4f5bedc633d98e14ee439515bb28c8c43dcbb143f202dfd4b19a174eae",
+    "backend/internal/service/openai_compat_model_test.go": "88cf82c851df0988f575812dbdf8fdc9791e4f9b94f565d40474c7ec18a1d8e8",
+    "backend/internal/service/openai_compat_prompt_cache_key.go": "15fa3c2159779897c9a7d37c1a1d22e8962fb1ce7df63c826d1bb7b29a5966eb",
+    "backend/internal/service/openai_compat_prompt_cache_key_test.go": "39367f2fd08ca6f1b24e1129abcb20ac9fa048f0ad49e8fc847bda3055b74e14",
+    "backend/internal/service/openai_content_session_seed.go": "e7d06ed2e2d89833b717136bc9648b2231ab1f3e7dd0ee276344ed3917637d64",
+    "backend/internal/service/openai_content_session_seed_benchmark_test.go": "716d2e5c55cc3a3eba070ad9bd9ae693e9fd44de2f3f433b1b9f412159b46d77",
+    "backend/internal/service/openai_content_session_seed_test.go": "3002eebfd6896fab2ae0133c47b312cc791d531778ca4ec64f87e1fe79c0c53a",
+    "backend/internal/service/openai_cursor_warmup_pipeline_test.go": "3b92ba1f2f4706edc917a9632c5d7762975000be50703b7a00ed2017e98949db",
+    "backend/internal/service/openai_cyber_policy.go": "1fdf1ebfbd15317da9499366d5e1a2be58dd5f5f283ea8aed14fd214f37c7214",
+    "backend/internal/service/openai_cyber_policy_test.go": "dcc3ce77a4adc6d38523ceccaa101b578cadc91eba630200e28402fc2cd75519",
+    "backend/internal/service/openai_cyber_session_block.go": "7eec4c34c5dcb4e88ed5c05dba6787a3dd560da3133a1db540e1fafa6985b5a7",
+    "backend/internal/service/openai_cyber_session_block_test.go": "3a780a98d906b66d0b31b3c7f181fc3eb23ffd25469b9bb38d58f01cd67b3378",
+    "backend/internal/service/openai_cyber_transcript.go": "7fd27f2a95e571b7afa0fbf090ced7c64ef88f6fe6201a0ae9a15eb524d95b75",
+    "backend/internal/service/openai_embeddings.go": "99aadd37e9c8c393452539ec0096d50e10c2efc6b46e2be81bbfe3bbec0d7911",
+    "backend/internal/service/openai_embeddings_test.go": "f00f1bc98c11b5245f55b3dfdf57c9cb7672c00f8de46007cd305d9e5243f09c",
+    "backend/internal/service/openai_encrypted_content_lineage.go": "59cae858d5516bd3556977cd12d86789419816166fbc34fa296730622aba45e9",
+    "backend/internal/service/openai_encrypted_content_lineage_test.go": "dcdd0152e7d08173b8b92046534c558210b63e021e332afa44ba7dee59a40267",
+    "backend/internal/service/openai_endpoint_url.go": "c06f1388683c50dac8e4c806bb37af2e412985a57bbfbd97f70626dcc9a46531",
+    "backend/internal/service/openai_endpoint_url_test.go": "eb82a1e85e63b41fa0b0ff0efd9b6b848370a29cf48da2cef06d92e545f5c8c2",
+    "backend/internal/service/openai_failover_cached_body_test.go": "0ad6248c656b063ac5baac511bec30e4b0259ce6b0f8f45926aa811dec4cecd6",
+    "backend/internal/service/openai_fast_policy_test.go": "8be791000ffdaf20a7c49f628b8a5b17173c241563c20a78a613066c9e81b7ab",
+    "backend/internal/service/openai_fast_policy_ws_test.go": "22ad74d15b188e62a3fd6d0faa6540e944ad83ec2eccc95c4a6790c753e9509d",
+    "backend/internal/service/openai_fast_service_tier_test.go": "86697acdbd34eaa80db2b3b9a9fca0e89e9751c266ac53b6e89d105cd478e80c",
+    "backend/internal/service/openai_first_output_timeout.go": "cd12f076c8e8b8ce57059d5b46e7422d0e9ed3d1dab94cc83e0e3ac348ebd2b7",
+    "backend/internal/service/openai_first_output_timeout_test.go": "1ad729d06f78b589791f27b5ec92128c3225858d8c3a49e41da9815d307e1ab5",
+    "backend/internal/service/openai_gateway_403_reset_test.go": "2206360395ee83196cdd0d00339b8957843c5100c10d6fc0f9d8178ff38ab2ad",
+    "backend/internal/service/openai_gateway_anthropic_native_pump.go": "acdeff0a8cb5ac99c81d237be6a0366229c599e15174929a004bb170de2850cb",
+    "backend/internal/service/openai_gateway_anthropic_native_pump_test.go": "e01073e7ef6f14432b97017be54384cc0b6f3c2927ccb09da45a06ccc56f0b39",
+    "backend/internal/service/openai_gateway_apikey_item_id_test.go": "5e2ccf80a16f6a508b18008e6eed0ef540abdd86b0ea745aa31cefa463f0a9ca",
+    "backend/internal/service/openai_gateway_cc_pipeline.go": "85c092a82071b774ab61ffc5060f48a7b4beee2442c1262155d990179f1822b2",
+    "backend/internal/service/openai_gateway_cc_tool_call_identity.go": "7b90018c5451ce1b2e2997c91d00872e430d6e9e771a7aef16de34eda57d5c5e",
+    "backend/internal/service/openai_gateway_cc_tool_call_identity_test.go": "6321be307a80eba5eca19e3a228ea04963d53d23b6cb8f9f4586c246eafae12b",
+    "backend/internal/service/openai_gateway_chat_completions.go": "f8335379f7b832705fc75f5ffc043a83f31b714470451bc83468bca14b12a688",
+    "backend/internal/service/openai_gateway_chat_completions_anthropic_native.go": "8fbb43ad0041b86cd46d39dfdf986d26e2e913ba3209e82fac1239e24c114de2",
+    "backend/internal/service/openai_gateway_chat_completions_cancellation_test.go": "7a65e25d706e28b568813d6d68b05eac3ec0fa894015143784fe4091738da3ad",
+    "backend/internal/service/openai_gateway_chat_completions_raw.go": "cb9d276f21d6aa35f9208d6b9510d2a639ae1bc166d0b591087345832c8e2da1",
+    "backend/internal/service/openai_gateway_chat_completions_raw_test.go": "279d67f51837863caf329ea07189711290c6ed38e0bb144a6de707360d8eb730",
+    "backend/internal/service/openai_gateway_chat_completions_test.go": "007d67d6dfecc8504990e743e8a2fb8ad2435ea254c774ba0c549cc5bb7e7153",
+    "backend/internal/service/openai_gateway_cn_fixes_test.go": "e3a6329fdca7f61840af741b94842dfca40f9065fe27aa0ecc17e48b5675950c",
+    "backend/internal/service/openai_gateway_compat_buffered_read_failover_test.go": "9af17d4d945d430b1c5fc822bef916e096f03c4a76da8399ca6768377cacd68d",
+    "backend/internal/service/openai_gateway_compat_cyber_test.go": "ffb25cf615c60d05cf41fae60e65e87b83907b1a75e30e91b7432bb3b7b586b9",
+    "backend/internal/service/openai_gateway_count_tokens.go": "2569d843964e8f27320383aae533830fec7ac523bedf501d8a204f52e76f9e1e",
+    "backend/internal/service/openai_gateway_count_tokens_test.go": "a8ff6d5c2c8be880f7e3577f3f6cdbc793e34fb2bb8f67009dfdc00b475defcf",
+    "backend/internal/service/openai_gateway_forward.go": "42d7d40a1c675ac5b501c85717cee50fed320de1ebf51844c701f1f26f68ab5e",
+    "backend/internal/service/openai_gateway_grok.go": "77cd1d04d7cf270a2071dcbb1520619bf61e355bd6537e4a87cad939cf33ce24",
+    "backend/internal/service/openai_gateway_grok_405_test.go": "f3b0e804ac5479f6fe269b7d87918589f1fd4d85643e3fcbf62dfa359192dda4",
+    "backend/internal/service/openai_gateway_grok_cache.go": "2ea49f6aecffcd1d9f7157cbdb676eb986f2f3a449689f00a9f46caf4a3d5386",
+    "backend/internal/service/openai_gateway_grok_cache_test.go": "dba13200245d8aa13ce6b2ea497ef5f4eef463fd5b1f361b145c473d361bf819",
+    "backend/internal/service/openai_gateway_grok_cache_tool_test.go": "30ff460a8a2c44cd89416e9e77e800be7ec4124d1e62e02fddfcf079378fec56",
+    "backend/internal/service/openai_gateway_grok_chat_bridge.go": "81dd1b58943d8b8fa30161ba9da6712a0329ff6d35424fc6d085463ba628d334",
+    "backend/internal/service/openai_gateway_grok_chat_bridge_test.go": "5668b24354a952fb6a0b09a230aa9858468b765b79b2fc2639fa35c4df668f11",
+    "backend/internal/service/openai_gateway_grok_chat_image_tools.go": "053a691e8fc608b98bf5093d97e2cb512e329152d513d7b93caa8ce9be030c42",
+    "backend/internal/service/openai_gateway_grok_compact.go": "aeab64eff0c8f187eda0da80de9106792409c64bab509e7e244b4bb8146ad4b1",
+    "backend/internal/service/openai_gateway_grok_inline_image_tool_test.go": "4db25d6a9ecc5cbd79c4a6d3d18447490b224ebd9bc89285ea3c3c3d88bdf5f5",
+    "backend/internal/service/openai_gateway_grok_model_input.go": "9421d196b32aada11db0a8f401892cb3da2f4e4eb37018e9a30752838c330e32",
+    "backend/internal/service/openai_gateway_grok_model_input_test.go": "35e16f23edabc7e37b443fd2ffdd54e3a045633cafafecd4e7d263b12429ad7f",
+    "backend/internal/service/openai_gateway_grok_search_billing_test.go": "a0c3384ff6655df784490ab18de14d1041238a8e3470d35d940ad5a64c0196d2",
+    "backend/internal/service/openai_gateway_grok_sse_filter.go": "e00567f12c8dc0cbad594992899d4d44e35e31930e6b524214de40f467d8eb7a",
+    "backend/internal/service/openai_gateway_grok_sse_filter_test.go": "ae8bc11cec61e8f0694e34c22f0f929b27aa986654d4c5f9eb9e70909ca8bb89",
+    "backend/internal/service/openai_gateway_grok_test.go": "61a064f67025ff07ade77a2b5d300d288ca4b875e48820932f71820925bcc82a",
+    "backend/internal/service/openai_gateway_grok_tool_protocol.go": "e9efd52b064b55561ca01767b5b493be6f25d734331c6922dbcefe2adb85b9c2",
+    "backend/internal/service/openai_gateway_grok_tool_protocol_test.go": "112106acbb474fb437421c24af65871109500cae022ab9b9068071de337a88c7",
+    "backend/internal/service/openai_gateway_messages.go": "6c6134d8a58b75374dbee912958beee9ba85f83a30ee833695c3aac6d9a1b07c",
+    "backend/internal/service/openai_gateway_messages_anthropic_native.go": "35bbaa3c1dced4a0864b204d05b68fdf45b5510bf8b571caf646dec05e68036c",
+    "backend/internal/service/openai_gateway_messages_anthropic_native_test.go": "54b58b888da69dd7e51e470a3417fddea3cf0a4a8a1021013f5dbd19d13a7d74",
+    "backend/internal/service/openai_gateway_messages_chat_fallback.go": "b78ed097c116df31d5a1ef39b4d3872068b544a901f7b2e8cea0f6ec4caac777",
+    "backend/internal/service/openai_gateway_messages_chat_fallback_test.go": "ff91aa225fb4e2a4f69364865c98234a6d753d035b9fedef5a7122988f36b8e2",
+    "backend/internal/service/openai_gateway_messages_failed_response_test.go": "055e920d8f344ded8c433aec8a7af76ce615f4790b02e3e533653182f8e895ee",
+    "backend/internal/service/openai_gateway_messages_transport_failover_test.go": "f7c898f8c9716ac1259f1fdc1e9578c4b6ac5cecb208bde20ae0523657f2c80f",
+    "backend/internal/service/openai_gateway_messages_usage_test.go": "f463bb21cae751a1d8a388164d8f6d0fad02bb15d912ddcf8697fe6aa5016971",
+    "backend/internal/service/openai_gateway_model_availability.go": "fe2b3fc4ada627f6468884d5e3977947761e2dc94317c5bee5a353c5783fe40e",
+    "backend/internal/service/openai_gateway_ollama_cloud_cc_reasoning.go": "4995823176928344701ef454f9dbd81e92a9be296b2d595ea8c1ecb253446607",
+    "backend/internal/service/openai_gateway_ollama_cloud_cc_reasoning_test.go": "88a83beec012d1e3a2d873b551b4bd275056f909952a4c404c85e7b598c022fb",
+    "backend/internal/service/openai_gateway_ollama_cloud_max_tokens.go": "bca5946716ab7bc70d2dc7cbfdcc7a516f3d674fa4d290df6723f5e83a3d4723",
+    "backend/internal/service/openai_gateway_ollama_cloud_max_tokens_test.go": "96d3a99dea241786c10ac2c376c6fcdb8b201f948ef325860bac216725542c3d",
+    "backend/internal/service/openai_gateway_passthrough.go": "e9ef46ef763c398600267a08401d5ec8f5864849e2cf0a70f8c4577ff5ef55e9",
+    "backend/internal/service/openai_gateway_passthrough_flush_test.go": "45bb17c2d780f1de8bafba9b07be02cbea69631525babdda6b1b6c3684eb5cd4",
+    "backend/internal/service/openai_gateway_passthrough_function_args_test.go": "2fe3df57f76b366d3181865ea9841398b5db3ee1d1e7f7ae8ea75341df6f2e6a",
+    "backend/internal/service/openai_gateway_passthrough_image_intent_benchmark_test.go": "f5ddc30099100b4174402d690336ea5c203a81b7f993ca262b0e58f2a8b75ce8",
+    "backend/internal/service/openai_gateway_passthrough_image_intent_test.go": "464517c3a6f5ab7d152559e0dd6bc7b3e1619d4d4b1109cfd845abd16eb97f91",
+    "backend/internal/service/openai_gateway_record_usage_test.go": "dd5a5c9c8adf8d25d11138e5d094c8abb62dd8ebc4a00b270f6e5222d3fa6257",
+    "backend/internal/service/openai_gateway_request_body.go": "1bb8287e6152df66d606a76d5153b35369a35a9c416f7ef3df497f517641ebd7",
+    "backend/internal/service/openai_gateway_request_body_reasoning_test.go": "b600a89ce7207c59b25882bba258f8298b479c7dbcf9c3ad86e30e138b3746cd",
+    "backend/internal/service/openai_gateway_response_failed_passthrough_test.go": "9b2f9dcc281ceb3330ba8ed9916f0b40d30e7dc862f1fe80769567a4e5c72f04",
+    "backend/internal/service/openai_gateway_response_flush_test.go": "e3f105a3bb0af29727cfa5bcf07f21d6efe69b901a7eac93bcaf808f2dce84f5",
+    "backend/internal/service/openai_gateway_response_handling.go": "9a0f13a4d5046b6255809c2812792932a2d36e20ca9ae1d7988666e791aa7d28",
+    "backend/internal/service/openai_gateway_response_handling_image_usage_test.go": "c2c4fae200eeda0a992c6b481cdf107ed74298ba234de872472a3c9013720f93",
+    "backend/internal/service/openai_gateway_response_handling_type_test.go": "f0b97de10f9784a49a71e5e7c3d9db1e9e36c14efb6aa2fe9386f1cfa4d0403f",
+    "backend/internal/service/openai_gateway_responses_anthropic_native.go": "b3c54a96fa859d2a450cedbb9cc3f696ade58fa4371935cbc1e906058b53ed01",
+    "backend/internal/service/openai_gateway_responses_chat_fallback.go": "bc44d365f942a74a5506c217eab557cea11b0ab3a8443d78a507a6dc2a13b889",
+    "backend/internal/service/openai_gateway_responses_chat_fallback_test.go": "4bd3c421660224bd28c19c4c412da2c18a046853f9646330030f47facaf25c1d",
+    "backend/internal/service/openai_gateway_responses_client_tools_test.go": "fbeaf5e1c928c07977082296d09fd241e8b9ddfb165d2632c2559d582c748d4e",
+    "backend/internal/service/openai_gateway_responses_empty_completed_test.go": "f2f040928420426b87dc938cbdb411ed3a7b30d59d483598aacb9772bf6ce25a",
+    "backend/internal/service/openai_gateway_scheduling.go": "623ad17ab4dec2ad1ac31ad5124e8574daca120681194df16a6ec9e163fa643b",
+    "backend/internal/service/openai_gateway_search_surcharge_test.go": "a08cdc0881e79851df9f0dedb9cde8d3bc54592261b88d057569c229dafe1f35",
+    "backend/internal/service/openai_gateway_service.go": "0e68acbec166723f62de44ea98ec81fcfad7878bb147d5e21fb06dd8180c8ebf",
+    "backend/internal/service/openai_gateway_service_codex_cli_only_test.go": "6ea297651834ed586ffbce353c4c021c2351b90acf1e3f4eb2a3c222903355db",
+    "backend/internal/service/openai_gateway_service_codex_snapshot_test.go": "7cefe7158b765d765e1c817d03a0aaba3c2976d332f6ca88337376b7c6a6b6b5",
+    "backend/internal/service/openai_gateway_service_hotpath_test.go": "d563532cf7830430931c38578ab0215b3ea400af59f3dbd3ab9e610daadd4d64",
+    "backend/internal/service/openai_gateway_service_session_isolation_test.go": "4e6678ada471a194242110a19a40ff436271053db00ad5b2dc249cbe9575b75f",
+    "backend/internal/service/openai_gateway_service_shadow_token_test.go": "eee541b965a41ae3b3154bae05615ba195175fd38517f2d9428bfcf46e54e35e",
+    "backend/internal/service/openai_gateway_service_test.go": "ecc57c33569458871703a24d52f427c169726e00eb52f6bad3764e15f69f3e87",
+    "backend/internal/service/openai_gateway_service_tool_correction_test.go": "3936b7442b9622ba4feb9c8930421d9842dbd3330715c733e8052553dc060696",
+    "backend/internal/service/openai_gateway_upstream_errors.go": "095a9670e2a00d9508d2e1c0dc164ab36d9c5ea9a2596b2ada7124b17737ca12",
+    "backend/internal/service/openai_gateway_usage.go": "3faf9604588e13559be620654744752cd1150c1e43658f3f90fad6282495ca2a",
+    "backend/internal/service/openai_gateway_usage_integrity.go": "93884684d856fea9aca158128f2f9304efca7303b66841857b23f15a459d4a2a",
+    "backend/internal/service/openai_gateway_usage_integrity_test.go": "02cd0cf93aa61c4576a7883eb15a526cc05e5b1360099fbd6b27de5da1e2b929",
+    "backend/internal/service/openai_gpt56_max_test.go": "6f7e685106f09ec3ddef3b5086e28d24a18ef4e3daa38e11bf0898185f5675e3",
+    "backend/internal/service/openai_guardian_affinity.go": "c1ed7785ef3ce96f50bcef739c6d70a84abc512da22e933c78f6cc557483c01d",
+    "backend/internal/service/openai_guardian_affinity_test.go": "75ad41e7400f90b7a2ae091a19027cee2a372e622197156bf17022c3b95c9384",
+    "backend/internal/service/openai_image_dimensions.go": "0e44f000b68431895d1c139873253c80e890bf52b70bc6144557ed11c0087d5f",
+    "backend/internal/service/openai_image_generation_controls_test.go": "be4c7b7ccd0753c615725c7e1d43a41f85f4a5717e54483e8e9f5acdb6390ecb",
+    "backend/internal/service/openai_image_intent_hint.go": "3dadf93022b028ed764fa3a8376b38397a7315bf75f181f5a3a88d653a55a3c9",
+    "backend/internal/service/openai_image_intent_hint_test.go": "59ce74a3b7cd9b03ba4d87d963caa83c3b7ac6f53f55308ea473cc150cc70948",
+    "backend/internal/service/openai_images.go": "8dc66d307a452ce506d23792a42202c80c4f11641dce2d10664f4064cc8fe0d6",
+    "backend/internal/service/openai_images_actual_size_test.go": "53189195a06575b71e0464c1f44ac410bce6eb29f68092aea49d2200a9e82f63",
+    "backend/internal/service/openai_images_b64_backfill.go": "80998560018bc937afb0ccdf2ae14265a1f1cec4920e251c6a880f99f7ed81a0",
+    "backend/internal/service/openai_images_b64_backfill_test.go": "2cead5095cc2e04e474fcc188c862f11d2d2c4b5dc1c49b395faef7531d0b337",
+    "backend/internal/service/openai_images_incomplete_test.go": "7308406655c2730e41b66c4181d156c89e8781cf3c5545e72e4d82e47cd0f456",
+    "backend/internal/service/openai_images_json_keepalive.go": "36a6a945fed8a606963b65912ed1eed667325ff74e2f20c68672d50f7fe0ed5a",
+    "backend/internal/service/openai_images_json_keepalive_test.go": "7c864a5836e175c4404ce43afa072a454375af87e963c494791013916a443377",
+    "backend/internal/service/openai_images_model_test.go": "bb0b2105355e5d5e9a8701ca38c90576c1a128dd9635aed5ae91bd657b7741d1",
+    "backend/internal/service/openai_images_oauth_unavailable_cooldown_test.go": "b182731a55e646a03be7cae790b43363b84b83a07f34a99cce0eaf1168a8bcc9",
+    "backend/internal/service/openai_images_responses.go": "897f02ddc0a6bbb8578b73d96915ce0acedc2b904348143b8279d42c0b33294d",
+    "backend/internal/service/openai_images_test.go": "8214230626cf122f86898f7a59e157f766dfff157b3841a6c32cc47b52a0fccf",
+    "backend/internal/service/openai_images_tool_cooldown_test.go": "4f1b483b25cc58b54b1a96003cbd64a440c966b91dca3569b3f9abc3787be189",
+    "backend/internal/service/openai_images_upstream_context_test.go": "39b8c47368bef424739ae8955b68fd9785c908b9a62ab0c25063110ede4f6f6f",
+    "backend/internal/service/openai_json_decode.go": "592b4a1f21684985547927fbefab4e7194883ff835f13d305b74a8dfb117c488",
+    "backend/internal/service/openai_json_optimization_benchmark_test.go": "051b5a2b06d901e23d3389cf1dfeb6dbb49b4e3f27e5b8142052541c113c284d",
+    "backend/internal/service/openai_live.go": "c0537f93ebd54860ac82a9704993d2ec4111c384b17f27f8e68922a242a863df",
+    "backend/internal/service/openai_live_attestation.go": "2418b579ac7738b702c54ee201da846bd425e791666bc1a749dc9d5dc609640b",
+    "backend/internal/service/openai_live_lifecycle_test.go": "5b6567d892ccbc2d1e5943aa983e009f8f4e1cfe89e79febcee1aa7d686bb74d",
+    "backend/internal/service/openai_live_test.go": "fbfb051962d31c2bd49dc44f053e69ed7528ee1952c850ebd333b966c7a51b89",
+    "backend/internal/service/openai_live_types.go": "a9a8d48fb5ed319a9f9cb71749f25f43c00335648f70524ab60183917f2b81c2",
+    "backend/internal/service/openai_messages_bridge.go": "5e4e2f98a46ba1d6b7cc4581fda17a781b41a852d27745910512ae19accc8818",
+    "backend/internal/service/openai_messages_continuation.go": "f08c305241678dab8c634734b5ef9203fffd4ce4aa9e914bf4737ad5b41c6b04",
+    "backend/internal/service/openai_messages_digest_session.go": "c807820a1a3275b5b88efe213ba1511f790da9469ea51092a60001b9778b2a00",
+    "backend/internal/service/openai_messages_dispatch.go": "892ded5605ff1c8d6de5d63eae2a7f0a61aaeeb836c5a2d53d28262e1104e309",
+    "backend/internal/service/openai_messages_dispatch_test.go": "c4a1de09b5913b4379192d5f5baa217f7b4e997c11ae29e94a9b007c0f3e0d25",
+    "backend/internal/service/openai_messages_replay_guard.go": "5b03ee8b2db0474ede823317ebc613ba63b86fd3904e57199f776e6403a05f18",
+    "backend/internal/service/openai_messages_replay_guard_test.go": "22182c5aa879a01417d74d9bb63f2ce54ae60e40e1d7b3c54fba21742a7b0da9",
+    "backend/internal/service/openai_messages_todo_guard.go": "40b85820b38dfa527996085cb372a0fe36e088b17976c5337269cb5af94bd8c2",
+    "backend/internal/service/openai_mode1_integrity.go": "3218c936742dedb92c17820e2095e749e98ab7e65446b447a7082248628946fa",
+    "backend/internal/service/openai_mode1_integrity_test.go": "d8654e6f3c07d909497c47ecc57f07821cffebeee307518ba1972da1858f166f",
+    "backend/internal/service/openai_mode1_semantics.go": "1932a2abcf708bd71d9d0e877928423be33f6a182976aa12ce4f01856ce2c7ba",
+    "backend/internal/service/openai_mode1_v3_ws_test.go": "784f938963c13193fa530e23c81c131a8557107937a8225b1f0cc7fff69450c3",
+    "backend/internal/service/openai_model_alias.go": "b8e9e854718a12e37a7153d288ffe0dd83ae9221857c84c9cc877a270cbf9f10",
+    "backend/internal/service/openai_model_alias_test.go": "32b85efc39c9e7840097eacded8ab3d732f6fdeef458c59ea31ed8942dc7b134",
+    "backend/internal/service/openai_model_mapping.go": "afc5065731dd3b2932f58b182b67f81bd325f671e8d5aaa72fd2dd0c05ac5649",
+    "backend/internal/service/openai_model_mapping_test.go": "cb9c0247e1c9ad3d46c30b7b41ef691909a39f0d3a37c468155fc818fbd311bd",
+    "backend/internal/service/openai_models_list.go": "68a116f1a35856bd768e2ef95ef1a6b02c8ef7c1ca6c036d6dbe751be5abe658",
+    "backend/internal/service/openai_models_list_test.go": "3b17f848724cdbde53da6dec98f8a0551a03e2e5b09ba33f111a2762c544fd4e",
+    "backend/internal/service/openai_nonstreaming_terminal_failure_failover_test.go": "971102d9f81ad091507ac58c9b20f7808b6a4753db329866c407c6ab5ea6dc4c",
+    "backend/internal/service/openai_oauth_model_support_test.go": "95ef90ecfe06885c4a6a393b384eb9e5a6d8ca32caf17c49dd75bbd7d54ea0d9",
+    "backend/internal/service/openai_oauth_passthrough_test.go": "156b96a5f6f863e454870902be3e43ca1e09ba148cf7ccdf7de957758e096149",
+    "backend/internal/service/openai_oauth_service.go": "f695d871a37e46b620265b6cb51e22ab8a210c9b5e9ba60e4bdccd59b37b8028",
+    "backend/internal/service/openai_oauth_service_auth_url_test.go": "f1f6133019db86094562b4494c97559ae9219dc2dc2cfd2af7b49c54b8c8174e",
+    "backend/internal/service/openai_oauth_service_refresh_test.go": "7bf90221d69c47de9c5bced2166403ee70e9f18a6fe86bf0fb38f7f1dce41627",
+    "backend/internal/service/openai_oauth_service_state_test.go": "8979a2c7ecec9670c923f3ee5e917e6e22c4166276c1a8edf5e94c85bd420f86",
+    "backend/internal/service/openai_opencode_session.go": "79c8a3ea3218d351b7e29bbc6732e2625b7fb475e4e971e78e9164e3e1e9bb3b",
+    "backend/internal/service/openai_opencode_session_test.go": "755a69ec27157abb54db2a970054db60321abc9ba481ae3c4acc32929d03bc87",
+    "backend/internal/service/openai_passthrough_normalization_test.go": "a95cefa82457f81142689bebc76cc5f3312ea2dc91570babe50cdb877cf463f8",
+    "backend/internal/service/openai_passthrough_preoutput_keepalive_test.go": "89034a0fc7a8457440114de14ac1cbed1441bd4219fa065821c65aca89890b0b",
+    "backend/internal/service/openai_plugin_transport.go": "cdd4e1c53749621e167050f0326314bf33c037fe0daf60ef226d0c87ef05814d",
+    "backend/internal/service/openai_previous_response_id.go": "0ddb6734a3691d03b8492c7f4c7647be3928ac9924a916b9d4e1a494bd06fe47",
+    "backend/internal/service/openai_previous_response_id_test.go": "6f65e5502355e8c0323f4239f52adcbdc9f704091921d283e29fdb8500932052",
+    "backend/internal/service/openai_privacy_retry_test.go": "47bbf0f46023212fe14b702c3c65218bab39ac92ad9ba5dcd9193ef6ce1b2152",
+    "backend/internal/service/openai_privacy_service.go": "df62e3c3bae878089f40bffe59e7cca0f0b2f8e9b5ebaa68801414ae1b829932",
+    "backend/internal/service/openai_profit_control.go": "c62cf1e31b92f7946a565529bfcf889ed9bb0368eb30f30060bf66ec0cf9a0b2",
+    "backend/internal/service/openai_profit_control_legacy_diagnostics_test.go": "91d2886bd7f57a3edf8fbf34fad70726cc4eeb8dbf3a196848150c6c0aab63ee",
+    "backend/internal/service/openai_profit_control_paths_test.go": "a5410fe8683177539c8b93b78e2002ac68670842a5b708d3459a9074cb54c4d0",
+    "backend/internal/service/openai_profit_control_pricing_test.go": "c90e1b58f4d1bf925f0409640d244f4d6d2de0d6c5976062f87ae9853d60e20c",
+    "backend/internal/service/openai_profit_control_test.go": "e13d7e92772d7d875be77ae63c6c85f3706a7fb4be088600bf70341147019b0d",
+    "backend/internal/service/openai_proxy_stream_circuit.go": "a21d91003fa11dff3b3db5ad086d7a17a3da0337a9248cc57786f35dd17da4f3",
+    "backend/internal/service/openai_proxy_stream_circuit_test.go": "95bae68665070c863bb6db62615efb35fd57e4cc264237f10460fd4582f75371",
+    "backend/internal/service/openai_quota_auto_reset.go": "64754ab838483d7546ebbd030b6b5dfe5d99393a2db3b0aa4cd198dd2c37c380",
+    "backend/internal/service/openai_quota_auto_reset_config.go": "addc4a388baf1c7581d9b8138eff7534e73dd70c311684254059dd2cce7055b2",
+    "backend/internal/service/openai_quota_auto_reset_test.go": "eaf8bed4029a2e0c812197f8bd71b51c05c7bb120d21c68b8298514ae9bb69cb",
+    "backend/internal/service/openai_quota_reset_credits.go": "323aa8a4876f3fd594bce02d4bd9ee5c18d13f83dfe0036d472ce6030753e86f",
+    "backend/internal/service/openai_quota_reset_credits_test.go": "3a07453eaef15a35e977e9e9b14ab891a253fdec03b29e48894ed4ebe4bf48c2",
+    "backend/internal/service/openai_quota_reset_workflow.go": "c354f265646d295e0ab5c310a31544ca09248443074eb76fb6aa7facd27aaf73",
+    "backend/internal/service/openai_quota_service.go": "fc8b8959bf72364ecd2b98cc2d9e2bbe464ad2e37b55b2961b04311731903e4f",
+    "backend/internal/service/openai_quota_spark_window_test.go": "97cb812a83b8794d9de0b6ef218c1e934806eaf177087f56b558830380bb04a9",
+    "backend/internal/service/openai_raw_stream_truncation.go": "c93396d7c2eff2242013490b61d6eadd4bb53f762a8181242e0d324fbbf2f1ed",
+    "backend/internal/service/openai_reasoning_effort_candidates_test.go": "7f9142cd025a9851819342c5a89431d0c52dd7dbfc268b3b040be69ea6826fc5",
+    "backend/internal/service/openai_reasoning_effort_policy.go": "b4f9c78e3a9c131796ce8b81beb48a294083bc6b43fdae09bbee3f39cf832635",
+    "backend/internal/service/openai_reasoning_effort_policy_test.go": "f3874b2d96d1ebe1903cad9f87eadd9a43cd1ce7aad9cc4271e29350b5cba19b",
+    "backend/internal/service/openai_request_body_limit_failover_test.go": "b0112438dc109c77bd0ef25f864e62c4b7d9f6957bb25c54d2492b6fb8520e82",
+    "backend/internal/service/openai_response_terminal_usage_compat_test.go": "9188a7be11f5974764a12a28b2931db106dd94d145120bde25df90c53a60ae5a",
+    "backend/internal/service/openai_responses_ingress_compat.go": "f758afe692a25d284a52cfecb9016f223d4bf7862fcea3e070d0a3a820ae247a",
+    "backend/internal/service/openai_responses_ingress_compat_test.go": "5535f7d544116bb8271af023d8af96861577b6d2615048817414f472097dc2eb",
+    "backend/internal/service/openai_responses_input_compat.go": "1bde7e0f1d998457fc8cc93bfcda7e0aab96fdbff97de6e6fcd0e05eba294359",
+    "backend/internal/service/openai_responses_input_compat_test.go": "74e6352fb1e3c9d2b6a5abba01d4c2442525d1aac6af0fce7a40466939512cdc",
+    "backend/internal/service/openai_responses_input_tokens_test.go": "cc782e82324c9aba4cc576601548d894637d30f9218f5801c9d04c00713e20e3",
+    "backend/internal/service/openai_responses_item_id.go": "164bb97bfb10b285f5365a003e5bdced32050544203f78fd0f2e050bdd47035c",
+    "backend/internal/service/openai_responses_item_id_test.go": "ac555fdabaafd2cf325334338976786a2798789961fe6ea7f1e9190e7534d031",
+    "backend/internal/service/openai_responses_lite_tools.go": "5e2ab13bda89347ec65e54f5ff9476fd823a9c32f07dbcc7bb27a8ac82f52f0f",
+    "backend/internal/service/openai_responses_lite_tools_test.go": "066309bae29940b63554707be3645e3d0c7a0b0ba972669dd6ba6e3004a9b67a",
+    "backend/internal/service/openai_responses_namespace.go": "f3026cd3418a87a0d80b056decccdf5a670dd7f07167664af9ac4cab10a9eeb0",
+    "backend/internal/service/openai_responses_namespace_forward_test.go": "34af9dd4366fadd4d61d86d9a5756daaa2d979d36aa2a85c368eaed2f3ca3550",
+    "backend/internal/service/openai_responses_namespace_test.go": "fa95f5ea5ee0bce68a73a52620e328bda15a65d1457283b46ec8ea39a371fdff",
+    "backend/internal/service/openai_responses_rejected_field_retry.go": "bbbef34d428cdc6a6ad5f2cdc197f97d227c4be6c3a738fa9a96a3371e998011",
+    "backend/internal/service/openai_responses_rejected_field_retry_test.go": "fed0f6b78cc34507f4b983a3e8e28180a99ccaec63b65e450f643e6803b3d9fc",
+    "backend/internal/service/openai_responses_stream_output_items_test.go": "f3e74ae37eb7533d72b28e03a6b32a3224df73f5d7e5661def16c8096b92bac3",
+    "backend/internal/service/openai_responses_tool_schema.go": "252b0a486871c459e387f2209f2f3a4b5bafd25132d1564378706e71f2783ca5",
+    "backend/internal/service/openai_responses_tool_schema_test.go": "3d98caf2f7cc735cfc17243e6289cd4e1a2ba4bbc6e051b6b3e5bb5bd7d9ada5",
+    "backend/internal/service/openai_routing_hint.go": "f29105d01c4ff7e7853c8799e42990ae443205a74a471805f9266934acd29c3c",
+    "backend/internal/service/openai_routing_hint_test.go": "b2fa526b5d4dd8d0b0874c07ef74cbd17003a58f0b9b86d523d417e7c7c43c96",
+    "backend/internal/service/openai_setup_token_compat_test.go": "3260a5988f02dfae123bdd7ce02e7f96720b52f1f4c61433c4e76423e6095d38",
+    "backend/internal/service/openai_silent_refusal.go": "e20fc5eb14f94736cde1c8b53b34f2c6621d4ff0eacdb5ad0e2a1eb376dfb4b7",
+    "backend/internal/service/openai_spark_shadow_parent_health_test.go": "a5d43aaf3561d67611bc1f9d64ade1bb5b221bed5ac5d5c89926b385681cebda",
+    "backend/internal/service/openai_sse_concatenated_json_test.go": "a508e806a7a5c8b96e84713ffbcb5958aaadb7d5cf0ea464871744c83ef97774",
+    "backend/internal/service/openai_sse_data.go": "0737d30e5a910a552e73c1d2456ee01eb8500c365c7019e5d1b62cfaa8a936d8",
+    "backend/internal/service/openai_sse_json_documents.go": "4145756388349d88374be53bcb2b882e728b775471d71418cff9781a3b6d8a26",
+    "backend/internal/service/openai_sticky_compat.go": "19c89d40a3efe24ae4878264b98123157647f84a1cf0d7e10623ec984e13b004",
+    "backend/internal/service/openai_sticky_compat_test.go": "317511b8b22e74ac5c7038f57c0f45a769b6516743441a597787a643bfa66196",
+    "backend/internal/service/openai_stream_read_error.go": "e26e33a572673db01464eeeb74fe8c9119d0852c4b7400c15e1c111587dad207",
+    "backend/internal/service/openai_subscription_test.go": "241b1fba1b7f021f399ddb2992f9051b3a0b4854017eb0873856e2a8af749df8",
+    "backend/internal/service/openai_team_linked_error.go": "ee0fa292f872398fe53b455393fb2f153da5594762ad7b032593317b8a81e4a5",
+    "backend/internal/service/openai_token_provider.go": "5a88259bc6f9fe2474cfae081bb5d6d1c4bd2173d631bbe31d1f0dd202a96fff",
+    "backend/internal/service/openai_token_provider_test.go": "c5487775aee3405410e97b83c821a2ea275aff7eb4b9f5a05bcbbab6dfa29e61",
+    "backend/internal/service/openai_tool_continuation.go": "d914256794938b4b5c6fc48cbaec7e8705a89836332fcd1a742b59b396afe6c3",
+    "backend/internal/service/openai_tool_continuation_test.go": "9147a614bdd10d5f5327b0e523b36d7fdd6545cb9d505693571ee1fdf8e49616",
+    "backend/internal/service/openai_tool_corrector.go": "bece3f5a47e1395c1bf191cf1f6fb88be9c1b25ccb3a8a2b7139bbcb0ae33083",
+    "backend/internal/service/openai_tool_corrector_test.go": "f1796cb2f0c8a7ef9112efcdd61a40b365c43bc0086a5f6b589f6a6f31b8f516",
+    "backend/internal/service/openai_upstream_client_error.go": "c4904f2ff1dace00a5dbe4bae5dc45659eb45e33ee3957d838254c0ba37fa6c6",
+    "backend/internal/service/openai_upstream_client_error_test.go": "f3b35fb25f417d0f39cc68956b20078306c74a31602d0f2155d8131d2e5d9f20",
+    "backend/internal/service/openai_upstream_transport_error.go": "c402d1f415ca1ebacf09c2502e0cd1cf8b5f15b1ce583e2c2748452f81e548f2",
+    "backend/internal/service/openai_upstream_transport_error_handle_test.go": "f004131b774c8410e59e3d73b8d453ecaecf84d27720f39018df640566a36e8e",
+    "backend/internal/service/openai_upstream_transport_error_test.go": "4ee279cbb8945b84810f649e72b31be9fdc86c20e722f7a76d7aa1232b6b52e0",
+    "backend/internal/service/openai_visible_ttft_test.go": "87d337a9ac973732e03a7b4ad9b1b39f9362f6b15d2aa897a094fc473e1057ad",
+    "backend/internal/service/openai_ws_account_sticky_test.go": "a65c2a752a011fd14141f11f59d53bb087d10618f9f6ac38db6aacb2ab92bd58",
+    "backend/internal/service/openai_ws_client.go": "4243297d628ee6096ee0bdd678b876d209ed5c49e9bd59646448f6ee79e5257f",
+    "backend/internal/service/openai_ws_client_read.go": "59501d9200c525bc5d812dcdeb47fe8e723469f8b8b8541bf282aabb911b5d29",
+    "backend/internal/service/openai_ws_client_read_test.go": "0237cbef8501153807a8e9c1bea1fdcb777bc165649d467cd4c06ad31a23e977",
+    "backend/internal/service/openai_ws_client_test.go": "e9fd6cfe68b43661facf2e0dffd5b0371eadc30ae53cb1a000401736d446a209",
+    "backend/internal/service/openai_ws_fallback_test.go": "5affb5f052a21c51066aaef33a89008b44d27ed7e41773f8a2f1f7bdae64c975",
+    "backend/internal/service/openai_ws_forwarder.go": "188874a8fa0313f9acc84db3690086ab9e3b8e18b536a3a7036121d0ca825c52",
+    "backend/internal/service/openai_ws_forwarder_benchmark_test.go": "7dd7023f64006913c307a96585ad60144fb6e6e837f7e776d904a6d40221a6d4",
+    "backend/internal/service/openai_ws_forwarder_client_cancel_test.go": "68af744504d4dd73569061039f6077f59db0633af2caaa8d5102237e8a6af643",
+    "backend/internal/service/openai_ws_forwarder_hotpath_optimization_test.go": "76452fbde6dcf5adcf8927da30606982cd2f882da1f07017db848d52b5042667",
+    "backend/internal/service/openai_ws_forwarder_ingress.go": "7003fcc7957bc23d8e2ce113acc6e8119ca0ac970a765d6477c4218c7cac2631",
+    "backend/internal/service/openai_ws_forwarder_ingress_session_test.go": "69b3d65c2ce1e20c5e6e1f62d09c123973d69f20bc26156c99b77b69e17a4cdd",
+    "backend/internal/service/openai_ws_forwarder_ingress_test.go": "49bb16793440e4027c7e34eb7bbf16567ad0e0699437535a3cad1aac38120ab5",
+    "backend/internal/service/openai_ws_forwarder_logutil.go": "bc8854aee45f35f5b8328b57801c898d83e09c67693cb9b565debf74345ed2a7",
+    "backend/internal/service/openai_ws_forwarder_logutil_test.go": "660ca2051e9f571ba7da0babad5bcc6ca6b83e6b4ff60477183549016ffc2cf9",
+    "backend/internal/service/openai_ws_forwarder_payload.go": "01078cdfadf4ff6470e2337a27758afb8223e922803e953633c375ed839d22b9",
+    "backend/internal/service/openai_ws_forwarder_retry_payload_test.go": "7c979fde0615fb7955aa31c6284b4c8fa714304903f78a4799c9bb25cc7f6610",
+    "backend/internal/service/openai_ws_forwarder_success_test.go": "710d5db9c382a318345e9955953af4778e987b65b0907f5f34e0cfb8ce3c691d",
+    "backend/internal/service/openai_ws_forwarder_support.go": "220dbc7419e1b03c882b9c58832cf4cc10bf8347bf2d1536083aaa12d3f34b42",
+    "backend/internal/service/openai_ws_forwarder_test.go": "645b0bf874c1cb23116817f00f51f1e0f6691a72b9d6c26078f7c620e8622755",
+    "backend/internal/service/openai_ws_forwarder_v2.go": "ffe4adba3a4720c5b8518fa21438a310017a305ca5621e769cfc41deb9292801",
+    "backend/internal/service/openai_ws_forwarder_v2_test.go": "7f6e33d1916af30ba41a044bbaa745899e837fe8756231063d80bb2b3f8a123a",
+    "backend/internal/service/openai_ws_http_bridge.go": "cdaef490b947429a12e47a631b0582b9f3b5c7b146ff662174006463575cd9e7",
+    "backend/internal/service/openai_ws_http_bridge_isolation_test.go": "dd06fa24044dfedfbf3c8df8fd1bae61cdd1038ac5ff6a7ccac9e220d0466b9c",
+    "backend/internal/service/openai_ws_http_bridge_resume_test.go": "2d0d269adeada668f0d1dd5ede285d707f31b2e8626b58011d3e3b03fad6ca10",
+    "backend/internal/service/openai_ws_http_bridge_test.go": "616453e5dbc88b648425a63cdb41b48aab4b56ac61974335f1ef4ebc22dcee76",
+    "backend/internal/service/openai_ws_ingress_capacity_shed_test.go": "59856fad0791babb2e7ef8e3255fe5b36d7c82a8f5c77cdc0ee3645f5e73f827",
+    "backend/internal/service/openai_ws_mode1_tls_test.go": "7d4496a26cc075c1fdcf3c7241ca7299efa101262d4cf8f57815324e07242a49",
+    "backend/internal/service/openai_ws_ops_failure_test.go": "d7d65b880f14c495f14dc2293708ecc7a14230bcdfe6784e117291b9306be8d0",
+    "backend/internal/service/openai_ws_passthrough_turn_pricing_test.go": "7f8c4f39a1fa52b44d3c521e6caae52c8d0a8321bdeb87ad0506e671cda3371a",
+    "backend/internal/service/openai_ws_pool.go": "11a315a2ac9ffa12a2b6739c11a247dafec1979efa1e483818e8598a54a676cb",
+    "backend/internal/service/openai_ws_pool_benchmark_test.go": "9d0dd42db3212aa2a8a562c3f382fc5c5d7a99e361e29991c51b5d26b3bb29d7",
+    "backend/internal/service/openai_ws_pool_test.go": "e140f2aea77136ce7ef496ecc7fa69fce9190ace478a8075dc80ed1b7d1051d5",
+    "backend/internal/service/openai_ws_protocol_forward_test.go": "9d8bf1757e8d0e48bc798034925a108da3ce56e3dd279c7a825e84bbb43f4929",
+    "backend/internal/service/openai_ws_protocol_resolver.go": "44ea9e022c9e50c1f0587e5f16d9c88be9ccd27a6163ae5556c14d5ab21262fa",
+    "backend/internal/service/openai_ws_protocol_resolver_test.go": "2f63773a0e9fe8f291fbb55d8dc4990184396139e52cd1beb1fce25bd1d1a525",
+    "backend/internal/service/openai_ws_ratelimit_signal_test.go": "e23236184ec638a6c93782ac9d89b2c4d3ee3229d06389505e3ae4121c9ee694",
+    "backend/internal/service/openai_ws_replay_allocation_test.go": "ffe0f559f036d4547f3b241238d872867009ffd9ee218ddbce972ed685b59c19",
+    "backend/internal/service/openai_ws_session_preemption.go": "71b3c7d7f6ac8218611e98f928bf8bc07ffa7a88daf1ff4aeeaf77481e0f0b8e",
+    "backend/internal/service/openai_ws_session_preemption_test.go": "7fb092f0ab7d4289350c8067210a266c816d2078d3e7eaf7bf1ef2e932d91ea7",
+    "backend/internal/service/openai_ws_state_store.go": "c06f736230b893d7f301baef469934294c9255fdc3f3f9055a7599b4ca57638b",
+    "backend/internal/service/openai_ws_state_store_test.go": "7295d96db4194250bcca4616b49128b273db3adc45a3585daa95791ae4168845",
+    "backend/internal/service/openai_ws_v2/caddy_adapter.go": "32afcc7cccbc0e2775559cd1d667947c8975efd9fd4db563967329ea1b5b2dcc",
+    "backend/internal/service/openai_ws_v2/entry.go": "226e7073d58b519457186bbf0eda49a7dfa30ce39be0ca4bd769040b98ea667e",
+    "backend/internal/service/openai_ws_v2/metrics.go": "54729ab9c4d587b74818962ac35d7331cc49f807baf431a0a8db5d715fa4586e",
+    "backend/internal/service/openai_ws_v2/passthrough_relay.go": "efc86814bcefa3a9ea23007d989ac3bd598f8b0e2f3192541b35a42bcce60bcc",
+    "backend/internal/service/openai_ws_v2/passthrough_relay_internal_test.go": "88851f72f1deb76d7578b5a7d3e6d536193712efd90b85c3563c8fedc6047f80",
+    "backend/internal/service/openai_ws_v2/passthrough_relay_test.go": "9810b8e0bf3927eede6833691fd1cb5c21b02071e690969b49f6c083ccfcef41",
+    "backend/internal/service/openai_ws_v2_passthrough_adapter.go": "d6c68195b48b3dea9a7210571dcbb9c651575490f8352303b868c4c1fc04b491",
+    "backend/internal/service/openai_ws_v2_passthrough_adapter_effort_test.go": "b3712edf8a4dbac85b8f9a24d8572a1ff0b3c78521f77b09ae32d62eba41136a",
+    "backend/internal/service/openai_ws_v2_passthrough_lifecycle_test.go": "afac9120abe9a92debf444a1c16f4a5173c6d8ff4936b366e16ee3764a7a206d",
+    "backend/internal/service/ops_account_availability.go": "af31d28bb5e4b32c84e4612b8693dede9acc6d0fd12ec92b25320905943977df",
+    "backend/internal/service/ops_advisory_lock.go": "453407ed3c0ffef91c2116ca67deadf46f15ddf42cae421f121ff424c2817546",
+    "backend/internal/service/ops_aggregation_service.go": "78ccedd86da05163ed32a03779b500f5e98b4ca945399d10e6de3e0923c0ad31",
+    "backend/internal/service/ops_alert_evaluator_service.go": "df354ab47b4f272e5f464e40db546caf6e7089372ab58ab17f708b94bf440fe3",
+    "backend/internal/service/ops_alert_evaluator_service_test.go": "6c1fb9388cbcbc4f24fe503be41c2c8bd8134feb60ed28146c284c9610336023",
+    "backend/internal/service/ops_alert_models.go": "7bf4fcbdfa95247f8246a7d9cbf5a7dc5a922bf2f0b0dd8fd99318e8488cfd2c",
+    "backend/internal/service/ops_alerts.go": "e81233c35a9bf6417443c7ecd1d9e2b57f7e12a8d654262da75e35a219ea15c4",
+    "backend/internal/service/ops_cleanup_executor.go": "70b6915ef357794916d64ea7deb88cbe116901e0d2de3758ca6ae97672d65582",
+    "backend/internal/service/ops_cleanup_overlay_test.go": "59dc87c9ae29d4cadee78d22f2dd5a0818fdff76b32a3b454640ccacd1cea5dc",
+    "backend/internal/service/ops_cleanup_service.go": "fd7457a2a0b9b8794eeb280bebc8ec4c49647a1a348475c7d9ab458c0d09ffc3",
+    "backend/internal/service/ops_cleanup_service_test.go": "d07bcd5e6bedea1527d0ee8ada73084bdb275123f10bc371d1303a0a1754f11e",
+    "backend/internal/service/ops_concurrency.go": "e8a622c9ecda3e8dcf2423b481ba633e6b379fa38e79731e4f1f491d7fb73af9",
+    "backend/internal/service/ops_dashboard.go": "b65341246ab39ac021af6fca048130a38f773329a077a4a292ebe2d7b86c858d",
+    "backend/internal/service/ops_dashboard_models.go": "bdb53ba401895cae60ff059fa27e816f215c83187c97e25f9fa9382b0ec1a689",
+    "backend/internal/service/ops_errors.go": "877555b2418ac3a6b786047bf63e977eac5d1a83f4d4f720840fcaf7e6b90975",
+    "backend/internal/service/ops_health_score.go": "d23a12917bd52109e75d2a3038231e9ddd3f814c95ffa5f823971770daef21d4",
+    "backend/internal/service/ops_health_score_test.go": "1bfb30c5612092c120070647ffb84d76a76ad7776f1e4fc435f832b927924ff2",
+    "backend/internal/service/ops_histograms.go": "128bd2aa81c97b071baad1a29ce28a6db349166746e0e905c3b49ef0427e72ae",
+    "backend/internal/service/ops_ingress_reject.go": "9947e41e59784270e2a427244c660a09e7a897b3af2dfaac7b2b9d8318efb439",
+    "backend/internal/service/ops_ingress_reject_test.go": "a53f1f60b1688650d174823b49b16a97864b73ce01074414d3c69a3cfe9d20db",
+    "backend/internal/service/ops_log_runtime.go": "37352fd050ed23406c51726ed667327a98dfcec606d79cfea2b06c99ff8a7a77",
+    "backend/internal/service/ops_log_runtime_test.go": "985d5d0c9a9a3fd8fe225fc596df432648814e424751fe8cd0add0d8d911fae9",
+    "backend/internal/service/ops_metrics_collector.go": "2ddb54a63099a9d6e50cb02b5328f256f338c38c74278330beb83f462566063a",
+    "backend/internal/service/ops_metrics_collector_memory_test.go": "727f2ac88b1a4678827a195f2153a8f94ebde059f964a1719c4b8d1401706ee1",
+    "backend/internal/service/ops_metrics_collector_projection_test.go": "e5e609bfc154771bbf36dbe976f6c9cb7d8d58c1176db3a3ce3ea18d4175eff9",
+    "backend/internal/service/ops_metrics_collector_test.go": "908af7e3e31521eb3bbb93e649c8c5c2363f1399aae2bcfb38a9db35624583be",
+    "backend/internal/service/ops_models.go": "b8b2fa16362a16a42aa8959e725bc0224ac7e416cef51df9fe932667d8541533",
+    "backend/internal/service/ops_openai_token_stats.go": "9e9ce5282eb2a8cb39b4428843e2cdfdb78051a5615b8ed31c7fb378631877cb",
+    "backend/internal/service/ops_openai_token_stats_models.go": "782244dcbe742a990d8a3333eb656c967cd09fab841a7ea13fd77dba42c77a99",
+    "backend/internal/service/ops_openai_token_stats_test.go": "dfb83ab5c1df2076eedcb39d766bb9be985275717c8729e58400d26c266aa1c2",
+    "backend/internal/service/ops_port.go": "7087acfc05cdbb7e4d52379e0f6d3956c0fc946354aecde7e36068a9a5a46503",
+    "backend/internal/service/ops_query_mode.go": "4174551afe696ab398a75e4af0052e4821e8062ef922546e7433689ee1ac4355",
+    "backend/internal/service/ops_query_mode_test.go": "24e29cd9f0eba97a04c34e50496a3a26940125ae10d03f914beea4651670f72a",
+    "backend/internal/service/ops_queue_sanitize_test.go": "0c9b90b848ddfac49823477c327ff1cf7a333bc1238d6594b7a144a9c29097a4",
+    "backend/internal/service/ops_realtime.go": "9a857a40fd41d7a8765363eac07aa90792d80cf60fd956ab8164385cf7896d1b",
+    "backend/internal/service/ops_realtime_models.go": "df5f4bac25b5641cd981cea5210fc999cb33d9e385408560f9a446cfbaa9b309",
+    "backend/internal/service/ops_realtime_traffic.go": "f0fd2064c70eefc25db3f88d9aa44e0cd757b88dd7dff758c36de4aee420fced",
+    "backend/internal/service/ops_realtime_traffic_models.go": "c720a920c363aeff2bfe3993a23a039cb8bdc3d20c89a8304c1f64644b321b43",
+    "backend/internal/service/ops_repo_mock_test.go": "bca6f58e03232949acf11897dd34586acc5de5520388de484cee3aa2aa337e3a",
+    "backend/internal/service/ops_request_details.go": "d85de1be0239c693e10d45da008a40a4b325b84a268cbaf8134933850f9ce275",
+    "backend/internal/service/ops_runtime_snapshot_test.go": "3c385462b00394d9b92d0be8ee6099391dfc7e014b6605c432082ae85c5c2854",
+    "backend/internal/service/ops_scheduled_report_service.go": "cce5ae35ef463b3aade348b1a13b3a035fb21932134160e75e9bbd7786bb8141",
+    "backend/internal/service/ops_scheduled_report_service_test.go": "85fc465562e03d835cc7a6b1b34fc221eeee4a6ebde97844e53c4faa8df4d377",
+    "backend/internal/service/ops_service.go": "f22a960898960a5341784e0b764975ff92ff97dea20c7af7a50149dd6dfbd90d",
+    "backend/internal/service/ops_service_batch_test.go": "1e26557964124c7b592e12cec179ce80699397c3fa04ecf07b3fc9147efc94be",
+    "backend/internal/service/ops_service_redaction_test.go": "cf5ca7265260d7d2bd576fd41660e847e95514b5ab586032780363f5c86ec833",
+    "backend/internal/service/ops_service_user_error_test.go": "cd8afdefb4de224cff9e038fb6020f488026961d918bd665c29c02b7feeb7d60",
+    "backend/internal/service/ops_settings.go": "c973d04c008d4393b1e2ab62e45b746d7bff4439d2c94126a94f840e9ca7bcc3",
+    "backend/internal/service/ops_settings_advanced_test.go": "978e8e1da179790464fb05ea2c6e9dc0cc586895c56e13247abcf97597920af1",
+    "backend/internal/service/ops_settings_models.go": "9cf40adca529ae207ddc4ec74e02c5b5aea596696a4516b4712cdae27e1b4107",
+    "backend/internal/service/ops_system_log_service.go": "d6443290982f8c7a481290e55479451fa8e6ae08048c341e653e8e1465313b8c",
+    "backend/internal/service/ops_system_log_service_test.go": "debbe15894e465fdf49259e7d2762a1bd9fb709659c31631968b5baea2659707",
+    "backend/internal/service/ops_system_log_sink.go": "a6c4b5be23d0e1ed7c64a9f8ccd19824ca96d8d0b9399d0a1bb2ede7dbbb2244",
+    "backend/internal/service/ops_system_log_sink_backoff_test.go": "7af64fcb4c3b8e7a0419db9889d583394d751215703d07b6b410f963561d7d03",
+    "backend/internal/service/ops_system_log_sink_test.go": "ce4f33ab3771555cb07776eccda6ab71161ddca35db7f8b170898f1ed1b8d096",
+    "backend/internal/service/ops_trend_models.go": "10287ad01af6f97dab7f67afceb4f9fff4710d7f5e9babfdeeaa3fca79ae8a06",
+    "backend/internal/service/ops_trends.go": "35f0eb1dce602f23d2e92828fe5db9e526126b5cb519edd850e763ff8e58a958",
+    "backend/internal/service/ops_upstream_context.go": "d3af7cfe20b97a5dacb728551f296020e339bca8899caf4f928d187fd1067ae5",
+    "backend/internal/service/ops_upstream_context_test.go": "f55f50e001d5b5892e1d082215d688386201aa6a3c2fe4818e8ecef5e0f864d4",
+    "backend/internal/service/ops_user_error.go": "938909d29d66554e0b97819c8573546606d31d1819b2ae8f46fdb2049091a3c9",
+    "backend/internal/service/ops_user_error_cyber_test.go": "8922d81e48bb5155cd8ffd05b4303df34215df1adc4afcbddc92240b1775d0f8",
+    "backend/internal/service/ops_user_error_test.go": "bba6a656111c1cfdc33cad65f0d0bdad1502bbc283b919c0a9c02ad11d603abb",
+    "backend/internal/service/ops_window_stats.go": "75c0b90369f90ef4209f07bc49d9a96770986a2f8fda401b16a4d42b093c8ce9",
+    "backend/internal/service/overload_cooldown_test.go": "51c85f1602ddab290edcf613dfe4ca1bbd8fe21525d2c42550bd7a6f9edb4527",
+    "backend/internal/service/parse_integral_number_unit.go": "9099569d1df125c525772ce21a44e3c356d0e944d50d5ddfca063e4012fa6501",
+    "backend/internal/service/passkey.go": "d837bc583d0e02cd64f36006a977d05d6a7d9891378165fb1d9725711e717ad8",
+    "backend/internal/service/passkey_test.go": "f65ca7181196622f4302d125b82ae35d284a39ea60c9976757ce8b9856590fcf",
+    "backend/internal/service/payment_amounts.go": "b5588f3027fafe73709722b8efe8b21f4e1ec91db37495c46c690d1ec3abf7cc",
+    "backend/internal/service/payment_config_limits.go": "36a54157af0053a7d975982cc4f336009ff1382e23d006917ae312805a196536",
+    "backend/internal/service/payment_config_limits_test.go": "9b23859d9947fee78e64fbf98a1039a504c1aad8c0c74ed77ff196369799debf",
+    "backend/internal/service/payment_config_plans.go": "5f38847a29e08eb881e5998f41903aee71a825a7c10f04889d93282f26cc1a35",
+    "backend/internal/service/payment_config_plans_validation_test.go": "2fee4402991427d7cf1b97890fdaa01cdd79d6cd6ef33a274f60077bdd6342d8",
+    "backend/internal/service/payment_config_providers.go": "5a2600032011f2cfaee68ddd1ff10f6e22b9b899172e46b91508fa256eccee4a",
+    "backend/internal/service/payment_config_providers_test.go": "8ecd1627e98d41fe4499e7c57d1ce2a75ba24387fec04cca25d6a246c7f8ed8a",
+    "backend/internal/service/payment_config_service.go": "58430e942595363a2610312a8af79cb656376a7981b95c82c11e71505ffe2553",
+    "backend/internal/service/payment_config_service_test.go": "092f697772909d4ca220bbf871fef8e4d42f34a81b433a5eb8add3b51191a902",
+    "backend/internal/service/payment_currency.go": "6f074b0137594453467b4d7dcd0831154393f3dbe332190a82eeaa99e1982480",
+    "backend/internal/service/payment_fulfillment.go": "4e9d8058c08f94dceadb18c146d3d0d723b516a1d98503ffc5a542cb32f15bf0",
+    "backend/internal/service/payment_fulfillment_order_not_found_test.go": "bba3c8cec81b6b2139680e7be983bf1ddc4b0777ea6611d14a17234b160f7403",
+    "backend/internal/service/payment_fulfillment_test.go": "fb972b6e1500372aa3b6a4c22312fb923b0640587ae093d217c2d4c8bb176658",
+    "backend/internal/service/payment_order.go": "f42d12e6d11278aca8d1cbb602709cf1d98231bc14cc6dc5eb9c3ef75dde7820",
+    "backend/internal/service/payment_order_expiry_service.go": "ce38b65461728dc576db43fe6e5ba74ddbfa62feb4ac2e4873e4cbd9523a0fa0",
+    "backend/internal/service/payment_order_jsapi_test.go": "3489b7ffd9c0408048cf099e1bffc17bdf3bbcd47ecd7e3fa99e6da540c49afb",
+    "backend/internal/service/payment_order_lifecycle.go": "0f992f27e4ead3ef6cdeb0feddba54da94a2074a2c252af22762254727f46636",
+    "backend/internal/service/payment_order_lifecycle_test.go": "8291603f2115b9dc2bec7ce3ef369cec1bdc7e7d8585ff69b9820aca1097fd7a",
+    "backend/internal/service/payment_order_provider_snapshot.go": "bf38890a40c12c52c4a653dd915e81a3c3480acffe9ef91900b481b47c98118b",
+    "backend/internal/service/payment_order_provider_snapshot_test.go": "c07578a68f3092450f2275bd7246dd7813727d768fce9ce48b41986c5312e202",
+    "backend/internal/service/payment_order_result_test.go": "db8cfb5e887ff86435ecdd06b4faf136f7f6c7ed60951ecec1358d32e525cac5",
+    "backend/internal/service/payment_refund.go": "cf03b04f1415ca847be4dfdda74cf9f4cf1b59d4363988e7022b85d4676eb010",
+    "backend/internal/service/payment_refund_test.go": "fad2766c4df874d37112a01fd76e50f7c5cd57d33fa5cc93b825e6fa1f3a9319",
+    "backend/internal/service/payment_resume_lookup.go": "a68aa6e05182b4920e58331b9035b7e6ac7b5d7926d5b23dcc76ef3200ad9e94",
+    "backend/internal/service/payment_resume_lookup_test.go": "b85b0a27a8659aa4d3d11d0dcd0db34bb4ad97f45e7d4a6c13affebac76fd79d",
+    "backend/internal/service/payment_resume_service.go": "fb2bd1103ca4a052f86993d22d2978f8e1775685128c48e09a45a71223d39f70",
+    "backend/internal/service/payment_resume_service_test.go": "faa32351949f4c5ee0c70893bd2984c876769b7d742a7707735bb2acf4c2e23a",
+    "backend/internal/service/payment_service.go": "c1f56f3478603e470a94668c6ea50ecf07d8acd664203ddf3345c7c9ee7520ff",
+    "backend/internal/service/payment_stats.go": "b6bd0ce2916f8627b52e0ad38cb0d3930932cb030f5c3291c79ee7d29502925e",
+    "backend/internal/service/payment_stats_test.go": "cce7a3a68629e39d8f4c15ef5806f5268dcc6554c5216cd54fe2dbf4b8b761b3",
+    "backend/internal/service/payment_visible_method_instances.go": "41abf9f96388e2fa31dd81972838e09f451eee7c904644c167811b3a0cf9e2ca",
+    "backend/internal/service/payment_webhook_provider.go": "78ab4744036b1d98847af89cb608de2771ea3bd14c1ab91364859018f02b8e08",
+    "backend/internal/service/payment_webhook_provider_test.go": "381f0dcf2d9c12eda3438f34343190b3fb68558a18951165e8587b38ca3a0343",
+    "backend/internal/service/plugin_compatibility.go": "aa8fecad55b8fe7472fdad0f269157d329d9af22228fb5f58e354945b016dae3",
+    "backend/internal/service/plugin_compatibility_test.go": "929fd316ec524e1d76423727040ee97f2c01e62e199ffa36566174c0c88a632f",
+    "backend/internal/service/plugin_manager.go": "4f0d5c083841388910498e69edcb2ac51abcc8782ee1305c1d193fde887ad32a",
+    "backend/internal/service/plugin_manager_routing_test.go": "71e1f6c98358187cd73f00c75189a43b966c8d85a88ee6c4031cd0a25072c1f4",
+    "backend/internal/service/plugin_manifest.go": "416d1a295a405d386ae3d5ab57e7aded65eaa7b8c5e5129d5824815b534f684d",
+    "backend/internal/service/plugin_package.go": "d52c1bd0dcfb53f1d18b4e7210b332970915e4215642a6737a80007b38413b05",
+    "backend/internal/service/plugin_package_test.go": "04078f71f25c0700e97845fb1308b7dbf3d4475bd872860bc5d8de09f5f6b227",
+    "backend/internal/service/plugin_runtime.go": "93ebeb58f995ceca57d0d1d76a6671bac0031d7319de5ffa2242ca7c7b737799",
+    "backend/internal/service/plugin_runtime_integration_test.go": "219234d59708547910ca71c471ee30a6932e8a2c8d4f9ab97d2ef0a77492f267",
+    "backend/internal/service/plugin_security_regression_test.go": "c11e331e6fcb38e4ad2e4e6cd982f10f408a81e29b2358ac6d3f35eebe9d5ccd",
+    "backend/internal/service/post_billing_platform_test.go": "e1b26f7d40c6225606a2e708201afe363264250327b45ef7daef757be4e4002c",
+    "backend/internal/service/pricing_service.go": "904ff45294181170a9d09f5969fa9dcca0e401f2ca6a03df6b1f432a424baf16",
+    "backend/internal/service/pricing_service_hot_reload_test.go": "108c66bc15ccbfcc09f6bd8abd351184c47d3534c0e0c036589004470e2f2500",
+    "backend/internal/service/pricing_service_override_test.go": "f126c350d834161bc03132e354b5a80dcb4771880346c96595223104f9c628e8",
+    "backend/internal/service/pricing_service_test.go": "24b3946a174cdb7c645883006af9be247d2a64b7370c27c7da96c507dec0c52f",
+    "backend/internal/service/pricing_stub_helpers_test.go": "f3db17d72e07e8f52942a95c1cbf56748653a62bd92b54ac3aa9c088908accaa",
+    "backend/internal/service/profit_control_threshold_helpers_test.go": "0d800456b276e7fd688ff7ea30f40757173d7d9b2cbe35fa45451c296e368b1a",
+    "backend/internal/service/profit_preview.go": "a8c07aa4aa1b4ced9fafb87eac71a3979d91dc4b8477c2ab095d826e0005a222",
+    "backend/internal/service/profit_preview_test.go": "569951651cf3559d88f7a54bfa4f62609a0ebd8172a1bcb9cad0f22ecfbafde7",
+    "backend/internal/service/promo_code.go": "ffa56095eff20d743bbe75f30ede022d543de59de934398069b4b8bc414a2849",
+    "backend/internal/service/promo_code_repository.go": "d25b57278dcdb75e888ca17de881df251ebfe6a82dccb7f9ae0a1a2cd5317206",
+    "backend/internal/service/promo_service.go": "db44785894dd957d7e47bfe0f36070a9d5189085dc604b6b61c29f428b1ac908",
+    "backend/internal/service/prompts/codex_opencode_bridge.txt": "b03e0884f6e07cbe8de7525f8d6fee4bdf1847aa2871d790e076b52d0102bcb6",
+    "backend/internal/service/prompts/tool_remap_message.txt": "dbb153b21577aaab5839de686e236447e1d2c3b146fe3fc762a59b68363268c8",
+    "backend/internal/service/proxy.go": "f4b7e577aa9ddd9752b094c3ce19ffd8a310f60a9074e094f6b69ddc10c7dc10",
+    "backend/internal/service/proxy_expiry_service.go": "63993e17aecf15c24011f36776bdf1874d9b1246d0ca8ef534e9f36ca03327d8",
+    "backend/internal/service/proxy_fallback.go": "7209b4d2cf3554a9f05e40f9cf35fb38cecbc8f828fb6cf9bf8707e37454d3ed",
+    "backend/internal/service/proxy_fallback_test.go": "4786efc940480fd811ee14d011c987b9140e6e8da336563356c0907c6b1b94ca",
+    "backend/internal/service/proxy_latency_cache.go": "c5c1f9775d42adbcf28fd45c88764aa6aa2ad0c29a409cd9a766628e6b25b2c6",
+    "backend/internal/service/proxy_service.go": "76164582f1f08084b8f55fa90353d736d783e67cdadbd272e9dbe228f64e242f",
+    "backend/internal/service/proxy_test.go": "783ab8851a052470c436c55aa6d8226cbe6220c62b9327a37c9482c28d863134",
+    "backend/internal/service/proxy_update_probe_invalidation_test.go": "86b5394e47aea9a18afbe5020d85fd5ab44cf6cb7ee21252d5a06b2b999d4606",
+    "backend/internal/service/quota_fetcher.go": "3879e06d8855ec5132621773bfb51fbb6dd89fa76fe37f09361a11ccf1fa0945",
+    "backend/internal/service/rate_limit_429_cooldown_test.go": "4022941eca859c3be8d84aee8cbb77145dbc831a2a7c9220f3dca40fc880a778",
+    "backend/internal/service/ratelimit_cn_providers.go": "2cbc351cd1a386752fc5c3e5c7fcf97a97a593dbe6aa61a1f33182247c347a4a",
+    "backend/internal/service/ratelimit_service.go": "23ddb41ed574247c0ab06d913696bef7d713b26c278adaf333b5c932feb53966",
+    "backend/internal/service/ratelimit_service_401_db_fallback_test.go": "d1fb94f2a34ba2e36fd2e323d1d89f042ef097fd78295c24df6f3083dd3221eb",
+    "backend/internal/service/ratelimit_service_401_test.go": "c7d584fab68972dc23a272ad0cdfd180e9b8e184ded5e9ffc54044c092bf24d3",
+    "backend/internal/service/ratelimit_service_403_html_test.go": "248dd0a1b7fbdc3660404e66e834e6c746a2800b9713c21a38a6327341e3830a",
+    "backend/internal/service/ratelimit_service_403_test.go": "268b4d56a3b720e19573530dd9e43bc671ba65b8871123c058be0687a44a216c",
+    "backend/internal/service/ratelimit_service_anthropic_test.go": "541642bc9c67cf69e7c2e1c6b86e5579d2045ab832189ec7b4139d766a7cd4eb",
+    "backend/internal/service/ratelimit_service_anthropic_window_limit_test.go": "705e42f84cf85672101fffb088bcaee94d80e9a410370036675f9a35b9b54a7c",
+    "backend/internal/service/ratelimit_service_clear_test.go": "4613d366df35ccd6bb97d38c272f20e28a0c2e2ebe229adbe5d7f152b50fe10a",
+    "backend/internal/service/ratelimit_service_model_not_found_test.go": "31c628913a317e01fab6d547be740b2becec1377dd6873c60d9613a31bd88d79",
+    "backend/internal/service/ratelimit_service_openai_image_test.go": "444d126bbb96febefe51ec6d30b0a8fef4c84152d3ba0d7387bc699235695b02",
+    "backend/internal/service/ratelimit_service_openai_team_linked_test.go": "ee2ecf5300b62dd2c4d4d957fa7b7ba68dfd7b752dcd7e4d337ce8442f461381",
+    "backend/internal/service/ratelimit_service_openai_test.go": "ec962e1aed03067b69ee6595627fed69cee9b5ab585ca2ba64c3c5e2701ec284",
+    "backend/internal/service/ratelimit_service_scheduling_threshold_test.go": "2aa2b40af383811565ba420711a5b22b33795dacec7a44de4b64db1f4d25076a",
+    "backend/internal/service/ratelimit_session_window_test.go": "f93b9da06ab6b746220033f98f4d4d45019aa0900872ebfadd749594baa09d8a",
+    "backend/internal/service/redeem_admin_fulfillment_test.go": "17aeca9b5077127e5a019d6e75b38a2910df01c4bb305407ca39e8f18204f8af",
+    "backend/internal/service/redeem_code.go": "a3e99ce173af064a203f1f1efccc21f4b87a5a81ce0f49999e78e8a038b23463",
+    "backend/internal/service/redeem_code_test.go": "809788cd5736a52db8cf3fc2865b813dcf27eb53427c7418cc78eebcb9be2d2a",
+    "backend/internal/service/redeem_rate_limit_test.go": "4e02d99350997267acf51d3ce54da54596eaed3e5768b249eeaa19e792fca929",
+    "backend/internal/service/redeem_service.go": "c1fd90ccd56787ce5eeedc819b7a486f63a059342277dde0c6e69bf21b382705",
+    "backend/internal/service/redeem_service_batch_update_test.go": "fb226044ad99802f64e8055c8ab33bd35a8b73361924e1336718de41343baa18",
+    "backend/internal/service/redeem_service_redeem_test.go": "18804bd8cac8a8a09de04d96076b5c2cf6a5eee9aedc1c0d451cfb7bf94386d7",
+    "backend/internal/service/refresh_policy.go": "85872d7ff14a4a2165a5634649b52e7b5ac488cf450d8449cd16bd10233f17a0",
+    "backend/internal/service/refresh_token_cache.go": "495ae5c37bf64e353ecccaa652dc5fc0bdea8348780ac9380f07b797e9c22b8a",
+    "backend/internal/service/registration_email_alias.go": "58066a41da02dc012afcade58622c13cf04c8869999672255b58d93972ca2a67",
+    "backend/internal/service/registration_email_alias_test.go": "beec584293a1ffa77a54a5ab327bb37223b175325e0d6de72844535e6f7fd7ed",
+    "backend/internal/service/registration_email_policy.go": "dbb00da2e0a02f23f9e9632cd1db90273d89676c48c5ccf9c93cda7827757184",
+    "backend/internal/service/registration_email_policy_test.go": "60154d66e0d76d27543dee532dfdf43b787351ef83a0f35440af72a7a47c2578",
+    "backend/internal/service/request_metadata.go": "19e4b0e3a521f41f0d7118fa1f48a91d041702e3cd2fe352b32a3fe04716df8a",
+    "backend/internal/service/request_metadata_test.go": "8506572d0b49c3459930a5d730029bf35608cae6b29a2437fdbeca0aa41a1868",
+    "backend/internal/service/response_header_filter.go": "f7eabd9e4fb8eac4e899c2b3f96aff77d696db3e21086707041e2890e5445de6",
+    "backend/internal/service/response_model_billing_test.go": "ca483fba2a607702d38d2648d717f4a9d92e9f4e2df1372d71762b7fbdafbc33",
+    "backend/internal/service/rpm_cache.go": "f1c6a3267c2e6c2b0f09564bbf7f102483ddf46cde5a688d45e787a08aefa97f",
+    "backend/internal/service/scheduled_test_port.go": "1b4fbaedd5506891bfc34b2dc9c088526bf862a98774d362ef2b3180146587a3",
+    "backend/internal/service/scheduled_test_runner_service.go": "0356c6d229705bb03b49dce8490ec15dfb4f7636324e7142802c4189069e4cf0",
+    "backend/internal/service/scheduled_test_service.go": "701bc4e096a26d7cf97159154d9cc693e257f9a5e5faa7f387e5bb0a1f1949b0",
+    "backend/internal/service/scheduler_cache.go": "61d833d00617668a54cce36d4b2109515fdd451e7e054d6012895d9e012683de",
+    "backend/internal/service/scheduler_events.go": "202959e2465985139935f5dc3393804040e157e51e1650f11e1c5782a95ce61e",
+    "backend/internal/service/scheduler_layered_filter_test.go": "235850ae48956654f84e443acd365d8ed544b508e55bc2365e926fa41a54f298",
+    "backend/internal/service/scheduler_outbox.go": "f231f7b4427bb62aad9c3560a7b01b33b4e3c6fd087724ebee13b2b4e361cea2",
+    "backend/internal/service/scheduler_shuffle_test.go": "7841a0ea1d533b05e5f3181478e24199f365e64724e4148f2a41b715fbc126fd",
+    "backend/internal/service/scheduler_snapshot_batch_query_test.go": "e2c39fae3fb99d74e80a3f3130afc751019449e3ad6184c3c74f8943d0c63bdd",
+    "backend/internal/service/scheduler_snapshot_bulk_event_test.go": "ea002c80d0869a8c608a579fd50c86a0a119b47c7e3bc2bc677abd97a5934fd4",
+    "backend/internal/service/scheduler_snapshot_cancellation_test.go": "f25f01928a6f9eaf1154091ccce98e188c5cb9440df8d88a0298a75fb666587b",
+    "backend/internal/service/scheduler_snapshot_full_rebuild_lifecycle_test.go": "af12d63f3c2cb016403a60fcf0ece24d177c34a085ec79287b22f1408e6ead0f",
+    "backend/internal/service/scheduler_snapshot_full_rebuild_test.go": "a9b1dca60a51237b7482c7a75277d984b5292b5094791fd2303727820cb60d7b",
+    "backend/internal/service/scheduler_snapshot_group_lifecycle_test.go": "aad7502d9cdf5878e3020e4399b58f89d3fb1bafd67479b647a8e73819e42db4",
+    "backend/internal/service/scheduler_snapshot_hydration_test.go": "b5f362c1d8069e1714f081dadaf9d7bd4e416b193d56839b0e65a554dae361ae",
+    "backend/internal/service/scheduler_snapshot_outbox_cleanup_test.go": "aecb145a8649b2984d50fc814222338cc937e36f07441b564264aceaf04c3436",
+    "backend/internal/service/scheduler_snapshot_retirement_test.go": "42f3a9838f07ede151c1e5c6ee2291835e7c229973178d1ab486a1ea0bd6e9c4",
+    "backend/internal/service/scheduler_snapshot_service.go": "e08eac0316c383247ddf773b08edeb0e791b3264ed5704a54a5691a9f2516980",
+    "backend/internal/service/security_policy.go": "0cbaa75f148851f056ea39f2e8be1419b047627e53641e5e65d2acbdf359ea52",
+    "backend/internal/service/security_policy_seeds.go": "728bb35532c93caad0fbe8af501f2868fc54730affdd7193ec5f54247f82edaa",
+    "backend/internal/service/security_policy_service.go": "0325782efb22cb4b7e11c9bfef0a4073f7b461b345c2937c90360fc7bbb183f8",
+    "backend/internal/service/security_policy_session.go": "39dab325e2f6f155bdc46aee975183302835a5ed85fb4c4c35b09a25d99a4ada",
+    "backend/internal/service/security_policy_test.go": "93ccb518bc1680b867a385353f994ef223717f2d470e02dd0221333b48b2bf22",
+    "backend/internal/service/service_tier_billing.go": "6bdd39e3245371d5af931aeae2ae633a5ee8f957181360801a4d51227464b34f",
+    "backend/internal/service/service_tier_billing_test.go": "19074360385d43b4e214fba8d01a93663a04d7dbf1ef8bd7d162be193187feeb",
+    "backend/internal/service/session_binding.go": "8810eebc38cb8589a7cff08d61dad47a86fc61b2fd7fc23aef81a4db9b826af9",
+    "backend/internal/service/session_id.go": "ca7f8e4c6769569cd9a24f55ef147d567fb98c87f2b3d32f31b64e48e37089ed",
+    "backend/internal/service/session_id_test.go": "2a0d6e0272a04bc6fb1f9d311549dc10c122be64d59ee06dda19064bd8c9d554",
+    "backend/internal/service/session_limit_cache.go": "013c61898393fbd8572dc8b2b7422e83d027bd29d13076cda59e63f4ec7b69b6",
+    "backend/internal/service/session_limit_release_test.go": "c5f27f90a410b0967517cb0b91912deec4b90305bb1bc58777e2c50ffceabe61",
+    "backend/internal/service/setting.go": "9014999d8df8800455c5572024896787a3d5d8e87dd4f304f5330bc15ab55faa",
+    "backend/internal/service/setting_features.go": "b9963ee25ae7376016ccfa9f84718d0525e31b0fb26e3fe52d6e8dd3b403e9b2",
+    "backend/internal/service/setting_gateway_runtime.go": "0ec35eaae08490791cda9eb32d6575bf5ef1afd84237e491b67866da63ede11e",
+    "backend/internal/service/setting_oauth.go": "dfbfdb2577647883b6818002b0d5a7590e1df988b4a7f3dced440c48ead5f358",
+    "backend/internal/service/setting_openai_apikey_health.go": "e5a5edf8a8a249a0f22bd6f0c215511cc83424dd419aef73604f7fc9c1a4a0b6",
+    "backend/internal/service/setting_panel_rate_limit.go": "105529e37668125435d7d98c6eecd76342bc9c14f489cb1f6fd8d39753bb3707",
+    "backend/internal/service/setting_panel_rate_limit_test.go": "757fa846e96a68ce217d8830d0fd3da44e4d47ea542f3cbf0ace2178ee5e0ccb",
+    "backend/internal/service/setting_parse.go": "5f49d5b3078317679552902559d776b3971ec4395766a5e034375acae0543ffe",
+    "backend/internal/service/setting_public.go": "714a240ca645cc7e6b7338221980395535ad5241dfb5ec3cd2288b098f3852f4",
+    "backend/internal/service/setting_service.go": "278524a31e0afe01deecf1ab9959f74be530126fe4dbd60a58304f2e60c31827",
+    "backend/internal/service/setting_service_auth_source_defaults_test.go": "9d44fdafc968862c849a9c73d1a72d9c9695c4caa9ebaf5cb93d7e58afee1f01",
+    "backend/internal/service/setting_service_backend_mode_test.go": "862b2836a334f0b4bfc11877d84fd5cb46f716ed258ae853148ce82a79458ea8",
+    "backend/internal/service/setting_service_claude_oauth_system_prompt_test.go": "59524f46f0cbf83a11378a91ed8121287d38892dc92d6c499fb85bbc93579821",
+    "backend/internal/service/setting_service_codex_policy_test.go": "a490b2eac25977beb063c60f5f94cef286fcc09c1227205696ccd33bf869ead1",
+    "backend/internal/service/setting_service_codex_validate_test.go": "5b865c39ed7d3bcc55660f5d3807c4d71e13d5cff0ff445c02030013e0142e73",
+    "backend/internal/service/setting_service_oidc_config_test.go": "550a432fa0a21f09d57b2ef9829fbb26c0d3b07eb319bf067a90d5b7d5cc8b60",
+    "backend/internal/service/setting_service_platform_quota_test.go": "79a2155c38c274b1287efb36d2845264799eb0bfbc071187a43d6eb7209a06b4",
+    "backend/internal/service/setting_service_platform_threshold_test.go": "959034e051941c593c928f0789d4d90e867aabb213f6f09f18f24ac4fbce81c4",
+    "backend/internal/service/setting_service_public_test.go": "6def4b34fd828f454ed065d89fba31697425b6c4b8a8794efd8e755f6c194e33",
+    "backend/internal/service/setting_service_update_test.go": "b764bf97161d535d2b3653f594e25af9d7f09f855f705344437ee5bcbe831db2",
+    "backend/internal/service/setting_service_user_error_persist_test.go": "5d98f328c1e350bab5412aeda8b0e0206bc1b4be483de33257d4874c6a0db92c",
+    "backend/internal/service/setting_service_wechat_config_test.go": "7bd5d8e3f6eb95b97896754641799111f25f1e53d2952400821f47ccf7f9566c",
+    "backend/internal/service/setting_update.go": "9b2f7be157c337e4f2ea53fa1daba273817b6904ec382513031eab84e3ddb5ca",
+    "backend/internal/service/setting_user_error_view_test.go": "b2980200d4a58026d3aa3190581808180e0277040dc5c33b50fbcfa4a644914a",
+    "backend/internal/service/settings_view.go": "88ffaaecd77dbe6602df6422d1c799db45b0bebd73c643a8ff6a1889d1a02c6b",
+    "backend/internal/service/shadow_routing.go": "f57727051fe8f138fe0ef05320f6a109c8316f751c50ca3201b9473200dd7086",
+    "backend/internal/service/shadow_routing_test.go": "9e065537c7ce57be0349dc47fcfe3159c113ce031fc81374f44da8f4a13c05a8",
+    "backend/internal/service/slice_helpers.go": "f217bbb1d4b4222a1a22d2a6c3e49d10edaa79bc0152369526f6327675009fa0",
+    "backend/internal/service/spark_shadow_integration_test.go": "e8237c35bd14d87f7b68b1af84583599a89e737d3f46b33c116717d060ac21fd",
+    "backend/internal/service/spend_guard.go": "f4c5e168a093ba3acb4553beef0f35be4cbd064dce6950f3a5d77b2fbaf93a43",
+    "backend/internal/service/spend_guard_test.go": "b9452ec658aa7148381d5d49af3542c0a7051b8740614ea6f8f570aca6a49e1a",
+    "backend/internal/service/sql_errors.go": "c0439b515eb6fde60e68d3c1569d8f8000d20bd3a6c6f13fda57ba3b804e63d2",
+    "backend/internal/service/sse_scanner_buffer_pool.go": "2f9591a40e7374241d2dce437566a41a146e72c0ac0cf40d544e97e82007388d",
+    "backend/internal/service/sse_scanner_buffer_pool_test.go": "5a57e7d2c80623f0832fbac7594c7e887f968b7ba7297530199849a32ab9cafb",
+    "backend/internal/service/sticky_session_test.go": "351041da8996a8f2110fbb800dbdf17d61609d735d7651caa01e3b969edca2b9",
+    "backend/internal/service/subscription_assign_idempotency_test.go": "d194a879ec8a6d13facc178bb3a1b52af115f72f7783023c88810896cf82cad9",
+    "backend/internal/service/subscription_calculate_progress_test.go": "4e5465fae68c902a38ac3fb92f11a8b9288ef1cf96982ef53e14d42897e419c2",
+    "backend/internal/service/subscription_daily_midnight_reset_test.go": "de05cabee506dea869eaaf375b8134f09aba3830a2c6ceca7b12b90ccbf07c3f",
+    "backend/internal/service/subscription_expiry_service.go": "0641161fbb95fc7092a0e69e09aeaccf0fa34a2cd8b45ef39725e67472220d85",
+    "backend/internal/service/subscription_expiry_service_test.go": "acda4ce4c74b4549ca53c528100b0f7c86047f828b6da040f28604950680c9a7",
+    "backend/internal/service/subscription_maintenance_queue.go": "b66e9ac47204a41d4df68df0f6d792f812378e164dbba0c359fb6ee03a0bd085",
+    "backend/internal/service/subscription_maintenance_queue_test.go": "6365b401f3a3a4457490239c3d15b8ccf0138b95a1b52c3f7ae6c9a727169840",
+    "backend/internal/service/subscription_monthly_window_test.go": "edc4c0a295bf241b3213904f2a5ffa6a11a33167e9dcf2a8e8a023fe0a67909b",
+    "backend/internal/service/subscription_renewal_lock_test.go": "cf16ee4c42eac23698e83dab835c4e426dbe534b5afdbc41eaa68c6faee538c9",
+    "backend/internal/service/subscription_reset_quota_test.go": "74a8125956be67d98d9cad252447f1fec37bd11cc08ead5849ede352716b6504",
+    "backend/internal/service/subscription_revoke_cache_test.go": "6f015532304c93b9876bf5c9db13d2abd3638490809ab4ca0a06c0c518c9e99a",
+    "backend/internal/service/subscription_service.go": "64ac7c40d5d2dd667a8e3cbc13af2ac977288a0d199dd26123c5524679607cc1",
+    "backend/internal/service/support_ticket.go": "728818fbbcee03c8f743d36f5db9c5edd05c5ccaf5e8df3e1c49b5f5b8b2dd3e",
+    "backend/internal/service/support_ticket_test.go": "5f12420794f5d9e534ce57cbe469fd7d057ecb79f57f57c0cfbc2f5d267ae004",
+    "backend/internal/service/system_operation_lock_service.go": "7fe1f8e2423b51d6040d1c6de67f94c74e22efdc9739a9920fdb41b92b3cae59",
+    "backend/internal/service/system_operation_lock_service_test.go": "2da620ce547631edb0ea469373e66bf48dfa385a45d28dd8f50ac75bc6d717c0",
+    "backend/internal/service/temp_unsched.go": "8b22e5d1d11121788a7510e7d2a35e3fcba4a7ba2487dbaad433fd9ab34918d7",
+    "backend/internal/service/temp_unsched_test.go": "bfeea77c739ea689a20bade19c1dd23346f0c905a58d1394e2e30677de579bd7",
+    "backend/internal/service/tencent_captcha_service.go": "021ae5e9c16c5f0ecc5e767d40d8ac64e6342a0a5ccc563b8e93354e34637c0d",
+    "backend/internal/service/tencent_captcha_service_test.go": "cebbc706fea49a47fee81f731a5f34ad28e322caf3545e6c31ae983445f953e0",
+    "backend/internal/service/tencent_captcha_settings_test.go": "27aff73965541288856fbcc2b6ee370f94e8f30808cd76668b148bc398ae4083",
+    "backend/internal/service/testdata/ollama_settings_usage.html": "f4f135e6c8aa2dbb9591146c523ed9f19434a8a635a30b02c63b0b4977df2d21",
+    "backend/internal/service/testdata/security_monitor_system_prompt.txt": "03c2e57fa0e6f370275b489f9ac9548f322a3329da7da73e219d2222ca0b9490",
+    "backend/internal/service/testhelpers_test.go": "2167e35987a1c3773d6ade429ed94b2b4a1e9e3e56524c00ff191feb73659c78",
+    "backend/internal/service/thinking_protocol.go": "48fd6663d55a9a0c49921348013bc8cc039e123175da8f0237c83cf0c111796f",
+    "backend/internal/service/thinking_protocol_filter_integration_test.go": "ff2d6ee427f6a352e9ae717173845f168e6308f39582370804773d9a61c3383d",
+    "backend/internal/service/thinking_protocol_test.go": "0c557c8478f3ffee1fd6ed6d9869af40f06a8fd712b9835cbacd48d353f56b6a",
+    "backend/internal/service/tiered_routing.go": "57df7dd7ff19ef33820fa08bc82922eafda0946a142e49d78348e507fb12acd4",
+    "backend/internal/service/tiered_routing_test.go": "e42a358deeca844451e38df6470b8940ec85e6d69fbe08083f34da285f4a5dd2",
+    "backend/internal/service/timing_wheel_service.go": "3d96aa9bf536c5a152d4201223db22a3a3c98d34cf4bdccbaa454ad406463a04",
+    "backend/internal/service/timing_wheel_service_test.go": "5cd363e7dd09b35832e7f48ed3c68dc5bcac1ec58018db7647db764d31429769",
+    "backend/internal/service/tls_fingerprint_profile_service.go": "a8ed9bf9e9e801612f67dd1f67ce1f07d5b8f593d7322e66473b49a756e7a4af",
+    "backend/internal/service/token_cache_invalidator.go": "ef5e516de4fd230ff92c2c717a7d9af0d67e3ffea7f439386a86ef26068757f2",
+    "backend/internal/service/token_cache_invalidator_test.go": "112b6900a1a2ae220046ff2c622ac3a282568ec103a8c2251893bc4762dbfce7",
+    "backend/internal/service/token_cache_key.go": "00922836adffd7f4a5bd97d14ff6e3bd4884b6da49391728531a7b212bb4ee8c",
+    "backend/internal/service/token_cache_key_test.go": "d64984fe0a3d0d99ce97dc646a0526f1051ba1956cdf142825729bfa9e2bec29",
+    "backend/internal/service/token_refresh_pool_health_test.go": "361b3cde30aa5bbb5213b5db029816b64c1209139defa23570b8d0315608284a",
+    "backend/internal/service/token_refresh_service.go": "030445d6638fc209485282ea3715647f3302bf302cd632a9c4c2d0fdf38d6131",
+    "backend/internal/service/token_refresh_service_candidates_test.go": "fe4985c82443254c16b82f2667f33a86e0cb81af693b3a81cbbb2ee4a3372d05",
+    "backend/internal/service/token_refresh_service_test.go": "08ce82cba71c39e3ce7186829d0b04a3d95a5f10344966f376edbac7e3c682e8",
+    "backend/internal/service/token_refresher.go": "af2f01ff7d77cc14c5a7cf046c21e5ce129c0ab39aa3e14523dc2712437308a3",
+    "backend/internal/service/token_refresher_test.go": "df31560afe70d62cb0fde0e93fd06874b57b02c75db9ee63723f532c7c81780d",
+    "backend/internal/service/totp_service.go": "56c2c2c7dcdc3717e2d31eeacc2a33a111bb3d7bae682542123aed313b87c2e5",
+    "backend/internal/service/totp_verification_method_test.go": "f7580a323238dad7468ca0880f9111e2cfc00b79d4e27d4e4511a10f2941f7b8",
+    "backend/internal/service/turnstile_service.go": "209c31d028b3b3d6205eab83e79ca559a602f98e289e3c209448ddecb185e71e",
+    "backend/internal/service/update_service.go": "acf40afa0062de39d977a7e927f99a67c3188638016f440b04991ae40df42cc2",
+    "backend/internal/service/update_service_test.go": "d91d449557f3b36c39309bbfe9ae7e131fd462e4664027d911bcf161fb145f96",
+    "backend/internal/service/upgrade024_custom_regression_test.go": "1b870784aa889c78e770e331173bc16ceb6daa1983c506d9fd67ee8e750f00e8",
+    "backend/internal/service/upstream_billing_probe.go": "b66c09f06ea2de88b102fd17d148c1d9527a8efeb895f717f6b1a21843621c6a",
+    "backend/internal/service/upstream_billing_probe_multiplatform_test.go": "5a05384345448ac9a9772a53bd66c73ac462a3c27ce902013e46b72400b8ade0",
+    "backend/internal/service/upstream_billing_probe_test.go": "64aa5a42cd5436a92f547c539923a2eff78d831277cfccd01f4c09c891f49db0",
+    "backend/internal/service/upstream_models.go": "0fd71aba361abf0b63a2baf76d826707e6244d36404810002d5f3d6dc6bf92af",
+    "backend/internal/service/upstream_models_test.go": "0d2b584e81c6afe2ffb52a835649a2f914852c848d5db07437019593756430fe",
+    "backend/internal/service/upstream_path_guard.go": "480f9ca67b191d276af3382426d61731b8106e5d01e23adf1ad11bcf0091133b",
+    "backend/internal/service/upstream_path_guard_test.go": "fbc36c0032da74916cab9049811a53427bc52516ca2f52426c6cb949f7464810",
+    "backend/internal/service/upstream_request_id.go": "ab41edf8dcfa2ec5db100f41689789346208ef095bb638fa1dc8764617578053",
+    "backend/internal/service/upstream_request_id_test.go": "067b6c63de53e54dad94552802adb8fe22d26bcb467690a417932e6b9ed58879",
+    "backend/internal/service/upstream_response_limit.go": "d7179b95dc584cc9ab19afa6e9e1e5dac8ebd67c5454b38083d920c93a375e81",
+    "backend/internal/service/upstream_response_limit_test.go": "0ed0dc771c0e57079e3b41b623e596582ae556091d820e20ae9e2657b0054896",
+    "backend/internal/service/upstream_response_model.go": "223dab254ae1c6609220696f92b50d940189c591b741402359da377a1b6e32a2",
+    "backend/internal/service/upstream_response_model_bench_test.go": "3709329a9de8bc3bc708d113288d362718c028bfe9ac9359cab2a5bba7d56101",
+    "backend/internal/service/upstream_response_model_test.go": "533e1f0f72090e6859fd63962bd27908324e9ddc530e97d3ec83e71062e0f9a2",
+    "backend/internal/service/usage_billing.go": "245ffa6e46d494b982a03a3d6e1e9c76aec8cb40d44827cb1128c3efd18a5f1f",
+    "backend/internal/service/usage_billing_quantize_test.go": "cedd2665cd4b9e0a51aa4492ffc9ac32d0c2d74a9beeb4f34f8c0dcf6c2e3112",
+    "backend/internal/service/usage_cleanup.go": "0d328bc6e591b22f2eb693d556c8f0815d3749da5f723bd7cfcc9c04aa3ae95a",
+    "backend/internal/service/usage_cleanup_service.go": "5aa51e58aa9ccc85a0704809c27935269580dd14e3458425a56779bbc10f3601",
+    "backend/internal/service/usage_cleanup_service_test.go": "ae69e0ce0d245f4fa008c5294f4da90c296a53ef9a95f8cfd3dc0fe7e1911389",
+    "backend/internal/service/usage_log.go": "fe5b862861f6e1020dafb9be5dabc5ecbb87c46211c8c6d9b99deccd91e723e5",
+    "backend/internal/service/usage_log_create_result.go": "3cc5d3ade3e45206d420898db6c28280293c9a7c5bd238427149db959166a742",
+    "backend/internal/service/usage_log_cyber_test.go": "26be85d37900442d17ccb349444bf70ce5b57fe55b18f0c4f718971fcaacca82",
+    "backend/internal/service/usage_log_helpers.go": "b1186bd621642e1e6a7d39f4824d683a56b59059eb6f3c3b299e4d5ae6a1f8e4",
+    "backend/internal/service/usage_log_test.go": "4863a9ee6065f16fafeb2e802121e7bc5409b238930595421fb36f1c9211d5a6",
+    "backend/internal/service/usage_record_worker_pool.go": "c6bf93cc2f6bd7f95cdead769851f962494210d72e86a33962ba2237fc7b29a4",
+    "backend/internal/service/usage_record_worker_pool_test.go": "526a2a2c1f9c20ed67da1fd37498ac8955064035fb2515145c6d5fb4442aeb69",
+    "backend/internal/service/usage_service.go": "abbd946325a8ce30ae1414245c1c04c6664382f8f065ba463670928150ab2e13",
+    "backend/internal/service/user.go": "bc447b1f4805d258bf08e49c96b7156d6d675ef80e69e685db2ff424461789ca",
+    "backend/internal/service/user_attribute.go": "ecaf326441b56ff37613bd0c91331f4772a776495ae9228ad24018a0ba0619b7",
+    "backend/internal/service/user_attribute_service.go": "f1c1bd7b81412e870f92e931755cbbc0af7d7dabfe5a9bb128af0e7c0fc9ee4e",
+    "backend/internal/service/user_can_bind_group_test.go": "e8c3cddf49d7d9b0f4c90f791f40eae07aa28f9aa04dab646440156dda948dee",
+    "backend/internal/service/user_group_rate.go": "2730ed5376f65e6c42e1cba3e6aabd933983693eab469d67813fd042b88f9554",
+    "backend/internal/service/user_group_rate_resolver.go": "f2e1f68041861724f49fd5f43fe9cef323d67c460e63bdfecc111013c03f32a6",
+    "backend/internal/service/user_group_rate_resolver_test.go": "b7dc6f0e9ffab477c201d1817ebfc01db9a81338adfa6a52d5f7bb9f5d7bf853",
+    "backend/internal/service/user_msg_queue_service.go": "aa04f3be81c3460325e4d6545dbdd7e6d2cc7d921f5c12e8d8390cafb8f56088",
+    "backend/internal/service/user_msg_queue_service_test.go": "b859f099ccdbef7f36a5263222cbf5650bf30db2ebcc139bfbd63d2b6d5e1e52",
+    "backend/internal/service/user_platform_quota_flusher.go": "7854cac3c27778c39e6489c492a72b56b35da0a15b851c361371af1e4d4a366e",
+    "backend/internal/service/user_platform_quota_flusher_test.go": "7631210a43ffdaa5edc1102ced9732ad67784657d8ae74fda5c692db63b1d981",
+    "backend/internal/service/user_platform_quota_port.go": "356cdae9bf530d232453fd2242cbbfec085b33ec404324e522b35d92a11da166",
+    "backend/internal/service/user_rpm_cache.go": "bd849a044cd94c87375ef993404ab18b3dc8e9c9df3d4bbd99c4342b456cd58e",
+    "backend/internal/service/user_service.go": "2d2a3fca55e47a34c5ca5cdb464996800120e99c965943036f5316006293bfcc",
+    "backend/internal/service/user_service_email_identity_sync_test.go": "8e212f6db6ea130066dcf174d82a1f814f6e60ab214fe3a776e8b3c1c2ed3b1f",
+    "backend/internal/service/user_service_test.go": "7dbb1577ef9ef882c892e22a68da13f725bd80845b69c12505d4de8f8c26d383",
+    "backend/internal/service/user_service_update_fields_test.go": "769a15a518705344d6938bcc8a4eb37b244e660ab8681f170966d90552056603",
+    "backend/internal/service/user_subscription.go": "faba748f7f767ca107f45558185e18dee8b39591e42884cfa1b57cfe60607a31",
+    "backend/internal/service/user_subscription_daily_quota_test.go": "b1ad33aecf028f4afbde235b15051be02d3a58fdf12a0f83dada0b7c246810a1",
+    "backend/internal/service/user_subscription_days_remaining_test.go": "9341a0df63c7c4c5f41d3b28e41cef00fcf195ca7551854b0ebc7f00ec32c814",
+    "backend/internal/service/user_subscription_port.go": "07d9433322dcd04f5c63f2dc3e591915b3d7f353b9f15e368fb2c59db9abb18b",
+    "backend/internal/service/user_subscription_reset_time_test.go": "fd53d2efcbe067e6c0579c98c61d0066860953234f97262ce9d13d5567b889b3",
+    "backend/internal/service/vertex_service_account.go": "b6a2e98a040abe897e43be5c19a6732d50f8d855fd4e84b053dec79cfa38cf19",
+    "backend/internal/service/vertex_service_account_test.go": "d1d02f5d0cf490e08f8495438cd03b1b683a02c3337f573b35f7eabaf6e403cc",
+    "backend/internal/service/video_billing.go": "ba51aa1ec306e248fbe58d6f2819e05a08a1d8982fdd99de22d32b3a29c68853",
+    "backend/internal/service/video_billing_resolution.go": "35301fd3555ab315aebb62307cebe89c36bfa2d3e1c3e638791c608a02888a25",
+    "backend/internal/service/video_billing_test.go": "2e14b70c3e90039884562873969b8c9a4d8f477996f45824e4c1015dd4a89d9c",
+    "backend/internal/service/websearch_config.go": "8f9e7ff993de094859638a6a963dc1c8176add7786abaabbe34093a5d3c4a83f",
+    "backend/internal/service/websearch_config_test.go": "ef9a75ce72db8223ee3d83c72bcbf7cf3792f54ba10ad4d1cefec553b6795d43",
+    "backend/internal/service/wire.go": "e75f9ad43e2fe81a62eaf3c18c1c77e48add4bd1b09d1a3f444fc1eb393c95ae",
+    "backend/internal/service/wire_test.go": "52b99a8bbe544514fbab59f442c78d6d5b0c7ef88a3b57d6b4e0cd17280b91ae",
+    "backend/internal/setup/cli.go": "88e0e6e2609e06943286608582f36e5b32f1a256f112ccc6a11e69a66a8b4da0",
+    "backend/internal/setup/handler.go": "37917cd53d4fd57effebfd109c871a15ba65da78f4c076a353e7ec8db53f41b3",
+    "backend/internal/setup/setup.go": "3605d661be30867e2af681a8f187ab068d3ea550f5e461372c7fb03d712a82f1",
+    "backend/internal/setup/setup_test.go": "d26e675c6ca12eea28b7cf6cca03405216557e953b45a206a4f988160393e525",
+    "backend/internal/testutil/fixtures.go": "964a657a51e59fd3d3cb700e2826d475fef9fb62035de1756b2b0fa247e97231",
+    "backend/internal/testutil/httptest.go": "53dfad6a4fc1779c27f4f81872943ab52d095729756315daa8ff23c11f8e07d7",
+    "backend/internal/testutil/redis.go": "80aafff89d102938e72435ce2a6ff18fab63d36e97d29201a6d824cb7da5edb2",
+    "backend/internal/testutil/stubs.go": "c3fb1ea0818d17df7dd6fcb5d8dc4b273d8aeb6e4f4b9bca3d47b44d58d38095",
+    "backend/internal/util/httputil/httputil.go": "d0343c70ed5cf7e1db479af4d8a6a4be6cfee603350e7789bdcdea526beaa60c",
+    "backend/internal/util/logredact/redact.go": "e27c10fd74ae98ddc805885057767929b3826b78d047ec7881c07ca1d206e295",
+    "backend/internal/util/logredact/redact_test.go": "2e39e8a2df4baecea45454f1a56ab16af8f8e7fb6b737b7550ecf4418273c1d9",
+    "backend/internal/util/responseheaders/responseheaders.go": "f1b3bb3a9cc9bf5e808aa60dc986c19d3ee60e281160d078d300257c19014f37",
+    "backend/internal/util/responseheaders/responseheaders_test.go": "ae57770147a26c1990beeb57c82e2f59bff3a7f1a35ca63ad054154f580d92a0",
+    "backend/internal/util/urlvalidator/validator.go": "78ced6c8047a162e71698317b101e35cedb330c967dab3c7b4646a192d664fa3",
+    "backend/internal/util/urlvalidator/validator_test.go": "9efd35b30f80f1497e4a6b250b14506980b60b253733cf959d8fc012d778e2ca",
+    "backend/internal/web/embed_off.go": "403d189cfa4901399261e3b573d84468be61714fa042d16c00736a97a18de3aa",
+    "backend/internal/web/embed_on.go": "b241e67f13ca58445ec683a13176460cc58ac4c8a5a8f18e48b6137b65e63a8a",
+    "backend/internal/web/embed_test.go": "97a89091eeac1ad4bbab75235974ed05b6b8e34285faf2f36205778e3ff7d6ea",
+    "backend/internal/web/html_cache.go": "2d5ae61ec96e50c80b1f76d90da7a9ace6b917fa1a22aa226599273d2fdbee65",
+    "backend/internal/web/static_cache.go": "4aec8eeaef29e826e481fb326dfe3bb882b24bb2f7a9821175040177958415eb",
+    "backend/internal/web/static_cache_test.go": "4335bfa3649bd33bcda783e359981965269a7ddca659ebbbf7666d80c4e3b27a",
+    "backend/migrations/001_init.sql": "488ede96ff8cc8a0566b312eb3be2f7a383d11a243390ccb4c3bbdaa1793d51f",
+    "backend/migrations/002_account_type_migration.sql": "351918909b6bcf9e0d8402cd5b840cf8e127f5f4aaa7c486ed12c98fff2d37ad",
+    "backend/migrations/003_subscription.sql": "f6f317f073a808c1f841525b47e84e2cde87fa889137a37f275ccf1defa53170",
+    "backend/migrations/004_add_redeem_code_notes.sql": "06e0488117658a3a3f7d9736ac0a1da6d70d261e70d0eb6b026e6281960fea36",
+    "backend/migrations/005_schema_parity.sql": "1eb39443f407f1c09e132dda0022e5b911b7af9b4ddcdffa6accaec2d3bd49a2",
+    "backend/migrations/006_add_users_allowed_groups_compat.sql": "663fec7eeca4337103b2a16fd74f5b65bbe246567bd2e74ae4407eccc3b9fc39",
+    "backend/migrations/006_fix_invalid_subscription_expires_at.sql": "e21a5c3e12a31d3e734f85ed514970a0be21ebb8e56ae5088edf0946f1b48c4b",
+    "backend/migrations/006b_guard_users_allowed_groups.sql": "0b5da3128a2a0c0d35fe42af8c065b87474e259e9cb22dbc6c407717694785fa",
+    "backend/migrations/007_add_user_allowed_groups.sql": "2500e605b312bc7b7bbe5d3467d1f384d3db70861c494e03f4fa96711e3351a8",
+    "backend/migrations/008_seed_default_group.sql": "144b0751fcd9babbc8146387f666732ec5075683c556f9c4784f65f533fe21b2",
+    "backend/migrations/009_fix_usage_logs_cache_columns.sql": "44b93859b040c74c53d642761b60fac89071466c9c0bb77cef4c004107521cfe",
+    "backend/migrations/010_add_usage_logs_aggregated_indexes.sql": "e23a13d65ab724b8c0a6c6d84b7354040c12cde8613a73511ec50edc0406d5c2",
+    "backend/migrations/011_remove_duplicate_unique_indexes.sql": "a05f05153204add8c2e1e2eed8e0df9009eb245e3623d6987bdc97249b6871bb",
+    "backend/migrations/012_add_user_subscription_soft_delete.sql": "b6080ebf4197f5fd99c4ce6eb3c38ee5b4615564538f1f51297435570d5094d3",
+    "backend/migrations/013_log_orphan_allowed_groups.sql": "9fc92b80ad1722da0e6dffd7c1c76007ca1029a9870fc0652dc6d7b72b2a6b4e",
+    "backend/migrations/014_drop_legacy_allowed_groups.sql": "9f4e9ad6e91d501e974a1ed1f923cda0b21c7f37651be37f95e88e95ecf0d175",
+    "backend/migrations/015_fix_settings_unique_constraint.sql": "e9edb444c7044f9a6bb43e8f328e61d3f73f9bf7394d82bd3b0836b5f5c49184",
+    "backend/migrations/016_soft_delete_partial_unique_indexes.sql": "04087d58014de7ad7d04352fd9267008a03b409427aed57da74181e70d407832",
+    "backend/migrations/018_user_attributes.sql": "d033bc97e9d4b129d3dd21a5b42194d9bbcf36a4f548c3241a5d168a4f044300",
+    "backend/migrations/019_migrate_wechat_to_attributes.sql": "c86186dc986b6e95e0dcd7674c98526b3966e97550a12a3c1af5ba988a357c6c",
+    "backend/migrations/020_add_temp_unschedulable.sql": "ef6091c648892c53c87fb279eab96996ad7e4bad771f1309249e0f65629f3019",
+    "backend/migrations/024_add_gemini_tier_id.sql": "bcf6e0023649eb6d693a78744eb9b8016704f713488c23f27d4caeb3e6a6d4d0",
+    "backend/migrations/026_ops_metrics_aggregation_tables.sql": "d5af7c763da6360a29b6fd7e70222ace76cb20f9493aed25fd219891d13e91f6",
+    "backend/migrations/027_usage_billing_consistency.sql": "5f49f4b6bf5ecf2e4439ba56d4b34d6f8bdfa53648854b2298c49ef4e9bbc893",
+    "backend/migrations/028_add_account_notes.sql": "41664eeda57228838261f214fbadf02db3634f534a87317f6a04ba7bea6c279b",
+    "backend/migrations/028_add_usage_logs_user_agent.sql": "ce224fc77aa93424e8f1f9d02a5a0a3f074d5b6feba8b547d43d425fed9a11c0",
+    "backend/migrations/028_group_image_pricing.sql": "35a4c0c384cd41f10426f69e69b34263351b970b657f16a024e649edaaa1db4d",
+    "backend/migrations/029_add_group_claude_code_restriction.sql": "96c87f770c5b7871769a10b805c6de96d261391ba8e22a05d6a4a5ee7349d29b",
+    "backend/migrations/029_usage_log_image_fields.sql": "b86a2e0e09d61551d92c9d50c15e363dffdf4f61e32f4ba948a2960551cb05de",
+    "backend/migrations/030_add_account_expires_at.sql": "d1f3d4cf904788609041c6fff902c63cb65dc77073647c1b709ba642107042aa",
+    "backend/migrations/031_add_ip_address.sql": "c8bce7208540815f9b412360067bfea8097b4f5122a016dcb74b3c3ba376ab05",
+    "backend/migrations/032_add_api_key_ip_restriction.sql": "c1b1646a92ba585adccdac8aea0e1a494d607bc1ac7c9a0486a3c8a02c40a599",
+    "backend/migrations/033_add_promo_codes.sql": "e0a4e8f3ccb0fd2aabb64cf96c81b6aaa4721a3cbd6b3f6e1848f751fe29bacf",
+    "backend/migrations/033_ops_monitoring_vnext.sql": "d268069183ad83d28de52ff05c357fa04ad473252d0d63f49f7e4486d57c70fb",
+    "backend/migrations/034_ops_upstream_error_events.sql": "31d4146206909e8af7363e6464403eaf1e2a61bdf66d1315dda06ff51ac1f5da",
+    "backend/migrations/034_usage_dashboard_aggregation_tables.sql": "4f5bf8963743b53da0f95801d3ba88a559752f6f6ee643053e0f88af6c2132fd",
+    "backend/migrations/035_usage_logs_partitioning.sql": "e309adff12f914e643197e5cf0280a230ab18d220c2149661a0b589abf82b729",
+    "backend/migrations/036_ops_error_logs_add_is_count_tokens.sql": "75864a7d7aec575a52e9de32a1f408852e66ce854a5eee3ceb68fd7fec170b12",
+    "backend/migrations/036_scheduler_outbox.sql": "91c6abadb5eeabf89712273b2f67b87ce439391e4844c16ba5c774633912cb0e",
+    "backend/migrations/037_add_account_rate_multiplier.sql": "99d4e6f8ee929bf6f66b72737203f772d0db6014046dca1d8e066496de213349",
+    "backend/migrations/037_ops_alert_silences.sql": "738e58937dd9609ac6075617ca244803dbfc86771378cc5723d5c1f3295b1594",
+    "backend/migrations/038_ops_errors_resolution_retry_results_and_standardize_classification.sql": "275839aa5a920b96194b58d64e04be0f21346087830b1c5b9e6dca6c86fca7ab",
+    "backend/migrations/039_ops_job_heartbeats_add_last_result.sql": "5c8e46f7d172d7e90fd43e2ea9de221631b0c4f7ccc02cd6b1310f9c0b116fb1",
+    "backend/migrations/040_add_group_model_routing.sql": "0364f5c2183416f2c68ed3c4a86280b00f36339737ad73c7b91de6e629f72e94",
+    "backend/migrations/041_add_model_routing_enabled.sql": "6548a277232c3a2d719aaa78ecb62a8598a00ea45c1c389d205150450b4c7ac9",
+    "backend/migrations/042_add_usage_cleanup_tasks.sql": "48aef6e99bb28605ec7b3404ed72e7a2edb9d09e34435f8e4c4634df718e231a",
+    "backend/migrations/042b_add_ops_system_metrics_switch_count.sql": "d04d174f348f00da238da0de653fee4b41c2c0b4cc4d33789b37746a23275710",
+    "backend/migrations/043_add_usage_cleanup_cancel_audit.sql": "2f7482d61c05708d2bc5e7b4617b16b32b162718b9a3fe532c75e40743edee91",
+    "backend/migrations/043b_add_group_invalid_request_fallback.sql": "9f196fa7c92f03ae9c98e8e2f20791bf7c955b118df9c3175fcdb960d1b0951b",
+    "backend/migrations/044_add_user_totp.sql": "50abefb1bb24c74745dcf40fc3bc00986c8ff0c73e3b06f33c552185c8542f59",
+    "backend/migrations/044b_add_group_mcp_xml_inject.sql": "8969af294cc9fc76d4e8295d81b4d580a2bae76cb0f29ffc6d52cb37960f45ee",
+    "backend/migrations/045_add_accounts_extra_index.sql": "2399e1c35835f38832ba911c858936b69fedd3489077a30605e6178b8e7d5366",
+    "backend/migrations/045_add_announcements.sql": "4c39cfb07f7abfb814e914d4b0f81aff1871bbe9ca2b4ecf5f4f5e0fa4f1dceb",
+    "backend/migrations/045_add_api_key_quota.sql": "4716568dedd30a541cf5a82e5a3c8cf29c6fee4a185c95c90567dfefb30c93bd",
+    "backend/migrations/046_add_sora_accounts.sql": "87e5781996b02054688cbb8f5b26610cca433d4e01dba393b63eb624b4804f37",
+    "backend/migrations/046_add_usage_log_reasoning_effort.sql": "89f1cef26afbf48b87c2518caf2ccd6b3f9f35386b7e24494dc88e0b95f9248c",
+    "backend/migrations/046b_add_group_supported_model_scopes.sql": "9450f18b9cec1be83251278abb6fd4049fc6038bef98b081de2afef62ee179da",
+    "backend/migrations/047_add_sora_pricing_and_media_type.sql": "0039b5824ed248c24b9bf6a55e94decaa9423178cc9c068774f851542086c292",
+    "backend/migrations/047_add_user_group_rate_multipliers.sql": "126a0c1ed450ab6158d753f98efc75f9ba60f827a613cbd293d64ca866b4ae89",
+    "backend/migrations/048_add_error_passthrough_rules.sql": "169f3da9ae1c2cd2d2d4f04e5e253a5efd1bb650fc4cff72ddbb56968c8e427f",
+    "backend/migrations/049_unify_antigravity_model_mapping.sql": "1af43409db7e5dba020b741b0cdb89298a0336a4c189a47a39e25385b9e11df7",
+    "backend/migrations/050_map_opus46_to_opus45.sql": "0593d9ab692586b8b4fb5af1d724d4ca12aaf8822689a00f4d6ae4409ca14775",
+    "backend/migrations/051_migrate_opus45_to_opus46_thinking.sql": "a9f5b5ffeb4d323c8a08781c82e563fc47bb2f3735fa9de7a622e134357771c8",
+    "backend/migrations/052_add_group_sort_order.sql": "e3930b0981a6cfbf9a9893dfbfca73cf1386ec7bd6a2cfd80b09eb1af01220e2",
+    "backend/migrations/052_migrate_upstream_to_apikey.sql": "5e838f5eb02a494d88469b59d10acb0e1b44c2c50e0d97f3bead27206ff1ef9b",
+    "backend/migrations/053_add_security_secrets.sql": "52bbd85fe71db38c9b2a8344165a79bdc44f5fabcf1c191339f718c6555f0ab4",
+    "backend/migrations/053_add_skip_monitoring_to_error_passthrough.sql": "5f2007d9cd070a33e5703c8e3ca5ca4589e22fe1efd5d06f8c27dde0e507a29d",
+    "backend/migrations/054_drop_legacy_cache_columns.sql": "7aacdd57d1243b48c32ddb1d6d2f24ee262b048509b0104f42dbdba507408481",
+    "backend/migrations/054_ops_system_logs.sql": "0081ac76aa1072ad3c2bf836024e7d82bd7e0c0c8c22013a853fe4513ebccb5a",
+    "backend/migrations/055_add_cache_ttl_overridden.sql": "0466f95e23d41e6d5a4c3f8e0995057d9f415f616d0e019231ff19b2f5aabbdf",
+    "backend/migrations/056_add_api_key_last_used_at.sql": "e7a12c8e58980f7701ad8c5b89a12577fdb3c5a57f68dcac89e896ee950ba3da",
+    "backend/migrations/057_add_idempotency_records.sql": "b6dc79f28976828e94e806df1b0c7bf05decbdae67c377a77179c3a6262f0926",
+    "backend/migrations/058_add_sonnet46_to_model_mapping.sql": "dd34768a6d7f5043f5a29ee235a7d7774a3a812af34c8bcc803164bbc21530f5",
+    "backend/migrations/059_add_gemini31_pro_to_model_mapping.sql": "7adb2e4c98f09c563aaed527762cbd47152e9099973570291c16feff76d6a189",
+    "backend/migrations/060_add_gemini31_flash_image_to_model_mapping.sql": "e3b801643e696eec44c6d69b95bac268ef16f1e2bd4aa7953b2b7ba19c3c7358",
+    "backend/migrations/060_add_usage_log_openai_ws_mode.sql": "0d4b799feaba1bf65e8773ccc733b3a742f70af2172f2ee760e12636b51a3383",
+    "backend/migrations/061_add_usage_log_request_type.sql": "97bdd9a32d921986f74a0231ab90735567a9234fb7062f4d9d1baf108ba59769",
+    "backend/migrations/062_add_scheduler_and_usage_composite_indexes_notx.sql": "7fbcd72d77417793c42403bbc90a88c439e2e3685e247853e717962fa23db954",
+    "backend/migrations/063_add_sora_client_tables.sql": "ed8ae697b9b21672506f9c752f9671bc7c6e4d1d62e85aee510c48a8192cae7f",
+    "backend/migrations/064_add_api_key_rate_limits.sql": "157995dec8113b922e7fd33410df3717f5e9a0647453762be089a9a2e6e7fcf6",
+    "backend/migrations/065_add_search_trgm_indexes.sql": "6850a870e5d3db4d96515e366b68a19df72d98d2d6c2587c34b6ce2a56a3c601",
+    "backend/migrations/066_add_scheduled_test_tables.sql": "d69c28566d717ccc72bd6aa3de2424e103b9666d6662cdc2dd5d998c25944c7e",
+    "backend/migrations/067_add_account_load_factor.sql": "c622769a7f619dfae7b5c602a41b28ff1f334f410092d378aa45a7ab376b1f7e",
+    "backend/migrations/068_add_announcement_notify_mode.sql": "4eb2302b3f83814608c5e7cbd52c38754e778ea7d3aea836938219350a16bd7b",
+    "backend/migrations/069_add_group_messages_dispatch.sql": "09c7cf14a7f53ebfa64e71b96347a0405cb681dfba040c42eec2067504d10e5f",
+    "backend/migrations/070_add_scheduled_test_auto_recover.sql": "444941c9e53ea1b1383580238042e454a1c7dae25e348a3d4db0348fa12c0474",
+    "backend/migrations/070_add_usage_log_service_tier.sql": "f6e7a3043fdbfd518bd82dccba242ec053b6174d7076540b0a05ccbc410c3189",
+    "backend/migrations/071_add_gemini25_flash_image_to_model_mapping.sql": "9f86c0caf0986933358e83f9ec5ef08784251d7aa92b118fbadca6d549e78afe",
+    "backend/migrations/071_add_usage_billing_dedup.sql": "b8e4669b3169b37b90c537ba8ada1817c9ee43e2f001ff6ba9c6ba380a15e80b",
+    "backend/migrations/072_add_usage_billing_dedup_created_at_brin_notx.sql": "0c85b50aea68b1a23bc4172fd0ec7cd160b12a0c03d01739f0cd7012b3248f57",
+    "backend/migrations/073_add_usage_billing_dedup_archive.sql": "7b0e097e08f419f72365f250302b8570e5dc8d54f3d756d534f325698e82a521",
+    "backend/migrations/074_add_usage_log_endpoints.sql": "3bb3413758de9b59a999d589f7cc3210fa9daa80910c047c07e3391fd1fb6844",
+    "backend/migrations/075_add_usage_log_upstream_model.sql": "0eb0c29f374f4b38c898c527a9df62c6883b6aff2d8ba4187286ee0bc8921ba8",
+    "backend/migrations/075_map_haiku45_to_sonnet46.sql": "3f9d4f6f01399057c2505b77b16219f915de6efeb810eaf2358f34270bbaaa3e",
+    "backend/migrations/076_add_usage_log_upstream_model_index_notx.sql": "95250c93c93113506505956ab7aef502900fec25f986ce127158942c020cb5ba",
+    "backend/migrations/077_add_usage_log_requested_model.sql": "57e1463bf2579976ce9dc6e9b0abda06cf17b8a444cfbf2b0804af0bfd19d074",
+    "backend/migrations/078_add_usage_log_requested_model_index_notx.sql": "98ecaff14e5b5ace402b27469d33d4e9183d1d2c202f949b64f5e793fc15460c",
+    "backend/migrations/079_ops_error_logs_add_endpoint_fields.sql": "7be3f9d615eaf7eaa171e970ae382a33f2785d36e7531aece41d647f4a8ad090",
+    "backend/migrations/080_create_tls_fingerprint_profiles.sql": "b33391a102e71549c67db87addda3d253c74f7e2620ec5be9cae53865a90d8d6",
+    "backend/migrations/081_add_group_account_filter.sql": "34e35e0a37d99a78a2eebb214de0b1c7914717c92a82f4ea1d553341fb054c66",
+    "backend/migrations/081_create_channels.sql": "4eb880b780b2a1df07ec8dff5a9cd1ecf5cd0d35119051018f3ed3b4ae594285",
+    "backend/migrations/082_refactor_channel_pricing.sql": "fffe03fdbe1c5341976d2eedcaaea988dde974539d374045c7dcadf6b554b6ca",
+    "backend/migrations/083_channel_model_mapping.sql": "7d9caceeef2829e141279bf7be168a21ae80166316488902449b41fbf18d1173",
+    "backend/migrations/084_channel_billing_model_source.sql": "e2cc9692d0d58563deec5a57d42546e461d6c41d2e733697cee00bc920933b28",
+    "backend/migrations/085_channel_restrict_and_per_request_price.sql": "d2fa05f3d6f0d1f0108bd0a3c55e162841e0d115f433a16c0df29b8352dd6646",
+    "backend/migrations/086_channel_platform_pricing.sql": "86ccfa03178144a658276c11ab0cd1bf8c6f435cf4ec6058bec727658b92e027",
+    "backend/migrations/087_usage_log_billing_mode.sql": "392d0341e5f1481f8d6269dc20625e5e1fb452ff1caa57b9f5a35b221deeeea6",
+    "backend/migrations/088_channel_billing_model_source_channel_mapped.sql": "f384ea6228cd862c80312c05a584c84617a3d68e223f71ee0d07d8bc6362e480",
+    "backend/migrations/089_usage_log_image_output_tokens.sql": "36d70ff87a62a08137b4ef98f2ba10013982dd4f358b2d5cacb2eb8768c01c16",
+    "backend/migrations/090_drop_sora.sql": "26b48c93b0ada0861f23b6fee715012f4094b57d879eecdf31bbfbef5762ebc0",
+    "backend/migrations/091_add_group_messages_dispatch_model_config.sql": "d3e0c575fee449bf5427c50d37b16053d2503d7900886aada35c0a5d18a266d0",
+    "backend/migrations/092_payment_orders.sql": "f4fa67bd0b246eb04b70ec23d2bcf5d1fc16f546c030a0df66fc2a6f3276f317",
+    "backend/migrations/093_payment_audit_logs.sql": "fefa3b74154e5a26784e30ec4a738474fc217edd0e48a97e03914146b40f7f8a",
+    "backend/migrations/094_removed_payment_channels.sql": "513c2ca43b4f050fa87b67b333feb9ee0ed5d736467e0f46b3fc34886ff7e1a9",
+    "backend/migrations/095_channel_features.sql": "3f13e9f362f5c1f88a07f7db6374cd3f66a47798b865a50ba39160f4445edf81",
+    "backend/migrations/095_subscription_plans.sql": "04121da82dd1f943c9414ec97921dc1b7217da7717bd0582c4647f77ae4cc34e",
+    "backend/migrations/096_payment_provider_instances.sql": "680c46cd2b1917e985823bc433b7c053910b164f41ee764aceef433fe2830191",
+    "backend/migrations/097_fix_settings_updated_at_default.sql": "3a86f3415b4806f9cb4e365074f4b6e042934f8e1630ce72f7a720dc7259a02b",
+    "backend/migrations/098_migrate_purchase_subscription_to_custom_menu.sql": "192dde1129d0205619e6997f416b5a7141917107677d44ef8601efefa4372f11",
+    "backend/migrations/099_fix_migrated_purchase_menu_label_icon.sql": "c8815fd51f8092d278b5164103124778ed9f4869e4bb12e886b6035b791d9571",
+    "backend/migrations/100_remove_easypay_from_enabled_payment_types.sql": "ccbc6f34dddd025e0eba3e17dd72d37a52bac6ba8b550fff0b59a229e4290bee",
+    "backend/migrations/101_add_account_stats_pricing.sql": "db59989be71ecd0a06901cfd0e9bdf067fd51e4eaa1aaa96b052309c3c063dcc",
+    "backend/migrations/101_add_balance_notify_fields.sql": "051f53cd30537477ad0e3b273d3650a38e21829fcf6ec7877395ea053d0216a9",
+    "backend/migrations/101_add_channel_features_config.sql": "dcf760366a073f33e0b6077fa8e5a5d262a9ec1d9eb37e8f1b99a666bd35ba50",
+    "backend/migrations/101_add_payment_mode.sql": "acc645d43ca517904364e627244128a4124e50dd17b1ec092ab29c0b9e57333f",
+    "backend/migrations/102_add_balance_notify_threshold_type.sql": "7d50e8df46ddd7a972ea9bb9de03c19d866a59ae9afc1259faa95e5f311afd9d",
+    "backend/migrations/102_add_out_trade_no_to_payment_orders.sql": "6624aa0b8ad4cb23c89007d969482e6e94fc327390b6889018e01b0d6d2880e3",
+    "backend/migrations/103_add_allow_user_refund.sql": "219ddeff9b85b5d1e4bf30e9d2c6cc85140ba6a540768bf5612fc2f6e92fb618",
+    "backend/migrations/104_migrate_notify_emails_to_struct.sql": "104308686106cb2a8962d51fb9828cec8c7884fb34400a81e36ce8ba42021115",
+    "backend/migrations/105_migrate_websearch_emulation_to_tristate.sql": "901bb147a3c14547fab73685586f5c28411d458c2f27574e6584ad01e5466841",
+    "backend/migrations/106_add_account_stats_pricing_intervals.sql": "0b91b77e4c362c6b9c6144d0ba9f9cd7426849c6a01bb7adb9a951821bce0e7c",
+    "backend/migrations/107_add_account_cost_to_dashboard_tables.sql": "aaffe3bc1522e854db2ff53907ac393eb6d55edb58b343459d2fecabdfd68ee8",
+    "backend/migrations/108_auth_identity_foundation_core.sql": "01f6f33b593927f43bec6ebe6cbab866a372dd7b1fe5873cd4619dcfb4baa3af",
+    "backend/migrations/108a_widen_auth_identity_migration_report_type.sql": "115bf4e883b1e087eda1bdd6f7ee5a036f844b91b34c9098b6be1684713fe034",
+    "backend/migrations/109_auth_identity_compat_backfill.sql": "0580b4602d85435edf9aca1633db580bb3932f26517f75134106f80275ec2ace",
+    "backend/migrations/110_pending_auth_and_provider_default_grants.sql": "32cf87ee787b1bb36b5c691367c96eee37518fa3eed6f3322cf68795e3745279",
+    "backend/migrations/111_payment_routing_and_scheduler_flags.sql": "7e99ba24a6b4b23e3600d865fc38a8f21e5a7ee9c8ee5bea8e34770a38ceb461",
+    "backend/migrations/112_add_payment_order_provider_key_snapshot.sql": "b75f8f56d39455682787696a3d92ad25b055444ca328fb7fca9a460a15d68d99",
+    "backend/migrations/113_normalize_legacy_wechat_provider_key.sql": "9025c2b21e211375018d65c1a03b43ef4e97715fe4afab0ba4929d576efc4092",
+    "backend/migrations/114_auth_identity_migration_report_resolution.sql": "a7408eaad314dd86d2503192cb5e80c6f473545922786f8f75ceca5db88f72ef",
+    "backend/migrations/115_auth_identity_legacy_external_backfill.sql": "08fdc18762d354ea2af7604af825a11db14d1335f3e88796f2bce53a2877c344",
+    "backend/migrations/116_auth_identity_legacy_external_safety_reports.sql": "e9aeb79354a0da72b6567d1cdeddce9410c6bf39bcfe4b7a416220e3f0be7190",
+    "backend/migrations/117_add_payment_order_provider_snapshot.sql": "69320a2f03662ea02b4a0f09ef293b1ee600dd55d474f20a1b0d6fe03f4482cc",
+    "backend/migrations/118_wechat_dual_mode_and_auth_source_defaults.sql": "b54194d7a3e4fbf710e0a3590d22a2fe7966804c487052a356e0b55f53ef96b0",
+    "backend/migrations/119_enforce_payment_orders_out_trade_no_unique.sql": "66ba0ae221454ca8742770428ede26695cc5b065d0119cc9fe33fd2a26a4d38f",
+    "backend/migrations/120_enforce_payment_orders_out_trade_no_unique_notx.sql": "39f9323ace96b835c74e8de83ba15b977d4c65609c22eecc4e9afbf382f7667d",
+    "backend/migrations/120a_align_payment_orders_out_trade_no_index_name.sql": "846d179e41eb1218698e2aa312bb280e7ed41c949dd0669ff45fc7e838a643bc",
+    "backend/migrations/121_auth_identity_migration_report_type_widen.sql": "71431da8596e6a1a1e7ecae6ff2a0ce890bff870b4dc138eb5488c0624c33849",
+    "backend/migrations/122_pending_auth_completion_token_cleanup.sql": "f36fd5f5ed86c77878d1f21c9e204b427e12db0ad5d19329d7c99cb1d1bfea00",
+    "backend/migrations/123_fix_legacy_auth_source_grant_on_signup_defaults.sql": "dea22b2899ae6530daf44419e7f44e40ccdcdc96d2bea7584af0c6c4c0ee461b",
+    "backend/migrations/124_backfill_legacy_oidc_security_flags.sql": "736b71647e56952153db5e0038a866ec57a6709b16b7a4772da587072cf7a384",
+    "backend/migrations/125_add_channel_monitors.sql": "0f91517a747bf9b604a2e1c98e7f602d70cd14d43233cb16bebc379384336302",
+    "backend/migrations/125_add_group_rpm_limit.sql": "9141ae5d5a6375ecab32060333cc577f85a2d6cdf3e0230079efcefdebb24909",
+    "backend/migrations/126_add_channel_monitor_aggregation.sql": "4e6b3e94aaed169dd7a6a4e69aa61794779e943d617b78540210bba93063abfc",
+    "backend/migrations/126_add_user_rpm_limit.sql": "1d010fbeb5bb280527b8591f9160456ca3db4e78329df4617b2852b1ddfaf920",
+    "backend/migrations/127_add_user_group_rpm_override.sql": "1570190ecae9f8f63b8bf8701719388147cf554a772494852dbd17de04cff15d",
+    "backend/migrations/127_drop_channel_monitor_deleted_at.sql": "2f5c2f951c2b59ed706841135de6458093a52eff970d852aec5dd60d99f868d4",
+    "backend/migrations/128_add_channel_monitor_request_templates.sql": "a35f2e016afe5fe4019a2aad70184eb20104c8c248a60e5ba763ebd888280ca1",
+    "backend/migrations/129_seed_claude_code_template.sql": "ed681936dff4062297bd6d070696bb1d96bc1382bad7ea9104264825261d0e99",
+    "backend/migrations/130_add_user_affiliates.sql": "fc3fc86b18b3750d422856d447183864da6bd04c2b4ad321a87d68f3130c2bdc",
+    "backend/migrations/131_affiliate_rebate_hardening.sql": "8b70f0d1d0bb754b350a3476d0a06856832a6fb3bb58a23fd387b0d9bdf3a771",
+    "backend/migrations/132_affiliate_custom_settings.sql": "382f95ceb96e80cf871436a7589e692611f2ca5d183ceacd65cf8d2760c8e632",
+    "backend/migrations/133_affiliate_rebate_freeze.sql": "caafa4c05c2ab4cd0d96579e906d68417df85708cedd1daddd5ea3e2e3a1a062",
+    "backend/migrations/134_affiliate_ledger_audit_snapshots.sql": "2acd92fa0ee526ad0fbfadb62388c0ba28b7ad3d9185d7428e69856182d9d48b",
+    "backend/migrations/134_image_generation_group_controls.sql": "27edeb5f8a3c8ee34755ab1e23471a9fdbf45e7368ed5a55e32408fe11b6fa32",
+    "backend/migrations/135_allow_email_oauth_provider_types.sql": "e6dc442bb1f70caed3d4bc72540ffd28688fa3359a64d52634103357dcbc80dd",
+    "backend/migrations/135_content_moderation.sql": "950c1c87c98744472b7fa396cdad3b094713d895974697e487e78e04946954c2",
+    "backend/migrations/136_add_dingtalk_provider_type.sql": "6ccbb5cc60af94253962cec9131fcdcbb0cec2a69b623e472cb0cbc8fb6f83cf",
+    "backend/migrations/136_remove_ops_retry_replay.sql": "af67bd65ab5674364ba47c65450f0d30495e8cf2da860732439c738a5f25b565",
+    "backend/migrations/136_usage_log_image_size_metadata.sql": "1c2fd1bcdd5d635afc105fc8a16b1a07b63b69717b2f4c4a2d296a22b26f93ce",
+    "backend/migrations/137_redeem_code_expires_at.sql": "9af2fdfab26384eac64cee2b39fb61e153be9188ac416ab564e2c280f9a78089",
+    "backend/migrations/138_channel_monitor_openai_api_mode.sql": "7cada21d91bb857839a2a0679d875fdb538dae50cf91ff5c88d46b198cb470c5",
+    "backend/migrations/139_seed_openai_monitor_templates.sql": "64c8ec298f09f229ba10593f920e6adab1f83e4053ebe269582995d4f4e702d5",
+    "backend/migrations/140_extend_user_provider_default_grants_check.sql": "f062a7c7e22246453073dfadcefd4dfd2fd7b5bde8f050e1b37370f35f9a3712",
+    "backend/migrations/141_subscription_expiry_notify_enabled.sql": "24ee4baf3a41835ee46292ff0d1166114d672ae1f397f92a30dc95b8cb932ae3",
+    "backend/migrations/142_user_platform_quotas.sql": "d57e2c2cf1cd7a3ec2f608269600c04f4b8fbe959684df76454b5a6c3ac2e9df",
+    "backend/migrations/143_group_models_list_config.sql": "fbce2d531db1b1389e643d1fae08b767443c8f5cf700da61b86bbabd213805f6",
+    "backend/migrations/144_add_opus48_to_model_mapping.sql": "653097932317117663361875d17dc33a08833430c42fd786e1de5ce827c8c06a",
+    "backend/migrations/145_deleted_api_key_audit.sql": "00815d0c2d67405876585497546216f08f536442004c7b098656904e615402e6",
+    "backend/migrations/145_ops_metrics_ttft_sample_count.sql": "8009ae5e119076f35e8a2dedb59d7e833d35d40975c4958e4876bcd0f15c6e9d",
+    "backend/migrations/147_ops_error_log_api_key_prefix.sql": "71f9a5bb36bffb59295c106d205f91a4b47bad20ec67f04dbf5ad01afe21ce95",
+    "backend/migrations/148_add_ops_error_logs_user_time_index_notx.sql": "a2563e60fea929399771cdcfdb0776b50112edfc5c0e8b8a3fcd414a4bdd3e89",
+    "backend/migrations/149_proxy_expiry_fallback.sql": "1fff0f0a7ca2a97babceb7b7e373a4adf3b8e0f851cd355ba319cf2bf308ef23",
+    "backend/migrations/150_account_group_scheduler_indexes_notx.sql": "dc1ec51d954054393ed7fb16481aae9627566b727668cb87392fce89fe70de7d",
+    "backend/migrations/151_account_autopause_expiry_index_notx.sql": "37765bc0793396483d5e5e730b1dedf4331c7c999d608fceb0bade5c03f3acac",
+    "backend/migrations/151_channel_monitor_jitter.sql": "46452b6bc8f2e168216235658aefe99896fc10ff1e55ff454be8cc6ee7458dab",
+    "backend/migrations/152_scheduler_outbox_dedup_key.sql": "7a64fd2907f880615eaaf0270ce4634c8c199d2b98985f6b7d9b70550ec21724",
+    "backend/migrations/153_scheduler_outbox_pending_dedup_key_index_notx.sql": "a1a524b1a1ab1cdc12a7f8400b9dba8cc983e07a2b6cccec27b5d1a272133796",
+    "backend/migrations/154_account_spark_shadow.sql": "f5637a3159d47e8a4130227652df0c774ea8025adc46d97b53ef8403033756a2",
+    "backend/migrations/154_add_ops_system_logs_api_key_id.sql": "372d4fcc3576d84067084f95ee9f1f4c5332e403f25aabc555387f4cd1e883ab",
+    "backend/migrations/154a_account_spark_shadow_indexes_notx.sql": "10e631905e0834b938f72f8d1c9ab7f86e068c1d3c1028060208a88a262fbef3",
+    "backend/migrations/155_add_ops_system_logs_api_key_id_index_notx.sql": "97f139bc8abcd5dd000d240efd3ffd58cd1c24e9ce3eff5434bc5668fe36afd4",
+    "backend/migrations/156_content_moderation_matched_keyword.sql": "cd9cd9cc0a6fbaa2a9cd7031323035f604033f80cf85df931111968ea19f0d0f",
+    "backend/migrations/157_user_platform_quotas_add_grok.sql": "aa815ce512fc18d198813962348d8202addd006398a9e17e8978d95707d04903",
+    "backend/migrations/158_add_group_peak_rate_multiplier.sql": "a1655ac983c125d95cc9ebacf5ed61f253ba461755bb56102b052768f9b6e8d0",
+    "backend/migrations/158_enable_grok_media_generation_groups.sql": "d4b96a0fee909bda25c2ee233ccacd2e08cc09daa8a228390ee0fc0d0ac427bd",
+    "backend/migrations/159_batch_image_foundation.sql": "f23d2e71c4cdfe05c194183661828262deb60f52d9cfcfb9a3c98dcc29b2822e",
+    "backend/migrations/160_add_user_frozen_balance.sql": "8c1e5cd3edfbee82a99fcd2913b18925bcc5be891d01dd3aa2399cca30301924",
+    "backend/migrations/160_batch_image_provider_refs.sql": "b90f0fdce8d239c815cd4b9a2ec9bc4c0bbbf4cefee82537e4a82bc1632096c1",
+    "backend/migrations/161_batch_image_pricing_snapshot.sql": "9e9f300fdef853e78c9a3e46f8f113713e96feb21eb1f78137e708050cac90af",
+    "backend/migrations/162_add_group_batch_image_generation_gate.sql": "422f5b82d44163344b4b4abd17e66d470c7f61e1cdcd6e083149e4726fee6bbd",
+    "backend/migrations/163_batch_image_default_discount_and_hold_ratio.sql": "463d81478086410cf7d72ebc09050ce94b9b30dabc4b40d56cbdd6e9d64a2143",
+    "backend/migrations/164_batch_image_download_and_user_delete.sql": "8271a1b0b7e191cadb07e8ebf45b4541f72df302d1e0cab0135f3d23722a1c49",
+    "backend/migrations/165_hide_pre_upstream_batch_image_failures.sql": "5e2c3b26e0e0ab0eccc7896161a91db7532d4cbb4e3582d6c35f5718497c115a",
+    "backend/migrations/166_batch_image_task_name.sql": "419efff9b021c0420902de3d7c046fbb1b7dcd5ed386007c516870c61b8bed83",
+    "backend/migrations/167_clear_auto_batch_image_task_names.sql": "74da5c901169b6bbf59dc92c106beadbbb8f4dfac0ddd3b7d735a6e610fb1039",
+    "backend/migrations/168_restore_empty_batch_image_task_names.sql": "37daee62f0d392d30f3bbe3e480cc7a9e9d217a2bcf3b678607ede7829f89692",
+    "backend/migrations/169_batch_image_parent_batch.sql": "4113a83a2d3560384b17fbaa46620ce1c8db952b4570501b7bdd97b08e057e52",
+    "backend/migrations/170_add_grok_video_pricing_controls.sql": "1db2e584c62ad18e7045dbef50e6987e6fa01009d57845a904427bf9f5c61829",
+    "backend/migrations/171_allow_video_usage_without_image_size.sql": "a91994eae7af2047a13b965a0722c25e67c1d6d4ca3495a7abb3ca3c58f461e5",
+    "backend/migrations/172_composite_model_routes.sql": "b22d845f42ec75a7c4cf40ff75292a71a54611ef530032909fc3b30a4c2d2ae8",
+    "backend/migrations/172_video_per_second_billing_metadata.sql": "8a53ce2b0c5f4400eb6af9280d1f730387b2f1c6c8d9143fe7c3c23893e2d26e",
+    "backend/migrations/173_allow_cyber_blocked_usage_request_type.sql": "f85f43d1f23c6b47047bb5b77495163c60ecb3db470a566bbfa1754282a75c40",
+    "backend/migrations/174_add_usage_log_long_context_billing.sql": "bb8e95bc1f1af42c51b2282d5dde42df7caaebd6d436906252950f8b11b8287e",
+    "backend/migrations/174_add_usage_logs_api_key_latest_ip_index_notx.sql": "83cc57ae6f3a036ad4fb3959c04bec0f153adff7574b2f351517d31b06f6da96",
+    "backend/migrations/174_group_web_search_price_per_call.sql": "820c555a9804efc3c35a819bd8f6649439ce5ed16c321bb3233149400afbe310",
+    "backend/migrations/175_add_ops_system_logs_host.sql": "438a7cb649fc453a017dab3adae38b1789a4be7678359aa15740847d6c553571",
+    "backend/migrations/175_default_openai_long_context_billing.sql": "735db2875bc2397a188ddda2e29cb28c22e7c935e052e5cdd1608a8e160e24ca",
+    "backend/migrations/175a_add_ops_system_logs_host_index_notx.sql": "bd317e7b3a7292a57d5fe9f0b7e6c1d39e9254b039ac1aeb897201911a432f3a",
+    "backend/migrations/176_channel_monitor_grok_provider.sql": "0425ee1188a806e3c8252398363ab5102c9fd04be4e7096b77b69e2067eaa244",
+    "backend/migrations/177_add_subscription_plan_currency.sql": "fea77c5169b3298f8ed662f35086ff18bf214193417b449f3dc6ab792d459af0",
+    "backend/migrations/178_channel_image_input_price.sql": "4292cbe5dc285142f67f8f8b050319c15dedacdaefad2181ee08c337f5144e88",
+    "backend/migrations/179_usage_log_image_input_tokens.sql": "d7036839d8613b38c4d620677a98b39aaf5289a110aa998259c4820b108ac778",
+    "backend/migrations/180_audit_logs.sql": "4ff7ae63a055f7ef24a9c7482ac60a365f880e97dcdcb1de26c79cc0b59489f5",
+    "backend/migrations/181_group_duplicate_operation_id.sql": "7d0e5994a1196b7148f67e47aa17ba1641f2f01a600bfa63e47b6ee3afa0f938",
+    "backend/migrations/181_prompt_audit.sql": "e0683734ea5a12ffe19d4a98acb6bfd5b24be236010ec006f1e9c9d0eb503e68",
+    "backend/migrations/182_prompt_audit_full_prompt.sql": "7de1e20370c463e93eec9b8667549c34818b03cb56a79e12b37eec30c10ef8ed",
+    "backend/migrations/183_ops_ingress_reject_aggregates.sql": "3e09aa2766b0bcd57bab0449e7e782829a1832cced23ffc53c9b27def8a77d2e",
+    "backend/migrations/184_auth_cache_invalidation_outbox.sql": "143085310f44671f6ff0f1604c191b5a504df50bdeea37e365c5765cb3553e86",
+    "backend/migrations/185_group_reasoning_effort_policy.sql": "940c1132c5a01f824a83439cce41e6a182d51c1a3c6357a96c76dba950fc307e",
+    "backend/migrations/186_alipay_mobile_precreate_deep_link.sql": "2b1a0348d4ee93ba93c1bc0530b2302e906688a04dd3295a630461f2e50a9077",
+    "backend/migrations/186_group_auth_cache_image_generation.sql": "29e9c5a0b7966aaed6e8452ec5362384bff456bf98e0a3c7d412ae5b8a0f1a6f",
+    "backend/migrations/187_add_usage_log_session_id.sql": "3851c571072f84d388f5d6d9a2dbec3e64c62008de177b0df24616244333df20",
+    "backend/migrations/188_allow_live_usage_request_type.sql": "560621f05d6eac1aac605d9b096a24de62c8fe000f6778184fa4c1e8dfeffddd",
+    "backend/migrations/189_add_group_allow_live.sql": "1544ee2544101619e3cc08f9246f5d524122f807f164cff6c1081c17c8880e2c",
+    "backend/migrations/190_add_users_email_alias_dedup_index_notx.sql": "46e4a6043f1632ac87fc6b4a59deea2eb154d7df87bd22e147fd51402bffd32f",
+    "backend/migrations/191_passkey_credentials.sql": "2ada807c41138c6f209db138984d59439418f1d06af3a101246bacda6e882893",
+    "backend/migrations/192_group_profit_control.sql": "3557811915c709b1162741e22dea0ceaec0b12e86a1ca3c91e2857eda8b23eae",
+    "backend/migrations/193_group_profit_control_auth_cache_invalidation.sql": "ab799eab3a537b82fc8867116a19c629c67f1ff7a8d27e4ec0c3850e93d418d6",
+    "backend/migrations/194_add_usage_log_upstream_response_model.sql": "6803b9784b34871fb5a3eac86b354520ffa79ef85157d83ff9c735fc1971dd98",
+    "backend/migrations/194_channel_monitor_v2.sql": "aa92af41676d794db910945e43333c9bebcec9b88abccc2a526a894bfeeb7966",
+    "backend/migrations/195_add_usage_log_upstream_model_mismatch_index_notx.sql": "229426ba9071aa70860ac0b6deb3420f8b4d8bbd457160b954d51dfa8806ea0e",
+    "backend/migrations/195_channel_monitor_mode.sql": "13f3792f3e3e53ee96e26415c884cf8062c77172824b54fcc9a8c0c2b1f185ec",
+    "backend/migrations/196_channel_monitor_v2_ignored_error_categories.sql": "1863655d6ab75084b6543cec36c47cad5a89e3a0037214ecc0aef465beb8fad5",
+    "backend/migrations/197_channel_monitor_v2_seed_popular_models.sql": "10412ca2d1f1081a9424a2286d0295c0af1e095766e532659425f4c16f0047ed",
+    "backend/migrations/198_channel_monitor_v2_health_thresholds.sql": "d7f7bd222138ecc8379789921754512f93fcba3e5bceca5caf4e4fe780624c51",
+    "backend/migrations/199_channel_monitor_v2_fixed_rollups.sql": "fe6b8346a0b9bdcd08a55b8e7e53491e7e3d61f086c4dd50ee1caffc64b13456",
+    "backend/migrations/200_channel_monitor_v2_rollup_permissions.sql": "aadd2a1af9b2aad18f3dbcf549c597e93e7bca86e7830b29c3fd294f2b174b71",
+    "backend/migrations/201_channel_monitor_v2_refresh_5m.sql": "883b9e8ea6193e592b32664750a561edd575e60b446a7c1071e62e98155ab084",
+    "backend/migrations/202_channel_monitor_v2_full_table_permissions.sql": "f707cc4e4a7a705133f8ab3db9f8a4bcf89e798f055c150feafc19e9b75f85cc",
+    "backend/migrations/203_channel_monitor_v2_default_ignore_and_cache.sql": "e1dc92cf6dad64aba3f41f439b4f34835766451bcfd236e85bbd317dc78117e0",
+    "backend/migrations/204_channel_monitor_hide_throughput.sql": "b8b8ec938c6b2b1c11931bb2decdbdd0977939e151d49bf9f0a4af317e0818a7",
+    "backend/migrations/205_channel_monitor_v2_reset_factory_cache_thresholds.sql": "7a4e0c80126225d2570e6c66bde28205220b3f1714a68d92f9e671aeb190c824",
+    "backend/migrations/206_channel_monitor_v2_privacy_defaults.sql": "fcf215cf2a8d35df141d1eb20ac3e2bb4f1657995ec74ec9ee0568fa0065cf2f",
+    "backend/migrations/217_group_video_model_prices.sql": "c53b4fa3d09797064b67b469a3cd0077c9fcd4fce17c4ffee29fcfcfb4dd8598",
+    "backend/migrations/218_group_audio_voice_pricing.sql": "40ee9f3a2af0e0a5e99dabc878fd0fe98be1011f26bcfcefcac7197f7081f0e7",
+    "backend/migrations/219_group_search_price_per_1k.sql": "e86786ebcc3b14206fd2d321380a4e50e80cdadbfcf4962c639255e6a14008db",
+    "backend/migrations/220_clear_non_grok_video_generation_config.sql": "85e320b9ec64f2d3fcd8cf705b2b4e76a7b49f7a57140c14bff97f32691c818b",
+    "backend/migrations/221_group_model_pricing.sql": "3e2895b7263d80c7d8bd93741d63d80f9300f5e0a723fcbe4f73611411fc3df5",
+    "backend/migrations/222_group_usage_daily_rollups.sql": "d22c1e2fac2e8d2087d029eabbef1b5c581d981113e9e5c3b6cf352d1184022b",
+    "backend/migrations/223_group_usage_rollup_timezone.sql": "dfea690bc6a821c8fb72ae8d5d0f5112ee03e0b478a21715199c72d9438e7c99",
+    "backend/migrations/224_user_platform_quotas_add_cn_providers.sql": "a80bf4129f12d09818c495b804c81d2ed2a4ea2bbb87fdd39f59fa336c6e0886",
+    "backend/migrations/225_backfill_codex_fingerprint_seed.sql": "2e0a0f6551d026227095394a2d254368d6128ce98a9dc29a7b8de4dcbe64d467",
+    "backend/migrations/225_channel_model_time_pricing.sql": "de2b2e411c1b63c320abb76d11a7f482e8d4ae9fe465eb7949e6e1c92e1f69e0",
+    "backend/migrations/226_add_usage_log_effective_model_indexes_notx.sql": "62a2480e55a6ee9499699f8052f859a4ca7c33c0cea4b9340679b78f99d4b9f0",
+    "backend/migrations/226_channel_monitor_quota_mode.sql": "5efcd4dcd8e3cf8d64c0e66adae14836209a125e896d416781495ab8c91a8c1b",
+    "backend/migrations/227_composite_routes_add_cn_providers.sql": "21d81a064828e8a544992f98e949053e45e9a135bc011f129147675d94612ddf",
+    "backend/migrations/228_channel_pricing_multipliers.sql": "cc7d231cc28660c791f924b32c35d8cfce2a474842a0a329ddd61ea7ae2de3a9",
+    "backend/migrations/229_plugins.sql": "941872100def939cadbae9ea6af37483a8466c962d8239e8de79e26f1ebb974e",
+    "backend/migrations/230_plugin_artifacts.sql": "2cf2bee4836306778d6f3a7d27f7da54590026b2269d3a474d1477830850ab7a",
+    "backend/migrations/231_add_usage_log_native_compaction_v2.sql": "8e0ce1864caea450f49b250a2b9c992ef19698a7d689ef772b256a7114e56474",
+    "backend/migrations/231_add_usage_log_requested_reasoning_effort.sql": "6c7a8a4a6546ca933519595daad5788f018fe4228e1de8aac4354626120666e1",
+    "backend/migrations/231_user_restrict_public_groups.sql": "ea2301110ba26614699869ec4919cccd5740eb9655441ab43e80a865fb5ecd88",
+    "backend/migrations/232_add_usage_log_upstream_request_id.sql": "d13ec35cdf8383c769a6a3046d34d7809860601918648def06bf82b8c28bb80b",
+    "backend/migrations/232_channel_cache_write_1h_pricing.sql": "9d3f11a365c790312148930ba2b4861022180be79b1f72b285f95530dd843a4b",
+    "backend/migrations/232_group_force_openai_fast.sql": "df219aaf4d970ce5672165cdd89716ea81ce8f7a269821c86a1d7e0b907ca0da",
+    "backend/migrations/232_group_reasoning_effort_over_limit.sql": "469fd8018b272050de20fde1835699feabc865e2c87d612bff6402821f74a6e8",
+    "backend/migrations/233_add_usage_log_upstream_request_id_index_notx.sql": "41c32a383794730d2bfd88514bf999cfb156cb06324c46b54642736ac8f2fff6",
+    "backend/migrations/233_group_free_openai_fast.sql": "aff8cc2ca0b370a7dca32c21eda22ae8c07d35db5b229e2681faab02e1eac72c",
+    "backend/migrations/234_channel_max_reasoning_effort_multiplier.sql": "448b59b3168fe4dfe2417f1abd9657d124708c279e2245d55149087838d8c8d6",
+    "backend/migrations/234_group_codex_models_manifest_config.sql": "8ef9cd9a6a963e79823f8f5d703a6b31fa30ebfca9f8d2337dd451765178e5a0",
+    "backend/migrations/235_account_proxy_mode_check.sql": "a43840d4e42ff80ea8d614dc9b3e200541d76c2c97d5c0a850b42b2b5799c445",
+    "backend/migrations/235_group_model_allowlist.sql": "4959c4e24a504d0d8fa1345137c1a3715adc6572477dec7a318cf453b4321f9d",
+    "backend/migrations/236_group_model_allowlist_repair.sql": "752809cf1d3812ce241606ba8b015dac48bd6c04ab1cde9ef204d138cffb1025",
+    "backend/migrations/237_add_minimax_platform.sql": "9bf4623f1f82f7b18f8ebc25f7205be6eebd5ed221e4c4be94b531131e479b64",
+    "backend/migrations/237_group_security_policy.sql": "d2c2a9fd4b7d35205da5bf91324c80d7e79f64b4ced5dfd5daa61866e4382966",
+    "backend/migrations/238_content_moderation_overturned.sql": "1ae32ddeaafe164c97caaeca83fb6bf49d65b30418b3bc4e0d260e71544a60fa",
+    "backend/migrations/241_security_policy_keyword_deleted_at_index.sql": "885f6719dae32f6772621b863959de41f3cf09113478fb2082ed4018705e3918",
+    "backend/migrations/242_global_model_pricing.sql": "3bad7c23684c1d54d893661fb371a3e8b77bf7d5568d7407e10cd7e27c7109c3",
+    "backend/migrations/243_support_tickets.sql": "b46b3da0da8678e98f95cafadb9c2a9e2f1e79bed703e95121ef12d02736981b",
+    "backend/migrations/244_legacy_api_key_read_compat.sql": "89df4ac7aa7fc112a274871098f54e5ca66a48e3f38bc6dba200e07e7bbdb23f",
+    "backend/migrations/README.md": "2f3548431adbb292cf6f17cdf88c72f2a07d21dc8d7526c0bcddcb9be4699f35",
+    "backend/migrations/account_proxy_mode_check_migration_test.go": "67ac33dc8fe13d6fca37237c77a0623ac098ebed3960b163f8a87267cf018b98",
+    "backend/migrations/auth_identity_payment_migrations_regression_test.go": "1b07cb39e6d77631c6d712b0c22354fe0636e6feddc3316ae9c5757e34135d47",
+    "backend/migrations/channel_monitor_grok_provider_migration_test.go": "fa22b03c292e39832f42ab7a7553c3faf290ac23cbdf90ca9e8aad770544081a",
+    "backend/migrations/channel_monitor_quota_mode_migration_test.go": "05ec32b29e0147f7d4aaddbed8d48d56d4e8687af0afd71c531c7e8fb7d765ea",
+    "backend/migrations/channel_pricing_multipliers_migration_test.go": "0094c47552f2a1f78d28eecb531c6aa414851cc62c8a91a177118ea61bf37aef",
+    "backend/migrations/composite_routes_cn_providers_migration_test.go": "ce87da4cfb1327f57d2a0f1f674aad2456d30b1638a1978d9e653fb1cc456910",
+    "backend/migrations/group_force_openai_fast_migration_test.go": "76a37ccfbd7304fcdadbe2f2a5b1b3cb3015c134891eec3ac962c9b65cfccd69",
+    "backend/migrations/group_free_openai_fast_migration_test.go": "03d615a86a3ee8405edd60a79036d3822e9460b8d7d355798f46b4921e472160",
+    "backend/migrations/group_model_allowlist_repair_migration_test.go": "1007e67b673f8549143a4dc993d77899b10d45d7f0563035324d79899feb81b0",
+    "backend/migrations/group_usage_rollup_migration_test.go": "4bac806489cfc3b4b0c7a8221ba99d83dfe821cd6e79de336a75dcdc3f2013f0",
+    "backend/migrations/latest_api_key_ip_index_test.go": "53c92142758654bebe36fc8e70ba83e78175f1f3fd197d0de5afcdaeaff33bb7",
+    "backend/migrations/migrations.go": "234661eba848d5af190c2f4cb4d05152db35ab1d85cecdede4d93fd7429e7b28",
+    "backend/migrations/minimax_platform_migration_test.go": "2d539999e847706d548cd2d6871a4ef85c18db87bb7309388428a5e7a9068043",
+    "backend/migrations/openai_long_context_billing_migration_test.go": "3c29e80b0dd31077797949c9e95fec01a00ce01e00c448f418ad64c1727dd049",
+    "backend/migrations/plugins_migration_test.go": "81e2a2a2215739db7bc090a92f02dda43416322998a9775d49bdd53b31210eea",
+    "backend/migrations/usage_log_effective_model_index_test.go": "5ac3353d45ddb241895d1b8f5df7f6fbe4a9c90efd42d22115938a689e0ee0a1",
+    "backend/migrations/user_platform_quota_cn_providers_migration_test.go": "e6a849ef3c2d17b68822620e566782d038a1e17af2bb327cc780aac01c3a33e8",
+    "backend/pkg/pluginapi/README.md": "b12ab3864373bfcbfd2e42466ea74494c97e8f2b2f91edc2105dbe2d49603bdf",
+    "backend/pkg/pluginapi/docs/development.md": "35e0766a10510579f09cb167ebb56529199996a90f2f44f78cb3459d632210b2",
+    "backend/pkg/pluginapi/docs/package-format.md": "1b4f640640947a8aa6f8fe5dcabeb37485cd07bb25ce5767a8a4cdde66f67291",
+    "backend/pkg/pluginapi/docs/security.md": "ee60d532526eb6d7950094d480fdcb571b4e680364a96c4d9ea48937f980db29",
+    "backend/pkg/pluginapi/docs/ui-bridge.md": "ae605b480612410eb79068bd95ee078b0c6f43905088bd8b6fd63b322b1c36cf",
+    "backend/pkg/pluginapi/v1/manifest.schema.json": "d6e33c6074370629bc276f29864693a63f20109051f8c95f585dc7c28f9f4e4f",
+    "backend/pkg/pluginapi/v1/manifest_schema_test.go": "51e454461a746008703df007d89ddcd77532ba4b2d6d9f1a582de935011cac9d",
+    "backend/pkg/pluginapi/v1/plugin.pb.go": "369b1ee825bfa41f2aaed84a0b125f9c40d9d12c1c972cd31c4eff69ac2580bf",
+    "backend/pkg/pluginapi/v1/plugin.proto": "3b089ee6f1138b7adfea6721c3fb251c4c93570a9f63e2849630d1c2bc259965",
+    "backend/pkg/pluginapi/v1/plugin_grpc.pb.go": "1a24ba13d42c712f92494be83ea93970476a6dc4146fb1f3a216670e93e569ee",
+    "backend/pkg/pluginapi/v1/runtime.go": "701d6adc0cc6757eb513a52905063eea907f6fc32a2bd6dafe07cdf6e2cac7e8",
+    "backend/resources/model-pricing/README.md": "d6d8054b0b8405402931c05ea0e4625ffc8b4386a77b811b487d645351a6face",
+    "backend/resources/model-pricing/model_prices_and_context_window.json": "d5bddaa053bc509653ca0b7cde4e3b57f1736795ba22f22e43db2cfdd98a3827",
+    "backend/scripts/finalize-ingress-reject-cleanup.sql": "22aeb544537fe214841aca8009223dcd85542ef42dad1c99af7193ecb2c83d9b",
+    "backend/scripts/resolve-version.sh": "261a0db3673f4da30b002069176d3b256f9dda215ff74f7007b0fd8d541c4e2a",
+    "deploy/.gitignore": "87b84418a4175a4160967b5ae7eac8abc91960a9c32ec6ec90f208037edf4eb7",
+    "deploy/APPLE_CONTAINER.md": "d888ef94c350d273d5f770b45bb58246bb74c0b5af1c7beea8f63016c7ab8f73",
+    "deploy/Caddyfile": "8eb984fbb0e0bc25b29a94578acec1aa74815eaf478aee4a6151da396f7318c6",
+    "deploy/DATAMANAGEMENTD_CN.md": "20fe873249a45f4552ae23c8058ef15ffa8c43cf07b44e9a84b3b173627b22ac",
+    "deploy/DOCKER.md": "57f32703717273f1313510e78cfd68e5d6b17ddd03af68d18c5c7bd0055fbcf0",
+    "deploy/Dockerfile": "9e0c48a1e62b5f4fb17dc9e4008e962abf47535ab883ade9bb9f1063a94da32d",
+    "deploy/EDGE_SECURITY.md": "925e58a2335a67bfe7480e5fdacbae8c9564c647682d783453f21ee6a29cf3a5",
+    "deploy/Makefile": "2019664e4c01fa28dcadca55dc7374f607d3a808faac42930a84fc2d7e5a71f7",
+    "deploy/README.md": "b9fb4eb2d7abe8a76f3e97756c21dd60f36c3dc30bf80290d8568f684004ae74",
+    "deploy/apple-container.sh": "180d61e58f9b971609fa1cc5ce3bc01d202fcdc1dfa2c4f75087c6284902c21f",
+    "deploy/build-relay.sh": "b12a299b766b19f76bcef614973d2fd9c27ef19d46c7589246a3ab354dfde4eb",
+    "deploy/build_image.sh": "68887b3f2bbb4e54fe11effbf2bb79b5442d675c7ddfea3a6c1243326d917529",
+    "deploy/codex-instructions.md.tmpl": "1b0b12d093d2ffd819ca82ba242e91f502a53b09b7fd80ad7eb87a5c8e202885",
+    "deploy/compose.relay.yml": "b76d1e04b7dc448f6a9c4166cbb5edfbd0e31efc79a63f3e11ba950db8688ee7",
+    "deploy/config.example.yaml": "a4044ab096b6c728f13cd956acadf3526aa35c1e3863d1a6d803b538db2a09ef",
+    "deploy/docker-compose.dev.yml": "efcaaeaedf8b1b86fde48ace7cd597a42953a3f6151753a8042b1f924b79aaec",
+    "deploy/docker-compose.local.yml": "c888908687666d3849a61e8f77b94e341e3a1095706abbd60fccf4162bd5cba8",
+    "deploy/docker-compose.standalone.yml": "568ff22609ccc20ac72efe6273f2dca42930f4e20673b5f3732ce82fc70be5c5",
+    "deploy/docker-compose.yml": "a653ba010f247327933e82d9809111d3d7bc65740a65a89989a873a274788ab4",
+    "deploy/docker-deploy.sh": "108ac972acd7f4240fec67db09845d91e3540fe37e3a0fad840ecd46fdfe2102",
+    "deploy/docker-entrypoint.sh": "7d3f1f532fcdefc0f405b37fb6caafa330dfcc7c531ad8bf51fcd48dad54a0b3",
+    "deploy/init-relay-env.py": "c1dbca4edce747399ddd18e73d5b5f147ec55a367c807b8d30562b263c258c75",
+    "deploy/install-datamanagementd.sh": "78376515e3640d07a5016f86d85b1b772c1f6f82673d45812bb8a5f74a008722",
+    "deploy/install.sh": "d6ca89c38111041e392463bbe1637453cd1576cb99dee0005b441ff5a20f8477",
+    "deploy/relay.env.example": "1179fe7ac129267edf3dd7cfed08ad35ab97c01871759ff5cdd0589a39b1725a",
+    "deploy/smoke-relay.py": "129b4930965e6df296cc2f5051dfc2da22065e0d2107ee06e502152e35b9ee50",
+    "deploy/sub2api-datamanagementd.service": "b516a4904ad8ac955becb44e2facbe224beb175a5fc8bfb95c8da3c62b41a5a3",
+    "deploy/sub2api.service": "f83f4876f393136fd3a2b73287658b9afeef0f9eed471a1a741b808b2626bad1",
+    "deploy/test-caddyfile-cache.sh": "d1578d6bf1ee23245fd671686246ec10acf1c3a2bcfbd8a0eeb2fcc5b9262039",
+    "deploy/tests/apple-container-test.sh": "090c8dfe38f104f3b27b71702de93c966250986ce42e315c689a6b476d8ea005",
+    "deploy/tests/docker-compose-gateway-env-test.sh": "701249b6a51b3426623d36d7241502c3d614d5aae490b90f6fe9ea5af864e894",
+    "deploy/tests/docker-compose-security-test.sh": "483e66450b5bcdc5b7dc4e1a7e96505dea4835fee699627ec3f733ec892781c9",
+    "deploy/tests/docker-runtime-resources-test.sh": "d54693e1cc5895507c811261fda902b40ec43a64edbd5e94f820ee4e0aa8dfc7",
+    "deploy/tests/fixtures/bin/container": "bf037f99d59b661ab972d31e6421e7b92b14c08f6251c483501792606709d50a",
+    "deploy/tests/fixtures/bin/curl": "abaeb7ae96b19afa1c8729f51ee37d6040b1e76d876cbaa0477be2ba9585f45a",
+    "deploy/tests/install-github-token-test.sh": "9b300f57c450f3c58a84514ad81c674a109837183d4a89a0d0381bd08a49c2b4",
+    "docs/ADMIN_PAYMENT_INTEGRATION_API.md": "8d82e6e3dba05c2f07a970267a8ffb62ce9ff37ca568f0919999fe46d67c6261",
+    "docs/ASYNC_IMAGE_TASKS.md": "23d96ba4811d521ec1a5b8d8dc2bcb8a090483cf536bade160ac29d7e4ec1e2a",
+    "docs/BATCH_IMAGE_MVP.md": "2b5242d08c170ecb8792284fd72deeec0474d9d966c7be42c8357d2b86d898e9",
+    "docs/BF-001-mode1-regression.md": "218a0d0019befae78d1d67caf35337acc5887f1607728c2aa9cb774c64e09495",
+    "docs/BROWSER_VERIFICATION.md": "93167772f44c1b146f0b91f461eea8cfde2c66be91c8538ae7e73e4b2be30984",
+    "docs/COMPOSITE_GROUPS.md": "35bdf77817d1d7730be847145c2c85a12f3b5169fbc0cad0a33ce299a2f6f1ca",
+    "docs/PAYMENT.md": "f6267475e13155177b9d1766a0543624300c09987a03f4c809b4f114e5a461dc",
+    "docs/PAYMENT_CN.md": "03f72b4941721208080bcb9cd370439d8c2cc8a637743699b48eef056db602b2",
+    "docs/PLUGIN_DEVELOPMENT.md": "590b1846a5507f735535ef9d247ad5d5439f8d07ce9a336c768ad2bd969b07a8",
+    "docs/PRODUCT_DECISIONS.md": "9ec164bf40681368bc5d1c4c887a8b0aa13eda67706d0b302bcfc6e95a25313f",
+    "docs/REBUILD_PROGRESS.md": "76f7d6407ff61ac529b4b9d309e54cceed4c56b4e8f163b69ff70e4020463ee5",
+    "docs/RELAY_DEPLOYMENT.md": "e23db53a866c148ff5b9490e67148755f4ef431270641a2eb3a24c4a3b7873d2",
+    "docs/channel-monitor-v2-safe-defaults.md": "f0f6487928e1d9ed79a4f6058cdb8aa56dd43d05c0ad69034bd4937d158099ef",
+    "docs/legal/admin-compliance.en.md": "5f349746de82050f16d812eb95ade48e0858de04c65e9e64f437965b94fb79df",
+    "docs/legal/admin-compliance.zh.md": "c9d22b6f85398b1d07ff76067b0514bbc1febaf67e1ca30d604feff6bdc374ce",
+    "frontend/.eslintignore": "af61dbd288862b4c4054adb1c0f91aae4af7e1c218915ebeba8a56e1b3408215",
+    "frontend/.eslintrc.cjs": "12f3ccc6cbf83af6fe69d71ebf89d37e7ad05f2501ffc9d1407857a7d9fe905e",
+    "frontend/.npmrc": "4347c8d76f8ea1940676f35ea528bba149148f48ea1c5d1f40f5c7f523cadfb3",
+    "frontend/audit.json": "664db53edd7bcc6c5c06e895e3ead5e66f64c0b0bd93d7b9263ab52cf846906b",
+    "frontend/index.html": "6199f9371bc75f988c4536bfb4361b39a53e93d3cd941be67dc2814b39c870b0",
+    "frontend/package.json": "e131e1043017310e58c413e0bb00bd730fc595cc0c3cbc5fbbc16bbdcba8447b",
+    "frontend/pnpm-lock.yaml": "8dbd1876020e41b644d971414d29100c9f428f39ede953c03d0442b834f6f3af",
+    "frontend/postcss.config.js": "8592c6fceb411f2865a99b4debde2721201770545d43a94fafd89fe043e1e1cf",
+    "frontend/public/logo.svg": "ce1f2ac07efcfff80904a9582578b5db8fdd14a3118a5c7b58f408ed06df18e1",
+    "frontend/public/relay-mark.svg": "6efbe219c20cb3efa044d53f0fbdc092b3d7c17f7952d2d835750c38bc3152af",
+    "frontend/src/App.vue": "3ccda88df38a380d43df43bb00db063b2135ab2cc5cb491db98abad0a01707e7",
+    "frontend/src/__tests__/integration/data-import.spec.ts": "3bfc04cf3d5c314b759f276f1480ead09779455a05f1012db73c7d5752f8246c",
+    "frontend/src/__tests__/integration/navigation.spec.ts": "7afaffcb3533664ae6db99d5ef8d3b735173b4e976557320bd884937b1cfd4d5",
+    "frontend/src/__tests__/integration/proxy-data-import.spec.ts": "ae652e55832b2311e788ce7962ddbbd72c33246770f8535af4b025928cbaa02a",
+    "frontend/src/__tests__/integration/usage-reasoning-effort.spec.ts": "a629312456f3db8ee4df10497da29ce3a4b3fc457aa4cbed2d987d31a584a2fb",
+    "frontend/src/__tests__/setup.ts": "e0839b47a111f290d00d739cb8da6b689ebab1700b0754cca791ac91327b5df7",
+    "frontend/src/api/__tests__/admin.accounts.antiDegrade.spec.ts": "73209a4c822da5ddfbd12fc25a5c5db001a8112a459d051a5eace575cd55ea98",
+    "frontend/src/api/__tests__/admin.accounts.duplicate.spec.ts": "236880271725921adb0ef52416d37718769e892f8fca57294a1ae3ff0d366836",
+    "frontend/src/api/__tests__/admin.accounts.ollamaCloudUsage.spec.ts": "8c44555d0743a5427953767b82c42f065d8d33da36feeba220357f18fcc88d0c",
+    "frontend/src/api/__tests__/admin.accounts.upstreamBillingProbe.spec.ts": "684f45d8e94320dcf0821ed29fb4d07379f308dd82e2bfa22d1c85f2cbac7f4b",
+    "frontend/src/api/__tests__/admin.channelMonitor.duplicate.spec.ts": "67b571beb833c4831ea2f9774dc28f6c40aea7cc158f52438e84a9c9f8781731",
+    "frontend/src/api/__tests__/admin.grok.spec.ts": "cd8bb4c35f16605650748e5dca72a54b3764a8650c13b02d4b55004522a147dc",
+    "frontend/src/api/__tests__/admin.groups.duplicate.spec.ts": "365df10958bbc5410ce542a15ac246f9b5c87a1c2496ff819f5116a66a96e392",
+    "frontend/src/api/__tests__/admin.groups.usage-summary.spec.ts": "7eeb9da069ae1ba8f9dabf6fde06aa9e34aeb6e37a1b76671bade81a8271619b",
+    "frontend/src/api/__tests__/admin.proxies.spec.ts": "52552d7dfc456cb06f566a12f49ef255887b2ae040f1fa4b4f3bece56a562266",
+    "frontend/src/api/__tests__/admin.system.rollback.spec.ts": "ac6d015fead902f40c06b3ce81d2be28e99af60730d20dd416e25296fbfa0342",
+    "frontend/src/api/__tests__/admin.users.spec.ts": "a88f575b2f472ed8e210389df2f59b7f8fb8e61c0c75869a7b94649786357da0",
+    "frontend/src/api/__tests__/adminUIRequest.spec.ts": "8bcbf73926765f1a396de3d1f2a5a367ca31022df17b43044e8710fe4869043a",
+    "frontend/src/api/__tests__/auth-captcha-oauth-start.spec.ts": "26759e9b2d02f518643dc85a8f30dcef77a7b7b7e609afa53bae89cffd7f973d",
+    "frontend/src/api/__tests__/auth-oauth-adoption.spec.ts": "0bf88bc26b45496de4ebe4f0cadaa9e1921efb206779eaaa24708756e6850e20",
+    "frontend/src/api/__tests__/channelMonitorV2.spec.ts": "7222e97821c7d3a0dc641c7f01312046dfd018e7d20aca4fc4aff0db212f10ca",
+    "frontend/src/api/__tests__/client.spec.ts": "673041957241cee33a54e4a8a9a78e855f7ab7d72943e1006daf1a6479c99fbe",
+    "frontend/src/api/__tests__/codex.spec.ts": "21d46b9a15fe82cd79972ebb208f26d4dddaafc09d950633610c21fc83b761b7",
+    "frontend/src/api/__tests__/passkey.spec.ts": "a0d4693c10f77539221e93a5ea5345b0667f1725ba5ccd7e4cef4a3e01a941a2",
+    "frontend/src/api/__tests__/payment.spec.ts": "5b6ad88ea5d05f6519dcd48464850020a656aa30ba4df3c87efe77aeb4e7c5f6",
+    "frontend/src/api/__tests__/settings.authSourceDefaults.spec.ts": "31068dd612f584d88ef6a70d9018cb6623957d2b753ed8e940e8fc4e7a3b8b8f",
+    "frontend/src/api/__tests__/settings.paymentVisibleMethods.spec.ts": "4bbade004b0688a755303a1e9c263f365384cbc964e688ec1886c39c8de3f5de",
+    "frontend/src/api/__tests__/settings.wechatConnect.spec.ts": "2bd34edf4c3d80568d21432c6c91e6ff7ef6361823336cddfe7e4e9ba68a8420",
+    "frontend/src/api/__tests__/tokenRefresh.spec.ts": "75c1f9e1d36e7cac656787858fdb6b577848cc696a135958b13851635e595f81",
+    "frontend/src/api/__tests__/user.spec.ts": "53bef998c2183375ca207516f59ad5437286cd5189e89f7acef4a79304b099e5",
+    "frontend/src/api/admin/accountHealth.ts": "66473d63cd7bf70c0987090d97d820c1b96f1406149ea33fcce9ef1f734562e6",
+    "frontend/src/api/admin/accounts.ts": "2d9b022a60321460af572fe6a3a1600821f99c3c1bb4d6be3eed8c1490796c35",
+    "frontend/src/api/admin/affiliates.ts": "846f446ece5a371f9309094bd589ffdd2529f66d34c76d9882f50827b4f5b506",
+    "frontend/src/api/admin/announcements.ts": "115b1daebf212883dda0f047ff039b4648204a9dc676202edcc978e97665f618",
+    "frontend/src/api/admin/antigravity.ts": "c29ac9a65b66d8b6049b8bba9834a081e310529b6b9cc61dd134bfd0fc77f615",
+    "frontend/src/api/admin/apiKeys.ts": "f4fba7e462c2076db930c979804314d080f5005cdfe3a3c3cefd0222f335f342",
+    "frontend/src/api/admin/audit.ts": "efcdfe74375b68bc5b216bdbe175b73e7a60d5edd4b3c4b7fb968f8001a12521",
+    "frontend/src/api/admin/backup.ts": "143a79faa38e90cdb24c74ae4913fbab86af40e0a8042841a74599c0ba9179a7",
+    "frontend/src/api/admin/channelMonitor.ts": "5bdbffc526839d777525396b9d3c1f2a93ceca953d7f43ea18b91680cd526791",
+    "frontend/src/api/admin/channelMonitorTemplate.ts": "7ae45f1160ad260669e0caedddbf429cc16ba0f17f25c922f0f57f2dfa9af051",
+    "frontend/src/api/admin/channels.ts": "8e7c667b4b2d434dab41f87076d9178276772d0ef940599b6732a1a354e35fe5",
+    "frontend/src/api/admin/cnProviders.ts": "bbb819b3cc9edd7b0c62caba020e6f1e52943469d4670ecfcb6d1f302f624998",
+    "frontend/src/api/admin/compliance.ts": "309f79a6f74471676ddb23c705c8da142e5071c5b39d7af87c2e530cca3906da",
+    "frontend/src/api/admin/dashboard.ts": "73854b20dfd9a21e70d2847232dcb8d5a7d8db037ca0bdec64c29c4cbc487a54",
+    "frontend/src/api/admin/dataManagement.ts": "35f60364b6b662256f4c41d4a9bbcbf89c1f086db8ffd47062e5066eef2dbb69",
+    "frontend/src/api/admin/errorPassthrough.ts": "ca0bdae3fde433316c65a8a7d8202ea61b2c752e2b1a14a00022959470060607",
+    "frontend/src/api/admin/gemini.ts": "6b04468312084baa2879c226a2bf627b650c5b8c698437927461564a1c76f935",
+    "frontend/src/api/admin/globalPricing.ts": "74d5aedf8f909196c6cb8135855380ab98889707ef83254d3e3ca931142845e3",
+    "frontend/src/api/admin/grok.ts": "647b50745976a555f01f80d4bd028968e4a3e78af4301f12acc53a5f0a5978a6",
+    "frontend/src/api/admin/groups.ts": "2e96f6c14714144236deedb7c8e71b45eaa1d2f11d861db49162408e6a7091c6",
+    "frontend/src/api/admin/index.ts": "17c328d62ac2f1be75e1c75bee0e43acd53c12bc36a5dc14247d0861311dad2a",
+    "frontend/src/api/admin/margins.ts": "6f04eb691f7c5bcaddff936d89776f7344d124206ae72dd85b0c2bb482fcd8f8",
+    "frontend/src/api/admin/ops.ts": "80378d5205a6127d7b76091cf16f5601e4c6c9d64843deae56f9dee18e609b41",
+    "frontend/src/api/admin/payment.ts": "1b2ef298aed9f27e17e73fd05e1665158b9cbf2ffc6f701cf10f4d16fb1f1a36",
+    "frontend/src/api/admin/plugins.ts": "146650fe94c794de76ef5e614e6031ae6c2940e0cfd521fde98db10675ea4139",
+    "frontend/src/api/admin/promo.ts": "101c9023ea074c24b1a083f8ebb9d1259eec3c598062c962493cd9b957aea270",
+    "frontend/src/api/admin/proxies.ts": "680b1fc0ec3fd15ebf621a88d7792a8c956217136ddd0db83c3a5e0f788d98e7",
+    "frontend/src/api/admin/redeem.ts": "1f428a0ae727ac2e1f275593ae838b0a79a20bf110004b328a46f14b33b518ee",
+    "frontend/src/api/admin/riskControl.ts": "9ed4b4cbb06d14cab538d1ece9728ed3e18d4006878b4ecee08c9894a1260bb7",
+    "frontend/src/api/admin/scheduledTests.ts": "a218c67867f54af2e83f86a2997d6772ac61700c43e1f0a32435f87d17df5c77",
+    "frontend/src/api/admin/securityPolicy.ts": "929402998de1e3abc1f788f8d8a15dfd5794ab3782e20e46cc14203fc44bbd3e",
+    "frontend/src/api/admin/settings.ts": "7b4c4f39e9ac4c267ebda7fa8777f04a59829059906a640b787a5e5fd97271a0",
+    "frontend/src/api/admin/spendGuard.ts": "5e29bf0eab8bc4a5df84357648c150100b2701e1d4bc9a8152c48a06c8e7340a",
+    "frontend/src/api/admin/subscriptions.ts": "aac413648d9f9a16ed6d8a11b496a71fc0d1ca8e4fbfc013ad5b33808bb78009",
+    "frontend/src/api/admin/system.ts": "a256f6b3929158e926301fadbf4053e255afef8bd014eeab3f2f9036a6e55b48",
+    "frontend/src/api/admin/tickets.ts": "2ec7513a5a93f0271204fbe3600f073b0d3624836aef3b4368f248c3b48a3ada",
+    "frontend/src/api/admin/tieredRouting.ts": "e42d16d99de54839dafd253e8937a7edbcbd8394590c15a43c202ec4c1a5202e",
+    "frontend/src/api/admin/tlsFingerprintProfile.ts": "54a1b4fed7326f6afd654a0fc89e1c5f11a3ac11dd334842e35fc32a66ad219f",
+    "frontend/src/api/admin/usage.ts": "86c22748bcb09d9daa7bbbbab6399a0dc57022f1021669fe87f149bb39f7dde8",
+    "frontend/src/api/admin/userAttributes.ts": "5a80281136189e6e556c58a54d0c166657504f0cab442dde10c0b460f6bf69fd",
+    "frontend/src/api/admin/users.ts": "ae073d9415c56db41700d5793b4ab94a5f05e8eb291b4d56b4c53bcaef6f6d8d",
+    "frontend/src/api/adminUIRequest.ts": "7c55cb79e853bc467fc252ea6433054265cef3a652ae6e3b776006b195fa661f",
+    "frontend/src/api/announcements.ts": "1a0ee9b5942912c0400b29d93220db726a7b38500c036ec7a81744eae43d436d",
+    "frontend/src/api/auth.ts": "ab5a86c199d45762ed805193d0d5fbae84df0595571ba67cab94436abf99fcc7",
+    "frontend/src/api/batchImage.ts": "7ef62a9b82a505aa22c9966ca555a92508e599f2b198df99bc218278963f5eb5",
+    "frontend/src/api/billing.ts": "5cf4144e9dfa8f9c69d9e4208665b46dbf8a77fda3c15a4e199f477147895221",
+    "frontend/src/api/channelMonitor.ts": "4caaf606746ba526024ef9fb1ef7f9d566e2169981b3726edcddb701ab8d9e75",
+    "frontend/src/api/channelMonitorV2.ts": "0c7a0929525c22f80953c2b377a48226a89249231a4cbbc4e1efbaef18559ebd",
+    "frontend/src/api/channels.ts": "977ba644569f5b9be757b979d267028d493e4f2fee3cba356a636964bdc62f18",
+    "frontend/src/api/client.ts": "78288db10f1756f17d4f925008f430578b6f6a4f33db0fb04acd1ef1a94da784",
+    "frontend/src/api/codex.ts": "28284175a09b3046924a7abe90513c4a8c50578ac72ac7969b410a5f726661a1",
+    "frontend/src/api/groups.ts": "bc3a88d3c104f6516e72779faa376f65dec38b222d44363ec185febe5ea75339",
+    "frontend/src/api/index.ts": "74da6a872844c880ad05b35d11d4103c4cd5a9675002a1f23dfb5d0e0bfd83fe",
+    "frontend/src/api/keys.ts": "7baf4ce6b7d82c9631020ae0c4bba236cb603d8e3e7b300e845678302d45bcaf",
+    "frontend/src/api/modelPlaza.ts": "9fd4f47aaba4f4787976cbab7c23437f3745977233572a6c9b779c4fc7f39016",
+    "frontend/src/api/passkey.ts": "b38ab22fc8e47277fe4aa9448424bbff41586044d448758dca1521806d6509dd",
+    "frontend/src/api/payment.ts": "01229c6b62a3becec718d63e1cbc6cee1eb05bad469593ef3d1429088dba5b59",
+    "frontend/src/api/redeem.ts": "4d76408031e6e40dd6f7bb1dff0004318f989475bf75dd53473687f546d79ff4",
+    "frontend/src/api/setup.ts": "ec6896d39896c58053ec98e119190649a8527d121f58a8f132928ec725aea620",
+    "frontend/src/api/subscriptions.ts": "81a7efce17fb1a471a45b59e7d00a826905b038045436b3a52fbddc8477f7edc",
+    "frontend/src/api/tickets.ts": "5d57fab9c4fa853dc2008fdc5bc2f639e54f7823740b2b5dc2d1b3076eae87da",
+    "frontend/src/api/tokenRefresh.ts": "d591850505eb41c22e23ee40d960ae5f530df97b0f134d0900da9c5a7d980f61",
+    "frontend/src/api/totp.ts": "ed11e429e5c0da7b5a12a9bb851d638c5717a8a20b12f08356ed69ad34720942",
+    "frontend/src/api/url.ts": "e17846fe58b0a8327a4690c64c8afd151f45837715f6a87bc520bd171daebb7b",
+    "frontend/src/api/usage.ts": "7293174f6553fdb5a2b76fbdda5133414cde8cffc14cff82f192fd5a4840f8fe",
+    "frontend/src/api/user.ts": "1b2fd07a36b89e04d6df6fb7f43fe848ef3e027d787350daaff6b5aefcbf7a80",
+    "frontend/src/assets/icons/airwallex.svg": "c2a79046d369fb9ebc03b714de7aeba14bcc545be0d4685e197e2907b3e340ba",
+    "frontend/src/assets/icons/alipay.svg": "61170374ef8f658b123dcae76198b4c87156913567b58223eac7c991a39e1064",
+    "frontend/src/assets/icons/easypay.svg": "7acc370534ae4e5287f529efae42b95d22440acdf4c1fdc6bab364b62f939212",
+    "frontend/src/assets/icons/payment.svg": "15204656082b4f8e9fcf1f158e3e1a2beedd18c8dac06b336857559523d9d264",
+    "frontend/src/assets/icons/stripe.svg": "237c260ca7cc741b888733a715ae8f403247cd971e7361ef5a7f5240ef1fd300",
+    "frontend/src/assets/icons/wxpay.svg": "6ed9fce0fea520864997b3993f0362bb2f4f9dc2f8778aee4b763155a0e614f7",
+    "frontend/src/components/AliyunCaptchaWidget.vue": "ea0a596ffe44fd958960700647cecba93238bddf6e95fa26a0938f92a0cb4ae0",
+    "frontend/src/components/CaptchaChallenge.vue": "4893cd01ad515339b7e23ed9f37f5e8bdf50cceb6f6814d5dd34c7393f2d9f00",
+    "frontend/src/components/Guide/steps.ts": "c29e90f532c08ee11b4c570d1a9ff69d4f02d68ed6f7b75e94a662eb3e88745f",
+    "frontend/src/components/TencentCaptchaGate.vue": "1ec1d724831d608316e66073aa37fed3bdf0d365db0314a570cf7d6eea2042ee",
+    "frontend/src/components/TurnstileWidget.vue": "31164ee67ad0ddfc48d7a87c2be49ed9e5389b4105b1f10db201d24a8748ef1d",
+    "frontend/src/components/__tests__/AliyunCaptchaWidget.spec.ts": "29f46d1e35f720710885e1fd0f7c71bdc328410a07db2d6ca31e2708eed6d534",
+    "frontend/src/components/__tests__/ApiKeyCreate.spec.ts": "11b47212b9684f0b35f32595d78d3dc451770bfce695bdbe4cd52026d9fe1b85",
+    "frontend/src/components/__tests__/Dashboard.spec.ts": "bc24509046f1245917608ecc3e97e002da162c6ac3f5ee7befbabaac1002de9e",
+    "frontend/src/components/__tests__/LoginForm.spec.ts": "2460374c6de8da93eb7841e2ff0275e720f2abc8a30acc8d57e300c844cd710b",
+    "frontend/src/components/__tests__/TencentCaptchaGate.spec.ts": "4565d433d3737a84f09de13e291a8a9400a8eb2bda0e2b374193317fc60ead10",
+    "frontend/src/components/__tests__/TurnstileWidget.spec.ts": "20435cf9c1ab0f32299008f64ac87b2f578a0c6abd77d27e0511e68619ca30ce",
+    "frontend/src/components/account/AccountCapacityCell.vue": "0831b87342b1ff89ce666410361dccb43e5f8e6610c1662de1fd1c9c07ab662c",
+    "frontend/src/components/account/AccountGroupsCell.vue": "efced4ee3b7a8a69b28ab9469a1ba2ba4a93c3059ee2d507e079de9bb4db01c7",
+    "frontend/src/components/account/AccountQuotaInfo.vue": "4071dccf0d44f8984c844c3bd2b8655b11a78240c1cbb1960ffabe756a62814d",
+    "frontend/src/components/account/AccountStatsModal.vue": "cd11a7bdf0bb6aae3b55b6f551563d77b4d2623e9d0a5e92f5c9f6a71982d5ba",
+    "frontend/src/components/account/AccountStatusIndicator.vue": "34a19d235a3d49c7ed492f6e4ab8603d73359c9301ec190d1370731e7533fca2",
+    "frontend/src/components/account/AccountTestModal.vue": "ce6ca126f16384b386a633cd41c95ec007f4638ad9361e92a90b92edf22df185",
+    "frontend/src/components/account/AccountTodayStatsCell.vue": "c9d98105aca02f69407eb390c42c01445ec49e83bb56b3e5e837ce6077032168",
+    "frontend/src/components/account/AccountUsageCell.vue": "de49cf8f8b0632c057cee6fda582dbf692e650cbf97d7e48ba96218a2b7fd3a8",
+    "frontend/src/components/account/BulkEditAccountModal.vue": "cb23f4d0466aec8e767c0b648bdfe3e6c315eb3b0be0b41ed78499ecdf496be3",
+    "frontend/src/components/account/CNProviderBalanceCell.vue": "a7cf51d58de6a9238cf7091b6bcad8e77578fdb8a26d5be201d67c11b2617f19",
+    "frontend/src/components/account/CNProviderQuotaCell.vue": "3d85a0065f72050fb90001df77b7cc589eb72be48eeaa2d6bcb276883308bcaa",
+    "frontend/src/components/account/CapacityBadge.vue": "3ea5fc8eaf869bc630d51c99b21f192c217172fd10d85e94302c6c23da85360d",
+    "frontend/src/components/account/CnBaseUrlPresets.vue": "a54587bf9082b332b75ca51b6e55faa23cb3b5f01d3672868815e79c1741e3c6",
+    "frontend/src/components/account/CreateAccountModal.vue": "77a98c8d6df1119f9ee6e3a1b83833a885f390c2d4e59c744d6b23605d7f6b18",
+    "frontend/src/components/account/EditAccountModal.vue": "d704dccf82562cf39d6552d6024419dae1b34a9c590c1a8a6da9dc7478e4219c",
+    "frontend/src/components/account/GrokBaseUrlPresets.vue": "32cb1c3d524679dc43f790ab31cac7c87af198f8974157bdf6ffc97b5a83ba88",
+    "frontend/src/components/account/GrokQuotaProbeCell.vue": "40ec9e39f1db90b1d04c32cc4f0f8d731582beb80b9b146bd7f49c512c6df9bd",
+    "frontend/src/components/account/HeaderOverrideEditor.vue": "441d37eea75e85f8a972ebbbce569f7905a256895e17cb3b96efa7f03ddc0595",
+    "frontend/src/components/account/HeaderOverrideJsonTools.vue": "ccf9c71a8d8d02e2c7bfd7feb609884a8856641e5d0a1a1c183f71bcae52c079",
+    "frontend/src/components/account/ModelWhitelistSelector.vue": "9892225de476f40cc506065a9fc68f72b77335ace217f9de18b0cb63adb7a664",
+    "frontend/src/components/account/OAuthAuthorizationFlow.vue": "a39303543a5946b7c3debc391de880a455d360dc7948c751eb3a37e7dfb76fdd",
+    "frontend/src/components/account/OllamaCloudUsageCell.vue": "9fc62ee5e3eba565fcb094525e7b67b4ee1a48bcb81d6e20fbdd40b3537077c4",
+    "frontend/src/components/account/OllamaCloudUsageSettings.vue": "c73e70b56348992d29e675d61cac4143537a38e31f3e917439c08297305c371c",
+    "frontend/src/components/account/OpenAIQuotaResetCell.vue": "ed98de99863a744e869e8530fda2837d2329937de8b59b4de97b8f4e31c1119e",
+    "frontend/src/components/account/QuotaBadge.vue": "04471d04e522ec13cb404a3b82d2ac2f25ba8d79fcf02402fa5202951ffd8a0b",
+    "frontend/src/components/account/QuotaDimensionRow.vue": "b47883c437176afb17d58991e8c62c9b02cd59120992429d600f491bde274f69",
+    "frontend/src/components/account/QuotaLimitCard.vue": "14ba52b6ba7cf8f3d2c084f8f6433b90d763d30279334c3b8aad4d0b2f56f402",
+    "frontend/src/components/account/QuotaNotifyToggle.vue": "be0ecd00ed1b6982ff6a922e381b2de57b6d19f4f8bc79c304ab9e5ba699fadb",
+    "frontend/src/components/account/ReAuthAccountModal.vue": "e497aef9bf2220db5481a9dbab66929bbf60dfce0a194a079b86cc6aef747805",
+    "frontend/src/components/account/SyncFromCrsModal.vue": "badbfa9c6681f4882259b492aff84fa91aefe0caaff78d31acf6d6d475ad33be",
+    "frontend/src/components/account/TempUnschedStatusModal.vue": "98d42de06f5005059cc8aa3a8587aa0d1327a2bc88093fc2ff83ebfd52db3c50",
+    "frontend/src/components/account/UpstreamBillingRateCell.vue": "4be39a7ec0e2d947f8a40c44a564a80519f9a6071a286bcc1e406ad3f2c8be19",
+    "frontend/src/components/account/UpstreamRequestIdHeaderField.vue": "9bb9c77022d474c4360fb36be9cb90944977adc37a399d67b0e97ef024d3f65c",
+    "frontend/src/components/account/UsageProgressBar.vue": "fed81c8668dfdfa48c56fe0ac848cb53745a1326410e4da932cdfb967efce129",
+    "frontend/src/components/account/__tests__/AccountStatusIndicator.spec.ts": "f1bc076acf88eec89d288d3e2e91f1a511fc9f03c1651c2c4eb8e03fcdcfdf29",
+    "frontend/src/components/account/__tests__/AccountTestModal.spec.ts": "2003b4579d4712ce6aaa2afc2d9e21e74617d31b13ff8086f73dcf4b00cb4d02",
+    "frontend/src/components/account/__tests__/AccountUsageCell.spec.ts": "edd61491857c9f2b68d79531d68356008e47664f6eff10c94db5f85eaedf9e74",
+    "frontend/src/components/account/__tests__/BulkEditAccountModal.spec.ts": "2ce148db6267b71a7bea37741ce6bbf377a96f3d4443995c25241ddeddc54fe8",
+    "frontend/src/components/account/__tests__/CNProviderBalanceCell.spec.ts": "7637f4c9a7a8b9838a2178afb9f7fccafeda26ad672dcc3e0e23371181f74019",
+    "frontend/src/components/account/__tests__/CNProviderQuotaCell.spec.ts": "a80872acd7b3530805c54712cb2ca3cea563c0fe08f2608d72cb91d5669c21c2",
+    "frontend/src/components/account/__tests__/CreateAccountModal.grok.spec.ts": "1022dced7c6210565f2bfa145babd61e0f561ec9a3bae427a85b542a3ec7f93c",
+    "frontend/src/components/account/__tests__/CreateAccountModal.spec.ts": "08d470dffcc89a96512d8b187c73a9c12b0f3fc5a3df1a4787fd6eea48480d76",
+    "frontend/src/components/account/__tests__/EditAccountModal.antiDegrade.spec.ts": "c41ba29e0b3bed0b522d71639ac9f661330ea2f6055c598a1c3aa29339ce7fa0",
+    "frontend/src/components/account/__tests__/EditAccountModal.grokMediaEligibility.spec.ts": "fd35aa4fd25e6c8b13130aea7a84e19b704a031edbe1f513f50b0aebe71f27a6",
+    "frontend/src/components/account/__tests__/EditAccountModal.grokUpstream.spec.ts": "434b6d9eee1859eade7832643048aa0027149c30e4f16271820a61bb8162d74e",
+    "frontend/src/components/account/__tests__/EditAccountModal.spec.ts": "244a8ff995c63cb23d700465deacbb816bae6c3efa5c82a5a617a90cdf8b389b",
+    "frontend/src/components/account/__tests__/GrokQuotaProbeCell.spec.ts": "1fab222c27947d61131ee4392e1a4d21f84d333ae2f6c64436806d1db386c296",
+    "frontend/src/components/account/__tests__/ModelWhitelistSelector.spec.ts": "62af8e7d1b357c577558c7054df77f64d317f29d3b4f301bfcc9cdc39df1fd23",
+    "frontend/src/components/account/__tests__/OllamaCloudUsageCell.spec.ts": "a3932f62195a8250128d63fec9f88ed627315d1f71fdfcb20360918c65abedcc",
+    "frontend/src/components/account/__tests__/OllamaCloudUsageSettings.spec.ts": "839f0b758b16fb54af4212b5780e8d4637ef119e768cc957054c1a0936b5e05f",
+    "frontend/src/components/account/__tests__/OpenAIQuotaResetCell.spark_shadow.spec.ts": "427e3c273a2a77a050fc965724c371bbd9355a0308ba50d9e40fc1745132972c",
+    "frontend/src/components/account/__tests__/UpstreamBillingRateCell.spec.ts": "aabd0fab92d917e7554b271f73722be0e122b1a4c2e1ce91009342d191c2341b",
+    "frontend/src/components/account/__tests__/UpstreamRequestIdHeaderField.spec.ts": "cbfc766da7186ad035d198d22ae6ecc8b5fe74eafd74da4ec5b4d5bc828002ed",
+    "frontend/src/components/account/__tests__/UsageProgressBar.spec.ts": "08e45f3fac0a21d6ffe0a6c532f09b57b029510611dbe8a431851826635673a0",
+    "frontend/src/components/account/__tests__/accountExpiry.spec.ts": "d9618f81194d91dfc00fbc01026c7e639cac0a07341464023243f1b4df562d6e",
+    "frontend/src/components/account/__tests__/credentialsBuilder.cnAdaptive.spec.ts": "e0ea6176277a2693af8ce045a9b94414342b275e1007bf77042ebfba9515d4af",
+    "frontend/src/components/account/__tests__/credentialsBuilder.spec.ts": "ced881534ee6413a754979c8618c52b58d43eea6194f402e48e45bb1e404cf2c",
+    "frontend/src/components/account/__tests__/longContextBilling.spec.ts": "8acb2709bd732c420aeecad77c91f33b23950528d03f231a075e3ff0921dfa34",
+    "frontend/src/components/account/accountExpiry.ts": "2d69830737f5800d5f7cbd65e5ee5792fa14fde8d8f2071ee3e409261e11af2c",
+    "frontend/src/components/account/credentialsBuilder.ts": "7f6aeeedecb28200c18904d8929cc8e39d329dcbc68ac0f539f463bda1b92d44",
+    "frontend/src/components/account/index.ts": "bdae61e16420ad9175c3e6d9f09f5f19355f0b73a1a5a20cef7a64fb6648db6b",
+    "frontend/src/components/account/longContextBilling.ts": "acb34a4f24bc4748b38ff9e0156a6336a4b9b548f33524d33eeba5ba8a40f8e5",
+    "frontend/src/components/admin/AdminComplianceDialog.vue": "b8225eb802be256589570883c47b925470245b5a94f30f0c63830bcd7b9ba0bb",
+    "frontend/src/components/admin/ErrorPassthroughRulesModal.vue": "d614bf6bde99bff68382d55a26addd9a70490a7e137c61005ed4a9269cd7f02c",
+    "frontend/src/components/admin/TLSFingerprintProfilesModal.vue": "b0779c53e9f57fae3069c129179a2ea1422f9ee824a732e2fb1f203e7961e3a0",
+    "frontend/src/components/admin/account/AccountActionMenu.vue": "90f0dfee9d7cd8d5384db2ae210ff9cc208f731b8de9af1c0b1af33567aeb9be",
+    "frontend/src/components/admin/account/AccountBulkActionsBar.vue": "0e0a3217cb3b60561cb7d295e238c1b28b9f9103a8e0a78eec38de03e547d55a",
+    "frontend/src/components/admin/account/AccountStatsModal.vue": "c7d5e02a59f9437f1b68d6c4fe7e32ce42ac1f2886698f2107cddf24b4e1ea9b",
+    "frontend/src/components/admin/account/AccountTableActions.vue": "b3c931487fc4d6444d8b61bc721a7654de869ef37cce50cbc00d5f6711442df5",
+    "frontend/src/components/admin/account/AccountTableFilters.vue": "3906b6db023563296e0878bdabd2b5023ebac178a6de8a042b73e50d099c45fa",
+    "frontend/src/components/admin/account/AccountTestModal.vue": "9dbc1c7283d0e1735ad07e5894df6b838e600097937bbaa7d45846d86a1922d2",
+    "frontend/src/components/admin/account/ImportDataModal.vue": "597e37c95b4e55bd8361da50e8c0ff95362740fae56a2fab09555f81e266b892",
+    "frontend/src/components/admin/account/ReAuthAccountModal.vue": "cba9aad559ed45824764045615df392bfa3c7d86830bbcc07af1d48da3911b1f",
+    "frontend/src/components/admin/account/ScheduledTestsPanel.vue": "3d3d314f3c0b532b62352aa37f74f3638ddbdaccf9b1a069fcbfd3ff8629f9a5",
+    "frontend/src/components/admin/account/__tests__/AccountActionMenu.position.spec.ts": "1f2215ec3433c5ec19a5358ef834efb52d772122f332678e90074b371e7a68ba",
+    "frontend/src/components/admin/account/__tests__/AccountActionMenu.spark_shadow.spec.ts": "f191b6773782611cfaf7b58dfc8fd48d0cf0845e0a46f512bcfc23f46c0d91c5",
+    "frontend/src/components/admin/account/__tests__/AccountBulkActionsBar.spec.ts": "b534f7ac366854d26abc15c1835731ce94485583b59ae749ab9863ac48f57349",
+    "frontend/src/components/admin/account/__tests__/AccountTestModal.spec.ts": "dfb31a48bb6f72a4a03c40a38de521fe1f1642904220749292a8497d74a77d7a",
+    "frontend/src/components/admin/account/__tests__/ReAuthAccountModal.grok.spec.ts": "a0aba5bd0e273ec2d7b524194d89b50fac6ddf7086271b126e17ce8c10d32f00",
+    "frontend/src/components/admin/announcements/AnnouncementReadStatusDialog.vue": "6731e65431c9e95443ca7b2a923ce12df8d82e7c264c8bfeda552d6c2b470ca5",
+    "frontend/src/components/admin/announcements/AnnouncementTargetingEditor.vue": "1b59b3cf3cfbd3412f2f9dcc5045fc555235c683e64fd015d7ec393c7c945458",
+    "frontend/src/components/admin/announcements/__tests__/AnnouncementReadStatusDialog.spec.ts": "adea203ff11344fb5de4f095ad65834858ddcee2a7c338a9517e5322580580b3",
+    "frontend/src/components/admin/channel/IntervalRow.vue": "bfcb79a3a866000010a10273df120318026a1933900533d80e6e179f2ba7244f",
+    "frontend/src/components/admin/channel/ModelTagInput.vue": "37c302b4c6485588917c070acaf9163c0ca41d7c3d8afdcdeda83b463a32387e",
+    "frontend/src/components/admin/channel/PricingEntryCard.vue": "9fc577fb064231d6a914edc028573e33da54f49fdea3d4f03e3b5fe879c9aa8e",
+    "frontend/src/components/admin/channel/TimePricingSection.vue": "9e881997dfcb8bb2d63e812f860b1ddd8453b7c2cb8ce4bd48220820a84cd0b6",
+    "frontend/src/components/admin/channel/__tests__/PricingEntryCard.timePricing.spec.ts": "27bee70b25efe7cd9809d28a4f818a174d019aba97ba8d56e7b09ec601e83044",
+    "frontend/src/components/admin/channel/__tests__/TimePricingSection.spec.ts": "8e01b3b2e0bd6b418149c005151360ffdf081ed691b19356e64710cc2869b87d",
+    "frontend/src/components/admin/channel/__tests__/types.spec.ts": "110b53d0469286be260abe06f59c265729aed09b824f0003b8f94fad2105cd8b",
+    "frontend/src/components/admin/channel/types.ts": "8cfdad49bc50cd4c251f0c676628dd57e46eacd29d3cfa464ba01bd8b2074186",
+    "frontend/src/components/admin/group/CodexManifestAccountsField.vue": "bf64832d07e8bda994d0bb5bdc7c9aae03e11893c17b5fc9a3abc2c1bee987e1",
+    "frontend/src/components/admin/group/GroupRPMOverridesModal.vue": "938057a8736bd039cc75697fa0e835b395743f0d22d9ae16b39b08d1388abce3",
+    "frontend/src/components/admin/group/GroupRateMultipliersModal.vue": "c7be1c15ffd8d384a70b73a69d4aaf4c25c22d5e26541664669f26cbbf057eea",
+    "frontend/src/components/admin/group/ReasoningEffortPolicyFields.vue": "b3fabd990411736f9df794acdc3b6413d5cf7034d9f6363a272c4222a05507e1",
+    "frontend/src/components/admin/group/__tests__/CodexManifestAccountsField.spec.ts": "16c8022ed38c896ad6d0ce851c8793c58050d6b839a04566d11f3c70c9684f3d",
+    "frontend/src/components/admin/group/__tests__/ReasoningEffortPolicyFields.spec.ts": "c10bc1557a3819753b9cae59329cceeb58861b5ac6279f979f296b1d56e77715",
+    "frontend/src/components/admin/monitor/MonitorActionsCell.spec.ts": "e99a458fba4e6ce612758875a772b1514664b6a3403ad3c0fe179303985c49d0",
+    "frontend/src/components/admin/monitor/MonitorActionsCell.vue": "ae1751e927ed93445e711e98297def4ec6e08dcccb0dab9ac387cda25b8b29e9",
+    "frontend/src/components/admin/monitor/MonitorAdvancedRequestConfig.vue": "e8d3dd1177098dc6b4485ba15a73c71e4617b6e8aa2db6895850d07f4a21fecb",
+    "frontend/src/components/admin/monitor/MonitorFiltersBar.vue": "1c75d8268086414c4be55ff061387d9a50c5968d44e1df6a0f69a90b93dc9c3c",
+    "frontend/src/components/admin/monitor/MonitorFormDialog.vue": "86c926263c21389c11e639ec11e23f46e2d11565e04a4d61ac5a2287a7736086",
+    "frontend/src/components/admin/monitor/MonitorKeyPickerDialog.vue": "e556ff444c61c4aa4ee662fb941af9457579768cf708f0f87c1e33ea23f8b37d",
+    "frontend/src/components/admin/monitor/MonitorPrimaryModelCell.vue": "c6e66337bbcbaae2499bfa61a4e3a1e2c27897e8493ede5959122e4af47f1363",
+    "frontend/src/components/admin/monitor/MonitorRunResultDialog.vue": "76f5d0534b628ccc65a5d1064afc78eb1226b10b610037cb7742dde5a7ef4cc1",
+    "frontend/src/components/admin/monitor/MonitorTemplateApplyPickerDialog.vue": "8413ab48d7927f6a29bd00bcaba8eb8e85753a810ef19e61eaf5cef93484cecf",
+    "frontend/src/components/admin/monitor/MonitorTemplateManagerDialog.vue": "615bc85f5fa5334344704bdef5109b571e6eda22a5dcc2c66325f65166cc5a25",
+    "frontend/src/components/admin/monitor/__tests__/MonitorPrimaryModelCell.spec.ts": "206baca858971690a08b62d9a34efcd234f50cfc2e15a525228ef89626d3296a",
+    "frontend/src/components/admin/payment/AdminOrderDetail.vue": "d69569639a22a58705dc54fe398da74d82f5134ca652b8dac17c8c71bc61be01",
+    "frontend/src/components/admin/payment/AdminOrderTable.vue": "d9251b61856eaba632c8b018804c17f7a404a97dc28af8b13c5516786538d1b5",
+    "frontend/src/components/admin/payment/AdminRefundDialog.vue": "58e41cf50c698a88c88255c07d87e53f6ae1e62417cbe76450615c2106821a63",
+    "frontend/src/components/admin/payment/DailyRevenueChart.vue": "34737b69321ee62b1d489565c0c326ce526f97823ad8c26fc6e1ce1b46ea777e",
+    "frontend/src/components/admin/payment/OrderStatsCards.vue": "8eafc1a449a2ab3a0b31eb003a41bff50468b0e84e05f47b6f3a6e99162ec9a7",
+    "frontend/src/components/admin/payment/PaymentMethodChart.vue": "43781862aef7ce1da18e5e14fa4cd90121416ab60e52869ace80afd25b0cde6d",
+    "frontend/src/components/admin/payment/TopUsersLeaderboard.vue": "125a5f6ac71ef3cffb4371b62de2778c440c51615fc95da12d8d6ccf9f963356",
+    "frontend/src/components/admin/payment/__tests__/orderCurrencyDisplay.spec.ts": "f89bb9f3d8ac577425a8ab6762ef7621b04bb23eeb15ca34855207b0ba03d3de",
+    "frontend/src/components/admin/proxy/ImportDataModal.vue": "f0565080af3cde34d1b4176dac5ed63c514966fdde75e7b51eea7a89bfa6df53",
+    "frontend/src/components/admin/usage/UsageCleanupDialog.vue": "52bc5df824eb5768a4231f8e6d95873f227ba50787436b5849f577d7c0dc0432",
+    "frontend/src/components/admin/usage/UsageExportProgress.vue": "d32c36ed39f7e7eca52f7897032c02db3f9ae9a567997f4a0f258f51181a3b27",
+    "frontend/src/components/admin/usage/UsageFilters.vue": "6f6eebb31ec419f735412b95df953eb5078d97220f13d6a35bd985012be9daf0",
+    "frontend/src/components/admin/usage/UsageStatsCards.vue": "f46dbf067cfbbdd216a27729ac6854f858953fcc0e84440f32864343a6c1b78f",
+    "frontend/src/components/admin/usage/UsageTable.vue": "d3484e21e7a118880ddf2ad7fb657ea66e311df0f178a2a4d88896b822898b26",
+    "frontend/src/components/admin/usage/UserTokenRanking.vue": "ef6917bf1c9e3efdaad291e0336cc49d3e51830b2d2a4c2a2c8af6c682e2b4af",
+    "frontend/src/components/admin/usage/__tests__/UsageFilters.spec.ts": "402c336b339a70213ef120bca474f563b6e6d8c0b537bf133418cbe5dfab3201",
+    "frontend/src/components/admin/usage/__tests__/UsageStatsCards.spec.ts": "7a10276bb5d02e8b0fd1a06f3c7ba66e6330bac93da8197acb87430669c7b916",
+    "frontend/src/components/admin/usage/__tests__/UsageTable.spec.ts": "27bb570ab686cd5c629021eae48a6a35c74d7c7f34dbccc0ba78dcd769d7c2ae",
+    "frontend/src/components/admin/usage/__tests__/UserTokenRanking.spec.ts": "26ce29cfcf07315999f462aaf94f1ad88c850f794e3a6b16d2bacbb5b8786eb0",
+    "frontend/src/components/admin/user/BulkEditUserModal.vue": "a05001970c8ca21cce103a229a93954393360c8d8dad8e1f8d12deb6f819b8a0",
+    "frontend/src/components/admin/user/GroupReplaceModal.vue": "6c0f8d63d5c238e6f22d2a102b10ddbf2c9e6ed173621356ef882ec8f1b3d6fb",
+    "frontend/src/components/admin/user/UserAllowedGroupsModal.vue": "109dbd71c45f4048e30fd73b9adb8dcf5886dc1de521971669225104a7cbc5ee",
+    "frontend/src/components/admin/user/UserApiKeysModal.vue": "5e740f3717620ff8781b355798f934cc60fab027301332f4701b9c1cf78dde9f",
+    "frontend/src/components/admin/user/UserBalanceHistoryModal.vue": "99e3d6c71d7238c244ef1d0942f41b0d22ecd0007b2248819a02d913a241a687",
+    "frontend/src/components/admin/user/UserBalanceModal.vue": "e89b63dee569931da1a8db7a1c5be69cf41aa74dd5338e506f7680d7b6347f6a",
+    "frontend/src/components/admin/user/UserCreateModal.vue": "5d8b4a2a5c42bc6c61c6ede2cfd6e313234faca0727656b5211d87ff13968f81",
+    "frontend/src/components/admin/user/UserEditModal.vue": "05d32f5d135bb7d7920f0a199b54926a6feb222507638a61fae2d5962caa706c",
+    "frontend/src/components/admin/user/UserPlatformQuotaModal.vue": "c67dbc205228f0ef4d4fad3625ca5bd16feb3c08e020307699c7eca7817ec08c",
+    "frontend/src/components/admin/user/__tests__/BulkEditUserModal.spec.ts": "daadfe96f14be5b74223d25fb29a4909b9439fe3fddc3ab1210fa942b2bde027",
+    "frontend/src/components/admin/user/__tests__/UserEditModal.spec.ts": "2e95b37cfb50967a033069fd23f515c837a89faa85254619d0072013be96e516",
+    "frontend/src/components/admin/user/__tests__/UserPlatformQuotaModal.spec.ts": "04ba24665864ac53d340612094969ed571ec98c071d6ff328adc310be4193be7",
+    "frontend/src/components/auth/DingTalkOAuthSection.vue": "2103013059012a3d89d98812f5ad5ee77e80a45b97a60a30d8f535d77538acaa",
+    "frontend/src/components/auth/EmailOAuthButtons.vue": "642fbccf198dd976633630f59b68890ce5091033c437dee99e6e617fd7cf14d7",
+    "frontend/src/components/auth/GitHubMark.vue": "d347446252668a97480c450f6b72b2ed5e947a8f5f7ad7d23d14e99505f2f919",
+    "frontend/src/components/auth/GoogleMark.vue": "af5967835c160e1ef9f7a5e87a0eca5a36802e0b2fba07ac95a61fd376b2a043",
+    "frontend/src/components/auth/LinuxDoOAuthSection.vue": "e96cf8089652fd6ee1a1150826179107728ef8800eebe986a3a14be037dd246b",
+    "frontend/src/components/auth/LoginAgreementPrompt.vue": "141dd16df938db880d76debd7ded39b00a48853dd99b1abd2216c023901d499b",
+    "frontend/src/components/auth/OidcOAuthSection.vue": "2a0a4d6a9bcb6a2f9eb316338917b0c75f9745d2080b0674badcfac60327818e",
+    "frontend/src/components/auth/PendingOAuthCreateAccountForm.vue": "e9afbe6bc64552087c255a9ec27ab9b587ce18d04400e33d5d6535f8126cc4f0",
+    "frontend/src/components/auth/TotpLoginModal.vue": "1a3868975e62a1f87726c5d7dca17ba6770401752b34ca60182921b33215cb33",
+    "frontend/src/components/auth/TotpStepUpDialog.vue": "979c73854b62c1c694fa49c9663849291427901f947f268be3e61200f0501ec4",
+    "frontend/src/components/auth/WechatOAuthSection.vue": "dea13586efe638ce3652931ea04c1b73783902260c5cb7ac8f8a3cc47c492a21",
+    "frontend/src/components/auth/__tests__/EmailOAuthButtons.spec.ts": "13ad6f1a4fb772c1fe9fdda3295fceb07f6753569d98e1a2d3c7167e132a001a",
+    "frontend/src/components/auth/__tests__/OAuthLoginSections.spec.ts": "dd93375f478e1d2d766193736564354ed126d238c6324392108b4c13bd3d91ce",
+    "frontend/src/components/auth/__tests__/PendingOAuthCreateAccountForm.spec.ts": "4b82145857ac284cfa766c103d054afcada4cbb1ab4e99da4fc9a1132c660edb",
+    "frontend/src/components/auth/__tests__/TotpLoginModal.spec.ts": "a3c37fb8c3d7a97cf192db08a8f4d831406531e13c2767900a4b1dd212f4a825",
+    "frontend/src/components/auth/__tests__/WechatOAuthSection.spec.ts": "6888969f18a6c76e6f8ad944a59d642a95413d008d1c48d7f9e85fb92a2fb8a5",
+    "frontend/src/components/channels/AvailableChannelsTable.vue": "9a80d572e4dbcd0120166577dffc15fce28dfc9cf6c8f15d73dbb3254647686b",
+    "frontend/src/components/channels/PricingRow.vue": "dfad9fc71e9319858b04f88f1cd0a167d55710141d81cd6a129c814d0b700230",
+    "frontend/src/components/channels/SupportedModelChip.vue": "11268be3e3ea00193818c471f46945a235f45cfe5343e63a3ff55c25ff626e60",
+    "frontend/src/components/channels/__tests__/AvailableChannelsTable.spec.ts": "e7de28c4245f735c5704febc22a783a1997721e60f49130b7aad5f885f16a024",
+    "frontend/src/components/channels/__tests__/SupportedModelChip.spec.ts": "72a1994ed2867c61179494fa29459f85223c441321ca8695cb1148a6fb6eb6f9",
+    "frontend/src/components/charts/EndpointDistributionChart.vue": "24b19e99f2e014c66b9b2c1ecee6a3269c3f294cfee577260be4b319f6e64d3c",
+    "frontend/src/components/charts/GroupDistributionChart.vue": "6211d7baef977986759c95882a9b92cca5b7d6c756dc255567f012ea8561b421",
+    "frontend/src/components/charts/ModelDistributionChart.vue": "fd5c40db2f703a33a31d8ed6f44f4b1c65200c293c55cfc150c5c03de58ddc2c",
+    "frontend/src/components/charts/TokenUsageTrend.vue": "a91d9d2d84304197dbe221074528548ad3aabc27263c81b0a04b184a668563b8",
+    "frontend/src/components/charts/UserBreakdownSubTable.vue": "48e56a2ffd415f79e97af8955ac9b24c0dbc2e2736b6c9d367880415820a6d89",
+    "frontend/src/components/charts/__tests__/GroupDistributionChart.spec.ts": "621f4636a59c792d52c55500deb6437e304b1bf5efea4a6a506b925fc3b6c3ce",
+    "frontend/src/components/charts/__tests__/ModelDistributionChart.spec.ts": "5cdda3a9b41676d1b3e101715b06a58fdefa44f51842e8429da4ff80cf23f24f",
+    "frontend/src/components/charts/__tests__/TokenUsageTrend.spec.ts": "eefd1c5dda1bd24045aa7499cea329d3ecc06b8659b2844bb36ddbf63bec68ed",
+    "frontend/src/components/common/AnnouncementBell.vue": "54b32bc87688bff7129bc6eca0bc32108c39d058166d7f1d28db8dbccf1f9054",
+    "frontend/src/components/common/AnnouncementPopup.vue": "aff5ccd3088e6f0f1196c9628fbcd8bd6b61b58bf1c9560ef2e027ca5a37c461",
+    "frontend/src/components/common/AutoRefreshButton.vue": "7104bf3dafacfc49e2b68a0b140d7fb7f6259db36aa970ef833a33be0473bfc8",
+    "frontend/src/components/common/BaseDialog.vue": "3ff4c131d64af7212255128543bebef2c4e687cc2ebf042e166e73a132379622",
+    "frontend/src/components/common/ConfirmDialog.vue": "386ea52b4a7f5938973ca1a79d85d6a568961f5717b7b7f004197125f7820cb2",
+    "frontend/src/components/common/DataTable.vue": "bd33d8d20e5d3171225ad19e49125c5cdb612b4f6b68e2323b394ff07fc5b454",
+    "frontend/src/components/common/DateRangePicker.vue": "ed6ad259a79cef35409dc2d14aa5b04dda2361ec13201ccbe405317f340624ec",
+    "frontend/src/components/common/EmptyState.vue": "62c2d8ad26c761ba9b13b2564c31667c739738b35d06c4759bae11c9ffbdf01c",
+    "frontend/src/components/common/ExportProgressDialog.vue": "284a5e42876c44a609ec34148a466ea5ab4bee0fd39f32df13227043e8a460a7",
+    "frontend/src/components/common/GrokFreeIcon.vue": "607c45c159f9ef8de433c7a5bfbe8be943a59bb96d196e8f6b460f8161a0a52c",
+    "frontend/src/components/common/GroupBadge.vue": "5d9a959abe373df29668aeb746d95dcf9885c573594d7a5a42e7e4ffb339c7e1",
+    "frontend/src/components/common/GroupCapacityBadge.vue": "d6f7f534722e76120dfd6ab6fcd71a1c1f92d56aeead195573ea7265ce5227c8",
+    "frontend/src/components/common/GroupOptionItem.vue": "d061920762ca4697920f82bec7c5aabb8ac15665533ca1feca3a588dbaef08a7",
+    "frontend/src/components/common/GroupSelector.vue": "bacf8c0ab3f9d0de357faba9db492dd3d31ad29fc27e23ca2f034f0c15fb0c9a",
+    "frontend/src/components/common/HelpTooltip.vue": "83f7f4fac8cb90e25d400a7fa1387d086328429529c5f569439fae2d77f3621b",
+    "frontend/src/components/common/ImageUpload.vue": "ca69565605ac861952bc850cf39d59fb75626ae4b444d86cfd61abc1db7d032a",
+    "frontend/src/components/common/Input.vue": "9fbfd07e6b62f6bdb50fec1078eefccd0a6f0527e390f9c4280d5b51b3defd7f",
+    "frontend/src/components/common/IpGeoBatchToolbar.vue": "c0d48a53f0020767f89bb7b079f37dcc1b6514d1bba9bec4941381905ebf6d04",
+    "frontend/src/components/common/IpGeoCell.vue": "433dcb9701bcac738e9038907e983851e6e5dfe1e17483ec478fb5ddbb65fe43",
+    "frontend/src/components/common/LoadingSpinner.vue": "4303abcdcecf0dd74e9da09c40e27e5ca05fce4c3af9a05120ed8a6913dc8642",
+    "frontend/src/components/common/LocaleSwitcher.vue": "1859c93a6498f047170153c54f9f5559c1223b2cb5d2a51a663c4ec911855766",
+    "frontend/src/components/common/ModelIcon.vue": "09ae604e3aed3c6a2e62dcfaaa1f38ad6b9176adac9fa3a9e390bed2d4246dd7",
+    "frontend/src/components/common/MonitorQuotaView.vue": "609c34a4179981150df808f48de9af4f41d503aaa0adeb32bdc5c61819ecf2dd",
+    "frontend/src/components/common/NavigationProgress.vue": "c22f86591a4846e4cef6b49bab03af05b16a7442ce7b8969025115b3e76de020",
+    "frontend/src/components/common/Pagination.vue": "77b7be4e9e3fd41ab7e05b2d78d895d554c1a6f449c09ea64a53e6be202c9d7b",
+    "frontend/src/components/common/PlatformIcon.vue": "c803fc33cbdaa94100a6b7681a74f547cbd9e6f1bc7e158332e44640a2b2de4c",
+    "frontend/src/components/common/PlatformTypeBadge.vue": "6e46f74a6ff24261e318e5fb68912d851162bcd178cfb35c45e8c96acf8281ac",
+    "frontend/src/components/common/ProxyAdBanner.vue": "7b29817f8bec825c311f5f0de3a7b49f9e527dd6ac579e584d2564e5921afc17",
+    "frontend/src/components/common/ProxySelector.vue": "c94eeb6a141dade2eb4fa02c05e22500d658a9a4681a37480208b6bd369cfb83",
+    "frontend/src/components/common/README.md": "c3fee3223c1effb52bc6b497f6f324505419e18a5bbf1b88d610bd3b39db6557",
+    "frontend/src/components/common/SearchInput.vue": "ff9c87a64fe30bd67512cd27ae35b16774f84fc455ff53f7abaa4030164a1475",
+    "frontend/src/components/common/Select.vue": "9a33da09e87610d22a3b0a87621a693824995482f3962046312777e4dc5f43db",
+    "frontend/src/components/common/Skeleton.vue": "165a5f0a326c21eda0eb2fe14a4400589ec4398179b6ebaf41e4761e92605008",
+    "frontend/src/components/common/StatCard.vue": "471b4096fc72c4ed7d85798f48d7c7c52bacde66b0e10e6d2e43dcfbbb55afaf",
+    "frontend/src/components/common/StatusBadge.vue": "ae8c63b47b035a29d4771c2ec902b3d2ef1070246cb1de7b294053fa32dc0fda",
+    "frontend/src/components/common/SubscriptionProgressMini.vue": "e7724a7c3fc1843e1f30360a34daae983b1d1035df2d5391c56454e861a53840",
+    "frontend/src/components/common/TextArea.vue": "bf5a2676a73dd3d0453c1b875119956d57c9e4d14e72b1c55c6317b8139a2076",
+    "frontend/src/components/common/Toast.vue": "618ac161e9fc80f1ef62df1c7e5c2834239d4001072d25ddb9282b12eea4f387",
+    "frontend/src/components/common/Toggle.vue": "be2597b673b44d42370e8883e56e9ae4cae5ed1fd28147dcc8ea1c1c0ab4f2e9",
+    "frontend/src/components/common/VersionBadge.vue": "965e706812bd652f353ea6a411f3653b21bfd723658f88bee8c753c8b5568ccd",
+    "frontend/src/components/common/__tests__/AnnouncementPopup.spec.ts": "6429b879ecb489a640cbc4a3572a9a5a0d9f917f21734bcb5de0307cb8678318",
+    "frontend/src/components/common/__tests__/BaseDialog.spec.ts": "ead4985c007317c88e96fa3620c83102d9672a5f9a784d3441b33529ea98ca80",
+    "frontend/src/components/common/__tests__/DataTable.spec.ts": "db6fe1127bee3099dcfd51d13971b9b58208682aacd60d73c334e3663c126c2d",
+    "frontend/src/components/common/__tests__/DateRangePicker.spec.ts": "da642d495d203868f96522ef19f01d5e688cf904593e66089edc43772433a9f6",
+    "frontend/src/components/common/__tests__/GroupOptionItem.spec.ts": "7e390841f542c68958cca7a399ebd0db2733970d5a7b0562d57a3a5daf594d6f",
+    "frontend/src/components/common/__tests__/GroupSelector.spec.ts": "0df37f7ca5f510c2242f6d1647f75d385b04c4acc75e83f3925a4fbaac34c0b8",
+    "frontend/src/components/common/__tests__/HelpTooltip.spec.ts": "a8a8be2e1a36d60d261d02bd77c3ca7340cac839b6cb02f373f495f38a8ba0b5",
+    "frontend/src/components/common/__tests__/IpGeoCell.spec.ts": "109f093c60f5c949c3c446b37108956a1d5a0d5736ba1338aed8b553a1652458",
+    "frontend/src/components/common/__tests__/MonitorQuotaView.spec.ts": "960b978cfa59c15b6a2cb47853e8615b50d0ded18181d2318998df6060505518",
+    "frontend/src/components/common/__tests__/NavigationProgress.spec.ts": "2430c91549a1f17e9e1e68ac7ee250325a23f22b9bb2a77c245e4b765d4733b0",
+    "frontend/src/components/common/__tests__/PlatformTypeBadge.grok.spec.ts": "3f8cceb95d7094efe73c57cc4d0e049d16c6b35cff92ee6afcbf1e3400204c30",
+    "frontend/src/components/common/__tests__/Select.spec.ts": "4512fa6ab673928ba857f0e00ef654811397410ffa9c5dc43d55ba6fa672668e",
+    "frontend/src/components/common/index.ts": "d8d1c7c1e99cc3998de4b84d685cd496a1e28493ed726128dc1df785b9465ce6",
+    "frontend/src/components/common/types.ts": "258b23dec180e6f647ed5cf0ef02ede9b28c1c25e4eff94efec26c71dc2686c6",
+    "frontend/src/components/icons/Icon.vue": "1879d82804766ca5c6e06b869b8dd8e6dcd73e701a5b5b2d0cba625b9e10adf7",
+    "frontend/src/components/icons/index.ts": "55b412b40ab66b3db716879d22f5afcc696e0e3b0385f5aac4cbfc70df1cc7c7",
+    "frontend/src/components/keys/EndpointPopover.vue": "de3d9f430293c56ca55f5119ea3a59c4e290cb98e7626346d2ba5a2c30f02338",
+    "frontend/src/components/keys/UseKeyModal.vue": "0c34295882f943322d3782679aef7f9b89028e794d9a2613aeedc1054a36e5a9",
+    "frontend/src/components/keys/__tests__/EndpointPopover.spec.ts": "e469f1e3bd036d67165e211c1602da696f1d05d9b9f9274c50d4bb76f145b251",
+    "frontend/src/components/keys/__tests__/UseKeyModal.spec.ts": "1897ec55e088a7e8dd7fc5c6d00d3a3a5aaed54a641aec9b053f91392a607887",
+    "frontend/src/components/layout/AppHeader.vue": "0d9bbeff80ff9c899e632346a194f9fcfa2e55055fdc4a0c87149c143a7f9dad",
+    "frontend/src/components/layout/AppLayout.vue": "490b835c2b637e74daab274c632f43dae908bc18636f0bc2b2a612618f96b86b",
+    "frontend/src/components/layout/AppSidebar.vue": "1ec556f8bc89b5b1a5db3b1e62dc879c4425f252e29bde76b9cb8db7ea025f1d",
+    "frontend/src/components/layout/AuthLayout.vue": "a3efbab68a1f4b0e4ed0b66317d87f5406f4cc8686a6642654e8e3d9972388bf",
+    "frontend/src/components/layout/EXAMPLES.md": "c858401eae62128ec7d50e5d9fdcf3dc1b48484fb47f594d63e7ec54751d2bd6",
+    "frontend/src/components/layout/INTEGRATION.md": "a02b2b0aff547d5e0e55643593299f9e9955826509ad38860286d859f2d72e82",
+    "frontend/src/components/layout/README.md": "a69e463d5cf6d449bc088cedc08e294d873cc7a25f1f1e0f311722f35c0ce27f",
+    "frontend/src/components/layout/TablePageLayout.vue": "b7780cccf38a2de2197253cbfd7b3d83e0d3afc95538430a2c8f9006ce79cca9",
+    "frontend/src/components/layout/__tests__/AppSidebar.spec.ts": "15ed79d8481d0de488552b13b1f81b6a8094f82233093963a176ffeadc644b3d",
+    "frontend/src/components/layout/__tests__/TablePageLayout.spec.ts": "e0c27aee0325c4a18516fe92940716168b30cd0fb942deea0b167c90ae8b1ca8",
+    "frontend/src/components/layout/__tests__/docUrlSanitization.spec.ts": "c67c6bfcf1750de3aec78353d3d913af9f3f7edb4d91af34ce4388c47d3ae1e9",
+    "frontend/src/components/layout/__tests__/siteLogoSanitization.spec.ts": "ffa4fe56216352495301a15b8e29882aa06dbcf40d735027f7e1e5094c8de94f",
+    "frontend/src/components/layout/index.ts": "67c73679115680a3568949d9c3e53a3753bd9b0633ecd4acf46384773e35719a",
+    "frontend/src/components/modelPlaza/ModelPlazaContent.vue": "c34c513f8ae322f6ef03bf58185314c2007cdf1c3589edc3024e4b40919f970e",
+    "frontend/src/components/modelPlaza/PlazaFilterBar.vue": "373af112977fb2f66987a4031c6690c6950619729f5ba97b5b74820dd402770c",
+    "frontend/src/components/modelPlaza/PlazaGroupSection.vue": "a3c44b1840de5f98fd92eddbd57522472dfdcffbe211176e3752e3681b78a426",
+    "frontend/src/components/modelPlaza/PlazaModelPricingTable.vue": "b0c0d584acb78b4c85bffeb465bcd72635d068a3aba7a8e97641d81633923a30",
+    "frontend/src/components/modelPlaza/PlazaNavBar.vue": "022e4fd01b2ec38e8509777cc188cc4015e48aa256fbde790458eaf8d18425ae",
+    "frontend/src/components/modelPlaza/__tests__/PlazaGroupSection.spec.ts": "3dee2e42bc4a35f4a33d33086042f4efbe57693e6896fffa727037be7ac36286",
+    "frontend/src/components/modelPlaza/__tests__/PlazaModelPricingTable.spec.ts": "55c94509f281cf6995c81288d1d5cda03016db50425a7065a1dfd4c290e01142",
+    "frontend/src/components/payment/AmountInput.vue": "911971c4f12cb1ef3b0eb00a8e02340500f0cae5fbba1e0a6287101585276193",
+    "frontend/src/components/payment/OrderStatusBadge.vue": "ec77eab6ec9946d261f030eac9d4b124e0fc4582cbb15b9d7279c6e2e82f7465",
+    "frontend/src/components/payment/OrderTable.vue": "3ccc6489b2fff589e21fabbf6239223969368b4d30ed6ad26cf45bad38fb490d",
+    "frontend/src/components/payment/PaymentMethodSelector.vue": "0373d3de527e9feb775baa7909f6151917a8b95fe64612fd2864ce49ff9627dd",
+    "frontend/src/components/payment/PaymentProviderDialog.vue": "0ee03a63e23264a5aeae9d33331ec36120a886343085a6a0023db1c49e60bd50",
+    "frontend/src/components/payment/PaymentProviderList.vue": "ec34ebfb6d696284ef6dd913e3c9b2f52fc77e1f6679f06126f4fdf5f8402f97",
+    "frontend/src/components/payment/PaymentQRDialog.vue": "7bb38a1cb51a4ebda396f1a1c35f9430f31d0c8c1d81346f4421a69e4f847b20",
+    "frontend/src/components/payment/PaymentStatusPanel.vue": "21661eeb1f5d67cfd53e814da4575084583a44ca0a9c967a25f9b1184ad48d6c",
+    "frontend/src/components/payment/ProviderCard.vue": "5a794ab187b3ac1b7b0f77420448113885bdf32cbfa69125d73d9085412d54cd",
+    "frontend/src/components/payment/StripePaymentInline.vue": "58f8f57061f98ae11bc5e549be0764f2ab6298fe7e6f9708efe5ef62e32768b3",
+    "frontend/src/components/payment/SubscriptionPlanCard.vue": "ad54269a1ce6fe0ff17ce8dc61beb449ab99dafcd303cba07ec98f04075eb902",
+    "frontend/src/components/payment/ToggleSwitch.vue": "c3a50a77be169a109b54a8a9b24e29c8d77daff54fe6d2a6e296a19520069d58",
+    "frontend/src/components/payment/__tests__/PaymentMethodSelector.spec.ts": "dc62851afd5e7744dc85d5e159fe40f2f32cbadcdeccc931ffd4b203897009b0",
+    "frontend/src/components/payment/__tests__/PaymentProviderDialog.spec.ts": "9ab565f24fc82f4684a1d78420c90956ab0493be8a30cee75bb7a6b1e2587b2b",
+    "frontend/src/components/payment/__tests__/PaymentQRDialog.spec.ts": "970da62bf869cb9b193cad353271ad37eea4c265fd71d621edd1e8801c853e9b",
+    "frontend/src/components/payment/__tests__/PaymentStatusPanel.spec.ts": "e698d2068bd61a358d3310a3a7446e187d486c2fc62d14f2e86fb4ae5ea53770",
+    "frontend/src/components/payment/__tests__/SubscriptionPlanCard.spec.ts": "ccf954764cd27910173c85d6ffe36fb147bdf9bc78477fadddd99e7bed3029a6",
+    "frontend/src/components/payment/__tests__/alipayDeepLink.spec.ts": "574edce8e54eeff06bc96dbfd89ac8ccbc537bc681f998f704508ce03d5c6a98",
+    "frontend/src/components/payment/__tests__/currency.spec.ts": "7168d75c7cbccafc011aa9d9a0e4636194ec2e76d54bd3cc2bacaaecffbb63fb",
+    "frontend/src/components/payment/__tests__/paymentFlow.spec.ts": "c21988bde375303b36d7981c5aa4df9f6e75319662dd54b3a05bec76e35d884a",
+    "frontend/src/components/payment/__tests__/providerConfig.spec.ts": "c2711394b8a3bb0ca0489d102d8d50e4d228266d5acf1df5c1b0ca68b020a4a6",
+    "frontend/src/components/payment/__tests__/validity.spec.ts": "66a024946b13c1662b6fc95eefd0c9d897cd1494851731ab3c1ed4bf9b964519",
+    "frontend/src/components/payment/alipayDeepLink.ts": "38f78a8a1ba8dcfed4ef5cc31573a010a8d82e8f57da0878271f32691db1ce3c",
+    "frontend/src/components/payment/currency.ts": "c63b12e020643144adfc97b89b793c7c3588bce4f16c9547a2e813349c4bea5b",
+    "frontend/src/components/payment/orderUtils.ts": "ea12bc98af0e1af65b0a7567d4681cb9db29734724221954dae61eef89d0cb74",
+    "frontend/src/components/payment/paymentFlow.ts": "02cf90df56471428d6141eebddc0fa6f7fd050d05bc045d39d21c271d9243dc6",
+    "frontend/src/components/payment/providerConfig.ts": "374e62f504b504dfa1273aab563bcdc2a69f272cbc6269a7a868bde48d0ac428",
+    "frontend/src/components/payment/validity.ts": "a2060a228f2c2e61ad41f94798a0bca41b2efad2641ecfdab3312f3beb456184",
+    "frontend/src/components/relay/RelayBrand.vue": "f84812e6c2f2f356b86bbffc996f879fc1bed781430b2c6693a0675ada599678",
+    "frontend/src/components/relay/RelayQuickStart.vue": "e1acf3e6a1870654424947fb51d84027e18436cd095f1c17e8be526388b37be5",
+    "frontend/src/components/user/MonitorDetailDialog.vue": "3dc0a48f875c26e69d3b57270f1f556c925c0421f5713e80676c5b62250f46a6",
+    "frontend/src/components/user/PlatformCostCell.vue": "b700c15f4739fcfac8b4fe05f39a0734bba3e73c61253d4b3c6aa887441083fc",
+    "frontend/src/components/user/PlatformUsageBreakdown.vue": "347e274c1137ba952b7cec41b338586392e109de075737b7c07653727adc2222",
+    "frontend/src/components/user/UserAttributeForm.vue": "7990db119e99a109a75db2e6c803dae41b2f954a47543033b7f7d71db60ff5a4",
+    "frontend/src/components/user/UserAttributesConfigModal.vue": "25b0f99f1fd3b0de745ecb3463de4c2e46a0d4afe60a690c90547c0b1e1295b7",
+    "frontend/src/components/user/UserConcurrencyCell.vue": "74e906ab57dd5ed099cdd5d89af84074ed12793cf6adfdfefc7d1bf5a7de4d98",
+    "frontend/src/components/user/UserErrorDetailModal.vue": "44597fc7b3b6e7d0c588076f8b0b8d88a0a0d0ffcac5c35befa6f98e860562c1",
+    "frontend/src/components/user/UserErrorRequestsTable.vue": "4185fe9fc66ea2e6b9866448ef41cd4e2672fb7b7c007461f8520552c1d9d36e",
+    "frontend/src/components/user/UserPlatformQuotaCell.vue": "6161021997150bae0e3258bf768ccb1cc38003d194c7294b55e2bcc2a30ded43",
+    "frontend/src/components/user/__tests__/MonitorCard.quota.spec.ts": "7c7c802381c154cbf9769a86164ecb8cb3bb63537273e55c28314608c814129c",
+    "frontend/src/components/user/__tests__/UserPlatformQuotaCell.spec.ts": "bb1e83d96473deaeff6b7eddf2ab7718a7548503f1994521d0de7457216f7831",
+    "frontend/src/components/user/dashboard/UserDashboardCharts.vue": "a5157725ce07c37d5cc9b4d8bb7b1cd511772405d7e907e969f0fe6864cfeba8",
+    "frontend/src/components/user/dashboard/UserDashboardQuickActions.vue": "da264db47e9d9939469eb4634ddb4b241937fe8d0d828b333d5afb0a26edc2a1",
+    "frontend/src/components/user/dashboard/UserDashboardRecentUsage.vue": "56eb97c0c9301cd6e1c34df406645bed48ea6f1706c02b2ba75c69df2a0ab116",
+    "frontend/src/components/user/dashboard/UserDashboardStats.vue": "74aa3caaf71d1643f47a12298bfc336215b63acbe0c04157c5b702dc4e768f37",
+    "frontend/src/components/user/monitor/MonitorAvailabilityRow.vue": "787cd871cad53174415ce3fabf1af6cf4700f8d4c19bfaea5852dc76bf893223",
+    "frontend/src/components/user/monitor/MonitorCard.vue": "e082cc6ec072d582679f4806a889e39635cd0cfc51c6ab813fe690107e6b12d2",
+    "frontend/src/components/user/monitor/MonitorCardGrid.vue": "7c498ab0f3d098948f4ab1fe0447f09fcd051087e544f73f15c3d94f378a1213",
+    "frontend/src/components/user/monitor/MonitorHero.vue": "8a41547d10e569ce0a6ef84c11a173954e4618f89a18afe8eb6d3d9203a10da7",
+    "frontend/src/components/user/monitor/MonitorMetricPair.vue": "85f148b95918e4b72fffb7237de4fa36692790b12f6986e1cef4a4de456e2566",
+    "frontend/src/components/user/monitor/MonitorTimeline.vue": "5eae75f7d4488e2b4bc0657a08359bfbf6e9ebf7d804962ea6ee40a5791cafb8",
+    "frontend/src/components/user/monitor/ProviderIcon.vue": "2a8696ec2f566862d0fd35527f011e6ce7b9dd74b6915c4c9b498be5cd773ab9",
+    "frontend/src/components/user/profile/ProfileAccountBindingsCard.vue": "8c0a8946ee5ba43a0f3060eba13b91f1998044a3170284fadd82f8e3ce2e1b89",
+    "frontend/src/components/user/profile/ProfileAvatarCard.vue": "9b55fdf4efaa297f281be5889f0293cde0decf666201b78b11f3b4ad364132ad",
+    "frontend/src/components/user/profile/ProfileBalanceNotifyCard.vue": "d022c173865de6a62ea1293459416198e81f3cbcbca2a3f2accb1905b09036ef",
+    "frontend/src/components/user/profile/ProfileEditForm.vue": "c574ccb86161b15cad95a3c000fa61193f7b5ca3ffc9b430724d908f8e9b46c8",
+    "frontend/src/components/user/profile/ProfileIdentityBindingsSection.vue": "f93bc7d07d96e377a855a45f6c758ac60dd3427fca82a626ca4575622ec978ee",
+    "frontend/src/components/user/profile/ProfileInfoCard.vue": "e84150c14bded738ce52c239e3fc95e74fe8d2ae3bac94a8a1c0d78189cdab30",
+    "frontend/src/components/user/profile/ProfilePasskeyCard.vue": "7abb606f62b451e0633f1ae795fdf2bfe6792ff5f1b4e6d46167f881a19f5865",
+    "frontend/src/components/user/profile/ProfilePasswordForm.vue": "99db3e28b03922ca86ff93bbb65eec3715b3a3453f716f8be98c24a84a250f4e",
+    "frontend/src/components/user/profile/ProfileTotpCard.vue": "796ef18e5440dd0a89b4cdec113bcc7c76e7091e3786010968a1c974eb5bbafc",
+    "frontend/src/components/user/profile/TotpDisableDialog.vue": "a6e4a6d6bfbd30c4653031268947ad28ddffc65d485bd60642aa790f1e59efa7",
+    "frontend/src/components/user/profile/TotpSetupModal.vue": "d6b8fbb7eb66c6fd02f83fb459e47d6c4044e7141ea06e08ec61397a252833c6",
+    "frontend/src/components/user/profile/__tests__/ProfileAvatarCard.spec.ts": "cc1d2dbfe84de81a811cd4263ffec8112eb8d9a032b70f5df507fdd0093a5f35",
+    "frontend/src/components/user/profile/__tests__/ProfileIdentityBindingsSection.spec.ts": "1a5c5a8c81db8dc0d482c091da272aa962e811c3a90e881f4536b234a4a60f90",
+    "frontend/src/components/user/profile/__tests__/ProfileInfoCard.spec.ts": "8dfd41f43577d76bc8009d62d6f1299a63f93a1d3be02c611b9ab0f5c80f06be",
+    "frontend/src/components/user/profile/__tests__/ProfilePasswordForm.spec.ts": "e8aee4a93f44971c5c54bb140ae16f0123a23166c2e2e3824ce6a24da7a5b180",
+    "frontend/src/components/user/profile/__tests__/totp-timer-cleanup.spec.ts": "faa1deba52b4c5140fb3f4a5ae09a711b32d9328bd9b6537f6eb4a754616c5ea",
+    "frontend/src/composables/__tests__/useAntigravityOAuth.spec.ts": "e86dcd55497d56ed9a03b1bce811df2447f593da626f75afd987edb5aa0ecbea",
+    "frontend/src/composables/__tests__/useClipboard.spec.ts": "bfbe4ba2ef23d4d98bd5a421f8109e85ebb1a31aa97884e2ea5afea2c0b5d883",
+    "frontend/src/composables/__tests__/useForm.spec.ts": "ef10f27527a527d160a949532756c9c16a999c63f7777c82c801c1a29195eaa0",
+    "frontend/src/composables/__tests__/useGrokOAuth.spec.ts": "a2b966ea59b506b400dec4787dc9941bd518ba3f71f785af43342813009b32c0",
+    "frontend/src/composables/__tests__/useKeyedDebouncedSearch.spec.ts": "a6a2978c1f0bd82c8501af937313669f9bb40d05fe9643846b00febf9cb0fbe7",
+    "frontend/src/composables/__tests__/useModelWhitelist.spec.ts": "73c6422791090d1082f785712d30306f044baeaffdcaccf26615884792428e98",
+    "frontend/src/composables/__tests__/useNavigationLoading.spec.ts": "bac8803fc075e3addea722dc2ae9ed80112dc6fd47d8e248b0b318733852deac",
+    "frontend/src/composables/__tests__/useOpenAIOAuth.spec.ts": "d731c2ef62ffbde77ba3b7f9d70188d636ab8f762615eee8062e38fd1859ddbb",
+    "frontend/src/composables/__tests__/usePersistedPageSize.spec.ts": "bb8163e09b6489eff7053408f942552876ad8bb4d76134d021d0b63aab5ebd0a",
+    "frontend/src/composables/__tests__/useRelayEndpoint.spec.ts": "0940776b59f9e1f6a12fa17e2d7641f0abc662574250ecf2f434440d431afaef",
+    "frontend/src/composables/__tests__/useRoutePrefetch.spec.ts": "d418206377ab286d669db567d022e58b0dae111b6d9e7b53f6e6463f0e76e126",
+    "frontend/src/composables/__tests__/useStepUp.spec.ts": "390efc75a27ff059a35c3e00ae6f11520dc51d31ba118d35f7b92cd03618e8a8",
+    "frontend/src/composables/__tests__/useSwipeSelect.spec.ts": "a3848a7913bbd3d63f7168d7597b9a3dc89d9a88d77467d7550989895d83e290",
+    "frontend/src/composables/__tests__/useTableLoader.spec.ts": "ce7fafebd195e1f5c7d8844728e89ddc6e6af609b0e241626c9a5d36d3a68f0b",
+    "frontend/src/composables/useAccountOAuth.ts": "a0f13132f3a671614b52c414bc097ab01577e45c18649ebb31c81b10f437146f",
+    "frontend/src/composables/useAntigravityOAuth.ts": "58466c632fbe6852e739234a9dcae4238f8d012d94f157551cca8c5ca50b0620",
+    "frontend/src/composables/useAutoRefresh.ts": "b9e8f18ae00297057c8460a5d0df3704956a6f1e72bf5b293374d0c6d11e0e9e",
+    "frontend/src/composables/useBatchImageAccess.ts": "2bb576fedff392f6125b4a096c9f94dcfac5c3cdf9017c3ab63ec8d077579cd2",
+    "frontend/src/composables/useChannelMonitorFormat.ts": "e21d4da1a0c446bc0af477a5c03ae28570966fb7a9b5c070593f6b4c02f1538d",
+    "frontend/src/composables/useClipboard.ts": "9147aae49df7a0a2e891cf41acd598f65a12b4ba3340e9e9898efd1ca773e019",
+    "frontend/src/composables/useForm.ts": "825c1a2006b940929913c51d6966eedb74338ae414c50f83bbfacd3a33381552",
+    "frontend/src/composables/useGeminiOAuth.ts": "dd4ec5e07e3982deb469e6415da06e7180c23ad6fb86ff2ed46d4f4de805f36f",
+    "frontend/src/composables/useGrokOAuth.ts": "911eba898ee437e5f8293134134b6d6e845af8b24d6fbbf0c8b002cfc490add0",
+    "frontend/src/composables/useKeyedDebouncedSearch.ts": "5dfef9a4abb88833baee7947628775c32a586c43faca4ccdf9122cbe86852660",
+    "frontend/src/composables/useModelWhitelist.ts": "eed97a3337916496c8ecf77f1e5f890fa030921eb18d10ab7554df19d8023800",
+    "frontend/src/composables/useNavigationLoading.ts": "0d544fc5cd439c9e7eecc8393e1802e92e28bacc0593f721bca5571062517d46",
+    "frontend/src/composables/useOnboardingTour.ts": "42d227d9d23f87d40d3a022d169445d696ffbc4000ee9a7cf3f3d7669fc3b775",
+    "frontend/src/composables/useOpenAIOAuth.ts": "da8198599fd35bd95d697b70bce9d5c0ff5692c232b77bc574ec54b721b99c4a",
+    "frontend/src/composables/usePersistedPageSize.ts": "ea52e70880a243d13662dd3fa424121e0a2e67f4482cfe425790c3d7ce567b28",
+    "frontend/src/composables/useQuotaNotifyState.ts": "14577e43424a5b85954614502c85f33cf8f5cb623eead7b580d56dee53af52cf",
+    "frontend/src/composables/useRelayBrand.ts": "9eac7c78141e2b89351d411af0a2e7b05eeb02fe441cc24d411adacd8e1b303b",
+    "frontend/src/composables/useRelayEndpoint.ts": "d3ac28a0cf348d60339d7a6215e08a3d8266ac7ccaa6bc49b338a3eb3d19f546",
+    "frontend/src/composables/useRoutePrefetch.ts": "0f1e3c19245dd1629e7e1c1a3408ab5a8b904adb92dce9a60ff2c7848e2403fa",
+    "frontend/src/composables/useStepUp.ts": "7fa7ddc3783fa3b1e4414e4a554e1cdf9dcda8db9b870d2540f304d24e5717a9",
+    "frontend/src/composables/useSwipeSelect.ts": "20de2340c4bd7951597fbdaf88b67d7b24f61eca775048e99acb38442ec67bc7",
+    "frontend/src/composables/useTableLoader.ts": "312b02aef5292521a35797fbc7aed4df668ffd5029f6412ba32ddeaa35a868f3",
+    "frontend/src/composables/useTableSelection.ts": "b48ab3ad61bbcbc8521af0437c3c0669a5b57485dd1f8ad30e0341672bed7981",
+    "frontend/src/constants/__tests__/platforms.spec.ts": "a5037b6df1ccd5145feadd065726ec7695e2585874cf9b2edd9b77947ece9dad",
+    "frontend/src/constants/account.ts": "feb3539e65dc40ba669b169a4a1cac03b67b2fffe8787bb900641afb825a4040",
+    "frontend/src/constants/channel.ts": "ab1908ca6ea970d5ca7c3e3ea4305806cb109d4a374837df8118c05c0eb90ac9",
+    "frontend/src/constants/channelMonitor.ts": "fd988a5cbd3c959af6d81d88f912abc66a0f73935d686cf05823cb7fa9b2b25c",
+    "frontend/src/constants/platforms.ts": "e3fb957e79c31c70cd5fb6e54f9a73df22f1d35b39927af5378cf907ffd58816",
+    "frontend/src/features/channel-monitor-v2/FilterMultiSelect.vue": "ebb9e431144e804a3a2225efa2decd771904a1056c787a0bad8fb54a5f1b4200",
+    "frontend/src/features/channel-monitor-v2/MetricCell.vue": "6ec43cd2a582a6c0c4a25f1a4f0c02e5f608484a0e35365dc24795aec0df7b7b",
+    "frontend/src/features/channel-monitor-v2/MonitorRankBadge.vue": "78c976119cf7a7deb5b544095ee9021624cb3a2529267f56f03f19592ec0c745",
+    "frontend/src/features/channel-monitor-v2/MonitorSettingsPanel.vue": "6894c8b6c84af490c7d144ef6e88895e8a0f611d4e69b8fe69b9ec6bb5d233c7",
+    "frontend/src/features/channel-monitor-v2/MonitorTrendChart.vue": "b7f4e9265711fefd57a6d4d14cd64e2a43789d377f7aea23e3dd6652eccc92e7",
+    "frontend/src/features/channel-monitor-v2/RelayPulseMatrix.vue": "1f49a2ddfaf892654bc3cde678688130e3390c2d2418ca136b711a29465cd31b",
+    "frontend/src/features/channel-monitor-v2/__tests__/MetricCell.spec.ts": "4eda3a72ca3ee165c6f3b20a25a5589d5dfd6b515ca62e684a06031779e8a896",
+    "frontend/src/features/channel-monitor-v2/__tests__/RelayPulseMatrix.spec.ts": "2cd1d47b88789f8be0edfe6558774cb094f586faf60c25ac9287c8178fdbfbbc",
+    "frontend/src/features/channel-monitor-v2/__tests__/designSystem.structure.spec.ts": "510042b72ac3b3eb70b0dccb21b1fa31c6185e75664501ee11d87436a4634f92",
+    "frontend/src/features/channel-monitor-v2/__tests__/monitorFormat.spec.ts": "66ed9a9f42f36b6267005c6e208358023d95cd2315357167ca06bb2cb84592b7",
+    "frontend/src/features/channel-monitor-v2/__tests__/monitorZoom.spec.ts": "ebb990cb3a0920defe60e348d4d818a8c06a372c12b7e90e5e2934547acd3852",
+    "frontend/src/features/channel-monitor-v2/monitorFormat.ts": "1161989fd38c08ea26f5b045771b1094ccdf1a166da461f71b5e3662880f2080",
+    "frontend/src/features/channel-monitor-v2/monitorZoom.ts": "5cb27b4a038e7c2406bf4cf4fecb7131c8895ecf2ff9104986098dbfef0085ad",
+    "frontend/src/features/prompt-audit/PromptAuditView.vue": "a7ac6cbed9ddb0a1a235f11a18beaef86365372bcfe4182e81d8e9d3be99c04f",
+    "frontend/src/features/prompt-audit/__tests__/PromptAuditView.spec.ts": "7da42db0ca5019e337348898fd8a3454ed31afcfc980ebd3a76fa82e3031a391",
+    "frontend/src/features/prompt-audit/__tests__/api.spec.ts": "6f39ceff56f6b67b998be738a27932c3bc07aeccdcff07c35dd19247557043a0",
+    "frontend/src/features/prompt-audit/__tests__/components.spec.ts": "cb70e6acb92a20200493ea1f20a4a4257838656021861be5181ede3be1969403",
+    "frontend/src/features/prompt-audit/__tests__/integrationSurface.spec.ts": "7f411b27064986e90db7e4ea50af96a731d6622f066db57d15c46ce6423412c7",
+    "frontend/src/features/prompt-audit/__tests__/viewModel.spec.ts": "7a11a8bce6fb0a4ee53b5b2a8a59a53e4837f534ac64f51ddd02381a1829cc8d",
+    "frontend/src/features/prompt-audit/api.ts": "ea04c899e59c869a681c4c21e4826065a7b5274fcb87cdc02ad0ebc0ba9f4dac",
+    "frontend/src/features/prompt-audit/components/EndpointPool.vue": "9e784985f238ab1b1efc52237e8b0726a0b0437b39175ac2d9458a2a6ccab312",
+    "frontend/src/features/prompt-audit/components/EventDetailDialog.vue": "a149c4d35457241eac2b343d6719c0724695297d07d155c046db8a6f6c34cc7d",
+    "frontend/src/features/prompt-audit/components/EventWorkspace.vue": "8d4828c98322e6acf87d17fbbcf68d233d9c8194364ec0c6f020ea45b9e262b3",
+    "frontend/src/features/prompt-audit/components/FilterDeleteDialog.vue": "dc6f141e9375b05bf552d25b1232b78fb2d8e8ee22606781428e5db28cf29f2e",
+    "frontend/src/features/prompt-audit/components/PolicyPanel.vue": "165101037761b139aa4a8a11a6b177c3520279a3df7b25ba78c8c79443a3c4c6",
+    "frontend/src/features/prompt-audit/components/RuntimeOverview.vue": "e904a42d9d9a65daebfe817c1c3b10e5dd28392875dc42ea6df9afb44885107b",
+    "frontend/src/features/prompt-audit/types.ts": "64008fa5283b8de4a4872a1f7188553114bf46df6a3fa68d094a9892dbf4c988",
+    "frontend/src/features/prompt-audit/viewModel.ts": "f05716427890eed53d464efcae8a2d908b039d924c477e62233a4ca8504082c4",
+    "frontend/src/i18n/__tests__/ipGeoLocales.spec.ts": "69263feb5508cdc37235e4a35697f8c42d9a3bc4c004b93f8c0851bee9c464f5",
+    "frontend/src/i18n/__tests__/localeKeyCompleteness.spec.ts": "cc78fcf918263662c59d1eb3c110924142a697855ad740e7ffe68c3fad8bec7b",
+    "frontend/src/i18n/__tests__/localesMessageCompile.spec.ts": "dd45b4a14e1161677a57c37f8f513a35cce2f4a62abeec57a0875163e3b4817d",
+    "frontend/src/i18n/__tests__/localesNoKeyCollision.spec.ts": "9eef5f69e5c414104f10d0008213ca455970fc19fce953046f87fdbf5556154e",
+    "frontend/src/i18n/__tests__/openaiFastPolicyLocales.spec.ts": "1602d91f182d3673391b3407f97aa25ced696cd4219694e13afdf65b968a84dc",
+    "frontend/src/i18n/__tests__/opsLocaleKeys.spec.ts": "38b9125a7657f8eaebc2b93271cd1705bd92e7eb7e97ed9d36b1fdc435efcaf0",
+    "frontend/src/i18n/__tests__/riskControlLocales.spec.ts": "c5b9ea52f89a2c896982b4d3a414a9d51475b38209ffa842a29dc74804953e57",
+    "frontend/src/i18n/__tests__/usageServiceTierLocales.spec.ts": "ceb86547e0c95588a474fc322ec270e13f670a5cf93fc2da24e0d78e871199f6",
+    "frontend/src/i18n/__tests__/wsModeLocaleDesc.spec.ts": "b85a0d4382a68d98c4b633c87053b5a72914b3035b712efe5ab4bd6dd869eb6f",
+    "frontend/src/i18n/index.ts": "4c4bfc525e28ab058fc869fdcb012855c4511c6b99c7e0579d8d2eb6d6ec9138",
+    "frontend/src/i18n/locales/en/admin/accounts.ts": "94cc17b73032c73811aef937946050f3802c2aa4ae8e26f6082a4da2f2293019",
+    "frontend/src/i18n/locales/en/admin/audit.ts": "c5cf0edf17bd03ba49065b1cddad02a59fbdd5b76ef9d54051e5110023d4e88d",
+    "frontend/src/i18n/locales/en/admin/channels.ts": "25a6ab15c3cac213ab9452db7d27aaecb0660cd18a7bf5a27012918f2321ec46",
+    "frontend/src/i18n/locales/en/admin/index.ts": "23219023b7dc990bc4a2e2d4428024ad1b077f48988560a037305c8d879e9c9a",
+    "frontend/src/i18n/locales/en/admin/ops.ts": "29b0bf86434aa4bf17557088b038efbca376927ab4e57feb00bbf34abcc46844",
+    "frontend/src/i18n/locales/en/admin/overview.ts": "20ea315bf8b8455de8cfcf6ee0a11c8d943bccc86792b4ed619810e030c6fa37",
+    "frontend/src/i18n/locales/en/admin/plugins.ts": "80cabf0b96254a40ddffeaeef24d416913c5ab592278bf68a02644a7ee6e4787",
+    "frontend/src/i18n/locales/en/admin/promptAudit.ts": "95d98164d75c49def4a984e63cbf227cfd09915f08f11048da3c26f46ec0ca02",
+    "frontend/src/i18n/locales/en/admin/resources.ts": "cc22bcefcb9a4dcd5781c0afb66f50764253227971fd5abfa40e90265a962696",
+    "frontend/src/i18n/locales/en/admin/settings.ts": "e5e349133ff9b9aad7acc0f084f135d7be0a2fcba57b15b56d4f0f67edd2c790",
+    "frontend/src/i18n/locales/en/batchImage.ts": "01fd35ee72a3df88e5e4923090186c957e0df6d2d58821f353e17429ed777e5d",
+    "frontend/src/i18n/locales/en/channelMonitorV2.ts": "b2b6bff6d5bb716fde2ec948067bae4de6f94d141a14c5ebe1c1620f32e81f4b",
+    "frontend/src/i18n/locales/en/common.ts": "a75094794c9ee8fd60d25c1295b20e9caccd7f8a065c17be9a931cb5d4e6e7bb",
+    "frontend/src/i18n/locales/en/dashboard.ts": "22e4868185c6e12f4c4c2e51cb40310543380e687b14120e4b9007a43e33ddb5",
+    "frontend/src/i18n/locales/en/index.ts": "1394d6e52f83a428060b71d598de46b6624dd8d78bf925d12abfb57adbf7fe0d",
+    "frontend/src/i18n/locales/en/landing.ts": "ad0a609599a38b2112f2de7ccb76b3286c83c369bafe2e992cf59268919b66db",
+    "frontend/src/i18n/locales/en/misc.ts": "199f1f0d03f5bd9faf220d3401c8fbc7205f3174461e6e0162cff87376588469",
+    "frontend/src/i18n/locales/zh/admin/accounts.ts": "6c587ea4b4410c48b31456adcea1d3159e17a584a46646fdbf4a27bd8ef84ca1",
+    "frontend/src/i18n/locales/zh/admin/audit.ts": "d363dd7c8c9a5f37100b7a8fe8277d02b1ca5c789d8e5473338e028c140a42c7",
+    "frontend/src/i18n/locales/zh/admin/channels.ts": "5cfe07d15c6801636de3c15158c14dce2f1c536465ad9909ac7464b2ed476169",
+    "frontend/src/i18n/locales/zh/admin/index.ts": "23219023b7dc990bc4a2e2d4428024ad1b077f48988560a037305c8d879e9c9a",
+    "frontend/src/i18n/locales/zh/admin/ops.ts": "be13fa1f067b90f69a424c17bed1b3fdfdee14a3c6eec8c71448fd1aae085ec7",
+    "frontend/src/i18n/locales/zh/admin/overview.ts": "727e980f2475e2cdc1e91ca88a3ff0c3de902e4e2998f98c6ca61c88a582b9d6",
+    "frontend/src/i18n/locales/zh/admin/plugins.ts": "e17bfd16cba177c2c1ea71976d4ab6684184b0d7dd314ac4612abb5c6b87b99a",
+    "frontend/src/i18n/locales/zh/admin/promptAudit.ts": "077954975f8a6e8491c3551b1af3f66704b6c723df2b6e97a7aa8eb87aa1f837",
+    "frontend/src/i18n/locales/zh/admin/resources.ts": "f5b4b457ca48bfefc220e0309ddcf0eb6635bc47566e38e555e23cbb3f69f8f7",
+    "frontend/src/i18n/locales/zh/admin/settings.ts": "a4352c8bd803c309dfe90a6356030778036a5d4f1972d15152f887ca92790233",
+    "frontend/src/i18n/locales/zh/batchImage.ts": "ff189dab0650168958a46a0c471a43e47dc5c43c418b9b13a1c1e73d08422d64",
+    "frontend/src/i18n/locales/zh/channelMonitorV2.ts": "6753283a177e110bccc8858aba5dc2a53088613fc248a0c16f81c1e49ad716c9",
+    "frontend/src/i18n/locales/zh/common.ts": "0979b7f7e41f8497788e2a8c5ce5f61e195c63085c9e4302d341d1b1754f565c",
+    "frontend/src/i18n/locales/zh/dashboard.ts": "8c421454c89af88459a8b006301425c3829dfa5587c2cf767dc29f2586a34491",
+    "frontend/src/i18n/locales/zh/index.ts": "1394d6e52f83a428060b71d598de46b6624dd8d78bf925d12abfb57adbf7fe0d",
+    "frontend/src/i18n/locales/zh/landing.ts": "a967ce2eb3b944248cb649f7615fec041f207968d89bfb547e3ec8a88e5e4741",
+    "frontend/src/i18n/locales/zh/misc.ts": "c314a51dd0dc4a14e27864f212ac5050bbd798d1b6a5c9fad468ef01860a0ad6",
+    "frontend/src/main.ts": "2d7d531af156f8e464cf258ceeca9549932bf2bcb1b4bfceb596264498327a47",
+    "frontend/src/router/README.md": "fcfaee8fd346c4183780ebed034ede73f524e99f0cc965cd41edeeeccc482d18",
+    "frontend/src/router/__tests__/feature-access.spec.ts": "d20be2827845348ca2d5a49d9c9821fde37c19bcaf5783de56a4c612fd8fc38f",
+    "frontend/src/router/__tests__/guards.spec.ts": "88c0ea67435e7174933597a9cbd9de850b4652ac3acd208a7e717d1781d81d41",
+    "frontend/src/router/__tests__/title.spec.ts": "039b4a21605896e01334e55a3d4288cc95ed355584ea32d4b4c4aae481aa6b31",
+    "frontend/src/router/__tests__/wechat-route.spec.ts": "b1d8313cf180551c7cb1bd40bdf2d1bb1547dd5318c296eff5000f271491805c",
+    "frontend/src/router/index.ts": "72119f1250aefad59e2ac6dfb6e7ca4ca718355eb670347c6a5bfe68c60fe328",
+    "frontend/src/router/meta.d.ts": "8516698efb0f33b4a185e2d6ddf9098d8f7b7d24f3a08596a27f244fccfddfdc",
+    "frontend/src/router/setupRedirect.ts": "6556f15bc437935ece6f65a3d61f64a6837488d13447af60f4c605fc8ab697df",
+    "frontend/src/router/title.ts": "fdbbe7ee040aa173fc1e32b974a4f0c77e7f0c680a70723c1640fd9060f17bb9",
+    "frontend/src/stores/README.md": "66b1e7163858831890bbff96076417bbcd25e319970184658019e2a47135edfb",
+    "frontend/src/stores/__tests__/app.spec.ts": "56f95ec5c0e58fa429563c86da6d706c8f7c6dd6e5c2a88505998b9618f9c454",
+    "frontend/src/stores/__tests__/auth.spec.ts": "461b0def8832646af5cd636d7d4085b1a794e88e369dc3cd5d12e479fd05d7af",
+    "frontend/src/stores/__tests__/subscriptions.spec.ts": "d0ea34e3950ada3c55d870ebd4ac38e4e16d0d7d1c74e179e531de36f0791b76",
+    "frontend/src/stores/adminCompliance.ts": "f73d7934d73c37fb50f81b8ae2e792d11317ec13d6a2c5b17271915bfebe8e09",
+    "frontend/src/stores/adminSettings.ts": "11e4cc737c48dd43586700fc15a1033c641d623b2906260a5d5eec726efed3aa",
+    "frontend/src/stores/announcements.ts": "9878266cd295c4d60c1b6a0d6fdccf54958248f15a851ad169210023507f0470",
+    "frontend/src/stores/app.ts": "11a41bd5096a15cc83f52e90c46722b6c16cf8b62ae9050a047ee1338c7463a3",
+    "frontend/src/stores/auth.ts": "98c5e1fdd0564253637517197cfbcee6d23f2e9de43feaa920497459113d38f1",
+    "frontend/src/stores/index.ts": "39bc373e9ed1801628ad7375a1bc8a89c81618a2938992a392ba4686e0e3dc3e",
+    "frontend/src/stores/onboarding.ts": "c17941661815dee36f6862a5968b5d809ec4af6b2f8940f1378762fbeba7eea3",
+    "frontend/src/stores/payment.ts": "52128c20bbafffbc15c18129d6a883475ee13a5302ac02b027d913d89376adb8",
+    "frontend/src/stores/subscriptions.ts": "cbfb7b4938740ca769a14e5e440269c7af2bd942af6d2e00e4a898b9aa8ea93e",
+    "frontend/src/style.css": "2d0e275db9c6466fe66e3a0c1fb399ecde2b454163c36bf4410e4b85a6ec61f3",
+    "frontend/src/styles/announcement-markdown.css": "611fa5b001e2da3ef54e74a36e9d13f03a98ccee6f703bfeef83c1b131210047",
+    "frontend/src/styles/onboarding.css": "49d42e95807c134001600686e38c0003de0eec14b140578df02adf0c9b034d77",
+    "frontend/src/styles/relay.css": "c9888383bb226591c867a3bcef088d39e241f6a77c3197b8a0908c62aa52e2c7",
+    "frontend/src/types/global.d.ts": "e3038a5590279d22dcf37e9e31656e7c49e472b60afecbd9d367fff4cf66005c",
+    "frontend/src/types/index.ts": "abe579517f8ed5f3be95776b0c26aa7fb5346d1242f777be697603debec6d220",
+    "frontend/src/types/payment.ts": "21622776813b81b571fba9041093b4a6504b54aa29355f6e833d4823c1594684",
+    "frontend/src/utils/__tests__/accountSelection.spec.ts": "61b7cc30270e9f7a2ba3f1a00a005820e9eee989db9a49d73b57964a0f11d27d",
+    "frontend/src/utils/__tests__/accountUsageRefresh.spec.ts": "c8b5f9117b1f4c695163840cd951afb09ed685cbf39b4cd5d5066e2ef1b791a2",
+    "frontend/src/utils/__tests__/authError.spec.ts": "b8e61c9fccc8ea801dc860d5ea85308331f0f24be470ada8488ed8a836df9762",
+    "frontend/src/utils/__tests__/billingMode.spec.ts": "940014ea348c4ef23e804752f32a786d6e1799346bdbb945b5ca9ed55b930f67",
+    "frontend/src/utils/__tests__/branding.spec.ts": "6b868e1ad1f90d2321896ea83182dfd1e18e5d67789c7b6918ab065d7f81e228",
+    "frontend/src/utils/__tests__/ccswitchImport.spec.ts": "1570f9c2ebb3c3e3a4f91c9717d28f8b990c71000d927dae3ff4c52fef790b9a",
+    "frontend/src/utils/__tests__/codexCatalogConfig.spec.ts": "0f8ce59d60dff0b37dc2cdb38e97c8e07ce47d89baf1c143ede5f244d4dbf43c",
+    "frontend/src/utils/__tests__/device.spec.ts": "552df4a6ad5917ad83125f13b3486ef55ad51ba3bb781dd2bbefea8322fcee83",
+    "frontend/src/utils/__tests__/embedded-url.spec.ts": "4f6a1a3bf54b778d70c4720db973fc31f78a1b59820ab0ee912a13f2271ce50f",
+    "frontend/src/utils/__tests__/floatingPanel.spec.ts": "c491067c99e89f972876ea39fe8a486cf9c8c7e2237827d0d183c2cb116e6266",
+    "frontend/src/utils/__tests__/formatCompactNumber.spec.ts": "9ca9f2a4a99432e50801c3b76d719e6cf71d76a48d86553be95d32caad0839b6",
+    "frontend/src/utils/__tests__/formatDateLocalInput.spec.ts": "a19760df4ad884c6c1ac07e868d187f5cc3a15a8a7b7305ebc5cf6569a7952d9",
+    "frontend/src/utils/__tests__/formatDateTimeLocalInput.spec.ts": "9b5c2747e579f5dc8e6c36b774bb3872399e828366fab0847fcdbd15ba9e717a",
+    "frontend/src/utils/__tests__/formatDateTimeToMinute.spec.ts": "760cc78d9a1acd86f21ee93b7185c10d8af80117cd82ab6e458d618e8c275db0",
+    "frontend/src/utils/__tests__/formatMultiplier.spec.ts": "1d4067f9871035f343a0a5cc55c6c2b5543956addebfda799519e0bba28ea8e8",
+    "frontend/src/utils/__tests__/formatReasoningEffort.spec.ts": "133f8627a8d34d0f755da7c2a6f0fcaaa346d55dfbd08031b7885713fe53aa79",
+    "frontend/src/utils/__tests__/intervalPrices.spec.ts": "6202da19da131ec1066184c19f9f3ec23b84c4c508cb707a27c59a76fcbb5409",
+    "frontend/src/utils/__tests__/ipGeoLookup.spec.ts": "ce058e8f576e7b9c50372ccb000c18fde3dc567101ed4cb1416a72cdb1d518d5",
+    "frontend/src/utils/__tests__/latencyHealth.spec.ts": "131d8a773de410ab233803287660764a189f24f45ae7ac9532ec2c6e4c102e93",
+    "frontend/src/utils/__tests__/oauthAffiliate.spec.ts": "16ce2426eb2132868dff14fce8b76e257d57129edeeb9c0c2152f1d709adcebb",
+    "frontend/src/utils/__tests__/openaiWsMode.spec.ts": "131365d0482cd383a9baae9467edc615d41d592f0ed52fdbc49786aa5cf6d0e5",
+    "frontend/src/utils/__tests__/proxyExpiry.spec.ts": "b07042cca8cd78570b1f3ddefc61b8c94d11d4815899f12f5aadb4702c31c5a9",
+    "frontend/src/utils/__tests__/proxyParser.spec.ts": "71e6066418388df7742ba3fb5ae309e8cc67eeae07fc2b470c018fa06666f921",
+    "frontend/src/utils/__tests__/registrationEmailPolicy.spec.ts": "fc8ab7df0aa3839401aad00c5892d86200ae959a5bcf2cedc41521a380267be3",
+    "frontend/src/utils/__tests__/stableObjectKey.spec.ts": "7b59228ec9811b93578c008fca510708d5ed0a77ecc81eb6a1170a0a0b918b22",
+    "frontend/src/utils/__tests__/subscriptionQuota.spec.ts": "ba0babf8ba15b998badcfab7d1ddae8283d90cdf97abff469dbf465d666b0992",
+    "frontend/src/utils/__tests__/tablePreferences.spec.ts": "0e9eb7924214a5320fd7ffbfa09446db17404531caa320c4d11b793e7d289156",
+    "frontend/src/utils/__tests__/usageServiceTier.spec.ts": "af79aab32dda72ab388fdd97448b5dc14924e5eeda0ad7871f815a2fe523d7d9",
+    "frontend/src/utils/accountSelection.ts": "48924ea9a5d7ebffe8c1d37d21007eec770c6ff7fcbf0fb91346bc64a6bd59c6",
+    "frontend/src/utils/accountUsageRefresh.ts": "3f2f4d83e0655b332a0246ffa6c920b03192824786b101ea53920499fb25903b",
+    "frontend/src/utils/apiError.ts": "5acf8b65031dbb27bf320cc5cba918416c3b5ce2a40c46dd137963afaf46d651",
+    "frontend/src/utils/authError.ts": "ad3a68936c87f67ac1adee1098d7cafdb3945110be8233f17f2c26f1eb8e3d12",
+    "frontend/src/utils/billingMode.ts": "70a2839bbfd6d696822501c36662c75f081fc0e6cacbfa6ea365a884fcf210be",
+    "frontend/src/utils/branding.ts": "c5e26f7ed816891bfa8d55c8936d004fea5c7e4e5f1771fb8e31c32165e882d3",
+    "frontend/src/utils/ccswitchImport.ts": "be69698513a2d07e38a0c4c1927ecc4870baf8da1ff359a050cb46a0bd160553",
+    "frontend/src/utils/codexCatalogConfig.ts": "cf12bba892c5c6c3c824d7eb86c1b11f45b582eb0cfc317c15adfbd1dc0b164f",
+    "frontend/src/utils/device.ts": "b505bd8fa5708ea9eac231aaf52da43047feacc9234fc904445e75bd52988bfd",
+    "frontend/src/utils/embedded-url.ts": "c1503c6ebdcdcae4530344ef37783ac0bfa83b5a03f87e7e9915b319267537b9",
+    "frontend/src/utils/errorBadges.ts": "fb2f62c221097851f67cb3b10df522b6684de887768571f6a057506e320e8765",
+    "frontend/src/utils/errorCategory.ts": "9f56f78f6a26514af652bed895e9b046551d9fbae86eb79f8d124b89a5b6f851",
+    "frontend/src/utils/featureFlags.ts": "0734fbe74a52a7ab6fe944948433d232bcb37882a1fc3da6db4de212451ca4f5",
+    "frontend/src/utils/floatingPanel.ts": "99c092bbf8270d24e9270854b5f9a68b97b282acc241c5879620e38adb324f24",
+    "frontend/src/utils/format.ts": "107915a3dfbcda225f36484e5e9d5a58cb926df9cabecf29a3be604c2ae7e552",
+    "frontend/src/utils/formatters.ts": "56a6610e5f534c493fc477a50d237c93fd0eabd1237700e7fdd8ee2e1ffe505a",
+    "frontend/src/utils/imageUsage.ts": "850d799ee6f873e8bb23587579a57e089cf22d5e1ee0669db294e784e2a6a27d",
+    "frontend/src/utils/ipGeoLookup.ts": "6eb165f0290c5192e699eae3e6780d72f2ceab330368088e41f8202ff7d3bef0",
+    "frontend/src/utils/latencyHealth.ts": "c483f6de8ce5a0e9c9276161e39b584c2150890a0924a5c884205c31b568265c",
+    "frontend/src/utils/maskApiKey.ts": "8aca60053e558aaadb60aa3965739ba3d8b70d75fbe0b6861022c85e0d100c81",
+    "frontend/src/utils/oauthAffiliate.ts": "feed8b7145a5405194d71b894b145d6742498eb3c6fc8b48e881a4750ba15e36",
+    "frontend/src/utils/openaiWsMode.ts": "6cab31e4d9d6f9e2cb89da0096e3c7215eab189c57993848cf8132af8cb70a93",
+    "frontend/src/utils/peak-rate.ts": "5a8e5a9e28209882b79cc2582fac10485e4b662d84396d75841e4c47c1b720c0",
+    "frontend/src/utils/platformColors.ts": "1fa831554ec0a53de352c6eb0be09ddeda8fcfc1c086f14e6df1bcfaf418af8d",
+    "frontend/src/utils/pricing.ts": "0771b65897da63179f6e632e8255593cee017351ac5f9ac31d9639a070ba7110",
+    "frontend/src/utils/proxyExpiry.ts": "9cb319df5d5d1bb68ff6563f0364724cdfa18560210a6faaf89b3366302e1ec8",
+    "frontend/src/utils/proxyParser.ts": "e9d8a64892547dbfbbd445e6ad3559be7c9e121e635c337ddd37df5fec059660",
+    "frontend/src/utils/registrationEmailPolicy.ts": "957feb7b63391ffe28c284a819000d0411bdef65a3cecef250904eb05b8c56d2",
+    "frontend/src/utils/sanitize.ts": "ec99d576318e660280ee78b5a718fd57477fd3dd36bfc0e3316946558e2bfc38",
+    "frontend/src/utils/stableObjectKey.ts": "49c7888c757a893daa608e0be67a6e5ad6196d7bd0a359ab252f9bc7e4bca42b",
+    "frontend/src/utils/subscriptionQuota.ts": "99bb120ef65e1494cf6db4c6c4013b88e70239adeb683a863e6f44caf2368ff6",
+    "frontend/src/utils/tablePreferences.ts": "daf9090280c283c3e2b3912484a945eb6418779a2b5931fe68a0d27e32039305",
+    "frontend/src/utils/tencentCaptcha.ts": "4bbe3623df90cab91fb95982ba1e5b0a5aff708ed414e6bb61b13390c63cf78d",
+    "frontend/src/utils/url.ts": "576f17b6e0d9c6d9e7b05d694f9964393427894fb010981054877b0b6e98d7f4",
+    "frontend/src/utils/usageLoadQueue.ts": "9e21783487000c85c7b1260283af7d6bcac6dd52a389fdbc65b45cecdd1a2134",
+    "frontend/src/utils/usagePricing.ts": "c83f2e49991d729a23539346e6f37ad181e4e62e8410b988051cbcc08abd5970",
+    "frontend/src/utils/usageRequestType.ts": "7a19ed7eb947b3007fd7c0b786bb0e90b9ce9b775a12838639f8099dc59cd397",
+    "frontend/src/utils/usageServiceTier.ts": "a25addebad9580f64f05cef5af32ebce5096acd2053f7db31d97fb7651f0454a",
+    "frontend/src/views/HomeView.vue": "b748ee30245821d683086e1574dc8f2e9e49d5ffbc69f0ffe00c1fece569cd55",
+    "frontend/src/views/KeyUsageView.vue": "c1edc2480e67920074918cc85fbacf254a321c8c9931547a9a7f9c904c4e0096",
+    "frontend/src/views/ModelPlazaView.vue": "d8ef090b1ba56c0d6784afb1c0af8953d4b9cd67bc239f8e174fc079a6256520",
+    "frontend/src/views/NotFoundView.vue": "77d0c2619bba4d9c19d08c93f1f4ae669828d9c7b0386a5872f8d3d026b2b0ee",
+    "frontend/src/views/__tests__/HomeView.compact.spec.ts": "3a07a6240b6ac6bbc17bb523988c8a4510aa0221b5e90732c400e8c4737ce241",
+    "frontend/src/views/__tests__/KeyUsageView.spec.ts": "33768bb7e6116573534fe43159d197c1b096efd409ec5a796be83a4f24b5ee1a",
+    "frontend/src/views/admin/AccountHealthView.vue": "21c024d089e7a2d4e96957fca34788733c0a849b5c8e8497dcd4ec009e805e0d",
+    "frontend/src/views/admin/AccountsView.vue": "39ff9a98d838811e6fbea8a232da3fb5edd08744989fde21255175caccc82e73",
+    "frontend/src/views/admin/AnnouncementsView.vue": "d87abf27c1f6928a040a99bab87aea52b2c3f306ff28188d1ed703fb46046a87",
+    "frontend/src/views/admin/AuditLogView.vue": "668bb397f451dd9923c50c71578c843ce5aaeca9948d92a16d8ea9950f8452bc",
+    "frontend/src/views/admin/BackupView.vue": "af9170db19562103bc77a712cdf4e5d0ae88bb5f06db6b6d2bb1727986b32026",
+    "frontend/src/views/admin/ChannelMonitorView.vue": "c1400b7d399824c92ff5eb242115fcdf65e2c0322f408d39aa8767514ea1824b",
+    "frontend/src/views/admin/ChannelsView.vue": "439983aab1d7d740e9b4e733b1bb351f6ad6929c0301152a781346f7eb212cef",
+    "frontend/src/views/admin/DashboardView.vue": "a2088a03ef980ffc204944416a35dc6a002f36463999d1c3019d18d883f70cef",
+    "frontend/src/views/admin/GlobalPricingView.vue": "b2d48199c8662a2181d0adf5569313e1b282f44e855c00d49914b0c547f9cb98",
+    "frontend/src/views/admin/GroupsView.vue": "9d8c4834346f6995ea254ce4b2f2ca119405456df70501e505fb59549aaba3d9",
+    "frontend/src/views/admin/MarginView.vue": "34f848cb79b64a60d9b05ad2ee378dcbcd7101376b84b96d9cf97f5517a58f4b",
+    "frontend/src/views/admin/PluginsView.vue": "944c5b08a5ee0824ac7fcc8d9fc81bd835359d5e6ff0a98864b8d20b89977f78",
+    "frontend/src/views/admin/PromoCodesView.vue": "2530a6c9de12faac904582b18161523e4aea2aa2c62800aa597c1dc4592b64d1",
+    "frontend/src/views/admin/ProxiesView.vue": "cea47ec1f8b7db1ba56abcc704582a5384d609c679dac0de76e0e365e15ecd4d",
+    "frontend/src/views/admin/RedeemView.vue": "74c97bb2ffd89e4d535dac2ca3526b24bd438c9d134ab7ba8ce09c73dd9aa9f7",
+    "frontend/src/views/admin/RiskControlView.vue": "070b898846f9eb3d1b6b5d459db98d7bd87bdac870d43bf1cf5c77e2d17450ac",
+    "frontend/src/views/admin/SettingsView.vue": "a0b7a8d6ff4454b7241f1b2f91e66893547c9651c1982e4a398475116e5f9ba4",
+    "frontend/src/views/admin/SpendGuardView.vue": "bac82b3bac5110537909cde1481fa030187e0aaae9334d1b113df026b3d8781d",
+    "frontend/src/views/admin/SubscriptionsView.vue": "c61848f83972a206cbe9145c1b5fbd1ccfb9aa66814d89f11101b96e0a6645a0",
+    "frontend/src/views/admin/TicketsAdminView.vue": "42c6d920827f02b1c2e1a9f884a29a1788a1486e573ccd4bea12e11929f8f10e",
+    "frontend/src/views/admin/TieredRoutingView.vue": "0adda4952de57a80a55f6f898c23de9c637b91e0c9400e3732400543f800ff93",
+    "frontend/src/views/admin/UsageView.vue": "fd5a5a39a3d23e3ecdba61c18dc44a7b158c9d9003f94b57dd3ad48b4e56a89c",
+    "frontend/src/views/admin/UsersView.vue": "77ab963352d7988d0dcb89a08d3394ac4da4d1f15e1b5c9f51fd8a7c06d37cda",
+    "frontend/src/views/admin/__tests__/AccountsView.bulkEdit.spec.ts": "c5da69fc3d092065ff377f6cf59b3afd801ef95680d099b9b8cc04d7ab966425",
+    "frontend/src/views/admin/__tests__/AccountsView.lite.spec.ts": "5112da1ecb2c9d4bce357b4d0bf69877c4ce8ef252795f34e345784c419c1c7b",
+    "frontend/src/views/admin/__tests__/AccountsView.priorityColumn.spec.ts": "97a9c45a3222f7c7a23fe0444ee9259b86bf793b74a436e28db337c67c0dd87a",
+    "frontend/src/views/admin/__tests__/AccountsView.schedulerScore.spec.ts": "581a54bcfc0c1016a965ae9b0f39fb8c4dc6d1af2e3488129d9cc4b7904a6347",
+    "frontend/src/views/admin/__tests__/AccountsView.selectAllResults.spec.ts": "2db1bf1c24f14da603723eb03dea764a660f97fd9b43b971be078a007ead8858",
+    "frontend/src/views/admin/__tests__/AccountsView.sparkShadow.spec.ts": "c4fa74ce0bcea68ccf464fb4a8d6e8db0ceb1f137691cba0193e451a20d572d4",
+    "frontend/src/views/admin/__tests__/AccountsView.usageWindowsHint.spec.ts": "506962cd4c1bb006a782ed810b4b0eb1e48635980f1bcb576298d2afbfa663f2",
+    "frontend/src/views/admin/__tests__/BackupView.spec.ts": "13327d05e890537fe7d5e5dc1c547ee7caf60be04cf781b42acb84c68786a046",
+    "frontend/src/views/admin/__tests__/ChannelMonitorView.checkModeBadge.spec.ts": "0d742c18ad4a0257dc09cf658e943bb191e1e9fd71dabbb662e688a3c5fba71d",
+    "frontend/src/views/admin/__tests__/ChannelMonitorView.duplicate.spec.ts": "f5bea8e2e7f054571433730e5033bbbae46cc2cb2230a16b0a1f6816cd4217d4",
+    "frontend/src/views/admin/__tests__/ChannelMonitorView.grok.spec.ts": "e88e8a7f8aa39cc96e885b07bd438f1dcd85635ac5b9a4ba3909332579873be5",
+    "frontend/src/views/admin/__tests__/DashboardView.spec.ts": "049094c59a031159bb392d30489a604ba08f2680c4dcdd1bb9bc06fec62c774d",
+    "frontend/src/views/admin/__tests__/FeatureSettings.locale.spec.ts": "25041727391edc44e59179cac26397a692316f8b71751bf4828944c026e707d0",
+    "frontend/src/views/admin/__tests__/GroupsView.codexManifest.spec.ts": "ae2d2f6422ea9321e47fadcf5e736537d514d628b0088aec9f30f9e9d13e8747",
+    "frontend/src/views/admin/__tests__/GroupsView.columnSettings.spec.ts": "cb4aaab54a673620070f475faea97cd131380e65847d889dcfdb45a817a30526",
+    "frontend/src/views/admin/__tests__/GroupsView.compositePlatforms.spec.ts": "669f0df8f5ec2f25ea9176c21f432a0a2b3a18e1ffde71f6ea48a1bf1bbc6088",
+    "frontend/src/views/admin/__tests__/GroupsView.duplicate.spec.ts": "b39c69e4016888ce3ffbea8843aa1212181bf80eadd018363334c86f47721b13",
+    "frontend/src/views/admin/__tests__/MonitorFormDialog.accountSelector.spec.ts": "ebe2a15dea14ea1eaf904133d13f10f97017e7f3256de60f7c47870e25a54131",
+    "frontend/src/views/admin/__tests__/PluginsView.spec.ts": "9a7d70612b97250c723e220324655ae859d8ab387944deb32ff02eb6cfde6749",
+    "frontend/src/views/admin/__tests__/ProxiesView.ipv6.spec.ts": "0640cf37493df4a4931fc9648f2ff3ed2fdc60b55eb4056fa4a6134c5e17d841",
+    "frontend/src/views/admin/__tests__/RedeemView.batchUpdate.spec.ts": "511c475cf326d30f72021bd095d2ca45b083201ebad89e28e05dff102e1bdb0c",
+    "frontend/src/views/admin/__tests__/RiskControlView.spec.ts": "82490c5661cdbf0017cff39c943d28a2cdc765be16bc25a37b412d906c8c0ca3",
+    "frontend/src/views/admin/__tests__/SettingsView.spec.ts": "2b086b6c875009322dbeb980501cb3523d36d47daa59ad292c3e4af31bd7d530",
+    "frontend/src/views/admin/__tests__/SubscriptionsView.userUsageLink.spec.ts": "ce9b237fddc38e8fe21c6495812b5c45a45995324fb043abb430ab343c51f95f",
+    "frontend/src/views/admin/__tests__/UsageView.spec.ts": "1eca105c671aaded5c302c5b3dbdb22a6fb88dac9269c00290e8b9c997bee735",
+    "frontend/src/views/admin/__tests__/UsersView.spec.ts": "c0e3b4eec3e1aad5cfca3c447a2a8182435ebefb4974505899a423743b4562a8",
+    "frontend/src/views/admin/__tests__/apiKeyGroupFilterOptions.spec.ts": "a90ef99370c79ffc003525ba67c65e7f8facee15fc2c2c7af51efd855727b0a6",
+    "frontend/src/views/admin/__tests__/channelPlatformOptions.spec.ts": "8ba65b39b8c33f398094d6d1c5e91ffdb654e281a2f378f5920f31a2af94e2bf",
+    "frontend/src/views/admin/__tests__/codexFingerprintSignals.spec.ts": "22822b50edf09877566b764720b0493d81ae18b99428cbd3c8c7208e26ba9ae3",
+    "frontend/src/views/admin/__tests__/groupModelAllowlist.spec.ts": "9b00c1bc6b7a5baf77ff84d3a6eaab0f3846bbd8276fb84f04fd0eced9986466",
+    "frontend/src/views/admin/__tests__/groupModelAllowlistLayout.spec.ts": "ab738587dd51df9e6cd538e7dbdd16a9d493b4319f207b54d01e020f74bcf99f",
+    "frontend/src/views/admin/__tests__/groupsImagePricing.spec.ts": "57983d6fc6a20b82a53242cdffe2940a63ee5e5fdad8bc6ccf4934398c2129fa",
+    "frontend/src/views/admin/__tests__/groupsMessagesDispatch.spec.ts": "f5a860aabadb60f7d8393a9f1a377f4973b0c755d3cc567a1c46871a5e81584f",
+    "frontend/src/views/admin/__tests__/groupsOpenAIFast.spec.ts": "0ca1e36051cfa35f8a25c6407e005513c2b2569493c5c835966017ac6d31ef25",
+    "frontend/src/views/admin/__tests__/groupsProfitControl.spec.ts": "cc30c4a6d9b3950ed45834356ddc4c2651f314e311ad861ea27c5dabaa7d1126",
+    "frontend/src/views/admin/__tests__/groupsReasoningEffort.spec.ts": "879cc34c9eef373db93a91ca260b0ff2175396279461789dfc14e09174216a24",
+    "frontend/src/views/admin/__tests__/groupsSupportedModelScopes.spec.ts": "09a9319b6a92398a380ede7d9f4a252b7319c5ce4079bc106be8c6965673a43a",
+    "frontend/src/views/admin/__tests__/groupsVideoModelPricing.spec.ts": "fa88cd7752094ccd30536c2b3715597d08ba1acf53b2c6b6420f05974b42fc72",
+    "frontend/src/views/admin/__tests__/modelAllowlistCandidates.spec.ts": "618d72589fea83ccbceab773bfe499b829ca9fcfab9933fe3224041d37a1e004",
+    "frontend/src/views/admin/__tests__/platformFilterCatalogUsage.spec.ts": "1b242d1ab4bc1953ae6c1a82259c9e3894c8dff6d09bfee023433ae3511232ff",
+    "frontend/src/views/admin/affiliates/AdminAffiliateInvitesView.vue": "3d1d8fa091905c7457f068eae4c7b01067ddc2a4f9bcc8454a6d4821c9b3e907",
+    "frontend/src/views/admin/affiliates/AdminAffiliateRebatesView.vue": "09c08019f128572165a23e73e8087b97cf53adcf08460e00a74e5fbce1683e67",
+    "frontend/src/views/admin/affiliates/AdminAffiliateRecordsTable.vue": "8e502de11342b2868d93684d0757a6206b5f680390ca3851513d9bbedfbea1e9",
+    "frontend/src/views/admin/affiliates/AdminAffiliateTransfersView.vue": "9a57b84356c8d25c91e0f118553e4d3f86836c44e427c3993f3099fa72989356",
+    "frontend/src/views/admin/apiKeyGroupFilterOptions.ts": "b7b494ba627b194bdccb5d283c51470df81f898f1b61b325b4b571ec7592cea9",
+    "frontend/src/views/admin/codexFingerprintSignals.ts": "1769e04b34c39f49c063ab56fd2dd77fd8e30ae0b49c65aaa249240294402df4",
+    "frontend/src/views/admin/groupModelAllowlist.ts": "bd7bd1225ab635e0816289789a7f4fadb0e792779fc07cf0238ce36ba1a7d420",
+    "frontend/src/views/admin/groupsImagePricing.ts": "5d60837bbf7da3fac1b1ea61a966b91c10ce8a0923383951d7ec5a1a1edf8094",
+    "frontend/src/views/admin/groupsMessagesDispatch.ts": "5b452b90a17c32797ea9770c8fc90d39665baf46ac690a3f9f944fd79f7a205f",
+    "frontend/src/views/admin/groupsOpenAIFast.ts": "e9405a14c8f1ac100cc5f4b4193036b9ab561b2ff6b08dbbb95f5aa9272a8941",
+    "frontend/src/views/admin/groupsProfitControl.ts": "5b4b7556ca3d57fe45ec1a0347ceccbabb61ca381fc52a07255b557f95a0fbbb",
+    "frontend/src/views/admin/groupsReasoningEffort.ts": "651f5bda0af206de231639b56a3ec4dada2c00b88f74851b5221dc151518006f",
+    "frontend/src/views/admin/groupsSupportedModelScopes.ts": "4b122a8d084250931e4ecf8c0b8b7f9001b3d6c70be42db3e6b7a6350b205762",
+    "frontend/src/views/admin/groupsVideoModelPricing.ts": "3e9a886b25f5922ffb453f1af48afdf111e38c76f9c69f54014f0814d3a0cbcf",
+    "frontend/src/views/admin/modelAllowlistCandidates.ts": "2fe8e0ec29caae44116132e86aea13274be222be58f815a2c3a7713b50bcab8f",
+    "frontend/src/views/admin/ops/OpsDashboard.vue": "e0b8cf7b283101b54c3e03b3f043059d4649c1c7c51989acd9df47e8c1b5387e",
+    "frontend/src/views/admin/ops/components/OpsAlertEventsCard.vue": "29146305ef0e6c162bf3d215e3700d2acda2ac4b1296e713f9e1710d6d450db1",
+    "frontend/src/views/admin/ops/components/OpsAlertRulesCard.vue": "11f51bed7fe41e02a5a36a6abf4461a455239b46440b9f4d35b8cc7176eae378",
+    "frontend/src/views/admin/ops/components/OpsConcurrencyCard.vue": "80782208616305b575005d8d8f4e48d37add28cc703bf0ee7519be9d56a25176",
+    "frontend/src/views/admin/ops/components/OpsDashboardHeader.vue": "5e1a752bab7cd853b87696bd51fc8144a4b1d5506a687fc145509458d7fbcb8d",
+    "frontend/src/views/admin/ops/components/OpsDashboardSkeleton.vue": "b1e0b5f50fbe6a854432fde5660dae85139706a69de9a43eb695a7effeaca552",
+    "frontend/src/views/admin/ops/components/OpsEmailNotificationCard.vue": "f7ccb7bb71cdf89df729e7f8a0afea4891c7d168ded1ef65720ca78a10897e92",
+    "frontend/src/views/admin/ops/components/OpsErrorDetailModal.vue": "e37e57ec312b9121a2fd3f1752a5d0c9db5e7a7b9fd9503634d128cfbf581f6b",
+    "frontend/src/views/admin/ops/components/OpsErrorDetailsModal.vue": "210d8de8b79e8ee4443c74c590154bb0e5aa0ef7cbc58bfc7b3e0678fafb41b3",
+    "frontend/src/views/admin/ops/components/OpsErrorDistributionChart.vue": "67e68c62ac1976716c0b77d30384cbefc270cf67b0358d7824d1d68d562e1ecf",
+    "frontend/src/views/admin/ops/components/OpsErrorLogTable.vue": "47b6e42dc4ae446a7fc16481a3c110b2bdf04eb48c94919c5e8b5893fe38e7ed",
+    "frontend/src/views/admin/ops/components/OpsErrorTrendChart.vue": "4b43480a24946e7c6cb2810245525ceba4702df85bad809313bfe54383a9c9a7",
+    "frontend/src/views/admin/ops/components/OpsLatencyChart.vue": "0b91182c45bd12871cc3229c04978aeac953c92e6bd59b5d622f7712fe162e82",
+    "frontend/src/views/admin/ops/components/OpsOpenAITokenStatsCard.vue": "f818074508d63f1101fa89cbb2f4caf376b6c60f2942c92586e59811753d0002",
+    "frontend/src/views/admin/ops/components/OpsRequestDetailsModal.vue": "f8531267cb848623a549041bb23282a268867c929bf2726c425be456e30281e9",
+    "frontend/src/views/admin/ops/components/OpsRuntimeSettingsCard.vue": "2bb7050e41a47914e89a98da3338e29a83b2eb9822949cf5a9408f66d1bff463",
+    "frontend/src/views/admin/ops/components/OpsSettingsDialog.vue": "0ffdf288ec10b9ed66390e374ec1837c5d211cc9f21e8b3d52403ec22da322ac",
+    "frontend/src/views/admin/ops/components/OpsSwitchRateTrendChart.vue": "0b9d4babd47b252fec19be23634cf95112e88f5508f436cd04f15a35c7057593",
+    "frontend/src/views/admin/ops/components/OpsSystemLogTable.vue": "392cb18e9abfec5d4304da2c661d352fd29bfdb3979d1e1821fde33fafca715b",
+    "frontend/src/views/admin/ops/components/OpsThroughputTrendChart.vue": "df3ad36095f78d3b618d48a9bd0b85ca4abf4625fbdf1fb4ee04b82383ff61d0",
+    "frontend/src/views/admin/ops/components/__tests__/OpsErrorDetailModal.spec.ts": "5ab1fb9a456b903f0efe0e8646f3f57775392ace13942d02fe9490d5a0b01e40",
+    "frontend/src/views/admin/ops/components/__tests__/OpsErrorLogTable.spec.ts": "f773d5f2e8a3668372dfb1fc49b9d30d2a4746040caa4604f0054e61f3917cc4",
+    "frontend/src/views/admin/ops/components/__tests__/OpsErrorScopeCharts.spec.ts": "f67731f46a1f22a817945b95d25c2c39503d0c4bdeeecfeb78928ecc1380484e",
+    "frontend/src/views/admin/ops/components/__tests__/OpsOpenAITokenStatsCard.spec.ts": "1b1ab8f45d5886821a9fac50e073f30ab18028682d1e74e96af43aaa7c0fe25f",
+    "frontend/src/views/admin/ops/components/__tests__/OpsSystemLogTable.spec.ts": "a845da1d219e900a51bf9b5c51ed16c81d913a84f82bb73752d2c4e87f6a8ebe",
+    "frontend/src/views/admin/ops/components/__tests__/OpsThroughputTrendChart.spec.ts": "5d8a3d0debce5d60d472f641847385d99f7ea5fb767da673f46a75e15edae34b",
+    "frontend/src/views/admin/ops/types.ts": "b4dfef53945c96557341f7ba4eefc08853c156408397fae48aec6c305891632f",
+    "frontend/src/views/admin/ops/utils/__tests__/errorDetailResponse.spec.ts": "5c8c4def06c084e0365c46fa235e94e508493c46d2def83744dd4aad57fef2b0",
+    "frontend/src/views/admin/ops/utils/__tests__/opsErrorParams.spec.ts": "7eae4ead4af8e33f0e67faa0bd894f43d2f772fd580723c1a9432541d1d432ab",
+    "frontend/src/views/admin/ops/utils/__tests__/opsFormatters.spec.ts": "e10b61431ac636b2b1f509fc2d220bbc27dc9a90ea0171c0bb5e53d55e15dce6",
+    "frontend/src/views/admin/ops/utils/errorDetailResponse.ts": "19f35542f506e44583e17c1e9bcd6f8efbaffea7de9374587845787bf6d0a8cb",
+    "frontend/src/views/admin/ops/utils/opsErrorParams.ts": "0a1ba7a6228ee5f446b0cd7b1473447a20e1100a7e37574b95b2a425e3ba9cdc",
+    "frontend/src/views/admin/ops/utils/opsFormatters.ts": "799b304854bb2775a35487335cfd7582dd099e5bf92224454ea19325850b2808",
+    "frontend/src/views/admin/orders/AdminOrdersView.vue": "50aa4afda334b1acc1ee9f17fe55b190a590bd78ef753d2b4ac3d8eb7c164535",
+    "frontend/src/views/admin/orders/AdminPaymentDashboardView.vue": "01b421dc014329e3f79788ffe356071bb57076a5628d550619ff983c1b21f98b",
+    "frontend/src/views/admin/orders/AdminPaymentPlansView.vue": "cb33b9a0ce7b42dc90cf16a0b1614a69523bad4083a7c1b5b4b945f83b335eb3",
+    "frontend/src/views/admin/orders/PlanEditDialog.vue": "995d9a995923ab3bbb70ef8aa2b7ea2648d56cd9755fb36e952d52703ae95563",
+    "frontend/src/views/admin/orders/__tests__/AdminPaymentPlansView.spec.ts": "0bf6f0cb08af7571ced269485bb4d0428485e7b252dad165ecf193a89423a772",
+    "frontend/src/views/admin/orders/__tests__/PlanEditDialog.spec.ts": "56afb5a217dea03260efe8704c6e3b03b6d5b3d4574486f5b4e39367d06c39de",
+    "frontend/src/views/admin/settings/EmailTemplateEditor.vue": "7c6abe13f58bb14658bed11eb7eec65d8706f5a16b73fc63f2470b4acb4d1980",
+    "frontend/src/views/admin/settings/OpenAIFastPolicyUserSelector.vue": "f1b928af1a74d8526cee81f81b2eaadadf9a84073a111ed2e4445a85eeac2d23",
+    "frontend/src/views/admin/settings/__tests__/OpenAIFastPolicyUserSelector.spec.ts": "a7c6c4fbf9546481da8e0daa1f06272dc04c6e7638a62da90b66172cdb3f4633",
+    "frontend/src/views/auth/DingTalkCallbackView.vue": "359fe4305074293ca96bea027bf212e54d6055837a46fc0e2b47ce8cab2d5280",
+    "frontend/src/views/auth/DingTalkEmailCompletionView.vue": "dd27f4b307d950c679ec27556e4e76319603515afb168955dc1fab73af6c9d89",
+    "frontend/src/views/auth/EmailVerifyView.vue": "87fc8dc1239437ddc3c70f968a0ed0505bf2d2047fb1030e2a82a35018fcb70f",
+    "frontend/src/views/auth/ForgotPasswordView.vue": "8d0450d3b475f38f88a79cfdd8c4640e9791d52f918511bf23d2492fb0713595",
+    "frontend/src/views/auth/LinuxDoCallbackView.vue": "f3781470e52f2f6d1164c8ab3c6b08c1ed1effdc241349c8f9a7a9b7e1ccca88",
+    "frontend/src/views/auth/LoginView.vue": "d7272eabf4e4cddf7142ce9bb590e21ab0948e2c1952bb02646b70a017922e39",
+    "frontend/src/views/auth/OAuthCallbackView.vue": "8dc435bea47124c981de3995d87a98448ca4eb0032f7c2212f100999fbab1e3a",
+    "frontend/src/views/auth/OidcCallbackView.vue": "f966e4a6e3469f1b552ac92330f75d3cfa480185ee959e0605a8c24392eb17f8",
+    "frontend/src/views/auth/README.md": "8ad2ff9f5a7509326bebe889c075333fb2451ed0f33a7505630bf0fba9916ad9",
+    "frontend/src/views/auth/RegisterView.vue": "48dff8c5e2dd8ee9673f0491c759ca23aad99dfcab0693ae3ee61a4115fe7646",
+    "frontend/src/views/auth/ResetPasswordView.vue": "8097e5066ec78f87d93e5fe43e589265a4b78ef4cc3cc28ecc7c7fae5424e1fb",
+    "frontend/src/views/auth/USAGE_EXAMPLES.md": "8e76c239173d483395720355504ce094f81e38b66a0c62fa182f97ba37fbb93d",
+    "frontend/src/views/auth/VISUAL_GUIDE.md": "52bc2e128fe6d4577f6c543db800e69fc6c5705f434cd7ee8a7fda4d9fd11c6a",
+    "frontend/src/views/auth/WechatCallbackView.vue": "91eb2450cfc33f5c8d1317a0396ad1386a449bbb3932f41165679f8d642a2937",
+    "frontend/src/views/auth/WechatPaymentCallbackView.vue": "8fbe92bbffdf751f00abd7d7837e75d4c874617a7fe5a4faefb9bb869257263e",
+    "frontend/src/views/auth/__tests__/EmailVerifyView.spec.ts": "ad3f531aef4ea71fa8830c0f02797c9e74c13ef953edb5b12f007bc88fa046a3",
+    "frontend/src/views/auth/__tests__/LinuxDoCallbackView.spec.ts": "0a5b276edabfa3a4602c7e1cd1283a01148d5c75f22689363f42fef3ea0d24d1",
+    "frontend/src/views/auth/__tests__/LoginView.spec.ts": "6528c56ecee44e129e0c39b943c2de8d36150cb521208f7f7834a641af306319",
+    "frontend/src/views/auth/__tests__/OAuthCallbackView.spec.ts": "ab56aac93d010ae0589b7b4ba5605ed50b6ccd0af4420c02f118dfdc949ac48a",
+    "frontend/src/views/auth/__tests__/OidcCallbackView.spec.ts": "47d3699d1332317c0a49190ee01af2cb3fcc9a007e710a2188fd9ee2b15044f1",
+    "frontend/src/views/auth/__tests__/RegisterView.spec.ts": "167cf639195e78db92f65a5202721dd34a3d2d1a62293bc34060ec367679084b",
+    "frontend/src/views/auth/__tests__/TencentCaptchaActionGate.spec.ts": "aec7b20a8861f0b9be0decfc4e2988e26e2ffa7ac59a08a00082315da615ac80",
+    "frontend/src/views/auth/__tests__/TencentCaptchaForgotPassword.spec.ts": "af02e9f465f137d8686a5ec97cb760ddf76f2adfb2477a9f74fc9b31d2201119",
+    "frontend/src/views/auth/__tests__/WechatCallbackView.spec.ts": "347c875a219d57b6487031ecf1e7e8008ac57e8e378a2dd13ad77847a0e69f43",
+    "frontend/src/views/auth/__tests__/WechatPaymentCallbackView.spec.ts": "46e9b35f463a51775f213e06cb34d0f603a780d0b8999bff0288775e5682bcef",
+    "frontend/src/views/auth/index.ts": "8f523c7ccdc427a165000e4b342086ffbb7f16b83b6f8a765d4a5c7bf86d6755",
+    "frontend/src/views/public/LegalDocumentView.vue": "8e9948d7b19914a623cd2e6d030a820c46f45b3b5c157d677d6d5406b3c64487",
+    "frontend/src/views/setup/SetupWizardView.vue": "a6b4e4c79e761164d7831cec8dc50efd4be32b2d84d7f5e279907989638ad416",
+    "frontend/src/views/user/AffiliateView.vue": "ca45cbf11e57586789adc08fb5b0cabf81cbb888ea335e4ccae7475e4d7dfb74",
+    "frontend/src/views/user/AirwallexPaymentView.vue": "e08a819bd52cfb3efac34208c7618b52ac5be3a34c54ac7480621a33b763ab5b",
+    "frontend/src/views/user/AvailableChannelsView.vue": "cfe6d517bff625f391b58f5adabb0f104d1cb2c80e9995df2236df3849f93e08",
+    "frontend/src/views/user/BatchImageGuideView.vue": "c8e2c14f8c77c99bedd30c9d42d5531b66e788d11500cc16f7f7e469c484c7e1",
+    "frontend/src/views/user/BillingView.vue": "d7256d1002fd6fa09913bbc8b1e314b6212839e942acabdd520462a73694cc41",
+    "frontend/src/views/user/ChannelStatusV1View.vue": "ffc09633a3df8669119488058719dab3f56c9cf282b0f99c5033df9b86cf55d9",
+    "frontend/src/views/user/ChannelStatusV2View.vue": "911dd40db4532bc25ea0bf3fec27d260ea00802f1f91beed5a1944671c6c566d",
+    "frontend/src/views/user/ChannelStatusView.vue": "4db54bba2d9d772a0c49b60ad30d739a3c69aae4f36c63861d46f44cdffaf1f1",
+    "frontend/src/views/user/CustomPageView.vue": "3f05109df3a5073e13c0d70325025e89fe58222074b7917a38dac622cad1a135",
+    "frontend/src/views/user/DashboardView.vue": "75cfce7617bf187dcc1bb2c27f1138fc0ae3ecf661ebc070639f63dd8fcd8054",
+    "frontend/src/views/user/KeysView.vue": "db2dc52e58530868f80f6b13e576ca0f65940149894d8dc0cd79b3a361587035",
+    "frontend/src/views/user/PaymentQRCodeView.vue": "2ac49a27f3ca5c731f0ea8e3a3c2b7e0421000a064268977275ba1ee8ca5864b",
+    "frontend/src/views/user/PaymentResultView.vue": "2689a01175bc775c6de02999d3b8dcce20fb10f6b7b4a185491d9c899b4b0c19",
+    "frontend/src/views/user/PaymentView.vue": "6e7c7b233c3959a919a2b7928b40c1befdd2c2d4124ceb4e75422c175bcaa580",
+    "frontend/src/views/user/ProfileView.vue": "37963e1d93fcda3957162b0b761591df68ddcc89c1caea47ce004acde40e1ff0",
+    "frontend/src/views/user/RedeemView.vue": "fcb8d6e2d07fd46f8277277d475be913f76f79a9ef20a20e1ca48cba40e5dd17",
+    "frontend/src/views/user/StripePaymentView.vue": "a505720ffcee5434bdcebd5dfd6675b619d5cf60489ac821c0796538a00586a4",
+    "frontend/src/views/user/StripePopupView.vue": "fe88457a8ccfb6618cc49fcc9934592639b9f32322a936e204b96dba60138a36",
+    "frontend/src/views/user/SubscriptionsView.vue": "f9f16261d39cc4d2f5a6a452206b3717f97dac712389b286c88ffbc1bdb1f048",
+    "frontend/src/views/user/TicketsView.vue": "d9e0a7843a83562412785c7a1e0b68b562728f7aa7b884165c2449d4b744797f",
+    "frontend/src/views/user/UsageView.vue": "a36b75ea330a02aa290a9a4761d0f25a44d4e1ed26e5990c069ac4f21e9439f9",
+    "frontend/src/views/user/UserOrdersView.vue": "6b785d0667407f40e8b23239f4aa378cb864012fa3aa573a2cef06fbca0a11cc",
+    "frontend/src/views/user/__tests__/AffiliateView.spec.ts": "0be297660ce8d4c07bb9e5bbe152960820403cc0842746550950a63ae37724e2",
+    "frontend/src/views/user/__tests__/AirwallexPaymentView.spec.ts": "e92fa06e78aa49785c775bb86ecba99cccf65101871493b51c01f92dbcb5b96e",
+    "frontend/src/views/user/__tests__/ChannelStatusView.mode.spec.ts": "d6bf0b8ab310d8d4d029f1ba89015100936003ccced0191c95f53f22ce1fe775",
+    "frontend/src/views/user/__tests__/CustomPageView.spec.ts": "4ea4b81b453f6a70466d0475f8faab8a54826ba7f3813731b5f8a1596aa44f9c",
+    "frontend/src/views/user/__tests__/DashboardView.relay.spec.ts": "ff70fd934f49d5bee52cf7488484e5b10d225391ea711cd3743b360563da5b71",
+    "frontend/src/views/user/__tests__/KeysView.spec.ts": "03ecbcd16cf63a64a67e6df98a1b367d6e0b3999ab7aec89fb3fc8706faf8dc8",
+    "frontend/src/views/user/__tests__/PaymentResultView.spec.ts": "f7684c9d2e37a702b8ae9a2e20b32995bd7ec707379552273a11fcb7fd970590",
+    "frontend/src/views/user/__tests__/PaymentView.spec.ts": "53cbd5a47abb5a0d811fb92bb65fae1c6862a8b7d475ec206d752516a56f544b",
+    "frontend/src/views/user/__tests__/ProfileView.spec.ts": "a1ae918e99dfb848050d39296e21b362ab25a06ac208f595662a4d22acf80d31",
+    "frontend/src/views/user/__tests__/StripePaymentView.spec.ts": "6b6506a6da594a0599c4d7f1edb590d659706643e1a95a4e326ffdb41addccc4",
+    "frontend/src/views/user/__tests__/UsageView.spec.ts": "4b15dc95a5b778edb8e1333ccb7ce57fb13a7543bdc616488bcc97357da93136",
+    "frontend/src/views/user/__tests__/paymentUx.spec.ts": "c9be534f11ac217bf60be013fe7c993a0936a7c3ce85c56b7a9f521fecaa2265",
+    "frontend/src/views/user/__tests__/paymentWechatResume.spec.ts": "03978b30f5de14103285a00941b4e75d55154ba169578df3bbdf693e2ef9083a",
+    "frontend/src/views/user/__tests__/stripeLazyLoading.spec.ts": "009c20419841cde4cd625ecf7178d3b07f29f46063adec5bbee754b0f4441c4c",
+    "frontend/src/views/user/paymentUx.ts": "4c9a50b3db490605f2b538da4aed8e40db74571a7720425e23ceb6b5a7e28d70",
+    "frontend/src/views/user/paymentWechatResume.ts": "4b0e049b945881618f19a4fbe2c16d40a2c6d94c972e76f029d367e62e2d7e1c",
+    "frontend/src/vite-env.d.ts": "a8fd09645cb5ef0453626a0a069a0d4431ffb39a0314bc0c6079467554b70027",
+    "frontend/tailwind.config.js": "717af6397bf3c1b57fee20b15528d1c27d1241e4db686dcf79dba2effb27fb3d",
+    "frontend/tsconfig.json": "f98ff6cf3dda571189c0220ab3a7e52305e393856650785be136edd403217fe6",
+    "frontend/tsconfig.node.json": "9e2abb169ea87b7190613a1d4da57ca608463a453bd4231fa3aeee5e308370dd",
+    "frontend/vite.config.ts": "815b3dec61328dc35361667718016d2c192dd5236f90fd062c8a5d5293d22538",
+    "frontend/vitest.config.ts": "eb99f89f64283871d78832377a1a22769c216d6c4b1e6ef03733531071ece297",
+    "openspec/changes/add-openai-compatible-prompt-audit/.openspec.yaml": "cbe77f7cdd1eb53a9af2409ba4d32d1520863ffedadf79c7cc4b2470c9b6432b",
+    "openspec/changes/add-openai-compatible-prompt-audit/README.md": "37fa08f05fac23d9537c82d7177a1fc6534c7eb66d61bef80ce1cdb819edb708",
+    "openspec/changes/add-openai-compatible-prompt-audit/design.md": "4d40224ec5bb76a58623de8af8e7fefe7e1abba354e4b2791b6898aefce892df",
+    "openspec/changes/add-openai-compatible-prompt-audit/implementation-evidence.md": "696828439b45a29e3c73eb08bc52ce41c8242b9bb910791b0456afa46f6791dd",
+    "openspec/changes/add-openai-compatible-prompt-audit/implementation-guide.md": "5809e7badcc271a9753b9535cc1da37799ac1ee90cc5249b95d3a28ed4bbae91",
+    "openspec/changes/add-openai-compatible-prompt-audit/proposal.md": "b5e50f1d852491677801b0a2d5bfa59db3f510632e0587bdc73b35179e6f87ce",
+    "openspec/changes/add-openai-compatible-prompt-audit/source-baseline.md": "39c3f2d2d9072f9b263dce9eeb1aec5eda8ee4bafce3f85e46e8bf63431c2c57",
+    "openspec/changes/add-openai-compatible-prompt-audit/source-feature-map.md": "8496c026e7a17c5f43f7ef29e295554c1df4ea20acb8e1cf6a7935bcdb31966e",
+    "openspec/changes/add-openai-compatible-prompt-audit/source-freeze/MANIFEST.md": "badab312bf6af4d2c77857a9400381f4da4fbf45722d9f4a6df23bc7005273b6",
+    "openspec/changes/add-openai-compatible-prompt-audit/source-freeze/aicodex-prompt-audit-tracked.patch": "f751a13cce3f3a73cd60cae3aececcef6e1e76dcec8c551a7a4747f032234d2b",
+    "openspec/changes/add-openai-compatible-prompt-audit/specs/prompt-input-audit/spec.md": "2056c3556cfd8f7cd9d84e482636adfcb8166d3cfa3110401dbe6a3d32468b3e",
+    "openspec/changes/add-openai-compatible-prompt-audit/specs/prompt-input-guard/spec.md": "ff5af56d8e3cab0129f39a22a390b7c63ce0d708972b4e0d381d7d09e038f066",
+    "openspec/changes/add-openai-compatible-prompt-audit/specs/security-audit-console/spec.md": "79e7bc2b6175585c5ff25bf580ef0179d6c263a987de61363ae3826e019d9995",
+    "openspec/changes/add-openai-compatible-prompt-audit/tasks.md": "377b862211cd316d051cecb96309c5ff2f0f3fe475cd4bf99688a0a4ab3c903a",
+    "openspec/changes/add-openai-compatible-prompt-audit/verification.md": "49b6654c4d30a140c4fdaee38078fb967d9a7fd86934c59e6e03aafe7db62b79",
+    "openspec/changes/codex-manifest-pinned-accounts/.openspec.yaml": "d612751ea74db7310fb72eea452668b4fe243c950df13937d76bc3c269b740ac",
+    "openspec/changes/codex-manifest-pinned-accounts/design.md": "57e218954372ac01a795dfaa514577172fc502d2f0f1a891b0e8748a6c4fa8b5",
+    "openspec/changes/codex-manifest-pinned-accounts/proposal.md": "a0758c8c50be43c73330b5ad11468f1687ac9f3a7a14ecf4303ae99d542c37b9",
+    "openspec/changes/codex-manifest-pinned-accounts/specs/codex-manifest-cache/spec.md": "8a68c5faf833093d4d66e9167523dd3a30feaf266d7ea9ebe30d47d0713facfd",
+    "openspec/changes/codex-manifest-pinned-accounts/specs/codex-manifest-pinned-accounts/spec.md": "449884c0324dc22e2d67fa9cd1f321bd89ef7d79ac26ba95d047c159119bf010",
+    "openspec/changes/codex-manifest-pinned-accounts/tasks.md": "e0e83fa2755049d7db9fc494a1f51d93eddb6b3735ab1c99889a5142f3105a0f",
+    "openspec/changes/codex-manifest-pinned-accounts/verification.md": "7f089c37d153b5fb8e885e1a6e89eb089d923a84ce4e2439637ab9152f2ec3a3",
+    "skills/sub2api-admin/SKILL.md": "6b7730a94d8e6604d5a7ce86c08a8afad455a33207f114ca77a5b4b4fe6a4608",
+    "skills/sub2api-admin/agents/openai.yaml": "3c37355cbc143d0c95813c1cd7fd754b5b7cc8bab2de6e8c14f215fadbccc0c7",
+    "skills/sub2api-admin/references/admin-cli.md": "0a5a6c17b5228e5240fb06388cc3f2daa5d9a67b6589e81b7105f516200bd177",
+    "skills/sub2api-admin/scripts/sub2api-admin.js": "ddf058f5c315a07acae6af7d1d0a3411f1f8d2aa955b4f502b32690dd2f05768",
+    "tools/archive-mode1-local.py": "9a9c2a4d2c39bd3bebd36f335c5db208327d21cfe2f55b04845fdc6c5580c857",
+    "tools/package-relay.py": "f7690b16771e2f30e3a6af51164dbadf8bd7b5b45dd2a90585d53b0a4be14888",
+    "upgrade024-release-manifest.json": "4bfa08220fe1658ff2f7498ddfb9ba550685f7ac800c8841be7f8024f8d757e2",
+    "verification/backend-build.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+    "verification/backend-tests.jsonl": "97b787b7fb9ad4d7e1a409700272eea0fd26f4ab07340da553e943dd046ad986",
+    "verification/final-focused-tests.log": "25430ad597218c9d42c4bc64f2d85a2973cb9d03c65f368ab7a8c322220320b4",
+    "verification/frontend-build.log": "fa746e4286c97ac7a2e94af58c0698413b6d3d4c1b06d43e3e28696939fff4ac",
+    "verification/frontend-tests.json": "5edda14b9dba5aaca3ed4e37b514927956a892123b9e989038711d71af068d89",
+    "verification/frontend-tests.log": "8c25f38d03c9f0a288331e6d6229ae2edb24ee3ed993147167eb0b3bff7e4548",
+    "verification/go-vet.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+    "verification/rebuild/backend-compatibility.jsonl": "7518156726e7a2808362b5f8b6e2e442359b143b4c213a3efd385806728778cf",
+    "verification/rebuild/backend-focused-final.jsonl": "e47ce2390693aea3e5c7aca74d2294ec967194f551b4caedd762edd5ae2d0f9a",
+    "verification/rebuild/deployed-source-sha256.json": "ab5dcea508f819af2d9e6e629dd9a853222b862c9507af376b1881d4c4f32044",
+    "verification/rebuild/final-state.json": "e479c1585b0994fc37c2b774ed081387fdfe94c33c648827a0e3a308910f71ea",
+    "verification/rebuild/frontend-protection-tests.json": "7d6e12ac329c50eb7592c696405c2cdf38f128682a8d9b93632eaafebcbe3bd5",
+    "verification/rebuild/frontend-site-tests.json": "c5953573fac93d6fd5b6ab4c93b6c35a3f35468e527e27a91ef07e5ace9c4642",
+    "verification/rebuild/go-vet.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+    "verification/rebuild/mode1-agent-final.log": "4e1730bf9081329a74e09a1c39ab335b6a03745d58e893d22aba3e4180108737",
+    "verification/rebuild/server-release-build.log": "f4736baed1c148a45c9d1bb640665f65ca72d6d48c8d4e25e5aa18a166953193",
+    "verification/rebuild/server-smoke-final.json": "28ec2c54bc405bc97300b1429f4bf823e9eee8297f0d028065c98c3fbe772efb",
+    "verification/rebuild/server-smoke-initial.json": "28ec2c54bc405bc97300b1429f4bf823e9eee8297f0d028065c98c3fbe772efb",
+    "verification/rebuild/source-comparison.json": "d85a806b0eb7a3e6c07aca9e07f748fa61b7184115d92c7cfaea77b54da3823b",
+    "verification/rebuild/upgrade-regression-reproduction.log": "2a5367af5bbda197c31ffa1b0f1c47863da9c392d880c8c6cd229527207df5ca",
+    "verification/rebuild/upgrade-regression-reproduction_test.go.txt": "e070758b928d129b34bbf4bc30ed38eba8280c214a54c9ff453814c14a3f21ba",
+    "verification/rebuild/upstream-readiness.json": "d653a366605a8889bd774b7f688261894f28bbf1399059cbfca3eabef681706e",
+    "verification/rebuild/ws-pool-repeated.log": "1d03b50803ec59924bbf30d5e492a215aadaf158f66cb42ded90c31bfd391b4e",
+    "verification/rebuild/ws-v3-repeated.log": "2346099c272f9566b25b9aff560ed7e643c4c0e22a18b0bc8c1629d533b29968",
+    "澄川新站说明.md": "13fb397eeb9cc6c2dfc24a2961b43b0bbc65d1a48816823bbe6890b0bbc75c3d"
+  }
+}

+ 32 - 0
assets/logo.svg

@@ -0,0 +1,32 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title desc">
+  <title id="title">Sub2API</title>
+  <desc id="desc">An interlocking S symbol representing subscription routing into APIs.</desc>
+  <defs>
+    <linearGradient id="s2a-bg" x1="72" y1="44" x2="442" y2="478" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#142B56"/>
+      <stop offset=".52" stop-color="#0A1A39"/>
+      <stop offset="1" stop-color="#061127"/>
+    </linearGradient>
+    <radialGradient id="s2a-ambient" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(168 92) rotate(51) scale(342 382)">
+      <stop stop-color="#3E68B0" stop-opacity=".28"/>
+      <stop offset="1" stop-color="#3E68B0" stop-opacity="0"/>
+    </radialGradient>
+    <linearGradient id="s2a-brand" x1="4" y1="4" x2="20" y2="20" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#79F4BD"/>
+      <stop offset=".48" stop-color="#39D9E7"/>
+      <stop offset="1" stop-color="#3875F6"/>
+    </linearGradient>
+    <filter id="s2a-shadow" x="-25%" y="-25%" width="150%" height="165%" color-interpolation-filters="sRGB">
+      <feDropShadow dx="0" dy=".55" stdDeviation=".65" flood-color="#020817" flood-opacity=".34"/>
+    </filter>
+  </defs>
+
+  <rect x="16" y="16" width="480" height="480" rx="120" fill="url(#s2a-bg)"/>
+  <rect x="16" y="16" width="480" height="480" rx="120" fill="url(#s2a-ambient)"/>
+  <rect x="16.75" y="16.75" width="478.5" height="478.5" rx="119.25" fill="none" stroke="#A5BFFF" stroke-opacity=".16" stroke-width="1.5"/>
+
+  <g transform="translate(52 52) scale(17)" fill="none" stroke="url(#s2a-brand)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.7" filter="url(#s2a-shadow)">
+    <path d="m19.25 7.65-2.55-3.2a1.33 1.33 0 0 0-1.03-.5H8.58c-.34 0-.67.13-.91.37L4.15 7.65c-.93.88-.6 1.52.65 2.3l9.55 5.97"/>
+    <path d="m4.75 16.35 2.55 3.2c.25.31.63.5 1.03.5h7.09c.34 0 .67-.13.91-.37l3.52-3.33c.93-.88.6-1.52-.65-2.3L9.65 8.08"/>
+  </g>
+</svg>

BIN
assets/partners/logos/RoxyBrowser.png


BIN
assets/partners/logos/aigocode.png


BIN
assets/partners/logos/aimzoon.jpg


BIN
assets/partners/logos/apikey-fun.png


BIN
assets/partners/logos/apimart.jpg


Some files were not shown because too many files changed in this diff