GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat(coderd): add queries for organization AI model prices by SasSwart · Pull Request #30718 · coder/coder

Conversation

@SasSwart

@SasSwart SasSwart commented Oct 13, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Adds the store queries for organization AI model prices in ai_model_configs, with authorization. They cover basic CRUD on one price, keyed by (organization_id, provider_id, model).

  • GetOrganizationAIProviderModelPrice reads one price.
  • UpsertOrganizationAIProviderModelPrice sets one price, with typed params. It rewrites an existing row only when a price differs, so updated_at records the last change.
  • DeleteOrganizationAIProviderModelPrice soft deletes one price. Reads and upserts only match live rows, so setting a price after a delete inserts a new live row.

All three authorize against ResourceAiModelPrice.InOrg(org). The new AiModelPriceInOrg case in TestRolePermissions pins that only owners and org admins pass. A TODO in dbauthz notes that this should become a resource for AI Governance model config.

Each query has its own test. The upsert tests cover that identical prices leave updated_at unchanged, that changed prices advance it, and that an empty model is rejected.

Used later: #30719 seeds its lookup tests with the upsert. #30720 serves all three through the org price API.


This PR was generated by Coder Agents on behalf of @SasSwart.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@linear-code

linear-code Bot commented Oct 13, 2026

Copy link
Copy Markdown

AIGOV-612

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@github-actions github-actions Bot assigned SasSwart Oct 13, 2026
This was referenced Oct 13, 2026
refactor(enterprise/coderd): extract AI model price body decoding and validation #30716
Merged
feat(coderd/database): add organization AI model config table #30717
Merged
feat(coderd): price token usage with organization prices #30719
Merged
feat: add organization AI model price API #30720
Closed
feat: add organization-scoped AI model prices #30690
Closed
@SasSwart
SasSwart added this pull request to stack #30737 October 14, 2026 06:51
@SasSwart
SasSwart force-pushed the sdlcgraph/aigov-612-3-store branch from 8cf8989 to bf364f1 Compare October 14, 2026 12:42
@SasSwart
SasSwart force-pushed the sdlcgraph/aigov-612-3-store branch from bf364f1 to 83743f8 Compare October 15, 2026 07:53
SasSwart
SasSwart commented Oct 15, 2026
View reviewed changes

@SasSwart SasSwart left a comment

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Self review

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

@SasSwart
SasSwart marked this pull request as ready for review October 15, 2026 08:14
@SasSwart
SasSwart requested review from ibetitsmike and johnstcn as code owners October 15, 2026 08:14
@SasSwart
SasSwart requested a review from ssncferreira October 15, 2026 09:19
@SasSwart
SasSwart force-pushed the sdlcgraph/aigov-612-3-store branch from 83743f8 to 450a56b Compare October 15, 2026 11:12
@SasSwart SasSwart changed the title feat(coderd): add queries for organization AI model prices feat(coderd/database): add queries for organization AI model prices Oct 15, 2026
@SasSwart SasSwart changed the title feat(coderd/database): add queries for organization AI model prices feat(coderd): add queries for organization AI model prices Oct 15, 2026
ssncferreira
ssncferreira reviewed Oct 15, 2026
View reviewed changes
Comment thread coderd/database/dbauthz/dbauthz.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/querier_test.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

@SasSwart
SasSwart force-pushed the sdlcgraph/aigov-612-3-store branch 4 times, most recently from f1d0d8c to 04b9a40 Compare October 19, 2026 12:22
SasSwart
SasSwart commented Oct 19, 2026
View reviewed changes

@SasSwart SasSwart left a comment

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Self review

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/dbauthz/dbauthz.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/dbauthz/dbauthz.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/queries/aicostcontrol.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/database/querier_test.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

