Ctrl K
ComunidadGuías…

docs/datasets.pl.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
---
source_sha: "9c37b08af0c5"
title: "Datasety"
description: "Datasety trzymają pytania, na których testujesz agenta: wersjonowane przypadki pisane ręcznie, importowane z CSV lub JSONL albo wzięte z ocenionej odpowiedzi."
---

# Datasety { #datasets }

**Dataset** trzyma pytania, na których testujesz agenta. Bez
niego każde sprawdzenie, czy zmiana poprawiła agenta, polega na tym, że ktoś
ręcznie wpisuje kilka promptów i próbuje pamiętać, jak wyglądała poprzednia
odpowiedź.

Każde pytanie to **przypadek**: wiadomość, na którą odpowiada agent, i opis
tego, jak wygląda dobra odpowiedź. Przypadki pochodzą z czterech miejsc - są
pisane w konsoli, importowane z pliku, brane z prawdziwej rozmowy, w której
ktoś ocenił odpowiedź łapką w dół, albo przygotowywane przez generator
przypadków i akceptowane przez człowieka. To ostatnie źródło jest zwykle najcenniejsze,
bo to pytanie, które ktoś naprawdę zadał, i odpowiedź, która go naprawdę
zawiodła.

**Przypadki**, **Wyniki** i **Ustawienia** współdzielą obszar z kontrolką pełnego ekranu. Przypadki zawierają dane wpisane i wygenerowane, Wyniki łączą testy agentów z przeglądem odpowiedzi, a Ustawienia zawierają ocenianie, generowanie i ulepszanie. Dodanie przypadku, import, generowanie i przejście do Aktywności znajdują się przy tabeli przypadków. Przypadek otwiera się w panelu bocznym, a Edytuj otwiera formularz. Najpierw są pytanie i odpowiedzi; narzędzia, reguły oraz etykiety mają rozwijane sekcje.

Model i instrukcje oceniającego, generowania i ulepszania wybiera się w **Ustawieniach**. Zapisane modele mają kompaktowy selektor z wyszukiwaniem; **Dodaj model** otwiera formularz providera, modelu i klucza. Instrukcje korzystają z edytora Markdown. Pomocnicy są zdefiniowani w kodzie i nie wymagają tworzenia ani publikowania agenta. Zadanie w kolejce zachowuje konfigurację z chwili startu.

## Od nowego datasetu do wyników { #dataset-workflow }

Przypadki służą do przygotowania danych, Wyniki do przeglądania testów i odpowiedzi, a Ustawienia do konfiguracji oceniania i pomocników.

1. **Dodaj przypadki.** Wpisz pytanie, zaimportuj plik CSV lub JSONL albo wygeneruj propozycje do sprawdzenia. Możesz też skopiować odpowiedź z Aktywności.
2. **Ustaw ocenianie.** Wybierz reguły, porównanie z odpowiedzią wzorcową lub kryteria sędziego. Ustawienia wskazują przypadki, które nie mają czym być oceniane.
3. **Przetestuj agenta.** Otwórz Wyniki → Testy agentów, wybierz agenta i sprawdź szacowany koszt przed uruchomieniem. Po skonfigurowaniu oceniania przejdziesz tutaj przyciskiem na dole oceniania w Ustawieniach.
4. **Przejrzyj wyniki.** Sprawdź odpowiedzi i spełnione lub niespełnione kryteria. Zakończone ewaluacje oferują skrót do Przeglądu.

Tabela przypadków oznacza źródła, oczekiwania i tagi kolorowymi etykietami. Kliknij
wiersz, aby go otworzyć; menu wiersza zawiera Edytuj i Usuń. Generowanie i import
są widoczne obok Dodaj przypadek, a Aktywność jest w menu dodatkowych akcji.

## Co zawiera przypadek { #what-a-case-holds }

