erdo 0.1.4__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.
Potentially problematic release.
This version of erdo might be problematic. Click here for more details.
- erdo/__init__.py +35 -0
- erdo/_generated/__init__.py +18 -0
- erdo/_generated/actions/__init__.py +32 -0
- erdo/_generated/actions/analysis.py +67 -0
- erdo/_generated/actions/bot.py +124 -0
- erdo/_generated/actions/codeexec.py +172 -0
- erdo/_generated/actions/llm.py +104 -0
- erdo/_generated/actions/memory.py +252 -0
- erdo/_generated/actions/resource_definitions.py +194 -0
- erdo/_generated/actions/utils.py +397 -0
- erdo/_generated/actions/webparser.py +109 -0
- erdo/_generated/actions/websearch.py +75 -0
- erdo/_generated/condition/__init__.py +504 -0
- erdo/_generated/internal.py +51 -0
- erdo/_generated/internal_actions.py +79 -0
- erdo/_generated/parameters.py +17 -0
- erdo/_generated/secrets.py +17 -0
- erdo/_generated/template_functions.py +55 -0
- erdo/_generated/types.py +2514 -0
- erdo/actions/__init__.py +40 -0
- erdo/cli_entry.py +73 -0
- erdo/conditions/__init__.py +11 -0
- erdo/install_cli.py +140 -0
- erdo/integrations.py +131 -0
- erdo/py.typed +1 -0
- erdo/state.py +376 -0
- erdo/template.py +136 -0
- erdo/types.py +1142 -0
- erdo-0.1.4.dist-info/METADATA +344 -0
- erdo-0.1.4.dist-info/RECORD +33 -0
- erdo-0.1.4.dist-info/WHEEL +4 -0
- erdo-0.1.4.dist-info/entry_points.txt +2 -0
- erdo-0.1.4.dist-info/licenses/LICENSE +22 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: erdo
|
|
3
|
+
Version: 0.1.4
|
|
4
|
+
Summary: Python SDK for building workflow automation agents with Erdo
|
|
5
|
+
Project-URL: Homepage, https://erdo.ai
|
|
6
|
+
Project-URL: Documentation, https://docs.erdo.ai
|
|
7
|
+
Project-URL: Repository, https://github.com/erdoai/erdo-python-sdk
|
|
8
|
+
Project-URL: Issues, https://github.com/erdoai/erdo-python-sdk/issues
|
|
9
|
+
Author-email: Erdo AI <hello@erdo.ai>
|
|
10
|
+
License: Proprietary
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: agents,ai,automation,data,workflow
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: Other/Proprietary License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Requires-Python: >=3.9
|
|
25
|
+
Requires-Dist: pydantic>=2.0.0
|
|
26
|
+
Requires-Dist: typing-extensions>=4.0.0
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: flake8>=6.0.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: isort>=5.0.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# Erdo Agent SDK
|
|
37
|
+
|
|
38
|
+
Build AI agents and workflows with Python. The Erdo Agent SDK provides a declarative way to create agents that can be executed by the [Erdo platform](https://erdo.ai).
|
|
39
|
+
|
|
40
|
+
## Installation
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install erdo
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
### Creating Agents
|
|
49
|
+
|
|
50
|
+
Create agents using the `Agent` class and define steps with actions:
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
from erdo import Agent, state
|
|
54
|
+
from erdo.actions import memory, llm
|
|
55
|
+
from erdo.conditions import IsSuccess, GreaterThan
|
|
56
|
+
|
|
57
|
+
# Create an agent
|
|
58
|
+
data_analyzer = Agent(
|
|
59
|
+
name="data analyzer",
|
|
60
|
+
description="Analyzes data files and provides insights",
|
|
61
|
+
running_message="Analyzing data...",
|
|
62
|
+
finished_message="Analysis complete",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Step 1: Search for relevant context
|
|
66
|
+
search_step = data_analyzer.step(
|
|
67
|
+
memory.search(
|
|
68
|
+
query=state.query,
|
|
69
|
+
organization_scope="specific",
|
|
70
|
+
limit=5,
|
|
71
|
+
max_distance=0.8
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Step 2: Analyze the data with AI
|
|
76
|
+
analyze_step = data_analyzer.step(
|
|
77
|
+
llm.message(
|
|
78
|
+
model="claude-sonnet-4-20250514",
|
|
79
|
+
system_prompt="You are a data analyst. Analyze the data and provide insights.",
|
|
80
|
+
query=state.query,
|
|
81
|
+
context=search_step.output.memories,
|
|
82
|
+
response_format={
|
|
83
|
+
"Type": "json_schema",
|
|
84
|
+
"Schema": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"required": ["insights", "confidence", "recommendations"],
|
|
87
|
+
"properties": {
|
|
88
|
+
"insights": {"type": "string", "description": "Key insights found"},
|
|
89
|
+
"confidence": {"type": "number", "description": "Confidence 0-1"},
|
|
90
|
+
"recommendations": {"type": "array", "items": {"type": "string"}},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
),
|
|
95
|
+
depends_on=search_step,
|
|
96
|
+
)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Code Execution with External Files
|
|
100
|
+
|
|
101
|
+
Use the `@agent.exec` decorator to execute code with external Python files:
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
from erdo.types import PythonFile
|
|
105
|
+
|
|
106
|
+
@data_analyzer.exec(
|
|
107
|
+
code_files=[
|
|
108
|
+
PythonFile(filename="analysis_files/analyze.py"),
|
|
109
|
+
PythonFile(filename="analysis_files/utils.py"),
|
|
110
|
+
]
|
|
111
|
+
)
|
|
112
|
+
def execute_analysis():
|
|
113
|
+
"""Execute detailed analysis using external code files."""
|
|
114
|
+
from analysis_files.analyze import analyze_data
|
|
115
|
+
from analysis_files.utils import prepare_data
|
|
116
|
+
|
|
117
|
+
# Prepare and analyze data
|
|
118
|
+
prepared_data = prepare_data(context.parameters.get("dataset", {}))
|
|
119
|
+
results = analyze_data(context)
|
|
120
|
+
|
|
121
|
+
return results
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Conditional Step Execution
|
|
125
|
+
|
|
126
|
+
Handle step results with conditions:
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
from erdo.conditions import IsSuccess, GreaterThan
|
|
130
|
+
|
|
131
|
+
# Store high-confidence results
|
|
132
|
+
analyze_step.on(
|
|
133
|
+
IsSuccess() & GreaterThan("confidence", "0.8"),
|
|
134
|
+
memory.store(
|
|
135
|
+
memory={
|
|
136
|
+
"content": analyze_step.output.insights,
|
|
137
|
+
"description": "High-confidence data analysis results",
|
|
138
|
+
"type": "analysis",
|
|
139
|
+
"tags": ["analysis", "high-confidence"],
|
|
140
|
+
}
|
|
141
|
+
),
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Execute detailed analysis for high-confidence results
|
|
145
|
+
analyze_step.on(
|
|
146
|
+
IsSuccess() & GreaterThan("confidence", "0.8"),
|
|
147
|
+
execute_analysis
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Complex Execution Modes
|
|
152
|
+
|
|
153
|
+
Use execution modes for advanced workflows:
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
from erdo import ExecutionMode, ExecutionModeType
|
|
157
|
+
from erdo.actions import bot
|
|
158
|
+
from erdo.conditions import And, IsAny
|
|
159
|
+
from erdo.template import TemplateString
|
|
160
|
+
|
|
161
|
+
# Iterate over resources
|
|
162
|
+
analyze_files = agent.step(
|
|
163
|
+
action=bot.invoke(
|
|
164
|
+
bot_name="file analyzer",
|
|
165
|
+
parameters={"resource": TemplateString("{{resources}}")},
|
|
166
|
+
),
|
|
167
|
+
key="analyze_files",
|
|
168
|
+
execution_mode=ExecutionMode(
|
|
169
|
+
mode=ExecutionModeType.ITERATE_OVER,
|
|
170
|
+
data="parameters.resource",
|
|
171
|
+
if_condition=And(
|
|
172
|
+
IsAny(key="dataset.analysis_summary", value=["", None]),
|
|
173
|
+
IsAny(key="dataset.type", value=["FILE"]),
|
|
174
|
+
),
|
|
175
|
+
)
|
|
176
|
+
)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Loading Prompts
|
|
180
|
+
|
|
181
|
+
Use the `Prompt` class to load prompts from files:
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
from erdo import Prompt
|
|
185
|
+
|
|
186
|
+
# Load prompts from a directory
|
|
187
|
+
prompts = Prompt.load_from_directory("prompts")
|
|
188
|
+
|
|
189
|
+
# Use in your agent steps
|
|
190
|
+
step = agent.step(
|
|
191
|
+
llm.message(
|
|
192
|
+
system_prompt=prompts.system_prompt,
|
|
193
|
+
query=state.query,
|
|
194
|
+
)
|
|
195
|
+
)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### State and Templating
|
|
199
|
+
|
|
200
|
+
Access dynamic data using the `state` object and template strings:
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
from erdo import state
|
|
204
|
+
from erdo.template import TemplateString
|
|
205
|
+
|
|
206
|
+
# Access input parameters
|
|
207
|
+
query = state.query
|
|
208
|
+
dataset = state.dataset
|
|
209
|
+
|
|
210
|
+
# Use in template strings
|
|
211
|
+
template = TemplateString("Analyzing: {{query}} for dataset {{dataset.id}}")
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Core Concepts
|
|
215
|
+
|
|
216
|
+
### Actions
|
|
217
|
+
|
|
218
|
+
Actions are the building blocks of your agents. Available action modules:
|
|
219
|
+
|
|
220
|
+
- `erdo.actions.memory` - Memory storage and search
|
|
221
|
+
- `erdo.actions.llm` - Large language model interactions
|
|
222
|
+
- `erdo.actions.bot` - Bot invocation and orchestration
|
|
223
|
+
- `erdo.actions.codeexec` - Code execution
|
|
224
|
+
- `erdo.actions.utils` - Utility functions
|
|
225
|
+
- `erdo.actions.resource_definitions` - Resource management
|
|
226
|
+
|
|
227
|
+
### Conditions
|
|
228
|
+
|
|
229
|
+
Conditions control when steps execute:
|
|
230
|
+
|
|
231
|
+
- `IsSuccess()`, `IsError()` - Check step status
|
|
232
|
+
- `GreaterThan()`, `LessThan()` - Numeric comparisons
|
|
233
|
+
- `TextEquals()`, `TextContains()` - Text matching
|
|
234
|
+
- `And()`, `Or()`, `Not()` - Logical operators
|
|
235
|
+
|
|
236
|
+
### Types
|
|
237
|
+
|
|
238
|
+
Key types for agent development:
|
|
239
|
+
|
|
240
|
+
- `Agent` - Main agent class
|
|
241
|
+
- `ExecutionMode` - Control step execution behavior
|
|
242
|
+
- `PythonFile` - Reference external Python files
|
|
243
|
+
- `TemplateString` - Dynamic string templates
|
|
244
|
+
- `Prompt` - Prompt management
|
|
245
|
+
|
|
246
|
+
## Advanced Features
|
|
247
|
+
|
|
248
|
+
### Multi-Step Dependencies
|
|
249
|
+
|
|
250
|
+
Create complex workflows with step dependencies:
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
step1 = agent.step(memory.search(...))
|
|
254
|
+
step2 = agent.step(llm.message(...), depends_on=step1)
|
|
255
|
+
step3 = agent.step(utils.send_status(...), depends_on=[step1, step2])
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Dynamic Data Access
|
|
259
|
+
|
|
260
|
+
Use the state object to access runtime data:
|
|
261
|
+
|
|
262
|
+
```python
|
|
263
|
+
# Access nested data
|
|
264
|
+
user_id = state.user.id
|
|
265
|
+
dataset_config = state.dataset.config.type
|
|
266
|
+
|
|
267
|
+
# Use in actions
|
|
268
|
+
step = agent.step(
|
|
269
|
+
memory.search(query=f"data for user {state.user.id}")
|
|
270
|
+
)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Error Handling
|
|
274
|
+
|
|
275
|
+
Handle errors with conditions and fallback steps:
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
from erdo.conditions import IsError
|
|
279
|
+
|
|
280
|
+
main_step = agent.step(llm.message(...))
|
|
281
|
+
|
|
282
|
+
# Handle errors
|
|
283
|
+
main_step.on(
|
|
284
|
+
IsError(),
|
|
285
|
+
utils.send_status(
|
|
286
|
+
message="Analysis failed, please try again",
|
|
287
|
+
status="error"
|
|
288
|
+
)
|
|
289
|
+
)
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## CLI Integration
|
|
293
|
+
|
|
294
|
+
Deploy your agents using the Erdo CLI:
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# Install the CLI
|
|
298
|
+
pip install erdo
|
|
299
|
+
erdo install-cli
|
|
300
|
+
|
|
301
|
+
# Login to your Erdo account
|
|
302
|
+
erdo login
|
|
303
|
+
|
|
304
|
+
# Sync your agents
|
|
305
|
+
erdo sync
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Examples
|
|
309
|
+
|
|
310
|
+
See the `examples/` directory for complete examples:
|
|
311
|
+
|
|
312
|
+
- `agent_centric_example.py` - Comprehensive agent with multiple steps
|
|
313
|
+
- `state_example.py` - State management and templating
|
|
314
|
+
|
|
315
|
+
## API Reference
|
|
316
|
+
|
|
317
|
+
### Core Classes
|
|
318
|
+
|
|
319
|
+
- **Agent**: Main agent class for creating workflows
|
|
320
|
+
- **ExecutionMode**: Control step execution (iterate, conditional, etc.)
|
|
321
|
+
- **Prompt**: Load and manage prompt templates
|
|
322
|
+
|
|
323
|
+
### Actions
|
|
324
|
+
|
|
325
|
+
- **memory**: Store and search memories
|
|
326
|
+
- **llm**: Interact with language models
|
|
327
|
+
- **bot**: Invoke other bots and agents
|
|
328
|
+
- **codeexec**: Execute Python code
|
|
329
|
+
- **utils**: Utility functions (status, notifications, etc.)
|
|
330
|
+
|
|
331
|
+
### Conditions
|
|
332
|
+
|
|
333
|
+
- **Comparison**: `GreaterThan`, `LessThan`, `TextEquals`, etc.
|
|
334
|
+
- **Status**: `IsSuccess`, `IsError`, `IsNull`, etc.
|
|
335
|
+
- **Logical**: `And`, `Or`, `Not`
|
|
336
|
+
|
|
337
|
+
### State & Templating
|
|
338
|
+
|
|
339
|
+
- **state**: Access runtime parameters and data
|
|
340
|
+
- **TemplateString**: Dynamic string templates with `{{variable}}` syntax
|
|
341
|
+
|
|
342
|
+
## License
|
|
343
|
+
|
|
344
|
+
Commercial License - see LICENSE file for details.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
erdo/__init__.py,sha256=uwb-ZI0-msDExY1gUYHZE74LQNclZu2K2g7LbBYyMc4,1121
|
|
2
|
+
erdo/cli_entry.py,sha256=jz18bWz-D09rmkEvwLTAbcK1shHUqFCpiU7U7czEltY,2057
|
|
3
|
+
erdo/install_cli.py,sha256=jgRoSm-MIbLHW0Sr5m78q3htRwIh7JXo_wNmpVsiAcM,4454
|
|
4
|
+
erdo/integrations.py,sha256=-xYBpjYmjhJtv_UnaIfBb46cJC4icLOx9P1kOf5lM-g,4219
|
|
5
|
+
erdo/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
|
6
|
+
erdo/state.py,sha256=o89-SThDWYNjfwMZuDfier1Lx96_tLi5wYSth7dPI6I,14270
|
|
7
|
+
erdo/template.py,sha256=gvlSpEN3whD4LEqY6ppeYYZuFeM9ndU68qzKP-ETRJ8,4641
|
|
8
|
+
erdo/types.py,sha256=3bHOkea_xEcxXm2XcPDSW2ckNgrWJ1A_gLeTovzLjw8,44442
|
|
9
|
+
erdo/_generated/__init__.py,sha256=jFLoVFeswecK5mGp4-MPWwnygol2dYIsEpnmm9gubHY,506
|
|
10
|
+
erdo/_generated/internal.py,sha256=ghd1g_9WF0kXO2MkFIBxcuHuRF00SlOeT-mjJcfQNyM,1569
|
|
11
|
+
erdo/_generated/internal_actions.py,sha256=fGhGsTKsgHfXIH6sKDR_Fb8eKxsVY4BTi4XniUniYfE,2320
|
|
12
|
+
erdo/_generated/parameters.py,sha256=QC-_75fQg_iFu-dvI9ce4yHP9UnFItDWe6sBfzfXaig,472
|
|
13
|
+
erdo/_generated/secrets.py,sha256=F2xBkFsiYXOJnZ5Tcrc9uiaakyirHlKFkYCFxZKANtw,454
|
|
14
|
+
erdo/_generated/template_functions.py,sha256=mgFqsXxL36dMNptzDaGvNEjoA76nFf4k9ZRz-J4Ozdc,1174
|
|
15
|
+
erdo/_generated/types.py,sha256=jaJEEiv_QTDmBTZuchQwtmU0YS8SlrbTi45nnmVEBI0,79201
|
|
16
|
+
erdo/_generated/actions/__init__.py,sha256=l6NcJpJlxXJRUu2wLA6T6gq90AfPMMYPnOuSbG7kwFA,1145
|
|
17
|
+
erdo/_generated/actions/analysis.py,sha256=oOnDoSVlkvPkARt4gXARRW08u8ouPdLWhronyz0d_Do,2139
|
|
18
|
+
erdo/_generated/actions/bot.py,sha256=HOsx9VmtXDZ7UrX_qqNY2oCkJQJx9C1VTxBWyIgxZ-o,4390
|
|
19
|
+
erdo/_generated/actions/codeexec.py,sha256=PC0gd2GAcz49unm0kv0gIrEh_XbU8MikiPBu6H6Da0Y,5494
|
|
20
|
+
erdo/_generated/actions/llm.py,sha256=jyVdoxBWxSlFOeLriI3ln3nzFS5uVagINzpMnapeTTM,3775
|
|
21
|
+
erdo/_generated/actions/memory.py,sha256=dDPJy0qaieTaOhx5hv1HJgpnrYhb-7knTVe8dlSKKwI,8743
|
|
22
|
+
erdo/_generated/actions/resource_definitions.py,sha256=vwIC_kLclFsHZ5-XUQXAqDlXDqrqUrHzbyh8PizLfbk,6740
|
|
23
|
+
erdo/_generated/actions/utils.py,sha256=zKIZj9wNa_VguBRknvMQJdUpzlcTNtpORseCeSpMCUg,11776
|
|
24
|
+
erdo/_generated/actions/webparser.py,sha256=j_HG3z-pRzTGRHA-Wwa8TA6_5fE0Dd2SN3y47e_gZ9U,3909
|
|
25
|
+
erdo/_generated/actions/websearch.py,sha256=-PnPTHvTyGjNrAzqXgLpRYyuN1ARVJ1koEWZfnLue2E,2440
|
|
26
|
+
erdo/_generated/condition/__init__.py,sha256=B36TkgiJwtI7ha-L0uztj-IbSSD4-rb2RCWbPNayMt0,14547
|
|
27
|
+
erdo/actions/__init__.py,sha256=fLtdpll3StUiKH9fTpcFxExWqBLhJyHPdBYbSpoYenw,1199
|
|
28
|
+
erdo/conditions/__init__.py,sha256=xN7MS1aj4lh65CrE-94yFQXnQV8v8VjdEXMzPLTK0CU,394
|
|
29
|
+
erdo-0.1.4.dist-info/METADATA,sha256=lyMfJX0Ul_wqQikLk2upkLE3-y30zwQcgAj1GIWdKho,8990
|
|
30
|
+
erdo-0.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
31
|
+
erdo-0.1.4.dist-info/entry_points.txt,sha256=KFGSp8-6IE3-8dSr-3Djqye3IdEY65Y4E8fABoFUCHg,45
|
|
32
|
+
erdo-0.1.4.dist-info/licenses/LICENSE,sha256=9pdgUAuBAumY5tewMdJnx2Ozj8dS6gGKsSiY-SVInu4,1034
|
|
33
|
+
erdo-0.1.4.dist-info/RECORD,,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Erdo Agents SDK License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Erdo AI LLC
|
|
4
|
+
|
|
5
|
+
All rights reserved.
|
|
6
|
+
|
|
7
|
+
This software is proprietary to Erdo AI LLC and is protected by copyright law.
|
|
8
|
+
No part of this software may be reproduced, distributed, or transmitted in
|
|
9
|
+
any form or by any means, including photocopying, recording, or other
|
|
10
|
+
electronic or mechanical methods, without the prior written permission of
|
|
11
|
+
Erdo AI LLC, except in the case of brief quotations embodied in critical reviews
|
|
12
|
+
and certain other noncommercial uses permitted by copyright law.
|
|
13
|
+
|
|
14
|
+
For permission requests, contact: legal@erdo.ai
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|