51 lines
2.7 KiB
C#
51 lines
2.7 KiB
C#
|
|
using System.ComponentModel.DataAnnotations;
|
|||
|
|
|
|||
|
|
namespace JobsMedical.Web.Models;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Single-row (Id=1) platform settings the admin controls at runtime — chiefly the ingestion
|
|||
|
|
/// automation policy and the optional AI audit layer. Kept in the DB (not appsettings) so it's
|
|||
|
|
/// editable from the admin panel without a redeploy.
|
|||
|
|
/// </summary>
|
|||
|
|
public class AppSetting
|
|||
|
|
{
|
|||
|
|
public int Id { get; set; } = 1;
|
|||
|
|
|
|||
|
|
// --- Ingestion automation ---
|
|||
|
|
public IngestionMode Mode { get; set; } = IngestionMode.Manual;
|
|||
|
|
|
|||
|
|
/// <summary>In Automatic mode WITHOUT AI, listings at/above this confidence auto-publish.</summary>
|
|||
|
|
public int AutoPublishMinConfidence { get; set; } = 85;
|
|||
|
|
|
|||
|
|
// --- AI audit layer (optional) ---
|
|||
|
|
public bool AiEnabled { get; set; } = false;
|
|||
|
|
|
|||
|
|
/// <summary>OpenAI-compatible chat-completions endpoint (self-hosted or Iranian provider).</summary>
|
|||
|
|
[MaxLength(500)] public string? AiEndpoint { get; set; }
|
|||
|
|
[MaxLength(200)] public string? AiApiKey { get; set; }
|
|||
|
|
[MaxLength(120)] public string? AiModel { get; set; } = "gpt-4o-mini";
|
|||
|
|
|
|||
|
|
/// <summary>The prompt + "framework" the AI follows to approve / reject / structure a listing.</summary>
|
|||
|
|
[MaxLength(4000)]
|
|||
|
|
public string AiSystemPrompt { get; set; } = DefaultPrompt;
|
|||
|
|
|
|||
|
|
/// <summary>If AI approves AND Mode is Automatic, publish without human review.</summary>
|
|||
|
|
public bool AiAutoApprove { get; set; } = false;
|
|||
|
|
|
|||
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|||
|
|
|
|||
|
|
public const string DefaultPrompt = """
|
|||
|
|
تو دستیار بررسی آگهیهای کاری حوزه درمان برای پلتفرم «همکادر» هستی.
|
|||
|
|
هر آگهی خام را بخوان و تصمیم بگیر:
|
|||
|
|
- approve: آگهی واقعی و مرتبط با شیفت/استخدام کادر درمان است و اطلاعات کافی دارد.
|
|||
|
|
- reject: تبلیغ، اسپم، نامرتبط، یا فاقد اطلاعات حداقلی است.
|
|||
|
|
- review: مرتبط است اما ناقص/مبهم و نیاز به بررسی انسانی دارد.
|
|||
|
|
نقش، شهر/محله، نوع شیفت، نوع همکاری، مبلغ یا درصد سهم، و عنوان را در صورت وجود استخراج کن.
|
|||
|
|
فقط با یک شیء JSON پاسخ بده با کلیدهای:
|
|||
|
|
decision (approve|reject|review)، confidence (0-100)، reason (فارسی کوتاه)،
|
|||
|
|
kind (shift|job)، role، city، district، shiftType (day|evening|night|oncall)،
|
|||
|
|
employmentType (fulltime|parttime|contract|plan)، payAmount (عدد تومان یا null)،
|
|||
|
|
sharePercent (0-100 یا null)، title، facilityName.
|
|||
|
|
""";
|
|||
|
|
}
|