Changes
Build and Push Docker Images / build (push) Failing after 1s

This commit is contained in:
2026-05-07 17:09:24 +03:00
parent 898f4987a5
commit fe3dbc37ad
16 changed files with 939 additions and 212 deletions
+9 -4
View File
@@ -5,6 +5,9 @@ namespace Api.Data;
public sealed class RagDbContext : DbContext
{
public const string SchemaName = "rag";
public const string MigrationTableName = "_Migrations";
public RagDbContext(DbContextOptions<RagDbContext> options) : base(options)
{
}
@@ -16,9 +19,11 @@ public sealed class RagDbContext : DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(SchemaName);
modelBuilder.Entity<RagDocumentEntity>(entity =>
{
entity.ToTable("RagDocuments");
entity.ToTable("Documents");
entity.HasKey(x => x.Id);
entity.Property(x => x.Id).HasMaxLength(64);
entity.Property(x => x.DocumentType).HasMaxLength(80).IsRequired();
@@ -34,7 +39,7 @@ public sealed class RagDbContext : DbContext
modelBuilder.Entity<RagChunkEntity>(entity =>
{
entity.ToTable("RagChunks");
entity.ToTable("Chunks");
entity.HasKey(x => x.Id);
entity.Property(x => x.Id).HasMaxLength(64);
entity.Property(x => x.DocumentId).HasMaxLength(64).IsRequired();
@@ -48,7 +53,7 @@ public sealed class RagDbContext : DbContext
modelBuilder.Entity<RagEmbeddingCacheEntity>(entity =>
{
entity.ToTable("RagEmbeddingCache");
entity.ToTable("EmbeddingCache");
entity.HasKey(x => x.CacheKey);
entity.Property(x => x.CacheKey).HasMaxLength(64);
entity.Property(x => x.Model).HasMaxLength(120).IsRequired();
@@ -60,7 +65,7 @@ public sealed class RagDbContext : DbContext
modelBuilder.Entity<RagChatCompletionCacheEntity>(entity =>
{
entity.ToTable("RagChatCompletionCache");
entity.ToTable("ChatCompletionCache");
entity.HasKey(x => x.CacheKey);
entity.Property(x => x.CacheKey).HasMaxLength(64);
entity.Property(x => x.Model).HasMaxLength(120).IsRequired();
+1 -1
View File
@@ -20,7 +20,7 @@ public sealed class EfRagRepository : IRagRepository
public async Task InitializeAsync(CancellationToken ct)
{
_logger.LogInformation("Ensuring RAG database schema exists using EF Core");
await _db.Database.EnsureCreatedAsync(ct);
//await _db.Database.EnsureCreatedAsync(ct);
}
public async Task<RagDocumentRecord?> GetDocumentByTextHashAsync(string textHash, string? sourceUrl, CancellationToken ct)
@@ -0,0 +1,188 @@
// <auto-generated />
using System;
using Api.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace Api.Migrations
{
[DbContext(typeof(RagDbContext))]
[Migration("20260507140305_InitialRagSchema")]
partial class InitialRagSchema
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasDefaultSchema("rag")
.HasAnnotation("ProductVersion", "10.0.7")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("Api.Data.Entities.RagChatCompletionCacheEntity", b =>
{
b.Property<string>("CacheKey")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSUTCDATETIME()");
b.Property<string>("Model")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("nvarchar(120)");
b.Property<string>("ResponseText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Temperature")
.HasColumnType("decimal(4,2)");
b.HasKey("CacheKey");
b.ToTable("ChatCompletionCache", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagChunkEntity", b =>
{
b.Property<string>("Id")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<int>("ChunkIndex")
.HasColumnType("int");
b.Property<string>("DocumentId")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<byte[]>("Embedding")
.IsRequired()
.HasColumnType("varbinary(max)");
b.Property<string>("Text")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.HasIndex("DocumentId");
b.ToTable("Chunks", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagDocumentEntity", b =>
{
b.Property<string>("Id")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSUTCDATETIME()");
b.Property<string>("DocumentType")
.IsRequired()
.HasMaxLength(80)
.HasColumnType("nvarchar(80)");
b.Property<string>("MetadataJson")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("nvarchar(max)")
.HasDefaultValue("{}");
b.Property<string>("RawText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("SourceUrl")
.HasMaxLength(1200)
.HasColumnType("nvarchar(1200)");
b.Property<string>("TextHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(300)
.HasColumnType("nvarchar(300)");
b.Property<double>("TypeConfidence")
.HasColumnType("float");
b.HasKey("Id");
b.HasIndex("DocumentType");
b.HasIndex("TextHash");
b.ToTable("Documents", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagEmbeddingCacheEntity", b =>
{
b.Property<string>("CacheKey")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSUTCDATETIME()");
b.Property<string>("Model")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("nvarchar(120)");
b.Property<string>("TextHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<byte[]>("Vector")
.IsRequired()
.HasColumnType("varbinary(max)");
b.HasKey("CacheKey");
b.HasIndex("TextHash");
b.ToTable("EmbeddingCache", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagChunkEntity", b =>
{
b.HasOne("Api.Data.Entities.RagDocumentEntity", "Document")
.WithMany("Chunks")
.HasForeignKey("DocumentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Document");
});
modelBuilder.Entity("Api.Data.Entities.RagDocumentEntity", b =>
{
b.Navigation("Chunks");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,137 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Api.Migrations
{
/// <inheritdoc />
public partial class InitialRagSchema : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.EnsureSchema(
name: "rag");
migrationBuilder.CreateTable(
name: "ChatCompletionCache",
schema: "rag",
columns: table => new
{
CacheKey = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Model = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false),
Temperature = table.Column<decimal>(type: "decimal(4,2)", nullable: false),
ResponseText = table.Column<string>(type: "nvarchar(max)", nullable: false),
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "SYSUTCDATETIME()")
},
constraints: table =>
{
table.PrimaryKey("PK_ChatCompletionCache", x => x.CacheKey);
});
migrationBuilder.CreateTable(
name: "Documents",
schema: "rag",
columns: table => new
{
Id = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
DocumentType = table.Column<string>(type: "nvarchar(80)", maxLength: 80, nullable: false),
Title = table.Column<string>(type: "nvarchar(300)", maxLength: 300, nullable: false),
SourceUrl = table.Column<string>(type: "nvarchar(1200)", maxLength: 1200, nullable: true),
RawText = table.Column<string>(type: "nvarchar(max)", nullable: false),
TextHash = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
TypeConfidence = table.Column<double>(type: "float", nullable: false),
MetadataJson = table.Column<string>(type: "nvarchar(max)", nullable: false, defaultValue: "{}"),
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "SYSUTCDATETIME()")
},
constraints: table =>
{
table.PrimaryKey("PK_Documents", x => x.Id);
});
migrationBuilder.CreateTable(
name: "EmbeddingCache",
schema: "rag",
columns: table => new
{
CacheKey = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Model = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false),
TextHash = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Vector = table.Column<byte[]>(type: "varbinary(max)", nullable: false),
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "SYSUTCDATETIME()")
},
constraints: table =>
{
table.PrimaryKey("PK_EmbeddingCache", x => x.CacheKey);
});
migrationBuilder.CreateTable(
name: "Chunks",
schema: "rag",
columns: table => new
{
Id = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
DocumentId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
ChunkIndex = table.Column<int>(type: "int", nullable: false),
Text = table.Column<string>(type: "nvarchar(max)", nullable: false),
Embedding = table.Column<byte[]>(type: "varbinary(max)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Chunks", x => x.Id);
table.ForeignKey(
name: "FK_Chunks_Documents_DocumentId",
column: x => x.DocumentId,
principalSchema: "rag",
principalTable: "Documents",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Chunks_DocumentId",
schema: "rag",
table: "Chunks",
column: "DocumentId");
migrationBuilder.CreateIndex(
name: "IX_Documents_DocumentType",
schema: "rag",
table: "Documents",
column: "DocumentType");
migrationBuilder.CreateIndex(
name: "IX_Documents_TextHash",
schema: "rag",
table: "Documents",
column: "TextHash");
migrationBuilder.CreateIndex(
name: "IX_EmbeddingCache_TextHash",
schema: "rag",
table: "EmbeddingCache",
column: "TextHash");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ChatCompletionCache",
schema: "rag");
migrationBuilder.DropTable(
name: "Chunks",
schema: "rag");
migrationBuilder.DropTable(
name: "EmbeddingCache",
schema: "rag");
migrationBuilder.DropTable(
name: "Documents",
schema: "rag");
}
}
}
@@ -0,0 +1,185 @@
// <auto-generated />
using System;
using Api.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace Api.Migrations
{
[DbContext(typeof(RagDbContext))]
partial class RagDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasDefaultSchema("rag")
.HasAnnotation("ProductVersion", "10.0.7")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("Api.Data.Entities.RagChatCompletionCacheEntity", b =>
{
b.Property<string>("CacheKey")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSUTCDATETIME()");
b.Property<string>("Model")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("nvarchar(120)");
b.Property<string>("ResponseText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Temperature")
.HasColumnType("decimal(4,2)");
b.HasKey("CacheKey");
b.ToTable("ChatCompletionCache", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagChunkEntity", b =>
{
b.Property<string>("Id")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<int>("ChunkIndex")
.HasColumnType("int");
b.Property<string>("DocumentId")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<byte[]>("Embedding")
.IsRequired()
.HasColumnType("varbinary(max)");
b.Property<string>("Text")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.HasIndex("DocumentId");
b.ToTable("Chunks", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagDocumentEntity", b =>
{
b.Property<string>("Id")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSUTCDATETIME()");
b.Property<string>("DocumentType")
.IsRequired()
.HasMaxLength(80)
.HasColumnType("nvarchar(80)");
b.Property<string>("MetadataJson")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("nvarchar(max)")
.HasDefaultValue("{}");
b.Property<string>("RawText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("SourceUrl")
.HasMaxLength(1200)
.HasColumnType("nvarchar(1200)");
b.Property<string>("TextHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(300)
.HasColumnType("nvarchar(300)");
b.Property<double>("TypeConfidence")
.HasColumnType("float");
b.HasKey("Id");
b.HasIndex("DocumentType");
b.HasIndex("TextHash");
b.ToTable("Documents", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagEmbeddingCacheEntity", b =>
{
b.Property<string>("CacheKey")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSUTCDATETIME()");
b.Property<string>("Model")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("nvarchar(120)");
b.Property<string>("TextHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<byte[]>("Vector")
.IsRequired()
.HasColumnType("varbinary(max)");
b.HasKey("CacheKey");
b.HasIndex("TextHash");
b.ToTable("EmbeddingCache", "rag");
});
modelBuilder.Entity("Api.Data.Entities.RagChunkEntity", b =>
{
b.HasOne("Api.Data.Entities.RagDocumentEntity", "Document")
.WithMany("Chunks")
.HasForeignKey("DocumentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Document");
});
modelBuilder.Entity("Api.Data.Entities.RagDocumentEntity", b =>
{
b.Navigation("Chunks");
});
#pragma warning restore 612, 618
}
}
}
+4 -1
View File
@@ -36,7 +36,10 @@ try
var configuration = builder.Configuration;
var connectionString = builder.Services.GetConfiguredDbConnectionString(configuration);
options.UseSqlServer(connectionString);
options.UseSqlServer(connectionString, sql =>
{
sql.MigrationsHistoryTable(RagDbContext.MigrationTableName, RagDbContext.SchemaName);
});
});
builder.Services.AddHttpClient<RagAiClient>();