Files
Memoh/db/queries/models.sql
T
Acbox Liu b88ca96064 refactor: provider & models (#277)
* refactor: move client_type to provider, replace model fields with config JSONB

- Move `client_type` from `models` to `llm_providers` table
- Add `icon` field to `llm_providers`
- Replace `dimensions`, `input_modalities`, `supports_reasoning` on `models`
  with a single `config` JSONB column containing `dimensions`,
  `compatibilities` (vision, tool-call, image-output, reasoning),
  and `context_window`
- Auto-imported models default to vision + tool-call + reasoning
- Update all backend consumers (agent, flow resolver, handlers, memory)
- Regenerate sqlc, swagger, and TypeScript SDK
- Update frontend forms, display, and i18n for new schema

* ui: show provider icon avatar in sidebar and detail header, remove icon input

* feat: add built-in provider registry with YAML definitions and enable toggle

- Add `enable` column to llm_providers (default true, backward-compatible)
- Create internal/registry package to load YAML provider/model definitions
  on startup and upsert into database (new providers disabled by default)
- Add conf/providers/ with OpenAI, Anthropic, Google YAML definitions
- Add RegistryConfig to TOML config (providers_dir, default conf/providers)
- Model listing APIs and conversation flow now filter by enabled providers
- Frontend: enable switch in provider form, green status dot in sidebar,
  enabled providers sorted to top

* fix: make 0041 migration idempotent for fresh databases

Guard data migration steps with column-existence checks so the
migration succeeds on databases created from the updated init schema.
2026-03-22 17:24:45 +08:00

174 lines
4.4 KiB
SQL

-- name: CreateLlmProvider :one
INSERT INTO llm_providers (name, base_url, api_key, client_type, icon, enable, metadata)
VALUES (
sqlc.arg(name),
sqlc.arg(base_url),
sqlc.arg(api_key),
sqlc.arg(client_type),
sqlc.arg(icon),
sqlc.arg(enable),
sqlc.arg(metadata)
)
RETURNING *;
-- name: GetLlmProviderByID :one
SELECT * FROM llm_providers WHERE id = sqlc.arg(id);
-- name: GetLlmProviderByName :one
SELECT * FROM llm_providers WHERE name = sqlc.arg(name);
-- name: ListLlmProviders :many
SELECT * FROM llm_providers
ORDER BY created_at DESC;
-- name: UpdateLlmProvider :one
UPDATE llm_providers
SET
name = sqlc.arg(name),
base_url = sqlc.arg(base_url),
api_key = sqlc.arg(api_key),
client_type = sqlc.arg(client_type),
icon = sqlc.arg(icon),
enable = sqlc.arg(enable),
metadata = sqlc.arg(metadata),
updated_at = now()
WHERE id = sqlc.arg(id)
RETURNING *;
-- name: DeleteLlmProvider :exec
DELETE FROM llm_providers WHERE id = sqlc.arg(id);
-- name: CountLlmProviders :one
SELECT COUNT(*) FROM llm_providers;
-- name: CreateModel :one
INSERT INTO models (model_id, name, llm_provider_id, type, config)
VALUES (
sqlc.arg(model_id),
sqlc.arg(name),
sqlc.arg(llm_provider_id),
sqlc.arg(type),
sqlc.arg(config)
)
RETURNING *;
-- name: GetModelByID :one
SELECT * FROM models WHERE id = sqlc.arg(id);
-- name: GetModelByModelID :one
SELECT * FROM models WHERE model_id = sqlc.arg(model_id);
-- name: ListModelsByModelID :many
SELECT * FROM models
WHERE model_id = sqlc.arg(model_id)
ORDER BY created_at DESC;
-- name: ListModels :many
SELECT * FROM models
ORDER BY created_at DESC;
-- name: ListModelsByType :many
SELECT * FROM models
WHERE type = sqlc.arg(type)
ORDER BY created_at DESC;
-- name: ListModelsByProviderID :many
SELECT * FROM models
WHERE llm_provider_id = sqlc.arg(llm_provider_id)
ORDER BY created_at DESC;
-- name: ListModelsByProviderIDAndType :many
SELECT * FROM models
WHERE llm_provider_id = sqlc.arg(llm_provider_id)
AND type = sqlc.arg(type)
ORDER BY created_at DESC;
-- name: ListModelsByProviderClientType :many
SELECT m.*
FROM models m
JOIN llm_providers p ON m.llm_provider_id = p.id
WHERE p.client_type = sqlc.arg(client_type)
ORDER BY m.created_at DESC;
-- name: UpdateModel :one
UPDATE models
SET
model_id = sqlc.arg(model_id),
name = sqlc.arg(name),
llm_provider_id = sqlc.arg(llm_provider_id),
type = sqlc.arg(type),
config = sqlc.arg(config),
updated_at = now()
WHERE id = sqlc.arg(id)
RETURNING *;
-- name: DeleteModel :exec
DELETE FROM models WHERE id = sqlc.arg(id);
-- name: DeleteModelByModelID :exec
DELETE FROM models WHERE model_id = sqlc.arg(model_id);
-- name: CountModels :one
SELECT COUNT(*) FROM models;
-- name: CountModelsByType :one
SELECT COUNT(*) FROM models WHERE type = sqlc.arg(type);
-- name: UpsertRegistryProvider :one
INSERT INTO llm_providers (name, base_url, api_key, client_type, icon, enable, metadata)
VALUES (sqlc.arg(name), sqlc.arg(base_url), '', sqlc.arg(client_type), sqlc.arg(icon), false, '{}')
ON CONFLICT (name) DO UPDATE SET
icon = EXCLUDED.icon,
client_type = EXCLUDED.client_type,
updated_at = now()
RETURNING *;
-- name: UpsertRegistryModel :one
INSERT INTO models (model_id, name, llm_provider_id, type, config)
VALUES (sqlc.arg(model_id), sqlc.arg(name), sqlc.arg(llm_provider_id), sqlc.arg(type), sqlc.arg(config))
ON CONFLICT (llm_provider_id, model_id) DO UPDATE SET
name = EXCLUDED.name,
type = EXCLUDED.type,
config = EXCLUDED.config,
updated_at = now()
RETURNING *;
-- name: ListEnabledModels :many
SELECT m.*
FROM models m
JOIN llm_providers p ON m.llm_provider_id = p.id
WHERE p.enable = true
ORDER BY m.created_at DESC;
-- name: ListEnabledModelsByType :many
SELECT m.*
FROM models m
JOIN llm_providers p ON m.llm_provider_id = p.id
WHERE p.enable = true
AND m.type = sqlc.arg(type)
ORDER BY m.created_at DESC;
-- name: ListEnabledModelsByProviderClientType :many
SELECT m.*
FROM models m
JOIN llm_providers p ON m.llm_provider_id = p.id
WHERE p.enable = true
AND p.client_type = sqlc.arg(client_type)
ORDER BY m.created_at DESC;
-- name: CreateModelVariant :one
INSERT INTO model_variants (model_uuid, variant_id, weight, metadata)
VALUES (
sqlc.arg(model_uuid),
sqlc.arg(variant_id),
sqlc.arg(weight),
sqlc.arg(metadata)
)
RETURNING *;
-- name: ListModelVariantsByModelUUID :many
SELECT * FROM model_variants
WHERE model_uuid = sqlc.arg(model_uuid)
ORDER BY weight DESC, created_at DESC;