当前位置: 首页 > news >正文

聊聊Spring AI Alibaba的FeiShuDocumentReader

本文主要研究一下Spring AI Alibaba的FeiShuDocumentReader

FeiShuDocumentReader

community/document-readers/spring-ai-alibaba-starter-document-reader-larksuite/src/main/java/com/alibaba/cloud/ai/reader/feishu/FeiShuDocumentReader.java

public class FeiShuDocumentReader implements DocumentReader {private static final Logger log = LoggerFactory.getLogger(FeiShuDocumentReader.class);private final FeiShuResource feiShuResource;private final Client client;private String documentId;private String userAccessToken;private String tenantAccessToken;public FeiShuDocumentReader(FeiShuResource feiShuResource) {this.feiShuResource = feiShuResource;this.client = feiShuResource.buildDefaultFeiShuClient();}public FeiShuDocumentReader(FeiShuResource feiShuResource, String documentId, String userAccessToken,String tenantAccessToken) {this(feiShuResource);this.documentId = documentId;this.userAccessToken = userAccessToken;this.tenantAccessToken = tenantAccessToken;}public FeiShuDocumentReader(FeiShuResource feiShuResource, String userAccessToken) {this(feiShuResource);this.userAccessToken = userAccessToken;}public FeiShuDocumentReader(FeiShuResource feiShuResource, String userAccessToken, String documentId) {this(feiShuResource);this.userAccessToken = userAccessToken;this.documentId = documentId;}/*** use tenant_access_token access [tenant identity]* @param documentId documentId* @param userAccessToken userAccessToken* @return String*/public Document getDocumentContentByUser(String documentId, String userAccessToken) throws Exception {RawContentDocumentReq req = RawContentDocumentReq.newBuilder().documentId(documentId).lang(0).build();RawContentDocumentResp resp = client.docx().document().rawContent(req, RequestOptions.newBuilder().userAccessToken(userAccessToken).build());if (!resp.success()) {System.out.printf("code:%s,msg:%s,reqId:%s, resp:%s%n", resp.getCode(), resp.getMsg(), resp.getRequestId(),Jsons.createGSON(true, false).toJson(JsonParser.parseString(new String(resp.getRawResponse().getBody(), StandardCharsets.UTF_8))));throw new Exception(resp.getMsg());}return toDocument(Jsons.DEFAULT.toJson(resp.getData()));}/*** use tenant_access_token [tenant identity]* @param documentId documentId* @param tenantAccessToken tenantAccessToken* @return String*/public Document getDocumentContentByTenant(String documentId, String tenantAccessToken) throws Exception {RawContentDocumentReq req = RawContentDocumentReq.newBuilder().documentId(documentId).lang(0).build();RawContentDocumentResp resp = client.docx().document().rawContent(req, RequestOptions.newBuilder().tenantAccessToken(tenantAccessToken).build());if (!resp.success()) {System.out.printf("code:%s,msg:%s,reqId:%s, resp:%s%n", resp.getCode(), resp.getMsg(), resp.getRequestId(),Jsons.createGSON(true, false).toJson(JsonParser.parseString(new String(resp.getRawResponse().getBody(), StandardCharsets.UTF_8))));throw new Exception(resp.getMsg());}return toDocument(Jsons.DEFAULT.toJson(resp.getData()));}/*** get document list* @param userAccessToken userAccessToken* @return String*/public Document getDocumentListByUser(String userAccessToken) throws Exception {ListFileReq req = ListFileReq.newBuilder().orderBy("EditedTime").direction("DESC").build();ListFileResp resp = client.drive().file().list(req, RequestOptions.newBuilder().userAccessToken(userAccessToken).build());if (!resp.success()) {System.out.printf("code:%s,msg:%s,reqId:%s, resp:%s%n", resp.getCode(), resp.getMsg(), resp.getRequestId(),Jsons.createGSON(true, false).toJson(JsonParser.parseString(new String(resp.getRawResponse().getBody(), StandardCharsets.UTF_8))));throw new Exception(resp.getMsg());}return toDocument(Jsons.DEFAULT.toJson(resp.getData()));}private Document toDocument(String docText) {return new Document(docText);}@Overridepublic List<Document> get() {List<Document> documents = new ArrayList<>();if (this.feiShuResource != null) {loadDocuments(documents, this.feiShuResource);}return documents;}private void loadDocuments(List<Document> documents, FeiShuResource feiShuResource) {String appId = feiShuResource.getAppId();String appSecret = feiShuResource.getAppSecret();String source = format("feishu://%s/%s", appId, appSecret);try {documents.add(new Document(source));if (this.userAccessToken != null) {documents.add(getDocumentListByUser(userAccessToken));}else {log.info("userAccessToken is null");}if (this.tenantAccessToken != null && this.documentId != null) {documents.add(getDocumentContentByTenant(documentId, tenantAccessToken));}else {log.info("tenantAccessToken or documentId is null");}if (this.userAccessToken != null && this.documentId != null) {documents.add(getDocumentContentByUser(documentId, userAccessToken));}else {log.info("userAccessToken or documentId is null");}}catch (Exception e) {log.warn("Failed to load an object with appId: {}, appSecret: {},{}", appId, appSecret, e.getMessage(), e);}}}

FeiShuDocumentReader构造器依赖FeiShuResource,其get方法通过loadDocuments将feiShuResource解析为documents,它通过com.lark.oapi.Client根据userAccessToken或tenantAccessToken去读取文档

FeiShuResource

