Major documentation restructure to improve discoverability and reduce duplication. ## Changes **Deleted (Archived/Consolidated)**: - Removed duplicate getting started guides - Archived outdated planning documents - Consolidated corpus and configuration docs - Removed obsolete vision/spec files (superseded by vision.md) - Cleaned up scrapyard and old PDFs **New Structure**: - docs/about/ - Project overview and introduction - docs/guides/ - User guides (moved from root) - docs/specs/ - Technical specifications - docs/sdk/ - SDK documentation (Go) - docs/references/ - API references - docs/archive/ - Archived historical docs - applications/aphoria/docs/advanced/ - Advanced topics - applications/aphoria/docs/reference/ - CLI reference - applications/aphoria/docs/archive/ - Archived aphoria docs **Updated**: - README.md - New root README with clear navigation - CONTRIBUTING.md - Contribution guidelines - CLAUDE.md - Updated paths to new structure - roadmap.md - Added recent completions ## Files Changed - 57 files changed - 1,977 insertions(+) - 961 deletions(-) **Net change**: +1,016 lines (added CONTRIBUTING.md, README.md, reorganized content) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
384 lines
7.5 KiB
Markdown
384 lines
7.5 KiB
Markdown
# SDK Documentation
|
|
|
|
Client libraries and integration guides for Episteme (StemeDB).
|
|
|
|
---
|
|
|
|
## Go SDK
|
|
|
|
The official Go client library provides type-safe access to the Episteme API with built-in Ed25519 signing.
|
|
|
|
### Quick Start
|
|
|
|
```bash
|
|
go get github.com/orchard9/stemedb-go/steme
|
|
```
|
|
|
|
```go
|
|
import "github.com/orchard9/stemedb-go/steme"
|
|
|
|
// Generate keypair
|
|
signer, _ := steme.GenerateSigner()
|
|
|
|
// Create client
|
|
client := steme.NewClient("http://localhost:18180", signer)
|
|
|
|
// Assert a fact
|
|
assertion := steme.NewAssertion("Tesla_Inc", "has_revenue").
|
|
WithNumber(96.7).
|
|
WithConfidence(0.95).
|
|
Build()
|
|
|
|
hash, _ := client.Assert(ctx, assertion)
|
|
|
|
// Query with conflict resolution
|
|
params := steme.NewQuery().
|
|
WithSubject("Tesla_Inc").
|
|
WithPredicate("has_revenue").
|
|
WithLens(steme.LensConsensus).
|
|
Build()
|
|
|
|
result, _ := client.Query(ctx, params)
|
|
```
|
|
|
|
### Documentation
|
|
|
|
- **[Go SDK Reference](./go-sdk.md)** - Complete API documentation
|
|
- **[Usage Guide](./go-usage-guide.md)** - Patterns and examples
|
|
- **[ADK-Go Integration](../references/go-adk/reference-guide.md)** - Building AI agents
|
|
|
|
---
|
|
|
|
## Features
|
|
|
|
### Fluent Builders
|
|
|
|
The SDK provides fluent builders for readable, type-safe API calls:
|
|
|
|
```go
|
|
// Assertions
|
|
assertion := steme.NewAssertion(subject, predicate).
|
|
WithString(value).
|
|
WithConfidence(0.9).
|
|
WithSourceHash(hash).
|
|
WithLifecycle("Approved").
|
|
Build()
|
|
|
|
// Queries
|
|
params := steme.NewQuery().
|
|
WithSubject("Semaglutide").
|
|
WithPredicate("has_side_effect").
|
|
WithLens(steme.LensSkeptic).
|
|
WithAsOf(timestamp).
|
|
Build()
|
|
|
|
// Votes
|
|
vote := steme.NewVote(assertionHash).
|
|
WithWeight(0.8).
|
|
Build()
|
|
```
|
|
|
|
### Automatic Signing
|
|
|
|
All assertions are automatically signed with Ed25519:
|
|
|
|
```go
|
|
signer, _ := steme.GenerateSigner()
|
|
client := steme.NewClient(endpoint, signer)
|
|
|
|
// Every assertion includes:
|
|
// - Timestamp
|
|
// - Agent public key
|
|
// - Ed25519 signature
|
|
```
|
|
|
|
### Lens Support
|
|
|
|
Query with different conflict resolution strategies:
|
|
|
|
```go
|
|
// Most recent wins
|
|
steme.LensRecency
|
|
|
|
// Weighted consensus
|
|
steme.LensConsensus
|
|
|
|
// Vote-aware resolution
|
|
steme.LensVoteAware
|
|
|
|
// Surface disagreement
|
|
steme.LensSkeptic
|
|
|
|
// Per-tier breakdown
|
|
steme.LensLayered
|
|
|
|
// Trust-aware authority
|
|
steme.LensTrustAware
|
|
|
|
// Epoch-aware filtering
|
|
steme.LensEpochAware
|
|
```
|
|
|
|
---
|
|
|
|
## AI Agent Integration
|
|
|
|
### ADK-Go Tools
|
|
|
|
The SDK integrates with Google ADK-Go for building AI agents:
|
|
|
|
```go
|
|
// Define tools for agents
|
|
func QueryKnowledge(ctx context.Context, subject, predicate string, lens string) (string, error) {
|
|
resp, err := episteme.Query(ctx, &QueryParams{
|
|
Subject: subject,
|
|
Predicate: predicate,
|
|
Lens: lens,
|
|
})
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return formatForAgent(resp), nil
|
|
}
|
|
|
|
func AssertFact(ctx context.Context, subject, predicate, object string) error {
|
|
return episteme.Assert(ctx, &AssertionRequest{
|
|
Subject: subject,
|
|
Predicate: predicate,
|
|
Object: ObjectText(object),
|
|
Confidence: 0.9,
|
|
})
|
|
}
|
|
```
|
|
|
|
**[→ Full ADK-Go Guide](../references/go-adk/reference-guide.md)**
|
|
|
|
---
|
|
|
|
## Examples
|
|
|
|
### Basic Workflow
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"github.com/orchard9/stemedb-go/steme"
|
|
)
|
|
|
|
func main() {
|
|
ctx := context.Background()
|
|
|
|
// Initialize
|
|
signer, _ := steme.GenerateSigner()
|
|
client := steme.NewClient("http://localhost:18180", signer)
|
|
|
|
// Write
|
|
assertion := steme.NewAssertion("GLP1_Agonists", "cardiovascular_benefit").
|
|
WithBoolean(true).
|
|
WithConfidence(0.85).
|
|
Build()
|
|
|
|
hash, _ := client.Assert(ctx, assertion)
|
|
|
|
// Read
|
|
params := steme.NewQuery().
|
|
WithSubject("GLP1_Agonists").
|
|
WithPredicate("cardiovascular_benefit").
|
|
WithLens(steme.LensConsensus).
|
|
Build()
|
|
|
|
result, _ := client.Query(ctx, params)
|
|
// result.Winner.Object contains the resolved value
|
|
}
|
|
```
|
|
|
|
### Conflict Handling
|
|
|
|
```go
|
|
// Create competing claims
|
|
client1.Assert(ctx, steme.NewAssertion("Drug_X", "safety_profile").
|
|
WithString("safe").
|
|
WithConfidence(0.7).
|
|
Build())
|
|
|
|
client2.Assert(ctx, steme.NewAssertion("Drug_X", "safety_profile").
|
|
WithString("unsafe").
|
|
WithConfidence(0.6).
|
|
Build())
|
|
|
|
// Query with Skeptic lens to see disagreement
|
|
params := steme.NewQuery().
|
|
WithSubject("Drug_X").
|
|
WithPredicate("safety_profile").
|
|
WithLens(steme.LensSkeptic).
|
|
Build()
|
|
|
|
result, _ := client.Query(ctx, params)
|
|
// result.Status: "Contested"
|
|
// result.ConflictScore: 0.72
|
|
// result.Claims: [{value: "safe", ...}, {value: "unsafe", ...}]
|
|
```
|
|
|
|
### Time Travel
|
|
|
|
```go
|
|
// Query historical state
|
|
pastTime := time.Now().Add(-24 * time.Hour)
|
|
|
|
params := steme.NewQuery().
|
|
WithSubject("Bitcoin").
|
|
WithPredicate("price_usd").
|
|
WithAsOf(pastTime).
|
|
Build()
|
|
|
|
result, _ := client.Query(ctx, params)
|
|
// Returns what was believed 24 hours ago
|
|
```
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
The SDK returns typed errors:
|
|
|
|
```go
|
|
hash, err := client.Assert(ctx, assertion)
|
|
if err != nil {
|
|
switch err.(type) {
|
|
case *steme.ValidationError:
|
|
// Invalid assertion structure
|
|
case *steme.SignatureError:
|
|
// Signing failed
|
|
case *steme.NetworkError:
|
|
// Connection issues
|
|
case *steme.QuotaExceededError:
|
|
// Rate limited
|
|
default:
|
|
// Other errors
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Client Options
|
|
|
|
```go
|
|
client := steme.NewClient(endpoint, signer,
|
|
steme.WithTimeout(30*time.Second),
|
|
steme.WithRetry(3),
|
|
steme.WithUserAgent("MyApp/1.0"),
|
|
)
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
| Variable | Default | Description |
|
|
|----------|---------|-------------|
|
|
| `STEMEDB_ENDPOINT` | `http://localhost:18180` | API endpoint |
|
|
| `STEMEDB_TIMEOUT` | `30s` | Request timeout |
|
|
| `STEMEDB_RETRY_COUNT` | `3` | Retry attempts |
|
|
|
|
---
|
|
|
|
## Testing
|
|
|
|
### Mock Client
|
|
|
|
The SDK provides a mock for testing:
|
|
|
|
```go
|
|
import "github.com/orchard9/stemedb-go/steme/mock"
|
|
|
|
func TestMyCode(t *testing.T) {
|
|
mockClient := mock.NewClient()
|
|
|
|
// Configure expected calls
|
|
mockClient.ExpectAssert(assertion).Return(hash, nil)
|
|
mockClient.ExpectQuery(params).Return(result, nil)
|
|
|
|
// Run your code
|
|
myFunction(mockClient)
|
|
|
|
// Verify expectations
|
|
mockClient.AssertExpectations(t)
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Performance
|
|
|
|
### Batching
|
|
|
|
```go
|
|
// Batch assertions
|
|
batch := steme.NewBatch()
|
|
batch.Add(assertion1)
|
|
batch.Add(assertion2)
|
|
batch.Add(assertion3)
|
|
|
|
hashes, err := client.SubmitBatch(ctx, batch)
|
|
```
|
|
|
|
### Connection Pooling
|
|
|
|
The client automatically manages connection pooling:
|
|
|
|
```go
|
|
// Reuse the client across requests
|
|
var globalClient *steme.Client
|
|
|
|
func init() {
|
|
signer, _ := steme.GenerateSigner()
|
|
globalClient = steme.NewClient(endpoint, signer)
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Migration Guide
|
|
|
|
### From Direct HTTP
|
|
|
|
Before:
|
|
```go
|
|
// Manual HTTP + signing
|
|
body := marshal(assertion)
|
|
signature := sign(privateKey, body)
|
|
req := http.NewRequest("POST", endpoint+"/v1/assert", bytes.NewReader(body))
|
|
req.Header.Set("X-Signature", signature)
|
|
resp, _ := http.DefaultClient.Do(req)
|
|
```
|
|
|
|
After:
|
|
```go
|
|
// SDK handles it all
|
|
hash, _ := client.Assert(ctx, assertion)
|
|
```
|
|
|
|
---
|
|
|
|
## Resources
|
|
|
|
- **[API Reference](../../crates/stemedb-api/README.md)** - HTTP API documentation
|
|
- **[Architecture](../../architecture.md)** - System design
|
|
- **[Use Cases](../../use-cases/README.md)** - Real-world examples
|
|
- **[ADK-Go Examples](../references/go-adk/)** - Agent patterns
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
- **GitHub Issues**: Report bugs or request features
|
|
- **Examples**: See `sdk/go/examples/` directory
|
|
- **Integration Help**: Check [ADK-Go Integration](../references/go-adk/reference-guide.md)
|
|
|
|
---
|
|
|
|
**[← Back to Documentation Index](../README.md)**
|