Skille¶
Skill to wiedza praktyczna zapisana raz i podpięta do wielu agentów: jak obsługuje się zwroty pieniędzy, jaki jest styl firmowy, jakie sprawdzenia musi przejść raport, zanim pójdzie na zewnątrz.
Zastępuje pole z instrukcjami, które rośnie.
Dwadzieścia procedur w jednym prompcie oznacza, że każdy run płaci za wszystkie dwadzieścia, a dwudziesta pierwsza wypycha rozmowę poza okno kontekstu. Skille odwracają tę zależność:
flowchart LR
A["the agent's capability catalog<br/><i>names + one-line descriptions only</i>"] --> B{is one relevant?}
B -->|no| Z["no body loaded"]
B -->|yes| C["load_capability - the body"]
C --> D{does the body<br/>point at a file?}
D -->|no| Z2[answer]
D -->|yes| E["read_skill_resource - one file beside it"]
E --> Z2
Dwadzieścia skilli kosztuje mniej więcej dwadzieścia opisów zamiast dwudziestu procedur.
Wykrywanie jest tanie, ale nie darmowe
Każdy podpięty skill siedzi w katalogu capability, który model czyta w każdej turze — jako nazwa i jednolinijkowy opis. Podpięcie skilla kosztuje więc tokeny niezależnie od tego, czy model kiedykolwiek go otworzy.
To linijka na skilla zamiast całej treści na skilla i dlatego rachunek się spina. Nie jest to jednak powód, żeby podpinać nieograniczony katalog.
Druga połowa sensu to kto je pisze. Skill jest wierszem w bazie danych, edytowalnym w UI, więc szef wsparcia może poprawić politykę zwrotów we wtorek po południu. Bez deployu, bez pull requesta, bez inżyniera.
Skill, plik kontekstowy czy kolekcja wiedzy?
Skill to procedura, którą model wczytuje, kiedy uzna, że przyszło na nią zadanie. Plik kontekstowy to wiedza stała — krótka, zawsze istotna, wstrzykiwana albo czytana na żądanie. Kolekcja wiedzy to korpus zbyt duży, żeby go przeczytać, dostępny przez wyszukiwanie.
Kształt¶
---
name: refund-policy
description: When a refund is given without asking, when it needs approval, and how to say no.
category: support
---
# Refunds
Most refund questions are decided by the order date and one exception. Check
those before escalating anything.
Strona **Skills** pokazuje na karcie początek treści każdego skilla — bez front
matter, kilka linii — a za nim po jednym arkuszu na każdy plik, który skill ze
sobą niesie. `GET /api/v1/skills` zwraca ten początek jako `excerpt`; samą treść
wczytuje dopiero otwarcie skilla.
## Decide without asking
...
description to pole, które decyduje, czy skill kiedykolwiek zostanie wczytany
To jedyna część, którą model widzi za darmo. Napisz je jako kiedy po to sięgnąć, a nie jako tytuł.
Skill może nieść zasoby — kolejne pliki obok niego, wczytywane na żądanie.
refund-policy ma przy sobie exceptions.md, a treść mówi, kiedy do niego
zajrzeć.
To to samo stopniowe odsłanianie, tylko poziom niżej: szczegół potrzebny tylko części rozmów nie musi siedzieć w treści, którą wczytuje każda istotna rozmowa.
category to jedna z dwudziestu sugestii (support, engineering, finance,
legal, security, marketing, …) i steruje filtrem na liście skilli. Nie ma
wpływu na to, co widzi agent — model wybiera po description, nigdy po
kategorii.
Jak agent go czyta¶
Przez capability skills. Każdy skill, który
agent dostaje, staje się osobną capability — wypisaną modelowi z nazwy i opisu,
a otwieraną na żądanie:
| Jak | Co robi |
|---|---|
| Katalog capability | Nazwy i jednolinijkowe opisy wszystkiego, co jest podpięte do tego agenta |
load_capability |
Pełna treść jednego skilla, wciągnięta do rozmowy |
read_skill_resource |
Jeden plik obok skilla |
load_capability jest narzędziem samego frameworka agentowego, a nie czymś, co
publikuje ta platforma — spec go więc nie przyznaje i nie zmienia mu nazwy. Może go
natomiast bramkować, bo to wywołanie otwiera skilla: tool_approval na nim jest
sposobem, w jaki agent pyta człowieka, zanim skill trafi do modelu, a spec, który
bramkował dawne load_skill, jest na nie migrowany, zamiast zostać bez bramki. Jako
własne narzędzie ta capability wnosi read_skill_resource, i tylko wtedy, gdy
przynajmniej jeden z podpiętych skilli wiezie ze sobą plik do odczytania.
Spec podpina skille po id w skill_ids, więc agent widzi te, które dostał, i nic
poza tym.
Prosto ze skilla. Każda karta na stronie Skille ma Dodaj do agenta: wybierasz agenta, a skill trafia do jego szkicu razem z włączoną capability Skille, gotowy do opublikowania w Builderze. Karta mówi też, którzy agenci używają skilla - albo że jeszcze żaden. Pliki kontekstu i bazy wiedzy mają to samo.
Nazwa skilla to id, pod którym model go ładuje, więc ma formę, w jakiej
modele piszą id: małe litery i cyfry połączone pojedynczymi myślnikami, na przykład
refund-policy. Nazwa ze spacjami lub wielkimi literami jest odrzucana przy
tworzeniu skilla. Nazwę, którą model musiałby odtworzyć dokładnie, jak
Refund policy, ładował jako refund-policy, a dwie błędne próby kończą turę
(#1911).
Skill nie może nazywać się tak jak capability. Każdy jest zapisany pod własną
nazwą w tej samej przestrzeni co knowledge, planning i reszta, więc skill o
nazwie planning na agencie, który ma też capability planning, to duplikat, który
framework odrzuca przed pierwszym tokenem. Utworzenie takiego jest odrzucane, tak
samo jak publikacja agenta podpiętego do skilla o takiej nazwie.
Włączenie capability bez podpiętych skilli nie ma sensu — albo daj agentowi skille, albo zostaw capability wyłączoną.
W workspace skill to także pliki¶
Agent, który ma jednocześnie skille i workspace, dostaje każdy skill zapisany również w nim:
/workspace/skills/<name>/SKILL.md the body, with its name and description
/workspace/skills/<name>/<resource> each resource, beside it
To właśnie sprawia, że skrypt w skillu jest do czegokolwiek. Skill, którego
zasobem jest reconcile.py, był wcześniej podawany modelowi jako tekst, który
mógł zacytować, ale nie uruchomić, podczas gdy ten sam agent miał execute w
odległości jednego wywołania narzędzia. Na dysku — działa.
Nie ma run_skill_script
Własne execute sandboksa niesie już reguły uprawnień workspace'u i limity
operatora. Drugi sposób uruchamiania rzeczy byłby drugim zestawem reguł do
pomylenia.
Agent może zaproponować zmianę; wprowadza ją człowiek¶
Te pliki są zapisywalne, a to, co agent zapisze, nie zostaje zastosowane.
Skill to instrukcje, którymi w każdym runie kieruje się każdy podpięty do niego agent. Agent, który mógłby go edytować bezpośrednio, mógłby przepisać to, co robi inny agent, wewnątrz rozmowy, której nikt nie przegląda, a kolejny czytelnik nie miałby jak odróżnić przemyślanego ulepszenia od zahalucynowanego.
Dlatego zapis staje się propozycją i pojawia się nad listą na stronie Skills
każdemu, kto ma skills:edit:
- Apply przepisuje skilla i podbija jego wersję, która dociera do każdego podpiętego agenta przy jego następnym runie.
- Discard zachowuje zapis. Agent proponujący w kółko tę samą zmianę mówi komuś coś o skillu, a usunięty wiersz czyni to niewidocznym.
Decyzja o propozycji jest ostateczna
Zastosowanie dwa razy podbiłoby wersję wobec treści już zapisanej, a odrzucenie czegoś zastosowanego mówiłoby czytelnikowi, że nigdy nie weszło.
Propozycja niesie całą treść, a nie diff, więc recenzent kilka tygodni później porównuje dwie kompletne wersje, zamiast nakładać łatkę w miejscu, do którego nigdy nie była przeznaczona.
Dwie rzeczy zostają odrzucone, zamiast być zgadywane: katalog utworzony przez
agenta bez SKILL.md w środku oraz taki, któremu agent zepsuł frontmatter. A
usunięty zasób celowo nie jest zmianą, bo plik, którego model nigdy nie
dotknął, i taki, który zamierzał usunąć, zostawiają po sobie ten sam brak.
Trzy tury jednej rozmowy dopracowujące ten sam skill zostawiają jedną propozycję, nie trzy. Recenzent zapytany trzy razy o to samo dostał więcej pracy, a nie więcej informacji. Propozycje z workspace mają te same limity metadanych co zapisane skille: nazwa od 1 do 64 znaków i opis do 500 znaków. Zmiana poza limitem jest pomijana z ostrzeżeniem; oryginalne pliki pozostają bez zmian. Zapis propozycji używa savepointu, więc odrzucona propozycja nie wycofa tury ani nie zablokuje zapisania jej statusu i kosztu.
Jak skille trafiają do organizacji¶
Napisz go. Skills → New, w UI. To zwykła droga.
Te dołączone już tam są. Repozytorium dostarcza cztery: trzy przykłady z
rozwiązaniem — refund-policy, code-review i incident-report — oraz
artifact-pages, który uczy agenta budować stronę dla capability
Aplikacje. Każda organizacja zaczyna z nimi. Utworzenie organizacji kopiuje całą dostarczoną
bibliotekę jako zwykłe skille, należące do właściciela (owner) organizacji i
widoczne dla organizacji.
Strona skilli pokazuje jedną listę, z odznaką built-in przy wszystkim, czego
nazwa pasuje do dostarczonej biblioteki. Tych czterech się nie wybiera — one po
prostu przychodzą, raz, przy tworzeniu organizacji.
I od tej chwili są wasze. Zaseedowany skill to zwykły wiersz: można go edytować, wyłączyć albo usunąć. Nic nie przywraca usuniętego.
To jest zmiana. Lista wcześniej sama się uzupełniała — dokopiowywała każdą dołączoną nazwę, której organizacja nie miała, przy każdym otwarciu strony — więc usunięty built-in wracał przy następnej wizycie, a wyłączenie było jedynym sposobem na jego wycofanie. Oznaczało to też stronę, która zapisuje wiersze w trakcie czytania. Galeria jest miejscem, w którym wybiera się skill, a komenda seed poniżej jest sposobem, w jaki deployment rozsyła nowy dołączony skill świadomie.
Organizacja utworzona przed nowym dołączonym skillem nie dostanie go sama
Uruchom dla niej seed-skills albo zainstaluj skill z galerii. Obie drogi są
świadome i o to chodzi: nic nie pojawia się przy wczytaniu strony.
Komenda seed robi to samo z terminala, na potrzeby skryptowanych instalacji:
uv run agenticos cmd seed-skills # every organization
uv run agenticos cmd seed-skills --org <org-id> # one
uv run agenticos cmd seed-skills --dry-run # say what would happen, do nothing
uv run agenticos cmd seed-skills --replace # also overwrite copies edited here
Instaluje to, czego brakuje, i odświeża to, czego nikt nie edytował. Każda
kopia zapamiętuje, z której wersji dołączonego skilla została zapisana, więc gdy
wydanie ulepsza dołączony skill, nieruszana kopia w organizacji jest zastępowana
nową — razem z plikami, z podbitą wersją i wpisem audytu skill.refreshed.
Kopia edytowana na miejscu zostaje dokładnie taka, jaka jest, więc edytowana
polityka zwrotów przeżywa ponowny seed; --replace to jedyny sposób, żeby wziąć
dołączoną wersję zamiast takich edycji, a wpis audytu to odnotowuje. Kopia
zrobiona, zanim wersje były zapisywane, i różna od dołączonej też jest zgłaszana i
zostawiana, bo nic nie powie, czy ktoś ją edytował.
Komenda wypisuje, co zrobiła z każdym skillem, a --dry-run wypisuje ten sam plan
bez zapisywania.
e2e/seed.setup.ts tworzy jednego również przez UI i to na nim opiera swoje
asercje zestaw E2E.
Galeria — siedemdziesiąt kolejnych i żaden nie przychodzi nieproszony¶
Skills → Skill gallery otwiera katalog gotowych skilli pogrupowanych według branż: ochrona zdrowia, finanse i ubezpieczenia, e-commerce i print on demand, zespoły software'owe, sektor publiczny i usługi komunalne, usługi prawne i profesjonalne, produkcja i logistyka. Po dziesięć w każdej.
Wybierz branżę, a potem zainstaluj jeden skill albo całą półkę. Od tej chwili to zwykły skill, który organizacja posiada i edytuje, dokładnie jak dołączony.
Galeria działa na zaproszenie i na tym polega cała różnica
Dołączona czwórka mieszka w app/core/catalog/skills/ i jest kopiowana
automatycznie do każdej organizacji. Galeria mieszka w
app/core/catalog/skill_gallery/ i nie jest kopiowana do żadnej — czyta
ją ten sam parser, z drugiego katalogu, i nigdy nie jest seedowana.
Siedemdziesiąt branżowych skilli w pierwszym katalogu byłoby siedemdziesięcioma wierszami, o które nikt nie prosił, w każdym tenancie, przy następnym deployu.
Instalacja półki, z której masz już jeden skill, instaluje resztę i zostawia tamten w spokoju: istniejąca nazwa jest pomijana, a nie nadpisywana, a odpowiedź na żądanie mówi, co zainstalowano, co pominięto i jakiego klucza ten deployment nie dostarcza.
Dodanie do galerii wygląda tak samo jak dodanie dołączonego skilla — katalog z
SKILL.md, pod branżą, do której należy — z jedną dodatkową regułą: jego nazwa
nie może kolidować z dołączonym skillem ani z innym skillem z galerii, i jest
nazwą jego katalogu. Instalacja dopasowuje po nazwie, więc kolizja oznaczałaby
ciche pomijanie na zawsze. Test czyta całą siedemdziesiątkę i wywala się na
każdym z tych błędów.
Seed tworzy kopie¶
Zaseedowany skill to zwykły skill należący do organizacji, edytowalny od chwili, w której organizacja istnieje. To kopia, nie link.
To celowe. Sens skilla polega na tym, że szef wsparcia może poprawić politykę zwrotów bez deployu, a żywy link do kopii z repozytorium odebrałby dokładnie to — organizacja czytałaby plik, który może zmienić tylko inżynier.
Edycja i usunięcie są ostateczne w zwykły sposób. Wyłączanie nadal istnieje dla skilla, który organizacja chce zachować, ale nie uruchamiać — respektuje je każdy agent — przestało jednak być jedynym sposobem na pozbycie się built-ina.
Dlaczego biblioteka jest dołączona, a nie pobierana¶
Dodanie skilla do dostarczanej biblioteki albo do galerii to deploy.
Alternatywa — import z URL-a gita — kosztuje ruch wychodzący z backendu, parser
wycelowany w czyjeś repozytorium i obietnicę dotyczącą treści, której nikt tutaj
nie przeczytał. Każdy katalog w app/core/catalog/skills/ i
app/core/catalog/skill_gallery/ jest tą samą małą obietnicą, którą składa
katalog MCP: ktoś na to spojrzał.
Skille czy wiedza?¶
Odpowiadają na różne pytania, a różnica ma znaczenie, kiedy agent dostanie nie to, co trzeba.
| Skille | Wiedza | |
|---|---|---|
| Zawiera | Procedurę — jak to robimy | Dokumenty — co wiemy |
| Pisane przez | Człowieka, świadomie | Wciągane hurtowo |
| Pobierane przez | Model wybierający nazwę | Wyszukiwanie semantyczne po chunkach |
| Cytuje | Nic; jest instrukcją | Fragment i jego źródło |
| Skala | Dziesiątki | Tysiące dokumentów |
Co jest czym
„Zwroty powyżej 500 £ wymagają zgody menedżera” to skill. Podpisana umowa, która tak stanowi, to wiedza.
Agent obsługujący zwroty zwykle chce obu naraz, a te dwie capabilities
składają się w całość — skills na procedurę, knowledge na dowód.
Dostęp¶
Skille są zasobami w zakresie organizacji, rządzonymi tak jak agenty i kolekcje: widoczność plus granty na poszczególnych wierszach na wierzchu roli. Zobacz Uprawnienia.
Podpięcie skilla wypożycza go
Każdy run agenta czyta treść i pliki, niezależnie od tego, kto go uruchomił —
więc publikacja wymaga, żeby to publikujący miał skills:view na tym
wierszu.
To sprawdzenie idzie przez resolve_access, więc grant się liczy: członek, z
którym udostępniono jeden skill, może go podpiąć bez awansu roli.
Skill, do którego nie sięga, zostaje odrzucony jako Skill not found: <id>,
sformułowane identycznie jak dla id, które nie istnieje. Skille podpina się po
UUID z API i z ręcznie edytowanego draftu, a nie tylko wybiera z listy w
Builderze, a odrzucenie brzmiące inaczej mapowałoby prywatne skille organizacji,
zgadywanie po zgadywaniu.
To samo sprawdzenie działa na skill_ids
specjalisty inline i jest
raportowane wraz z nazwą specjalisty.
W czasie runa nic nie jest sprawdzane ponownie. Skille z zamrożonego speca są rozwiązywane wewnątrz organizacji runa i wręczane agentowi — zgodnie z regułą, którą kolekcje i delegaci już stosują, że referencja jest sprawdzana raz, przy publikacji.
Alternatywa jest gorsza na dwa konkretne sposoby:
- Każdy kontekst bez podmiotu — klucz API, osadzony widget, wiadomość z kanału —
zostaje z założenia odrzucony przez
resolve_access, więc sprawdzanie przy każdym uruchomieniu zdarłoby każdy skill dokładnie z tych powierzchni. - Tam, gdzie podmiot jest, jedna opublikowana wersja dawałaby członkowi — którego rola sięga wyłącznie udostępnionych skilli — chudsze instrukcje niż daje budującemu, a różnica nie byłaby widoczna nigdzie.
Skill usunięty albo wyłączony po publikacji jest pomijany z ostrzeżeniem, zamiast wywracać run. Agent jest mniej zdolny, nie zepsuty.
Podsumowanie¶
- Skill to procedura, napisana przez człowieka i wczytywana tylko wtedy, gdy model uzna jego description za istotny — wykrywanie kosztuje linijkę na skilla, a treść nie kosztuje nic, dopóki nie zostanie otwarta.
- W workspace'ie skill to także pliki i to właśnie czyni jego skrypty uruchamialnymi.
- Agent proponuje zmianę; człowiek ją stosuje, raz, a decyzja jest ostateczna.
- Podpięcie skilla wypożycza go, więc publikujący musi móc go zobaczyć — a w czasie runa nic nie jest sprawdzane ponownie.
- Galeria to siedemdziesiąt gotowych skilli według branż, instalowanych na życzenie — w odróżnieniu od dołączonej trójki, która przychodzi sama.