Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
5e242e6
cargo.toml with feature flags
64bit Nov 25, 2025
276f651
examples having correct feature flags
64bit Nov 25, 2025
7bf7ed4
response-types: cargo b -F response-types --no-default-features
64bit Nov 25, 2025
4723671
webhook-types: cargo b -F webhook-types --no-default-features
64bit Nov 25, 2025
9d3237b
audio-types: cargo b -F audio-types --no-default-features
64bit Nov 25, 2025
7cb57ba
video-types: cargo b -F video-types --no-default-features
64bit Nov 25, 2025
02b5509
image-types: cargo b -F image-types --no-default-features
64bit Nov 25, 2025
902e296
embedding-types: cargo b -F embedding-types --no-default-features
64bit Nov 25, 2025
5c27e75
file-types: cargo b -F file-types --no-default-features
64bit Nov 25, 2025
1c6ecf8
upload-types: cargo b -F upload-types --no-default-features
64bit Nov 25, 2025
e2b7c47
container-types: cargo b -F container-types --no-default-features
64bit Nov 25, 2025
d1875ff
realtime-types: cargo b -F realtime-types --no-default-features
64bit Nov 26, 2025
bfbf1fd
assistant-types: cargo b -F assistant-types --no-default-features
64bit Nov 26, 2025
18d086e
administration-types: cargo b -F administration-types --no-default-fe…
64bit Nov 26, 2025
73bc3e0
completion-types and chat-completino-types
64bit Nov 26, 2025
59c6c2d
grader-types
64bit Nov 26, 2025
db18cac
shared types with feature flags
64bit Nov 26, 2025
1240a8d
src/types works with all type feature flags
64bit Nov 26, 2025
917eb8e
add byot to realtime apis
64bit Nov 26, 2025
c882490
feature flags added to client.rs
64bit Nov 26, 2025
4668bcb
feature flag for test in config.rs
64bit Nov 26, 2025
4257cc0
feature flags in util.rs
64bit Nov 26, 2025
f0d2f89
feature flag in error.rs
64bit Nov 26, 2025
6d15100
feature flag for api wrappers in impl.rs
64bit Nov 26, 2025
f97e04e
remove unused feature flag
64bit Nov 26, 2025
34effae
updated cargo.toml with feature flags
64bit Nov 26, 2025
0bd05cd
updated lib.rs for feature flags
64bit Nov 26, 2025
0b8a51c
github workflow to build all features
64bit Nov 26, 2025
c808600
add types in feature list
64bit Nov 26, 2025
c07a863
add feature flag docs in readme
64bit Nov 26, 2025
c098c62
updated README
64bit Nov 26, 2025
5099b5a
webhook clippy fix: module has the same name as its containing module
64bit Nov 26, 2025
726929b
clippy: image feature: derive default on ImageInput instead of manual…
64bit Nov 26, 2025
f08556d
clippy: realtime feature: box variant to reduce enum size
64bit Nov 26, 2025
83282df
remove tls feature flags for reqwest from the pr checks
64bit Nov 26, 2025
543be86
move default implementation for InputSource in its own file
64bit Nov 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 81 additions & 11 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ on:
types: [opened, synchronize, reopened]

jobs:
build:
name: Build Workspace
format:
name: Check Formatting
runs-on: ubuntu-latest

steps:
Expand All @@ -17,7 +17,77 @@ jobs:
uses: actions-rs/toolchain@v1
with:
toolchain: stable
components: rustfmt, clippy
components: rustfmt
override: true

- name: Check formatting
run: cargo fmt --all -- --check