community/document-readers/spring-ai-alibaba-starter-document-reader-larksuite/src/main/java/com/alibaba/cloud/ai/reader/feishu/FeiShuResource.java

public class FeiShuResource implements Resource {public static final String SOURCE = "source";public static final String FEISHU_PROPERTIES_PREFIX = "spring.ai.alibaba.plugin.feishu";private final String appId;private final String appSecret;//......
}	

FeiShuResource定义了appId、appSecret属性

示例

@EnabledIfEnvironmentVariable(named = "FEISHU_APP_ID", matches = ".+")
@EnabledIfEnvironmentVariable(named = "FEISHU_APP_SECRET", matches = ".+")
public class FeiShuDocumentReaderTest {private static final Logger log = LoggerFactory.getLogger(FeiShuDocumentReaderTest.class);// Get configuration from environment variablesprivate static final String FEISHU_APP_ID = System.getenv("FEISHU_APP_ID");private static final String FEISHU_APP_SECRET = System.getenv("FEISHU_APP_SECRET");// Optional user token and document ID from environment variablesprivate static final String FEISHU_USER_TOKEN = System.getenv("FEISHU_USER_TOKEN");private static final String FEISHU_DOCUMENT_ID = System.getenv("FEISHU_DOCUMENT_ID");private FeiShuDocumentReader feiShuDocumentReader;private FeiShuResource feiShuResource;static {if (FEISHU_APP_ID == null || FEISHU_APP_SECRET == null) {System.out.println("FEISHU_APP_ID or FEISHU_APP_SECRET environment variable is not set. Tests will be skipped.");}}@BeforeEachvoid setup() {// Skip test if environment variables are not setAssumptions.assumeTrue(FEISHU_APP_ID != null && !FEISHU_APP_ID.isEmpty(),"Skipping test because FEISHU_APP_ID is not set");Assumptions.assumeTrue(FEISHU_APP_SECRET != null && !FEISHU_APP_SECRET.isEmpty(),"Skipping test because FEISHU_APP_SECRET is not set");// Create FeiShuResource with environment variablesfeiShuResource = FeiShuResource.builder().appId(FEISHU_APP_ID).appSecret(FEISHU_APP_SECRET).build();}@Testvoid feiShuDocumentTest() {feiShuDocumentReader = new FeiShuDocumentReader(feiShuResource);List<Document> documentList = feiShuDocumentReader.get();log.info("result:{}", documentList);}@Testvoid feiShuDocumentTestByUserToken() {// Skip test if user token is not setAssumptions.assumeTrue(FEISHU_USER_TOKEN != null && !FEISHU_USER_TOKEN.isEmpty(),"Skipping test because FEISHU_USER_TOKEN is not set");feiShuDocumentReader = new FeiShuDocumentReader(feiShuResource, FEISHU_USER_TOKEN);List<Document> documentList = feiShuDocumentReader.get();log.info("result:{}", documentList);}@Testvoid feiShuDocumentTestByUserTokenAndDocumentId() {// Skip test if user token or document ID is not setAssumptions.assumeTrue(FEISHU_USER_TOKEN != null && !FEISHU_USER_TOKEN.isEmpty(),"Skipping test because FEISHU_USER_TOKEN is not set");Assumptions.assumeTrue(FEISHU_DOCUMENT_ID != null && !FEISHU_DOCUMENT_ID.isEmpty(),"Skipping test because FEISHU_DOCUMENT_ID is not set");feiShuDocumentReader = new FeiShuDocumentReader(feiShuResource, FEISHU_USER_TOKEN, FEISHU_DOCUMENT_ID);List<Document> documentList = feiShuDocumentReader.get();log.info("result:{}", documentList);}}

小结

spring-ai-alibaba-starter-document-reader-larksuite提供了FeiShuDocumentReader用于根据userAccessToken或tenantAccessToken读取飞书文档列表或者指定documentId的文档内容。

doc

  • java2ai

相关文章:

  • Gitlab runner 安装和注册
  • Sentinel源码—6.熔断降级和数据统计的实现二
  • 【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值
  • React 打包
  • Python数据可视化领域的卓越工具:深入剖析Seaborn、Plotly与Pyecharts
  • 使用LSTM动态调整SIMPLE算法松弛因子的CFD仿真训练程序
  • B+树删除和测试
  • seate TCC模式案例
  • vue3 toRefs 与 toRef的使用
  • SpringCloud概述和环境搭建
  • Vue3 响应式原理: Proxy 数据劫持详解
  • 命令行参数·环境变量·进程地址空间(linux+C/C++)
  • 【Rust 精进之路之第14篇-结构体 Struct】定义、实例化与方法:封装数据与行为
  • STM32开发过程中碰到的问题总结 - 4
  • C++:详解命名空间
  • Chromium 134 编译指南 Ubuntu篇:环境搭建与源码获取(一)
  • Cesium 地形加载
  • 2025年渗透测试面试题总结-拷打题库07(题目+回答)
  • 性能比拼: Go vs Bun
  • PICO4 Ultra MR开发 空间网格扫描 模型导出及预览
  • 牛市早报|国常会:要持续稳定股市,4月LPR今日公布
  • “棉花糖爸爸”陈生梨:女儿将落户到贵州纳雍
  • 北京理工大学解除宫某聘用关系,该教授此前被指骚扰猥亵学生
  • 普京宣布临时停火30小时
  • 新城市志|全球供应链动荡加剧,中国稳外贸有信心有底气
  • 黄山旅游:去年黄山景区累计接待进山游客492.24万人,同比增长7.6%