{"id":288511,"date":"2026-02-11T02:54:52","date_gmt":"2026-02-10T18:54:52","guid":{"rendered":"https:\/\/m.iteamworld.com\/?page_id=288511"},"modified":"2026-08-07T21:48:21","modified_gmt":"2026-08-07T13:48:21","slug":"ai-jiankangguanjia","status":"publish","type":"page","link":"https:\/\/m.iteamworld.com\/zh-hans\/ai-jiankangguanjia\/","title":{"rendered":"AI \u5065\u5eb7\u7ba1\u5bb6"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"1280\" height=\"564\" src=\"https:\/\/m.iteamworld.com\/wp-content\/uploads\/media_uploads\/AI-\u5065\u5eb7\u7ba1\u5bb6-\u81ea\u52a8\u5316\u5065\u5eb7\u54a8\u8be2_-Cover-Page_1280-x-564-v2.jpg\" alt=\"\" class=\"wp-image-290956\" srcset=\"https:\/\/m.iteamworld.com\/wp-content\/uploads\/media_uploads\/AI-\u5065\u5eb7\u7ba1\u5bb6-\u81ea\u52a8\u5316\u5065\u5eb7\u54a8\u8be2_-Cover-Page_1280-x-564-v2.jpg 1280w, https:\/\/m.iteamworld.com\/wp-content\/uploads\/media_uploads\/AI-\u5065\u5eb7\u7ba1\u5bb6-\u81ea\u52a8\u5316\u5065\u5eb7\u54a8\u8be2_-Cover-Page_1280-x-564-v2-800x353.jpg 800w, https:\/\/m.iteamworld.com\/wp-content\/uploads\/media_uploads\/AI-\u5065\u5eb7\u7ba1\u5bb6-\u81ea\u52a8\u5316\u5065\u5eb7\u54a8\u8be2_-Cover-Page_1280-x-564-v2-400x176.jpg 400w, https:\/\/m.iteamworld.com\/wp-content\/uploads\/media_uploads\/AI-\u5065\u5eb7\u7ba1\u5bb6-\u81ea\u52a8\u5316\u5065\u5eb7\u54a8\u8be2_-Cover-Page_1280-x-564-v2-768x338.jpg 768w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/figure><\/div>\n\n\n\n<link href=\"https:\/\/cdn.jsdelivr.net\/npm\/@n8n\/chat\/dist\/style.css\" rel=\"stylesheet\">\n<style>\n  #n8n-chat {\n    height: 100vh;\n    border: 1px solid #d0d0d0;\n    box-sizing: border-box;\n  }\n\n  :root {\n    --chat--spacing: 0.75rem;\n    --chat--header-height: auto;\n    --chat--header--padding: 1rem 1.25rem;\n    --chat--heading--font-size: 1.5rem;\n    --chat--subtitle--font-size: 1.1rem;\n    --chat--subtitle--line-height: 1.4;\n    --chat--message--padding: 0.6rem 0.9rem;\n    --chat--message--font-size: 0.95rem;\n    --chat--messages-list--padding: 0.75rem;\n    --chat--input--send--button--color: #5fcef5;\n    --chat--input--send--button--color-hover: #5fcef5;\n    --chat--input--send--button--background-hover: #426390;\n  }\n\n  .chat-input-send-button[disabled] {\n    color: #5fcef5 !important;\n  }\n\n  .chat-inputs textarea::placeholder {\n    font-style: italic !important;\n  }\n\n  \/* messages-list has margin-top:auto from the widget's own CSS,\n     which pushes it to the bottom of chat-body. *\/\n  .chat-messages-list {\n    margin-top: 0 !important;\n  }\n\n  \/* Header: let it size to content, wrap long bilingual titles *\/\n  .chat-header {\n    height: auto !important;\n    overflow: visible !important;\n  }\n  .chat-heading,\n  .chat-header p {\n    white-space: normal !important;\n    overflow-wrap: break-word !important;\n  }\n\n  \/* Tablet *\/\n  @media (max-width: 1024px) {\n    :root {\n      --chat--heading--font-size: 1rem;\n      --chat--subtitle--font-size: 0.85rem;\n      --chat--spacing: 0.65rem;\n    }\n  }\n\n  \/* Phone *\/\n  @media (max-width: 600px) {\n    :root {\n      --chat--heading--font-size: 0.95rem;\n      --chat--subtitle--font-size: 0.8rem;\n      --chat--spacing: 0.5rem;\n      --chat--header--padding: 0.75rem 1rem;\n      --chat--message--padding: 0.5rem 0.75rem;\n      --chat--message--font-size: 0.9rem;\n    }\n  }\n\n  .n8n-markdown h1,\n  .n8n-markdown h2,\n  .n8n-markdown h3,\n  .n8n-markdown h4 {\n    font-size: 1.2em !important;\n    font-weight: 700 !important;\n    margin-top: 0.75em !important;\n    margin-bottom: 0.4em !important;\n    line-height: 1.3 !important;\n  }\n\n  .n8n-markdown strong,\n  .n8n-markdown b {\n    font-weight: 700 !important;\n  }\n\n  .n8n-markdown em,\n  .n8n-markdown i {\n    font-style: italic !important;\n  }\n\n  .n8n-markdown ul,\n  .n8n-markdown ol {\n    margin: 0.5em 0 !important;\n    padding-left: 1.5em !important;\n  }\n<\/style>\n\n<div id=\"n8n-chat\"><\/div>\n\n<script type=\"module\">\n  import { createChat } from 'https:\/\/cdn.jsdelivr.net\/npm\/@n8n\/chat\/dist\/chat.bundle.es.js';\n  createChat({\n    webhookUrl: 'https:\/\/ai.iteamworld.com\/webhook\/10f225c6-b4a9-42a9-8de4-9e3c81a39419\/chat',\n    target: '#n8n-chat',\n    mode: 'fullscreen',\n    showWelcomeScreen: false,\n    enableStreaming: true,\n    loadPreviousSession: false,\n\tallowFileUploads: true,\n\tallowedFilesMimeTypes: 'application\/pdf,image\/jpeg,image\/png',\n    initialMessages: [\n      \"\ud83d\udc4b Hi, Please provide me with your \\n\\n\u2192 **Gender\u3001Age\u3001Weight (kg)\u3001Height (cm)\u3001Blood Pressure (BP High\/Low)\u3001Blood Glucose Level (BS)\u3001Cholesterol (HDL)** \\n\\n\u2192 **Or any other Health Issues.** \\n\\n I will help you to analyse your personal health. \\* _\u27eaProvide more info for better accuracy analyzation\u27eb_\",\n      \"\ud83d\udc4b \u60a8\u597d\uff0c\u8bf7\u5411\u6211\u63d0\u4f9b\u60a8\u7684 \\n\\n\u2192 **\u6027\u522b\u3001\u5e74\u9f84\u3001\u4f53\u91cd (kg)\u3001\u8eab\u9ad8 (cm)\u3001\u8840\u538b\uff08BP \u9ad8\/\u4f4e\uff09\u3001\u8840\u7cd6\u6c34\u5e73\uff08BS\uff09\u3001\u80c6\u56fa\u9187\uff08HDL\uff09**\\n\\n\u2192 **\u6216\u4efb\u4f55\u5065\u5eb7\u95ee\u9898\u3002** \\n\\n\u6211\u5c06\u5e2e\u52a9\u60a8\u5206\u6790\u60a8\u7684\u4e2a\u4eba\u5065\u5eb7\u72b6\u51b5\u3002\\* _\u27ea\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\u4ee5\u63d0\u9ad8\u5206\u6790\u51c6\u786e\u6027\u27eb_\"\n    ],\n    i18n: {\n      en: {\n        title: '\ud83d\udc4b \u6211\u662f iTeamWorld AI \u5065\u5eb7\u7ba1\u5bb6\u3002\ud83d\udc4b I am iTeamWorld AI Health Assistant.',\n        subtitle: '\u8bf7\u63d0\u4f9b\u60a8\u7684\u5065\u5eb7\u4fe1\u606f\u4ee5\u4fbf\u66f4\u597d\u5730\u8fdb\u884c\u5206\u6790\u3002Please provide me with your health info for better analyzation.',\n        footer: '',\n        getStarted: 'New Conversation',\n        inputPlaceholder: 'Please type here... \\n\u8bf7\u5728\u6b64\u5904\u8f93\u5165...',\n      },\n    },\n  });\n\n  function setupScrollBehavior() {\n    const scrollContainer = document.querySelector('#n8n-chat .chat-body');\n    const messagesList = document.querySelector('#n8n-chat .chat-messages-list');\n    if (!scrollContainer || !messagesList) return false;\n\n    let locked = false;\n    let lockedValue = scrollContainer.scrollTop;\n    let userInteracting = false;\n\n    const nearBottom = () =>\n      scrollContainer.scrollHeight - scrollContainer.scrollTop - scrollContainer.clientHeight < 40;\n\n    ['wheel', 'touchstart', 'pointerdown'].forEach(evt => {\n      scrollContainer.addEventListener(evt, () => { userInteracting = true; }, { passive: true });\n    });\n\n    scrollContainer.addEventListener('scroll', () => {\n      if (!userInteracting) return;\n      userInteracting = false;\n      if (nearBottom()) {\n        locked = false;\n      } else {\n        locked = true;\n        lockedValue = scrollContainer.scrollTop;\n      }\n    });\n\n    const observer = new MutationObserver((mutations) => {\n      let userMessageAdded = false;\n      for (const mutation of mutations) {\n        if (mutation.target === messagesList && mutation.addedNodes.length) {\n          for (const node of mutation.addedNodes) {\n            if (node.nodeType === 1 && node.classList?.contains('chat-message-from-user')) {\n              userMessageAdded = true;\n            }\n          }\n        }\n      }\n      if (userMessageAdded) {\n        locked = false;\n        scrollContainer.scrollTop = scrollContainer.scrollHeight;\n        lockedValue = scrollContainer.scrollTop;\n      }\n    });\n\n    observer.observe(messagesList, { childList: true, subtree: true, characterData: true });\n\n    \/\/ Continuously re-pin the scroll position every frame while locked \u2014\n    \/\/ this is what actually defeats the widget's smooth\/animated auto-scroll,\n    \/\/ since a single correction per mutation can't outrun a multi-frame animation.\n    function pinLoop() {\n      if (locked) {\n        scrollContainer.scrollTop = lockedValue;\n      }\n      requestAnimationFrame(pinLoop);\n    }\n    requestAnimationFrame(pinLoop);\n\n    return true;\n  }\n\n  let scrollAttempts = 0;\n  const scrollRetry = setInterval(() => {\n    scrollAttempts++;\n    if (setupScrollBehavior() || scrollAttempts > 20) clearInterval(scrollRetry);\n  }, 250);\n\n  function setupSourceDisclosureFilter() {\n    const messagesList = document.querySelector('#n8n-chat .chat-messages-list');\n    if (!messagesList) return false;\n\n    function stripDisclosureParagraphs(root) {\n      root.querySelectorAll('p, li').forEach(el => {\n        const text = el.textContent || '';\n        if (\/\\.docx|\\.pdf\/i.test(text)) {\n          el.remove();\n        }\n      });\n      \/\/ Clean up any list that's now empty after removing its items\n      root.querySelectorAll('ul, ol').forEach(list => {\n        if (!list.querySelector('li')) list.remove();\n      });\n    }\n\n    const observer = new MutationObserver(() => {\n      document.querySelectorAll('.chat-message-from-bot .n8n-markdown')\n        .forEach(stripDisclosureParagraphs);\n    });\n\n    observer.observe(messagesList, { childList: true, subtree: true, characterData: true });\n    return true;\n  }\n\n  let filterAttempts = 0;\n  const filterRetry = setInterval(() => {\n    filterAttempts++;\n    if (setupSourceDisclosureFilter() || filterAttempts > 20) clearInterval(filterRetry);\n  }, 250);\n\n  function applyUnderlineMarkers() {\n    const messagesList = document.querySelector('#n8n-chat .chat-messages-list');\n    if (!messagesList) return false;\n\n    function processNode(root) {\n      const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n      const textNodes = [];\n      let node;\n      while ((node = walker.nextNode())) {\n        if (node.nodeValue.includes('\u27ea')) textNodes.push(node);\n      }\n      textNodes.forEach(textNode => {\n        const parts = textNode.nodeValue.split(\/\u27ea(.+?)\u27eb\/g);\n        if (parts.length === 1) return;\n        const frag = document.createDocumentFragment();\n        parts.forEach((part, i) => {\n          if (i % 2 === 1) {\n            const u = document.createElement('span');\n            u.style.textDecoration = 'underline';\n            u.textContent = part;\n            frag.appendChild(u);\n          } else if (part) {\n            frag.appendChild(document.createTextNode(part));\n          }\n        });\n        textNode.parentNode.replaceChild(frag, textNode);\n      });\n    }\n\n    const observer = new MutationObserver(() => processNode(messagesList));\n    observer.observe(messagesList, { childList: true, subtree: true, characterData: true });\n    processNode(messagesList);\n    return true;\n  }\n\n  let underlineAttempts = 0;\n  const underlineRetry = setInterval(() => {\n    underlineAttempts++;\n    if (applyUnderlineMarkers() || underlineAttempts > 20) clearInterval(underlineRetry);\n  }, 250);\n\nlet currentSessionId = null;\nconst originalFetch = window.fetch;\nwindow.fetch = async (...args) => {\n  try {\n    const body = args[1]?.body;\n    if (body instanceof FormData) {\n      const sid = body.get('sessionId');\n      if (sid) currentSessionId = sid;\n    } else if (typeof body === 'string') {\n      const parsed = JSON.parse(body);\n      if (parsed.sessionId) currentSessionId = parsed.sessionId;\n    }\n  } catch (e) {}\n  return originalFetch(...args);\n};\n\n\nfunction addExportButton() {\n  const footer = document.querySelector('#n8n-chat .chat-footer');\n  if (!footer || document.getElementById('export-buttons')) return false;\n\n  const container = document.createElement('div');\n  container.id = 'export-buttons';\n  container.style.cssText = 'display:flex; padding:8px 12px; border-top:1px solid #e5e5e5; font-weight: bold; font-size: 80%;';\n  container.innerHTML = `\n    <a id=\"pdf-btn\" class=\"wp-element-button\" style=\"flex:1; display:flex; align-items:center; justify-content:center; gap:6px; padding:6px; cursor:pointer; text-decoration:none;\" target=\"_blank\" rel=\"noopener\">\n      <span id=\"pdf-btn-text-zh\">\u4e0b\u8f7d\u804a\u5929\u8bb0\u5f55<\/span>\n      <img loading=\"lazy\" id=\"pdf-btn-icon\" src=\"https:\/\/m.iteamworld.com\/iteam-ai\/pdf-download-icon-2.png\" alt=\"PDF\" width=\"35\" height=\"35\" style=\"vertical-align:middle;\">\n      <span id=\"pdf-btn-text-en\">Download Chat Transcript<\/span>\n    <\/a>`;\n  footer.parentNode.insertBefore(container, footer);\n\n  const btn = document.getElementById('pdf-btn');\n  btn.addEventListener('click', () => {\n    if (!currentSessionId) return;\n    btn.href = `https:\/\/ai.iteamworld.com\/webhook\/export-chat-mobile?sessionId=${encodeURIComponent(currentSessionId)}`;\n  });\n\n  return true;\n}\n\n  let exportAttempts = 0;\n  const exportRetry = setInterval(() => {\n    exportAttempts++;\n    if (addExportButton() || exportAttempts > 20) clearInterval(exportRetry);\n  }, 250);\n\nfunction addDisclaimer() {\n  const footer = document.querySelector('#n8n-chat .chat-footer');\n  if (!footer || document.getElementById('custom-disclaimer')) return false;\n\n  const disclaimer = document.createElement('div');\n  disclaimer.id = 'custom-disclaimer';\n  disclaimer.style.cssText = 'padding:6px 12px 10px; font-size:7pt; color:#999; text-align:center; line-height:1.4; border-top: 1px dashed #cccccc; margin-top: 10px;';\n  disclaimer.innerHTML =\n    '\u26a0\ufe0f \u672cAI\u4ec5\u63d0\u4f9b\u4e00\u822c\u6027\u5065\u5eb7\u4fe1\u606f,\u4e0d\u80fd\u66ff\u4ee3\u4e13\u4e1a\u533b\u7597\u5efa\u8bae\u3001\u8bca\u65ad\u6216\u6cbb\u7597\u3002\u5982\u6709\u533b\u7597\u65b9\u9762\u7684\u95ee\u9898,\u8bf7\u52a1\u5fc5\u54a8\u8be2\u5408\u683c\u7684\u533b\u7597\u4e13\u4e1a\u4eba\u5458\u3002<br>' +\n    '\u26a0\ufe0f This AI provides general health information only and is not a substitute for professional medical advice, diagnosis, or treatment. Always consult a qualified healthcare provider for medical concerns.';\n\n  footer.insertAdjacentElement('afterend', disclaimer);\n  return true;\n}\n\nlet disclaimerAttempts = 0;\nconst disclaimerRetry = setInterval(() => {\n  disclaimerAttempts++;\n  if (addDisclaimer() || disclaimerAttempts > 20) clearInterval(disclaimerRetry);\n}, 250);\n\n<\/script>\n\n\n\n<p><\/p>\n<div id=\"themify_builder_content-288511\" data-postid=\"288511\" class=\"themify_builder_content themify_builder_content-288511 themify_builder\">\n\n    <\/div>\n<!-- \/themify_builder_content -->","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/pages\/288511"}],"collection":[{"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/comments?post=288511"}],"version-history":[{"count":1,"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/pages\/288511\/revisions"}],"predecessor-version":[{"id":308066,"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/pages\/288511\/revisions\/308066"}],"wp:attachment":[{"href":"https:\/\/m.iteamworld.com\/zh-hans\/wp-json\/wp\/v2\/media?parent=288511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}