mod batches;
pub mod types;
use crate::client::Anthropic;
use crate::core::error::Error;
use crate::core::streaming::EventStream;
use crate::runtime::message_stream::MessageStream;
use futures::StreamExt;
pub use batches::*;
pub use types::*;
pub struct Messages<'a> {
client: &'a Anthropic,
}
impl<'a> Messages<'a> {
pub(crate) fn new(client: &'a Anthropic) -> Self {
Self { client }
}
pub fn batches(&self) -> Batches<'a> {
Batches::new(self.client)
}
pub async fn create(&self, params: MessageCreateParams) -> Result<MessageCreateResult, Error> {
let stream = params.stream.unwrap_or(false);
if stream {
let response = self.client.post_streaming("/v1/messages", ¶ms).await?;
let byte_stream = response.bytes_stream().boxed();
let event_stream = EventStream::<RawMessageStreamEvent>::new(byte_stream);
return Ok(MessageCreateResult::Stream(event_stream));
}
let mut non_streaming = params;
non_streaming.stream = Some(false);
let message: Message = self.client.post("/v1/messages", &non_streaming).await?;
Ok(MessageCreateResult::Message(Box::new(message)))
}
pub async fn count_tokens(
&self,
params: MessageCountTokensParams,
) -> Result<MessageTokensCount, Error> {
self.client
.post("/v1/messages/count_tokens", ¶ms)
.await
}
pub fn stream(&self, params: MessageCreateParams) -> MessageStream<'a> {
MessageStream::new(self.client, params)
}
pub async fn parse(&self, params: MessageCreateParams) -> Result<ParsedMessage, Error> {
let mut non_streaming = params;
non_streaming.stream = Some(false);
let message = match self.create(non_streaming).await? {
MessageCreateResult::Message(m) => *m,
MessageCreateResult::Stream(_) => {
return Err(crate::core::error::AnthropicError(
"parse() requires non-streaming request".into(),
)
.into());
}
};
crate::runtime::parser::parse_message(&message)
}
}
pub enum MessageCreateResult {
Message(Box<Message>),
Stream(EventStream<RawMessageStreamEvent>),
}
#[derive(Debug, Clone)]
pub struct ParsedMessage {
pub message: Message,
pub parsed_output: Option<serde_json::Value>,
}