# SDK

> Klienty Dart / Flutter (anpheros_sdk) i TypeScript (@anpheros/sdk): ten sam kształt, idempotentne tworzenie, ponawianie prób, odświeżanie tokenu i przepływ zgody.

Source: https://developers.anpheros.com/pl/guides/sdks

> Oficjalne biblioteki klienckie dla FHIR R4 API w służbie zdrowia z darmowym piaskownicą FHIR: pacjenci, obserwacje, wyniki badań laboratoryjnych, schorzenia, leki, Międzynarodowy Podsumowanie Pacjenta, zgoda pacjenta i kontekst AI, w TypeScript i Dart / Flutter.

**Anpheros to interoperacyjna infrastruktura danych medycznych do tworzenia aplikacji medycznych, oprogramowania medycznego i usług AI.** Każdy pacjent ma jeden rekord HL7 FHIR R4, którym zarządza; aplikacje, kliniki, laboratoria i agenci AI odczytują i zapisują go za pośrednictwem Anpheros Platform API — za zgodą pacjenta (OAuth 2.1 / SMART on FHIR), z informacją o pochodzeniu przy każdym zapisie i dziennikiem dostępu, który pacjent może przeglądać. Ten repozytorium zawiera oficjalne biblioteki klienckie i przykłady do uruchomienia.

