文件输入的支持情况取决于 API 端点。Responses API 接受下列文件类型作为 input_file 项。Chat Completions 仅接受 PDF 文件作为 file 内容部分。
| 输入方式 | Responses API | Chat Completions |
|---|
Base64 编码的文件数据(file_data) | 下列支持的文件类型 | 仅限 PDF |
已上传文件的 ID(file_id) | 下列支持的文件类型 | 仅限 PDF |
外部文件 URL(file_url) | 下列支持的文件类型 | 不支持 |
对于非 PDF 文件输入,请使用 Responses API。要在 Chat Completions 中使用文件中的文本,请在您的应用中读取文件,并将其内容作为 text 内容部分发送。
在 Responses API 中,input_file 的处理方式取决于文件类型:
- PDF 文件:对于具有视觉能力的模型(例如
gpt-4o 及更新的模型),API 会提取文本和页面图像,并将两者一并发送给模型。
- 非 PDF 文档和文本文件 (例如
.docx、.pptx、.txt 和代码文件):API 仅提取文本。
- 电子表格文件 (例如
.xlsx、.csv、.tsv):API 会运行专门针对电子表格的增强流程(详见下文)。
如果以下相关工具更适合您的任务,请使用它们:
- 使用文件搜索来检索大型文件,而不是将这些文件直接作为
input_file 传入。
- 对于需要详细分析且涉及大量电子表格处理的任务,例如聚合、连接、绘图或自定义计算,请使用托管式 Shell。
对于非 PDF 文件,Responses API 不会将其中嵌入的图像或图表提取到
模型上下文中。
为保留图表和示意图的细节,请先将文件转换为 PDF,然后
将 PDF 作为 input_file 发送。
对于电子表格类文件(例如 .xlsx、.xls、.csv、.tsv 和
.iif),Responses API 会采用专门针对电子表格的增强流程。
API 不会将整个工作表传给模型,而是最多解析每个工作表的前 1,000 行,
并添加模型生成的摘要和表头元数据,
让模型能够基于更精简的结构化数据视图开展工作。
对于 Responses API 中的 PDF 输入,可将 input_file 项中的可选 detail 字段
设为 auto、low 或 high,以控制 API 处理
页面图像的方式。如果省略,detail 默认为 auto。对于 GPT-5.6 及更新的
模型,auto 使用 high;对于更早的模型,则使用 low。使用 low 可减少
输入 Token 用量;使用 high 则可获取更多视觉细节,例如密集图表、小字号文字
或示意图中的细节。
detail 设置仅影响 PDF 页面图像的处理。从 PDF 中提取的文本
仍会包含在内。Chat Completions 的文件输入不支持 detail。
以下是一个明确指定高细节级别的最简 Responses API 请求体:
1234567891011121314151617181920{
"model": "gpt-4.1",
"input": [
{
"role": "user",
"content": [
{
"type": "input_file",
"filename": "document.pdf",
"file_data": "data:application/pdf;base64,...",
"detail": "high"
},
{
"type": "input_text",
"text": "Summarize this document."
}
]
}
]
}
下表列出了 Responses API 接受作为
input_file 项的常见文件类型。扩展名和 MIME 类型的完整列表见
本页后文。Chat Completions 仅支持 .pdf(application/pdf),无论使用
file_data 还是 file_id。
| 类别 | 常见扩展名 |
|---|
| PDF 文件 | .pdf |
| 文本和代码 | .txt、.md、.json、.html、.xml、代码文件 |
| 富文本文档 | .doc、.docx、.rtf、.odt |
| 演示文稿 | .ppt、.pptx |
| 电子表格 | .csv、.xls、.xlsx |
您可以通过外部 URL 链接提供文件输入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import OpenAI from "openai";
const client = new OpenAI();
const response = await client.responses.create({
model: "gpt-6-astra",
input: [
{
role: "user",
content: [
{
type: "input_text",
text: "Analyze the letter and provide a summary of the key points.",
},
{
type: "input_file",
file_url: "https://www.berkshirehathaway.com/letters/2024ltr.pdf",
},
],
},
],
});
console.log(response.output_text);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-6-astra",
input=[
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Analyze the letter and provide a summary of the key points.",
},
{
"type": "input_file",
"file_url": "https://www.berkshirehathaway.com/letters/2024ltr.pdf",
},
],
},
],
)
print(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Input: responses.ResponseNewParamsInputUnion{
OfInputItemList: responses.ResponseInputParam{
responses.ResponseInputItemParamOfMessage(
responses.ResponseInputMessageContentListParam{
responses.ResponseInputContentParamOfInputText(
"Analyze the letter and provide a summary of the key points.",
),
{
OfInputFile: &responses.ResponseInputFileParam{
FileURL: openai.String(
"https://www.berkshirehathaway.com/letters/2024ltr.pdf",
),
},
},
},
responses.EasyInputMessageRoleUser,
),
},
},
})
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.responses.ResponseCreateParams;
import com.openai.models.responses.ResponseInputFile;
import com.openai.models.responses.ResponseInputItem;
import java.util.List;
ResponseCreateParams params =
ResponseCreateParams.builder()
.model("gpt-6-astra")
.inputOfResponse(
List.of(
ResponseInputItem.ofMessage(
ResponseInputItem.Message.builder()
.role(ResponseInputItem.Message.Role.USER)
.addInputTextContent(
"Analyze the letter and provide a summary of the key points.")
.addContent(
ResponseInputFile.builder()
.fileUrl(
"https://www.berkshirehathaway.com/letters/2024ltr.pdf")
.build())
.build())))
.build();
client.responses().create(params).output().stream()
.flatMap(item -> item.message().stream())
.flatMap(message -> message.content().stream())
.flatMap(content -> content.outputText().stream())
.forEach(text -> System.out.println(text.text()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
Uri fileUrl = new(
"https://www.berkshirehathaway.com/letters/2024ltr.pdf"
);
ResponseResult response = await client.CreateResponseAsync(
"gpt-6-astra",
[
ResponseItem.CreateUserMessageItem(
[
ResponseContentPart.CreateInputTextPart(
"Analyze the letter and provide a summary of the key points."
),
ResponseContentPart.CreateInputFilePart(fileUrl),
]
),
]
);
Console.WriteLine(response.GetOutputText());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24require "openai"
openai = OpenAI::Client.new
response = openai.responses.create(
model: "gpt-6-astra",
input: [
{
role: "user",
content: [
{
type: "input_text",
text: "Analyze the letter and provide a summary of the key points."
},
{
type: "input_file",
file_url: "https://www.berkshirehathaway.com/letters/2024ltr.pdf"
}
]
}
]
)
puts(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21curl "https://api.openai.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"input": [
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Analyze the letter and provide a summary of the key points."
},
{
"type": "input_file",
"file_url": "https://www.berkshirehathaway.com/letters/2024ltr.pdf"
}
]
}
]
}'
Chat Completions 不支持文件 URL。如需使用此方式,请使用 Responses API。
以下示例使用 Files API 上传文件,然后在发送给模型的请求中引用该文件的 ID。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import fs from "fs";
import OpenAI from "openai";
const client = new OpenAI();
const file = await client.files.create({
file: fs.createReadStream("fixtures/draconomicon.pdf"),
purpose: "user_data",
});
const response = await client.responses.create({
model: "gpt-6-astra",
input: [
{
role: "user",
content: [
{
type: "input_file",
file_id: file.id,
},
{
type: "input_text",
text: "What is the first dragon in the book?",
},
],
},
],
});
console.log(response.output_text);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26from openai import OpenAI
client = OpenAI()
file = client.files.create(file=open("draconomicon.pdf", "rb"), purpose="user_data")
response = client.responses.create(
model="gpt-6-astra",
input=[
{
"role": "user",
"content": [
{
"type": "input_file",
"file_id": file.id,
},
{
"type": "input_text",
"text": "What is the first dragon in the book?",
},
],
}
],
)
print(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
file, err := os.Open("draconomicon.pdf")
if err != nil {
panic(err)
}
defer file.Close()
uploadedFile, err := client.Files.New(context.Background(), openai.FileNewParams{
File: file,
Purpose: openai.FilePurposeUserData,
})
if err != nil {
panic(err)
}
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Input: responses.ResponseNewParamsInputUnion{
OfInputItemList: responses.ResponseInputParam{
responses.ResponseInputItemParamOfMessage(
responses.ResponseInputMessageContentListParam{
{
OfInputFile: &responses.ResponseInputFileParam{
FileID: openai.String(uploadedFile.ID),
},
},
responses.ResponseInputContentParamOfInputText(
"What is the first dragon in the book?",
),
},
responses.EasyInputMessageRoleUser,
),
},
},
})
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.files.FileCreateParams;
import com.openai.models.files.FilePurpose;
import com.openai.models.responses.ResponseCreateParams;
import com.openai.models.responses.ResponseInputFile;
import com.openai.models.responses.ResponseInputItem;
import java.nio.file.Path;
import java.util.List;
var file =
client
.files()
.create(
FileCreateParams.builder()
.file(Path.of(System.getenv("OPENAI_EXAMPLE_FILE_PATH")))
.purpose(FilePurpose.USER_DATA)
.build());
var response =
client
.responses()
.create(
ResponseCreateParams.builder()
.model("gpt-6-astra")
.inputOfResponse(
List.of(
ResponseInputItem.ofMessage(
ResponseInputItem.Message.builder()
.role(ResponseInputItem.Message.Role.USER)
.addContent(
ResponseInputFile.builder().fileId(file.id()).build())
.addInputTextContent("What is the first dragon in the book?")
.build())))
.build());
response.output().stream()
.flatMap(item -> item.message().stream())
.flatMap(message -> message.content().stream())
.flatMap(content -> content.outputText().stream())
.forEach(text -> System.out.println(text.text()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29using OpenAI.Files;
using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
OpenAIFileClient files = new(key);
OpenAIFile file = await files.UploadFileAsync(
"draconomicon.pdf",
FileUploadPurpose.UserData
);
ResponseResult response = await client.CreateResponseAsync(
"gpt-6-astra",
[
ResponseItem.CreateUserMessageItem(
[
ResponseContentPart.CreateInputFilePart(file.Id),
ResponseContentPart.CreateInputTextPart(
"What is the first dragon in the book?"
),
]
),
]
);
Console.WriteLine(response.GetOutputText());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30require "openai"
require "pathname"
openai = OpenAI::Client.new
file = openai.files.create(
file: Pathname("draconomicon.pdf"),
purpose: "user_data"
)
response = openai.responses.create(
model: "gpt-6-astra",
input: [
{
role: "user",
content: [
{
type: "input_file",
file_id: file.id
},
{
type: "input_text",
text: "What is the first dragon in the book?"
}
]
}
]
)
puts(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26curl https://api.openai.com/v1/files \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F purpose="user_data" \
-F file="@draconomicon.pdf"
curl "https://api.openai.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"input": [
{
"role": "user",
"content": [
{
"type": "input_file",
"file_id": "file-6F2ksmvXxt4VdoqmHRw6kL"
},
{
"type": "input_text",
"text": "What is the first dragon in the book?"
}
]
}
]
}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31import fs from "fs";
import OpenAI from "openai";
const client = new OpenAI();
const file = await client.files.create({
file: fs.createReadStream("fixtures/draconomicon.pdf"),
purpose: "user_data",
});
const completion = await client.chat.completions.create({
model: "gpt-6-astra",
messages: [
{
role: "user",
content: [
{
type: "file",
file: {
file_id: file.id,
},
},
{
type: "text",
text: "What is the first dragon in the book?",
},
],
},
],
});
console.log(completion.choices[0].message.content);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from openai import OpenAI
client = OpenAI()
file = client.files.create(file=open("draconomicon.pdf", "rb"), purpose="user_data")
completion = client.chat.completions.create(
model="gpt-6-astra",
messages=[
{
"role": "user",
"content": [
{
"type": "file",
"file": {
"file_id": file.id,
},
},
{
"type": "text",
"text": "What is the first dragon in the book?",
},
],
}
],
)
print(completion.choices[0].message.content)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go/v3"
)
func main() {
client := openai.NewClient()
file, err := os.Open("draconomicon.pdf")
if err != nil {
panic(err)
}
defer file.Close()
uploadedFile, err := client.Files.New(context.Background(), openai.FileNewParams{
File: file,
Purpose: openai.FilePurposeUserData,
})
if err != nil {
panic(err)
}
completion, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: "gpt-6-astra",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{
openai.FileContentPart(openai.ChatCompletionContentPartFileFileParam{
FileID: openai.String(uploadedFile.ID),
}),
openai.TextContentPart("What is the first dragon in the book?"),
}),
},
})
if err != nil {
panic(err)
}
fmt.Println(completion.Choices[0].Message.Content)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletionContentPart;
import com.openai.models.chat.completions.ChatCompletionContentPartText;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
import com.openai.models.chat.completions.ChatCompletionUserMessageParam;
import com.openai.models.files.FileCreateParams;
import com.openai.models.files.FilePurpose;
import java.nio.file.Path;
import java.util.List;
var file =
client
.files()
.create(
FileCreateParams.builder()
.file(Path.of(System.getenv("OPENAI_EXAMPLE_FILE_PATH")))
.purpose(FilePurpose.USER_DATA)
.build());
var filePart =
ChatCompletionContentPart.ofFile(
ChatCompletionContentPart.File.builder()
.file(ChatCompletionContentPart.File.FileObject.builder().fileId(file.id()).build())
.build());
var textPart =
ChatCompletionContentPart.ofText(
ChatCompletionContentPartText.builder().text("Summarize this PDF.").build());
var completion =
client
.chat()
.completions()
.create(
ChatCompletionCreateParams.builder()
.model("gpt-6-astra")
.addMessage(
ChatCompletionUserMessageParam.builder()
.contentOfArrayOfContentParts(List.of(filePart, textPart))
.build())
.build());
completion.choices().stream()
.flatMap(choice -> choice.message().content().stream())
.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22using OpenAI.Chat;
using OpenAI.Files;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
string model = "gpt-6-astra";
ChatClient client = new(model, key);
OpenAIFileClient files = new(key);
OpenAIFile file = await files.UploadFileAsync("draconomicon.pdf", FileUploadPurpose.UserData);
ChatCompletion completion = await client.CompleteChatAsync(
new UserChatMessage(
[
ChatMessageContentPart.CreateFilePart(file.Id),
ChatMessageContentPart.CreateTextPart("What is the first dragon in the book?"),
]
)
);
Console.WriteLine(completion.Content[0].Text);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28require "openai"
require "pathname"
client = OpenAI::Client.new
file = client.files.create(
file: Pathname("draconomicon.pdf"),
purpose: :user_data
)
completion = client.chat.completions.create(
model: "gpt-6-astra",
messages: [
{
role: :user,
content: [
{
type: :file,
file: { file_id: file.id }
},
{
type: :text,
text: "Summarize this PDF."
}
]
}
]
)
puts(completion.choices.fetch(0).message.content)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28curl https://api.openai.com/v1/files \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F purpose="user_data" \
-F file="@draconomicon.pdf"
curl "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"messages": [
{
"role": "user",
"content": [
{
"type": "file",
"file": {
"file_id": "file-6F2ksmvXxt4VdoqmHRw6kL"
}
},
{
"type": "text",
"text": "What is the first dragon in the book?"
}
]
}
]
}'
您也可以将文件输入作为 Base64 编码的文件数据发送。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import fs from "fs";
import OpenAI from "openai";
const client = new OpenAI();
const data = fs.readFileSync("fixtures/draconomicon.pdf");
const base64String = data.toString("base64");
const response = await client.responses.create({
model: "gpt-6-astra",
input: [
{
role: "user",
content: [
{
type: "input_file",
filename: "draconomicon.pdf",
file_data: `data:application/pdf;base64,${base64String}`,
},
{
type: "input_text",
text: "What is the first dragon in the book?",
},
],
},
],
});
console.log(response.output_text);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31import base64
from openai import OpenAI
client = OpenAI()
with open("draconomicon.pdf", "rb") as f:
data = f.read()
base64_string = base64.b64encode(data).decode("utf-8")
response = client.responses.create(
model="gpt-6-astra",
input=[
{
"role": "user",
"content": [
{
"type": "input_file",
"filename": "draconomicon.pdf",
"file_data": f"data:application/pdf;base64,{base64_string}",
},
{
"type": "input_text",
"text": "What is the first dragon in the book?",
},
],
},
],
)
print(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48package main
import (
"context"
"encoding/base64"
"fmt"
"os"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
data, err := os.ReadFile("draconomicon.pdf")
if err != nil {
panic(err)
}
fileData := "data:application/pdf;base64," + base64.StdEncoding.EncodeToString(data)
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Input: responses.ResponseNewParamsInputUnion{
OfInputItemList: responses.ResponseInputParam{
responses.ResponseInputItemParamOfMessage(
responses.ResponseInputMessageContentListParam{
{
OfInputFile: &responses.ResponseInputFileParam{
Filename: openai.String("draconomicon.pdf"),
FileData: openai.String(fileData),
},
},
responses.ResponseInputContentParamOfInputText(
"What is the first dragon in the book?",
),
},
responses.EasyInputMessageRoleUser,
),
},
},
})
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.responses.ResponseCreateParams;
import com.openai.models.responses.ResponseInputFile;
import com.openai.models.responses.ResponseInputItem;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import java.util.List;
String pdfData =
Base64.getEncoder()
.encodeToString(Files.readAllBytes(Path.of(System.getenv("OPENAI_EXAMPLE_FILE_PATH"))));
ResponseCreateParams params =
ResponseCreateParams.builder()
.model("gpt-6-astra")
.inputOfResponse(
List.of(
ResponseInputItem.ofMessage(
ResponseInputItem.Message.builder()
.role(ResponseInputItem.Message.Role.USER)
.addContent(
ResponseInputFile.builder()
.filename("document.pdf")
.fileData("data:application/pdf;base64," + pdfData)
.build())
.addInputTextContent("Summarize this document.")
.build())))
.build();
client.responses().create(params).output().stream()
.flatMap(item -> item.message().stream())
.flatMap(message -> message.content().stream())
.flatMap(content -> content.outputText().stream())
.forEach(text -> System.out.println(text.text()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
BinaryData fileBytes = BinaryData.FromBytes(await File.ReadAllBytesAsync("draconomicon.pdf"));
ResponseResult response = await client.CreateResponseAsync(
"gpt-6-astra",
[
ResponseItem.CreateUserMessageItem(
[
ResponseContentPart.CreateInputFilePart(
fileBytes,
"application/pdf",
"draconomicon.pdf"
),
ResponseContentPart.CreateInputTextPart(
"What is the first dragon in the book?"
),
]
),
]
);
Console.WriteLine(response.GetOutputText());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26require "base64"
require "openai"
client = OpenAI::Client.new
pdf_data = Base64.strict_encode64(File.binread("draconomicon.pdf"))
response = client.responses.create(
model: "gpt-6-astra",
input: [
{
role: :user,
content: [
{
type: :input_file,
filename: "document.pdf",
file_data: "data:application/pdf;base64,#{pdf_data}"
},
{
type: :input_text,
text: "Summarize this document."
}
]
}
]
)
puts(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22curl "https://api.openai.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"input": [
{
"role": "user",
"content": [
{
"type": "input_file",
"filename": "draconomicon.pdf",
"file_data": "...base64 encoded PDF bytes here..."
},
{
"type": "input_text",
"text": "What is the first dragon in the book?"
}
]
}
]
}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30import fs from "fs";
import OpenAI from "openai";
const client = new OpenAI();
const data = fs.readFileSync("fixtures/draconomicon.pdf");
const base64String = data.toString("base64");
const completion = await client.chat.completions.create({
model: "gpt-6-astra",
messages: [
{
role: "user",
content: [
{
type: "file",
file: {
filename: "draconomicon.pdf",
file_data: `data:application/pdf;base64,${base64String}`,
},
},
{
type: "text",
text: "What is the first dragon in the book?",
},
],
},
],
});
console.log(completion.choices[0].message.content);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33import base64
from openai import OpenAI
client = OpenAI()
with open("draconomicon.pdf", "rb") as f:
data = f.read()
base64_string = base64.b64encode(data).decode("utf-8")
completion = client.chat.completions.create(
model="gpt-6-astra",
messages=[
{
"role": "user",
"content": [
{
"type": "file",
"file": {
"filename": "draconomicon.pdf",
"file_data": f"data:application/pdf;base64,{base64_string}",
},
},
{
"type": "text",
"text": "What is the first dragon in the book?",
},
],
},
],
)
print(completion.choices[0].message.content)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38package main
import (
"context"
"encoding/base64"
"fmt"
"os"
"github.com/openai/openai-go/v3"
)
func main() {
client := openai.NewClient()
data, err := os.ReadFile("draconomicon.pdf")
if err != nil {
panic(err)
}
fileData := "data:application/pdf;base64," + base64.StdEncoding.EncodeToString(data)
completion, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: "gpt-6-astra",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{
openai.FileContentPart(openai.ChatCompletionContentPartFileFileParam{
Filename: openai.String("draconomicon.pdf"),
FileData: openai.String(fileData),
}),
openai.TextContentPart("What is the first dragon in the book?"),
}),
},
})
if err != nil {
panic(err)
}
fmt.Println(completion.Choices[0].Message.Content)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletionContentPart;
import com.openai.models.chat.completions.ChatCompletionContentPartText;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
import com.openai.models.chat.completions.ChatCompletionUserMessageParam;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import java.util.List;
String encoded =
Base64.getEncoder()
.encodeToString(Files.readAllBytes(Path.of(System.getenv("OPENAI_EXAMPLE_FILE_PATH"))));
ChatCompletionContentPart file =
ChatCompletionContentPart.ofFile(
ChatCompletionContentPart.File.builder()
.file(
ChatCompletionContentPart.File.FileObject.builder()
.filename("document.pdf")
.fileData("data:application/pdf;base64," + encoded)
.build())
.build());
ChatCompletionContentPart text =
ChatCompletionContentPart.ofText(
ChatCompletionContentPartText.builder().text("Summarize this document.").build());
ChatCompletionCreateParams params =
ChatCompletionCreateParams.builder()
.model("gpt-6-astra")
.addMessage(
ChatCompletionUserMessageParam.builder()
.contentOfArrayOfContentParts(List.of(file, text))
.build())
.build();
client.chat().completions().create(params).choices().stream()
.flatMap(choice -> choice.message().content().stream())
.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22using OpenAI.Chat;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
string model = "gpt-6-astra";
ChatClient client = new(model, key);
BinaryData fileBytes = BinaryData.FromBytes(await File.ReadAllBytesAsync("draconomicon.pdf"));
ChatCompletion completion = await client.CompleteChatAsync(
new UserChatMessage(
[
ChatMessageContentPart.CreateFilePart(
fileBytes,
"application/pdf",
"draconomicon.pdf"
),
ChatMessageContentPart.CreateTextPart("What is the first dragon in the book?"),
]
)
);
Console.WriteLine(completion.Content[0].Text);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28require "base64"
require "openai"
client = OpenAI::Client.new
pdf_data = Base64.strict_encode64(File.binread("draconomicon.pdf"))
completion = client.chat.completions.create(
model: "gpt-6-astra",
messages: [
{
role: :user,
content: [
{
type: :file,
file: {
filename: "document.pdf",
file_data: "data:application/pdf;base64,#{pdf_data}"
}
},
{
type: :text,
text: "Summarize this document."
}
]
}
]
)
puts(completion.choices.fetch(0).message.content)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24curl "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"messages": [
{
"role": "user",
"content": [
{
"type": "file",
"file": {
"filename": "draconomicon.pdf",
"file_data": "...base64 encoded bytes here..."
}
},
{
"type": "text",
"text": "What is the first dragon in the book?"
}
]
}
]
}'
使用文件输入时,请注意以下限制:
- Token 用量: PDF 解析会将提取的文本和页面图像都包含在上下文中,这可能会增加 Token 用量。在 Responses API 中,可将
detail 设为 auto(默认值)、low 或 high,以控制 PDF 页面图像的视觉细节量。在大规模部署之前,请了解定价和对 Token 用量的影响。了解更多定价信息。
- 文件大小限制: 单个请求可以包含多个文件,但每个文件必须小于 50 MB。请求中所有文件的总大小上限为 50 MB。
- 支持的模型: 同时包含文本和页面图像的 PDF 解析需要具有视觉能力的模型,例如
gpt-4o 及更新的模型。
- 文件上传用途: 您可以使用任何受支持的用途上传文件,但对于计划作为模型输入传入的文件,请使用
user_data。
此列表适用于 Responses API。Chat Completions 仅支持 .pdf
(application/pdf),无论使用 file_data 还是 file_id。
| 类别 | 扩展名 | MIME 类型 |
|---|
| PDF 文件 | PDF 文件(.pdf) | application/pdf |
| 电子表格 | Excel 工作表(.xla、.xlb、.xlc、.xlm、.xls、.xlsx、.xlt、.xlw) | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet、application/vnd.ms-excel |
| 电子表格 | CSV / TSV / IIF(.csv、.tsv、.iif)、Google Sheets | text/csv、application/csv、text/tsv、text/x-iif、application/x-iif、application/vnd.google-apps.spreadsheet |
| 富文本文档 | Word/ODT/RTF 文档(.doc、.docx、.dot、.odt、.rtf)、Pages、Google Docs | application/vnd.openxmlformats-officedocument.wordprocessingml.document、application/msword、application/rtf、text/rtf、application/vnd.oasis.opendocument.text、application/vnd.apple.pages、application/vnd.google-apps.document、application/vnd.apple.iwork |
| 演示文稿 | PowerPoint 幻灯片(.pot、.ppa、.pps、.ppt、.pptx、.pwz、.wiz)、Keynote、Google Slides | application/vnd.openxmlformats-officedocument.presentationml.presentation、application/vnd.ms-powerpoint、application/vnd.apple.keynote、application/vnd.google-apps.presentation、application/vnd.apple.iwork |
| 文本和代码 | 文本/代码格式(.asm、.bat、.c、.cc、.conf、.cpp、.css、.cxx、.def、.dic、.eml、.h、.hh、.htm、.html、.ics、.ifb、.in、.js、.json、.ksh、.list、.log、.markdown、.md、.mht、.mhtml、.mime、.mjs、.nws、.pl、.py、.rst、.s、.sql、.srt、.text、.txt、.vcf、.vtt、.xml) | application/javascript、application/typescript、text/xml、text/x-shellscript、text/x-rst、text/x-makefile、text/x-lisp、text/x-asm、text/vbscript、text/css、message/rfc822、application/x-sql、application/x-scala、application/x-rust、application/x-powershell、text/x-diff、text/x-patch、application/x-patch、text/plain、text/markdown、text/x-java、text/x-script.python、text/x-python、text/x-c、text/x-c++、text/x-golang、text/html、text/x-php、application/x-php、application/x-httpd-php、application/x-httpd-php-source、text/x-ruby、text/x-sh、text/x-bash、application/x-bash、text/x-zsh、text/x-tex、text/x-csharp、application/json、text/x-typescript、text/javascript、text/x-go、text/x-rust、text/x-scala、text/x-kotlin、text/x-swift、text/x-lua、text/x-r、text/x-R、text/x-julia、text/x-perl、text/x-objectivec、text/x-objectivec++、text/x-erlang、text/x-elixir、text/x-haskell、text/x-clojure、text/x-groovy、text/x-dart、text/x-awk、application/x-awk、text/jsx、text/tsx、text/x-handlebars、text/x-mustache、text/x-ejs、text/x-jinja2、text/x-liquid、text/x-erb、text/x-twig、text/x-pug、text/x-jade、text/x-tmpl、text/x-cmake、text/x-dockerfile、text/x-gradle、text/x-ini、text/x-properties、text/x-protobuf、application/x-protobuf、text/x-sql、text/x-sass、text/x-scss、text/x-less、text/x-hcl、text/x-terraform、application/x-terraform、text/x-toml、application/x-toml、application/graphql、application/x-graphql、text/x-graphql、application/x-ndjson、application/json5、application/x-json5、text/x-yaml、application/toml、application/x-yaml、application/yaml、text/x-astro、text/srt、application/x-subrip、text/x-subrip、text/vtt、text/x-vcard、text/calendar |
接下来,您可以探索以下资源: