Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@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(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@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(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@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(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@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(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@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(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@lforst
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(prompt): --environment flag by viadezo1er · Pull Request #330 · braintrustdata/bt · GitHub
Skip to content

feat(prompt): --environment flag - #330

Merged
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management
Aug 27, 2026
Merged

feat(prompt): --environment flag#330
Cedric / ViaDézo1er (viadezo1er) merged 11 commits into
mainfrom
cedric/env-management

Conversation

@viadezo1er

@viadezo1erCedric / ViaDézo1er (viadezo1er) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Adds bt prompts ...:

  • versions subcommand
  • (un)assign subcommands
  • --environment flag for list/view/assign/unassign and bt functions view
  • --version flag for view

Usage in the examples bellow.

Prompt version ids have a long form (19 characters) and a short form (16 characters), both are valid when requested.

In case you were unaware of the existence of environments like me, they are in https://www.braintrust.dev/app/your-org/p/your-project/configuration/org/environments

Examples:

Details
❯ bt prompts view test-varied-claude-haiku-short --environment test-1
Viewing Test Varied - Claude Haiku Short
Environment: test-1
Version: 1000197749656649734
Model: claude-3-5-haiku-20241022
max_tokens: 180
stop_sequences: [
]
temperature: 0
│ Classify {{input}} as positive, neutral, or negative. Return one label.
❯ bt prompts list --environment test-1
4 prompts found in ced / My Project for environment test-1
Name Description Slug Version Test Varied - GPT-4o Creative Synthetic prompt with varied test-varied-gpt-4o-creative 1000197744929341442 model settings for CLI testing. Test Varied - GPT-4o Mini Synthetic deterministic prompt, test-varied-gpt-4o-mini-determini 1000197749656518660 Deterministic revised for environment tes… stic Test Varied - Gemini Flash Synthetic prompt with varied test-varied-gemini-flash 1000197744929341442 model settings for CLI testing. Test Varied - Claude Haiku Short Synthetic short-form prompt, test-varied-claude-haiku-short 1000197749656649734 revised for environment testin… 
❯ bt prompts list --environment incorrect-env-name
error: request failed (400 Bad Request): {"Code":"BadRequestError","Message":"Environment with slug 'incorrect-env-name' not found [user_email=cedric@braintrustdata.com] [timestamp=1787685069.048]"}
❯ bt prompts assign test-varied-claude-haiku-short --version 1000197749656649734 --environment test-2
✓ Assigned prompt 'test-varied-claude-haiku-short' version 1000197749656649734 to environment 'test-2'
❯ bt prompts unassign test-varied-claude-haiku-short --environment test-2
✓ Unassigned prompt 'test-varied-claude-haiku-short' from environment 'test-2'
❯ bt prompts versions
✔ Select prompt · q
2 versions found for q-b138
Version 4304fee66c80c5c8 8124d96283514d0f

https://linear.app/braintrustdata/issue/SDK-244/environment-tags-in-the-bt-cli
See also the backend PR, and the environment management pr.

@github-actions

github-actionsBot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Latest downloadable build artifacts for this PR commit 0d4b76a94c63:

Available artifact names
  • artifacts-build-global
  • artifacts-build-local-x86_64-apple-darwin
  • artifacts-build-local-aarch64-pc-windows-msvc
  • artifacts-build-local-x86_64-pc-windows-msvc
  • artifacts-build-local-x86_64-unknown-linux-musl
  • artifacts-build-local-aarch64-apple-darwin
  • artifacts-build-local-x86_64-unknown-linux-gnu
  • artifacts-build-local-aarch64-unknown-linux-gnu
  • artifacts-plan-dist-manifest
  • cargo-dist-cache

@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:1a1b66369d

ℹ️ 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 threadsrc/prompts/view.rs Outdated
Comment threadsrc/prompts/mod.rs Outdated

@lforstLuca Forstner (lforst) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

one thing

Comment threadsrc/prompts/api.rs
project_id: &str,
prompt_id: &str,
) -> Result<Vec<String>> {
let body = prompt_versions_request(project_id, prompt_id);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

are we properly paginating here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No.

(lines numbers from the branch cedric/endpoint-check-reject-unknown-slug for braintrust)

Audit logs don't support pagination:
braintrust/api-ts/src/btql.ts:1610:

 if (body.audit_log) {
// Audit log queries do not support pagination.
boundQuery.limit = undefined;
boundFilter.limit = undefined;
}

And cursors are not supported braintrust/api-ts/src/btql.ts:1971:

 if (!useBrainstore && body.audit_log) {
adjustBoundQueryForAuditLog({
boundQuery: boundFilter,
objectType: objectType,
testingOnlyAllowQueryFullAuditLog:
body._testing_only_allow_query_full_audit_log,
});
if (cursorParams) {
throw new BadRequestError("Audit log queries do not support cursors");
}
}

Btw the python SDK doesn't paginate either when querying audit logs braintrust-sdk-python/py/src/braintrust/logger.py:6146:

 resp = _state.api_conn().post(
"btql",
json={
"query": query,
"audit_log": True,
"use_columnstore": False,
"brainstore_realtime": True,
},
headers={"Accept-Encoding": "gzip"},
)

.... all according to the slop

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this code branch is related to audit logs in any way right? I was more asking about pagination for prompts list. Why are audit logs relevant?

@viadezo1erCedric / ViaDézo1er (viadezo1er)Aug 27, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The llms are really convinced that to fetch the specific version of a prompt, you need audit logs:

 ### 1. Where bt requests audit logs src/prompts/api.rs list_prompt_versions posts the request to /btql: ```rust client.post_with_headers("/btql", &body, &headers).await?; 

prompt_versions_request enables audit mode:

"audit_log": true,

The response is treated as mutation history by filtering:

 row.pointer("/audit_data/action")

for upsert and merge.

2. Where the backend receives it

The /btql route is registered in:

api/app.py

@app.route("/btql", methods=["OPTIONS", "POST"], **REQUEST_KWARGS)@js_apidefbtql(): pass

It is processed by:

api-ts/src/btql.ts

exportasyncfunctionrunBtqlRequest(...){constparsed=requestSchema.safeParse(ctxData);// ... }

The request schema defines the flag:

audit_log: z.boolean().optional(),

3. Why audit logs are used to list versions

The backend switches from the normal object schema to the historical audit schema:

constbindSchema=body.audit_log ? useBrainstore ? BRAINSTORE_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_AUDIT_LOG_LOGICAL_SCHEMA : BRAINTRUST_LOGICAL_SCHEMA;

It similarly selects the audit table:

consttableType=body.audit_log ? "audit_log" : "main";

A normal project_prompts(...) query returns prompt state, optionally at a known version. It does not provide an operation for enumerating
every version ID.

Audit rows contain each historical mutation’s _xact_id and audit_data.action, allowing bt to discover all upsert and merge versions.

There is no backend rule specifically requiring prompt versions to use audit logs. This is the current SDK/CLI design because the backend
lacks a dedicated prompt-version-listing endpoint.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

However I do agree that needing to use audit logs for this is confusing and probably bad design.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fixing this is a follow up though.

@viadezo1er
Cedric / ViaDézo1er (viadezo1er) merged commit 1df1390 into mainAug 27, 2026
34 checks passed
@Qard
Stephen Belanger (Qard) deleted the cedric/env-management branch August 28, 2026 13:33
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.

3 participants

@viadezo1er@Qard@lforst