| Język | Pakiet | Instalacja | Źródło |
|---|---|---|---|
| Dart / Flutter | [`anpheros_sdk`](https://pub.dev/packages/anpheros_sdk) | `dart pub add anpheros_sdk` | [`dart/anpheros_sdk`](https://github.com/anpheros/anpheros-sdk/tree/main/dart/anpheros_sdk) |
| TypeScript (Node 18+, przeglądarki, Deno, Bun) | [`@anpheros/sdk`](https://www.npmjs.com/package/@anpheros/sdk) | `npm install @anpheros/sdk` | [`ts`](https://github.com/anpheros/anpheros-sdk/tree/main/ts) |

## Szybki start w 2 minuty

1. **Uzyskaj darmowy klucz sandboxowy:** zaloguj się na [pulpicie nawigacyjnym](https://platform.anpheros.com/dashboard/) i naciśnij **Get a sandbox key** (`sk_test_…`). Twój sandbox zawiera 30 syntetycznych pacjentów.
2. **Sprawdź, czy działa:**

   ```bash
   curl -H "Authorization: Bearer $ANPHEROS_KEY" "https://platform.anpheros.com/fhir/R4/Patient?_count=3"
   ```

3. **Zainstaluj SDK i odczytaj rekord:** `npm install @anpheros/sdk` lub `dart pub add anpheros_sdk`, a następnie uruchom kod w sekcji [Connect](#connect) lub sklonuj [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts).

## Dla kogo jest przeznaczony

Dla deweloperów tworzących aplikacje zdrowotne dla pacjentów i ich rodzin, zaplecza aplikacji medycznych, integracje kliniczne i laboratoryjne oraz asystentów lub agentów AI, którzy potrzebują ustrukturyzowanego kontekstu medycznego pacjenta – bez konieczności tworzenia od podstaw bazy danych medycznych, systemu zgód i ścieżki audytu.

## Uzyskaj klucz sandbox

Sandbox jest bezpłatny i dostępny samoobsługowo. Zaloguj się za pomocą Google na [dashboard](https://platform.anpheros.com/dashboard/) i naciśnij **Get a sandbox key**: natychmiast otrzymasz projekt sandbox i klucz. Każdy projekt sandbox zawiera 30 syntetycznych pacjentów — sześć miesięcy historii chorób, leków, alergii, wyników laboratoryjnych i parametrów życiowych — które możesz dowolnie modyfikować i resetować w dowolnym momencie. Klucze sandbox (`sk_test_…`) nigdy nie uzyskują dostępu do rzeczywistych danych pacjentów.

Po przejściu na produkcję, środowisko produkcyjne jest przeznaczone dla zweryfikowanych organizacji z umową o przetwarzaniu danych, a produkcja zaczyna się od 99 € miesięcznie z pierwszym miesiącem bezpłatnie ([pricing](https://developers.anpheros.com/pl/guides/pricing)).

## Połączenie

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });   // sk_test_… in the sandbox
const { data: patients } = await anpheros.patients.list();
const labs = await anpheros.observations.list(patients[0].id, { category: 'laboratory', limit: 10 });
const ctx = await anpheros.context.build({ patient: patients[0].id, task: 'weekly check-in', budget_tokens: 1500, format: 'text' });
```

```dart
import 'package:anpheros_sdk/anpheros_sdk.dart';

final anpheros = Anpheros(auth: AnpherosAuth.apiKey('sk_test_…'));
final patients = await anpheros.patients.list();
final labs = await anpheros.observations.list(patients.data.first.id, category: 'laboratory', limit: 10);
```

Klucze API należą do serwerów. Aplikacja działająca w imieniu osoby korzysta zamiast tego z OAuth: oba zestawy SDK implementują przepływ zgody (kod autoryzacji + PKCE) i automatycznie odświeżają tokeny.

## Zakres pakietów SDK

Oba pakiety obejmują całą publiczną powierzchnię (`/v1`, `/fhir/R4`, `/oauth/token`, `/oauth/revoke`) o tym samym kształcie: `patients`, `observations`, `conditions`, `medications`, `documents`, `timeline`, `provenance`, `context`, `grants`, `terminology` i surowe `fhir`. Test kończy się niepowodzeniem kompilacji, gdy publiczna trasa jest pominięta w jednym z pakietów SDK lub gdy pakiet SDK wywołuje trasę, której serwer nie posiada.

Oba pakiety SDK: automatyczne `Idempotency-Key` przy tworzeniu, ponawianie prób z wycofywaniem przy błędach 429/5xx, jedno odświeżenie tokenu przy błędzie 401, typowane błędy z identyfikatorem żądania, pomoc w PKCE i przepływ zgody.

## Dane medyczne i FHIR

Rekord składa się ze standardowych zasobów FHIR R4 — 26 typów, w tym `Observation`, `Condition`, `MedicationStatement`, `DocumentReference`, `Immunization` i `AllergyIntolerance` — zakodowanych za pomocą LOINC, ICD-10, ATC i UCUM. REST API (`/v1`) i FHIR API (`/fhir/R4`) odczytują i zapisują te same zasoby z tymi samymi identyfikatorami; `fhir` w obu SDK zapewnia surowy dostęp do FHIR (wyszukiwanie, transakcje, `$everything`, `$summary`, `$validate`).

## Przykłady

| Przykład | Pokazuje |
|---|---|
| [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts) | zapis i odczyt rekordu: pomiary, wynik laboratoryjny, diagnoza, lek, oś czasu, wyszukiwanie FHIR, IPS, kontekst AI |
| [quickstart-dart](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-dart) | to samo z Dart / Flutter |
| [consent-app-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/consent-app-ts) | aplikacja internetowa, która prosi o zgodę (OAuth 2.1 + PKCE) i odczytuje rekord osoby |
| [ai-context-llm](https://github.com/anpheros/anpheros-sdk/tree/main/examples/ai-context-llm) | pytanie dotyczące rekordu, na które odpowiada wybrany model (lokalny lub hostowany) |
| [fhir-transaction](https://github.com/anpheros/anpheros-sdk/tree/main/examples/fhir-transaction) | pakiet transakcyjny FHIR R4 i wynikowe International Patient Summary |

Przykłady działają na darmowym środowisku sandbox, gdzie każdy projekt sandbox ma własnych 30 syntetycznych pacjentów — zobacz [Uzyskaj klucz sandbox](#get-a-sandbox-key).

## Powiązane repozytoria

| Repozytorium | Opis |
|---|---|
| [fhir-api-openapi](https://github.com/anpheros/fhir-api-openapi) | Specyfikacja OpenAPI 3.1 i kolekcja Postman API |
| [mcp-server](https://github.com/anpheros/mcp-server) | Hostowany serwer FHIR MCP dla agentów AI: konfiguracje dla Claude, Cursor, VS Code |
| [agent-skills](https://github.com/anpheros/agent-skills) | Umiejętności agenta, wtyczka Claude Code, reguły Cursor i AGENTS.md |
| [fhir-synthetic-patients](https://github.com/anpheros/fhir-synthetic-patients) | 30 syntetycznych pacjentów jako pakiety FHIR R4 i NDJSON |
| [ips-examples](https://github.com/anpheros/ips-examples) | Dokumenty International Patient Summary w FHIR R4 |
| [fhir-validate-action](https://github.com/anpheros/fhir-validate-action) | Akcja GitHub, która waliduje FHIR R4 JSON w CI |
| [lab-results-to-fhir](https://github.com/anpheros/lab-results-to-fhir) | CLI: raporty laboratoryjne CSV / HL7 v2 → obserwacje FHIR |
| [healthcare-app-starters](https://github.com/anpheros/healthcare-app-starters) | Szablony aplikacji zdrowotnych Next.js i Flutter |

## Zgodność

Surowe wyniki testów, opublikowane w celu ich weryfikacji (wyniki testów, nie certyfikaty): [conformance/](https://github.com/anpheros/anpheros-sdk/tree/main/conformance). W dniu 28 września 2026 roku grupa Standalone Launch zestawu testowego Inferno SMART App Launch STU2 (v1.0.3) przeszła 22 z 22 testów na platformie. Uruchomienie EHR nie jest obsługiwane.

## Dokumentacja

- [Przewodniki dla deweloperów](https://developers.anpheros.com/guides/)
- [Pierwsze kroki](https://developers.anpheros.com/pl/guides/getting-started)
- [Sandbox FHIR](https://developers.anpheros.com/pl/guides/fhir-sandbox)
- [Healthcare API](https://developers.anpheros.com/pl/guides/healthcare-api)
- [Platforma Healthcare API](https://developers.anpheros.com/pl/guides/healthcare-api-platform)
- [Platforma FHIR](https://developers.anpheros.com/pl/guides/fhir)
- [Przewodnik po SDK](https://developers.anpheros.com/pl/guides/sdks)
- [Referencje API (OpenAPI)](https://developers.anpheros.com/docs)
- [Dla asystentów AI](https://developers.anpheros.com/llms.txt)
- [Anpheros](https://anpheros.com/)

## Problemy i bezpieczeństwo

Zgłaszaj błędy w issues tego repozytorium. Nigdy nie umieszczaj kluczy API, tokenów ani danych pacjentów w zgłoszeniu. Zgłoszenia dotyczące bezpieczeństwa: contact@anpheros.com.

## Licencja

Apache License 2.0 — patrz plik `LICENSE` każdego pakietu. Copyright 2026 Anpheros.

## @anpheros/sdk

Klient TypeScript dla **Anpheros Platform**: rekord zdrowia pacjenta zgodny ze standardem FHIR R4, izolacja projektów, zgoda pacjenta (OAuth 2.1 / SMART on FHIR), śledzenie pochodzenia przy każdej operacji zapisu oraz API kontekstu AI. Działa wszędzie tam, gdzie `fetch` (Node 18+, przeglądarki, Deno, Bun).

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });
const { data: patients } = await anpheros.patients.list();
const labs = await anpheros.observations.list(patients[0].id, { category: 'laboratory', limit: 10 });
const ctx = await anpheros.context.build({ patient: patients[0].id, task: 'weekly check-in', budget_tokens: 1500, format: 'text' });
```

Działanie w imieniu osoby:

```ts
import { OAuthFlow, OAuthAuth, generatePkce } from '@anpheros/sdk';

const flow = new OAuthFlow({ baseUrl: BASE, clientId: 'client_…', redirectUri: 'https://myapp.example/callback' });
const pkce = await generatePkce();
location.href = flow.authorizeUrl({ scopes: ['patient/Observation.rs?category=laboratory', 'offline_access'], state, pkce, lang: 'ro' });
// on the callback:
const tokens = await flow.exchange(code, pkce);
const anpheros = new Anpheros({ auth: new OAuthAuth({ tokens, onRefresh: flow.refresh, onTokens: persist }) });
```

Błędy są `AnpherosError` (`status`, `type`, `message`, `field`, `requestId`). Tworzenie wysyła `Idempotency-Key`; błędy 429/5xx są ponawiane; wygasłe tokeny są odświeżane raz, a wywołanie ponawiane.

## anpheros_sdk

Klient Dart / Flutter dla **Anpheros Platform**: backend danych medycznych z rekordem FHIR R4
na pacjenta, izolacją projektów, zgodą pacjenta (OAuth 2.1 / SMART on FHIR), śledzeniem pochodzenia każdego
zapisu i API kontekstu AI.

```dart
import 'package:anpheros_sdk/anpheros_sdk.dart';

final anpheros = Anpheros(auth: AnpherosAuth.apiKey('sk_test_…'));      // server / sandbox

final patients = await anpheros.patients.list();
final elena = patients.data.first;
final labs = await anpheros.observations.list(elena.id, category: 'laboratory', limit: 10);
final ctx = await anpheros.context.build(ContextRequest(patient: elena.id, task: 'weekly check-in', budgetTokens: 1500));
```

## Działanie w imieniu osoby (aplikacje)

```dart
final flow = OAuthFlow(baseUrl: 'https://…', clientId: 'client_…', redirectUri: 'myapp://callback');
final pkce = Pkce.generate();
final url = flow.authorizeUrl(scopes: ['patient/Observation.rs?category=laboratory', 'patient/MedicationStatement.r', 'offline_access'],
                              state: 'abc', pkce: pkce, lang: 'ro');
// open `url`; on return with ?code=…:
final tokens = await flow.exchange(code: code, pkce: pkce);
final anpheros = Anpheros(auth: AnpherosAuth.oauth(
  accessToken: tokens.accessToken, refreshToken: tokens.refreshToken, expiresAt: tokens.expiresAt,
  onRefresh: flow.refresh, onTokens: persist));
final meds = await anpheros.medications.listMedications(tokens.patient!);
```

Każdy obiekt zawiera `fhir` (jego referencję `/fhir/R4`); `anpheros.fhir` zapewnia surowy dostęp do FHIR
(odczyt, wyszukiwanie, tworzenie, transakcja, `$everything`, `$summary`, `$validate`).

Błędy są `AnpherosException` z `status`, `type`, `message`, `field` i `requestId`.
Tworzenie automatycznie wysyła `Idempotency-Key`; błędy 429/5xx są ponawiane z wycofaniem (backoff); wygasłe tokeny OAuth
są odświeżane raz, a wywołanie jest ponawiane.
