# SDK

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

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

> Официальные клиентские библиотеки для FHIR R4 healthcare API с бесплатной FHIR песочницей: пациенты, наблюдения, результаты лабораторных исследований, состояния, медикаменты, 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. **Получите бесплатный ключ для песочницы:** войдите на [панель управления](https://platform.anpheros.com/dashboard/) и нажмите **Получить ключ для песочницы** (`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) или клонируйте [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts).

## Для кого это предназначено

Разработчики, создающие приложения для здоровья пациентов и их семей, серверные части медицинских приложений, интеграции с клиниками и лабораториями, а также ИИ-ассистенты или агенты, которым нужен структурированный медицинский контекст пациента — без необходимости с нуля разрабатывать медицинскую базу данных, систему согласия и журнал аудита.

## Получить ключ для песочницы

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

При переходе на продакшн, продакшн предназначен для проверенных организаций с соглашением об обработке данных, и стоимость продакшна начинается от 49 евро в месяц с первым месяцем бесплатно ([цены](https://developers.anpheros.com/ru/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

Оба 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 |

Примеры работают с бесплатной песочницей, где каждый проект песочницы имеет свои 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/ru/guides/getting-started)
- [FHIR sandbox](https://developers.anpheros.com/ru/guides/fhir-sandbox)
- [Healthcare API](https://developers.anpheros.com/ru/guides/healthcare-api)
- [Healthcare API platform](https://developers.anpheros.com/ru/guides/healthcare-api-platform)
- [FHIR platform](https://developers.anpheros.com/ru/guides/fhir)
- [Руководство по SDK](https://developers.anpheros.com/ru/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), отслеживанием происхождения (provenance) при каждой
записи и 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`.
Операции create автоматически отправляют `Idempotency-Key`; ошибки 429/5xx повторяются с экспоненциальной задержкой; истекшие токены OAuth
обновляются один раз, и вызов повторяется.
