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.
- solana_agent/adapters/llm_adapter.py +14 -16
- solana_agent/client/solana_agent.py +2 -2
- solana_agent/interfaces/client/client.py +1 -1
- solana_agent/interfaces/providers/llm.py +1 -1
- solana_agent/interfaces/services/agent.py +1 -1
- solana_agent/interfaces/services/query.py +1 -1
- solana_agent/services/agent.py +1 -1
- solana_agent/services/query.py +4 -3
- {solana_agent-22.0.0.dist-info → solana_agent-22.0.2.dist-info}/METADATA +61 -9
- {solana_agent-22.0.0.dist-info → solana_agent-22.0.2.dist-info}/RECORD +12 -12
- {solana_agent-22.0.0.dist-info → solana_agent-22.0.2.dist-info}/LICENSE +0 -0
- {solana_agent-22.0.0.dist-info → solana_agent-22.0.2.dist-info}/WHEEL +0 -0
@@ -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
|
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
|
-
|
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
|
-
|
56
|
-
|
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
|
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
|
-
|
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
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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[
|
solana_agent/services/agent.py
CHANGED
@@ -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:
|
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[
|
solana_agent/services/query.py
CHANGED
@@ -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:
|
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:
|
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.
|
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
|
-
|
252
|
+
### Customize Audio Voice
|
255
253
|
|
256
|
-
|
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
|
-
|
384
|
+
## Training your Agents
|
337
385
|
|
338
|
-
|
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?", "
|
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
|
-
|
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=
|
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
|
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=
|
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=
|
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=
|
19
|
-
solana_agent/interfaces/services/query.py,sha256=
|
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=
|
30
|
-
solana_agent/services/query.py,sha256=
|
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.
|
33
|
-
solana_agent-22.0.
|
34
|
-
solana_agent-22.0.
|
35
|
-
solana_agent-22.0.
|
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,,
|
File without changes
|
File without changes
|