İçeriğe atla

UI SDK Nedir? Ajanlar İçin Bileşen Değil, Davranış

· 5 dk okuma · Yapay Zekâ, Erişilebilirlik

Bu sayfada

12 Kasım 2026'da shadcn, Vercel'de geliştirdikleri UI SDK'yı duyurdu.1 Kendi tanımıyla UI SDK, ajanların yeni nesil arayüzleri kurması için bir davranış kütüphanesi.2 Benim için tanımı şu: Bootstrap geliştiricilere ortak bir görünüm dili verdi; UI SDK ise ajanlara arayüzleri hem kurmak hem de kullanmak için ortak bir davranış dili veriyor.

Bu yazıda UI SDK'nın ne olduğunu ve nasıl kullanıldığını birkaç örnekle anlattım.

Bir ortam seçicisi üç davranışa ayrılıyor: createPopup, createSelection ve createTypeahead. Görsel: UI SDK README

Bileşen Değil, Davranış

shadcn duyuruda şu soruyu soruyor: ajanlar arayüzlerin hem kurucusu hem kullanıcısı oluyorsa soyutlama nerede durmalı? Cevapları, Select gibi bir bileşenin içindeki popup, seçim mantığı, klavye navigasyonu ve focus yönetimini ayırıp test edilmiş, yeniden kullanılabilir parçalar hâline getirmek.1

Yukarıdaki görsel bunu gösteriyor. Select aslında üç davranıştan oluşuyor:3

  • createPopup: Açılır, konumlanır, kapanır.
  • createSelection: Bir ya da birden fazla seçim yapılır.
  • createTypeahead: Birkaç harf yazınca ilgili seçeneğe atlanır.

Ajana Select yerine bu parçaları verirseniz yalnızca Select değil, autocomplete, combobox ya da henüz kimsenin düşünmediği bir bileşen de kurabilir.3 Ana sayfaya göre 50'den fazla davranış var: focus, seçim, sürükle bırak, yeniden boyutlandırma, sanal listeler ve ekran okuyucu desteği gibi.3

shadcn fikri ikinci bir paylaşımında şöyle özetliyor: senin ve benim aynı arayüzlere değil, aynı arayüz davranışlarına ihtiyacımız var. Senin ajanın tarih seçmek için bir takvim, benimki basit bir input üretebilir. Arayüzler farklı olabilir, altta yatan garantiler aynı kalmalı.4

Primitive: Davranışları Bir Araya Getirmek

Davranışları bir bileşende toplayan yapının adı primitive. Primitive bir bileşenin state'ini, onu değiştiren fonksiyonları ve bunları kullanan parçaları tanımlıyor; kendi başına hiçbir şey render etmiyor.5 Dokümantasyondaki en küçük örnek bir sessize alma butonu:

TypeScript
import { definePrimitive } from "@ui-sdk/core"

const muteButton = definePrimitive({
  name: "mute-button",
  state: () => ({ muted: false }),
  api: (context) => ({
    toggle: () => context.store.set({ muted: !context.store.get().muted }),
  }),
  slots: (slot) => ({
    root: slot({
      attrs: (state) => ({
        type: "button",
        "aria-pressed": String(state.muted),
      }),
      press: ({ api }) => api.toggle(),
    }),
  }),
})

attrs state'i HTML attribute'larına çeviriyor: muted true olunca buton aria-pressed="true" alıyor. press ise butona tıklanınca ya da klavyeyle basılınca toggle'ı çağırıyor.5 Bu primitive'i React'te şöyle render ediyorsunuz:

TSX
import { createParts } from "@ui-sdk/react/primitive"

const { Root: MuteButton } = createParts(muteButton, { root: "button" })

function Example() {
  return <MuteButton>Mute</MuteButton>
}

Davranış primitive'de kalıyor; aynı primitive React, Vue, Svelte, Solid ve Web Components'te çalışıyor. Parçalar stilsiz geliyor, CSS'i data-slot ve state attribute'larına yazıyorsunuz.5

Nasıl Kullanılır?

UI SDK şu an beta. Çekirdek paketle birlikte framework'ünüzün adaptörünü kurup ajanınıza skill'i veriyorsunuz:2

Bash
npm install @ui-sdk/react @ui-sdk/core
npx skills add vercel-labs/ui --skill ui-sdk

