news 2026/9/16 16:56:14

在 Corsair 中集成 TextRazor:NLP 文本分析插件完整使用指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 Corsair 中集成 TextRazor:NLP 文本分析插件完整使用指南

在 Corsair 中集成 TextRazor:NLP 文本分析插件完整使用指南

【免费下载链接】corsairConnect your users to their apps项目地址: https://gitcode.com/GitHub_Trending/corsa/corsair

@corsair-dev/textrazor是 Corsair 官方生态中的一个插件包,它将 TextRazor 的 REST API(实体抽取、文本分类、自定义词典与分类器等能力)封装为类型安全、可统一鉴权的 Corsair 端点。本文以 packages/textrazor/README.md 为核心骨架,结合 插件源码、端点实现 与 测试与配置,带你完成从安装、鉴权到 17 个 API 端点的完整接入,掌握如何在多租户环境中安全、可靠地调用 TextRazor 文本分析能力。

一、插件是什么

TextRazor 提供基于 NLP 的文本理解服务,包括命名实体识别(NER)、主题提取、文本分类、依存句法分析、拼写纠错等。在 Corsair 中,它被封装为id: 'textrazor'的插件,具备以下特性:

  • 统一鉴权:使用 API Key(api_key)认证,Corsair 会在租户首次使用时提示录入凭证(见 index.ts 的textrazorAuthConfig);
  • 类型安全:每个端点都有 Zod 输入/输出 Schema(见 endpoints/types.ts),配合 TypeScript 可获得完整的参数与返回值推导;
  • 结果落库缓存:分析出的实体、账户信息、词典与分类器类别会自动写入 Corsair 数据库(见 schema/database.ts);
  • 无 Webhook:TextRazor 为同步 API,本插件webhooks: {}pluginWebhookMatcher始终返回false

二、安装与基础使用

在 Corsair 项目中安装:

pnpm add @corsair-dev/textrazor

插件的 peer 依赖为corsair >= 0.1.0zod ^4.1.13(见 package.json)。注册并调用:

