Skip to main content

fiddlesticks/
lib.rs

1//! Unified facade over the Fiddlesticks workspace crates.
2//!
3//! This crate is designed to be the single dependency for most applications.
4//! It exposes a curated, facade-owned API surface with stable namespace modules,
5//! runtime/provider helpers, and macros for common setup and request-building flows.
6//!
7//! ```rust
8//! use fiddlesticks::prelude::*;
9//!
10//! let session = fs_session!("session-1", openai, "gpt-4o-mini", "Be concise.");
11//! let request = turn(session, "Summarize this change.");
12//! let messages = fs_messages![
13//!     system => "You are direct.",
14//!     user => request.user_input,
15//! ];
16//!
17//! assert_eq!(messages.len(), 2);
18//! ```
19
20mod agent;
21mod macros;
22mod providers;
23
24pub mod prelude;
25pub mod runtime;
26pub mod util;
27
28pub use fchat::{
29    ChatError, ChatErrorKind, ChatErrorPhase, ChatErrorSource, ChatEvent, ChatEventStream,
30    ChatPolicy, ChatService, ChatServiceBuilder, ChatSession, ChatTurnOptions, ChatTurnRequest,
31    ChatTurnRequestBuilder, ChatTurnResult, ConversationStore, InMemoryConversationStore,
32};
33pub use fcommon::{BoxFuture, MetadataMap, SessionId, TraceId};
34pub use fharness::{
35    AcceptAllValidator, ChatEventObserver, FailFastPolicy, FeatureSelector,
36    FirstPendingFeatureSelector, Harness, HarnessBuilder, HarnessError, HarnessErrorKind,
37    HarnessPhase, HealthChecker, InitializerRequest, InitializerResult, NoopHealthChecker,
38    OutcomeValidator, RunPolicy, RunPolicyMode, RuntimeRunOutcome, RuntimeRunRequest,
39    TaskIterationRequest, TaskIterationResult,
40};
41pub use fmemory::{
42    BootstrapState, FeatureRecord, InMemoryMemoryBackend, InitCommand, InitPlan, InitShell,
43    InitShellScript, InitStep, MemoryBackend, MemoryBackendConfig, MemoryConversationStore,
44    MemoryError, MemoryErrorKind, ProgressEntry, RunCheckpoint, RunStatus, SessionManifest,
45    SqliteMemoryBackend, create_default_memory_backend, create_memory_backend,
46};
47pub use fprovider::{
48    BoxedEventStream, BrowserLoginSession, CredentialAccessAction, CredentialAccessEvent,
49    CredentialAccessObserver, CredentialKind, CredentialMetadata, Message, ModelEventStream,
50    ModelProvider, ModelRequest, ModelRequestBuilder, ModelResponse, NoopOperationHooks,
51    OutputItem, ProviderCredential, ProviderError, ProviderErrorKind, ProviderFuture, ProviderId,
52    ProviderOperationHooks, ProviderRegistry, RetryPolicy, Role, SecretString,
53    SecureCredentialManager, StopReason, StreamEvent, TokenUsage, ToolCall, ToolDefinition,
54    ToolResult, VecEventStream, execute_with_retry,
55};
56pub use ftooling::{
57    DefaultToolRuntime, FunctionTool, NoopToolRuntimeHooks, Tool, ToolError, ToolErrorKind,
58    ToolExecutionContext, ToolExecutionResult, ToolFuture, ToolRegistry, ToolRuntime,
59    ToolRuntimeHooks, parse_json_object, parse_json_value, required_string,
60};
61
62pub use agent::{AgentHarnessBuilder, AgentRuntime};
63pub use providers::{
64    ProviderBuildConfig, build_provider_from_api_key, build_provider_with_config,
65    list_models_with_api_key,
66};
67pub use runtime::{
68    RuntimeBundle, build_runtime, build_runtime_with, build_runtime_with_memory,
69    build_runtime_with_tooling, chat_service, chat_service_with_memory, in_memory_backend,
70};
71pub use util::{
72    assistant_message, parse_provider_id, session, streaming_turn, system_message, tool_message,
73    turn, user_message,
74};
75
76pub mod chat {
77    pub use crate::{
78        ChatError, ChatErrorKind, ChatErrorPhase, ChatErrorSource, ChatEvent, ChatEventStream,
79        ChatPolicy, ChatService, ChatServiceBuilder, ChatSession, ChatTurnOptions, ChatTurnRequest,
80        ChatTurnRequestBuilder, ChatTurnResult, ConversationStore, InMemoryConversationStore,
81    };
82}
83
84pub mod harness {
85    pub use crate::{
86        AcceptAllValidator, ChatEventObserver, FailFastPolicy, FeatureSelector,
87        FirstPendingFeatureSelector, Harness, HarnessBuilder, HarnessError, HarnessErrorKind,
88        HarnessPhase, HealthChecker, InitializerRequest, InitializerResult, NoopHealthChecker,
89        OutcomeValidator, RunPolicy, RunPolicyMode, RuntimeRunOutcome, RuntimeRunRequest,
90        TaskIterationRequest, TaskIterationResult,
91    };
92}
93
94pub mod memory {
95    pub use crate::{
96        BootstrapState, FeatureRecord, InMemoryMemoryBackend, InitCommand, InitPlan, InitShell,
97        InitShellScript, InitStep, MemoryBackend, MemoryBackendConfig, MemoryConversationStore,
98        MemoryError, MemoryErrorKind, ProgressEntry, RunCheckpoint, RunStatus, SessionManifest,
99        SqliteMemoryBackend, create_default_memory_backend, create_memory_backend,
100    };
101}
102
103pub mod provider {
104    pub use crate::{
105        BoxedEventStream, BrowserLoginSession, CredentialAccessAction, CredentialAccessEvent,
106        CredentialAccessObserver, CredentialKind, CredentialMetadata, Message, ModelEventStream,
107        ModelProvider, ModelRequest, ModelRequestBuilder, ModelResponse, NoopOperationHooks,
108        OutputItem, ProviderCredential, ProviderError, ProviderErrorKind, ProviderFuture,
109        ProviderId, ProviderOperationHooks, ProviderRegistry, RetryPolicy, Role, SecretString,
110        SecureCredentialManager, StopReason, StreamEvent, TokenUsage, ToolCall, ToolDefinition,
111        ToolResult, VecEventStream, execute_with_retry,
112    };
113}
114
115pub mod tooling {
116    pub use crate::{
117        DefaultToolRuntime, FunctionTool, NoopToolRuntimeHooks, Tool, ToolError, ToolErrorKind,
118        ToolExecutionContext, ToolExecutionResult, ToolFuture, ToolRegistry, ToolRuntime,
119        ToolRuntimeHooks, parse_json_object, parse_json_value, required_string,
120    };
121}
122
123#[cfg(test)]
124mod tests {
125    use crate::{ProviderId, Role};
126
127    #[test]
128    fn fs_msg_macro_creates_expected_message() {
129        let message = crate::fs_msg!(user => "hello");
130        assert_eq!(message.role, Role::User);
131        assert_eq!(message.content, "hello");
132    }
133
134    #[test]
135    fn fs_messages_macro_builds_message_vector() {
136        let messages = crate::fs_messages![
137            system => "You are concise.",
138            user => "Summarize the repo",
139        ];
140
141        assert_eq!(messages.len(), 2);
142        assert_eq!(messages[0].role, Role::System);
143        assert_eq!(messages[1].role, Role::User);
144    }
145
146    #[test]
147    fn fs_session_macro_supports_provider_shorthand_and_prompt() {
148        let session = crate::fs_session!(
149            "session-1",
150            openai,
151            "gpt-4o-mini",
152            "You are concise and technical."
153        );
154
155        assert_eq!(session.provider, ProviderId::OpenAi);
156        assert_eq!(
157            session.system_prompt.as_deref(),
158            Some("You are concise and technical.")
159        );
160    }
161}