Tích hợp JS API

FlowHunt JavaScript API Chatbot Integration

FlowHunt JS API cho phép bạn kiểm soát hoàn toàn cách chatbot tích hợp với trang web của bạn. Sử dụng mã tích hợp v2, bạn có thể nhúng chatbot, đăng ký các sự kiện vòng đời và tương tác, truyền dữ liệu động qua biến flow, kích hoạt Chat Hook trigger giữa cuộc hội thoại bằng sendHook(), theo dõi tương tác bằng tham số URL và điều khiển cửa sổ chat theo chương trình.

Hướng dẫn này bao gồm mọi khía cạnh của JS API với các ví dụ mã mà bạn có thể sao chép và điều chỉnh cho dự án của mình.

Mã tích hợp (v2)

Sao chép và dán đoạn mã dưới đây vào HTML ngay trước thẻ đóng </body>. Thay thế YOUR_CHATBOT_IDYOUR_WORKSPACE_ID bằng các giá trị từ cài đặt chatbot FlowHunt của bạn.

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      // The chatbot is ready — use chatbotManager here
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

ID chatbot trong tên biến toàn cục (window.FHChatbot_YOUR_CHATBOT_ID) sử dụng dấu gạch dưới thay vì dấu gạch ngang.

Ghi đè cấu hình với setConfig()

Trước khi gọi init(), bạn có thể ghi đè các cài đặt chatbot mặc định bằng setConfig():

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
      headerTitle: 'Support Assistant',
      maxWindowWidth: '700px',
      showChatButton: false,
      flowVariables: {
        userId: '12345',
        plan: 'enterprise',
      },
      urlSuffix: '?utm_source=chatbot',
    });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      // Chatbot initialised with custom config
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Các tùy chọn cấu hình có sẵn

Tùy chọnKiểuMô tả
headerTitlestringVăn bản tiêu đề header tùy chỉnh
maxWindowWidthstringChiều rộng tối đa của cửa sổ chat (ví dụ: "700px")
maxWindowHeightstringChiều cao tối đa của cửa sổ chat
inputPlaceholderstringVăn bản placeholder cho ô nhập tin nhắn
showChatButtonbooleanHiển thị hoặc ẩn nút chat nổi mặc định
openChatPanelbooleanTự động mở bảng chat khi tải trang
flowVariablesobjectCác cặp khóa–giá trị dữ liệu tùy chỉnh được truyền cho flow. Giá trị có thể là bất kỳ kiểu nào có thể tuần tự hóa JSON (string, number, boolean, object, array).
urlSuffixstringChuỗi truy vấn được thêm vào tất cả URL do chatbot tạo ra
cookieConsentbooleanBật tính năng duy trì phiên qua cookie
embeddedstringĐặt để bật chế độ nhúng (không có nút đóng)
themestringChế độ giao diện

Biến flow: Truyền dữ liệu động

flowVariables được hợp nhất vào mọi phiên mà chatbot tạo ra. Chúng thường được sử dụng làm ngữ cảnh tĩnh (đã biết tại thời điểm tải trang): ID người dùng, gói dịch vụ, ngôn ngữ hiện tại, v.v.

window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
  flowVariables: {
    userId: getCurrentUserId(),
    userEmail: getCurrentUserEmail(),
    currentPage: window.location.pathname,
    plan: 'enterprise',
  },
});

Nếu người dùng điều hướng sau khi cửa sổ chat đã mở, các giá trị truyền tại đây sẽ trở nên lỗi thời. Để cập nhật chúng giữa cuộc hội thoại, hãy gọi chatbotManager.sendHook() với options.flowVariables — xem phần Giao tiếp host → flow giữa cuộc hội thoại bên dưới.

Hậu tố URL: Theo dõi tương tác chatbot

Tham số urlSuffix thêm chuỗi truy vấn vào mọi URL do chatbot tạo ra. Điều này hữu ích để theo dõi lưu lượng truy cập từ chatbot trong các công cụ phân tích:

window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
  urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});

Các trường hợp sử dụng:

  • Theo dõi chuyển đổi từ các tương tác chatbot trong Google Analytics.
  • Phân tích hành vi người dùng sau khi tương tác với chatbot.
  • Gán chiến dịch thúc đẩy sự tham gia của chatbot.

Logo

Sẵn sàng phát triển doanh nghiệp của bạn?

