# SDK

> Клієнти Dart / Flutter (anpheros_sdk) та TypeScript (@anpheros/sdk): однакова структура, ідемпотентні створення, повторні спроби, оновлення токенів та потік згоди.

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

> Офіційні клієнтські бібліотеки для FHIR R4 healthcare API з безкоштовним FHIR sandbox: пацієнти, спостереження, результати лабораторних досліджень, стани, медикаменти, International Patient Summary, згода пацієнта та контекст ШІ, на TypeScript та Dart / Flutter.

**Anpheros — це інтероперабельна інфраструктура медичних даних для створення медичних додатків, програмного забезпечення та сервісів ШІ.** Кожен пацієнт має один запис HL7 FHIR R4, який він контролює; додатки, клініки, лабораторії та агенти ШІ читають і записують його через Anpheros Platform API — за згодою пацієнта (OAuth 2.1 / SMART on FHIR), з відстеженням походження кожного запису та журналом доступу, який може бачити пацієнт. Цей репозиторій містить офіційні клієнтські бібліотеки та приклади, що запускаються.

| Мова | Пакет | Встановлення | Джерело |
|---|---|---|---|
| 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+, браузери, 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) |

## Швидкий старт за 2 хвилини

1. **Отримайте безкоштовний ключ для пісочниці:** увійдіть на [dashboard](https://platform.anpheros.com/dashboard/) та натисніть **Get a sandbox key** (`sk_test_…`). Ваша пісочниця містить 30 синтетичних пацієнтів.
2. **Перевірте роботу:**

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

3. **Встановіть SDK та прочитайте запис:** `npm install @anpheros/sdk` або `dart pub add anpheros_sdk`, потім запустіть код у розділі [Connect](#connect) або клонуйте [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts).

## Для кого це призначено

Розробники, які створюють додатки для здоров'я пацієнтів та їхніх родин, бекенди для медичних додатків, інтеграції для клінік та лабораторій, а також AI-асистенти чи агенти, яким потрібен структурований медичний контекст пацієнта — без необхідності самостійно проєктувати медичну базу даних, систему згоди та журнал аудиту.

## Отримайте ключ для пісочниці

Пісочниця є безкоштовною та доступною для самостійного використання. Увійдіть за допомогою Google на [панелі керування](https://platform.anpheros.com/dashboard/) та натисніть **Отримати ключ для пісочниці**: ви миттєво отримаєте проект пісочниці та ключ. Кожен проект пісочниці містить 30 синтетичних пацієнтів — шість місяців історії хвороб, медикаментів, алергій, результатів лабораторних досліджень та життєвих показників — які ви можете вільно змінювати та скидати будь-коли. Ключі пісочниці (`sk_test_…`) ніколи не отримують доступу до реальних даних пацієнтів.

Коли ви перейдете на продакшн, продакшн призначений для перевірених організацій з угодою про обробку даних, і продакшн починається від 49 євро на місяць з першим місяцем безкоштовно ([ціни](https://developers.anpheros.com/uk/guides/pricing)).

## Підключення

```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);
```

API ключі належать серверам. Додаток, що діє від імені особи, використовує OAuth: обидва SDK реалізують потік згоди (код авторизації + PKCE) та автоматично оновлюють токени.

## Що охоплюють SDK

Обидва охоплюють всю публічну поверхню (`/v1`, `/fhir/R4`, `/oauth/token`, `/oauth/revoke`) з
тією ж структурою: `patients`, `observations`, `conditions`, `medications`, `documents`, `timeline`,
`provenance`, `context`, `grants`, `terminology` та необроблений `fhir`. Тест призводить до збою збірки, коли публічний маршрут відсутній в одному зі SDK або коли SDK викликає маршрут, якого немає на сервері.

Обидва SDK: автоматичне `Idempotency-Key` під час створення, повторні спроби з експоненційним відступом для 429/5xx, одне оновлення токена для 401, типізовані помилки з ідентифікатором запиту, допоміжні засоби PKCE та потік згоди.

## Медичні дані та FHIR

Запис складається зі стандартних ресурсів FHIR R4 — 26 типів, включаючи `Observation`, `Condition`, `MedicationStatement`, `DocumentReference`, `Immunization` та `AllergyIntolerance` — закодованих за допомогою LOINC, ICD-10, ATC та UCUM. REST API (`/v1`) та FHIR API (`/fhir/R4`) читають і записують ті самі ресурси з тими самими ідентифікаторами; `fhir` в обох SDK надає прямий доступ до FHIR (пошук, транзакції, `$everything`, `$summary`, `$validate`).

## Приклади

| Приклад | Демонструє |
|---|---|
| [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts) | запис та читання запису: вимірювання, лабораторний результат, діагноз, медикаменти, часова шкала, пошук FHIR, IPS, контекст ШІ |
| [quickstart-dart](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-dart) | те саме з Dart / Flutter |
| [consent-app-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/consent-app-ts) | веб-додаток, який запитує згоду (OAuth 2.1 + PKCE) та читає запис особи |
| [ai-context-llm](https://github.com/anpheros/anpheros-sdk/tree/main/examples/ai-context-llm) | запитання щодо запису, на яке відповідає модель на ваш вибір (локальна або розміщена) |
| [fhir-transaction](https://github.com/anpheros/anpheros-sdk/tree/main/examples/fhir-transaction) | транзакційний пакет FHIR R4 та отриманий Міжнародний Пацієнтський Звіт (International Patient Summary) |

Приклади працюють з безкоштовним пісочником (sandbox), де кожен проект пісочника має власні 30 синтетичних пацієнтів — див. [Отримати ключ пісочника](#get-a-sandbox-key).

## Пов'язані репозиторії

| Репозиторій | Що це |
|---|---|
| [fhir-api-openapi](https://github.com/anpheros/fhir-api-openapi) | Специфікація OpenAPI 3.1 та колекція Postman для API |
| [mcp-server](https://github.com/anpheros/mcp-server) | Хостинговий FHIR MCP сервер для AI агентів: конфігурації для Claude, Cursor, VS Code |
| [agent-skills](https://github.com/anpheros/agent-skills) | Agent Skill, Claude Code plugin, правила Cursor та AGENTS.md |
| [fhir-synthetic-patients](https://github.com/anpheros/fhir-synthetic-patients) | 30 синтетичних пацієнтів у вигляді FHIR R4 Bundles та NDJSON |
| [ips-examples](https://github.com/anpheros/ips-examples) | Документи International Patient Summary у форматі FHIR R4 |
| [fhir-validate-action](https://github.com/anpheros/fhir-validate-action) | GitHub Action, що валідує FHIR R4 JSON у CI |
| [lab-results-to-fhir](https://github.com/anpheros/lab-results-to-fhir) | CLI: CSV / HL7 v2 лабораторні звіти → FHIR Observations |
| [healthcare-app-starters](https://github.com/anpheros/healthcare-app-starters) | Шаблони додатків для охорони здоров'я на Next.js та Flutter |

## Відповідність

Сирі результати тестів, опубліковані для перевірки (результати тестів, а не сертифікація): [conformance/](https://github.com/anpheros/anpheros-sdk/tree/main/conformance). Станом на 28 вересня 2026 року група Standalone Launch набору тестів Inferno SMART App Launch STU2 (v1.0.3) пройшла 22 з 22 тестів на платформі. Запуск EHR не підтримується.

## Документація

- [Посібники для розробників](https://developers.anpheros.com/guides/)
- [Початок роботи](https://developers.anpheros.com/uk/guides/getting-started)
- [Пісочниця FHIR](https://developers.anpheros.com/uk/guides/fhir-sandbox)
- [API для охорони здоров'я](https://developers.anpheros.com/uk/guides/healthcare-api)
- [Платформа API для охорони здоров'я](https://developers.anpheros.com/uk/guides/healthcare-api-platform)
- [Платформа FHIR](https://developers.anpheros.com/uk/guides/fhir)
- [Посібник з SDK](https://developers.anpheros.com/uk/guides/sdks)
- [Довідник API (OpenAPI)](https://developers.anpheros.com/docs)
- [Для ШІ-асистентів](https://developers.anpheros.com/llms.txt)
- [Anpheros](https://anpheros.com/)

## Проблеми та безпека

Повідомляйте про помилки у розділі issues цього репозиторію. Ніколи не включайте API ключі, токени або дані пацієнтів у повідомлення про помилки. Звіти про безпеку: contact@anpheros.com.

## Ліцензія

Apache License 2.0 — див. файл `LICENSE` кожного пакета. Copyright 2026 Anpheros.

## @anpheros/sdk

TypeScript клієнт для **Anpheros Platform**: медична карта FHIR R4 на пацієнта, ізоляція проєктів, згода пацієнта (OAuth 2.1 / SMART on FHIR), відстеження походження кожного запису та API контексту ШІ. Працює будь-де, де існує `fetch` (Node 18+, браузери, 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' });
```

Дія від імені особи:

```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 }) });
```

Помилки є `AnpherosError` (`status`, `type`, `message`, `field`, `requestId`). Створення надсилає `Idempotency-Key`; 429/5xx повторюються; термін дії токенів оновлюється один раз, і виклик повторюється.

## anpheros_sdk

Dart / Flutter клієнт для **Anpheros Platform**: бекенд для медичних даних з записом FHIR R4
на пацієнта, ізоляцією проєктів, згодою пацієнта (OAuth 2.1 / SMART on FHIR), відстеженням походження кожного
запису та API контексту ШІ.

```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));
```

## Дії від імені особи (додатки)

```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!);
```

Кожен об'єкт несе `fhir` (його `/fhir/R4` посилання); `anpheros.fhir` надає прямий доступ до FHIR
(read, search, create, transaction, `$everything`, `$summary`, `$validate`).

Помилки `AnpherosException` з `status`, `type`, `message`, `field` та `requestId`.
Creates автоматично надсилають `Idempotency-Key`; 429/5xx повторюються з відступами; термін дії OAuth
токенів поновлюється один раз, і виклик повторюється.
