Kullanıcı Bazlı OAuth ile AI Ajanı Nasıl Geliştirilir?

AI Ajanları Kullanıcı Bazlı OAuth ile AI — Yapay zeka temsilciniz birden fazla kişiye hizmet verdiğinde, her araç çağrısı şu soruyu yanıtlamalıdır: Temsilci kimin adına hareket ediyor? Slack ve GitHub'a bağlanan bir yapay zeka aracısı oluşturarak…

35
Paylaş
Kullanıcı Bazlı OAuth ile AI Ajanı Nasıl Geliştirilir?

AI Ajanları

Kullanıcı Bazlı OAuth ile AI — Yapay zeka temsilciniz birden fazla kişiye hizmet verdiğinde, her araç çağrısı şu soruyu yanıtlamalıdır: Temsilci kimin adına hareket ediyor? Slack ve GitHub’a bağlanan bir yapay zeka aracısı oluşturarak bunu nasıl çözeceğimizi öğrenelim. Bir Slack okuması o kullanıcının çalışma alanını kullanır. Bu kullanıcı olarak, erişebilecekleri bir depoda bir GitHub sorunu oluşturulur.

Kullanıcı Bazlı OAuth ile AI

Kullanıcı Bazlı OAuth ile AI kapsamında, bir temsilci yanlış arama yapabilir ancak asla yanlış kullanıcının erişimiyle hareket etmemelidir. Düzeltmenin iki bölümü vardır ve her ikisi de bu eğitimin ilk yarısında yer almaktadır: Her kullanıcı ayrı ayrı erişim izni verir. Alice, Slack’i kendisi için yetkilendiriyor. Bob buna kendisi izin veriyor. Temsilciniz bir belirteci değil, bir tanımlayıcıyı iletir.

Kullanıcı Bazlı OAuth ile AI kapsamında, alice@example.com gibi bir dize kimin izninin kullanılacağını seçer. Bir işlev, çağrı anında onu bir tokena dönüştürür ve bu token hiçbir zaman model girişlerinize, araç şemalarınıza veya günlüklerinize ulaşmaz. Çoğu temsilci eğitimi her iki noktadan önce durur. Size bir API anahtarı verirler, bir işlevi bağlarlar ve model onu çağırır. Tasarım, ikinci bir kişi ortaya çıkana kadar çalışır.

Tasarım ve teknik ayrıntılar

Kullanıcı Bazlı OAuth ile AI kapsamında, modeli somut hale getirmek için, bir Slack kanalını izleyen, hangi mesajların gerçek çalışmayı tanımladığına kendi başına karar veren, bunlar için bir GitHub sorunu dosyalayan ve Slack iş parçacığında sorun bağlantısını içeren yanıt veren bir komut satırı aracısı oluşturacaksınız. Her çağrı, bir kullanıcının kendi OAuth izni olarak çalışır.

Kullanıcı Bazlı OAuth ile AI kapsamında, OAuth akışını kendiniz yazacaksınız: izin yönlendirmesi, durum kontrolü, belirteç değişimi, şifrelenmiş depo ve yönlendirme Esh yolu. Hiçbiri uzun değil ve onu bir bütün olarak görmek, inançla ilgili bir iddia yerine kimlik argümanını kontrol edilebilir kılan şeydir. Burada iki konu kapsam dışında kalıyor: Model Bağlam Protokolü sunucularını veya ses veya gerçek zamanlı ana bilgisayarları kapsamayacağız.

Kullanıcı Bazlı OAuth ile AI kapsamında, kimlik modeli her iki ortamda da geçerli, ancak çevredeki tesisat kendi makalesini hak ediyor. İçindekiler Neleri Oluşturacaksınız Önkoşullar Yapay Zeka Aracı Araçları Nelerdir? Paylaşılan Bir Belirteç Mimariyi Neden Bozar?

Okuyucu için pratik anlamı

Kullanıcı Bazlı OAuth ile AI kapsamında, genel Bakış Slack ve GitHub OAuth Uygulamaları Nasıl Kaydedilir Onay Akışı Nasıl Çalıştırılır Kullanıcı Tarafından Şifrelenmiş, Anahtarlanmış Belirteçler Nasıl Saklanır Araç Çağrılarını Mevcut Kullanıcı Olarak Nasıl Çalıştırılır Yenileme ve İptal Nasıl Ele Alınır İkinci Sağlayıcı Nasıl Eklenir Tam Çözüm Yolu Desen Diğer Kullanım Durumlarına Nasıl Uygulanır Bu Sonucu Oluşturduğumda Ne Yanlış Gitti Ne Oluşturacaksınız Ajana kanal izleyici aracı adı verilir.

