Skip to main content

synaptic_lark/
lib.rs

1//! Feishu/Lark integration for the Synaptic framework.
2//!
3//! This crate provides first-class integration with the Feishu (Lark) Open Platform:
4//!
5//! - [`LarkDocLoader`] — load documents and Wiki pages into Synaptic [`Document`]s
6//! - [`LarkMessageTool`] — send messages to chats and users as an Agent tool
7//! - [`LarkBitableTool`] — search, create, and update rows in Bitable (multi-dim tables)
8//!
9//! # Quick start
10//!
11//! ```toml
12//! [dependencies]
13//! synaptic = { version = "0.2", features = ["lark"] }
14//! ```
15//!
16//! ```rust,no_run
17//! use synaptic_lark::{LarkConfig, LarkDocLoader};
18//! use synaptic_core::Loader;
19//!
20//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
21//! let config = LarkConfig::new("cli_xxx", "app_secret_xxx");
22//! let loader = LarkDocLoader::new(config)
23//!     .with_doc_tokens(vec!["doxcnAbcXxx".to_string()]);
24//! let docs = loader.load().await?;
25//! # Ok(())
26//! # }
27//! ```
28
29mod api;
30mod auth;
31#[cfg(feature = "bot")]
32pub mod bot;
33pub mod events;
34pub mod loaders;
35pub mod store;
36pub mod tools;
37pub mod vector_store;
38
39pub use events::listener::LarkEventListener;
40pub use loaders::bitable::LarkBitableLoader;
41pub use loaders::doc::LarkDocLoader;
42pub use loaders::drive::LarkDriveLoader;
43pub use loaders::spreadsheet::LarkSpreadsheetLoader;
44pub use loaders::wiki::LarkWikiLoader;
45pub use store::cache::LarkBitableLlmCache;
46pub use store::checkpointer::LarkBitableCheckpointer;
47pub use store::memory::LarkBitableMemoryStore;
48pub use tools::asr::LarkAsrTool;
49pub use tools::bitable::LarkBitableTool;
50pub use tools::calendar::LarkCalendarTool;
51pub use tools::chat::LarkChatTool;
52pub use tools::contact::LarkContactTool;
53pub use tools::doc_process::LarkDocProcessTool;
54pub use tools::message::LarkMessageTool;
55pub use tools::ocr::LarkOcrTool;
56pub use tools::spreadsheet::LarkSpreadsheetTool;
57pub use tools::task::LarkTaskTool;
58pub use tools::translate::LarkTranslateTool;
59pub use vector_store::LarkVectorStore;
60
61#[cfg(feature = "bot")]
62pub use bot::{
63    LarkBotClient, LarkLongConnListener, LarkMessageEvent, StreamingCardOptions,
64    StreamingCardWriter,
65};
66
67// Re-export core traits for convenience
68pub use synaptic_core::{Loader, Tool};
69
70use std::sync::Arc;
71
72/// Configuration for the Lark Open Platform.
73///
74/// Obtain `app_id` and `app_secret` from the [Lark Developer Console](https://open.feishu.cn/app).
75#[derive(Debug, Clone)]
76pub struct LarkConfig {
77    /// Application ID (`cli_xxx`).
78    pub app_id: String,
79    /// Application secret.
80    pub app_secret: String,
81    /// Base URL — defaults to `"https://open.feishu.cn/open-apis"` (Feishu public cloud).
82    /// Override with [`LarkConfig::with_base_url`] for private deployments.
83    pub base_url: String,
84}
85
86impl LarkConfig {
87    /// Create a new config targeting the Feishu public cloud.
88    pub fn new(app_id: impl Into<String>, app_secret: impl Into<String>) -> Self {
89        Self {
90            app_id: app_id.into(),
91            app_secret: app_secret.into(),
92            base_url: "https://open.feishu.cn/open-apis".to_string(),
93        }
94    }
95
96    /// Override the base URL (e.g. for private deployments or testing).
97    pub fn with_base_url(mut self, url: impl Into<String>) -> Self {
98        self.base_url = url.into();
99        self
100    }
101
102    /// Create a [`TokenCache`] backed by this config.
103    pub(crate) fn token_cache(self) -> auth::TokenCache {
104        auth::TokenCache::new(Arc::new(self))
105    }
106}