Artykuły | maj 28, 2025

Zod & AI – schema validation w projektach AI – przewodnik TypeScript 

W pracy z AI największym wyzwaniem jest często… samo AI. Modele generują dane w różnym formacie, czasem brakuje klucza, czasem typ się nie zgadza – a nasz projekt musi cały czas działać bezbłędnie. Wystarczy drobna zmiana prompta, nowa wersja modelu albo niespodziewany fallback, by struktura danych zaczęła robić problemy w najmniej oczekiwanym momencie.

ZOD AI

Biblioteka Zod 

I właśnie tutaj dobrym rozwiązaniem jest Zod: lekka, szybka biblioteka do walidacji danych dla TypeScript, która pozwala jasno określić, jakich struktur oczekujemy od inputu. Zamiast zgadywać, czy odpowiedź będzie zgodna z oczekiwaniami, po prostu ją walidujemy. Jeśli coś się nie zgadza – dostajemy informację o błędzie i jasny komunikat. Jeśli wszystko gra – możemy bezpiecznie przetwarzać dane dalej. Mamy nad wszystkim kontrolę, jeszcze zanim przekażemy dalej dane do naszej logiki biznesowej.  

Zod działa jak filtr bezpieczeństwa – pozwala odrzucić błędne odpowiedzi, zanim trafią do logiki aplikacji. Dzięki temu zyskujemy nie tylko większą kontrolę, ale też spokój ducha: nawet jeśli AI trochę „zbłądzi”, warstwa frontend to odpowiednio obsłuży i tego nie odczuje.  

Czym jest walidacja danych Zod i dlaczego jest tak ważna?  

Zod to biblioteka TypeScript / JavaScript, która umożliwia tworzenie schematów danych (schemas), wykorzystywanych zarówno do walidacji danych w czasie rzeczywistym, jak i do generowania typów w czasie kompilacji. Dzięki niej możemy opisać strukturę danych, której aplikacja oczekuje, i automatycznie sprawdzić, czy rzeczywiste dane, które przekazaliśmy do inputu spełniają wszystkie nasze założenia.  

W kontekście AI – gdzie dane zwracane przez modele bywają nieprzewidywalne i często nie trzymają się jednej struktury, walidacja staje się wręcz obowiązkowa. Nawet drobna zmiana w odpowiedzi modelu może wywołać błąd w aplikacji, jeśli nasz kod zakłada konkretną strukturę danych. Zod pozwala temu zapobiec, sprawdzając zgodność danych, zanim trafią dalej do logiki biznesowej.  

Przeczytaj także:

Jak używać Zod w aplikacjach opartych na AI? (validation in AI with Zod) 

Zod można zintegrować z dowolną aplikacją JavaScript, zarówno po stronie frontendu, jak i backendu. W kontekście AI najczęściej wykorzystywany jest do:  

  • walidacji odpowiedzi z API (np. OpenAI),  
  • generowania interfejsów dynamicznych,  
  • utrzymywania spójnych kontraktów danych między frontendem a modelem.  

Dzięki helperowi zodResponseFormat w SDK OpenAI możemy łatwo powiązać schemat Zod z odpowiedzią modelu:  

const MathResponse = z.object({
  steps: z.array(z.object({
    explanation: z.string(),
    output: z.string(),
  })),
  final_answer: z.string(),
});

const completion = await client.beta.chat.completions.parse({
  model: 'gpt-4o',
  messages: [...],
  response_format: zodResponseFormat(MathResponse, 'math_response'),
});

Taka integracja sprawia, że odpowiedź modelu jest walidowana automatycznie i możemy bezpiecznie korzystać z jej zawartości w aplikacji.  

Jeśli korzystamy z funkcji narzędzi (tool calls), możemy użyć zodFunction, by automatycznie zmapować argumenty na typy Zod:  

const queryArgs = z.object({ ... });

const completion = await client.beta.chat.completions.parse({
  model: 'gpt-4o',
  messages: [...],
  tools: [zodFunction({ name: 'query', parameters: QueryArgs })],
});

Zod daje nam kontrolę nad strukturą danych – zarówno tych zwracanych przez model, jak i tych przekazywanych do funkcji. Dzięki temu unikamy błędów wynikających z niespójności formatu i mamy większą przewidywalność działania aplikacji.  

Zastosowanie Zod w preprocessingu danych  

Zod sprawdza się nie tylko po stronie odbioru danych z modelu AI, ale również wcześniej – podczas przygotowania danych wejściowych. Preprocessing to moment, w którym możemy upewnić się, że to, co wysyłamy do modelu, jest kompletne, poprawnie sformatowane i zgodne z oczekiwanym typem.  

