Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
54 changes: 54 additions & 0 deletions .github/workflows/cerebras-manual-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Cerebras Manual Test

on:
workflow_dispatch:
inputs:
test_type:
description: 'Type of test to run'
required: true
default: 'compile'
type: choice
options:
- compile
- live

permissions:
contents: read

jobs:
test:
name: Cerebras Test
runs-on: ubuntu-latest

env:
RUSTFLAGS: -Dwarnings

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

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Compile Cerebras code
run: |
echo "Testing Cerebras adapter compilation..."
cargo build --verbose
cargo test --test tests_p_cerebras --no-run

- name: Run live tests (if API key available)
if: ${{ github.event.inputs.test_type == 'live' && vars.CEREBRAS_API_KEY != '' }}
run: |
echo "Running live Cerebras tests..."
cargo test --test tests_p_cerebras -- --nocapture
env:
CEREBRAS_API_KEY: ${{ vars.CEREBRAS_API_KEY }}

- name: Skip live tests (no API key)
if: ${{ github.event.inputs.test_type == 'live' && vars.CEREBRAS_API_KEY == '' }}
run: |
echo "CEREBRAS_API_KEY not configured - skipping live tests"
echo "To enable live tests, add CEREBRAS_API_KEY as a repository variable"
79 changes: 79 additions & 0 deletions .github/workflows/cerebras-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Cerebras Provider Tests

# Tests Cerebras adapter integration with live API calls
on:
push:
branches: [ main, master, develop ]
paths:
- 'src/adapter/adapters/cerebras/**'
- 'tests/tests_p_cerebras.rs'
- 'examples/c11-cerebras.rs'
pull_request:
branches: [ "**" ]
paths:
- 'src/adapter/adapters/cerebras/**'
- 'tests/tests_p_cerebras.rs'
- 'examples/c11-cerebras.rs'
workflow_dispatch:

permissions:
contents: read

jobs:
cerebras-tests:
name: Cerebras Integration Tests
runs-on: ubuntu-latest

if: vars.CEREBRAS_API_KEY != ''

env:
CEREBRAS_API_KEY: ${{ vars.CEREBRAS_API_KEY }}
RUSTFLAGS: -Dwarnings

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

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Format check
run: cargo fmt --all -- --check

- name: Clippy
run: cargo clippy --all-targets -- -D warnings

- name: Build
run: cargo build --verbose

- name: Run Cerebras tests
run: |
echo "Running Cerebras provider tests..."
cargo test --test tests_p_cerebras -- --nocapture
env:
CEREBRAS_API_KEY: ${{ vars.CEREBRAS_API_KEY }}

- name: Run Cerebras example
run: |
echo "Running Cerebras example..."
cargo run --example c11-cerebras
env:
CEREBRAS_API_KEY: ${{ vars.CEREBRAS_API_KEY }}

cerebras-tests-skipped:
name: Cerebras Tests Skipped
runs-on: ubuntu-latest

if: vars.CEREBRAS_API_KEY == ''

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

- name: Skip tests
run: |
echo "CEREBRAS_API_KEY not configured - skipping live tests"
echo "To enable Cerebras tests, add CEREBRAS_API_KEY as a repository variable"
46 changes: 46 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: CI

on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ "**" ]

permissions:
contents: read

jobs:
build:
name: Lint, Build, Test
runs-on: ubuntu-latest

env:
RUSTFLAGS: -Dwarnings

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

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Format check
run: cargo fmt --all -- --check

- name: Clippy
run: cargo clippy --all-targets -- -D warnings

- name: Build
run: cargo build --verbose

- name: Tests (compile only)
run: cargo test --no-run

- name: Provider tests skipped
run: |
echo "Live provider tests require API keys and are not run in CI."
echo "Cerebras adapter compilation test:"
cargo test --test tests_p_cerebras --no-run
42 changes: 42 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Release

on:
push:
tags:
- 'v*.*.*'

permissions:
contents: write

jobs:
build-and-release:
runs-on: ubuntu-latest

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

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

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

- name: Package crate
run: cargo package --allow-dirty

- name: Upload crate tarball
uses: actions/upload-artifact@v4
with:
name: crate-tarball
path: target/package/*.crate

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: |
target/package/*.crate
generate_release_notes: true
23 changes: 23 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
repos:
- repo: local
hooks:
- id: rust-fmt
name: rustfmt
entry: cargo fmt --all -- --check
language: system
pass_filenames: false
- id: rust-clippy
name: clippy
entry: cargo clippy --all-targets -- -D warnings
language: system
pass_filenames: false
- id: rust-build
name: cargo build
entry: cargo build --verbose
language: system
pass_filenames: false
- id: rust-test-compile
name: cargo test (no run)
entry: cargo test --no-run
language: system
pass_filenames: false
5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,8 @@ serial_test = "3.2.0"
base64 = "0.22.0" # Check for the latest version
bitflags = "2.8.0"
gcp_auth = "0.12.3"
# Mock server dependencies
wiremock = "0.6.5"
uuid = { version = "1.11.0", features = ["v4", "serde"] }
# Test utilities
scopeguard = "1.2.0"
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# genai - Multi-AI Providers Library for Rust

Currently natively supports: **OpenAI**, **Anthropic**, **Gemini**, **XAI/Grok**, **Ollama**, **Groq**, **DeepSeek** (deepseek.com & Groq), **Cohere** (more to come)
Currently natively supports: **OpenAI**, **Anthropic**, **Gemini**, **XAI/Grok**, **Ollama**, **Groq**, **DeepSeek** (deepseek.com & Groq), **Cohere**, **Cerebras** (more to come)

Also allows a custom URL with `ServiceTargetResolver` (see [examples/c06-target-resolver.rs](examples/c06-target-resolver.rs))

Expand Down Expand Up @@ -65,7 +65,7 @@ See:

## Key Features

- Native Multi-AI Provider/Model: OpenAI, Anthropic, Gemini, Ollama, Groq, xAI, DeepSeek (Direct chat and stream) (see [examples/c00-readme.rs](examples/c00-readme.rs))
- Native Multi-AI Provider/Model: OpenAI, Anthropic, Gemini, Ollama, Groq, xAI, DeepSeek, Cerebras (Direct chat and stream) (see [examples/c00-readme.rs](examples/c00-readme.rs))
- DeepSeekR1 support, with `reasoning_content` (and stream support), plus DeepSeek Groq and Ollama support (and `reasoning_content` normalization)
- Image Analysis (for OpenAI, Gemini flash-2, Anthropic) (see [examples/c07-image.rs](examples/c07-image.rs))
- Custom Auth/API Key (see [examples/c02-auth.rs](examples/c02-auth.rs))
Expand Down Expand Up @@ -170,6 +170,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
- [examples/c05-model-names.rs](examples/c05-model-names.rs) - Shows how to get model names per AdapterKind.
- [examples/c06-target-resolver.rs](examples/c06-target-resolver.rs) - For custom auth, endpoint, and model.
- [examples/c07-image.rs](examples/c07-image.rs) - Image analysis support
- [examples/c11-cerebras.rs](examples/c11-cerebras.rs) - Cerebras chat + streaming (set `CEREBRAS_API_KEY`)

<br />
<a href="https://www.youtube.com/playlist?list=PL7r-PXl6ZPcBcLsBdBABOFUuLziNyigqj"><img alt="Static Badge" src="https://img.shields.io/badge/YouTube_JC_AI_Playlist-Video?style=flat&logo=youtube&color=%23ff0000"></a>
Expand Down
Loading