Asıl fikir, primitive'i sizin yazmamanız. README bunu açıkça söylüyor: bunu nasıl yazacağınızı öğrenmeniz gerekmiyor, ajanlarınız öğrenecek.2 Siz ajana etkileşimi somut olarak anlatıyorsunuz. Dokümantasyondaki örnek bir emoji seçici: aramadan aşağı ok basınca focus ilk sonuca geçsin, ok tuşları grid'de gezinsin, Enter seçsin, seçim ekran okuyuculara duyurulsun.6 Her paket kurulu sürümle eşleşen Markdown dokümanlarını içinde taşıdığı için ajan doğru sürümün dokümanını okuyor.6

Ajanlar Arayüzü Kullanabiliyor

UI SDK'nın ikinci yarısı bence en az ilki kadar ilginç: ajan arayüzü kurmakla kalmıyor, kullanabiliyor da. Ana sayfaya göre ajanlar sayfayı ekran görüntüsü almadan okuyor ve kontrolleri doğrudan çalıştırıyor.3

Uygulamaya bir köprü ekleniyor. snapshot() sayfadaki bileşenleri, state'lerini ve aksiyonlarını listeliyor; ajan da değeri tıklayıp yazarak değil, bileşenin API'sini çağırarak değiştiriyor:7

TypeScript
import { createAgent } from "@ui-sdk/react/agent"

const agent = createAgent()

agent.snapshot()
// [{ ref: "c1", component: "input", label: "Project name", value: "Apollo", actions: ["setValue", "clear"] }]

await agent.act({
  steps: [{ ref: "Project name", action: "setValue", args: ["Atlas"] }],
})

Burada erişilebilirlik ile ajan uyumluluğu aynı yere çıkıyor: input'a verilen erişilebilir isim hem ekran okuyucuların hem de ajanların bileşeni tanımasını sağlıyor.7

Ajanın neye dokunabileceğine de siz karar veriyorsunuz. allow callback'i hangi aksiyonların çalışacağını belirliyor, data-agent-confirm bir butonu her zaman kullanıcı onayına bağlıyor, data-agent-hidden bir bölümü ajandan tamamen saklıyor.8 Deneysel createHistory ile yalnızca ajanın yaptığı değişiklikler geri alınabiliyor.9

Ekibin benchmark'ında aynı ayarlar ekranı, React'te Base UI ve Ark UI ile tarayıcı araçları kullanılarak, UI SDK ile de köprü kullanılarak doldurulmuş:10

Base UIArk UIUI SDK + köprü
Tool call17197
Token291.7k330.9k69.5k
Süre53 sn65 sn31 sn
Maliyet$0.139$0.144$0.044

Tablonun altındaki not bence en önemli kısım: UI SDK ekranı tarayıcı araçlarıyla çalıştırıldığında diğer kütüphanelerle hemen hemen aynı sonucu vermiş. Yani farkı kütüphane değil, köprü yaratıyor.10

Yeni Bir Kapı mı?

İlk akla gelen soru şu: bu zaten her headless kütüphanenin vaadi değil mi? Bence de davranışı stilden ayırmak yeni bir fikir değil; UI SDK da kendini headless diye tanımlıyor.11 Yeni olan iki şey var: soyutlamanın bileşenin bir kat altına, davranışa inmesi ve kodu yazanın da arayüzü kullananın da ajan olabileceği varsayımı.

Bootstrap benzetmesi de buradan geliyor. Bootstrap'te herkes aynı buton, modal ve grid sınıflarını kullanıyordu; ortak olan görünümdü. UI SDK'da ortak olan görünüm değil, davranış: her ajan farklı bir arayüz üretebilir ama Escape'in popup'ı kapatması ya da silinen öğenin focus'unun kaybolmaması aynı kalır. shadcn'in deyişiyle arayüzler farklı, garantiler aynı.4

Açık sorular da var. UI SDK beta; API'ler ve davranışlar genel sürümden önce değişebilir.2 Primitive'i ajan yazsa da hata çıktığında okuyacak olan yine biziz; bence definePrimitive mantığını en az bir kez elle kurmak gerekiyor. Son olarak allow vermezseniz köprü desteklenen her aksiyonu kabul ediyor;8 ajanın neye basabileceği varsayılanlara bırakılacak bir karar değil.

Kaynaklar

  1. shadcn: UI SDK duyurusu (X, 12 Kasım 2026)

  2. GitHub: vercel-labs/ui README

  3. UI SDK ana sayfası

  4. shadcn: Aynı arayüz değil, aynı davranışlar (X, 15 Kasım 2026)

  5. UI SDK: Build a Component

  6. UI SDK: Build with an Agent

  7. UI SDK: Connect an Agent

  8. UI SDK: Permissions

  9. UI SDK: History and Undo

  10. UI SDK: Built for Agents (Benchmark)

  11. UI SDK: Core, Introduction