HTTP/HTTPS API
将提供者ID设置为URL会向该端点发送HTTP请求。这是一种通用方法,可以使用任何HTTP端点进行推理。
提供者配置允许您构建HTTP请求并从响应中提取推理结果。
providers:
- id: 'https://example.com/generate'
config:
method: 'POST'
headers:
'Content-Type': 'application/json'
body:
myPrompt: '{{prompt}}'
responseParser: 'json.output' # 从响应中提取 "output" 字段
占位符变量 {{prompt}}
将被测试用例的最终提示替换。您还可以在构建请求时引用测试变量:
providers:
- id: 'https://example.com/generateTranslation'
config:
body:
prompt: '{{prompt}}'
model: '{{model}}'
translate: '{{language}}'
tests:
- vars:
model: 'gpt-4'
language: 'French'
如果未指定,则假定为内容类型为 application/json 的 HTTP POST。
发送原始HTTP请求
您还可以通过在提供者配置中指定 request
属性来发送原始HTTP请求。这使您可以完全控制请求,包括标头和正文。
以下是如何使用原始HTTP请求功能的示例:
providers:
- id: https
config:
request: |
POST /v1/completions HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer {{api_key}}
{
"model": "llama3.1-405b-base",
"prompt": "{{prompt}}",
"max_tokens": 100
}
responseParser: 'json.content' # 从响应中提取 "content" 字段
在此示例中:
request
属性包含一个原始HTTP请求,包括方法、路径、标头和正文。- 您可以在原始请求中使用模板变量,如
{{api_key}}
和{{prompt}}
。这些将在发送请求时替换为实际值。 responseParser
属性用于从JSON响应中提取所需信息。
您还可以使用 file://
前缀从外部文件加载原始请求:
providers:
- id: https
config:
request: file://path/to/request.txt
responseParser: 'json.text'
此路径相对于包含 Promptfoo 配置文件的目录。
然后在 path/to/request.txt
处创建一个文件:
POST /api/generate HTTP/1.1
Host: example.com
Content-Type: application/json
{"prompt": "Tell me a joke"}
嵌套对象
支持嵌套对象,并应传递给 dump
函数。
providers:
- id: 'https://example.com/generateTranslation'
config:
body:
messages: '{{messages | dump}}'
model: '{{model}}'
translate: '{{language}}'
tests:
- vars:
messages:
- role: 'user'
content: 'foobar'
- role: 'assistant'
content: 'baz'
model: 'gpt-4'
language: 'French'
请注意,body
中的任何有效JSON字符串都将转换为JSON对象。
解析JSON响应
默认情况下,整个响应将作为输出返回。如果您的API以JSON对象响应,并且您想提取特定值,请使用 responseParser
属性设置一个JavaScript代码片段,该片段操作提供的 json
对象。
例如,此 responseParser
配置:
providers:
- id: 'https://example.com/openai-compatible/chat/completions'
config:
# ...
responseParser: 'json.choices[0].message.content'
从以下响应中提取消息内容:
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1677858242,
"model": "gpt-4o-mini",
"usage": {
"prompt_tokens": 13,
"completion_tokens": 7,
"total_tokens": 20
},
"choices": [
{
"message": {
"role": "assistant",
"content": "\n\nThis is a test!"
},
"logprobs": null,
"finish_reason": "stop",
"index": 0
}
]
}
解析文本响应
如果您的API以文本响应,您可以使用 responseParser
属性设置一个JavaScript代码片段,该片段操作提供的 text
对象。
例如,此 responseParser
配置:
providers:
- id: 'https://example.com/api'
config:
# ...
responseParser: 'text.slice(11)'
从以下响应中提取消息内容 "hello world":
Assistant: hello world
查询参数
可以使用 queryParams
字段在提供者配置中指定查询参数。这些参数将作为GET参数附加到URL中。
providers:
- id: 'https://example.com/search'
config:
method: 'GET'
queryParams:
q: '{{prompt}}'
foo: 'bar'
作为库使用
如果你将 promptfoo 作为 Node 库 使用,你可以提供等效的提供者配置:
{
// ...
providers: [{
id: 'https://example.com/generate',
config: {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: {
foo: '{{bar}}',
},
responseParser: (json) => json.output,
}
}],
}
响应解析器
responseParser
选项允许你提取和转换 API 响应。如果没有指定 responseParser
,提供者将尝试将响应解析为 JSON。如果 JSON 解析失败,它将返回原始文本响应。
你可以通过在提供者配置中指定 responseParser
来覆盖此行为。responseParser
可以是以下之一:
- 包含 JavaScript 表达式的字符串
- 一个函数
- 一个文件路径(以
file://
为前缀)指向一个 JavaScript 模块
字符串解析器
你可以使用包含 JavaScript 表达式的字符串从响应中提取数据:
providers:
- id: 'https://example.com/api'
config:
responseParser: 'json.choices[0].message.content'
此表达式将在两个可用变量下进行评估:
json
:解析后的 JSON 响应(如果响应是有效的 JSON)text
:原始文本响应
函数解析器
当使用 promptfoo 作为 Node.js 库时,你可以提供一个函数作为响应解析器:
{
providers: [{
id: 'https://example.com/generate',
config: {
responseParser: (json, text) => {
// 自定义解析逻辑
return json.choices[0].message.content;
},
}
}],
}
基于文件的解析器
你可以通过指定带有 file://
前缀的文件路径,使用 JavaScript 文件作为响应解析器。文件路径相对于包含 promptfoo 配置文件的目录解析。
providers:
- id: 'https://example.com/api'
config:
responseParser: 'file://path/to/parser.js'
解析器文件应导出一个接受两个参数(json
和 text
)并返回解析输出的函数。例如:
module.exports = (json, text) => {
return json.choices[0].message.content;
};
你也可以使用默认导出:
export default (json, text) => {
return json.choices[0].message.content;
};
你还可以指定要从文件中导入的函数名称:
providers:
- id: 'https://example.com/api'
config:
responseParser: 'file://path/to/parser.js:parseResponse'
这将导入文件 path/to/parser.js
中的 parseResponse
函数。
参考
支持的配置选项:
选项 | 类型 | 描述 |
---|---|---|
url | 字符串 | 发送 HTTP 请求的 URL。如果未提供,将使用提供者的 id 作为 URL。 |
request | 字符串 | 要发送的原始 HTTP 请求。这将覆盖 url 、method 、headers 、body 和 queryParams 选项。 |
method | 字符串 | 请求使用的 HTTP 方法。如果未指定,默认为 'GET'。 |
headers | Record<string, string> | 要在请求中包含的 HTTP 头部的键值对。 |
body | Record<string, any> | 请求体。对于 POST 请求,这将作为 JSON 发送。 |
queryParams | Record<string, string> | 要附加到 URL 的查询参数的键值对。 |
responseParser | 字符串 | 函数 | 解析响应的函数、函数的字符串表示或文件路径(以 file:// 为前缀)。如果未提供,整个响应将作为输出返回。 |
注意:配置中的所有字符串值(包括嵌套在 headers 、body 和 queryParams 中的值)都支持 Nunjucks 模板。这意味着你可以使用 {{prompt}} 变量或测试上下文中传递的任何其他变量。 |
除了完整的 URL 外,提供者 id
字段还接受 http
或 https
作为值。