diff --git a/autogpt_platform/backend/backend/server/v2/llm/db.py b/autogpt_platform/backend/backend/server/v2/llm/db.py index 273d2e1162..78f64796d5 100644 --- a/autogpt_platform/backend/backend/server/v2/llm/db.py +++ b/autogpt_platform/backend/backend/server/v2/llm/db.py @@ -132,7 +132,7 @@ async def upsert_provider( "supportsJsonOutput": request.supports_json_output, "supportsReasoning": request.supports_reasoning, "supportsParallelTool": request.supports_parallel_tool, - "metadata": request.metadata, + "metadata": prisma.Json(request.metadata or {}), } include: Any = {"Models": {"include": {"Costs": True, "Creator": True}}} if provider_id: @@ -232,20 +232,20 @@ async def create_model( "slug": request.slug, "displayName": request.display_name, "description": request.description, - "providerId": request.provider_id, + "Provider": {"connect": {"id": request.provider_id}}, "contextWindow": request.context_window, "maxOutputTokens": request.max_output_tokens, "isEnabled": request.is_enabled, - "capabilities": request.capabilities, - "metadata": request.metadata, + "capabilities": prisma.Json(request.capabilities or {}), + "metadata": prisma.Json(request.metadata or {}), "Costs": _cost_create_payload(request.costs), } if request.creator_id: - data["creatorId"] = request.creator_id + data["Creator"] = {"connect": {"id": request.creator_id}} record = await prisma.models.LlmModel.prisma().create( data=data, - include={"Costs": True, "Creator": True}, + include={"Costs": True, "Creator": True, "Provider": True}, ) return _map_model(record) @@ -772,7 +772,7 @@ async def upsert_creator( "description": request.description, "websiteUrl": request.website_url, "logoUrl": request.logo_url, - "metadata": request.metadata, + "metadata": prisma.Json(request.metadata or {}), } if creator_id: record = await prisma.models.LlmModelCreator.prisma().update( diff --git a/autogpt_platform/backend/backend/server/v2/llm/model.py b/autogpt_platform/backend/backend/server/v2/llm/model.py index 02a2029a3e..2c7b99ba61 100644 --- a/autogpt_platform/backend/backend/server/v2/llm/model.py +++ b/autogpt_platform/backend/backend/server/v2/llm/model.py @@ -1,6 +1,7 @@ from __future__ import annotations import re +from datetime import datetime from typing import Any, Optional import prisma.enums @@ -193,8 +194,8 @@ class LlmModelMigration(pydantic.BaseModel): # Custom pricing override - billing should use this instead of target model's cost custom_credit_cost: Optional[int] = None is_reverted: bool = False - created_at: str # ISO datetime string - reverted_at: Optional[str] = None + created_at: datetime + reverted_at: Optional[datetime] = None class LlmMigrationsResponse(pydantic.BaseModel): diff --git a/autogpt_platform/backend/migrations/20251126120000_seed_llm_registry/migration.sql b/autogpt_platform/backend/migrations/20251126120000_seed_llm_registry/migration.sql index 2163d533bf..40e1650558 100644 --- a/autogpt_platform/backend/migrations/20251126120000_seed_llm_registry/migration.sql +++ b/autogpt_platform/backend/migrations/20251126120000_seed_llm_registry/migration.sql @@ -42,7 +42,7 @@ FROM (VALUES ('gpt-5-mini-2025-08-07', 'GPT 5 Mini', 'openai', 400000, 128000), ('gpt-5-nano-2025-08-07', 'GPT 5 Nano', 'openai', 400000, 128000), ('gpt-5-chat-latest', 'GPT 5 Chat', 'openai', 400000, 16384), - ('gpt-4.1-2025-04-14', 'GPT 4.1', 'openai', 1047576, 32768), + ('gpt-4.1-2025-04-14', 'GPT 4.1', 'openai', 1000000, 32768), ('gpt-4.1-mini-2025-04-14', 'GPT 4.1 Mini', 'openai', 1047576, 32768), ('gpt-4o-mini', 'GPT 4o Mini', 'openai', 128000, 16384), ('gpt-4o', 'GPT 4o', 'openai', 128000, 16384), diff --git a/autogpt_platform/backend/migrations/20260122000000_add_llm_price_tier/migration.sql b/autogpt_platform/backend/migrations/20260122000000_add_llm_price_tier/migration.sql index 2ed7a37ad2..5f900d82d0 100644 --- a/autogpt_platform/backend/migrations/20260122000000_add_llm_price_tier/migration.sql +++ b/autogpt_platform/backend/migrations/20260122000000_add_llm_price_tier/migration.sql @@ -1,36 +1,13 @@ -- Add new columns to LlmModel table for extended model metadata -- These columns support the LLM Picker UI enhancements --- CreateTable for LlmModelCreator (if not exists) -CREATE TABLE IF NOT EXISTS "LlmModelCreator" ( - "id" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "name" TEXT NOT NULL, - "displayName" TEXT NOT NULL, - "description" TEXT, - "websiteUrl" TEXT, - "logoUrl" TEXT, - "metadata" JSONB NOT NULL DEFAULT '{}'::jsonb, - - CONSTRAINT "LlmModelCreator_pkey" PRIMARY KEY ("id") -); - --- Add unique constraint on name if table was just created -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'LlmModelCreator_name_key') THEN - ALTER TABLE "LlmModelCreator" ADD CONSTRAINT "LlmModelCreator_name_key" UNIQUE ("name"); - END IF; -END $$; - -- Add priceTier column: 1=cheapest, 2=medium, 3=expensive ALTER TABLE "LlmModel" ADD COLUMN IF NOT EXISTS "priceTier" INTEGER NOT NULL DEFAULT 1; --- Add creatorId column for model creator relationship +-- Add creatorId column for model creator relationship (if not exists) ALTER TABLE "LlmModel" ADD COLUMN IF NOT EXISTS "creatorId" TEXT; --- Add isRecommended column +-- Add isRecommended column (if not exists) ALTER TABLE "LlmModel" ADD COLUMN IF NOT EXISTS "isRecommended" BOOLEAN NOT NULL DEFAULT FALSE; -- Add index on creatorId if not exists @@ -40,8 +17,11 @@ CREATE INDEX IF NOT EXISTS "LlmModel_creatorId_idx" ON "LlmModel"("creatorId"); DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'LlmModel_creatorId_fkey') THEN - ALTER TABLE "LlmModel" ADD CONSTRAINT "LlmModel_creatorId_fkey" - FOREIGN KEY ("creatorId") REFERENCES "LlmModelCreator"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- Only add FK if LlmModelCreator table exists + IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'LlmModelCreator') THEN + ALTER TABLE "LlmModel" ADD CONSTRAINT "LlmModel_creatorId_fkey" + FOREIGN KEY ("creatorId") REFERENCES "LlmModelCreator"("id") ON DELETE SET NULL ON UPDATE CASCADE; + END IF; END IF; END $$; diff --git a/autogpt_platform/frontend/src/app/(platform)/admin/llms/actions.ts b/autogpt_platform/frontend/src/app/(platform)/admin/llms/actions.ts index 4d87149ff8..b2924d9015 100644 --- a/autogpt_platform/frontend/src/app/(platform)/admin/llms/actions.ts +++ b/autogpt_platform/frontend/src/app/(platform)/admin/llms/actions.ts @@ -117,7 +117,7 @@ export async function createLlmModelAction(formData: FormData) { max_output_tokens: formData.get("max_output_tokens") ? Number(formData.get("max_output_tokens")) : undefined, - is_enabled: formData.get("is_enabled") === "on", + is_enabled: formData.getAll("is_enabled").includes("on"), capabilities: {}, metadata: {}, costs: [ @@ -161,8 +161,8 @@ export async function updateLlmModelAction(formData: FormData) { max_output_tokens: formData.get("max_output_tokens") ? Number(formData.get("max_output_tokens")) : undefined, - is_enabled: formData.get("is_enabled") - ? formData.get("is_enabled") === "on" + is_enabled: formData.has("is_enabled") + ? formData.getAll("is_enabled").includes("on") : undefined, costs: formData.get("credit_cost") ? [