know-do-graph 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agents/__init__.py +0 -0
- agents/extraction_agent/__init__.py +0 -0
- agents/extraction_agent/agent.py +170 -0
- agents/graph_agent/__init__.py +5 -0
- agents/graph_agent/agent.py +373 -0
- agents/graph_agent/tools.py +2106 -0
- agents/maintenance_agent/__init__.py +0 -0
- agents/maintenance_agent/agent.py +283 -0
- agents/orchestrator/__init__.py +0 -0
- agents/orchestrator/agent.py +217 -0
- agents/review_agent/__init__.py +0 -0
- agents/review_agent/agent.py +188 -0
- agents/review_agent/tools.py +472 -0
- api/__init__.py +0 -0
- api/main.py +136 -0
- api/routes/__init__.py +0 -0
- api/routes/agent.py +81 -0
- api/routes/entries.py +411 -0
- api/routes/graph.py +132 -0
- api/routes/mem.py +179 -0
- api/routes/remote.py +815 -0
- api/routes/remote_sync.py +230 -0
- api/routes/retrieve.py +88 -0
- core/__init__.py +0 -0
- core/app_state.py +9 -0
- core/events.py +84 -0
- core/extraction/__init__.py +0 -0
- core/extraction/wikilink_parser.py +48 -0
- core/graph/__init__.py +0 -0
- core/graph/graph.py +204 -0
- core/memory/__init__.py +0 -0
- core/memory/memgraph.py +458 -0
- core/resources/starter.db +0 -0
- core/retrieval/__init__.py +0 -0
- core/retrieval/embedder.py +122 -0
- core/retrieval/fusion.py +52 -0
- core/retrieval/progressive.py +399 -0
- core/retrieval/retrieval.py +346 -0
- core/retrieval/vector_store.py +91 -0
- core/schemas/__init__.py +0 -0
- core/schemas/edge.py +46 -0
- core/schemas/entry.py +388 -0
- core/storage/__init__.py +0 -0
- core/storage/database.py +104 -0
- core/storage/models.py +66 -0
- core/storage/repository.py +243 -0
- core/sync/__init__.py +20 -0
- core/sync/autolink.py +301 -0
- core/sync/db_merge.py +297 -0
- core/sync/db_watcher.py +84 -0
- core/sync/remote_sync.py +345 -0
- examples/__init__.py +0 -0
- examples/example_entries.py +206 -0
- examples/pymatgen_interface_examples.py +811 -0
- frontend/dist/assets/index-BLfo7ZZu.css +1 -0
- frontend/dist/assets/index-G-mYbZ9R.js +83 -0
- frontend/dist/assets/index-G-mYbZ9R.js.map +1 -0
- frontend/dist/index.html +92 -0
- know_do_graph-0.1.0.dist-info/METADATA +765 -0
- know_do_graph-0.1.0.dist-info/RECORD +63 -0
- know_do_graph-0.1.0.dist-info/WHEEL +4 -0
- know_do_graph-0.1.0.dist-info/entry_points.txt +2 -0
- main.py +944 -0
api/routes/mem.py
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Mem-Graph HTTP routes.
|
|
2
|
+
|
|
3
|
+
Agents can POST session memory into the system in any supported format
|
|
4
|
+
and later list, promote, or delete traces.
|
|
5
|
+
|
|
6
|
+
Ingestion endpoint summary
|
|
7
|
+
---------------------------
|
|
8
|
+
POST /mem/{session_id}/add — plain text trace
|
|
9
|
+
POST /mem/{session_id}/ingest/openai — OpenAI-style messages list
|
|
10
|
+
POST /mem/{session_id}/ingest/langchain — LangChain-style messages list
|
|
11
|
+
POST /mem/{session_id}/ingest/autogen — AutoGen messages list
|
|
12
|
+
POST /mem/{session_id}/ingest/raw — arbitrary JSON object / array
|
|
13
|
+
GET /mem/{session_id} — list all traces for a session
|
|
14
|
+
GET /mem/sessions — list all known session IDs
|
|
15
|
+
DELETE /mem/{session_id}/{mem_id} — delete a single trace
|
|
16
|
+
POST /mem/{session_id}/{mem_id}/promote — promote trace → KDG entry
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from typing import Any, Optional
|
|
22
|
+
|
|
23
|
+
from fastapi import APIRouter, HTTPException
|
|
24
|
+
from pydantic import BaseModel
|
|
25
|
+
|
|
26
|
+
router = APIRouter()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# ------------------------------------------------------------------
|
|
30
|
+
# Request bodies
|
|
31
|
+
# ------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
class AddRequest(BaseModel):
|
|
34
|
+
content: str
|
|
35
|
+
tags: list[str] = []
|
|
36
|
+
success: Optional[bool] = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MessagesRequest(BaseModel):
|
|
40
|
+
messages: list[dict[str, Any]]
|
|
41
|
+
tags: list[str] = []
|
|
42
|
+
as_single_trace: bool = True
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class RawIngestRequest(BaseModel):
|
|
46
|
+
data: Any
|
|
47
|
+
tags: list[str] = []
|
|
48
|
+
as_single_trace: bool = True
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class PromoteRequest(BaseModel):
|
|
52
|
+
entry_type: str = "memory"
|
|
53
|
+
tags: list[str] = []
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# ------------------------------------------------------------------
|
|
57
|
+
# Routes
|
|
58
|
+
# ------------------------------------------------------------------
|
|
59
|
+
|
|
60
|
+
@router.get("/sessions", response_model=list[str], tags=["mem"])
|
|
61
|
+
def list_sessions():
|
|
62
|
+
"""Return all session IDs that have persisted memory."""
|
|
63
|
+
from core.memory.memgraph import MemGraph
|
|
64
|
+
return MemGraph.list_sessions()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@router.get("/{session_id}", response_model=list[dict], tags=["mem"])
|
|
68
|
+
def list_traces(session_id: str):
|
|
69
|
+
"""List all memory traces for a session."""
|
|
70
|
+
from core.memory.memgraph import MemGraph
|
|
71
|
+
mg = MemGraph(session_id)
|
|
72
|
+
return [e.model_dump(mode="json") for e in mg.list()]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@router.post("/{session_id}/add", response_model=dict, status_code=201, tags=["mem"])
|
|
76
|
+
def add_trace(session_id: str, body: AddRequest):
|
|
77
|
+
"""Add a single plain-text observation."""
|
|
78
|
+
from core.memory.memgraph import MemGraph
|
|
79
|
+
mg = MemGraph(session_id)
|
|
80
|
+
entry = mg.add(body.content, tags=body.tags, success=body.success)
|
|
81
|
+
return entry.model_dump(mode="json")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@router.post("/{session_id}/ingest/openai", response_model=list[dict], status_code=201, tags=["mem"])
|
|
85
|
+
def ingest_openai(session_id: str, body: MessagesRequest):
|
|
86
|
+
"""Ingest an OpenAI-style ``[{"role": ..., "content": ...}]`` messages list."""
|
|
87
|
+
from core.memory.memgraph import MemGraph
|
|
88
|
+
mg = MemGraph(session_id)
|
|
89
|
+
entries = mg.ingest_openai_messages(
|
|
90
|
+
body.messages, tags=body.tags, as_single_trace=body.as_single_trace
|
|
91
|
+
)
|
|
92
|
+
return [e.model_dump(mode="json") for e in entries]
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@router.post("/{session_id}/ingest/langchain", response_model=list[dict], status_code=201, tags=["mem"])
|
|
96
|
+
def ingest_langchain(session_id: str, body: MessagesRequest):
|
|
97
|
+
"""Ingest LangChain-style message objects (normalised to role/content dicts)."""
|
|
98
|
+
from core.memory.memgraph import MemGraph
|
|
99
|
+
mg = MemGraph(session_id)
|
|
100
|
+
entries = mg.ingest_langchain_messages(
|
|
101
|
+
body.messages, tags=body.tags, as_single_trace=body.as_single_trace
|
|
102
|
+
)
|
|
103
|
+
return [e.model_dump(mode="json") for e in entries]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@router.post("/{session_id}/ingest/autogen", response_model=list[dict], status_code=201, tags=["mem"])
|
|
107
|
+
def ingest_autogen(session_id: str, body: MessagesRequest):
|
|
108
|
+
"""Ingest AutoGen / multi-agent conversation records (``name`` + ``content`` dicts)."""
|
|
109
|
+
from core.memory.memgraph import MemGraph
|
|
110
|
+
mg = MemGraph(session_id)
|
|
111
|
+
entries = mg.ingest_autogen_messages(
|
|
112
|
+
body.messages, tags=body.tags, as_single_trace=body.as_single_trace
|
|
113
|
+
)
|
|
114
|
+
return [e.model_dump(mode="json") for e in entries]
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@router.post("/{session_id}/ingest/raw", response_model=list[dict], status_code=201, tags=["mem"])
|
|
118
|
+
def ingest_raw(session_id: str, body: RawIngestRequest):
|
|
119
|
+
"""Ingest arbitrary JSON.
|
|
120
|
+
|
|
121
|
+
- JSON array → treated as OpenAI/AutoGen message list
|
|
122
|
+
- JSON object with ``messages`` / ``history`` / ``conversation`` key → that list is extracted
|
|
123
|
+
- Anything else → stored as a single serialised trace
|
|
124
|
+
"""
|
|
125
|
+
from core.memory.memgraph import MemGraph
|
|
126
|
+
import json as _json
|
|
127
|
+
mg = MemGraph(session_id)
|
|
128
|
+
# Reuse ingest_file logic by round-tripping through a temp in-memory path
|
|
129
|
+
# equivalent: replicate the dict-dispatch logic directly
|
|
130
|
+
data = body.data
|
|
131
|
+
if isinstance(data, list):
|
|
132
|
+
entries = mg.ingest_openai_messages(data, tags=body.tags, as_single_trace=body.as_single_trace)
|
|
133
|
+
elif isinstance(data, dict):
|
|
134
|
+
for key in ("messages", "history", "conversation", "turns"):
|
|
135
|
+
if key in data and isinstance(data[key], list):
|
|
136
|
+
entries = mg.ingest_openai_messages(
|
|
137
|
+
data[key], tags=body.tags, as_single_trace=body.as_single_trace
|
|
138
|
+
)
|
|
139
|
+
break
|
|
140
|
+
else:
|
|
141
|
+
entry = mg.add(
|
|
142
|
+
content=_json.dumps(data, indent=2, default=str),
|
|
143
|
+
tags=body.tags,
|
|
144
|
+
)
|
|
145
|
+
entries = [entry]
|
|
146
|
+
else:
|
|
147
|
+
entry = mg.add(str(data), tags=body.tags)
|
|
148
|
+
entries = [entry]
|
|
149
|
+
return [e.model_dump(mode="json") for e in entries]
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@router.delete("/{session_id}/{mem_id}", status_code=204, tags=["mem"])
|
|
153
|
+
def delete_trace(session_id: str, mem_id: str):
|
|
154
|
+
"""Delete a single memory trace."""
|
|
155
|
+
from core.memory.memgraph import MemGraph
|
|
156
|
+
mg = MemGraph(session_id)
|
|
157
|
+
if not mg.delete(mem_id):
|
|
158
|
+
raise HTTPException(status_code=404, detail="Memory trace not found")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@router.post("/{session_id}/{mem_id}/promote", response_model=dict, tags=["mem"])
|
|
162
|
+
def promote_trace(session_id: str, mem_id: str, body: PromoteRequest):
|
|
163
|
+
"""Promote a memory trace into a full Know-Do Graph entry."""
|
|
164
|
+
from core.app_state import graph
|
|
165
|
+
from core.schemas.entry import EntryType
|
|
166
|
+
from core.storage.database import init_db
|
|
167
|
+
from agents.maintenance_agent.agent import MaintenanceAgent
|
|
168
|
+
|
|
169
|
+
init_db()
|
|
170
|
+
agent = MaintenanceAgent(graph)
|
|
171
|
+
entry = agent.promote_mem_entry(
|
|
172
|
+
mem_id,
|
|
173
|
+
session_id=session_id,
|
|
174
|
+
entry_type=EntryType(body.entry_type),
|
|
175
|
+
tags=body.tags or None,
|
|
176
|
+
)
|
|
177
|
+
if not entry:
|
|
178
|
+
raise HTTPException(status_code=404, detail="Memory trace not found")
|
|
179
|
+
return entry.model_dump(mode="json")
|