Bắt đầu dùng thử miễn phí ngay hôm nay và xem kết quả trong vài ngày.

Giao tiếp host → flow giữa cuộc hội thoại

Được bổ sung vào tháng 4 năm 2026 như một phần của tính năng FlowHunt Chat Hook.

Trong các ứng dụng trang đơn (SPA), cửa sổ chat thường vẫn mở trong khi người dùng điều hướng giữa các màn hình. Một khi chat đang chạy, flowVariables được truyền qua setConfig() sẽ trở nên lỗi thời, và không có cách nào để báo cho flow biết về một sự kiện nào đó đã xảy ra trên trang chủ. Một phương thức duy nhất của trình quản lý — sendHook(name, payload, options?) — bao quát cả hai trường hợp “kích hoạt trigger” và “chỉ cập nhật ngữ cảnh”:

  • Truyền một name và (tùy chọn) một payload để kích hoạt trigger Chat Hook của flow. Tác giả flow chỉ cần thả một node Chat Hook lên canvas và phân nhánh theo {ChatHook.hook_name} để quyết định việc cần làm.
  • Truyền options.flowVariables để hợp nhất các biến phiên đồng thời — các giá trị được lưu trước khi trigger kích hoạt và vẫn còn khả dụng cho phần còn lại của phiên.
  • Nếu flow không có Chat Hook trigger, lệnh gọi sẽ là thao tác 200 không hoạt động im lặng: options.flowVariables vẫn được hợp nhất, nhưng không trigger nào chạy và không bị tính phí credit. Điều này có nghĩa là các trang chủ có thể gọi sendHook() một cách lạc quan mà không cần biết liệu tác giả flow đã gắn trigger hay chưa.

sendHook() là một thao tác không hoạt động an toàn trước khi phiên tồn tại (được lưu đệm nội bộ và flush khi phiên được tạo) và không bao giờ throw ra trang chủ — lỗi mạng chỉ được ghi qua console.warn.

Giới hạn đầu vào

Các giới hạn ở phía máy chủ và máy khách áp dụng cho sendHook(). Vi phạm chúng không gây crash — backend trả về HTTP 422 và trình quản lý ghi log qua console.warn mà không throw.

Ràng buộcGiới hạnNơi áp dụngKhi vi phạm
Độ dài name của sendHook1–256 ký tựBackend (Pydantic)HTTP 422, trigger không kích hoạt
Số lượng khóa trong options.flowVariables≤ 64Backend (Pydantic)HTTP 422, không lưu gì cả
Độ dài mỗi khóa trong options.flowVariables≤ 128 ký tựBackend (Pydantic)HTTP 422, không lưu gì cả
Số lệnh gọi trước khi có phiên được trình quản lý đệm50Widget (trong trình duyệt)Lệnh gọi xếp hàng cũ nhất bị loại bỏ và console.warn được ghi

Giới hạn của bộ đệm trước phiên chỉ quan trọng trên các trang nơi việc tạo phiên thất bại vô hạn (ví dụ: lỗi mạng vĩnh viễn). Trong điều kiện bình thường, hàng đợi được flush ngay khi onFHChatbotSessionCreated kích hoạt.

1. Thêm Chat Hook trigger (phía tác giả flow)

  1. Mở flow liên quan đến chatbot của bạn trong trình chỉnh sửa FlowHunt.
  2. Kéo một node trigger Chat Hook vào canvas. Trình chỉnh sửa chỉ cho phép một trigger duy nhất cho mỗi flow — không cho phép nhiều trigger.
  3. (Tùy chọn) Bật Validate Payload Schema và định nghĩa một JSON Schema mà payload đến phải tuân theo. Việc xác thực được chạy bên trong bước — sự không khớp sẽ hiển thị dưới dạng sự kiện lỗi của flow (endpoint vẫn trả về 200; lỗi có thể nhìn thấy qua onFHError).
  4. Nối các đầu ra của trigger (hook_name, payload, flow_variables) vào bất kỳ bước downstream nào bạn muốn kích hoạt (Generator, Chat Output, Tool Calls, các nhánh điều kiện trên hook_name, v.v.).
  5. Xuất bản flow.

2. Phân nhánh trên các tên hook khác nhau bên trong flow

