specimba commited on
Commit
5466f63
·
verified ·
1 Parent(s): 647a274

Copy nexus_os_v2/pinecone_client.py from dataset for module imports

Browse files
Files changed (1) hide show
  1. nexus_os_v2/pinecone_client.py +154 -0
nexus_os_v2/pinecone_client.py ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Pinecone Retriever Client for NEXUS OS v2.1
3
+ Uses llama-text-embed-v2-index with nexus-repos namespace.
4
+ Also integrates Pinecone Assistant "pineosman2" for chat-based retrieval.
5
+
6
+ API key: loaded from env PINECONE_API_KEY
7
+ """
8
+ import os
9
+ from typing import List, Dict, Optional, Any
10
+ from dataclasses import dataclass
11
+
12
+ try:
13
+ from pinecone import Pinecone
14
+ from pinecone_plugins.assistant.models.chat import Message
15
+ PINECONE_AVAILABLE = True
16
+ except ImportError:
17
+ PINECONE_AVAILABLE = False
18
+
19
+
20
+ @dataclass
21
+ class RetrievalResult:
22
+ text: str
23
+ score: float
24
+ metadata: Dict[str, Any]
25
+ source: str # "vector" or "assistant"
26
+
27
+
28
+ class PineconeRetriever:
29
+ """
30
+ Dual-mode Pinecone retriever:
31
+ 1. Vector search: llama-text-embed-v2-index (dense embeddings)
32
+ 2. Assistant chat: pineosman2 (conversational RAG)
33
+ """
34
+
35
+ INDEX_NAME = "llama-text-embed-v2-index"
36
+ NAMESPACE = "nexus-repos"
37
+ ASSISTANT_NAME = "pineosman2"
38
+
39
+ def __init__(self, api_key: Optional[str] = None, top_k: int = 10):
40
+ if not PINECONE_AVAILABLE:
41
+ raise ImportError("pinecone SDK not installed. Run: pip install pinecone")
42
+ self.api_key = api_key or os.environ.get("PINECONE_API_KEY")
43
+ if not self.api_key:
44
+ raise ValueError("PINECONE_API_KEY required (env var or arg)")
45
+ self.pc = Pinecone(api_key=self.api_key)
46
+ self.index = self.pc.Index(self.INDEX_NAME)
47
+ self.assistant = self.pc.assistant.Assistant(assistant_name=self.ASSISTANT_NAME)
48
+ self.top_k = top_k
49
+
50
+ def vector_search(self, query: str, top_k: Optional[int] = None) -> List[RetrievalResult]:
51
+ """Dense vector search over nexus-repos namespace."""
52
+ k = top_k or self.top_k
53
+ results = self.index.search(
54
+ namespace=self.NAMESPACE,
55
+ vector={"input": query},
56
+ top_k=k,
57
+ include_metadata=True,
58
+ )
59
+ return [
60
+ RetrievalResult(
61
+ text=hit.get("metadata", {}).get("text", ""),
62
+ score=hit.get("score", 0.0),
63
+ metadata=hit.get("metadata", {}),
64
+ source="vector",
65
+ )
66
+ for hit in results.get("matches", [])
67
+ ]
68
+
69
+ def assistant_chat(self, query: str) -> str:
70
+ """Chat with Pinecone Assistant for conversational retrieval."""
71
+ msg = Message(content=query)
72
+ resp = self.assistant.chat(messages=[msg])
73
+ return resp.get("message", {}).get("content", "")
74
+
75
+ def assistant_chat_stream(self, query: str):
76
+ """Streaming chat with Pinecone Assistant."""
77
+ msg = Message(content=query)
78
+ chunks = self.assistant.chat(messages=[msg], stream=True)
79
+ for chunk in chunks:
80
+ if chunk:
81
+ yield chunk
82
+
83
+ def hybrid_retrieve(self, query: str) -> Dict[str, Any]:
84
+ """
85
+ Hybrid retrieval: vector results + assistant summary.
86
+ Returns structured evidence for TWAVE mu_ret calculation.
87
+ """
88
+ vector_results = self.vector_search(query)
89
+ assistant_answer = self.assistant_chat(query)
90
+
91
+ return {
92
+ "query": query,
93
+ "vector_results": [
94
+ {"text": r.text, "score": r.score, "metadata": r.metadata}
95
+ for r in vector_results
96
+ ],
97
+ "assistant_summary": assistant_answer,
98
+ "top_score": vector_results[0].score if vector_results else 0.0,
99
+ "avg_score": sum(r.score for r in vector_results) / len(vector_results) if vector_results else 0.0,
100
+ }
101
+
102
+ def get_evidence_for_ckplug(self, query: str) -> List[Dict[str, Any]]:
103
+ """
104
+ Format retrieval evidence for CK-PLUG token-level coupling.
105
+ Returns list of evidence chunks with relevance scores.
106
+ """
107
+ results = self.vector_search(query)
108
+ return [
109
+ {
110
+ "text": r.text,
111
+ "relevance": r.score,
112
+ "type": r.metadata.get("type", "unknown"),
113
+ "owner": r.metadata.get("owner", "unknown"),
114
+ }
115
+ for r in results
116
+ ]
117
+
118
+
119
+ # Mock retriever for offline testing
120
+ class MockPineconeRetriever:
121
+ """Offline mock of PineconeRetriever for development/testing."""
122
+
123
+ def __init__(self, top_k: int = 5):
124
+ self.top_k = top_k
125
+ self._mock_data = [
126
+ {"text": "NEXUS OS is a hybrid inference operating system with thermodynamic control.", "score": 0.95, "type": "repo", "owner": "specimba"},
127
+ {"text": "TWAVE uses Landau-Ginzburg free energy to detect hallucination bifurcations.", "score": 0.88, "type": "repo", "owner": "specimba"},
128
+ {"text": "CK-PLUG enables token-level confidence gain for retrieval coupling.", "score": 0.82, "type": "paper", "owner": "CAS"},
129
+ {"text": "Bose-Einstein condensate analogy provides stable reasoning at T≈0.8Tc.", "score": 0.79, "type": "research", "owner": "specimba"},
130
+ {"text": "QWAVE allocates inference budget across local and cloud tiers.", "score": 0.76, "type": "repo", "owner": "specimba"},
131
+ ]
132
+
133
+ def vector_search(self, query: str, top_k: Optional[int] = None) -> List[RetrievalResult]:
134
+ k = top_k or self.top_k
135
+ matches = []
136
+ for item in self._mock_data:
137
+ score = item["score"] * (0.5 + 0.5 * (len(set(query.lower().split()) & set(item["text"].lower().split())) / max(1, len(query.split()))))
138
+ matches.append(RetrievalResult(text=item["text"], score=score, metadata=item, source="vector"))
139
+ matches.sort(key=lambda x: x.score, reverse=True)
140
+ return matches[:k]
141
+
142
+ def hybrid_retrieve(self, query: str) -> Dict[str, Any]:
143
+ vector_results = self.vector_search(query)
144
+ return {
145
+ "query": query,
146
+ "vector_results": [{"text": r.text, "score": r.score, "metadata": r.metadata} for r in vector_results],
147
+ "assistant_summary": f"Mock summary for: {query}",
148
+ "top_score": vector_results[0].score if vector_results else 0.0,
149
+ "avg_score": sum(r.score for r in vector_results) / len(vector_results) if vector_results else 0.0,
150
+ }
151
+
152
+ def get_evidence_for_ckplug(self, query: str) -> List[Dict[str, Any]]:
153
+ results = self.vector_search(query)
154
+ return [{"text": r.text, "relevance": r.score, "type": r.metadata.get("type"), "owner": r.metadata.get("owner")} for r in results]