# 第三方交互 / TS-OPI callback

本页记录框架函数通过 TS-OPI 与 TS-OPS 接收可执行回调的调用模式

PDF 没有声明名为 `callback` 的 TSL 函数；实际调用入口是 `tenantCall`、`opsCall` 以及业务方发布的 service function，因此本页作为场景页保留，不把文档标题伪装成 API 声明

## 场景分类

| 场景                | 回调所在位置                  | 调用方式                           |
| ------------------- | ----------------------------- | ---------------------------------- |
| 跨账号 OPI callback | 其他租户的 TSL function       | `tenantCall` 调用租户公开接口      |
| 跨账号 OPS callback | 其他租户授权的 OPS function   | `tenantCall` 调用 `OPS/<function>` |
| 同账号 OPS callback | 当前账号可访问的 OPS function | `opsCall` 直接调用 OPS 服务        |

## TSL 调用案例

### 跨账号调用 OPI 因子

```tsl
// 需已为该 SESSION-KEY 配置目标函数的租户访问权限
session_key := "{9B687E49-******}";
return tenantCall(
    session_key,
    "MF_Demo_Data_YS_02",
    array("SH000300", 20260430T),
    5000
);
```

### 跨账号调用 OPS 因子

```tsl
// 需目标租户已授权对应 OPS function
session_key := "{9B687E49-******}";
return tenantCall(
    session_key,
    "OPS/tfm_getlocalfactordataendt",
    array("A02001", 20260430T),
    5000
);
```

### 同账号直接调用 OPS 因子

```tsl
// 需本地 OPS 服务已注册并保持运行
return opsCall(
    "tfm_getlocalfactordataendt",
    "",
    array("A02001", 20240131T),
    50000
);
```

### 将跨账号 function 作为 service callback

```tsl
// 目标 service function 与租户接口需由业务方预先发布
factor_formula_daily := %%callback
tenantCall(
    "{9B687E49-******}",
    "MF_Demo_Data_YS_02",
    array("SH000300", endt),
    5000
)
%%callback;
factor_name := "账面市值比";
beg_t := 20240101T;
end_t := 20250101T;
cycle := cy_Month();
stock_zone := "SH000300";
index_id := "SH000300";
return trainVideo_TS04020_05(
    factor_formula_daily,
    factor_name,
    beg_t,
    end_t,
    cycle,
    stock_zone,
    index_id
);
```
