api-management.component.html 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <section class="api-management-page">
  2. <app-page-header
  3. title="API 管理"
  4. eyebrow="System / API"
  5. description="查看国内 VOC Cloud Function 的 AI 网关配置与实时连通状态。"
  6. icon="◇"
  7. [crumbs]="crumbs">
  8. <app-neu-button pageHeaderActions size="sm" (btnClick)="loadStatus()" [disabled]="loading">刷新状态</app-neu-button>
  9. <app-neu-button pageHeaderActions size="sm" color="primary" (btnClick)="openPromptSettings()">AI 提示词</app-neu-button>
  10. </app-page-header>
  11. <app-page-toolbar [fields]="toolbarFields">
  12. <div pageToolbarActions>
  13. <app-neu-button size="sm" (btnClick)="loadStatus()" [disabled]="loading">刷新状态</app-neu-button>
  14. <app-neu-button size="sm" color="primary" (btnClick)="openPromptSettings()">AI 提示词</app-neu-button>
  15. </div>
  16. </app-page-toolbar>
  17. <div class="api-metric-grid">
  18. <app-summary-metric-card
  19. label="AI 服务"
  20. [value]="status?.configured ? '已配置' : '未配置'"
  21. icon="✦"
  22. [tone]="status?.configured ? 'green' : 'amber'"
  23. description="密钥仅保存在 Cloud Function 环境">
  24. </app-summary-metric-card>
  25. <app-summary-metric-card
  26. label="默认模型"
  27. [value]="modelLabel(status?.defaultModel)"
  28. icon="□"
  29. tone="blue"
  30. description="由提示词管理页覆盖">
  31. </app-summary-metric-card>
  32. <app-summary-metric-card
  33. label="最近测试"
  34. [value]="testResult?.ok ? '正常' : (testResult ? '异常' : '未测试')"
  35. icon="↗"
  36. [tone]="testResult?.ok ? 'green' : 'purple'"
  37. [description]="testResult?.latencyMs ? testResult?.latencyMs + ' ms' : '点击下方按钮执行真实请求'">
  38. </app-summary-metric-card>
  39. </div>
  40. <app-content-card title="AI 分析网关" subtitle="浏览器调用白名单 Cloud action,由服务端转发到 Fmode AI" tone="blue">
  41. <div class="gateway-layout">
  42. <dl class="gateway-fields">
  43. <div><dt>服务名称</dt><dd>{{ status?.service || (loading ? '读取中...' : '-') }}</dd></div>
  44. <div><dt>上游地址</dt><dd>{{ status?.baseUrl || '-' }}</dd></div>
  45. <div><dt>Cloud action</dt><dd>{{ status?.proxyEndpoint || 'ai.chat' }}</dd></div>
  46. <div><dt>默认模型</dt><dd>{{ modelLabel(status?.defaultModel) }}</dd></div>
  47. <div><dt>服务端密钥</dt><dd>{{ status?.configured ? '已配置' : '未配置' }}</dd></div>
  48. </dl>
  49. <div class="gateway-actions">
  50. <app-neu-button color="primary" (btnClick)="testConnection()" [disabled]="testing || !status?.configured">
  51. {{ testing ? '测试中...' : '测试 AI 服务' }}
  52. </app-neu-button>
  53. @if (testResult) {
  54. <div class="test-result" [class.success]="testResult.ok" [class.failed]="!testResult.ok">
  55. <strong>{{ testResult.ok ? '连接正常' : '连接失败' }}</strong>
  56. <span>{{ testResult.ok ? (modelLabel(testResult.model || status?.defaultModel) + ' · ' + (testResult.latencyMs || 0) + ' ms') : testResult.error }}</span>
  57. </div>
  58. }
  59. @if (error) {
  60. <div class="test-result failed"><strong>后端不可用</strong><span>{{ error }}</span></div>
  61. }
  62. </div>
  63. </div>
  64. </app-content-card>
  65. <app-content-card title="链路边界" subtitle="国内版采用服务端代理,不向浏览器暴露上游凭证" tone="green" variant="dashed">
  66. <div class="request-flow" aria-label="AI 请求链路">
  67. <span>竞品评论</span><i>→</i><span>共享 AI 组件</span><i>→</i><span>Cloud Function</span><i>→</i><span>Fmode AI</span>
  68. </div>
  69. </app-content-card>
  70. </section>