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
6 changes: 5 additions & 1 deletion crates/bashkit-eval/src/provider/anthropic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
use anyhow::{Context, Result};
use async_trait::async_trait;

use super::{ContentBlock, Message, Provider, ProviderResponse, Role, ToolDefinition};
use super::{
ContentBlock, Message, Provider, ProviderResponse, Role, ToolDefinition,
ensure_rustls_crypto_provider,
};

pub struct AnthropicProvider {
client: reqwest::Client,
Expand All @@ -15,6 +18,7 @@ pub struct AnthropicProvider {

impl AnthropicProvider {
pub fn new(model: &str) -> Result<Self> {
ensure_rustls_crypto_provider()?;
let api_key =
std::env::var("ANTHROPIC_API_KEY").context("ANTHROPIC_API_KEY env var not set")?;
Ok(Self {
Expand Down
17 changes: 17 additions & 0 deletions crates/bashkit-eval/src/provider/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,27 @@ pub mod openai_responses;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};

use std::sync::OnceLock;

pub use anthropic::AnthropicProvider;
pub use openai::OpenAiProvider;
pub use openai_responses::OpenAiResponsesProvider;

pub fn ensure_rustls_crypto_provider() -> anyhow::Result<()> {
static INSTALL_RESULT: OnceLock<anyhow::Result<()>> = OnceLock::new();

let install_result = INSTALL_RESULT.get_or_init(|| {
rustls::crypto::ring::default_provider()
.install_default()
.map_err(|_| anyhow::anyhow!("failed to install rustls ring crypto provider"))
});

install_result
.as_ref()
.map(|_| ())
.map_err(|e| anyhow::anyhow!("rustls crypto provider unavailable: {e}"))
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Role {
Expand Down
6 changes: 5 additions & 1 deletion crates/bashkit-eval/src/provider/openai.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
use anyhow::{Context, Result};
use async_trait::async_trait;

use super::{ContentBlock, Message, Provider, ProviderResponse, Role, ToolDefinition};
use super::{
ContentBlock, Message, Provider, ProviderResponse, Role, ToolDefinition,
ensure_rustls_crypto_provider,
};

pub struct OpenAiProvider {
client: reqwest::Client,
Expand All @@ -15,6 +18,7 @@ pub struct OpenAiProvider {

impl OpenAiProvider {
pub fn new(model: &str) -> Result<Self> {
ensure_rustls_crypto_provider()?;
let api_key = std::env::var("OPENAI_API_KEY").context("OPENAI_API_KEY env var not set")?;
Ok(Self {
client: reqwest::Client::new(),
Expand Down
6 changes: 5 additions & 1 deletion crates/bashkit-eval/src/provider/openai_responses.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
use anyhow::{Context, Result};
use async_trait::async_trait;

use super::{ContentBlock, Message, Provider, ProviderResponse, Role, ToolDefinition};
use super::{
ContentBlock, Message, Provider, ProviderResponse, Role, ToolDefinition,
ensure_rustls_crypto_provider,
};

pub struct OpenAiResponsesProvider {
client: reqwest::Client,
Expand All @@ -17,6 +20,7 @@ pub struct OpenAiResponsesProvider {

impl OpenAiResponsesProvider {
pub fn new(model: &str) -> Result<Self> {
ensure_rustls_crypto_provider()?;
let api_key = std::env::var("OPENAI_API_KEY").context("OPENAI_API_KEY env var not set")?;
Ok(Self {
client: reqwest::Client::new(),
Expand Down
Loading