docstr: 添加一个点并运行推理，保存历史用于undo
  
  Parameters
  ----------
  x : int
      点击的横坐标
  y : int
      点击的纵坐标
  is_positive : bool
      是否点的是正点
  
  Returns
  -------
  bool, str
      点击是否添加成功, 失败原因
docstr_tok: ["\u6dfb\u52a0\u4e00\u4e2a\u70b9\u5e76\u8fd0\u884c\u63a8\u7406\uff0c\u4fdd\u5b58\u5386\u53f2\u7528\u4e8eundo","Parameters","--","--","--","--","--","x",":","int","\u70b9\u51fb\u7684\u6a2a\u5750\u6807","y",":","int","\u70b9\u51fb\u7684\u7eb5\u5750\u6807","is_positive",":","bool","\u662f\u5426\u70b9\u7684\u662f\u6b63\u70b9","Returns","--","--","--","-","bool",",","str","\u70b9\u51fb\u662f\u5426\u6dfb\u52a0\u6210\u529f",",","\u5931\u8d25\u539f\u56e0"]
code: def addClick(self, x: int, y: int, is_positive: bool):
      """添加一个点并运行推理，保存历史用于undo
  
      Parameters
      ----------
      x : int
          点击的横坐标
      y : int
          点击的纵坐标
      is_positive : bool
          是否点的是正点
  
      Returns
      -------
      bool, str
          点击是否添加成功, 失败原因
  
      """
  
      # 1. 确定可以点
      if not self.inImage(x, y):
          return False, "点击越界"
      if not self.modelSet:
          return False, "未加载模型"
      if not self.imageSet:
          return False, "图像未设置"
  
      if len(self.states) == 0:  # 保存一个空状态
          self.states.append(
              {
                  "clicker": self.clicker.get_state(),
                  "predictor": self.predictor.get_states(),
              }
          )
  
      # 2. 添加点击，跑推理
      click = clicker.Click(is_positive=is_positive, coords=(y, x))
      self.clicker.add_click(click)
      pred = self.predictor.get_prediction(self.clicker)
  
      # 3. 保存状态
      self.states.append(
          {
              "clicker": self.clicker.get_state(),
              "predictor": self.predictor.get_states(),
          }
      )
      if self.probs_history:
          self.probs_history.append((self.probs_history[-1][1], pred))
      else:
          self.probs_history.append((np.zeros_like(pred), pred))
  
      # 点击之后就不能接着之前的历史redo了
      self.undo_states = []
      self.undo_probs_history = []
      return True, "点击添加成功"
  
imports: import json
  import logging
  import os.path
  import time
  import cv2
  import numpy
  import paddle
  from skimage.measure import label
  import util
  from eiseg import logger
  from inference import clicker
  from inference.predictor import get_predictor
  from eiseg.models import EISegModel
  from util import LabelList
  from util.vis import draw_with_blend_and_clicks
label_desc: Use image node_id 11 for calling the InteractiveController obj's underlying member method code with example usage: obj.addClick(x, y, is_positive) and returns: True,  str, False,  str, False,  str, False,  str