Fonksiyonlar
Fonksiyon, agent'ınızın tool olarak çağırabildiği küçük bir TypeScript kodudur. Tek bir API çağrısı yetmediğinde kullanın: birkaç API'yi çağırın, sonuçları birleştirin, fiyat ya da gösterge hesaplayın, dağınık JSON'u düzenleyin. Modeller aritmetikte ve uzun JSON'da kötüdür; kod değildir. Fonksiyonlar yalnızca izin verdiğiniz sitelere ulaşabilen ve anahtarlarınızı hiçbir zaman tutmayan kilitli bir ortamda çalışır.
Fonksiyon mu, HTTP tool mu?
| HTTP tool kullanın, eğer… | Fonksiyon kullanın, eğer… |
|---|---|
| Tek bir API çağrısı soruyu yanıtlıyorsa. | İki ya da daha fazla çağrı gerekiyorsa ya da bir çağrı diğerine bağlıysa. |
| API girdileri sorgu parametresi ya da düz bir JSON gövdesi olarak alıyorsa. | API iç içe bir gövde, özel bir kodlama ya da imza istiyorsa. |
| Yanıtı yalnızca birkaç alana indirmek yetiyorsa. | Hesaplama, filtreleme, sıralama, birim çevirme ya da veri birleştirme gerekiyorsa. |
| Hiç kod istemiyorsanız. | Kodla sorununuz yoksa ya da kodu Copilot yazıyorsa. |
İkisi de Tools sayfasında yan yana durur ve aynı ad kümesini paylaşır: bir fonksiyon, bir HTTP tool ile aynı AI'ın kullandığı ad'ı alamaz.
Fonksiyon ekleme
- Agent'ı açın ve Tools sayfasına gidin.
- Listenin altındaki Fonksiyon'a tıklayın. Başlangıç koduyla Yeni fonksiyon açılır.
- Ayrıntılar sekmesinde başlığı, açıklamayı, girdileri ve kodu doldurun; çağırdığı siteleri İzin verilen siteler'e ekleyin.
- API anahtarı gerekiyorsa Anahtarlar altına ekleyin.
- Test sekmesini açın, bir girdi yazın ve Çalıştır'a tıklayın.
- Agent'ı yayınlayın. Fonksiyonlar taslağın parçasıdır: müşteriler değişiklikleri yayınladıktan sonra alır. Test paneli taslağı hemen kullanır.
Her fonksiyon kartında bir Açık anahtarı vardır. Kapalıyken agent'a bu fonksiyon sunulmaz. Fonksiyon taslakta kalır ve otomasyonlar onu yine çalıştırabilir.
Çalışan bir fonksiyona en hızlı yol Copilot'a sormaktır: "Sipariş numarasını alan, siparişi mağaza API'sinden, kargo takibini kargo firmasından getirip ikisini birlikte döndüren bir fonksiyon ekle." Kodu yazar, gerçekçi bir girdiyle çalıştırır, sonucu okur ve düzeltir. Anahtarı bir kartta siz onaylarsınız; Copilot değerini hiç görmez.
Fonksiyon ayarları (Ayrıntılar sekmesi)
| Ayar | Ne işe yarar | Sınır / varsayılan |
|---|---|---|
| Başlık | Peki panelinde insanların gördüğü ad. | Zorunlu, en fazla 80 karakter |
| AI'ın kullandığı ad | Model için tool adı, örneğin kargo_ucreti. | Küçük harf, rakam ve _, harfle başlar, en fazla 64 karakter. Tool ve fonksiyonlar arasında benzersiz. |
| AI'ın gördüğü açıklama | Ne yaptığı ve ne zaman kullanılacağı. | Zorunlu, en fazla 1.000 karakter |
| Girdiler | Modelin doldurduğu değerler. HTTP tool girdileriyle aynı düzenleyici: ad, Metin / Sayı / Evet / hayır, Zorunlu, açıklama, Gerçek kişisel veri gerekir. | En fazla 20 |
| Kod | index.ts içinde TypeScript. | Zorunlu, en fazla 20.000 karakter, default export içermeli |
| Onay gerekir / Reddedilince | Çağrı önce ekibinizin onayını bekler. Bkz. Onaylar. | Kapalı / Müşteriye söyle |
| İzin verilen siteler | Kodun ulaşabildiği tek adresler. | En fazla 10 |
| Anahtarlar | Kodun kullanabileceği bu agent'a ait anahtarlar ve her birinin gideceği yer. | En fazla 10 |
| Zaman aşımı | Bir çalışmanın en uzun süresi: 1, 2, 3, 5, 8 ya da 10 saniye. | 5 saniye, en fazla 10 |
Kodu yazmak
Bir fonksiyonun yapısı
Fonksiyon, default export'u bir async fonksiyon olan bir modüldür. Modelin doldurduğu girdiyi ve bir ctx nesnesini alır, sonucu döndürür:
export default async (input, ctx) => {
// input: modelin doldurduğu değerler, Girdiler'e göre kontrol edilmiş
// ctx: fetch, log, now (bazı çalışmalarda records / store / trigger)
return { ok: true };
};
Düz JavaScript yazabilir ya da TypeScript tipleri ekleyebilirsiniz. Düzenleyici TypeScript'i renklendirir ama tipleri kontrol etmez; kod her iki durumda da çalışır.
- Girdi. Kod çalışmadan önce girdi, tanımladığınız Girdiler'e göre kontrol edilir. Yanlış bir tür ya da eksik zorunlu bir girdi çalışmayı
Invalid input: <ad>: <neden>ile durdurur; kod hiç başlamaz. - Sonuç. Herhangi bir JSON değeri döndürün: nesne, dizi, metin, sayı. Hiçbir şey döndürmezseniz sonuç
nullolur. Model sonucu JSON olarak okur. Açık alan adlı küçük, temiz nesneler döndürün; model en iyi bunları okur. - Hatalar. Çalışmayı başarısız yapmak için bir
Errorfırlatın. Model{"error": "<mesajınız>"}okur ve müşteriye söyleyebilir ya da başka bir girdi deneyebilir; işe yarar mesajlar yazın:throw new Error('Bu telefonla 48213 numaralı sipariş yok').
ctx neler verir
| Üye | Ne yapar | Ne zaman |
|---|---|---|
ctx.fetch(url, init?) | İzin verilen siteler'den birine HTTP isteği atar. | Her zaman |
ctx.log(...değerler) | Bir log satırı yazar. console.log, info, warn, error ve debug da aynısını yapar. | Her zaman |
ctx.now() | Milisaniye cinsinden şu anki zaman, Date.now() gibi. | Her zaman |
ctx.records.find(tablo, { where, sort, limit }) / ctx.records.save(tablo, veri) | Agent'ın kayıtlarını okur ve kaydeder. | Kayıt tablosu olan agent'larda. Bkz. Records. |
ctx.store.get/set/delete(anahtar) | Çalışmalar arasında kalan küçük bir hafıza. | Yalnızca otomasyon çalışmalarında. Bkz. Automations. |
ctx.trigger | Çalışmayı neyin başlattığı. | Yalnızca otomasyon çalışmalarında. |
ctx.fetch
const res = await ctx.fetch('https://api.magazan.com/v1/siparisler/48213', {
method: 'GET', // GET (varsayılan), POST, PUT, PATCH, DELETE, HEAD
headers: { 'Accept-Language': 'tr' },
body: { not: 'merhaba' }, // metin ya da JSON olarak gönderilen bir nesne
secret: { name: 'Mağaza API' }, // isteğe bağlı: fonksiyonun Anahtarlar'ından biri, adıyla
});
res.status; // 200
res.ok; // 2xx için true
res.headers.get('content-type');
await res.text(); // gövde metin olarak
await res.json(); // gövde JSON olarak ayrıştırılmış
bodybir nesneyse JSON olarak gönderilir vecontent-type: application/jsonsizin yerinize eklenir.- 2xx dışı bir yanıt hata fırlatmaz.
res.okya dares.status'u kendiniz kontrol edin. - Reddedilen bir istek
ctx.fetch https://… failed: <neden>gibi birErrorfırlatır. Bkz. Hatalar. - Yönlendirmeler izlenmez:
301ya da302o durum koduyla döner. Son adresi çağırın. - Global
fetchhiçbir yere ulaşamaz. Her zamanctx.fetchkullanın.
İçe aktarabileceğiniz yardımcılar
İçe aktarmalar (import) kapalıdır; yalnızca iki hazır yardımcı vardır:
import { sma, ema, rsi } from 'ta'; // sayı dizileri üzerinde hareketli ortalama ve RSI
import { encodeBase64 } from '@std/encoding'; // base64, hex ve diğer kodlamalar
sma(degerler, periyot)veema(degerler, periyot)hareketli ortalamaları döndürür.rsi(kapanislar, periyot = 14)RSI değerlerini döndürür;rsi(kapanislar).at(-1)en sonuncusudur.@std/encodingstandart kodlayıcı ve çözücüleri verir (base64, base64url, hex ve diğerleri).
npm paketleri ve URL'ler dahil başka her içe aktarma başarısız olur. JSON, Math, Date, URL, Intl, TextEncoder ve structuredClone gibi standart JavaScript yapıları kullanılabilir.
Kodun yapamadıkları
- İzin verilen siteler'de olmayan bir siteye ya da özel bir ağa ulaşmak.
- Bir anahtarın değerini görmek.
- Dosya okumak ya da yazmak, ortam ayarlarını okumak, başka programlar başlatmak, internetten kod yüklemek.
- Çalışmalar arasında bir şey saklamak (otomasyonlardaki
ctx.storedışında). Her çalışma sıfırdan başlar. - Zaman aşımı'ndan uzun çalışmak.
Ağ kuralları (egress)
Her ctx.fetch, bu kuralları uygulayan Peki ağ proxy'sinden geçer. Bunlar güvenlik sınırlarıdır ve kapatılamaz.
- Yalnızca izin verilen siteler. Adres, fonksiyonun İzin verilen siteler'inden biriyle eşleşmelidir; yoksa çağrı api.baska.com is not in this function's hosts (…): add it to the function's hosts hatası verir. Yalnızca alan adı yazın, örneğin
api.magazan.com; yapıştırdığınızhttps://ve yolları Peki temizler.*.magazan.comtüm alt alan adlarına izin verir (api.magazan.com,cdn.magazan.com) amamagazan.com'un kendisine izin vermez; ikisi de gerekiyorsa ikisini de ekleyin. - Yalnızca
httpvehttps. - Özel ya da yerel adresler yok. HTTP tool'larındaki aralıkların aynısı engellenir ve DNS çözümlemesinden sonra kontrol edilir; böylece bir alan adı iç bir servisi gösteremez.
- Çalışma başına en fazla 20 istek. 21. istek A function run may make at most 20 requests hatası verir.
- Yanıt başına ve istek gövdesi başına 1 MB.
- Süre. Bir istek yalnızca çalışmada kalan süreyi kullanabilir.
Fonksiyonlarda anahtarlar
Kod hiçbir zaman anahtar tutmaz. Yalnızca adını verir; değeri proxy istek çıkarken ekler.
- Anahtarlar altında Anahtar ekle'ye tıklayın, sonra agent'ın anahtarlarından birini ya da + Yeni anahtar ekle'yi seçin.
- Anahtarın gideceği yer'i seçin:
- Header, ad boş:
Authorization: Bearer <anahtar>olarak gönderilir (Authorization: Bearer). - Header,
X-API-Keygibi bir adla: anahtar o başlıkta olduğu gibi gönderilir. - Query,
api_keygibi bir parametre adıyla: URL'ye?api_key=<anahtar>olarak eklenir.
- Header, ad boş:
- Kodda adıyla isteyin:
ctx.fetch(url, { secret: { name: 'Mağaza API' } }).
Proxy bir anahtarı yalnızca şunların hepsi doğruysa ekler:
- anahtar fonksiyonun Anahtarlar'ında;
- URL'nin adresi fonksiyonun İzin verilen siteler'inde ve anahtarın kendi izinli sitelerinde;
- URL
httpskullanıyor.
Anahtarlarınızı koruyan diğer kurallar:
- Anahtarlar en az 8 karakter olmalı. Daha kısa anahtarlar yanıtlarda güvenilir şekilde bulunamaz, bu yüzden reddedilir: This key is too short to protect; use the HTTP tool instead.
- Çalışmanın anahtarlarından birini içeren bir yanıt hatayla geri tutulur, o istek anahtar taşımasa bile. Aksi halde hata mesajlarında anahtarı geri döndüren API'ler onu koda sızdırırdı.
- Bir fonksiyon anahtar kullanıyorsa yanıtları sıkıştırılmamış UTF-8 metin olmalı. Peki sunuculardan sıkıştırmamalarını ister. Kontrol edemediği bir yanıt (sıkıştırılmış ya da başka bir karakter kümesinde) geri tutulur.
- Bazı başlıklar anahtar taşıyamaz ve kodla ayarlanamaz:
host,connection,content-length,transfer-encodingve diğer bağlantı başlıkları. - Webhook imzalama anahtarları hiçbir zaman gönderilmez. Yalnızca gelen imzaları kontrol eder.
Kod bir anahtarın değerini hiçbir zaman almadığı için fonksiyon bir anahtarla imza (HMAC gibi) hesaplayamaz. Anahtarı başlıkta ya da sorgu parametresinde kabul eden bir API kullanın.
Anahtar ve izinli siteleri eklemek için Değişkenler ve gizli anahtarlar sayfasına bakın.
Sınırlar
| Sınır | Değer |
|---|---|
| Çalışma başına zaman aşımı | 1–10 saniye, varsayılan 5 |
| Çalışma başına bellek | Yaklaşık 256 MB |
| Sonuç | 16 KB (JSON olarak) |
| Çalışma başına log | 8 KB; sonraki satırlar atılır |
| Çalışma başına dış istek | 20 |
| İstek başına yanıt boyutu | 1 MB |
| Kod boyutu | 20.000 karakter |
| Agent başına dakikada çalışma | Varsayılan 60 |
| Agent başına aynı anda çalışma | Varsayılan 4 |
| Agent başına günlük çalışma süresi | Varsayılan 3.600 saniye, gece yarısı (UTC) sıfırlanır |
| Agent başına fonksiyon | 30 |
Günlük süre şöyle işler: bir çalışma başlamadan önce Zaman aşımı'nın tamamını ayırır, bitince kullanmadığını geri verir. Ayırma bugün kalan süreye sığmazsa çalışma reddedilir. Zaman aşımlarını fonksiyonun gerçekten ihtiyaç duyduğu süreye yakın tutun.
Bir müşteri yanıtının içinde fonksiyon, yanıtın kendi süresine de sığmalıdır: Peki son fonksiyon çağrısından sonra modelin yanıtı yazması için yaklaşık 8 saniye ayırır. Yeterli süre kalmadıysa çağrı Not enough time left in this reply to run the function hatası verir.
Model bir sonucun en fazla 16 KB'ını, bir hatanın en fazla 4 KB'ını okur.
Kişisel veri
Fonksiyonlar kişisel veriyi HTTP tool'ları gibi işler. Kişisel veri koruması açıkken model girdileri [PHONE_1] gibi yer tutucularla doldurur. Gerçek kişisel veri gerekir işaretli girdiler gerçek değeri alır; diğerleri yer tutucuyu korur. Sonuçtaki kişisel veriler model okumadan önce yer tutucuya çevrilir; çalışma kayıtları da yer tutucuları saklar. Bkz. Guardrails ve gizlilik.
Fonksiyonu test etmek
Kartın Test sekmesini açın.
- Girdi'yi bir JSON nesnesi olarak yazın. Düzenleyici her girdiyi boş bir değerle hazırlar, örneğin
{"agirlik_kg": 0, "il": ""}. - Çalıştır'a tıklayın ya da ⌘ Enter'a basın (Windows'ta Ctrl Enter).
- Çıktıyı okuyun:
- Başarılı ve Sonuç, ya da Başarısız ve Hata.
- Loglar: kodun yazdığı her şey.
- İstekler: her
ctx.fetch, Site, Durum ve Zaman ile. Reddedilen bir istek0durumuyla görünür. - Çalışmanın süresi.
Test çalışmaları hakkında bilmeniz gerekenler:
- Çalıştır önce taslağı kaydeder, sonra kayıtlı taslağı çalıştırır. Taslakta sorun varsa önce düzeltin: Taslağın kaydedilebilmesi için yukarıdaki sorunları düzeltip tekrar çalıştırın.
- Test çalışmaları gerçektir. Gerçek anahtarlarınızı kullanır ve sistemlerinizdeki veriyi değiştirebilecek
POST,PUTveDELETEistekleri gönderebilir. Mümkünse test verisi kullanın. - Bir test çalışmasındaki
ctx.records.saveyalnızca test kayıtları oluşturur ya da günceller, canlı kayıtlara dokunmaz. - Testi yalnızca editör, yönetici ve sahip rolündekiler çalıştırabilir: Testi yalnızca editörler çalıştırabilir.
- Anahtarları proxy ekler. Kod değerlerini hiç görmez.
Çalışmalar ve loglar
Çalışmalar sekmesi fonksiyonun Son 50 çalışmasını, en yenisi önce olacak şekilde, her kaynaktan listeler: ajan (müşteri konuşmaları), test, Copilot ve otomasyon; çalışmayı kimin başlattığıyla birlikte. Her çalışma için zamanı, kaynağı, başarılı ya da hata durumunu ve Süre'yi görürsünüz. Bir çalışmayı açınca girdisini, sonucunu ya da hatasını, loglarını ve isteklerini görürsünüz. Test'te aç, girdisini Test sekmesine kopyalar; tekrar çalıştırabilirsiniz.
Yalnızca başarısız çalışmaları listelemek için Göster → Hatalar'ı seçin.
Çalışma kayıtları 30 gün saklanır. Girdiler, sonuçlar ve loglar sınırlandırılmış olarak, anahtarlar maskeli ve kişisel veriler yer tutucu olarak saklanır.
Hatalar
Hata metinleri sunucudan İngilizce gelir.
| Hata | Neden | Ne yapmalı |
|---|---|---|
Invalid input: <ad>: … | Girdi fonksiyonun Girdiler'iyle uyuşmuyor. | Girdi türlerini düzeltin ya da biçimi girdinin açıklamasına yazın. |
<Ad>: <mesaj> (kendi hatanız) | Kod hata fırlattı. | Loglar'ı ve mesajı okuyun. |
Timed out after 5000 ms | Çalışma Zaman aşımı'ndan uzun sürdü. | Zaman aşımını artırın (en fazla 10 sn) ya da daha az veya daha hızlı çağrı yapın. |
Result is 24 KB; the limit is 16 KB | Sonuç çok büyük. | Yalnızca modelin ihtiyaç duyduğu alanları döndürün. |
Memory limit exceeded… | Çalışma çok fazla bellek kullandı. | Bir seferde daha az veri işleyin. |
CPU limit exceeded… | Kod çok uzun hesap yaptı. | Hesaplamayı sadeleştirin. |
ctx.fetch … failed: api.baska.com is not in this function's hosts… | Adrese izin yok. | İzin verilen siteler'e ekleyin. |
ctx.fetch … failed: A function run may make at most 20 requests | Çok fazla çağrı. | Toplu getirin ya da işi bölün. |
ctx.fetch … failed: The secret Mağaza API may only be sent to … | URL anahtarın izinli sitelerinden biri değil. | Doğru adresi kullanın ya da bir yöneticiden anahtarın sitelerini değiştirmesini isteyin. |
ctx.fetch … failed: The secret … is only sent over https | URL http kullanıyor. | https kullanın. |
ctx.fetch … failed: The secret … is not in this function's secrets | Kod Anahtarlar'da olmayan bir anahtarı istiyor. | Anahtarlar'a ekleyin ya da adı düzeltin. |
ctx.fetch … failed: …response withheld: it contained a key | API bir anahtarı geri döndürdü. | Başka bir uç nokta kullanın ya da API sahibine bildirin. |
This key is too short to protect; use the HTTP tool instead | Anahtarlar'daki bir anahtar 8 karakterden kısa. | Daha uzun bir anahtar ya da HTTP tool kullanın. |
This agent ran its functions 60 times in the last minute… | Dakikalık sınır. | Bir dakika bekleyin. |
Too many Functions running for this agent right now | Aynı anda çok fazla çalışma. | Biraz sonra tekrar deneyin. |
This agent used its 3600 seconds of function run time for today… | Günlük süre doldu. | Gece yarısını (UTC) bekleyin ya da zaman aşımlarını düşürün. |
ctx.store is only available in automation runs | Bir konuşmada ya da testte ctx.store. | Yalnızca otomasyonlarda kullanın. |
ctx.records is only available to agents with tables | Agent'ın kayıt tablosu yok. | Bir tablo ekleyin ya da çağrıyı kaldırın. |
The code must export default an async function… | Default export yok. | Koda export default async (input, ctx) => … ile başlayın. |
Functions are unavailable right now; try again shortly | Bizim tarafımızda geçici bir sorun. | Tekrar deneyin. |
Örnekler
Kargo ücreti (ağ yok)
Girdiler: agirlik_kg (Sayı, zorunlu), bolge (Metin, zorunlu: "sehir_ici, yurt_ici ya da yurt_disi"). İzinli site gerekmez.
const ILK_KG = { sehir_ici: 49.9, yurt_ici: 89.9, yurt_disi: 650 }; // ₺
const EK_KG = { sehir_ici: 10, yurt_ici: 20, yurt_disi: 180 };
export default async ({ agirlik_kg, bolge }: { agirlik_kg: number; bolge: string }) => {
if (!(bolge in ILK_KG)) throw new Error('bolge sehir_ici, yurt_ici ya da yurt_disi olmalı');
if (agirlik_kg <= 0 || agirlik_kg > 30) throw new Error('0,1 ile 30 kg arası koli gönderiyoruz');
const ek = Math.max(0, Math.ceil(agirlik_kg) - 1);
const ucret = ILK_KG[bolge] + ek * EK_KG[bolge];
return { bolge, agirlik_kg, ucret_tl: Math.round(ucret * 100) / 100, ucretsiz_kargo_siniri_tl: 750 };
};
Sipariş ve kargo takibi (iki API, anahtarlar)
Girdiler: siparis_no (Metin, zorunlu). İzin verilen siteler: api.magazan.com, api.kargofirmasi.example. Anahtarlar: "Mağaza API" (Header, ad boş → Bearer), "Kargo API" (Query, api_key).
export default async ({ siparis_no }: { siparis_no: string }, ctx) => {
const sRes = await ctx.fetch(`https://api.magazan.com/v1/siparisler/${encodeURIComponent(siparis_no)}`, {
secret: { name: 'Mağaza API' },
});
if (sRes.status === 404) throw new Error(`${siparis_no} numaralı sipariş yok`);
if (!sRes.ok) throw new Error(`Mağaza API ${sRes.status} döndü`);
const siparis = await sRes.json();
ctx.log('sipariş durumu', siparis.durum);
if (!siparis.takip_no) return { siparis_no, durum: siparis.durum, takip: null };
const tRes = await ctx.fetch(`https://api.kargofirmasi.example/takip/${siparis.takip_no}`, {
secret: { name: 'Kargo API' },
});
const takip = tRes.ok ? await tRes.json() : null;
return {
siparis_no,
durum: siparis.durum,
urunler: siparis.urunler.map((u: { ad: string; adet: number }) => `${u.adet} × ${u.ad}`),
kargo_durumu: takip?.durum ?? 'bilinmiyor',
son_konum: takip?.hareketler?.[0]?.sube ?? null,
tahmini_teslimat: takip?.tahmini_teslimat ?? null,
};
};
RSI ile kripto sinyali (yardımcılar)
Girdiler: sembol (Metin, zorunlu: "BTCUSDT gibi bir işlem çifti"). İzin verilen siteler: api.binance.com.
import { rsi, sma } from 'ta';
export default async ({ sembol }: { sembol: string }, ctx) => {
const url = `https://api.binance.com/api/v3/klines?symbol=${encodeURIComponent(sembol.toUpperCase())}&interval=1h&limit=100`;
const res = await ctx.fetch(url);
if (!res.ok) throw new Error(`Bilinmeyen sembol: ${sembol}`);
const kapanislar = (await res.json()).map((k: string[]) => Number(k[4]));
const son = rsi(kapanislar).at(-1)!;
return {
sembol,
fiyat: kapanislar.at(-1),
rsi14_1s: Math.round(son * 10) / 10,
sma20: Math.round(sma(kapanislar, 20).at(-1)! * 100) / 100,
sinyal: son < 30 ? 'aşırı satım' : son > 70 ? 'aşırı alım' : 'nötr',
};
};
Müşterinin açık kayıtlarını bulma (records)
adaylar tablosu olan bir agent için. Girdiler: telefon (Metin, zorunlu, Gerçek kişisel veri gerekir). İzinli site gerekmez.
export default async ({ telefon }: { telefon: string }, ctx) => {
const { records, more } = await ctx.records.find('adaylar', {
where: [{ field: 'telefon', op: 'eq', value: telefon }],
limit: 5,
});
ctx.log('bulunan', records.length, more ? '(daha fazla var)' : '');
return records.map((r: { id: string; title: string; data: Record<string, unknown> }) => ({
id: r.id,
baslik: r.title,
durum: r.data.durum ?? 'yeni',
}));
};
where, en fazla 10 koşuldan oluşan bir listedir (field, op: eq, in, range ya da contains, ardından value, values ya da min/max); sort bir alan ve asc ya da desc alır. Tablonun kendi alan anahtarlarını kullanın. ctx.records.find, en fazla 20 satırla (varsayılan 10) { records: [{ id, title, data }], more } döndürür; ctx.records.save(tablo, veri) ise { saved, created } döndürür. Bir çalışma en fazla 20 arama ve 50 kayıt yapabilir. Bkz. Records.