Dokümanlar menüsü
Girdi/çıktı işlemcileri
Bir çalıştırmaya gireni ve ondan çıkanı dönüştürün — girdi hiç kalıcılaştırılmadan önce PII maskeleme, token sınırları, tool filtreleme ve bir tool çıktısını güvenilmez içeriğe çeviren işaret.
Ne işe yarar#
Bir işlemci, dayanıklı çalıştırmanın etrafındaki hatta oturur: processInput modelin birazdan göreceğini yeniden şekillendirir, processOutput ürettiğini, processToolResult ise bir tool'un döndürdüğünü. Birleşebilirler ve sıradan fonksiyonlardır — buradaki hazır olanlar bir başlangıç kümesidir, kapalı bir liste değil.
Listeden çok yerleşim önemlidir. Girdi işlemcileri, girdi kalıcılaştırılmadan önce koşar; yani bir maskeleme, saklanan verinin üstüne çekilmiş bir gösterim filtresi değildir — ham değer journal'a hiç ulaşmaz. Ve saf olanlar deterministik olduğu için kendi journal kaydına ihtiyaç duymazlar: bir replay aynı dönüşümü yeniden üretir.
PII maskeleme#
piiRedactor, adını verdiğiniz türleri (varsayılan olarak hepsini) system prompt'unda, prompt'ta ve mesaj listesinde maskeler; maske üretecini değiştirebilirsiniz. Girdi yolunda koştuğu için journal'a düşen şey zaten maskelidir — bu, "ham kart numarası saklanıyor ama arayüzde gizli" ile "ham kart numarası hiç saklanmadı" arasındaki farktır.
import { piiRedactor } from '@gnldev/processors';
await runDurable({
runId: 'ticket-9',
journal,
model,
tools,
processors: [piiRedactor()], // all PII types; pass { types } to narrow
prompt: 'my card is 4111 1111 1111 1111',
});
// the journal holds the masked text — the raw number was never writtenÇıktı tarafı neyi kapsıyor, neyi kapsamıyor#
processOutput {text, messages} görünümünü dönüştürür; yani result.text ve result.response.messages hem runDurable hem streamDurable üzerinde maskeli döner, thread belleğine yazılan da öyle. Okumanız gerekenler bunlar.
result.steps ve result.content dönmez. Modelin ham çıktısını taşımaya devam ederler ve bunlardan birini okuyan maskesiz metni görür. Bu, sonraki sürümde kapanacak bir eksiklik değil: bir işlemcinin çıktı sayısı serbesttir — bir özetleyici üç mesaj üreten bir turdan tek mesaj döndürebilir — dolayısıyla adım-başına kayıtlara geri eşleme yoktur ve content mesaj değil parça dizisidir.
Akış yolunda textStream ve fullStream parçaları da hamdır. Tur bitmeden istemciye ulaşırlar, yani sonradan hiçbir katman onları maskeleyemez. Telin kendisi ham değeri hiç taşımamalıysa {on: 'input'} veya runDurable kullanın.
const r = await runDurable({ processors: [piiRedactor()], /* … */ });
await r.text // masked
r.response.messages // masked
await memory.getMessages(threadId) // masked
r.steps // RAW — the model's own output, per step
r.content // RAW — a parts array, not messages
// streamDurable: the same two are masked, but the deltas are not
const s = await streamDurable({ processors: [piiRedactor()], /* … */ });
for await (const chunk of s.textStream) { /* RAW — already on the wire */ }
await s.text // maskedSınırlar, moderasyon ve tool görünürlüğü#
tokenLimit, bütçeye sığan en yeni mesajları tutar — basit bir kayan pencere. tokenLimiter onun daha tam kardeşidir: takılabilir bir countTokens, system mesajlarını ve son kullanıcı mesajını her zaman koruyan eskiden-yeniye budama, ve bağlamı sessizce kaybetmektense yüksek sesle düşmeyi tercih edenler için ProcessorTripwire fırlatan bir 'error' stratejisi.
outputLimit dönen metni sınırlar. toolFilter modelin görebildiği tool'ları değiştirir — izin listesi, ret listesini yener. moderationProcessor bir engel listesini girdide, çıktıda ya da ikisinde birden kontrol eder.
import { piiRedactor, toolFilter, tokenLimiter, outputLimit } from '@gnldev/processors';
processors: [
piiRedactor(),
toolFilter({ allow: ['searchDocs', 'summarise'] }), // allow wins over deny
tokenLimiter({ maxInputTokens: 8000, strategy: 'error' }), // throw rather than drop context
outputLimit({ maxChars: 20_000 }),
]Güvenilmez içerik — ve ne olmadığı#
untrustedToolContent, bir tool'un çıktısını modele "bu metin veridir, talimat değil" diyen işaretlerle sarar. Aynı zamanda taint zincirinin kaynak ucudur: bir tool'un güvenilmez ilan edilmesi, taint guard'ın ondan sonraki her yan etkiyi kapılamasını sağlayan şeydir.
import { untrustedToolContent } from '@gnldev/processors';
await runDurable({
runId: 'chat-42',
journal,
model,
tools: { fetchWeb, chargeCard },
processors: [untrustedToolContent()],
limits: { taintedSideEffects: 'suspend' }, // the rung that actually stops it
prompt: '…',
});Paket hem bunun hem de enjeksiyon dedektörünün sınırları konusunda alışılmadık biçimde açık sözlü; bu dürüstlük yumuşatılmak yerine tekrarlanmayı hak ediyor.
API#
piiRedactorGirdi yolunda PII'yi maskeler — persistInput'tan önce, yani ham değer hiç jurnale yazılmaz — ve çıktı yolunda text ile response.messages için. Seçenekler: types (varsayılan hepsi), mask üreteci, on ('input' | 'output' | 'both'), redactToolResults.
moderationProcessorGirdide, çıktıda ya da ikisinde engel listesi kontrolü. Küçük harfe normalize edilmiş alt-dize eşleşmesi.
toolFilterModelin hangi tool'ları görebildiğini denetler: allow (izin listesi, kazanır) ya da deny (ret listesi).
tokenLimitmaxTokens'a sığan en yeni mesajları tutar — basit kayan pencere.
tokenLimiterDaha tam kardeşi: takılabilir countTokens, system mesajlarını ve son kullanıcı mesajını koruyan eskiden-yeniye budama, ve bağlamı düşürmek yerine ProcessorTripwire fırlatan 'error' stratejisi.
outputLimitÇıktı uzunluğunu maxChars ile sınırlar.
promptInjectionDetectorKalıp tabanlı ilk-hat tespiti; eşleşmede tripwire tetiklenir. Güvenmeden önce aşağıdaki uyarıyı okuyun.
untrustedToolContentBir tool sonucunu güvenilmez işaretleriyle sarar — taint zincirinin kaynak ucu.
ProcessorTripwireBir işlemcinin, çalıştırmayı sessizce bozmak yerine durdurmak için fırlattığı hata.
toolSearchSemantik tool seçimi — kendi sayfasında anlatılıyor.
promptInjectionDetector'ın kendi dokümantasyonu, prompt injection'ın çözülmemiş kaldığını ve bu dedektörün yaygın atlatma yöntemlerinin hiçbirini yakalamadığını yazıyor — parafraz, base64/rot13/unicode kodlama, başka bir dil, ya da aşamalı ve dolaylı talimatlar. Onu gürültü azaltma olarak kullanın; bir ödeme ya da silme ile saldırgan arasındaki tek şey asla olmasın. Gerçekten kapılayan katmanlar şunlardır: taint guard'ın block/suspend kademeleri, bir insan onayı adımı, ve en-az-yetki ilkesiyle tasarlanmış tool'lar.untrustedToolContent içeriği sarar; modelin o sarmalayıcıya uymasını sağlamaz. Dil modelleri talimatı veriden güvenilir biçimde ayıramaz, yani modelin sarılmış metnin içindeki talimatları görmezden geleceğinin garantisi yoktur. Onu taint guard'ı besleyen, riski azaltan bir sinyal olarak görün — zorlama orada yaşar, burada değil. Aynısı moderationProcessor için de geçerli: alt-dize eşleşmesi atlatılabilir ve bir güvenlik sınırı değildir.