Files

1881 lines
41 KiB
Markdown
Raw Permalink Normal View History

# Poimen Memory System — Complete API Reference with Response Formats
**Last Updated**: 2025-01-30
**Status**: ✅ Production Ready
**Total Endpoints**: 30+
**Format**: JSON only
---
## Table of Contents
1. [Base Configuration](#base-configuration)
2. [Core Query Endpoints](#core-query-endpoints)
3. [Synthesis Endpoints](#synthesis-endpoints)
4. [Versioning Endpoints](#versioning-endpoints)
5. [Ranking Endpoints](#ranking-endpoints)
6. [Rebuild Endpoints](#rebuild-endpoints)
7. [Foundation Endpoints](#foundation-endpoints)
8. [Error Responses](#error-responses)
9. [Rate Limits](#rate-limits)
---
## Base Configuration
### URL
```
http://localhost:8080
```
### Authentication
```
Authorization: Bearer <JWT_TOKEN>
Content-Type: application/json
```
### Example Request Headers
```bash
curl -X POST http://localhost:8080/memory/query \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{...}'
```
---
## Core Query Endpoints
### 1. Unified Query (Recommended)
**Endpoint**: `POST /memory/query`
**Request**
```json
{
"query": "kubernetes debugging strategies",
"search_type": "entities",
"entity_type": "concept",
"confidence_floor": 0.5,
"top_k": 10,
"start_time": "2025-01-20T00:00:00Z",
"end_time": "2025-01-30T23:59:59Z",
"detect_communities": true,
"min_community_size": 3,
"find_paths": true,
"target_entity_id": "e_monitoring",
"max_path_depth": 5,
"k_hops": 2,
"discover_facets": true,
"facet_filters": {
"entity_types": ["concept", "technology"],
"confidence_level": "high",
"date_range": "this_month"
}
}
```
**Response (200 OK)**
```json
{
"query": "kubernetes debugging strategies",
"search_type": "entities",
"execution_time_ms": 245,
"results": [
{
"id": "e_k8s_debug_1",
"name": "Kubernetes Debugging Fundamentals",
"entity_type": "concept",
"similarity_score": 0.95,
"semantic_score": 0.95,
"lexical_score": 0.90,
"confidence": 0.92,
"created_at": "2025-01-15T08:30:00Z",
"updated_at": "2025-01-28T14:22:00Z",
"metadata": {
"source": "transcript://session-456",
"tags": ["kubernetes", "debugging", "operations"],
"community_id": 0
}
},
{
"id": "e_pod_logs_2",
"name": "Pod Logs Analysis",
"entity_type": "concept",
"similarity_score": 0.87,
"semantic_score": 0.92,
"lexical_score": 0.78,
"confidence": 0.85,
"created_at": "2025-01-10T10:15:00Z",
"updated_at": "2025-01-25T09:45:00Z",
"metadata": {
"source": "transcript://session-789",
"tags": ["logs", "troubleshooting"],
"community_id": 0
}
}
],
"total_count": 2,
"has_more": false,
"communities": {
"entity_count": 2,
"edge_count": 3,
"community_count": 1,
"total_modularity": 0.82,
"average_community_size": 2.0,
"communities": [
{
"id": 0,
"entity_ids": ["e_k8s_debug_1", "e_pod_logs_2"],
"size": 2,
"modularity_contribution": 0.82,
"average_strength": 0.87,
"density": 1.0
}
]
},
"paths": [
{
"source_id": "e_k8s_debug_1",
"target_id": "e_monitoring",
"path_count": 1,
"shortest_distance": 2,
"average_distance": 2.0,
"paths_found": [
{
"entity_ids": ["e_k8s_debug_1", "e_observability", "e_monitoring"],
"relation_types": ["related_to", "depends_on"],
"distance": 2,
"total_confidence": 0.92
}
]
}
],
"available_facets": {
"entity_types": [
{
"name": "concept",
"count": 42,
"percentage": 62.7
},
{
"name": "technology",
"count": 25,
"percentage": 37.3
}
],
"confidence_levels": [
{
"name": "high",
"count": 52,
"percentage": 77.6
},
{
"name": "medium",
"count": 15,
"percentage": 22.4
}
],
"date_ranges": [
{
"name": "this_month",
"count": 67,
"percentage": 100.0
}
],
"total_results": 67,
"facet_computation_ms": 45
}
}
```
---
### 2. Semantic Search: Entities
**Endpoint**: `POST /memory/query/semantic/entities`
**Request**
```json
{
"query": "debugging kubernetes pods",
"entity_type": "concept",
"confidence_floor": 0.6,
"top_k": 5
}
```
**Response (200 OK)**
```json
{
"query": "debugging kubernetes pods",
"search_type": "semantic_entities",
"execution_time_ms": 145,
"results": [
{
"id": "e_k8s_debug_1",
"name": "Kubernetes Debugging Fundamentals",
"entity_type": "concept",
"similarity_score": 0.95,
"confidence": 0.92,
"metadata": {
"source": "transcript://session-456",
"tags": ["kubernetes", "debugging"],
"access_count": 23,
"last_accessed": "2025-01-28T15:30:00Z"
}
},
{
"id": "e_pod_troubleshoot",
"name": "Pod Troubleshooting",
"entity_type": "concept",
"similarity_score": 0.88,
"confidence": 0.85,
"metadata": {
"source": "transcript://session-789",
"tags": ["pods", "troubleshooting"],
"access_count": 18,
"last_accessed": "2025-01-27T09:15:00Z"
}
}
],
"total_count": 2,
"has_more": false
}
```
---
### 3. Semantic Search: Edges
**Endpoint**: `POST /memory/query/semantic/edges`
**Request**
```json
{
"query": "depends on container runtime",
"relation_type": "depends_on",
"top_k": 5
}
```
**Response (200 OK)**
```json
{
"query": "depends on container runtime",
"search_type": "semantic_edges",
"execution_time_ms": 120,
"results": [
{
"id": "edge_k8s_docker",
"source_entity_id": "e_kubernetes",
"source_name": "Kubernetes",
"target_entity_id": "e_docker",
"target_name": "Docker",
"relation_type": "depends_on",
"fact": "Kubernetes depends on Docker for containerization",
"similarity_score": 0.92,
"confidence": 0.88,
"created_at": "2025-01-15T08:30:00Z",
"metadata": {
"source": "transcript://session-456",
"evidence_count": 5
}
},
{
"id": "edge_k8s_containerd",
"source_entity_id": "e_kubernetes",
"source_name": "Kubernetes",
"target_entity_id": "e_containerd",
"target_name": "containerd",
"relation_type": "depends_on",
"fact": "Kubernetes can use containerd as container runtime",
"similarity_score": 0.85,
"confidence": 0.82,
"created_at": "2025-01-18T10:45:00Z",
"metadata": {
"source": "transcript://session-101",
"evidence_count": 3
}
}
],
"total_count": 2,
"has_more": false
}
```
---
### 4. Hybrid Search (Semantic + Lexical)
**Endpoint**: `POST /memory/query/hybrid`
**Request**
```json
{
"query": "system design patterns microservices",
"semantic_weight": 0.6,
"lexical_weight": 0.4,
"top_k": 10
}
```
**Response (200 OK)**
```json
{
"query": "system design patterns microservices",
"search_type": "hybrid",
"execution_time_ms": 180,
"results": [
{
"id": "e_microservices",
"name": "Microservices Architecture",
"entity_type": "concept",
"result_type": "entity",
"fused_score": 0.92,
"semantic_score": 0.95,
"lexical_score": 0.85,
"confidence": 0.89,
"metadata": {
"source": "transcript://session-200",
"tags": ["architecture", "design-patterns", "microservices"]
}
},
{
"id": "edge_design_patterns",
"source_entity_id": "e_design_patterns",
"source_name": "Design Patterns",
"target_entity_id": "e_microservices",
"target_name": "Microservices",
"relation_type": "related_to",
"fact": "Design patterns apply to microservices architecture",
"result_type": "edge",
"fused_score": 0.88,
"semantic_score": 0.90,
"lexical_score": 0.82,
"confidence": 0.85,
"metadata": {
"source": "transcript://session-300",
"evidence_count": 7
}
}
],
"total_count": 2,
"has_more": false
}
```
---
## Synthesis Endpoints
### 5. Entity Linking
**Endpoint**: `POST /memory/synthesis/link-entities`
**Request**
```json
{
"project": "poimen",
"text": "Kubernetes and Docker are containerization technologies used for microservices."
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"text": "Kubernetes and Docker are containerization technologies used for microservices.",
"links": [
{
"mention_text": "Kubernetes",
"start_offset": 0,
"end_offset": 10,
"entity_id": "e_kubernetes",
"entity_name": "Kubernetes",
"confidence": 0.99,
"match_type": "exact",
"reason": "Direct entity name match"
},
{
"mention_text": "Docker",
"start_offset": 15,
"end_offset": 21,
"entity_id": "e_docker",
"entity_name": "Docker",
"confidence": 0.98,
"match_type": "exact",
"reason": "Direct entity name match"
}
],
"unlinked_mentions": [
{
"text": "containerization technologies",
"start_offset": 26,
"end_offset": 54,
"reason": "No matching entity found"
},
{
"text": "microservices",
"start_offset": 69,
"end_offset": 82,
"reason": "Generic term, multiple possible matches"
}
],
"total_mentions": 4,
"linked_count": 2,
"unlinked_count": 2,
"link_rate": 0.5,
"process_time_ms": 145
}
```
---
### 6. Detect Aliases
**Endpoint**: `POST /memory/synthesis/detect-aliases`
**Request**
```json
{
"project": "poimen",
"entity_id": "e_kubernetes",
"entity_name": "Kubernetes",
"text_samples": [
"k8s is a container orchestrator",
"Kubernetes scales applications",
"k8s enables declarative configuration"
]
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"entity_id": "e_kubernetes",
"entity_name": "Kubernetes",
"text_samples_processed": 3,
"aliases": [
{
"alias": "k8s",
"frequency": 2,
"confidence": 0.95,
"first_seen": "2025-01-15T08:30:00Z",
"last_seen": "2025-01-28T14:22:00Z",
"evidence": [
"k8s is a container orchestrator",
"k8s enables declarative configuration"
]
}
],
"alias_count": 1,
"total_aliases_found": 1,
"process_time_ms": 120
}
```
---
### 7. Suggest Merges
**Endpoint**: `POST /memory/synthesis/suggest-merges`
**Request**
```json
{
"project": "poimen",
"similarity_threshold": 0.8
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"similarity_threshold": 0.8,
"suggestions": [
{
"entity1_id": "e_k8s_v1",
"entity1_name": "Kubernetes v1",
"entity2_id": "e_k8s_v2",
"entity2_name": "Kubernetes v2",
"similarity_score": 0.95,
"confidence": 0.92,
"reasons": [
"Name similarity (0.98)",
"Common related entities (5/6 shared)",
"Similar confidence levels (0.92 vs 0.90)",
"No contradictory facts"
],
"merge_recommendation": "RECOMMENDED",
"merge_strategy": "Keep e_k8s_v1, merge e_k8s_v2 into it",
"impact": {
"entities_affected": 2,
"edges_affected": 8,
"estimated_time_ms": 45
}
}
],
"suggestion_count": 1,
"total_entities_scanned": 156,
"process_time_ms": 2340
}
```
---
### 8. Detect Coreferences
**Endpoint**: `POST /memory/synthesis/detect-coreferences`
**Request**
```json
{
"project": "poimen",
"texts": [
"Kubernetes is great",
"k8s simplifies deployment",
"Kubernetes powers infrastructure"
]
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"texts_processed": 3,
"clusters": [
{
"entity_id": "e_kubernetes",
"canonical_name": "Kubernetes",
"mentions": [
{
"text": "Kubernetes",
"occurrences": 2,
"confidence": 0.99
},
{
"text": "k8s",
"occurrences": 1,
"confidence": 0.95
}
],
"mention_count": 3,
"unique_mention_count": 2,
"confidence": 0.97,
"cluster_quality": "high"
}
],
"cluster_count": 1,
"total_mentions": 3,
"mention_coverage": 1.0,
"process_time_ms": 180
}
```
---
### 9. Inference Engine
**Endpoint**: `POST /memory/synthesis/infer`
**Request**
```json
{
"project": "poimen",
"entity_id": "e_kubernetes",
"rules": [
{
"id": "r1",
"antecedent": "depends_on",
"medial": null,
"consequent": "related_to",
"confidence_multiplier": 0.9,
"description": "If A depends_on B, then A related_to B"
},
{
"id": "r2",
"antecedent": "uses",
"medial": "compatible_with",
"consequent": "can_replace",
"confidence_multiplier": 0.8,
"description": "If A uses B and B compatible_with C, then A can_replace B with C"
}
],
"max_hops": 3
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"entity_id": "e_kubernetes",
"entity_name": "Kubernetes",
"rules_applied": 2,
"inferred_facts": [
{
"source_id": "e_kubernetes",
"source_name": "Kubernetes",
"target_id": "e_docker",
"target_name": "Docker",
"relation_type": "related_to",
"fact": "Kubernetes is related to Docker",
"confidence": 0.81,
"inference_rule": "r1",
"reasoning_chain": [
{
"step": 1,
"relation": "depends_on",
"source": "e_kubernetes",
"target": "e_docker",
"confidence": 0.9
}
],
"is_new_fact": true,
"conflicts_with": []
},
{
"source_id": "e_kubernetes",
"source_name": "Kubernetes",
"target_id": "e_containerd",
"target_name": "containerd",
"relation_type": "can_replace",
"fact": "Kubernetes can use containerd instead of Docker",
"confidence": 0.72,
"inference_rule": "r2",
"reasoning_chain": [
{
"step": 1,
"relation": "uses",
"source": "e_kubernetes",
"target": "e_docker",
"confidence": 0.88
},
{
"step": 2,
"relation": "compatible_with",
"source": "e_docker",
"target": "e_containerd",
"confidence": 0.82
}
],
"is_new_fact": true,
"conflicts_with": []
}
],
"fact_count": 2,
"new_fact_count": 2,
"conflict_count": 0,
"process_time_ms": 245
}
```
---
### 10. Transitive Closure
**Endpoint**: `POST /memory/synthesis/transitive-closure`
**Request**
```json
{
"project": "poimen",
"entity_id": "e_kubernetes",
"relation_type": "depends_on",
"max_hops": 3
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"source_entity_id": "e_kubernetes",
"source_name": "Kubernetes",
"relation_type": "depends_on",
"max_hops": 3,
"closure": {
"reachable_count": 5,
"edge_count": 5,
"reachable": [
{
"entity_id": "e_docker",
"entity_name": "Docker",
"relation_type": "depends_on",
"confidence": 0.95,
"distance": 1,
"path": ["e_kubernetes", "e_docker"],
"combined_confidence": 0.95
},
{
"entity_id": "e_linux",
"entity_name": "Linux",
"relation_type": "depends_on",
"confidence": 0.90,
"distance": 2,
"path": ["e_kubernetes", "e_docker", "e_linux"],
"combined_confidence": 0.855
},
{
"entity_id": "e_kernel",
"entity_name": "Kernel",
"relation_type": "depends_on",
"confidence": 0.85,
"distance": 3,
"path": ["e_kubernetes", "e_docker", "e_linux", "e_kernel"],
"combined_confidence": 0.727
},
{
"entity_id": "e_cgroups",
"entity_name": "cgroups",
"relation_type": "depends_on",
"confidence": 0.88,
"distance": 2,
"path": ["e_kubernetes", "e_docker", "e_cgroups"],
"combined_confidence": 0.836
},
{
"entity_id": "e_namespaces",
"entity_name": "namespaces",
"relation_type": "depends_on",
"confidence": 0.87,
"distance": 2,
"path": ["e_kubernetes", "e_docker", "e_namespaces"],
"combined_confidence": 0.8265
}
]
},
"statistics": {
"avg_distance": 2.0,
"avg_confidence": 0.88,
"max_distance": 3,
"min_confidence": 0.85
},
"process_time_ms": 220
}
```
---
### 11. Reasoning Paths
**Endpoint**: `POST /memory/synthesis/reasoning-paths`
**Request**
```json
{
"project": "poimen",
"source_id": "e_kubernetes",
"target_id": "e_linux",
"max_hops": 5
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"source_id": "e_kubernetes",
"source_name": "Kubernetes",
"target_id": "e_linux",
"target_name": "Linux",
"paths": [
{
"path_id": 0,
"entity_ids": ["e_kubernetes", "e_docker", "e_linux"],
"entity_names": ["Kubernetes", "Docker", "Linux"],
"relations": ["depends_on", "runs_on"],
"confidence_scores": [0.95, 0.92],
"distance": 2,
"total_confidence": 0.874,
"path_type": "direct"
},
{
"path_id": 1,
"entity_ids": ["e_kubernetes", "e_container", "e_linux"],
"entity_names": ["Kubernetes", "Container", "Linux"],
"relations": ["uses", "requires"],
"confidence_scores": [0.88, 0.90],
"distance": 2,
"total_confidence": 0.792,
"path_type": "direct"
},
{
"path_id": 2,
"entity_ids": ["e_kubernetes", "e_docker", "e_kernel", "e_linux"],
"entity_names": ["Kubernetes", "Docker", "Kernel", "Linux"],
"relations": ["depends_on", "requires", "runs_on"],
"confidence_scores": [0.95, 0.85, 0.93],
"distance": 3,
"total_confidence": 0.749,
"path_type": "indirect"
}
],
"path_count": 3,
"statistics": {
"shortest_path_distance": 2,
"average_path_distance": 2.33,
"best_path_confidence": 0.874,
"average_path_confidence": 0.805
},
"process_time_ms": 320
}
```
---
### 12. Query Reasoning
**Endpoint**: `POST /memory/synthesis/reason`
**Request**
```json
{
"project": "poimen",
"question": "Why does Kubernetes depend on Docker for containerization?"
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"question": "Why does Kubernetes depend on Docker for containerization?",
"question_type": "causal",
"answers": [
"Container isolation",
"Standardized runtime",
"Resource efficiency",
"Portable packaging"
],
"confidence": 0.87,
"reasoning_steps": [
{
"step_id": 1,
"question": "Why does Kubernetes depend on Docker for containerization?",
"search_type": "causal",
"results": [
"Container isolation",
"Standardized runtime"
],
"confidence": 0.90,
"constraints_satisfied": 0,
"execution_time_ms": 120
},
{
"step_id": 2,
"question": "What are the benefits of containerization?",
"search_type": "setquery",
"results": [
"Resource efficiency",
"Portable packaging"
],
"confidence": 0.84,
"constraints_satisfied": 0,
"execution_time_ms": 95
}
],
"explanation": "Found 4 answer(s) through 2 reasoning step(s): Step 1: Why does Kubernetes depend on Docker? (confidence: 0.90). Step 2: What are the benefits of containerization? (confidence: 0.84).",
"supportive_entities": [
{
"entity_id": "e_docker",
"entity_name": "Docker",
"relevance": 0.95,
"reasoning": "Direct dependency target"
},
{
"entity_id": "e_containerization",
"entity_name": "Containerization",
"relevance": 0.88,
"reasoning": "Core concept"
}
],
"contradicting_entities": [],
"process_time_ms": 450
}
```
---
### 13. Summarization
**Endpoint**: `POST /memory/synthesis/summarize`
**Request**
```json
{
"project": "poimen",
"content": "Kubernetes is a container orchestration platform. Docker is used for containerization. Kubernetes manages Docker containers at scale. Microservices are the primary use case. Load balancing and auto-scaling are key features. Declarative configuration enables easy management.",
"max_length": 150,
"strategy": "hybrid"
}
```
**Response (200 OK)**
```json
{
"project": "poimen",
"original_length": 318,
"original_word_count": 44,
"summary": "Kubernetes is a container orchestration platform that manages Docker containers at scale. Load balancing, auto-scaling, and declarative configuration enable microservices deployment.",
"summary_length": 146,
"summary_word_count": 22,
"compression_ratio": 0.46,
"key_facts": [
{
"fact": "Kubernetes",
"importance": 0.98,
"fact_type": "entity",
"frequency": 2
},
{
"fact": "Docker",
"importance": 0.95,
"fact_type": "entity",
"frequency": 2
},
{
"fact": "Auto-scaling",
"importance": 0.88,
"fact_type": "feature",
"frequency": 1
},
{
"fact": "Load balancing",
"importance": 0.87,
"fact_type": "feature",
"frequency": 1
},
{
"fact": "Declarative configuration",
"importance": 0.85,
"fact_type": "feature",
"frequency": 1
}
],
"coherence_score": 0.89,
"coherence_breakdown": {
"flow": 0.87,
"entity_consistency": 0.92,
"vocabulary_richness": 0.88,
"informativeness": 0.85
},
"strategy_used": "hybrid",
"process_time_ms": 220
}
```
---
## Versioning Endpoints
### 14. Get Entity Versions
**Endpoint**: `GET /memory/entities/{id}/versions`
**Response (200 OK)**
```json
{
"entity_id": "e_kubernetes",
"entity_name": "Kubernetes",
"versions": [
{
"version_num": 1,
"operation": "CREATE",
"snapshot": {
"name": "Kubernetes",
"entity_type": "technology",
"confidence": 0.85
},
"changed_at": "2025-01-15T08:30:00Z",
"changed_by": "[email protected]",
"fields_changed": ["name", "entity_type", "confidence"]
},
{
"version_num": 2,
"operation": "UPDATE",
"snapshot": {
"name": "Kubernetes",
"entity_type": "technology",
"confidence": 0.92
},
"changed_at": "2025-01-22T14:15:00Z",
"changed_by": "[email protected]",
"fields_changed": ["confidence"]
},
{
"version_num": 3,
"operation": "UPDATE",
"snapshot": {
"name": "Kubernetes",
"entity_type": "technology",
"confidence": 0.95,
"description": "Container orchestration platform"
},
"changed_at": "2025-01-28T10:45:00Z",
"changed_by": "[email protected]",
"fields_changed": ["confidence", "description"]
}
],
"total_versions": 3,
"current_version": 3
}
```
---
### 15. Get Specific Entity Version
**Endpoint**: `GET /memory/entities/{id}/versions/{num}`
**Response (200 OK)**
```json
{
"entity_id": "e_kubernetes",
"version_num": 2,
"operation": "UPDATE",
"snapshot": {
"id": "e_kubernetes",
"name": "Kubernetes",
"entity_type": "technology",
"confidence": 0.92,
"created_at": "2025-01-15T08:30:00Z",
"metadata": {
"source": "transcript://session-123",
"tags": ["orchestration", "containers"]
}
},
"changed_at": "2025-01-22T14:15:00Z",
"changed_by": "[email protected]",
"fields_changed": ["confidence"],
"change_summary": "Updated confidence from 0.85 to 0.92"
}
```
---
### 16. Entity Diff
**Endpoint**: `POST /memory/entities/diff`
**Request**
```json
{
"entity_id": "e_kubernetes",
"from_version": 1,
"to_version": 3
}
```
**Response (200 OK)**
```json
{
"entity_id": "e_kubernetes",
"from_version": 1,
"to_version": 3,
"version_span": 2,
"diff": {
"added_fields": {
"description": "Container orchestration platform"
},
"removed_fields": {},
"modified_fields": {
"confidence": {
"old": 0.85,
"new": 0.95,
"change_percent": 11.8
}
}
},
"change_timeline": [
{
"version": 1,
"confidence": 0.85,
"changed_at": "2025-01-15T08:30:00Z"
},
{
"version": 2,
"confidence": 0.92,
"changed_at": "2025-01-22T14:15:00Z"
},
{
"version": 3,
"confidence": 0.95,
"changed_at": "2025-01-28T10:45:00Z"
}
],
"editors_involved": ["[email protected]", "[email protected]", "[email protected]"],
"total_changes": 2
}
```
---
### 17. Point-in-Time Query
**Endpoint**: `GET /memory/entities/at?as_of=2025-01-22T15:00:00Z`
**Response (200 OK)**
```json
{
"as_of_time": "2025-01-22T15:00:00Z",
"query_time_relative": "-6 days",
"entities": [
{
"entity_id": "e_kubernetes",
"name": "Kubernetes",
"entity_type": "technology",
"confidence": 0.92,
"version": 2,
"snapshot": {
"name": "Kubernetes",
"entity_type": "technology",
"confidence": 0.92
},
"was_valid_at_time": true,
"changed_after": {
"version": 3,
"changed_at": "2025-01-28T10:45:00Z",
"change": "confidence: 0.92 → 0.95"
}
},
{
"entity_id": "e_docker",
"name": "Docker",
"entity_type": "technology",
"confidence": 0.88,
"version": 1,
"snapshot": {
"name": "Docker",
"entity_type": "technology",
"confidence": 0.88
},
"was_valid_at_time": true,
"changed_after": null
}
],
"total_entities": 2,
"entities_created_since": 0,
"entities_modified_since": 1,
"entities_deleted_since": 0
}
```
---
## Ranking Endpoints
### 18. Get Ranking Profiles
**Endpoint**: `GET /memory/ranking/profiles`
**Response (200 OK)**
```json
{
"profiles": [
{
"name": "default",
"description": "Balanced ranking across all signals",
"is_default": true,
"signals": {
"semantic": {
"weight": 0.40,
"description": "Vector similarity to query"
},
"lexical": {
"weight": 0.25,
"description": "BM25 keyword matching"
},
"recency": {
"weight": 0.15,
"description": "Exponential decay by age (30d half-life)"
},
"frequency": {
"weight": 0.10,
"description": "Logarithmic access count"
},
"confidence": {
"weight": 0.05,
"description": "Base confidence decay (90d half-life)"
},
"community": {
"weight": 0.03,
"description": "Community size + activity"
},
"contradiction": {
"weight": 0.02,
"description": "Penalty for unresolved conflicts"
}
},
"weights_sum": 1.0,
"recommended_for": ["general queries", "balanced results"]
},
{
"name": "recency_focused",
"description": "Prioritize recent discoveries and updates",
"is_default": false,
"signals": {
"semantic": {
"weight": 0.30,
"description": "Vector similarity to query"
},
"lexical": {
"weight": 0.20,
"description": "BM25 keyword matching"
},
"recency": {
"weight": 0.35,
"description": "Exponential decay by age (20d half-life)"
},
"frequency": {
"weight": 0.08,
"description": "Logarithmic access count"
},
"confidence": {
"weight": 0.04,
"description": "Base confidence decay"
},
"community": {
"weight": 0.02,
"description": "Community size + activity"
},
"contradiction": {
"weight": 0.01,
"description": "Penalty for unresolved conflicts"
}
},
"weights_sum": 1.0,
"recommended_for": ["breaking news", "trending topics", "live monitoring"]
},
{
"name": "accuracy_focused",
"description": "Prioritize high-confidence and well-supported results",
"is_default": false,
"signals": {
"semantic": {
"weight": 0.35,
"description": "Vector similarity to query"
},
"lexical": {
"weight": 0.25,
"description": "BM25 keyword matching"
},
"recency": {
"weight": 0.08,
"description": "Exponential decay by age (60d half-life)"
},
"frequency": {
"weight": 0.10,
"description": "Logarithmic access count"
},
"confidence": {
"weight": 0.15,
"description": "Base confidence decay (120d half-life)"
},
"community": {
"weight": 0.05,
"description": "Community size + activity"
},
"contradiction": {
"weight": 0.02,
"description": "Penalty for unresolved conflicts"
}
},
"weights_sum": 1.0,
"recommended_for": ["critical decisions", "compliance", "audits"]
}
],
"total_profiles": 3,
"available_custom_profiles": false
}
```
---
### 19. Query with Ranking Profile
**Endpoint**: `POST /memory/query` with `ranking_profile`
**Request**
```json
{
"query": "kubernetes debugging",
"ranking_profile": "recency_focused",
"top_k": 5
}
```
**Response (200 OK)**
```json
{
"query": "kubernetes debugging",
"ranking_profile": "recency_focused",
"execution_time_ms": 185,
"results": [
{
"id": "e_k8s_debug_latest",
"name": "Latest K8s Debugging Techniques (2025-01-28)",
"entity_type": "concept",
"fused_score": 0.91,
"scores": {
"semantic": 0.88,
"lexical": 0.85,
"recency": 0.98,
"frequency": 0.65,
"confidence": 0.90,
"community": 0.82,
"contradiction": 1.0
},
"weighted_score": 0.91,
"confidence": 0.90,
"created_at": "2025-01-28T10:30:00Z",
"updated_at": "2025-01-28T14:22:00Z",
"days_old": 0,
"access_count": 12
},
{
"id": "e_pod_logs_2",
"name": "Pod Logs Analysis",
"entity_type": "concept",
"fused_score": 0.85,
"scores": {
"semantic": 0.92,
"lexical": 0.78,
"recency": 0.82,
"frequency": 0.70,
"confidence": 0.85,
"community": 0.88,
"contradiction": 1.0
},
"weighted_score": 0.85,
"confidence": 0.85,
"created_at": "2025-01-25T09:45:00Z",
"updated_at": "2025-01-27T11:30:00Z",
"days_old": 3,
"access_count": 18
}
],
"total_count": 2,
"scoring_note": "Results ranked using 'recency_focused' profile (recency weight: 35%)"
}
```
---
## Rebuild Endpoints
### 20. Rebuild Memory
**Endpoint**: `POST /memory/rebuild`
**Request**
```json
{
"project": "poimen",
"dry_run": false,
"verify_parity": true,
"from_checkpoint": null
}
```
**Response (200 OK)**
```json
{
"status": "success",
"phase": "completed",
"project": "poimen",
"dry_run": false,
"records_processed": 542,
"records_skipped": 0,
"errors": 0,
"total_time_ms": 8234,
"rebuild_duration": "8s 234ms",
"records_per_second": 65.8,
"checksum_before": "abc123def456789abc123def456789ab",
"checksum_after": "abc123def456789abc123def456789ab",
"checksum_match": true,
"parity_verified": true,
"parity_checks": [
{
"check_id": "M2.8_rebuild_parity",
"name": "Rebuild Parity Check",
"status": "PASS",
"details": "Checksums match after rebuild"
},
{
"check_id": "entity_count",
"name": "Entity Count Verification",
"status": "PASS",
"before": 156,
"after": 156
},
{
"check_id": "edge_count",
"name": "Edge Count Verification",
"status": "PASS",
"before": 342,
"after": 342
}
],
"rebuild_path": "from_event_log",
"event_log_entries_read": 542,
"event_log_entries_deduplicated": 0,
"timestamp": "2025-01-30T02:00:00Z"
}
```
---
### 21. Rebuild Status
**Endpoint**: `GET /memory/rebuild/status`
**Response (200 OK)**
```json
{
"status": "idle",
"current_phase": null,
"last_rebuild": {
"started_at": "2025-01-29T02:00:00Z",
"completed_at": "2025-01-29T02:00:08Z",
"total_time_ms": 8234,
"status": "success",
"records_processed": 542,
"errors": 0,
"checksum_match": true
},
"next_scheduled_rebuild": "2025-01-30T02:00:00Z",
"rebuild_schedule": "daily",
"rebuild_schedule_utc": "02:00 UTC",
"statistics": {
"total_rebuilds": 127,
"successful_rebuilds": 127,
"failed_rebuilds": 0,
"checksum_mismatch_count": 0,
"average_rebuild_time_ms": 7845,
"last_7_days_success_rate": 1.0,
"last_30_days_success_rate": 1.0
}
}
```
---
## Foundation Endpoints
### 22. Ingest Record
**Endpoint**: `POST /memory/ingest`
**Request**
```json
{
"project": "poimen",
"source": "transcript://session-123",
"kind": "L1",
"text": "Kubernetes port 8080 conflict resolved by checking service definition and updating containerPort mapping.",
"metadata": {
"session_id": "sess-123",
"topic": "troubleshooting",
"severity": "medium",
"user": "devops-team"
}
}
```
**Response (201 Created)**
```json
{
"id": "chunk-abc123def456",
"project": "poimen",
"source": "transcript://session-123",
"kind": "L1",
"sha256": "de12cd34ef56789abc123def456789ab",
"queue_status": "pending",
"idempotency_key": "sess-123:0",
"timestamp": "2025-01-30T10:15:00Z",
"processing": {
"status": "queued",
"entity_extraction": {
"status": "pending",
"estimated_entities": 0
},
"fact_extraction": {
"status": "pending",
"estimated_facts": 0
},
"contradiction_detection": {
"status": "pending",
"estimated_contradictions": 0
}
}
}
```
---
### 23. Context Retrieval
**Endpoint**: `POST /memory/context`
**Request**
```json
{
"project": "poimen",
"tool": "kubectl",
"task": "debug-pod",
"signature_source": "failure_log",
"scope": "tool_context",
"budget": 8192
}
```
**Response (200 OK)**
```json
{
"tier": 1,
"project": "poimen",
"tool": "kubectl",
"task": "debug-pod",
"retrieval_time_ms": 125,
"lessons": [
{
"tier": 1,
"level": "L1",
"score": 1.0,
"text": "Pod in CrashLoopBackOff: check logs with kubectl logs <pod-name> and review container exit codes.",
"matched_kind": "signature",
"entity_confidence": 0.95,
"seen_count": 23,
"last_seen": "2025-01-28T15:30:00Z",
"source": "transcript://session-456",
"size_bytes": 165
},
{
"tier": 2,
"level": "L2",
"score": 0.87,
"text": "Common Kubernetes debugging patterns: check events (kubectl describe), inspect YAML, verify resource limits, review node status.",
"matched_kind": "semantic_search",
"entity_confidence": 0.82,
"seen_count": 15,
"last_seen": "2025-01-25T09:15:00Z",
"source": "transcript://session-789",
"size_bytes": 198
},
{
"tier": 3,
"level": "R",
"score": 0.65,
"text": "kubectl Troubleshooting Guide: See official Kubernetes debugging documentation for comprehensive reference.",
"matched_kind": "reference",
"source": "obsidian://poimen-vault/kubectl.md",
"size_bytes": 145
}
],
"skills": [
{
"name": "diagnose-pod-failure",
"description": "Diagnose Kubernetes pod CrashLoopBackOff failures",
"why_suggested": "Tier-1 signature matched",
"confidence": 0.98
},
{
"name": "analyze-container-logs",
"description": "Analyze container logs using kubectl",
"why_suggested": "Tier-2 semantic match",
"confidence": 0.85
}
],
"budget": {
"requested": 8192,
"used": 508,
"remaining": 7684,
"dropped": 0,
"degradation": null
}
}
```
---
### 24. Health Check
**Endpoint**: `GET /health`
**Response (200 OK)**
```json
{
"status": "ok",
"timestamp": "2025-01-30T10:15:00Z",
"service": "poimen-memory",
"version": "1.0.0",
"uptime_seconds": 86400,
"dependencies": {
"postgres": {
"status": "ok",
"response_time_ms": 2,
"pool_size": 10,
"active_connections": 3
},
"opensearch": {
"status": "ok",
"response_time_ms": 5,
"cluster_health": "green",
"active_shards": 30
},
"obsidian": {
"status": "ok",
"response_time_ms": 45,
"vault_files": 156
}
}
}
```
---
## Error Responses
### 400 Bad Request
```json
{
"error": "Bad Request",
"code": "INVALID_PARAMETER",
"message": "Query is required and must be between 1 and 2000 characters",
"details": {
"field": "query",
"issue": "empty_string",
"min_length": 1,
"max_length": 2000
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
### 401 Unauthorized
```json
{
"error": "Unauthorized",
"code": "MISSING_AUTH",
"message": "Missing or invalid JWT bearer token",
"details": {
"provided": null,
"expected": "Bearer <JWT_TOKEN>"
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
### 403 Forbidden
```json
{
"error": "Forbidden",
"code": "INSUFFICIENT_PERMISSIONS",
"message": "Token lacks required permission",
"details": {
"required_permission": "memory:write",
"user_permissions": ["memory:read"],
"contact_admin": "[email protected]"
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
### 404 Not Found
```json
{
"error": "Not Found",
"code": "RESOURCE_NOT_FOUND",
"message": "Entity not found",
"details": {
"entity_id": "e_nonexistent",
"searched_in": ["memory_entity"],
"similar_entities": ["e_kubernetes", "e_container"]
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
### 409 Conflict
```json
{
"error": "Conflict",
"code": "REBUILD_PARITY_FAILED",
"message": "Checksum mismatch after rebuild",
"details": {
"checksum_before": "abc123...",
"checksum_after": "xyz789...",
"gate": "M2.8_rebuild_parity",
"suggestion": "Investigate event log for corruption"
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
### 429 Too Many Requests
```json
{
"error": "Too Many Requests",
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded for this endpoint",
"details": {
"endpoint": "/memory/query",
"limit": 500,
"window": "hour",
"reset_at": "2025-01-30T11:15:00Z",
"retry_after_seconds": 3600
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
### 503 Service Unavailable
```json
{
"error": "Service Unavailable",
"code": "DEPENDENCY_DOWN",
"message": "OpenSearch cluster is unavailable",
"details": {
"dependency": "opensearch",
"status": "down",
"last_check": "2025-01-30T10:14:55Z",
"retry_after_seconds": 30
},
"timestamp": "2025-01-30T10:15:00Z"
}
```
---
## Rate Limits
```
Per API Key Per Hour:
├─ Query (POST /memory/query) 500 req/hr
├─ Semantic Search 500 req/hr
├─ Ingest (POST /memory/ingest) 100 req/hr
├─ Context (POST /memory/context) 100 req/hr
├─ Versioning Endpoints 200 req/hr
├─ Ranking Endpoints 500 req/hr
├─ Rebuild (POST /memory/rebuild) 10 req/hr
├─ Synthesis: link-entities 100 req/hr
├─ Synthesis: detect-aliases 100 req/hr
├─ Synthesis: suggest-merges 50 req/hr (compute-intensive)
├─ Synthesis: detect-coreferences 100 req/hr
├─ Synthesis: infer 50 req/hr (compute-intensive)
├─ Synthesis: transitive-closure 50 req/hr
├─ Synthesis: reasoning-paths 100 req/hr
├─ Synthesis: reason 50 req/hr (reasoning-intensive)
└─ Synthesis: summarize 100 req/hr
```
---
## Frontend Integration Guide
### 1. Setup Bearer Token
```javascript
const jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
const headers = {
"Authorization": `Bearer ${jwt}`,
"Content-Type": "application/json"
};
```
### 2. Query with Error Handling
```javascript
async function query(q) {
try {
const res = await fetch("http://localhost:8080/memory/query", {
method: "POST",
headers,
body: JSON.stringify({
query: q,
search_type: "entities",
top_k: 10
})
});
if (!res.ok) {
const err = await res.json();
console.error(`[${err.code}] ${err.message}`);
return null;
}
return await res.json();
} catch (e) {
console.error("Network error:", e);
return null;
}
}
```
### 3. Parse Versioning Response
```javascript
async function getEntityHistory(entityId) {
const res = await fetch(
`http://localhost:8080/memory/entities/${entityId}/versions`,
{ headers }
);
const data = await res.json();
// Timeline visualization
const timeline = data.versions.map(v => ({
time: new Date(v.changed_at),
version: v.version_num,
editor: v.changed_by,
changes: v.fields_changed
}));
return timeline;
}
```
### 4. Rank with Multi-Signal Profile
```javascript
async function rankedQuery(q, profile = "default") {
const res = await fetch("http://localhost:8080/memory/query", {
method: "POST",
headers,
body: JSON.stringify({
query: q,
ranking_profile: profile,
top_k: 10
})
});
return await res.json();
}
```
---
**Status**: ✅ All API endpoints documented with complete JSON response formats for frontend integration.