从写代码,到创作下一幕

探索 字节跳动 - 火山方舟 的 AI 编程与视频创作活动。

火山方舟 Agent Plan 与 Coding Plan 活动,价格 ¥9.9 起

Agent Plan & Coding Plan

一站体验多款热门模型,为 AI 编程与智能体开发提供更多选择。新用户可联系(微信: goo_lvyouyou)免费体验 9.9 agent plan。

查看套餐优惠
Seedance 2.5 视频创作活动:30 秒视频、多模态参考、局部编辑

Seedance 2.5

让创意,跃然成片。探索 30 秒视频、多模态参考与局部编辑,把脑海中的画面变成下一支作品。

探索视频创作

文件与集合

管理文件

查看 Markdown

Files API 提供完整的文件管理操作。如果文件可公开访问,可以在聊天对话中直接通过 URL 引用,请参阅 附加文件。对于无法公开访问的文件,请使用下述任一方式上传。

也可以在 xAI Console 的 Files 页面查看和管理所有已上传文件。


上传文件

可以通过多种方式上传文件:文件路径、原始字节、BytesIO 对象或打开的文件句柄。

从文件路径上传

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("XAI_API_KEY"),
    base_url="https://api.x.ai/v1",
)

# Upload a file
with open("/path/to/your/document.pdf", "rb") as f:
    file = client.files.create(
        file=f,
        purpose="assistants"
    )

print(f"File ID: {file.id}")
print(f"Filename: {file.filename}")

从字节上传

Python

import os
from xai_sdk import Client

client = Client(api_key=os.getenv("XAI_API_KEY"))

# Upload file content directly from bytes
content = b"This is my document content.\\nIt can span multiple lines."
file = client.files.upload(content, filename="document.txt")

print(f"File ID: {file.id}")
print(f"Filename: {file.filename}")

从文件对象上传

Python

import os
from xai_sdk import Client

client = Client(api_key=os.getenv("XAI_API_KEY"))

# Upload a file directly from disk
file = client.files.upload(open("document.pdf", "rb"), filename="document.pdf")

print(f"File ID: {file.id}")
print(f"Filename: {file.filename}")

上传并设置过期时间(TTL)

文件默认永久存储,直到手动删除。如需平台在固定时间窗口后自动删除文件,请在上传时设置 expires_after。这适用于短期附件、临时会话数据和合规时间窗口。

工作原理

expires_after 以秒为单位,从上传时间开始计算。取值必须介于 3600(1 小时)和 2592000(30 天)之间(包含边界)。省略该字段则永久保留文件。

响应中包含 expires_at,即文件被删除的绝对 UTC 时间戳。超过该时间后,文件即被删除:不再出现在列表响应中,获取其元数据或内容会返回 not found,也无法再通过 id 在聊天附件中引用。

也可以在 TTL 到期前随时手动删除文件。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("XAI_API_KEY"),
    base_url="https://api.x.ai/v1",
)

# expires_after follows the OpenAI shape: an object anchored at "created_at".
with open("/path/to/document.pdf", "rb") as f:
    file = client.files.create(
        file=f,
        purpose="assistants",
        expires_after={"anchor": "created_at", "seconds": 86400},  # 24 hours
    )

print(f"File ID: {file.id}")
print(f"Expires at: {file.expires_at}")  # Unix seconds, 24h from now

上传并追踪进度

使用回调或进度条跟踪大文件的上传进度。

Python

import os
from xai_sdk import Client

client = Client(api_key=os.getenv("XAI_API_KEY"))

# Define a custom progress callback
def progress_callback(bytes_uploaded: int, total_bytes: int):
    percentage = (bytes_uploaded / total_bytes) * 100 if total_bytes else 0
    mb_uploaded = bytes_uploaded / (1024 * 1024)
    mb_total = total_bytes / (1024 * 1024)
    print(f"Progress: {mb_uploaded:.2f}/{mb_total:.2f} MB ({percentage:.1f}%)")

# Upload with progress tracking
file = client.files.upload(
    "/path/to/large-file.pdf",
    on_progress=progress_callback
)

print(f"Successfully uploaded: {file.filename}")

列出文件

使用分页和排序选项获取已上传文件列表。