name mà trang chủ truyền cho sendHook() là một nhãn để flow của bạn phân nhánh, không phải khóa định tuyến — backend không khớp tên với các node. Thay vào đó, Chat Hook trigger duy nhất của flow sẽ kích hoạt và để lộ tên dưới dạng {ChatHook.hook_name}, mà bạn tham chiếu trong logic flow của mình để quyết định việc cần làm.

Ví dụ system prompt:

If {ChatHook.hook_name} is "screen_changed", briefly summarise the page at
{ChatHook.payload.url}. If it is "user_action", acknowledge the action and
update memory. Otherwise, continue the conversation normally.

Đối với định tuyến phức tạp hơn, hãy nối một bước điều kiện trên {ChatHook.hook_name} và phân nhánh thành nhiều đường downstream.

3. chatbotManager.sendHook(name, payload, options?)

chatbotManager.sendHook(
  name: string,
  payload?: Record<string, unknown>,
  options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;

Đối số

Đối sốKiểuBắt buộcMô tả
namestringNhãn được chuyển tiếp đến flow dưới dạng {ChatHook.hook_name}. Trigger kích hoạt bất kể giá trị; logic flow của bạn phân nhánh dựa trên nó.
payloadobjectkhôngPayload JSON được trao cho trigger dưới dạng {ChatHook.payload}. Được xác thực theo schema của node nếu được bật. Mặc định {}.
options.flowVariablesobjectkhôngCác biến phiên cần hợp nhất trước khi trigger kích hoạt. Có sẵn cho các bước downstream và các tin nhắn tương lai của người dùng.

Hành vi

  • Việc gọi trước onFHChatbotSessionCreated là an toàn; lệnh gọi được lưu đệm và flush khi phiên tồn tại. Bộ đệm có giới hạn — xem Giới hạn đầu vào bên trên.
  • Nếu flow không có Chat Hook trigger, yêu cầu là một thao tác 200 không hoạt động im lặng — vì vậy các trang chủ có thể gọi sendHook() một cách lạc quan trước khi tác giả flow gắn trigger. options.flowVariables vẫn được lưu ngay cả trong trường hợp đó, do đó cùng một lệnh gọi có thể dùng làm bản cập nhật chỉ ngữ cảnh.
  • Nếu Chat Hook trigger có bật xác thực schema và payload không vượt qua, việc xác thực chạy bên trong bước — endpoint trả về 200 nhưng flow phát ra một sự kiện lỗi bước (có thể quan sát qua onFHError).
  • nameoptions.flowVariables đều có giới hạn — xem Giới hạn đầu vào bên trên. Vi phạm trả về HTTP 422 và không có gì được lưu.
  • Các lệnh gọi thành công phát ra sự kiện onFHChatbotFlowVariablesUpdate nếu options.flowVariables được cung cấp (xem Tham chiếu sự kiện).
  • Không bao giờ throw. Lỗi mạng và phản hồi không phải 2xx được ghi qua console.warn.

Ví dụ — gợi ý chủ động khi điều hướng SPA

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  window.addEventListener('hashchange', function () {
    chatbotManager.sendHook('screen_changed', {
      url: window.location.href,
      screen_name: getScreenName(),
    }, {
      flowVariables: { current_page_url: window.location.href },
    });
  });
});

Ví dụ — cập nhật chỉ ngữ cảnh (không gắn Chat Hook)

Nếu flow không có Chat Hook trigger, lệnh gọi sẽ là 200 im lặng — vì vậy cùng một API có thể giữ flow_variables đồng bộ mà không kích hoạt bất cứ điều gì:

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  window.addEventListener('hashchange', function () {
    chatbotManager.sendHook('navigate', {}, {
      flowVariables: {
        current_page_url: window.location.href,
        screen_name: getScreenName(),
      },
    });
  });
});

4. Cách tác giả flow sử dụng các giá trị này

  • {ChatHook.hook_name}{ChatHook.payload.foo} — các giá trị truyền qua sendHook('x', { foo: 1 }) được hiển thị trên đường thực thi của Chat Hook trigger. Chỉ khả dụng trên đường được khởi động bởi việc kích hoạt hook.
  • {flow_variables.foo} — các giá trị truyền qua options.flowVariables được hợp nhất vào bag biến của phiên trước khi trigger kích hoạt. Mọi đường thực thi (bao gồm cả các tin nhắn người dùng được kích hoạt thông thường qua Chat Input) đều có thể đọc chúng.

