feat(tadimlik): batch üretimi yılsız alanlarla; snapshot'a ilkYil (P-B c)

Prompt ve mock metni "son ${VERI_YIL_SAYISI} yıl" der; program seçimi
yerlesenSon'a göre; snapshot rapor.ts programBilgisi ile aynı şekilde
siraGecmisi + ilkYil yazar.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 17:00:39 +03:00
parent ceeb70375d
commit 85ed972c68

View File

@@ -38,6 +38,7 @@ import {
} from "../src/lib/tadimlik-havuzu"; } from "../src/lib/tadimlik-havuzu";
import { anahtarVar } from "../src/lib/ai/client"; import { anahtarVar } from "../src/lib/ai/client";
import { yapilandirilmisUret } from "../src/lib/ai/cagri"; import { yapilandirilmisUret } from "../src/lib/ai/cagri";
import { ILK_YIL, VERI_YIL_SAYISI } from "../src/lib/veri-yillari";
// Next dışında koşuyoruz; .env dosyalarını elle yükle (mevcut env kazanır). // Next dışında koşuyoruz; .env dosyalarını elle yükle (mevcut env kazanır).
function envYukle(dosya: string): void { function envYukle(dosya: string): void {
@@ -72,8 +73,8 @@ KURALLAR (kesin):
riskli" etiketleriyle konuş. riskli" etiketleriyle konuş.
- Programın "dilim" alanındaki "garanti" değeri teknik anahtardır; adaya dönük - Programın "dilim" alanındaki "garanti" değeri teknik anahtardır; adaya dönük
hiçbir metinde bu kelimeyi kullanma, o dilimi "güvenli" diye an. hiçbir metinde bu kelimeyi kullanma, o dilimi "güvenli" diye an.
- trendOzeti: son 5 yılın taban sıralaması hareketi, TEK cümle (ör. "2022'den - trendOzeti: son ${VERI_YIL_SAYISI} yılın taban sıralaması hareketi, TEK cümle
beri taban 45B'den 38B'ye indi, bölüm zorlaşıyor"). (ör. "2022'den beri taban 45B'den 38B'ye indi, bölüm zorlaşıyor").
- Adayın sıralaması yaklaşıktır; kesin sıra telaffuz etme, banda göre konuş.`; - Adayın sıralaması yaklaşıktır; kesin sıra telaffuz etme, banda göre konuş.`;
function mockAktif(): boolean { function mockAktif(): boolean {
@@ -87,27 +88,30 @@ function mockMetin(p: Program, temsiliSira: number, kategori: string | null) {
riskNotu: riskNotu:
"(Dev mock) Son taban sıralaması sırana yakın; küçük bir kayma sonucu değiştirebilir.", "(Dev mock) Son taban sıralaması sırana yakın; küçük bir kayma sonucu değiştirebilir.",
trendOzeti: trendOzeti:
"(Dev mock) Son 5 yılda taban sıralaması görece stabil seyretti.", `(Dev mock) Son ${VERI_YIL_SAYISI} yılda taban sıralaması görece stabil seyretti.`,
}; };
} }
/** rapor.ts programBilgisi ile aynı snapshot şekli. */ /** rapor.ts programBilgisi ile aynı snapshot şekli. */
function programBilgisi(p: Program) { function programBilgisi(p: Program) {
const gecmis = [p.sira2021, p.sira2022, p.sira2023, p.sira2024, p.sira2025]; const gecmis = p.siraGecmisi;
const gecmisVar = gecmis.some((s) => s != null);
return { return {
isim: p.isim, isim: p.isim,
universite: p.universite, universite: p.universite,
il: p.il, il: p.il,
unitur: p.unitur, unitur: p.unitur,
efektifSira: p.sira2025 ?? p.sira2024, efektifSira: p.efektifSira,
siraGecmisi: gecmis.some((s) => s != null) ? gecmis : undefined, siraGecmisi: gecmisVar ? gecmis : undefined,
ilkYil: gecmisVar ? ILK_YIL : undefined,
}; };
} }
/** /**
* Deterministik program seçimi: kovanın temsili sırası için "dengeli" dilimden * Deterministik program seçimi: kovanın temsili sırası için "dengeli" dilimden
* (boşsa "garanti") kategoriye ve üniversite tipine uyan, 2025'te en çok * (boşsa "garanti") kategoriye ve üniversite tipine uyan, son yerleştirme
* yerleşen alan program. Tanınır/dolu programlar tadımlıkta daha ikna edici. * yılında en çok yerleşen alan program. Tanınır/dolu programlar tadımlıkta
* daha ikna edici.
*/ */
function programSec( function programSec(
temsiliSira: number, temsiliSira: number,
@@ -125,7 +129,7 @@ function programSec(
: programlar; : programlar;
if (uygunlar.length === 0) continue; if (uygunlar.length === 0) continue;
const secilen = [...uygunlar].sort( const secilen = [...uygunlar].sort(
(a, b) => (b.yerlesen2025 ?? -1) - (a.yerlesen2025 ?? -1), (a, b) => (b.yerlesenSon ?? -1) - (a.yerlesenSon ?? -1),
)[0]; )[0];
return { program: secilen, dilim }; return { program: secilen, dilim };
} }