solana-agent 27.5.0__tar.gz → 28.0.0__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 (42) hide show
  1. {solana_agent-27.5.0 → solana_agent-28.0.0}/PKG-INFO +26 -50
  2. {solana_agent-27.5.0 → solana_agent-28.0.0}/README.md +25 -49
  3. {solana_agent-27.5.0 → solana_agent-28.0.0}/pyproject.toml +1 -1
  4. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/adapters/openai_adapter.py +17 -21
  5. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/factories/agent_factory.py +12 -83
  6. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/providers/llm.py +1 -1
  7. solana_agent-28.0.0/solana_agent/services/agent.py +952 -0
  8. solana_agent-27.5.0/solana_agent/services/agent.py +0 -838
  9. {solana_agent-27.5.0 → solana_agent-28.0.0}/LICENSE +0 -0
  10. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/__init__.py +0 -0
  11. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/adapters/__init__.py +0 -0
  12. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/adapters/mongodb_adapter.py +0 -0
  13. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/adapters/pinecone_adapter.py +0 -0
  14. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/client/__init__.py +0 -0
  15. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/client/solana_agent.py +0 -0
  16. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/domains/__init__.py +0 -0
  17. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/domains/agent.py +0 -0
  18. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/domains/routing.py +0 -0
  19. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/factories/__init__.py +0 -0
  20. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/guardrails/pii.py +0 -0
  21. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/__init__.py +0 -0
  22. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/client/client.py +0 -0
  23. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/guardrails/guardrails.py +0 -0
  24. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/plugins/plugins.py +0 -0
  25. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/providers/data_storage.py +0 -0
  26. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/providers/memory.py +0 -0
  27. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/providers/vector_storage.py +0 -0
  28. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/services/agent.py +0 -0
  29. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/services/knowledge_base.py +0 -0
  30. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/services/query.py +0 -0
  31. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/interfaces/services/routing.py +0 -0
  32. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/plugins/__init__.py +0 -0
  33. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/plugins/manager.py +0 -0
  34. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/plugins/registry.py +0 -0
  35. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/plugins/tools/__init__.py +0 -0
  36. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/plugins/tools/auto_tool.py +0 -0
  37. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/repositories/__init__.py +0 -0
  38. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/repositories/memory.py +0 -0
  39. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/services/__init__.py +0 -0
  40. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/services/knowledge_base.py +0 -0
  41. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/services/query.py +0 -0
  42. {solana_agent-27.5.0 → solana_agent-28.0.0}/solana_agent/services/routing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: solana-agent
3
- Version: 27.5.0
3
+ Version: 28.0.0
4
4
  Summary: AI Agents for Solana
5
5
  License: MIT
6
6
  Keywords: solana,solana ai,solana agent,ai,ai agent,ai agents
@@ -59,6 +59,7 @@ Build your AI agents in three lines of code!
59
59
  * Intelligent Routing
60
60
  * Business Alignment
61
61
  * Extensible Tooling
62
+ * Automatic Tool Workflows
62
63
  * Knowledge Base
63
64
  * MCP Support
64
65
  * Guardrails
@@ -84,26 +85,25 @@ Build your AI agents in three lines of code!
84
85
  * Assigned tools are utilized by agents automatically and effectively
85
86
  * Integrated Knowledge Base with semantic search and automatic PDF chunking
86
87
  * Input and output guardrails for content filtering, safety, and data sanitization
88
+ * Automatic sequential tool workflows allowing agents to chain multiple tools
87
89
 
88
90
  ## Stack
89
91
 
90
92
  ### Tech
91
93
 
