Skip to main content

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" 字段

在此示例中:

  1. request 属性包含一个原始HTTP请求,包括方法、路径、标头和正文。
  2. 您可以在原始请求中使用模板变量,如 {{api_key}}{{prompt}}。这些将在发送请求时替换为实际值。
  3. 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 可以是以下之一:

  1. 包含 JavaScript 表达式的字符串
  2. 一个函数
  3. 一个文件路径(以 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'

解析器文件应导出一个接受两个参数(jsontext)并返回解析输出的函数。例如:

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 请求。这将覆盖 urlmethodheadersbodyqueryParams 选项。
method字符串请求使用的 HTTP 方法。如果未指定,默认为 'GET'。
headersRecord<string, string>要在请求中包含的 HTTP 头部的键值对。
bodyRecord<string, any>请求体。对于 POST 请求,这将作为 JSON 发送。
queryParamsRecord<string, string>要附加到 URL 的查询参数的键值对。
responseParser字符串 | 函数解析响应的函数、函数的字符串表示或文件路径(以 file:// 为前缀)。如果未提供,整个响应将作为输出返回。
注意:配置中的所有字符串值(包括嵌套在 headersbodyqueryParams 中的值)都支持 Nunjucks 模板。这意味着你可以使用 {{prompt}} 变量或测试上下文中传递的任何其他变量。

除了完整的 URL 外,提供者 id 字段还接受 httphttps 作为值。