← Wszystkie wpisy

Foundation Models z poziomu Pythona: narzędzie fm CLI

Przez rok duży model językowy Apple działający na urządzeniu pozostawał za murem: można go było osiągnąć wyłącznie z poziomu Swifta i tylko wewnątrz aplikacji zbudowanej w Xcode1. macOS 27 burzy ten mur. Apple dostarcza teraz narzędzie wiersza poleceń o nazwie fm, preinstalowane wraz z systemem operacyjnym, oraz SDK Foundation Models dla Pythona, które instaluje się za pomocą pip1. Model, który dawniej wymagał projektu, kompilacji i LanguageModelSession w skompilowanym Swifcie, dziś odpowiada na jednowierszowe polecenie powłoki i działa wewnątrz notatnika Jupyter. Eric Gourlaouen, inżynier z zespołu Foundation Models Framework, ujął tę zmianę wprost podczas sesji 334 na WWDC26: „do tej pory te modele były dostępne wyłącznie z poziomu kodu Swift”1. Zmianą nie jest nowy model. Zmianą jest to, że ten sam model działający na urządzeniu nagle staje się skryptowalny, automatyzowalny i poddający się ewaluacji spoza aplikacji — bez klucza API i bez kosztów chmury1.

Watch on Apple Developer ↗
Apple przedstawia dwa nowe sposoby sięgnięcia po działający na urządzeniu Apple Foundation Model w systemie macOS: preinstalowane narzędzie wiersza poleceń fm oraz SDK Foundation Models dla Pythona.

W skrócie

  • macOS 27 dostarcza fm, preinstalowane narzędzie wiersza poleceń dla działającego na urządzeniu Apple Foundation Model. Jego podpolecenia obejmują respond (pojedynczy prompt na stdout), chat (sesja interaktywna) oraz schema (definiowanie ustrukturyzowanego wyjścia)1.
  • fm respond udostępnia opcje dotyczące modelu (przełączenie na Private Cloud Compute), wejścia obrazu oraz schematu dla ustrukturyzowanego wyjścia; pozostałe wymienia --help1.
  • SDK dla Pythona sięga po ten sam model działający na urządzeniu z poziomu Pythona; wymaga Pythona 3.10 lub nowszego, zainstalowanego Xcode oraz Maca z Apple Silicon, a instaluje się go za pomocą pip lub innego menedżera pakietów1.
  • SDK odzwierciedla framework Swifta: LanguageModelSession, na którym wywołuje się respond, wywoływanie narzędzi oraz generowanie sterowane za pomocą dekoratora fm.generable przekazywanego do fm.respond jako argument generujący1.
  • Oba interfejsy domyślnie korzystają z zawsze dostępnego modelu działającego na urządzeniu i mogą przełączyć się na większy model Private Cloud Compute, który jest bardziej wydajny, lecz objęty limitami użycia1.
  • Korzyścią są prototypowanie i automatyzacja: skrypty powłoki sortujące pliki według znaczenia oraz potoki ewaluacyjne w Pythonie oceniające warianty promptów za pomocą Pandas i matplotlib1.

Narzędzie wiersza poleceń fm

Otwórz Terminal w macOS 27 i wpisz fm, a narzędzie wypisze obsługiwane polecenia1. Apple wyróżnia trzy z nich. fm respond wysyła do modelu prompt i zwraca odpowiedź. fm chat rozpoczyna interaktywną rozmowę. fm schema tworzy schemat dla ustrukturyzowanego wyjścia1. Najprostszym możliwym zastosowaniem jest to, które Eric pokazał jako pierwsze: wpisz fm respond, wpisz prompt, naciśnij Enter i po chwili odczytaj odpowiedź modelu w terminalu1.

Watch on Apple Developer ↗
Narzędzie jest preinstalowane w macOS 27 i działa w aplikacji Terminal; wpisanie fm wyświetla listę dostępnych poleceń.

Dwa polecenia najwyższego poziomu dzielą się wyraźną linią: eksploracja kontra skryptowanie. fm chat służy do wyczucia pierwszego pulsu modelu. Zadaje się pytanie, zadaje pytanie uzupełniające, a rozmowa jest podtrzymywana — z własnymi poleceniami ze slashem: /model przełącza rozmowę na model Private Cloud Compute, a /save zapisuje rozmowę, aby wznowić ją później1. Gdy zamiast tego potrzebna jest odpowiedź w jednym ciągu, którą da się przechwycić, na przykład w skrypcie, sięga się po fm respond, które zapisuje wyjście modelu na stdout1.