92
94
  * [Python](https://python.org) - Programming Language
93
- * [OpenAI](https://openai.com), [Google](https://ai.google.dev), [xAI](https://x.ai) - LLM Providers
95
+ * [OpenAI](https://openai.com) - AI Provider
94
96
  * [MongoDB](https://mongodb.com) - Conversational History (optional)
95
97
  * [Zep Cloud](https://getzep.com) - Conversational Memory (optional)
96
98
  * [Pinecone](https://pinecone.io) - Knowledge Base (optional)
97
99
 
98
- ### LLMs
100
+ ### AI Models Used
99
101
 
100
- * [gpt-4.1-mini](https://platform.openai.com/docs/models/gpt-4.1-mini) (agent)
102
+ * [gpt-4.1](https://platform.openai.com/docs/models/gpt-4.1) (agent)
101
103
  * [gpt-4.1-nano](https://platform.openai.com/docs/models/gpt-4.1-nano) (router)
102
104
  * [text-embedding-3-large](https://platform.openai.com/docs/models/text-embedding-3-large) or [text-embedding-3-small](https://platform.openai.com/docs/models/text-embedding-3-small) (embedding)
103
105
  * [tts-1](https://platform.openai.com/docs/models/tts-1) (audio TTS)
104
106
  * [gpt-4o-mini-transcribe](https://platform.openai.com/docs/models/gpt-4o-mini-transcribe) (audio transcription)
105
- * [gemini-2.5-flash-preview](https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview) (optional)
106
- * [grok-3-mini-fast-beta](https://docs.x.ai/docs/models#models-and-pricing) (optional)
107
107
 
108
108
  ## Installation
109
109
 
@@ -113,13 +113,13 @@ You can install Solana Agent using pip:
113
113
 
114
114
  ## Flows
115
115
 
116
- In both flows of single and multiple agents - it is one user query to one agent using one tool (if needed).
116
+ In both flows of single and multiple agents - it is one user query to one agent using one or many tools (if needed).
117
117
 
118
- An agent can have multiple tools and will choose the best one to answer the user query.
118
+ An agent can have multiple tools and will choose the best ones to fulfill the user's query.
119
119
 
120
- Routing is determined by optimal domain expertise of the agent for the user query.
120
+ Routing is determined by optimal domain expertise of the agent for the user's query.
121
121
 
122
- When the agent uses a tool it feeds the tool output back to itself to generate the final response.
122
+ When the agent uses tools it feeds the tools output back to itself to generate the final response.
123
123
 
124
124
  This is important as tools generally output unstructured and unformatted data that the agent needs to prepare for the user.
125
125
 
@@ -128,13 +128,13 @@ Keep this in mind while designing your agentic systems using Solana Agent.
128
128
  ```ascii
129
129
  Single Agent
130
130
 
131
- ┌────────┐ ┌─────────┐ ┌────────┐
132
- │ │ │ │ │
133
- │ │ │ │ │
134
- │ User │◄──────►│ Agent │◄──────►│ Tool
135
- │ │ │ │ │
136
- │ │ │ │ │
137
- └────────┘ └─────────┘ └────────┘
131
+ ┌────────┐ ┌─────────┐ ┌────────-┐
132
+ │ │ │ │ │
133
+ │ │ │ │ │
134
+ │ User │◄──────►│ Agent │◄──────►│ Tools
135
+ │ │ │ │ │
136
+ │ │ │ │ │
137
+ └────────┘ └─────────┘ └────────-┘
138
138
 
139
139
 
140
140
 
@@ -142,13 +142,13 @@ Keep this in mind while designing your agentic systems using Solana Agent.
142
142
 
143
143
  Multiple Agents
144
144
 
145
- ┌────────┐ ┌──────────┐ ┌─────────┐ ┌────────┐
146
- │ │ │ │ │ │ │
147
- │ │ │ │ │ │ │
148
- ┌───►│ User ├───────►│ Router ├───────►│ Agent │◄──────►│ Tool
149
- │ │ │ │ │ │ │ │
150
- │ │ │ │ │ │ │ │
151
- │ └────────┘ └──────────┘ └────┬────┘ └────────┘
145
+ ┌────────┐ ┌──────────┐ ┌─────────┐ ┌────────-┐
146
+ │ │ │ │ │ │ │
147
+ │ │ │ │ │ │ │
148
+ ┌───►│ User ├───────►│ Router ├───────►│ Agent │◄──────►│ Tools
149
+ │ │ │ │ │ │ │ │
150
+ │ │ │ │ │ │ │ │
151
+ │ └────────┘ └──────────┘ └────┬────┘ └────────-┘
152
152
  │ │
153
153
  │ │
154
154
  │ │
@@ -319,30 +319,6 @@ config = {
319
319
  }
320
320
  ```
321
321
 
322
- ### Gemini
323
-
324
- This allows Gemini to replace OpenAI for agent and router.
325
-
326
- ```python
327
- config = {
328
- "gemini": {
329
- "api_key": "your-gemini-api-key",
330
- },
331
- }
332
- ```
333
-
334
- ### Grok
335
-
336
- This allows Grok to replace OpenAI (or Gemini) for agent.
337
-
338
- ```python
339
- config = {
340
- "grok": {
341
- "api_key": "your-grok-api-key",
342
- },
343
- }
344
- ```
345
-
346
322
  ### Knowledge Base
347
323
 
348
324
  The Knowledge Base (KB) is meant to store text values and/or small PDFs.
@@ -533,8 +509,8 @@ class MyOutputGuardrail(OutputGuardrail):
533
509
 
534
510
  Tools can be used from plugins like Solana Agent Kit (sakit) or via inline tools. Tools available via plugins integrate automatically with Solana Agent.
535
511
 
536
- * Agents can only call one tool per response
537
- * Agents choose the best tool for the job
512
+ * Agents can use multiple tools per response and should apply the right sequential order (like send an email to bob@bob.com with the latest news on Solana)
513
+ * Agents choose the best tools for the job
538
514
  * Solana Agent doesn't use OpenAI function calling (tools) as they don't support async functions
539
515
  * Solana Agent tools are async functions
540
516
 
@@ -28,6 +28,7 @@ Build your AI agents in three lines of code!
28
28
  * Intelligent Routing
29
29
  * Business Alignment
30
30
  * Extensible Tooling
31
+ * Automatic Tool Workflows
31
32
  * Knowledge Base
32
33
  * MCP Support
33
34
  * Guardrails
@@ -53,26 +54,25 @@ Build your AI agents in three lines of code!
53
54
  * Assigned tools are utilized by agents automatically and effectively
54
55
  * Integrated Knowledge Base with semantic search and automatic PDF chunking
55
56
  * Input and output guardrails for content filtering, safety, and data sanitization
57
+ * Automatic sequential tool workflows allowing agents to chain multiple tools
56
58
 
57
59
  ## Stack
58
60
 
59
61
  ### Tech
60
62
 
61
63
  * [Python](https://python.org) - Programming Language
62
- * [OpenAI](https://openai.com), [Google](https://ai.google.dev), [xAI](https://x.ai) - LLM Providers
64
+ * [OpenAI](https://openai.com) - AI Provider
63
65
  * [MongoDB](https://mongodb.com) - Conversational History (optional)
64
66
  * [Zep Cloud](https://getzep.com) - Conversational Memory (optional)
65
67
  * [Pinecone](https://pinecone.io) - Knowledge Base (optional)
66
68
 
67
- ### LLMs
69
+ ### AI Models Used
68
70
 
69
- * [gpt-4.1-mini](https://platform.openai.com/docs/models/gpt-4.1-mini) (agent)
71
+ * [gpt-4.1](https://platform.openai.com/docs/models/gpt-4.1) (agent)
70
72
  * [gpt-4.1-nano](https://platform.openai.com/docs/models/gpt-4.1-nano) (router)
71
73
  * [text-embedding-3-large](https://platform.openai.com/docs/models/text-embedding-3-large) or [text-embedding-3-small](https://platform.openai.com/docs/models/text-embedding-3-small) (embedding)
72
74
  * [tts-1](https://platform.openai.com/docs/models/tts-1) (audio TTS)
73
75
  * [gpt-4o-mini-transcribe](https://platform.openai.com/docs/models/gpt-4o-mini-transcribe) (audio transcription)
74
- * [gemini-2.5-flash-preview](https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview) (optional)
75
- * [grok-3-mini-fast-beta](https://docs.x.ai/docs/models#models-and-pricing) (optional)
76
76
 
77
77
  ## Installation
78
78
 
@@ -82,13 +82,13 @@ You can install Solana Agent using pip:
82
82
 
83
83
  ## Flows
84
84
 
85
- In both flows of single and multiple agents - it is one user query to one agent using one tool (if needed).
85
+ In both flows of single and multiple agents - it is one user query to one agent using one or many tools (if needed).
86
86
 
87
- An agent can have multiple tools and will choose the best one to answer the user query.
87
+ An agent can have multiple tools and will choose the best ones to fulfill the user's query.
88
88
 
89
- Routing is determined by optimal domain expertise of the agent for the user query.
89
+ Routing is determined by optimal domain expertise of the agent for the user's query.
90
90
 
91
- When the agent uses a tool it feeds the tool output back to itself to generate the final response.
91
+ When the agent uses tools it feeds the tools output back to itself to generate the final response.
92
92
 
93
93
  This is important as tools generally output unstructured and unformatted data that the agent needs to prepare for the user.
94
94
 
@@ -97,13 +97,13 @@ Keep this in mind while designing your agentic systems using Solana Agent.
97
97
  ```ascii
98
98
  Single Agent
99
99
 
100
- ┌────────┐ ┌─────────┐ ┌────────┐
101
- │ │ │ │ │
102
- │ │ │ │ │
103
- │ User │◄──────►│ Agent │◄──────►│ Tool
104
- │ │ │ │ │
105
- │ │ │ │ │
106
- └────────┘ └─────────┘ └────────┘
100
+ ┌────────┐ ┌─────────┐ ┌────────-┐
101
+ │ │ │ │ │
102
+ │ │ │ │ │
103
+ │ User │◄──────►│ Agent │◄──────►│ Tools
104
+ │ │ │ │ │
105
+ │ │ │ │ │
106
+ └────────┘ └─────────┘ └────────-┘
107
107
 
108
108
 
109
109
 
@@ -111,13 +111,13 @@ Keep this in mind while designing your agentic systems using Solana Agent.
111
111
 
112
112
  Multiple Agents
113
113
 
114
- ┌────────┐ ┌──────────┐ ┌─────────┐ ┌────────┐
115
- │ │ │ │ │ │ │
116
- │ │ │ │ │ │ │
117
- ┌───►│ User ├───────►│ Router ├───────►│ Agent │◄──────►│ Tool
118
- │ │ │ │ │ │ │ │
119
- │ │ │ │ │ │ │ │
120
- │ └────────┘ └──────────┘ └────┬────┘ └────────┘
114
+ ┌────────┐ ┌──────────┐ ┌─────────┐ ┌────────-┐
115
+ │ │ │ │ │ │ │
116
+ │ │ │ │ │ │ │
117
+ ┌───►│ User ├───────►│ Router ├───────►│ Agent │◄──────►│ Tools
118
+ │ │ │ │ │ │ │ │
119
+ │ │ │ │ │ │ │ │
120
+ │ └────────┘ └──────────┘ └────┬────┘ └────────-┘
121
121
  │ │
122
122
  │ │
123
123
  │ │
@@ -288,30 +288,6 @@ config = {
288
288
  }
289
289
  ```
290
290
 
291
- ### Gemini
292
-
293
- This allows Gemini to replace OpenAI for agent and router.
294
-
295
- ```python
296
- config = {
297
- "gemini": {
298
- "api_key": "your-gemini-api-key",
299
- },
300
- }
301
- ```
302
-
303
- ### Grok
304
-
305
- This allows Grok to replace OpenAI (or Gemini) for agent.
306
-
307
- ```python
308
- config = {
309
- "grok": {
310
- "api_key": "your-grok-api-key",
311
- },
312
- }
313
- ```
314
-
315
291
  ### Knowledge Base
316
292
 
317
293
  The Knowledge Base (KB) is meant to store text values and/or small PDFs.
@@ -502,8 +478,8 @@ class MyOutputGuardrail(OutputGuardrail):
502
478
 
503
479
  Tools can be used from plugins like Solana Agent Kit (sakit) or via inline tools. Tools available via plugins integrate automatically with Solana Agent.
504
480
 
505
- * Agents can only call one tool per response
506
- * Agents choose the best tool for the job
481
+ * Agents can use multiple tools per response and should apply the right sequential order (like send an email to bob@bob.com with the latest news on Solana)
482
+ * Agents choose the best tools for the job
507
483
  * Solana Agent doesn't use OpenAI function calling (tools) as they don't support async functions
508
484
  * Solana Agent tools are async functions
509
485
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "solana-agent"
3
- version = "27.5.0"
3
+ version = "28.0.0"
4
4
  description = "AI Agents for Solana"
5
5
  authors = ["Bevan Hunt <bevan@bevanhunt.com>"]
6
6
  license = "MIT"
@@ -15,7 +15,7 @@ from solana_agent.interfaces.providers.llm import LLMProvider
15
15
 
16
16
  T = TypeVar("T", bound=BaseModel)
17
17
 
18
- DEFAULT_CHAT_MODEL = "gpt-4.1-mini"
18
+ DEFAULT_CHAT_MODEL = "gpt-4.1"
19
19
  DEFAULT_PARSE_MODEL = "gpt-4.1-nano"
20
20
  DEFAULT_EMBEDDING_MODEL = "text-embedding-3-large"
21
21
  DEFAULT_EMBEDDING_DIMENSIONS = 3072
@@ -129,45 +129,41 @@ class OpenAIAdapter(LLMProvider):
129
129
  api_key: Optional[str] = None,
130
130
  base_url: Optional[str] = None,
131
131
  model: Optional[str] = None,
132
- ) -> AsyncGenerator[str, None]: # pragma: no cover
133
- """Generate text from OpenAI models."""
132
+ ) -> str: # pragma: no cover
133
+ """Generate text from OpenAI models as a single string."""
134
134
  messages = []
135
-
136
135
  if system_prompt:
137
136
  messages.append({"role": "system", "content": system_prompt})
138
-
139
137
  messages.append({"role": "user", "content": prompt})
140
138
 
141
- # Prepare request parameters
139
+ # Prepare request parameters - stream is always False now
142
140
  request_params = {
143
141
  "messages": messages,
144
- "stream": True,
145
- "model": self.text_model,
142
+ "stream": False, # Hardcoded to False
143
+ "model": model or self.text_model,
146
144
  }
147
145
 
146
+ # Determine client based on provided api_key/base_url
148
147
  if api_key and base_url:
149
148
  client = AsyncOpenAI(api_key=api_key, base_url=base_url)
150
149
  else:
151
150
  client = self.client
152
151
 
153
- if model:
154
- request_params["model"] = model
155
-
156
152
  try:
153
+ # Make the non-streaming API call
157
154
  response = await client.chat.completions.create(**request_params)
158
155
 
159
- async for chunk in response:
160
- if chunk.choices:
161
- if chunk.choices[0].delta.content:
162
- text = chunk.choices[0].delta.content
163
- yield text
156
+ # Handle non-streaming response
157
+ if response.choices and response.choices[0].message.content:
158
+ full_text = response.choices[0].message.content
159
+ return full_text # Return the complete string
160
+ else:
161
+ print("Received non-streaming response with no content.")
162
+ return "" # Return empty string if no content
164
163
 
165
164
  except Exception as e:
166
- print(f"Error in generate_text: {str(e)}")
167
- import traceback
168
-
169
- print(traceback.format_exc())
170
- yield f"I apologize, but I encountered an error: {str(e)}"
165
+ # Log the error and return an error message string
166
+ print(f"Error in generate_text: {e}")
171
167
 
172
168
  async def parse_structured_output(
173
169
  self,
@@ -130,90 +130,19 @@ class SolanaAgentFactory:
130
130
  f"Loaded {len(input_guardrails)} input guardrails and {len(output_guardrails)} output guardrails."
131
131
  )
132
132
 
133
- if (
134
- "gemini" in config
135
- and "api_key" in config["gemini"]
136
- and "grok" not in config
137
- ):
138
- # Create primary services
139
- agent_service = AgentService(
140
- llm_provider=llm_adapter,
141
- business_mission=business_mission,
142
- config=config,
143
- api_key=config["gemini"]["api_key"],
144
- base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
145
- model="gemini-2.5-flash-preview-04-17",
146
- output_guardrails=output_guardrails,
147
- )
148
-
149
- # Create routing service
150
- routing_service = RoutingService(
151
- llm_provider=llm_adapter,
152
- agent_service=agent_service,
153
- api_key=config["gemini"]["api_key"],
154
- base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
155
- model="gemini-2.5-flash-preview-04-17",
156
- )
157
-
158
- elif (
159
- "gemini" in config
160
- and "api_key" in config["gemini"]
161
- and "grok" in config
162
- and "api_key" in config["grok"]
163
- ):
164
- # Create primary services
165
- agent_service = AgentService(
166
- llm_provider=llm_adapter,
167
- business_mission=business_mission,
168
- config=config,
169
- api_key=config["grok"]["api_key"],
170
- base_url="https://api.x.ai/v1",
171
- model="grok-3-mini-fast-beta",
172
- output_guardrails=output_guardrails,
173
- )
174
- # Create routing service
175
- routing_service = RoutingService(
176
- llm_provider=llm_adapter,
177
- agent_service=agent_service,
178
- api_key=config["gemini"]["api_key"],
179
- base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
180
- model="gemini-2.5-flash-preview-04-17",
181
- )
182
-
183
- elif (
184
- "grok" in config and "api_key" in config["grok"] and "gemini" not in config
185
- ):
186
- # Create primary services
187
- agent_service = AgentService(
188
- llm_provider=llm_adapter,
189
- business_mission=business_mission,
190
- config=config,
191
- api_key=config["grok"]["api_key"],
192
- base_url="https://api.x.ai/v1",
193
- model="grok-3-mini-fast-beta",
194
- output_guardrails=output_guardrails,
195
- )
196
-
197
- # Create routing service
198
- routing_service = RoutingService(
199
- llm_provider=llm_adapter,
200
- agent_service=agent_service,
201
- )
202
-
203
- else:
204
- # Create primary services
205
- agent_service = AgentService(
206
- llm_provider=llm_adapter,
207
- business_mission=business_mission,
208
- config=config,
209
- output_guardrails=output_guardrails,
210
- )
133
+ # Create primary services
134
+ agent_service = AgentService(
135
+ llm_provider=llm_adapter,
136
+ business_mission=business_mission,
137
+ config=config,
138
+ output_guardrails=output_guardrails,
139
+ )
211
140
 
212
- # Create routing service
213
- routing_service = RoutingService(
214
- llm_provider=llm_adapter,
215
- agent_service=agent_service,
216
- )
141
+ # Create routing service
142
+ routing_service = RoutingService(
143
+ llm_provider=llm_adapter,
144
+ agent_service=agent_service,
145
+ )
217
146
 
218
147
  # Debug the agent service tool registry
219
148
  print(
@@ -25,7 +25,7 @@ class LLMProvider(ABC):
25
25
  api_key: Optional[str] = None,
26
26
  base_url: Optional[str] = None,
27
27
  model: Optional[str] = None,
28
- ) -> AsyncGenerator[str, None]:
28
+ ) -> str:
29
29
  """Generate text from the language model."""
30
30
  pass
31
31