diff --git a/openapi/README.md b/openapi/README.md
index 82545bac..c61b6f5d 100644
--- a/openapi/README.md
+++ b/openapi/README.md
@@ -23,10 +23,10 @@ The reviewed generated surface includes these tags:
- core resources: Projects, Experiments, Datasets, Prompts, and Functions;
- access and organization resources: Acls, Groups, ProjectGroups, Roles, Users, Organizations,
- ApiKeys, and ServiceTokens;
+ ApiKeys, Ingest keys, and ServiceTokens;
- configuration resources: AiSecrets, EnvVars, Environments, and McpServers;
-- project resources: Agents, ProjectAutomations, OrgAutomations, ProjectScores, ProjectTags,
- SpanIframes, and Views; and
+- project resources: CustomColumns, ProjectAutomations, ProjectScores, ProjectTags, SpanIframes,
+ and Views; and
- versioned data resources: DatasetSnapshots.
Each tag produces one resource and operation registry. Models used by one resource stay in that
diff --git a/openapi/config.json b/openapi/config.json
index ed169d77..0673c367 100644
--- a/openapi/config.json
+++ b/openapi/config.json
@@ -3,8 +3,8 @@
"spec": {
"repository": "braintrustdata/braintrust-openapi",
"path": "openapi/spec.json",
- "commit": "3384e4be354ec957292f986fcf3e3a4009907651",
- "sha256": "cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44"
+ "commit": "4cc0615694512d6e77fce6bff2c70d1531208daa",
+ "sha256": "ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be"
},
"tools": {
"datamodel-code-generator": "0.81.0",
@@ -36,15 +36,15 @@
"Prompts",
"Functions",
"Acls",
- "Agents",
"AiSecrets",
"ApiKeys",
+ "CustomColumns",
"DatasetSnapshots",
"EnvVars",
"Environments",
"Groups",
+ "Ingest keys",
"McpServers",
- "OrgAutomations",
"Organizations",
"ProjectAutomations",
"ProjectGroups",
diff --git a/py/src/braintrust/api/README.md b/py/src/braintrust/api/README.md
index 211d64fe..dfdf6b9f 100644
--- a/py/src/braintrust/api/README.md
+++ b/py/src/braintrust/api/README.md
@@ -88,15 +88,15 @@ The table lists every reviewed generated method. Consult the method's Python sig
| `client.prompts` | `post_prompt` — `POST /v1/prompt`
`put_prompt` — `PUT /v1/prompt`
`get_prompt` — `GET /v1/prompt`
`get_prompt_id` — `GET /v1/prompt/{prompt_id}`
`patch_prompt_id` — `PATCH /v1/prompt/{prompt_id}`
`delete_prompt_id` — `DELETE /v1/prompt/{prompt_id}` |
| `client.functions` | `post_function` — `POST /v1/function`
`put_function` — `PUT /v1/function`
`get_function` — `GET /v1/function`
`get_function_id` — `GET /v1/function/{function_id}`
`patch_function_id` — `PATCH /v1/function/{function_id}`
`delete_function_id` — `DELETE /v1/function/{function_id}` |
| `client.acls` | `post_acl` — `POST /v1/acl`
`delete_acl` — `DELETE /v1/acl`
`get_acl` — `GET /v1/acl`
`get_acl_id` — `GET /v1/acl/{acl_id}`
`delete_acl_id` — `DELETE /v1/acl/{acl_id}`
`acl_batch_update` — `POST /v1/acl/batch_update`
`acl_list_org` — `GET /v1/acl/list_org` |
-| `client.agents` | `post_agent` — `POST /v1/agent`
`put_agent` — `PUT /v1/agent`
`get_agent` — `GET /v1/agent`
`get_agent_id` — `GET /v1/agent/{agent_id}`
`patch_agent_id` — `PATCH /v1/agent/{agent_id}`
`delete_agent_id` — `DELETE /v1/agent/{agent_id}` |
| `client.ai_secrets` | `post_ai_secret` — `POST /v1/ai_secret`
`put_ai_secret` — `PUT /v1/ai_secret`
`delete_ai_secret` — `DELETE /v1/ai_secret`
`get_ai_secret` — `GET /v1/ai_secret`
`get_ai_secret_id` — `GET /v1/ai_secret/{ai_secret_id}`
`patch_ai_secret_id` — `PATCH /v1/ai_secret/{ai_secret_id}`
`delete_ai_secret_id` — `DELETE /v1/ai_secret/{ai_secret_id}` |
| `client.api_keys` | `get_api_key` — `GET /v1/api_key`
`get_api_key_id` — `GET /v1/api_key/{api_key_id}`
`delete_api_key_id` — `DELETE /v1/api_key/{api_key_id}` |
+| `client.custom_columns` | `get_custom_column` — `GET /v1/column`
`post_custom_column` — `POST /v1/column`
`put_custom_column` — `PUT /v1/column`
`patch_custom_column_id` — `PATCH /v1/column/{column_id}`
`delete_custom_column_id` — `DELETE /v1/column/{column_id}` |
| `client.dataset_snapshots` | `post_dataset_snapshot` — `POST /v1/dataset_snapshot`
`put_dataset_snapshot` — `PUT /v1/dataset_snapshot`
`get_dataset_snapshot` — `GET /v1/dataset_snapshot`
`get_dataset_snapshot_id` — `GET /v1/dataset_snapshot/{dataset_snapshot_id}`
`patch_dataset_snapshot_id` — `PATCH /v1/dataset_snapshot/{dataset_snapshot_id}`
`delete_dataset_snapshot_id` — `DELETE /v1/dataset_snapshot/{dataset_snapshot_id}` |
| `client.env_vars` | `post_env_var` — `POST /v1/env_var`
`put_env_var` — `PUT /v1/env_var`
`get_env_var` — `GET /v1/env_var`
`get_env_var_id` — `GET /v1/env_var/{env_var_id}`
`patch_env_var_id` — `PATCH /v1/env_var/{env_var_id}`
`delete_env_var_id` — `DELETE /v1/env_var/{env_var_id}` |
| `client.environments` | `list_environments` — `GET /environment`
`create_environment` — `POST /environment`
`get_environment` — `GET /environment/{environment_id}`
`update_environment` — `PATCH /environment/{environment_id}`
`delete_environment` — `DELETE /environment/{environment_id}` |
| `client.groups` | `post_group` — `POST /v1/group`
`put_group` — `PUT /v1/group`
`get_group` — `GET /v1/group`
`get_group_id` — `GET /v1/group/{group_id}`
`patch_group_id` — `PATCH /v1/group/{group_id}`
`delete_group_id` — `DELETE /v1/group/{group_id}` |
+| `client.ingest_keys` | `create_ingest_key` — `POST /v1/ingest_key`
`list_ingest_keys` — `GET /v1/ingest_key`
`delete_ingest_key` — `DELETE /v1/ingest_key/{id}` |
| `client.mcp_servers` | `post_mcp_server` — `POST /v1/mcp_server`
`put_mcp_server` — `PUT /v1/mcp_server`
`get_mcp_server` — `GET /v1/mcp_server`
`get_mcp_server_id` — `GET /v1/mcp_server/{mcp_server_id}`
`patch_mcp_server_id` — `PATCH /v1/mcp_server/{mcp_server_id}`
`delete_mcp_server_id` — `DELETE /v1/mcp_server/{mcp_server_id}` |
-| `client.org_automations` | `post_org_automation` — `POST /v1/org_automation`
`put_org_automation` — `PUT /v1/org_automation`
`get_org_automation` — `GET /v1/org_automation`
`get_org_automation_id` — `GET /v1/org_automation/{org_automation_id}`
`patch_org_automation_id` — `PATCH /v1/org_automation/{org_automation_id}`
`delete_org_automation_id` — `DELETE /v1/org_automation/{org_automation_id}` |
| `client.organizations` | `get_organization` — `GET /v1/organization`
`get_organization_id` — `GET /v1/organization/{organization_id}`
`patch_organization_id` — `PATCH /v1/organization/{organization_id}`
`patch_organization_members` — `PATCH /v1/organization/members`
`get_organization_api_keys` — `GET /v1/organization/api_keys` |
| `client.project_automations` | `post_project_automation` — `POST /v1/project_automation`
`put_project_automation` — `PUT /v1/project_automation`
`get_project_automation` — `GET /v1/project_automation`
`get_project_automation_id` — `GET /v1/project_automation/{project_automation_id}`
`patch_project_automation_id` — `PATCH /v1/project_automation/{project_automation_id}`
`delete_project_automation_id` — `DELETE /v1/project_automation/{project_automation_id}` |
| `client.project_groups` | `post_project_group` — `POST /v1/project_group`
`put_project_group` — `PUT /v1/project_group`
`get_project_group` — `GET /v1/project_group`
`get_project_group_id` — `GET /v1/project_group/{project_group_id}`
`patch_project_group_id` — `PATCH /v1/project_group/{project_group_id}`
`delete_project_group_id` — `DELETE /v1/project_group/{project_group_id}` |
@@ -132,42 +132,42 @@ Only request and response models reachable directly from reviewed resource metho
| --- | --- | --- |
| `AISecret` | `Acl` | `AclBatchUpdateRequest` |
| `AclBatchUpdateResponse` | `AclItem` | `AclListOrgResponse` |
-| `Agent` | `ApiKey` | `CreateAISecret` |
-| `CreateAgent` | `CreateDataset` | `CreateDatasetSnapshot` |
-| `CreateEnvironment` | `CreateExperiment` | `CreateFunction` |
-| `CreateGroup` | `CreateMCPServer` | `CreateOrgAutomation` |
-| `CreateProject` | `CreateProjectAutomation` | `CreateProjectGroup` |
-| `CreateProjectScore` | `CreateProjectTag` | `CreatePrompt` |
-| `CreateRole` | `CreateServiceTokenOutput` | `CreateSpanIFrame` |
-| `CreateView` | `Dataset` | `DatasetRestorePreviewResponse` |
+| `ApiKey` | `CreateAISecret` | `CreateCustomColumn` |
+| `CreateDataset` | `CreateDatasetSnapshot` | `CreateEnvironment` |
+| `CreateExperiment` | `CreateFunction` | `CreateGroup` |
+| `CreateIngestKeyResponse` | `CreateMCPServer` | `CreateProject` |
+| `CreateProjectAutomation` | `CreateProjectGroup` | `CreateProjectScore` |
+| `CreateProjectTag` | `CreatePrompt` | `CreateRole` |
+| `CreateServiceTokenOutput` | `CreateSpanIFrame` | `CreateView` |
+| `CustomColumn` | `Dataset` | `DatasetRestorePreviewResponse` |
| `DatasetRestoreRequest` | `DatasetRestoreResponse` | `DatasetSnapshot` |
| `DeleteAISecret` | `DeleteServiceToken` | `DeleteView` |
| `EnvVar` | `Environment` | `Experiment` |
| `FeedbackDatasetEventRequest` | `FeedbackExperimentEventRequest` | `FeedbackResponseSchema` |
| `FetchDatasetEventsResponse` | `FetchEventsRequest` | `FetchExperimentEventsResponse` |
-| `Function` | `GetAclResponse` | `GetAgentResponse` |
-| `GetAiSecretResponse` | `GetApiKeyResponse` | `GetDatasetResponse` |
+| `Function` | `GetAclResponse` | `GetAiSecretResponse` |
+| `GetApiKeyResponse` | `GetCustomColumnResponse` | `GetDatasetResponse` |
| `GetDatasetSnapshotResponse` | `GetEnvVarResponse` | `GetExperimentResponse` |
| `GetFunctionResponse` | `GetGroupResponse` | `GetMcpServerResponse` |
-| `GetOrgAutomationResponse` | `GetOrganizationApiKeysResponse` | `GetOrganizationResponse` |
-| `GetProjectAutomationResponse` | `GetProjectGroupResponse` | `GetProjectResponse` |
-| `GetProjectScoreResponse` | `GetProjectTagResponse` | `GetPromptResponse` |
-| `GetRoleResponse` | `GetServiceTokenResponse` | `GetSpanIframeResponse` |
-| `GetUserResponse` | `GetViewResponse` | `Group` |
+| `GetOrganizationApiKeysResponse` | `GetOrganizationResponse` | `GetProjectAutomationResponse` |
+| `GetProjectGroupResponse` | `GetProjectResponse` | `GetProjectScoreResponse` |
+| `GetProjectTagResponse` | `GetPromptResponse` | `GetRoleResponse` |
+| `GetServiceTokenResponse` | `GetSpanIframeResponse` | `GetUserResponse` |
+| `GetViewResponse` | `Group` | `IngestKey` |
| `InsertDatasetEventRequest` | `InsertEventsResponse` | `InsertExperimentEventRequest` |
-| `ListEnvironmentsResponse` | `MCPServer` | `OrgAutomation` |
-| `Organization` | `PatchAISecret` | `PatchAgent` |
+| `ListEnvironmentsResponse` | `ListIngestKeysResponse` | `MCPServer` |
+| `Organization` | `PatchAISecret` | `PatchCustomColumn` |
| `PatchDataset` | `PatchDatasetSnapshot` | `PatchEnvironment` |
| `PatchExperiment` | `PatchFunction` | `PatchGroup` |
-| `PatchMCPServer` | `PatchOrgAutomation` | `PatchOrganization` |
-| `PatchOrganizationMembers` | `PatchOrganizationMembersOutput` | `PatchProject` |
-| `PatchProjectAutomation` | `PatchProjectGroup` | `PatchProjectScore` |
-| `PatchProjectTag` | `PatchPrompt` | `PatchRole` |
-| `PatchSpanIFrame` | `PatchView` | `Project` |
-| `ProjectAutomation` | `ProjectGroup` | `ProjectScore` |
-| `ProjectTag` | `Prompt` | `Role` |
-| `ServiceToken` | `SpanIFrame` | `SummarizeDatasetResponse` |
-| `SummarizeExperimentResponse` | `User` | `View` |
+| `PatchMCPServer` | `PatchOrganization` | `PatchOrganizationMembers` |
+| `PatchOrganizationMembersOutput` | `PatchProject` | `PatchProjectAutomation` |
+| `PatchProjectGroup` | `PatchProjectScore` | `PatchProjectTag` |
+| `PatchPrompt` | `PatchRole` | `PatchSpanIFrame` |
+| `PatchView` | `Project` | `ProjectAutomation` |
+| `ProjectGroup` | `ProjectScore` | `ProjectTag` |
+| `Prompt` | `Role` | `ServiceToken` |
+| `SpanIFrame` | `SummarizeDatasetResponse` | `SummarizeExperimentResponse` |
+| `User` | `View` | |
The reference sections above are synchronized with the Python surface by `make generate-api-client`; do not edit those sections manually.
diff --git a/py/src/braintrust/api/_generated/__init__.py b/py/src/braintrust/api/_generated/__init__.py
index 863e237b..cb9d8bb8 100644
--- a/py/src/braintrust/api/_generated/__init__.py
+++ b/py/src/braintrust/api/_generated/__init__.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/acls.py b/py/src/braintrust/api/_generated/acls.py
index df0d6b16..8f86b0bc 100644
--- a/py/src/braintrust/api/_generated/acls.py
+++ b/py/src/braintrust/api/_generated/acls.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/agents.py b/py/src/braintrust/api/_generated/agents.py
deleted file mode 100644
index 270478b0..00000000
--- a/py/src/braintrust/api/_generated/agents.py
+++ /dev/null
@@ -1,250 +0,0 @@
-# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
-# datamodel-code-generator: 0.81.0
-# ruff: 0.15.21
-# Generator Python: 3.14
-# Content SHA-256: 91870cec12a1ea3a24bf9925387834e703dc75dedd95b1fbe127af6aa3fa5d8a
-
-"""Generated Agents REST operations and resource."""
-
-from typing import cast
-
-from .._service import Operation, Parameter, ResourceAPI
-from ..policies import RetryMode
-from .models.agents import Agent, AgentIdParam, AgentName, CreateAgent, GetAgentResponse, PatchAgent
-from .models.common import AppLimitParam, EndingBefore, Ids, OrgName, StartingAfter
-
-
-POST_AGENT = Operation(
- operation_id="postAgent",
- method="POST",
- path="/v1/agent",
- parameters=(),
- has_request_body=True,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-PUT_AGENT = Operation(
- operation_id="putAgent",
- method="PUT",
- path="/v1/agent",
- parameters=(),
- has_request_body=True,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-GET_AGENT = Operation(
- operation_id="getAgent",
- method="GET",
- path="/v1/agent",
- parameters=(
- Parameter(
- argument_name="limit",
- name="limit",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="starting_after",
- name="starting_after",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="ending_before",
- name="ending_before",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="ids",
- name="ids",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="agent_name",
- name="agent_name",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="org_name",
- name="org_name",
- location="query",
- required=False,
- ),
- ),
- has_request_body=False,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.SAFE_READ,
-)
-
-
-GET_AGENT_ID = Operation(
- operation_id="getAgentId",
- method="GET",
- path="/v1/agent/{agent_id}",
- parameters=(
- Parameter(
- argument_name="agent_id",
- name="agent_id",
- location="path",
- required=True,
- ),
- ),
- has_request_body=False,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.SAFE_READ,
-)
-
-
-PATCH_AGENT_ID = Operation(
- operation_id="patchAgentId",
- method="PATCH",
- path="/v1/agent/{agent_id}",
- parameters=(
- Parameter(
- argument_name="agent_id",
- name="agent_id",
- location="path",
- required=True,
- ),
- ),
- has_request_body=True,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-DELETE_AGENT_ID = Operation(
- operation_id="deleteAgentId",
- method="DELETE",
- path="/v1/agent/{agent_id}",
- parameters=(
- Parameter(
- argument_name="agent_id",
- name="agent_id",
- location="path",
- required=True,
- ),
- ),
- has_request_body=False,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-OPERATIONS = {
- "postAgent": POST_AGENT,
- "putAgent": PUT_AGENT,
- "getAgent": GET_AGENT,
- "getAgentId": GET_AGENT_ID,
- "patchAgentId": PATCH_AGENT_ID,
- "deleteAgentId": DELETE_AGENT_ID,
-}
-
-
-class AgentsAPI(ResourceAPI):
- """Generated Agents REST API."""
-
- def post_agent(
- self,
- *,
- body: "CreateAgent",
- ) -> "Agent":
- return cast(
- "Agent",
- self.execute(
- POST_AGENT,
- body=body,
- ),
- )
-
- def put_agent(
- self,
- *,
- body: "CreateAgent",
- ) -> "Agent":
- return cast(
- "Agent",
- self.execute(
- PUT_AGENT,
- body=body,
- ),
- )
-
- def get_agent(
- self,
- *,
- limit: "AppLimitParam | None" = None,
- starting_after: "StartingAfter | None" = None,
- ending_before: "EndingBefore | None" = None,
- ids: "Ids | None" = None,
- agent_name: "AgentName | None" = None,
- org_name: "OrgName | None" = None,
- ) -> "GetAgentResponse":
- return cast(
- "GetAgentResponse",
- self.execute(
- GET_AGENT,
- query_parameters={
- "limit": limit,
- "starting_after": starting_after,
- "ending_before": ending_before,
- "ids": ids,
- "agent_name": agent_name,
- "org_name": org_name,
- },
- ),
- )
-
- def get_agent_id(
- self,
- agent_id: "AgentIdParam",
- ) -> "Agent":
- return cast(
- "Agent",
- self.execute(
- GET_AGENT_ID,
- path_parameters={"agent_id": agent_id},
- ),
- )
-
- def patch_agent_id(
- self,
- agent_id: "AgentIdParam",
- *,
- body: "PatchAgent | None" = None,
- ) -> "Agent":
- return cast(
- "Agent",
- self.execute(
- PATCH_AGENT_ID,
- path_parameters={"agent_id": agent_id},
- body=body,
- ),
- )
-
- def delete_agent_id(
- self,
- agent_id: "AgentIdParam",
- ) -> "Agent":
- return cast(
- "Agent",
- self.execute(
- DELETE_AGENT_ID,
- path_parameters={"agent_id": agent_id},
- ),
- )
diff --git a/py/src/braintrust/api/_generated/ai_secrets.py b/py/src/braintrust/api/_generated/ai_secrets.py
index 2f7a2bed..c7787311 100644
--- a/py/src/braintrust/api/_generated/ai_secrets.py
+++ b/py/src/braintrust/api/_generated/ai_secrets.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/api_keys.py b/py/src/braintrust/api/_generated/api_keys.py
index 9995b6c6..07602c2f 100644
--- a/py/src/braintrust/api/_generated/api_keys.py
+++ b/py/src/braintrust/api/_generated/api_keys.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/custom_columns.py b/py/src/braintrust/api/_generated/custom_columns.py
new file mode 100644
index 00000000..cc2754d6
--- /dev/null
+++ b/py/src/braintrust/api/_generated/custom_columns.py
@@ -0,0 +1,208 @@
+# Generated by scripts/generate-api-client.py. DO NOT EDIT.
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
+# datamodel-code-generator: 0.81.0
+# ruff: 0.15.21
+# Generator Python: 3.14
+# Content SHA-256: 5db5317793f0336fa0cecde8b3367c7fc368b7e6447ba8ba070399b0fc611b37
+
+"""Generated CustomColumns REST operations and resource."""
+
+from typing import cast
+
+from .._service import Operation, Parameter, ResourceAPI
+from ..policies import RetryMode
+from .models.common import AclObjectType
+from .models.custom_columns import (
+ CreateCustomColumn,
+ CustomColumn,
+ CustomColumnVariant,
+ GetCustomColumnResponse,
+ PatchCustomColumn,
+)
+
+
+GET_CUSTOM_COLUMN = Operation(
+ operation_id="getCustomColumn",
+ method="GET",
+ path="/v1/column",
+ parameters=(
+ Parameter(
+ argument_name="object_type",
+ name="object_type",
+ location="query",
+ required=True,
+ ),
+ Parameter(
+ argument_name="object_id",
+ name="object_id",
+ location="query",
+ required=True,
+ ),
+ Parameter(
+ argument_name="subtype",
+ name="subtype",
+ location="query",
+ required=False,
+ ),
+ Parameter(
+ argument_name="variant",
+ name="variant",
+ location="query",
+ required=False,
+ ),
+ ),
+ has_request_body=False,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.SAFE_READ,
+)
+
+
+POST_CUSTOM_COLUMN = Operation(
+ operation_id="postCustomColumn",
+ method="POST",
+ path="/v1/column",
+ parameters=(),
+ has_request_body=True,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.NONE,
+)
+
+
+PUT_CUSTOM_COLUMN = Operation(
+ operation_id="putCustomColumn",
+ method="PUT",
+ path="/v1/column",
+ parameters=(),
+ has_request_body=True,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.NONE,
+)
+
+
+PATCH_CUSTOM_COLUMN_ID = Operation(
+ operation_id="patchCustomColumnId",
+ method="PATCH",
+ path="/v1/column/{column_id}",
+ parameters=(
+ Parameter(
+ argument_name="column_id",
+ name="column_id",
+ location="path",
+ required=True,
+ ),
+ ),
+ has_request_body=True,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.NONE,
+)
+
+
+DELETE_CUSTOM_COLUMN_ID = Operation(
+ operation_id="deleteCustomColumnId",
+ method="DELETE",
+ path="/v1/column/{column_id}",
+ parameters=(
+ Parameter(
+ argument_name="column_id",
+ name="column_id",
+ location="path",
+ required=True,
+ ),
+ ),
+ has_request_body=False,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.NONE,
+)
+
+
+OPERATIONS = {
+ "getCustomColumn": GET_CUSTOM_COLUMN,
+ "postCustomColumn": POST_CUSTOM_COLUMN,
+ "putCustomColumn": PUT_CUSTOM_COLUMN,
+ "patchCustomColumnId": PATCH_CUSTOM_COLUMN_ID,
+ "deleteCustomColumnId": DELETE_CUSTOM_COLUMN_ID,
+}
+
+
+class CustomColumnsAPI(ResourceAPI):
+ """Generated CustomColumns REST API."""
+
+ def get_custom_column(
+ self,
+ object_type: "str",
+ object_id: "str",
+ *,
+ subtype: "AclObjectType | str | None" = None,
+ variant: "CustomColumnVariant | None" = None,
+ ) -> "GetCustomColumnResponse":
+ return cast(
+ "GetCustomColumnResponse",
+ self.execute(
+ GET_CUSTOM_COLUMN,
+ query_parameters={
+ "object_type": object_type,
+ "object_id": object_id,
+ "subtype": subtype,
+ "variant": variant,
+ },
+ ),
+ )
+
+ def post_custom_column(
+ self,
+ *,
+ body: "CreateCustomColumn",
+ ) -> "CustomColumn":
+ return cast(
+ "CustomColumn",
+ self.execute(
+ POST_CUSTOM_COLUMN,
+ body=body,
+ ),
+ )
+
+ def put_custom_column(
+ self,
+ *,
+ body: "CreateCustomColumn",
+ ) -> "CustomColumn":
+ return cast(
+ "CustomColumn",
+ self.execute(
+ PUT_CUSTOM_COLUMN,
+ body=body,
+ ),
+ )
+
+ def patch_custom_column_id(
+ self,
+ column_id: "str",
+ *,
+ body: "PatchCustomColumn | None" = None,
+ ) -> "CustomColumn":
+ return cast(
+ "CustomColumn",
+ self.execute(
+ PATCH_CUSTOM_COLUMN_ID,
+ path_parameters={"column_id": column_id},
+ body=body,
+ ),
+ )
+
+ def delete_custom_column_id(
+ self,
+ column_id: "str",
+ ) -> "CustomColumn":
+ return cast(
+ "CustomColumn",
+ self.execute(
+ DELETE_CUSTOM_COLUMN_ID,
+ path_parameters={"column_id": column_id},
+ ),
+ )
diff --git a/py/src/braintrust/api/_generated/dataset_snapshots.py b/py/src/braintrust/api/_generated/dataset_snapshots.py
index 49f8cdfd..a5f717e9 100644
--- a/py/src/braintrust/api/_generated/dataset_snapshots.py
+++ b/py/src/braintrust/api/_generated/dataset_snapshots.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/datasets.py b/py/src/braintrust/api/_generated/datasets.py
index 925b842f..ef130a25 100644
--- a/py/src/braintrust/api/_generated/datasets.py
+++ b/py/src/braintrust/api/_generated/datasets.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/env_vars.py b/py/src/braintrust/api/_generated/env_vars.py
index 98f4e36b..c0611aa3 100644
--- a/py/src/braintrust/api/_generated/env_vars.py
+++ b/py/src/braintrust/api/_generated/env_vars.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/environments.py b/py/src/braintrust/api/_generated/environments.py
index 955a52bf..b71e62bc 100644
--- a/py/src/braintrust/api/_generated/environments.py
+++ b/py/src/braintrust/api/_generated/environments.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/experiments.py b/py/src/braintrust/api/_generated/experiments.py
index b2abc270..4e3b3380 100644
--- a/py/src/braintrust/api/_generated/experiments.py
+++ b/py/src/braintrust/api/_generated/experiments.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/functions.py b/py/src/braintrust/api/_generated/functions.py
index d6027b25..8eb4a337 100644
--- a/py/src/braintrust/api/_generated/functions.py
+++ b/py/src/braintrust/api/_generated/functions.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/groups.py b/py/src/braintrust/api/_generated/groups.py
index f2c54d50..26320da1 100644
--- a/py/src/braintrust/api/_generated/groups.py
+++ b/py/src/braintrust/api/_generated/groups.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/ingest_keys.py b/py/src/braintrust/api/_generated/ingest_keys.py
new file mode 100644
index 00000000..e79ab3d3
--- /dev/null
+++ b/py/src/braintrust/api/_generated/ingest_keys.py
@@ -0,0 +1,143 @@
+# Generated by scripts/generate-api-client.py. DO NOT EDIT.
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
+# datamodel-code-generator: 0.81.0
+# ruff: 0.15.21
+# Generator Python: 3.14
+# Content SHA-256: 564599f335a2df731a1d7961353c112031958fbb83828ad20aeb07e801f4bb75
+
+"""Generated Ingest keys REST operations and resource."""
+
+from collections.abc import Mapping
+
+from typing import Any, cast
+
+from .._service import Operation, Parameter, ResourceAPI
+from ..policies import RetryMode
+from .models.common import AppLimitWithDefaultParam, EndingBefore, StartingAfter
+from .models.ingest_keys import CreateIngestKeyResponse, IngestKey, ListIngestKeysResponse
+
+
+CREATE_INGEST_KEY = Operation(
+ operation_id="createIngestKey",
+ method="POST",
+ path="/v1/ingest_key",
+ parameters=(),
+ has_request_body=True,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.NONE,
+)
+
+
+LIST_INGEST_KEYS = Operation(
+ operation_id="listIngestKeys",
+ method="GET",
+ path="/v1/ingest_key",
+ parameters=(
+ Parameter(
+ argument_name="project_id",
+ name="project_id",
+ location="query",
+ required=True,
+ ),
+ Parameter(
+ argument_name="limit",
+ name="limit",
+ location="query",
+ required=False,
+ ),
+ Parameter(
+ argument_name="starting_after",
+ name="starting_after",
+ location="query",
+ required=False,
+ ),
+ Parameter(
+ argument_name="ending_before",
+ name="ending_before",
+ location="query",
+ required=False,
+ ),
+ ),
+ has_request_body=False,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.SAFE_READ,
+)
+
+
+DELETE_INGEST_KEY = Operation(
+ operation_id="deleteIngestKey",
+ method="DELETE",
+ path="/v1/ingest_key/{id}",
+ parameters=(
+ Parameter(
+ argument_name="id",
+ name="id",
+ location="path",
+ required=True,
+ ),
+ ),
+ has_request_body=False,
+ success_statuses=(200,),
+ json_success_statuses=(200,),
+ retry_mode=RetryMode.NONE,
+)
+
+
+OPERATIONS = {
+ "createIngestKey": CREATE_INGEST_KEY,
+ "listIngestKeys": LIST_INGEST_KEYS,
+ "deleteIngestKey": DELETE_INGEST_KEY,
+}
+
+
+class IngestKeysAPI(ResourceAPI):
+ """Generated Ingest keys REST API."""
+
+ def create_ingest_key(
+ self,
+ *,
+ body: "Mapping[str, Any]",
+ ) -> "CreateIngestKeyResponse":
+ return cast(
+ "CreateIngestKeyResponse",
+ self.execute(
+ CREATE_INGEST_KEY,
+ body=body,
+ ),
+ )
+
+ def list_ingest_keys(
+ self,
+ project_id: "str",
+ *,
+ limit: "AppLimitWithDefaultParam | None" = None,
+ starting_after: "StartingAfter | None" = None,
+ ending_before: "EndingBefore | None" = None,
+ ) -> "ListIngestKeysResponse":
+ return cast(
+ "ListIngestKeysResponse",
+ self.execute(
+ LIST_INGEST_KEYS,
+ query_parameters={
+ "project_id": project_id,
+ "limit": limit,
+ "starting_after": starting_after,
+ "ending_before": ending_before,
+ },
+ ),
+ )
+
+ def delete_ingest_key(
+ self,
+ id: "str",
+ ) -> "IngestKey":
+ return cast(
+ "IngestKey",
+ self.execute(
+ DELETE_INGEST_KEY,
+ path_parameters={"id": id},
+ ),
+ )
diff --git a/py/src/braintrust/api/_generated/mcp_servers.py b/py/src/braintrust/api/_generated/mcp_servers.py
index d61b6fce..28a254e6 100644
--- a/py/src/braintrust/api/_generated/mcp_servers.py
+++ b/py/src/braintrust/api/_generated/mcp_servers.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/__init__.py b/py/src/braintrust/api/_generated/models/__init__.py
index 6a9c609a..f03e5245 100644
--- a/py/src/braintrust/api/_generated/models/__init__.py
+++ b/py/src/braintrust/api/_generated/models/__init__.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: f07b90b72cb1130ae2429815a69b689aec26176cf22fab45f8e8f60726dcac18
+# Content SHA-256: 7449300131300c48ced696901bd49dbded916981b57e4f378c2dc1bc34f16793
"""Generated private model types with lazy package-level imports."""
@@ -29,7 +29,6 @@
AclListUserId,
GetAclResponse,
)
- from .agents import Agent, AgentIdParam, AgentName, CreateAgent, GetAgentResponse, PatchAgent
from .ai_secrets import (
AISecret,
AISecretType,
@@ -69,8 +68,8 @@
ChatCompletionMessageToolCall,
ChatCompletionMessageToolCallFunction,
ChatTemplateKwargs,
+ Choice,
Classification,
- Config4,
EndingBefore,
FeedbackResponseSchema,
FetchEventsRequest,
@@ -86,7 +85,9 @@
Ids,
ImageUrl,
InputAudio,
+ InputItem,
InsertEventsResponse,
+ Level,
MaxRootSpanId,
MaxXactId,
Mcp,
@@ -112,17 +113,25 @@
PromptBlockDataNullish,
PromptBlockDataNullish1,
PromptBlockDataNullish2,
+ PromptBlockDataNullish3,
PromptDataNullish,
PromptEnvironment,
PromptOptionsNullish,
PromptParserNullish,
PromptVersion,
+ Question8,
+ Question81,
+ Question82,
+ Question83,
+ Question84,
+ Question85,
+ Question86,
+ Question87,
ResponseFormatJsonSchema,
ResponseFormatNullish,
ResponseFormatNullish1,
ResponseFormatNullish2,
ResponseFormatNullish3,
- RetentionObjectType,
SavedFunctionId,
SavedFunctionId1,
SavedFunctionId2,
@@ -141,6 +150,13 @@
TraceScope,
Version,
)
+ from .custom_columns import (
+ CreateCustomColumn,
+ CustomColumn,
+ CustomColumnVariant,
+ GetCustomColumnResponse,
+ PatchCustomColumn,
+ )
from .dataset_snapshots import (
CreateDatasetSnapshot,
DatasetSnapshot,
@@ -197,8 +213,8 @@
SummarizeScores,
)
from .functions import (
+ Agent,
Agent1,
- Agent10,
Agent2,
Agent3,
Agent4,
@@ -209,10 +225,10 @@
Agent9,
BatchedFacetData,
CodeBundle,
+ Config5,
Config6,
Config7,
Config8,
- Config9,
CreateFunction,
Data,
Data1,
@@ -268,6 +284,15 @@
PromptBlockData,
PromptBlockData1,
PromptBlockData2,
+ PromptBlockData3,
+ Question,
+ Question1,
+ Question2,
+ Question3,
+ Question4,
+ Question5,
+ Question6,
+ Question7,
RuntimeContext,
SandboxSpec,
SandboxSpec1,
@@ -286,6 +311,7 @@
TopicMapGenerationSettings,
)
from .groups import CreateGroup, GetGroupResponse, Group, GroupIdParam, GroupName, PatchGroup
+ from .ingest_keys import CreateIngestKeyResponse, IngestKey, ListIngestKeysResponse, Object
from .mcp_servers import (
CreateMCPServer,
GetMcpServerResponse,
@@ -294,15 +320,6 @@
McpServerName,
PatchMCPServer,
)
- from .org_automations import (
- Config,
- CreateOrgAutomation,
- GetOrgAutomationResponse,
- OrgAutomation,
- OrgAutomationIdParam,
- OrgAutomationName,
- PatchOrgAutomation,
- )
from .organizations import (
AddedUser,
CreatedAfter,
@@ -346,7 +363,10 @@
BackfillTimeRange,
Calculation,
Condition,
+ Config,
Config1,
+ Config10,
+ Config11,
Config12,
Config13,
Config14,
@@ -354,12 +374,10 @@
Config16,
Config17,
Config18,
- Config19,
Config2,
- Config20,
- Config21,
Config3,
- Config5,
+ Config4,
+ Config9,
CreateProjectAutomation,
Credentials,
Credentials1,
@@ -400,6 +418,7 @@
ProjectAutomation,
ProjectAutomationIdParam,
ProjectAutomationName,
+ RetentionObjectType,
RuntimeBlock,
Schedule,
Schedule1,
@@ -565,9 +584,8 @@
"Actions2": "project_automations",
"AddMemberPermission": "roles",
"AddedUser": "organizations",
- "Agent": "agents",
+ "Agent": "functions",
"Agent1": "functions",
- "Agent10": "functions",
"Agent2": "functions",
"Agent3": "functions",
"Agent4": "functions",
@@ -576,8 +594,6 @@
"Agent7": "functions",
"Agent8": "functions",
"Agent9": "functions",
- "AgentIdParam": "agents",
- "AgentName": "agents",
"AiSecretIdParam": "ai_secrets",
"AiSecretName": "ai_secrets",
"ApiKey": "common",
@@ -610,12 +626,15 @@
"ChatCompletionMessageToolCall": "common",
"ChatCompletionMessageToolCallFunction": "common",
"ChatTemplateKwargs": "common",
+ "Choice": "common",
"Classification": "common",
"CodeBundle": "functions",
"ComparisonExperimentId": "experiments",
"Condition": "project_automations",
- "Config": "org_automations",
+ "Config": "project_automations",
"Config1": "project_automations",
+ "Config10": "project_automations",
+ "Config11": "project_automations",
"Config12": "project_automations",
"Config13": "project_automations",
"Config14": "project_automations",
@@ -623,28 +642,25 @@
"Config16": "project_automations",
"Config17": "project_automations",
"Config18": "project_automations",
- "Config19": "project_automations",
"Config2": "project_automations",
- "Config20": "project_automations",
- "Config21": "project_automations",
"Config3": "project_automations",
- "Config4": "common",
- "Config5": "project_automations",
+ "Config4": "project_automations",
+ "Config5": "functions",
"Config6": "functions",
"Config7": "functions",
"Config8": "functions",
- "Config9": "functions",
+ "Config9": "project_automations",
"Context": "experiments",
"CreateAISecret": "ai_secrets",
- "CreateAgent": "agents",
+ "CreateCustomColumn": "custom_columns",
"CreateDataset": "datasets",
"CreateDatasetSnapshot": "dataset_snapshots",
"CreateEnvironment": "environments",
"CreateExperiment": "experiments",
"CreateFunction": "functions",
"CreateGroup": "groups",
+ "CreateIngestKeyResponse": "ingest_keys",
"CreateMCPServer": "mcp_servers",
- "CreateOrgAutomation": "org_automations",
"CreateProject": "projects",
"CreateProjectAutomation": "project_automations",
"CreateProjectGroup": "project_groups",
@@ -663,6 +679,8 @@
"Credentials3": "project_automations",
"Credentials4": "project_automations",
"Credentials5": "project_automations",
+ "CustomColumn": "custom_columns",
+ "CustomColumnVariant": "custom_columns",
"Data": "functions",
"Data1": "functions",
"Data2": "functions",
@@ -761,9 +779,9 @@
"FunctionTypeEnum": "common",
"FunctionTypeEnumNullish": "common",
"GetAclResponse": "acls",
- "GetAgentResponse": "agents",
"GetAiSecretResponse": "ai_secrets",
"GetApiKeyResponse": "api_keys",
+ "GetCustomColumnResponse": "custom_columns",
"GetDatasetResponse": "datasets",
"GetDatasetSnapshotResponse": "dataset_snapshots",
"GetEnvVarResponse": "env_vars",
@@ -771,7 +789,6 @@
"GetFunctionResponse": "functions",
"GetGroupResponse": "groups",
"GetMcpServerResponse": "mcp_servers",
- "GetOrgAutomationResponse": "org_automations",
"GetOrganizationApiKeysResponse": "organizations",
"GetOrganizationResponse": "organizations",
"GetProjectAutomationResponse": "project_automations",
@@ -803,7 +820,9 @@
"Ids": "common",
"ImageRenderingMode": "organizations",
"ImageUrl": "common",
+ "IngestKey": "ingest_keys",
"InputAudio": "common",
+ "InputItem": "common",
"InsertDatasetEvent": "datasets",
"InsertDatasetEventRequest": "datasets",
"InsertEventsResponse": "common",
@@ -811,7 +830,9 @@
"InsertExperimentEventRequest": "experiments",
"InternalMetadata": "experiments",
"InviteUsers": "organizations",
+ "Level": "common",
"ListEnvironmentsResponse": "environments",
+ "ListIngestKeysResponse": "ingest_keys",
"Location": "functions",
"Location1": "functions",
"Location2": "functions",
@@ -837,12 +858,10 @@
"NullableSavedFunctionId": "projects",
"NullableSavedFunctionId1": "projects",
"NullableSavedFunctionId2": "projects",
+ "Object": "ingest_keys",
"ObjectReferenceNullish": "common",
"OnlineScoreConfig": "project_scores",
"Options": "views",
- "OrgAutomation": "org_automations",
- "OrgAutomationIdParam": "org_automations",
- "OrgAutomationName": "org_automations",
"OrgId": "organizations",
"OrgName": "common",
"Organization": "organizations",
@@ -851,7 +870,7 @@
"Origin2": "common",
"Output": "project_automations",
"PatchAISecret": "ai_secrets",
- "PatchAgent": "agents",
+ "PatchCustomColumn": "custom_columns",
"PatchDataset": "datasets",
"PatchDatasetSnapshot": "dataset_snapshots",
"PatchEnvironment": "environments",
@@ -859,7 +878,6 @@
"PatchFunction": "functions",
"PatchGroup": "groups",
"PatchMCPServer": "mcp_servers",
- "PatchOrgAutomation": "org_automations",
"PatchOrganization": "organizations",
"PatchOrganizationMembers": "organizations",
"PatchOrganizationMembersOutput": "organizations",
@@ -909,9 +927,11 @@
"PromptBlockData": "functions",
"PromptBlockData1": "functions",
"PromptBlockData2": "functions",
+ "PromptBlockData3": "functions",
"PromptBlockDataNullish": "common",
"PromptBlockDataNullish1": "common",
"PromptBlockDataNullish2": "common",
+ "PromptBlockDataNullish3": "common",
"PromptDataNullish": "common",
"PromptEnvironment": "common",
"PromptIdParam": "prompts",
@@ -919,6 +939,22 @@
"PromptOptionsNullish": "common",
"PromptParserNullish": "common",
"PromptVersion": "common",
+ "Question": "functions",
+ "Question1": "functions",
+ "Question2": "functions",
+ "Question3": "functions",
+ "Question4": "functions",
+ "Question5": "functions",
+ "Question6": "functions",
+ "Question7": "functions",
+ "Question8": "common",
+ "Question81": "common",
+ "Question82": "common",
+ "Question83": "common",
+ "Question84": "common",
+ "Question85": "common",
+ "Question86": "common",
+ "Question87": "common",
"RemoteEvalSource": "projects",
"RemoveMemberPermission": "roles",
"RemoveUsers": "organizations",
@@ -928,7 +964,7 @@
"ResponseFormatNullish1": "common",
"ResponseFormatNullish2": "common",
"ResponseFormatNullish3": "common",
- "RetentionObjectType": "common",
+ "RetentionObjectType": "project_automations",
"Role": "roles",
"RoleIdParam": "roles",
"RoleName": "roles",
@@ -1070,7 +1106,6 @@
"AddedUser",
"Agent",
"Agent1",
- "Agent10",
"Agent2",
"Agent3",
"Agent4",
@@ -1079,8 +1114,6 @@
"Agent7",
"Agent8",
"Agent9",
- "AgentIdParam",
- "AgentName",
"AiSecretIdParam",
"AiSecretName",
"ApiKey",
@@ -1113,12 +1146,15 @@
"ChatCompletionMessageToolCall",
"ChatCompletionMessageToolCallFunction",
"ChatTemplateKwargs",
+ "Choice",
"Classification",
"CodeBundle",
"ComparisonExperimentId",
"Condition",
"Config",
"Config1",
+ "Config10",
+ "Config11",
"Config12",
"Config13",
"Config14",
@@ -1126,10 +1162,7 @@
"Config16",
"Config17",
"Config18",
- "Config19",
"Config2",
- "Config20",
- "Config21",
"Config3",
"Config4",
"Config5",
@@ -1139,15 +1172,15 @@
"Config9",
"Context",
"CreateAISecret",
- "CreateAgent",
+ "CreateCustomColumn",
"CreateDataset",
"CreateDatasetSnapshot",
"CreateEnvironment",
"CreateExperiment",
"CreateFunction",
"CreateGroup",
+ "CreateIngestKeyResponse",
"CreateMCPServer",
- "CreateOrgAutomation",
"CreateProject",
"CreateProjectAutomation",
"CreateProjectGroup",
@@ -1166,6 +1199,8 @@
"Credentials3",
"Credentials4",
"Credentials5",
+ "CustomColumn",
+ "CustomColumnVariant",
"Data",
"Data1",
"Data2",
@@ -1264,9 +1299,9 @@
"FunctionTypeEnum",
"FunctionTypeEnumNullish",
"GetAclResponse",
- "GetAgentResponse",
"GetAiSecretResponse",
"GetApiKeyResponse",
+ "GetCustomColumnResponse",
"GetDatasetResponse",
"GetDatasetSnapshotResponse",
"GetEnvVarResponse",
@@ -1274,7 +1309,6 @@
"GetFunctionResponse",
"GetGroupResponse",
"GetMcpServerResponse",
- "GetOrgAutomationResponse",
"GetOrganizationApiKeysResponse",
"GetOrganizationResponse",
"GetProjectAutomationResponse",
@@ -1306,7 +1340,9 @@
"Ids",
"ImageRenderingMode",
"ImageUrl",
+ "IngestKey",
"InputAudio",
+ "InputItem",
"InsertDatasetEvent",
"InsertDatasetEventRequest",
"InsertEventsResponse",
@@ -1314,7 +1350,9 @@
"InsertExperimentEventRequest",
"InternalMetadata",
"InviteUsers",
+ "Level",
"ListEnvironmentsResponse",
+ "ListIngestKeysResponse",
"Location",
"Location1",
"Location2",
@@ -1340,12 +1378,10 @@
"NullableSavedFunctionId",
"NullableSavedFunctionId1",
"NullableSavedFunctionId2",
+ "Object",
"ObjectReferenceNullish",
"OnlineScoreConfig",
"Options",
- "OrgAutomation",
- "OrgAutomationIdParam",
- "OrgAutomationName",
"OrgId",
"OrgName",
"Organization",
@@ -1354,7 +1390,7 @@
"Origin2",
"Output",
"PatchAISecret",
- "PatchAgent",
+ "PatchCustomColumn",
"PatchDataset",
"PatchDatasetSnapshot",
"PatchEnvironment",
@@ -1362,7 +1398,6 @@
"PatchFunction",
"PatchGroup",
"PatchMCPServer",
- "PatchOrgAutomation",
"PatchOrganization",
"PatchOrganizationMembers",
"PatchOrganizationMembersOutput",
@@ -1412,9 +1447,11 @@
"PromptBlockData",
"PromptBlockData1",
"PromptBlockData2",
+ "PromptBlockData3",
"PromptBlockDataNullish",
"PromptBlockDataNullish1",
"PromptBlockDataNullish2",
+ "PromptBlockDataNullish3",
"PromptDataNullish",
"PromptEnvironment",
"PromptIdParam",
@@ -1422,6 +1459,22 @@
"PromptOptionsNullish",
"PromptParserNullish",
"PromptVersion",
+ "Question",
+ "Question1",
+ "Question2",
+ "Question3",
+ "Question4",
+ "Question5",
+ "Question6",
+ "Question7",
+ "Question8",
+ "Question81",
+ "Question82",
+ "Question83",
+ "Question84",
+ "Question85",
+ "Question86",
+ "Question87",
"RemoteEvalSource",
"RemoveMemberPermission",
"RemoveUsers",
diff --git a/py/src/braintrust/api/_generated/models/acls.py b/py/src/braintrust/api/_generated/models/acls.py
index 8887ab36..c3684692 100644
--- a/py/src/braintrust/api/_generated/models/acls.py
+++ b/py/src/braintrust/api/_generated/models/acls.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 8764f2d92392d4dbe02416bc4c1ee4e96a06878197e8791c5965ff3170cdf92a
+# Content SHA-256: eee4e4974f53362f57818fda974ad3f82629ef7a6936410979b43b44837936dc
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -63,7 +63,7 @@
"""
Each permission permits a certain type of operation on an object in the system
-Permissions can be assigned to to objects on an individual basis, or grouped into roles
+Permissions can be assigned to objects on an individual basis, or grouped into roles
"""
AclListRestrictObjectType: TypeAlias = Literal[
diff --git a/py/src/braintrust/api/_generated/models/agents.py b/py/src/braintrust/api/_generated/models/agents.py
deleted file mode 100644
index 6936329f..00000000
--- a/py/src/braintrust/api/_generated/models/agents.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
-# datamodel-code-generator: 0.81.0
-# ruff: 0.15.21
-# Generator Python: 3.14
-# Content SHA-256: 768a7ba86547c3d62db1818f63c9cccfeb77584e11d105f3f8ed014603fbb6db
-
-from typing_extensions import NotRequired
-from typing import Any, Literal, TypeAlias, TypedDict
-from collections.abc import Mapping, Sequence
-
-
-class Agent(TypedDict):
- created: NotRequired[str | None]
- """
- Date of agent creation
- """
- description: NotRequired[str | None]
- """
- Textual description of the agent
- """
- id: str
- """
- Unique identifier for the agent
- """
- kind: str
- """
- Agent classification: 'custom' for customer-defined agents, 'loop' for built-in Loop agents.
- """
- metadata: NotRequired[Mapping[str, Any] | None]
- """
- User-controlled metadata about the agent
- """
- name: str
- """
- Name of the agent. Within a project, agent names are unique
- """
- project_id: str
- """
- Unique identifier for the project that the agent belongs under
- """
- slug: str
- """
- Stable, URL-safe identifier for the agent, unique within its project.
- """
- user_id: str
-
-
-AgentIdParam: TypeAlias = str
-"""
-Agent id
-"""
-
-AgentName: TypeAlias = str
-"""
-Name of the agent to search for
-"""
-
-
-class CreateAgent(TypedDict):
- description: NotRequired[str | None]
- """
- Textual description of the agent
- """
- metadata: NotRequired[Mapping[str, Any] | None]
- """
- User-controlled metadata about the agent
- """
- name: str
- """
- Name of the agent. Within a project, agent names are unique
- """
- project_id: str
- """
- Unique identifier for the project that the agent belongs under
- """
-
-
-class GetAgentResponse(TypedDict):
- objects: Sequence[Agent]
- """
- A list of agent objects
- """
-
-
-class PatchAgent(TypedDict):
- description: NotRequired[str | None]
- """
- Textual description of the agent
- """
- metadata: NotRequired[Mapping[str, Any] | None]
- """
- User-controlled metadata about the agent
- """
- name: NotRequired[str | None]
- """
- Name of the agent. Within a project, agent names are unique
- """
diff --git a/py/src/braintrust/api/_generated/models/ai_secrets.py b/py/src/braintrust/api/_generated/models/ai_secrets.py
index 7f884de5..1b28d321 100644
--- a/py/src/braintrust/api/_generated/models/ai_secrets.py
+++ b/py/src/braintrust/api/_generated/models/ai_secrets.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/api_keys.py b/py/src/braintrust/api/_generated/models/api_keys.py
index e8db3900..0eaa2bd4 100644
--- a/py/src/braintrust/api/_generated/models/api_keys.py
+++ b/py/src/braintrust/api/_generated/models/api_keys.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/common.py b/py/src/braintrust/api/_generated/models/common.py
index 992f9c7f..c7067a6c 100644
--- a/py/src/braintrust/api/_generated/models/common.py
+++ b/py/src/braintrust/api/_generated/models/common.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 7cad62c7ab74283171cc7ace4fb4a73ea6e7de64e3b73298da8cd7d0a36fea97
+# Content SHA-256: 7bfde5ef416d4666dddfc090c0e7d522812633157a930f4b34b176e68a4e0e5d
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -61,6 +61,9 @@ class ApiKey(TypedDict):
Unique identifier for the organization
"""
preview_name: str
+ """
+ Masked preview showing the key prefix and last four characters, e.g. sk-…AbCd.
+ """
user_email: NotRequired[str | None]
"""
The user's email
@@ -427,7 +430,7 @@ class ObjectReferenceNullish(TypedDict):
"""
Each permission permits a certain type of operation on an object in the system
-Permissions can be assigned to to objects on an individual basis, or grouped into roles
+Permissions can be assigned to objects on an individual basis, or grouped into roles
"""
@@ -473,11 +476,66 @@ class PreprocessorId3(TypedDict):
"""
+class InputItem(TypedDict):
+ content: str | Sequence[ChatCompletionContentPartText]
+ role: Literal["system", "developer", "user", "assistant"]
+
+
+class Choice(TypedDict):
+ description: NotRequired[str]
+ value: str | bool
+
+
+class Level(TypedDict):
+ description: NotRequired[str]
+ label: str
+
+
class PromptBlockDataNullish2(TypedDict):
content: str
type: Literal["completion"]
+class Question81(TypedDict):
+ type: Literal["predicate"]
+
+
+class Question82(TypedDict):
+ choices: Sequence[Choice]
+ type: Literal["choice"]
+
+
+class Question83(TypedDict):
+ levels: Sequence[Level]
+ type: Literal["score"]
+
+
+class Question84(TypedDict):
+ instructions: str
+ name: NotRequired[str]
+
+
+class Question85(Question81, Question84):
+ pass
+
+
+class Question86(Question82, Question84):
+ pass
+
+
+class Question87(Question83, Question84):
+ pass
+
+
+Question8: TypeAlias = Question85 | Question86 | Question87
+
+
+class PromptBlockDataNullish3(TypedDict):
+ input: str | Sequence[InputItem]
+ questions: Sequence[Question8]
+ type: Literal["decisions"]
+
+
class Mcp(TypedDict):
enabled_tools: NotRequired[Sequence[str] | None]
"""
@@ -545,7 +603,7 @@ class ToolFunction7(ToolFunction2, ToolFunction3):
"""
Filter by environment slug. Cannot be used together with `version`.
-For `GET /v1/prompt`, environment resolution currently requires the request to match a single prompt. If multiple prompts match, the endpoint returns `400` (for example when `limit=1` is not set). Use `limit=1` or other filters (for example `slug`, `project_id`) to narrow results.
+For `GET /v1/prompt`, return prompts associated with the environment at their assigned versions. Pagination applies to the matching prompts.
"""
@@ -600,11 +658,6 @@ class ResponseFormatNullish3(TypedDict):
ResponseFormatNullish: TypeAlias = ResponseFormatNullish1 | ResponseFormatNullish2 | ResponseFormatNullish3 | None
-RetentionObjectType: TypeAlias = Literal["project_logs", "experiment", "dataset"]
-"""
-The object type that the retention policy applies to
-"""
-
class SavedFunctionId1(TypedDict):
id: str
@@ -679,18 +732,6 @@ class ChatCompletionMessageToolCall(TypedDict):
type: Literal["function"]
-class Config4(TypedDict):
- event_type: Literal["retention"]
- """
- The type of automation.
- """
- object_type: RetentionObjectType
- retention_days: int
- """
- The number of days to retain the object
- """
-
-
class Classification(TypedDict):
confidence: NotRequired[float | None]
"""
@@ -784,7 +825,7 @@ class PromptBlockDataNullish1(TypedDict):
type: Literal["chat"]
-PromptBlockDataNullish: TypeAlias = PromptBlockDataNullish1 | PromptBlockDataNullish2 | None
+PromptBlockDataNullish: TypeAlias = PromptBlockDataNullish1 | PromptBlockDataNullish2 | PromptBlockDataNullish3 | None
class PromptDataNullish(TypedDict):
diff --git a/py/src/braintrust/api/_generated/models/custom_columns.py b/py/src/braintrust/api/_generated/models/custom_columns.py
new file mode 100644
index 00000000..6c084a02
--- /dev/null
+++ b/py/src/braintrust/api/_generated/models/custom_columns.py
@@ -0,0 +1,83 @@
+# Generated by scripts/generate-api-client.py. DO NOT EDIT.
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
+# datamodel-code-generator: 0.81.0
+# ruff: 0.15.21
+# Generator Python: 3.14
+# Content SHA-256: 79058a8f11516306b44323ff454b30eb63a3c3f13a723f961e64e9f39b539d24
+
+from typing_extensions import NotRequired
+from typing import Any, Literal, TypeAlias, TypedDict
+from collections.abc import Mapping, Sequence
+
+from .common import AclObjectType
+
+CustomColumnVariant: TypeAlias = Literal["project", "experiment", "dataset", "project_log", "experiment_list"]
+"""
+The table variant that the custom column applies to
+"""
+
+
+class PatchCustomColumn(TypedDict):
+ expr: NotRequired[str]
+ """
+ The expression used to extract the value for the custom column
+ """
+ name: NotRequired[str]
+ """
+ The name of the custom column
+ """
+
+
+class CreateCustomColumn(TypedDict):
+ expr: str
+ """
+ The expression used to extract the value for the custom column
+ """
+ name: str
+ """
+ The name of the custom column
+ """
+ object_id: str
+ """
+ The ID of the scoping object. Use the project ID for project logs, experiment spans, and the experiments list. Use the dataset ID for dataset rows
+ """
+ object_type: AclObjectType
+ subtype: AclObjectType | Literal[""]
+ """
+ The child object type the custom column applies to, such as `experiment` or `project_log`. Use an empty string when the column applies directly to the scoping object, such as a dataset
+ """
+ variant: NotRequired[CustomColumnVariant]
+
+
+class CustomColumn(TypedDict):
+ created: NotRequired[str | None]
+ """
+ Date of custom columns creation
+ """
+ expr: str
+ """
+ The expression used to extract the value for the custom column
+ """
+ id: str
+ """
+ Unique identifier for the custom columns
+ """
+ name: str
+ """
+ The name of the custom column
+ """
+ object_id: str
+ """
+ The id of the object the custom column is scoped for
+ """
+ object_type: AclObjectType
+ subtype: AclObjectType | Literal[""]
+ """
+ The object type that the ACL applies to
+ """
+ variant: CustomColumnVariant
+
+
+class GetCustomColumnResponse(TypedDict):
+ objects: Sequence[CustomColumn]
diff --git a/py/src/braintrust/api/_generated/models/dataset_snapshots.py b/py/src/braintrust/api/_generated/models/dataset_snapshots.py
index 959ccc7d..b1cfd2ec 100644
--- a/py/src/braintrust/api/_generated/models/dataset_snapshots.py
+++ b/py/src/braintrust/api/_generated/models/dataset_snapshots.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 6889157bf74890e32ef8864ee20178e5c58817e19901b0c42425d98d8c3de2c2
+# Content SHA-256: 84ecabf16f50b00b3501896a61920e883339f3ec6c908f24b37204d59f47bff3
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -26,7 +26,7 @@ class CreateDatasetSnapshot(TypedDict):
"""
xact_id: str
"""
- Transaction id of the brainstore version at the time of the snapshot
+ Transaction ID of the dataset version at the time of the snapshot
"""
@@ -50,7 +50,7 @@ class DatasetSnapshot(TypedDict):
"""
xact_id: str
"""
- Transaction id of the brainstore version at the time of the snapshot
+ Transaction ID of the dataset version at the time of the snapshot
"""
diff --git a/py/src/braintrust/api/_generated/models/datasets.py b/py/src/braintrust/api/_generated/models/datasets.py
index 64ba11c6..2cd6492c 100644
--- a/py/src/braintrust/api/_generated/models/datasets.py
+++ b/py/src/braintrust/api/_generated/models/datasets.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 2c79747ae42ff7e8b7105882244f582471d5c781bae77da15f38fb898913f96d
+# Content SHA-256: bca7853c03b0d183be5fd37379a1bdbc1ffe33823cf1631f1ee71bebcdebf516
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -302,7 +302,7 @@ class InsertDatasetEvent(TypedDict):
"""
The `_array_delete` field allows removing specific values from array fields. It is an array of objects with `path` and `delete` properties.
- For example, to remove tags "foo" and "bar" from an existing row: `{"_is_merge": true, "_array_delete": [{"path": ["tags"], "delete": ["foo", "bar"]}]}`. For nested fields like `metadata.categories`, use `[{"path": ["metadata", "categories"], "delete": ["value"]}]`. This will remove those specific values from the array while preserving others.
+ For example, to remove tags "foo" and "bar" from an existing row with id "abc": `{"id": "abc", "_is_merge": true, "_array_delete": [{"path": ["tags"], "delete": ["foo", "bar"]}]}`. For nested fields like `metadata.categories`, use `{"id": "abc", "_is_merge": true, "_array_delete": [{"path": ["metadata", "categories"], "delete": ["value"]}]}`. This will remove those specific values from the array while preserving others.
"""
_is_merge: NotRequired[bool | None]
"""
@@ -314,7 +314,7 @@ class InsertDatasetEvent(TypedDict):
"""
The `_merge_paths` field allows controlling the depth of the merge, when `_is_merge=true`. `_merge_paths` is a list of paths, where each path is a list of field names. The deep merge will not descend below any of the specified merge paths.
- For example, say there is an existing row in the DB `{"id": "foo", "input": {"a": {"b": 10}, "c": {"d": 20}}, "output": {"a": 20}}`. If we merge a new row as `{"_is_merge": true, "_merge_paths": [["input", "a"], ["output"]], "input": {"a": {"q": 30}, "c": {"e": 30}, "bar": "baz"}, "output": {"d": 40}}`, the new row will be `{"id": "foo": "input": {"a": {"q": 30}, "c": {"d": 20, "e": 30}, "bar": "baz"}, "output": {"d": 40}}`. In this case, due to the merge paths, we have replaced `input.a` and `output`, but have still deep-merged `input` and `input.c`.
+ For example, say there is an existing row in the DB `{"id": "foo", "input": {"a": {"b": 10}, "c": {"d": 20}}, "output": {"a": 20}}`. If we merge a new row as `{"id": "foo", "_is_merge": true, "_merge_paths": [["input", "a"], ["output"]], "input": {"a": {"q": 30}, "c": {"e": 30}, "bar": "baz"}, "output": {"d": 40}}`, the new row will be `{"id": "foo", "input": {"a": {"q": 30}, "c": {"d": 20, "e": 30}, "bar": "baz"}, "output": {"d": 40}}`. In this case, due to the merge paths, we have replaced `input.a` and `output`, but have still deep-merged `input` and `input.c`.
"""
_object_delete: NotRequired[bool | None]
"""
@@ -322,11 +322,9 @@ class InsertDatasetEvent(TypedDict):
"""
_parent_id: NotRequired[str | None]
"""
- DEPRECATED: The `_parent_id` field is deprecated and should not be used. Support for `_parent_id` will be dropped in a future version of Braintrust. Log `span_id`, `root_span_id`, and `span_parents` explicitly instead.
+ Deprecated. Log `span_id`, `root_span_id`, and `span_parents` explicitly instead.
- Use the `_parent_id` field to create this row as a subspan of an existing row. Tracking hierarchical relationships are important for tracing (see the [guide](https://docs.braintrust.dev/instrument) for full details).
-
- For example, say we have logged a row `{"id": "abc", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"_parent_id": "abc", "id": "llm_call", "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For legacy clients, `_parent_id` identifies the existing row to use as this row's parent.
If the row is being merged into an existing row, this field will be ignored.
"""
@@ -357,25 +355,25 @@ class InsertDatasetEvent(TypedDict):
origin: NotRequired[ObjectReferenceNullish | None]
root_span_id: NotRequired[str | None]
"""
- Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the a trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
+ Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
- For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the Braintrust UI, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
If the row is being merged into an existing row, this field will be ignored.
"""
span_id: NotRequired[str | None]
"""
- Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the a trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
+ Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
- For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the Braintrust UI, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
If the row is being merged into an existing row, this field will be ignored.
"""
span_parents: NotRequired[Sequence[str] | None]
"""
- Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the a trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
+ Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
- For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the Braintrust UI, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
If the row is being merged into an existing row, this field will be ignored.
"""
diff --git a/py/src/braintrust/api/_generated/models/env_vars.py b/py/src/braintrust/api/_generated/models/env_vars.py
index f8dadf5d..03d8becf 100644
--- a/py/src/braintrust/api/_generated/models/env_vars.py
+++ b/py/src/braintrust/api/_generated/models/env_vars.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 8a7b73c3685cf6360f04cb770c62b066ef9cf5cfbd412f3bac1394315974ab98
+# Content SHA-256: b3bfe75be66db00f4cf4a9c50100a0a14586ea2b19135c278d652af79f820ce9
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -42,7 +42,7 @@ class EnvVar(TypedDict):
"""
secret_category: NotRequired[Literal["env_var", "ai_provider", "sandbox_provider", "automation_integration"]]
"""
- The category of the secret: env_var for regular environment variables, ai_provider for AI provider API keys
+ The category of the secret: env_var for regular environment variables, ai_provider for AI provider API keys, sandbox_provider for sandbox provider credentials, automation_integration for automation delivery credentials
"""
secret_type: NotRequired[str | None]
"""
diff --git a/py/src/braintrust/api/_generated/models/environments.py b/py/src/braintrust/api/_generated/models/environments.py
index 68e34f26..8283c756 100644
--- a/py/src/braintrust/api/_generated/models/environments.py
+++ b/py/src/braintrust/api/_generated/models/environments.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/experiments.py b/py/src/braintrust/api/_generated/models/experiments.py
index 6f190a8d..615315af 100644
--- a/py/src/braintrust/api/_generated/models/experiments.py
+++ b/py/src/braintrust/api/_generated/models/experiments.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 13ab7f0bed6dc90ff59a57437295ca857d68b63b0d5a2026173326cffcef25b1
+# Content SHA-256: 7a9bdf6f37278492847caa85c0ba4562fc49106c86b22a95510399261c78aa02
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -553,7 +553,7 @@ class ExperimentEvent(TypedDict):
"""
scores: NotRequired[Mapping[str, float | None] | None]
"""
- A dictionary of numeric values (between 0 and 1) to log. The scores should give you a variety of signals that help you determine how accurate the outputs are compared to what you expect and diagnose failures. For example, a summarization app might have one score that tells you how accurate the summary is, and another that measures the word similarity between the generated and grouth truth summary. The word similarity score could help you determine whether the summarization was covering similar concepts or not. You can use these scores to help you sort, filter, and compare experiments
+ A dictionary of numeric values (between 0 and 1) to log. The scores should give you a variety of signals that help you determine how accurate the outputs are compared to what you expect and diagnose failures. For example, a summarization app might have one score that tells you how accurate the summary is, and another that measures the word similarity between the generated and ground truth summary. The word similarity score could help you determine whether the summarization was covering similar concepts or not. You can use these scores to help you sort, filter, and compare experiments.
"""
span_attributes: NotRequired[SpanAttributes | None]
span_id: str
@@ -588,7 +588,7 @@ class InsertExperimentEvent(TypedDict):
"""
The `_array_delete` field allows removing specific values from array fields. It is an array of objects with `path` and `delete` properties.
- For example, to remove tags "foo" and "bar" from an existing row: `{"_is_merge": true, "_array_delete": [{"path": ["tags"], "delete": ["foo", "bar"]}]}`. For nested fields like `metadata.categories`, use `[{"path": ["metadata", "categories"], "delete": ["value"]}]`. This will remove those specific values from the array while preserving others.
+ For example, to remove tags "foo" and "bar" from an existing row with id "abc": `{"id": "abc", "_is_merge": true, "_array_delete": [{"path": ["tags"], "delete": ["foo", "bar"]}]}`. For nested fields like `metadata.categories`, use `{"id": "abc", "_is_merge": true, "_array_delete": [{"path": ["metadata", "categories"], "delete": ["value"]}]}`. This will remove those specific values from the array while preserving others.
"""
_is_merge: NotRequired[bool | None]
"""
@@ -600,7 +600,7 @@ class InsertExperimentEvent(TypedDict):
"""
The `_merge_paths` field allows controlling the depth of the merge, when `_is_merge=true`. `_merge_paths` is a list of paths, where each path is a list of field names. The deep merge will not descend below any of the specified merge paths.
- For example, say there is an existing row in the DB `{"id": "foo", "input": {"a": {"b": 10}, "c": {"d": 20}}, "output": {"a": 20}}`. If we merge a new row as `{"_is_merge": true, "_merge_paths": [["input", "a"], ["output"]], "input": {"a": {"q": 30}, "c": {"e": 30}, "bar": "baz"}, "output": {"d": 40}}`, the new row will be `{"id": "foo": "input": {"a": {"q": 30}, "c": {"d": 20, "e": 30}, "bar": "baz"}, "output": {"d": 40}}`. In this case, due to the merge paths, we have replaced `input.a` and `output`, but have still deep-merged `input` and `input.c`.
+ For example, say there is an existing row in the DB `{"id": "foo", "input": {"a": {"b": 10}, "c": {"d": 20}}, "output": {"a": 20}}`. If we merge a new row as `{"id": "foo", "_is_merge": true, "_merge_paths": [["input", "a"], ["output"]], "input": {"a": {"q": 30}, "c": {"e": 30}, "bar": "baz"}, "output": {"d": 40}}`, the new row will be `{"id": "foo", "input": {"a": {"q": 30}, "c": {"d": 20, "e": 30}, "bar": "baz"}, "output": {"d": 40}}`. In this case, due to the merge paths, we have replaced `input.a` and `output`, but have still deep-merged `input` and `input.c`.
"""
_object_delete: NotRequired[bool | None]
"""
@@ -608,11 +608,9 @@ class InsertExperimentEvent(TypedDict):
"""
_parent_id: NotRequired[str | None]
"""
- DEPRECATED: The `_parent_id` field is deprecated and should not be used. Support for `_parent_id` will be dropped in a future version of Braintrust. Log `span_id`, `root_span_id`, and `span_parents` explicitly instead.
+ Deprecated. Log `span_id`, `root_span_id`, and `span_parents` explicitly instead.
- Use the `_parent_id` field to create this row as a subspan of an existing row. Tracking hierarchical relationships are important for tracing (see the [guide](https://docs.braintrust.dev/instrument) for full details).
-
- For example, say we have logged a row `{"id": "abc", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"_parent_id": "abc", "id": "llm_call", "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For legacy clients, `_parent_id` identifies the existing row to use as this row's parent.
If the row is being merged into an existing row, this field will be ignored.
"""
@@ -659,30 +657,30 @@ class InsertExperimentEvent(TypedDict):
"""
root_span_id: NotRequired[str | None]
"""
- Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the a trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
+ Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
- For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the Braintrust UI, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
If the row is being merged into an existing row, this field will be ignored.
"""
scores: NotRequired[Mapping[str, float | None] | None]
"""
- A dictionary of numeric values (between 0 and 1) to log. The scores should give you a variety of signals that help you determine how accurate the outputs are compared to what you expect and diagnose failures. For example, a summarization app might have one score that tells you how accurate the summary is, and another that measures the word similarity between the generated and grouth truth summary. The word similarity score could help you determine whether the summarization was covering similar concepts or not. You can use these scores to help you sort, filter, and compare experiments
+ A dictionary of numeric values (between 0 and 1) to log. The scores should give you a variety of signals that help you determine how accurate the outputs are compared to what you expect and diagnose failures. For example, a summarization app might have one score that tells you how accurate the summary is, and another that measures the word similarity between the generated and ground truth summary. The word similarity score could help you determine whether the summarization was covering similar concepts or not. You can use these scores to help you sort, filter, and compare experiments.
"""
span_attributes: NotRequired[SpanAttributes | None]
span_id: NotRequired[str | None]
"""
- Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the a trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
+ Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
- For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the Braintrust UI, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
If the row is being merged into an existing row, this field will be ignored.
"""
span_parents: NotRequired[Sequence[str] | None]
"""
- Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the a trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
+ Use `span_id`, `root_span_id`, and `span_parents` instead of `_parent_id`, which is now deprecated. The span_id is a unique identifier describing the row's place in the trace, and the root_span_id is a unique identifier for the whole trace. See the [guide](https://docs.braintrust.dev/instrument) for full details.
- For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the webapp, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
+ For example, say we have logged a row `{"id": "abc", "span_id": "span0", "root_span_id": "root_span0", "input": "foo", "output": "bar", "expected": "boo", "scores": {"correctness": 0.33}}`. We can create a sub-span of the parent row by logging `{"id": "llm_call", "span_id": "span1", "root_span_id": "root_span0", "span_parents": ["span0"], "input": {"prompt": "What comes after foo?"}, "output": "bar", "metrics": {"tokens": 1}}`. In the Braintrust UI, only the root span row `"abc"` will show up in the summary view. You can view the full trace hierarchy (in this case, the `"llm_call"` row) by clicking on the "abc" row.
If the row is being merged into an existing row, this field will be ignored.
"""
diff --git a/py/src/braintrust/api/_generated/models/functions.py b/py/src/braintrust/api/_generated/models/functions.py
index 7e15b40b..9b38c59a 100644
--- a/py/src/braintrust/api/_generated/models/functions.py
+++ b/py/src/braintrust/api/_generated/models/functions.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: e7dce33627432e5b3be48731e3da4544cfd730ed6e7e5f8475fd595d2c6dba5a
+# Content SHA-256: be965eec74212962fb4794c9e9de494af532ec3259d950657c22e757eb9bde89
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -13,8 +13,11 @@
from .common import (
AclObjectType,
ChatCompletionMessageParam,
+ Choice,
FunctionTypeEnum,
FunctionTypeEnumNullish,
+ InputItem,
+ Level,
PromptDataNullish,
)
@@ -120,7 +123,7 @@ class FunctionSchema(TypedDict):
class Origin(TypedDict):
internal: NotRequired[bool | None]
"""
- The function exists for internal purposes and should not be displayed in the list of functions.
+ If true, the function was created for use by another Braintrust object and is hidden from function lists in the Braintrust UI.
"""
object_id: str
"""
@@ -197,7 +200,7 @@ class FieldSchema(TypedDict):
)
-class Agent1(TypedDict):
+class Agent(TypedDict):
agent_name: str
"""
The name of the LiveKit agent to dispatch
@@ -209,18 +212,18 @@ class Agent1(TypedDict):
type: Literal["livekit"]
-class Agent2(TypedDict):
+class Agent1(TypedDict):
phone_number: str
type: Literal["phone"]
-class Agent3(TypedDict):
+class Agent2(TypedDict):
type: Literal["sip"]
uri: str
-class Config6(TypedDict):
- agent: Agent1 | Agent2 | Agent3
+class Config5(TypedDict):
+ agent: Agent | Agent1 | Agent2
initiator: NotRequired[Literal["agent", "simulated_user"]]
"""
Who speaks first in the conversation
@@ -232,7 +235,7 @@ class Config6(TypedDict):
"""
-class Agent4(TypedDict):
+class Agent3(TypedDict):
agent_name: str
"""
The name of the LiveKit agent to dispatch
@@ -244,7 +247,7 @@ class Agent4(TypedDict):
type: Literal["livekit"]
-class Agent5(TypedDict):
+class Agent4(TypedDict):
args: NotRequired[Sequence[str]]
"""
Arguments passed to the executable without shell interpretation
@@ -264,8 +267,8 @@ class Agent5(TypedDict):
type: Literal["acp"]
-class Config7(TypedDict):
- agent: Agent4 | Agent5
+class Config6(TypedDict):
+ agent: Agent3 | Agent4
initiator: NotRequired[Literal["agent", "simulated_user"]]
"""
Who speaks first in the conversation
@@ -278,7 +281,7 @@ class Config7(TypedDict):
class FunctionData6(TypedDict):
- config: Config6 | Config7
+ config: Config5 | Config6
type: Literal["simulation"]
@@ -326,7 +329,7 @@ class FunctionDataNullish3(TypedDict):
)
-class Agent6(TypedDict):
+class Agent5(TypedDict):
agent_name: str
"""
The name of the LiveKit agent to dispatch
@@ -338,18 +341,18 @@ class Agent6(TypedDict):
type: Literal["livekit"]
-class Agent7(TypedDict):
+class Agent6(TypedDict):
phone_number: str
type: Literal["phone"]
-class Agent8(TypedDict):
+class Agent7(TypedDict):
type: Literal["sip"]
uri: str
-class Config8(TypedDict):
- agent: Agent6 | Agent7 | Agent8
+class Config7(TypedDict):
+ agent: Agent5 | Agent6 | Agent7
initiator: NotRequired[Literal["agent", "simulated_user"]]
"""
Who speaks first in the conversation
@@ -361,7 +364,7 @@ class Config8(TypedDict):
"""
-class Agent9(TypedDict):
+class Agent8(TypedDict):
agent_name: str
"""
The name of the LiveKit agent to dispatch
@@ -373,7 +376,7 @@ class Agent9(TypedDict):
type: Literal["livekit"]
-class Agent10(TypedDict):
+class Agent9(TypedDict):
args: NotRequired[Sequence[str]]
"""
Arguments passed to the executable without shell interpretation
@@ -393,8 +396,8 @@ class Agent10(TypedDict):
type: Literal["acp"]
-class Config9(TypedDict):
- agent: Agent9 | Agent10
+class Config8(TypedDict):
+ agent: Agent8 | Agent9
initiator: NotRequired[Literal["agent", "simulated_user"]]
"""
Who speaks first in the conversation
@@ -407,7 +410,7 @@ class Config9(TypedDict):
class FunctionDataNullish6(TypedDict):
- config: Config8 | Config9
+ config: Config7 | Config8
type: Literal["simulation"]
@@ -568,6 +571,46 @@ class PromptBlockData2(TypedDict):
type: Literal["completion"]
+class Question1(TypedDict):
+ type: Literal["predicate"]
+
+
+class Question2(TypedDict):
+ choices: Sequence[Choice]
+ type: Literal["choice"]
+
+
+class Question3(TypedDict):
+ levels: Sequence[Level]
+ type: Literal["score"]
+
+
+class Question4(TypedDict):
+ instructions: str
+ name: NotRequired[str]
+
+
+class Question5(Question1, Question4):
+ pass
+
+
+class Question6(Question2, Question4):
+ pass
+
+
+class Question7(Question3, Question4):
+ pass
+
+
+Question: TypeAlias = Question5 | Question6 | Question7
+
+
+class PromptBlockData3(TypedDict):
+ input: str | Sequence[InputItem]
+ questions: Sequence[Question]
+ type: Literal["decisions"]
+
+
class SourceFacetFunction1(TypedDict):
id: str
type: Literal["function"]
@@ -746,7 +789,7 @@ class PromptBlockData1(TypedDict):
type: Literal["chat"]
-PromptBlockData: TypeAlias = PromptBlockData1 | PromptBlockData2
+PromptBlockData: TypeAlias = PromptBlockData1 | PromptBlockData2 | PromptBlockData3
class GraphNode8(TypedDict):
diff --git a/py/src/braintrust/api/_generated/models/groups.py b/py/src/braintrust/api/_generated/models/groups.py
index 6d67021a..0b108d4f 100644
--- a/py/src/braintrust/api/_generated/models/groups.py
+++ b/py/src/braintrust/api/_generated/models/groups.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/ingest_keys.py b/py/src/braintrust/api/_generated/models/ingest_keys.py
new file mode 100644
index 00000000..35ded08f
--- /dev/null
+++ b/py/src/braintrust/api/_generated/models/ingest_keys.py
@@ -0,0 +1,44 @@
+# Generated by scripts/generate-api-client.py. DO NOT EDIT.
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
+# datamodel-code-generator: 0.81.0
+# ruff: 0.15.21
+# Generator Python: 3.14
+# Content SHA-256: 4b70039c6470ecc9c24f9339791234039cb9b6f567117d33079cb61b42034277
+
+from typing_extensions import NotRequired
+from typing import Any, Literal, TypeAlias, TypedDict
+from collections.abc import Mapping, Sequence
+
+
+class IngestKey(TypedDict):
+ created: NotRequired[str | None]
+ """
+ Date of ingest key creation
+ """
+ id: str
+ """
+ Unique identifier for the ingest key
+ """
+ name: str
+ """
+ Name of the ingest key
+ """
+ org_id: str
+ preview_name: str
+ project_id: str
+
+
+class Object(IngestKey):
+ url: str | None
+ """
+ Null when the organization's API URL cannot be used for ingest keys
+ """
+
+
+class ListIngestKeysResponse(TypedDict):
+ objects: Sequence[Object]
+
+
+class CreateIngestKeyResponse(IngestKey):
+ url: str
diff --git a/py/src/braintrust/api/_generated/models/mcp_servers.py b/py/src/braintrust/api/_generated/models/mcp_servers.py
index f89171cc..a9132e72 100644
--- a/py/src/braintrust/api/_generated/models/mcp_servers.py
+++ b/py/src/braintrust/api/_generated/models/mcp_servers.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/org_automations.py b/py/src/braintrust/api/_generated/models/org_automations.py
deleted file mode 100644
index 38322355..00000000
--- a/py/src/braintrust/api/_generated/models/org_automations.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
-# datamodel-code-generator: 0.81.0
-# ruff: 0.15.21
-# Generator Python: 3.14
-# Content SHA-256: c6c8c041190797c66c6590f410ab9bc7835cb50ca7a8ddfe788690a39b106025
-
-from typing_extensions import NotRequired
-from typing import Any, Literal, TypeAlias, TypedDict
-from collections.abc import Mapping, Sequence
-
-from .common import Config4, RetentionObjectType
-
-OrgAutomationIdParam: TypeAlias = str
-"""
-OrgAutomation id
-"""
-
-OrgAutomationName: TypeAlias = str
-"""
-Name of the org_automation to search for
-"""
-
-
-class Config(TypedDict):
- event_type: Literal["retention"]
- """
- The type of automation.
- """
- object_type: RetentionObjectType
- retention_days: int
- """
- The number of days to retain the object
- """
-
-
-class CreateOrgAutomation(TypedDict):
- config: Config
- """
- The configuration for the org automation rule
- """
- description: NotRequired[str | None]
- """
- Textual description of the project automation
- """
- name: str
- """
- Name of the project automation
- """
- org_id: str
- """
- Unique identifier for the organization that the org automation belongs under
- """
-
-
-class OrgAutomation(TypedDict):
- config: Config4
- """
- The configuration for the org automation rule
- """
- created: NotRequired[str | None]
- """
- Date of project automation creation
- """
- description: NotRequired[str | None]
- """
- Textual description of the project automation
- """
- id: str
- """
- Unique identifier for the project automation
- """
- name: str
- """
- Name of the project automation
- """
- org_id: str
- """
- Unique identifier for the organization that the org automation belongs under
- """
- user_id: NotRequired[str | None]
- """
- Identifies the user who created the project automation
- """
-
-
-class PatchOrgAutomation(TypedDict):
- config: NotRequired[Config4 | None]
- """
- The configuration for the org automation rule
- """
- description: NotRequired[str | None]
- """
- Textual description of the project automation
- """
- name: NotRequired[str | None]
- """
- Name of the project automation
- """
-
-
-class GetOrgAutomationResponse(TypedDict):
- objects: Sequence[OrgAutomation]
- """
- A list of org automation objects
- """
diff --git a/py/src/braintrust/api/_generated/models/organizations.py b/py/src/braintrust/api/_generated/models/organizations.py
index 21a63591..07b62d05 100644
--- a/py/src/braintrust/api/_generated/models/organizations.py
+++ b/py/src/braintrust/api/_generated/models/organizations.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: 9eabdfb4de6308d2596d3fbf33c82116616ced60e45ce1f4ce63a84d8ceab594
+# Content SHA-256: f1d102ad0318207a8c27b2647d06ab8cc0abd34af0a0bcee490f7193970c755f
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -43,25 +43,46 @@ class GetOrganizationApiKeysResponse(TypedDict):
class Organization(TypedDict):
api_url: NotRequired[str | None]
+ """
+ URL of the organization's data plane API. If unset, the Braintrust-hosted API is used.
+ """
archived_at: NotRequired[str | None]
+ """
+ Date the organization was archived
+ """
created: NotRequired[str | None]
"""
Date of organization creation
"""
deleted_at: NotRequired[str | None]
+ """
+ Date the organization was deleted
+ """
id: str
"""
Unique identifier for the organization
"""
image_rendering_mode: NotRequired[ImageRenderingMode | None]
is_dataplane_private: NotRequired[bool | None]
+ """
+ Whether the organization's data plane is only reachable from a private network
+ """
is_universal_api: NotRequired[bool | None]
+ """
+ Whether the data plane at `api_url` also serves the AI proxy, at `api_url` with `/v1/proxy` appended
+ """
name: str
"""
Name of the organization
"""
proxy_url: NotRequired[str | None]
+ """
+ URL of the organization's AI proxy
+ """
realtime_url: NotRequired[str | None]
+ """
+ URL of the organization's realtime service
+ """
OrganizationIdParam: TypeAlias = str
@@ -72,15 +93,30 @@ class Organization(TypedDict):
class PatchOrganization(TypedDict):
api_url: NotRequired[str | None]
+ """
+ URL of the organization's data plane API. If unset, the Braintrust-hosted API is used.
+ """
image_rendering_mode: NotRequired[ImageRenderingMode | None]
is_dataplane_private: NotRequired[bool | None]
+ """
+ Whether the organization's data plane is only reachable from a private network
+ """
is_universal_api: NotRequired[bool | None]
+ """
+ Whether the data plane at `api_url` also serves the AI proxy, at `api_url` with `/v1/proxy` appended
+ """
name: NotRequired[str | None]
"""
Name of the organization
"""
proxy_url: NotRequired[str | None]
+ """
+ URL of the organization's AI proxy
+ """
realtime_url: NotRequired[str | None]
+ """
+ URL of the organization's realtime service
+ """
class ServiceAccount(TypedDict):
diff --git a/py/src/braintrust/api/_generated/models/project_automations.py b/py/src/braintrust/api/_generated/models/project_automations.py
index 01a496f4..64aff4bc 100644
--- a/py/src/braintrust/api/_generated/models/project_automations.py
+++ b/py/src/braintrust/api/_generated/models/project_automations.py
@@ -1,16 +1,16 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: b00db48aef601432e6454013c670b43baf7e54205c6680089fe13b04b08e29a9
+# Content SHA-256: 0cf5fa8267f3a50119251aef88d5b5b8f600ea7ed353551784a043eca860605a
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
from collections.abc import Mapping, Sequence
-from .common import AutomationStatus, Config4, FunctionTypeEnum, GroupScope, RetentionObjectType, SpanScope, TraceScope
+from .common import AutomationStatus, FunctionTypeEnum, GroupScope, SpanScope, TraceScope
class Action(TypedDict):
@@ -67,7 +67,7 @@ class Action2(TypedDict):
"""
-class Config1(TypedDict):
+class Config(TypedDict):
action: Action | Action1 | Action2
"""
The action to take when the automation rule is triggered
@@ -127,7 +127,7 @@ class ExportDefinition2(TypedDict):
type: Literal["btql_query"]
-class Config3(TypedDict):
+class Config2(TypedDict):
batch_size: NotRequired[int | None]
"""
The maximum number of result rows to write per async query batch
@@ -213,7 +213,7 @@ class Action5(TypedDict):
"""
-class Config5(TypedDict):
+class Config4(TypedDict):
action: Action3 | Action4 | Action5
"""
The action to take when the automation rule is triggered
@@ -283,7 +283,7 @@ class Action8(TypedDict):
"""
-class Config12(TypedDict):
+class Config9(TypedDict):
action: Action6 | Action7 | Action8
"""
The action to take when the automation rule is triggered
@@ -343,7 +343,7 @@ class ExportDefinition5(TypedDict):
type: Literal["btql_query"]
-class Config14(TypedDict):
+class Config11(TypedDict):
batch_size: NotRequired[int | None]
"""
The maximum number of result rows to write per async query batch
@@ -429,7 +429,7 @@ class Action11(TypedDict):
"""
-class Config16(TypedDict):
+class Config13(TypedDict):
action: Action9 | Action10 | Action11
"""
The action to take when the automation rule is triggered
@@ -499,7 +499,7 @@ class Action14(TypedDict):
"""
-class Config17(TypedDict):
+class Config14(TypedDict):
action: Action12 | Action13 | Action14
"""
The action to take when the automation rule is triggered
@@ -559,7 +559,7 @@ class ExportDefinition8(TypedDict):
type: Literal["btql_query"]
-class Config19(TypedDict):
+class Config16(TypedDict):
batch_size: NotRequired[int | None]
"""
The maximum number of result rows to write per async query batch
@@ -645,7 +645,7 @@ class Action17(TypedDict):
"""
-class Config21(TypedDict):
+class Config18(TypedDict):
action: Action15 | Action16 | Action17
"""
The action to take when the automation rule is triggered
@@ -676,6 +676,11 @@ class RuntimeBlock(TypedDict):
Name of the project_automation to search for
"""
+RetentionObjectType: TypeAlias = Literal["project_logs", "experiment", "dataset"]
+"""
+The object type that the retention policy applies to
+"""
+
BackfillTimeRange = TypedDict(
"BackfillTimeRange",
{
@@ -897,7 +902,7 @@ class Actions2(TypedDict):
class Target1(TypedDict):
- id: str | Literal["overview"]
+ id: Literal["overview"]
type: Literal["dashboard"]
@@ -1052,7 +1057,7 @@ class WindowedAutomationConfig(TypedDict):
window: Window
-class Config2(TypedDict):
+class Config1(TypedDict):
batch_size: NotRequired[float | None]
"""
The number of rows to export in each batch
@@ -1085,7 +1090,19 @@ class Config2(TypedDict):
status: NotRequired[AutomationStatus]
-class Config13(TypedDict):
+class Config3(TypedDict):
+ event_type: Literal["retention"]
+ """
+ The type of automation.
+ """
+ object_type: RetentionObjectType
+ retention_days: int
+ """
+ The number of days to retain the object
+ """
+
+
+class Config10(TypedDict):
batch_size: NotRequired[float | None]
"""
The number of rows to export in each batch
@@ -1118,7 +1135,7 @@ class Config13(TypedDict):
status: NotRequired[AutomationStatus]
-class Config15(TypedDict):
+class Config12(TypedDict):
event_type: Literal["retention"]
"""
The type of automation.
@@ -1130,7 +1147,7 @@ class Config15(TypedDict):
"""
-class Config18(TypedDict):
+class Config15(TypedDict):
batch_size: NotRequired[float | None]
"""
The number of rows to export in each batch
@@ -1163,7 +1180,7 @@ class Config18(TypedDict):
status: NotRequired[AutomationStatus]
-class Config20(TypedDict):
+class Config17(TypedDict):
event_type: Literal["retention"]
"""
The type of automation.
@@ -1219,11 +1236,11 @@ class TopicAutomationConfig(TypedDict):
class CreateProjectAutomation(TypedDict):
config: (
- Config1
+ Config
+ | Config1
| Config2
| Config3
| Config4
- | Config5
| WindowedAutomationConfig
| TopicAutomationConfig
| TopicDigestAutomationConfig
@@ -1247,11 +1264,11 @@ class CreateProjectAutomation(TypedDict):
class PatchProjectAutomation(TypedDict):
config: NotRequired[
- Config12
+ Config9
+ | Config10
+ | Config11
+ | Config12
| Config13
- | Config14
- | Config15
- | Config16
| WindowedAutomationConfig
| TopicAutomationConfig
| TopicDigestAutomationConfig
@@ -1272,11 +1289,11 @@ class PatchProjectAutomation(TypedDict):
class ProjectAutomation(TypedDict):
config: (
- Config17
+ Config14
+ | Config15
+ | Config16
+ | Config17
| Config18
- | Config19
- | Config20
- | Config21
| WindowedAutomationConfig
| TopicAutomationConfig
| TopicDigestAutomationConfig
diff --git a/py/src/braintrust/api/_generated/models/project_groups.py b/py/src/braintrust/api/_generated/models/project_groups.py
index 3f7d7857..d1fd5fb0 100644
--- a/py/src/braintrust/api/_generated/models/project_groups.py
+++ b/py/src/braintrust/api/_generated/models/project_groups.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/project_scores.py b/py/src/braintrust/api/_generated/models/project_scores.py
index 0bbd7eea..84c35a6a 100644
--- a/py/src/braintrust/api/_generated/models/project_scores.py
+++ b/py/src/braintrust/api/_generated/models/project_scores.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: bcb9b0b49d36d87680cac894a2b7cb53ffbf59b8ef8b07dbe793dd0dd6a6c1a1
+# Content SHA-256: d6ef5d53998452afb3b80d53ab8aab09233f867671f6e315af6a04fb8aebe258
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -119,6 +119,10 @@ class OnlineScoreConfig(TypedDict):
"""
The list of functions to run for online scoring. Can include scorers, facets, or other function types.
"""
+ service_tier: NotRequired[Literal["standard", "flex"]]
+ """
+ Service tier for online scoring. If omitted, prompt-level service tiers are preserved.
+ """
skip_logging: NotRequired[bool | None]
"""
Whether to skip adding scorer spans when computing scores
diff --git a/py/src/braintrust/api/_generated/models/project_tags.py b/py/src/braintrust/api/_generated/models/project_tags.py
index 1bd61de4..0f4ba56f 100644
--- a/py/src/braintrust/api/_generated/models/project_tags.py
+++ b/py/src/braintrust/api/_generated/models/project_tags.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/projects.py b/py/src/braintrust/api/_generated/models/projects.py
index 5ae451da..7e48f633 100644
--- a/py/src/braintrust/api/_generated/models/projects.py
+++ b/py/src/braintrust/api/_generated/models/projects.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/prompts.py b/py/src/braintrust/api/_generated/models/prompts.py
index 9613a168..e7b2ffe3 100644
--- a/py/src/braintrust/api/_generated/models/prompts.py
+++ b/py/src/braintrust/api/_generated/models/prompts.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/roles.py b/py/src/braintrust/api/_generated/models/roles.py
index 53ed7c2f..ba44a0ad 100644
--- a/py/src/braintrust/api/_generated/models/roles.py
+++ b/py/src/braintrust/api/_generated/models/roles.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/service_tokens.py b/py/src/braintrust/api/_generated/models/service_tokens.py
index 962f7673..7f58e758 100644
--- a/py/src/braintrust/api/_generated/models/service_tokens.py
+++ b/py/src/braintrust/api/_generated/models/service_tokens.py
@@ -1,10 +1,10 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
-# Content SHA-256: c083f63a47632f06c141d4a9d44615b348884f91d66750225acb9d988805fc75
+# Content SHA-256: 3d872f6134a6be7c9d73681c3e51fd02e1eb9e2b9a4ece6320bf02af882501ca
from typing_extensions import NotRequired
from typing import Any, Literal, TypeAlias, TypedDict
@@ -37,6 +37,9 @@ class CreateServiceTokenOutput(TypedDict):
Unique identifier for the organization
"""
preview_name: str
+ """
+ Masked preview showing the token prefix and last four characters, e.g. bt-st-…AbCd.
+ """
service_account_email: NotRequired[str | None]
"""
The service account email (not routable)
@@ -80,6 +83,9 @@ class ServiceToken(TypedDict):
Unique identifier for the organization
"""
preview_name: str
+ """
+ Masked preview showing the token prefix and last four characters, e.g. bt-st-…AbCd.
+ """
service_account_email: NotRequired[str | None]
"""
The service account email (not routable)
diff --git a/py/src/braintrust/api/_generated/models/span_iframes.py b/py/src/braintrust/api/_generated/models/span_iframes.py
index 49fde883..66407130 100644
--- a/py/src/braintrust/api/_generated/models/span_iframes.py
+++ b/py/src/braintrust/api/_generated/models/span_iframes.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/users.py b/py/src/braintrust/api/_generated/models/users.py
index 0a61242f..5f877fe3 100644
--- a/py/src/braintrust/api/_generated/models/users.py
+++ b/py/src/braintrust/api/_generated/models/users.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/models/views.py b/py/src/braintrust/api/_generated/models/views.py
index 60d632be..9d98cbca 100644
--- a/py/src/braintrust/api/_generated/models/views.py
+++ b/py/src/braintrust/api/_generated/models/views.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/org_automations.py b/py/src/braintrust/api/_generated/org_automations.py
deleted file mode 100644
index 159e03a5..00000000
--- a/py/src/braintrust/api/_generated/org_automations.py
+++ /dev/null
@@ -1,257 +0,0 @@
-# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
-# datamodel-code-generator: 0.81.0
-# ruff: 0.15.21
-# Generator Python: 3.14
-# Content SHA-256: 7c38b2fe1729ef5e1a3f54934cd8d021ffa9de488a5993adfc47bea072caf865
-
-"""Generated OrgAutomations REST operations and resource."""
-
-from typing import cast
-
-from .._service import Operation, Parameter, ResourceAPI
-from ..policies import RetryMode
-from .models.common import AppLimitParam, EndingBefore, Ids, OrgName, StartingAfter
-from .models.org_automations import (
- CreateOrgAutomation,
- GetOrgAutomationResponse,
- OrgAutomation,
- OrgAutomationIdParam,
- OrgAutomationName,
- PatchOrgAutomation,
-)
-
-
-POST_ORG_AUTOMATION = Operation(
- operation_id="postOrgAutomation",
- method="POST",
- path="/v1/org_automation",
- parameters=(),
- has_request_body=True,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-PUT_ORG_AUTOMATION = Operation(
- operation_id="putOrgAutomation",
- method="PUT",
- path="/v1/org_automation",
- parameters=(),
- has_request_body=True,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-GET_ORG_AUTOMATION = Operation(
- operation_id="getOrgAutomation",
- method="GET",
- path="/v1/org_automation",
- parameters=(
- Parameter(
- argument_name="limit",
- name="limit",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="starting_after",
- name="starting_after",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="ending_before",
- name="ending_before",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="ids",
- name="ids",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="org_automation_name",
- name="org_automation_name",
- location="query",
- required=False,
- ),
- Parameter(
- argument_name="org_name",
- name="org_name",
- location="query",
- required=False,
- ),
- ),
- has_request_body=False,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.SAFE_READ,
-)
-
-
-GET_ORG_AUTOMATION_ID = Operation(
- operation_id="getOrgAutomationId",
- method="GET",
- path="/v1/org_automation/{org_automation_id}",
- parameters=(
- Parameter(
- argument_name="org_automation_id",
- name="org_automation_id",
- location="path",
- required=True,
- ),
- ),
- has_request_body=False,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.SAFE_READ,
-)
-
-
-PATCH_ORG_AUTOMATION_ID = Operation(
- operation_id="patchOrgAutomationId",
- method="PATCH",
- path="/v1/org_automation/{org_automation_id}",
- parameters=(
- Parameter(
- argument_name="org_automation_id",
- name="org_automation_id",
- location="path",
- required=True,
- ),
- ),
- has_request_body=True,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-DELETE_ORG_AUTOMATION_ID = Operation(
- operation_id="deleteOrgAutomationId",
- method="DELETE",
- path="/v1/org_automation/{org_automation_id}",
- parameters=(
- Parameter(
- argument_name="org_automation_id",
- name="org_automation_id",
- location="path",
- required=True,
- ),
- ),
- has_request_body=False,
- success_statuses=(200,),
- json_success_statuses=(200,),
- retry_mode=RetryMode.NONE,
-)
-
-
-OPERATIONS = {
- "postOrgAutomation": POST_ORG_AUTOMATION,
- "putOrgAutomation": PUT_ORG_AUTOMATION,
- "getOrgAutomation": GET_ORG_AUTOMATION,
- "getOrgAutomationId": GET_ORG_AUTOMATION_ID,
- "patchOrgAutomationId": PATCH_ORG_AUTOMATION_ID,
- "deleteOrgAutomationId": DELETE_ORG_AUTOMATION_ID,
-}
-
-
-class OrgAutomationsAPI(ResourceAPI):
- """Generated OrgAutomations REST API."""
-
- def post_org_automation(
- self,
- *,
- body: "CreateOrgAutomation",
- ) -> "OrgAutomation":
- return cast(
- "OrgAutomation",
- self.execute(
- POST_ORG_AUTOMATION,
- body=body,
- ),
- )
-
- def put_org_automation(
- self,
- *,
- body: "CreateOrgAutomation",
- ) -> "OrgAutomation":
- return cast(
- "OrgAutomation",
- self.execute(
- PUT_ORG_AUTOMATION,
- body=body,
- ),
- )
-
- def get_org_automation(
- self,
- *,
- limit: "AppLimitParam | None" = None,
- starting_after: "StartingAfter | None" = None,
- ending_before: "EndingBefore | None" = None,
- ids: "Ids | None" = None,
- org_automation_name: "OrgAutomationName | None" = None,
- org_name: "OrgName | None" = None,
- ) -> "GetOrgAutomationResponse":
- return cast(
- "GetOrgAutomationResponse",
- self.execute(
- GET_ORG_AUTOMATION,
- query_parameters={
- "limit": limit,
- "starting_after": starting_after,
- "ending_before": ending_before,
- "ids": ids,
- "org_automation_name": org_automation_name,
- "org_name": org_name,
- },
- ),
- )
-
- def get_org_automation_id(
- self,
- org_automation_id: "OrgAutomationIdParam",
- ) -> "OrgAutomation":
- return cast(
- "OrgAutomation",
- self.execute(
- GET_ORG_AUTOMATION_ID,
- path_parameters={"org_automation_id": org_automation_id},
- ),
- )
-
- def patch_org_automation_id(
- self,
- org_automation_id: "OrgAutomationIdParam",
- *,
- body: "PatchOrgAutomation | None" = None,
- ) -> "OrgAutomation":
- return cast(
- "OrgAutomation",
- self.execute(
- PATCH_ORG_AUTOMATION_ID,
- path_parameters={"org_automation_id": org_automation_id},
- body=body,
- ),
- )
-
- def delete_org_automation_id(
- self,
- org_automation_id: "OrgAutomationIdParam",
- ) -> "OrgAutomation":
- return cast(
- "OrgAutomation",
- self.execute(
- DELETE_ORG_AUTOMATION_ID,
- path_parameters={"org_automation_id": org_automation_id},
- ),
- )
diff --git a/py/src/braintrust/api/_generated/organizations.py b/py/src/braintrust/api/_generated/organizations.py
index 82be3a0b..3af0aca9 100644
--- a/py/src/braintrust/api/_generated/organizations.py
+++ b/py/src/braintrust/api/_generated/organizations.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/project_automations.py b/py/src/braintrust/api/_generated/project_automations.py
index 9d93ffec..8fcace09 100644
--- a/py/src/braintrust/api/_generated/project_automations.py
+++ b/py/src/braintrust/api/_generated/project_automations.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/project_groups.py b/py/src/braintrust/api/_generated/project_groups.py
index 38958f07..16106983 100644
--- a/py/src/braintrust/api/_generated/project_groups.py
+++ b/py/src/braintrust/api/_generated/project_groups.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/project_scores.py b/py/src/braintrust/api/_generated/project_scores.py
index e2b91592..32600f24 100644
--- a/py/src/braintrust/api/_generated/project_scores.py
+++ b/py/src/braintrust/api/_generated/project_scores.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/project_tags.py b/py/src/braintrust/api/_generated/project_tags.py
index 244388c1..2fb7d5e1 100644
--- a/py/src/braintrust/api/_generated/project_tags.py
+++ b/py/src/braintrust/api/_generated/project_tags.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/projects.py b/py/src/braintrust/api/_generated/projects.py
index c24f5fa8..42b749d2 100644
--- a/py/src/braintrust/api/_generated/projects.py
+++ b/py/src/braintrust/api/_generated/projects.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/prompts.py b/py/src/braintrust/api/_generated/prompts.py
index dc85044d..77bd4786 100644
--- a/py/src/braintrust/api/_generated/prompts.py
+++ b/py/src/braintrust/api/_generated/prompts.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/roles.py b/py/src/braintrust/api/_generated/roles.py
index d0bcf88e..9e109a69 100644
--- a/py/src/braintrust/api/_generated/roles.py
+++ b/py/src/braintrust/api/_generated/roles.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/service_tokens.py b/py/src/braintrust/api/_generated/service_tokens.py
index 97aeafe3..3434876d 100644
--- a/py/src/braintrust/api/_generated/service_tokens.py
+++ b/py/src/braintrust/api/_generated/service_tokens.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/span_iframes.py b/py/src/braintrust/api/_generated/span_iframes.py
index 48ed501e..3678ae12 100644
--- a/py/src/braintrust/api/_generated/span_iframes.py
+++ b/py/src/braintrust/api/_generated/span_iframes.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/users.py b/py/src/braintrust/api/_generated/users.py
index 0733de01..fbbc48e4 100644
--- a/py/src/braintrust/api/_generated/users.py
+++ b/py/src/braintrust/api/_generated/users.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/_generated/views.py b/py/src/braintrust/api/_generated/views.py
index ac299488..463b4c0b 100644
--- a/py/src/braintrust/api/_generated/views.py
+++ b/py/src/braintrust/api/_generated/views.py
@@ -1,6 +1,6 @@
# Generated by scripts/generate-api-client.py. DO NOT EDIT.
-# OpenAPI commit: 3384e4be354ec957292f986fcf3e3a4009907651
-# OpenAPI spec SHA-256: cbb5046620f73b5bf4e1e73c0eb12542ab9cbd3393ec568eda3f1a20f0f90a44
+# OpenAPI commit: 4cc0615694512d6e77fce6bff2c70d1531208daa
+# OpenAPI spec SHA-256: ed5153cb78828024c12575df294a886624341065e9e9dd5095d52992087db1be
# datamodel-code-generator: 0.81.0
# ruff: 0.15.21
# Generator Python: 3.14
diff --git a/py/src/braintrust/api/client.py b/py/src/braintrust/api/client.py
index 54041f92..b62b549e 100644
--- a/py/src/braintrust/api/client.py
+++ b/py/src/braintrust/api/client.py
@@ -15,9 +15,9 @@
if TYPE_CHECKING:
from ._generated.acls import AclsAPI
- from ._generated.agents import AgentsAPI
from ._generated.ai_secrets import AiSecretsAPI
from ._generated.api_keys import ApiKeysAPI
+ from ._generated.custom_columns import CustomColumnsAPI
from ._generated.dataset_snapshots import DatasetSnapshotsAPI
from ._generated.datasets import DatasetsAPI
from ._generated.env_vars import EnvVarsAPI
@@ -25,8 +25,8 @@
from ._generated.experiments import ExperimentsAPI
from ._generated.functions import FunctionsAPI
from ._generated.groups import GroupsAPI
+ from ._generated.ingest_keys import IngestKeysAPI
from ._generated.mcp_servers import McpServersAPI
- from ._generated.org_automations import OrgAutomationsAPI
from ._generated.organizations import OrganizationsAPI
from ._generated.project_automations import ProjectAutomationsAPI
from ._generated.project_groups import ProjectGroupsAPI
@@ -207,12 +207,6 @@ def acls(self) -> "AclsAPI":
return self._service("acls", AclsAPI)
- @property
- def agents(self) -> "AgentsAPI":
- from ._generated.agents import AgentsAPI
-
- return self._service("agents", AgentsAPI)
-
@property
def ai_secrets(self) -> "AiSecretsAPI":
from ._generated.ai_secrets import AiSecretsAPI
@@ -225,6 +219,12 @@ def api_keys(self) -> "ApiKeysAPI":
return self._service("api_keys", ApiKeysAPI)
+ @property
+ def custom_columns(self) -> "CustomColumnsAPI":
+ from ._generated.custom_columns import CustomColumnsAPI
+
+ return self._service("custom_columns", CustomColumnsAPI)
+
@property
def dataset_snapshots(self) -> "DatasetSnapshotsAPI":
from ._generated.dataset_snapshots import DatasetSnapshotsAPI
@@ -268,16 +268,16 @@ def groups(self) -> "GroupsAPI":
return self._service("groups", GroupsAPI)
@property
- def mcp_servers(self) -> "McpServersAPI":
- from ._generated.mcp_servers import McpServersAPI
+ def ingest_keys(self) -> "IngestKeysAPI":
+ from ._generated.ingest_keys import IngestKeysAPI
- return self._service("mcp_servers", McpServersAPI)
+ return self._service("ingest_keys", IngestKeysAPI)
@property
- def org_automations(self) -> "OrgAutomationsAPI":
- from ._generated.org_automations import OrgAutomationsAPI
+ def mcp_servers(self) -> "McpServersAPI":
+ from ._generated.mcp_servers import McpServersAPI
- return self._service("org_automations", OrgAutomationsAPI)
+ return self._service("mcp_servers", McpServersAPI)
@property
def organizations(self) -> "OrganizationsAPI":
diff --git a/py/src/braintrust/api/test_generated_models.py b/py/src/braintrust/api/test_generated_models.py
index b458e364..f5a645c2 100644
--- a/py/src/braintrust/api/test_generated_models.py
+++ b/py/src/braintrust/api/test_generated_models.py
@@ -8,9 +8,9 @@
GENERATED_RESOURCE_NAMES = (
"acls",
- "agents",
"ai_secrets",
"api_keys",
+ "custom_columns",
"dataset_snapshots",
"datasets",
"env_vars",
@@ -18,8 +18,8 @@
"experiments",
"functions",
"groups",
+ "ingest_keys",
"mcp_servers",
- "org_automations",
"organizations",
"project_automations",
"project_groups",
@@ -153,7 +153,6 @@ def test_rest_and_logging_type_surfaces_have_reviewed_overlap():
assert overlap == {
"AISecret",
"Acl",
- "Agent",
"ApiKey",
"Dataset",
"DatasetSnapshot",
@@ -162,7 +161,6 @@ def test_rest_and_logging_type_surfaces_have_reviewed_overlap():
"Function",
"Group",
"MCPServer",
- "OrgAutomation",
"Organization",
"Project",
"ProjectAutomation",
diff --git a/py/src/braintrust/api/types/__init__.py b/py/src/braintrust/api/types/__init__.py
index ebbe379c..d10d6934 100644
--- a/py/src/braintrust/api/types/__init__.py
+++ b/py/src/braintrust/api/types/__init__.py
@@ -6,19 +6,18 @@
AclBatchUpdateResponse,
AclItem,
AclListOrgResponse,
- Agent,
AISecret,
ApiKey,
- CreateAgent,
CreateAISecret,
+ CreateCustomColumn,
CreateDataset,
CreateDatasetSnapshot,
CreateEnvironment,
CreateExperiment,
CreateFunction,
CreateGroup,
+ CreateIngestKeyResponse,
CreateMCPServer,
- CreateOrgAutomation,
CreateProject,
CreateProjectAutomation,
CreateProjectGroup,
@@ -29,6 +28,7 @@
CreateServiceTokenOutput,
CreateSpanIFrame,
CreateView,
+ CustomColumn,
Dataset,
DatasetRestorePreviewResponse,
DatasetRestoreRequest,
@@ -48,9 +48,9 @@
FetchExperimentEventsResponse,
Function,
GetAclResponse,
- GetAgentResponse,
GetAiSecretResponse,
GetApiKeyResponse,
+ GetCustomColumnResponse,
GetDatasetResponse,
GetDatasetSnapshotResponse,
GetEnvVarResponse,
@@ -60,7 +60,6 @@
GetMcpServerResponse,
GetOrganizationApiKeysResponse,
GetOrganizationResponse,
- GetOrgAutomationResponse,
GetProjectAutomationResponse,
GetProjectGroupResponse,
GetProjectResponse,
@@ -73,15 +72,16 @@
GetUserResponse,
GetViewResponse,
Group,
+ IngestKey,
InsertDatasetEventRequest,
InsertEventsResponse,
InsertExperimentEventRequest,
ListEnvironmentsResponse,
+ ListIngestKeysResponse,
MCPServer,
Organization,
- OrgAutomation,
- PatchAgent,
PatchAISecret,
+ PatchCustomColumn,
PatchDataset,
PatchDatasetSnapshot,
PatchEnvironment,
@@ -92,7 +92,6 @@
PatchOrganization,
PatchOrganizationMembers,
PatchOrganizationMembersOutput,
- PatchOrgAutomation,
PatchProject,
PatchProjectAutomation,
PatchProjectGroup,
@@ -125,18 +124,17 @@
"AclBatchUpdateResponse",
"AclItem",
"AclListOrgResponse",
- "Agent",
"ApiKey",
"CreateAISecret",
- "CreateAgent",
+ "CreateCustomColumn",
"CreateDataset",
"CreateDatasetSnapshot",
"CreateEnvironment",
"CreateExperiment",
"CreateFunction",
"CreateGroup",
+ "CreateIngestKeyResponse",
"CreateMCPServer",
- "CreateOrgAutomation",
"CreateProject",
"CreateProjectAutomation",
"CreateProjectGroup",
@@ -147,6 +145,7 @@
"CreateServiceTokenOutput",
"CreateSpanIFrame",
"CreateView",
+ "CustomColumn",
"Dataset",
"DatasetRestorePreviewResponse",
"DatasetRestoreRequest",
@@ -166,9 +165,9 @@
"FetchExperimentEventsResponse",
"Function",
"GetAclResponse",
- "GetAgentResponse",
"GetAiSecretResponse",
"GetApiKeyResponse",
+ "GetCustomColumnResponse",
"GetDatasetResponse",
"GetDatasetSnapshotResponse",
"GetEnvVarResponse",
@@ -176,7 +175,6 @@
"GetFunctionResponse",
"GetGroupResponse",
"GetMcpServerResponse",
- "GetOrgAutomationResponse",
"GetOrganizationApiKeysResponse",
"GetOrganizationResponse",
"GetProjectAutomationResponse",
@@ -191,15 +189,16 @@
"GetUserResponse",
"GetViewResponse",
"Group",
+ "IngestKey",
"InsertDatasetEventRequest",
"InsertEventsResponse",
"InsertExperimentEventRequest",
"ListEnvironmentsResponse",
+ "ListIngestKeysResponse",
"MCPServer",
- "OrgAutomation",
"Organization",
"PatchAISecret",
- "PatchAgent",
+ "PatchCustomColumn",
"PatchDataset",
"PatchDatasetSnapshot",
"PatchEnvironment",
@@ -207,7 +206,6 @@
"PatchFunction",
"PatchGroup",
"PatchMCPServer",
- "PatchOrgAutomation",
"PatchOrganization",
"PatchOrganizationMembers",
"PatchOrganizationMembersOutput",
diff --git a/py/src/braintrust/type_tests/test_api_client.py b/py/src/braintrust/type_tests/test_api_client.py
index 94cc424f..990dc57f 100644
--- a/py/src/braintrust/type_tests/test_api_client.py
+++ b/py/src/braintrust/type_tests/test_api_client.py
@@ -45,15 +45,15 @@
api_url: str | None = client.router.api_url
openapi_client.acls.get_acl_id("acl-id")
- openapi_client.agents.get_agent()
openapi_client.ai_secrets.get_ai_secret()
openapi_client.api_keys.get_api_key()
+ openapi_client.custom_columns.get_custom_column("project", "project-id")
openapi_client.dataset_snapshots.get_dataset_snapshot()
openapi_client.env_vars.get_env_var()
openapi_client.environments.list_environments()
openapi_client.groups.get_group()
+ openapi_client.ingest_keys.list_ingest_keys("project-id")
openapi_client.mcp_servers.get_mcp_server()
- openapi_client.org_automations.get_org_automation()
openapi_client.organizations.get_organization()
openapi_client.project_automations.get_project_automation()
openapi_client.project_groups.get_project_group()