Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions internal/database/migrations/005_make_dimensions_nullable.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- Make dimensions nullable in instances table for consistency with definitions
-- This allows migration from older databases that may not have dimensions set

ALTER TABLE instances ALTER COLUMN "dimensions" DROP NOT NULL;

---- create above / drop below ----

-- Rollback: Make dimensions NOT NULL again
ALTER TABLE instances ALTER COLUMN "dimensions" SET NOT NULL;
8 changes: 4 additions & 4 deletions internal/database/models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 16 additions & 16 deletions internal/database/queries.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion internal/handlers/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,12 @@ func sanityCheckFunc(ctx context.Context, input *models.SanityCheckRequest) (*mo

// Create a map with the single LLM service instance
llmDimensions := make(map[int32]int32)
llmDimensions[instance.InstanceID] = instance.Dimensions
if instance.Dimensions.Valid {
llmDimensions[instance.InstanceID] = instance.Dimensions.Int32
} else {
issues = append(issues, fmt.Sprintf("Project %s: LLM service instance does not have dimensions configured", projectName))
continue
}

// Get all embeddings for this project
embeddings, err := queries.GetEmbeddingsByProject(ctx, database.GetEmbeddingsByProjectParams{
Expand Down
5 changes: 4 additions & 1 deletion internal/handlers/embeddings.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,10 @@ func postProjEmbeddingsFunc(ctx context.Context, input *models.PostProjEmbedding
}

// Validate embedding dimensions
if err := ValidateEmbeddingDimensions(embedding, instance.Dimensions); err != nil {
if !instance.Dimensions.Valid {
return nil, huma.Error500InternalServerError("LLM service instance does not have dimensions configured")
}
if err := ValidateEmbeddingDimensions(embedding, instance.Dimensions.Int32); err != nil {
return nil, huma.Error400BadRequest(fmt.Sprintf("Dimension validation failed for input %s: %v", embedding.TextID, err))
}

Expand Down
29 changes: 16 additions & 13 deletions internal/handlers/llm_services.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,10 @@ func putDefinitionFunc(ctx context.Context, input *models.PutDefinitionRequest)
Description: pgtype.Text{String: input.Body.Description, Valid: true},
APIStandard: input.Body.APIStandard,
Model: input.Body.Model,
Dimensions: int32(input.Body.Dimensions),
ContextLimit: int32(input.Body.ContextLimit),
// Note: Using != 0 to determine if value was provided (due to omitempty in JSON).
// This means 0 cannot be explicitly stored, which is acceptable for these fields.
Dimensions: pgtype.Int4{Int32: int32(input.Body.Dimensions), Valid: input.Body.Dimensions != 0},
ContextLimit: pgtype.Int4{Int32: int32(input.Body.ContextLimit), Valid: input.Body.ContextLimit != 0},
IsPublic: input.Body.IsPublic,
})
if err != nil {
Expand Down Expand Up @@ -177,8 +179,8 @@ func getDefinitionFunc(ctx context.Context, input *models.GetDefinitionRequest)
Description: def.Description.String,
APIStandard: def.APIStandard,
Model: def.Model,
Dimensions: def.Dimensions,
ContextLimit: def.ContextLimit,
Dimensions: def.Dimensions.Int32,
ContextLimit: def.ContextLimit.Int32,
IsPublic: def.IsPublic,
}
response := &models.GetDefinitionResponse{}
Expand Down Expand Up @@ -466,7 +468,8 @@ func putInstanceFunc(ctx context.Context, input *models.PutInstanceRequest) (*mo
APIKeyEncrypted: APIKeyEncrypted,
APIStandard: input.Body.APIStandard,
Model: input.Body.Model,
Dimensions: int32(input.Body.Dimensions),
Dimensions: pgtype.Int4{Int32: int32(input.Body.Dimensions), Valid: input.Body.Dimensions != 0},
ContextLimit: pgtype.Int4{Int32: int32(input.Body.ContextLimit), Valid: input.Body.ContextLimit != 0},
})
if err != nil {
return huma.Error500InternalServerError(fmt.Sprintf("unable to upload llm service instance: %v", err))
Expand Down Expand Up @@ -591,11 +594,11 @@ func postInstanceFromDefinitionFunc(ctx context.Context, input *models.PostInsta
if input.Body.Model == "" {
input.Body.Model = definition.Model
}
if input.Body.Dimensions == 0 {
input.Body.Dimensions = definition.Dimensions
if input.Body.Dimensions == 0 && definition.Dimensions.Valid {
input.Body.Dimensions = definition.Dimensions.Int32
}
if input.Body.ContextLimit == 0 {
input.Body.ContextLimit = definition.ContextLimit
if input.Body.ContextLimit == 0 && definition.ContextLimit.Valid {
input.Body.ContextLimit = definition.ContextLimit.Int32
}

// 1. Upsert LLM service instance
Expand All @@ -608,8 +611,8 @@ func postInstanceFromDefinitionFunc(ctx context.Context, input *models.PostInsta
APIKeyEncrypted: APIKeyEncrypted,
APIStandard: input.Body.APIStandard,
Model: input.Body.Model,
Dimensions: int32(input.Body.Dimensions),
ContextLimit: int32(input.Body.ContextLimit),
Dimensions: pgtype.Int4{Int32: int32(input.Body.Dimensions), Valid: input.Body.Dimensions != 0},
ContextLimit: pgtype.Int4{Int32: int32(input.Body.ContextLimit), Valid: input.Body.ContextLimit != 0},
})
if err != nil {
return fmt.Errorf("unable to upload llm service instance: %v", err)
Expand Down Expand Up @@ -715,8 +718,8 @@ func getInstanceFunc(ctx context.Context, input *models.GetInstanceRequest) (*mo
// APIKey: "", // Never return API key
APIStandard: llm.APIStandard,
Model: llm.Model,
Dimensions: llm.Dimensions,
ContextLimit: llm.ContextLimit,
Dimensions: llm.Dimensions.Int32,
ContextLimit: llm.ContextLimit.Int32,
}
response := &models.GetInstanceResponse{}
response.Body = ls
Expand Down
7 changes: 5 additions & 2 deletions internal/handlers/similars.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,11 @@ func postSimilarFunc(ctx context.Context, input *models.PostSimilarRequest) (*mo
}

// Validate that the vector dimensions match the LLM service instance dimensions
if len(input.Body.Vector) != int(instance.Dimensions) {
return nil, huma.Error400BadRequest(fmt.Sprintf("vector dimension mismatch: expected %d dimensions, got %d", instance.Dimensions, len(input.Body.Vector)))
if !instance.Dimensions.Valid {
return nil, huma.Error500InternalServerError("LLM service instance does not have dimensions configured")
}
if len(input.Body.Vector) != int(instance.Dimensions.Int32) {
return nil, huma.Error400BadRequest(fmt.Sprintf("vector dimension mismatch: expected %d dimensions, got %d", instance.Dimensions.Int32, len(input.Body.Vector)))
}

// Convert the vector to pgvector HalfVector format (half-precision float16)
Expand Down