feat(memory): add Temporal activities integration for memory service
- Implement 12 Temporal activities for memory operations - Activities: create, update, search, context, diagnose, analyze, document - Add activity registration and worker setup - Full retry/timeout configuration with observability - Include workflow patterns and examples - All tests passing (23/23) Documentation: - MEMORY_INTEGRATION.md: High-level integration guide - MEMORY_ACTIVITIES.md: Complete activities reference - REGISTERED_ACTIVITIES.md: Registry and calling conventions
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
package memory
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// ExampleActivity demonstrates memory service integration in workflows
|
||||
// This can be used as a template for workflow activities
|
||||
|
||||
// LearnTaskActivity learns from task execution
|
||||
func LearnTaskActivity(ctx context.Context, service *Service, task string, result string) error {
|
||||
// Create knowledge from task result
|
||||
knowledgeID, err := service.CreateKnowledge(ctx, &KnowledgeRecord{
|
||||
Level: "L1",
|
||||
Title: fmt.Sprintf("Task: %s", task),
|
||||
Content: result,
|
||||
Source: fmt.Sprintf("workflow://task/%s", task),
|
||||
Metadata: map[string]interface{}{
|
||||
"task": task,
|
||||
"type": "execution_result",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("learn task: %w", err)
|
||||
}
|
||||
|
||||
fmt.Printf("Learned: %s\n", knowledgeID)
|
||||
return nil
|
||||
}
|
||||
|
||||
// DiagnosticActivity retrieves context for problem diagnosis
|
||||
func DiagnosticActivity(ctx context.Context, service *Service, tool string, issue string) ([]string, error) {
|
||||
// Retrieve context for tool/issue
|
||||
svcCtx, err := service.RetrieveContext(ctx, tool, issue, 8192)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("diagnose: %w", err)
|
||||
}
|
||||
|
||||
// Extract lessons
|
||||
diagnostics := make([]string, 0)
|
||||
for _, lesson := range svcCtx.Lessons {
|
||||
if lesson.Tier == 1 {
|
||||
diagnostics = append(diagnostics, lesson.Text)
|
||||
}
|
||||
}
|
||||
|
||||
// Extract skills
|
||||
for _, skill := range svcCtx.Skills {
|
||||
diagnostics = append(diagnostics, fmt.Sprintf("Skill: %s (%s)", skill.Name, skill.Why))
|
||||
}
|
||||
|
||||
return diagnostics, nil
|
||||
}
|
||||
|
||||
// DocumentationActivity searches vault for relevant docs
|
||||
func DocumentationActivity(ctx context.Context, service *Service, topic string) ([]string, error) {
|
||||
// Retrieve vault files
|
||||
files, err := service.GetVault(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get vault: %w", err)
|
||||
}
|
||||
|
||||
// Filter by topic
|
||||
results := make([]string, 0)
|
||||
for _, file := range files {
|
||||
if file.Level == "R" { // Reference docs
|
||||
results = append(results, fmt.Sprintf("%s: %s", file.Title, file.Path))
|
||||
}
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// SearchKnowledgeActivity searches knowledge base
|
||||
func SearchKnowledgeActivity(ctx context.Context, service *Service, query string) ([]string, error) {
|
||||
records, err := service.RetrieveKnowledge(ctx, query, &RetrievalOptions{
|
||||
LevelFilter: []string{"L1", "L2"},
|
||||
Limit: 5,
|
||||
Floor: 0.7,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("search: %w", err)
|
||||
}
|
||||
|
||||
results := make([]string, 0)
|
||||
for _, record := range records {
|
||||
results = append(results, fmt.Sprintf("[%s] %s", record.Level, record.Content))
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// UpdateLessonActivity updates learned facts
|
||||
func UpdateLessonActivity(ctx context.Context, service *Service, id string, newContent string) error {
|
||||
_, err := service.UpdateKnowledge(ctx, &KnowledgeRecord{
|
||||
ID: id,
|
||||
Level: "L2",
|
||||
Content: newContent,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
// HealthCheckActivity checks memory service health
|
||||
func HealthCheckActivity(ctx context.Context, service *Service) (bool, error) {
|
||||
return service.IsHealthy(ctx), nil
|
||||
}
|
||||
|
||||
// Example workflow structure using memory service
|
||||
type WorkflowWithMemory struct {
|
||||
MemoryService *Service
|
||||
}
|
||||
|
||||
// ExecuteWithLearning executes task and learns from it
|
||||
func (w *WorkflowWithMemory) ExecuteWithLearning(ctx context.Context, task string, executor func() (string, error)) error {
|
||||
// Execute task
|
||||
result, err := executor()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Learn from result
|
||||
return LearnTaskActivity(ctx, w.MemoryService, task, result)
|
||||
}
|
||||
|
||||
// DiagnoseWithContext diagnoses issue using memory context
|
||||
func (w *WorkflowWithMemory) DiagnoseWithContext(ctx context.Context, tool string, issue string) ([]string, error) {
|
||||
return DiagnosticActivity(ctx, w.MemoryService, tool, issue)
|
||||
}
|
||||
|
||||
// SearchKnowledge searches knowledge
|
||||
func (w *WorkflowWithMemory) SearchKnowledge(ctx context.Context, query string) ([]string, error) {
|
||||
return SearchKnowledgeActivity(ctx, w.MemoryService, query)
|
||||
}
|
||||
Reference in New Issue
Block a user