To w fm respond mieszczą się opcje. Eric wymienił trzy z nich wprost. Opcja modelu kieruje prompt do modelu Private Cloud Compute zamiast do domyślnego modelu działającego na urządzeniu. Opcja obrazu dołącza do promptu obraz. Z kolei opcja schematu współpracuje z fm schema object, ograniczając wyjście do zdefiniowanej przez użytkownika struktury1. Zaznaczył, że jest ich więcej, i wskazał opcję pomocy, by wymienić je wszystkie1. Transkrypcja nazywa opcje raczej według ich roli niż dokładnego zapisu każdej flagi (jedyną dosłowną formą pokazaną na ekranie jest fm schema object), więc tam, gdzie poniżej opisuję daną opcję, opisuję udokumentowane zachowanie, a nie zmyślam ciągu flagi.

Wybór modelu to decyzja, która liczy się najbardziej. Domyślnie fm korzysta z modelu działającego na urządzeniu dostarczanego z macOS, który jest zawsze dostępny1. Można przełączyć się na Apple Foundation Model w Private Cloud Compute, który Eric opisał jako „znacznie większy model niż model działający na urządzeniu, więc poradzi sobie lepiej ze złożonymi problemami”, przy czym wiąże się to z limitami użycia1. Wartość domyślna to właściwy punkt wyjścia: jest darmowa, lokalna i bez limitu. Na Private Cloud Compute warto przejść wtedy, gdy zadanie jest naprawdę na tyle trudne, że tego wymaga.

Budowanie skryptu automatyzacji

Demonstracja sortowania plików to najczytelniejszy argument za tym, dlaczego CLI ma znaczenie. Eric miał folder projektu pełen roboczych i finalnych wersji zasobów i chciał powtarzalnego skryptu, który zachowa wersje finalne, utworzy ich kopię zapasową, a wersje robocze przeniesie na dysk archiwalny1. Trudne nie jest przenoszenie plików. Trudne jest rozstrzygnięcie, który plik jest wersją roboczą, gdy nazwy są chaotyczne. Jak to ujął, wywołanie modelu językowego ze skryptu pozwala mu „posortować pliki robocze od finalnych” nawet wtedy, gdy „nazwy są chaotyczne i trudne do przewidywalnego posortowania”1.

Watch on Apple Developer ↗
Praktyczny skrypt: wczytaj pliki z folderu, poproś model o oddzielenie wersji roboczych od finalnych i zadziałaj na podstawie ustrukturyzowanego wyniku JSON, by utworzyć kopię zapasową i zarchiwizować.

Ten kształt uogólnia się na dowolną automatyzację typu „osąd nad listą”. Skrypt wczytuje pliki z katalogu roboczego, a następnie za pośrednictwem fm respond prosi model, by posortował tę listę na dwie grupy: pliki finalne i pliki robocze1. Aby wyjście dało się wykorzystać, skrypt z góry definiuje schemat za pomocą fm schema object, opisując dwa pola — listę wersji finalnych i listę wersji roboczych — i przekazuje ten schemat do fm respond poprzez opcję schematu1. Model zwraca odpowiedź w formie JSON, a skrypt ją odczytuje, by skopiować wersje finalne do kopii zapasowej i przenieść wersje robocze do archiwum1.

Krok ustrukturyzowanego wyjścia jest tym, który dźwiga całą konstrukcję. Odpowiedź w postaci dowolnego tekstu zmusiłaby skrypt do parsowania prozy — najbardziej kruchej części każdego potoku powłoki rozmawiającego z LLM. Deklarując schemat za pomocą fm schema object i otrzymując w zamian JSON, skrypt zyskuje kontrakt, na którym może działać bezpośrednio1. To ten sam wzorzec, który deweloperzy Swifta znają jako generowanie sterowane, tu udostępniony jako opcja CLI1. Każde zadanie kończące się słowami „zrób coś deterministycznego na podstawie decyzji modelu” potrzebuje dokładnie tego kształtu: prompt, schemat, JSON, działanie.

SDK dla Pythona

