İçeriğe geç
mcpd
daemon yok
Kaynak

Ajanınızın attığı her adım, sonuna kadar tutulur ve kayda geçer.

mcpd bir daemon, bir framework değil. Bir çalıştırmayı adımlar arasında tutar: yeniden denemeleri, zamanlayıcıları, bir onay için haftalarca süren beklemeyi. İşi her adımın içinde, istediğiniz dilde, sizin kodunuz yapar. Her adım, maliyetiyle birlikte bir trace'e düşer.

Model gecikmesi
A strip chart recording model latency over the last hour: a baseline near 420 milliseconds with five occasional excursions towards 800 milliseconds.
A strip chart recording model latency over the last hour: a baseline near 420 milliseconds with five occasional excursions towards 800 milliseconds.

Derleyin ve çalıştırın

git clone https://github.com/mcpd/mcpd && cd mcpd && make build && ./target/release/mcpd demo

Sonra localhost:4317 adresini açın. Hesap yok, ayağa kaldırılacak veritabanı yok, imzalanacak bir şey yok. Henüz bir sürüm yok: imaj da paketler de ilk sürümle birlikte gelir. Beş dakikalık hızlı başlangıcı okuyun.

Okunabilir bir çalıştırma.

Başarısız olan bir ajan, hatadan söz eden log satırında başarısız olmaz. Üç adım önce, model yanlış aracı seçtiğinde ve sonra aynı aracı bir kez daha seçtiğinde başarısız olur.

mcpd çalıştırmanın tamamını bir ağaç olarak yeniden kurar: her model çağrısı, her araç çağrısı, her getirme; her birine iliştirilmiş tam prompt ve tamamlama, her birinin gecikmesi ve her birinin maliyeti.

Arayüzü açın

Trace b3d9e71a Fault
0ms 2.1s 4.2s 6.3s 8.4s
  1. agent support_agent fail
  2. model chat
  3. tool returns_policy
  4. model chat
  5. tool returns_policy
  6. model chat
  7. tool returns_policy

The model called one tool three times and never answered. That is visible in four seconds here, and invisible in a log file.

Çalıştırma tamburu

Aynı çalıştırma, bir kayıt tamburuna sarılmış. Zaman çevresi boyunca akar, her span için bir iz vardır. Çevirin; kalem altındaki span’i okur.

Tamburu çevirmek için sürükleyin ya da ok tuşlarını kullanın 2.64 s · tool returns_policy · 90 ms

Kendisini başlatan süreçten sonra da yaşayan bir çalıştırma.

Adımlar arasında çalıştırmayı daemon tutar. Bir adımın içindeki her şey sizin sürecinize aittir ve hiçbir şey devredilmez: ne model, ne prompt, ne de bir kimlik bilgisi.

Kira panosu

Daemon panosunda her adım için bir etiket tutar. Bir worker etiketi yalnızca kalp atışları geldiği sürece elinde tutar. Worker’ı durdurun; kira süresi ve bir geri alma penceresinden sonra etiket diğer worker için panoya döner.

Worker’ı durdurmak için tıklayın ya da Boşluk tuşuna basın draft · worker-a · started · lease 25 s

Grafik veridir, gövdeler sizindir

Bir iş akışı kodda bir kez yazılır. Grafik, daemon'un doğruladığı ve sürümlediği bir tanım olarak ona gider. Adım gövdeleri altı dilden herhangi birinde sizin sürecinizde kalır ve bir worker onları sunar.

Yeniden denemeler, zamanlayıcılar ve beklemeler birer satırdır

Geçici bir hata, adımın kendi bütçesiyle yeniden denenir. Bir uyku ya da bir onay beklemesi, ayakta hiçbir süreç olmadan çalıştırmayı tutar: bir dağıtım, bir çökme ya da bir hafta boyunca. Bir olay, beklemeyi ad ve anahtarla yanıtlar; tekrar gelen olay ikinci bir çalıştırma değil, bir yinelemedir.

Her çalıştırma bir trace'tir

Her adım; girdisi, çıktısı ve bildirdiği kullanımıyla bir span'dir ve diğer bütün span'lerle aynı fiyat kitabından fiyatlandırılır. Adımın içindeki model çağrısı onun altında durur; böylece arama, maliyet ve puanlayıcılar bir çalıştırma üzerinde değişmeden çalışır.

İş akışlarını okuyun

Zaten yazdığınız dilde ölçümleyin.

