gaogaoGao Kaptan Docsv0.90.x
Örnekler

Ajan ekibine gerçek iş yaptırmak: GitHub'dan Kaptan'a

Paperclip ekibi GitHub'daki issue'ları alsın, kodu yazsın, PR'ı incelesin, birleştirsin ve sonucu Kaptan'da pod olarak yayına alsın — siz yalnızca issue açın.

Paperclip kurulumu tek bir ajanla bitiyordu. Bu sayfa bir adım öteye geçiyor: ekip GitHub'ı kendisi izliyor, issue'ları triyaj ediyor, kodu yazıyor, kendi PR'ını inceleyip birleştiriyor ve sonucu Gao Kaptan'da bir pod olarak yayına alıyor. Sizin tek işiniz issue açmak.

Aşağıdakilerin hepsi çalışan bir kurulumdan alındı; ekran görüntüleri ve alıntılar gerçek.

Ortaya çıkan düzen

Şirketi siz kurmuyorsunuz. CEO'ya bir hedef verdiğinizde kendi ekibini kendisi işe alıyor — bu kurulumda CTO ve QA'yı o yarattı:

Org şeması: CEO → CTO → (Coder, QA)

Komuta zincirine saygı gösterin. CEO yalnız üst düzey yöneticiyle konuşur. Bir uygulayıcıyı (Coder gibi) doğrudan CEO'ya bağlarsanız CEO'nun kurduğu yapıyı bozarsınız; doğrusu CEO → CTO → (Coder, QA). Bu kurulumda tam olarak o hata yapıldı ve düzeltildi.

Bir işi CEO'ya verirseniz kendisi yapmaz — delege eder. Tek ajanla kurulmuş bir şirkette CEO işi yapacak kimse bulamayıp kendine geliştirici işe almaya çalışır. Doğru davranış budur, ama beklemediyseniz zaman kaybı gibi görünür.

Kurulum

Projeyi depoya bağlayın

Projects → Add Project: proje adı, Repo URL ve Local folder. Paperclip depoyu git_repo tipinde bir çalışma alanı olarak tanır, böylece görevler hangi kod tabanında çalışacaklarını bilir.

Depoyu ortak bir yere klonlayın (/workspace/<proje>), ajanın kendi dizinine değil.

Kimlikleri ajan yapılandırmasına koyun

Her ajanın adapterConfig.env alanına yazılır ve koşuda sürece geçer:

AnahtarNe için
GH_TOKENgh CLI — PR/issue okuma, yorum, merge
KAPTAN_API / KAPTAN_USER / KAPTAN_PASSGao Kaptan'da pod açmak

Git push için kimliği komut satırına değil ~/.git-credentials dosyasına koyun (git config --global credential.helper store); böylece jeton komutlarda ve remote URL'de görünmez.

gh auth login --with-token read:org yetkisi ister; yalnızca repo yetkili bir jetonla başarısız olur. GH_TOKEN ortam değişkeni ise repo ile sorunsuz çalışır — kalıcı giriş yerine onu kullanın.

Nöbeti kurun

Routines → Create routine: sorumlu ajan CTO, proje bağlı. Oluşturduktan sonra Paperclip sizi doğrudan tetikleyici ekranına götürür — Custom (cron) seçip */15 * * * * yazın.

Nöbet: her 15 dakikada bir

Talimatı iki bölüm hâlinde yazın. A — Açık PR'lar: gh pr list, gh pr diff ile değişikliği gerçekten oku, iyiyse yorum yazıp gh pr merge --squash, sorunluysa yorum bırakıp Coder'a düzeltme görevi aç (kendisi düzeltmesin). B — Açık issue'lar: gh issue list, kod işi ise Coder'a görev aç ve issue'ya "alındı" notu düş; soru ise cevapla ve kapat; belirsizse kapatma, netleştirici soru sor.

Issue bölümünü unutmayın. İlk kurulumda talimat yalnızca PR'ları kapsıyordu; asıl kullanışlı yarısı issue tarafı çıktı. Siz issue açıyorsunuz, gerisi kendiliğinden akıyor.

Akış — gerçek bir örnek

