solana-agent 22.0.0__py3-none-any.whl → 22.0.2__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.
@@ -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:
@@ -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
@@ -1,22 +1,22 @@
1
1
  solana_agent/__init__.py,sha256=ceYeUpjIitpln8YK1r0JVJU8mzG6cRPYu-HLny3d-Tw,887
2
2
  solana_agent/adapters/__init__.py,sha256=tiEEuuy0NF3ngc_tGEcRTt71zVI58v3dYY9RvMrF2Cg,204
3
- solana_agent/adapters/llm_adapter.py,sha256=PsSkMrsSqZzXAL3NcQ9Zz7UCtyJYU0USvZ7uTD_I8NI,5629
3
+ solana_agent/adapters/llm_adapter.py,sha256=ReCVQH0X0hf5NpLqEMESft5LZtPj3gDNIOBiZpClqzo,5737
4
4
  solana_agent/adapters/mongodb_adapter.py,sha256=qqEFbY_v1XGyFXBmwd5HSXSSHnA9wWo-Hm1vGEyIG0k,2718
5
5
  solana_agent/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- solana_agent/client/solana_agent.py,sha256=8mu0OdLBQnZXKS2mFrWvvY_4bykzhT73oyIxs9tmJvY,5318
6
+ solana_agent/client/solana_agent.py,sha256=-bIVaE5p6He4d5VRzYhlAgkMzhql4EVFsujjnoweh2o,5355
7
7
  solana_agent/domains/__init__.py,sha256=HiC94wVPRy-QDJSSRywCRrhrFfTBeHjfi5z-QfZv46U,168
8
8
  solana_agent/domains/agent.py,sha256=WTo-pEc66V6D_35cpDE-kTsw1SJM-dtylPZ7em5em7Q,2659
9
9
  solana_agent/domains/routing.py,sha256=UDlgTjUoC9xIBVYu_dnf9-KG_bBgdEXAv_UtDOrYo0w,650
10
10
  solana_agent/factories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  solana_agent/factories/agent_factory.py,sha256=mJQb1G0-gebizZvSVHm4NAxRMB1kemm2w_BAcYlN15Y,5496
12
12
  solana_agent/interfaces/__init__.py,sha256=IQs1WIM1FeKP1-kY2FEfyhol_dB-I-VAe2rD6jrVF6k,355
13
- solana_agent/interfaces/client/client.py,sha256=RbZWS_YaAyav56cODECMNkYL0MJwA_8bFeUreZp26qo,1697
13
+ solana_agent/interfaces/client/client.py,sha256=btAt-bVVxsunA6rcbn0jqVmZ1JMxcF_u95CIXByO7fk,1728
14
14
  solana_agent/interfaces/plugins/plugins.py,sha256=T8HPBsekmzVwfU_Rizp-vtzAeYkMlKMYD7U9d0Wjq9c,3338
15
15
  solana_agent/interfaces/providers/data_storage.py,sha256=NqGeFvAzhz9rr-liLPRNCGjooB2EIhe-EVsMmX__b0M,1658
16
- solana_agent/interfaces/providers/llm.py,sha256=Fy7_iTI8sez2NVeE9lDed4W5cXx95HRy0ctEpIqr5N0,1548
16
+ solana_agent/interfaces/providers/llm.py,sha256=_sbgSs3Sy1QAeFCB_jzw_Rjpq-N5wBY5qt6tmFYD9K4,1591
17
17
  solana_agent/interfaces/providers/memory.py,sha256=oNOH8WZXVW8assDigIWZAWiwkxbpDiKupxA2RB6tQvQ,1010
18
- solana_agent/interfaces/services/agent.py,sha256=7HOGcvvHTxeK-dMlqw460yqKwGd72JokhDIr3kzroVg,2120
19
- solana_agent/interfaces/services/query.py,sha256=PGW2w60R615og28Bw6sS1cCcBN_26KkkOsYDYclS1KQ,1347
18
+ solana_agent/interfaces/services/agent.py,sha256=mvXl5JLiJJz0ajjVuntR-Sz8geRGs9RVqOEBsf8VzzE,2151
19
+ solana_agent/interfaces/services/query.py,sha256=rKIYjHBeOaFFawFYduJbMRp7imYg-uRElZoizBgua00,1378
20
20
  solana_agent/interfaces/services/routing.py,sha256=UzJC-z-Q9puTWPFGEo2_CAhIxuxP5IRnze7S66NSrsI,397
21
21
  solana_agent/plugins/__init__.py,sha256=coZdgJKq1ExOaj6qB810i3rEhbjdVlrkN76ozt_Ojgo,193
22
22
  solana_agent/plugins/manager.py,sha256=Il49hXeqvu0b02pURNNp7mY8kp9_sqpi_vJIWBW5Hc0,5044
@@ -26,10 +26,10 @@ solana_agent/plugins/tools/auto_tool.py,sha256=DgES_cZ6xKSf_HJpFINpvJxrjVlk5oeqa
26
26
  solana_agent/repositories/__init__.py,sha256=fP83w83CGzXLnSdq-C5wbw9EhWTYtqE2lQTgp46-X_4,163
27
27
  solana_agent/repositories/memory.py,sha256=mrpmNSQ0D_eLebNY-cBqtecVVpIGXE7s9jCzOWEAuR4,6984
28
28
  solana_agent/services/__init__.py,sha256=ab_NXJmwYUCmCrCzuTlZ47bJZINW0Y0F5jfQ9OovidU,163
29
- solana_agent/services/agent.py,sha256=uLZvMl8U40H-Lbxsf6PFR4SSfggjByBUoumvB1Afduo,18441
30
- solana_agent/services/query.py,sha256=gUIMJaTcGUjn7TuwJHE-CHMjQIdcYUNoxqJ3duE-QUg,11278
29
+ solana_agent/services/agent.py,sha256=c7dZvuAmI0jXO2roDCbUFbWIfEn79uK5TU378PBk3rU,18472
30
+ solana_agent/services/query.py,sha256=os_LRkDIwXQuWW_zJMtm__n0Lvi-AvItdanpCs1bXv0,11362
31
31
  solana_agent/services/routing.py,sha256=PMCSG5m3uLMaHMj3dxNvNfcFZaeaDi7kMr7AEBCzwDE,6499
32
- solana_agent-22.0.0.dist-info/LICENSE,sha256=BnSRc-NSFuyF2s496l_4EyrwAP6YimvxWcjPiJ0J7g4,1057
33
- solana_agent-22.0.0.dist-info/METADATA,sha256=sLsz9J8dpuTDP22Ach0YFD46qBzJMKEYD7T3iU1qVb8,13050
34
- solana_agent-22.0.0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
35
- solana_agent-22.0.0.dist-info/RECORD,,
32
+ solana_agent-22.0.2.dist-info/LICENSE,sha256=BnSRc-NSFuyF2s496l_4EyrwAP6YimvxWcjPiJ0J7g4,1057
33
+ solana_agent-22.0.2.dist-info/METADATA,sha256=D9zc-pg5gP9tm0MTaSKIMuA0zW1z4OfPIFYgINjb0yg,14882
34
+ solana_agent-22.0.2.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
35
+ solana_agent-22.0.2.dist-info/RECORD,,