1use std::time::Duration;
7
8use percent_encoding::{utf8_percent_encode, AsciiSet, NON_ALPHANUMERIC};
9
10const PATH_SEGMENT: &AsciiSet = &NON_ALPHANUMERIC
14 .remove(b'-')
15 .remove(b'_')
16 .remove(b'.')
17 .remove(b'~');
18
19pub const DEFAULT_BASE_URL: &str = "https://api.floopy.ai/v1";
22
23pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(60);
25
26pub const DEFAULT_MAX_RETRIES: u32 = 2;
28
29pub(crate) const USER_AGENT_PREFIX: &str = "floopy-sdk";
30
31pub(crate) const HEADER_CACHE_ENABLED: &str = "Floopy-Cache-Enabled";
34pub(crate) const HEADER_CACHE_BUCKET_MAX_SIZE: &str = "Floopy-Cache-Bucket-Max-Size";
35pub(crate) const HEADER_PROMPT_ID: &str = "Floopy-Prompt-Id";
36pub(crate) const HEADER_PROMPT_VERSION: &str = "Floopy-Prompt-Version";
37pub(crate) const HEADER_LLM_SECURITY_ENABLED: &str = "floopy-llm-security-enabled";
38pub(crate) const HEADER_CONFIRM: &str = "X-Floopy-Confirm";
39pub(crate) const HEADER_REQUEST_ID: &str = "X-Request-Id";
40pub(crate) const HEADER_FLOOPY_SDK: &str = "X-Floopy-SDK";
41
42pub const CONFIRM_EXPERIMENTS: &str = "experiments";
46
47pub(crate) const ENDPOINT_FEEDBACK: &str = "/feedback";
50pub(crate) const ENDPOINT_DECISIONS: &str = "/decisions";
51pub(crate) const ENDPOINT_EXPERIMENTS: &str = "/experiments";
52pub(crate) const ENDPOINT_CONSTRAINTS: &str = "/constraints";
53pub(crate) const ENDPOINT_EXPORT_DECISIONS: &str = "/export/decisions";
54pub(crate) const ENDPOINT_ROUTING_EXPLAIN: &str = "/routing/explain";
55pub(crate) const ENDPOINT_EVALUATIONS: &str = "/evaluations";
56
57pub(crate) fn path_seg(value: &str) -> String {
60 utf8_percent_encode(value, PATH_SEGMENT).to_string()
61}
62
63pub(crate) fn decision_by_id(id: &str) -> String {
64 format!("{ENDPOINT_DECISIONS}/{}", path_seg(id))
65}
66pub(crate) fn session_by_id(id: &str) -> String {
67 format!("/session/{}", path_seg(id))
68}
69pub(crate) fn experiment_results(id: &str) -> String {
70 format!("{ENDPOINT_EXPERIMENTS}/{}/results", path_seg(id))
71}
72pub(crate) fn experiment_rollback(id: &str) -> String {
73 format!("{ENDPOINT_EXPERIMENTS}/{}/rollback", path_seg(id))
74}
75pub(crate) fn evaluation_by_id(id: &str) -> String {
76 format!("{ENDPOINT_EVALUATIONS}/{}", path_seg(id))
77}
78pub(crate) fn evaluation_results(id: &str) -> String {
79 format!("{ENDPOINT_EVALUATIONS}/{}/results", path_seg(id))
80}
81pub(crate) fn evaluation_cancel(id: &str) -> String {
82 format!("{ENDPOINT_EVALUATIONS}/{}/cancel", path_seg(id))
83}