solana-agent 11.3.0__py3-none-any.whl → 14.0.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 (39) hide show
  1. solana_agent/__init__.py +33 -1
  2. solana_agent/adapters/__init__.py +6 -0
  3. solana_agent/adapters/llm_adapter.py +123 -0
  4. solana_agent/adapters/mongodb_adapter.py +69 -0
  5. solana_agent/client/__init__.py +0 -0
  6. solana_agent/client/solana_agent.py +75 -0
  7. solana_agent/domains/__init__.py +6 -0
  8. solana_agent/domains/agents.py +80 -0
  9. solana_agent/domains/routing.py +14 -0
  10. solana_agent/factories/__init__.py +0 -0
  11. solana_agent/factories/agent_factory.py +148 -0
  12. solana_agent/interfaces/__init__.py +11 -0
  13. solana_agent/interfaces/plugins/plugins.py +118 -0
  14. solana_agent/interfaces/providers/data_storage.py +53 -0
  15. solana_agent/interfaces/providers/llm.py +34 -0
  16. solana_agent/interfaces/providers/memory.py +38 -0
  17. solana_agent/interfaces/repositories/agent.py +33 -0
  18. solana_agent/interfaces/services/agent.py +41 -0
  19. solana_agent/interfaces/services/query.py +11 -0
  20. solana_agent/interfaces/services/routing.py +19 -0
  21. solana_agent/plugins/__init__.py +6 -0
  22. solana_agent/plugins/manager.py +147 -0
  23. solana_agent/plugins/registry.py +64 -0
  24. solana_agent/plugins/tools/__init__.py +10 -0
  25. solana_agent/plugins/tools/auto_tool.py +47 -0
  26. solana_agent/repositories/__init__.py +6 -0
  27. solana_agent/repositories/agent.py +99 -0
  28. solana_agent/repositories/memory.py +134 -0
  29. solana_agent/services/__init__.py +6 -0
  30. solana_agent/services/agent.py +320 -0
  31. solana_agent/services/query.py +223 -0
  32. solana_agent/services/routing.py +149 -0
  33. solana_agent-14.0.0.dist-info/METADATA +121 -0
  34. solana_agent-14.0.0.dist-info/RECORD +36 -0
  35. solana_agent/ai.py +0 -7590
  36. solana_agent-11.3.0.dist-info/METADATA +0 -443
  37. solana_agent-11.3.0.dist-info/RECORD +0 -6
  38. {solana_agent-11.3.0.dist-info → solana_agent-14.0.0.dist-info}/LICENSE +0 -0
  39. {solana_agent-11.3.0.dist-info → solana_agent-14.0.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,223 @@
1
+ """
2
+ Query service implementation.
3
+
4
+ This service orchestrates the processing of user queries, coordinating
5
+ other services to provide comprehensive responses while maintaining
6
+ clean separation of concerns.
7
+ """
8
+ from typing import Any, AsyncGenerator, Dict, Optional
9
+
10
+ from solana_agent.interfaces.services.query import QueryService as QueryServiceInterface
11
+ from solana_agent.services.agent import AgentService
12
+ from solana_agent.services.routing import RoutingService
13
+ from solana_agent.interfaces.providers.memory import MemoryProvider
14
+
15
+
16
+ class QueryService(QueryServiceInterface):
17
+ """Service for processing user queries and coordinating response generation."""
18
+
19
+ def __init__(
20
+ self,
21
+ agent_service: AgentService,
22
+ routing_service: RoutingService,
23
+ memory_provider: Optional[MemoryProvider] = None,
24
+ ):
25
+ """Initialize the query service.
26
+
27
+ Args:
28
+ agent_service: Service for AI agent management
29
+ routing_service: Service for routing queries to appropriate agents
30
+ memory_provider: Optional provider for memory storage and retrieval
31
+ """
32
+ self.agent_service = agent_service
33
+ self.routing_service = routing_service
34
+ self.memory_provider = memory_provider
35
+
36
+ async def process(
37
+ self, user_id: str, user_text: str, timezone: str = None
38
+ ) -> AsyncGenerator[str, None]: # pragma: no cover
39
+ """Process the user request with appropriate agent.
40
+
41
+ Args:
42
+ user_id: User ID
43
+ user_text: User query text
44
+ timezone: Optional user timezone
45
+
46
+ Yields:
47
+ Response text chunks
48
+ """
49
+ try:
50
+ # Handle simple greetings
51
+ if user_text.strip().lower() in ["test", "hello", "hi", "hey", "ping"]:
52
+ response = f"Hello! How can I help you today?"
53
+ yield response
54
+ # Store simple interaction in memory
55
+ if self.memory_provider:
56
+ await self._store_conversation(user_id, user_text, response)
57
+ return
58
+
59
+ # Get memory context if available
60
+ memory_context = ""
61
+ if self.memory_provider:
62
+ memory_context = await self.memory_provider.retrieve(user_id)
63
+
64
+ # Route query to appropriate agent
65
+ agent_name = await self.routing_service.route_query(user_id, user_text)
66
+
67
+ # Generate response
68
+ full_response = ""
69
+ async for chunk in self.agent_service.generate_response(
70
+ agent_name=agent_name,
71
+ user_id=user_id,
72
+ query=user_text,
73
+ memory_context=memory_context
74
+ ):
75
+ yield chunk
76
+ full_response += chunk
77
+
78
+ # Store conversation and extract insights
79
+ if self.memory_provider:
80
+ await self._store_conversation(user_id, user_text, full_response)
81
+
82
+ except Exception as e:
83
+ yield f"I apologize for the technical difficulty. {str(e)}"
84
+ import traceback
85
+ print(f"Error in query processing: {str(e)}")
86
+ print(traceback.format_exc())
87
+
88
+ async def get_user_history(
89
+ self,
90
+ user_id: str,
91
+ page_num: int = 1,
92
+ page_size: int = 20,
93
+ sort_order: str = "asc" # "asc" for oldest-first, "desc" for newest-first
94
+ ) -> Dict[str, Any]:
95
+ """Get paginated message history for a user.
96
+
97
+ Args:
98
+ user_id: User ID
99
+ page_num: Page number (starting from 1)
100
+ page_size: Number of messages per page
101
+ sort_order: Sort order ("asc" or "desc")
102
+
103
+ Returns:
104
+ Dictionary with paginated results and metadata:
105
+ {
106
+ "data": List of conversation entries,
107
+ "total": Total number of entries,
108
+ "page": Current page number,
109
+ "page_size": Number of items per page,
110
+ "total_pages": Total number of pages,
111
+ "error": Error message if any
112
+ }
113
+ """
114
+ if not self.memory_provider:
115
+ return {
116
+ "data": [],
117
+ "total": 0,
118
+ "page": page_num,
119
+ "page_size": page_size,
120
+ "total_pages": 0,
121
+ "error": "Memory provider not available"
122
+ }
123
+
124
+ try:
125
+ # Calculate skip and limit for pagination
126
+ skip = (page_num - 1) * page_size
127
+
128
+ # Get total count of documents
129
+ total = self.memory_provider.count_documents(
130
+ collection="conversations",
131
+ query={"user_id": user_id}
132
+ )
133
+
134
+ # Calculate total pages
135
+ total_pages = (total + page_size - 1) // page_size
136
+
137
+ # Get paginated results
138
+ conversations = self.memory_provider.find(
139
+ collection="conversations",
140
+ query={"user_id": user_id},
141
+ sort=[("timestamp", 1 if sort_order == "asc" else -1)],
142
+ skip=skip,
143
+ limit=page_size
144
+ )
145
+
146
+ # Format the results
147
+ formatted_conversations = []
148
+ for conv in conversations:
149
+ formatted_conversations.append({
150
+ "id": str(conv.get("_id")),
151
+ "user_message": conv.get("user_message"),
152
+ "assistant_message": conv.get("assistant_message"),
153
+ "timestamp": conv.get("timestamp").isoformat()
154
+ if conv.get("timestamp") else None
155
+ })
156
+
157
+ return {
158
+ "data": formatted_conversations,
159
+ "total": total,
160
+ "page": page_num,
161
+ "page_size": page_size,
162
+ "total_pages": total_pages,
163
+ "error": None
164
+ }
165
+
166
+ except Exception as e:
167
+ print(f"Error retrieving user history: {str(e)}")
168
+ import traceback
169
+ print(traceback.format_exc())
170
+ return {
171
+ "data": [],
172
+ "total": 0,
173
+ "page": page_num,
174
+ "page_size": page_size,
175
+ "total_pages": 0,
176
+ "error": f"Error retrieving history: {str(e)}"
177
+ }
178
+
179
+ async def _store_conversation(
180
+ self, user_id: str, user_text: str, response_text: str
181
+ ) -> None:
182
+ """Store conversation history in memory provider.
183
+
184
+ Args:
185
+ user_id: User ID
186
+ user_text: User message
187
+ response_text: Assistant response
188
+ """
189
+ if self.memory_provider:
190
+ try:
191
+ # Truncate excessively long responses
192
+ truncated_response = self._truncate(response_text)
193
+
194
+ await self.memory_provider.store(
195
+ user_id,
196
+ [
197
+ {"role": "user", "content": user_text},
198
+ {"role": "assistant", "content": truncated_response},
199
+ ],
200
+ )
201
+ except Exception as e:
202
+ print(f"Error storing conversation: {e}")
203
+
204
+ def _truncate(self, text: str, limit: int = 2500) -> str:
205
+ """Truncate text to be within token limits.
206
+
207
+ Args:
208
+ text: Text to truncate
209
+ limit: Character limit
210
+
211
+ Returns:
212
+ Truncated text
213
+ """
214
+ if len(text) <= limit:
215
+ return text
216
+
217
+ # Try to truncate at a sentence boundary
218
+ truncated = text[:limit]
219
+ last_period = truncated.rfind(".")
220
+ if last_period > limit * 0.8: # Only use period if reasonably close to the end
221
+ return truncated[:last_period + 1]
222
+
223
+ return truncated + "..."
@@ -0,0 +1,149 @@
1
+ """
2
+ Routing service implementation.
3
+
4
+ This service manages query routing to appropriate agents based on
5
+ specializations and query analysis.
6
+ """
7
+ from typing import Dict, List, Optional, Any
8
+ from solana_agent.interfaces.services.routing import RoutingService as RoutingServiceInterface
9
+ from solana_agent.interfaces.services.agent import AgentService
10
+ from solana_agent.interfaces.providers.llm import LLMProvider
11
+ from solana_agent.domains.routing import QueryAnalysis
12
+
13
+
14
+ class RoutingService(RoutingServiceInterface):
15
+ """Service for routing queries to appropriate agents."""
16
+
17
+ def __init__(
18
+ self,
19
+ llm_provider: LLMProvider,
20
+ agent_service: AgentService,
21
+ ):
22
+ """Initialize the routing service.
23
+
24
+ Args:
25
+ llm_provider: Provider for language model interactions
26
+ agent_service: Service for agent management
27
+ """
28
+ self.llm_provider = llm_provider
29
+ self.agent_service = agent_service
30
+
31
+ async def _analyze_query(self, query: str) -> Dict[str, Any]:
32
+ """Analyze a query to determine routing information.
33
+
34
+ Args:
35
+ query: User query to analyze
36
+
37
+ Returns:
38
+ Analysis results including specializations and complexity
39
+ """
40
+ prompt = f"""
41
+ Analyze this user query and determine:
42
+ 1. The primary specialization needed to address it
43
+ 2. Any secondary specializations that might be helpful
44
+ 3. The complexity level (1-5, where 5 is most complex)
45
+ 4. Any key topics or technologies mentioned
46
+
47
+ User Query: {query}
48
+
49
+ Be objective and thorough in your analysis.
50
+ """
51
+
52
+ try:
53
+ analysis = await self.llm_provider.parse_structured_output(
54
+ prompt=prompt,
55
+ system_prompt="Analyze user queries to determine appropriate routing.",
56
+ model_class=QueryAnalysis,
57
+ temperature=0.2
58
+ )
59
+
60
+ return {
61
+ "primary_specialization": analysis.primary_specialization,
62
+ "secondary_specializations": analysis.secondary_specializations,
63
+ "complexity_level": analysis.complexity_level,
64
+ "topics": analysis.topics,
65
+ "confidence": analysis.confidence
66
+ }
67
+ except Exception as e:
68
+ print(f"Error analyzing query: {e}")
69
+ # Return default analysis on error
70
+ return {
71
+ "primary_specialization": "general",
72
+ "secondary_specializations": [],
73
+ "complexity_level": 1,
74
+ "topics": [],
75
+ "confidence": 0.0
76
+ }
77
+
78
+ async def route_query(self, user_id: str, query: str) -> str:
79
+ """Route a query to the appropriate agent.
80
+
81
+ Args:
82
+ user_id: ID of the user making the query
83
+ query: The query text
84
+
85
+ Returns:
86
+ Name of the selected agent
87
+ """
88
+ # Analyze query
89
+ analysis = await self._analyze_query(query)
90
+
91
+ # Find best agent based on analysis
92
+ selected_agent = await self._find_best_ai_agent(
93
+ analysis["primary_specialization"],
94
+ analysis["secondary_specializations"]
95
+ )
96
+
97
+ # Return default agent if none found
98
+ return selected_agent or "general_ai"
99
+
100
+ async def _find_best_ai_agent(
101
+ self,
102
+ primary_specialization: str,
103
+ secondary_specializations: List[str],
104
+ ) -> Optional[str]:
105
+ """Find the best AI agent for a query.
106
+
107
+ Args:
108
+ primary_specialization: Primary specialization needed
109
+ secondary_specializations: Secondary specializations
110
+
111
+ Returns:
112
+ Name of the best matching agent, or None if no match
113
+ """
114
+ # Get all AI agents
115
+ ai_agents = self.agent_service.get_all_ai_agents()
116
+ if not ai_agents:
117
+ return None
118
+
119
+ # Create a list to score agents
120
+ agent_scores = []
121
+
122
+ for agent_id, agent in ai_agents.items():
123
+ # Base score
124
+ score = 0
125
+
126
+ # Check primary specialization
127
+ if agent.specialization.lower() == primary_specialization.lower():
128
+ score += 10
129
+
130
+ # Check secondary specializations
131
+ if hasattr(agent, 'secondary_specializations'):
132
+ for sec_spec in secondary_specializations:
133
+ if sec_spec.lower() in [s.lower() for s in agent.secondary_specializations]:
134
+ score += 3
135
+
136
+ agent_scores.append((agent_id, score))
137
+
138
+ # Sort by score
139
+ agent_scores.sort(key=lambda x: x[1], reverse=True)
140
+
141
+ # Return the highest scoring agent, if any
142
+ if agent_scores and agent_scores[0][1] > 0:
143
+ return agent_scores[0][0]
144
+
145
+ # If no good match, return the first AI agent as fallback
146
+ if ai_agents:
147
+ return next(iter(ai_agents.keys()))
148
+
149
+ return None
@@ -0,0 +1,121 @@
1
+ Metadata-Version: 2.3
2
+ Name: solana-agent
3
+ Version: 14.0.0
4
+ Summary: The Future of Work
5
+ License: MIT
6
+ Keywords: ai,openai,ai agents,agi
7
+ Author: Bevan Hunt
8
+ Author-email: bevan@bevanhunt.com
9
+ Requires-Python: >=3.12,<4.0
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
16
+ Requires-Dist: ntplib (>=0.4.0,<0.5.0)
17
+ Requires-Dist: openai (>=1.67.0,<2.0.0)
18
+ Requires-Dist: pandas (>=2.2.3,<3.0.0)
19
+ Requires-Dist: pinecone (>=6.0.2,<7.0.0)
20
+ Requires-Dist: pydantic (>=2.10.6,<3.0.0)
21
+ Requires-Dist: pymongo (>=4.11.3,<5.0.0)
22
+ Requires-Dist: qdrant-client (>=1.13.3,<2.0.0)
23
+ Requires-Dist: requests (>=2.32.3,<3.0.0)
24
+ Requires-Dist: zep-cloud (>=2.7.0,<3.0.0)
25
+ Requires-Dist: zep-python (>=2.0.2,<3.0.0)
26
+ Project-URL: Repository, https://github.com/truemagic-coder/solana-agent
27
+ Description-Content-Type: text/markdown
28
+
29
+ # Solana Agent
30
+
31
+ [![PyPI - Version](https://img.shields.io/pypi/v/solana-agent)](https://pypi.org/project/solana-agent/)
32
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
33
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-orange.svg)](https://www.python.org/downloads/)
34
+ [![codecov](https://img.shields.io/codecov/c/github/truemagic-coder/solana-agent/main.svg)](https://codecov.io/gh/truemagic-coder/solana-agent)
35
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/truemagic-coder/solana-agent/test.yml?branch=main)](https://github.com/truemagic-coder/solana-agent/actions/workflows/test.yml)
36
+
37
+ ![Solana Agent Logo](https://dl.walletbubbles.com/solana-agent-logo.png?width=200)
38
+
39
+ ## Technical Features
40
+
41
+ * Text streaming messages by AI Agents
42
+ * Routing based on AI Agent specializations
43
+ * Built-in default Internet Search for AI Agents
44
+ * Robust AI Agent tool plugins based on standard python packages
45
+
46
+ ## Installation
47
+
48
+ You can install Solana Agent using pip:
49
+
50
+ `pip install solana-agent`
51
+
52
+ ## Documentation
53
+
54
+ Each public method has a docstring for real-time IDE hinting.
55
+
56
+ ## Example App
57
+
58
+ ```python
59
+ from solana_agent import SolanaAgent
60
+
61
+ config = {
62
+ "organization": {
63
+ "mission_statement": "To revolutionize knowledge work through AI-human collaboration that puts people first.",
64
+ "values": {
65
+ "Human-Centered": "Always prioritize human well-being and augmentation over replacement.",
66
+ "Transparency": "Provide clear explanations for decisions and never hide information.",
67
+ "Collective Intelligence": "Value diverse perspectives and combine human and AI strengths.",
68
+ "Continuous Learning": "Embrace feedback and continuously improve based on experience."
69
+ },
70
+ "goals": [
71
+ "Enable human experts to focus on high-value creative work",
72
+ "Reduce administrative overhead through intelligent automation",
73
+ "Create seamless knowledge flow across the organization"
74
+ ],
75
+ "guidance": "When making decisions, prioritize long-term user success over short-term efficiency."
76
+ },
77
+ "mongo": {
78
+ "connection_string": "mongodb://localhost:27017",
79
+ "database": "solana_agent"
80
+ },
81
+ "openai": {
82
+ "api_key": "your-openai-key",
83
+ "default_model": "gpt-4o-mini"
84
+ },
85
+ "agents": [
86
+ {
87
+ "name": "research_specialist",
88
+ "instructions": "You are an expert researcher who synthesizes complex information clearly.",
89
+ "specialization": "Research and knowledge synthesis",
90
+ "model": "o3-mini",
91
+ "tools": ["some_tool"]
92
+ },
93
+ {
94
+ "name": "customer_support",
95
+ "instructions": "You provide friendly, helpful customer support responses.",
96
+ "specialization": "Customer inquiries",
97
+ "model": "gpt-4o-mini"
98
+ }
99
+ ],
100
+ }
101
+
102
+ # Create agent with configuration
103
+ solana_agent = SolanaAgent(config=config)
104
+
105
+ # Process a query that can use tools
106
+ async for response in solana_agent.process("user123", "What are the latest AI developments?"):
107
+ print(response, end="")
108
+ ```
109
+
110
+ ## Solana Agent Kit (plugins collection)
111
+
112
+ [Solana Agent Kit](https://github.com/truemagic-coder/solana-agent-kit)
113
+
114
+ ## Example App
115
+
116
+ [Solana Agent Example App](https://github.com/truemagic-coder/solana-agent-app)
117
+
118
+ ## License
119
+
120
+ This project is licensed under the MIT License - see the LICENSE file for details.
121
+
@@ -0,0 +1,36 @@
1
+ solana_agent/__init__.py,sha256=ceYeUpjIitpln8YK1r0JVJU8mzG6cRPYu-HLny3d-Tw,887
2
+ solana_agent/adapters/__init__.py,sha256=tiEEuuy0NF3ngc_tGEcRTt71zVI58v3dYY9RvMrF2Cg,204
3
+ solana_agent/adapters/llm_adapter.py,sha256=-MmQL71JlNJeWr16a-qZ5OzTg1_69ewgAR9ZSwXpsbw,4326
4
+ solana_agent/adapters/mongodb_adapter.py,sha256=zvcIZ61zx45cwfjMimXC2RV_D_s6sL5b2Dz6H3HCgFc,2456
5
+ solana_agent/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ solana_agent/client/solana_agent.py,sha256=SDspEitajVL3q2C0zlVoeE6iGTC4vWSd5vcRLZFUhXg,2600
7
+ solana_agent/domains/__init__.py,sha256=HiC94wVPRy-QDJSSRywCRrhrFfTBeHjfi5z-QfZv46U,168
8
+ solana_agent/domains/agents.py,sha256=S8OKtkUQ7npl8bZrSH64TZuu5bnwnMYXXx3IbKvJOuU,3005
9
+ solana_agent/domains/routing.py,sha256=UDlgTjUoC9xIBVYu_dnf9-KG_bBgdEXAv_UtDOrYo0w,650
10
+ solana_agent/factories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ solana_agent/factories/agent_factory.py,sha256=yjB3G8ItXFH3DaoRf1BB1acPnL84Pd2pbqz5W03-5Jc,5711
12
+ solana_agent/interfaces/__init__.py,sha256=IQs1WIM1FeKP1-kY2FEfyhol_dB-I-VAe2rD6jrVF6k,355
13
+ solana_agent/interfaces/plugins/plugins.py,sha256=TMmTXwHhmkdJpIhgADfrpGGGk7PHP7O9Qi89uA26uMI,3013
14
+ solana_agent/interfaces/providers/data_storage.py,sha256=Qjui9ISvX_NtOUPTUyjPMNxDoYRpml-aMG8DZy_Qxzc,1509
15
+ solana_agent/interfaces/providers/llm.py,sha256=y4OFj2Wq4XicMxArWsYBHSp6cFe3BcK9sCemfyaWV_A,887
16
+ solana_agent/interfaces/providers/memory.py,sha256=oNOH8WZXVW8assDigIWZAWiwkxbpDiKupxA2RB6tQvQ,1010
17
+ solana_agent/interfaces/repositories/agent.py,sha256=HZL5q7DoOj-qK5IDSShAJnu4_A75OR0xgJD_2W6Zr6k,820
18
+ solana_agent/interfaces/services/agent.py,sha256=JHUVsxAnOsopiNilU_zDBAhJfQT_BFrtOczDL2atoZo,1407
19
+ solana_agent/interfaces/services/query.py,sha256=6SILNgSIkUsCnhn6EqdmsfPFTieawGbNJq56a3TzgSA,307
20
+ solana_agent/interfaces/services/routing.py,sha256=tKMK97m6U5I__F406sm60az4QInGLX_N3knc_AbMZ80,452
21
+ solana_agent/plugins/__init__.py,sha256=coZdgJKq1ExOaj6qB810i3rEhbjdVlrkN76ozt_Ojgo,193
22
+ solana_agent/plugins/manager.py,sha256=GWwhfMBn9THwVn7biOvVa25GLthCA1ilWIoDkt5hXNI,5084
23
+ solana_agent/plugins/registry.py,sha256=dRKWoOEqiU7OLsjpBWf4VJfDQYZdJPjW5AKxeITmVMA,2283
24
+ solana_agent/plugins/tools/__init__.py,sha256=c0z7ij42gs94_VJrcn4Y8gUlTxMhsFNY6ahIsNswdLk,231
25
+ solana_agent/plugins/tools/auto_tool.py,sha256=Z3CcOzwdXpzciH-5yphhd9qt1b9owTxhwC-dYmPF6B0,1489
26
+ solana_agent/repositories/__init__.py,sha256=fP83w83CGzXLnSdq-C5wbw9EhWTYtqE2lQTgp46-X_4,163
27
+ solana_agent/repositories/agent.py,sha256=7FTT3WvOaBacWme7d-qaOyqAlUhf9LVLXnIiPb16FDk,3188
28
+ solana_agent/repositories/memory.py,sha256=0wgoa2bXhpgdBgn9-i9G10PB1bMGYObxcoY9Newll40,4742
29
+ solana_agent/services/__init__.py,sha256=ab_NXJmwYUCmCrCzuTlZ47bJZINW0Y0F5jfQ9OovidU,163
30
+ solana_agent/services/agent.py,sha256=-IKdDNvq-T_xEkOt7q2oG0xklL07_RUrc2NT1YIle9c,11426
31
+ solana_agent/services/query.py,sha256=N8UULC7RrxxX-mQUjporduKj7auKV899n2B9Amol_ss,7767
32
+ solana_agent/services/routing.py,sha256=L3nZaMeX4ENYfHoc2KrOtfzhScCWfrXS5RRaUIJPwNY,4956
33
+ solana_agent-14.0.0.dist-info/LICENSE,sha256=BnSRc-NSFuyF2s496l_4EyrwAP6YimvxWcjPiJ0J7g4,1057
34
+ solana_agent-14.0.0.dist-info/METADATA,sha256=u_s6RqaKolKU180Z8LYehkw-5cuogb1XsB67a6d8aWo,4569
35
+ solana_agent-14.0.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
36
+ solana_agent-14.0.0.dist-info/RECORD,,