Nếu bạn muốn tin nhắn tiếp theo của người dùng thấy một giá trị mới, hãy đặt nó vào options.flowVariables — chỉ riêng payload chỉ ảnh hưởng đến lần thực thi được khởi động bởi hook đó.


Tham chiếu sự kiện

FlowHunt JS API phát 11 sự kiện tùy chỉnh trên đối tượng window. Tất cả sự kiện sử dụng API CustomEvent với bubbles: truecomposed: true.

onFHChatbotReady

Được kích hoạt khi widget chatbot đã được render hoàn toàn và sẵn sàng sử dụng.

  • Dữ liệu sự kiện: không có.
  • Khi nào: sau khi DOM widget được mount và nút chat hiển thị.

onFHChatbotSessionCreated

Được kích hoạt khi phiên chat mới được tạo trên máy chủ.

  • Dữ liệu sự kiện: event.detail.sessionId — ID của phiên vừa được tạo.
  • Khi nào: sau khi cuộc gọi API tạo phiên thành công.

onFHChatbotWindowOpened

Được kích hoạt khi người dùng mở cửa sổ chat. Không kích hoạt trong chế độ nhúng.

onFHChatbotWindowClosed

Được kích hoạt khi người dùng đóng cửa sổ chat. Không kích hoạt trong chế độ nhúng.

onFHMessageSent

Được kích hoạt khi người dùng gửi tin nhắn.

event.detail.metadata = {
  content: 'Hello, I need help with...',
  createdAt: '2026-02-19T10:30:00.000Z',
};

onFHMessageReceived

Được kích hoạt khi chatbot nhận và hiển thị phản hồi.

event.detail.metadata = {
  flow_id: 'abc123',
  message_id: 'msg_456',
  message: 'Sure, I can help you with that!',
  sender: {
    sender_name: 'Support Agent',
    sender_avatar: 'https://example.com/avatar.png',
  },
};

sender là tùy chọn và chỉ xuất hiện khi có nhân viên hỗ trợ tham gia.

onFHFormDataSent

Được kích hoạt khi người dùng gửi dữ liệu biểu mẫu qua chatbot.

event.detail.metadata = {
  objectData: { name: 'John', email: 'john@example.com' },
  createdAt: '2026-02-19T10:31:00.000Z',
};

onFHFeedback

Được kích hoạt khi người dùng đưa ra phản hồi tích cực / tiêu cực cho tin nhắn của chatbot.

event.detail.metadata = {
  message_id: 'msg_456',
  content: 'Optional feedback text',
  feedback: 'P', // 'P' = positive, 'N' = negative
};

onFHToolCall

Được kích hoạt khi một công cụ hoặc hành động được thực thi trong quá trình xử lý flow. Chỉ kích hoạt trong chế độ flowAssistantflowAssistantV3.

event.detail.metadata = {
  metadata: {
    flow_id: 'abc123',
    message_id: 'msg_789',
    message: 'Calling search API...',
  },
  createdAt: '2026-02-19T10:32:00.000Z',
};

onFHError

Được kích hoạt khi xảy ra lỗi trong quá trình hoạt động của chatbot.

event.detail.metadata = {
  metadata: {
    flow_id: 'abc123',
    message_id: 'msg_err',
    message: 'Flow execution failed',
  },
  createdAt: '2026-02-19T10:33:00.000Z',
};

onFHChatbotFlowVariablesUpdate

Được bổ sung vào tháng 4 năm 2026.

Được kích hoạt sau một lệnh gọi chatbotManager.sendHook(...) thành công có cung cấp options.flowVariables. Không kích hoạt cho các lệnh gọi sendHook() không có flowVariables.

event.detail = {
  variables: {
    current_page_url: 'https://example.com/products',
    screen_name: 'products',
  },
};

Sử dụng nó để quan sát các biến đã được hợp nhất (ví dụ: để đồng bộ trạng thái ở phía host của bạn, để gỡ lỗi, hoặc để render lại một phần tử UI phụ thuộc vào cùng dữ liệu).


Đăng ký sự kiện

Có hai cách để đăng ký các sự kiện chatbot.

Cách 1: Trình lắng nghe sự kiện Window

Sử dụng window.addEventListener ở bất kỳ đâu trong trang. Cách này hoạt động ngay cả trước khi chatbot được tải:

