接口文档

说明:

  • c/c++版本插件以c动态库方式实现. 插件接口依据不同类型的服务特性(会话/非会话,同步/异步等)提供了较为丰富的接口集, 用户在集成过程中可按需实现服务对应的部分接口即可
  • 运行过程中无需调用的其他接口也需空实现以便导出接口符号, 防止插件load过程失败
  • c/c++插件共提供12个接口,其中包含插件的初始化/资源操作/会话操作/非会话操作等相关接口,对于大部分服务类型,仅需实现其中部分接口即可. 如下对相关接口进行说明

wrapperInit

原型 int WrapperAPI wrapperInit(pConfig cfg)
参数 初始化配置对,由平台AI能力上线流程进行配置,其中k-v 类型均为string
返回值 插件初始化异常错误码,错误码用于快速定位异常原因,类型int 接口调用正常需返回0值
说明 全局调用一次,由于插件初始化及内核实例预申请等操作
类型定义:pConfig
          typedef struct ParamList{
          char* key;
          char* value;
          unsigned int vlen;
          struct ParamList* next;
        }* pConfig;

配置示例:
        “common.lic” = “10”
        “resource./resource/wfst.bin” = “WFST”

接口示例:
             int maxLic = 10; // default concurrency
             std::map<kernelInst, bool/*idle*/> hdlCache;
             int WrapperAPI wrapperInit(pConfig cfg){
                  while(cfg){
                          printf(“key:%s, value:%s\n”, cfg->key, cfg->value);
                          If (strcmp(cfg->key, “common.lic”) == 0){
                                  maxLic = atoi(cfg->value);
                           }
                            cfg = cfg->next;
                  }
                    // 插件实例管理-预申请
                    for (int i=0; i< maxLic ){
                             kernelInst inst = new kernelInst;
                             hdlCache[inst] = true;
                      }
                      return 0;
                }

示例输出:
              > key:common.lic, value:10
              > key:resource./home/wfst.bin, value:WFST

wrapperFini

原型 int WrapperAPI wrapperFini()
参数
返回值 插件逆初始化异常错误码,错误码用于快速定位异常原因,类型int接口调用正常需返回0值.
说明 全局调用一次,用于插件逆初始化及内核实例释放等操作

接口示例

int WrapperAPI wrapperFini(){
      std::map<kernelInst, bool>::iterator ite = hdlCache.begin();
      for ( ; ite != hdlCache.end()  ; ite++){
               delete ite->first;
          }
          return 0;
    }

wrapperError

原型 const char* WrapperAPI wrapperError(int errNum);
参数 插件自定义的错误码,类型int
返回值 插件自定义错误码对应的描述信息,类型const char*,非NULL
说明 若存在插件接口调用返回值异常,加载器通过调用该接口获取错误码详细描述信息
接口示例:
         static const struct errPair {
                 int err;
                 const char* desc;
          } errPairArr[] = {
                  {10010, “instance not enough”},
                  {10011, “input invalid data”},
          }; 

             const char* WrapperAPI wrapperError(int errNum){
                    int errSize = sizeof(errPairArr) / sizeof(errPair);
                    for (int i=0; i < errSize; i++){
                             If (errPairArr[i].err == errNum){
                                      return errPairArr[i].desc;
                              }
                     }
                     return “general error”;
             }
     调用示例:
             printf(“err: %s\n”, wrapperError(10010));
             printf(“err: %s\n”, wrapperError(10011));
     示例输出:
             > err: instance not enough
             > err: input invalid data

wrapperLoadRes_

