v0.6-wip: apply_glossary \u5c06\u672f\u8bed\u6838\u67e5\u7ed3\u679c\u56de\u5857\u5230\u6b63\u6587

scripts/apply_glossary.py\uff08\u65b0\u589e\uff09\uff1a
- \u4ece glossary \u7684 issue \u5b57\u6bb5\u6293\u53d6\u201c\u539f\u672c\u9519\u8bef / \u6b63\u786e\u5199\u6cd5\u201d\u5bf9\uff0c\u76f4\u63a5\u5728 Markdown \u6b63\u6587\u4e2d\u505a\u5b57\u9762\u66ff\u6362
- \u4fdd\u5b88\u7b56\u7565\uff1a
  * \u82f1\u6587\u62fc\u5199\u9519\u8bef\uff08high conf\uff09\u76f4\u63a5\u6539
  * \u4e2d\u6587\u8bd1\u540d\u9519\u8bef\u4ec5\u5bf9\u201c\u4e13\u6709\u540d\u8bcd\u201d\uff08\u516c\u53f8/\u673a\u6784/\u4ea7\u54c1\uff09\u6539
  * \u901a\u7528\u7f29\u5199\uff08PDE/ASGPR/LNP \u7b49\uff09\u6709\u9ed1\u540d\u5355\u62e6\u622a\uff0c\u907f\u514d\u4e0a\u4e0b\u6587\u6b67\u4e49
- dry-run \u6a21\u5f0f\u9884\u89c8
- \u5e42\u7b49

\u5728\u53cc\u9776\u70b9 RNAi \u9879\u76ee\u7684\u6210\u679c\uff1a
- build_glossary \u6210\u529f\u6838\u67e5 201/310 \u672f\u8bed\uff0c\u53d1\u73b0\u4e09\u6761\u4e25\u91cd\u9519\u8bef\uff1a
  * Maywavee \u2192 Mabwell\uff08\u8fc8\u5a01\u751f\u7269\uff09- \u82f1\u6587\u62fc\u5199\u9519\u8bef
  * Beyotime \u2192 '\u7891\u4e91\u5929' \u4e3a\u9519\u8bef\u8bd1\u540d\uff0c\u5e94\u4e3a '\u5fc5\u8d1d\u7279\u533b\u836f'
  * Aurigene \u2192 '\u5929\u6d25\u5965\u5229\u6cd5' \u5e94\u4e3a '\u5929\u6d25\u5965\u745e\u82bc\u751f\u7269\u533b\u836f\u6709\u9650\u516c\u53f8'
- apply_glossary \u5e72\u51c0\u4fee\u6b63 3 \u5904\uff0c\u6b63\u5728\u518d\u6b21\u751f\u6210 PDF + DOCX
- \u6210\u672c\uff1a0.1 \u7f8e\u5143\uff08Haiku + Exa\uff09

\u5df2\u77e5\u9650\u5236\uff1a
- Exa/\u4ee3\u7406\u7ec4\u5408\u5728 >6 \u5e76\u53d1\u4e0b\u4f1a\u51fa\u73b0 SSL EOF \u9519\u8bef\uff0c\u5931\u8d25 106 \u6761\u3002\u53ef\u91cd\u8dd1\u6216\u964d\u5230 3 workers\u3002
- \u672a\u6765\u53ef\u5c06 build_glossary \u524d\u79fb\u5230 Phase 2 \u65f6\u8fd0\u884c\uff0c\u6b63\u6587\u751f\u6210\u524d\u5c31\u62e6\u4f4f\u4fe1\u6e90\u4fa7\u9519\u8bef

