use std::future::Future;
use crate::error::ProviderError;
use crate::shared::ModelId;
use crate::shared::ProviderId;
pub mod call_options;
pub mod content;
pub mod finish_reason;
pub mod prompt;
pub mod result;
pub mod stream_part;
pub mod supported_urls;
pub mod tool;
pub mod usage;
pub use call_options::CallOptions;
pub use call_options::CallOptionsRecord;
pub use call_options::ReasoningEffort;
pub use call_options::ResponseFormat;
pub use call_options::ToolChoice;
pub use content::Content;
pub use content::CustomKind;
pub use content::InvalidCustomKind;
pub use content::ProviderToolResult;
pub use content::Source;
pub use content::ToolCall;
pub use finish_reason::FinishReason;
pub use finish_reason::FinishReasonKind;
pub use prompt::Prompt;
pub use prompt::PromptMessage;
pub use result::GenerateResult;
pub use result::RequestMetadata;
pub use result::ResponseMetadata;
pub use result::StreamResult;
pub use stream_part::StreamError;
pub use stream_part::StreamErrorCode;
pub use stream_part::StreamPart;
pub use supported_urls::SupportedUrls;
pub use tool::ToolDefinition;
pub use usage::InputTokens;
pub use usage::OutputTokens;
pub use usage::Usage;
pub use usage::add_token_counts;
pub trait LanguageModel: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn model_id(&self) -> &ModelId;
fn supported_urls(&self) -> impl Future<Output = SupportedUrls> + Send;
fn do_generate(
&self,
options: CallOptions,
) -> impl Future<Output = Result<GenerateResult, ProviderError>> + Send;
fn do_stream(
&self,
options: CallOptions,
) -> impl Future<Output = Result<StreamResult, ProviderError>> + Send;
}