GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing github.com — feat(coderd): add queries for organization AI model prices by SasSwart · Pull Request #30718 · coder/coder Conversation
|
Sorry, something went wrong.
There was an error while loading. Please reload this page.
8cf8989 to
bf364f1
Compare
bf364f1 to
83743f8
Compare
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Self review
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
83743f8 to
450a56b
Compare
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
f1d0d8c to
04b9a40
Compare
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Self review
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
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.*
Organization prices are only per configured provider, so remove the upsert and delete queries for provider type prices and their listing branch.
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.
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.
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.
cacf787 to
1e4ae6b
Compare
…elper The get helper captured the parent test's context and testing.T, which paralleltestctx flags once the subtests call t.Parallel.
…#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.
There was a problem 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.
There was an error while loading. Please reload this page.
| // 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) { |
There was a problem 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):
| 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.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| CASE WHEN source = 'custom' THEN 0 ELSE 1 END ASC | ||
| LIMIT 1; | ||
|
|
||
| -- name: GetOrganizationAIProviderModelPrice :one |
There was a problem 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:
| -- name: GetOrganizationAIProviderModelPrice :one | |
| -- name: GetOrganizationAIProviderModelConfig :one |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
|
||
| -- name: GetOrganizationAIProviderModelPrice :one | ||
| -- Returns the organization's live price for one model on one configured | ||
| -- provider. Soft-deleted rows are ignored. |
There was a problem 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.
There was an error while loading. Please reload this page.
|
|
||
| // 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) { |
There was a problem 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.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.