Drugi interfejs jest dla innej osoby w innej chwili. Jak ujął to Eric, „jeśli jesteś inżynierem uczenia maszynowego, być może używasz Pythona częściej niż Swifta”, a SDK „ułatwia korzystanie z modelu działającego na urządzeniu w kodzie Pythona”1. Cała propozycja opiera się na ekosystemie Pythona: „Python ma bogaty ekosystem pakietów open source do uczenia maszynowego i nauki o danych”, co oznacza, że można pisać potoki ewaluacyjne i „wykorzystać te pakiety do ilościowego określenia jakości funkcji”1.

Instalacja ma cztery wymagania, wszystkie podane w sesji. Potrzebny jest Python 3.10 lub nowszy, zainstalowany Xcode oraz Mac z Apple Silicon, a SDK instaluje się za pomocą pip lub dowolnego innego wybranego menedżera pakietów1. Wymagania dotyczące Apple Silicon i Xcode to sygnał, że pakiet jest powiązaniem z tym samym modelem działającym na urządzeniu, który uruchamia system operacyjny, a nie hostowanym API.

To API wyda się znajome każdemu, kto korzystał z frameworka Swifta2, i jest to zamierzone: „API i abstrakcje szybko wydadzą się znajome”1. Prompt wysyła się, tworząc LanguageModelSession, opcjonalnie przekazując instrukcje, a następnie wywołując session.respond ze swoim promptem; wynik zawiera wyjście modelu1. SDK przenosi podstawowe funkcje frameworka: wejścia tekstowe i obrazowe, odpowiedzi strumieniowe, wywoływanie narzędzi, aby model mógł wchodzić w interakcję z kodem, oraz generowanie sterowane dla ustrukturyzowanego wyjścia1.

Watch on Apple Developer ↗
Przykład aplikacji zakupowej: utwórz LanguageModelSession, wywołaj respond, udostępnij narzędzie pobierające ostatnie zamówienia i ogranicz wyjście dekoratorem fm.generable.

Dwie z tych funkcji zostały omówione konkretnie. W przypadku wywoływania narzędzi Eric zdefiniował narzędzie, które model może wywołać, aby pobrać kilka ostatnich zamówień użytkownika, „tak aby mógł dostarczyć bardziej spersonalizowane informacje” — ten sam wzorzec co protokół Tool w frameworku Swifta1. W przypadku generowania sterowanego użył dekoratora fm.generable, by zdefiniować pożądaną strukturę wyjścia, obiekt ItemsSuggestion, i przekazał go do fm.respond jako argument generujący1. Dekorator jest pythonowym odpowiednikiem makra @Generable ze Swifta, a argument generujący to sposób, w jaki przekazuje się modelowi kształt, który chce się otrzymać z powrotem. Ponieważ transkrypcja pokazuje je poprzez rolę i nazwę obiektu, a nie poprzez wydrukowanie całego ciała klasy, potraktuj ItemsSuggestion jako nadaną w przykładzie nazwę struktury, którą zdefiniowałbyś samodzielnie.

Potoki ewaluacyjne: prawdziwy powód, by używać Pythona

Studium przypadku to moment, w którym SDK dla Pythona przestaje być wygodą, a staje się metodą. Eric budował funkcję przewidującą, co użytkownik chce dodać do koszyka spożywczego, i miał trzy różne implementacje promptu: minimalną, bardziej opisową oraz szczegółową, która rozpisywała pełną listę reguł1. Pytanie, przed którym staje każdy prompt engineer, brzmi: który z nich jest naprawdę najlepszy — a uczciwa odpowiedź wymaga pomiaru, nie gustu.

Watch on Apple Developer ↗
Potok ewaluacyjny w notatniku Jupyter: wygeneruj dane ewaluacyjne za pomocą modelu serwerowego, uruchom trzy warianty promptów, zapisz wejścia i wyjścia w ramce danych Pandas, oceń za pomocą funkcji oceniających i sporządź wykres za pomocą matplotlib.

Apple wyraźnie zaznacza, że deweloperzy Swifta mają tu własną odpowiedź. Framework Evaluations jest dostarczany z Xcode 27 i ułatwia tworzenie ewaluacji oraz śledzenie dokładności funkcji na przestrzeni kolejnych iteracji1. SDK dla Pythona to równoległa ścieżka dla analityków danych, którzy żyją w notatnikach. Eric przeprowadził całą analizę z poziomu Jupytera1.