原型 int WrapperAPI wrapperLoadRes(pDataList perData, unsigned int resId);
参数 1. 个性化数据实体perData
2. 实体对应唯一标识resId
返回值 个性化加载异常错误码,错误码用于快速定位异常原因,类型int接口调用正常需返回0值.
说明 加载器通过调用该接口加载用户上传的个性化资源,并分配一个唯一标识resId. 后续对该资源的所有操作均通过resId标识,故插件需维护资源-id的映射关系.
备注 1. 若插件不支持个性化、可空实现直接返回0
2. 存在个性化数据上传/更新/请求时调用.
类型定义:
      typedef struct DataList{
          char*   key;            // 数据标识
          void*   data;           // 数据实体
          unsigned int len;       // 数据长度
          char* desc;             // 数据描述
          char* encoding;         // 数据编码
          DataType    type;       // 数据类型
          DataStatus status;      // 数据状态
          struct DataList* next;  // 链表指针
      }*  pDataList;

补充说明: (1). 资源加载接口实参perData链表长度固定为1. (2). 资源加载场景,仅使用部分成员标记数据:perData->data,perData->len,perData->type 其他成员为无效数据,无需读取.

wrapperUnloadRes

原型 int WrapperAPI wrapperUnloadRes(unsigned int resId);
参数 个接口说明性化数据实体对应的唯一标识resId
返回值 个性化卸载异常错误码,错误码用于快速定位异常原因,类型int接口调用正常需返回0值.
说明 卸载通过wrapperLoadRes接口加载的个性化数据
备注 1. 若插件不支持个性化、可空实现直接返回0
2. 个性化缓存超时、个性化请求删除时调用.

wrapperCreate

原型 const void* WrapperAPI wrapperCreate(pParamList params, wrapperCallback cb, unsigned int psrIds[], int psrCnt, int* errNum);
参数 1. 用户请求上传的参数对params,用于会话中控制插件功能
2. 用于异步请求的加载器回调接口cb,同步请求时为NULL
3. 会话依赖的个性化资源组psrIds[],成员即wrapperLoadRes传入id.
4. 会话依赖的个性化资源组大小psrCnt,即psrIds数组大小.
5. 会话实例申请异常错误码errNum,类型int*,接口调用正常需返回0值.
返回值 会话实例申请的插件句柄,关联插件内核实例及后续会话相关插件接口.接口调用异常需返回NULL.
说明 加载器通过该接口申请插件内核实例句柄,用于关联会话上下文.
备注 1. 对于会话模式请求,每次会话对应一次调用. 非会话模式不调用该接口
2. 与wrapperDestroy接口成对使用
3. 该接口存在外部并发调用可能性.
类型定义:
      typedef struct ParamList{
          char* key;
          char* value;
          unsigned int vlen;
          struct ParamList* next;
      }* pParamList;

      // 回调接口,用于异步模式回传内核响应结果
      // handle:wrapperCreate接口返回的插件实例句柄.
      // respData:插件输出的会话请求计算结果.
      typedef int(*wrapperCallback)(const void* handle, pDataList respData);

     接口示例:
          (1). 同步模式:外部加载器通过wrapperRead接口获取结果
           const void* WrapperAPI wrapperCreate(pParamList params, wrapperCallback cb, unsigned int psrIds[], int psrCnt, int* errNum){ 
                   // hdlCache lock
                  std::map<kernelInst, bool>::iterator ite = hdlCache.begin();
                  for ( ; ite != hdlCache.end()  ; ite++){
                           If (ite->second){
                                    ite->second = false; *errNum = 0;
                                    // hdlCache unlock
                                    return (void*)ite->first;
                            }
                  }
                  // hdlCache unlock
                    *errNum = 10010;
                     return NULL;
                }

      (2). 异步模式:插件通过调用加载器回调接口cb返回结果.
      // func1
         wrapperCallback funcCB;
         const void* WrapperAPI wrapperCreate(pParamList params, wrapperCallback cb, unsigned int psrIds[], int psrCnt, int* errNum){
                  // hdlCache lock
                     std::map<kernelInst, bool>::iterator ite = hdlCache.begin();
                     for ( ; ite != hdlCache.end()  ; ite++){
                              If (ite->second){
                                       ite->second = false; *errNum = 0;
                                        // hdlCache unlock
                                           funcCB = cb;
                                           return (void*)ite->first;
                                              }
                      }
                       // hdlCache unlock
                         *errNum = 10010;
                          return NULL;
      }

                // func2, internal private function
                   Int kernelCalc(kernelInst inst){
                           pDataList  result = inst->calc(inputData);
                           funcCB(inst, result);
                           return 0;
                       }

