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.
Files changed (63) hide show
  1. agents/__init__.py +0 -0
  2. agents/extraction_agent/__init__.py +0 -0
  3. agents/extraction_agent/agent.py +170 -0
  4. agents/graph_agent/__init__.py +5 -0
  5. agents/graph_agent/agent.py +373 -0
  6. agents/graph_agent/tools.py +2106 -0
  7. agents/maintenance_agent/__init__.py +0 -0
  8. agents/maintenance_agent/agent.py +283 -0
  9. agents/orchestrator/__init__.py +0 -0
  10. agents/orchestrator/agent.py +217 -0
  11. agents/review_agent/__init__.py +0 -0
  12. agents/review_agent/agent.py +188 -0
  13. agents/review_agent/tools.py +472 -0
  14. api/__init__.py +0 -0
  15. api/main.py +136 -0
  16. api/routes/__init__.py +0 -0
  17. api/routes/agent.py +81 -0
  18. api/routes/entries.py +411 -0
  19. api/routes/graph.py +132 -0
  20. api/routes/mem.py +179 -0
  21. api/routes/remote.py +815 -0
  22. api/routes/remote_sync.py +230 -0
  23. api/routes/retrieve.py +88 -0
  24. core/__init__.py +0 -0
  25. core/app_state.py +9 -0
  26. core/events.py +84 -0
  27. core/extraction/__init__.py +0 -0
  28. core/extraction/wikilink_parser.py +48 -0
  29. core/graph/__init__.py +0 -0
  30. core/graph/graph.py +204 -0
  31. core/memory/__init__.py +0 -0
  32. core/memory/memgraph.py +458 -0
  33. core/resources/starter.db +0 -0
  34. core/retrieval/__init__.py +0 -0
  35. core/retrieval/embedder.py +122 -0
  36. core/retrieval/fusion.py +52 -0
  37. core/retrieval/progressive.py +399 -0
  38. core/retrieval/retrieval.py +346 -0
  39. core/retrieval/vector_store.py +91 -0
  40. core/schemas/__init__.py +0 -0
  41. core/schemas/edge.py +46 -0
  42. core/schemas/entry.py +388 -0
  43. core/storage/__init__.py +0 -0
  44. core/storage/database.py +104 -0
  45. core/storage/models.py +66 -0
  46. core/storage/repository.py +243 -0
  47. core/sync/__init__.py +20 -0
  48. core/sync/autolink.py +301 -0
  49. core/sync/db_merge.py +297 -0
  50. core/sync/db_watcher.py +84 -0
  51. core/sync/remote_sync.py +345 -0
  52. examples/__init__.py +0 -0
  53. examples/example_entries.py +206 -0
  54. examples/pymatgen_interface_examples.py +811 -0
  55. frontend/dist/assets/index-BLfo7ZZu.css +1 -0
  56. frontend/dist/assets/index-G-mYbZ9R.js +83 -0
  57. frontend/dist/assets/index-G-mYbZ9R.js.map +1 -0
  58. frontend/dist/index.html +92 -0
  59. know_do_graph-0.1.0.dist-info/METADATA +765 -0
  60. know_do_graph-0.1.0.dist-info/RECORD +63 -0
  61. know_do_graph-0.1.0.dist-info/WHEEL +4 -0
  62. know_do_graph-0.1.0.dist-info/entry_points.txt +2 -0
  63. 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")