Potok czyta się jak standardowa pętla ewaluacyjna ML wycelowana w model działający na urządzeniu. Najpierw za pomocą dużego modelu serwerowego wygenerował dane ewaluacyjne, uzyskując dla każdego przypadku wejścia oraz oczekiwane wyjście1. Następnie dla każdego wejścia wygenerował wyjścia z każdej z trzech implementacji promptu i zapisał wejścia oraz wyjścia jako wiersze w ramce danych Pandas1. Z kolei funkcje oceniające oparte na modelu serwerowym oceniły każde wyjście według wybranych przez niego kryteriów, a te metryki wróciły do ramki danych1. Na koniec matplotlib zamienił oceny w wykresy1.

Wykresy opowiedziały historię, której żadne wpatrywanie się w prompty by nie ujawniło: szczegółowy prompt osiągnął wysoki odsetek błędów generowania, co Eric przypisał osiągnięciu maksymalnego rozmiaru okna kontekstowego modelu; dwa mniej szczegółowe prompty dodawały do koszyka nadmiarowe pozycje, podczas gdy szczegółowy dodawał ich mniej; szczegółowy prompt pomijał więcej oczekiwanych pozycji; a minimalny prompt halucynował najwięcej pozycji1. Każdy prompt miał inny tryb awarii, a ujawnił je dopiero pomiar. To właśnie argument przemawiający za całym podejściem. „Dzięki Pythonowi mogę przeprowadzać te iteracje szybko, prosto z notatnika, bez konieczności przebudowywania całego projektu” — powiedział Eric1.

Po co sięgać po każde z nich

Z powyższych kontraktów wynika kilka reguł.

Po fm respond sięgaj wtedy, gdy skrypt powłoki potrzebuje osądu. Sortowanie chaotycznych nazw plików, klasyfikacja wiersza wejścia, wydobycie pola z nieustrukturyzowanego tekstu. Połącz to z fm schema object i opcją schematu, aby skrypt działał na JSON, zamiast parsować prozę1.

Po fm chat sięgaj wtedy, gdy eksplorujesz, a nie skryptujesz. To najszybszy sposób na wyczucie pierwszego pulsu tego, jak model radzi sobie z Twoimi promptami, z /model do przejścia na Private Cloud Compute i /save do zachowania sesji1.

Po SDK dla Pythona sięgaj wtedy, gdy chcesz mierzyć, a nie tylko wywoływać. W chwili gdy masz więcej niż jeden prompt i musisz wiedzieć, który jest lepszy, narzędziem jest pętla notatnik plus Pandas plus matplotlib — model działający na urządzeniu jest bowiem na tyle darmowy i lokalny, że można uruchomić cały zestaw ewaluacyjny bez rachunku1.

Domyślnie korzystaj z modelu działającego na urządzeniu; na Private Cloud Compute przechodź świadomie. Model działający na urządzeniu jest zawsze dostępny i nie ma limitu użycia. Private Cloud Compute jest większy i lepszy w złożonych problemach, ale wiąże się z limitami użycia, więc zachowaj go dla zadań, które na to zasługują1.

Prototypuj tutaj, wdrażaj w Swifcie. Sam Eric ujmuje to tak, że tych narzędzi można używać „obok projektu Xcode, jako sposobu na prototypowanie i ewaluację promptów” albo „samodzielnie, by używać modelu w nowatorski sposób”1. Przykład aplikacji zakupowej prototypuje prompty w Pythonie „przed wdrożeniem ich w Swifcie”1. CLI i SDK skracają pętlę między pomysłem a dowodem; aplikacja wciąż pozostaje miejscem, w którym ląduje funkcja.

FAQ

Czym jest narzędzie wiersza poleceń fm?

fm to narzędzie wiersza poleceń preinstalowane wraz z macOS 27, które sięga po działający na urządzeniu Apple Foundation Model z poziomu aplikacji Terminal1. Jego podpolecenia obejmują respond do wysłania promptu do modelu i wypisania odpowiedzi, chat do rozpoczęcia interaktywnej rozmowy oraz schema do zdefiniowania ustrukturyzowanego wyjścia. Uruchamia się je bez klucza API i bez kosztów chmury, ponieważ domyślny model działa na urządzeniu1.

Jak uzyskać z fm ustrukturyzowany JSON?

Zdefiniuj schemat za pomocą fm schema object, a następnie przekaż ten schemat do fm respond poprzez jego opcję schematu. Model zwraca odpowiedź w postaci JSON zgodnego ze schematem, na którym skrypt może działać bezpośrednio, zamiast parsować dowolny tekst1. Mechanizm ten to wersja CLI generowania sterowanego znanego z frameworka1.

