尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【Bug已解决】HuggingFaceEndpointEmbeddings missing bill_to / additional_headers parameter

【Bug已解决】HuggingFaceEndpointEmbeddings missing bill_to / additional_headers parameter 【Bug已解决】HuggingFaceEndpointEmbeddings missing bill_to additional_headers parameter一、现象长什么样HuggingFaceEndpointEmbeddingsLangChain 里对接 Hugging Face 推理端点 / TEI 的嵌入封装在初始化时只暴露了model、endpoint_url、huggingfacehub_api_token、task等少数参数。但 Hugging Face 的 endpoints 实际还支持两个很有用的东西bill_to指定这次调用计费到哪个组织/账户企业里多个团队共用一个 endpoint 时需要把用量归因到具体 team。additional_headers透传额外的 HTTP 头比如自定义的追踪头、合规所需要的 header。当你想传这两个参数时会发现HuggingFaceEndpointEmbeddings根本没有对应字段要么被 pydantic 拒绝extra_forbidden要么只能 monkey-patch 内部requests调用。对于需要按团队计费、或需要注入追踪 header 的企业场景这直接卡死。二、背景Hugging Face 的推理端点包括自托管的 Text Embedding InferenceTEI在请求体或请求头里接受额外字段。bill_to通常作为请求的一个业务参数或 header用于用量计费归属additional_headers则是把任意自定义 header 透传到后端常见于服务网格、链路追踪traceparent、合规审计。LangChain 的HuggingFaceEndpointEmbeddings在_embed_texts里直接用requests.post(url, jsonpayload, headers...)但payload和headers都是写死的没有把用户想额外传的字段纳入。pydantic model 默认extraforbid用户加bill_to会直接校验失败。三、根因根因两点字段未建模bill_to与additional_headers没有在 dataclass/pydantic model 里声明用户无法合法传入。透传被切断_embed_texts组装payload和headers时没有把这两个值注入到请求里即便用户通过model_kwargs之类的后门塞进去也未必被正确透传。本质封装层只覆盖了最小可用参数没把底层 endpoint 支持的计费/透传能力暴露给调用方而企业场景恰恰离不开这两样。四、最小可运行复现下面演示问题传bill_to直接被 pydantic 拒。from langchain_huggingface import HuggingFaceEndpointEmbeddings emb HuggingFaceEndpointEmbeddings( modelBAAI/bge-large-en-v1.5, endpoint_urlhttps://my-endpoint.endpoints.huggingface.cloud, huggingfacehub_api_tokenhf_xxx, bill_toteam-a, # 报错字段不存在 additional_headers{X-Trace: abc}, )报错类似ValidationError: 1 validation error for HuggingFaceEndpointEmbeddings bill_to extra fields not permitted (typevalue_error.extra)五、解决方案第一层最小直接修复最小修法在 model 里加两个可选字段并在_embed_texts里把它们注入请求。from typing import Dict, Optional class HuggingFaceEndpointEmbeddingsPatch: bill_to: Optional[str] None additional_headers: Dict[str, str] {} def _embed_texts(self, texts): payload { inputs: texts, task: self.task, } if self.bill_to: payload[bill_to] self.bill_to # 注入计费归属 headers { Authorization: fBearer {self.huggingfacehub_api_token}, Content-Type: application/json, } headers.update(self.additional_headers) # 透传自定义头 import requests resp requests.post(self.endpoint_url, jsonpayload, headersheaders, timeout30) return resp.json()这一层让两个参数可用且不影响既有调用。六、解决方案第二层结构化改进把endpoint 额外参数固化成策略对象作为单一事实来源明确哪些参数走 body、哪些走 header。from dataclasses import dataclass, field from typing import Dict, Optional dataclass(frozenTrue) class LangChainHfEndpointEmbeddingsPolicy: HuggingFaceEndpointEmbeddings 透传策略的单一事实来源。 bill_to: Optional[str] None additional_headers: Dict[str, str] field(default_factorydict) bill_to_goes_to_body: bool True merge_headers: bool True def build_payload(self, base: dict) - dict: if self.bill_to_goes_to_body and self.bill_to: base {**base, bill_to: self.bill_to} return base def build_headers(self, base: dict) - dict: if self.merge_headers: return {**base, **self.additional_headers} return base def validate(self) - None: if self.bill_to and not self.bill_to_goes_to_body: raise AssertionError(bill_to must go to request body)这样调用方只需构造LangChainHfEndpointEmbeddingsPolicyembedding 类据此注入职责清晰、易测试。七、解决方案第三层断言 / CI 守护用 pytest 锁死透传行为import pytest from policy import LangChainHfEndpointEmbeddingsPolicy as P def test_bill_to_in_body(): p P(bill_toteam-a) payload p.build_payload({inputs: [x]}) assert payload[bill_to] team-a def test_additional_headers_merged(): p P(additional_headers{X-Trace: t1}) headers p.build_headers({Authorization: Bearer x}) assert headers[X-Trace] t1 assert headers[Authorization] Bearer x def test_no_bill_to_no_field(): p P() payload p.build_payload({inputs: [x]}) assert bill_to not in payload def test_conflict_rejected(): with pytest.raises(AssertionError): P(bill_tot, bill_to_goes_to_bodyFalse).validate()CI 加一条HuggingFaceEndpointEmbeddings单测必须覆盖bill_to进入 body、additional_headers合并进请求头。八、排查清单传bill_to报extra fields not permitted→ 字段未建模需添加到 model。自定义 headertraceparent 等传不进去→_embed_texts没透传additional_headers。计费归属不对→ 确认bill_to进了请求 body 而非 header。pydantic 是否extraforbid→ 要么放宽要么显式声明字段。自托管 TEI 是否需要bill_to→ 自建端点可能忽略但 cloud endpoint 通常需要。是否有其他隐藏参数如truncate也该透传→ 统一走策略对象扩展。九、小结HuggingFaceEndpointEmbeddings缺少bill_to与additional_headers参数根因是封装层只暴露了最小可用参数既未在 model 中声明字段也没在请求组装处透传导致企业场景下的计费归属与自定义 header 透传无法使用。第一层补上两个字段并注入请求第二层用LangChainHfEndpointEmbeddingsPolicy把body 参数 / header 参数的归属固化成单一事实来源第三层用 pytest 守护透传语义。LLM/嵌入封装器的通用原则底层 endpoint 支持的计费与透传能力都应被显式建模并默认安全透传而不是留给用户去 monkey-patch。
返回列表