Фичи и TLS
svir — один крейт без процедурных макросов. Его фичи решают, какую часть вы собираете.
| Фича | Включает | По умолчанию |
|---|---|---|
client | Client, EventStream, транспорт на hyper, вложения с диска | Да |
tls | HTTPS через rustls с провайдером ring и корнями webpki | Да |
tls-aws-lc | HTTPS с провайдером aws-lc-rs вместо ring | Нет |
schemars | Tools::add и Schema::of, которые выводят из типа схему входных данных инструмента и схему ответа | Нет |
tracing | Слой Trace | Нет |
По Cargo.toml проекта видно, что ему доступно:
| Что там | Что это значит |
|---|---|
svir = "0.1" и нет ключа features | client и 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 |
Что ещё нужно вашему крейту и когда:
| Для | Добавьте |
|---|---|
Любого использования Client | tokio с рантаймом; клиент работает на Tokio |
Типизированных аргументов инструментов, Completion::parse | serde с derive |
| Схемы инструмента, написанной вручную | serde_json |
Tools::add, Schema::of | schemars = "1" рядом с фичей schemars у svir |
| Собственного HTTP-бэкенда | bytes и futures-core |
TLS и криптопровайдер
HTTPS — это rustls с корнями webpki и HTTP/2 через ALPN. Встроенный транспорт не следует редиректам, не использует прокси и доверяет корням по умолчанию; для всего остального см. Собственный HTTP-бэкенд.
Криптопровайдер выбирается фичей:
| Фича | Провайдер |
|---|---|
tls (по умолчанию) | ring. Собирается везде без C-тулчейна |
tls-aws-lc | aws-lc-rs. Если включены обе фичи, используется эта |
svir всегда явно передаёт свой провайдер в rustls, поэтому работает с любым.
Но выбор всё равно важен для остальной сборки: rustls выбирает провайдер по
умолчанию на весь процесс, только если скомпилирован ровно один. Если другая
зависимость приносит aws-lc-rs (так умеет reqwest), то tls у svir добавит
ring, и код в другом месте, полагающийся на умолчание
(ClientConfig::builder()), запаникует с сообщением «no process-level
CryptoProvider available».
Возьмите тот провайдер, что уже есть в сборке:
[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.0 | Error::status(), фичи tls-aws-lc, лимита по умолчанию в 64 МиБ (был 4 МиБ) и исправления для inline-тегов <think>, разрезанных между дельтами |
| 0.1.1 | FinishReason::ContentFilter (отфильтрованный ответ был Unsupported) и потоков Azure OpenAI в строгом режиме |
| 0.1.2 | ErrorKind::ContentFilter (заблокированный промпт был Unsupported и отправлялся дважды) и чтения асинхронного контент-фильтра Azure (его аннотации были Unsupported) |
| 0.1.3 | ToolResult::error и is_error (неудачный вызов был текстом error: в содержимом), ClientBuilder::header и TextFile::escaped_len |
| 0.1.4 | Request::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, отправит в
ветку по умолчанию.
Подробности — в журнале изменений.