debugResearch.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /**
  2. * 深度研究功能调试工具
  3. *
  4. * 使用方法:
  5. * 1. 在浏览器控制台导入:import { debugResearch } from './utils/debugResearch'
  6. * 2. 运行测试:debugResearch.testCreateResearch('测试问题')
  7. */
  8. import { researchApi } from '../services/researchApi';
  9. export const debugResearch = {
  10. /**
  11. * 测试创建研究任务
  12. */
  13. async testCreateResearch(query: string = '什么是量子计算?') {
  14. console.group('🔍 测试创建研究任务');
  15. console.log('查询:', query);
  16. try {
  17. let messageCount = 0;
  18. let accumulatedContent = '';
  19. let lastMessage: any = null;
  20. const startTime = Date.now();
  21. for await (const message of researchApi.createResearch({
  22. query,
  23. output_format: 'model_detailed_report'
  24. })) {
  25. messageCount++;
  26. console.log(`📨 消息 #${messageCount}:`, message);
  27. if (message.content) {
  28. accumulatedContent += message.content;
  29. console.log(`📝 累积内容长度: ${accumulatedContent.length}`);
  30. }
  31. lastMessage = message;
  32. if (message.done) {
  33. console.log('✅ 收到完成标记');
  34. console.log('Task ID:', message.task_id);
  35. console.log('累积内容:', accumulatedContent);
  36. break;
  37. }
  38. }
  39. const duration = Date.now() - startTime;
  40. console.log('📊 统计信息:');
  41. console.log('- 总消息数:', messageCount);
  42. console.log('- 累积内容长度:', accumulatedContent.length);
  43. console.log('- 耗时:', `${duration}ms`);
  44. console.log('- 最后消息:', lastMessage);
  45. if (!lastMessage?.done) {
  46. console.warn('⚠️ 警告: 未收到完成标记');
  47. }
  48. if (!lastMessage?.task_id) {
  49. console.error('❌ 错误: 未收到 task_id');
  50. }
  51. if (!accumulatedContent) {
  52. console.error('❌ 错误: 未收到任何内容');
  53. }
  54. console.groupEnd();
  55. return {
  56. success: !!lastMessage?.done && !!lastMessage?.task_id,
  57. messageCount,
  58. contentLength: accumulatedContent.length,
  59. duration,
  60. taskId: lastMessage?.task_id,
  61. content: accumulatedContent
  62. };
  63. } catch (error) {
  64. console.error('❌ 测试失败:', error);
  65. console.groupEnd();
  66. throw error;
  67. }
  68. },
  69. /**
  70. * 测试原始 HTTP 请求
  71. */
  72. async testRawRequest(query: string = '什么是量子计算?') {
  73. console.group('🔍 测试原始 HTTP 请求');
  74. const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
  75. const url = `${API_BASE_URL}/api/v1/research/create`;
  76. console.log('URL:', url);
  77. console.log('请求体:', { query, output_format: 'model_detailed_report' });
  78. try {
  79. const response = await fetch(url, {
  80. method: 'POST',
  81. headers: {
  82. 'Content-Type': 'application/json',
  83. 'Authorization': localStorage.getItem('token') || ''
  84. },
  85. body: JSON.stringify({
  86. query,
  87. output_format: 'model_detailed_report'
  88. })
  89. });
  90. console.log('响应状态:', response.status, response.statusText);
  91. console.log('响应头:', Object.fromEntries(response.headers.entries()));
  92. if (!response.ok) {
  93. const errorText = await response.text();
  94. console.error('错误响应:', errorText);
  95. console.groupEnd();
  96. return;
  97. }
  98. const reader = response.body?.getReader();
  99. if (!reader) {
  100. console.error('❌ 无法获取 reader');
  101. console.groupEnd();
  102. return;
  103. }
  104. const decoder = new TextDecoder();
  105. let chunkCount = 0;
  106. let totalBytes = 0;
  107. while (true) {
  108. const { done, value } = await reader.read();
  109. if (done) {
  110. console.log('✅ 流结束');
  111. break;
  112. }
  113. chunkCount++;
  114. totalBytes += value.length;
  115. const chunk = decoder.decode(value, { stream: true });
  116. console.log(`📦 Chunk #${chunkCount} (${value.length} bytes):`, chunk);
  117. }
  118. console.log('📊 统计:');
  119. console.log('- 总块数:', chunkCount);
  120. console.log('- 总字节数:', totalBytes);
  121. console.groupEnd();
  122. } catch (error) {
  123. console.error('❌ 请求失败:', error);
  124. console.groupEnd();
  125. throw error;
  126. }
  127. },
  128. /**
  129. * 检查环境配置
  130. */
  131. checkConfig() {
  132. console.group('⚙️ 环境配置检查');
  133. console.log('API Base URL:', import.meta.env.VITE_API_BASE_URL);
  134. console.log('Token:', localStorage.getItem('token') ? '已设置' : '未设置');
  135. const token = localStorage.getItem('token');
  136. if (token) {
  137. try {
  138. const payload = JSON.parse(atob(token.split('.')[1]));
  139. console.log('Token 信息:', payload);
  140. } catch (e) {
  141. console.error('Token 解析失败');
  142. }
  143. }
  144. console.groupEnd();
  145. }
  146. };
  147. // 在开发环境下挂载到 window 对象
  148. if (import.meta.env.DEV) {
  149. (window as any).debugResearch = debugResearch;
  150. console.log('💡 调试工具已加载,使用 window.debugResearch 访问');
  151. }