Panonun görsel olarak yenilenmesini isteyen bir issue açıldı. Sonrasına kimse dokunmadı:

  1. CTO triyaj etti: "Alindi. Coder'a atandi (Paperclip KAP-12): yeni dal + Closes #5 ile PR acilacak."

  2. Coder kendi dalında yazdı, PR açtı.

  3. CTO, QA'ya doğrulama görevi açtı — bu talimatta yoktu, kendi kararıydı.

  4. CTO inceledi ve birleştirdi. Yorumu ezber değil, ölçüm:

    "py_compile temiz, uçtan uca çalıştırıldı: 10/11 uç sağlıklı, JSONL 500 satır sınırına uyuyor, node --check ile JS doğrulandı, statik sunucuda açıldı."

  5. PR birleşince issue kendiliğinden kapandı (Closes #5).

Görev listesi: nöbet koşuları ve türetilen işler

Ekibin ürettiği pano — Gao Kaptan'da kendi açtıkları pod'dan, relay üzerinden:

Üretilen durum sayfası

Gao Kaptan'a dağıtımı ekibe bırakmak

Ajana sabit jeton vermeyin. Gao Kaptan jetonları dakikalar içinde düşüyor; ajan işin ortasında 401 alıp takılır. Kullanıcı adı ve şifre verin, jetonu her seferinde kendisi alsın:

TOKEN=$(curl -sS -X POST "$KAPTAN_API/api/v1/auth/login" -H 'Content-Type: application/json' \
  -d "{\"email_or_username\":\"$KAPTAN_USER\",\"password\":\"$KAPTAN_PASS\",\"device_info\":\"ajan\"}" \
  | python3 -c 'import sys,json;print(json.load(sys.stdin)["data"]["access_token"])')

Sonra "panoyu Gao Kaptan'da yayına al, adresini issue'ya yaz" demek yetiyor. Ekip pod'u açtı, doğruladı ve raporunu yazdı — çarptığı duvarlar dahil:

"İlk pod terminate edildi… K8s tarafında aynı adla bir pod halihazırda mevcut olduğu için (orphan, tenant listede görünmüyor ama create 409 dönüyor) aynı adla pod oluşturulamadı; bu yüzden -v2 adıyla oluşturuldu. Bağlantı ilk denemede 502 döndü, ~1 dakikada 200'e geldi (ingress ısınması). Doğrulandı: index.html 200, durum.json 200."

Bu rapordaki 409 gözlemi gerçek bir platform kusuru: silinen pod'un adı Kubernetes tarafında öksüz kalabiliyor — tenant listesinde görünmüyor ama aynı adla yeni pod açmak 409 dönüyor.

Ajanlara ne öğretmek gerekti

Her ajanın kalıcı bir talimat dosyası var:

~/.paperclip/instances/default/companies/<şirket>/agents/<ajan>/instructions/AGENTS.md

Yolu ajanın adapterConfig.instructionsFilePath alanında görürsünüz. Oraya üç blok yazıldı:

1. Çalışma kuralları. Önce ölç sonra yama · tek değişken değiştir · ne yazdığını değil ne çıktığını kontrol et · durumların hepsini say · ölçtüğünü ve tahminini ayrı yaz.

2. Gao Kaptan el kitabı. Jetonun kısa ömürlü olduğu · pod env/files/command alanlarının yerinde değiştirilemediği (düzeltme = yeniden oluşturma) · kotanın 10 pod olduğu ve silmenin asenkron olduğu · access-token/regenerate ile erişim bağlantısının nasıl kurulduğu · ilk açılışta 502'nin normal olduğu · wildcard DNS olmadığı için relay'in tek yol olduğu · egress'in yalnızca 80/443 olduğu · inference'ın max_tokens olmadan 400 döndüğü.

3. Teşhis. Bir pod çalışmıyorsa sırayla: pod durumu → Kubernetes olayları → konteyner günlüğü → içeride exec. Belirtiden sebebe bir tablo: ImagePullBackOff ne demek, no such file or directory neden olur, boş log + running ne anlama gelir.

Bunlar yazıldıktan sonra ekip, yayındaki pod'un bozulduğu bir işi baştan sona kendi çözdü: teşhis etti, fazla pod'u sildi, dosyaların main ile aynı olduğunu md5 ile doğruladı.

Ekibi güçlendirmek

Ekip kurulduktan sonra yetenekleri iki yerden büyür.

Skills — beceri mağazası. Sol menüde Skills. Kurulumda 5 gömülü beceri gelir, ayrıca 17 beceri katalogda hazır bekler: kod inceleme, pull request akışı, QA/test/doğrulama, dokümantasyon, changelog, MCP, ve gerçek bir tarayıcı sürüp sayfayı gözle doğrulayan agent-browser gibi. "Install" ile kurar, ajana atarsınız. Aynı sayfadaki Studio / New ile kendi becerinizi yazabilirsiniz.

Beceri mağazası — 17 beceri katalogda

Kuruma özgü bilgiyi (bizim örneğimizde Gao Kaptan el kitabı) tek tek AGENTS.md dosyalarına kopyalamak yerine beceri olarak yazmak daha doğrudur: beceri şirket kütüphanesinde durur, sonradan işe alınan her ajana kendiliğinden gider.

ClipHub — şirket kaydı. Org ekranındaki Import company / Export company düğmeleri buraya bakar. Komple bir şirket (org şeması, ajan tanımları, adaptör yapılandırmaları, başlangıç görevleri, bütçe varsayılanları) indirilebilir; tek tek ajan şablonları ve takım şablonları da yayınlanabiliyor. Ekibi sıfırdan kurmak yerine hazır bir yapı indirip uyarlamak mümkün.

Bunu CEO'ya da söyleyebilirsiniz. "Katalogdaki becerilerden işimize yarayanları kur, eksik bir rol varsa ajan al" diye bir görev verildiğinde CEO kendi seçimini yapıp kuruyor — bu kurulumda github-pr-workflow, task-planning ve wireframe becerilerini kendisi kurdu (5 → 8). Yeni ajan almadı; mevcut ekibi yeterli görmüş.

Tuzaklar

1 — Özet bırakmayan koşu görevi kilitler. Paperclip her koşunun bir sonuç bildirimiyle bitmesini bekler. Ajan özet yorum bırakmazsa görev "disposition eksik" deyip blocked olur ve sonraki nöbetler de tıkanır. Belirti şu yorumdur: "Run completed. Agent did not post a summary comment this run." Bunu tek tek görevlere değil, ajanların kalıcı talimat dosyasına yazın: hiçbir şey yapmadıysa bile "iş yok, işlem yapılmadı" desin.

2 — Her ajanın kendi çalışma dizini vardır ve boştur. Ajan ~/.paperclip/instances/default/workspaces/<ajanId>/ içinde uyanır. Depoyu yalnızca /workspace'e klonlarsanız Coder boş bir dizinde uyanır, elinde bir şey olmadan döner — ve hata da vermez. Belirti: koşu "tamamlandı" görünür ama dal, PR, çıktı yoktur. Çözüm, her ajanın dizininden ortak depoya bir symlink:

ln -s /workspace/<proje> ~/.paperclip/instances/default/workspaces/<ajanId>/<proje>

Ayrı ayrı klonlamak dört kopya ve çatışan dallar demektir.

3 — Ekip kendi tıkanmasını fark eder, ona güvenin. Coder boşa uyandığında CEO ve CTO kendiliğinden "ESKALASYON: KAP-25 takılı" diye bir görev açtı ve CTO satır numarası vererek talimat yazdı. Hemen müdahale etmeyin; önce ne yaptıklarına bakın.

4 — Kabuk tırnakları. Issue başlığında bir kesme işareti (pod'unu) sh -c zincirini kırıyor. Uzun metinleri --body-file ile dosyadan verin, başlıkları sade tutun. Aynı tuzak ajanın kendi komutlarında da geçerlidir.

5 — Pod bağlantısı kendiliğinden düşer. Çalışan bir bağlantı bir süre sonra 401 vermeye başlar, pod'a dokunmasanız bile. POST /api/v1/pods/<id>/access-token/regenerate ile yenileyin. Ajan da bunu bilmeli: paylaştığı bağlantı ölünce yenisini üretip güncellemeli.

6 — Sürüm pod'larını biriktirmeyin. Her güncelleme pod'u yeniden oluşturmak demek olduğu için -v2, -v3, -v4 çoğalır ve kota (10 pod) dolar. Dağıtımı bir betiğe alın ve depoda tutun; yenisi çalışır duruma gelince eskisini silin.

7 — Ajan, Paperclip'in kendi API'sine ulaşamayabilir. Paperclip'in baseUrlMode ayarı auto ve ajana dış adresi veriyor: https://<relay-host>:3100. Pod'un egress'i yalnızca 80/443 olduğu için o porta çıkılamaz ve ajan TCP seviyesinde zaman aşımına uğrar — API zaten pod'un içinde olmasına rağmen. Belirti, ajanın kendi teşhisinde net görünür: "The API bridge is timing out at the TCP level — the connection to …:3100 never completes."

Ajanın adapterConfig.env alanına PAPERCLIP_API_URL=http://127.0.0.1:3100 yazmak beceri kurmayı çalışır hâle getirdi, ama görevin tamamı yine bitmedi — adaptör kendi enjeksiyonuyla bu değeri eziyor olabilir. Kalıcı çözüm muhtemelen baseUrlMode'u auto bırakmayıp sabit bir iç adrese ayarlamak; bu doğrulanmadı.

Bu sayfa yardımcı oldu mu?

On this page