socratic-core 0.1.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.
- socratic_core-0.1.0/LICENSE +21 -0
- socratic_core-0.1.0/PKG-INFO +341 -0
- socratic_core-0.1.0/README.md +308 -0
- socratic_core-0.1.0/pyproject.toml +78 -0
- socratic_core-0.1.0/setup.cfg +4 -0
- socratic_core-0.1.0/src/socratic_core/__init__.py +86 -0
- socratic_core-0.1.0/src/socratic_core.egg-info/PKG-INFO +341 -0
- socratic_core-0.1.0/src/socratic_core.egg-info/SOURCES.txt +11 -0
- socratic_core-0.1.0/src/socratic_core.egg-info/dependency_links.txt +1 -0
- socratic_core-0.1.0/src/socratic_core.egg-info/requires.txt +10 -0
- socratic_core-0.1.0/src/socratic_core.egg-info/top_level.txt +1 -0
- socratic_core-0.1.0/tests/test_config.py +133 -0
- socratic_core-0.1.0/tests/test_events_simple.py +58 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Socrates Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: socratic-core
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Core framework components for Socrates AI ecosystem
|
|
5
|
+
Author: Socrates AI Contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Nireus79/Socrates
|
|
8
|
+
Project-URL: Repository, https://github.com/Nireus79/Socrates
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/Nireus79/Socrates/issues
|
|
10
|
+
Keywords: framework,config,events,core
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Requires-Python: >=3.8
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: pydantic>=2.0.0
|
|
24
|
+
Requires-Dist: colorama>=0.4.6
|
|
25
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: black>=23.0; extra == "dev"
|
|
31
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# socratic-core
|
|
35
|
+
|
|
36
|
+
Core framework for the Socrates AI ecosystem. Provides foundational components for configuration, events, logging, and exception handling with zero external dependencies.
|
|
37
|
+
|
|
38
|
+
## Overview
|
|
39
|
+
|
|
40
|
+
`socratic-core` is the lightweight foundation that powers all Socrates components. It provides:
|
|
41
|
+
|
|
42
|
+
- **Configuration System**: Type-safe configuration management via `SocratesConfig`
|
|
43
|
+
- **Event System**: Thread-safe, async-capable event emitter with 90+ built-in event types
|
|
44
|
+
- **Exception Hierarchy**: Structured error handling with 8 exception types
|
|
45
|
+
- **Logging Infrastructure**: JSON logging, performance monitoring, and metrics
|
|
46
|
+
- **Utilities**: ID generators, datetime helpers, TTL caching
|
|
47
|
+
|
|
48
|
+
## Installation
|
|
49
|
+
|
|
50
|
+
### Basic Installation
|
|
51
|
+
```bash
|
|
52
|
+
pip install socratic-core
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### With Optional Dependencies
|
|
56
|
+
```bash
|
|
57
|
+
# For Socrates Nexus (LLM foundation)
|
|
58
|
+
pip install socratic-core[nexus]
|
|
59
|
+
|
|
60
|
+
# For agents support
|
|
61
|
+
pip install socratic-core[agents]
|
|
62
|
+
|
|
63
|
+
# Everything
|
|
64
|
+
pip install socratic-core[full]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Quick Start
|
|
68
|
+
|
|
69
|
+
### Configuration
|
|
70
|
+
```python
|
|
71
|
+
from socratic_core import SocratesConfig
|
|
72
|
+
|
|
73
|
+
# Load from environment
|
|
74
|
+
config = SocratesConfig.from_env()
|
|
75
|
+
|
|
76
|
+
# Or build programmatically
|
|
77
|
+
config = (
|
|
78
|
+
SocratesConfig()
|
|
79
|
+
.with_api_key("your-key")
|
|
80
|
+
.with_data_dir("/path/to/data")
|
|
81
|
+
.with_model("claude-3-sonnet")
|
|
82
|
+
)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Events
|
|
86
|
+
```python
|
|
87
|
+
from socratic_core import EventEmitter, EventType
|
|
88
|
+
|
|
89
|
+
emitter = EventEmitter()
|
|
90
|
+
|
|
91
|
+
# Listen for events
|
|
92
|
+
@emitter.on(EventType.PROJECT_CREATED)
|
|
93
|
+
def on_project_created(data):
|
|
94
|
+
print(f"Project created: {data}")
|
|
95
|
+
|
|
96
|
+
# Emit events
|
|
97
|
+
emitter.emit(EventType.PROJECT_CREATED, {"project_id": "123"})
|
|
98
|
+
|
|
99
|
+
# Async support
|
|
100
|
+
@emitter.on_async(EventType.CODE_GENERATED)
|
|
101
|
+
async def on_code_generated(data):
|
|
102
|
+
await process_code(data)
|
|
103
|
+
|
|
104
|
+
await emitter.emit_async(EventType.CODE_GENERATED, code_data)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Logging
|
|
108
|
+
```python
|
|
109
|
+
from socratic_core.logging import initialize_logging, get_logger
|
|
110
|
+
|
|
111
|
+
# Initialize logging
|
|
112
|
+
initialize_logging(
|
|
113
|
+
log_level="INFO",
|
|
114
|
+
log_file="socrates.log",
|
|
115
|
+
json_format=True
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Get logger
|
|
119
|
+
logger = get_logger(__name__)
|
|
120
|
+
logger.info("Application started", extra={"component": "startup"})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Exceptions
|
|
124
|
+
```python
|
|
125
|
+
from socratic_core import (
|
|
126
|
+
SocratesError,
|
|
127
|
+
ConfigurationError,
|
|
128
|
+
ValidationError,
|
|
129
|
+
DatabaseError,
|
|
130
|
+
AuthenticationError,
|
|
131
|
+
ProjectNotFoundError,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
# Some operation
|
|
136
|
+
pass
|
|
137
|
+
except ConfigurationError as e:
|
|
138
|
+
print(f"Configuration problem: {e}")
|
|
139
|
+
except ValidationError as e:
|
|
140
|
+
print(f"Invalid input: {e}")
|
|
141
|
+
except SocratesError as e:
|
|
142
|
+
print(f"Socrates error: {e}")
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Utilities
|
|
146
|
+
```python
|
|
147
|
+
from socratic_core.utils import (
|
|
148
|
+
ProjectIDGenerator,
|
|
149
|
+
UserIDGenerator,
|
|
150
|
+
cached,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Generate IDs
|
|
154
|
+
project_id = ProjectIDGenerator.generate() # proj_xxxxx
|
|
155
|
+
user_id = UserIDGenerator.generate() # user_xxxxx
|
|
156
|
+
|
|
157
|
+
# Cache with TTL
|
|
158
|
+
@cached(ttl=3600) # Cache for 1 hour
|
|
159
|
+
def expensive_operation(param):
|
|
160
|
+
return compute_something(param)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Configuration Reference
|
|
164
|
+
|
|
165
|
+
### Environment Variables
|
|
166
|
+
```bash
|
|
167
|
+
# API Configuration
|
|
168
|
+
ANTHROPIC_API_KEY=your-api-key
|
|
169
|
+
CLAUDE_MODEL=claude-3-sonnet-20240229
|
|
170
|
+
|
|
171
|
+
# Data Storage
|
|
172
|
+
SOCRATES_DATA_DIR=/path/to/socrates/data
|
|
173
|
+
SOCRATES_DB_PATH=/path/to/database.db
|
|
174
|
+
|
|
175
|
+
# Logging
|
|
176
|
+
SOCRATES_LOG_LEVEL=INFO
|
|
177
|
+
SOCRATES_LOG_FILE=socrates.log
|
|
178
|
+
SOCRATES_LOG_JSON=false
|
|
179
|
+
|
|
180
|
+
# API Server
|
|
181
|
+
SOCRATES_API_URL=http://localhost:8000
|
|
182
|
+
SOCRATES_API_PORT=8000
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### SocratesConfig Class
|
|
186
|
+
```python
|
|
187
|
+
config = SocratesConfig(
|
|
188
|
+
# API Configuration
|
|
189
|
+
api_key: str = "", # Anthropic API key
|
|
190
|
+
model: str = "claude-3-sonnet-20240229", # Claude model version
|
|
191
|
+
|
|
192
|
+
# Data Paths
|
|
193
|
+
data_dir: str = "./socrates_data", # Data directory
|
|
194
|
+
db_path: str = "./socrates_data/socrates.db", # Database path
|
|
195
|
+
|
|
196
|
+
# Logging
|
|
197
|
+
log_level: str = "INFO", # Log level
|
|
198
|
+
log_file: str = "socrates.log", # Log file path
|
|
199
|
+
enable_json_logging: bool = False, # JSON formatted logs
|
|
200
|
+
|
|
201
|
+
# Service Configuration
|
|
202
|
+
cache_enabled: bool = True, # Enable caching
|
|
203
|
+
max_workers: int = 4, # Worker threads
|
|
204
|
+
)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Event Types
|
|
208
|
+
|
|
209
|
+
### Lifecycle Events
|
|
210
|
+
- `AGENT_START` - Agent started processing
|
|
211
|
+
- `AGENT_COMPLETE` - Agent completed task
|
|
212
|
+
- `AGENT_ERROR` - Agent encountered error
|
|
213
|
+
- `SYSTEM_INITIALIZED` - System fully initialized
|
|
214
|
+
- `SYSTEM_SHUTDOWN` - System shutting down
|
|
215
|
+
|
|
216
|
+
### Project Events
|
|
217
|
+
- `PROJECT_CREATED` - New project created
|
|
218
|
+
- `PROJECT_SAVED` - Project saved
|
|
219
|
+
- `PROJECT_DELETED` - Project deleted
|
|
220
|
+
- `PROJECT_LOADED` - Project loaded
|
|
221
|
+
|
|
222
|
+
### Code Events
|
|
223
|
+
- `CODE_GENERATED` - Code generation complete
|
|
224
|
+
- `CODE_ANALYSIS_COMPLETE` - Code analysis done
|
|
225
|
+
- `CODE_REVIEW_STARTED` - Code review begun
|
|
226
|
+
- `CODE_REVIEW_COMPLETE` - Code review finished
|
|
227
|
+
|
|
228
|
+
### Knowledge Events
|
|
229
|
+
- `KNOWLEDGE_LOADED` - Knowledge loaded
|
|
230
|
+
- `DOCUMENT_IMPORTED` - Document imported
|
|
231
|
+
- `KNOWLEDGE_INDEXED` - Knowledge indexed
|
|
232
|
+
|
|
233
|
+
### System Events
|
|
234
|
+
- `TOKEN_USAGE` - Token usage tracked
|
|
235
|
+
- `ERROR_OCCURRED` - Error logged
|
|
236
|
+
- `WARNING_ISSUED` - Warning logged
|
|
237
|
+
|
|
238
|
+
See `socratic_core/events/event_types.py` for the complete list of 90+ event types.
|
|
239
|
+
|
|
240
|
+
## Exception Hierarchy
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
SocratesError (base)
|
|
244
|
+
├── ConfigurationError
|
|
245
|
+
├── ValidationError
|
|
246
|
+
├── DatabaseError
|
|
247
|
+
├── AuthenticationError
|
|
248
|
+
├── ProjectNotFoundError
|
|
249
|
+
├── UserNotFoundError
|
|
250
|
+
├── APIError
|
|
251
|
+
└── AgentError
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Architecture
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
socratic-core/
|
|
258
|
+
├── config/ # Configuration management
|
|
259
|
+
├── exceptions/ # Error hierarchy
|
|
260
|
+
├── events/ # Event system
|
|
261
|
+
├── logging/ # Logging infrastructure
|
|
262
|
+
└── utils/ # Utilities (IDs, caching, etc.)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Dependencies
|
|
266
|
+
|
|
267
|
+
### Core Dependencies
|
|
268
|
+
- **pydantic** - Data validation
|
|
269
|
+
- **colorama** - Colored terminal output
|
|
270
|
+
- **python-dotenv** - Environment variable loading
|
|
271
|
+
|
|
272
|
+
### Optional Dependencies
|
|
273
|
+
- **socrates-nexus** - LLM client foundation
|
|
274
|
+
- **socratic-agents** - Agent framework
|
|
275
|
+
|
|
276
|
+
## Testing
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Install test dependencies
|
|
280
|
+
pip install -e ".[dev]"
|
|
281
|
+
|
|
282
|
+
# Run tests
|
|
283
|
+
pytest tests/ -v
|
|
284
|
+
|
|
285
|
+
# With coverage
|
|
286
|
+
pytest tests/ --cov=socratic_core --cov-report=html
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Development
|
|
290
|
+
|
|
291
|
+
### Local Installation
|
|
292
|
+
```bash
|
|
293
|
+
git clone https://github.com/themsou/Socrates.git
|
|
294
|
+
cd Socrates/socratic-core
|
|
295
|
+
pip install -e ".[dev]"
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Build for Publishing
|
|
299
|
+
```bash
|
|
300
|
+
python -m build
|
|
301
|
+
twine upload dist/*
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Integration with Other Socrates Packages
|
|
305
|
+
|
|
306
|
+
`socratic-core` is designed to be the foundation for other packages:
|
|
307
|
+
|
|
308
|
+
```python
|
|
309
|
+
# In socratic-rag
|
|
310
|
+
from socratic_core import SocratesConfig, EventEmitter, get_logger
|
|
311
|
+
|
|
312
|
+
# In socratic-agents
|
|
313
|
+
from socratic_core import SocratesConfig, EventEmitter, ProjectIDGenerator
|
|
314
|
+
|
|
315
|
+
# In socrates-cli
|
|
316
|
+
from socratic_core import SocratesConfig
|
|
317
|
+
|
|
318
|
+
# In socrates-api
|
|
319
|
+
from socratic_core import SocratesConfig, EventEmitter
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Performance Characteristics
|
|
323
|
+
|
|
324
|
+
- **Import Time**: < 100ms
|
|
325
|
+
- **Memory Overhead**: < 2MB
|
|
326
|
+
- **Event Emission**: < 1ms per event
|
|
327
|
+
- **Configuration Load**: < 50ms
|
|
328
|
+
|
|
329
|
+
## License
|
|
330
|
+
|
|
331
|
+
MIT License - see [LICENSE](LICENSE) file for details
|
|
332
|
+
|
|
333
|
+
## Support
|
|
334
|
+
|
|
335
|
+
- **Issues**: [GitHub Issues](https://github.com/themsou/Socrates/issues)
|
|
336
|
+
- **Documentation**: See [ARCHITECTURE.md](../ARCHITECTURE.md)
|
|
337
|
+
- **Migration**: See [MIGRATION_GUIDE.md](../MIGRATION_GUIDE.md)
|
|
338
|
+
|
|
339
|
+
## Contributing
|
|
340
|
+
|
|
341
|
+
We welcome contributions! Please see the main Socrates repository for contribution guidelines.
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# socratic-core
|
|
2
|
+
|
|
3
|
+
Core framework for the Socrates AI ecosystem. Provides foundational components for configuration, events, logging, and exception handling with zero external dependencies.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`socratic-core` is the lightweight foundation that powers all Socrates components. It provides:
|
|
8
|
+
|
|
9
|
+
- **Configuration System**: Type-safe configuration management via `SocratesConfig`
|
|
10
|
+
- **Event System**: Thread-safe, async-capable event emitter with 90+ built-in event types
|
|
11
|
+
- **Exception Hierarchy**: Structured error handling with 8 exception types
|
|
12
|
+
- **Logging Infrastructure**: JSON logging, performance monitoring, and metrics
|
|
13
|
+
- **Utilities**: ID generators, datetime helpers, TTL caching
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
### Basic Installation
|
|
18
|
+
```bash
|
|
19
|
+
pip install socratic-core
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### With Optional Dependencies
|
|
23
|
+
```bash
|
|
24
|
+
# For Socrates Nexus (LLM foundation)
|
|
25
|
+
pip install socratic-core[nexus]
|
|
26
|
+
|
|
27
|
+
# For agents support
|
|
28
|
+
pip install socratic-core[agents]
|
|
29
|
+
|
|
30
|
+
# Everything
|
|
31
|
+
pip install socratic-core[full]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
### Configuration
|
|
37
|
+
```python
|
|
38
|
+
from socratic_core import SocratesConfig
|
|
39
|
+
|
|
40
|
+
# Load from environment
|
|
41
|
+
config = SocratesConfig.from_env()
|
|
42
|
+
|
|
43
|
+
# Or build programmatically
|
|
44
|
+
config = (
|
|
45
|
+
SocratesConfig()
|
|
46
|
+
.with_api_key("your-key")
|
|
47
|
+
.with_data_dir("/path/to/data")
|
|
48
|
+
.with_model("claude-3-sonnet")
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Events
|
|
53
|
+
```python
|
|
54
|
+
from socratic_core import EventEmitter, EventType
|
|
55
|
+
|
|
56
|
+
emitter = EventEmitter()
|
|
57
|
+
|
|
58
|
+
# Listen for events
|
|
59
|
+
@emitter.on(EventType.PROJECT_CREATED)
|
|
60
|
+
def on_project_created(data):
|
|
61
|
+
print(f"Project created: {data}")
|
|
62
|
+
|
|
63
|
+
# Emit events
|
|
64
|
+
emitter.emit(EventType.PROJECT_CREATED, {"project_id": "123"})
|
|
65
|
+
|
|
66
|
+
# Async support
|
|
67
|
+
@emitter.on_async(EventType.CODE_GENERATED)
|
|
68
|
+
async def on_code_generated(data):
|
|
69
|
+
await process_code(data)
|
|
70
|
+
|
|
71
|
+
await emitter.emit_async(EventType.CODE_GENERATED, code_data)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Logging
|
|
75
|
+
```python
|
|
76
|
+
from socratic_core.logging import initialize_logging, get_logger
|
|
77
|
+
|
|
78
|
+
# Initialize logging
|
|
79
|
+
initialize_logging(
|
|
80
|
+
log_level="INFO",
|
|
81
|
+
log_file="socrates.log",
|
|
82
|
+
json_format=True
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Get logger
|
|
86
|
+
logger = get_logger(__name__)
|
|
87
|
+
logger.info("Application started", extra={"component": "startup"})
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Exceptions
|
|
91
|
+
```python
|
|
92
|
+
from socratic_core import (
|
|
93
|
+
SocratesError,
|
|
94
|
+
ConfigurationError,
|
|
95
|
+
ValidationError,
|
|
96
|
+
DatabaseError,
|
|
97
|
+
AuthenticationError,
|
|
98
|
+
ProjectNotFoundError,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
# Some operation
|
|
103
|
+
pass
|
|
104
|
+
except ConfigurationError as e:
|
|
105
|
+
print(f"Configuration problem: {e}")
|
|
106
|
+
except ValidationError as e:
|
|
107
|
+
print(f"Invalid input: {e}")
|
|
108
|
+
except SocratesError as e:
|
|
109
|
+
print(f"Socrates error: {e}")
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Utilities
|
|
113
|
+
```python
|
|
114
|
+
from socratic_core.utils import (
|
|
115
|
+
ProjectIDGenerator,
|
|
116
|
+
UserIDGenerator,
|
|
117
|
+
cached,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Generate IDs
|
|
121
|
+
project_id = ProjectIDGenerator.generate() # proj_xxxxx
|
|
122
|
+
user_id = UserIDGenerator.generate() # user_xxxxx
|
|
123
|
+
|
|
124
|
+
# Cache with TTL
|
|
125
|
+
@cached(ttl=3600) # Cache for 1 hour
|
|
126
|
+
def expensive_operation(param):
|
|
127
|
+
return compute_something(param)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Configuration Reference
|
|
131
|
+
|
|
132
|
+
### Environment Variables
|
|
133
|
+
```bash
|
|
134
|
+
# API Configuration
|
|
135
|
+
ANTHROPIC_API_KEY=your-api-key
|
|
136
|
+
CLAUDE_MODEL=claude-3-sonnet-20240229
|
|
137
|
+
|
|
138
|
+
# Data Storage
|
|
139
|
+
SOCRATES_DATA_DIR=/path/to/socrates/data
|
|
140
|
+
SOCRATES_DB_PATH=/path/to/database.db
|
|
141
|
+
|
|
142
|
+
# Logging
|
|
143
|
+
SOCRATES_LOG_LEVEL=INFO
|
|
144
|
+
SOCRATES_LOG_FILE=socrates.log
|
|
145
|
+
SOCRATES_LOG_JSON=false
|
|
146
|
+
|
|
147
|
+
# API Server
|
|
148
|
+
SOCRATES_API_URL=http://localhost:8000
|
|
149
|
+
SOCRATES_API_PORT=8000
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### SocratesConfig Class
|
|
153
|
+
```python
|
|
154
|
+
config = SocratesConfig(
|
|
155
|
+
# API Configuration
|
|
156
|
+
api_key: str = "", # Anthropic API key
|
|
157
|
+
model: str = "claude-3-sonnet-20240229", # Claude model version
|
|
158
|
+
|
|
159
|
+
# Data Paths
|
|
160
|
+
data_dir: str = "./socrates_data", # Data directory
|
|
161
|
+
db_path: str = "./socrates_data/socrates.db", # Database path
|
|
162
|
+
|
|
163
|
+
# Logging
|
|
164
|
+
log_level: str = "INFO", # Log level
|
|
165
|
+
log_file: str = "socrates.log", # Log file path
|
|
166
|
+
enable_json_logging: bool = False, # JSON formatted logs
|
|
167
|
+
|
|
168
|
+
# Service Configuration
|
|
169
|
+
cache_enabled: bool = True, # Enable caching
|
|
170
|
+
max_workers: int = 4, # Worker threads
|
|
171
|
+
)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Event Types
|
|
175
|
+
|
|
176
|
+
### Lifecycle Events
|
|
177
|
+
- `AGENT_START` - Agent started processing
|
|
178
|
+
- `AGENT_COMPLETE` - Agent completed task
|
|
179
|
+
- `AGENT_ERROR` - Agent encountered error
|
|
180
|
+
- `SYSTEM_INITIALIZED` - System fully initialized
|
|
181
|
+
- `SYSTEM_SHUTDOWN` - System shutting down
|
|
182
|
+
|
|
183
|
+
### Project Events
|
|
184
|
+
- `PROJECT_CREATED` - New project created
|
|
185
|
+
- `PROJECT_SAVED` - Project saved
|
|
186
|
+
- `PROJECT_DELETED` - Project deleted
|
|
187
|
+
- `PROJECT_LOADED` - Project loaded
|
|
188
|
+
|
|
189
|
+
### Code Events
|
|
190
|
+
- `CODE_GENERATED` - Code generation complete
|
|
191
|
+
- `CODE_ANALYSIS_COMPLETE` - Code analysis done
|
|
192
|
+
- `CODE_REVIEW_STARTED` - Code review begun
|
|
193
|
+
- `CODE_REVIEW_COMPLETE` - Code review finished
|
|
194
|
+
|
|
195
|
+
### Knowledge Events
|
|
196
|
+
- `KNOWLEDGE_LOADED` - Knowledge loaded
|
|
197
|
+
- `DOCUMENT_IMPORTED` - Document imported
|
|
198
|
+
- `KNOWLEDGE_INDEXED` - Knowledge indexed
|
|
199
|
+
|
|
200
|
+
### System Events
|
|
201
|
+
- `TOKEN_USAGE` - Token usage tracked
|
|
202
|
+
- `ERROR_OCCURRED` - Error logged
|
|
203
|
+
- `WARNING_ISSUED` - Warning logged
|
|
204
|
+
|
|
205
|
+
See `socratic_core/events/event_types.py` for the complete list of 90+ event types.
|
|
206
|
+
|
|
207
|
+
## Exception Hierarchy
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
SocratesError (base)
|
|
211
|
+
├── ConfigurationError
|
|
212
|
+
├── ValidationError
|
|
213
|
+
├── DatabaseError
|
|
214
|
+
├── AuthenticationError
|
|
215
|
+
├── ProjectNotFoundError
|
|
216
|
+
├── UserNotFoundError
|
|
217
|
+
├── APIError
|
|
218
|
+
└── AgentError
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Architecture
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
socratic-core/
|
|
225
|
+
├── config/ # Configuration management
|
|
226
|
+
├── exceptions/ # Error hierarchy
|
|
227
|
+
├── events/ # Event system
|
|
228
|
+
├── logging/ # Logging infrastructure
|
|
229
|
+
└── utils/ # Utilities (IDs, caching, etc.)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Dependencies
|
|
233
|
+
|
|
234
|
+
### Core Dependencies
|
|
235
|
+
- **pydantic** - Data validation
|
|
236
|
+
- **colorama** - Colored terminal output
|
|
237
|
+
- **python-dotenv** - Environment variable loading
|
|
238
|
+
|
|
239
|
+
### Optional Dependencies
|
|
240
|
+
- **socrates-nexus** - LLM client foundation
|
|
241
|
+
- **socratic-agents** - Agent framework
|
|
242
|
+
|
|
243
|
+
## Testing
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# Install test dependencies
|
|
247
|
+
pip install -e ".[dev]"
|
|
248
|
+
|
|
249
|
+
# Run tests
|
|
250
|
+
pytest tests/ -v
|
|
251
|
+
|
|
252
|
+
# With coverage
|
|
253
|
+
pytest tests/ --cov=socratic_core --cov-report=html
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Development
|
|
257
|
+
|
|
258
|
+
### Local Installation
|
|
259
|
+
```bash
|
|
260
|
+
git clone https://github.com/themsou/Socrates.git
|
|
261
|
+
cd Socrates/socratic-core
|
|
262
|
+
pip install -e ".[dev]"
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Build for Publishing
|
|
266
|
+
```bash
|
|
267
|
+
python -m build
|
|
268
|
+
twine upload dist/*
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Integration with Other Socrates Packages
|
|
272
|
+
|
|
273
|
+
`socratic-core` is designed to be the foundation for other packages:
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
# In socratic-rag
|
|
277
|
+
from socratic_core import SocratesConfig, EventEmitter, get_logger
|
|
278
|
+
|
|
279
|
+
# In socratic-agents
|
|
280
|
+
from socratic_core import SocratesConfig, EventEmitter, ProjectIDGenerator
|
|
281
|
+
|
|
282
|
+
# In socrates-cli
|
|
283
|
+
from socratic_core import SocratesConfig
|
|
284
|
+
|
|
285
|
+
# In socrates-api
|
|
286
|
+
from socratic_core import SocratesConfig, EventEmitter
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Performance Characteristics
|
|
290
|
+
|
|
291
|
+
- **Import Time**: < 100ms
|
|
292
|
+
- **Memory Overhead**: < 2MB
|
|
293
|
+
- **Event Emission**: < 1ms per event
|
|
294
|
+
- **Configuration Load**: < 50ms
|
|
295
|
+
|
|
296
|
+
## License
|
|
297
|
+
|
|
298
|
+
MIT License - see [LICENSE](LICENSE) file for details
|
|
299
|
+
|
|
300
|
+
## Support
|
|
301
|
+
|
|
302
|
+
- **Issues**: [GitHub Issues](https://github.com/themsou/Socrates/issues)
|
|
303
|
+
- **Documentation**: See [ARCHITECTURE.md](../ARCHITECTURE.md)
|
|
304
|
+
- **Migration**: See [MIGRATION_GUIDE.md](../MIGRATION_GUIDE.md)
|
|
305
|
+
|
|
306
|
+
## Contributing
|
|
307
|
+
|
|
308
|
+
We welcome contributions! Please see the main Socrates repository for contribution guidelines.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=65.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "socratic-core"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Core framework components for Socrates AI ecosystem"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Socrates AI Contributors"}
|
|
14
|
+
]
|
|
15
|
+
keywords = ["framework", "config", "events", "core"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 4 - Beta",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"License :: OSI Approved :: MIT License",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.8",
|
|
22
|
+
"Programming Language :: Python :: 3.9",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
dependencies = [
|
|
29
|
+
"pydantic>=2.0.0",
|
|
30
|
+
"colorama>=0.4.6",
|
|
31
|
+
"python-dotenv>=1.0.0",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[project.optional-dependencies]
|
|
35
|
+
dev = [
|
|
36
|
+
"pytest>=7.0.0",
|
|
37
|
+
"pytest-asyncio>=0.21.0",
|
|
38
|
+
"pytest-cov>=4.0.0",
|
|
39
|
+
"black>=23.0",
|
|
40
|
+
"ruff>=0.1.0",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
[project.urls]
|
|
44
|
+
Homepage = "https://github.com/Nireus79/Socrates"
|
|
45
|
+
Repository = "https://github.com/Nireus79/Socrates"
|
|
46
|
+
"Bug Tracker" = "https://github.com/Nireus79/Socrates/issues"
|
|
47
|
+
|
|
48
|
+
[tool.setuptools]
|
|
49
|
+
packages = ["socratic_core"]
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.package-dir]
|
|
52
|
+
"" = "src"
|
|
53
|
+
|
|
54
|
+
[tool.pytest.ini_options]
|
|
55
|
+
testpaths = ["tests"]
|
|
56
|
+
python_files = "test_*.py"
|
|
57
|
+
python_classes = "Test*"
|
|
58
|
+
python_functions = "test_*"
|
|
59
|
+
asyncio_mode = "auto"
|
|
60
|
+
addopts = "--strict-markers --tb=short -v"
|
|
61
|
+
markers = [
|
|
62
|
+
"unit: Unit tests",
|
|
63
|
+
"integration: Integration tests",
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
[tool.coverage.run]
|
|
67
|
+
source = ["socratic_core"]
|
|
68
|
+
branch = true
|
|
69
|
+
omit = ["*/tests/*", "*/__init__.py"]
|
|
70
|
+
|
|
71
|
+
[tool.coverage.report]
|
|
72
|
+
exclude_lines = [
|
|
73
|
+
"pragma: no cover",
|
|
74
|
+
"def __repr__",
|
|
75
|
+
"raise AssertionError",
|
|
76
|
+
"raise NotImplementedError",
|
|
77
|
+
"if __name__ == .__main__.:",
|
|
78
|
+
]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Socratic Core Framework
|
|
3
|
+
|
|
4
|
+
Core framework components for the Socrates AI ecosystem, including:
|
|
5
|
+
- Configuration management
|
|
6
|
+
- Exception handling
|
|
7
|
+
- Event system
|
|
8
|
+
- Logging infrastructure
|
|
9
|
+
- Utilities and helpers
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
__version__ = "0.1.0"
|
|
13
|
+
|
|
14
|
+
# Export configuration components
|
|
15
|
+
from .config import ConfigBuilder, SocratesConfig
|
|
16
|
+
|
|
17
|
+
# Export exception components
|
|
18
|
+
from .exceptions import (
|
|
19
|
+
APIError,
|
|
20
|
+
AgentError,
|
|
21
|
+
AuthenticationError,
|
|
22
|
+
ConfigurationError,
|
|
23
|
+
DatabaseError,
|
|
24
|
+
ProjectNotFoundError,
|
|
25
|
+
SocratesError,
|
|
26
|
+
UserNotFoundError,
|
|
27
|
+
ValidationError,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Export event components
|
|
31
|
+
from .events import EventEmitter, EventType
|
|
32
|
+
|
|
33
|
+
# Export logging components
|
|
34
|
+
from .logging import (
|
|
35
|
+
JsonFormatter,
|
|
36
|
+
LoggingConfig,
|
|
37
|
+
PerformanceFilter,
|
|
38
|
+
PerformanceMonitor,
|
|
39
|
+
get_logging_config,
|
|
40
|
+
initialize_logging,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Export utility components
|
|
44
|
+
from .utils import (
|
|
45
|
+
ProjectIDGenerator,
|
|
46
|
+
TTLCache,
|
|
47
|
+
UserIDGenerator,
|
|
48
|
+
cached,
|
|
49
|
+
deserialize_datetime,
|
|
50
|
+
serialize_datetime,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
__all__ = [
|
|
54
|
+
# Version
|
|
55
|
+
"__version__",
|
|
56
|
+
# Configuration
|
|
57
|
+
"SocratesConfig",
|
|
58
|
+
"ConfigBuilder",
|
|
59
|
+
# Exceptions
|
|
60
|
+
"SocratesError",
|
|
61
|
+
"ConfigurationError",
|
|
62
|
+
"AgentError",
|
|
63
|
+
"DatabaseError",
|
|
64
|
+
"AuthenticationError",
|
|
65
|
+
"ProjectNotFoundError",
|
|
66
|
+
"UserNotFoundError",
|
|
67
|
+
"ValidationError",
|
|
68
|
+
"APIError",
|
|
69
|
+
# Events
|
|
70
|
+
"EventEmitter",
|
|
71
|
+
"EventType",
|
|
72
|
+
# Logging
|
|
73
|
+
"LoggingConfig",
|
|
74
|
+
"JsonFormatter",
|
|
75
|
+
"PerformanceFilter",
|
|
76
|
+
"PerformanceMonitor",
|
|
77
|
+
"initialize_logging",
|
|
78
|
+
"get_logging_config",
|
|
79
|
+
# Utilities
|
|
80
|
+
"ProjectIDGenerator",
|
|
81
|
+
"UserIDGenerator",
|
|
82
|
+
"TTLCache",
|
|
83
|
+
"cached",
|
|
84
|
+
"serialize_datetime",
|
|
85
|
+
"deserialize_datetime",
|
|
86
|
+
]
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: socratic-core
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Core framework components for Socrates AI ecosystem
|
|
5
|
+
Author: Socrates AI Contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Nireus79/Socrates
|
|
8
|
+
Project-URL: Repository, https://github.com/Nireus79/Socrates
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/Nireus79/Socrates/issues
|
|
10
|
+
Keywords: framework,config,events,core
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Requires-Python: >=3.8
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: pydantic>=2.0.0
|
|
24
|
+
Requires-Dist: colorama>=0.4.6
|
|
25
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: black>=23.0; extra == "dev"
|
|
31
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# socratic-core
|
|
35
|
+
|
|
36
|
+
Core framework for the Socrates AI ecosystem. Provides foundational components for configuration, events, logging, and exception handling with zero external dependencies.
|
|
37
|
+
|
|
38
|
+
## Overview
|
|
39
|
+
|
|
40
|
+
`socratic-core` is the lightweight foundation that powers all Socrates components. It provides:
|
|
41
|
+
|
|
42
|
+
- **Configuration System**: Type-safe configuration management via `SocratesConfig`
|
|
43
|
+
- **Event System**: Thread-safe, async-capable event emitter with 90+ built-in event types
|
|
44
|
+
- **Exception Hierarchy**: Structured error handling with 8 exception types
|
|
45
|
+
- **Logging Infrastructure**: JSON logging, performance monitoring, and metrics
|
|
46
|
+
- **Utilities**: ID generators, datetime helpers, TTL caching
|
|
47
|
+
|
|
48
|
+
## Installation
|
|
49
|
+
|
|
50
|
+
### Basic Installation
|
|
51
|
+
```bash
|
|
52
|
+
pip install socratic-core
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### With Optional Dependencies
|
|
56
|
+
```bash
|
|
57
|
+
# For Socrates Nexus (LLM foundation)
|
|
58
|
+
pip install socratic-core[nexus]
|
|
59
|
+
|
|
60
|
+
# For agents support
|
|
61
|
+
pip install socratic-core[agents]
|
|
62
|
+
|
|
63
|
+
# Everything
|
|
64
|
+
pip install socratic-core[full]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Quick Start
|
|
68
|
+
|
|
69
|
+
### Configuration
|
|
70
|
+
```python
|
|
71
|
+
from socratic_core import SocratesConfig
|
|
72
|
+
|
|
73
|
+
# Load from environment
|
|
74
|
+
config = SocratesConfig.from_env()
|
|
75
|
+
|
|
76
|
+
# Or build programmatically
|
|
77
|
+
config = (
|
|
78
|
+
SocratesConfig()
|
|
79
|
+
.with_api_key("your-key")
|
|
80
|
+
.with_data_dir("/path/to/data")
|
|
81
|
+
.with_model("claude-3-sonnet")
|
|
82
|
+
)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Events
|
|
86
|
+
```python
|
|
87
|
+
from socratic_core import EventEmitter, EventType
|
|
88
|
+
|
|
89
|
+
emitter = EventEmitter()
|
|
90
|
+
|
|
91
|
+
# Listen for events
|
|
92
|
+
@emitter.on(EventType.PROJECT_CREATED)
|
|
93
|
+
def on_project_created(data):
|
|
94
|
+
print(f"Project created: {data}")
|
|
95
|
+
|
|
96
|
+
# Emit events
|
|
97
|
+
emitter.emit(EventType.PROJECT_CREATED, {"project_id": "123"})
|
|
98
|
+
|
|
99
|
+
# Async support
|
|
100
|
+
@emitter.on_async(EventType.CODE_GENERATED)
|
|
101
|
+
async def on_code_generated(data):
|
|
102
|
+
await process_code(data)
|
|
103
|
+
|
|
104
|
+
await emitter.emit_async(EventType.CODE_GENERATED, code_data)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Logging
|
|
108
|
+
```python
|
|
109
|
+
from socratic_core.logging import initialize_logging, get_logger
|
|
110
|
+
|
|
111
|
+
# Initialize logging
|
|
112
|
+
initialize_logging(
|
|
113
|
+
log_level="INFO",
|
|
114
|
+
log_file="socrates.log",
|
|
115
|
+
json_format=True
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Get logger
|
|
119
|
+
logger = get_logger(__name__)
|
|
120
|
+
logger.info("Application started", extra={"component": "startup"})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Exceptions
|
|
124
|
+
```python
|
|
125
|
+
from socratic_core import (
|
|
126
|
+
SocratesError,
|
|
127
|
+
ConfigurationError,
|
|
128
|
+
ValidationError,
|
|
129
|
+
DatabaseError,
|
|
130
|
+
AuthenticationError,
|
|
131
|
+
ProjectNotFoundError,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
# Some operation
|
|
136
|
+
pass
|
|
137
|
+
except ConfigurationError as e:
|
|
138
|
+
print(f"Configuration problem: {e}")
|
|
139
|
+
except ValidationError as e:
|
|
140
|
+
print(f"Invalid input: {e}")
|
|
141
|
+
except SocratesError as e:
|
|
142
|
+
print(f"Socrates error: {e}")
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Utilities
|
|
146
|
+
```python
|
|
147
|
+
from socratic_core.utils import (
|
|
148
|
+
ProjectIDGenerator,
|
|
149
|
+
UserIDGenerator,
|
|
150
|
+
cached,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Generate IDs
|
|
154
|
+
project_id = ProjectIDGenerator.generate() # proj_xxxxx
|
|
155
|
+
user_id = UserIDGenerator.generate() # user_xxxxx
|
|
156
|
+
|
|
157
|
+
# Cache with TTL
|
|
158
|
+
@cached(ttl=3600) # Cache for 1 hour
|
|
159
|
+
def expensive_operation(param):
|
|
160
|
+
return compute_something(param)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Configuration Reference
|
|
164
|
+
|
|
165
|
+
### Environment Variables
|
|
166
|
+
```bash
|
|
167
|
+
# API Configuration
|
|
168
|
+
ANTHROPIC_API_KEY=your-api-key
|
|
169
|
+
CLAUDE_MODEL=claude-3-sonnet-20240229
|
|
170
|
+
|
|
171
|
+
# Data Storage
|
|
172
|
+
SOCRATES_DATA_DIR=/path/to/socrates/data
|
|
173
|
+
SOCRATES_DB_PATH=/path/to/database.db
|
|
174
|
+
|
|
175
|
+
# Logging
|
|
176
|
+
SOCRATES_LOG_LEVEL=INFO
|
|
177
|
+
SOCRATES_LOG_FILE=socrates.log
|
|
178
|
+
SOCRATES_LOG_JSON=false
|
|
179
|
+
|
|
180
|
+
# API Server
|
|
181
|
+
SOCRATES_API_URL=http://localhost:8000
|
|
182
|
+
SOCRATES_API_PORT=8000
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### SocratesConfig Class
|
|
186
|
+
```python
|
|
187
|
+
config = SocratesConfig(
|
|
188
|
+
# API Configuration
|
|
189
|
+
api_key: str = "", # Anthropic API key
|
|
190
|
+
model: str = "claude-3-sonnet-20240229", # Claude model version
|
|
191
|
+
|
|
192
|
+
# Data Paths
|
|
193
|
+
data_dir: str = "./socrates_data", # Data directory
|
|
194
|
+
db_path: str = "./socrates_data/socrates.db", # Database path
|
|
195
|
+
|
|
196
|
+
# Logging
|
|
197
|
+
log_level: str = "INFO", # Log level
|
|
198
|
+
log_file: str = "socrates.log", # Log file path
|
|
199
|
+
enable_json_logging: bool = False, # JSON formatted logs
|
|
200
|
+
|
|
201
|
+
# Service Configuration
|
|
202
|
+
cache_enabled: bool = True, # Enable caching
|
|
203
|
+
max_workers: int = 4, # Worker threads
|
|
204
|
+
)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Event Types
|
|
208
|
+
|
|
209
|
+
### Lifecycle Events
|
|
210
|
+
- `AGENT_START` - Agent started processing
|
|
211
|
+
- `AGENT_COMPLETE` - Agent completed task
|
|
212
|
+
- `AGENT_ERROR` - Agent encountered error
|
|
213
|
+
- `SYSTEM_INITIALIZED` - System fully initialized
|
|
214
|
+
- `SYSTEM_SHUTDOWN` - System shutting down
|
|
215
|
+
|
|
216
|
+
### Project Events
|
|
217
|
+
- `PROJECT_CREATED` - New project created
|
|
218
|
+
- `PROJECT_SAVED` - Project saved
|
|
219
|
+
- `PROJECT_DELETED` - Project deleted
|
|
220
|
+
- `PROJECT_LOADED` - Project loaded
|
|
221
|
+
|
|
222
|
+
### Code Events
|
|
223
|
+
- `CODE_GENERATED` - Code generation complete
|
|
224
|
+
- `CODE_ANALYSIS_COMPLETE` - Code analysis done
|
|
225
|
+
- `CODE_REVIEW_STARTED` - Code review begun
|
|
226
|
+
- `CODE_REVIEW_COMPLETE` - Code review finished
|
|
227
|
+
|
|
228
|
+
### Knowledge Events
|
|
229
|
+
- `KNOWLEDGE_LOADED` - Knowledge loaded
|
|
230
|
+
- `DOCUMENT_IMPORTED` - Document imported
|
|
231
|
+
- `KNOWLEDGE_INDEXED` - Knowledge indexed
|
|
232
|
+
|
|
233
|
+
### System Events
|
|
234
|
+
- `TOKEN_USAGE` - Token usage tracked
|
|
235
|
+
- `ERROR_OCCURRED` - Error logged
|
|
236
|
+
- `WARNING_ISSUED` - Warning logged
|
|
237
|
+
|
|
238
|
+
See `socratic_core/events/event_types.py` for the complete list of 90+ event types.
|
|
239
|
+
|
|
240
|
+
## Exception Hierarchy
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
SocratesError (base)
|
|
244
|
+
├── ConfigurationError
|
|
245
|
+
├── ValidationError
|
|
246
|
+
├── DatabaseError
|
|
247
|
+
├── AuthenticationError
|
|
248
|
+
├── ProjectNotFoundError
|
|
249
|
+
├── UserNotFoundError
|
|
250
|
+
├── APIError
|
|
251
|
+
└── AgentError
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Architecture
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
socratic-core/
|
|
258
|
+
├── config/ # Configuration management
|
|
259
|
+
├── exceptions/ # Error hierarchy
|
|
260
|
+
├── events/ # Event system
|
|
261
|
+
├── logging/ # Logging infrastructure
|
|
262
|
+
└── utils/ # Utilities (IDs, caching, etc.)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Dependencies
|
|
266
|
+
|
|
267
|
+
### Core Dependencies
|
|
268
|
+
- **pydantic** - Data validation
|
|
269
|
+
- **colorama** - Colored terminal output
|
|
270
|
+
- **python-dotenv** - Environment variable loading
|
|
271
|
+
|
|
272
|
+
### Optional Dependencies
|
|
273
|
+
- **socrates-nexus** - LLM client foundation
|
|
274
|
+
- **socratic-agents** - Agent framework
|
|
275
|
+
|
|
276
|
+
## Testing
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Install test dependencies
|
|
280
|
+
pip install -e ".[dev]"
|
|
281
|
+
|
|
282
|
+
# Run tests
|
|
283
|
+
pytest tests/ -v
|
|
284
|
+
|
|
285
|
+
# With coverage
|
|
286
|
+
pytest tests/ --cov=socratic_core --cov-report=html
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Development
|
|
290
|
+
|
|
291
|
+
### Local Installation
|
|
292
|
+
```bash
|
|
293
|
+
git clone https://github.com/themsou/Socrates.git
|
|
294
|
+
cd Socrates/socratic-core
|
|
295
|
+
pip install -e ".[dev]"
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Build for Publishing
|
|
299
|
+
```bash
|
|
300
|
+
python -m build
|
|
301
|
+
twine upload dist/*
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Integration with Other Socrates Packages
|
|
305
|
+
|
|
306
|
+
`socratic-core` is designed to be the foundation for other packages:
|
|
307
|
+
|
|
308
|
+
```python
|
|
309
|
+
# In socratic-rag
|
|
310
|
+
from socratic_core import SocratesConfig, EventEmitter, get_logger
|
|
311
|
+
|
|
312
|
+
# In socratic-agents
|
|
313
|
+
from socratic_core import SocratesConfig, EventEmitter, ProjectIDGenerator
|
|
314
|
+
|
|
315
|
+
# In socrates-cli
|
|
316
|
+
from socratic_core import SocratesConfig
|
|
317
|
+
|
|
318
|
+
# In socrates-api
|
|
319
|
+
from socratic_core import SocratesConfig, EventEmitter
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Performance Characteristics
|
|
323
|
+
|
|
324
|
+
- **Import Time**: < 100ms
|
|
325
|
+
- **Memory Overhead**: < 2MB
|
|
326
|
+
- **Event Emission**: < 1ms per event
|
|
327
|
+
- **Configuration Load**: < 50ms
|
|
328
|
+
|
|
329
|
+
## License
|
|
330
|
+
|
|
331
|
+
MIT License - see [LICENSE](LICENSE) file for details
|
|
332
|
+
|
|
333
|
+
## Support
|
|
334
|
+
|
|
335
|
+
- **Issues**: [GitHub Issues](https://github.com/themsou/Socrates/issues)
|
|
336
|
+
- **Documentation**: See [ARCHITECTURE.md](../ARCHITECTURE.md)
|
|
337
|
+
- **Migration**: See [MIGRATION_GUIDE.md](../MIGRATION_GUIDE.md)
|
|
338
|
+
|
|
339
|
+
## Contributing
|
|
340
|
+
|
|
341
|
+
We welcome contributions! Please see the main Socrates repository for contribution guidelines.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
src/socratic_core/__init__.py
|
|
5
|
+
src/socratic_core.egg-info/PKG-INFO
|
|
6
|
+
src/socratic_core.egg-info/SOURCES.txt
|
|
7
|
+
src/socratic_core.egg-info/dependency_links.txt
|
|
8
|
+
src/socratic_core.egg-info/requires.txt
|
|
9
|
+
src/socratic_core.egg-info/top_level.txt
|
|
10
|
+
tests/test_config.py
|
|
11
|
+
tests/test_events_simple.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
socratic_core
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""Tests for socratic_core.config module."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from socratic_core.config import ConfigBuilder, SocratesConfig
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestSocratesConfig:
|
|
11
|
+
"""Tests for SocratesConfig dataclass."""
|
|
12
|
+
|
|
13
|
+
def test_config_with_api_key(self):
|
|
14
|
+
"""Test SocratesConfig with API key."""
|
|
15
|
+
config = SocratesConfig(api_key="sk-test")
|
|
16
|
+
assert config.api_key == "sk-test"
|
|
17
|
+
|
|
18
|
+
def test_config_with_model(self):
|
|
19
|
+
"""Test SocratesConfig with custom model."""
|
|
20
|
+
config = SocratesConfig(api_key="sk-test", claude_model="claude-opus")
|
|
21
|
+
assert config.claude_model == "claude-opus"
|
|
22
|
+
|
|
23
|
+
def test_config_with_log_level(self):
|
|
24
|
+
"""Test SocratesConfig with custom log level."""
|
|
25
|
+
config = SocratesConfig(api_key="sk-test", log_level="DEBUG")
|
|
26
|
+
assert config.log_level == "DEBUG"
|
|
27
|
+
|
|
28
|
+
def test_config_from_dict(self):
|
|
29
|
+
"""Test creating config from dictionary."""
|
|
30
|
+
data = {"api_key": "sk-test", "claude_model": "claude-opus"}
|
|
31
|
+
config = SocratesConfig.from_dict(data)
|
|
32
|
+
assert config.api_key == "sk-test"
|
|
33
|
+
assert config.claude_model == "claude-opus"
|
|
34
|
+
|
|
35
|
+
def test_config_from_env(self):
|
|
36
|
+
"""Test creating config from environment."""
|
|
37
|
+
os.environ["ANTHROPIC_API_KEY"] = "sk-env"
|
|
38
|
+
try:
|
|
39
|
+
config = SocratesConfig.from_env()
|
|
40
|
+
assert config.api_key == "sk-env"
|
|
41
|
+
finally:
|
|
42
|
+
os.environ.pop("ANTHROPIC_API_KEY", None)
|
|
43
|
+
|
|
44
|
+
def test_config_from_env_reads_successfully(self):
|
|
45
|
+
"""Test that from_env loads config successfully."""
|
|
46
|
+
os.environ["ANTHROPIC_API_KEY"] = "sk-test"
|
|
47
|
+
try:
|
|
48
|
+
config = SocratesConfig.from_env()
|
|
49
|
+
assert config.api_key == "sk-test"
|
|
50
|
+
assert config.claude_model is not None
|
|
51
|
+
finally:
|
|
52
|
+
os.environ.pop("ANTHROPIC_API_KEY", None)
|
|
53
|
+
|
|
54
|
+
def test_config_attributes(self):
|
|
55
|
+
"""Test that config has expected attributes."""
|
|
56
|
+
config = SocratesConfig(api_key="sk-test")
|
|
57
|
+
assert hasattr(config, "api_key")
|
|
58
|
+
assert hasattr(config, "claude_model")
|
|
59
|
+
assert hasattr(config, "log_level")
|
|
60
|
+
assert hasattr(config, "max_context_length")
|
|
61
|
+
assert hasattr(config, "max_retries")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class TestConfigBuilder:
|
|
65
|
+
"""Tests for ConfigBuilder class."""
|
|
66
|
+
|
|
67
|
+
def test_builder_with_model(self):
|
|
68
|
+
"""Test builder with_model method."""
|
|
69
|
+
config = ConfigBuilder("sk-test").with_model("claude-opus").build()
|
|
70
|
+
assert config.claude_model == "claude-opus"
|
|
71
|
+
|
|
72
|
+
def test_builder_with_log_level(self):
|
|
73
|
+
"""Test builder with_log_level method."""
|
|
74
|
+
config = ConfigBuilder("sk-test").with_log_level("DEBUG").build()
|
|
75
|
+
assert config.log_level == "DEBUG"
|
|
76
|
+
|
|
77
|
+
def test_builder_chaining(self):
|
|
78
|
+
"""Test builder method chaining."""
|
|
79
|
+
builder = ConfigBuilder("sk-test")
|
|
80
|
+
result = builder.with_model("claude-opus")
|
|
81
|
+
assert result is builder
|
|
82
|
+
|
|
83
|
+
def test_builder_build(self):
|
|
84
|
+
"""Test builder produces config."""
|
|
85
|
+
config = ConfigBuilder("sk-test").build()
|
|
86
|
+
assert isinstance(config, SocratesConfig)
|
|
87
|
+
assert config.api_key == "sk-test"
|
|
88
|
+
|
|
89
|
+
def test_builder_multiple_methods(self):
|
|
90
|
+
"""Test builder with multiple method calls."""
|
|
91
|
+
config = (
|
|
92
|
+
ConfigBuilder("sk-test")
|
|
93
|
+
.with_model("claude-opus")
|
|
94
|
+
.with_log_level("DEBUG")
|
|
95
|
+
.build()
|
|
96
|
+
)
|
|
97
|
+
assert config.api_key == "sk-test"
|
|
98
|
+
assert config.claude_model == "claude-opus"
|
|
99
|
+
assert config.log_level == "DEBUG"
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class TestConfigEnvironment:
|
|
103
|
+
"""Tests for environment variable handling."""
|
|
104
|
+
|
|
105
|
+
def test_env_api_key(self):
|
|
106
|
+
"""Test loading API key from environment."""
|
|
107
|
+
os.environ["ANTHROPIC_API_KEY"] = "sk-env-test"
|
|
108
|
+
try:
|
|
109
|
+
config = SocratesConfig.from_env()
|
|
110
|
+
assert config.api_key == "sk-env-test"
|
|
111
|
+
finally:
|
|
112
|
+
os.environ.pop("ANTHROPIC_API_KEY", None)
|
|
113
|
+
|
|
114
|
+
def test_env_api_required(self):
|
|
115
|
+
"""Test that API key is required from environment."""
|
|
116
|
+
try:
|
|
117
|
+
config = SocratesConfig.from_env()
|
|
118
|
+
# If we got here, it means API key was found somehow (maybe in CI/CD)
|
|
119
|
+
assert config.api_key is not None
|
|
120
|
+
except ValueError as e:
|
|
121
|
+
# Expected - API key is required
|
|
122
|
+
assert "credentials" in str(e).lower()
|
|
123
|
+
|
|
124
|
+
def test_env_log_level(self):
|
|
125
|
+
"""Test loading log level from environment."""
|
|
126
|
+
os.environ["ANTHROPIC_API_KEY"] = "sk-test"
|
|
127
|
+
os.environ["SOCRATES_LOG_LEVEL"] = "WARNING"
|
|
128
|
+
try:
|
|
129
|
+
config = SocratesConfig.from_env()
|
|
130
|
+
assert config.log_level == "WARNING"
|
|
131
|
+
finally:
|
|
132
|
+
os.environ.pop("ANTHROPIC_API_KEY", None)
|
|
133
|
+
os.environ.pop("SOCRATES_LOG_LEVEL", None)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Simplified tests for EventEmitter"""
|
|
2
|
+
|
|
3
|
+
from socratic_core.events import EventEmitter, EventType
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_event_emitter_creation():
|
|
7
|
+
"""Test creating event emitter."""
|
|
8
|
+
emitter = EventEmitter()
|
|
9
|
+
assert emitter is not None
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_event_listener_registration():
|
|
13
|
+
"""Test registering an event listener."""
|
|
14
|
+
emitter = EventEmitter()
|
|
15
|
+
called = []
|
|
16
|
+
|
|
17
|
+
def callback(data):
|
|
18
|
+
called.append(data)
|
|
19
|
+
|
|
20
|
+
emitter.on(EventType.LOG_INFO, callback)
|
|
21
|
+
emitter.emit(EventType.LOG_INFO, {"message": "test"})
|
|
22
|
+
|
|
23
|
+
assert len(called) > 0
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_event_once():
|
|
27
|
+
"""Test once() listener - should only fire once."""
|
|
28
|
+
emitter = EventEmitter()
|
|
29
|
+
call_count = [0]
|
|
30
|
+
|
|
31
|
+
def callback(data):
|
|
32
|
+
call_count[0] += 1
|
|
33
|
+
|
|
34
|
+
emitter.once(EventType.LOG_INFO, callback)
|
|
35
|
+
emitter.emit(EventType.LOG_INFO, {"message": "first"})
|
|
36
|
+
emitter.emit(EventType.LOG_INFO, {"message": "second"})
|
|
37
|
+
|
|
38
|
+
assert call_count[0] == 1
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_async_event_emission():
|
|
42
|
+
"""Test async event emission."""
|
|
43
|
+
import asyncio
|
|
44
|
+
|
|
45
|
+
emitter = EventEmitter()
|
|
46
|
+
called = []
|
|
47
|
+
|
|
48
|
+
async def async_callback(data):
|
|
49
|
+
called.append(data)
|
|
50
|
+
|
|
51
|
+
emitter.on(EventType.LOG_INFO, async_callback)
|
|
52
|
+
|
|
53
|
+
async def test():
|
|
54
|
+
await emitter.emit_async(EventType.LOG_INFO, {"message": "async"})
|
|
55
|
+
return len(called) > 0
|
|
56
|
+
|
|
57
|
+
result = asyncio.run(test())
|
|
58
|
+
assert result
|