Ingen beskrivning
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ai-response.component.html 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <div class="ai-response-container">
  2. <!-- 头部工具栏 -->
  3. <div class="header-toolbar">
  4. <div class="session-info">
  5. @if (currentResponse) {
  6. <div class="type-indicator" [style.backgroundColor]="getTypeColor(getCurrentType())">
  7. <mat-icon class="type-icon">{{ getTypeIcon(getCurrentType()) }}</mat-icon>
  8. <span class="type-label">{{ getTypeLabel(getCurrentType()) }}</span>
  9. </div>
  10. <div class="session-id">
  11. <mat-icon>fingerprint</mat-icon>
  12. <span>{{ getCurrentSessionId() | slice:0:8 }}...</span>
  13. </div>
  14. <div class="timestamp">
  15. <mat-icon>schedule</mat-icon>
  16. <span>{{ getFormattedTimestamp() }}</span>
  17. </div>
  18. } @else {
  19. <div class="empty-state">
  20. <mat-icon>smart_toy</mat-icon>
  21. <span>等待AI回复...</span>
  22. </div>
  23. }
  24. </div>
  25. <div class="toolbar-actions">
  26. <button mat-icon-button matTooltip="切换完整/折叠视图" (click)="toggleFullText()">
  27. <mat-icon>{{ showFullText ? 'unfold_less' : 'unfold_more' }}</mat-icon>
  28. </button>
  29. <button mat-icon-button matTooltip="清空响应" (click)="clearResponses()">
  30. <mat-icon>delete</mat-icon>
  31. </button>
  32. </div>
  33. </div>
  34. <!-- 内容区域 -->
  35. <div class="content-area" [class.streaming]="isStreaming" [class.collapsed]="!showFullText">
  36. @if (currentResponse) {
  37. <div class="content-wrapper">
  38. <!-- 响应内容 -->
  39. <div class="response-content" [innerHTML]="getDisplayContent() | markdown"></div>
  40. <!-- 流式传输进度 -->
  41. @if (isStreaming) {
  42. <div class="streaming-indicator">
  43. <mat-progress-bar mode="determinate" [value]="streamingProgress"></mat-progress-bar>
  44. <div class="streaming-text">
  45. <mat-icon>hourglass_empty</mat-icon>
  46. <span>AI正在思考... {{ streamingProgress | number:'1.0-0' }}%</span>
  47. </div>
  48. </div>
  49. } @else {
  50. <div class="response-complete">
  51. <mat-icon>check_circle</mat-icon>
  52. <span>回复完成</span>
  53. </div>
  54. }
  55. </div>
  56. } @else {
  57. <div class="no-response">
  58. <mat-icon class="empty-icon">chat</mat-icon>
  59. <p>暂无AI回复内容</p>
  60. <p class="hint">AI的回复将实时显示在这里</p>
  61. </div>
  62. }
  63. </div>
  64. <!-- 响应历史(可选) -->
  65. @if (responses.length > 1) {
  66. <div class="response-history">
  67. <div class="history-header">
  68. <mat-icon>history</mat-icon>
  69. <span>历史响应 ({{ responses.length - 1 }})</span>
  70. </div>
  71. <div class="history-list">
  72. @for (response of responses.slice(-5); track $index) {
  73. @if (response !== currentResponse) {
  74. <div class="history-item"
  75. [style.borderLeftColor]="getTypeColor(response.type)"
  76. (click)="currentResponse = response">
  77. <div class="history-type-icon">
  78. <mat-icon>{{ getTypeIcon(response.type) }}</mat-icon>
  79. </div>
  80. <div class="history-content">
  81. <div class="history-session">{{ response.sessionId | slice:0:6 }}...</div>
  82. <div class="history-preview">{{ response.content | slice:0:60 }}...</div>
  83. </div>
  84. <div class="history-time">
  85. {{ response.timestamp | date:'HH:mm' }}
  86. </div>
  87. </div>
  88. }
  89. }
  90. </div>
  91. </div>
  92. }
  93. </div>