Agent tabanlı geliştirme ortamı.
Açık kaynaklıdır ve zaten kullandığınız modellerle çalışır. Bir agent’ı bir makinede başlatın, aynı oturuma başka bir makineden devam edin.
Beş istekten birini kaybeden bir bağlantıda 100 yükleme çalıştırdım. Başarısız yüklemeler 23'ten 1'e düştü.
Tek hata sunucunun reddettiği bir dosyaydı, yeniden denemek işe yaramazdı.
Yükleme hızı artık başlıkta dosya adının yanında duruyor ve kuyruk boşken gizleniyor.
Başladım. Gösterecek bir şey olunca buraya yazacağım.
Yeniden ürettim ve nedenini buldum. Düzeltme incelemeye hazır.
Yükleme kuyruğuna üstel geri çekilme ekledim. Başarısız bir parça en fazla beş kez yeniden denenir ve ilerleme çubuğu denemeyi gösterir. Testler zaman aşımını ve 503 durumunu kapsıyor.
Eskiden başarısız bir parça atılıyordu. Artık kuyruk geri çekilme politikasından bir gecikme istiyor ve yeniden denemeyi planlıyor; böylece tüm yeniden denemeler tek bir yerden geçiyor.
Beş başarısız denemeden sonra parça kesin olarak başarısız olur ve yükleme net bir hatayla durur, böylece ölü bir bağlantı sonsuza dek denemez.
Kuyruk değişikliği src/upload/queue.ts dosyasında, bekleme süreleri src/upload/backoff.ts dosyasında.
Kuyruk her parçanın durumunu diske yazıyor. Şimdi yeniden başlatma yolunu bağlıyorum.
Başlangıçta kuyruk kayıtlı durumu okur ve yalnızca bitmemiş parçaları gönderir, böylece 2 GB dosya baştan başlamaz.
Strateji pazara çıkmamızı söylüyor, bu yüzden bunun için bir fonksiyon ekledim.
1export async function goToMarket() {2await ship();3await tellDenis();4}
Bir test geçiyor. Pazardan henüz yanıt gelmedi.
Test, dosyayı izleyici yazmadan önce okuyordu. Artık flush olayını bekliyor ve art arda 200 çalıştırma geçiyor.
1test('reads the synced file', async () => {2await writeFile(path, 'hello');3await watcher.flushed(path);4const text = await readFile(path);5expect(text).toBe('hello');6});
Bekleme test yardımcısında, bu yüzden diğer sync testleri de düzelir.
Yeni sayfa hazır. Sekmeleri kaldırmadan önce ayar geçişini çalıştırmam gerekiyor.
| Eski sekme | Yeni bölüm |
|---|---|
| Genel | Çalışma alanı |
| Görünüm | Çalışma alanı |
| Hesaplar | Profil |
Geçiş 212 ayarı hatasız işledi ve eski sekmeler kalktı. Tüm ayarlar artık tek sayfada.
Burada durdum. Geçişi çalıştırmak isteyene kadar eski sekmeler kalıyor.
İki bulgu var. Oturum çerezinin süresi dolmuyor ve girişten sonraki yönlendirme her URL'yi kabul ediyor. Gerisi iyi görünüyor.
Tamam. Seçtiğin düzeltmeler testleriyle birlikte eklendi, ertelediklerin pull request üzerinde yorum olarak duruyor.
Anlaşıldı. Hiçbir şey değişmedi, bulgular pull request üzerinde yorum olarak kalıyor.
Yeni komutu temiz bir makinede denedim, çalışıyor.
1bun add -g uploader2uploader --help
Eski curl komutu da hâlâ çalışıyor, bu yüzden yedek olarak kalabilir.
Tamam. Yeni komut istediğin yerde, eskisi yedek olarak duruyor.
Sürenin çoğu her aramada tüm dosyaları okumaya gidiyor. Dizin bunu kısaltıyor, küçük depolar neredeyse değişmiyor.
Dizin bir dosya değişince güncellenir, bu yüzden hiç tam yeniden oluşturma gerekmez.
Ağaç artık diskteki önbellekten yükleniyor ve arka planda yenileniyor. Değişen yalnızca bekleme süresi.
- Önbellek isabetleri
- 94%
- Diskteki boyut
- 2.1 MB
- Ağaç yükleme süresi
- 40 ms
Dal değişince önbellek kendini temizler.
Buldum. Boş dosya null oluyor ve kod hemen ondan bir alan okuyor.
1export function loadConfig(path: string) {2const text = readFileSync(path, 'utf8');3if (text.trim() === '') return defaults;4return { ...defaults, ...parse(text) };5}
Artık boş dosya varsayılan yapılandırma sayılıyor, bozuk dosya net bir hata gösteriyor.
Beş yeni issue var. Üçü gerçek hata, biri bir sonraki sürümü bekleyebilir.
| Issue | Tür |
|---|---|
| Upload stalls at 99% on Safari | bug |
| Crash on a file named final_final_v2_🦆.mov | bug |
| Progress bar jumps back after resume | bug |
| Drag a folder into the upload list | feature |
| Is there a size limit? Asking for a 400 GB log file | question |
Hepsini etiketledim ve yineleneni eski kayda bağladım.
uploader projesinde ne üzerinde çalışıyoruz?
Başarısız yüklemeleri yeniden dene
Yükleme kuyruğuna üstel geri çekilme ekledim. Başarısız bir parça en fazla beş kez yeniden denenir ve ilerleme çubuğu denemeyi gösterir. Testler zaman aşımını ve 503 durumunu kapsıyor.
Eskiden başarısız bir parça atılıyordu. Artık kuyruk geri çekilme politikasından bir gecikme istiyor ve yeniden denemeyi planlıyor; böylece tüm yeniden denemeler tek bir yerden geçiyor.
const result = await sendChunk(chunk); if (!result.ok) return fail(chunk); if (!result.ok) { const delay = backoff.next(chunk.attempt); if (delay === null) return fail(chunk); return schedule(chunk, delay); } progress.advance(chunk.size); const DELAYS = [500, 1000, 2000, 4000, 8000]; export const backoff = { next(attempt: number) { return DELAYS[attempt] ?? null; } }; 1import { backoff } from './backoff';2import { sendChunk } from './client';3import { progress } from './progress';4import type { Chunk, UploadResult } from './types';56// TODO: remove before launch (added in 2023)7const MAX_PARALLEL = 4;8const queue: Chunk[] = [];9let running = 0;1011export function enqueue(chunks: Chunk[]) {12queue.push(...chunks);13void drain();14}1516async function drain() {17while (running < MAX_PARALLEL && queue.length > 0) {18const chunk = queue.shift();19if (!chunk) return;20running += 1;21await upload(chunk);22running -= 1;23}24}2526export async function upload(chunk: Chunk): Promise<UploadResult> {27const result = await sendChunk(chunk);28if (!result.ok) {29const delay = backoff.next(chunk.attempt);30if (delay === null) return fail(chunk);31return schedule(chunk, delay);32}33progress.advance(chunk.size);34return done(chunk);35}3637function schedule(chunk: Chunk, delay: number) {38chunk.attempt += 1;39progress.retrying(chunk);40setTimeout(() => enqueue([chunk]), delay);41}
Sizin makinenizde çalışır. Her yerden erişin.
Masaüstü uygulaması agent'ları bilgisayarınızda çalıştırır ve sunucularınıza bağlanır. Telefonu bir kez QR koduyla eşleştirin; sonra Private Relay üzerinden, uçtan uca şifreli ve açık port olmadan onlara ulaşır.
uploader projesinde ne üzerinde çalışıyoruz?
uploader projesinde ne üzerinde çalışıyoruz?
uploader projesinde ne üzerinde çalışıyoruz?
Session bulunamadı.
const result = await sendChunk(chunk); if (!result.ok) { const delay = backoff.next(chunk.attempt); if (delay === null) return fail(chunk); return schedule(chunk, delay); }
const DELAYS = [500, 1000, 2000, 4000, 8000]; export const backoff = { next(attempt: number) { return DELAYS[attempt] ?? null; } };
test('retries a chunk after a 503', async () => { server.respondWith(503); await upload(chunk); clock.tick(500); expect(server.calls).toBe(2); });
Tek görev, birkaç model.
Aynı prompt'u aynı anda birkaç modele gönderin. Her çalıştırma kendi worktree'sini ve branch'ini alabilir. En beğendiğiniz sonucu tutun ya da yanıtları tek bir sonuçta birleştirin.
Büyük bir diff'i adım adım okuyun.
Walkthrough büyük bir diff'i anlamlı olduğu sıraya koyar, her adımı bir cümleyle açıklar ve ana değişikliği işaretler; böylece önce neyi okuyacağınızı bilirsiniz.
Kayıtlarınız ve araçlarınız bir tık uzağınızda.
Bir GitHub issue'sundan, pull request'ten ya da Linear kaydından oturum başlatın; agent tüm tartışmayı alır. Entegrasyon kataloğunda aralarında Figma ve Sentry'nin de olduğu 160'tan fazla hizmet var ve her biri tek tıkla kurulur.
Ona bir hedef ya da bir program verin.
Bir hedef belirleyin; agent ayrı bir kontrol işin bittiğini ya da takıldığını söyleyene kadar tur tur çalışmaya devam eder. Zamanlanmış görevler oturumu kendiliğinden başlatır; her sabah ya da yalnızca önümüzdeki salı bir kez.
Kullananlardan.
Bizim istemediğimiz paylaşımlar.
I've had a deep experience with openchamber. I think my choice was right. This thing is really useful, smooth and silky. Go try it out quick, I strongly recommend it, no more messing around blindly.
@realchendahuang Was looking for a way to run agents from my phone, remotely on my server, other than tmux. Found OpenChamber. It is INSANELY good, highly recommended.
@NihilSineTheo Seriously, I've spent almost the whole week trying to find a tool that made sense to orchestrate agents and, as a dev (actually, a devops), openchamber is the only one that felt natural and logical.
@1un4rPunk I just want to say the app itself is phenomenal. The level of polish is just unreal. I saw OpenChamber back when it was a small project, I think maybe a couple months ago, and now it is unrecognizable. Truly amazing work. The latest release with its streaming feature is everything I could have possibly asked for and more. It is gorgeous and smooth.
Zaten sahip olduğunuz makineye kurun.
macOS, Windows veya Linux’ta masaüstü uygulaması, sunucuda tek bir komut. Sonra nerede olursanız olun oradan açın.
OpenChamber işiniz hakkında hiçbir şey toplamaz. Kod MIT lisanslıdır, yani herkes kontrol edebilir.
Etkinlik
Bekleme süreleri ayarlara taşınabilir mi? Mobilde daha uzun isteyebiliriz.
İyi fikir. Süreler artık tek bir dizi, bu yüzden ayrı bir PR olabilir.