test.html 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <!DOCTYPE html>
  2. <html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
  3. <title>药典AI 连接测试</title>
  4. <style>
  5. body{font-family:sans-serif;padding:20px;max-width:800px;margin:0 auto}
  6. h3{color:#002FA7}
  7. #log{background:#f5f5f5;padding:12px;border-radius:8px;margin-top:12px;font-size:13px;white-space:pre-wrap;min-height:120px;max-height:400px;overflow-y:auto}
  8. .status{font-size:12px;color:#666;margin-top:8px}
  9. button{padding:8px 16px;background:#002FA7;color:#fff;border:none;border-radius:6px;cursor:pointer;margin-left:8px}
  10. button:hover{background:#001a5c}
  11. input{padding:8px;width:60%;border:1px solid #ccc;border-radius:6px}
  12. </style>
  13. </head><body>
  14. <h3>药典AI 连接测试</h3>
  15. <div>
  16. <input id="apiBase" placeholder="API 地址" value="http://localhost:9000" style="width:40%">
  17. <input id="q" placeholder="输入问题" style="width:40%">
  18. <button onclick="go()">发送</button>
  19. </div>
  20. <div class="status" id="status">需在外部系统登录后,通过 URL ?token=xxx 传入或手动粘贴 Token</div>
  21. <div id="log">等待输入...</div>
  22. <div style="margin-top:8px">
  23. <input id="tokenInput" placeholder="手动粘贴 JWT Token(或从 URL ?token= 读取)" style="width:80%;font-size:12px">
  24. </div>
  25. <script>
  26. // 优先从 URL 参数读取 token,其次取输入框
  27. var TOKEN = (function(){
  28. var p = new URLSearchParams(window.location.search);
  29. var t = p.get('token') || '';
  30. if (t) {
  31. setTimeout(function(){
  32. document.getElementById('tokenInput').value = t;
  33. document.getElementById('tokenInput').placeholder = '已从 URL 加载 Token';
  34. }, 0);
  35. }
  36. return t;
  37. })();
  38. function log(m) {
  39. var el = document.getElementById('log');
  40. el.textContent += m + '\n';
  41. el.scrollTop = el.scrollHeight;
  42. }
  43. async function go() {
  44. var apiBase = document.getElementById('apiBase').value.trim().replace(/\/$/, '');
  45. var q = document.getElementById('q').value.trim();
  46. if (!q) return;
  47. document.getElementById('log').textContent = '';
  48. // 如果没有 URL 传入的 token,尝试读取输入框
  49. if (!TOKEN) {
  50. TOKEN = document.getElementById('tokenInput').value.trim();
  51. }
  52. if (!TOKEN) {
  53. log('错误: 请先在外部系统登录获取 Token,粘贴到上方输入框');
  54. return;
  55. }
  56. log('发送: ' + q);
  57. try {
  58. var r = await fetch(apiBase + '/api/v1/chat/stream', {
  59. method: 'POST',
  60. headers: {
  61. 'Content-Type': 'application/json',
  62. 'Accept': 'text/event-stream',
  63. 'Authorization': 'Bearer ' + TOKEN
  64. },
  65. body: JSON.stringify({message: q})
  66. });
  67. if (r.status === 401) {
  68. log('Token 无效或已过期,请重新获取 Token');
  69. TOKEN = '';
  70. return;
  71. }
  72. if (!r.ok) throw new Error('HTTP ' + r.status);
  73. log('连接成功,开始接收...');
  74. var reader = r.body.getReader();
  75. var decoder = new TextDecoder();
  76. var buf = '', txt = '';
  77. var curEvent = 'content';
  78. while (true) {
  79. var result = await reader.read();
  80. if (result.done) break;
  81. buf += decoder.decode(result.value, {stream: true});
  82. var lines = buf.split('\n');
  83. buf = lines.pop() || '';
  84. for (var i = 0; i < lines.length; i++) {
  85. var l = lines[i];
  86. if (l.indexOf('event:') === 0) { curEvent = l.substring(6).trim(); continue; }
  87. if (l.indexOf('data:') !== 0) continue;
  88. var v = l.slice(5);
  89. if (v[0] === ' ') v = v.substring(1);
  90. if (v === '[DONE]') { log('\n[DONE]'); continue; }
  91. if (curEvent === 'intent') { log('[intent] ' + v); }
  92. else if (curEvent === 'status') { log('[status] ' + v); }
  93. else if (curEvent === 'meta') { log('[meta] ' + v); }
  94. else {
  95. txt += v;
  96. document.getElementById('log').textContent = '接收中...\n' + txt.slice(-500);
  97. }
  98. }
  99. }
  100. log('\n完成');
  101. } catch (e) {
  102. log('错误: ' + e.message);
  103. }
  104. }
  105. </script></body></html>