build-features:
name: Build Feature - ${{ matrix.feature }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
feature:
[
byot,
responses,
webhook,
audio,
video,
image,
embedding,
evals,
finetuning,
grader,
batch,
file,
upload,
model,
moderation,
vectorstore,
chatkit,
container,
realtime,
chat-completion,
assistant,
administration,
completions,
response-types,
webhook-types,
audio-types,
video-types,
image-types,
embedding-types,
eval-types,
finetuning-types,
grader-types,
batch-types,
file-types,
upload-types,
model-types,
moderation-types,
vectorstore-types,
chatkit-types,
container-types,
realtime-types,
chat-completion-types,
assistant-types,
administration-types,
completion-types,
types,
]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
components: clippy
override: true

- name: Cache cargo registry
Expand All @@ -27,15 +97,15 @@ jobs:
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ matrix.feature }}
restore-keys: |
${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-
${{ runner.os }}-cargo-

- name: Build workspace
run: cargo build --workspace --verbose

- name: Check formatting
run: cargo fmt --all -- --check
- name: Build with feature ${{ matrix.feature }}
env:
RUSTFLAGS: "-D warnings"
run: cargo build --no-default-features --features ${{ matrix.feature }} --verbose

# - name: Run clippy
# run: cargo clippy --workspace -- -D warnings
- name: Run clippy with feature ${{ matrix.feature }}
run: cargo clippy --no-default-features --features ${{ matrix.feature }} -- -D warnings
180 changes: 151 additions & 29 deletions async-openai/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,46 +13,148 @@ homepage = "https://github.com/64bit/async-openai"
repository = "https://github.com/64bit/async-openai"

[features]
default = ["rustls"]
default = []
# Enable rustls for TLS support
rustls = ["reqwest/rustls-tls-native-roots"]
rustls = ["_api", "dep:reqwest", "reqwest/rustls-tls-native-roots"]
# Enable rustls and webpki-roots
rustls-webpki-roots = ["reqwest/rustls-tls-webpki-roots"]
rustls-webpki-roots = ["_api", "dep:reqwest", "reqwest/rustls-tls-webpki-roots"]
# Enable native-tls for TLS support
native-tls = ["reqwest/native-tls"]
native-tls = ["_api","dep:reqwest", "reqwest/native-tls"]
# Remove dependency on OpenSSL
native-tls-vendored = ["reqwest/native-tls-vendored"]
realtime = ["dep:tokio-tungstenite"]
native-tls-vendored = ["_api", "dep:reqwest", "reqwest/native-tls-vendored"]
# Bring your own types
byot = []
webhook = ["dep:hmac", "dep:sha2", "dep:hex"]
byot = ["dep:async-openai-macros"]

# API feature flags - these enable both the API wrapper and types
responses = ["response-types", "_api"]
webhook = ["webhook-types", "dep:base64", "dep:thiserror", "dep:hmac", "dep:sha2", "dep:hex"]
# start - Platform APIs
audio = ["audio-types", "_api"]
video = ["video-types", "_api"]
image = ["image-types", "_api"]
embedding = ["embedding-types", "_api"]
evals = ["eval-types", "_api"]
finetuning = ["finetuning-types", "_api"]
grader = ["grader-types"]
batch = ["batch-types", "_api"]
file = ["file-types", "_api"]
upload = ["upload-types", "_api"]
model = ["model-types", "_api"]
moderation = ["moderation-types", "_api"]
# end - Platform APIs
vectorstore = ["vectorstore-types", "_api"]
chatkit = ["chatkit-types", "_api"]
container = ["container-types", "_api"]
realtime = ["realtime-types", "_api", "dep:tokio-tungstenite"]
chat-completion = ["chat-completion-types", "_api"]
assistant = ["assistant-types", "_api", ]
administration = ["administration-types", "_api"]
completions = ["completion-types", "_api"]

# Type feature flags - these enable only the types
response-types = ["dep:derive_builder"]
webhook-types = ["dep:derive_builder"]
audio-types = ["dep:derive_builder", "dep:bytes"]
video-types = ["dep:derive_builder", "dep:bytes"]
image-types = ["dep:derive_builder", "dep:bytes"]
embedding-types = ["dep:derive_builder"]
eval-types = ["dep:derive_builder", "chat-completion-types", "response-types", "grader-types"]
finetuning-types = ["dep:derive_builder", "grader-types"]
grader-types = ["dep:derive_builder", "eval-types"]
batch-types = ["dep:derive_builder"]
file-types = ["dep:derive_builder", "dep:bytes"]
upload-types = ["dep:derive_builder", "dep:bytes", "file-types"]
model-types = ["dep:derive_builder"]
moderation-types = ["dep:derive_builder"]
vectorstore-types = ["dep:derive_builder"]
chatkit-types = ["dep:derive_builder"]
container-types = ["dep:derive_builder", "dep:bytes"]
realtime-types = ["dep:derive_builder", "dep:bytes", "response-types"]
chat-completion-types = ["dep:derive_builder", "dep:bytes"]
assistant-types = ["dep:derive_builder"]
administration-types = ["dep:derive_builder"]
completion-types = ["dep:derive_builder", "chat-completion-types" ]

# Enable all types
types = [
"response-types",
"webhook-types",
"audio-types",
"video-types",
"image-types",
"embedding-types",
"eval-types",
"finetuning-types",
"grader-types",
"batch-types",
"file-types",
"upload-types",
"model-types",
"moderation-types",
"vectorstore-types",
"chatkit-types",
"container-types",
"realtime-types",
"chat-completion-types",
"assistant-types",
"administration-types",
"completion-types",
]

# Internal feature to enable API dependencies
_api = [
"dep:async-openai-macros",
"dep:backoff",
"dep:base64",
"dep:bytes",
"dep:futures",
"dep:rand",
"dep:reqwest",
"dep:reqwest-eventsource",
"dep:thiserror",
"dep:tokio",
"dep:tokio-stream",
"dep:tokio-util",
"dep:tracing",
"dep:secrecy",
"dep:eventsource-stream",
"dep:serde_urlencoded",
"dep:url",
]


[dependencies]
async-openai-macros = { path = "../async-openai-macros", version = "0.1.0" }
backoff = { version = "0.4.0", features = ["tokio"] }
base64 = "0.22.1"
futures = "0.3.31"
rand = "0.9.0"
# Core dependencies - always needed for types
serde = { version = "1.0.217", features = ["derive", "rc"] }
serde_json = "1.0.135"
derive_builder = { version = "0.20.2", optional = true }
bytes = { version = "1.9.0", optional = true }

# API dependencies - only needed when API features are enabled
# We use a feature gate to enable these when any API feature is enabled
async-openai-macros = { path = "../async-openai-macros", version = "0.1.0", optional = true }
backoff = { version = "0.4.0", features = ["tokio"], optional = true }
base64 = { version = "0.22.1", optional = true }
futures = { version = "0.3.31", optional = true }
rand = { version = "0.9.0", optional = true }
reqwest = { version = "0.12.12", features = [
"json",
"stream",
"multipart",
], default-features = false }
reqwest-eventsource = "0.6.0"
serde = { version = "1.0.217", features = ["derive", "rc"] }
serde_json = "1.0.135"
thiserror = "2.0.11"
tokio = { version = "1.43.0", features = ["fs", "macros"] }
tokio-stream = "0.1.17"
tokio-util = { version = "0.7.13", features = ["codec", "io-util"] }
tracing = "0.1.41"
derive_builder = "0.20.2"
secrecy = { version = "0.10.3", features = ["serde"] }
bytes = "1.9.0"
eventsource-stream = "0.2.3"
serde_urlencoded = "0.7.1"
url = "2.5"
], default-features = false, optional = true }
reqwest-eventsource = { version = "0.6.0", optional = true }
thiserror = { version = "2.0.11", optional = true }
tokio = { version = "1.43.0", features = ["fs", "macros"], optional = true }
tokio-stream = { version = "0.1.17", optional = true }
tokio-util = { version = "0.7.13", features = ["codec", "io-util"], optional = true }
tracing = { version = "0.1.41", optional = true }
secrecy = { version = "0.10.3", features = ["serde"], optional = true }
eventsource-stream = { version = "0.2.3", optional = true }
serde_urlencoded = { version = "0.7.1", optional = true }
url = { version = "2.5", optional = true }
# For Realtime websocket
tokio-tungstenite = { version = "0.26.1", optional = true, default-features = false }
# For Webhook signature verification
hmac = { version = "0.12", optional = true, default-features = false}
sha2 = { version = "0.10", optional = true, default-features = false }
hex = { version = "0.4", optional = true, default-features = false }
Expand All @@ -63,7 +165,27 @@ serde_json = "1.0"

[[test]]
name = "bring_your_own_type"
required-features = ["byot"]
required-features = ["byot", "file", "assistant", "model", "moderation", "image", "chat-completion", "completions", "audio", "embedding", "finetuning", "batch", "administration", "upload", "vectorstore", "responses", "chatkit", "container", "evals", "video"]

[[test]]
name = "boxed_future"
required-features = ["completions", "chat-completion-types"]

[[test]]
name = "chat_completion"
required-features = ["chat-completion-types"]

[[test]]
name = "embeddings"
required-features = ["embedding-types", "chat-completion-types"]

[[test]]
name = "ser_de"
required-features = ["chat-completion-types"]

[[test]]
name = "whisper"
required-features = ["audio", "file-types"]

[package.metadata.docs.rs]
all-features = true
Expand Down
Loading
Loading