Typowe zastosowania Zod w preprocessingu:  

  • walidacja danych wprowadzanych przez użytkownika przed wysłaniem zapytania do AI,  
  • konwersja typów, np. zamiana ciągów znaków (stringa) na daty,  
  • czyszczenie i porządkowanie danych z zewnętrznych źródeł, jak API czy formularze.  
const dateSchema = z.string().transform(str => new Date(str));
const parsedDate = dateSchema.parse("2024-08-06"); // => obiekt typu Date

Dzięki funkcji .transform() możemy nie tylko sprawdzić, czy dane mają odpowiedni format, ale też przekształcić wprowadzone dane do postaci, która jest odpowiednio dostosowana do dalszego przetwarzania w aplikacji. To szczególnie przydatne, gdy dane mają służyć jako prompt lub parametr w zapytaniu do modelu AI.  

Preprocessing z użyciem Zod to prosty sposób na zminimalizowanie błędów i zwiększenie kontroli nad danymi, zanim jeszcze trafią do modelu.  

Jak Zod usprawnia deployment modeli AI?  

Zod to nie tylko narzędzie deweloperskie – jego zastosowanie ma realne przełożenie na jakość wdrożeń modeli AI w środowiskach produkcyjnych. Pozwala budować solidny bufor bezpieczeństwa pomiędzy często nieprzewidywalnym modelem AI a wymaganiami naszej aplikacji.  

Biblioteka Zod w procesie deploymentu pomaga:  

  • Zwiększyć odporność aplikacji na zmiany – zmiana prompta, wersji modelu czy struktury danych nie musi oznaczać błędów, jeśli dane przechodzą przez schematy walidacyjne tworzone przez Zoda.  
  • Szybciej debugować problemy – zamiast domyślać się, co poszło nie tak, dostajemy jasne, czytelne komunikaty o błędach.  
  • Pisać testy jednostkowe – schematy Zod mogą pełnić funkcję walidatorów i źródła przykładowych danych wejściowych do testów.  

Zamiast więc opierać się na założeniu, że wszystko w końcowej fazie projektu działa, możemy zbudować system, który rzeczywiście przewiduje błędy i potrafi się przed nimi obronić.  

Z perspektywy wdrożeniowej oznacza to mniej awarii, większą spójność danych i łatwiejsze utrzymanie całego pipeline’u – od prompta po końcowy interfejs użytkownika.  

Kluczowe cechy Zod w JavaScript  

Zod oferuje nowoczesne podejście do walidacji danych w JavaScript i TypeScript. Jego główne zalety to:  

  • Deklaratywność – schematy są czytelne, przejrzyste i proste do napisania. Możemy z łatwością tworzyć złożone struktury bez nadmiaru kodu.  
const UserSchema = z.object({
  name: z.string().min(3),
  age: z.number().int().positive(),
  email: z.string().email(),
});
  • Bezpośrednia integracja z TypeScriptem – Zod automatycznie wyciąga typy z definicji schematów (z.infer), dzięki czemu nie musimy pisać typów dwa razy.  
type User = z.infer<typeof UserSchema>;
  • Walidacja i transformacja w jednym miejscu – możemy nie tylko sprawdzać dane, ale też odpowiednio je przekształcać (np. string → Date, liczba → boolean, itp.).  
const DateSchema = z.string().transform(str => new Date(str));
const parsedDate = DateSchema.parse("2024-08-06");
  • Obsługa błędów – metody safeParse i parse pozwalają wygodnie obsługiwać błędy. Pierwsza nie rzuca wyjątku, a druga daje pełną kontrolę nad błędami typu ZodError.  
const result = UserSchema.safeParse(userData);
if (!result.success) {
  console.log(result.error.format());
}
  • Czytelne komunikaty walidacyjne – błędy można formatować, w pełni kontrolować, mapować i wyświetlać w aplikacjach frontendowych w sposób przyjazny dla użytkownika.  
function formatZodErrors(error: z.ZodError) {
  return error.errors.reduce((acc, err) => {
    const field = err.path.join(".");
    acc[field] = err.message;
    return acc;
  }, {} as Record<string, string>);
}
  • Rozszerzalność – dzięki metodzie .refine() możemy łatwo dodawać własne warunki i logikę walidacyjną.  
const PasswordSchema = z.string()
  .min(8, "Hasło musi mieć min. 8 znaków")
  .refine(val => /\d/.test(val), {
    message: "Hasło musi zawierać cyfrę",
  });
  • Chaining – możemy łączyć wiele reguł walidacyjnych w łańcuchach co ułatwia tworzenie złożonych walidacji, np. .min(3).max(20).regex(…),.  
const NameSchema = z.string()
  .min(3, "Za krótkie")
  .max(50, "Za długie")
  .regex(/^[a-zA-Z\s]+$/, "Tylko litery i spacje");

  • Użyteczność w całym stacku – Zod sprawdza się zarówno walidacji danych użytkownika w formularzach (React Hook Form), jak i walidacji odpowiedzi API czy typów w bazach danych  