补充说明: (1). 若会话为同步模式,插件需实现create|write|read|destroy配套接口.(当前仅支持同步模式) (2). 若会话为异步模式,插件需实现create|write|destroy接口,结果回传通过回调cb进行返回同步. (3). 会话模式对应平台AI能力上线流程中的接口类型:websocket

wrapperWrite

原型 int WrapperAPI wrapperWrite(const void* handle, pDataList reqData);
参数 1.会话实例申请所得插件句柄handle,wrapperCreate获取
2.会话请求上传的实体数据reqData,包含文本/音频/图像/视频等数据类型
返回值 数据接口异常错误码,错误码用于快速定位异常原因,类型int接口调用正常需返回0值.
说明 会话模式写数据接口,用于将用户请求上传的会话数据传递至插件内核
备注 每次会话对应多次调用,非会话模式不调用

接口示例:

         int WrapperAPI wrapperWrite(const void\* handle, pDataList reqData){
                             kernelInst inst = (kernelInst)handle;
                             //插件写入计算数据
                             int ret = Inst->dataWrite(reqData);
                             return ret;
                               }

补充说明:

(1). 用户请求上传的分块数据可能在加载器中进行合并

(2). 对于单个具体插件实例,加载器单线程调用写数据接口,保证写入数据有序

wrapperRead

原型 int WrapperAPI wrapperRead(const void handle, pDataList respData);
参数 1. 会话实例申请所得插件句柄handle,wrapperCreate获取
2. 插件计算返回的结果respData
返回值 读数据接口异常错误码,错误码用于快速定位异常原因,类型int 接口调用正常需返回0值.
说明 会话模式读数据接口,用于获取插件内核计算结果,最终返回请求用户.
备注 每次会话对应多次调用,非会话模式不调用
接口示例:
        int WrapperAPI wrapperRead(const void* handle, pDataList* respData){
                kernelInst inst = (kernelInst)handle;
                // 插件查询计算结果
                int ret = Inst->queryResult(respData);
                return ret;
             }
调用示例:
       (1). 实时结果模式:会话过程中每次写数据后调用读接口查询实时结果
       int aigesCall(){
                void* inst = wrapperCreate();
                while(!input.end()){
                         wrapperWrite(inst, input);
                         wrapperRead(inst, output);
                 }
                  while(!output.end()){
                          wrapperRead(inst, output);
                  }
                   return 0;
        }
       (2). 非实时结果模式:会话过程中所有数据完整写入后调用读接口
       int aigesCall(){
               void* inst = wrapperCreate();
               while(!input.end()){
                       wrapperWrite(inst, input);
               }
                while(!output.end()){
                        wrapperRead(inst, output);
                }
                 return 0;
            }

补充说明:

(1). 对于单个具体插件实例,加载器单线程调用读数据接口

(2). 结果respData内存空间由插件申请及维护,可于destroy时释放

(3). 一期加载器仅支持实时结果读取模式

_wrapperDestroy

原型 int WrapperAPI wrapperDestroy(const void* handle);
参数 会话实例申请所得插件句柄handle,wrapperCreate获取
返回值 插件实例句柄释放接口异常错误码,类型int 接口调用正常需返回0值.
说明 1. 该接口与wrapperCreate成对使用. 用于句柄申请及释放
2. 每次会话对应一次调用.

接口示例:

