solana-agent 22.0.0__tar.gz → 22.0.2__tar.gz

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 (35) hide show
  1. {solana_agent-22.0.0 → solana_agent-22.0.2}/PKG-INFO +61 -9
  2. {solana_agent-22.0.0 → solana_agent-22.0.2}/README.md +60 -8
  3. {solana_agent-22.0.0 → solana_agent-22.0.2}/pyproject.toml +1 -1
  4. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/adapters/llm_adapter.py +14 -16
  5. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/client/solana_agent.py +2 -2
  6. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/client/client.py +1 -1
  7. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/providers/llm.py +1 -1
  8. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/services/agent.py +1 -1
  9. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/services/query.py +1 -1
  10. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/services/agent.py +1 -1
  11. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/services/query.py +4 -3
  12. {solana_agent-22.0.0 → solana_agent-22.0.2}/LICENSE +0 -0
  13. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/__init__.py +0 -0
  14. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/adapters/__init__.py +0 -0
  15. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/adapters/mongodb_adapter.py +0 -0
  16. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/client/__init__.py +0 -0
  17. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/domains/__init__.py +0 -0
  18. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/domains/agent.py +0 -0
  19. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/domains/routing.py +0 -0
  20. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/factories/__init__.py +0 -0
  21. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/factories/agent_factory.py +0 -0
  22. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/__init__.py +0 -0
  23. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/plugins/plugins.py +0 -0
  24. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/providers/data_storage.py +0 -0
  25. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/providers/memory.py +0 -0
  26. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/interfaces/services/routing.py +0 -0
  27. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/plugins/__init__.py +0 -0
  28. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/plugins/manager.py +0 -0
  29. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/plugins/registry.py +0 -0
  30. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/plugins/tools/__init__.py +0 -0
  31. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/plugins/tools/auto_tool.py +0 -0
  32. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/repositories/__init__.py +0 -0
  33. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/repositories/memory.py +0 -0
  34. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/services/__init__.py +0 -0
  35. {solana_agent-22.0.0 → solana_agent-22.0.2}/solana_agent/services/routing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: solana-agent
3
- Version: 22.0.0
3
+ Version: 22.0.2
4
4
  Summary: Agentic IQ
5
5
  License: MIT
6
6
  Keywords: ai,openai,ai agents,agi
@@ -49,7 +49,6 @@ Build your AI business in three lines of code!
49
49
  * Extensible Tooling
50
50
  * Simple Business Definition
51
51
  * Tested & Secure
52
- * Support for MCP Servers
53
52
  * Built in Python