可用选项

  • limit:返回文件的最大数量。未指定时使用服务器默认值 100,最大值为 100。

  • order:排序方式,可为 "asc"(升序)或 "desc"(降序)。默认为 "desc"。

  • sort_by:排序字段。可选值:"created_at"、"filename" 或 "size"。默认为 "filename"。

  • pagination_token:传入上一次响应返回的 pagination_token 以获取下一页。第一页请省略该参数。

还有更多文件时,响应会包含 pagination_token。在最后一页,该值为 null 或空值。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("XAI_API_KEY"),
    base_url="https://api.x.ai/v1",
)

# List files
files = client.files.list()

for file in files.data:
    print(f"File: {file.filename} (ID: {file.id})")

遍历所有文件页面

List endpoint 每次调用最多返回 limit 个文件(上限 100)。要枚举所有文件,请使用上一次响应中的 pagination_token 持续调用该端点,直到响应不再包含分页令牌。

import os
import requests

url = "https://api.x.ai/v1/files"
headers = {"Authorization": f"Bearer {os.getenv('XAI_API_KEY')}"}

page_size = 100
params = {"limit": page_size, "order": "desc", "sort_by": "created_at"}
all_files = []

while True:
    response = requests.get(url, headers=headers, params=params).json()
    all_files.extend(response.get("data", []))
    if not response.get("pagination_token"):
        break
    params["pagination_token"] = response["pagination_token"]

print(f"Total files: {len(all_files)}")

获取文件元数据

获取特定文件的详细信息。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("XAI_API_KEY"),
    base_url="https://api.x.ai/v1",
)

# Get file metadata
file = client.files.retrieve("file-abc123")

print(f"Filename: {file.filename}")
print(f"Size: {file.bytes} bytes")
# Unix seconds, or None if the file does not expire.
print(f"Expires at: {file.expires_at}")

获取文件内容

下载已上传文件的原始字节。该 endpoint 会流式传输响应,因此可处理任意受支持大小的文件,而无需在 API 层将整个负载缓冲到内存中。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("XAI_API_KEY"),
    base_url="https://api.x.ai/v1",
)

# Stream content straight to disk
client.files.content("file-abc123").write_to_file("downloaded.pdf")

删除文件

不再需要文件时将其删除。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("XAI_API_KEY"),
    base_url="https://api.x.ai/v1",
)

# Delete a file
delete_response = client.files.delete("file-abc123")

print(f"Deleted: {delete_response.deleted}")
print(f"File ID: {delete_response.id}")

文件对象

所有返回元数据的 Files API endpoint(Upload、List、Get Metadata)都返回相同的 file 对象结构:

字段类型说明
idstring唯一文件标识符(例如 file_a128090d-f0c9-4873-bd84-e499777e7417)。在任何需要 file_id 的位置使用,包括聊天附件。
filenamestring上传时提供的原始文件名。
bytesinteger文件大小,单位为字节。
created_atinteger上传时间,以 Unix 时间戳(秒)表示。
expires_atinteger 或 null文件删除时间的 Unix 时间戳。永久文件为 null;上传文件时设置了 expires_after。
objectstring始终为 "file",用于 OpenAI 兼容性。
purposestring回显上传时发送的 purpose 值。SpaceXSI 不会强制要求或解释该字段;保存它只是为了兼容 OpenAI SDK。通常设置为 "assistants" 是惯常选择。

限制与注意事项

文件大小限制

  • 最大文件大小:每个文件 512 MB

  • 处理时间:较大的文件可能需要更长处理时间

文件保留

  • 清理:不再需要文件时将其删除,以管理存储空间

  • 访问:文件的范围限定为团队 / 组织

支持的格式

虽然支持许多基于文本的格式,但系统最适合处理:

  • 结构化文档(具有清晰的章节和标题)

  • 纯文本和 Markdown

  • 信息层级清晰的文档

支持的文件类型包括:

  • 纯文本文件(.txt)

  • Markdown 文件(.md)

  • 代码文件(.py、.js、.java 等)

  • CSV 文件(.csv)

  • JSON 文件(.json)

  • PDF 文档(.pdf)

  • 以及许多其他基于文本的格式


下一步


最后更新:2026 年 10 月 10 日