1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//! # Anthropic Rust SDK
//! This is the Rust SDK for Anthropic. It is a work in progress.
//! The goal is to provide a Rust interface to the Anthropic API.
//!
//! ## Usage
//! ```rust
//! use std::error::Error;
//! use anthropic::client::ClientBuilder;
//! use anthropic::config::AnthropicConfig;
//! use anthropic::types::CompleteRequestBuilder;
//! use anthropic::{AI_PROMPT, HUMAN_PROMPT};
//! use dotenv::dotenv;
//!
//! #[tokio::main]
//! async fn main() -> Result<(), Box<dyn Error>> {
//! // Load the environment variables from the .env file.
//! dotenv().ok();
//!
//! // Build with manual configuration.
//! let client = ClientBuilder::default().api_key("my-api-key".to_string()).build()?;
//!
//! let complete_request = CompleteRequestBuilder::default()
//!     .prompt(format!("{HUMAN_PROMPT}How many toes do dogs have?{AI_PROMPT}"))
//!     .model("claude-instant-1".to_string())
//!     .stream(false)
//!     .stop_sequences(vec![HUMAN_PROMPT.to_string()])
//!     .build()?;
//!
//!  // Send a completion request.
//! let _complete_response_result = client.complete(complete_request).await;
//! // Do something with the response.
//!
//! Ok(())
//! }

use lazy_static::lazy_static;
use rustc_version::version;

#[macro_use]
extern crate derive_builder;

pub mod client;
pub mod config;
pub mod error;
pub mod types;

lazy_static! {
    /// A value to represent the client id of this SDK.
    pub static ref CLIENT_ID: String = client_id();
}

/// A constant to represent the human prompt.
pub const HUMAN_PROMPT: &str = "\n\nHuman:";
/// A constant to represent the assistant prompt.
pub const AI_PROMPT: &str = "\n\nAssistant:";

/// Default model to use.
pub const DEFAULT_MODEL: &str = "claude-v1";
/// Default v1 API base url.
pub const DEFAULT_API_BASE: &str = "https://api.anthropic.com";
/// Auth header key.
const AUTHORIZATION_HEADER_KEY: &str = "x-api-key";
/// Client id header key.
const CLIENT_ID_HEADER_KEY: &str = "Client";
/// API version header key.
/// Ref: https://docs.anthropic.com/claude/reference/versioning
const API_VERSION_HEADER_KEY: &str = "anthropic-version";

/// Ref: https://docs.anthropic.com/claude/reference/versioning
const API_VERSION: &str = "2023-06-01";

/// Get the client id.
pub fn client_id() -> String {
    // Get the Rust version used to build SDK at compile time.
    let rust_version = match version() {
        Ok(v) => v.to_string(),
        Err(_) => "unknown".to_string(),
    };
    let crate_name = env!("CARGO_PKG_NAME");
    let crate_version = env!("CARGO_PKG_VERSION");
    format!("rustv{rust_version}/{crate_name}/{crate_version}")
}