import { textrazor } from '@corsair-dev/textrazor'; const plugin = textrazor({ // 可选:直接注入 API Key;不注入时 Corsair 会在租户首次使用时提示录入 key: process.env.TEXTRAZOR_API_KEY, }); // 在 handler 中调用分析端点 const result = await plugin.endpoints.analysis.analyzeContent(ctx, { text: 'Apple announced a new iPhone on September 9.', extractors: ['entities', 'topics'], });

插件默认authType'api_key'(见 index.ts)。密钥解析逻辑位于keyBuilder:当source === 'endpoint'时优先使用构造选项中的key,否则从ctx.keys.get_api_key()读取租户密钥;两者都缺失时抛出AuthMissingError

三、端点全览

README 中给出了插件暴露的全部 17 个端点。每个端点带 Operation ID、风险等级与说明,风险等级分为read(读)、write(写)与destructive(删除),是 Corsair 权限系统的重要依据:

OperationOperation IDRiskDescription
account.gettextrazor.api.account.getreadGet the current TextRazor plan, concurrency limits, and daily usage
analysis.analyzeContenttextrazor.api.analysis.analyzeContentreadAnalyze text or a URL with one or more TextRazor extractors in a single call
analysis.classifyTexttextrazor.api.analysis.classifyTextreadClassify text or a URL against built-in or custom TextRazor classifiers
analysis.extractEntitiestextrazor.api.analysis.extractEntitiesreadExtract named entities from text or a URL, optionally filtering by relevance and confidence
classifiers.deletetextrazor.api.classifiers.deletedestructiveDelete a custom classifier and all of its categories
classifiers.deleteCategorytextrazor.api.classifiers.deleteCategorydestructiveDelete a category from a custom classifier
classifiers.getCategorytextrazor.api.classifiers.getCategoryreadGet a category from a custom classifier by id
classifiers.listCategoriestextrazor.api.classifiers.listCategoriesreadList categories for a custom classifier with limit and offset pagination
classifiers.puttextrazor.api.classifiers.putwriteCreate or update a custom classifier from JSON categories
dictionaries.addEntriestextrazor.api.dictionaries.addEntrieswriteAdd or overwrite entries in a custom entity dictionary
dictionaries.createtextrazor.api.dictionaries.createwriteCreate a custom entity dictionary
dictionaries.deletetextrazor.api.dictionaries.deletedestructiveDelete a custom entity dictionary and all of its entries
dictionaries.deleteEntrytextrazor.api.dictionaries.deleteEntrydestructiveDelete a dictionary entry by id
dictionaries.gettextrazor.api.dictionaries.getreadGet a custom entity dictionary by id
dictionaries.getEntrytextrazor.api.dictionaries.getEntryreadGet a dictionary entry by id
dictionaries.listtextrazor.api.dictionaries.listreadList custom entity dictionaries on the account
dictionaries.listEntriestextrazor.api.dictionaries.listEntriesreadList dictionary entries with limit and offset pagination

在源码中,端点被组织为analysisaccountdictionariesclassifiers四组(见 index.ts 的textrazorEndpointsNested),端点元数据(风险等级与描述)定义在textrazorEndpointMeta中。

四、分析类端点:analyzeContent / classifyText / extractEntities

三个分析端点共用同一套参数体系(endpoints/types.ts):

参数类型说明
text/urlstring二选一必填,Schema 通过refine强制要求恰好提供一个(Provide exactly one of text or url
extractorsExtractorSchema[]抽取器列表。支持entitiestopicswordsphrasesdependency-treesrelationsentailmentssensesspellinganalyzeContent必填且至少 1 个)
classifiersstring[]分类器 id 列表(classifyText必填且至少 1 个)
classifierMaxCategoriesnumber每个分类器最多返回的类别数(正整数)
cleanupMode'raw' \| 'stripTags' \| 'cleanHTML'HTML 清洗模式
cleanupReturnCleaned/cleanupReturnRawboolean是否返回清洗后/原始文本
cleanupUseMetadataboolean是否使用页面元数据
cleanupCleanHtmlPrecision1 \| 2 \| 3cleanHTML 精度
cleanupCleanHtmlUseTitleboolean是否保留标题
downloadRunJavascriptboolean抓取 URL 时是否执行 JS
downloadUserAgentstring自定义 User-Agent
entitiesAllowOverlapboolean是否允许实体重叠
entitiesDictionariesstring[]使用的自定义实体词典 id
entitiesFilterDbpediaTypes/entitiesFilterFreebaseTypesstring[]按 DBPedia/Freebase 类型过滤实体
entitiesIncludeAddressPlacesboolean是否包含地址类地点
languageOverridestring语言覆盖(≥2 字符)
rulesstring自定义规则
minRelevanceScorenumber实体相关度下限[0,1](仅extractEntities
minConfidenceScorenumber实体置信度下限(仅extractEntities

三个端点最终都会向 TextRazor 根路径POST /发送application/x-www-form-urlencoded表单(见 endpoints/analysis.ts)。表单字段名(如classifier.maxCategoriescleanup.modeentities.dictionaries)与 TextRazor 官方参数命名一一对应,由 endpoints/call.ts 的analysisForm负责映射:

function analysisForm(input) { return { text: input.text, url: input.url, extractors: input.extractors, classifiers: input.classifiers, 'classifier.maxCategories': input.classifierMaxCategories, 'cleanup.mode': input.cleanupMode, 'entities.dictionaries': input.entitiesDictionaries, // ... }; }

需要注意一个实现细节:classifyTextextractEntities即使未显式传入extractors,也会默认注入['entities'](见 endpoints/analysis.ts)。extractEntitiesminRelevanceScore/minConfidenceScore过滤是在响应返回后由插件在本地完成二次过滤,而非通过 API 请求参数实现。

实体的本地缓存

分析完成后,插件会遍历response.entities,按entityId ?? matchedText去重,将matchedTextconfidenceScorerelevanceScorewikiLinkwikidataId等字段通过ctx.db.entities.upsertByEntityId写入数据库(见 endpoints/analysis.ts)。落库失败仅打印告警日志,不会中断请求。

五、账户端点:account.get

account.get对应 GETaccount/,返回当前 TextRazor 套餐信息:planconcurrentRequestLimitconcurrentRequestsUsedplanDailyRequestsIncludedrequestsUsedToday(见 endpoints/account.ts)。调用后结果会以id: 'current'缓存到ctx.db.accounts,方便后续请求读取套餐与用量而无需重复调用远程 API。

六、自定义词典:dictionaries 端点组

TextRazor 支持自定义实体词典(entity dictionary),用于在分析中识别业务专属名词。本插件将其映射到 TextRazor 的entities/REST 路径(见 endpoints/dictionaries.ts 的dictionaryPath,id 会经过encodeURIComponent处理):

  • create:PUTentities/{id},请求体 JSON 为{ matchType, caseInsensitive, language }matchType取值'token' | 'stem'caseInsensitive控制大小写敏感;language指定语言。创建成功后同步缓存到ctx.db.dictionaries
  • list:GETentities/,列出账户下全部词典;
  • get:GETentities/{id},按 id 获取词典;
  • delete:DELETEentities/{id},删除词典及其全部条目;
  • listEntries:GETentities/{id}/_all,支持limit(正整数)与offset(≥0)分页查询参数;
  • addEntries:POSTentities/{id}/,请求体为条目数组,每条含id(可选)、text(必填,≥1 字符)、dataRecord<string, string[]>,可挂任意自定义元数据),用于添加或覆盖词典条目;
  • getEntry:GETentities/{id}/{entryId}
  • deleteEntry:DELETEentities/{id}/{entryId}

词典条目示例

// 创建词典 await plugin.endpoints.dictionaries.create(ctx, { id: 'products', matchType: 'token', caseInsensitive: true, language: 'eng', }); // 添加条目(text 为匹配文本,data 为自定义元数据) await plugin.endpoints.dictionaries.addEntries(ctx, { id: 'products', entries: [ { id: 'e1', text: 'Corsair', data: { type: ['hardware'] } }, { id: 'e2', text: 'TextRazor', data: { type: ['nlp'] } }, ], });

七、自定义分类器:classifiers 端点组

分类器端点映射到 TextRazor 的categories/REST 路径(见 endpoints/classifiers.ts):

  • put:PUTcategories/{id},请求体为类别数组,每项含categoryId(必填)、labelquery(查询表达式,必填)。这是创建或更新分类器(含其全部类别)的原子操作。成功后每个类别会以${classifierId}:${categoryId}为键缓存到ctx.db.categories
  • delete:DELETEcategories/{id},删除分类器及所有类别;
  • listCategories:GETcategories/{id}/_all,支持limit/offset分页;
  • getCategory:GETcategories/{id}/{categoryId}
  • deleteCategory:DELETEcategories/{id}/{categoryId}

分类器示例

await plugin.endpoints.classifiers.put(ctx, { id: 'sentiment', categories: [ { categoryId: 'pos', label: 'Positive', query: 'good OR great OR excellent' }, { categoryId: 'neg', label: 'Negative', query: 'bad OR terrible OR awful' }, ], }); // 配合 classifyText 使用 const res = await plugin.endpoints.analysis.classifyText(ctx, { text: 'This is a great product!', classifiers: ['sentiment'], classifierMaxCategories: 1, });

八、鉴权与错误处理

鉴权

  • 认证方式:API Key。请求头为X-TextRazor-Key(见 client.ts 的buildConfig),API 基地址为https://api.textrazor.comTEXTRAZOR_API_BASE,版本1.0.0);
  • 租户密钥在首次使用端点时由 Corsair 提示录入并持久化,密钥解析由keyBuilder完成;
  • 凭证缺失时抛出AuthMissingError('textrazor', 'api_key')

错误模型

所有请求失败都会统一包装为TextrazorAPIError(client.ts),它继承自Error并携带statusstatusTextbodyretryAfterrateLimitResetrateLimitRemainingrateLimitLimit等字段,其中限流信息来自底层 HTTP 层的ApiError

插件内置了针对 HTTP 状态码的响应文案映射(client.ts):

状态码含义
400Bad Request
401Unauthorized
413Request too large
429Too Many Requests
500Internal Server Error

assertTextrazorOk还会检查响应体中的ok === false字段,一旦出现即抛出带error/messageTextrazorAPIError,用于兜底 TextRazor 部分接口在业务失败时返回 200 +ok: false的协议约定。

重试策略

插件的errorHandlers(error-handlers.ts)将错误分类为六类,并给出默认重试策略:

错误类别匹配条件默认策略
VALIDATION_ERRORZodError不重试
RATE_LIMIT_ERROR429 或消息含rate limit最多重试 3 次,指数退避,并利用Retry-After
AUTH_ERROR401 或消息含unauthorized/invalid api key/used up its quota不重试
NOT_FOUND_ERROR404 或消息含not found不重试
BAD_REQUEST_ERROR400 / 413 或消息含bad request/request too large不重试
SERVER_ERROR5xx最多重试 2 次,指数退避

你可以在创建插件时通过errorHandlers选项覆盖默认策略(index.ts 的mergeErrorHandlers会按类别合并,DEFAULT兜底)。

九、数据库 Schema 与缓存对象

插件定义了五类数据库对象(schema/database.ts),均带fetchedAt时间戳:

表对象关键字段写入时机
TextrazorAccountplan、concurrentRequestLimit、concurrentRequestsUsed、planDailyRequestsIncluded、requestsUsedTodayaccount.get
TextrazorDictionarymatchType、caseInsensitive、languagedictionaries.create
TextrazorDictionaryEntrytext、data、dictionaryId
TextrazorCategorycategoryId、label、query、classifierIdclassifiers.put
TextrazorEntityentityId、matchedText、confidenceScore、relevanceScore、wikiLink、wikidataId三个分析端点

实体、账户、词典、类别的落库均通过upsertByEntityId实现幂等写入,保证重复调用不产生重复记录。

十、端点的校验与调用链路

每个端点都遵循"解析 → 请求 → 校验 → 落库 → 事件日志"的调用链(以analyzeContent为例,见 endpoints/analysis.ts):

  1. AnalyzeContentInputSchema.parse(input):Zod 校验输入,失败抛出ZodError(触发VALIDATION_ERROR处理器);
  2. makeTextrazorRequest发送 POST 请求,携带X-TextRazor-Key与 URL 编码表单;
  3. assertTextrazorOk检查ok === false
  4. AnalyzeContentOutputSchema.parse(raw)校验并归一化输出;
  5. 实体结果写入ctx.db.entities
  6. logEventFromContext记录事件textrazor.analysis.analyzeContentcompleted状态。

HTTP 层由corsair/httprequest提供,表单序列化逻辑(数组转逗号分隔、布尔转true/false、空值跳过)见 client.ts。

十一、验证与测试

插件仓库内置了三套测试,可作为接入正确性的参考:

  • api.test.ts:针对 Schema 与请求构造的单元测试;
  • plugin.test.ts:验证插件注册、端点元数据与风险等级;
  • live.test.ts:真实调用 TextRazor 的在线测试(需有效 API Key)。

运行测试:

pnpm test # 在 packages/textrazor 目录下 pnpm typecheck # TypeScript 类型检查

插件的端点清单与说明文档还以plugin-docs.yaml的形式维护,供 Corsair 生态自动生成文档使用。

十二、版本与许可

  • 当前版本:0.1.1,包名@corsair-dev/textrazor,ESM 模块,产物输出至dist/(见 package.json);
  • 许可协议:Apache-2.0
  • 完整类型定义、端点文档与更多示例可查阅仓库内 插件文档 及 Corsair 官方文档中心(docs.corsair.dev 下的 plugins/textrazor 页面)。

小结

@corsair-dev/textrazor用约 17 个类型安全端点覆盖了 TextRazor 的核心能力:文本分析(实体、主题、分类)、账户用量查询、自定义词典与自定义分类器的全生命周期管理。通过 Corsair 的租户密钥体系、Zod 输入校验、自动结果缓存与内置重试策略,你可以省去手写 HTTP 客户端、鉴权存储与错误处理的成本,快速为你的 Agent 应用接入可靠的 NLP 文本理解能力。接入时只需牢记三点:分析请求必须且仅能提供texturl之一;extractorsclassifiers按端点要求提供;凭证通过api_key方式由 Corsair 统一托管。

【免费下载链接】corsairConnect your users to their apps项目地址: https://gitcode.com/GitHub_Trending/corsa/corsair

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 16:56:12

JavaFX + AWT Robot + JavaCV:桌面录屏录音工具的实现与编码实践

简介&#xff1a;一款基于JavaFX的桌面录屏录音软件完整源码&#xff0c;面向熟悉Java语法、希望进阶桌面应用与多媒体开发的读者&#xff0c;用来解决录屏、录音、暂停、播放和MP4导出的完整流程实现。项目通过Robot类定时抓取屏幕图像&#xff0c;使用Java声音API采集麦克风音…

作者头像 李华
网站建设 2026/9/16 16:55:03

GPOPS-II伪谱法最优控制建模:从setup结构体到Bryson-Denham问题

简介&#xff1a;面向需要求解最优控制问题的MATLAB用户&#xff0c;这份资源提供完整的GPOPS工具箱及配套示例库&#xff0c;覆盖最小爬升、运载火箭上升、高灵敏边界值等多类经典问题&#xff0c;每个案例均包含带详细中文注释的脚本、可运行的Main入口、问题描述txt及求解输…

作者头像 李华
网站建设 2026/9/16 16:51:58

STM32+RFID宿舍门禁系统:从硬件到Android联调全解析

简介&#xff1a;基于STM32单片机与射频识别技术实现的宿舍门禁系统&#xff0c;配套完整的安卓端手机应用源码和毕业设计资料&#xff0c;适合嵌入式、物联网、软件工程等专业学生直接用于毕业设计、课程设计或项目初期演示。整个压缩包共包含五十六个文件&#xff0c;体积仅一…

作者头像 李华
网站建设 2026/9/16 16:50:45

微电网双层优化配置:混合储能系统容量规划方法

1. 项目概述&#xff1a;微电网容量配置的双层优化方法论在可再生能源占比不断提升的能源格局下&#xff0c;微电网作为分布式能源的重要载体&#xff0c;其规划配置的合理性直接影响系统经济性和可靠性。传统单层优化方法往往难以兼顾投资成本、运行约束与动态响应等多重目标&…

作者头像 李华