Altı SDK, tek bir davranış. Bir span kaydetmek asla bloklamaz, asla hata fırlatmaz ve sınırsızca büyümez: mcpd'ye ulaşılamıyorsa ajanınız bunu fark etmez; gözlemlenebilirliğin bozulabileceği tek kabul edilebilir biçim de budur. Her SDK bir worker da taşır, böylece kalıcı bir çalıştırmanın adımları onları kaydeden sürecin içinden sunulur.

Hiçbiri zorunlu değil. OTEL_EXPORTER_OTLP_ENDPOINT değişkenini mcpd'ye yöneltin; zaten çalıştırdığınız bir OpenTelemetry SDK'sı, uygulamanızda bizim kodumuz olmadan ona ulaşır. Bu altısı bir HTTP yüzeyinin üzerindeki kolaylıktır, kaydedilmenin koşulu değil.

Bir framework'ün içinde gelen gözlemlenebilirlik, yalnızca o framework'le yazılmış ajanları kaydedebilir. mcpd, OTLP endpoint'ine ne ulaşırsa onu alır: bir ajan framework'ü, kendi yazdığınız bir döngü ya da ikisinin çağırdığı servisler.

bir çalıştırmayı ölçümleme

/**
 * One ticket, one trace.
 *
 * `withSpan` opens the span, keeps it active for everything the callback
 * starts, and ends it when the callback settles. Nothing inside has to be
 * passed a handle to be nested under it.
 */
async function handleTicket(ticket: Ticket): Promise<{ answer: string; traceId: string }> {
  let traceId = ''
  const answer = await mcpd.withSpan('support_agent', async (run) => {
    // Keep the id: a score or a piece of feedback that arrives later attaches
    // to this run by it.
    traceId = run.traceId
    // Tags label the whole run, so the trace list can filter on them.
    run.setTags(['support', 'tier-1'])
    run.setCorrelation({ sessionId: ticket.id, userId: ticket.customerId })
    run.setInput({ question: ticket.question })

    const order = await lookUpOrder(ticket)
    const answer = await draftAnswer(ticket, order)

    run.setOutput({ answer })
    return answer
  })
  return { answer, traceId }
}

Altı sinyal, onları üreten çalıştırmayla ilişkilendirilir.

Çoğu araç trace'leri bir yerde, logları başka bir yerde verir ve zaman damgalarını gözünüzle eşleştirmeyi size bırakır. mcpd altı sinyalin hepsini aynı trace ve span kimlikleri altında saklar; böylece bir grafikteki sıçrama ona yol açan çalıştırmayı açar, bir çalıştırma da ürettiği log satırlarını gösterir.

Ayırma tezgâhı

Altı tür sinyal tek bir bantta karışık gelir. Okuyucu her birinin trace id’sini okur ve bir çalıştırmanın her parçası o çalıştırmanın çekmecesine düşer.

Bir çekmeceyi gösterin ya da ok tuşlarını kullanın trace 4bf9 · span 3 · log 1 · metric 1 · score 1 · feedback 1

13 dil, birbiriyle uyuşuyor.

Cross-language conformance

tests/e2e/run.mjs

Channel root tree status error model tokens score feedback ids
TypeScript
Python
Go
Elixir
Kotlin
Rust
cURL
TypeScript
Python
Go
Elixir
Kotlin
Rust

13 languages, one canonical run, one daemon. Every trace comes back the same shape.

481 checks

A conformance panel with one row per language and one column per family of check. Every cell passes. The families are: the root span is the agent run; every child hangs off the root; a failed step makes the whole run an error, and only that step; the error carries a message, on the step that failed; the model call records its model; token usage and cost survive the wire; the scores land, with their scale; the feedback lands; ids are OpenTelemetry-shaped. The suite asserts 37 checks in each of the 13 languages.

Her SDK kendi başına test edilir; bu, her birinin yazarlarının istediği şeyi yaptığını kanıtlar ama birbirleriyle örtüşüp örtüşmediklerine dair hiçbir şey söylemez. Bu yüzden hepsi aynı çalıştırmayı tek bir daemon üzerine yazar, trace'ler geri okunur ve birbiriyle karşılaştırılır.

Bir dilde geçerli olup bir başkasında olmayan davranış yalnızca orada görünür. Her değişiklikte CI içinde çalışır. Karşılaştırmayı okuyun.

Kimin neyi okuduğu, geri çevrilenler dahil.

Bir güvenlik incelemesini belirleyen soru, verinin güvende olup olmadığı değildir. Sonradan, ona kimin eriştiğini gösterebilmenizdir.

Audit log

GET /v1/api/audit