<script>
document.addEventListener('DOMContentLoaded', function () {
  window.addEventListener('onFHChatbotReady', function () {
    console.log('Chatbot is ready');
  });

  window.addEventListener('onFHChatbotSessionCreated', function (event) {
    console.log('Session created:', event.detail.sessionId);
  });

  window.addEventListener('onFHChatbotWindowOpened', function () {
    console.log('Chat window opened');
  });

  window.addEventListener('onFHChatbotWindowClosed', function () {
    console.log('Chat window closed');
  });

  window.addEventListener('onFHMessageSent', function (event) {
    console.log('User sent:', event.detail.metadata.content);
  });

  window.addEventListener('onFHMessageReceived', function (event) {
    console.log('Bot replied:', event.detail.metadata.message);
  });

  window.addEventListener('onFHFormDataSent', function (event) {
    console.log('Form submitted:', event.detail.metadata.objectData);
  });

  window.addEventListener('onFHFeedback', function (event) {
    var fb = event.detail.metadata;
    console.log('Feedback on message', fb.message_id, ':', fb.feedback);
  });

  window.addEventListener('onFHToolCall', function (event) {
    console.log('Tool called:', event.detail.metadata);
  });

  window.addEventListener('onFHError', function (event) {
    console.error('Chatbot error:', event.detail.metadata);
  });

  window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
    console.log('Variables merged:', event.detail.variables);
  });
});
</script>

Để gỡ bỏ một trình lắng nghe, hãy giữ tham chiếu đến hàm xử lý:

var handleMessage = function (event) {
  console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);

Cách 2: Phương thức callback của trình quản lý

Bên trong callback init(), sử dụng các phương thức tích hợp của trình quản lý chatbot:

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  chatbotManager.onSessionCreated(function () {
    console.log('Session created');
  });

  chatbotManager.onWindowOpened(function () {
    console.log('Window opened');
  });

  chatbotManager.onWindowClosed(function () {
    console.log('Window closed');
  });

  chatbotManager.onMessageSent(function (event) {
    console.log('User sent:', event.metadata);
  });

  chatbotManager.onMessageReceived(function (event) {
    console.log('Bot replied:', event.metadata);
  });

  chatbotManager.onFormDataSent(function (event) {
    console.log('Form data:', event.metadata);
  });

  chatbotManager.onFeedback(function (event) {
    console.log('Feedback:', event.metadata);
  });

  chatbotManager.onToolCall(function (event) {
    console.log('Tool call:', event.metadata);
  });

  chatbotManager.onError(function (event) {
    console.error('Error:', event.metadata);
  });
});

Tham chiếu phương thức trình quản lý

Phương thứcTham sốMô tả
onSessionCreated(fn)fn: () => voidLắng nghe sự kiện tạo phiên
onWindowOpened(fn)fn: () => voidLắng nghe sự kiện mở cửa sổ
onWindowClosed(fn)fn: () => voidLắng nghe sự kiện đóng cửa sổ
onMessageSent(fn)fn: (event) => voidLắng nghe tin nhắn của người dùng
onMessageReceived(fn)fn: (event) => voidLắng nghe phản hồi của bot
onFormDataSent(fn)fn: (event) => voidLắng nghe gửi biểu mẫu
onFeedback(fn)fn: (event) => voidLắng nghe phản hồi của người dùng
onToolCall(fn)fn: (event) => voidLắng nghe thực thi công cụ
onError(fn)fn: (event) => voidLắng nghe lỗi
openChat()Mở bảng chat
closeChat()Đóng bảng chat
sendHook(name, payload?, options?) (mới)name: string, payload?: object, options?: { flowVariables?: object }Kích hoạt Chat Hook trigger trong flow đang chạy (hoặc hợp nhất options.flowVariables im lặng nếu không có trigger được gắn)

Kích hoạt chat tùy chỉnh: Ẩn nút và mở khi nhấp

Để kiểm soát hoàn toàn thời điểm chatbot xuất hiện, hãy ẩn nút nổi mặc định và mở chat theo chương trình — ví dụ, từ nút tùy chỉnh của bạn.

<button id="my-chat-button">Chat with us</button>

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      document.getElementById('my-chat-button')
        .addEventListener('click', function () {
          chatbotManager.openChat();
        });
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Chỉ hiển thị nút tùy chỉnh khi chatbot đã sẵn sàng

