171 lines
4.7 KiB
Markdown
171 lines
4.7 KiB
Markdown
# Hindsight Rust Client
|
|
|
|
Auto-generated Rust client library for the Hindsight semantic memory system API.
|
|
|
|
## Features
|
|
|
|
- 🦀 **Fully typed** - Complete type safety with Rust's type system
|
|
- 🔄 **Auto-generated** - Stays in sync with the OpenAPI spec automatically
|
|
- ⚡ **Async/await** - Built on tokio and reqwest for modern async Rust
|
|
- 📦 **Standalone** - Can be published to crates.io independently
|
|
|
|
## Installation
|
|
|
|
Add to your `Cargo.toml`:
|
|
|
|
```toml
|
|
[dependencies]
|
|
hindsight-client = "0.1.0"
|
|
tokio = { version = "1", features = ["full"] }
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```rust
|
|
use hindsight_client::Client;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
// Create a client
|
|
let client = Client::new("http://localhost:8888");
|
|
|
|
// List all agents
|
|
let agents = client.list_agents().await?;
|
|
for agent in agents {
|
|
println!("Agent: {} - {}", agent.agent_id, agent.name);
|
|
}
|
|
|
|
// Get agent profile
|
|
let profile = client.get_agent_profile("my-agent").await?;
|
|
println!("Background: {}", profile.background);
|
|
|
|
// Search memories
|
|
let search_request = hindsight_client::types::SearchRequest {
|
|
query: "What did I learn today?".to_string(),
|
|
fact_type: None,
|
|
thinking_budget: Some(100),
|
|
max_tokens: Some(4096),
|
|
trace: Some(false),
|
|
};
|
|
let results = client.search_memories("my-agent", &search_request).await?;
|
|
for result in results.results {
|
|
println!("- {}", result.text);
|
|
}
|
|
|
|
// Store a memory
|
|
let memory_request = hindsight_client::types::BatchMemoryRequest {
|
|
items: vec![
|
|
hindsight_client::types::MemoryItem {
|
|
content: "I learned about Rust today".to_string(),
|
|
context: Some("Daily learning".to_string()),
|
|
}
|
|
],
|
|
document_id: Some("my-doc".to_string()),
|
|
};
|
|
client.batch_put_memories("my-agent", &memory_request).await?;
|
|
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
## How It Works
|
|
|
|
This library uses [progenitor](https://github.com/oxidecomputer/progenitor) to generate the client code from the OpenAPI specification at **build time**.
|
|
|
|
The generation happens automatically when you run `cargo build`, so the client always stays in sync with the API schema.
|
|
|
|
### Build Process
|
|
|
|
1. `build.rs` reads the OpenAPI spec from `../../openapi.json`
|
|
2. Converts OpenAPI 3.1 → 3.0 (for progenitor compatibility)
|
|
3. Generates Rust client code using progenitor
|
|
4. Code is included in the library via `include!()` macro
|
|
|
|
## API Methods
|
|
|
|
All API endpoints are available as async methods on the `Client` struct:
|
|
|
|
### Agent Management
|
|
- `list_agents()` - List all agents
|
|
- `create_or_update_agent()` - Create or update an agent
|
|
- `get_agent_profile()` - Get agent profile with personality
|
|
- `update_agent_personality()` - Update agent personality traits
|
|
- `add_agent_background()` - Add/merge agent background
|
|
- `get_agent_stats()` - Get memory statistics
|
|
|
|
### Memory Operations
|
|
- `search_memories()` - Semantic search across memories
|
|
- `think()` - Generate contextual answers using agent identity
|
|
- `batch_put_memories()` - Store multiple memories
|
|
- `batch_put_async()` - Queue memories for background processing
|
|
- `list_memories()` - List memory units with pagination
|
|
- `delete_memory_unit()` - Delete a specific memory
|
|
- `clear_agent_memories()` - Clear all or filtered memories
|
|
|
|
### Document Management
|
|
- `list_documents()` - List documents with optional search
|
|
- `get_document()` - Get document details and content
|
|
- `delete_document()` - Delete document and its memories
|
|
|
|
### Operations (Async Tasks)
|
|
- `list_operations()` - List async operations
|
|
- `cancel_operation()` - Cancel a pending operation
|
|
|
|
### Visualization
|
|
- `get_graph()` - Get memory graph data for visualization
|
|
|
|
## Error Handling
|
|
|
|
The client uses `progenitor_client::Error` for all errors:
|
|
|
|
```rust
|
|
match client.get_agent_profile("my-agent").await {
|
|
Ok(profile) => println!("Got profile: {}", profile.name),
|
|
Err(progenitor_client::Error::ErrorResponse(resp)) => {
|
|
println!("API error: {} - {}", resp.status, resp.body);
|
|
}
|
|
Err(e) => println!("Other error: {}", e),
|
|
}
|
|
```
|
|
|
|
## Development
|
|
|
|
### Building
|
|
|
|
```bash
|
|
cargo build
|
|
```
|
|
|
|
The OpenAPI spec is automatically converted and the client is generated during build.
|
|
|
|
### Testing
|
|
|
|
```bash
|
|
cargo test
|
|
```
|
|
|
|
### Releasing
|
|
|
|
This client can be published to crates.io independently of the CLI:
|
|
|
|
```bash
|
|
cargo publish
|
|
```
|
|
|
|
## Architecture
|
|
|
|
```
|
|
hindsight-clients/rust/
|
|
├── Cargo.toml # Package definition
|
|
├── build.rs # Build script (generates client)
|
|
├── src/
|
|
│ └── lib.rs # Library entry point
|
|
└── target/
|
|
└── debug/build/
|
|
└── hindsight-client-.../out/
|
|
└── hindsight_client_generated.rs # Generated code
|
|
```
|
|
|
|
## License
|
|
|
|
MIT
|