本文档主要说明了SimpleTex开放平台服务的使用方式与须知的信息,如有疑问欢迎咨询SimpleTex团队。
开放平台接口说明
一、开放平台鉴权
- 在注册完成SimpleTex普通账户后,在用户中心开通开放平台账户,就可以通过用户授权令牌(User Access Token,简称UAT)或是开放平台应用的APP ID以及APP Secret对请求体签名的方式访问开放平台。
- 其中通过UAT方式仅供开发使用,请勿在生产环境中使用该方式。同时如果您的应用需要部署在用户端而不是自有的服务端时,请不要直接将API鉴权的核心接口暴露与应用程序内,而需要通过获取临时的应用授权令牌来进行请求。
1、UAT鉴权
通过用户授权令牌方式接入,最简单快捷的方式
获取方式:前往用户中心(https://simpletex.cn/user/center), 在“用户授权令牌”菜单处创建即可
请求方式:将用户授权令牌信息放置于请求的
header
即可,字段名为token
,如header={"token":"XXXXX"}
注意:为确保您的应用与账户安全,请在不要在生产环境中使用本方法进行请求。
2、APP鉴权
通过开放平台应用方式接入(APP方式,更安全的方式)
获取方式:前往用户中心(https://simpletex.cn/user/center),开通开放平台功能后,在“应用列表”菜单处创建即可,创建完成后您将获得该新应用的APP ID以及APP Secret,注意,APP Secret是重要敏感信息,仅展示一次,如果丢失请重新创建应用。
请求方式:
开放平台应用的鉴权方式需要对POST上传的data数据(即表单键值对,非二进制文件部分的参数)进行签名。签名的算法流程为:
(1) 生成16位的随机字符串(数字与大小写字母),放入header的
random-str
字段(2) 获取当前时间戳,放入header的
timestamp
字段(精确到秒即可)(3) 将当前使用的APP ID信息,放入header的
app-id
字段(4) 将data数据里其他key取出,并基于字符串顺序对key排序(从a-z,升序),通过
&
连接各key与对应的字段信息,如key1=xxx&key2=xxx&...&keyn=xxx
(其中1-3步中的random-str
,timestamp
,app-id
字段也需加入这个字符串中(5) 将APP Secret信息通过
&secret=xxx
的方式加在第4步生成的字符串的结尾(无视key的排序顺序),变为key1=xxx&key2=xxx&...&keyn=xxx&secret=xxx
(6) 对上一步得到的字符串通过MD5签名算法进行签名,并获取其字符串表达(32位长度)
(7) 将这一签名字符串放入
header
中,字段名为sign
(8) 最后完成的用于鉴权的
header
格式应为header={ "app-id":xxx, "random-str":xxx, "timestamp":xxx, "sign":xxx }
(注意不能业务请求中的其他地方包含APP Secret信息,该信息仅仅用以生成签名以证明合法身份,不需要包含在请求体内)
(9)至此完成APP鉴权所需信息准备
(10) 示例
- 原data信息:
use_batch=True
(在这个例子中我们使用下面展示的这个)
{ "use_batch"=True }
- 获取其他所需的信息:
{ 'timestamp': '1675550577', 'random-str': 'mSkYSY28N4WkvidB', 'app-id': '19X4f10YM1Va894nvFl89ikY', // 仅供测试使用 }
- 示例的APP Secret为
fu4Wfmna4153DFN12ctBsPqgVI3vvGGK
,则可以计算得出待签名的字符串为(字段排序为app-id
,random-str
,use_batch
,secret
):app-id=19X4f10YM1Va894nvFl89ikY&random-str=mSkYSY28N4WkvidB×tamp=1675550577&use_batch=True&secret=fu4Wfmna4153DFN12ctBsPqgVI3vvGGK
- 使用MD5算法计算签名,为
5f271e1deccd95d467c7dd430ca2c8b1
(可以使用(http://tool.pfan.cn/md5)网站进行测试,或搜索在线MD5) - 最终header信息为:
{ 'timestamp': '1675550577', 'random-str': 'mSkYSY28N4WkvidB', 'app-id': '19X4f10YM1Va894nvFl89ikY', 'sign': '5f271e1deccd95d467c7dd430ca2c8b1' }
- 原data信息:
二、API返回信息
1、返回结构
API返回的信息中,
status
代表了本次请求是否成功,其余结果信息放置于res
字段内,request_id
则包含了本次请求的ID标准的返回格式为
{ "status": true/false, // 是否成功调用接口 "res": { // 调用结果 ... }, "request_id": "tr_xxxxxxxxxx" // 请求ID }
2、错误代码
errType名称 | HTTP状态码 | 说明 |
---|---|---|
api_not_find | 404 | 找不到对应的API或对应的版本 |
req_method_error | 405 | 错误的请求方法(如GET,POST) |
req_unauthorized | 401 | 鉴权失败(任何细节的错误都将导致返回这一结果,请仔细检查!) |
resource_no_valid | 402 | 没有可以用以调用接口的资源,如无资源包或账户余额不足 |
image_missing | 413 | 没有上传图片文件 |
image_oversize | 413 | 图片文件过大 |
sever_closed | 503 | 服务器未启动/维护中 |
server_error | 500 | 服务器内部错误 |
exceed_max_qps | 429 | 超出最大调用的QPS,请稍后再试 |
exceed_max_ccy | 429 | 超出最大调用的并发请求量,请稍后再试 |
server_inference_error | 500 | 服务器推理错误 |
image_proc_error | 500 | 上传图片处理错误 |
invalid_param | 500 | 不合法的参数导致的服务器错误 |
too_many_file | 500 | 文件太多导致的服务器错误 |
no_file_error | 500 | 没有文件导致的服务器错误 |
三、示例代码
- Python示例代码
1、UAT鉴权方式
import requests
SIMPLETEX_UAT="xxxxx"
api_url="https://server.simpletex.cn/xxxxx" # 接口地址
data = { } # 请求参数数据(非文件型参数),视情况填入,可以参考各个接口的参数说明
header={ "token": SIMPLETEX_UAT } # 鉴权信息,此处使用UAT方式
file=[("file",("test.png",open("test.png", 'rb')))] # 请求文件,字段名一般为file
res = requests.post(api_url, files=file, data=data, headers=header) # 使用requests库上传文件
print(json.loads(res.text))
- Python示例代码
2、APP鉴权方式
import datetime
import json
import requests
from random import Random
import hashlib
SIMPLETEX_APP_ID = "xxxxx"
SIMPLETEX_APP_SECRET = "xxxxxxxxxxxxxxx"
def random_str(randomlength=16):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str += chars[random.randint(0, length)]
return str
def get_req_data(req_data, appid, secret):
header = {}
header["timestamp"] = str(int(datetime.datetime.now().timestamp()))
header["random-str"] = random_str(16)
header["app-id"] = appid
pre_sign_string = ""
sorted_keys = list(req_data.keys()) + list(header)
sorted_keys.sort()
for key in sorted_keys:
if pre_sign_string:
pre_sign_string += "&"
if key in header:
pre_sign_string += key + "=" + str(header[key])
else:
pre_sign_string += key + "=" + str(req_data[key])
pre_sign_string += "&secret=" + secret
header["sign"] = hashlib.md5(pre_sign_string.encode()).hexdigest()
return header, req_data
img_file = {"file": open("./image/1.png", 'rb')}
data = { } # 请求参数数据(非文件型参数),视情况填入,可以参考各个接口的参数说明
header, data = get_req_data(data, SIMPLETEX_APP_ID, SIMPLETEX_APP_SECRET)
res = requests.post("https://server.simpletex.cn/xxxx", files=img_file, data=data, headers=header)
print(json.loads(res.text))
开放能力
一、SimpleTex公式识别
公式识别模型分为轻量模型与标准模型,其中轻量模型速度更快而标准模型效果略好一些,可按场景测试自行选择。
专用公式识别目前支持识别80多种语言的各类文字以及LaTeX符号、矩阵、化学结构式和复杂算式,支持手写和打印体识别。如若要识别文档类型的图片,请移步SimpleTex通用图片识别API,在线测试体验地址:https://simpletex.cn/ai/latex_ocr
收费模式:按量收费与预付费资源包
目前有两种计费方式,第一种是按量付费,另一种是通过预付费的资源包进行调用抵扣。其中扣费顺序为 免费资源包 -> 付费资源包(按过期时间排序,优先调用截至日期早的资源)-> 按量付费
服务计费仅对调用成功的部分进行收费,用户可以在开放平台查询自己的调用情况和相关订单。注意:Batch调用中的每一个成功的文件/图片计算将算作单独的一次调用。
API按量付费(注意下列价格不是SimpleTex正式推出服务后的价格,仅供参考!如有问题,欢迎咨询我们)
1、轻量公式识别模型API
服务价格(轻量)
月调用量(次) | 价格(元/次) |
---|---|
<1000 | 免费 |
1000-5000 | 0.04 |
>5000 | 0.01 |
API调用速度限制
限制量 | 默认调用免费量 |
---|---|
请求处理并发量 | 5 |
普通请求QPS | 5 |
Batch请求QPS/并发量 | 25 |
API调用方法
接口地址:https://server.simpletex.cn/api/latex_ocr_turbo
模型版本:
SimpleTex V2.5
接口方法:
POST
请求参数:
Header
:鉴权参数(UAT或APP信息)Body
:Multipart/form-data
参数详解
参数名 | 参数类型 | 必填 | 说明 | 示例 |
---|---|---|---|---|
file | 文件 | 是 | 合法的图片二进制文件信息,包括png/jpg等格式,其中如果开启批量请求,则文件名不能重复,否则重名文件结果将冲突覆盖 | / |
2、标准公式识别模型API
服务价格(标准)
月调用量(次) | 价格(元/次) |
---|---|
<1000 | 免费 |
1000-5000 | 0.05 |
>5000 | 0.02 |
其中,每月1号凌晨0时清空记录,按阶梯次进行计费。轻量模型每日赠送2000次免费调用,标准模型赠送500次免费调用。
预付费资源包(因业务调整,请咨询我们获取报价)
如需其他规格的资源包,请联系我们。同时资源包不支持退款,购买前请估计好一个合理的次数使用,如需要升级次数请重新购买新的资源包或按照按量付费方式进行计费。
API 调用速度限制
限制量 | 默认调用免费量 |
---|---|
请求处理并发量 | 2 |
普通请求QPS | 2 |
Batch请求QPS/并发量 | 10 |
QPS是指每秒请求的次数,请求处理并发量是指服务器同时有几个线程处理用户的请求,其中可以通过购买QPS叠加包来扩充QPS。对于一个Batch的请求,Batch中含有的单个待处理对象将各占一个Batch请求QPS额度,并占用相同数量的请求处理并发量。
示例:某接口的QPS和并发都为1,假设一个请求需要0.3s服务器计算响应,则最大请求速度被QPS限制,最大为1s/次。若一个请求需要3s服务器计算响应,则最大请求速度被并发限制,最大为3s/次。(根据利特尔法则,并发量=QPS*接口平均处理时间)
对于请求速度要求高的业务,可以联系我们选配增加QPS资源包。如有特殊需求请联系我们。
API 调用方法
接口地址:https://server.simpletex.cn/api/latex_ocr
模型版本:
SimpleTex V2.5
接口方法:
POST
请求参数:
Header
:鉴权参数(UAT或APP信息)Body
:Multipart/form-data
参数详解
参数名 | 参数类型 | 必填 | 说明 | 示例 |
---|---|---|---|---|
file | 文件 | 是 | 合法的图片二进制文件信息,包括png/jpg等格式,其中如果开启批量请求,则文件名不能重复,否则重名文件结果将冲突覆盖 | / |
3、API返回信息示例
上传单个文件
{ "status": true, // 是否成功调用接口 "res": { // 调用结果 "latex": "a^{2}-b^{2}", // LaTeX信息,后续会开放更多信息在这一部分 "conf":0.95 // 置信度 }, "request_id": "tr_16755479007123063412063155819" // 请求ID }
上传多个文件
{ "status": true, // 是否成功调用接口 "res": { // 调用结果 "stats": { // 成功与失败调用统计 "fail": 0, "success": 2 }, "fail_res": {}, // 失败图片的调用报错信息 "success_res": { // 成功识别图片的结果信息 "test_1.png": { "latex": "a^{2}-b^{2}", "conf":0.95 // 置信度 }, "test_2.png": { "latex": "a^{3}+b^{3}", "conf":0.90 } } }, "request_id": "tr_16755477466238226695895375638" // 请求ID }
- 特殊返回值 [EMPTY]: 图片为空
二、SimpleTex通用图片识别
SimpleTex通用图片识别目前支持识别80多种语言的各类文字以及LaTeX符号、矩阵和复杂算式,支持表格、文字混排、文档页面、双栏论文与常见手写/打印体识别。
1、API调用方法
轻量模型接口地址:https://server.simpletex.cn/api/simpletex_ocr
模型版本:
SimpleTex General OCR V1
接口方法:
POST
请求参数:
Header
:鉴权参数(UAT或APP信息)Body
:Multipart/form-data
参数详解
参数名 | 参数类型 | 必填 | 说明 | 示例 |
---|---|---|---|---|
file | 文件 | 是 | 合法的图片二进制文件信息,包括png/jpg等格式,无法开启批量调用,仅支持一次上传一张图片 | / |
rec_mode | 字符串 | 否 | 可以填写"auto", "document", "formula",用以指定识别图片的类型,如果使用auto则会自动检测,使用document会返回markdown文档结果,使用formula会返回LaTeX结果 | "auto" |
enable_img_rot | 布尔类型 | 否 | 开启后,模型将基于0°,90°, 180°, 270°自动矫正上传图片的方向,默认不开启 | "false" |
inline_formula_wrapper | 字符串形式Json列表 | 否 | 用于修改行内公式在markdown中的包裹符号。以Json形式填入,如果格式错误将使用默认的包裹符号 | ["$","$"] |
isolated_formula_wrapper | 字符串形式Json列表 | 否 | 用于修改独立行公式在markdown中的包裹符号。以Json形式填入,如果格式错误将使用默认的包裹符号 | ["$$","$$"] |
2、API价格
月调用量(次) | 价格(元/页) |
---|---|
<1000 | 免费 |
1000-5000 | 0.1 |
>5000 | 0.04 |
并发限制量 | 默认调用免费量 |
---|---|
请求处理并发量 | 1 |
普通请求QPS | 1 |
目前测试期间每天自动领取50次免费识别。
三、SimpleTex文档图片识别(PDF识别)
SimpleTex文档图片识别目前支持识别中英两种语言的识别,是目前公式图表增强模式下使用的PDF文件识别的OCR接口 【注意:该接口可能随时进行变动,目前仅供测试参考使用】
1、API 调用方法
轻量模型接口地址:https://server.simpletex.cn/api/doc_ocr
模型版本:
SimpleTex Doc OCR V1
接口方法:
POST
请求参数:
Header
:鉴权参数(UAT或APP信息)Body
:Multipart/form-data
其他说明:目前该接口仅支持一次上传一个文件,不支持批量调用。
参数详解
参数名 | 参数类型 | 必填 | 说明 | 示例 |
---|---|---|---|---|
file | 文件 | 是 | 合法的PDF页的图片二进制文件信息,包括png/jpg等格式,无法开启批量调用,仅支持一次上传一张图片 | / |
inline_formula_wrapper | 字符串形式Json列表 | 否 | 用于修改行内公式在markdown中的包裹符号。以Json形式填入,如果格式错误将使用默认的包裹符号 | ["$","$"] |
isolated_formula_wrapper | 字符串形式Json列表 | 否 | 用于修改独立行公式在markdown中的包裹符号。以Json形式填入,如果格式错误将使用默认的包裹符号 | ["$$","$$"] |
2、API 价格 (2025年最新降价!)
月调用量(次) | 价格(元/页) |
---|---|
<1000 | 免费 |
1000+ | 0.02 |
并发限制量 | 默认调用免费量 |
---|---|
请求处理并发量 | 1 |
普通请求QPS | 1 |
3、API 返回信息示例
- 上传单个文件
{ "status": true, // 是否成功调用接口 "res": { // 调用结果 "content": "...", // Markdown信息 }, "request_id": "tr_16755479007123063412063155819" // 请求ID }
4、PDF识别示例代码
下列代码可以用于将PDF文件转换为Markdown文件,其中使用了PyMuPDF库进行PDF文件的读取,使用PIL库进行图片的处理,使用requests库进行文件上传,使用tqdm库进行进度条显示。
其中可以先用pip安装PyMuPDF, requests, Pillow, tqdm等库然后调用
pip install PyMuPDF requests Pillow tqdm
详细代码
import io
import fitz
from PIL import Image
import requests
from tqdm import tqdm
UAT = "xxxxx" # 用户授权令牌
def pillow_image_to_file_binary(image):
btyes_io = io.BytesIO()
image.save(btyes_io, format='PNG')
return btyes_io.getvalue()
def convert_pdf_to_images(pdf_binary, dpi=100):
doc = fitz.open("pdf", pdf_binary)
images = []
for i in range(doc.page_count):
page = doc[i]
image = page.get_pixmap(dpi=dpi)
image = Image.frombytes("RGB", [image.width, image.height], image.samples)
images.append(image)
return images
def pdf_ocr(image):
api_url = "https://server.simpletex.cn/api/doc_ocr/"
header = {"token": UAT} # 鉴权信息,此处使用UAT方式
img_file = {"file": pillow_image_to_file_binary(image)}
res = requests.post(api_url, files=img_file, data={}, headers=header).json() # 使用requests库上传文件
print(res)
return res["res"]["content"]
if __name__ == '__main__':
pdf_path = 'test.pdf' # 输入pdf文件
file_binary = open(pdf_path, 'rb').read()
images = convert_pdf_to_images(file_binary)
final_markdown_content = ""
for image in tqdm(images):
final_markdown_content += pdf_ocr(image) + "\n"
open("test.md", "w", encoding="utf-8").write(final_markdown_content)
print(final_markdown_content) # 保存并输出最终markdown文件
在未来将进一步支持PDF文件异步直接上传服务。目前测试期间每天自动领取1000次免费识别
其他开放能力将逐步开放(通用文字识别、词嵌入、对话机器人、中英翻译、版面分析)