bank-bot.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. const fetch = require("node-fetch");
  2. class BankBot {
  3. static TAG = "BankBot";
  4. constructor() {
  5. this.stateMap = new Map();
  6. }
  7. async process(message, metalog) {
  8. console.log(`[${BankBot.TAG}] ${metalog} process:`, message);
  9. try {
  10. const { success, data } = await this.flow(message, metalog);
  11. return { success, data };
  12. } catch (e) {
  13. console.error(`[${BankBot.TAG}] Error:`, e);
  14. }
  15. return { success: false, data: null };
  16. }
  17. async flow(message, metalog) {
  18. let text = message.body.trim();
  19. if (!text.includes("@bsb")) return false;
  20. text = text.replace("@bsb", "").trim();
  21. let url = "https://nexilis.io/ibotbank_wsgi/predict";
  22. let reqJsonObject = { prompt: text };
  23. const session = this.stateMap.get(message.to);
  24. if (session) {
  25. console.log(`[${BankBot.TAG}] ${metalog} session:`, session);
  26. if (session.state === "PREDICT") {
  27. const parameters = session.data.parameters || {};
  28. if (parameters.confirmation === "1") {
  29. url = url.replace("predict", "auth");
  30. session.state = "AUTH";
  31. }
  32. } else if (session.state === "AUTH") {
  33. url = url.replace("predict", "execute");
  34. const { data } = session;
  35. delete data.content;
  36. delete data.explanation;
  37. delete data.confidence;
  38. delete data.role;
  39. data.message = session.prompt;
  40. reqJsonObject = data;
  41. session.state = "EXECUTE";
  42. }
  43. }
  44. console.log(`[${BankBot.TAG}] ${metalog} POST [${url}] ->`, reqJsonObject);
  45. let body;
  46. try {
  47. const res = await fetch(url, {
  48. method: "POST",
  49. headers: { "Content-Type": "application/json" },
  50. body: JSON.stringify(reqJsonObject)
  51. });
  52. body = await res.text();
  53. } catch (err) {
  54. console.error("HTTP Error:", err);
  55. body = JSON.stringify({
  56. role: "assistant",
  57. content: "Server Busy.. please try again later."
  58. });
  59. }
  60. console.log(`[${BankBot.TAG}] ${metalog} response body:`, body);
  61. let resJson;
  62. try {
  63. resJson = JSON.parse(body);
  64. } catch (e) {
  65. resJson = {
  66. role: "assistant",
  67. content: "Invalid JSON from server."
  68. };
  69. }
  70. if (resJson.parameters) {
  71. this.stateMap.set(
  72. message.to,
  73. new Session(text, "PREDICT", resJson)
  74. );
  75. }
  76. return { success: true, data: resJson };
  77. }
  78. }
  79. class Session {
  80. constructor(prompt, state, data) {
  81. this.prompt = prompt;
  82. this.state = state;
  83. this.data = data;
  84. }
  85. toString() {
  86. return `Session{prompt='${this.prompt}', state=${this.state}, data=${JSON.stringify(this.data)}}`;
  87. }
  88. }
  89. const State = {
  90. PREDICT: "PREDICT",
  91. AUTH: "AUTH",
  92. EXECUTE: "EXECUTE"
  93. };
  94. module.exports.BankBot = BankBot;