mcli-framework 7.0.0__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 mcli-framework might be problematic. Click here for more details.
- mcli/app/chat_cmd.py +42 -0
- mcli/app/commands_cmd.py +226 -0
- mcli/app/completion_cmd.py +216 -0
- mcli/app/completion_helpers.py +288 -0
- mcli/app/cron_test_cmd.py +697 -0
- mcli/app/logs_cmd.py +419 -0
- mcli/app/main.py +492 -0
- mcli/app/model/model.py +1060 -0
- mcli/app/model_cmd.py +227 -0
- mcli/app/redis_cmd.py +269 -0
- mcli/app/video/video.py +1114 -0
- mcli/app/visual_cmd.py +303 -0
- mcli/chat/chat.py +2409 -0
- mcli/chat/command_rag.py +514 -0
- mcli/chat/enhanced_chat.py +652 -0
- mcli/chat/system_controller.py +1010 -0
- mcli/chat/system_integration.py +1016 -0
- mcli/cli.py +25 -0
- mcli/config.toml +20 -0
- mcli/lib/api/api.py +586 -0
- mcli/lib/api/daemon_client.py +203 -0
- mcli/lib/api/daemon_client_local.py +44 -0
- mcli/lib/api/daemon_decorator.py +217 -0
- mcli/lib/api/mcli_decorators.py +1032 -0
- mcli/lib/auth/auth.py +85 -0
- mcli/lib/auth/aws_manager.py +85 -0
- mcli/lib/auth/azure_manager.py +91 -0
- mcli/lib/auth/credential_manager.py +192 -0
- mcli/lib/auth/gcp_manager.py +93 -0
- mcli/lib/auth/key_manager.py +117 -0
- mcli/lib/auth/mcli_manager.py +93 -0
- mcli/lib/auth/token_manager.py +75 -0
- mcli/lib/auth/token_util.py +1011 -0
- mcli/lib/config/config.py +47 -0
- mcli/lib/discovery/__init__.py +1 -0
- mcli/lib/discovery/command_discovery.py +274 -0
- mcli/lib/erd/erd.py +1345 -0
- mcli/lib/erd/generate_graph.py +453 -0
- mcli/lib/files/files.py +76 -0
- mcli/lib/fs/fs.py +109 -0
- mcli/lib/lib.py +29 -0
- mcli/lib/logger/logger.py +611 -0
- mcli/lib/performance/optimizer.py +409 -0
- mcli/lib/performance/rust_bridge.py +502 -0
- mcli/lib/performance/uvloop_config.py +154 -0
- mcli/lib/pickles/pickles.py +50 -0
- mcli/lib/search/cached_vectorizer.py +479 -0
- mcli/lib/services/data_pipeline.py +460 -0
- mcli/lib/services/lsh_client.py +441 -0
- mcli/lib/services/redis_service.py +387 -0
- mcli/lib/shell/shell.py +137 -0
- mcli/lib/toml/toml.py +33 -0
- mcli/lib/ui/styling.py +47 -0
- mcli/lib/ui/visual_effects.py +634 -0
- mcli/lib/watcher/watcher.py +185 -0
- mcli/ml/api/app.py +215 -0
- mcli/ml/api/middleware.py +224 -0
- mcli/ml/api/routers/admin_router.py +12 -0
- mcli/ml/api/routers/auth_router.py +244 -0
- mcli/ml/api/routers/backtest_router.py +12 -0
- mcli/ml/api/routers/data_router.py +12 -0
- mcli/ml/api/routers/model_router.py +302 -0
- mcli/ml/api/routers/monitoring_router.py +12 -0
- mcli/ml/api/routers/portfolio_router.py +12 -0
- mcli/ml/api/routers/prediction_router.py +267 -0
- mcli/ml/api/routers/trade_router.py +12 -0
- mcli/ml/api/routers/websocket_router.py +76 -0
- mcli/ml/api/schemas.py +64 -0
- mcli/ml/auth/auth_manager.py +425 -0
- mcli/ml/auth/models.py +154 -0
- mcli/ml/auth/permissions.py +302 -0
- mcli/ml/backtesting/backtest_engine.py +502 -0
- mcli/ml/backtesting/performance_metrics.py +393 -0
- mcli/ml/cache.py +400 -0
- mcli/ml/cli/main.py +398 -0
- mcli/ml/config/settings.py +394 -0
- mcli/ml/configs/dvc_config.py +230 -0
- mcli/ml/configs/mlflow_config.py +131 -0
- mcli/ml/configs/mlops_manager.py +293 -0
- mcli/ml/dashboard/app.py +532 -0
- mcli/ml/dashboard/app_integrated.py +738 -0
- mcli/ml/dashboard/app_supabase.py +560 -0
- mcli/ml/dashboard/app_training.py +615 -0
- mcli/ml/dashboard/cli.py +51 -0
- mcli/ml/data_ingestion/api_connectors.py +501 -0
- mcli/ml/data_ingestion/data_pipeline.py +567 -0
- mcli/ml/data_ingestion/stream_processor.py +512 -0
- mcli/ml/database/migrations/env.py +94 -0
- mcli/ml/database/models.py +667 -0
- mcli/ml/database/session.py +200 -0
- mcli/ml/experimentation/ab_testing.py +845 -0
- mcli/ml/features/ensemble_features.py +607 -0
- mcli/ml/features/political_features.py +676 -0
- mcli/ml/features/recommendation_engine.py +809 -0
- mcli/ml/features/stock_features.py +573 -0
- mcli/ml/features/test_feature_engineering.py +346 -0
- mcli/ml/logging.py +85 -0
- mcli/ml/mlops/data_versioning.py +518 -0
- mcli/ml/mlops/experiment_tracker.py +377 -0
- mcli/ml/mlops/model_serving.py +481 -0
- mcli/ml/mlops/pipeline_orchestrator.py +614 -0
- mcli/ml/models/base_models.py +324 -0
- mcli/ml/models/ensemble_models.py +675 -0
- mcli/ml/models/recommendation_models.py +474 -0
- mcli/ml/models/test_models.py +487 -0
- mcli/ml/monitoring/drift_detection.py +676 -0
- mcli/ml/monitoring/metrics.py +45 -0
- mcli/ml/optimization/portfolio_optimizer.py +834 -0
- mcli/ml/preprocessing/data_cleaners.py +451 -0
- mcli/ml/preprocessing/feature_extractors.py +491 -0
- mcli/ml/preprocessing/ml_pipeline.py +382 -0
- mcli/ml/preprocessing/politician_trading_preprocessor.py +569 -0
- mcli/ml/preprocessing/test_preprocessing.py +294 -0
- mcli/ml/scripts/populate_sample_data.py +200 -0
- mcli/ml/tasks.py +400 -0
- mcli/ml/tests/test_integration.py +429 -0
- mcli/ml/tests/test_training_dashboard.py +387 -0
- mcli/public/oi/oi.py +15 -0
- mcli/public/public.py +4 -0
- mcli/self/self_cmd.py +1246 -0
- mcli/workflow/daemon/api_daemon.py +800 -0
- mcli/workflow/daemon/async_command_database.py +681 -0
- mcli/workflow/daemon/async_process_manager.py +591 -0
- mcli/workflow/daemon/client.py +530 -0
- mcli/workflow/daemon/commands.py +1196 -0
- mcli/workflow/daemon/daemon.py +905 -0
- mcli/workflow/daemon/daemon_api.py +59 -0
- mcli/workflow/daemon/enhanced_daemon.py +571 -0
- mcli/workflow/daemon/process_cli.py +244 -0
- mcli/workflow/daemon/process_manager.py +439 -0
- mcli/workflow/daemon/test_daemon.py +275 -0
- mcli/workflow/dashboard/dashboard_cmd.py +113 -0
- mcli/workflow/docker/docker.py +0 -0
- mcli/workflow/file/file.py +100 -0
- mcli/workflow/gcloud/config.toml +21 -0
- mcli/workflow/gcloud/gcloud.py +58 -0
- mcli/workflow/git_commit/ai_service.py +328 -0
- mcli/workflow/git_commit/commands.py +430 -0
- mcli/workflow/lsh_integration.py +355 -0
- mcli/workflow/model_service/client.py +594 -0
- mcli/workflow/model_service/download_and_run_efficient_models.py +288 -0
- mcli/workflow/model_service/lightweight_embedder.py +397 -0
- mcli/workflow/model_service/lightweight_model_server.py +714 -0
- mcli/workflow/model_service/lightweight_test.py +241 -0
- mcli/workflow/model_service/model_service.py +1955 -0
- mcli/workflow/model_service/ollama_efficient_runner.py +425 -0
- mcli/workflow/model_service/pdf_processor.py +386 -0
- mcli/workflow/model_service/test_efficient_runner.py +234 -0
- mcli/workflow/model_service/test_example.py +315 -0
- mcli/workflow/model_service/test_integration.py +131 -0
- mcli/workflow/model_service/test_new_features.py +149 -0
- mcli/workflow/openai/openai.py +99 -0
- mcli/workflow/politician_trading/commands.py +1790 -0
- mcli/workflow/politician_trading/config.py +134 -0
- mcli/workflow/politician_trading/connectivity.py +490 -0
- mcli/workflow/politician_trading/data_sources.py +395 -0
- mcli/workflow/politician_trading/database.py +410 -0
- mcli/workflow/politician_trading/demo.py +248 -0
- mcli/workflow/politician_trading/models.py +165 -0
- mcli/workflow/politician_trading/monitoring.py +413 -0
- mcli/workflow/politician_trading/scrapers.py +966 -0
- mcli/workflow/politician_trading/scrapers_california.py +412 -0
- mcli/workflow/politician_trading/scrapers_eu.py +377 -0
- mcli/workflow/politician_trading/scrapers_uk.py +350 -0
- mcli/workflow/politician_trading/scrapers_us_states.py +438 -0
- mcli/workflow/politician_trading/supabase_functions.py +354 -0
- mcli/workflow/politician_trading/workflow.py +852 -0
- mcli/workflow/registry/registry.py +180 -0
- mcli/workflow/repo/repo.py +223 -0
- mcli/workflow/scheduler/commands.py +493 -0
- mcli/workflow/scheduler/cron_parser.py +238 -0
- mcli/workflow/scheduler/job.py +182 -0
- mcli/workflow/scheduler/monitor.py +139 -0
- mcli/workflow/scheduler/persistence.py +324 -0
- mcli/workflow/scheduler/scheduler.py +679 -0
- mcli/workflow/sync/sync_cmd.py +437 -0
- mcli/workflow/sync/test_cmd.py +314 -0
- mcli/workflow/videos/videos.py +242 -0
- mcli/workflow/wakatime/wakatime.py +11 -0
- mcli/workflow/workflow.py +37 -0
- mcli_framework-7.0.0.dist-info/METADATA +479 -0
- mcli_framework-7.0.0.dist-info/RECORD +186 -0
- mcli_framework-7.0.0.dist-info/WHEEL +5 -0
- mcli_framework-7.0.0.dist-info/entry_points.txt +7 -0
- mcli_framework-7.0.0.dist-info/licenses/LICENSE +21 -0
- mcli_framework-7.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Database session management"""
|
|
2
|
+
|
|
3
|
+
from typing import AsyncGenerator, Generator
|
|
4
|
+
from contextlib import contextmanager, asynccontextmanager
|
|
5
|
+
|
|
6
|
+
from sqlalchemy import create_engine
|
|
7
|
+
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
|
|
8
|
+
from sqlalchemy.orm import sessionmaker, Session
|
|
9
|
+
from sqlalchemy.pool import NullPool, StaticPool
|
|
10
|
+
|
|
11
|
+
from mcli.ml.config import settings
|
|
12
|
+
from .models import Base
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Synchronous database setup
|
|
16
|
+
engine = create_engine(
|
|
17
|
+
settings.database.url,
|
|
18
|
+
**settings.get_database_config(),
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
SessionLocal = sessionmaker(
|
|
22
|
+
autocommit=False,
|
|
23
|
+
autoflush=False,
|
|
24
|
+
bind=engine,
|
|
25
|
+
expire_on_commit=False,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Asynchronous database setup
|
|
30
|
+
async_engine = create_async_engine(
|
|
31
|
+
settings.database.async_url,
|
|
32
|
+
pool_size=settings.database.pool_size,
|
|
33
|
+
max_overflow=settings.database.max_overflow,
|
|
34
|
+
pool_timeout=settings.database.pool_timeout,
|
|
35
|
+
pool_pre_ping=True,
|
|
36
|
+
echo=settings.debug,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
AsyncSessionLocal = async_sessionmaker(
|
|
40
|
+
async_engine,
|
|
41
|
+
class_=AsyncSession,
|
|
42
|
+
autocommit=False,
|
|
43
|
+
autoflush=False,
|
|
44
|
+
expire_on_commit=False,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_db() -> Generator[Session, None, None]:
|
|
49
|
+
"""
|
|
50
|
+
Dependency for getting database session.
|
|
51
|
+
|
|
52
|
+
Usage:
|
|
53
|
+
@app.get("/items")
|
|
54
|
+
def get_items(db: Session = Depends(get_db)):
|
|
55
|
+
return db.query(Item).all()
|
|
56
|
+
"""
|
|
57
|
+
db = SessionLocal()
|
|
58
|
+
try:
|
|
59
|
+
yield db
|
|
60
|
+
finally:
|
|
61
|
+
db.close()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
async def get_async_db() -> AsyncGenerator[AsyncSession, None]:
|
|
65
|
+
"""
|
|
66
|
+
Async dependency for getting database session.
|
|
67
|
+
|
|
68
|
+
Usage:
|
|
69
|
+
@app.get("/items")
|
|
70
|
+
async def get_items(db: AsyncSession = Depends(get_async_db)):
|
|
71
|
+
result = await db.execute(select(Item))
|
|
72
|
+
return result.scalars().all()
|
|
73
|
+
"""
|
|
74
|
+
async with AsyncSessionLocal() as session:
|
|
75
|
+
try:
|
|
76
|
+
yield session
|
|
77
|
+
finally:
|
|
78
|
+
await session.close()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@contextmanager
|
|
82
|
+
def get_session() -> Generator[Session, None, None]:
|
|
83
|
+
"""
|
|
84
|
+
Context manager for database session.
|
|
85
|
+
|
|
86
|
+
Usage:
|
|
87
|
+
with get_session() as session:
|
|
88
|
+
user = session.query(User).first()
|
|
89
|
+
"""
|
|
90
|
+
session = SessionLocal()
|
|
91
|
+
try:
|
|
92
|
+
yield session
|
|
93
|
+
session.commit()
|
|
94
|
+
except Exception:
|
|
95
|
+
session.rollback()
|
|
96
|
+
raise
|
|
97
|
+
finally:
|
|
98
|
+
session.close()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@asynccontextmanager
|
|
102
|
+
async def get_async_session() -> AsyncGenerator[AsyncSession, None]:
|
|
103
|
+
"""
|
|
104
|
+
Async context manager for database session.
|
|
105
|
+
|
|
106
|
+
Usage:
|
|
107
|
+
async with get_async_session() as session:
|
|
108
|
+
result = await session.execute(select(User))
|
|
109
|
+
users = result.scalars().all()
|
|
110
|
+
"""
|
|
111
|
+
async with AsyncSessionLocal() as session:
|
|
112
|
+
try:
|
|
113
|
+
yield session
|
|
114
|
+
await session.commit()
|
|
115
|
+
except Exception:
|
|
116
|
+
await session.rollback()
|
|
117
|
+
raise
|
|
118
|
+
finally:
|
|
119
|
+
await session.close()
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def init_db() -> None:
|
|
123
|
+
"""Initialize database tables"""
|
|
124
|
+
Base.metadata.create_all(bind=engine)
|
|
125
|
+
|
|
126
|
+
# Create additional indexes
|
|
127
|
+
from .models import create_indexes
|
|
128
|
+
create_indexes(engine)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
async def init_async_db() -> None:
|
|
132
|
+
"""Initialize database tables asynchronously"""
|
|
133
|
+
async with async_engine.begin() as conn:
|
|
134
|
+
await conn.run_sync(Base.metadata.create_all)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def drop_db() -> None:
|
|
138
|
+
"""Drop all database tables (use with caution!)"""
|
|
139
|
+
Base.metadata.drop_all(bind=engine)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
async def drop_async_db() -> None:
|
|
143
|
+
"""Drop all database tables asynchronously"""
|
|
144
|
+
async with async_engine.begin() as conn:
|
|
145
|
+
await conn.run_sync(Base.metadata.drop_all)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
# Test database setup (for unit tests)
|
|
149
|
+
def get_test_engine():
|
|
150
|
+
"""Create test database engine with in-memory SQLite"""
|
|
151
|
+
from sqlalchemy import create_engine
|
|
152
|
+
|
|
153
|
+
engine = create_engine(
|
|
154
|
+
"sqlite:///:memory:",
|
|
155
|
+
connect_args={"check_same_thread": False},
|
|
156
|
+
poolclass=StaticPool,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
Base.metadata.create_all(bind=engine)
|
|
160
|
+
return engine
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def get_test_session():
|
|
164
|
+
"""Create test database session"""
|
|
165
|
+
engine = get_test_engine()
|
|
166
|
+
TestSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
167
|
+
return TestSessionLocal()
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
# Database health check
|
|
171
|
+
async def check_database_health() -> bool:
|
|
172
|
+
"""Check if database is accessible and healthy"""
|
|
173
|
+
try:
|
|
174
|
+
async with get_async_session() as session:
|
|
175
|
+
await session.execute("SELECT 1")
|
|
176
|
+
return True
|
|
177
|
+
except Exception as e:
|
|
178
|
+
print(f"Database health check failed: {e}")
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
# Utility functions for bulk operations
|
|
183
|
+
async def bulk_insert(model_class, data: list) -> None:
|
|
184
|
+
"""Bulk insert data into database"""
|
|
185
|
+
async with get_async_session() as session:
|
|
186
|
+
session.add_all([model_class(**item) for item in data])
|
|
187
|
+
await session.commit()
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
async def bulk_update(model_class, data: list, key_field: str = "id") -> None:
|
|
191
|
+
"""Bulk update data in database"""
|
|
192
|
+
async with get_async_session() as session:
|
|
193
|
+
for item in data:
|
|
194
|
+
key_value = item.pop(key_field)
|
|
195
|
+
await session.execute(
|
|
196
|
+
model_class.__table__.update()
|
|
197
|
+
.where(getattr(model_class, key_field) == key_value)
|
|
198
|
+
.values(**item)
|
|
199
|
+
)
|
|
200
|
+
await session.commit()
|