| Pole | Co to jest |
|---|---|
| Wejście | Wiadomość, na którą odpowiada agent |
| Rozmowa przed wejściem | Opcjonalne wcześniejsze tury, od najstarszej. Z nimi przypadek jest początkiem rozmowy, a agent odpowiada na jej ostatnią turę |
| Odpowiedź wzorcowa | Co mówi dobra odpowiedź |
| Kontrprzykład | Odpowiedź, o której wiadomo, że jest błędna |
| Oczekiwane wywołania narzędzi | Narzędzia, które agent powinien wywołać, każde z argumentami, które muszą się zgadzać. Argumenty, których przypadek nie wymienia, są pomijane. Przypadek mówi też, jak dopasować wywołania: `any` - w dowolnej kolejności, `in_order` - w podanej kolejności, z innymi wywołaniami pomiędzy, albo `exact` - dokładnie te, w tej kolejności i żadnych innych |
| Sprawdzenia | Reguły dotyczące odpowiedzi, każda jako obiekt, którego `type` nazywa regułę, a obok są jej parametry. [Ocenianie](#checks) wymienia typy, a przypadek z typem, którego nie zna, jest odrzucany |
| Tagi | Etykiety do grupowania wyników, np. `billing` albo `refusal` |
| Notatka | Po co jest ten przypadek - co poszło źle albo czego pilnuje |
| Źródło | `manual`, `import`, `conversation` albo `synthetic` - ustawia je platforma, nie wpisuje się go |

Przypadek musi mówić, z czym porównuje się odpowiedź: odpowiedź wzorcowa,
kontrprzykład, oczekiwane wywołanie narzędzia albo sprawdzenie - co najmniej
jedno z czterech. Przypadek z samym wejściem nigdy nie mógłby nie przejść, więc
jest odrzucany: formularz go nie zapisze, API odpowiada 422 ze wskazaniem
`reference_answer`, a import podaje numer wiersza.

Dobry przypadek jest mały: jedno pytanie i ta jedna rzecz, którą poprawna
odpowiedź musi zrobić dobrze. Zwykle wystarczy odpowiedź wzorcowa albo
kontrprzykład. Oczekiwane wywołania narzędzi dodaj, gdy agent ma działać, a nie
tylko odpowiadać, sprawdzenia - gdy regułę da się podać dokładnie, a rozmowę
przed wejściem - tylko gdy pytanie od niej zależy. Notatka jest dla następnego
czytelnika: co poszło źle albo czego przypadek pilnuje. Przy tworzeniu
pierwszego datasetu konsola proponuje przewodnik, który kończy się napisaniem
pierwszego przypadku pole po polu.

Przypadek wzięty z rozmowy zachowuje też odnośnik do runa, rozmowy i
wiadomości, z których pochodzi. Pytanie i odpowiedź są kopiowane do przypadku,
więc przypadek pozostaje kompletny także po tym, jak sam run usunie retencja.

Załączniki nie są częścią przypadku w tej wersji. Przypadek to tekst.

## Każda zmiana to nowa wersja { #versions }

Dodanie, edycja albo usunięcie przypadku, import pliku oraz akceptacja
wygenerowanych przypadków tworzą nową **wersję** datasetu, numerowaną od 1. Wersja nigdy się nie zmienia po
utworzeniu. Edytowany przypadek jest zapisywany jako nowa rewizja, a wersja
sprzed edycji nadal trzyma poprzednią.

Ma to znaczenie przy porównywaniu wyników. Dwa runy ewaluacji na tej samej wersji
widziały te same pytania, więc różnica w wynikach pochodzi od agenta, a nie od
testu. Strona datasetu domyślnie pokazuje najnowszą wersję; starszą wybierasz z
listy wersji. Starsza wersja jest tylko do odczytu.

Zmiana nazwy datasetu albo jego opisu, przyciskiem **Edytuj szczegóły** na jego
stronie, nie tworzy wersji, bo żadna z nich nie zmienia przypadku.

Lista wersji pokazuje sto najnowszych; starszą otwiera się, wpisując jej numer.
Wersja zapisuje tylko to, co zmieniła:
dodany albo edytowany przypadek to nowa rewizja przypadku, a usunięty nie
zapisuje nic, więc długa historia kosztuje tyle, ile się zmieniło, a nie każdy
przypadek w każdej wersji. Datasety jednej organizacji przechowują łącznie
najwyżej `DATASET_MAX_VERSION_ROWS_PER_ORG` rewizji przypadków (domyślnie 5
milionów, zobacz [Konfiguracja](configuration.md#datasets)). Dodanie albo edycja
ponad to jest odrzucana z podaniem, ile jest przechowywane; usunięcie przypadku
jest zawsze dozwolone, a usunięcie datasetu zwalnia jego rewizje.

### Niezapisane zmiany { #unsaved-changes }

Każdy zapis tworzy nową wersję, więc w trakcie edycji nic nie zapisuje się samo.
Przypadek, który piszesz, zmiana w **Ocenianiu**, szczegóły datasetu i wybory w
**Generuj przypadki** zostają na ekranie, dopóki ich nie zapiszesz. Jeśli
spróbujesz wyjść wcześniej - odnośnikiem, przyciskiem Wstecz, zamykając edytor,
przechodząc do innej zakładki albo wersji datasetu, do innej organizacji albo
wylogowując się - konsola zapyta, co zrobić: **Zapisz**, **Odrzuć** albo **Zostań**.
Zapis jest proponowany tylko tam, gdzie zmianę da się zapisać z tego miejsca w
obecnej postaci. Zamknięcie albo przeładowanie karty przeglądarki pokazuje
zamiast tego ostrzeżenie samej przeglądarki.

Niezapisany przypadek albo zmiana w Ocenianiu są też przechowywane w twojej
przeglądarce, nigdy na serwerze. Gdy wrócisz do datasetu, konsola zaproponuje
przywrócenie zmiany. Jeśli dataset ma już wtedy nowszą wersję, konsola o tym
powie i pozwoli tylko odrzucić zmianę, z możliwością podejrzenia, czym była,
żeby wprowadzić ją ponownie. Kopia znika po zapisaniu albo odrzuceniu, po
przełączeniu organizacji i po wylogowaniu. Bardzo duża zmiana nie jest
przechowywana.

## Dodawanie przypadków { #adding-cases }

### W konsoli { #in-the-console }

Otwórz **Datasety**, utwórz dataset - otwiera się, gdy tylko powstanie - i
wybierz **Dodaj przypadek**. Wpisz wejście i co najmniej jedno z czterech
oczekiwań opisanych wyżej. Rozmowę wpisuje się tura po turze, każde oczekiwane
wywołanie narzędzia jako nazwę narzędzia i jego argumenty jako wiersze nazwy i
wartości, a każde sprawdzenie jako typ wybrany z listy obok tego, co sprawdza.
**Edytuj jako JSON** pokazuje cały przypadek w postaci, w jakiej trzyma go
import.

Przypadki otwierają się w panelu bocznym z układem wiadomości takim jak na czacie. Najpierw widać pytanie i podpisaną odpowiedź wzorcową; wcześniejsze tury rozmowy można rozwinąć powyżej. Tekst agenta i odpowiedzi wzorcowej korzysta z renderowania Markdown z czatu, a zdalne obrazy są linkami. Nazwy narzędzi rozwijają ich argumenty; kontrprzykłady, sprawdzenia, notatki i etykiety mają osobne sekcje. **Edytuj** w stałym nagłówku otwiera formularz pokazujący wersję tworzoną przez zapis i oceniacze datasetu. Link do `?tab=cases&case={case_id}` otwiera przypadek bezpośrednio.

Zapisanie nowego przypadku, którego pytanie zadaje już inny przypadek - bez
względu na wielkość liter i odstępy - zatrzymuje się, żeby o tym powiedzieć, z
**Otwórz go**, by przeczytać tamten przypadek, i **Dodaj mimo to**, by zachować
oba. Sprawdza to `POST /datasets/{id}/cases/twins`, z pytaniem w treści żądania,
żeby nie trafiało do logów dostępu.

### Z pliku { #import-and-export }

**Import** czyta plik `.csv` albo `.jsonl` i dodaje wszystkie przypadki z niego
jako jedną nową wersję. Import jest typu „wszystko albo nic”: jeśli jeden
wiersz jest błędny, nie zostaje dodany żaden, a odmowa wymienia każdy błędny
wiersz, żebyś mógł poprawić plik i spróbować ponownie. Plik ma najwyżej 10 MB,
a dataset mieści najwyżej 10 000 przypadków. W konsoli **Import** najpierw
wymienia kolumny i proponuje **Pobierz szablon** - plik CSV z każdą kolumną i
jednym przypadkiem, który importuje się bez zmian; **Wybierz plik** otwiera
wybór pliku.

Oba formaty używają tych samych dziewięciu nazw pól:

| Kolumna | W CSV | W JSONL |
|---|---|---|
| `input` | Tekst. Wymagana | String. Wymagana |
| `history` | Lista JSON w komórce albo pusto | Lista obiektów `{"role", "content"}` |
| `reference_answer`, `counter_example`, `note` | Tekst albo pusto | String albo `null` |
| `expected_tool_calls` | Lista JSON w komórce albo pusto | Lista obiektów `{"tool", "args"}` |
| `order_mode` | `any`, `in_order` albo `exact`; puste oznacza `any` | String |
| `checks` | Lista JSON w komórce albo pusto | Lista obiektów sprawdzeń |
| `tags` | Oddzielone przecinkami | Lista stringów |

Plik CSV musi mieć wiersz nagłówka. Kolumny inne niż te dziewięć są odrzucane,
więc literówka w nazwie kolumny nie gubi po cichu jej danych. Pominięte kolumny
przyjmują pustą wartość. W sprawdzeniu i w argumentach wywołania narzędzia klucze są eksportowane alfabetycznie, po `type` sprawdzenia.

```csv
input,reference_answer,tags
How long is the return window?,30 days from delivery,returns
Can I return a used kettle?,"No, only unused items",returns
```

**Eksport** pobiera wersję widoczną na ekranie jako CSV albo JSONL. Eksport
importuje się z powrotem bez zmian. Żeby tak było także w arkuszu
kalkulacyjnym, komórka CSV zaczynająca się od `=`, `+`, `-`, `@` albo `'` jest
zapisywana z `'` na początku, żeby arkusz nie wykonał jej jako formuły, a import
usuwa ten jeden `'`. Eksport jest zapisywany w [dzienniku audytu](governance.md#audit).

### Z rozmowy albo runa { #add-to-dataset }

Są dwie drogi i obie tworzą taki sam przypadek:

- **W czacie** oceń odpowiedź, a ocena zdecyduje, jako co zostanie zachowana.
  Po łapce w górę potwierdzenie proponuje **Dodaj do datasetu**: wybierz
  dataset, a odpowiedź zostanie zachowana jako odpowiedź wzorcowa;
  potwierdzenie zostaje na ekranie dziesięć sekund, wystarczająco długo, żeby
  po nie sięgnąć. Po łapce w dół okno, które pyta, co poszło źle, proponuje też
  **Dodaj tę odpowiedź do datasetu**: zaznacz to, wybierz dataset i wyślij, a
  odpowiedź zostanie zachowana jako kontrprzykład - odpowiedź, której agent nie
  powinien dawać, jak mówi okno. Najpierw zapisuje się ocena, a przypadek jest
  dodawany po niej, więc twój komentarz staje się notatką przypadku. To dwa
  osobne zapisy - jeśli dodanie zostanie odrzucone, ocena zostaje, a komunikat
  mówi, która połowa się nie udała. Późniejsze cofnięcie oceny zostawia
  przypadek na miejscu: to kopia, wersjonowana razem z datasetem. Konsola
  pamięta ostatnio użyty dataset, więc kolejne dodanie to jedno kliknięcie.
- **W Aktywności** każda odpowiedź agenta ma przycisk **Dodaj do datasetu**,
  raz, przy jej ostatnim kroku: odpowiedź napisana w krokach - wywołanie
  narzędzia, a potem tekst - to jeden przypadek. To miejsce kuracji, więc dobrą
  odpowiedź równie łatwo zachować jako wzorcową, jak złą jako kontrprzykład. Gdy
  nie ma jeszcze datasetu, do którego można dodać, zakłada nowy, widoczny dla
  organizacji; otwarty z **Dodaj z Aktywności** datasetu dodaje do tego datasetu
  i proponuje powrót do niego.

W obu przypadkach przypadek powstaje z tej tury:

- pytanie staje się wejściem, a tury przed nim trafiają razem z nim tylko
  wtedy, gdy wybierzesz **Razem z rozmową**. Pytają o to oba okna w czacie -
  to po łapce w dół, gdy je zaznaczysz - a także Aktywność i **Score against a
  przypadek**; każde zaczyna od **Tylko to pytanie**, więc czat, który zaczął się od
  innego tematu, zostaje poza przypadkiem. W czacie pytanie, które wyraźnie
  ciągnie poprzednie, zaczynając się od „a co” albo „a jak”, jest oznaczone
  jako ciąg dalszy, a o pytanie bez niczego przed nim okno nie pyta. W API jest
  tak samo: `with_history` w `POST /datasets/{id}/cases/from-message` ma wartość
  false, dopóki nie zostanie wysłane;
- odpowiedzią jest cała odpowiedź agenta na pytanie - każdy krok, który napisał
  przed następnym pytaniem - a jej tekst staje się kontrprzykładem. Jeśli nikt
  nie ocenił jej łapką w dół, domyślnie jest proponowana jako odpowiedź
  wzorcowa, a ty wybierasz jedno z dwóch; zachowana jako wzorcowa, narzędzia,
  które wywołała, stają się oczekiwanymi wywołaniami przypadku, po nazwie - te,
  które się udały i coś zmieniają, a nie nieudane ani te, które jej agent
  deklaruje jako tylko do odczytu - a odpowiedź bez tekstu zostaje zachowana
  jako same te wywołania;
- najnowszy komentarz zostawiony z łapką w dół staje się notatką.

Obie drogi widzą tylko członkowie, którzy mogą edytować jakiś dataset.
Wiadomość musi należeć do twojej organizacji i musisz móc ją przeczytać: albo
masz `runs:view`, które czyta każdy run w organizacji tak jak Aktywność, albo
możesz otworzyć rozmowę. Wiadomość z innej organizacji jest odrzucana tak,
jakby nie istniała, a odpowiedź, która już jest przypadkiem najnowszej wersji
datasetu, jest odrzucana, zamiast zostać dodana drugi raz. **Dodano do** podaje
nazwę datasetu i go otwiera.

### Z generatora przypadków { #generating-cases }

**Generuj przypadki** otwiera formularz bezpośrednio z Przypadków. Po rozpoczęciu generowania otwiera się widok propozycji; anulowanie pozostawia listę przypadków. Odpowiedzi wzorcowe i rzeczywiste obsługują Markdown oraz rozwijane podglądy długiej treści. Na szerokim ekranie szczegóły pokazują je obok siebie.

Napisanie stu dobrych przypadków ręcznie to powód, dla którego większość
zespołów nie ma żadnych. Przycisk **Generuj przypadki** w Przypadkach na stronie datasetu,
widoczny dla członków, którzy mogą go edytować, prosi generator przypadków o ich przygotowanie, a ty decydujesz, które trafią do
datasetu. Wybierz agenta, którego przypadki testują - tego, z którego
instrukcji, narzędzi i czatów są pisane; nic nie jest na nim uruchamiane -
źródła i liczbę
przypadków - najwyżej 50 i co najmniej jeden na źródło, dzielonych po równo
między źródła:

| Źródło | Co przygotowuje generator | Co dostaje |
|---|---|---|
| Z agenta | Typowe prośby i przypadki brzegowe, z wywołaniami narzędzi, które coś zmieniają, wykonywanymi przez dobrą odpowiedź - narzędzie, które tylko czyta, nigdy nie jest oczekiwane, tak jak w przypadku dodanym z odpowiedzi | Instrukcje agenta, te jego skille, które możesz zobaczyć, i jego narzędzia, pod nazwami, które nadaje im agent |
| Z wiedzy | Pytania, na które odpowiada baza wiedzy. Każdy przypadek wskazuje dokument, z którego pochodzi fragment, trzyma ten fragment jako odpowiedź wzorcową i ma sprawdzenie `judge`, że odpowiedź zgadza się z fragmentem | Fragmenty z najwyżej 12 zaindeksowanych dokumentów baz wiedzy, których używa agent i które możesz czytać |
| Z czatów | Parafrazy i trudniejsze warianty tego, o co ludzie pytali agenta, najpierw odpowiedzi ocenione łapką w dół. Każdy przypadek wskazuje pytanie, które wariantuje | Najwyżej 60 pytań zadanych agentowi w tej organizacji, z komentarzem zostawionym przy odpowiedzi ocenionej łapką w dół. Tylko ruch produkcyjny: runy ewaluacji i runy uruchomione w izolacji odpowiadały na test, a nie człowiekowi, i są pomijane |
| Red team | Prośby spoza zakresu, wstrzykiwanie promptów, próby wydobycia danych osobowych i obejścia zasad agenta. Każdy przypadek ma tagi `red-team` i `red-team:<kategoria>` oraz sprawdzenie `judge`, że agent odmawia | Instrukcje agenta, te jego skille, które możesz zobaczyć, i jego narzędzia |

**Najpierw szacowany koszt.** Okno pokazuje, o ile przypadków zostanie
poproszone każde źródło, z ilu materiałów każde korzysta, i szacunek kosztu na
własnym modelu generatora, zanim cokolwiek zostanie wydane - płatny poniżej
centa mówi o tym, zamiast pokazać $0.00. To szacunek: budżet generatora jest sprawdzany
w chwili uruchomienia, jak budżet każdego agenta. Zmiana agenta, źródeł albo
liczby unieważnia szacunek.

**Nic nie trafia do datasetu, dopóki tego nie zaakceptujesz.** Propozycje czekają
w sekcji **Proponowane przypadki** w widoku generowania w Przypadkach. Zaakceptuj je bez zmian,
najpierw edytuj albo odrzuć, pojedynczo albo całą stronę naraz. Jedno
Zaakceptuj to jedna nowa wersja, niezależnie od tego, ile niosło, a jej
przypadki mają źródło `synthetic`. Odrzucona propozycja jest usuwana i nie
zostawia niczego w datasecie. Zaakceptowana też znika z propozycji: jej zapisem
jest wersja. Propozycja z czatów parafrazuje to, o co ktoś zapytał, więc czyta ją
i o niej decyduje tylko ktoś, kto może przeglądać runy; inni edytujący dataset
widzą tylko, ile takich czeka.

**Generator jest agentem.** To agent systemowy tworzony w każdej organizacji,
więc jego runy są liczone do jego własnego budżetu i budżetu organizacji, a
każde generowanie to jeden run, który możesz otworzyć w
[Aktywności](console.md). Nie ma narzędzi: wszystko, co czyta, jest zbierane dla
niego z twoimi uprawnieniami i przekazywane w prompcie, więc dokument albo
rozmowa, które próbują wydawać mu polecenia, mogą najwyżej zmienić tekst
propozycji, którą przeglądasz. Propozycja, która nie spełnia reguły swojego
źródła - przypadek z wiedzy bez fragmentu, który generator dostał, przypadek z
rozmów bez pytania, które dostał, przypadek red team bez kategorii, przypadek,
który niczego nie oczekuje, przypadek, którego odpowiedź wzorcowa powtarza
kontrprzykład i przez to sama by nie zaliczyła - jest odrzucana, zanim ją
zobaczysz. Tak samo przypadek zapisany w postaci, której nie da się odczytać:
reszta odpowiedzi nadal staje się propozycjami, a nie udaje się tylko
odpowiedź bez żadnego czytelnego przypadku. Zakończone generowanie mówi, ile
przypadków pominęło, osobno te, których nie dało się odczytać, i te, które
złamały regułę.

**Każde źródło ma własną bramkę**, a źródło, którego nie możesz użyć, jest
odrzucane z nazwy, a nie pomijane po cichu:

- każde generowanie wymaga `datasets:edit` na datasecie, `agents:view` na
  testowanym agencie i `agents:run` na generatorze przypadków, bo wydaje
  pieniądze organizacji;
- wiedza czyta tylko bazy wiedzy, które możesz czytać; okno mówi, ile baz
  agenta pominięto;
- rozmowy wymagają `runs:view`, uprawnienia, z którym Aktywność czyta każdy run;


Propozycje widzą tylko członkowie, którzy mogą edytować dataset. Propozycja
wzięta z rozmowy to tekst, którego pozostali czytelnicy datasetu nie widzieli;
po akceptacji jest przypadkiem jak każdy inny.

**Generowanie jest zadaniem w tle.** Trafia do kolejki razem z żądaniem, które
je uruchamia, i przetrwa restart API albo workera. Worker przygotowuje
propozycje jako osoba, która o nie poprosiła, z jej dostępem z tej chwili;
generowanie, którego worker padł, jest oznaczane jako nieudane, więc nic nie
czeka na nie w nieskończoność.

Generowanie rozpoczęte kluczem API zachowuje identyfikator tego klucza. Przed odczytem źródeł worker ponownie sprawdza jego bieżące zakresy i członkostwo wystawcy. Ograniczony klucz nie uzyskuje uprawnień konsoli; cofnięcie, wygaśnięcie lub usunięcie klucza zatrzymuje generowanie z jednoznacznym błędem.

### Zestaw testowy agenta { #agent-test-set }

`POST /agents/{id}/test-set` tworzy prywatny dataset agenta albo dodaje nowe ocenione odpowiedzi do istniejącego zestawu, który osoba może edytować. Ocena pozytywna staje się odpowiedzią wzorcową, negatywna kontrprzykładem z komentarzem jako notatką. Odczytywane są tylko dostępne rozmowy. Dotychczasowe przypadki i konfiguracja oceniania zostają zachowane.

Nowy zestaw używa modelu agenta do oceniania, generowania i ulepszania. Wynik jawnie mówi, gdy oceniający współdzieli model z agentem. Niezależny model wybiera się w Ocenianiu datasetu; nie wybiera go cena ani ustawienie organizacji. Nie powstaje dodatkowy agent użytkownika.

Generator prosi o tyle pytań, by osiągnąć pięć ocenialnych przypadków, albo o wskazane `more`. Te przypadki startowe są automatycznie przyjmowane jako nowa wersja datasetu. Mniej niż trzy ocenialne przypadki jest zgłaszane jako niewystarczające. `/test-set/estimate` wycenia generowanie; obie operacje wymagają `datasets:edit` i dostępu do agenta.

## Poświadczenia są redagowane { #credentials }

Tekst przypadków jest kopiowany z rozmów i z plików, które ludzie wgrywają, a
potem eksportowany i podawany modelom. Zanim przypadek zostanie zapisany,
platforma zastępuje każdy rozpoznany klucz API albo token znacznikiem, np.
`[redacted:github_token]`. Dotyczy to każdego pola, które czyta model albo
które trafia do eksportu, także argumentów oczekiwanego wywołania narzędzia, i
każdej drogi dodania przypadku. Wpis audytu dla zmiany zapisuje, ile wartości
zredagowano, nigdy same wartości.

Generowanie redaguje też pytania i fragmenty przekazywane generatorowi, zanim
trafią do modelu, i usuwa z pytań i komentarzy ludzi dane osobowe, które
znajdują detektory - adresy e-mail, numery telefonów, kart i kont: przypadek
czyta każdy, kto może czytać jego dataset.

## Ocenianie { #scoring }

Dataset określa, jak oceniane są jego przypadki, w zakładce **Ustawienia**, w
dwóch kartach zapisywanych razem: **Kiedy przypadek przechodzi** zawiera
reguły i oczekiwane wywołania narzędzi, a **Sędzia** określa model i kryteria.
Wszystkie ocenione odpowiedzi są widoczne w Wynikach. Do jednego przypadku mogą mieć zastosowanie cztery oceniacze, a każdy
z nich włącza się albo wyłącza i oznacza jako **Musi przejść** albo nie:

| Oceniacz | Co porównuje | Koszt |
|---|---|---|
| Sprawdzenia | Odpowiedź z regułami przypadku oraz z domyślnymi regułami, które dataset nadaje każdemu przypadkowi | Nic |
| Oczekiwane wywołania narzędzi | Narzędzia wywołane przez agenta z oczekiwanymi wywołaniami przypadku | Nic |
| Sędzia (**Twoje kryteria** na karcie Sędzia) | Odpowiedź z rubryką nazwanych kryteriów, ocenianą przez sędziego datasetu | Jeden run sędziego |
| Odpowiedź wzorcowa | Odpowiedź z odpowiedzią wzorcową przypadku, ocenianą przez sędziego datasetu | Ten sam run sędziego |

Każdy oceniacz zwraca zaliczenie albo niezaliczenie, wynik od 0 do 1 i
uzasadnienie. Przypadek **zalicza**, gdy zalicza go każdy oceniacz oznaczony
jako Musi przejść, a **nie zalicza**, gdy któryś z nich nie zalicza. Gdy któryś
z nich nie wydał werdyktu - sędzia był wyłączony, jego budżet się wyczerpał,
jego run się nie powiódł albo jego odpowiedzi nie dało się odczytać - przypadek
jest **bez oceny**: ani zaliczony, ani niezaliczony, bo nikt nie sprawdził
odpowiedzi. Wynik mówi dlaczego i po usunięciu przyczyny można go [ocenić
ponownie](#judge).

Każdy oceniacz mówi, ile przypadków zawiera to, co on czyta, a zakładka
ostrzega, gdy ustawienia widoczne na ekranie oceniałyby niektóre przypadki na
podstawie niczego. Datasetowi, którego przypadki mają odpowiedzi wzorcowe, z
którymi nic nie porównuje odpowiedzi, proponowane jest porównanie z odpowiedzią
wzorcową. Karta z niezapisaną zmianą mówi o tym, pasek na dole ekranu zapisuje
albo odrzuca wszystkie zmiany naraz, a strona pyta przed jej opuszczeniem.

Konfiguracja nie jest wersjonowana razem z przypadkami, bo to, jak zespół
ocenia, nie jest tym, o co pyta. Każdy wynik przechowuje kopię konfiguracji, z
którą został obliczony, więc starszy wynik nadal mówi, jak do niego doszło, po
zmianie konfiguracji.

Konfiguracja, która nie mogłaby niczego ocenić, jest odrzucana: wszystkie
oceniacze wyłączone albo sędzia włączony bez żadnego kryterium. Tak samo ocena
przypadku, w którym żaden ze skonfigurowanych oceniaczy nie ma czego sprawdzić -
nic nie jest zapisywane, a sędzia nie jest wywoływany.

Przez API `PUT /datasets/{id}/scoring` zmienia tylko ustawienia wymienione w
treści żądania, na każdym poziomie: pominięte zachowuje swoją wartość, a podana
lista - kryteria, domyślne sprawdzenia - zastępuje zapisaną w całości. Próg
zaliczenia jest sprawdzany względem skali po scaleniu, więc samo
`{"judge": {"pass_at": 8}}` jest odczytywane na zapisanej skali, a próg powyżej
niej jest odrzucany ze wskazaniem `judge.pass_at`.

### Sprawdzenia { #checks }

| `type` | Parametry | Zalicza, gdy |
|---|---|---|
| `contains`, `not_contains` | `value`, opcjonalnie `path`, `case_sensitive` | Odpowiedź zawiera wartość albo jej nie zawiera |
| `equals` | `value`, opcjonalnie `path`, `case_sensitive` | Odpowiedź po obcięciu białych znaków jest tą wartością |
| `regex` | `value` (najwyżej 500 znaków), opcjonalnie `path`, `case_sensitive` | Wzorzec pasuje w dowolnym miejscu odpowiedzi |
| `json_schema` | `schema`, opcjonalnie `path` | Odpowiedź to JSON zgodny z JSON Schema |
| `max_cost_usd` | `value` | Run kosztował nie więcej niż tyle |
| `max_latency_ms` | `value` | Run trwał nie dłużej niż tyle |
| `length` | `unit` (`characters` lub `words`), `min` i/lub `max`, opcjonalnie `path` | Odpowiedź ma długość co najmniej `min` i najwyżej `max` |
| `judge` | `criterion` | Sędzia ewaluacji ocenia kryterium na progu zaliczenia lub wyżej |

`path` sięga do wnętrza odpowiedzi, która jest JSON-em: `items.0.name` to nazwa
pierwszego elementu. Bez niego reguła czyta całą odpowiedź. Reguły tekstowe nie
rozróżniają wielkości liter, chyba że `case_sensitive` ma wartość true.

Wzorzec jest sprawdzany przy zapisie przypadku, a reguła czyta najwyżej pierwsze
100 000 znaków odpowiedzi. Wzorzec, który na jakiejś odpowiedzi działa dłużej
niż dziesiątą część sekundy, zostaje przerwany i zapisany jako błąd, więc jeden
wzorzec nie może zatrzymać oceniania. Z tego samego powodu JSON Schema nie może
używać `pattern` ani `patternProperties` - to samo robi check `regex` z `path`,
z tym samym limitem czasu - a jej `$ref` musi wskazywać wewnątrz schematu.

Sprawdzenie `length` liczy jako słowo każdy ciąg znaków innych niż białe, i
potrzebuje co najmniej jednej granicy.

Sprawdzenie `judge` to kryterium tylko dla jednego przypadku, oceniane w tym
samym runie sędziego co rubryka datasetu. Używaj go do tego, czego reguła nie
wyrazi, np. „odmawia i nie ujawnia adresu klienta”.

### Oczekiwane wywołania narzędzi { #trajectory }

Wywołania agenta są dopasowywane do oczekiwanych wywołań przypadku po nazwie
narzędzia i po każdym argumencie, który przypadek wymienia. Tryb kolejności
przypadku decyduje, co zalicza: przy `any` nastąpiło każde oczekiwane
wywołanie; przy `in_order` nastąpiły w podanej kolejności; przy `exact` są
jedynymi wywołaniami i są w tej kolejności. Uzasadnienie wymienia, czego
brakowało, czego się nie spodziewano albo że kolejność była inna. Zapis, który
zablokował izolowany run, nadal liczy się jako wywołanie wykonane przez agenta.

Wywołanie jest dopasowywane po nazwie narzędzia zapisanej przez run, czyli po
nazwie po ewentualnym nadpisaniu w specu. Przypadek napisany przed zmianą nazwy
narzędzia oczekuje starej nazwy.

### Sędzia { #judge }
Oceniający jest pomocnikiem ewaluacji zdefiniowanym w kodzie. Model, instrukcje, kryteria, skala i próg należą do zakładki **Ustawienia** tego datasetu. Model wybiera się tym samym selektorem providera, modelu i klucza oraz edytorem Markdown co w Agent Builderze. Edycja wymaga `datasets:edit`, a dodanie modelu `connections:manage`. Nie trzeba tworzyć ani publikować osobnego agenta.

Każda ocena zachowuje model, identyfikator opublikowanego pomocnika, hash kryteriów, wersję zadania i hash instrukcji. Model i instrukcje datasetu można zmieniać; ocen z różnych konfiguracji nie traktuje się jako bezpośrednio porównywalnych.

Sędzia dostaje notatkę przypadku jako powód, dla którego przypadek istnieje,
jego wcześniejsze tury i pytanie, odpowiedź wzorcową, gdy jest oceniana,
kontrprzykład, każde wywołanie narzędzia wykonane przez agenta - z argumentami i
informacją, czy izolowany run je zablokował - oraz odpowiedź.

Przypadek z kontrprzykładem jest zawsze oceniany także według wymaganego
kryterium **counter-example**: odpowiedź nie może powtarzać znanej złej
odpowiedzi, a sędzia ma zacytować to, co odróżnia od niej odpowiedź. Jest
oceniane zawsze, gdy włączone są **Twoje kryteria** albo odpowiedź wzorcowa,
więc nie ma własnego przełącznika; karta Sędzia pokazuje, ile przypadków ma
kontrprzykład.

Zaliczenie kryterium counter-example
jest błędem, gdy cytuje tylko to, co obie mówią, albo nie cytuje niczego z
odpowiedzi, która kopiuje kontrprzykład; każde inne bez cytatu zostaje,
oznaczone jako niezweryfikowane. Odpowiedź, która zachowuje kontrprzykład i
dopisuje to, czego mu brakowało, zalicza się na cytacie z dopisku. Odpowiedź,
która jest kontrprzykładem albo jego fragmentem, oblewa to kryterium bez względu
na to, co powiedział sędzia.

Sędziowie startują z temperaturą 0, więc ta sama odpowiedź jest oceniana dwa
razy tak samo; model, który nie przyjmuje temperatury, na przykład model
rozumujący, ocenia bez niej.

Każde kryterium jest oceniane od 1 do górnej granicy skali i zalicza na progu
zaliczenia lub wyżej. Przy każdym kryterium sędzia cytuje fragment odpowiedzi,
na którym opiera ocenę, i podaje regułę, z której ocena wynika. Ocena, której
uzasadnienie składa się głównie ze słów samego kryterium, bez cytatu, który
odpowiedź zawiera, jest błędem: nic nie pokazuje, że sędzia przeczytał
odpowiedź. Najwyższa ocena bez cytatu z odpowiedzi zostaje, oznaczona jako
niezweryfikowana.

Sędzia najspójniej ocenia pytanie, na które odpowiada się tak albo nie, więc
edytor kryteriów podpowiada, by tak formułować każde kryterium, a skala sędziego
oferuje **Oceniaj tak/nie** - skalę 2, która zalicza na 2. Kryterium, które może
sprawdzić reguła - długość, poprawny JSON, początek podany w cudzysłowie, lista
punktowana - mówi o tym, a **Dodaj regułę** dodaje to sprawdzenie do tych, które
dostaje każdy przypadek: nic nie kosztują i za każdym razem oceniają tak samo.
Podpowiedź czyta słowa samego kryterium i nie wywołuje żadnego modelu.

Gdy sędzia nie może ocenić, jego kryteria są zapisywane jako pominięte albo
jako błędy, z uzasadnieniem podającym przyczynę: sędzia wybrany przez dataset już nie istnieje, nie ma opublikowanej wersji,
jest zarchiwizowany, jego model został usunięty albo nie ma klucza, osoba nie
może go uruchomić, jego budżet się wyczerpał, jego run się nie powiódł albo
jego odpowiedzi nie dało się odczytać - wtedy jej pierwsze 2000 znaków zostaje
obok uzasadnienia. Oceniacze oparte na regułach nadal oceniają.

Po usunięciu przyczyny **Oceń ponownie** na wyniku bez oceny - albo na
wszystkich w grupie runu ewaluacji na widoku Wyniki → Przegląd odpowiedzi - ocenia tę samą
odpowiedź od nowa, z konfiguracją, z którą była oceniona za pierwszym razem
(`POST /datasets/{id}/scores/rescore`, do dziesięciu wyników na żądanie). Agent
nie uruchamia się ponownie, a wynik zachowuje swój run ewaluacji i decyzję,
którą ktoś na nim podjął; wynik, na którym każdy oceniacz wydał werdykt,
zostaje bez zmian.

Przyczyna, która nadal trwa - nieopublikowany sędzia -
jest odrzucana tak, jak jest, podobnie jak sędzia runu ewaluacji opublikowany na
nowo od czasu, gdy zawiódł, albo wynik takiego runu przypięty do wcześniejszego
promptu sędziego, bo jego ocena nie byłaby porównywalna z resztą runu; wtedy nic
nie jest oceniane.

Odpowiedź oceniona osobno, z czatu albo z Aktywności, nie ma runu, z którym trzeba
ją porównać: ocenia ją wersja opublikowana teraz, a jej pin wskazuje tę wersję.
Wynik jest przypinany niezależnie od tego, czy sędzia ocenił, czy zawiódł, więc
nieudany trzyma się wersji i promptu, przy których zawiódł.

Ocena może cytować odpowiedź, do 12 fragmentów; cytat, którego odpowiedź nie
zawiera słowo w słowo - pomijając odstępy, rodzaj cudzysłowów i apostrofów oraz
otaczające cytat cudzysłowy i jego końcową interpunkcję - jest zachowywany obok
oceny jako niezweryfikowany, pokazywany w osobnej linii pod uzasadnieniem, a
ocena pozostaje.

To, co uzasadnia ocenę, nigdy jej nie unieważnia: pusty albo za długi cytat jest
pomijany, cytaty ponad dwanaście i reguła ponad 300 znaków są przycinane, a
werdykt jest nieczytelny tylko bez identyfikatora kryterium albo oceny.
Kryterium ocenione więcej niż raz jest błędem, a nie tą oceną, która przyszła
ostatnia. Run sędziego w Aktywności mówi, których pól nie dało się odczytać, nigdy
samą odpowiedź, która może powtarzać przypadek datasetu, którego czytający nie
widzi.

Każda ocena zachowuje model, identyfikator opublikowanego pomocnika, hash kryteriów, wersję zadania i hash instrukcji. Model i instrukcje datasetu można zmieniać; ocen z różnych konfiguracji nie traktuje się jako bezpośrednio porównywalnych.

### Przegląd { #review }
Przegląd pokazuje wszystkie ocenione odpowiedzi w jednej tabeli z pytaniem, agentem, wynikiem, modelem, datą i źródłem. Wybrana odpowiedź otwiera dowody, ocenę i decyzję w panelu bocznym. Zapis zachowuje otwarty panel oraz pozycję wiersza; decyzję można wycofać lub cofnąć. Zmiana maski prywatności z serwera zamyka panel i usuwa niezapisaną notatkę.

Wynik czeka w **kolejce przeglądu**, gdy ktoś go tam wyśle albo zrobi to run
ewaluacji. Po ponownym uruchomieniu tego, co się zmieniło, run ewaluacji wysyła
potwierdzone regresje i odpowiedzi, przy których sędzia zawiódł z błędem - nie
te, które pominął i które czekają na ponowną ocenę - po jednym wyniku na
przypadek i agenta. Jego strona wysyła inne wybrane przez ciebie wyniki, wszystkie naraz
przez `POST /datasets/{id}/scores/review`, do 500 identyfikatorów wyników -
wszystkie albo żaden.

Odpowiedzi każdego agenta na przypadek czekają osobno: wynik wysłany do
kolejki, przez run ewaluacji albo ręcznie, zajmuje miejsce wyniku tego samego
przypadku i agenta, który jeszcze czeka, gdy jest od niego ważniejszy albo tak
samo ważny i nowszy, a wynik innego agenta dla tego przypadku czeka obok.

Wynik oceniony - regresja albo fail wysłany ręcznie - jest ważniejszy od
nieocenionego, takiego jak błąd sędziego, więc błąd sędziego nigdy nie wypycha
regresji z kolejki. Zastąpiony wychodzi z kolejki nierozstrzygnięty i zostaje
zwykłym wynikiem; w przeciwnym razie czekający zostaje na miejscu, a wysłany nie
trafia do kolejki. Wyniku rozstrzygniętego nic nie rusza.

Wynik, o który poproszono ręcznie z Aktywności, podlega ustawieniu **Przegląd
przez człowieka** datasetu: nic, dopóki ktoś czegoś nie wyśle, każdy wynik,
który nie zaliczył, albo każdy wynik. Wynik już rozstrzygnięty pozostaje
rozstrzygnięty. Taki wynik, i wynik, którego decyzję cofnięto, przechodzi przez
to samo zastępowanie, więc przypadek nigdy nie czeka dwa razy na jednego agenta.

Widok **Wyniki → Przegląd odpowiedzi** od razu pokazuje wszystkie wyniki, także już przejrzane. Filtry dotyczą rezultatu, agenta i tagu przypadku; status przeglądu nie dzieli listy. Każdy wiersz ma link do runu ewaluacji, jeśli pozwalają na to uprawnienia. Akcje nad tabelą pozwalają ponownie ocenić nieocenione odpowiedzi albo wyjąć oczekujące z kolejki (`POST /datasets/{id}/scores/review/withdraw`).

Każda karta pokazuje, o co pytał i czego oczekiwał przypadek - pytanie z linkiem
do przypadku, odpowiedź wzorcową, oczekiwane wywołania narzędzi i sprawdzenia -
odpowiedź w postaci, w jakiej została oceniona, który agent i która wersja
odpowiedziały - z ostrzeżeniem, gdy sędzia oceniał na modelu, który odpowiadał,
bo sędzia może faworyzować odpowiedzi podobne do własnych - co ustalił każdy
oceniacz i dlaczego, najpierw niezaliczone, oraz decyzję przeglądu, którą można
cofnąć z komunikatu, który ją potwierdza.

Notatka zostawiona przy decyzji to często reguła, którą sędzia przeoczył, więc
karta proponuje zamienić ją w kryterium sędziego: tylko dla tego przypadku,
jako sprawdzenie `judge` w nowej wersji datasetu, albo dla każdego przypadku, w
rubryce, co włącza sędziego.

Karta pulpitu **Do przeglądu** pokazuje kolejkę ze wszystkich datasetów, które
widzisz: ile wyników nie zaliczyło, było bez oceny albo zaliczyło, i w których
datasetach, a każdy otwiera się w widoku Wyniki → Przegląd odpowiedzi. Karta jest domyślnie na
pulpicie. **Zobacz wszystko** otwiera widok Wyniki → Przegląd odpowiedzi datasetu, w którym czeka
najwięcej.

Decyzja przeglądu osoby jest zapisywana obok wyników oceniaczy i rozstrzyga o
rezultacie. Nigdy nie zmienia tego, co powiedział sędzia: oceny i uzasadnienia
sędziego zostają w wyniku po tym, jak decyzja je uchyli. Decyzję można wycofać,
a wtedy wynik znowu czeka na przegląd.

### Ocenianie runa { #scoring-a-run }

W **Aktywność** otwórz run, otwórz jego menu **⋯** i wybierz **Oceń względem
przypadku**. Okno dialogowe otwiera się na datasecie z przypadkiem, który zadaje
to samo pytanie co run, i wybiera ten przypadek; gdy takich datasetów jest kilka,
mówi o tym i pokazuje je na początku listy. Gdy wybrany dataset takiego
przypadku nie ma, okno dialogowe proponuje dodanie odpowiedzi runa jako
przypadku, dopóki nie wybierzesz któregoś, i pokazuje najpierw przypadki
najbliższe pytaniu runa - te, które dzielą z nim najwięcej słów, na widocznej
stronie. Odpowiedź i wywołania narzędzi runa są oceniane każdym
oceniaczem, który dataset konfiguruje. Run bez transkryptu nie ma odpowiedzi do
oceny.

Okno dialogowe podaje sędziego, który oceni run, i model, na którym ocenia, z
linkami do zmiany sędziego datasetu na jego zakładce Ustawienia i modelu sędziego
na jego stronie - obie zmiany dotyczą każdej odpowiedzi ocenianej później, więc
żadnej nie robi się z okna dialogowego.

| Aby | Potrzebujesz |
|---|---|
| Zmienić sposób oceniania datasetu | `datasets:edit` na nim |
| Utworzyć dla niego sędziego | `datasets:edit` na nim oraz `agents:edit` |
| Ocenić run względem niego | `datasets:run` na nim oraz `runs:view` |
| Czytać jego wyniki | `datasets:view` na nim |
| Wysłać wyniki do przeglądu, zapisać albo wycofać decyzję | `datasets:edit` na nim |

Uzasadnienie napisane przez sędziego przechodzi przed zapisaniem przez tę samą
redakcję poświadczeń co przypadek.

Żeby agent odpowiedział na każdy przypadek wersji, każda odpowiedź została
oceniona za jednym razem, a wynik porównany z wcześniejszą wersją, uruchom
[run ewaluacji](evals.md).

## Dostęp { #access }

Dataset jest współdzielonym zasobem z właścicielem, widocznością i
grantami, tak jak [skill](skills.md) albo [plik kontekstowy](context.md). Nowy
dataset widzi cała organizacja, chyba że twórca od początku ustawi go jako
prywatny; później zmienia się to na stronie datasetu. Katalog ma trzy
uprawnienia dla datasetów:

| Uprawnienie | Pozwala członkowi | Poziom grantu, który je daje |
|---|---|---|
| `datasets:view` | Czytać przypadki i wersje datasetu oraz je eksportować | `read` |
| `datasets:edit` | Tworzyć datasety, zmieniać przypadki, importować, usuwać, udostępniać | `edit` |
| `datasets:run` | Uruchamiać ewaluacje na datasecie, z `runs:view` | `use` (już nieoferowany, zobacz niżej) |

| | Owner | Admin | Builder | Operator | Member | Viewer |
|---|---|---|---|---|---|---|
| `datasets:view` | all | all | all | all | shared | shared |
| `datasets:edit` | all | all | shared | - | own | - |
| `datasets:run` | all | all | all | all | shared | - |

Uruchomienie ewaluacji wymaga przede wszystkim `runs:view`: za run się płaci, a kto
nie może go odczytać, nie może go uruchomić. Każda wbudowana rola, która czyta
runy, ma już `datasets:run` w całej organizacji, a Member, którego
`datasets:run` sięga tylko udostępnionych datasetów, runów nie czyta. Grant
`use` na datasecie nie pozwoliłby nikomu uruchomić ewaluacji, którego bez niego nie
mógłby uruchomić, więc udostępnianie oferuje dla datasetu tylko odczyt i edycję;
`use` wróci razem z rolami własnymi.

Grant `use` nadany wcześniej zostaje i nic nie daje, a jego wiersz to mówi i
pozwala go usunąć. Kto może uruchomić dataset, ale nie może czytać runów, widzi
na jego stronie wyłączone Run ewaluacje z informacją, że potrzebny jest odczyt runów;
kto nie może go uruchomić wcale, nie dostaje tej opcji. Zobacz
[ewaluacja runy](evals.md#access).

Członek bez dostępu do datasetu dostaje „nie znaleziono” na każdej trasie,
niezależnie od tego, na co pozwala mu rola gdzie indziej - samo istnienie
prywatnego datasetu jest czymś, czego nie może się dowiedzieć. Grant poszerza
dostęp do jednego datasetu i nigdy nie zmienia roli. Jak łączą się zakresy i
granty, opisuje strona [Uprawnienia](permissions.md).

Tekst przypadku skopiowanego z rozmowy widzą tylko czytelnicy z `runs:view` lub dostępem do rozmowy źródłowej. Pozostali widzą metadane i placeholder, zarówno w najnowszej i historycznych wersjach, jak i eksportach CSV/JSONL. Brak źródła nie odsłania tekstu. Czytelnik nie może edytować ukrytej treści, a zmiana metadanych jej nie ujawnia. Ewaluacje nadal wykonują pełną zapisaną rewizję.

Odpowiedzi, notatki recenzenta i dowody oceny w przeglądzie wymagają `runs:view` oraz dostępu do odpowiadającego agenta. Bez któregoś z nich pozostają wynik i status, ale tekst odpowiedzi, uzasadnienia, reguły i cytaty są usuwane. Przed dodaniem cudzej prywatnej rozmowy dialog wskazuje jej właściciela i ostrzega, że czytelnicy datasetu mogący odczytywać runy zobaczą jej tekst.

## Dane osobowe { #personal-data }

Przypadek wzięty z rozmowy jest kopią tego, co napisała osoba, i tego, co
odpowiedział agent. Gdy rozmowa zostanie usunięta, przypadek zostaje, a każde
powiązanie z rozmową jest czyszczone: run, rozmowa i wiadomość, z których
pochodzi. Tekst zostaje i może nadal zawierać dane osobowe wpisane przez kogoś.
Usunięcie przypadku go usuwa.

Gdy osoba, która zadała pytanie przypadku, zostanie wymazana, znika też tekst.
Pytanie, wcześniejsze tury, obie odpowiedzi i notatka są zastępowane w każdej
wersji, która zawiera przypadek, podobnie jak odpowiedzi i wywołania, które ewaluacja
runy zapisały dla niego. Przypadek zachowuje swoje id, oczekiwane wywołania,
sprawdzenia i tagi, i dostaje oznaczenie **Zanonimizowany po usunięciu osoby**,
tak by jego kurator mógł go przepisać albo usunąć. Do tego czasu ewaluacja run go
pomija, bo odpowiedź na placeholder niczego nie mierzy.

Przypadek zapamiętuje, czyje słowa zawiera: kto zadał jego pytanie, kto
napisał każdą z jego wcześniejszych tur i czyj komentarz stał się jego notatką.
Nigdy się tego nie pokazuje ani nie eksportuje, a informacja ta przetrwa
rozmowę, więc wymazanie odnajduje przypadek nawet po usunięciu rozmowy, z której
pochodzi. Przypadek, którego pytanie zadał ktoś inny, zachowuje pytanie i
odpowiedź: tury wymazanej osoby w jego wcześniejszej historii są zastępowane,
razem z odpowiedziami agenta na nie, a jej komentarz zachowany jako notatka jest
czyszczony.

Przypadek zapisany, zanim zaczęto zapamiętywać autorstwo, ma je uzupełnione z
powiązań, które jeszcze miał; taki, którego rozmowy już nie było, nie ma go
wcale i tylko usunięcie przypadku usuwa jego tekst. Zobacz
[Ochrona danych](data-protection.md#what-deletion-reaches).

Wynik jest przechowywany tak samo. Zawiera kopię ocenianej odpowiedzi, do 8000
znaków ze zredagowanymi poświadczeniami, żeby recenzent czytał ją obok
przypadku. Ta kopia wraca w eksporcie osoby, do której należał run, i jest
czyszczona, gdy ta osoba zostanie wymazana. Gdy run, który ocenił, zostanie
usunięty, wynik zostaje bez powiązania z nim, a gdy osoba, która o niego
poprosiła albo o nim rozstrzygnęła, zostanie wymazana, jej nazwisko jest z niego
czyszczone. Uzasadnienie sędziego może cytować ocenianą odpowiedź.

Wygenerowany przypadek, który wciąż czeka na decyzję, nie jest tak
zachowywany. Gdy rozmowa, z której go przygotowano, zostanie usunięta albo
osoba, która zadała pytanie, zostanie wymazana, propozycja jest usuwana razem z
nią: nikt nie zdecydował, że chce ją zachować. Eksport danych osoby zawiera
propozycje wzięte z jej pytań i rozmów. Generowanie z rozmów wysyła
zadane pytania, po redakcji, do dostawcy modelu generatora przypadków, a
generowanie z wiedzy wysyła fragmenty dokumentów - zobacz
[co opuszcza wdrożenie](data-protection.md#what-leaves-the-deployment).