@akredit/acik-mcp 0.5.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -37
- package/dist/apps/acik-mcp/src/araclar.js +12 -7
- package/dist/apps/acik-mcp/src/bologna.d.ts +12 -0
- package/dist/apps/acik-mcp/src/bologna.js +498 -254
- package/dist/apps/acik-mcp/src/genel-ayristir.js +2 -2
- package/dist/apps/acik-mcp/src/http.js +2 -1
- package/dist/apps/acik-mcp/src/kaynak-dogrula.js +1 -1
- package/dist/apps/acik-mcp/src/kisisel-veri.d.ts +4 -3
- package/dist/apps/acik-mcp/src/kisisel-veri.js +5 -0
- package/dist/apps/acik-mcp/src/not-tablosu.d.ts +4 -1
- package/dist/apps/acik-mcp/src/not-tablosu.js +13 -7
- package/dist/apps/acik-mcp/src/promptlar.d.ts +28 -4
- package/dist/apps/acik-mcp/src/promptlar.js +145 -79
- package/dist/apps/acik-mcp/src/sunucu.d.ts +4 -1
- package/dist/apps/acik-mcp/src/sunucu.js +21 -9
- package/dist/apps/acik-mcp/src/temel.d.ts +8 -0
- package/dist/apps/acik-mcp/src/temel.js +32 -0
- package/dist/apps/acik-mcp/src/yardim.js +46 -12
- package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.js +4 -2
- package/dist/packages/cekirdek/src/bologna/taslak.js +8 -2
- package/dist/packages/cekirdek/src/karar/katman.d.ts +2 -2
- package/dist/packages/cekirdek/src/karar/katman.js +2 -2
- package/dist/packages/cekirdek/src/turkce.d.ts +0 -2
- package/dist/packages/cekirdek/src/turkce.js +0 -4
- package/dist/packages/olcme/src/girdi.d.ts +3 -0
- package/dist/packages/olcme/src/girdi.js +55 -0
- package/dist/packages/olcme/src/index.d.ts +1 -0
- package/dist/packages/olcme/src/index.js +1 -0
- package/package.json +7 -1
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// etiketlerine (Amaç/Objective, İçerik/Content, Öğrenme Çıktıları/Learning Outcomes...) göre bölümlere ayırır.
|
|
3
3
|
// Ağ yoktur, model yoktur: yalnız etiket eşleme ve sayı okuma. Bulunamayan alan boş kalır, tahmin edilmez.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
6
|
-
// bölümü künye olarak ayrı alınır (yazar adları yayımlanmış künyedir).
|
|
5
|
+
// Görev satırları (Dersi Veren, Instructor, iletişim) ayrıştırmadan önce yetkililer listesine ayrılır ve olduğu gibi
|
|
6
|
+
// korunur; hiçbir şey atılmaz. Kaynaklar bölümü künye olarak ayrı alınır (yazar adları yayımlanmış künyedir).
|
|
7
7
|
//
|
|
8
8
|
// Düz metin (dış inceleme 2026-11-05): tarayıcıda Ctrl+A, Ctrl+C ile kopyalanan sayfada tablolar sekmeyle ayrılır.
|
|
9
9
|
// ÖÇ-PÇ katkı matrisi ve ders yapısı bu sekmeli metinden de okunur; Proliz sayfasının düz metni tanınır.
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// verisi taşınmadığı için CORS her kökene açıktır (kimlik bilgisi kabul edilmez).
|
|
4
4
|
//
|
|
5
5
|
// Günlük: istek içeriği YAZILMAZ. Yalnız araç (ya da yöntem) adı, süre, gövde boyutu ve durum kodu.
|
|
6
|
-
// Sınırlar: gövde en çok 512 KB; adres başına kova (varsayılan 60 istek, saniyede 1 dolar)
|
|
6
|
+
// Sınırlar: gövde en çok 512 KB; adres başına kova (varsayılan 60 istek, saniyede 1 jeton dolar); kaynak_dogrula
|
|
7
|
+
// için adres başına ayrı kova (varsayılan dakikada 5).
|
|
7
8
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
8
9
|
import { acikSunucu } from "./sunucu.js";
|
|
9
10
|
/**
|
|
@@ -432,7 +432,7 @@ export const kaynakDogrulaAraci = arac({
|
|
|
432
432
|
ad: "kaynak_dogrula",
|
|
433
433
|
baslik: "Kaynağın gerçekten var olduğunu doğrula",
|
|
434
434
|
aciklama: "DOI, ISBN ya da başlık ile yazar verilen eserleri (çağrı başına en çok 5) açık kataloglarda (Crossref, Open Library, Google Books) arar. Eşleşme için tam soyad, başlık sözcükleri, verildiyse kayıt türü ve yıl denetlenir. Bulursa katalogdaki bilgiden künye, bağlantı ve imza döndürür ('katalogda_bulundu'); bulamazsa 'bulunamadi' der. Katalogda bulunmak ders kaynağı olarak uygunluk demek değildir; ona hoca karar verir.",
|
|
435
|
-
sonrakiAdim: "Yalnız 'katalogda_bulundu' olan kaynakları hocaya künyesi ve bağlantısıyla gösterin; uygunluğuna hoca karar verir. Bologna araçlarına kaynağı { kunye, dogrulama: { durum, baglanti, imza } } olarak aynen verin. 'bulunamadi' olan kaynağı asla kendiniz önermeyin; hoca o eseri kullandığını söylerse yalnız hocanın verdiği bilgiyle dogrulama: 'hoca_beyani' olarak yazın.",
|
|
435
|
+
sonrakiAdim: "Yalnız 'katalogda_bulundu' olan kaynakları hocaya künyesi ve bağlantısıyla gösterin; uygunluğuna hoca karar verir. Bologna araçlarına kaynağı { kunye, dogrulama: { durum, baglanti, imza } } olarak aynen verin. 'bulunamadi' dönerse hocaya 'ne yapayım' diye sormayın: kendi web aramanızla aynı konuda en çok 2 başka aday (ISBN ya da DOI ile) bulup bu aracı bir kez daha çağırın; yine bulunamazsa alanı 'EKSİK: ders kaynağı' bırakıp akışı sürdürün, son özette sorun. 'bulunamadi' olan kaynağı asla kendiniz önermeyin; hoca o eseri kullandığını söylerse yalnız hocanın verdiği bilgiyle dogrulama: 'hoca_beyani' olarak yazın.",
|
|
436
436
|
kunyeAlanlari: ["kaynaklar"],
|
|
437
437
|
disAg: true,
|
|
438
438
|
// Künye ve katalog numaraları kişisel veri değildir; ISBN gibi uzun sayılar numara deseniyle karışmasın.
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
export type KisiselVeriKapsami = "yok" | "ogrenci" | "tam";
|
|
2
|
+
/** HTML ise yalnız görünen metni bırakır (betik, stil, yorum, etiket ve öznitelikler atılır). Değilse aynen döner. */
|
|
3
|
+
export declare function gorunenMetin(x: string): string;
|
|
1
4
|
/**
|
|
2
5
|
* Girdide kişisel veri olabilecek türlerin adları (değerler değil). Boşsa temiz.
|
|
3
6
|
* `kunyeAnahtarlari`: altındaki metinler künye kuralıyla (yazar adı serbest) değerlendirilen alan adları.
|
|
7
|
+
* `kapsam` verilmezse "tam"dır; sunucu, kapsam bildirmeyen araçlar için "ogrenci" verir (bkz. sunucu.ts).
|
|
4
8
|
*/
|
|
5
|
-
export type KisiselVeriKapsami = "yok" | "ogrenci" | "tam";
|
|
6
|
-
/** HTML ise yalnız görünen metni bırakır (betik, stil, yorum, etiket ve öznitelikler atılır). Değilse aynen döner. */
|
|
7
|
-
export declare function gorunenMetin(x: string): string;
|
|
8
9
|
export declare function kisiselVeriTurleri(girdi: unknown, kunyeAnahtarlari?: readonly string[], kapsam?: KisiselVeriKapsami): string[];
|
|
9
10
|
export declare function kisiselVeriIletisi(turler: readonly string[]): string;
|
|
10
11
|
/** Girdide giriş bilgisi var mı? Yalnız evet ya da hayır döner, değer döndürmez. */
|
|
@@ -55,6 +55,11 @@ export function gorunenMetin(x) {
|
|
|
55
55
|
.replace(/<[^>]{0,2000}>/gu, " ")
|
|
56
56
|
.replace(/ /gu, " ");
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Girdide kişisel veri olabilecek türlerin adları (değerler değil). Boşsa temiz.
|
|
60
|
+
* `kunyeAnahtarlari`: altındaki metinler künye kuralıyla (yazar adı serbest) değerlendirilen alan adları.
|
|
61
|
+
* `kapsam` verilmezse "tam"dır; sunucu, kapsam bildirmeyen araçlar için "ogrenci" verir (bkz. sunucu.ts).
|
|
62
|
+
*/
|
|
58
63
|
export function kisiselVeriTurleri(girdi, kunyeAnahtarlari = [], kapsam = "tam") {
|
|
59
64
|
if (kapsam === "yok")
|
|
60
65
|
return [];
|
|
@@ -10,7 +10,10 @@ export declare function tabloOku(metin: string): {
|
|
|
10
10
|
export declare function kimlikSutunlari(satirlar: string[][]): number[];
|
|
11
11
|
/** Kimlik sütunu olmayan tablonun başına o1, o2 takma ad sütunu ekler. Başlıkta zaten takma ad varsa dokunmaz. */
|
|
12
12
|
export declare function takmaAdEkle(metin: string): string;
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Tablodan kimlik sütunlarını atar, başa o1, o2 takma adı koyar. Yalnız bellekte çalışır. MCP aracı bunu kullanmaz
|
|
15
|
+
* (kimlik sütunu görürse tabloyu reddeder); verinin tarayıcıdan çıkmadığı /deneyin hesaplayıcısı kullanır.
|
|
16
|
+
*/
|
|
14
17
|
export declare function notTablosuAyikla(metin: string): {
|
|
15
18
|
tablo: string;
|
|
16
19
|
atilan: string[];
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
// Kişisel veri (dış inceleme 2026-11-05): tablo sohbete yapıştırıldığı anda yapay zekâ sağlayıcısına gitmiştir;
|
|
5
5
|
// sunucunun sonradan sütun atması bunu geri almaz. Bu yüzden ad, soyad ya da öğrenci numarası sütunu ya da 9-11
|
|
6
6
|
// haneli bir numara görülürse tablo işlenmez; hoca bu sütunları Excel'de silip yalnız not sütunlarını yapıştırır ya
|
|
7
|
-
// da verinin tarayıcıdan çıkmadığı hesaplayıcıyı kullanır. Değerler hiçbir yere yazılmaz. Sütun başlıklarından ölçme
|
|
8
|
-
// eşlemesi sezilir; sezilemeyen bilgi tahmin edilmez, eksikler
|
|
7
|
+
// da verinin tarayıcıdan çıkmadığı hesaplayıcıyı kullanır. Değerler hiçbir yere yazılmaz. Sütun başlıklarından ölçme
|
|
8
|
+
// aracı, soru numarası, tam puan ve ders çıktısı (ÇK) eşlemesi sezilir; sezilemeyen bilgi tahmin edilmez, eksikler
|
|
9
|
+
// listesine girer. Sayılar yalnız tablodan okunur.
|
|
9
10
|
import { z } from "zod";
|
|
10
11
|
import { arac, KOD_KAYNAGI } from "./temel.js";
|
|
11
12
|
export function ayiracBul(metin) {
|
|
@@ -70,7 +71,10 @@ export function takmaAdEkle(metin) {
|
|
|
70
71
|
return metin;
|
|
71
72
|
return satirlar.map((r, i) => [i === 0 ? "Takma ad" : `o${i}`, ...r].join("\t")).join("\n");
|
|
72
73
|
}
|
|
73
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Tablodan kimlik sütunlarını atar, başa o1, o2 takma adı koyar. Yalnız bellekte çalışır. MCP aracı bunu kullanmaz
|
|
76
|
+
* (kimlik sütunu görürse tabloyu reddeder); verinin tarayıcıdan çıkmadığı /deneyin hesaplayıcısı kullanır.
|
|
77
|
+
*/
|
|
74
78
|
export function notTablosuAyikla(metin) {
|
|
75
79
|
const { satirlar } = tabloOku(metin);
|
|
76
80
|
if (satirlar.length < 2)
|
|
@@ -145,8 +149,8 @@ export const SUTUN_ESLEME_REHBERI = [
|
|
|
145
149
|
export const notTablosuAyristirAraci = arac({
|
|
146
150
|
ad: "not_tablosu_ayristir",
|
|
147
151
|
baslik: "Not tablosunu ayrıştır",
|
|
148
|
-
aciklama: "Excel ya da CSV'den yapıştırılan not tablosunu ÇK/PÇ hesabına hazırlar. Tabloda yalnız not sütunları olmalı: ad, soyad ya da numara sütunu ya da 9-11 haneli numara görülürse tablo işlenmez. Öğrencilere o1, o2 takma adı verir. Başlıklardan sınav, soru, tam puan ve ders çıktısı eşlemesini sezer; eksikleri listeler.",
|
|
149
|
-
sonrakiAdim: "
|
|
152
|
+
aciklama: "Excel ya da CSV'den yapıştırılan not tablosunu ÇK/PÇ hesabına hazırlar. ÖNCE ŞUNU SÖYLEYİN: öğrenci notları sohbete yapıştırılınca yapay zekâ sağlayıcısına gider; kimlik sütunu olmasa da en güvenli yol akredit.org/deneyin#ck sayfasındaki tarayıcı içi hesaplayıcıdır (veri bilgisayardan çıkmaz). Hoca yine burada isterse devam edin. Tabloda yalnız not sütunları olmalı: ad, soyad ya da numara sütunu ya da 9-11 haneli numara görülürse tablo işlenmez. Öğrencilere o1, o2 takma adı verir. Başlıklardan sınav, soru, tam puan ve ders çıktısı eşlemesini sezer; eksikleri listeler.",
|
|
153
|
+
sonrakiAdim: "Eksik yoksa hocaya soru sormadan ckPcHesaplaTaslagi'ni hemen ck_pc_hesapla'ya verin. Eksik varsa (tam puan, soru-çıktı eşlemesi, sınav ağırlığı) hepsini TEK mesajda, numaralı sorun; tahmin etmeyin, sütun sütun ayrı mesaj açmayın.",
|
|
150
154
|
kisiselVeriIpucu: NOT_TABLOSU_KISISEL_ILETI,
|
|
151
155
|
kisiselVeriKapsami: "tam",
|
|
152
156
|
onDenetim: (g) => {
|
|
@@ -253,14 +257,16 @@ export const notTablosuAyristirAraci = arac({
|
|
|
253
257
|
ciktilar: ciktilar.map((kod) => ({ kod })),
|
|
254
258
|
araclar,
|
|
255
259
|
puanlar,
|
|
256
|
-
not: "dersKodu ve donem
|
|
260
|
+
not: "dersKodu ve donem biliniyorsa ekleyin; bilinmiyorsa bunun için hocayı durdurmayın, çıktıda EKSİK yazın. Eksik kalmayınca ck_pc_hesapla'ya verin.",
|
|
257
261
|
},
|
|
258
262
|
sutunEslemeRehberi: SUTUN_ESLEME_REHBERI,
|
|
259
263
|
},
|
|
260
264
|
kaynak: [KOD_KAYNAGI("apps/acik-mcp/src/not-tablosu.ts", "Akredit not tablosu ayrıştırıcısı")],
|
|
261
265
|
...(eksikler.length
|
|
262
266
|
? {
|
|
263
|
-
|
|
267
|
+
// Eksik bilgi yalnız hocadadır: bu adımda sorulur.
|
|
268
|
+
hocayaSimdiSor: true,
|
|
269
|
+
sonrakiAdim: "Bütün eksikleri TEK mesajda, numaralı sorun (tahmin etmeyin); yanıtları tamPuanlar, eslemeler ve agirliklar olarak verip aracı yeniden çağırın. Tabloyu yeniden yapıştırtmayın, aynı tabloyu kullanın.",
|
|
264
270
|
}
|
|
265
271
|
: {}),
|
|
266
272
|
};
|
|
@@ -9,11 +9,11 @@ export interface AcikIstem {
|
|
|
9
9
|
}
|
|
10
10
|
/** Giriş bilgisi kuralı: bütün istemlerde aynen yer alır. */
|
|
11
11
|
export declare const GIRIS_BILGISI_KURALI: string;
|
|
12
|
-
/** Akıllı doldurma
|
|
13
|
-
export declare const
|
|
14
|
-
/** "4) Hepsini akıllıca doldur" seçildiğinde (ya da hoca "sen seç", "hepsi" derse) izlenecek yol. */
|
|
12
|
+
/** Akıllı doldurma kuralı: varsayılan yol; bütün istemlerde ve sunucu talimatında aynen geçer. */
|
|
13
|
+
export declare const AKILLI_DOLDURMA_KURALI = "Varsay\u0131lan ak\u0131ll\u0131 doldurmad\u0131r; hocaya alan alan men\u00FC sorulmaz: her alan i\u00E7in en iyisini sen se\u00E7ersin, ara\u00E7la denetlersin, ge\u00E7meyeni d\u00FCzeltip yeniden denetlersin, sonda tek \u00F6zet g\u00F6sterirsin.";
|
|
15
14
|
/** Bilinmesi mümkün olmayan ve resmî taahhüt olan bilgiler: sayfadan okunur, yoksa tek mesajda sorulur. */
|
|
16
15
|
export declare const TEYIT_SORULARI: string;
|
|
16
|
+
/** Akıllı doldurmanın (varsayılan yol) ayrıntısı. */
|
|
17
17
|
export declare const AKILLI_DOLDURMA: string;
|
|
18
18
|
/** Bütün istemlerde ortak çalışma biçimi. */
|
|
19
19
|
export declare const ORTAK_KURALLAR: string;
|
|
@@ -43,6 +43,30 @@ export declare function baslangic(): {
|
|
|
43
43
|
};
|
|
44
44
|
ortakKurallar: string;
|
|
45
45
|
};
|
|
46
|
-
|
|
46
|
+
/** Kullanıcı niyetini zaten yazdıysa menü atlanır; yalnız o odağın akışı ve kurallar döner. */
|
|
47
|
+
export declare function odakBaslangici(no: string): {
|
|
48
|
+
hocayaGoster: string;
|
|
49
|
+
odak: {
|
|
50
|
+
no: "1" | "2" | "3" | "4" | "5";
|
|
51
|
+
ad: "Bologna ders paketini denetle ve boş alanları doldur" | "Ders öğrenme çıktısı yaz ya da iyileştir" | "ÇK ve PÇ sağlanma düzeyini hesapla" | "YÖKAK, MÜDEK, FEDEK, EPDAD ya da SABAK ölçüt ve kanıt rehberi" | "Öz değerlendirme metninin dil denetimi";
|
|
52
|
+
istem: "bologna_doldur" | "cikti_yaz" | "ck_pc_hesabi" | "olcut_rehberi" | "dil_denetimi";
|
|
53
|
+
} | null;
|
|
54
|
+
kisaKurallar: string[];
|
|
55
|
+
akis: string;
|
|
56
|
+
ortakKurallar: string;
|
|
57
|
+
};
|
|
58
|
+
export declare function niyetCoz(mesaj: string | undefined): string | null;
|
|
59
|
+
export declare const akreditBaslaAraci: import("./temel.ts").AcikArac<z.ZodObject<{
|
|
60
|
+
kullaniciMesaji: z.ZodOptional<z.ZodString>;
|
|
61
|
+
odak: z.ZodDefault<z.ZodEnum<{
|
|
62
|
+
1: "1";
|
|
63
|
+
2: "2";
|
|
64
|
+
3: "3";
|
|
65
|
+
4: "4";
|
|
66
|
+
5: "5";
|
|
67
|
+
otomatik: "otomatik";
|
|
68
|
+
menu: "menu";
|
|
69
|
+
}>>;
|
|
70
|
+
}, z.core.$strip>>;
|
|
47
71
|
/** SDK için bağımsız değişken şeması: hepsi isteğe bağlı, kısa metin. */
|
|
48
72
|
export declare const istemSemasi: (i: AcikIstem) => Record<string, z.ZodOptional<z.ZodString>>;
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
// MCP istemleri (prompts). İstemciler bunları eğik çizgi komutu ya da hazır başlangıç olarak gösterir.
|
|
2
|
-
// İlke (İP-49):
|
|
3
|
-
//
|
|
4
|
-
// geçmeyeni düzeltip yeniden denetler, sonunda tek bir özet gösterir. Hoca isterse numarayla düzeltir.
|
|
2
|
+
// İlke (İP-49): en az kullanıcı müdahalesiyle süreci hızlıca ama denetimli, teyitli tamamlamak. Varsayılan yol
|
|
3
|
+
// akıllı doldurmadır (hocaya alan alan menü sorulmaz): asistan her alan için en iyi seçeneği kendisi seçer, sunucu
|
|
4
|
+
// denetiminden geçmeyeni düzeltip yeniden denetler, sonunda tek bir özet gösterir. Hoca isterse numarayla düzeltir.
|
|
5
5
|
// Halüsinasyona yer yok: kitap, kişi, tarih, sayı uydurulmaz; kaynaklar kaynak_dogrula'dan geçmeden önerilmez.
|
|
6
6
|
//
|
|
7
7
|
// Dış inceleme 2026-11-05: akıllı doldurma kalır, ama bilinmesi mümkün olmayan ve resmî taahhüt olan bilgiler
|
|
8
|
-
// (değerlendirme yöntemi ve yüzdeleri,
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// hoca bir kez "kaydet" der; kayıttan
|
|
8
|
+
// (değerlendirme yöntemi ve yüzdeleri, kullanılan kaynaklar) sayfadan okunur; yoksa asistan bunları TEK mesajda,
|
|
9
|
+
// numaralı sorar, uydurmaz ve yüzdeye varsayılan koymaz (06.11.2026). Uygulama/lab T+U+L'den okunur; amaç ve içerik
|
|
10
|
+
// sayfada yoksa "öneri" olarak yazılıp son özette teyide sunulur. Ders adından üretilen her şey "öneri" etiketiyle
|
|
11
|
+
// gösterilir. OBS'ye yazmadan önce alan alan önceki/yeni değer özeti gösterilir, hoca bir kez "kaydet" der; kayıttan
|
|
12
|
+
// sonra sayfa geri okunur ve obs_karsilastir ile doğrulanır.
|
|
13
|
+
//
|
|
14
|
+
// Peşin onay (0.8.0): hoca başta "hepsini yap ve kaydet" derse ara durak olmaz; teyit sorulmaz (EKSİK kalır), özet
|
|
15
|
+
// sondaki tek raporda verilir. Onaya Gönder yine hocadadır.
|
|
12
16
|
//
|
|
13
17
|
// İstem metni veri değil asistana yönergedir; içinde hocanın girdisi yalnız isteğe bağlı kısa bağımsız
|
|
14
18
|
// değişkenler olarak yer alır (ders kodu, çerçeve) ve sınırlanır. Giriş bilgisi (parola, doğrulama kodu,
|
|
15
19
|
// çerez) istenmez; görülürse reddedilir ve kaydedilmez (ilke 8).
|
|
16
20
|
import { z } from "zod";
|
|
17
|
-
import { arac, KOD_KAYNAGI } from "./temel.js";
|
|
21
|
+
import { arac, KOD_KAYNAGI, pesinOnayVar, TARAMA_SECENEKLERI } from "./temel.js";
|
|
18
22
|
import { GIRIS_KURALI_HOCAYA } from "./yardim.js";
|
|
19
23
|
/** Giriş bilgisi kuralı: bütün istemlerde aynen yer alır. */
|
|
20
24
|
export const GIRIS_BILGISI_KURALI = [
|
|
@@ -23,35 +27,34 @@ export const GIRIS_BILGISI_KURALI = [
|
|
|
23
27
|
"- Hoca bunları kendisi yalnız OBS'nin kendi giriş ekranına yazar. Bunu hocaya ilk adımda açıkça söyle.",
|
|
24
28
|
"- Hoca yine de sohbete parola yazarsa kullanma, hiçbir araca gönderme; silmesini ve OBS'de parolasını değiştirmesini öner.",
|
|
25
29
|
"- CAPTCHA'yı sen çözmezsin, hoca çözer.",
|
|
26
|
-
'- OBS\'de Kaydet düğmesine yalnız hocanın açık izniyle basarsın: önce alan alan önceki ve yeni değer özetini gösterirsin, hoca bir kez "kaydet" der. İzin yoksa basmazsın. Onaya ya da dış kuruma Gönder düğmesine hiç basmazsın; onu hoca basar.',
|
|
30
|
+
'- OBS\'de Kaydet düğmesine yalnız hocanın açık izniyle basarsın: önce alan alan önceki ve yeni değer özetini gösterirsin, hoca bir kez "kaydet" der. Hoca başta peşin onay verdiyse ("hepsini yap ve kaydet") izin odur; özet sondaki raporda verilir. İzin yoksa basmazsın. Onaya ya da dış kuruma Gönder düğmesine hiç basmazsın; onu hoca basar.',
|
|
27
31
|
].join("\n");
|
|
28
|
-
/** Akıllı doldurma
|
|
29
|
-
export const
|
|
30
|
-
/** "4) Hepsini akıllıca doldur" seçildiğinde (ya da hoca "sen seç", "hepsi" derse) izlenecek yol. */
|
|
32
|
+
/** Akıllı doldurma kuralı: varsayılan yol; bütün istemlerde ve sunucu talimatında aynen geçer. */
|
|
33
|
+
export const AKILLI_DOLDURMA_KURALI = "Varsayılan akıllı doldurmadır; hocaya alan alan menü sorulmaz: her alan için en iyisini sen seçersin, araçla denetlersin, geçmeyeni düzeltip yeniden denetlersin, sonda tek özet gösterirsin.";
|
|
31
34
|
/** Bilinmesi mümkün olmayan ve resmî taahhüt olan bilgiler: sayfadan okunur, yoksa tek mesajda sorulur. */
|
|
32
35
|
export const TEYIT_SORULARI = [
|
|
33
36
|
"Teyit gerektiren bilgiler (asla tahmin etme):",
|
|
34
37
|
"- Değerlendirme yöntemleri ve yüzdeleri (vize, final, ödev, proje...).",
|
|
35
|
-
"- Dersin uygulama ya da laboratuvar içerip içermediği.",
|
|
36
38
|
"- Derste gerçekten kullanılan kaynaklar ve ders notları.",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
' "
|
|
40
|
-
" 1) Değerlendirme
|
|
41
|
-
|
|
42
|
-
'
|
|
43
|
-
"Hocanın seçtiği varsayılan da hoca teyidi sayılır (degerlendirmeDayanagi: 'hoca'). Yanıt gelmeden değerlendirme yüzdesi yazma paketine girmez.",
|
|
39
|
+
"Bunları önce sayfadan oku; sayfada doluysa SORMA. Uygulama/lab sorulmaz: T+U+L'den okunur (U+L > 0 ise var). Amaç ve içerik sayfada yoksa önden sorulmaz; 'öneri' olarak yazılıp son özette teyide sunulur.",
|
|
40
|
+
"Sayfada olmayan değerlendirme ve kaynakları hocaya TEK mesajda sor. Değerlendirme yüzdesine varsayılan uydurma; hoca yazar. Örnek:",
|
|
41
|
+
' "İki bilgiyi yalnız siz bilebilirsiniz:',
|
|
42
|
+
" 1) Değerlendirme yöntemleri ve yüzdeleri: yazın (ör. Vize 40, Final 60)",
|
|
43
|
+
' 2) Kaynaklar: a) katalogdan doğrulayıp önereyim (önerilen) b) şunları kullanıyorum: yazın"',
|
|
44
|
+
"Yanıt gelmeden değerlendirme yüzdesi yazma paketine girmez. Hocanın yanıtını degerlendirmeKaniti'ne olduğu gibi yazın (degerlendirmeDayanagi: 'hoca'); sayfadan okunduysa sayfadaki tablo metnini (degerlendirmeDayanagi: 'sayfa'). Yüzdeler bu metinde geçmezse sunucu teyitsiz sayar.",
|
|
44
45
|
].join("\n");
|
|
46
|
+
/** Akıllı doldurmanın (varsayılan yol) ayrıntısı. */
|
|
45
47
|
export const AKILLI_DOLDURMA = [
|
|
46
|
-
"
|
|
48
|
+
"Akıllı doldurma (varsayılan):",
|
|
47
49
|
"- Önce teyit gerektiren bilgileri sayfadan oku; sayfada olmayanları hocaya TEK mesajda birlikte sor (aşağıdaki kural). Bundan sonra ara soru sorma.",
|
|
48
50
|
"- Kalan her alan için seçeneklerini kendin yaz ve en iyisini kendin seç. Ders adından ve program çıktılarından ürettiğin her şeyi 'öneri' etiketiyle göster.",
|
|
49
51
|
"- Her seçimi ilgili araçla denetle (bologna_taslak_denetle, bologna_durum, rapor_dil_denetle). Geçmeyeni düzelt ve yeniden denetle; geçene kadar hocaya gösterme. Üç denemede geçmezse o alanı EKSİK bırak.",
|
|
50
52
|
"- Sayıları (toplam, yüzde, iş yükü, sağlanma düzeyi) yalnız araç yanıtından al.",
|
|
51
|
-
"- Uydurma yok: hocanın vermediği ve doğrulayamadığın bilgi (kişi, kitap, tarih, sayı, toplantı) EKSİK kalır. Kaynaklar yalnız kaynak_dogrula'dan '
|
|
53
|
+
"- Uydurma yok: hocanın vermediği ve doğrulayamadığın bilgi (kişi, kitap, tarih, sayı, toplantı) EKSİK kalır. Kaynaklar yalnız kaynak_dogrula'dan 'katalogda_bulundu' dönenler ya da hocanın kullandığını söyledikleridir ('hoca_beyani').",
|
|
52
54
|
"- Araç sonucunu 'geçer' diye sunma: 'biçim denetiminden geçti; içerik teyidi: hoca' de.",
|
|
53
|
-
"- Bitince tek bir özet göster: numara, alan, ne yazdığın (ilk cümle ya da kısa özet), kaynağı (sayfa, hoca ya da öneri), biçim denetimi sonucu.
|
|
54
|
-
|
|
55
|
+
"- Bitince tek bir özet göster: numara, alan, ne yazdığın (ilk cümle ya da kısa özet), kaynağı (sayfa, hoca ya da öneri), biçim denetimi sonucu.",
|
|
56
|
+
"- Ara özet gösterip 'devam' bekleme: OBS'ye yazılacaksa özet, yazma onayıyla aynı mesajdadır (OBS'ye yazma adımı). Özetin altına yaz:",
|
|
57
|
+
" \"Öneri yazanlar benim önerimdir, içeriği siz teyit edersiniz. 1) OBS'ye yaz ve kaydet 2) formu doldur, Kaydet'e ben basayım 3) kopya metni ver. Değiştirmek istediğiniz alan varsa numarasını yazın.\"",
|
|
55
58
|
"",
|
|
56
59
|
TEYIT_SORULARI,
|
|
57
60
|
].join("\n");
|
|
@@ -61,7 +64,7 @@ export const ORTAK_KURALLAR = [
|
|
|
61
64
|
"- Amaç: hocanın en az müdahalesiyle işi hızlı ama denetimli ve teyitli bitirmek.",
|
|
62
65
|
"- Karşındaki hoca yapay zekâyı belki ilk kez kullanıyor. Kısa, sade Türkçe yaz. Araç adı, JSON ve teknik terim gösterme.",
|
|
63
66
|
"- Her mesajda tek iş iste. Ne yapacağını ve ekranda ne göreceğini söyle.",
|
|
64
|
-
`-
|
|
67
|
+
`- ${AKILLI_DOLDURMA_KURALI}`,
|
|
65
68
|
'- Hoca tek rakamla seçer. "sen seç", "hepsi", "hepsi 1" gibi yanıtlar toplu onaydır; kalan bütün adımlara uygula, her adımı yeniden sorma.',
|
|
66
69
|
"- Sunucu metin üretmez. Seçenek metinlerini sen yazarsın; sunucu kural verir, denetler ve sayıları hesaplar.",
|
|
67
70
|
"- Sayıları (toplam, yüzde, iş yükü, sağlanma düzeyi) yalnız araç yanıtından al, kendin toplama.",
|
|
@@ -83,6 +86,9 @@ const kisa = (v, n = 40) => v
|
|
|
83
86
|
.trim()
|
|
84
87
|
.slice(0, n)
|
|
85
88
|
: "";
|
|
89
|
+
/** Odak menüsünün başlığı: istemde ve akredit_basla yanıtında aynı. */
|
|
90
|
+
const MENU_BASLIGI = "Merhaba. Neye odaklanalım? Yalnız numarasını yazın.";
|
|
91
|
+
const BASKA = "Başka bir şey: tüm araçları kısaca listele";
|
|
86
92
|
const ODAKLAR = [
|
|
87
93
|
["1", "Bologna ders paketini denetle ve boş alanları doldur", "bologna_doldur"],
|
|
88
94
|
["2", "Ders öğrenme çıktısı yaz ya da iyileştir", "cikti_yaz"],
|
|
@@ -90,6 +96,7 @@ const ODAKLAR = [
|
|
|
90
96
|
["4", "YÖKAK, MÜDEK, FEDEK, EPDAD ya da SABAK ölçüt ve kanıt rehberi", "olcut_rehberi"],
|
|
91
97
|
["5", "Öz değerlendirme metninin dil denetimi", "dil_denetimi"],
|
|
92
98
|
];
|
|
99
|
+
const MENU_SATIRLARI = [MENU_BASLIGI, ...ODAKLAR.map(([no, ad]) => `${no}) ${ad}`), `${ODAKLAR.length + 1}) ${BASKA}`];
|
|
93
100
|
/** akredit başlangıcının sorduğu odak menüsü; site örnek konuşmayı buradan okur. */
|
|
94
101
|
export const AKREDIT_ODAKLARI = ODAKLAR.map(([no, ad]) => ({ no, ad }));
|
|
95
102
|
/** OBS'ye tarayıcıyla giriş: Bologna akışının ilk adımı. */
|
|
@@ -97,14 +104,17 @@ const obsGirisi = () => [
|
|
|
97
104
|
"Adım 0. OBS'ye giriş (tarayıcı).",
|
|
98
105
|
` Hocaya önce şunu aynen söyle: "${GIRIS_KURALI_HOCAYA}"`,
|
|
99
106
|
" Tarayıcı aracın varsa (Claude in Chrome, Claude masaüstü tarayıcı paneli, ChatGPT ajan modu gibi):",
|
|
100
|
-
" a)
|
|
107
|
+
" a) İLK İŞ: tarayıcıda açık sekmelere bak. Açık bir OBS ya da Bologna sayfası varsa adres ve giriş sorma, doğrudan d) adımına geç. Yoksa hocaya yalnız şunu sor: \"OBS'nizin adresini yazın (bilmiyorsanız üniversitenizin adını yazın).\" Ders adını ya da paketi sorma; onları OBS'den okuyacaksın. Adres gelince hemen tarayıcıda aç. Üniversite adı gelirse kurumun OBS ya da Bologna sayfasını web aramasıyla bul ve aç.",
|
|
101
108
|
' b) Giriş ekranı gelince dur ve şunu yaz: "Kullanıcı adınızı ve parolanızı şimdi açılan OBS ekranına kendiniz yazın. Bitince bana yalnız girdim yazın."',
|
|
102
109
|
" c) CAPTCHA ya da doğrulama kodu gelirse hocanın kendisinin girmesini bekle; sen girme.",
|
|
103
|
-
" d) Hoca girdim deyince ders
|
|
110
|
+
" d) Hoca girdim deyince hangi dersi incelemek istediğini SORMA. Listedeki ders kodlarını ve adlarını obs_ders_listesi'ne ver, sonra kendin tara: tarama planındaki her dersin Bologna sayfasını sırayla açıp bologna_ayristir'e ver; yanıttaki denetim eksik ve kurala uymayan alanları sayar (bologna_denetle'yi ayrıca çağırma). Liste 15'erli dilimlerle taranır; sonraki dilime obs_ders_listesi'nin verdiği baslangic değeriyle geçilir.",
|
|
111
|
+
" Peşin onay varsa obs_ders_listesi'ne pesinOnay ver ve yanıtındaki adımları izle: rapor ve seçenek durağı yoktur.",
|
|
112
|
+
" Sonra tek mesajda 'Şu eksiklikleri tespit ettim, önerilerim şunlar' başlıklı kısa bir özet ver: her ders için bir satır, eksik alan sayısı (en eksikten en tamama). Aynı mesajda, eksik derslerin sayfasında olmayan değerlendirme yüzdelerini ve kaynakları da sor (Adım 3; ayrı tur açma). Altına obs_ders_listesi yanıtındaki raporBicimi seçeneklerini aynen koy:",
|
|
113
|
+
...TARAMA_SECENEKLERI.map((t) => ` ${t}`),
|
|
114
|
+
' Eksik yoksa "Eksik görünmüyor" de ve kaliteyi artıracak 2-4 somut öneri ver (zayıf ya da kısa alanlar, öğrenme çıktılarında Bloom düzeyi ve ölçülebilirlik, iş yükü ile AKTS uyumu, kaynakların güncelliği, İngilizce alanların eksiksizliği); önerilen seçenekle numaralı sun. Hoca yalnız numara yazar.',
|
|
104
115
|
" e) Dersin Bologna (ders bilgi paketi) sayfasını oku. Okuduğun metni ya da HTML'i bologna_ayristir'e ver.",
|
|
105
|
-
|
|
106
|
-
" 1
|
|
107
|
-
' 2 seçilirse şunu yaz: "OBS\'de dersinizin Bologna sayfasını açın. Sayfada Ctrl+A ile hepsini seçin, Ctrl+C ile kopyalayın, buraya Ctrl+V ile yapıştırın."',
|
|
116
|
+
' Tarayıcı aracın yoksa ÖNCE eklentiyi kurdur: engel_coz (engel: tarayici_araci_yok, istemciyi biliyorsan istemci) çağır ve şunu yaz: "Akredit OBS\'nizi Chrome eklentisiyle kendisi açar, doldurur ve kaydeder; eklenti olmadan her alanı siz kopyalarsınız. Kurulum 2 dakika: 1) kuralım (önerilen) 2) kurmadan devam, metni ben yapıştırayım." 1 gelirse adımları tek tek göster, bitince yeni sohbette akredit yazmasını söyle. Yalnız 2 gelirse ya da istemcide eklenti yoksa (ChatGPT/Codex) şunu yaz: "OBS\'de dersinizin Bologna sayfasını açın, Ctrl+A ile seçip Ctrl+C ile kopyalayın ve buraya yapıştırın."',
|
|
117
|
+
" 1 gelirse kurulum_yardimi'nı hocanın asistanıyla (istemci) çağır, adımları tek tek göster.",
|
|
108
118
|
" Herhangi bir engelde engel_coz'u ilgili engel türüyle çağır.",
|
|
109
119
|
].join("\n");
|
|
110
120
|
/** Kaynak: önce sayfadaki ve hocanın kullandığı; öneri yalnız katalogda bulunan, "öneri" etiketiyle. */
|
|
@@ -118,13 +128,15 @@ const KAYNAK_ADIMI = [
|
|
|
118
128
|
const OBS_YAZMA = [
|
|
119
129
|
"6. OBS'ye yazma.",
|
|
120
130
|
" Önce bologna_kopya_metni'ni çağır (OBS'deki şimdiki değerleri oncekiDegerler olarak ver). Yazma paketine alınmayanları (doğrulanmamış kaynak, teyitsiz değerlendirme yüzdesi) hocaya söyle; onları yazma.",
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
|
|
125
|
-
"
|
|
126
|
-
"
|
|
127
|
-
|
|
131
|
+
" Ara özet gösterip 'devam' bekleme. TEK mesajda degisiklikOzeti'ni göster (numara, sekme, alan, önceki değer, yeni değer, kaynağı: sayfa, hoca ya da öneri; toplu modda bologna_toplu_ozet ile bütün dersler tek tabloda) ve altına sor:",
|
|
132
|
+
" 1) OBS'ye yaz ve kaydet (bu seçim, yukarıdaki özete 'kaydet' onayıdır)",
|
|
133
|
+
" 2) Formu doldur, Kaydet'e ben basayım",
|
|
134
|
+
" 3) Alan alan kopya metni ver",
|
|
135
|
+
" Değiştirmek istediğiniz alan varsa numarasını yazın.",
|
|
136
|
+
" Tarayıcı aracın yoksa yalnız 3'ü sun.",
|
|
137
|
+
" Peşin onay: hoca başta 'hepsini yap ve kaydet' gibi bir sözle onay verdiyse o metni bologna_kopya_metni'ne (toplu modda bologna_toplu_ozet'e) pesinOnay olarak ver; araç 'peşin onay var' derse özet gösterip beklemeden yaz, kaydet, geri oku, doğrula ve sonda tek rapor ver. Bilmediğin resmî bilgiyi EKSİK bırak, uydurma.",
|
|
138
|
+
" 1: Yalnız hoca 1 ya da 'kaydet' yazdıysa, yalnız özetteki alanları yaz ve kaydet. Her sekmeden önce ders kodunu ve dönemi sayfada denetle; beklenenden farklıysa yazmayı durdur ve hocaya söyle.",
|
|
139
|
+
" 2: OBS düzenleme ekranında sekme sekme ilgili kutulara yaz. Her sekmeden sonra dur ve hocadan gözle denetleyip Kaydet'e basmasını iste.",
|
|
128
140
|
" 3: bologna_kopya_metni metnini her alan ayrı kod bloğunda ver, hangi sekmedeki hangi kutuya yapıştırılacağını yaz.",
|
|
129
141
|
" Kayıttan sonra (1 ve 2): sayfayı geri oku, obs_karsilastir'e obsKarsilastirGirdisi'ni ve okuduğun metni ver. dur true ise yazmayı bırak, nedenini söyle. Farklı alanları hocaya göster.",
|
|
130
142
|
" Her durumda: Dersin Yetkilileri satırlarına dokunma, OBS'deki hâliyle kalsın. Parolayı asla isteme; o yalnız hocadadır. Onaya gönderme (Gönder) düğmesine sen basma.",
|
|
@@ -137,21 +149,20 @@ const bolognaAkisi = (dersKodu) => [
|
|
|
137
149
|
"1. Ayrıştır. bologna_ayristir önce Proliz biçimini, olmazsa genel ayrıştırıcıyı dener (sekmeli düz metin de olur). Bulunamayan alanları ve ingilizce değerini not al; sonraki araçlara ingilizce değerini aynen ver.",
|
|
138
150
|
" Dersi Verenler, Yardımcılar ve Koordinatör satırları yetkililer alanında olduğu gibi gelir; onları değiştirme, sonraki çağrılarda aynen geri ver.",
|
|
139
151
|
" Program çıktıları sayfası da varsa onu da ayrıştır ve P kodlarını sakla; P kodlarını asla ezberden yazma.",
|
|
140
|
-
"2. Denetle.
|
|
141
|
-
|
|
142
|
-
"3. Teyit. Değerlendirme yöntemi ve yüzdeleri, uygulama/lab, kullanılan kaynaklar ve (sayfada yoksa) amaç ve içerik yalnız hocanın bilebileceği bilgilerdir. Sayfada olmayanları hocaya TEK mesajda, numaralı ve varsayılan seçenekli sor (akıllı doldurmada da). Uydurma.",
|
|
152
|
+
"2. Denetle. bologna_ayristir yanıtındaki denetim alanı eksikleri ve teyit sorulacakları verir; bologna_denetle'yi yalnız bu alan yoksa çağır. Nasıl doldurulacağını SORMA: varsayılan her zaman akıllı doldurmadır.",
|
|
153
|
+
"3. Teyit. Yalnız sayfada olmayan değerlendirme yüzdeleri ve kaynaklar için hocaya TEK mesaj (toplu modda bütün dersler için tek mesaj; peşin onay varsa sorma, EKSİK bırak). Uygulama/lab T+U+L'den okunur. Uydurma.",
|
|
143
154
|
" Amaç ve içerik için hocanın verdiği kısa odak yoksa ders adından ve program çıktılarından 'öneri' yaz ve öneri olduğunu söyle.",
|
|
144
|
-
"4.
|
|
155
|
+
"4. bologna_alan_rehberi'ni alan='hepsi' ile bir kez çağır, bütün alanları tek seferde yaz.",
|
|
145
156
|
" Seçenekleri bologna_taslak_denetle ile denetle; biçim denetiminden geçmeyeni düzelt ve yeniden denetle. Uzun metinlerde ilk cümleyi ve kelime sayısını göster. Sonucu 'biçim denetiminden geçti; içerik teyidi: hoca' diye sun.",
|
|
146
157
|
" Akıllı doldurmada (4) en iyi seçeneği kendin seç ve hocaya alan alan sorma; sonunda tek özet göster.",
|
|
147
|
-
" Haftalık konular: 14 hafta, ara sınav ve yarıyıl sonu haftası görünür. Değerlendirme: yalnız sayfadan ya da hocadan; degerlendirmeDayanagi'ni ('sayfa' ya da 'hoca') ver.",
|
|
158
|
+
" Haftalık konular: 14 hafta, ara sınav ve yarıyıl sonu haftası görünür. Değerlendirme: yalnız sayfadan ya da hocadan; degerlendirmeDayanagi'ni ('sayfa' ya da 'hoca') ve kanıt metnini (degerlendirmeKaniti) ver.",
|
|
148
159
|
" AKTS iş yükü: is_yuku_oner'i sayfadaki değerlendirme kalemleriyle çağır; derste olmayan etkinliğe satır açılmaz. Sayfadan okunan iş yüküyle öneriyi ayrı göster. AKTS'yi değiştirme.",
|
|
149
160
|
" Öğrenme çıktısı ile program çıktısı katkı tablosu: yalnız ayrıştırılan P kodlarıyla öner.",
|
|
150
161
|
KAYNAK_ADIMI,
|
|
151
|
-
|
|
162
|
+
"5. Hepsini yazınca bologna_durum'u çağır; geçmeyeni düzelt. Ara adımda hocaya rapor verme.",
|
|
152
163
|
OBS_YAZMA,
|
|
153
|
-
'7. Doğrulama. Kayıttan sonra sayfayı yeniden oku (tarayıcı varsa) ya da yeniden yapıştırmasını iste; obs_karsilastir
|
|
154
|
-
"
|
|
164
|
+
'7. Doğrulama. Kayıttan sonra sayfayı yeniden oku (tarayıcı varsa) ya da yeniden yapıştırmasını iste; obs_karsilastir ile denetle (sayfayı yeniden ayrıştırırsan yanıttaki denetim kalan eksiği de sayar). Fark yoksa "Kaydedildi ve geri okunarak doğrulandı; içerik teyidi sizde" de.',
|
|
165
|
+
" Toplu modda sormadan sıradaki derse geç. Tek derste kısa bir sonuç cümlesiyle bitir.",
|
|
155
166
|
].join("\n");
|
|
156
167
|
const ciktiAkisi = (dersKodu) => [
|
|
157
168
|
`Odak: ders öğrenme çıktısı yaz ya da iyileştir.${dersKodu ? ` Ders: ${dersKodu}.` : ""}`,
|
|
@@ -159,12 +170,10 @@ const ciktiAkisi = (dersKodu) => [
|
|
|
159
170
|
"Akış:",
|
|
160
171
|
"1. Sor: 1) OBS'deki mevcut çıktılarımı okuyalım (tarayıcı aracın varsa OBS girişi için Bologna akışındaki Adım 0'ı izle) 2) çıktılarımı yapıştırayım 3) sıfırdan yaz: ders adı, AKTS, T+U+L ve kısa içerik vereyim.",
|
|
161
172
|
"2. bologna_alan_rehberi'ni alan=ciktilar ile çağır: kurallar, Bloom fiilleri, 4-10 sınırı (5-8 önerilir).",
|
|
162
|
-
|
|
163
|
-
" 1-3: her çıktı için 2-3 seçenek yaz (farklı Bloom düzeyi ya da ölçme biçimi), türünü (Bilgi, Beceri, Yetkinlik) yaz.",
|
|
164
|
-
" 4: her çıktı için en iyi ifadeyi kendin seç; hocaya ara soru sorma.",
|
|
173
|
+
"3. Nasıl yazılacağını SORMA: 5-8 ölçülebilir çıktıyı kendin yaz, türünü (Bilgi, Beceri, Yetkinlik) belirt; hocaya ara soru sorma.",
|
|
165
174
|
"4. Bütün listeyi bologna_taslak_denetle ile denetle (ciktilar alanı; İngilizce isteniyorsa en alanıyla). Geçmeyeni düzelt ve yeniden denetle.",
|
|
166
|
-
"5. Tek özet göster: numara, çıktı, tür, denetim sonucu. Değiştirmek
|
|
167
|
-
" Program çıktısı katkısı: P kodları ayrıştırıldıysa onlarla doldur;
|
|
175
|
+
"5. Tek özet göster: numara, çıktı, tür, denetim sonucu; kopya metni de aynı mesajda ver. Değiştirmek istenen numara yazılır.",
|
|
176
|
+
" Program çıktısı katkısı: P kodları ayrıştırıldıysa onlarla doldur; tarayıcın varsa program çıktıları sayfasını kendin oku. Yoksa P kodu uydurma; katkı tablosunu EKSİK bırak, akışı durdurma.",
|
|
168
177
|
"6. bologna_kopya_metni ile Öğrenme Çıktıları sekmesine kopyalanacak metni ver ya da Bologna akışındaki OBS'ye yazma adımını izle.",
|
|
169
178
|
].join("\n");
|
|
170
179
|
const ckPcAkisi = (dersKodu) => [
|
|
@@ -174,19 +183,17 @@ const ckPcAkisi = (dersKodu) => [
|
|
|
174
183
|
'1. Hocaya önce şunu söyle: "Kişisel veriyi yapay zekâ sohbetine yapıştırmayın: Excel\'de Ad, Soyad, Numara sütunlarını silip yalnız not sütunlarını yapıştırın ya da verinin tarayıcınızdan çıkmadığı hesaplayıcıyı kullanın: https://akredit.org/deneyin"',
|
|
175
184
|
" Sonra yalnız not sütunlarını yapıştırmasını iste. İlk satır başlık, her soru bir sütun; başlıkta sınav, soru, ÇK ve tam puan olursa iş biter (ör. Vize S1 (ÇK1) /20). Öğrenciler o1, o2 takma adı alır.",
|
|
176
185
|
"2. Tabloyu not_tablosu_ayristir'e ver.",
|
|
177
|
-
|
|
178
|
-
" 4: başlıktan okunan eşlemeyi ve varsayılanları kullan: eşik 60, sınav ağırlıkları tablodan. Başlıkta olmayan soru-çıktı eşlemesini ve tam puanı tahmin etme; bunları tek mesajda topluca sor.",
|
|
186
|
+
"3. Eşleme tamamsa SORMA, doğrudan hesapla (eşik 60). Başlıkta olmayan soru-çıktı eşlemesi, tam puan ya da sınav ağırlığı varsa tahmin etme; hepsini TEK mesajda sor.",
|
|
179
187
|
"4. Hazır olunca ck_pc_hesapla'yı çağır. Sonucu tablo olarak göster; sayıları yalnız yanıttan al.",
|
|
180
|
-
"5. Tek
|
|
181
|
-
"6. Sor: 1) eşiğin altındaki çıktılar için iyileştirme notu taslağı 2) farklı eşikle yeniden hesapla 3) bitir. Not taslağında sayı uydurma; sonucu kopyalanabilir tablo olarak ver.",
|
|
188
|
+
"5. Tek mesaj: kullanılan eşleme ve eşik, sonuç tablosu, eşiğin altındaki çıktılar için kısa iyileştirme notu taslağı (sayı uydurmadan). Ayrıca soru sorma.",
|
|
182
189
|
].join("\n");
|
|
183
190
|
const olcutAkisi = (cerceve) => [
|
|
184
191
|
`Odak: ölçüt ve kanıt rehberi.${cerceve ? ` Çerçeve: ${cerceve}.` : ""}`,
|
|
185
192
|
"",
|
|
186
193
|
"Akış:",
|
|
187
|
-
`1. ${cerceve ? "Çerçeve verildi, sorma." : "
|
|
188
|
-
|
|
189
|
-
"3. olcut_ara ile ara
|
|
194
|
+
`1. ${cerceve ? "Çerçeve verildi, sorma." : "Tek soru sor: hangi çerçeve ve konu? 1) YÖKAK 2) MÜDEK 3) FEDEK 4) EPDAD 5) SABAK; konu ya da ölçüt kodunu yanına yazabilirsiniz. Hoca çerçeve söylemezse YÖKAK ile başla."}`,
|
|
195
|
+
"2. Ne istendiğini ayrıca SORMA: her zaman hepsini hazırla (resmî metin, düzeyler, kanıt kontrol listesi).",
|
|
196
|
+
"3. olcut_ara ile ara; en uygun 1-2 ölçüt için hemen olcut_getir'i çağır. Resmî metni kaynağıyla göster.",
|
|
190
197
|
"4. YÖKAK alt ölçütüyse olgunluk_duzeyleri ile düzeyleri ve örnek kanıtları al. Kanıtın kurumda olup olmadığını tahmin etme: kontrol listesinde 'hocaya sorulacak' yaz; hoca isterse tek mesajda 'var olanların numaraları' diye sor.",
|
|
191
198
|
"5. Programın disiplinini ya da programa özgü bölümünü sen tahmin etme; bilmiyorsan tek soruyla sor.",
|
|
192
199
|
"6. Ölçüt metnini yalnız araç yanıtından alıntıla. DOĞRULANMADI işaretli metni tahminle doldurma.",
|
|
@@ -197,12 +204,11 @@ const dilAkisi = () => [
|
|
|
197
204
|
"",
|
|
198
205
|
"Akış:",
|
|
199
206
|
"1. Hocadan metni yapıştırmasını iste. Öğrenci adı ya da numarası varsa göndermeden önce o1, o2 gibi takma adla değiştir.",
|
|
200
|
-
"2. Rapor dönemini metinden çıkar; çıkaramazsan
|
|
207
|
+
"2. Rapor dönemini metinden çıkar; çıkaramazsan sorma, dönemsiz denetle.",
|
|
201
208
|
"3. rapor_dil_denetle'yi çağır.",
|
|
202
|
-
|
|
203
|
-
" 4: her bulgu için en iyi düzeltmeyi kendin seç. Kanıt ya da sayı gerektiren düzeltmede bilgi uydurma; o yere EKSİK yaz.",
|
|
209
|
+
"4. Nasıl düzeltileceğini SORMA: her bulguyu kendin düzelt. Kanıt ya da sayı gerektiren yerde bilgi uydurma; [EKSİK: ...] yaz.",
|
|
204
210
|
"5. Düzeltilmiş metni yeniden rapor_dil_denetle ile denetle; kalan bulguları düzelt.",
|
|
205
|
-
"6. Tek
|
|
211
|
+
"6. Tek mesaj: numaralı eski → yeni tablosu ve düzeltilmiş metnin tamamı (kopyalanabilir). Değiştirmek istenen numara yazılır.",
|
|
206
212
|
].join("\n");
|
|
207
213
|
const AKISLAR = {
|
|
208
214
|
bologna_doldur: (a) => bolognaAkisi(kisa(a.ders_kodu)),
|
|
@@ -221,9 +227,7 @@ const akreditMenusu = (odak) => {
|
|
|
221
227
|
"",
|
|
222
228
|
"Hocaya tam olarak şunu göster ve yanıtını bekle:",
|
|
223
229
|
"",
|
|
224
|
-
|
|
225
|
-
...ODAKLAR.map(([no, ad]) => `${no}) ${ad}`),
|
|
226
|
-
`${ODAKLAR.length + 1}) Başka bir şey: tüm araçları kısaca listele`,
|
|
230
|
+
...MENU_SATIRLARI,
|
|
227
231
|
"",
|
|
228
232
|
`Seçim ${ODAKLAR.length + 1} ise sunucudaki araçları adlarıyla değil, ne işe yaradıklarıyla birer cümlede numaralı listele ve yeniden seçtir.`,
|
|
229
233
|
"Bu ilk menüde 4 bir odaktır (ölçüt rehberi); akıllı doldurma kısayolu odak seçildikten sonraki menülerde geçerlidir.",
|
|
@@ -280,44 +284,106 @@ export const ACIK_ISTEMLER = [
|
|
|
280
284
|
];
|
|
281
285
|
/** Kısa kurallar: akredit_basla yanıtında (istem desteklemeyen istemciler için) yer alır. */
|
|
282
286
|
export const KISA_KURALLAR = [
|
|
283
|
-
"Hoca
|
|
287
|
+
"Hoca yalnız 'akredit' yazdıysa menüyü aynen göster ve numara bekle. Niyetini yazdıysa menüyü atla, o akışa başla.",
|
|
288
|
+
"Her soruyu numaralı seçeneklerle sor; hoca yalnız numara yazarak ilerleyebilsin.",
|
|
289
|
+
"Bologna (1) seçilince tarayıcın varsa ilk iş OBS adresini isteyip açmak; ders adını sorma, OBS'den oku.",
|
|
290
|
+
"Hocaya 'hangisi?' diye sormadan önce kendin tara ve öner: bütün dersleri denetle, eksikleri say, 'önerilen' seçenekle gel.",
|
|
284
291
|
"Kısa, sade Türkçe yaz; araç adı, JSON ve teknik terim gösterme. Her mesajda tek iş iste.",
|
|
285
292
|
"Uydurma yok: kişi, kitap, ISBN, DOI, tarih, sayı uydurma. Bilinmeyen EKSİK kalır.",
|
|
286
|
-
"Değerlendirme yöntem ve yüzdeleri
|
|
293
|
+
"Değerlendirme yöntem ve yüzdeleri ile kullanılan kaynaklar sayfadan okunur; yoksa hocaya TEK mesajda, numaralı sorulur; yüzdeye varsayılan konmaz. Uygulama/lab T+U+L'den okunur. Amaç ve içerik sayfada yoksa 'öneri' olarak yazılıp son özette teyide sunulur.",
|
|
287
294
|
"Ders adından ürettiğin her şeyi 'öneri' etiketiyle göster. Araç sonucu 'biçim denetiminden geçti; içerik teyidi: hoca' diye sunulur.",
|
|
288
295
|
"Sayıları yalnız araç yanıtından al.",
|
|
289
296
|
"Kaynak yalnız 'katalogda_bulundu' ise öneri olarak, ya da hoca kullandığını söylerse 'hoca_beyani' olarak yazılır.",
|
|
290
297
|
"Giriş bilgisi (parola, doğrulama kodu, çerez) istenmez; hoca yazarsa kullanma, araçlara gönderme.",
|
|
291
|
-
"OBS'ye yazmadan önce alan alan önceki/yeni değer özeti göster; hoca bir kez 'kaydet' der. Kayıttan sonra geri oku ve obs_karsilastir ile doğrula. Gönder düğmesine hoca basar.",
|
|
298
|
+
"OBS'ye yazmadan önce alan alan önceki/yeni değer özeti göster; hoca bir kez 'kaydet' der (peşin onay verdiyse durak yok, sonda tek rapor). Kayıttan sonra geri oku ve obs_karsilastir ile doğrula. Gönder düğmesine hoca basar.",
|
|
292
299
|
"Öğrenci adı ya da numarası sohbete yapıştırılmaz; not tablosunda yalnız not sütunları olur.",
|
|
293
300
|
];
|
|
294
301
|
/** akredit_basla aracının yanıtı: menü, kısa kurallar ve her seçimin akışı (istem desteklemeyen istemciler için). */
|
|
295
302
|
export function baslangic() {
|
|
296
303
|
return {
|
|
297
|
-
hocayaGoster:
|
|
298
|
-
"Merhaba. Neye odaklanalım? Numarasını yazmanız yeter.",
|
|
299
|
-
...ODAKLAR.map(([no, ad]) => `${no}) ${ad}`),
|
|
300
|
-
`${ODAKLAR.length + 1}) Başka bir şey: tüm araçları kısaca listele`,
|
|
301
|
-
].join("\n"),
|
|
304
|
+
hocayaGoster: MENU_SATIRLARI.join("\n"),
|
|
302
305
|
menu: [
|
|
303
306
|
...ODAKLAR.map(([no, ad, istem]) => ({ no, ad, istem })),
|
|
304
|
-
{ no: String(ODAKLAR.length + 1), ad:
|
|
307
|
+
{ no: String(ODAKLAR.length + 1), ad: BASKA, istem: null },
|
|
305
308
|
],
|
|
306
309
|
kisaKurallar: KISA_KURALLAR,
|
|
307
310
|
akislar: Object.fromEntries(ODAKLAR.map(([no, , istem]) => [no, AKISLAR[istem]?.({}) ?? ""])),
|
|
308
311
|
ortakKurallar: ORTAK_KURALLAR,
|
|
309
312
|
};
|
|
310
313
|
}
|
|
314
|
+
/** Kullanıcı niyetini zaten yazdıysa menü atlanır; yalnız o odağın akışı ve kurallar döner. */
|
|
315
|
+
export function odakBaslangici(no) {
|
|
316
|
+
const o = ODAKLAR.find(([n]) => n === no);
|
|
317
|
+
return {
|
|
318
|
+
hocayaGoster: o ? `Tamam: ${o[1]}. Başlıyorum.` : "",
|
|
319
|
+
odak: o ? { no: o[0], ad: o[1], istem: o[2] } : null,
|
|
320
|
+
kisaKurallar: KISA_KURALLAR,
|
|
321
|
+
akis: o ? (AKISLAR[o[2]]?.({}) ?? "") : "",
|
|
322
|
+
ortakKurallar: ORTAK_KURALLAR,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/** Hocanın ilk cümlesinden odak: sunucu deterministik çözer, model yanlış odak seçemez. Eşleşme yoksa null (menü). */
|
|
326
|
+
const NIYETLER = [
|
|
327
|
+
["5", /dil denet|yazım|imla|rapor(un)? dil|metni(mi)? (düzelt|denetle)/iu],
|
|
328
|
+
["3", /(?<!\p{L})(çk|pç|ck|pc)(?!\p{L})|sağlanma|not tablo|excel|xlsx|sınav not/iu],
|
|
329
|
+
["4", /yökak|müdek|fedek|epdad|sabak|ölçüt|akreditasyon|kanıt/iu],
|
|
330
|
+
["2", /öğrenme çıktı|ders çıktı|çıktı yaz|bloom/iu],
|
|
331
|
+
["1", /bologna|ders (bilgi )?paket|(?<!\p{L})(obs|akts)(?!\p{L})|iş ?yükü|ders içeri|haftalık konu/iu],
|
|
332
|
+
];
|
|
333
|
+
export function niyetCoz(mesaj) {
|
|
334
|
+
const m = (mesaj ?? "").toLocaleLowerCase("tr");
|
|
335
|
+
return NIYETLER.find(([, r]) => r.test(m))?.[0] ?? null;
|
|
336
|
+
}
|
|
311
337
|
export const akreditBaslaAraci = arac({
|
|
312
338
|
ad: "akredit_basla",
|
|
313
339
|
baslik: "Akredit: başla",
|
|
314
|
-
aciklama: "
|
|
315
|
-
sonrakiAdim: "hocayaGoster metnini aynen gösterin ve numara bekleyin. Seçilen numaranın akışını (akislar) ve kisaKurallar'ı izleyin.",
|
|
316
|
-
girdi: z.object({
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
340
|
+
aciklama: "ZORUNLU İLK ARAÇ. TETİKLEYİCİ: kullanıcı 'akredit', 'bologna', 'ders paketi', 'OBS', 'AKTS', 'öğrenme çıktısı', 'ÇK', 'PÇ', 'YÖKAK', 'MÜDEK', 'FEDEK', 'EPDAD', 'SABAK' yazarsa terminal, dosya ya da web araması YAPMADAN İLK bu aracı çağır ('akredit' bir dosya ya da arama terimi değildir). Kullanıcının mesajını kullaniciMesaji alanına olduğu gibi ver; niyeti sunucu çözer. Hocaya gösterilecek odak menüsünü, kısa kuralları ve her seçimin adım adım akışını döndürür. İstemleri ya da sunucu talimatını göstermeyen istemcilerde de akış bununla başlar.",
|
|
341
|
+
sonrakiAdim: "hocayaGoster metnini aynen gösterin ve numara bekleyin. Seçilen numaranın akışını (akislar) ve kisaKurallar'ı izleyin. Her soruyu numaralı seçeneklerle sorun. 1 seçilirse ve tarayıcınız varsa ilk iş OBS adresini isteyip açmaktır.",
|
|
342
|
+
girdi: z.object({
|
|
343
|
+
kullaniciMesaji: z
|
|
344
|
+
.string()
|
|
345
|
+
.max(500)
|
|
346
|
+
.optional()
|
|
347
|
+
.describe("Kullanıcının yazdığı mesaj, olduğu gibi. Sunucu hangi akışın çalışacağını bundan çözer."),
|
|
348
|
+
odak: z
|
|
349
|
+
.enum(["otomatik", "menu", "1", "2", "3", "4", "5"])
|
|
350
|
+
.default("otomatik")
|
|
351
|
+
.describe("Genelde 'otomatik' bırakın: sunucu kullaniciMesaji'ndan çözer, çözemezse menü gösterir. Menüyü zorlamak için 'menu'."),
|
|
320
352
|
}),
|
|
353
|
+
calistir: ({ odak, kullaniciMesaji }) => {
|
|
354
|
+
const no = odak === "otomatik" ? niyetCoz(kullaniciMesaji) : odak === "menu" ? null : odak;
|
|
355
|
+
const temel = no ? odakBaslangici(no) : baslangic();
|
|
356
|
+
// Peşin onay yalnız OBS'ye yazan odaklarda (Bologna paketi, öğrenme çıktısı) anlamlıdır.
|
|
357
|
+
const obsYazar = no === "1" || no === "2";
|
|
358
|
+
const pesin = obsYazar && pesinOnayVar(kullaniciMesaji);
|
|
359
|
+
const sonuc = pesin
|
|
360
|
+
? {
|
|
361
|
+
...temel,
|
|
362
|
+
hocayaGoster: `${temel.hocayaGoster} Peşin onayınızla ara soru sormadan ilerleyeceğim: tarar, doldurur, OBS'ye kaydeder, geri okuyup doğrularım. Yalnız OBS giriş ekranında dururum. Bilmediğim resmî bilgiyi (değerlendirme yüzdesi, kullandığınız kaynak) uydurmam, boş bırakıp sonda listelerim. Onaya Gönder'e siz basarsınız. Vazgeçmek için 'dur' yazın.`,
|
|
363
|
+
pesinOnay: {
|
|
364
|
+
metin: kullaniciMesaji ?? "",
|
|
365
|
+
not: "Bologna araçlarına (obs_ders_listesi, bologna_kopya_metni, bologna_toplu_ozet) pesinOnay olarak bu metni olduğu gibi verin.",
|
|
366
|
+
},
|
|
367
|
+
}
|
|
368
|
+
: obsYazar
|
|
369
|
+
? {
|
|
370
|
+
...temel,
|
|
371
|
+
ipucu: "Hoca 'hepsini yap ve kaydet' yazarsa peşin onay kipi açılır: ara durak olmaz, sonda tek rapor.",
|
|
372
|
+
}
|
|
373
|
+
: temel;
|
|
374
|
+
return {
|
|
375
|
+
sonuc,
|
|
376
|
+
kaynak: [KOD_KAYNAGI("apps/acik-mcp/src/promptlar.ts", "Akredit istemleri ve başlangıç menüsü")],
|
|
377
|
+
hocayaSimdiSor: !no,
|
|
378
|
+
...(no
|
|
379
|
+
? {
|
|
380
|
+
sonrakiAdim: pesin
|
|
381
|
+
? "hocayaGoster cümlesini yazın ve sormadan başlayın. Bologna ise ilk iş tarayıcıda OBS'yi açmaktır; ders listesi gelince obs_ders_listesi'ni pesinOnay ile çağırın."
|
|
382
|
+
: "hocayaGoster cümlesini yazın ve sormadan 'akis' adımlarını izleyin. Bologna ise ilk iş tarayıcıda OBS'yi açmaktır.",
|
|
383
|
+
}
|
|
384
|
+
: {}),
|
|
385
|
+
};
|
|
386
|
+
},
|
|
321
387
|
});
|
|
322
388
|
/** SDK için bağımsız değişken şeması: hepsi isteğe bağlı, kısa metin. */
|
|
323
389
|
export const istemSemasi = (i) => Object.fromEntries(Object.entries(i.argumanlar).map(([k, d]) => [k, z.string().max(60).optional().describe(d)]));
|