尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI-Infra-Guard Agent Scan HTTP 自定义接口配置实战:从配置项到源码级解析实现

AI-Infra-Guard Agent Scan HTTP 自定义接口配置实战:从配置项到源码级解析实现 AI-Infra-Guard Agent Scan HTTP 自定义接口配置实战从配置项到源码级解析实现【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard本文基于 AI-Infra-Guard 仓库中的 HTTP 接口配置指南common/websocket/static/aigdocs/docs/agent-scan-http-config_en.md完整讲解如何将自托管 Agent 服务或第三方非标准接口接入 Agent Scan 进行安全扫描包括 URL、请求头、{{prompt}}请求体模板、响应解析器与超时等全部配置项的使用方法并结合agent-scan子项目的适配器源码agent-scan/agent_scan/core/agent_adapter/adapter.py深入剖析占位符渲染、响应字段提取与 SSE 流式解析的底层实现帮助读者既能正确配置任意 HTTP 对话端点也能理解扫描器在底层如何把一次 HTTP 交互转化为可评估的 Agent 回复。一、HTTP Endpoint 在 Agent Scan 中的定位Agent Scan 是 AI-Infra-Guard 平台中用于对 AI Agent 目标进行安全扫描越狱、提示注入、工具滥用等的组件。为了覆盖 OpenAI 兼容 API 之外的目标它内置了一个“自定义 HTTP 端点”HTTP Endpoint适配器只要目标 Agent 暴露了一个 HTTP 对话接口无论字段名、返回结构多非标都可以用 URL 请求头 请求体模板 响应解析器这四项配置接入。从源码结构看该适配器的核心类是 adapter.py 中的AIProviderClient。其_route_call方法约 L308-L337按优先级路由请求provider ID 以websocket开头或 URL 以ws:///wss://开头时自动改走 WebSocket 处理分支_should_use_websocket约 L477-L481provider ID 以http开头或仅配置了 URL 的匿名配置时进入本文主题的_call_http_provider分支dify、coze等平台型 provider 有专门处理其余标准厂商OpenAI、Anthropic、Mistral、Groq 等走统一的_call_standard_provider其模板与响应路径由 providers.yaml 中的格式组定义。需要说明的是HTTP Endpoint 分支只接受http:///https://地址——_validate_local约 L1294-L1337会显式校验“HTTP URL must start with http:// or https://”这也是为什么 WebSocket 目标必须填 ws/wss 前缀才能被正确路由。二、配置入口与基础必填项配置入口Settings设置→Agent ConfigurationAgent 配置→Add新增→ 选择HTTP Endpoint。基础设置必填配置项说明默认值Agent NameAgent 名称自定义的唯一名称用于识别与管理该 Agent无URL目标 HTTP 端点的完整地址如https://api.example.com/chat无必填HTTP Method请求方法支持 POST、GET、PUT、PATCH、DELETEPOST在源码中这三个必填项分别映射到 adapter.py 里ProviderConfig模型的字段约 L47-L77url、method、headers、body、transform_response、timeout_ms。_call_http_provider约 L483-L503对它们的处理逻辑与文档描述一一对应url缺失时直接返回HTTP URL is required失败结果method会统一转为大写未配置时回退为POSTmethod (config.method or POST).upper()若用户额外配置了endpoint字段常见于 YAML 配置文件方式最终地址为url endpoint的拼接。三、高级配置项详解可选3.1 请求头Request Headers格式JSON 格式的 HTTP 请求头。默认值{Content-Type: application/json}。示例{ Content-Type: application/json, Authorization: Bearer your-token-here, X-Custom-Header: xxxxx }注意若目标接口需要鉴权在此添加Authorization等头。源码印证_call_http_provider中有一段兜底逻辑约 L496-L499——当用户未提供任何Content-Type不区分大小写检查Content-Type与content-type时自动补上application/json。这意味着文档中的“默认值”并非 UI 占位文案而是运行时真实行为。对于非 JSON 接口如纯文本必须像文档示例 2 那样显式写{Content-Type: text/plain}否则请求体序列化方式也会按 JSON 处理。3.2 请求体Request Body与{{prompt}}占位符格式请求体模板支持文本或 JSON 格式。占位符使用{{prompt}}表示测试输入的注入位置扫描时会替换为实际的测试 prompt。默认值{message: {{prompt}}}。示例{ query: {{prompt}}, user_id: agent-user, stream: false }注意按目标接口的真实请求格式填写确保{{prompt}}处于正确位置。源码印证占位符替换发生在_render_prompt_body约 L505-L519这里有几个文档未展开、但直接影响配置成败的实现细节兼容带空格的变体代码同时替换{{prompt}}和{{ prompt }}两种写法JSON 安全转义替换前 prompt 先经过json.dumps(prompt)[1:-1]处理即引号、换行、反斜杠等字符会被正确转义后再嵌入模板。这保证 prompt 中含有双引号或换行时JSON 模板不会被破坏模板合法性回退替换后的模板会先尝试json.loads解析——能解析则作为 JSON 对象发送解析失败则按原始字符串发送对应contentbody的纯文本请求体。这解释了为什么“简单文本接口”可以直接把请求体写成{{prompt}}默认模板body未配置时回退为{message: prompt}与文档声明的默认值一致。3.3 响应解析器Response Parser响应解析器用于从 HTTP 响应中提取 Agent 的真实回复内容对应ProviderConfig中的transform_response字段。格式JSONPath 表达式或路径表达式。配置方法JSON 响应使用点号路径提取嵌套字段。响应为{reply: content}时配置json.reply响应为{data: {message: content}}时配置json.data.message。文本响应留空或填response。响应本身就是纯文本如Agent reply content时解析器留空即可。如何确定先用“Agent Connection Verification”Agent 连接验证功能测试观察真实响应结构后再配置。源码印证文档将其描述为 JSONPath/JS 表达式但从 adapter.py 的_apply_transform实现约 L1239-L1285看实际是一个轻量级的路径提取引擎能力边界值得明确前缀剥离response.、json.、data.前缀不区分大小写会被先剥掉因此json.data.reply与data.reply等价空表达式语义表达式为空、或仅为response/json/data时直接返回原始响应文本原样返回JSON 序列化为字符串——这就是“文本响应留空即可”的实现来源点号 数组下标遍历表达式被切分为a.b[0].c这类 token 序列逐层dict.get取键、list[index]取下标任一层越界或类型不符即返回None。因此json.choices[0].message.contentOpenAI 格式这类带数组下标的路径是受支持的非字符串收尾若最终取到的是 dict 或 list会序列化为 JSON 字符串返回取到None视为提取失败交给默认提取逻辑兜底。若未配置解析器或提取失败_extract_output约 L1176-L1237会按常见格式自动兜底提取识别顺序为OpenAI 格式choices[0].message.content或choices[0].textAnthropic 格式contentlist 或字符串Google 格式candidates[0].content.parts[0].textOllama/Cohere 格式message.content、text通用字段依次尝试response、result、output、data、generated_text。这一兜底链意味着即使解析器配错只要响应命中上述常见结构验证仍可能成功反之字段名完全私有的接口如reply包在data下必须显式配置解析器。3.4 超时Timeout, ms默认值3000030 秒。说明请求超时时长。超过该时间未收到响应即判定为失败。源码印证_get_timeout_seconds约 L548-L551将timeout_ms除以 1000 转为秒并强制下限为 1 秒。HTTP 请求本身由httpx.Client(timeoutself.timeout)发起_make_http_request约 L942-L1033客户端级默认超时DEFAULT_TIMEOUT 30秒约 L224与 UI 默认 30000ms 保持一致从源码结构看timeout_ms的按秒换算逻辑被 WebSocket 分支连接、逐条消息接收直接复用。超时发生时HTTP 分支返回Request timed out after N seconds的标准化失败结果而不是抛出异常。四、两个完整配置示例继承自官方指南示例 1标准 JSON API假设目标接口为POST https://api.example.com/chat请求格式{ message: 用户输入内容, user_id: user123 }响应格式{ status: success, data: { reply: Agent 回复内容 } }配置URLhttps://api.example.com/chatHTTP MethodPOSTRequest Headers{Content-Type: application/json, Authorization: Bearer your-token}Request Body{message: {{prompt}}, user_id: agent-user}Response Parserjson.data.reply对照源码路径请求体经_render_prompt_body替换占位符后以 JSON 发送响应经_apply_transform依次取data→reply得到回复文本。示例 2简单文本接口假设目标接口为POST https://api.example.com/simple请求体为纯文本响应也是纯文本。配置URLhttps://api.example.com/simpleHTTP MethodPOSTRequest Headers{Content-Type: text/plain}Request Body{{prompt}}Response Parser留空或填response对照源码路径纯文本模板{{prompt}}替换后json.loads失败回退为字符串请求体httpxcontent发送响应为非 JSON 时raw_response即响应文本解析器留空时_extract_output对非 dict 直接str()返回。仓库中的真实配置样例除 UI 配置外Agent Scan 也支持从 YAML 文件批量加载目标load_config_from_file约 L1341-L1407支持providers或targets两种顶层键。仓库自带的测试用例 case3/provider.yaml 就是一个完整的 HTTP Endpoint 配置targets: - id: http config: url: http://127.0.0.1:18091 endpoint: /chat method: POST headers: Content-Type: application/json body: message: {{prompt}} transform_response: reply它覆盖了 UI 中所有配置项的 YAML 形态id: http触发 HTTP 路由分支transform_response: reply对应 Response Parser 的json.reply等价写法reply前缀剥离后与json.reply路径相同。五、请求执行链路从发出请求到拿到回复理解_make_http_request约 L942-L1033的完整流程能解释“连接验证成功/失败”的每一种结果形态发送dict 类型请求体走jsonbodyJSON 序列化str 类型走contentbody原始字节方法、URL、请求头均按配置原样发出SSE 流式识别若响应头content-type包含text/event-stream进入_parse_sse_response约 L1035-L1163逐行解析data:帧跳过[DONE]标记并分别支持四种流式协议的内容累积OpenAI 风格choices[0].delta.content拼接Anthropic 风格content_block_delta事件的delta.text拼接message_delta事件提取usageCoze 风格type: answer事件的contentDify 风格含answer字段的帧。解析完成后会重组为一个“规范化响应对象”如 OpenAI 风格的choices[0].message.content再交给响应解析器提取——这就是官方 FAQ 中“支持流式响应”的源码依据非流式响应优先response.json()解析失败则按文本处理若响应含usage字段会一并捕获供 Token 用量统计结果标准化无论成败都返回ProviderTestResult其中provider_response携带raw原始响应、output提取出的回复、响应头、token_usage与metadata包含status_code、elapsed_time、url、method、is_sse。2xx 状态码判定成功并返回Connection successful! Status: xxx, Time: x.xx s非 2xx 时会尝试从响应的error.message/message字段提取错误详情拼入失败信息。一个值得注意的路由细节虽然本文主题是 HTTP 接口但若把ws:///wss://地址填入 URL_should_use_websocket约 L477-L481会自动改走 WebSocket 请求-响应处理分支同样复用同一套transform_response提取逻辑并内置消息条数与响应字节数上限保护。配置前建议确认目标协议类型避免误路由。六、连接验证Agent Connection Verification配置完成后官方指南强烈建议使用“Agent Connection Verification”功能做快速验证UI 位于 Agent 配置页内通过“Prompt Input”输入测试词、“Run Test”发送测试请求并在解析器不正确时查看完整原始响应。从源码看其核心流程非常精简connectivity.py 中的connectivity()函数加载 YAML 配置中的第一个 provider用固定探测 promptOnly return 1调用一次call_provider以result.success作为连通性结论。也就是说验证请求与正式扫描走的是完全相同的适配器路径验证通过即可保证扫描阶段的请求链路可用。针对 HTTP 接口的验证排障要点继承自官方指南提取失败连通但拿不到回复优先检查 Response Parser 是否与真实响应结构一致连通性检查失败依次核对 URL含http:///https://前缀、HTTP 方法、请求头尤其是Content-Type与鉴权头、请求体格式、响应解析器4xx/5xx失败信息中会携带服务端返回的错误 message可直接用于定位鉴权或参数问题。七、FAQQ如何确定 Response Parser 该怎么配A先用“Agent Connection Verification”查看真实响应结构再按响应格式配置路径。常见对照响应为{reply: content}用json.reply{data: {message: content}}用json.data.messageOpenAI 格式{choices: [{message: {content: ...}}]}用json.choices[0].message.content此格式不配置时也会命中_extract_output的自动兜底。Q支持流式Streaming响应吗A支持。_make_http_request会自动识别text/event-stream并走 SSE 解析分支兼容 OpenAI/Anthropic/Coze/Dify 四种流式协议。若解析失败建议切换为非流式Synchronous/阻塞模式请求。Q请求体必须包含{{prompt}}吗A必须。{{prompt}}是必填占位符扫描时被替换为实际的测试 prompt源码中亦兼容{{ prompt }}写法替换前会自动做 JSON 转义。Q支持文件上传吗A当前版本不支持文件上传仅支持文本对话。Q如何得知目标接口的参数与响应格式A官方指南给出的五条途径仍然适用查阅接口文档了解请求格式URL、方法、头、body 结构与响应格式使用“Agent Connection Verification”配置基础信息后发送测试请求解析器配错时可看到完整原始响应结构浏览器开发者工具F12 → Network 面板 → 在 Web 界面发送消息 → 观察对应的 HTTP 请求与响应curl 或 Postman直接调用接口观察请求/响应格式参考响应解析器示例按 3.3 节的路径写法对照常见响应格式配置。八、相关文件索引文件作用HTTP 接口配置指南英文本文主体依据的官方配置文档HTTP 接口配置指南中文同指南中文版本adapter.pyAIProviderClient适配器HTTP 路由、占位符渲染、SSE 解析、响应提取的核心实现connectivity.py连通性验证入口Only return 1探测providers.yaml标准厂商 provider 的模板与响应路径定义case3/provider.yaml仓库内置的 HTTP Endpoint 真实配置样例provider_config_en.jsonprovider 配置说明英文小结接入一个 HTTP 自定义 Agent 的本质是回答三个问题——“请求怎么发”URL/方法/头/带{{prompt}}的 body 模板、“回复在哪取”transform_response路径、“多久放弃”timeout_ms。三个问题都答对_call_http_provider→_make_http_request→_extract_output这条链路即可把任意非标准 HTTP 对话接口转化为 Agent Scan 可评估的文本回复遇到失败时对照ProviderTestResult中携带的status_code、错误 message 与原始响应即可快速定位是链路问题还是解析问题。【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表