Kullanıcı Bazlı OAuth ile AI kapsamında, Her çalıştırma dört şey yapar: Bir Slack kanalından gelen son mesajları okur. Bir modele mesaj mesaj, metnin bir hatayı mı yoksa somut bir eylem öğesini mi tanımladığını sorar. Uygun olan iletiler için bir GitHub sorunu oluşturur. Yeni sayının bağlantısını içeren orijinal Slack başlığındaki yanıtlar. Hiç kimse herhangi bir şeyi başlatmak için bir düğmeye tıklamıyor.

Kullanıcı Bazlı OAuth ile AI kapsamında, slack zaten farklı bir ürün olan “bu mesajdan bir sorun oluştur” işlemini gönderiyor. Burada temsilci kanalı okur, kendi kararını oluşturur ve yalnızca harekete geçmeye değer olduğuna karar verdiği şeye göre hareket eder.

Kullanıcı Bazlı OAuth ile AI iddiası ne anlatıyor?

Kullanıcı Bazlı OAuth ile AI kapsamında, Stac k bilerek küçük kalıyor: Parça Rol Node.js, düz ES modülleri Web çerçevesi yok, kuyruk düğümü yok:http OAuth geri arama sunucusu düğümü:crypto Belirteç şifreleme düğümü:sqlite Vercel AI SDK’yı yükleme bağımlılığı olmayan belirteç deposu Model çağrısı ve araç döngüsü Bu beşinden üçü Node.js ile birlikte gelir. Yüklediğiniz paketler yalnızca AI SDK ve arkadaşlarıdır.

Kullanıcı Bazlı OAuth ile AI

Sonunda şunlara sahip olacaksınız: Kullanıcının bir kez izin verdiği iki OAuth uygulaması, Slack ve GitHub. Kullanıcı ve sağlayıcı tarafından anahtarlanan şifrelenmiş bir jeton deposu. Geçerli kullanıcıyı bir tanımlayıcıya çözümleyen ve hiçbir zaman bir belirtecin modele ulaşmasına izin vermeyen bir aracı. Modelin bir sorun bildirilip bildirilmeyeceğine karar verdiği bir araç döngüsü.

İlk kullanıcının verilerini okumak yerine ikinci bir kullanıcının çalışmasının durdurulduğunu gösteren bir gösterim. Bitmiş kod github.com/saif-shines/channel-watcher-agent adresinde bulunmaktadır. Önkoşullar Hesaplar ve araçlar: Node.js 22.13 veya daha yenisi ve ayrıca npm. Belirteç deposu, bu sürümden itibaren kararlı olan node:sqlite’ı kullanır.

Uygulamaları yükleyebileceğiniz bir Slack çalışma alanı ve izleyebileceğiniz bir kanal. Tek kullanımlık bir kanal en iyi sonucu verir. Bir GitHub hesabı ve test sorunlarını çözebilecek bir depo. AI SDK’nın desteklediği bir model sağlayıcıya yönelik API anahtarı. Örneklerde antropik kullanılmıştır. mkcert, yerel bir HTTPS sertifikası vermek için.

Slack ve GitHub OAuth Uygulamalarının Kaydedilmesi sıradan bir http://localhost geri aramasının neden işe yaramayacağını açıklıyor. Yararlı arka plan, sen bunların hiçbiri zor bir gereklilik değil: zaman uyumsuzluk ve bekleme ve küçük bir Düğüm betiğinin okunması. Yüksek düzeyde OAuth 2.0: Bir uygulama kullanıcıyı bir sağlayıcıya yönlendirir, kullanıcı onay verir ve uygulama bir jeton alır.

Araç çağırma, bazen işlev çağırma olarak da adlandırılır. Bir sonraki bölüm öğreticinin neye ihtiyaç duyduğunu kapsar. Başlamadan önce bir uyarı: Aracı gerçek sistemlere yazar. Gerçek GitHub konularını açar ve gerçek Slack mesajları yayınlar. Yalnızca istediğiniz iletilere etki edip etmediğini kontrol etmeye devam ederken bir test Slack kanalı ve tek kullanımlık bir GitHub deposu kullanın.

Yapay Zeka Aracı Araçları Nelerdir? Araç, modeli girdinizle birlikte verdiğiniz bir işlevdir. Model bu işlevi kendi başına çalıştıramaz. Yalnızca şunu sorabilir: fileGithubIssue’yu bu başlık ve bu gövdeyle çağırın. Kodunuz çağrıyı gerçekleştirir, sonucu döndürür ve model bu sonucu bir sonraki adımı seçmek için kullanır. Talep et, uygula, geri dön.