int WrapperAPI wrapperDestroy(const void\* handle){
        // hdlCache lock;
        std::map<kernelInst, bool>::iterator ite = hdlCache.find(handle);
        If (ite != hdlCache.end()){
                   ite->second = true;
         }
          // hdlCache unlock;
           return 0;
       }

wrapperExec

原型 int WrapperAPI wrapperExec(pParamList params, pDataList reqData, pDataList* respData);
参数 1. 用户请求上传的参数对params,用于会话中控制插件功能
2. 用户请求上传的实体数据reqData,包含文本/音频/图像/视频等数据类型
3. 插件计算返回的结果respData
返回值 插件非会话请求接口异常错误码,类型int 接口调用正常需返回0值.
说明 1. 接口用于处理非会话模式请求(无上下文管理),每次用户请求触发一次调用
2. 该接口与wrapperExecFree接口成对使用.
类型定义:

typedef struct ParamList{
    char* key;
    char* value;
    unsigned int vlen;
    struct ParamList* next;
} pParamList;

接口示例:

int WrapperAPI wrapperExec(pParamList params, pDataList reqData, pDataList*respData){
       return kernel->calc(params, reqData, respData);
}

补充说明:

(1). 结果respData内存空间由插件申请及维护,于wrapperExecFree时释放

(2). 非会话模式对应平台AI能力上线流程中的接口类型:http

wrapperExecFree

原型 int WrapperAPI wrapperExecFree(pDataList* respData);
参数 wrapperExec接口返回的非会话请求结果缓存指针.
返回值 插件非会话结果缓存释放接口异常错误码,类型int 接口调用正常需返回0值.
说明 1. 接口用于释放非会话接口的结果缓存,每次用户请求触发一次调用
2. 该接口与wrapperExec接口成对使用.

接口示例:

int WrapperAPI wrapperExecFree(pDataList* respData){
        return kernel->release(respData);
}

wrapperExecAsync

原 型 int WrapperAPI wrapperExecAsync(const char* handle, pParamList params, pDataList reqData, wrapperCallback callback, int timeout);
参数 1. 加载器请求句柄,用于异步回调callback时回传以关联请求及结果
2. 用户请求上传的参数对params,用于会话中控制插件功能
3. 用户请求上传的实体数据reqData,包含文本/音频/图像/视频等数据类型
4. 请求异步回调,用于回传请求数据计算结果至加载器
5. 异步请求结果超时时间timeout,单位ms.
返回值 插件非会话异步接口异常错误码,类型int 接口调用正常需返回0值.
说明 该接口需实现为异步非阻塞模式. 请求结果通过加载器回调接口callback回传.
类型定义:

typedef int(*wrapperCallback)(const void* handle, pDataList respData);

接口示例:

// func1
int WrapperAPI wrapperExecAsync(const char* handle, pParamList params, pDataList reqData, wrapperCallback callback, int timeout){
        return = kernel->produce(handle, params, reqData, callback, timeout);
}


// func2, internal private function
Int kernelAsyncCalc(){
      handle, params, reqData, callback, timeout = kernel->consume();
      respData = kernel->calc(params, reqData, timeout);
      return callback(handle, respData);
}

补充说明

对应不同插件引擎的服务模式,插件仅需实现上述部分接口即可正常提供服务,其他接口可做空实现处理. 如下以不同服务模式进行说明.

服务模式 对应接口集 备注
会话模式 同步模式 1. wrapperCreate
2. wrapperWrite
3. wrapperRead
4. wrapperDestroy
会话模式 异步模式 1. wrapperCreate
2. wrapperWrite
3. wrapperDestroy
暂未稳定
非会话模式 同步模式 1. wrapperExec
2. wrapperExecFree
非会话模式 异步模式 1. wrapperExecAysnc 暂未稳定

注:

  1. 通用接口wrapperInit/wrapperFini/wrapperError,各类服务模式插件均需实现

  2. 个性化接口wrapperLoadRes/wrapperUnloadRes由各类服务模式插件按需实现

results matching ""

    No results matching ""