Ana içeriğe geç
Version: Peki

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​

  1. Agent'ı açın ve Tools sayfasına gidin.
  2. Listenin altındaki Fonksiyon'a tıklayın. Başlangıç koduyla Yeni fonksiyon açılır.
  3. Ayrıntılar sekmesinde başlığı, açıklamayı, girdileri ve kodu doldurun; çağırdığı siteleri İzin verilen siteler'e ekleyin.
  4. API anahtarı gerekiyorsa Anahtarlar altına ekleyin.
  5. Test sekmesini açın, bir girdi yazın ve Çalıştır'a tıklayın.
  6. 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.

ipucu

Ç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)​

AyarNe işe yararSınır / varsayılan
BaşlıkPeki panelinde insanların gördüğü ad.Zorunlu, en fazla 80 karakter
AI'ın kullandığı adModel 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çıklamaNe yaptığı ve ne zaman kullanılacağı.Zorunlu, en fazla 1.000 karakter
GirdilerModelin 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
Kodindex.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 sitelerKodun ulaşabildiği tek adresler.En fazla 10
AnahtarlarKodun 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ç null olur. 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 Error fı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​

ÜyeNe yaparNe 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ış
  • body bir nesneyse JSON olarak gönderilir ve content-type: application/json sizin yerinize eklenir.
  • 2xx dışı bir yanıt hata fırlatmaz. res.ok ya da res.status'u kendiniz kontrol edin.
  • Reddedilen bir istek ctx.fetch https://… failed: <neden> gibi bir Error fırlatır. Bkz. Hatalar.
  • Yönlendirmeler izlenmez: 301 ya da 302 o durum koduyla döner. Son adresi çağırın.
  • Global fetch hiçbir yere ulaşamaz. Her zaman ctx.fetch kullanı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) ve ema(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/encoding standart 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.store dışı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ız https:// ve yolları Peki temizler. *.magazan.com tüm alt alan adlarına izin verir (api.magazan.com, cdn.magazan.com) ama magazan.com'un kendisine izin vermez; ikisi de gerekiyorsa ikisini de ekleyin.
  • Yalnızca http ve https.
  • Ö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.

  1. Anahtarlar altında Anahtar ekle'ye tıklayın, sonra agent'ın anahtarlarından birini ya da + Yeni anahtar ekle'yi seçin.
  2. Anahtarın gideceği yer'i seçin:
    • Header, ad boş: Authorization: Bearer <anahtar> olarak gönderilir (Authorization: Bearer).
    • Header, X-API-Key gibi bir adla: anahtar o başlıkta olduğu gibi gönderilir.
    • Query, api_key gibi bir parametre adıyla: URL'ye ?api_key=<anahtar> olarak eklenir.
  3. 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 https kullanı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-encoding ve diğer bağlantı başlıkları.
  • Webhook imzalama anahtarları hiçbir zaman gönderilmez. Yalnızca gelen imzaları kontrol eder.
not

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ırDeğer
Çalışma başına zaman aşımı1–10 saniye, varsayılan 5
Çalışma başına bellekYaklaşık 256 MB
Sonuç16 KB (JSON olarak)
Çalışma başına log8 KB; sonraki satırlar atılır
Çalışma başına dış istek20
İstek başına yanıt boyutu1 MB
Kod boyutu20.000 karakter
Agent başına dakikada çalışmaVarsayılan 60
Agent başına aynı anda çalışmaVarsayılan 4
Agent başına günlük çalışma süresiVarsayılan 3.600 saniye, gece yarısı (UTC) sıfırlanır
Agent başına fonksiyon30

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.

  1. Girdi'yi bir JSON nesnesi olarak yazın. Düzenleyici her girdiyi boş bir değerle hazırlar, örneğin {"agirlik_kg": 0, "il": ""}.
  2. Çalıştır'a tıklayın ya da ⌘ Enter'a basın (Windows'ta Ctrl Enter).
  3. Çı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 istek 0 durumuyla 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, PUT ve DELETE istekleri gönderebilir. Mümkünse test verisi kullanın.
  • Bir test çalışmasındaki ctx.records.save yalnı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.

HataNedenNe 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 KBSonuç ç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 httpsURL http kullanıyor.https kullanın.
ctx.fetch … failed: The secret … is not in this function's secretsKod Anahtarlar'da olmayan bir anahtarı istiyor.Anahtarlar'a ekleyin ya da adı düzeltin.
ctx.fetch … failed: …response withheld: it contained a keyAPI 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 insteadAnahtarlar'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 nowAynı 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 runsBir konuşmada ya da testte ctx.store.Yalnızca otomasyonlarda kullanın.
ctx.records is only available to agents with tablesAgent'ı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 shortlyBizim 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.

İlgili sayfalar​