cognitrix 0.2.3__tar.gz → 0.2.4__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.
- cognitrix-0.2.4/PKG-INFO +162 -0
- cognitrix-0.2.4/README.md +110 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/agents/base.py +13 -11
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/agents/templates.py +2 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/cli.py +75 -16
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/config.py +1 -1
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/__init__.py +2 -1
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/google_llm.py +1 -1
- cognitrix-0.2.4/cognitrix/llms/ollama_llm.py +115 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/openai_llm.py +4 -6
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/session.py +2 -2
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/tools/base.py +16 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/tools/misc.py +14 -11
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/tools/python.py +1 -0
- cognitrix-0.2.4/cognitrix/tools/tool.py +32 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/transcriber.py +25 -13
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/utils/__init__.py +61 -13
- {cognitrix-0.2.3 → cognitrix-0.2.4}/pyproject.toml +4 -2
- cognitrix-0.2.3/PKG-INFO +0 -127
- cognitrix-0.2.3/README.md +0 -77
- cognitrix-0.2.3/cognitrix/tools/tool.py +0 -26
- {cognitrix-0.2.3 → cognitrix-0.2.4}/LICENSE +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/__init__.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/agents/__init__.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/agents/assistant.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/agents/core.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/app.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/anthropic_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/base.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/clarifai_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/cohere_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/groq_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/local_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/mindsdb_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/llms/together_llm.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/tasks/__init__.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/tasks/base.py +0 -0
- {cognitrix-0.2.3 → cognitrix-0.2.4}/cognitrix/tools/__init__.py +0 -0
cognitrix-0.2.4/PKG-INFO
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: cognitrix
|
|
3
|
+
Version: 0.2.4
|
|
4
|
+
Summary: Package for creating AI Agents using llms
|
|
5
|
+
Home-page: https://github.com/theonlyamos/cognitrix
|
|
6
|
+
License: Apache2
|
|
7
|
+
Keywords: cognitrix,ai,agents,ai agents,ai-agents,llms,autonomous agents
|
|
8
|
+
Author: theonlyamos
|
|
9
|
+
Author-email: theonlyamos@gmail.com
|
|
10
|
+
Requires-Python: >=3.12,<4.0
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
|
+
Classifier: License :: Other/Proprietary License
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.6
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
24
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Requires-Dist: aiofiles (>=23.2.1,<24.0.0)
|
|
27
|
+
Requires-Dist: aiohttp (>=3.9.3,<4.0.0)
|
|
28
|
+
Requires-Dist: anthropic (>=0.17.0,<0.18.0)
|
|
29
|
+
Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
|
|
30
|
+
Requires-Dist: clarifai (>=10.1.0,<11.0.0)
|
|
31
|
+
Requires-Dist: cohere (>=4.50,<5.0)
|
|
32
|
+
Requires-Dist: deepgram-sdk (==3.*)
|
|
33
|
+
Requires-Dist: google-generativeai (>=0.4.0,<0.5.0)
|
|
34
|
+
Requires-Dist: google-search-results (>=2.4.2,<3.0.0)
|
|
35
|
+
Requires-Dist: groq (>=0.4.1,<0.5.0)
|
|
36
|
+
Requires-Dist: ollama (>=0.2.0,<0.3.0)
|
|
37
|
+
Requires-Dist: openai (>=1.12.0,<2.0.0)
|
|
38
|
+
Requires-Dist: pillow (>=10.2.0,<11.0.0)
|
|
39
|
+
Requires-Dist: pyaudio (>=0.2.14,<0.3.0)
|
|
40
|
+
Requires-Dist: pyautogui (>=0.9.54,<0.10.0)
|
|
41
|
+
Requires-Dist: pydantic (>=2.6.2,<3.0.0)
|
|
42
|
+
Requires-Dist: pydub (>=0.25.1,<0.26.0)
|
|
43
|
+
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
|
44
|
+
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
45
|
+
Requires-Dist: serpapi (>=0.1.5,<0.2.0)
|
|
46
|
+
Requires-Dist: together (>=0.2.11,<0.3.0)
|
|
47
|
+
Requires-Dist: uuid (>=1.30,<2.0)
|
|
48
|
+
Requires-Dist: xmltodict (>=0.13.0,<0.14.0)
|
|
49
|
+
Project-URL: Bug Tracker, https://github.com/theonlyamos/cognitrix/issues
|
|
50
|
+
Project-URL: Repository, https://github.com/theonlyamos/cognitrix
|
|
51
|
+
Description-Content-Type: text/markdown
|
|
52
|
+
|
|
53
|
+
# Cognitrix
|
|
54
|
+
|
|
55
|
+
Cognitrix is an open-source autonomous AI agents orchestrator built in Python. It allows you to create and manage AI agents with ease and integrates seamlessly with large language models (LLMs) from various providers.
|
|
56
|
+
|
|
57
|
+
## Features
|
|
58
|
+
|
|
59
|
+
- **Agent Creation and Management:** Create, list, and load AI agents with customizable names, tasks, and configurations.
|
|
60
|
+
- **LLM Integration:** Integrates with multiple LLM providers, including Anthropic (Claude), Cohere, Groq, Google, OpenAI, and Together.
|
|
61
|
+
- **Modular Architecture:** Easily extensible, allowing the addition of new tools, agents, and LLM integrations.
|
|
62
|
+
- **Conversational Interface:** Interact with AI agents through a command-line interface, providing queries and receiving responses.
|
|
63
|
+
- **Tool Integration:** Agents can utilize a variety of tools, including calculators, web searches, file system browsers, and more.
|
|
64
|
+
- **Autonomous Agent Mode:** Agents can operate autonomously, visually perceiving the screen, interacting with UI elements, and performing tasks.
|
|
65
|
+
- **Multimodal Support:** Handles both text and image inputs/outputs, enabling multimodal interactions.
|
|
66
|
+
|
|
67
|
+
## Architecture
|
|
68
|
+
|
|
69
|
+
Cognitrix's architecture is designed to be highly modular and extensible:
|
|
70
|
+
|
|
71
|
+
- **Agents:** The base `Agent` class and specialized classes like `AIAssistant` for creating and managing AI agents.
|
|
72
|
+
- **LLMs:** A collection of classes for integrating with various LLM providers (Cohere, OpenAI, Claude, etc.).
|
|
73
|
+
- **Tools:** A set of tools that agents can utilize. Each tool has a `category` attribute for grouping and management.
|
|
74
|
+
- **Templates:** Customizable prompt templates guide the behavior and output formats of LLMs.
|
|
75
|
+
|
|
76
|
+
More tools can be added by creating new classes that inherit from the `Tool` base class and specifying a unique `category`.
|
|
77
|
+
|
|
78
|
+
## Installation
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install cognitrix
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Alternatively, you can install directly from GitHub:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install https://github.com/theonlyamos/cognitrix/archive/main.zip
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Usage
|
|
91
|
+
|
|
92
|
+
To run Cognitrix with default settings:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
cognitrix
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
To list supported LLM providers:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cognitrix --providers
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
To list created agents:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
cognitrix agents
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
To list available tools:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
cognitrix --tools
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
To run Cognitrix with a specific provider:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
cognitrix --provider <provider_name>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
To run Cognitrix with a specific agent:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
cognitrix --agent <agent_name>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
To run Cognitrix with a category of tools:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
cognitrix --load-tools "web"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
To run Cognitrix with categories of tools:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
cognitrix --load-tools "web,general"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
To create a new agent:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
cognitrix agents --new
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
For more options and usage details, use the help command:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
cognitrix --help
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Contributing
|
|
153
|
+
|
|
154
|
+
Cognitrix is open source and contributions are welcome! Please refer to [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to contribute.
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
This project is licensed under the MIT license. See [LICENSE.md](LICENSE.md) for more information.
|
|
159
|
+
|
|
160
|
+
## Acknowledgments
|
|
161
|
+
|
|
162
|
+
Cognitrix was created by [Amos Amissah](https://github.com/theonlyamos) and is inspired by projects like AutoGPT and GPT Engineer. Special thanks to the open-source community and AI companies providing LLM APIs.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Cognitrix
|
|
2
|
+
|
|
3
|
+
Cognitrix is an open-source autonomous AI agents orchestrator built in Python. It allows you to create and manage AI agents with ease and integrates seamlessly with large language models (LLMs) from various providers.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Agent Creation and Management:** Create, list, and load AI agents with customizable names, tasks, and configurations.
|
|
8
|
+
- **LLM Integration:** Integrates with multiple LLM providers, including Anthropic (Claude), Cohere, Groq, Google, OpenAI, and Together.
|
|
9
|
+
- **Modular Architecture:** Easily extensible, allowing the addition of new tools, agents, and LLM integrations.
|
|
10
|
+
- **Conversational Interface:** Interact with AI agents through a command-line interface, providing queries and receiving responses.
|
|
11
|
+
- **Tool Integration:** Agents can utilize a variety of tools, including calculators, web searches, file system browsers, and more.
|
|
12
|
+
- **Autonomous Agent Mode:** Agents can operate autonomously, visually perceiving the screen, interacting with UI elements, and performing tasks.
|
|
13
|
+
- **Multimodal Support:** Handles both text and image inputs/outputs, enabling multimodal interactions.
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
|
|
17
|
+
Cognitrix's architecture is designed to be highly modular and extensible:
|
|
18
|
+
|
|
19
|
+
- **Agents:** The base `Agent` class and specialized classes like `AIAssistant` for creating and managing AI agents.
|
|
20
|
+
- **LLMs:** A collection of classes for integrating with various LLM providers (Cohere, OpenAI, Claude, etc.).
|
|
21
|
+
- **Tools:** A set of tools that agents can utilize. Each tool has a `category` attribute for grouping and management.
|
|
22
|
+
- **Templates:** Customizable prompt templates guide the behavior and output formats of LLMs.
|
|
23
|
+
|
|
24
|
+
More tools can be added by creating new classes that inherit from the `Tool` base class and specifying a unique `category`.
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install cognitrix
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Alternatively, you can install directly from GitHub:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install https://github.com/theonlyamos/cognitrix/archive/main.zip
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
39
|
+
|
|
40
|
+
To run Cognitrix with default settings:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
cognitrix
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
To list supported LLM providers:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
cognitrix --providers
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
To list created agents:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
cognitrix agents
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
To list available tools:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
cognitrix --tools
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
To run Cognitrix with a specific provider:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
cognitrix --provider <provider_name>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
To run Cognitrix with a specific agent:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
cognitrix --agent <agent_name>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
To run Cognitrix with a category of tools:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cognitrix --load-tools "web"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
To run Cognitrix with categories of tools:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
cognitrix --load-tools "web,general"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
To create a new agent:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
cognitrix agents --new
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
For more options and usage details, use the help command:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
cognitrix --help
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Contributing
|
|
101
|
+
|
|
102
|
+
Cognitrix is open source and contributions are welcome! Please refer to [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to contribute.
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
This project is licensed under the MIT license. See [LICENSE.md](LICENSE.md) for more information.
|
|
107
|
+
|
|
108
|
+
## Acknowledgments
|
|
109
|
+
|
|
110
|
+
Cognitrix was created by [Amos Amissah](https://github.com/theonlyamos) and is inspired by projects like AutoGPT and GPT Engineer. Special thanks to the open-source community and AI companies providing LLM APIs.
|
|
@@ -115,19 +115,21 @@ class Agent(BaseModel):
|
|
|
115
115
|
def get_tool_by_name(self, name: str) -> Optional[Tool]:
|
|
116
116
|
return next((tool for tool in self.tools if tool.name.lower() == name.lower()), None)
|
|
117
117
|
|
|
118
|
-
async def process_response(self, response: str) -> Union[dict, str]:
|
|
118
|
+
async def process_response(self, response: str|dict) -> Union[dict, str]:
|
|
119
119
|
# response = response.replace("'", '"')
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
response_data = response
|
|
121
|
+
if isinstance(response, str):
|
|
122
|
+
response = response.replace('\\n', '')
|
|
123
|
+
response = response.replace("'", "\"")
|
|
124
|
+
# response = response.replace('"', '\\"')
|
|
125
|
+
response_data = extract_json(response)
|
|
124
126
|
|
|
125
127
|
|
|
126
128
|
try:
|
|
127
129
|
if isinstance(response_data, dict):
|
|
128
|
-
final_result_keys = ['final_answer', 'function_call_result', 'respons']
|
|
130
|
+
# final_result_keys = ['final_answer', 'function_call_result', 'respons']
|
|
129
131
|
|
|
130
|
-
if response_data['type'].replace('\\', '')
|
|
132
|
+
if response_data['type'].replace('\\', '') != 'function_call':
|
|
131
133
|
return response_data['result']
|
|
132
134
|
|
|
133
135
|
tool = self.get_tool_by_name(response_data['function'])
|
|
@@ -251,16 +253,16 @@ class Agent(BaseModel):
|
|
|
251
253
|
if isinstance(processsed_response, dict) and processsed_response['type'] == 'function_call_result':
|
|
252
254
|
query = processsed_response
|
|
253
255
|
else:
|
|
254
|
-
print(f"\n{self.name}: {processsed_response}")
|
|
255
256
|
if isinstance(processsed_response, str):
|
|
256
257
|
transcriber.text_to_speech(processsed_response)
|
|
258
|
+
print(f"\n{self.name}: {processsed_response}")
|
|
257
259
|
|
|
258
260
|
|
|
259
261
|
def start_audio(self, **kwargs):
|
|
260
262
|
transcriber = Transcriber(on_message_callback=self.handle_transcription) # Pass callback to Transcriber
|
|
261
263
|
if transcriber.start_transcription():
|
|
262
264
|
print("Audio transcription started.")
|
|
263
|
-
input("\n\nPress Enter to
|
|
265
|
+
input("\n\nPress Enter to quit...\n\n")
|
|
264
266
|
transcriber.stop_transcription()
|
|
265
267
|
else:
|
|
266
268
|
print("Failed to start audio transcription.")
|
|
@@ -343,7 +345,7 @@ class Agent(BaseModel):
|
|
|
343
345
|
async with aiofiles.open(AGENTS_FILE, 'r') as file:
|
|
344
346
|
content = await file.read()
|
|
345
347
|
agents = json.loads(content) if content else []
|
|
346
|
-
agents.append(new_agent.
|
|
348
|
+
agents.append(new_agent.dict())
|
|
347
349
|
|
|
348
350
|
async with aiofiles.open(AGENTS_FILE, 'w') as file:
|
|
349
351
|
await file.write(json.dumps(agents, indent=4))
|
|
@@ -409,7 +411,7 @@ class Agent(BaseModel):
|
|
|
409
411
|
if agent.id == self.id:
|
|
410
412
|
agents[index] = self
|
|
411
413
|
|
|
412
|
-
updated_agents.append(agent.
|
|
414
|
+
updated_agents.append(agent.dict())
|
|
413
415
|
|
|
414
416
|
async with aiofiles.open(AGENTS_FILE, 'w') as file:
|
|
415
417
|
await file.write(json.dumps(updated_agents, indent=4))
|
|
@@ -346,6 +346,8 @@ Example 5 (Final Answer with Chain of Thought):
|
|
|
346
346
|
"type": "final_answer",
|
|
347
347
|
"result": "25 degrees Celsius is equivalent to 77 degrees Fahrenheit."
|
|
348
348
|
}
|
|
349
|
+
|
|
350
|
+
The only keys allowed in the json response are ["observervation", "tought", "type", "function", "arguments", "result"].
|
|
349
351
|
"""
|
|
350
352
|
|
|
351
353
|
AUTONOMOUSE_AGENT_2_JSON_REMINDER = """
|
|
@@ -29,20 +29,58 @@ def add_agent():
|
|
|
29
29
|
sys.exit()
|
|
30
30
|
|
|
31
31
|
def list_agents():
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
agents = asyncio.run(Agent.list_agents())
|
|
33
|
+
agent_names = [agent.name for agent in agents]
|
|
34
|
+
max_col = len(max(agent_names, key=len))
|
|
35
|
+
max_width = 10
|
|
36
|
+
max_col = max_col if max_col >= max_width else max_width
|
|
37
|
+
|
|
38
|
+
print(max_col)
|
|
39
|
+
print("\nAvailable Agents:")
|
|
40
|
+
print(f" {'_'*((int(len(agents)/10)+5)+max_width+1)}")
|
|
41
|
+
print(f"| #{' '*(int(len(agents)/10))} | {'Agent Name'+' '*(max_col-max_width)} |")
|
|
42
|
+
print(f"|{'-'*(int(len(agents)/10)+3)}|-{'-'*(max_col)}-|")
|
|
43
|
+
for index, a in enumerate(agents):
|
|
44
|
+
padding = (len(str(index)))-int(len(agents)/10)
|
|
45
|
+
padding = padding if padding else padding + 2
|
|
46
|
+
print(f"| {str(index) + ' '*padding}| {a.name + ' '*(max_col-len(a.name))} |")
|
|
36
47
|
|
|
37
48
|
def list_providers():
|
|
38
|
-
|
|
39
|
-
for
|
|
40
|
-
|
|
49
|
+
providers = LLM.list_llms()
|
|
50
|
+
provider_names = [p for p in providers]
|
|
51
|
+
max_col = len(max(provider_names, key=len))
|
|
52
|
+
max_width = 9
|
|
53
|
+
max_col = max_col if max_col >= max_width else max_width
|
|
54
|
+
|
|
55
|
+
print("\nAvailable Providers:")
|
|
56
|
+
print(f" {'_'*((int(len(providers)/10)+5)+max_width+1)}")
|
|
57
|
+
print(f"| #{' '*(int(len(providers)/10))} | {'Provider'+' '*(max_col-7)}|")
|
|
58
|
+
print(f"|{'-'*(int(len(providers)/10)+3)}|-{'-'*(max_col)}-|")
|
|
59
|
+
for index, p in enumerate(providers):
|
|
60
|
+
padding = (len(str(index)))-int(len(providers)/10)
|
|
61
|
+
padding = padding if padding else padding + 2
|
|
62
|
+
print(f"| {str(index) + ' '*padding}| {p + ' '*(max_col-len(p))} |")
|
|
63
|
+
|
|
41
64
|
|
|
42
|
-
def list_tools():
|
|
65
|
+
def list_tools(category='all'):
|
|
66
|
+
tools = []
|
|
67
|
+
if category == 'all':
|
|
68
|
+
tools = Tool.list_all_tools()
|
|
69
|
+
else:
|
|
70
|
+
tools = Tool.get_tools_by_category(category)
|
|
71
|
+
tool_names = [t.name for t in tools]
|
|
72
|
+
max_col = len(max(tool_names, key=len))
|
|
73
|
+
max_width = 13
|
|
74
|
+
max_col = max_col if max_col >= max_width else max_width
|
|
75
|
+
|
|
43
76
|
print("\nAvailable Tools:")
|
|
44
|
-
|
|
45
|
-
|
|
77
|
+
print(f" {'_'*((int(len(tools)/10)+5)+max_col+max_width+4)}")
|
|
78
|
+
print(f"| #{' '*(int(len(tools)/10))} | {'Tool Name'+' '*(max_col-9)} | {'Tool category'+' '*(max_width-13)} |")
|
|
79
|
+
print(f"|{'-'*(int(len(tools)/10)+3)}|-{'-'*(max_col)}-|-{'-'*(max_width)}-|")
|
|
80
|
+
for index, t in enumerate(tools):
|
|
81
|
+
padding = (len(str(index)))-int(len(tools)/10)
|
|
82
|
+
padding = padding if padding else padding + 2
|
|
83
|
+
print(f"| {str(index) + ' '*padding}| {t.name + ' '*(max_col-len(t.name))} | {t.category + ' '*(max_width-len(t.category))} |")
|
|
46
84
|
|
|
47
85
|
def list_sessions():
|
|
48
86
|
print("\nSaved Sessions:")
|
|
@@ -54,7 +92,7 @@ def manage_agents(args: Namespace):
|
|
|
54
92
|
try:
|
|
55
93
|
if args.new:
|
|
56
94
|
add_agent()
|
|
57
|
-
|
|
95
|
+
if args.list:
|
|
58
96
|
list_agents()
|
|
59
97
|
except KeyboardInterrupt:
|
|
60
98
|
print()
|
|
@@ -62,6 +100,17 @@ def manage_agents(args: Namespace):
|
|
|
62
100
|
except Exception as e:
|
|
63
101
|
logging.exception(e)
|
|
64
102
|
sys.exit(1)
|
|
103
|
+
|
|
104
|
+
def manage_tools(args: Namespace):
|
|
105
|
+
try:
|
|
106
|
+
if args.list:
|
|
107
|
+
list_tools(args.list)
|
|
108
|
+
except KeyboardInterrupt:
|
|
109
|
+
print()
|
|
110
|
+
sys.exit()
|
|
111
|
+
except Exception as e:
|
|
112
|
+
logging.exception(e)
|
|
113
|
+
sys.exit(1)
|
|
65
114
|
|
|
66
115
|
def str_or_file(string):
|
|
67
116
|
if len(string) > 100:
|
|
@@ -118,8 +167,16 @@ def start(args: Namespace):
|
|
|
118
167
|
if args.provider:
|
|
119
168
|
assistant.llm = provider
|
|
120
169
|
assistant.name = args.name
|
|
121
|
-
if args.
|
|
170
|
+
if 'all' in args.load_tools:
|
|
122
171
|
assistant.tools = Tool.list_all_tools()
|
|
172
|
+
else:
|
|
173
|
+
tools = []
|
|
174
|
+
for cat in args.load_tools:
|
|
175
|
+
loaded_tools = Tool.get_tools_by_category(cat.lower())
|
|
176
|
+
tools.extend(loaded_tools)
|
|
177
|
+
|
|
178
|
+
assistant.tools = tools
|
|
179
|
+
|
|
123
180
|
|
|
124
181
|
assistant.format_system_prompt()
|
|
125
182
|
asyncio.run(assistant.save())
|
|
@@ -137,19 +194,21 @@ def get_arguments():
|
|
|
137
194
|
agents_parser = subparsers.add_parser('agents', help="Manage agents")
|
|
138
195
|
agents_parser.add_argument("name", type=str, nargs="?", help="Name of an agent to manage (details|update|remove)")
|
|
139
196
|
agents_parser.add_argument('--new', action='store_true', help='Create a new agent')
|
|
140
|
-
agents_parser.add_argument('--list', action='store_false', help='List all saved agents')
|
|
197
|
+
agents_parser.add_argument('-l', '--list', action='store_false', help='List all saved agents')
|
|
141
198
|
agents_parser.add_argument('--update', action='store_true', help='Update an agent')
|
|
142
199
|
agents_parser.add_argument('--remove', action='store_true', help='Delete an agent')
|
|
143
|
-
|
|
144
200
|
agents_parser.set_defaults(func=manage_agents)
|
|
201
|
+
|
|
202
|
+
agents_parser = subparsers.add_parser('tools', help="Manage tools")
|
|
203
|
+
agents_parser.add_argument('-l', '--list', type=str, default='all', nargs='?', choices=['all', 'general', 'system', 'web'], help='List tools by category')
|
|
204
|
+
agents_parser.set_defaults(func=manage_tools)
|
|
145
205
|
|
|
146
206
|
parser.add_argument('--name', type=str, default='Assistant', help='Set name of agent')
|
|
147
207
|
parser.add_argument('--provider', default='', help='Set llm provider to use')
|
|
148
208
|
parser.add_argument('--providers', action='store_true', help='Get a list of all supported providers')
|
|
149
209
|
parser.add_argument('--agents', action='store_true', help='List all saved agents')
|
|
150
210
|
parser.add_argument('--agent', type=str, default='Assistant', help='Set which saved agent to use')
|
|
151
|
-
parser.add_argument('--tools',
|
|
152
|
-
parser.add_argument('--load-all-tools', action='store_true', help='Add all available tools to agent')
|
|
211
|
+
parser.add_argument('--load-tools', type=lambda s: [i for i in s.split(',')], default='general', help='Add tools by categories to agent')
|
|
153
212
|
parser.add_argument('--model', type=str, default='', help='Specify model or model_url to use')
|
|
154
213
|
parser.add_argument('--api-key', type=str, default='', help='Set api key of selected llm')
|
|
155
214
|
parser.add_argument('--api-base', type=str, default='', help='Set api base of selected llm. Set if using local llm.')
|
|
@@ -7,4 +7,5 @@ from cognitrix.llms.google_llm import Google
|
|
|
7
7
|
from cognitrix.llms.anthropic_llm import Anthropic
|
|
8
8
|
from cognitrix.llms.together_llm import Together
|
|
9
9
|
from cognitrix.llms.clarifai_llm import Clarifai
|
|
10
|
-
from cognitrix.llms.mindsdb_llm import MindsDB
|
|
10
|
+
from cognitrix.llms.mindsdb_llm import MindsDB
|
|
11
|
+
from cognitrix.llms.ollama_llm import Ollama
|
|
@@ -31,7 +31,7 @@ class Google(LLM):
|
|
|
31
31
|
supports_system_prompt (bool): Flag to indicate if system prompt should be supported
|
|
32
32
|
system_prompt (str): System prompt to prepend to queries
|
|
33
33
|
"""
|
|
34
|
-
model: str = 'gemini-1.5-
|
|
34
|
+
model: str = 'gemini-1.5-flash'
|
|
35
35
|
"""model endpoint to use"""
|
|
36
36
|
|
|
37
37
|
temperature: float = 0.0
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from cognitrix.llms.base import LLM
|
|
2
|
+
from cognitrix.utils import image_to_base64
|
|
3
|
+
from typing import Any, Optional
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
from ollama import Client
|
|
6
|
+
import logging
|
|
7
|
+
import sys
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
logging.basicConfig(
|
|
11
|
+
format='%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
|
|
12
|
+
datefmt='%d-%b-%y %H:%M:%S',
|
|
13
|
+
level=logging.WARNING
|
|
14
|
+
)
|
|
15
|
+
logger = logging.getLogger('cognitrix.log')
|
|
16
|
+
load_dotenv()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Ollama(LLM):
|
|
20
|
+
"""A class for interacting with the Ollama API.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
model (str): The name of the Local model to use
|
|
24
|
+
temperature (float): The temperature to use when generating text
|
|
25
|
+
base_url (str): Base url of local llm server
|
|
26
|
+
chat_history (list): Chat history
|
|
27
|
+
max_tokens (int): The maximum number of tokens to generate in the completion
|
|
28
|
+
supports_system_prompt (bool): Flag to indicate if system prompt should be supported
|
|
29
|
+
system_prompt (str): System prompt to prepend to queries
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
model: str = 'llama3'
|
|
33
|
+
"""model endpoint to use"""
|
|
34
|
+
|
|
35
|
+
vision_model: str = 'llava-phi3'
|
|
36
|
+
"""vision model endpoint to use"""
|
|
37
|
+
|
|
38
|
+
temperature: float = 0.1
|
|
39
|
+
"""What sampling temperature to use."""
|
|
40
|
+
|
|
41
|
+
api_key: str = 'not-needed'
|
|
42
|
+
"""API key"""
|
|
43
|
+
|
|
44
|
+
base_url: str = 'http://localhost:11434'
|
|
45
|
+
"""Base url of local llm server"""
|
|
46
|
+
|
|
47
|
+
max_tokens: int = 4048
|
|
48
|
+
"""The maximum number of tokens to generate in the completion."""
|
|
49
|
+
|
|
50
|
+
chat_history: list[str] = []
|
|
51
|
+
"""Chat history"""
|
|
52
|
+
|
|
53
|
+
supports_system_prompt: bool = True
|
|
54
|
+
"""Flag to indicate if system prompt should be supported"""
|
|
55
|
+
|
|
56
|
+
system_prompt: str = ""
|
|
57
|
+
"""System prompt to prepend to queries"""
|
|
58
|
+
|
|
59
|
+
def format_query(self, message: dict[str, str]) -> list:
|
|
60
|
+
"""Formats a message for the Claude API.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
message (dict[str, str]): The message to be formatted for the Claude API.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
list: A list of formatted messages for the Claude API.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
formatted_message = [*self.chat_history, message]
|
|
70
|
+
|
|
71
|
+
messages = []
|
|
72
|
+
|
|
73
|
+
for fm in formatted_message:
|
|
74
|
+
if fm['type'] == 'text':
|
|
75
|
+
messages.append({
|
|
76
|
+
"role": fm['role'].lower(),
|
|
77
|
+
"content": fm['message']
|
|
78
|
+
})
|
|
79
|
+
else:
|
|
80
|
+
base64_image = image_to_base64(fm['image'])
|
|
81
|
+
self.model = self.vision_model
|
|
82
|
+
new_message = {
|
|
83
|
+
"role": fm['role'].lower(),
|
|
84
|
+
"content": "This is the result of the latest screenshot",
|
|
85
|
+
"images": [base64_image]
|
|
86
|
+
}
|
|
87
|
+
messages.append(new_message)
|
|
88
|
+
|
|
89
|
+
return messages
|
|
90
|
+
|
|
91
|
+
def __call__(self, query: dict, **kwds: dict)->Optional[str]:
|
|
92
|
+
"""Generates a response to a query using the OpenAI API.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
query (dict): The query to generate a response to.
|
|
96
|
+
kwds (dict): Additional keyword arguments to pass to the OpenAI API.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
A string containing the generated response.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
client = Client('http://localhost:11434')
|
|
103
|
+
|
|
104
|
+
formatted_messages = self.format_query(query)
|
|
105
|
+
|
|
106
|
+
response = client.chat(
|
|
107
|
+
model=self.model,
|
|
108
|
+
messages=[
|
|
109
|
+
{"role": "user", "content": self.system_prompt},
|
|
110
|
+
*formatted_messages
|
|
111
|
+
],
|
|
112
|
+
stream=False,
|
|
113
|
+
)
|
|
114
|
+
print(response)
|
|
115
|
+
return response['message']['content'] #type: ignore
|
|
@@ -30,12 +30,9 @@ class OpenAI(LLM):
|
|
|
30
30
|
system_prompt (str): System prompt to prepend to queries
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
-
model: str = 'gpt-
|
|
33
|
+
model: str = 'gpt-4o'
|
|
34
34
|
"""model endpoint to use"""
|
|
35
35
|
|
|
36
|
-
vision_model: str = 'gpt-4-vision-preview'
|
|
37
|
-
"""vision model endpoint to use"""
|
|
38
|
-
|
|
39
36
|
temperature: float = 0.1
|
|
40
37
|
"""What sampling temperature to use."""
|
|
41
38
|
|
|
@@ -84,7 +81,6 @@ class OpenAI(LLM):
|
|
|
84
81
|
})
|
|
85
82
|
elif fm['type'] == 'image':
|
|
86
83
|
base64_image = image_to_base64(fm['image'])
|
|
87
|
-
# self.model = self.vision_model
|
|
88
84
|
messages.append({
|
|
89
85
|
"role": fm['role'].lower(),
|
|
90
86
|
"content": [
|
|
@@ -94,7 +90,9 @@ class OpenAI(LLM):
|
|
|
94
90
|
},
|
|
95
91
|
{
|
|
96
92
|
"type": "image_url",
|
|
97
|
-
"image_url":
|
|
93
|
+
"image_url": {
|
|
94
|
+
"url": f"data:image/jpeg;base64,{base64_image}"
|
|
95
|
+
}
|
|
98
96
|
}
|
|
99
97
|
]
|
|
100
98
|
})
|
|
@@ -33,10 +33,10 @@ class Session(BaseModel):
|
|
|
33
33
|
sessions[index] = self
|
|
34
34
|
session_exist = True
|
|
35
35
|
|
|
36
|
-
updated_sessions.append(session.
|
|
36
|
+
updated_sessions.append(session.dict())
|
|
37
37
|
|
|
38
38
|
if not session_exist:
|
|
39
|
-
updated_sessions.append(self.
|
|
39
|
+
updated_sessions.append(self.dict())
|
|
40
40
|
|
|
41
41
|
with open(SESSIONS_FILE, 'w') as file:
|
|
42
42
|
json.dump(updated_sessions, file, indent=4)
|