Jak zaimplementować walidację formularza z użyciem Zod?  

Zod doskonale integruje się z popularnymi narzędziami do obsługi formularzy, takimi jak React Hook Form. Dzięki temu możemy w prosty sposób połączyć walidację danych z typowaniem w TypeScript i uzyskać czytelny kod oraz spójne komunikaty błędów.  

Załóżmy, że tworzymy prosty formularz rejestracyjny. Najpierw definiujemy schema:  

const RegisterSchema = z.object({
  name: z.string().min(3, "Imię musi mieć co najmniej 3 znaki"),
  email: z.string().email("Niepoprawny adres e-mail"),
  password: z.string()
    .min(8, "Hasło musi mieć co najmniej 8 znaków")
    .refine(val => /\d/.test(val), {
      message: "Hasło musi zawierać cyfrę",
    }),
});

Następnie łączymy schema z formularzem:  

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';

const form = useForm({
  resolver: zodResolver(RegisterSchema),
});

const { register, handleSubmit, formState: { errors } } = form;

W JSX podpinamy pola i wyświetlamy błędy:  

<form onSubmit={handleSubmit(formDetails => console.log(formDetails))}>
  <input {...register("name")} placeholder="Imię" />
  {errors.name && <p>{errors.name.message}</p>}

  <input {...register("email")} placeholder="Email" />
  {errors.email && <p>{errors.email.message}</p>}

  <input {...register("password")} placeholder="Hasło" type="password" />
  {errors.password && <p>{errors.password.message}</p>}

  <button type="submit">Zarejestruj się</button>
</form>

Taka integracja daje nam:  

  • automatyczną walidację pól,  
  • pełne typowanie danych,  
  • spójne i konfigurowalne komunikaty błędów,  
  • prostą integrację z istniejącym kodem Reacta.  
Code Faster Tlo 2

AI w programowaniu | bezpłatny e-book

Zautomatyzuj kodowanie z AI! Pobierz darmowy e-book i odkryj nowe możliwości

Pobierz teraz!

Podsumowanie  

W świecie, gdzie dane generowane przez AI są dynamiczne i często nieprzewidywalne, warto zadbać o silne fundamenty naszych projektów. Zod może pełnić rolę warstwy ochronnej – zapewniając walidację, transformację i typowanie danych w jednym miejscu. To nie tylko techniczny dodatek, ale kluczowy element architektury, który pozwala budować odporne, stabilne i łatwe w utrzymaniu integrację z modelami AI.  

Zod to solidna biblioteka z rosnącą społecznością i aktywnym wsparciem, którą z powodzeniem można wykorzystać nie tylko w integracjach z wykorzystaniem AI, ale także w codziennych projektach frontendowych – od formularzy po obsługę API.  

Mateusz works as a Senior Frontend Developer. He likes to go beyond standard development paths and enjoys reaching out to different technologies to find creative solutions for his ideas. He is most interested in professional boxing, geopolitics and World War II history. He also enjoys fantasy books and good movies.

Zapisz się do newslettera, ekskluzywna zawartość czeka

Bądź na bieżąco z najnowszymi artykułami i wydarzeniami IT

Informacje dotyczące przetwarzania danych osobowych

Zapisz się do newslettera, ekskluzywna zawartość czeka

Bądź na bieżąco z najnowszymi artykułami i wydarzeniami IT

Informacje dotyczące przetwarzania danych osobowych

Zapisz się do newslettera, aby pobrać plik

Bądź na bieżąco z najnowszymi artykułami i wydarzeniami IT

Informacje dotyczące przetwarzania danych osobowych

Dziękujemy za zapis na newsletter — został ostatni krok do aktywacji

Potwierdź poprawność adresu e-mail klikając link wiadomości, która została do Ciebie wysłana w tej chwili.

 

Jeśli w czasie do 5 minut w Twojej skrzynce odbiorczej nie będzie wiadomości to sprawdź również folder *spam*.

Twój adres e-mail znajduje się już na liście odbiorców newslettera

Wystąpił nieoczekiwany błąd

Spróbuj ponownie za chwilę.

    Get notified about new articles

    Be a part of something more than just newsletter

    I hereby agree that Inetum Polska Sp. z o.o. shall process my personal data (hereinafter ‘personal data’), such as: my full name, e-mail address, telephone number and Skype ID/name for commercial purposes.

    I hereby agree that Inetum Polska Sp. z o.o. shall process my personal data (hereinafter ‘personal data’), such as: my full name, e-mail address and telephone number for marketing purposes.

    Read more

    Just one click away!

    We've sent you an email containing a confirmation link. Please open your inbox and finalize your subscription there to receive your e-book copy.

    Note: If you don't see that email in your inbox shortly, check your spam folder.