Değişim tüm mekanizmadır ve “ajan” olarak adlandırılan her şey onun etrafındaki bir döngüdür. Bir Aracın API’den Farkı Araçlar ve API’ler aynı çağrıyı sarar ancak farklı okuyucular için yazılır. Sizin için bir API yazılmıştır. Belgeleri okuduğunuzu ve thread_ts’nin bir Slack mesajını zincirleme yanıta dönüştüren alan olduğunu bildiğinizi varsayar. Hiçbir şey okumayan bir model için bir araç yazılmıştır.

Yani bir araç kendi açıklamasını taşır: FileGithubIssue gibi modelin akıl yürütebileceği bir ad. Sade bir açıklama Aracın ne zaman kullanılmaması gerektiği de dahil olmak üzere dil. Modelin başlığın gerekli bir dize olduğunu bilmesini sağlayan girdiler için bir şema. Aşağıda projeden bir araç bulunmaktadır.

Kodun çoğu mantıktan ziyade açıklama niteliğindedir: const fileGithubIssue = tool({ açıklama: ‘İşlem yapılabilir bir Slack mesajı için GitHub sorununu bildirin’, inputSchema: z.object({ başlık: z.string(), gövde: z.string(), }), çalıştır: async ({ başlık, gövde }) => { // … asıl API çağrısı buraya gelecek }, }); Açıklama ve giriş şeması modelin gördüğü parçalardır. Yürütme işlevi yalnızca size aittir.

Kimlik, yürütmenin içinde yerleşir, böylece model, çağrının hangi hesaba karşı yapıldığını asla öğrenmez. Modeller Neden Araçları Ham API Çağrılarından Daha İyi Kullanıyor? Girdiye bir curl komutu yapıştırmak ve modelden boşlukları doldurmasını istemek mümkündür. Ancak bu yaklaşım öngörülebilir şekillerde başarısızlığa uğrar. Araçlar üç nedenden dolayı daha iyi çalışır: Şema, kodunuz çalıştırılmadan önce uygulanır.

Hatalı biçimlendirilmiş bir araç çağrısı SDK tarafından reddedilir ve yeniden denenir. Bunun yerine hatalı biçimlendirilmiş bir URL çalışma zamanında başarısız olur. Sonuçlar modele geri döner. FileGithubIssue geri döndükten sonra model, yeni sorun URL’sini okuyabilir ve bunu Slack yanıtında kullanabilir. Zincirleme ikinci adımı mümkün kılan şeydir. Kimlik bilgileri konuşmanın dışında kalır.

Model, ada göre bir eylem ister ve hiçbir zaman bir belirteç görmez. Asla görmediği bir token, tamamlamaya, günlük satırına veya anlık enjeksiyon ödemesine sızamaz reklam. Üçüncü sebep, bu eğitimin geri kalanının amacına yönelik olmasıdır. Belirteçleri bilerek modelin dışında tutacaksınız: aracı bir tanımlayıcı tutar ve bir belirteç yalnızca sağlayıcının çağrısı sırasında görünür.

Çoğu Temsilcinin Birden Fazla Uygulamaya İhtiyacı Var Çok az sayıda yararlı temsilci tek bir uygulamayla konuşur. Bir destek temsilcisi Zendesk’i okur ve Salesforce’u günceller. Bir stand-up aracısı GitHub’u okur ve Slack’te paylaşım yapar. Bir planlama aracısı Gmail’i okur ve Google Takvim’e yazar. Her uygulama kendi OAuth kaydını, kapsam adlarını, belirteç ömrünü ve yenileme davranışını getirir.

Listeyi aracının her kullanıcısıyla çarptığınızda asıl sorun ortaya çıkar. Herkes için paylaşılan bir kimlik bilgisi bir demoda çalışır ve ikinci bir kişi ortaya çıktığında başarısız olur. Slack yarısının hızlı versiyonunu hayal edin: Bir Slack uygulaması oluşturun, yükleyin, bot jetonunu .env’ye kopyalayın ve her araç çağrısının onu kullanmasına izin verin. Üç sorun bir arada geliyor.

İlk olarak, her çalıştırma aynı izinleri kullanır. Bot, çalıştırmayı kimin tetiklediğine bakılmaksızın davet edildiği her kanalı görür. Temsilciye hiç girmediğiniz bir kanal hakkında soru sorun, bot yine de onu okur. Aracı, kendi çalışma alanı izinlerinizi aşmanın bir yolu haline geldi. İkincisi, denetim takibi de yanlış. Her GitHub sayısında botun açtığını söylüyor. Her Slack yanıtı bottan gelir.

Bir sorunun neden var olduğu sorulduğunda dürüst cevap şu olur: “Bir temsilci bunu biri adına açtı ve kim olduğunu bilmiyoruz.” Üçüncüsü, iptalin durdurulması çalışma. Bir kullanıcı şirketten ayrılır ve Slack hesabı devre dışı bırakılır. Aracı, kimlik bilgilerini hiç kullanmadığı için çalışmaya devam ediyor. Bunun alternatifi kullanıcı başına hibelerdir. Her kullanıcı uygulamalara kendisi için yetki verir.

Ancak bu yeni bir gereklilik yaratıyor: bu hibeleri saklayacak bir yer. Ayrım Tek Yanıttaki Tek Alandır Slack, farkı görmeyi alışılmadık derecede kolaylaştırır.

Kullanıcı izin ekranını tamamladığında, jeton değişimi aynı JSON nesnesinde her iki jeton türünü de döndürür: { “tamam”: doğru, “access_token”: “xoxb-REDACTED-BOT-TOKEN”, “token_type”: “bot”, “yetkili_kullanıcı”: { “kimlik”: “U0A1B2C3D”, “kapsam”: “kanallar:geçmiş,sohbet:yazma,kullanıcılar:okuma”, “access_token”: “xoxp-REDACTED-USER-TOKEN”, “token_type”: “kullanıcı” } } Üst düzey erişim_tokeni bottur.

Yuvalanmış authed_user.access_token, az önce izin veren kişidir. İlkiyle konuşmalar.tarihini okumak, uygulamanın davet edildiği her kanalı döndürür. İkinciyle okumak yalnızca kullanıcıların zaten görebildiği kanalları döndürür. Aynı bölünme şunları da yönetir: chat.postMessage, o kişinin adı altında bir kullanıcı jetonuyla yayınlanır.

Önekte bir harf aralıklı iki alan ve temsilcinizin tüm izin modeli, hangisini sakladığınıza bağlıdır. Bu eğitim yalnızca kullanıcı kapsamlarını talep ettiğinden Slack hiçbir bot belirteci yayınlamaz. Tokenlar Modelin Dışında Kalmalı ve Günlükler Kullanıcı başına tokenlar en çok tercih edilenler haline geliyor Sistemdeki hassas veriler.

İki hedef sınır dışıdır: Model: Belirteçleri girdilerin, araç açıklamalarının ve araç dönüş değerlerinin dışında tutun. Bir jetonu gören bir model onu tekrarlayabilir ve anında enjeksiyon, herhangi bir araç sonucunu güvenilmeyen girdiye dönüştürür. Günlükleriniz: Araç girişleri ve çıkışları, bir aracıda hata ayıklarken tam olarak günlüğe kaydetmek istediğiniz şeylerdir.

Bu yüklerde dolaşan jetonlar kalıcı olarak günlük deponuza gelir. Bu eğitim, belirteçleri dar bir yolda tutar. Kodunuz, bir kullanıcıya sabit bir referans olan bir tanımlayıcı iletir. Bir yardımcı, bu tanımlayıcıyı bir jetona dönüştürür ve buradan jeton doğrudan bir sağlayıcı çağrısına gider, başka hiçbir yere gitmez.

Hiçbir zaman bir araç şemasında adlandırılmaz, asla modelin okuyabileceği herhangi bir şeye iliştirilmez ve hiçbir zaman bir araçtan geri dönmez. Neden OAuth Uygulamalarına ve Mağazaya Sahipsiniz? Akışı kendiniz yazmanın amacı tesisat değildir. Kimin kimin hibesini kullanabileceğinin kontrolü. Bu eğitimde kullanıcılar takım arkadaşlarıdır.

Her kişi kendi Slack ve GitHub’unu birbirine bağlar ve aracı, çalıştırmayı tetikleyen kişi gibi davranır. Aynı tasarım, bu kullanıcılar ürününüzün müşterisi olduğunda da geçerlidir: her kişinin hâlâ kendi izni vardır ve yanlış eşleme, bir kişinin başka birinin erişimini kullanarak çalıştırdığı anlamına gelir. Yalnızca tanımlayıcının kaynağı değişir. Ekip arkadaşları için bir oturum, müşteriler için bir kiracı kaydı.

Mimariye Genel Bakış İki akış önemlidir ve farklı zamanlarda gerçekleşirler. imes. Onları ayrı tutmak işin çoğunu oluşturuyor. Bağlantı süresi kullanıcı ve uygulama başına bir kez gerçekleşir. Kullanıcı onay verir ve jetonlar mağazanıza gelir. Temsilci çalışmıyor. Çalışma zamanı her yürütmede gerçekleşir. Aracı, mevcut kullanıcıyı bir tanımlayıcıya çözer ve işini yapar. İzin ekranı ve tarayıcı yok.

BAĞLANTI SÜRESİ (kullanıcı başına, uygulama başına bir kez) Kullanıcınız connect.js Slack / GitHub | | | |– “Slack’e bağlan” —>| | || | || | || | | tanımlayıcı, | | | sağlayıcı) | | || |<—————– sonuç ————| | | | [model sonucu görüyor, | | asla jeton değil] | | Şekilden üç özellik gelir.

Tanımlayıcı, aracı kodunuzdaki belirtecin yerini alır. Belirteç deposunun üzerindeki her şey alice@example.com veya user_8f21c gibi bir dizeyi işler. Dize tek başına değersizdir: mağaza ve şifreleme anahtarı olmadan hiçbir şeyi açmaz. Bir kimlik birçok uygulamayı kapsar. Tek bir tanımlayıcının bir Slack satırı ve bir GitHub’u vardır onun altında sıra var.

Üçüncü bir uygulama, uzlaştırılacak üçüncü bir kimlik yaratmaz. Yetkilendirme kodunuzda kalır. Mağaza hangi tokenlerin bir tanımlayıcıya ait olduğunu yanıtlar. Mağaza, isteğin bir yanıtı hak edip etmediğini bilemez. Arayanın bu tanımlayıcı gibi davranabileceğine karar vermek, herhangi bir çağrıdan önce gerçekleşir.

Bir kural takip eder ve onu esnetmek tüm tasarımı bozar: kimliği doğrulanmış bir oturumdan sunucu tarafındaki tanımlayıcıyı çözümlemek. Hiçbir zaman bir istek gövdesinden, bir sorgu parametresinden veya bir tarayıcıdan gelen tanımlayıcıyı kabul etmeyin. Bir istemciden kabul edilen tanımlayıcı, “herhangi bir kullanıcı gibi davran” uç noktasıdır.

Slack ve GitHub OAuth Uygulamaları Nasıl Kaydedilir İzlenecek yol, iki sağlayıcı olarak uçtan uca Slack ve GitHub’u kullanır. Her ikisinin de aynı üç şeye ihtiyacı vardır: kayıtlı bir uygulama, bir yönlendirme URI’si ve bir kapsam kümesi. Ayrıntılar, ayrı ayrı yürümeye değecek kadar farklıdır.

Yönlendirme URI’sinin HTTPS Kullanması Gerekir OAuth’a dokunan çoğu eğitim size http://localhost:3000/callback verir ve devam eder. Slack bunu reddediyor. Slack’in belgeleri açıkça “Yönlendirme URL’sinin de HTTPS kullanması gerektiğini” belirtir ve localhost için bir istisna oluşturmaz. GitHub daha rahattır ve her ikisini de kabul eder, dolayısıyla tek bir HTTPS geri çağrısı her ikisini de karşılar.

Kural bilgiçlik taslıyor gibi görünüyor, çünkü localhost’ta istek hiçbir zaman makinenizden ayrılmaz ve kablo üzerinde müdahale edilecek hiçbir şey yoktur. Slack bunu zaten aynı şekilde uyguluyor ve hiçbir muafiyetin olmadığı tek bir kural var.

Editörün Notu

Kullanıcı bazlı OAuth uygularken, her kullanıcının ayrı ayrı yetkilendirilmesi ve temsilcinin doğru kullanıcı kimliğiyle işlem yapması, veri güvenliği ve erişim kontrolü açısından kritik önem taşır. Bu yaklaşım, çok kullanıcılı yapay zeka ajanlarında doğru yetkilendirmeyi sağlar.

Emre Demir
Yazar

Yazılım Editörü

Yazılım editörü ve full-stack geliştirici. Uygulama incelemeleri, kodlama rehberleri ve verimlilik araçları üzerine yazıyor. Açık kaynak projelere katkıda bulunuyor; karmaşık konuları yeni başlayanların anlayacağı şekilde anlatmaya özen gösteriyor.

Tüm yazıları gör →