54
53
  * Deployed by [CometHeart](https://cometheart.com) & [WalletBubbles](https://walletbubbles.com)
55
54
 
@@ -66,7 +65,6 @@ Build your AI business in three lines of code!
66
65
  * Powerful tool integration using standard Python packages and/or inline tools
67
66
  * Assigned tools are utilized by agents automatically and effectively
68
67
  * Simple business definition using JSON
69
- * Ability to access any MCP server via URL
70
68
 
71
69
  ## Stack
72
70
 
@@ -251,9 +249,59 @@ async for response in solana_agent.process("user123", "Write me a poem.", intern
251
249
  print(response, end="")
252
250
  ```
253
251
 
254
- ## Advanced
252
+ ### Customize Audio Voice
255
253
 
256
- ### Custom Inline Tools
254
+ This is an audio to audio example using the `audio_instructions` parameter.
255
+
256
+ ```python
257
+ async for response in solana_agent.process("user123", audio_content, output_format="audio", audio_voice="nova", audio_input_format="webm", audio_output_format="aac", audio_instructions="You speak with an American southern accent"):
258
+ print(response, end="")
259
+ ```
260
+
261
+ ## Tools
262
+
263
+ Tools can be used from plugins like Solana Agent Kit (sakit) or via custom inline tools. Tools available via plugins integrate automatically with Solana Agent.
264
+
265
+ ### Plugin Usage Example
266
+
267
+ `pip install sakit`
268
+
269
+ ```python
270
+ from solana_agent import SolanaAgent
271
+
272
+ config = {
273
+ "openai": {
274
+ "api_key": "your-openai-api-key",
275
+ },
276
+ "tools": {
277
+ "search_internet": {
278
+ "api_key": "your-perplexity-key", # Required
279
+ "citations": True, # Optional, defaults to True
280
+ "model": "sonar" # Optional, defaults to "sonar"
281
+ },
282
+ },
283
+ "agents": [
284
+ {
285
+ "name": "research_specialist",
286
+ "instructions": "You are an expert researcher who synthesizes complex information clearly.",
287
+ "specialization": "Research and knowledge synthesis",
288
+ "tools": ["search_internet"],
289
+ },
290
+ {
291
+ "name": "customer_support",
292
+ "instructions": "You provide friendly, helpful customer support responses.",
293
+ "specialization": "Customer inquiries",
294
+ }
295
+ ],
296
+ }
297
+
298
+ solana_agent = SolanaAgent(config=config)
299
+
300
+ async for response in solana_agent.process("user123", "What are the latest AI developments?", internet_search=False):
301
+ print(response, end="")
302
+ ```
303
+
304
+ ### Custom Inline Tool Example
257
305
 
258
306
  ```python
259
307
  from solana_agent import SolanaAgent
@@ -333,9 +381,11 @@ async for response in solana_agent.process("user123", "What are the latest AI de
333
381
  print(response, end="")
334
382
  ```
335
383
 
336
- ### Custom Prompt Injection at Runtime
384
+ ## Training your Agents
337
385
 
338
- Useful for Knowledge Base answers and FAQs
386
+ Many use-cases for Solana Agent require training your agents on your company data.
387
+
388
+ This can be accomplished via runtime prompt injection. Integrations that work well with this method are KBs like Pinecone and FAQs.
339
389
 
340
390
  ```python
341
391
  from solana_agent import SolanaAgent
@@ -360,11 +410,13 @@ config = {
360
410
 
361
411
  solana_agent = SolanaAgent(config=config)
362
412
 
363
- async for response in solana_agent.process("user123", "What are the latest AI developments?", "Always end your sentences with eh?"):
413
+ async for response in solana_agent.process("user123", "What are the latest AI developments?", "This is my FAQ"):
364
414
  print(response, end="")
365
415
  ```
366
416
 
367
- ### Custom Routing
417
+ ## Custom Routing
418
+
419
+ In advanced cases like implementing a ticketing system on-top of Solana Agent - you can use your own router.
368
420
 
369
421
  ```python
370
422
  from solana_agent import SolanaAgent
@@ -25,7 +25,6 @@ Build your AI business in three lines of code!
25
25
  * Extensible Tooling
26
26
  * Simple Business Definition
27
27
  * Tested & Secure
28
- * Support for MCP Servers
29
28
  * Built in Python
30
29
  * Deployed by [CometHeart](https://cometheart.com) & [WalletBubbles](https://walletbubbles.com)
31
30
 
@@ -42,7 +41,6 @@ Build your AI business in three lines of code!
42
41
  * Powerful tool integration using standard Python packages and/or inline tools
43
42
  * Assigned tools are utilized by agents automatically and effectively
44
43
  * Simple business definition using JSON
45
- * Ability to access any MCP server via URL
46
44
 
47
45
  ## Stack
48
46
 
@@ -227,9 +225,59 @@ async for response in solana_agent.process("user123", "Write me a poem.", intern
227
225
  print(response, end="")
228
226
  ```
229
227
 
230
- ## Advanced
228
+ ### Customize Audio Voice
231
229
 
232
- ### Custom Inline Tools
230
+ This is an audio to audio example using the `audio_instructions` parameter.
231
+
232
+ ```python
233
+ async for response in solana_agent.process("user123", audio_content, output_format="audio", audio_voice="nova", audio_input_format="webm", audio_output_format="aac", audio_instructions="You speak with an American southern accent"):
234
+ print(response, end="")
235
+ ```
236
+
237
+ ## Tools
238
+
239
+ Tools can be used from plugins like Solana Agent Kit (sakit) or via custom inline tools. Tools available via plugins integrate automatically with Solana Agent.
240
+
241
+ ### Plugin Usage Example
242
+
243
+ `pip install sakit`
244
+
245
+ ```python
246
+ from solana_agent import SolanaAgent
247
+
248
+ config = {
249
+ "openai": {
250
+ "api_key": "your-openai-api-key",
251
+ },
252
+ "tools": {
253
+ "search_internet": {
254
+ "api_key": "your-perplexity-key", # Required
255
+ "citations": True, # Optional, defaults to True
256
+ "model": "sonar" # Optional, defaults to "sonar"
257
+ },
258
+ },
259
+ "agents": [
260
+ {
261
+ "name": "research_specialist",
262
+ "instructions": "You are an expert researcher who synthesizes complex information clearly.",
263
+ "specialization": "Research and knowledge synthesis",
264
+ "tools": ["search_internet"],
265
+ },
266
+ {
267
+ "name": "customer_support",
268
+ "instructions": "You provide friendly, helpful customer support responses.",
269
+ "specialization": "Customer inquiries",
270
+ }
271
+ ],
272
+ }
273
+
274
+ solana_agent = SolanaAgent(config=config)
275
+
276
+ async for response in solana_agent.process("user123", "What are the latest AI developments?", internet_search=False):
277
+ print(response, end="")
278
+ ```
279
+
280
+ ### Custom Inline Tool Example
233
281
 
234
282
  ```python
235
283
  from solana_agent import SolanaAgent
@@ -309,9 +357,11 @@ async for response in solana_agent.process("user123", "What are the latest AI de
309
357
  print(response, end="")
310
358
  ```
311
359
 
312
- ### Custom Prompt Injection at Runtime
360
+ ## Training your Agents
313
361
 
314
- Useful for Knowledge Base answers and FAQs
362
+ Many use-cases for Solana Agent require training your agents on your company data.
363
+
364
+ This can be accomplished via runtime prompt injection. Integrations that work well with this method are KBs like Pinecone and FAQs.
315
365
 
316
366
  ```python
317
367
  from solana_agent import SolanaAgent
@@ -336,11 +386,13 @@ config = {
336
386
 
337
387
  solana_agent = SolanaAgent(config=config)
338
388
 
339
- async for response in solana_agent.process("user123", "What are the latest AI developments?", "Always end your sentences with eh?"):
389
+ async for response in solana_agent.process("user123", "What are the latest AI developments?", "This is my FAQ"):
340
390
  print(response, end="")
341
391
  ```
342
392
 
343
- ### Custom Routing
393
+ ## Custom Routing
394
+
395
+ In advanced cases like implementing a ticketing system on-top of Solana Agent - you can use your own router.
344
396
 
345
397
  ```python
346
398
  from solana_agent import SolanaAgent
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "solana-agent"
3
- version = "22.0.0"
3
+ version = "22.0.2"
4
4
  description = "Agentic IQ"
5
5
  authors = ["Bevan Hunt <bevan@bevanhunt.com>"]
6
6
  license = "MIT"
@@ -22,12 +22,12 @@ class OpenAIAdapter(LLMProvider):
22
22
  self.text_model = "gpt-4o-mini"
23
23
  self.internet_search_model = "gpt-4o-mini-search-preview"
24
24
  self.transcription_model = "gpt-4o-mini-transcribe"
25
- self.tts_model = "tts-1"
25
+ self.tts_model = "gpt-4o-mini-tts"
26
26
 
27
27
  async def tts(
28
28
  self,
29
29
  text: str,
30
- instructions: str = "",
30
+ instructions: str = "You speak in a friendly and helpful manner.",
31
31
  voice: Literal["alloy", "ash", "ballad", "coral", "echo",
32
32
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
33
33
  response_format: Literal['mp3', 'opus',
@@ -45,16 +45,16 @@ class OpenAIAdapter(LLMProvider):
45
45
  Audio bytes as they become available
46
46
  """
47
47
  try:
48
- stream = self.client.audio.speech.create(
48
+ with self.client.audio.speech.with_streaming_response.create(
49
49
  model=self.tts_model,
50
50
  voice=voice,
51
+ instructions=instructions,
51
52
  input=text,
52
53
  response_format=response_format
53
- )
54
-
55
- # Stream the bytes in chunks
56
- for chunk in stream.iter_bytes(chunk_size=1024 * 16): # 16KB chunks
57
- yield chunk
54
+ ) as stream:
55
+ # Stream the bytes in 16KB chunks
56
+ for chunk in stream.iter_bytes(chunk_size=1024 * 16):
57
+ yield chunk
58
58
 
59
59
  except Exception as e:
60
60
  print(f"Error in text_to_speech: {str(e)}")
@@ -66,7 +66,7 @@ class OpenAIAdapter(LLMProvider):
66
66
  print(f"Error in text_to_speech: {str(e)}")
67
67
  import traceback
68
68
  print(traceback.format_exc())
69
- yield f"I apologize, but I encountered an error converting text to speech: {str(e)}"
69
+ yield b"" # Return empty bytes on error
70
70
 
71
71
  async def transcribe_audio(
72
72
  self,
@@ -85,16 +85,14 @@ class OpenAIAdapter(LLMProvider):
85
85
  Transcript text chunks as they become available
86
86
  """
87
87
  try:
88
- stream = self.client.audio.transcriptions.create(
88
+ with self.client.audio.transcriptions.with_streaming_response.create(
89
89
  model=self.transcription_model,
90
90
  file=(f"file.{input_format}", audio_bytes),
91
91
  response_format="text",
92
- stream=True
93
- )
94
-
95
- for event in stream:
96
- if hasattr(event, 'text') and event.text:
97
- yield event.text
92
+ ) as stream:
93
+ # Stream the text in 16KB chunks
94
+ for chunk in stream.iter_text(chunk_size=1024 * 16):
95
+ yield chunk
98
96
 
99
97
  except Exception as e:
100
98
  print(f"Error in transcribe_audio: {str(e)}")
@@ -49,7 +49,7 @@ class SolanaAgent(SolanaAgentInterface):
49
49
  output_format: Literal["text", "audio"] = "text",
50
50
  audio_voice: Literal["alloy", "ash", "ballad", "coral", "echo",
51
51
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
52
- audio_instructions: Optional[str] = None,
52
+ audio_instructions: str = "You speak in a friendly and helpful manner.",
53
53
  audio_output_format: Literal['mp3', 'opus',
54
54
  'aac', 'flac', 'wav', 'pcm'] = "aac",
55
55
  audio_input_format: Literal[
@@ -66,7 +66,7 @@ class SolanaAgent(SolanaAgentInterface):
66
66
  prompt: Optional prompt for the agent
67
67
  output_format: Response format ("text" or "audio")
68
68
  audio_voice: Voice to use for audio output
69
- audio_instructions: Not used currently
69
+ audio_instructions: Audio voice instructions
70
70
  audio_output_format: Audio output format
71
71
  audio_input_format: Audio input format
72
72
  router: Optional routing service for processing
@@ -17,7 +17,7 @@ class SolanaAgent(ABC):
17
17
  output_format: Literal["text", "audio"] = "text",
18
18
  audio_voice: Literal["alloy", "ash", "ballad", "coral", "echo",
19
19
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
20
- audio_instructions: Optional[str] = None,
20
+ audio_instructions: str = "You speak in a friendly and helpful manner.",
21
21
  audio_output_format: Literal['mp3', 'opus',
22
22
  'aac', 'flac', 'wav', 'pcm'] = "aac",
23
23
  audio_input_format: Literal[
@@ -31,7 +31,7 @@ class LLMProvider(ABC):
31
31
  async def tts(
32
32
  self,
33
33
  text: str,
34
- instructions: str = "",
34
+ instructions: str = "You speak in a friendly and helpful manner.",
35
35
  voice: Literal["alloy", "ash", "ballad", "coral", "echo",
36
36
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
37
37
  response_format: Literal['mp3', 'opus',
@@ -27,7 +27,7 @@ class AgentService(ABC):
27
27
  output_format: Literal["text", "audio"] = "text",
28
28
  audio_voice: Literal["alloy", "ash", "ballad", "coral", "echo",
29
29
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
30
- audio_instructions: Optional[str] = None,
30
+ audio_instructions: str = "You speak in a friendly and helpful manner.",
31
31
  audio_output_format: Literal['mp3', 'opus',
32
32
  'aac', 'flac', 'wav', 'pcm'] = "aac",
33
33
  audio_input_format: Literal[
@@ -13,7 +13,7 @@ class QueryService(ABC):
13
13
  output_format: Literal["text", "audio"] = "text",
14
14
  audio_voice: Literal["alloy", "ash", "ballad", "coral", "echo",
15
15
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
16
- audio_instructions: Optional[str] = None,
16
+ audio_instructions: str = "You speak in a friendly and helpful manner.",
17
17
  audio_output_format: Literal['mp3', 'opus',
18
18
  'aac', 'flac', 'wav', 'pcm'] = "aac",
19
19
  audio_input_format: Literal[
@@ -169,7 +169,7 @@ class AgentService(AgentServiceInterface):
169
169
  output_format: Literal["text", "audio"] = "text",
170
170
  audio_voice: Literal["alloy", "ash", "ballad", "coral", "echo",
171
171
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
172
- audio_instructions: Optional[str] = None,
172
+ audio_instructions: str = "You speak in a friendly and helpful manner.",
173
173
  audio_output_format: Literal['mp3', 'opus',
174
174
  'aac', 'flac', 'wav', 'pcm'] = "aac",
175
175
  audio_input_format: Literal[
@@ -41,7 +41,7 @@ class QueryService(QueryServiceInterface):
41
41
  output_format: Literal["text", "audio"] = "text",
42
42
  audio_voice: Literal["alloy", "ash", "ballad", "coral", "echo",
43
43
  "fable", "onyx", "nova", "sage", "shimmer"] = "nova",
44
- audio_instructions: Optional[str] = None,
44
+ audio_instructions: str = "You speak in a friendly and helpful manner.",
45
45
  audio_output_format: Literal['mp3', 'opus',
46
46
  'aac', 'flac', 'wav', 'pcm'] = "aac",
47
47
  audio_input_format: Literal[
@@ -58,7 +58,7 @@ class QueryService(QueryServiceInterface):
58
58
  query: Text query or audio bytes
59
59
  output_format: Response format ("text" or "audio")
60
60
  audio_voice: Voice for TTS (text-to-speech)
61
- audio_instructions: Optional instructions for TTS
61
+ audio_instructions: Audio voice instructions
62
62
  audio_output_format: Audio output format
63
63
  audio_input_format: Audio input format
64
64
  prompt: Optional prompt for the agent
@@ -84,7 +84,8 @@ class QueryService(QueryServiceInterface):
84
84
  async for chunk in self.agent_service.llm_provider.tts(
85
85
  text=response,
86
86
  voice=audio_voice,
87
- response_format=audio_output_format
87
+ response_format=audio_output_format,
88
+ instructions=audio_instructions,
88
89
  ):
89
90
  yield chunk
90
91
  else:
File without changes