Co-authored-by: User <human>
This commit is contained in:
kai
2026-04-22 13:22:00 +08:00
co-authored by User <human>
parent d3fde1cbb8
commit 7f1bcc69da
4 changed files with 2371 additions and 100 deletions
@@ -285,7 +285,7 @@ Silence TherapeuticsSLN360、SLN124)及Dicerna/诺和诺德旗下项目均
| 阿尔尼拉姆 | GEMINI™ | 单体偶联双siRNA | 固相合成 + 偶联 | 34 | IND申报准备阶段 | | 阿尔尼拉姆 | GEMINI™ | 单体偶联双siRNA | 固相合成 + 偶联 | 34 | IND申报准备阶段 |
| Sirnaomics | GalAhead™ muRNA | 不稳定连接子双功能双链体 | 四链固相合成 + GalNAc | 23 | 临床前 | | Sirnaomics | GalAhead™ muRNA | 不稳定连接子双功能双链体 | 四链固相合成 + GalNAc | 23 | 临床前 |
| 必贝特 BeBetter Med | GDOC | 共价分支连接子(两条siRNA → 一个GalNAc) | 固相合成 + 汇聚连接子 | 3–4 | Phase 1/2(国家药品监督管理局) | | 必贝特 BeBetter Med | GDOC | 共价分支连接子(两条siRNA → 一个GalNAc) | 固相合成 + 汇聚连接子 | 3–4 | Phase 1/2(国家药品监督管理局) |
| 迈威生物 Maywavee | AI平台 | 未披露共价偶联物 | AI加速固相合成 | 未披露 | 临床前 | | 迈威生物 Mabwell | AI平台 | 未披露共价偶联物 | AI加速固相合成 | 未披露 | 临床前 |
| 瑞博生物 Ribo | RiboGalSTAR™ | 单靶点临床;双靶点研发 | 固相合成 + RSC 2.0修饰 | 3 | Ph 2(单靶点);双靶点临床前 | | 瑞博生物 Ribo | RiboGalSTAR™ | 单靶点临床;双靶点研发 | 固相合成 + RSC 2.0修饰 | 3 | Ph 2(单靶点);双靶点临床前 |
| 舶望制药 Argo | RADS™ | 单靶点(BW-00163 AGTBW-40202 CFB | RADS优化固相合成 | 3 | Phase 2(两项均为单靶点) | | 舶望制药 Argo | RADS™ | 单靶点(BW-00163 AGTBW-40202 CFB | RADS优化固相合成 | 3 | Phase 2(两项均为单靶点) |
@@ -565,7 +565,7 @@ GMP级核酸活性酶的规格要求(参照NEB公开标准)涵盖:SDS-PAGE
翌圣生物科技(Yeasen Biotech,上海)是国内首家获得ISO 13485分子酶制造认证的企业,旗下多款产品持有FDA DMF备案号,并运营一座面积达50,000平方英尺的GMP工厂(mRNAtools),年产能超过50亿单位 [src_H05]。其GMP产品线涵盖T7 RNA聚合酶、DNase I(货号10611)、RNase Inhibitor及无机焦磷酸酶,构成mRNA疫苗的核心酶工具包。诺唯赞(Vazyme,南京,上交所688105)提供同类以mRNA为核心的GMP产品线,包括无RNase级DNase I及鼠源RNase Inhibitor GMP级产品 [src_H06]。 翌圣生物科技(Yeasen Biotech,上海)是国内首家获得ISO 13485分子酶制造认证的企业,旗下多款产品持有FDA DMF备案号,并运营一座面积达50,000平方英尺的GMP工厂(mRNAtools),年产能超过50亿单位 [src_H05]。其GMP产品线涵盖T7 RNA聚合酶、DNase I(货号10611)、RNase Inhibitor及无机焦磷酸酶,构成mRNA疫苗的核心酶工具包。诺唯赞(Vazyme,南京,上交所688105)提供同类以mRNA为核心的GMP产品线,包括无RNase级DNase I及鼠源RNase Inhibitor GMP级产品 [src_H06]。
然而,翌圣与诺唯赞均未在现有目录中列出适用于寡核苷酸检测的GMP级核酸酶P1、核糖核酸酶T1(RNase T1)、蛇毒磷酸二酯酶(SVPD)或多核苷酸激酶(T4 PNK[src_H05, src_H06]。生工(Sangon Biotech)和碧云天Beyotime)销售研究级RNase T1和核酸酶P1,但均未发布符合GMP要求的质量证书,宿主细胞蛋白(<100 ppm)、内毒素及DNase/RNase交叉污染等关键指标亦无规格说明〔未经核实:基于2026年4月公开目录查阅〕。 然而,翌圣与诺唯赞均未在现有目录中列出适用于寡核苷酸检测的GMP级核酸酶P1、核糖核酸酶T1(RNase T1)、蛇毒磷酸二酯酶(SVPD)或多核苷酸激酶(T4 PNK[src_H05, src_H06]。生工(Sangon Biotech)和必贝特医药Beyotime)销售研究级RNase T1和核酸酶P1,但均未发布符合GMP要求的质量证书,宿主细胞蛋白(<100 ppm)、内毒素及DNase/RNase交叉污染等关键指标亦无规格说明〔未经核实:基于2026年4月公开目录查阅〕。
制约因素并非技术能力,而是经济驱动力不足与规格要求严苛。进入寡核苷酸质控酶GMP市场所需的固定投入与mRNA酶相当——包括设施认证、细胞库表征及经验证的分析方法——但年消耗量市场规模却小了两个数量级。寡核苷酸质控应用还叠加两项硬性约束:(a)DNase/RNase交叉污染须低于0.01%,因为RNA分析物本身即为底物;(b)宿主细胞蛋白须低于100 ppm,否则来自*大肠杆菌*或*米曲霉*表达系统的宿主细胞核酸酶将非特异性降解RNA分析物。 制约因素并非技术能力,而是经济驱动力不足与规格要求严苛。进入寡核苷酸质控酶GMP市场所需的固定投入与mRNA酶相当——包括设施认证、细胞库表征及经验证的分析方法——但年消耗量市场规模却小了两个数量级。寡核苷酸质控应用还叠加两项硬性约束:(a)DNase/RNase交叉污染须低于0.01%,因为RNA分析物本身即为底物;(b)宿主细胞蛋白须低于100 ppm,否则来自*大肠杆菌*或*米曲霉*表达系统的宿主细胞核酸酶将非特异性降解RNA分析物。
@@ -597,7 +597,7 @@ GMP级核酸活性酶的规格要求(参照NEB公开标准)涵盖:SDS-PAGE
全球三大供应商——Ajinomoto OmniChem、ChemGenes和兆维(上海奉贤)——共同掌控着GMP认证亚磷酰胺产能的大部分份额。兆维在奉贤建有48条生产线,具备公斤级批次产能,并通过国家药品监督管理局、FDA及EMA认证,标准2'-OMe单体HPLC纯度报告值≥98%,全品类亚磷酰胺年总产能为58公吨 [src_D09]。亚磷酰胺市场整体规模估计在2024年为8亿美元,预计以10.6%的复合年增长率增长至2035年的27亿美元,siRNA寡核苷酸约占当前需求的45% [src_D15]。亚太地区需求预计以15.2%的复合年增长率增长至2035年,增速居全球各地区之首 [src_I01]。 全球三大供应商——Ajinomoto OmniChem、ChemGenes和兆维(上海奉贤)——共同掌控着GMP认证亚磷酰胺产能的大部分份额。兆维在奉贤建有48条生产线,具备公斤级批次产能,并通过国家药品监督管理局、FDA及EMA认证,标准2'-OMe单体HPLC纯度报告值≥98%,全品类亚磷酰胺年总产能为58公吨 [src_D09]。亚磷酰胺市场整体规模估计在2024年为8亿美元,预计以10.6%的复合年增长率增长至2035年的27亿美元,siRNA寡核苷酸约占当前需求的45% [src_D15]。亚太地区需求预计以15.2%的复合年增长率增长至2035年,增速居全球各地区之首 [src_I01]。
国产替代缺口并不均匀。2'-OMe和2'-F单体方面,兆维及国内次级供应商(芜湖华仁、天津奥利法)在研究和中试规模上已可实现纯度对标。缺口更大的是化学专有性更强的单体品类。GalNAc-亚磷酰胺合成需要经过验证的三天线簇合成路线,且每步汇聚式偶联收率须>90% [src_C07];锁核酸亚磷酰胺仍受Qiagen专利保护——目前尚无中国厂商在FDA或EMA公开披露锁核酸亚磷酰胺的DMF备案。每类修饰单体的最低可行GMP规模为≥10 kg/年;兆维在2'-OMe和2'-F方面已达到这一门槛。中国境内cGMP质量的GalNAc-亚磷酰胺仍处于商业化前阶段:合成化学已有验证,汇聚式三天线簇合成路线在技术上已通过确认 [src_D02],但氨解保护基脱除稳定性验证(55°C × 16h)、cGMP文件深度以及IND申报所需的批间质量证书(CoA)特异性等要求,将商业可行的供应商范围限定为兆维以及ChemGenes、Ajinomoto OmniChem等西方原有厂商。 国产替代缺口并不均匀。2'-OMe和2'-F单体方面,兆维及国内次级供应商(芜湖华仁、天津奥瑞芙生物医药有限公司)在研究和中试规模上已可实现纯度对标。缺口更大的是化学专有性更强的单体品类。GalNAc-亚磷酰胺合成需要经过验证的三天线簇合成路线,且每步汇聚式偶联收率须>90% [src_C07];锁核酸亚磷酰胺仍受Qiagen专利保护——目前尚无中国厂商在FDA或EMA公开披露锁核酸亚磷酰胺的DMF备案。每类修饰单体的最低可行GMP规模为≥10 kg/年;兆维在2'-OMe和2'-F方面已达到这一门槛。中国境内cGMP质量的GalNAc-亚磷酰胺仍处于商业化前阶段:合成化学已有验证,汇聚式三天线簇合成路线在技术上已通过确认 [src_D02],但氨解保护基脱除稳定性验证(55°C × 16h)、cGMP文件深度以及IND申报所需的批间质量证书(CoA)特异性等要求,将商业可行的供应商范围限定为兆维以及ChemGenes、Ajinomoto OmniChem等西方原有厂商。
--- ---
File diff suppressed because it is too large Load Diff
@@ -1,3 +1,205 @@
{"tag": "glossary:phosphoramidite monomer", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.81, "usage": {"completion_tokens": 48, "prompt_tokens": 2187, "total_tokens": 2235, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200} {"tag": "glossary:phosphoramidite monomer", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.81, "usage": {"completion_tokens": 48, "prompt_tokens": 2187, "total_tokens": 2235, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200}
{"tag": "glossary:RNA interference", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.82, "usage": {"completion_tokens": 37, "prompt_tokens": 2585, "total_tokens": 2622, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 93, "status": 200} {"tag": "glossary:RNA interference", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.82, "usage": {"completion_tokens": 37, "prompt_tokens": 2585, "total_tokens": 2622, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 93, "status": 200}
{"tag": "glossary:Maywavee", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.71, "usage": {"completion_tokens": 136, "prompt_tokens": 3185, "total_tokens": 3321, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 186, "status": 200} {"tag": "glossary:Maywavee", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.71, "usage": {"completion_tokens": 136, "prompt_tokens": 3185, "total_tokens": 3321, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 186, "status": 200}
{"tag": "glossary:32P-end-labeling", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.8, "usage": {"completion_tokens": 44, "prompt_tokens": 3469, "total_tokens": 3513, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 95, "status": 200}
{"tag": "glossary:2'-acetal levulinic ester (ALE", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.93, "usage": {"completion_tokens": 78, "prompt_tokens": 2264, "total_tokens": 2342, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 138, "status": 200}
{"tag": "glossary:2'-OMe-UTP", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.78, "usage": {"completion_tokens": 54, "prompt_tokens": 2765, "total_tokens": 2819, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 117, "status": 200}
{"tag": "glossary:AGT", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.09, "usage": {"completion_tokens": 92, "prompt_tokens": 3207, "total_tokens": 3299, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 156, "status": 200}
{"tag": "glossary:2'-F-UTP", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.72, "usage": {"completion_tokens": 163, "prompt_tokens": 2526, "total_tokens": 2689, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 222, "status": 200}
{"tag": "glossary:500 Å pore", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.22, "usage": {"completion_tokens": 152, "prompt_tokens": 2796, "total_tokens": 2948, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 217, "status": 200}
{"tag": "glossary:2'-OMe-ATP", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.19, "usage": {"completion_tokens": 196, "prompt_tokens": 3010, "total_tokens": 3206, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 274, "status": 200}
{"tag": "glossary:2'-F-CTP", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.65, "usage": {"completion_tokens": 129, "prompt_tokens": 3062, "total_tokens": 3191, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 184, "status": 200}
{"tag": "glossary:API sameness", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.03, "usage": {"completion_tokens": 39, "prompt_tokens": 2501, "total_tokens": 2540, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 90, "status": 200}
{"tag": "glossary:AJIPHASE®", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.58, "usage": {"completion_tokens": 42, "prompt_tokens": 2886, "total_tokens": 2928, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 85, "status": 200}
{"tag": "glossary:ANGPTL3", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.47, "usage": {"completion_tokens": 52, "prompt_tokens": 2854, "total_tokens": 2906, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 100, "status": 200}
{"tag": "glossary:AOF formulation", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.84, "usage": {"completion_tokens": 133, "prompt_tokens": 2664, "total_tokens": 2797, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 213, "status": 200}
{"tag": "glossary:APOC3", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.94, "usage": {"completion_tokens": 50, "prompt_tokens": 3078, "total_tokens": 3128, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200}
{"tag": "glossary:ASGPR", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.52, "usage": {"completion_tokens": 55, "prompt_tokens": 3073, "total_tokens": 3128, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 108, "status": 200}
{"tag": "glossary:ASCVD", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.5, "usage": {"completion_tokens": 56, "prompt_tokens": 3260, "total_tokens": 3316, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 122, "status": 200}
{"tag": "glossary:ASMF", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.48, "usage": {"completion_tokens": 170, "prompt_tokens": 3466, "total_tokens": 3636, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 266, "status": 200}
{"tag": "glossary:Ajinomoto Bio-Pharma Services", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.66, "usage": {"completion_tokens": 53, "prompt_tokens": 2534, "total_tokens": 2587, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 116, "status": 200}
{"tag": "glossary:Amide linker", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.24, "usage": {"completion_tokens": 42, "prompt_tokens": 3166, "total_tokens": 3208, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 88, "status": 200}
{"tag": "glossary:Ajinomoto OmniChem", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.47, "usage": {"completion_tokens": 174, "prompt_tokens": 2355, "total_tokens": 2529, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 261, "status": 200}
{"tag": "glossary:Antibody-Drug Conjugate", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.3, "usage": {"completion_tokens": 47, "prompt_tokens": 3225, "total_tokens": 3272, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200}
{"tag": "glossary:Angiotensinogen", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.37, "usage": {"completion_tokens": 44, "prompt_tokens": 2911, "total_tokens": 2955, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 93, "status": 200}
{"tag": "glossary:Adaptive Laboratory Evolution", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.82, "usage": {"completion_tokens": 184, "prompt_tokens": 2543, "total_tokens": 2727, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 286, "status": 200}
{"tag": "glossary:BIOSECURE Act", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 44, "prompt_tokens": 2381, "total_tokens": 2425, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 93, "status": 200}
{"tag": "glossary:BD value", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.48, "usage": {"completion_tokens": 149, "prompt_tokens": 3125, "total_tokens": 3274, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 229, "status": 200}
{"tag": "glossary:Biologics License Application", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.27, "usage": {"completion_tokens": 46, "prompt_tokens": 2629, "total_tokens": 2675, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 111, "status": 200}
{"tag": "glossary:BeBetter Med", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.2, "usage": {"completion_tokens": 144, "prompt_tokens": 2387, "total_tokens": 2531, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 205, "status": 200}
{"tag": "glossary:Beyotime", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.49, "usage": {"completion_tokens": 132, "prompt_tokens": 3434, "total_tokens": 3566, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 204, "status": 200}
{"tag": "glossary:Biomaide", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.13, "usage": {"completion_tokens": 159, "prompt_tokens": 2963, "total_tokens": 3122, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 223, "status": 200}
{"tag": "glossary:Bachem", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.86, "usage": {"completion_tokens": 175, "prompt_tokens": 2078, "total_tokens": 2253, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 234, "status": 200}
{"tag": "glossary:BTT activation", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 5.38, "usage": {"completion_tokens": 198, "prompt_tokens": 3106, "total_tokens": 3304, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 285, "status": 200}
{"tag": "glossary:BirA/AviTag", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.72, "usage": {"completion_tokens": 151, "prompt_tokens": 2663, "total_tokens": 2814, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 219, "status": 200}
{"tag": "glossary:Bis-RNAi", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.45, "usage": {"completion_tokens": 222, "prompt_tokens": 3019, "total_tokens": 3241, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 290, "status": 200}
{"tag": "glossary:C5", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.62, "usage": {"completion_tokens": 40, "prompt_tokens": 3215, "total_tokens": 3255, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 99, "status": 200}
{"tag": "glossary:CDMO", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.35, "usage": {"completion_tokens": 45, "prompt_tokens": 2946, "total_tokens": 2991, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 132, "status": 200}
{"tag": "glossary:CDE", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.73, "usage": {"completion_tokens": 45, "prompt_tokens": 3192, "total_tokens": 3237, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 110, "status": 200}
{"tag": "glossary:CLEA-LentiKats lipase formulat", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.17, "usage": {"completion_tokens": 147, "prompt_tokens": 2231, "total_tokens": 2378, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 278, "status": 200}
{"tag": "glossary:CID fragmentation", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.07, "usage": {"completion_tokens": 168, "prompt_tokens": 2913, "total_tokens": 3081, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 258, "status": 200}
{"tag": "glossary:CTA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.63, "usage": {"completion_tokens": 40, "prompt_tokens": 2273, "total_tokens": 2313, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 104, "status": 200}
{"tag": "glossary:Candida antarctica lipase B", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.25, "usage": {"completion_tokens": 54, "prompt_tokens": 2494, "total_tokens": 2548, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 109, "status": 200}
{"tag": "glossary:CPG support", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.61, "usage": {"completion_tokens": 253, "prompt_tokens": 2816, "total_tokens": 3069, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 314, "status": 200}
{"tag": "glossary:Calf Intestinal Alkaline Phosp", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.37, "usage": {"completion_tokens": 140, "prompt_tokens": 2664, "total_tokens": 2804, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 192, "status": 200}
{"tag": "glossary:CMC development timeline", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 5.57, "usage": {"completion_tokens": 45, "prompt_tokens": 3144, "total_tokens": 3189, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 138, "status": 200}
{"tag": "glossary:Calantha™", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.38, "usage": {"completion_tokens": 172, "prompt_tokens": 3173, "total_tokens": 3345, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 248, "status": 200}
{"tag": "glossary:Category I", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.35, "usage": {"completion_tokens": 150, "prompt_tokens": 3354, "total_tokens": 3504, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 212, "status": 200}
{"tag": "glossary:Category III", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.62, "usage": {"completion_tokens": 185, "prompt_tokens": 2400, "total_tokens": 2585, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 263, "status": 200}
{"tag": "glossary:Category II", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.84, "usage": {"completion_tokens": 182, "prompt_tokens": 3286, "total_tokens": 3468, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 253, "status": 200}
{"tag": "glossary:ChemGenes", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.76, "usage": {"completion_tokens": 99, "prompt_tokens": 2457, "total_tokens": 2556, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 161, "status": 200}
{"tag": "glossary:Chinese IND", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.06, "usage": {"completion_tokens": 41, "prompt_tokens": 2726, "total_tokens": 2767, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 107, "status": 200}
{"tag": "glossary:Category IV", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.58, "usage": {"completion_tokens": 166, "prompt_tokens": 3298, "total_tokens": 3464, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 237, "status": 200}
{"tag": "glossary:Complement Factor B", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.02, "usage": {"completion_tokens": 40, "prompt_tokens": 2967, "total_tokens": 3007, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:Complete Response Letter", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 1.98, "usage": {"completion_tokens": 39, "prompt_tokens": 2541, "total_tokens": 2580, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200}
{"tag": "glossary:Class 3", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.79, "usage": {"completion_tokens": 175, "prompt_tokens": 2755, "total_tokens": 2930, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 226, "status": 200}
{"tag": "glossary:Controlled pore glass", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.23, "usage": {"completion_tokens": 46, "prompt_tokens": 2280, "total_tokens": 2326, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 99, "status": 200}
{"tag": "glossary:CuAAC", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.47, "usage": {"completion_tokens": 66, "prompt_tokens": 2924, "total_tokens": 2990, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 126, "status": 200}
{"tag": "glossary:D-galactosamine", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.47, "usage": {"completion_tokens": 46, "prompt_tokens": 2575, "total_tokens": 2621, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 93, "status": 200}
{"tag": "glossary:Cross-Linked Enzyme Aggregates", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.57, "usage": {"completion_tokens": 148, "prompt_tokens": 3243, "total_tokens": 3391, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 233, "status": 200}
{"tag": "glossary:DBCO", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 48, "prompt_tokens": 2924, "total_tokens": 2972, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:DMT-on HPLC purification handl", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.06, "usage": {"completion_tokens": 129, "prompt_tokens": 2601, "total_tokens": 2730, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 194, "status": 200}
{"tag": "glossary:DNase I", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.17, "usage": {"completion_tokens": 44, "prompt_tokens": 2631, "total_tokens": 2675, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 98, "status": 200}
{"tag": "glossary:DMF", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.76, "usage": {"completion_tokens": 172, "prompt_tokens": 3084, "total_tokens": 3256, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 237, "status": 200}
{"tag": "glossary:Deep Eutectic Solvent", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 47, "prompt_tokens": 2267, "total_tokens": 2314, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 98, "status": 200}
{"tag": "glossary:Dibenzocyclooctyne", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 48, "prompt_tokens": 2641, "total_tokens": 2689, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:Dual-Target RNAi Drug", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.23, "usage": {"completion_tokens": 50, "prompt_tokens": 2679, "total_tokens": 2729, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 102, "status": 200}
{"tag": "glossary:ECO Synthesis platform", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.06, "usage": {"completion_tokens": 43, "prompt_tokens": 2011, "total_tokens": 2054, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 123, "status": 200}
{"tag": "glossary:FDA/CDER", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.17, "usage": {"completion_tokens": 44, "prompt_tokens": 3243, "total_tokens": 3287, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 123, "status": 200}
{"tag": "glossary:ECO GMP Manufacturing Center", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.2, "usage": {"completion_tokens": 135, "prompt_tokens": 2807, "total_tokens": 2942, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 228, "status": 200}
{"tag": "glossary:Factor XI", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.12, "usage": {"completion_tokens": 43, "prompt_tokens": 2407, "total_tokens": 2450, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 99, "status": 200}
{"tag": "glossary:Fall Line Endurance Fund", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.92, "usage": {"completion_tokens": 120, "prompt_tokens": 2454, "total_tokens": 2574, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 210, "status": 200}
{"tag": "glossary:ECO ligase", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.93, "usage": {"completion_tokens": 162, "prompt_tokens": 2297, "total_tokens": 2459, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 227, "status": 200}
{"tag": "glossary:G5 GalNAc support", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.13, "usage": {"completion_tokens": 162, "prompt_tokens": 2638, "total_tokens": 2800, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 245, "status": 200}
{"tag": "glossary:Full-Length Product", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.74, "usage": {"completion_tokens": 153, "prompt_tokens": 2945, "total_tokens": 3098, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 232, "status": 200}
{"tag": "glossary:G5 ribofuranose", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.89, "usage": {"completion_tokens": 195, "prompt_tokens": 2299, "total_tokens": 2494, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 264, "status": 200}
{"tag": "glossary:GDOC", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.21, "usage": {"completion_tokens": 180, "prompt_tokens": 3180, "total_tokens": 3360, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 245, "status": 200}
{"tag": "glossary:GDOC platform", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.93, "usage": {"completion_tokens": 188, "prompt_tokens": 2822, "total_tokens": 3010, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 287, "status": 200}
{"tag": "glossary:GEMINI™", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.79, "usage": {"completion_tokens": 175, "prompt_tokens": 2921, "total_tokens": 3096, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 244, "status": 200}
{"tag": "glossary:GMP-grade QC enzyme panel", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.58, "usage": {"completion_tokens": 156, "prompt_tokens": 2634, "total_tokens": 2790, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 248, "status": 200}
{"tag": "glossary:GalAhead", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.17, "usage": {"completion_tokens": 152, "prompt_tokens": 2781, "total_tokens": 2933, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 225, "status": 200}
{"tag": "glossary:GalNAc-siRNA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.45, "usage": {"completion_tokens": 203, "prompt_tokens": 3133, "total_tokens": 3336, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 293, "status": 200}
{"tag": "glossary:GalNAc-PA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.74, "usage": {"completion_tokens": 232, "prompt_tokens": 3311, "total_tokens": 3543, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 326, "status": 200}
{"tag": "glossary:GnTI", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.2, "usage": {"completion_tokens": 172, "prompt_tokens": 2136, "total_tokens": 2308, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 222, "status": 200}
{"tag": "glossary:GT-multi-siRNA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.56, "usage": {"completion_tokens": 181, "prompt_tokens": 2606, "total_tokens": 2787, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 269, "status": 200}
{"tag": "glossary:GalT", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.55, "usage": {"completion_tokens": 220, "prompt_tokens": 2940, "total_tokens": 3160, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 267, "status": 200}
{"tag": "glossary:GreenLight Biosciences", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.54, "usage": {"completion_tokens": 160, "prompt_tokens": 2567, "total_tokens": 2727, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 248, "status": 200}
{"tag": "glossary:H1 subunit", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.43, "usage": {"completion_tokens": 190, "prompt_tokens": 2459, "total_tokens": 2649, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 258, "status": 200}
{"tag": "glossary:Host-Cell Protein", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 46, "prompt_tokens": 3183, "total_tokens": 3229, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:H2 subunit", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.2, "usage": {"completion_tokens": 147, "prompt_tokens": 2663, "total_tokens": 2810, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 211, "status": 200}
{"tag": "glossary:Huntingtin", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.0, "usage": {"completion_tokens": 45, "prompt_tokens": 2536, "total_tokens": 2581, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 87, "status": 200}
{"tag": "glossary:Hongene", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.99, "usage": {"completion_tokens": 77, "prompt_tokens": 2437, "total_tokens": 2514, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 143, "status": 200}
{"tag": "glossary:ICH Q11 Q&A", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.72, "usage": {"completion_tokens": 68, "prompt_tokens": 2775, "total_tokens": 2843, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 202, "status": 200}
{"tag": "glossary:Hydroxyprolinol scaffold", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.56, "usage": {"completion_tokens": 164, "prompt_tokens": 2554, "total_tokens": 2718, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 216, "status": 200}
{"tag": "glossary:ICH Q13", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.45, "usage": {"completion_tokens": 56, "prompt_tokens": 3086, "total_tokens": 3142, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 163, "status": 200}
{"tag": "glossary:ICH Q3D(R2)", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.73, "usage": {"completion_tokens": 70, "prompt_tokens": 2800, "total_tokens": 2870, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 139, "status": 200}
{"tag": "glossary:ICH Q2(R1)", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.44, "usage": {"completion_tokens": 150, "prompt_tokens": 2779, "total_tokens": 2929, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 226, "status": 200}
{"tag": "glossary:IVT", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.33, "usage": {"completion_tokens": 42, "prompt_tokens": 2608, "total_tokens": 2650, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 98, "status": 200}
{"tag": "glossary:ICP-MS", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.74, "usage": {"completion_tokens": 196, "prompt_tokens": 3184, "total_tokens": 3380, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 272, "status": 200}
{"tag": "glossary:IND-to-dosing gap", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.06, "usage": {"completion_tokens": 185, "prompt_tokens": 2717, "total_tokens": 2902, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 258, "status": 200}
{"tag": "glossary:Just Climate", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.14, "usage": {"completion_tokens": 152, "prompt_tokens": 2348, "total_tokens": 2500, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 235, "status": 200}
{"tag": "glossary:Kd", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.7, "usage": {"completion_tokens": 141, "prompt_tokens": 2644, "total_tokens": 2785, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 215, "status": 200}
{"tag": "glossary:Kinovate Life Sciences", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.93, "usage": {"completion_tokens": 134, "prompt_tokens": 2425, "total_tokens": 2559, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 207, "status": 200}
{"tag": "glossary:LDL-C", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.67, "usage": {"completion_tokens": 57, "prompt_tokens": 3226, "total_tokens": 3283, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 116, "status": 200}
{"tag": "glossary:Leloir glycosyltransferases", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.0, "usage": {"completion_tokens": 51, "prompt_tokens": 2207, "total_tokens": 2258, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 106, "status": 200}
{"tag": "glossary:LGC Biosearch Technologies", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.93, "usage": {"completion_tokens": 127, "prompt_tokens": 2275, "total_tokens": 2402, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 211, "status": 200}
{"tag": "glossary:L96 ligand", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.67, "usage": {"completion_tokens": 179, "prompt_tokens": 2626, "total_tokens": 2805, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 236, "status": 200}
{"tag": "glossary:Lp(a)", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.08, "usage": {"completion_tokens": 45, "prompt_tokens": 3096, "total_tokens": 3141, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 92, "status": 200}
{"tag": "glossary:Locked Nucleic Acid", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.66, "usage": {"completion_tokens": 101, "prompt_tokens": 3301, "total_tokens": 3402, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 161, "status": 200}
{"tag": "glossary:MutS Homolog 3", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.21, "usage": {"completion_tokens": 46, "prompt_tokens": 2602, "total_tokens": 2648, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 94, "status": 200}
{"tag": "glossary:N-acetylgalactosamine", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.15, "usage": {"completion_tokens": 53, "prompt_tokens": 2414, "total_tokens": 2467, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200}
{"tag": "glossary:NDA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.03, "usage": {"completion_tokens": 38, "prompt_tokens": 3298, "total_tokens": 3336, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:ManII", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.81, "usage": {"completion_tokens": 214, "prompt_tokens": 3074, "total_tokens": 3288, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 267, "status": 200}
{"tag": "glossary:NMPA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.35, "usage": {"completion_tokens": 44, "prompt_tokens": 2989, "total_tokens": 3033, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 121, "status": 200}
{"tag": "glossary:NAG37", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.64, "usage": {"completion_tokens": 131, "prompt_tokens": 2578, "total_tokens": 2709, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 171, "status": 200}
{"tag": "glossary:NittoPhase HL", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.15, "usage": {"completion_tokens": 170, "prompt_tokens": 2206, "total_tokens": 2376, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 238, "status": 200}
{"tag": "glossary:Nitto Denko Avecia", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.76, "usage": {"completion_tokens": 213, "prompt_tokens": 2451, "total_tokens": 2664, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 325, "status": 200}
{"tag": "glossary:Nucleoside Triphosphate", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.27, "usage": {"completion_tokens": 48, "prompt_tokens": 3233, "total_tokens": 3281, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 100, "status": 200}
{"tag": "glossary:Norroa", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.89, "usage": {"completion_tokens": 135, "prompt_tokens": 2700, "total_tokens": 2835, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 185, "status": 200}
{"tag": "glossary:Notice No. 21 of 2026", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.44, "usage": {"completion_tokens": 166, "prompt_tokens": 3073, "total_tokens": 3239, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 222, "status": 200}
{"tag": "glossary:Nuclease P1", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.92, "usage": {"completion_tokens": 148, "prompt_tokens": 2820, "total_tokens": 2968, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 200, "status": 200}
{"tag": "glossary:OPR&D", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.61, "usage": {"completion_tokens": 147, "prompt_tokens": 2996, "total_tokens": 3143, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 227, "status": 200}
{"tag": "glossary:PCSK9", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.08, "usage": {"completion_tokens": 169, "prompt_tokens": 2710, "total_tokens": 2879, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 228, "status": 200}
{"tag": "glossary:PDE", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.18, "usage": {"completion_tokens": 135, "prompt_tokens": 2739, "total_tokens": 2874, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 196, "status": 200}
{"tag": "glossary:Phosphodiester linker", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.05, "usage": {"completion_tokens": 47, "prompt_tokens": 2737, "total_tokens": 2784, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 99, "status": 200}
{"tag": "glossary:PVA entrapment", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.63, "usage": {"completion_tokens": 51, "prompt_tokens": 2065, "total_tokens": 2116, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 111, "status": 200}
{"tag": "glossary:Polynucleotide Kinase (T4)", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.8, "usage": {"completion_tokens": 130, "prompt_tokens": 2615, "total_tokens": 2745, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 179, "status": 200}
{"tag": "glossary:PMO synthesis", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.73, "usage": {"completion_tokens": 156, "prompt_tokens": 2532, "total_tokens": 2688, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 204, "status": 200}
{"tag": "glossary:Poresyn Solutions", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.45, "usage": {"completion_tokens": 174, "prompt_tokens": 1910, "total_tokens": 2084, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 235, "status": 200}
{"tag": "glossary:Process Analytical Technology", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.34, "usage": {"completion_tokens": 41, "prompt_tokens": 2994, "total_tokens": 3035, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 107, "status": 200}
{"tag": "glossary:Prime Synthesis CPG", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.92, "usage": {"completion_tokens": 213, "prompt_tokens": 2297, "total_tokens": 2510, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 312, "status": 200}
{"tag": "glossary:PrimeMax siRNA CPG", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.72, "usage": {"completion_tokens": 147, "prompt_tokens": 2177, "total_tokens": 2324, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 239, "status": 200}
{"tag": "glossary:Process Atlas", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.95, "usage": {"completion_tokens": 139, "prompt_tokens": 3387, "total_tokens": 3526, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 213, "status": 200}
{"tag": "glossary:Process Mass Intensity", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.48, "usage": {"completion_tokens": 121, "prompt_tokens": 3485, "total_tokens": 3606, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 202, "status": 200}
{"tag": "glossary:Q6M", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.23, "usage": {"completion_tokens": 174, "prompt_tokens": 3086, "total_tokens": 3260, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 224, "status": 200}
{"tag": "glossary:RNA-Induced Silencing Complex", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.3, "usage": {"completion_tokens": 48, "prompt_tokens": 2752, "total_tokens": 2800, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 107, "status": 200}
{"tag": "glossary:QC biocatalyst", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.31, "usage": {"completion_tokens": 167, "prompt_tokens": 3307, "total_tokens": 3474, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 234, "status": 200}
{"tag": "glossary:RADS™", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.43, "usage": {"completion_tokens": 48, "prompt_tokens": 2702, "total_tokens": 2750, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 138, "status": 200}
{"tag": "glossary:RNase A", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.5, "usage": {"completion_tokens": 47, "prompt_tokens": 2363, "total_tokens": 2410, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 92, "status": 200}
{"tag": "glossary:Q3M", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 5.18, "usage": {"completion_tokens": 193, "prompt_tokens": 2985, "total_tokens": 3178, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 247, "status": 200}
{"tag": "glossary:RNase H", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.3, "usage": {"completion_tokens": 52, "prompt_tokens": 2786, "total_tokens": 2838, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 102, "status": 200}
{"tag": "glossary:Ribonuclease T1", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.58, "usage": {"completion_tokens": 48, "prompt_tokens": 2455, "total_tokens": 2503, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 90, "status": 200}
{"tag": "glossary:RNase T1", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.4, "usage": {"completion_tokens": 139, "prompt_tokens": 2804, "total_tokens": 2943, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 191, "status": 200}
{"tag": "glossary:RiboGalSTAR™", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.89, "usage": {"completion_tokens": 120, "prompt_tokens": 3083, "total_tokens": 3203, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 161, "status": 200}
{"tag": "glossary:RSC 2.0 modification", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.88, "usage": {"completion_tokens": 216, "prompt_tokens": 2582, "total_tokens": 2798, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 297, "status": 200}
{"tag": "glossary:RNase Inhibitor", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 5.21, "usage": {"completion_tokens": 105, "prompt_tokens": 2310, "total_tokens": 2415, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 157, "status": 200}
{"tag": "glossary:SBIA", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.4, "usage": {"completion_tokens": 140, "prompt_tokens": 2843, "total_tokens": 2983, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 257, "status": 200}
{"tag": "glossary:SBS", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.47, "usage": {"completion_tokens": 173, "prompt_tokens": 3000, "total_tokens": 3173, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 242, "status": 200}
{"tag": "glossary:SPOS", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.08, "usage": {"completion_tokens": 147, "prompt_tokens": 3262, "total_tokens": 3409, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 221, "status": 200}
{"tag": "glossary:SMART Digest RNase T1 kit", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.2, "usage": {"completion_tokens": 58, "prompt_tokens": 2201, "total_tokens": 2259, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 122, "status": 200}
{"tag": "glossary:ST Pharm", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.52, "usage": {"completion_tokens": 186, "prompt_tokens": 2990, "total_tokens": 3176, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 259, "status": 200}
{"tag": "glossary:SUGAR-TARGET glycosyl-transfer", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.35, "usage": {"completion_tokens": 160, "prompt_tokens": 2259, "total_tokens": 2419, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 261, "status": 200}
{"tag": "glossary:STP122G", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.96, "usage": {"completion_tokens": 119, "prompt_tokens": 3332, "total_tokens": 3451, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 177, "status": 200}
{"tag": "glossary:SiaT", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.18, "usage": {"completion_tokens": 131, "prompt_tokens": 3102, "total_tokens": 3233, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 183, "status": 200}
{"tag": "glossary:Sangon Biotech", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.77, "usage": {"completion_tokens": 148, "prompt_tokens": 2597, "total_tokens": 2745, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 252, "status": 200}
{"tag": "glossary:Snake Venom Phosphodiesterase", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.39, "usage": {"completion_tokens": 55, "prompt_tokens": 2198, "total_tokens": 2253, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 108, "status": 200}
{"tag": "glossary:Strain-Promoted AzideAlkyne C", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 63, "prompt_tokens": 2201, "total_tokens": 2264, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 122, "status": 200}
{"tag": "glossary:Supply-Chain Opportunity Map", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 44, "prompt_tokens": 3039, "total_tokens": 3083, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 109, "status": 200}
{"tag": "glossary:Sollbruchstellen", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.63, "usage": {"completion_tokens": 177, "prompt_tokens": 3118, "total_tokens": 3295, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 244, "status": 200}
{"tag": "glossary:SpyCatcher/SpyTag", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.11, "usage": {"completion_tokens": 124, "prompt_tokens": 2985, "total_tokens": 3109, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 181, "status": 200}
{"tag": "glossary:T4 RNA Ligase 1", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.09, "usage": {"completion_tokens": 49, "prompt_tokens": 2386, "total_tokens": 2435, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 97, "status": 200}
{"tag": "glossary:Suzhou Taike", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.8, "usage": {"completion_tokens": 138, "prompt_tokens": 2382, "total_tokens": 2520, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 184, "status": 200}
{"tag": "glossary:T7 RNA polymerase", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.29, "usage": {"completion_tokens": 47, "prompt_tokens": 2340, "total_tokens": 2387, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 98, "status": 200}
{"tag": "glossary:T4 RNA Ligase 2", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.36, "usage": {"completion_tokens": 49, "prompt_tokens": 2529, "total_tokens": 2578, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 97, "status": 200}
{"tag": "glossary:Synthesis Modality", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.85, "usage": {"completion_tokens": 150, "prompt_tokens": 3059, "total_tokens": 3209, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 222, "status": 200}
{"tag": "glossary:TRiM™", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.52, "usage": {"completion_tokens": 54, "prompt_tokens": 3205, "total_tokens": 3259, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 130, "status": 200}
{"tag": "glossary:Terminal Deoxynucleotidyl Tran", "attempt": 0, "elapsed": 0.81, "status": 429, "error": "HTTP 429: {\"error\":{\"code\":\"429\",\"type\":\"rate_limit\",\"message\":\"Rate limit exceeded\"}}", "retryable": true}
{"tag": "glossary:TRL", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.87, "usage": {"completion_tokens": 100, "prompt_tokens": 2928, "total_tokens": 3028, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 168, "status": 200}
{"tag": "glossary:Technical Guidelines for Pharm", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.11, "usage": {"completion_tokens": 90, "prompt_tokens": 2965, "total_tokens": 3055, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 216, "status": 200}
{"tag": "glossary:Takara Bio", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.95, "usage": {"completion_tokens": 117, "prompt_tokens": 2932, "total_tokens": 3049, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 193, "status": 200}
{"tag": "glossary:Terminal Deoxynucleotidyl Tran", "model": "anthropic/claude-haiku-4.5", "attempt": 1, "elapsed": 2.02, "usage": {"completion_tokens": 59, "prompt_tokens": 2082, "total_tokens": 2141, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 119, "status": 200}
{"tag": "glossary:Tier 1", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.04, "usage": {"completion_tokens": 135, "prompt_tokens": 2970, "total_tokens": 3105, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 187, "status": 200}
{"tag": "glossary:Tier 2", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.44, "usage": {"completion_tokens": 163, "prompt_tokens": 2919, "total_tokens": 3082, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 211, "status": 200}
{"tag": "glossary:Triazole linker", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.17, "usage": {"completion_tokens": 42, "prompt_tokens": 2215, "total_tokens": 2257, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 91, "status": 200}
{"tag": "glossary:Tier 3", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.63, "usage": {"completion_tokens": 159, "prompt_tokens": 3022, "total_tokens": 3181, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 211, "status": 200}
{"tag": "glossary:TrisGal-6 scaffold", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.16, "usage": {"completion_tokens": 48, "prompt_tokens": 2483, "total_tokens": 2531, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 103, "status": 200}
{"tag": "glossary:Tianjin Orilife", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 7.21, "usage": {"completion_tokens": 120, "prompt_tokens": 2262, "total_tokens": 2382, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 180, "status": 200}
{"tag": "glossary:UDP-Gal", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.18, "usage": {"completion_tokens": 58, "prompt_tokens": 2868, "total_tokens": 2926, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 109, "status": 200}
{"tag": "glossary:Unylinker-functionalized polys", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.37, "usage": {"completion_tokens": 62, "prompt_tokens": 2281, "total_tokens": 2343, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 134, "status": 200}
{"tag": "glossary:Vazyme", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.36, "usage": {"completion_tokens": 50, "prompt_tokens": 2087, "total_tokens": 2137, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 107, "status": 200}
{"tag": "glossary:UDP-GalNAc", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.31, "usage": {"completion_tokens": 176, "prompt_tokens": 2647, "total_tokens": 2823, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 228, "status": 200}
{"tag": "glossary:Worthington Biochemical", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.32, "usage": {"completion_tokens": 142, "prompt_tokens": 2916, "total_tokens": 3058, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 227, "status": 200}
{"tag": "glossary:XBP-1", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.24, "usage": {"completion_tokens": 50, "prompt_tokens": 2927, "total_tokens": 2977, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 105, "status": 200}
{"tag": "glossary:Wuhu Huaren", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.83, "usage": {"completion_tokens": 51, "prompt_tokens": 2414, "total_tokens": 2465, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 118, "status": 200}
{"tag": "glossary:Yeasen Biotech", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.67, "usage": {"completion_tokens": 52, "prompt_tokens": 2494, "total_tokens": 2546, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 119, "status": 200}
{"tag": "glossary:WuXi AppTec", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.36, "usage": {"completion_tokens": 45, "prompt_tokens": 2253, "total_tokens": 2298, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 97, "status": 200}
{"tag": "glossary:acceptable daily intake", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.49, "usage": {"completion_tokens": 45, "prompt_tokens": 2908, "total_tokens": 2953, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 103, "status": 200}
{"tag": "glossary:activated-intermediate shelf l", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 4.18, "usage": {"completion_tokens": 166, "prompt_tokens": 3270, "total_tokens": 3436, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 264, "status": 200}
{"tag": "glossary:anion-exchange polishing", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.48, "usage": {"completion_tokens": 159, "prompt_tokens": 2783, "total_tokens": 2942, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 243, "status": 200}
{"tag": "glossary:antisolvent", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.84, "usage": {"completion_tokens": 185, "prompt_tokens": 3662, "total_tokens": 3847, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 235, "status": 200}
{"tag": "glossary:arm-coupling reaction", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.73, "usage": {"completion_tokens": 205, "prompt_tokens": 2905, "total_tokens": 3110, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 277, "status": 200}
{"tag": "glossary:atom-economy penalty", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.51, "usage": {"completion_tokens": 165, "prompt_tokens": 3200, "total_tokens": 3365, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 236, "status": 200}
{"tag": "glossary:bead attrition", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.38, "usage": {"completion_tokens": 143, "prompt_tokens": 3084, "total_tokens": 3227, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 203, "status": 200}
{"tag": "glossary:bottom-up mapping", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.69, "usage": {"completion_tokens": 152, "prompt_tokens": 3139, "total_tokens": 3291, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 215, "status": 200}
{"tag": "glossary:cardiometabolic disease", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.86, "usage": {"completion_tokens": 46, "prompt_tokens": 3121, "total_tokens": 3167, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 101, "status": 200}
{"tag": "glossary:cell-free synthesis", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 1.94, "usage": {"completion_tokens": 41, "prompt_tokens": 2729, "total_tokens": 2770, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:bundled enzyme-carrier product", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.67, "usage": {"completion_tokens": 134, "prompt_tokens": 3208, "total_tokens": 3342, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 222, "status": 200}
{"tag": "glossary:branching-point coupling", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 5.58, "usage": {"completion_tokens": 200, "prompt_tokens": 2967, "total_tokens": 3167, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 278, "status": 200}
{"tag": "glossary:enantiomeric excess", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.2, "usage": {"completion_tokens": 42, "prompt_tokens": 2864, "total_tokens": 2906, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 96, "status": 200}
{"tag": "glossary:dual-functional RNAi therapeut", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.6, "usage": {"completion_tokens": 174, "prompt_tokens": 2491, "total_tokens": 2665, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 236, "status": 200}
{"tag": "glossary:channeling", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.88, "usage": {"completion_tokens": 184, "prompt_tokens": 3227, "total_tokens": 3411, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 250, "status": 200}
{"tag": "glossary:enzymatic-ligation", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.31, "usage": {"completion_tokens": 39, "prompt_tokens": 2066, "total_tokens": 2105, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 93, "status": 200}
{"tag": "glossary:glutaraldehyde", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.39, "usage": {"completion_tokens": 41, "prompt_tokens": 3212, "total_tokens": 3253, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 89, "status": 200}
{"tag": "glossary:glycosyl-transferase", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 2.14, "usage": {"completion_tokens": 44, "prompt_tokens": 2399, "total_tokens": 2443, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 97, "status": 200}
{"tag": "glossary:enzyme loading per gram", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.46, "usage": {"completion_tokens": 162, "prompt_tokens": 3360, "total_tokens": 3522, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 243, "status": 200}
{"tag": "glossary:fixed-bed copper-scavenging re", "model": "anthropic/claude-haiku-4.5", "attempt": 0, "elapsed": 3.65, "usage": {"completion_tokens": 172, "prompt_tokens": 2946, "total_tokens": 3118, "prompt_tokens_details": {"cached_tokens": 0, "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0, "web_search": 0, "cacheCreationInputTokens": 0}}, "out_chars": 248, "status": 200}
+260
View File
@@ -0,0 +1,260 @@
#!/usr/bin/env python3
"""根据 glossary 的核查结果,在 final_zh_polished.md 上做精确的文本替换。
原理
- build_glossary.py 会给每条术语标 `zh`正确中文 `issue`有发现问题
- 本脚本扫描所有 `issue` 非空且 `confidence in {high, medium}` 的条目
- 对这些条目在正文中把当前错误译名替换为正确译名
- 同时处理英文拼写错误例如 Maywavee Mabwell
规则
- 安全第一只做字面替换不做上下文改写
- 明确可见每一处替换都打印出来方便 diff
- 幂等多次跑结果一致
- 支持 --dry-run 预览
用法
uv run python scripts/apply_glossary.py <project_slug>
uv run python scripts/apply_glossary.py <project_slug> --dry-run
uv run python scripts/apply_glossary.py <project_slug> --min-confidence high
"""
from __future__ import annotations
import argparse
import json
import re
import sys
from dataclasses import dataclass
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
@dataclass
class Correction:
"""一条要应用的修正。"""
kind: str # "en" (英文拼写) / "zh" (中文译名)
wrong: str # 当前文中的错误写法
correct: str # 正确写法
term_key: str # glossary 里这条的 key(人工 debug 用)
confidence: str # high / medium / low
reason: str # 为什么要改(从 issue 字段提取)
_ISSUE_WRONG_EN_RE = re.compile(
r"(?:'|\"|term\s*)([A-Z][A-Za-z0-9_\- ]{2,40})['\"]*\s*(?:为|是)[^。]*?"
r"(?:拼写错误|拼写有误|应为|正确英文名为|正确为|正确拼写为)",
)
_CORRECT_EN_RE = re.compile(
r"(?:正确英文名为|正确为|正确拼写为|应为|正确写法为)\s*['\"]?([A-Z][A-Za-z0-9_\- ]{2,40})['\"]?",
)
_WRONG_ZH_RE = re.compile(
r"current_zh\s*['\"]?([\u4e00-\u9fff][^'\"。,;]{1,40})['\"]?\s*(?:为|是|存在)[^。]*?(?:错误|错译|误译|不准确|应为|应该)",
)
def resolve_project(arg: str) -> Path:
p = Path(arg)
if p.is_dir():
return p
cand = Path.cwd() / "projects" / arg
if cand.is_dir():
return cand
raise SystemExit(f"project not found: {arg}")
def load_glossary(path: Path) -> dict:
return json.loads(path.read_text(encoding="utf-8"))
# 中文替换的保守性:只对"公司名、机构名、产品名"类这种具体化的词做替换
# 规避常见缩写词在不同上下文有不同含义的情况(如 PDE = 磷酸二酯酶 OR 允许日暴露量)
_AMBIGUOUS_ABBREVS = {
"PDE", "ASGPR", "BLA", "IND", "NDA", "CMC", "API", "QC", "QA",
"ADC", "CRO", "CDMO", "CMO", "GMP", "PK", "PD", "TRL",
"FDA", "EMA", "NMPA", "ICH", "WHO", "CFDA", "CDE",
"LNP", "RNP", "AAV", "mRNA", "RNAi", "siRNA", "ASO",
"DNA", "RNA", "cDNA", "dsRNA", "ssRNA",
"OTP", "HCV", "HBV", "HPV", "HIV",
}
def _looks_like_proper_noun(term_key: str) -> bool:
"""判断这条术语是否是"专有名词"(公司/机构/产品/药物名)。"""
# 全大写 2-4 字符缩写 → 视作通用缩写,跳过(歧义风险高)
if term_key.upper() == term_key and 2 <= len(term_key) <= 5:
return False
if term_key in _AMBIGUOUS_ABBREVS:
return False
# 其他情况:视作专有名词
return True
def extract_corrections(glossary: dict, min_conf: str) -> list[Correction]:
"""从 glossary 抽出可应用的修正。
保守策略
- 英文拼写错误term_key 本身错高信度直接修
- 中文译名错误issue 里说 current_zh 仅对"专有名词"公司/产品/机构
- 缩写/通用术语PDE/ASGPR 不自动修避免上下文歧义
"""
rank = {"high": 3, "medium": 2, "low": 1}
threshold = rank.get(min_conf, 2)
corrections: list[Correction] = []
for term_key, entry in glossary.items():
if not isinstance(entry, dict):
continue
conf = entry.get("confidence", "low")
if rank.get(conf, 0) < threshold:
continue
issue = entry.get("issue", "")
zh = entry.get("zh", "")
en_full = entry.get("en_full", "")
if not issue:
continue
# 1. 英文拼写错误:key 本身错了,en_full 是对的
if (
en_full
and term_key != en_full
and re.search(r"拼写错误|拼写有误|spelled|should be", issue, re.IGNORECASE)
and term_key[0].isupper() # 通常是公司/产品名
):
# 排除太短的(容易误伤)或包含空格的原始 key
if len(term_key) >= 4 and len(en_full) >= 4:
corrections.append(
Correction(
kind="en",
wrong=term_key,
correct=en_full.split("(")[0].strip(), # 去掉括号内的法人全称
term_key=term_key,
confidence=conf,
reason=issue[:200],
)
)
# 2. 中文译名错误:只对"专有名词"修(排除缩写/通用术语的歧义风险)
if not _looks_like_proper_noun(term_key):
continue
m = _WRONG_ZH_RE.search(issue)
if m and zh:
wrong_zh = m.group(1).strip()
if wrong_zh != zh and len(wrong_zh) >= 2:
corrections.append(
Correction(
kind="zh",
wrong=wrong_zh,
correct=zh,
term_key=term_key,
confidence=conf,
reason=issue[:200],
)
)
return corrections
def apply_corrections(text: str, corrections: list[Correction]) -> tuple[str, list[tuple[Correction, int]]]:
"""返回 (新文本, [(correction, 替换次数)])。"""
results: list[tuple[Correction, int]] = []
new_text = text
for c in corrections:
# 英文术语用 \b 边界;中文直接替换
if c.kind == "en":
pattern = r"\b" + re.escape(c.wrong) + r"\b"
new_text, count = re.subn(pattern, c.correct, new_text)
else:
count = new_text.count(c.wrong)
if count:
new_text = new_text.replace(c.wrong, c.correct)
results.append((c, count))
return new_text, results
def main() -> int:
parser = argparse.ArgumentParser(description="用 glossary 修正正文术语")
parser.add_argument("project", help="项目 slug 或路径")
parser.add_argument(
"--input", default="phase4/final_zh_polished.md",
help="待修正的 Markdown",
)
parser.add_argument(
"--output", default=None,
help="输出路径(默认原地覆盖)",
)
parser.add_argument(
"--glossary", default="phase4/glossary.json",
help="glossary.json 路径",
)
parser.add_argument(
"--min-confidence",
choices=["high", "medium", "low"],
default="medium",
help="只应用 >= 此置信度的修正(默认 medium)",
)
parser.add_argument(
"--dry-run", action="store_true",
help="只打印会发生的修改,不实际写入",
)
args = parser.parse_args()
project_root = resolve_project(args.project)
input_path = project_root / args.input
output_path = project_root / (args.output or args.input)
glossary_path = project_root / args.glossary
if not input_path.exists():
raise SystemExit(f"输入文件不存在:{input_path}")
if not glossary_path.exists():
raise SystemExit(f"glossary 不存在:{glossary_path}")
glossary = load_glossary(glossary_path)
corrections = extract_corrections(glossary, args.min_confidence)
print(f"Project: {project_root.name}")
print(f"Input: {input_path.relative_to(project_root)}")
print(f"Output: {output_path.relative_to(project_root)}")
print(f"Glossary: {glossary_path.relative_to(project_root)} ({len(glossary)} terms)")
print(f"Min confidence: {args.min_confidence}")
print(f"候选修正: {len(corrections)}")
print()
if not corrections:
print("没有需要应用的修正。")
return 0
original = input_path.read_text(encoding="utf-8")
new_text, results = apply_corrections(original, corrections)
applied = [(c, n) for c, n in results if n > 0]
skipped = [(c, n) for c, n in results if n == 0]
print(f"=== 已应用 {len(applied)} 条修正(共替换 {sum(n for _, n in applied)} 处)===")
for c, n in sorted(applied, key=lambda x: -x[1]):
marker = "EN" if c.kind == "en" else "ZH"
print(f" [{marker}][{c.confidence}] {c.wrong!r}{c.correct!r} (×{n})")
print(f" 原因: {c.reason[:120]}")
if skipped:
print(f"\n=== 跳过 {len(skipped)} 条(正文未出现该错误写法)===")
for c, _ in skipped[:10]:
marker = "EN" if c.kind == "en" else "ZH"
print(f" [{marker}] {c.wrong!r}{c.correct!r} (0 hit)")
if len(skipped) > 10:
print(f" …还有 {len(skipped) - 10}")
if args.dry_run:
print("\n(--dry-run:未写入)")
return 0
output_path.write_text(new_text, encoding="utf-8")
delta = len(new_text) - len(original)
print(f"\n✓ 已写入 {output_path.relative_to(project_root)} (字符变化 {delta:+d})")
return 0
if __name__ == "__main__":
sys.exit(main())