Bạn có thể kết hợp kích hoạt ẩn với trình lắng nghe sự kiện để tạo các tương tác nâng cao:

<button id="open-chat" style="display:none;">Need help?</button>

<script>
  window.addEventListener('onFHChatbotReady', function () {
    document.getElementById('open-chat').style.display = 'block';
  });
</script>

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      document.getElementById('open-chat')
        .addEventListener('click', function () {
          chatbotManager.openChat();
        });
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Ví dụ tích hợp hoàn chỉnh

Một ví dụ hoạt động đầy đủ minh họa việc ghi đè cấu hình, theo dõi sự kiện, kích hoạt chat tùy chỉnh và phương thức sendHook() mới kết hợp với nhau:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>FlowHunt Chatbot Integration</title>
  </head>
  <body>
    <h1>My Website</h1>
    <button id="open-chat-btn">Talk to our AI assistant</button>
    <button id="close-chat-btn">Close chat</button>

    <!-- Subscribe to events before the chatbot loads -->
    <script>
      document.addEventListener('DOMContentLoaded', function () {
        window.addEventListener('onFHChatbotReady', function () {
          console.log('Chatbot widget is ready');
        });

        window.addEventListener('onFHChatbotSessionCreated', function (event) {
          console.log('New chat session started:', event.detail.sessionId);
        });

        window.addEventListener('onFHMessageSent', function (event) {
          console.log('User message:', event.detail.metadata.content);
        });

        window.addEventListener('onFHMessageReceived', function (event) {
          console.log('Bot response:', event.detail.metadata.message);
        });

        window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
          console.log('Context updated:', event.detail.variables);
        });

        window.addEventListener('onFHError', function (event) {
          console.error('Chatbot error:', event.detail.metadata);
        });
      });
    </script>

    <!-- FlowHunt integration -->
    <script id="fh-chatbot-script-YOUR_CHATBOT_ID">
      var currentScript = document.currentScript
        || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

      var script = document.createElement('script');
      script.async = true;
      script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
        + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

      script.onload = function () {
        window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
          showChatButton: false,
          headerTitle: 'AI Assistant',
          maxWindowWidth: '600px',
          flowVariables: {
            source: 'website',
            current_page_url: window.location.href,
          },
          urlSuffix: '?utm_source=chatbot',
        });

        window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
          // Open / close from custom buttons
          document.getElementById('open-chat-btn')
            .addEventListener('click', function () {
              chatbotManager.openChat();
            });
          document.getElementById('close-chat-btn')
            .addEventListener('click', function () {
              chatbotManager.closeChat();
            });

          // Keep the flow's context in sync with SPA navigation and
          // optionally fire the Chat Hook trigger (if the flow has one wired).
          // If the flow has no Chat Hook, the call is a silent 200 — the
          // flow_variables still get merged, so the same line covers both
          // "notify the flow" and "just update context".
          window.addEventListener('hashchange', function () {
            chatbotManager.sendHook('screen_changed', {
              url: window.location.href,
            }, {
              flowVariables: { current_page_url: window.location.href },
            });
          });
        });
      };

      if (currentScript && currentScript.parentNode) {
        currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
      } else {
        document.head.appendChild(script);
      }
    </script>
  </body>
</html>

Câu hỏi thường gặp

Tìm hiểu thêm

Bắt Đầu Với FlowHunt
Bắt Đầu Với FlowHunt

Bắt Đầu Với FlowHunt

Mới sử dụng FlowHunt? Bắt đầu từ đây. Tìm hiểu những kiến thức cơ bản về xây dựng quy trình làm việc AI, triển khai chatbot và kết nối các nguồn kiến thức — tất...

10 phút đọc
Getting Started
Chatbot HubSpot
Chatbot HubSpot

Chatbot HubSpot

Tăng sức mạnh cho chatbot HubSpot của bạn với FlowHunt. Kiểm soát tốt hơn các phản hồi, nguồn dữ liệu và luồng hội thoại.

11 phút đọc
AI Chatbot +4
interactive-mcp
interactive-mcp

interactive-mcp

Tích hợp FlowHunt với interactive-mcp để cho phép giao tiếp bảo mật, thời gian thực giữa các mô hình ngôn ngữ lớn và người dùng trên máy tính cục bộ. Thu thập đ...

6 phút đọc
AI interactive-mcp +7