Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(api): generate and migrate Dataset REST resources by AbhiPrasad · Pull Request #703 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(api): generate and migrate Dataset REST resources by AbhiPrasad · Pull Request #703 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(api): generate and migrate Dataset REST resources by AbhiPrasad · Pull Request #703 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(api): generate and migrate Dataset REST resources by AbhiPrasad · Pull Request #703 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(api): generate and migrate Dataset REST resources by AbhiPrasad · Pull Request #703 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat(api): generate and migrate Dataset REST resources by AbhiPrasad · Pull Request #703 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

feat(api): generate and migrate Dataset REST resources - #703

Merged
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets
Aug 19, 2026
Merged

feat(api): generate and migrate Dataset REST resources#703
Abhijeet Prasad (AbhiPrasad) merged 1 commit into
mainfrom
abhi-openapi-datasets

Conversation

@AbhiPrasad

Copy link
Copy Markdown
Member

AI Summary

Implements the Dataset slice of #683 by publishing all operations tagged Datasets and moving eligible high-level SDK workflows onto the public REST resources. Shared generated models are repartitioned across Projects, Experiments, and Datasets as their reachable schema graph expands.

Migration flow

Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
SDK workflowPrevious wire callPublic REST call
Resolve/create projectCombined dataset registrationPOST /v1/project or GET /v1/project/{id}
Resolve/create datasetPOST /api/dataset/registerPOST /v1/dataset
Fetch ordinary recordsPOST /btqlPOST /v1/dataset/{id}/fetch
Fetch filtered recordsPOST /btqlUnchanged for _internal_btql
SummarizeGET /dataset-summaryGET /v1/dataset/{id}/summarize
Devserver ID lookupRaw GET /v1/dataset/{id}Generated GET /v1/dataset/{id}
Insert/update/delete rowsBatched /logs3 ingestionUnchanged
Resolve environmentsGET /environment-object/...Unchanged
BehaviorResult
Dataset name omittedSend logs, matching the legacy registration UDF default
Existing project or datasetPublic POST operations preserve get-or-create behavior
Registration atomicityProject and dataset creation are now two requests, matching bt
Ordinary fetch semanticsREST builds the same dataset BTQL query with cursor, limit, and version
Custom BTQL semanticsContinue through BTQL for filters, sampling, and total limits
Legacy output conversionContinue converting expected to output after REST fetches
Retry behaviorFetch is a safe read; project and dataset creation are idempotent writes

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c131e9bc45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback".

Comment threadpy/src/braintrust/api/_generated/models/datasets.py Outdated
Comment threadpy/src/braintrust/api/_generated/models/datasets.py
Implements the Dataset slice of #683 by publishing all operations tagged
Datasets and moving eligible high-level SDK workflows onto the public REST
resources. Shared generated models are repartitioned across Projects,
Experiments, and Datasets as their reachable schema graph expands.
### Migration flow
```text
Before
init_dataset() -----> APP /api/dataset/register
Dataset.fetch() ----> API /btql
Dataset.summarize() -> API /dataset-summary
After
+--> POST /v1/project --------+
init_dataset() -------| +--> POST /v1/dataset
+--> GET /v1/project/{id} -----+
Dataset.fetch() ------> POST /v1/dataset/{id}/fetch --> backend BTQL
Dataset.summarize() --> GET /v1/dataset/{id}/summarize
```
| SDK workflow | Previous wire call | Public REST call |
| --- | --- | --- |
| Resolve/create project | Combined dataset registration | `POST /v1/project` or `GET /v1/project/{id}` |
| Resolve/create dataset | `POST /api/dataset/register` | `POST /v1/dataset` |
| Fetch ordinary records | `POST /btql` | `POST /v1/dataset/{id}/fetch` |
| Fetch filtered records | `POST /btql` | Unchanged for `_internal_btql` |
| Summarize | `GET /dataset-summary` | `GET /v1/dataset/{id}/summarize` |
| Devserver ID lookup | Raw `GET /v1/dataset/{id}` | Generated `GET /v1/dataset/{id}` |
| Insert/update/delete rows | Batched `/logs3` ingestion | Unchanged |
| Resolve environments | `GET /environment-object/...` | Unchanged |
| Behavior | Result |
| --- | --- |
| Dataset name omitted | Send `logs`, matching the legacy registration UDF default |
| Existing project or dataset | Public POST operations preserve get-or-create behavior |
| Registration atomicity | Project and dataset creation are now two requests, matching `bt` |
| Ordinary fetch semantics | REST builds the same dataset BTQL query with cursor, limit, and version |
| Custom BTQL semantics | Continue through BTQL for filters, sampling, and total limits |
| Legacy output conversion | Continue converting `expected` to `output` after REST fetches |
| Summary links | Continue using the SDK-configured `BRAINTRUST_APP_PUBLIC_URL` |
| Event wire keys | Preserve `_is_merge`, `_object_delete`, and other leading-underscore keys exactly |
| Retry behavior | Fetch is a safe read; project and dataset creation are idempotent writes |
The generated Dataset service includes create/list/get/patch/delete, insert,
GET and POST fetch, feedback, and summarize. Public request and response types
are exported from `braintrust.api.types`.
Real-backend VCR coverage exercises the complete generated surface, including
merge paths, array deletion, and row deletion, plus a high-level unnamed `logs`
dataset flow with cleanup. Unit coverage preserves pagination, pinned versions, BTQL routing, devserver lookup, lazy imports, and
package/type exports. Verification includes `test_core`, `test_types`, Pylint,
pre-commit, and API codegen drift checks.
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 4058bca into mainAug 19, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the abhi-openapi-datasets branch August 19, 2026 14:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AbhiPrasad@lforst