Time Principal Action Project Result
14:02:11 a3f9c2e1b7d4 get_trace checkout ok
14:02:11 a3f9c2e1b7d4 list_spans checkout ok
14:04:38 7c1e08b53a9f list_dataset_items billing refused
14:07:02 d52a4f8c0e63 capture_into_dataset checkout ok
14:11:55 d52a4f8c0e63 delete_trace checkout ok
14:19:20 7c1e08b53a9f list_feedback billing ok

A refusal is recorded like a read. The principal is a digest of the key, never the key. Retention never trims this table.

18 actions

An audit log with six entries, each showing the time, a truncated digest of the key that acted, the action, the project and the result. One entry, a read of another project's dataset items, is recorded as refused.

Altı anahtar kapsamı

Telemetri göndermek, prompt'ları okumak, saklanan veriyi değiştirmek, onu yok etmek, çalıştırma başlatmak ve adım talep etmek ayrı yetkilerdir. Tanımsız bir yazma listesi alım anahtarlarını, tanımsız bir yönetim listesi okuma anahtarlarını kabul eder. Tanımsız execute ve worker listeleri yazma anahtarlarını kabul eder. Yükseltme sizi dışarıda bırakmaz.

Proje bir sınırdır

Anahtarlar, saklama ve örnekleme proje başınadır. Bir projenin altında listelenen anahtar yalnızca o projeye ulaşır ve daemon, bir veri kümesinden tek bir kayıt döndürmeden önce kümenin sahibini çözer.

Hiçbir şey merkeze bağlanmaz

Daemon'un tamamında dışarı istek atan dört yer vardır ve hepsini siz yapılandırırsınız: iletici, iki webhook ve yargıç. Güncelleme denetimi yok, telemetri yok, lisans sunucusu yok.

Hangi anahtar, hangi kişi

Defter anahtarın adını yazar. mcpd'ye ingress'inizin zaten koyduğu başlığı ve onu koymasına izin verilen adresleri verin, kişinin adını da yazsın. Başka bir yerden gelen başlık, herkesin öne sürebileceği bir iddiadır; satır bu yüzden tahmin taşımaktansa boş kalır.

Silme talebi tek bir çağrıdır

Tek bir DELETE, bir kişiye karşı kaydedilmiş her çalıştırmayı, onlara bağlı span'ler, loglar, metrikler, puanlar ve geri bildirimlerle birlikte siler ve sinyal başına bir sayıyla yanıt verir. O anahtarın açamadığı bir projedeki satırlara ne dokunulur ne de sayılır.

Güvenmeden önce denetleyin

mcpd doctor bir dağıtımı notlandırır: depo bir yazmayı alıp geri veriyor mu, bir kapsam açık mı bırakılmış, yapılandırılmış bir proje hiç span almış mı. Sizden bir şey yapmanızı istediği her maddede, onu düzelten seçeneğin adı yazar.

mcpd'nin yapmadıkları.

Her aracın böyle bir listesi vardır. Çoğu bunu içeride tutar ve siz ikinci haftada öğrenirsiniz. İşte liste; tarih yerine gerekçesiyle.

gRPC üzerinden OTLP yok.
HTTP, trace'leri her iki kodlamada, logları ve metrikleri de JSON olarak taşır. gRPC hiç desteklenmiyor.
Satıcı adına yazılmış exporter yok.
mcpd OTLP iletir; bu, tek bir uygulamayla çoğu hedefe ulaşır ve mcpd'yi verinizin kalmak zorunda olduğu yer değil, yol üstünde bir durak yapar. Yalnızca kendi protokolünü konuşan bir hedefe erişilemez.
SSO ya da SCIM yok.
Anahtarlar projelerle sınırlıdır; bu bir kiracılık sınırıdır, kimlik sağlayıcı değil. Bir kişinin kimliği, mcpd'nin önünde ingress'inizin ne kurduysa odur.
Çok bölgeli alım yok.
Postgres ya da ClickHouse üzerinde, tek bir servisin arkasında birkaç kopya olarak çalışır. Bu, bölgesel yük devretme değildir.

Tam döküm PARITY.md dosyasında; ölçüm, yerleşik ürünün kaynak kodu doğrudan okunarak yapıldı. Bir şey planlandığında değil, geldiğinde güncellenir.

İlk trace'inize beş dakika.

Daemon'u çalıştırın, ajanınızı ona yöneltin, arayüzü açın. Bundan uzun sürüyorsa bu bir hatadır ve bildirimini almak isteriz.

Başlayın

docker run -p 4317:4317 ghcr.io/mcpd/mcpd