Перейти к основному содержимому

Фичи и TLS

svir — один крейт без процедурных макросов. Его фичи решают, какую часть вы собираете.

ФичаВключаетПо умолчанию
clientClient, EventStream, транспорт на hyper, вложения с дискаДа
tlsHTTPS через rustls с провайдером ring и корнями webpkiДа
tls-aws-lcHTTPS с провайдером aws-lc-rs вместо ringНет
schemarsTools::add и Schema::of, которые выводят из типа схему входных данных инструмента и схему ответаНет
tracingСлой TraceНет

По Cargo.toml проекта видно, что ему доступно:

Что тамЧто это значит
svir = "0.1" и нет ключа featuresclient и tls: всё, кроме Tools::add, Schema::of и Trace
features = ["schemars"]Tools::add и Schema::of; крейту для derive нужен ещё schemars = "1"
features = ["tracing"]Слой Trace
default-features = falseТолько типы и кодек: нет Client, EventStream, слоёв и вложений с диска. См. Кодек сам по себе
default-features = false, features = ["client"]Клиент без HTTPS: URL https:// — ошибка Config в build()
default-features = false, features = ["client", "tls-aws-lc"]HTTPS с aws-lc-rs вместо ring

Что ещё нужно вашему крейту и когда:

ДляДобавьте
Любого использования Clienttokio с рантаймом; клиент работает на Tokio
Типизированных аргументов инструментов, Completion::parseserde с derive
Схемы инструмента, написанной вручнуюserde_json
Tools::add, Schema::ofschemars = "1" рядом с фичей schemars у svir
Собственного HTTP-бэкендаbytes и futures-core

TLS и криптопровайдер​

HTTPS — это rustls с корнями webpki и HTTP/2 через ALPN. Встроенный транспорт не следует редиректам, не использует прокси и доверяет корням по умолчанию; для всего остального см. Собственный HTTP-бэкенд.

Криптопровайдер выбирается фичей:

ФичаПровайдер
tls (по умолчанию)ring. Собирается везде без C-тулчейна
tls-aws-lcaws-lc-rs. Если включены обе фичи, используется эта

svir всегда явно передаёт свой провайдер в rustls, поэтому работает с любым. Но выбор всё равно важен для остальной сборки: rustls выбирает провайдер по умолчанию на весь процесс, только если скомпилирован ровно один. Если другая зависимость приносит aws-lc-rs (так умеет reqwest), то tls у svir добавит ring, и код в другом месте, полагающийся на умолчание (ClientConfig::builder()), запаникует с сообщением «no process-level CryptoProvider available».

Возьмите тот провайдер, что уже есть в сборке:

Cargo.toml
[dependencies]
svir = { version = "0.1.5", default-features = false, features = ["client", "tls-aws-lc"] }

Другой способ — исправить код, который полагается на умолчание: передать провайдер и там или установить его при старте через CryptoProvider::install_default.

Версии​

Этот сайт описывает svir 0.1.5. В пределах 0.1 более поздние релизы ставятся без изменений кода; чего нет в более ранних:

ЗафиксированаЧего нет
0.1.0Error::status(), фичи tls-aws-lc, лимита по умолчанию в 64 МиБ (был 4 МиБ) и исправления для inline-тегов <think>, разрезанных между дельтами
0.1.1FinishReason::ContentFilter (отфильтрованный ответ был Unsupported) и потоков Azure OpenAI в строгом режиме
0.1.2ErrorKind::ContentFilter (заблокированный промпт был Unsupported и отправлялся дважды) и чтения асинхронного контент-фильтра Azure (его аннотации были Unsupported)
0.1.3ToolResult::error и is_error (неудачный вызов был текстом error: в содержимом), ClientBuilder::header и TextFile::escaped_len
0.1.4Request::tool_choice, Request::response_format со Schema, Completion::parse и FinishReason::Refusal (отказ был Unsupported в строгом режиме и отбрасывался в мягком, оставляя ответ без текста)

Одно изменение в 0.1.4 может проявиться в коде, написанном для 0.1.3: сбой из Tools помечается флагом is_error, и его content больше не начинается с error: . Модель читает то же, что и раньше.

Одно изменение в 0.1.5 может проявиться в коде, написанном для 0.1.4: отказ теперь читается. Строгий режим проваливал его с Unsupported, а мягкий завершал ответ со Stop и без текста. Теперь отказ — это текст, а причина завершения — Refusal, которую match, написанный для 0.1.4, отправит в ветку по умолчанию.

Подробности — в журнале изменений.