Czego wymaga SDK Foundation Models dla Pythona?

Pythona 3.10 lub nowszego, zainstalowanego Xcode oraz Maca z Apple Silicon1. Instaluje się go za pomocą pip lub innego wybranego menedżera pakietów. Wymagania dotyczące Apple Silicon i Xcode odzwierciedlają fakt, że SDK wiąże się z tym samym modelem działającym na urządzeniu, który uruchamia system operacyjny, a nie wywołuje hostowanego API1.

Czym SDK dla Pythona różni się od frameworka Swifta?

To ten sam model i celowo znajome API w innym języku. Tworzy się LanguageModelSession, wywołuje respond, udostępnia narzędzia i korzysta z generowania sterowanego poprzez dekorator fm.generable przekazywany do fm.respond jako argument generujący1. Powodem, by wybrać Pythona, jest ekosystem: Pandas, matplotlib, Jupyter i reszta stosu do nauki o danych, służące do potoków ewaluacyjnych, których Swift nie osiąga równie bezpośrednio1.

Kiedy powinno się używać Private Cloud Compute zamiast modelu działającego na urządzeniu?

Zarówno fm, jak i SDK domyślnie korzystają z modelu działającego na urządzeniu, który jest zawsze dostępny i nie ma limitu użycia1. Na Private Cloud Compute przełącz się — poprzez opcję modelu w fm respond lub polecenie /model w fm chat — gdy problem jest na tyle złożony, że wymaga większego modelu, godząc się na to, że wiąże się on z limitami użycia1.

Pełny klaster Apple Ecosystem: omówienie frameworka Foundation Models jako swiftowy fundament, który te narzędzia odzwierciedlają; mechanizmy kontroli wywoływania narzędzi w iOS 27 opisujące, jak model używa narzędzi; agentowy przepływ pracy Foundation Models dotyczący wyboru między modelem działającym na urządzeniu a większym modelem; oraz agenty kodujące Xcode 27 ukazujące stronę przepływu pracy skoncentrowanego na agentach wewnątrz IDE. Centrum znajduje się w serii Apple Ecosystem. Szerszy obraz budowania iOS z agentami przedstawia przewodnik po tworzeniu agentów dla iOS.



  1. Apple, WWDC26 session 334, “Build AI-powered scripts with the fm CLI and Python SDK,” presented by Eric Gourlaouen of the Foundation Models Framework team. developer.apple.com/videos/play/wwdc2026/334. Source for: the fm tool pre-installed with macOS 27 and its respond, chat, and schema subcommands; fm chat’s /model and /save commands; fm respond’s model, image, schema, and help options; fm schema object for defining structured output and the JSON result contract; the file-sorting automation script; the on-device versus Private Cloud Compute model choice and the latter’s usage limits; the Python SDK’s requirements (Python 3.10+, Xcode, Apple Silicon, install via pip); LanguageModelSession, session.respond, tool calling, and guided generation via the fm.generable decorator passed to fm.respond as the generating argument; the Jupyter/Pandas/matplotlib evaluation pipeline, the three prompt variants, the judge functions backed by a server model, and the per-prompt failure modes (generation errors at max context window, excess items, missed items, hallucinated items); the Xcode 27 Evaluations framework reference; and the “prototype in Python before implementing in Swift” framing. The Python SDK GitHub repository with example snippets and documentation is referenced in the session but no URL is given on screen, so it is described rather than linked. 

  2. Apple Developer, “Foundation Models” framework overview. The WWDC25 Swift framework that introduced the on-device Apple Foundation Model, LanguageModelSession, guided generation, and the Tool protocol, which the fm CLI and Python SDK mirror on macOS 27. 

Powiązane artykuły

Uruchamianie agentowej AI na Macu z MLX

WWDC 2026: uruchom całą pętlę agentowej AI lokalnie na Macu z MLX, przeskaluj ją na wiele Maców, a następnie zabezpiecz …

13 min czytania

Apple udostępnia framework Foundation Models jako open source

WWDC 2026: framework Foundation Models trafia tego lata do open source, dzięki czemu to samo API Swift działa po stronie…

12 min czytania

Teza CLI

Trzy najważniejsze wątki na HN dotyczące Claude Code prowadzą do jednego wniosku: architektura oparta na CLI jest tańsza…

12 min czytania