Base automatically changed from sdlcgraph/aigov-612-2-schema to main October 21, 2026 06:17
SasSwart added a commit that referenced this pull request Oct 21, 2026
@SasSwart
feat(coderd/database): add organization AI model config table (#30717)
d14631d
Adds `ai_model_configs`: an organization's AI Governance configuration
for one model on one configured provider. Token prices are its first
settings. Migration `000630` is additive and needs no backfill.

- Rows are soft deleted with a `deleted` flag. A surrogate `id` is the
primary key, and a partial unique index allows one live row per
`(organization_id, provider_id, model)`. Cascades on delete of the
organization or provider. The organization is a column, as in other
organization-scoped tables.
- A check constraint rejects an empty model.
- Pricing per provider ID is what lets `openai-compat` gateways be
priced, and lets providers of the same type have different prices.
- Site-wide prices per provider type stay in the existing
`ai_model_prices` table, unchanged.

Recording which price was used on each token usage record is deferred
until its design settles.

**Used later:** #30718 adds the queries that read and write the table,
and #30719 looks prices up from it. The rest of the diff is generated.

---

*This PR was generated by Coder Agents on behalf of @SasSwart.*
@SasSwart SasSwart mentioned this pull request Oct 21, 2026
chore: add ssncferreira and SasSwart as code owners of AI query files #31116
Merged
SasSwart added 5 commits October 21, 2026 06:30
@SasSwart
feat(coderd): add queries for organization AI model prices
117bf23
@SasSwart
feat(coderd/database): drop organization provider type price queries
4f65379
Organization prices are only per configured provider, so remove the
upsert and delete queries for provider type prices and their listing
branch.
@SasSwart
feat(coderd/database): upsert one organization AI model price at a time
bf4938d
Org admins edit prices one model at a time, so the upsert takes typed
params instead of a JSON batch. The org price listing tells organization
and site-wide rows apart by provider_id instead of a price kind.
@SasSwart
feat(coderd/database): keep organization AI model price queries to CRUD
0caf54d
Replace GetOrganizationAIModelPrices, which listed every price that
applies to an organization, with GetOrganizationAIProviderModelPrice,
which reads one price by organization, provider and model. Queries
target the renamed ai_model_configs table.

Split the tests per query, and cover that an identical upsert leaves
updated_at unchanged and that an empty model is rejected.

Leave a TODO to authorize these queries against a resource for AI
Governance model config rather than ResourceAiModelPrice.
@SasSwart
feat(coderd/database): soft delete organization AI model prices
1e4ae6b
DeleteOrganizationAIProviderModelPrice now flags the live row as deleted
instead of removing it. Reads and upserts only match live rows, so an
upsert after a delete inserts a new live row and leaves the soft-deleted
one untouched.
@SasSwart
SasSwart force-pushed the sdlcgraph/aigov-612-3-store branch from cacf787 to 1e4ae6b Compare October 21, 2026 06:38
@SasSwart
test(coderd/database): pass the subtest context to the upsert price h…
6140bcb
…elper

The get helper captured the parent test's context and testing.T, which
paralleltestctx flags once the subtests call t.Parallel.
SasSwart added a commit that referenced this pull request Oct 21, 2026
@SasSwart
chore: add ssncferreira and SasSwart as code owners of AI query files (…
409cdf6
…#31116)

Adds @ssncferreira and @SasSwart as code owners of `ai_providers.sql`,
`ai_provider_keys.sql` and `aicostcontrol.sql`, alongside @ibetitsmike
and @johnstcn. The `codersdk/aiproviders*.go` rules are unchanged.

Both current owners are on PTO, which leaves the organization AI model
price stack (#30718, #30719) without anyone who can give the required
code owner review on `aicostcontrol.sql`.

> Generated by Coder Agents on behalf of @SasSwart.
@SasSwart
SasSwart requested a review from ssncferreira October 21, 2026 08:36
@SasSwart SasSwart mentioned this pull request Oct 21, 2026
feat: price AI Gateway token usage with the request organization (2/2) #31121
Merged
ssncferreira
ssncferreira approved these changes Oct 21, 2026
View reviewed changes

@ssncferreira ssncferreira left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

LGTM 👍 I think we should just update the query names to Config, instead of Price

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/dbauthz/dbauthz.go Outdated
// only its prices. Authorize it, and the other organization model price
// queries, against a resource that represents that configuration instead of
// ResourceAiModelPrice.
func (q *querier) DeleteOrganizationAIProviderModelPrice(ctx context.Context, arg database.DeleteOrganizationAIProviderModelPriceParams) (int64, error) {

@ssncferreira ssncferreira Oct 21, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

nit: since this is for the whole AI Governance model, remove Price from the query (same for the other dbauthz methods):

Suggested change
func (q *querier) DeleteOrganizationAIProviderModelPrice(ctx context.Context, arg database.DeleteOrganizationAIProviderModelPriceParams) (int64, error) {
func (q *querier) DeleteOrganizationAIProviderModelConfig(ctx context.Context, arg database.DeleteOrganizationAIProviderModelPriceParams) (int64, error) {

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@SasSwart SasSwart Oct 22, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

$Renamed the three queries, their params, and the related comments to Config in 7f60cf3.\n\nReply generated by Coder Agents on behalf of @SasSwart.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/queries/aicostcontrol.sql Outdated
CASE WHEN source = 'custom' THEN 0 ELSE 1 END ASC
LIMIT 1;

-- name: GetOrganizationAIProviderModelPrice :one

@ssncferreira ssncferreira Oct 21, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Same as above, as well as the other queries, and the comments:

Suggested change
-- name: GetOrganizationAIProviderModelPrice :one
-- name: GetOrganizationAIProviderModelConfig :one

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@SasSwart SasSwart Oct 22, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

$Renamed the three queries, their params, and the related comments to Config in 7f60cf3.\n\nReply generated by Coder Agents on behalf of @SasSwart.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/queries/aicostcontrol.sql

-- name: GetOrganizationAIProviderModelPrice :one
-- Returns the organization's live price for one model on one configured
-- provider. Soft-deleted rows are ignored.

@ssncferreira ssncferreira Oct 21, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

nit: Should this join ai_providers and filter out deleted providers? This way models from deleted providers would not be returned.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/querier_test.go

// upsertOrgProviderPrice sets an organization's price for a model on a
// configured provider, with only an input price.
func upsertOrgProviderPrice(ctx context.Context, t *testing.T, db database.Store, orgID, providerID uuid.UUID, model string, inputPrice int64) {

@ssncferreira ssncferreira Oct 21, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

nit: should we add this to dbgen?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@SasSwart
refactor(coderd/database): rename organization AI model price queries…
7f60cf3
… to config
@SasSwart
SasSwart merged commit da78c88 into main Oct 22, 2026
29 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@SasSwart
SasSwart deleted the sdlcgraph/aigov-612-3-store branch October 22, 2026 13:58
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

@ssncferreira ssncferreira ssncferreira approved these changes
@ibetitsmike ibetitsmike Awaiting requested review from ibetitsmike ibetitsmike is a code owner
@johnstcn johnstcn Awaiting requested review from johnstcn johnstcn is a code owner

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@SasSwart SasSwart

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@SasSwart @ssncferreira
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.