Spaces:
Runtime error
Runtime error
nananie143
commited on
Upload folder using huggingface_hub
Browse files- .env.example +78 -0
- .github/workflows/sync-to-space.yml +17 -0
- .gitignore +91 -0
- Dockerfile +12 -0
- README.md +75 -6
- agentic_system.py +551 -0
- api/venture_api.py +194 -0
- app.py +110 -0
- app.py.backup +338 -0
- app.yaml +9 -0
- check_space_status.py +55 -0
- config.py +321 -0
- fix_indentation.patch +42 -0
- meta_learning.py +406 -0
- multimodal_reasoning.py +273 -0
- orchestrator.py +522 -0
- quick_check.py +53 -0
- reasoning.py +0 -0
- reasoning.py.bak2 +0 -0
- reasoning/__init__.py +70 -0
- reasoning/agentic.py +345 -0
- reasoning/analogical.py +600 -0
- reasoning/base.py +17 -0
- reasoning/bayesian.py +187 -0
- reasoning/chain_of_thought.py +410 -0
- reasoning/coordination.py +525 -0
- reasoning/learning.py +394 -0
- reasoning/local_llm.py +139 -0
- reasoning/market_analysis.py +342 -0
- reasoning/meta_learning.py +412 -0
- reasoning/monetization.py +278 -0
- reasoning/multimodal.py +268 -0
- reasoning/neurosymbolic.py +264 -0
- reasoning/portfolio_optimization.py +352 -0
- reasoning/quantum.py +353 -0
- reasoning/recursive.py +566 -0
- reasoning/specialized.py +313 -0
- reasoning/tree_of_thoughts.py +513 -0
- reasoning/unified_engine.py +427 -0
- reasoning/venture_strategies.py +423 -0
- reasoning/venture_types.py +332 -0
- requirements.txt +19 -0
- requirements.txt.backup +28 -0
- simple_reasoning.py +25 -0
- simple_reasoning/__init__.py +5 -0
- simple_reasoning/agent.py +26 -0
- team_management.py +442 -0
- ui/venture_ui.py +399 -0
- upload_to_hub.py +28 -0
.env.example
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Hugging Face Configuration
|
2 |
+
HUGGINGFACE_TOKEN=your_huggingface_token_here
|
3 |
+
|
4 |
+
# System Configuration
|
5 |
+
DEBUG_MODE=False
|
6 |
+
LOG_LEVEL=INFO
|
7 |
+
MAX_WORKERS=4
|
8 |
+
ASYNC_TIMEOUT=30
|
9 |
+
|
10 |
+
# Resource Limits
|
11 |
+
MAX_MEMORY_MB=8192
|
12 |
+
MAX_CPU_PERCENT=90
|
13 |
+
MAX_GPU_MEMORY_MB=4096
|
14 |
+
MAX_API_CALLS_PER_MINUTE=500
|
15 |
+
|
16 |
+
# Team Configuration
|
17 |
+
MIN_TEAM_SIZE=2
|
18 |
+
MAX_TEAM_SIZE=10
|
19 |
+
MAX_CONCURRENT_OBJECTIVES=5
|
20 |
+
|
21 |
+
# Error Recovery
|
22 |
+
MAX_RETRIES=3
|
23 |
+
RETRY_DELAY_SECONDS=5
|
24 |
+
ERROR_THRESHOLD=0.2
|
25 |
+
|
26 |
+
# Monitoring
|
27 |
+
METRICS_INTERVAL_SECONDS=60
|
28 |
+
HEALTH_CHECK_INTERVAL=30
|
29 |
+
PERFORMANCE_LOG_RETENTION_DAYS=7
|
30 |
+
|
31 |
+
# API Keys
|
32 |
+
OPENAI_API_KEY=your_openai_api_key
|
33 |
+
GROQ_API_KEY=your_groq_api_key
|
34 |
+
HUGGINGFACE_API_KEY=your_huggingface_api_key
|
35 |
+
|
36 |
+
# Service Configuration
|
37 |
+
PORT=7860
|
38 |
+
HOST=0.0.0.0
|
39 |
+
DEBUG=True
|
40 |
+
ENVIRONMENT=development
|
41 |
+
|
42 |
+
# Database Configuration
|
43 |
+
DATABASE_URL=sqlite:///./ventures.db
|
44 |
+
|
45 |
+
# Model Configuration
|
46 |
+
MODEL_CACHE_DIR=./model_cache
|
47 |
+
DEFAULT_MODEL=gpt-4-turbo-preview
|
48 |
+
|
49 |
+
# Venture Configuration
|
50 |
+
MIN_PROFIT_TARGET=1000000
|
51 |
+
DEFAULT_CURRENCY=USD
|
52 |
+
RISK_TOLERANCE=medium
|
53 |
+
|
54 |
+
# API Configuration
|
55 |
+
API_VERSION=v1
|
56 |
+
API_PREFIX=/api/v1
|
57 |
+
CORS_ORIGINS=["*"]
|
58 |
+
MAX_REQUEST_SIZE=10MB
|
59 |
+
|
60 |
+
# Monitoring Configuration
|
61 |
+
ENABLE_METRICS=True
|
62 |
+
METRICS_PORT=9090
|
63 |
+
LOG_LEVEL=INFO
|
64 |
+
|
65 |
+
# Cache Configuration
|
66 |
+
REDIS_URL=redis://localhost:6379/0
|
67 |
+
CACHE_TTL=3600
|
68 |
+
|
69 |
+
# Security Configuration
|
70 |
+
JWT_SECRET=your_jwt_secret
|
71 |
+
JWT_ALGORITHM=HS256
|
72 |
+
ACCESS_TOKEN_EXPIRE_MINUTES=30
|
73 |
+
|
74 |
+
# Feature Flags
|
75 |
+
ENABLE_PORTFOLIO_OPTIMIZATION=True
|
76 |
+
ENABLE_MARKET_ANALYSIS=True
|
77 |
+
ENABLE_MONETIZATION_STRATEGY=True
|
78 |
+
ENABLE_VENTURE_ANALYSIS=True
|
.github/workflows/sync-to-space.yml
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: Sync to Hugging Face Space
|
2 |
+
on:
|
3 |
+
push:
|
4 |
+
branches: [main]
|
5 |
+
|
6 |
+
jobs:
|
7 |
+
sync-to-space:
|
8 |
+
runs-on: ubuntu-latest
|
9 |
+
steps:
|
10 |
+
- uses: actions/checkout@v2
|
11 |
+
with:
|
12 |
+
fetch-depth: 0
|
13 |
+
- name: Push to Space
|
14 |
+
env:
|
15 |
+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
16 |
+
run: |
|
17 |
+
git push https://USER:[email protected]/spaces/USER/SPACE_NAME main
|
.gitignore
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Python
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
*.so
|
6 |
+
.Python
|
7 |
+
build/
|
8 |
+
develop-eggs/
|
9 |
+
dist/
|
10 |
+
downloads/
|
11 |
+
eggs/
|
12 |
+
.eggs/
|
13 |
+
lib/
|
14 |
+
lib64/
|
15 |
+
parts/
|
16 |
+
sdist/
|
17 |
+
var/
|
18 |
+
wheels/
|
19 |
+
*.egg-info/
|
20 |
+
.installed.cfg
|
21 |
+
*.egg
|
22 |
+
|
23 |
+
# Virtual Environment
|
24 |
+
venv/
|
25 |
+
env/
|
26 |
+
ENV/
|
27 |
+
|
28 |
+
# IDE
|
29 |
+
.idea/
|
30 |
+
.vscode/
|
31 |
+
*.swp
|
32 |
+
*.swo
|
33 |
+
|
34 |
+
# Logs
|
35 |
+
*.log
|
36 |
+
logs/
|
37 |
+
log/
|
38 |
+
|
39 |
+
# Local development
|
40 |
+
.env
|
41 |
+
.env.local
|
42 |
+
.env.*.local
|
43 |
+
|
44 |
+
# Data
|
45 |
+
data/
|
46 |
+
*.db
|
47 |
+
*.sqlite3
|
48 |
+
|
49 |
+
# Model files
|
50 |
+
*.pt
|
51 |
+
*.pth
|
52 |
+
*.ckpt
|
53 |
+
*.bin
|
54 |
+
*.onnx
|
55 |
+
|
56 |
+
# Temporary files
|
57 |
+
.DS_Store
|
58 |
+
Thumbs.db
|
59 |
+
*.tmp
|
60 |
+
*.bak
|
61 |
+
*.swp
|
62 |
+
*~
|
63 |
+
|
64 |
+
# Distribution
|
65 |
+
dist/
|
66 |
+
build/
|
67 |
+
*.egg-info/
|
68 |
+
|
69 |
+
# Documentation
|
70 |
+
docs/_build/
|
71 |
+
site/
|
72 |
+
|
73 |
+
# Testing
|
74 |
+
.coverage
|
75 |
+
htmlcov/
|
76 |
+
.pytest_cache/
|
77 |
+
.tox/
|
78 |
+
nosetests.xml
|
79 |
+
coverage.xml
|
80 |
+
*.cover
|
81 |
+
.hypothesis/
|
82 |
+
|
83 |
+
# Jupyter Notebook
|
84 |
+
.ipynb_checkpoints
|
85 |
+
*.ipynb
|
86 |
+
|
87 |
+
# Project specific
|
88 |
+
outputs/
|
89 |
+
results/
|
90 |
+
experiments/
|
91 |
+
checkpoints/
|
Dockerfile
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3.10-slim
|
2 |
+
|
3 |
+
WORKDIR /code
|
4 |
+
|
5 |
+
COPY requirements.txt .
|
6 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
7 |
+
|
8 |
+
COPY . .
|
9 |
+
|
10 |
+
EXPOSE 7860
|
11 |
+
|
12 |
+
CMD ["python", "app.py"]
|
README.md
CHANGED
@@ -1,12 +1,81 @@
|
|
1 |
---
|
2 |
-
title: Advanced Reasoning
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version:
|
8 |
app_file: app.py
|
9 |
pinned: false
|
|
|
10 |
---
|
11 |
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
title: Advanced Reasoning System 🧠
|
3 |
+
emoji: 🧠
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: purple
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 4.16.0
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
+
license: mit
|
11 |
---
|
12 |
|
13 |
+
# Advanced Reasoning System 🧠
|
14 |
+
|
15 |
+
A sophisticated reasoning system that combines multiple strategies with local LLM capabilities for improved performance.
|
16 |
+
|
17 |
+
## Features
|
18 |
+
|
19 |
+
- **Local LLM Integration**: Uses Llama 3.2B Overthinker model for fast, local inference
|
20 |
+
- **Multiple Reasoning Strategies**:
|
21 |
+
- Chain of Thought
|
22 |
+
- Tree of Thoughts
|
23 |
+
- Meta Learning
|
24 |
+
- Recursive Reasoning
|
25 |
+
- Analogical Reasoning
|
26 |
+
- And more!
|
27 |
+
- **Adaptive Strategy Selection**: Dynamically chooses the best reasoning approach
|
28 |
+
- **GPU/CPU Flexibility**: Automatically uses GPU when available, falls back to CPU
|
29 |
+
- **Efficient Resource Usage**: Optimized for performance with configurable parameters
|
30 |
+
|
31 |
+
## Technical Details
|
32 |
+
|
33 |
+
- **Model**: tensorblock/Llama-3.2-3B-Overthinker-GGUF
|
34 |
+
- **Framework**: Gradio 4.16.0
|
35 |
+
- **Backend**: Python with async support
|
36 |
+
- **Inference**: Local using llama-cpp-python
|
37 |
+
|
38 |
+
## Usage
|
39 |
+
|
40 |
+
1. The system will automatically download the model on first run
|
41 |
+
2. GPU acceleration is used when available
|
42 |
+
3. Ask questions and get detailed, step-by-step responses
|
43 |
+
4. System adapts its reasoning strategy based on the query
|
44 |
+
|
45 |
+
## Example Questions
|
46 |
+
|
47 |
+
- What are the implications of artificial intelligence on society?
|
48 |
+
- How does climate change affect global ecosystems?
|
49 |
+
- What are the philosophical implications of quantum mechanics?
|
50 |
+
|
51 |
+
## Installation
|
52 |
+
|
53 |
+
```bash
|
54 |
+
pip install -r requirements.txt
|
55 |
+
python app.py
|
56 |
+
```
|
57 |
+
|
58 |
+
## Environment Variables
|
59 |
+
|
60 |
+
Create a `.env` file with:
|
61 |
+
```
|
62 |
+
HUGGINGFACE_TOKEN=your_token_here
|
63 |
+
DEBUG_MODE=False
|
64 |
+
LOG_LEVEL=INFO
|
65 |
+
```
|
66 |
+
|
67 |
+
## License
|
68 |
+
|
69 |
+
MIT License
|
70 |
+
|
71 |
+
## Files
|
72 |
+
- `app.py`: Main application with Gradio interface and API integration
|
73 |
+
- `requirements.txt`: Project dependencies
|
74 |
+
- `.env.example`: Example environment variables (for reference)
|
75 |
+
|
76 |
+
## Dependencies
|
77 |
+
- gradio==4.16.0
|
78 |
+
- requests==2.31.0
|
79 |
+
|
80 |
+
---
|
81 |
+
Created with ❤️ using Gradio and Hugging Face
|
agentic_system.py
ADDED
@@ -0,0 +1,551 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Advanced Agentic System
|
3 |
+
----------------------
|
4 |
+
A sophisticated multi-agent system with:
|
5 |
+
|
6 |
+
Core Components:
|
7 |
+
1. Agent Management
|
8 |
+
2. Task Execution
|
9 |
+
3. Learning & Adaptation
|
10 |
+
4. Communication
|
11 |
+
5. Resource Management
|
12 |
+
|
13 |
+
Advanced Features:
|
14 |
+
1. Self-Improvement
|
15 |
+
2. Multi-Agent Coordination
|
16 |
+
3. Dynamic Role Assignment
|
17 |
+
4. Emergent Behavior
|
18 |
+
"""
|
19 |
+
|
20 |
+
import logging
|
21 |
+
from typing import Dict, Any, List, Optional, Union, TypeVar
|
22 |
+
from dataclasses import dataclass, field
|
23 |
+
from enum import Enum
|
24 |
+
import json
|
25 |
+
import asyncio
|
26 |
+
from datetime import datetime
|
27 |
+
import uuid
|
28 |
+
from concurrent.futures import ThreadPoolExecutor
|
29 |
+
import numpy as np
|
30 |
+
|
31 |
+
from orchestrator import (
|
32 |
+
AgentOrchestrator,
|
33 |
+
AgentRole,
|
34 |
+
AgentState,
|
35 |
+
TaskPriority,
|
36 |
+
Task
|
37 |
+
)
|
38 |
+
from reasoning import ReasoningEngine, ReasoningMode
|
39 |
+
from meta_learning import MetaLearningStrategy
|
40 |
+
|
41 |
+
class AgentCapability(Enum):
|
42 |
+
"""Core capabilities of agents."""
|
43 |
+
REASONING = "reasoning"
|
44 |
+
LEARNING = "learning"
|
45 |
+
EXECUTION = "execution"
|
46 |
+
COORDINATION = "coordination"
|
47 |
+
MONITORING = "monitoring"
|
48 |
+
|
49 |
+
class AgentPersonality(Enum):
|
50 |
+
"""Different personality types for agents."""
|
51 |
+
ANALYTICAL = "analytical"
|
52 |
+
CREATIVE = "creative"
|
53 |
+
CAUTIOUS = "cautious"
|
54 |
+
PROACTIVE = "proactive"
|
55 |
+
ADAPTIVE = "adaptive"
|
56 |
+
|
57 |
+
@dataclass
|
58 |
+
class AgentProfile:
|
59 |
+
"""Profile defining an agent's characteristics."""
|
60 |
+
id: str
|
61 |
+
name: str
|
62 |
+
role: AgentRole
|
63 |
+
capabilities: List[AgentCapability]
|
64 |
+
personality: AgentPersonality
|
65 |
+
expertise_areas: List[str]
|
66 |
+
learning_rate: float
|
67 |
+
risk_tolerance: float
|
68 |
+
created_at: datetime
|
69 |
+
metadata: Dict[str, Any]
|
70 |
+
|
71 |
+
class Agent:
|
72 |
+
"""Advanced autonomous agent with learning capabilities."""
|
73 |
+
|
74 |
+
def __init__(
|
75 |
+
self,
|
76 |
+
profile: AgentProfile,
|
77 |
+
reasoning_engine: ReasoningEngine,
|
78 |
+
meta_learning: MetaLearningStrategy,
|
79 |
+
config: Dict[str, Any] = None
|
80 |
+
):
|
81 |
+
self.profile = profile
|
82 |
+
self.reasoning_engine = reasoning_engine
|
83 |
+
self.meta_learning = meta_learning
|
84 |
+
self.config = config or {}
|
85 |
+
|
86 |
+
# State management
|
87 |
+
self.state = AgentState.IDLE
|
88 |
+
self.current_task: Optional[Task] = None
|
89 |
+
self.task_history: List[Task] = []
|
90 |
+
|
91 |
+
# Learning and adaptation
|
92 |
+
self.knowledge_base: Dict[str, Any] = {}
|
93 |
+
self.learned_patterns: List[Dict[str, Any]] = []
|
94 |
+
self.adaptation_history: List[Dict[str, Any]] = []
|
95 |
+
|
96 |
+
# Performance metrics
|
97 |
+
self.metrics: Dict[str, List[float]] = defaultdict(list)
|
98 |
+
self.performance_history: List[Dict[str, float]] = []
|
99 |
+
|
100 |
+
# Communication
|
101 |
+
self.message_queue = asyncio.Queue()
|
102 |
+
self.response_queue = asyncio.Queue()
|
103 |
+
|
104 |
+
# Resource management
|
105 |
+
self.resource_usage: Dict[str, float] = {}
|
106 |
+
self.resource_limits: Dict[str, float] = {}
|
107 |
+
|
108 |
+
# Async support
|
109 |
+
self.executor = ThreadPoolExecutor(max_workers=2)
|
110 |
+
self.lock = asyncio.Lock()
|
111 |
+
|
112 |
+
# Logging
|
113 |
+
self.logger = logging.getLogger(f"Agent-{profile.id}")
|
114 |
+
|
115 |
+
# Initialize components
|
116 |
+
self._init_components()
|
117 |
+
|
118 |
+
def _init_components(self):
|
119 |
+
"""Initialize agent components."""
|
120 |
+
# Set up knowledge base
|
121 |
+
self.knowledge_base = {
|
122 |
+
"expertise": {area: 0.5 for area in self.profile.expertise_areas},
|
123 |
+
"learned_skills": set(),
|
124 |
+
"interaction_patterns": defaultdict(int),
|
125 |
+
"success_patterns": defaultdict(float)
|
126 |
+
}
|
127 |
+
|
128 |
+
# Set up resource limits
|
129 |
+
self.resource_limits = {
|
130 |
+
"cpu": 1.0,
|
131 |
+
"memory": 1000,
|
132 |
+
"api_calls": 100,
|
133 |
+
"learning_capacity": 0.8
|
134 |
+
}
|
135 |
+
|
136 |
+
async def process_task(self, task: Task) -> Dict[str, Any]:
|
137 |
+
"""Process an assigned task."""
|
138 |
+
try:
|
139 |
+
self.current_task = task
|
140 |
+
self.state = AgentState.BUSY
|
141 |
+
|
142 |
+
# Analyze task
|
143 |
+
analysis = await self._analyze_task(task)
|
144 |
+
|
145 |
+
# Plan execution
|
146 |
+
plan = await self._plan_execution(analysis)
|
147 |
+
|
148 |
+
# Execute plan
|
149 |
+
result = await self._execute_plan(plan)
|
150 |
+
|
151 |
+
# Learn from execution
|
152 |
+
await self._learn_from_execution(task, result)
|
153 |
+
|
154 |
+
# Update metrics
|
155 |
+
self._update_metrics(task, result)
|
156 |
+
|
157 |
+
return {
|
158 |
+
"success": True,
|
159 |
+
"task_id": task.id,
|
160 |
+
"result": result,
|
161 |
+
"metrics": self._get_execution_metrics()
|
162 |
+
}
|
163 |
+
|
164 |
+
except Exception as e:
|
165 |
+
self.logger.error(f"Error processing task: {e}")
|
166 |
+
self.state = AgentState.ERROR
|
167 |
+
return {
|
168 |
+
"success": False,
|
169 |
+
"task_id": task.id,
|
170 |
+
"error": str(e)
|
171 |
+
}
|
172 |
+
finally:
|
173 |
+
self.state = AgentState.IDLE
|
174 |
+
self.current_task = None
|
175 |
+
|
176 |
+
async def _analyze_task(self, task: Task) -> Dict[str, Any]:
|
177 |
+
"""Analyze task requirements and constraints."""
|
178 |
+
# Use reasoning engine for analysis
|
179 |
+
analysis = await self.reasoning_engine.reason(
|
180 |
+
query=task.description,
|
181 |
+
context={
|
182 |
+
"agent_profile": self.profile.__dict__,
|
183 |
+
"task_history": self.task_history,
|
184 |
+
"knowledge_base": self.knowledge_base
|
185 |
+
},
|
186 |
+
mode=ReasoningMode.ANALYTICAL
|
187 |
+
)
|
188 |
+
|
189 |
+
return {
|
190 |
+
"requirements": analysis.get("requirements", []),
|
191 |
+
"constraints": analysis.get("constraints", []),
|
192 |
+
"complexity": analysis.get("complexity", 0.5),
|
193 |
+
"estimated_duration": analysis.get("estimated_duration", 3600),
|
194 |
+
"required_capabilities": analysis.get("required_capabilities", [])
|
195 |
+
}
|
196 |
+
|
197 |
+
async def _plan_execution(self, analysis: Dict[str, Any]) -> List[Dict[str, Any]]:
|
198 |
+
"""Plan task execution based on analysis."""
|
199 |
+
# Use reasoning engine for planning
|
200 |
+
plan = await self.reasoning_engine.reason(
|
201 |
+
query="Plan execution steps",
|
202 |
+
context={
|
203 |
+
"analysis": analysis,
|
204 |
+
"agent_capabilities": self.profile.capabilities,
|
205 |
+
"resource_limits": self.resource_limits
|
206 |
+
},
|
207 |
+
mode=ReasoningMode.FOCUSED
|
208 |
+
)
|
209 |
+
|
210 |
+
return plan.get("steps", [])
|
211 |
+
|
212 |
+
async def _execute_plan(self, plan: List[Dict[str, Any]]) -> Dict[str, Any]:
|
213 |
+
"""Execute the planned steps."""
|
214 |
+
results = []
|
215 |
+
|
216 |
+
for step in plan:
|
217 |
+
try:
|
218 |
+
# Check resources
|
219 |
+
if not self._check_resources(step):
|
220 |
+
raise RuntimeError("Insufficient resources for step execution")
|
221 |
+
|
222 |
+
# Execute step
|
223 |
+
step_result = await self._execute_step(step)
|
224 |
+
results.append(step_result)
|
225 |
+
|
226 |
+
# Update resource usage
|
227 |
+
self._update_resource_usage(step)
|
228 |
+
|
229 |
+
# Learn from step execution
|
230 |
+
await self._learn_from_step(step, step_result)
|
231 |
+
|
232 |
+
except Exception as e:
|
233 |
+
self.logger.error(f"Error executing step: {e}")
|
234 |
+
results.append({"error": str(e)})
|
235 |
+
|
236 |
+
return {
|
237 |
+
"success": all(r.get("success", False) for r in results),
|
238 |
+
"results": results
|
239 |
+
}
|
240 |
+
|
241 |
+
async def _execute_step(self, step: Dict[str, Any]) -> Dict[str, Any]:
|
242 |
+
"""Execute a single step of the plan."""
|
243 |
+
step_type = step.get("type", "unknown")
|
244 |
+
|
245 |
+
if step_type == "reasoning":
|
246 |
+
return await self._execute_reasoning_step(step)
|
247 |
+
elif step_type == "learning":
|
248 |
+
return await self._execute_learning_step(step)
|
249 |
+
elif step_type == "action":
|
250 |
+
return await self._execute_action_step(step)
|
251 |
+
else:
|
252 |
+
raise ValueError(f"Unknown step type: {step_type}")
|
253 |
+
|
254 |
+
async def _execute_reasoning_step(self, step: Dict[str, Any]) -> Dict[str, Any]:
|
255 |
+
"""Execute a reasoning step."""
|
256 |
+
result = await self.reasoning_engine.reason(
|
257 |
+
query=step["query"],
|
258 |
+
context=step.get("context", {}),
|
259 |
+
mode=ReasoningMode.ANALYTICAL
|
260 |
+
)
|
261 |
+
|
262 |
+
return {
|
263 |
+
"success": result.get("success", False),
|
264 |
+
"reasoning_result": result
|
265 |
+
}
|
266 |
+
|
267 |
+
async def _execute_learning_step(self, step: Dict[str, Any]) -> Dict[str, Any]:
|
268 |
+
"""Execute a learning step."""
|
269 |
+
result = await self.meta_learning.learn(
|
270 |
+
data=step["data"],
|
271 |
+
context=step.get("context", {})
|
272 |
+
)
|
273 |
+
|
274 |
+
return {
|
275 |
+
"success": result.get("success", False),
|
276 |
+
"learning_result": result
|
277 |
+
}
|
278 |
+
|
279 |
+
async def _execute_action_step(self, step: Dict[str, Any]) -> Dict[str, Any]:
|
280 |
+
"""Execute an action step."""
|
281 |
+
action_type = step.get("action_type")
|
282 |
+
|
283 |
+
if action_type == "api_call":
|
284 |
+
return await self._make_api_call(step)
|
285 |
+
elif action_type == "data_processing":
|
286 |
+
return await self._process_data(step)
|
287 |
+
elif action_type == "coordination":
|
288 |
+
return await self._coordinate_action(step)
|
289 |
+
else:
|
290 |
+
raise ValueError(f"Unknown action type: {action_type}")
|
291 |
+
|
292 |
+
def _check_resources(self, step: Dict[str, Any]) -> bool:
|
293 |
+
"""Check if sufficient resources are available."""
|
294 |
+
required_resources = step.get("required_resources", {})
|
295 |
+
|
296 |
+
for resource, amount in required_resources.items():
|
297 |
+
if self.resource_usage.get(resource, 0) + amount > self.resource_limits.get(resource, float('inf')):
|
298 |
+
return False
|
299 |
+
|
300 |
+
return True
|
301 |
+
|
302 |
+
def _update_resource_usage(self, step: Dict[str, Any]):
|
303 |
+
"""Update resource usage after step execution."""
|
304 |
+
used_resources = step.get("used_resources", {})
|
305 |
+
|
306 |
+
for resource, amount in used_resources.items():
|
307 |
+
self.resource_usage[resource] = self.resource_usage.get(resource, 0) + amount
|
308 |
+
|
309 |
+
async def _learn_from_execution(self, task: Task, result: Dict[str, Any]):
|
310 |
+
"""Learn from task execution experience."""
|
311 |
+
# Prepare learning data
|
312 |
+
learning_data = {
|
313 |
+
"task": task.__dict__,
|
314 |
+
"result": result,
|
315 |
+
"context": {
|
316 |
+
"agent_state": self.state,
|
317 |
+
"resource_usage": self.resource_usage,
|
318 |
+
"performance_metrics": self._get_execution_metrics()
|
319 |
+
}
|
320 |
+
}
|
321 |
+
|
322 |
+
# Learn patterns
|
323 |
+
patterns = await self.meta_learning.learn(
|
324 |
+
data=learning_data,
|
325 |
+
context=self.knowledge_base
|
326 |
+
)
|
327 |
+
|
328 |
+
# Update knowledge base
|
329 |
+
self._update_knowledge_base(patterns)
|
330 |
+
|
331 |
+
# Record adaptation
|
332 |
+
self.adaptation_history.append({
|
333 |
+
"timestamp": datetime.now(),
|
334 |
+
"patterns": patterns,
|
335 |
+
"metrics": self._get_execution_metrics()
|
336 |
+
})
|
337 |
+
|
338 |
+
async def _learn_from_step(self, step: Dict[str, Any], result: Dict[str, Any]):
|
339 |
+
"""Learn from individual step execution."""
|
340 |
+
if result.get("success", False):
|
341 |
+
# Update success patterns
|
342 |
+
pattern_key = f"{step['type']}:{step.get('action_type', 'none')}"
|
343 |
+
self.knowledge_base["success_patterns"][pattern_key] += 1
|
344 |
+
|
345 |
+
# Learn from successful execution
|
346 |
+
await self.meta_learning.learn(
|
347 |
+
data={
|
348 |
+
"step": step,
|
349 |
+
"result": result
|
350 |
+
},
|
351 |
+
context={"pattern_key": pattern_key}
|
352 |
+
)
|
353 |
+
|
354 |
+
def _update_knowledge_base(self, patterns: Dict[str, Any]):
|
355 |
+
"""Update knowledge base with new patterns."""
|
356 |
+
# Update expertise levels
|
357 |
+
for area, pattern in patterns.get("expertise_patterns", {}).items():
|
358 |
+
if area in self.knowledge_base["expertise"]:
|
359 |
+
current = self.knowledge_base["expertise"][area]
|
360 |
+
self.knowledge_base["expertise"][area] = current * 0.9 + pattern * 0.1
|
361 |
+
|
362 |
+
# Add new learned skills
|
363 |
+
new_skills = patterns.get("learned_skills", set())
|
364 |
+
self.knowledge_base["learned_skills"].update(new_skills)
|
365 |
+
|
366 |
+
# Update interaction patterns
|
367 |
+
for pattern, count in patterns.get("interaction_patterns", {}).items():
|
368 |
+
self.knowledge_base["interaction_patterns"][pattern] += count
|
369 |
+
|
370 |
+
def _update_metrics(self, task: Task, result: Dict[str, Any]):
|
371 |
+
"""Update performance metrics."""
|
372 |
+
metrics = {
|
373 |
+
"success": float(result.get("success", False)),
|
374 |
+
"duration": (datetime.now() - task.created_at).total_seconds(),
|
375 |
+
"resource_efficiency": self._calculate_resource_efficiency(),
|
376 |
+
"learning_progress": self._calculate_learning_progress()
|
377 |
+
}
|
378 |
+
|
379 |
+
for key, value in metrics.items():
|
380 |
+
self.metrics[key].append(value)
|
381 |
+
|
382 |
+
self.performance_history.append({
|
383 |
+
"timestamp": datetime.now(),
|
384 |
+
"metrics": metrics
|
385 |
+
})
|
386 |
+
|
387 |
+
def _calculate_resource_efficiency(self) -> float:
|
388 |
+
"""Calculate resource usage efficiency."""
|
389 |
+
if not self.resource_limits:
|
390 |
+
return 1.0
|
391 |
+
|
392 |
+
efficiencies = []
|
393 |
+
for resource, usage in self.resource_usage.items():
|
394 |
+
limit = self.resource_limits.get(resource, float('inf'))
|
395 |
+
if limit > 0:
|
396 |
+
efficiencies.append(1 - (usage / limit))
|
397 |
+
|
398 |
+
return sum(efficiencies) / len(efficiencies) if efficiencies else 1.0
|
399 |
+
|
400 |
+
def _calculate_learning_progress(self) -> float:
|
401 |
+
"""Calculate learning progress."""
|
402 |
+
if not self.knowledge_base["expertise"]:
|
403 |
+
return 0.0
|
404 |
+
|
405 |
+
return sum(self.knowledge_base["expertise"].values()) / len(self.knowledge_base["expertise"])
|
406 |
+
|
407 |
+
def _get_execution_metrics(self) -> Dict[str, float]:
|
408 |
+
"""Get current execution metrics."""
|
409 |
+
return {
|
410 |
+
key: sum(values[-10:]) / len(values[-10:])
|
411 |
+
for key, values in self.metrics.items()
|
412 |
+
if values
|
413 |
+
}
|
414 |
+
|
415 |
+
class AgenticSystem:
|
416 |
+
"""Advanced multi-agent system with orchestration."""
|
417 |
+
|
418 |
+
def __init__(self, config: Dict[str, Any] = None):
|
419 |
+
self.config = config or {}
|
420 |
+
|
421 |
+
# Initialize orchestrator
|
422 |
+
self.orchestrator = AgentOrchestrator(config)
|
423 |
+
|
424 |
+
# Initialize components
|
425 |
+
self.agents: Dict[str, Agent] = {}
|
426 |
+
self.reasoning_engine = ReasoningEngine(
|
427 |
+
model_manager=None, # Will be injected
|
428 |
+
max_depth=5,
|
429 |
+
beam_width=3
|
430 |
+
)
|
431 |
+
self.meta_learning = MetaLearningStrategy()
|
432 |
+
|
433 |
+
# System state
|
434 |
+
self.state = "initialized"
|
435 |
+
self.metrics: Dict[str, List[float]] = defaultdict(list)
|
436 |
+
|
437 |
+
# Async support
|
438 |
+
self.executor = ThreadPoolExecutor(max_workers=4)
|
439 |
+
self.lock = asyncio.Lock()
|
440 |
+
|
441 |
+
# Logging
|
442 |
+
self.logger = logging.getLogger("AgenticSystem")
|
443 |
+
|
444 |
+
async def create_agent(
|
445 |
+
self,
|
446 |
+
name: str,
|
447 |
+
role: AgentRole,
|
448 |
+
capabilities: List[AgentCapability],
|
449 |
+
personality: AgentPersonality,
|
450 |
+
expertise_areas: List[str]
|
451 |
+
) -> str:
|
452 |
+
"""Create a new agent."""
|
453 |
+
# Create agent profile
|
454 |
+
profile = AgentProfile(
|
455 |
+
id=str(uuid.uuid4()),
|
456 |
+
name=name,
|
457 |
+
role=role,
|
458 |
+
capabilities=capabilities,
|
459 |
+
personality=personality,
|
460 |
+
expertise_areas=expertise_areas,
|
461 |
+
learning_rate=0.1,
|
462 |
+
risk_tolerance=0.5,
|
463 |
+
created_at=datetime.now(),
|
464 |
+
metadata={}
|
465 |
+
)
|
466 |
+
|
467 |
+
# Create agent instance
|
468 |
+
agent = Agent(
|
469 |
+
profile=profile,
|
470 |
+
reasoning_engine=self.reasoning_engine,
|
471 |
+
meta_learning=self.meta_learning,
|
472 |
+
config=self.config.get("agent_config", {})
|
473 |
+
)
|
474 |
+
|
475 |
+
# Register with orchestrator
|
476 |
+
agent_id = await self.orchestrator.register_agent(
|
477 |
+
role=role,
|
478 |
+
capabilities=[c.value for c in capabilities]
|
479 |
+
)
|
480 |
+
|
481 |
+
# Store agent
|
482 |
+
async with self.lock:
|
483 |
+
self.agents[agent_id] = agent
|
484 |
+
|
485 |
+
return agent_id
|
486 |
+
|
487 |
+
async def submit_task(
|
488 |
+
self,
|
489 |
+
description: str,
|
490 |
+
priority: TaskPriority = TaskPriority.MEDIUM,
|
491 |
+
deadline: Optional[datetime] = None
|
492 |
+
) -> str:
|
493 |
+
"""Submit a task to the system."""
|
494 |
+
return await self.orchestrator.submit_task(
|
495 |
+
description=description,
|
496 |
+
priority=priority,
|
497 |
+
deadline=deadline
|
498 |
+
)
|
499 |
+
|
500 |
+
async def get_task_status(self, task_id: str) -> Dict[str, Any]:
|
501 |
+
"""Get status of a task."""
|
502 |
+
return await self.orchestrator.get_task_status(task_id)
|
503 |
+
|
504 |
+
async def get_agent_status(self, agent_id: str) -> Dict[str, Any]:
|
505 |
+
"""Get status of an agent."""
|
506 |
+
agent = self.agents.get(agent_id)
|
507 |
+
if not agent:
|
508 |
+
raise ValueError(f"Unknown agent: {agent_id}")
|
509 |
+
|
510 |
+
return {
|
511 |
+
"profile": agent.profile.__dict__,
|
512 |
+
"state": agent.state,
|
513 |
+
"current_task": agent.current_task.__dict__ if agent.current_task else None,
|
514 |
+
"metrics": agent._get_execution_metrics(),
|
515 |
+
"resource_usage": agent.resource_usage
|
516 |
+
}
|
517 |
+
|
518 |
+
async def get_system_status(self) -> Dict[str, Any]:
|
519 |
+
"""Get overall system status."""
|
520 |
+
return {
|
521 |
+
"state": self.state,
|
522 |
+
"agent_count": len(self.agents),
|
523 |
+
"active_tasks": len([a for a in self.agents.values() if a.state == AgentState.BUSY]),
|
524 |
+
"performance_metrics": self._calculate_system_metrics(),
|
525 |
+
"resource_usage": self._calculate_resource_usage()
|
526 |
+
}
|
527 |
+
|
528 |
+
def _calculate_system_metrics(self) -> Dict[str, float]:
|
529 |
+
"""Calculate overall system metrics."""
|
530 |
+
metrics = defaultdict(list)
|
531 |
+
|
532 |
+
for agent in self.agents.values():
|
533 |
+
agent_metrics = agent._get_execution_metrics()
|
534 |
+
for key, value in agent_metrics.items():
|
535 |
+
metrics[key].append(value)
|
536 |
+
|
537 |
+
return {
|
538 |
+
key: sum(values) / len(values)
|
539 |
+
for key, values in metrics.items()
|
540 |
+
if values
|
541 |
+
}
|
542 |
+
|
543 |
+
def _calculate_resource_usage(self) -> Dict[str, float]:
|
544 |
+
"""Calculate overall resource usage."""
|
545 |
+
usage = defaultdict(float)
|
546 |
+
|
547 |
+
for agent in self.agents.values():
|
548 |
+
for resource, amount in agent.resource_usage.items():
|
549 |
+
usage[resource] += amount
|
550 |
+
|
551 |
+
return dict(usage)
|
api/venture_api.py
ADDED
@@ -0,0 +1,194 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""API endpoints for venture strategies and analysis."""
|
2 |
+
|
3 |
+
from fastapi import APIRouter, HTTPException, Depends
|
4 |
+
from typing import List, Dict, Any, Optional
|
5 |
+
from pydantic import BaseModel, Field
|
6 |
+
from datetime import datetime
|
7 |
+
|
8 |
+
from reasoning.venture_strategies import (
|
9 |
+
AIStartupStrategy, SaaSVentureStrategy, AutomationVentureStrategy,
|
10 |
+
DataVentureStrategy, APIVentureStrategy, MarketplaceVentureStrategy,
|
11 |
+
AIInfrastructureStrategy, AIConsultingStrategy, AIProductStrategy,
|
12 |
+
FinTechStrategy, HealthTechStrategy, EdTechStrategy,
|
13 |
+
BlockchainStrategy, AIMarketplaceStrategy
|
14 |
+
)
|
15 |
+
from reasoning.market_analysis import MarketAnalyzer
|
16 |
+
from reasoning.portfolio_optimization import PortfolioOptimizer
|
17 |
+
from reasoning.monetization import MonetizationOptimizer
|
18 |
+
|
19 |
+
router = APIRouter(prefix="/api/ventures", tags=["ventures"])
|
20 |
+
|
21 |
+
# Models
|
22 |
+
class VentureRequest(BaseModel):
|
23 |
+
"""Venture analysis request."""
|
24 |
+
venture_type: str
|
25 |
+
query: str
|
26 |
+
context: Dict[str, Any] = Field(default_factory=dict)
|
27 |
+
|
28 |
+
class MarketRequest(BaseModel):
|
29 |
+
"""Market analysis request."""
|
30 |
+
segment: str
|
31 |
+
context: Dict[str, Any] = Field(default_factory=dict)
|
32 |
+
|
33 |
+
class PortfolioRequest(BaseModel):
|
34 |
+
"""Portfolio optimization request."""
|
35 |
+
ventures: List[str]
|
36 |
+
context: Dict[str, Any] = Field(default_factory=dict)
|
37 |
+
|
38 |
+
class MonetizationRequest(BaseModel):
|
39 |
+
"""Monetization optimization request."""
|
40 |
+
venture_type: str
|
41 |
+
context: Dict[str, Any] = Field(default_factory=dict)
|
42 |
+
|
43 |
+
# Strategy mapping
|
44 |
+
VENTURE_STRATEGIES = {
|
45 |
+
"ai_startup": AIStartupStrategy(),
|
46 |
+
"saas": SaaSVentureStrategy(),
|
47 |
+
"automation": AutomationVentureStrategy(),
|
48 |
+
"data": DataVentureStrategy(),
|
49 |
+
"api": APIVentureStrategy(),
|
50 |
+
"marketplace": MarketplaceVentureStrategy(),
|
51 |
+
"ai_infrastructure": AIInfrastructureStrategy(),
|
52 |
+
"ai_consulting": AIConsultingStrategy(),
|
53 |
+
"ai_product": AIProductStrategy(),
|
54 |
+
"fintech": FinTechStrategy(),
|
55 |
+
"healthtech": HealthTechStrategy(),
|
56 |
+
"edtech": EdTechStrategy(),
|
57 |
+
"blockchain": BlockchainStrategy(),
|
58 |
+
"ai_marketplace": AIMarketplaceStrategy()
|
59 |
+
}
|
60 |
+
|
61 |
+
# Endpoints
|
62 |
+
@router.post("/analyze")
|
63 |
+
async def analyze_venture(request: VentureRequest):
|
64 |
+
"""Analyze venture opportunity."""
|
65 |
+
try:
|
66 |
+
strategy = VENTURE_STRATEGIES.get(request.venture_type)
|
67 |
+
if not strategy:
|
68 |
+
raise HTTPException(
|
69 |
+
status_code=400,
|
70 |
+
detail=f"Invalid venture type: {request.venture_type}"
|
71 |
+
)
|
72 |
+
|
73 |
+
result = await strategy.reason(request.query, request.context)
|
74 |
+
return {
|
75 |
+
"success": True,
|
76 |
+
"result": result,
|
77 |
+
"timestamp": datetime.now().isoformat()
|
78 |
+
}
|
79 |
+
except Exception as e:
|
80 |
+
raise HTTPException(status_code=500, detail=str(e))
|
81 |
+
|
82 |
+
@router.post("/market")
|
83 |
+
async def analyze_market(request: MarketRequest):
|
84 |
+
"""Analyze market opportunity."""
|
85 |
+
try:
|
86 |
+
analyzer = MarketAnalyzer()
|
87 |
+
result = await analyzer.analyze_market(request.segment, request.context)
|
88 |
+
return {
|
89 |
+
"success": True,
|
90 |
+
"result": result,
|
91 |
+
"timestamp": datetime.now().isoformat()
|
92 |
+
}
|
93 |
+
except Exception as e:
|
94 |
+
raise HTTPException(status_code=500, detail=str(e))
|
95 |
+
|
96 |
+
@router.post("/portfolio")
|
97 |
+
async def optimize_portfolio(request: PortfolioRequest):
|
98 |
+
"""Optimize venture portfolio."""
|
99 |
+
try:
|
100 |
+
optimizer = PortfolioOptimizer()
|
101 |
+
result = await optimizer.optimize_portfolio(request.ventures, request.context)
|
102 |
+
return {
|
103 |
+
"success": True,
|
104 |
+
"result": result,
|
105 |
+
"timestamp": datetime.now().isoformat()
|
106 |
+
}
|
107 |
+
except Exception as e:
|
108 |
+
raise HTTPException(status_code=500, detail=str(e))
|
109 |
+
|
110 |
+
@router.post("/monetization")
|
111 |
+
async def optimize_monetization(request: MonetizationRequest):
|
112 |
+
"""Optimize venture monetization."""
|
113 |
+
try:
|
114 |
+
optimizer = MonetizationOptimizer()
|
115 |
+
result = await optimizer.optimize_monetization(
|
116 |
+
request.venture_type, request.context)
|
117 |
+
return {
|
118 |
+
"success": True,
|
119 |
+
"result": result,
|
120 |
+
"timestamp": datetime.now().isoformat()
|
121 |
+
}
|
122 |
+
except Exception as e:
|
123 |
+
raise HTTPException(status_code=500, detail=str(e))
|
124 |
+
|
125 |
+
@router.get("/strategies")
|
126 |
+
async def list_strategies():
|
127 |
+
"""List available venture strategies."""
|
128 |
+
return {
|
129 |
+
"success": True,
|
130 |
+
"strategies": list(VENTURE_STRATEGIES.keys()),
|
131 |
+
"timestamp": datetime.now().isoformat()
|
132 |
+
}
|
133 |
+
|
134 |
+
@router.get("/metrics/{venture_type}")
|
135 |
+
async def get_venture_metrics(venture_type: str):
|
136 |
+
"""Get venture performance metrics."""
|
137 |
+
try:
|
138 |
+
strategy = VENTURE_STRATEGIES.get(venture_type)
|
139 |
+
if not strategy:
|
140 |
+
raise HTTPException(
|
141 |
+
status_code=400,
|
142 |
+
detail=f"Invalid venture type: {venture_type}"
|
143 |
+
)
|
144 |
+
|
145 |
+
metrics = strategy.get_venture_metrics()
|
146 |
+
return {
|
147 |
+
"success": True,
|
148 |
+
"metrics": metrics,
|
149 |
+
"timestamp": datetime.now().isoformat()
|
150 |
+
}
|
151 |
+
except Exception as e:
|
152 |
+
raise HTTPException(status_code=500, detail=str(e))
|
153 |
+
|
154 |
+
@router.get("/insights")
|
155 |
+
async def get_market_insights():
|
156 |
+
"""Get comprehensive market insights."""
|
157 |
+
try:
|
158 |
+
analyzer = MarketAnalyzer()
|
159 |
+
insights = analyzer.get_market_insights()
|
160 |
+
return {
|
161 |
+
"success": True,
|
162 |
+
"insights": insights,
|
163 |
+
"timestamp": datetime.now().isoformat()
|
164 |
+
}
|
165 |
+
except Exception as e:
|
166 |
+
raise HTTPException(status_code=500, detail=str(e))
|
167 |
+
|
168 |
+
@router.get("/portfolio/insights")
|
169 |
+
async def get_portfolio_insights():
|
170 |
+
"""Get comprehensive portfolio insights."""
|
171 |
+
try:
|
172 |
+
optimizer = PortfolioOptimizer()
|
173 |
+
insights = optimizer.get_portfolio_insights()
|
174 |
+
return {
|
175 |
+
"success": True,
|
176 |
+
"insights": insights,
|
177 |
+
"timestamp": datetime.now().isoformat()
|
178 |
+
}
|
179 |
+
except Exception as e:
|
180 |
+
raise HTTPException(status_code=500, detail=str(e))
|
181 |
+
|
182 |
+
@router.get("/monetization/metrics")
|
183 |
+
async def get_monetization_metrics():
|
184 |
+
"""Get comprehensive monetization metrics."""
|
185 |
+
try:
|
186 |
+
optimizer = MonetizationOptimizer()
|
187 |
+
metrics = optimizer.get_monetization_metrics()
|
188 |
+
return {
|
189 |
+
"success": True,
|
190 |
+
"metrics": metrics,
|
191 |
+
"timestamp": datetime.now().isoformat()
|
192 |
+
}
|
193 |
+
except Exception as e:
|
194 |
+
raise HTTPException(status_code=500, detail=str(e))
|
app.py
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Advanced Agentic System Interface
|
3 |
+
-------------------------------
|
4 |
+
Provides an interface to interact with the autonomous agent system
|
5 |
+
using local LLM for improved performance.
|
6 |
+
"""
|
7 |
+
|
8 |
+
import gradio as gr
|
9 |
+
import asyncio
|
10 |
+
from typing import Dict, Any, List
|
11 |
+
import json
|
12 |
+
from datetime import datetime
|
13 |
+
import logging
|
14 |
+
|
15 |
+
from agentic_system import AgenticSystem
|
16 |
+
from team_management import TeamManager
|
17 |
+
from orchestrator import AgentOrchestrator
|
18 |
+
from reasoning.unified_engine import UnifiedReasoningEngine
|
19 |
+
|
20 |
+
# Configure logging
|
21 |
+
logging.basicConfig(level=logging.INFO)
|
22 |
+
logger = logging.getLogger(__name__)
|
23 |
+
|
24 |
+
class AgentInterface:
|
25 |
+
"""Interface for the agentic system."""
|
26 |
+
|
27 |
+
def __init__(self):
|
28 |
+
"""Initialize the interface components."""
|
29 |
+
self.orchestrator = AgentOrchestrator()
|
30 |
+
self.reasoning_engine = UnifiedReasoningEngine(
|
31 |
+
min_confidence=0.7,
|
32 |
+
parallel_threshold=3,
|
33 |
+
learning_rate=0.1
|
34 |
+
)
|
35 |
+
|
36 |
+
async def process_query(self, message: str) -> str:
|
37 |
+
"""Process user query through the reasoning system."""
|
38 |
+
try:
|
39 |
+
# Prepare context
|
40 |
+
context = {
|
41 |
+
'timestamp': datetime.now().isoformat(),
|
42 |
+
'objective': 'Provide helpful and accurate responses',
|
43 |
+
'mode': 'analytical'
|
44 |
+
}
|
45 |
+
|
46 |
+
# Get response from reasoning engine
|
47 |
+
result = await self.reasoning_engine.reason(
|
48 |
+
query=message,
|
49 |
+
context=context
|
50 |
+
)
|
51 |
+
|
52 |
+
if result.success:
|
53 |
+
return result.answer
|
54 |
+
else:
|
55 |
+
return f"Error: Unable to process query. Please try again."
|
56 |
+
|
57 |
+
except Exception as e:
|
58 |
+
logger.error(f"Error processing query: {e}")
|
59 |
+
return f"Error: {str(e)}"
|
60 |
+
|
61 |
+
# Initialize interface
|
62 |
+
interface = AgentInterface()
|
63 |
+
|
64 |
+
# Create Gradio interface
|
65 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
66 |
+
gr.Markdown("""
|
67 |
+
# AI Reasoning System
|
68 |
+
This system uses advanced reasoning strategies including local LLM for improved performance.
|
69 |
+
|
70 |
+
Note: First query might take a few seconds as the model loads.
|
71 |
+
""")
|
72 |
+
|
73 |
+
with gr.Row():
|
74 |
+
with gr.Column(scale=4):
|
75 |
+
input_text = gr.Textbox(
|
76 |
+
label="Your question",
|
77 |
+
placeholder="Ask me anything...",
|
78 |
+
lines=2
|
79 |
+
)
|
80 |
+
output_text = gr.Textbox(
|
81 |
+
label="Response",
|
82 |
+
lines=10,
|
83 |
+
interactive=False
|
84 |
+
)
|
85 |
+
submit_btn = gr.Button("Ask")
|
86 |
+
clear_btn = gr.Button("Clear")
|
87 |
+
|
88 |
+
with gr.Column(scale=1):
|
89 |
+
gr.Markdown("""
|
90 |
+
### Example Questions:
|
91 |
+
- What are the implications of artificial intelligence on society?
|
92 |
+
- How does climate change affect global ecosystems?
|
93 |
+
- What are the philosophical implications of quantum mechanics?
|
94 |
+
""")
|
95 |
+
|
96 |
+
# Set up event handlers
|
97 |
+
submit_btn.click(
|
98 |
+
fn=interface.process_query,
|
99 |
+
inputs=input_text,
|
100 |
+
outputs=output_text
|
101 |
+
)
|
102 |
+
clear_btn.click(
|
103 |
+
lambda: ("", ""),
|
104 |
+
inputs=None,
|
105 |
+
outputs=[input_text, output_text]
|
106 |
+
)
|
107 |
+
|
108 |
+
# Launch the interface
|
109 |
+
if __name__ == "__main__":
|
110 |
+
demo.launch()
|
app.py.backup
ADDED
@@ -0,0 +1,338 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Advanced Agentic System Interface
|
3 |
+
-------------------------------
|
4 |
+
Provides a chat interface to interact with the autonomous agent teams:
|
5 |
+
- Team A: Coders (App/Software Developers)
|
6 |
+
- Team B: Business (Entrepreneurs)
|
7 |
+
- Team C: Research (Deep Online Research)
|
8 |
+
- Team D: Crypto & Sports Trading
|
9 |
+
"""
|
10 |
+
|
11 |
+
import gradio as gr
|
12 |
+
import asyncio
|
13 |
+
from typing import Dict, Any, List
|
14 |
+
import json
|
15 |
+
from datetime import datetime
|
16 |
+
|
17 |
+
from agentic_system import AgenticSystem
|
18 |
+
from team_management import TeamManager, TeamType, TeamObjective
|
19 |
+
from orchestrator import AgentOrchestrator
|
20 |
+
from reasoning import ReasoningEngine
|
21 |
+
|
22 |
+
class ChatInterface:
|
23 |
+
def __init__(self):
|
24 |
+
# Initialize core components
|
25 |
+
self.orchestrator = AgentOrchestrator()
|
26 |
+
self.agentic_system = AgenticSystem()
|
27 |
+
self.team_manager = TeamManager(self.orchestrator)
|
28 |
+
self.chat_history = []
|
29 |
+
self.active_objectives = {}
|
30 |
+
|
31 |
+
# Initialize teams
|
32 |
+
asyncio.run(self.team_manager.initialize_team_agents())
|
33 |
+
|
34 |
+
async def process_message(
|
35 |
+
self,
|
36 |
+
message: str,
|
37 |
+
history: List[List[str]]
|
38 |
+
) -> str:
|
39 |
+
"""Process incoming chat message."""
|
40 |
+
try:
|
41 |
+
# Analyze message intent
|
42 |
+
intent = await self._analyze_intent(message)
|
43 |
+
|
44 |
+
if intent["type"] == "query":
|
45 |
+
response = await self._handle_query(message)
|
46 |
+
elif intent["type"] == "objective":
|
47 |
+
response = await self._handle_objective(message)
|
48 |
+
elif intent["type"] == "status":
|
49 |
+
response = await self._handle_status_request(message)
|
50 |
+
else:
|
51 |
+
response = await self._handle_general_chat(message)
|
52 |
+
|
53 |
+
# Update chat history
|
54 |
+
self.chat_history.append({
|
55 |
+
"role": "user",
|
56 |
+
"content": message,
|
57 |
+
"timestamp": datetime.now()
|
58 |
+
})
|
59 |
+
self.chat_history.append({
|
60 |
+
"role": "assistant",
|
61 |
+
"content": response,
|
62 |
+
"timestamp": datetime.now()
|
63 |
+
})
|
64 |
+
|
65 |
+
return response
|
66 |
+
|
67 |
+
except Exception as e:
|
68 |
+
return f"Error processing message: {str(e)}"
|
69 |
+
|
70 |
+
async def _analyze_intent(self, message: str) -> Dict[str, Any]:
|
71 |
+
"""Analyze user message intent."""
|
72 |
+
# Use reasoning engine to analyze intent
|
73 |
+
analysis = await self.orchestrator.reasoning_engine.reason(
|
74 |
+
query=message,
|
75 |
+
context={
|
76 |
+
"chat_history": self.chat_history,
|
77 |
+
"active_objectives": self.active_objectives
|
78 |
+
}
|
79 |
+
)
|
80 |
+
|
81 |
+
return {
|
82 |
+
"type": analysis.get("intent_type", "general"),
|
83 |
+
"confidence": analysis.get("confidence", 0.5),
|
84 |
+
"entities": analysis.get("entities", []),
|
85 |
+
"action_required": analysis.get("action_required", False)
|
86 |
+
}
|
87 |
+
|
88 |
+
async def _handle_query(self, message: str) -> str:
|
89 |
+
"""Handle information queries."""
|
90 |
+
# Get relevant teams for the query
|
91 |
+
recommended_teams = await self.team_manager.get_team_recommendations(message)
|
92 |
+
|
93 |
+
# Get responses from relevant teams
|
94 |
+
responses = []
|
95 |
+
for team_type in recommended_teams:
|
96 |
+
team_response = await self._get_team_response(team_type, message)
|
97 |
+
responses.append(team_response)
|
98 |
+
|
99 |
+
# Combine and format responses
|
100 |
+
combined_response = self._format_team_responses(responses)
|
101 |
+
|
102 |
+
return combined_response
|
103 |
+
|
104 |
+
async def _handle_objective(self, message: str) -> str:
|
105 |
+
"""Handle new objective creation."""
|
106 |
+
# Analyze objective requirements
|
107 |
+
analysis = await self.orchestrator.reasoning_engine.reason(
|
108 |
+
query=f"Analyze objective requirements: {message}",
|
109 |
+
context={"teams": self.team_manager.teams}
|
110 |
+
)
|
111 |
+
|
112 |
+
# Determine required teams
|
113 |
+
required_teams = [
|
114 |
+
TeamType[team.upper()]
|
115 |
+
for team in analysis.get("required_teams", [])
|
116 |
+
]
|
117 |
+
|
118 |
+
# Create cross-team objective
|
119 |
+
objective_id = await self.team_manager.create_cross_team_objective(
|
120 |
+
objective=message,
|
121 |
+
required_teams=required_teams
|
122 |
+
)
|
123 |
+
|
124 |
+
self.active_objectives[objective_id] = {
|
125 |
+
"description": message,
|
126 |
+
"teams": required_teams,
|
127 |
+
"status": "initiated",
|
128 |
+
"created_at": datetime.now()
|
129 |
+
}
|
130 |
+
|
131 |
+
return self._format_objective_creation(objective_id)
|
132 |
+
|
133 |
+
async def _handle_status_request(self, message: str) -> str:
|
134 |
+
"""Handle status check requests."""
|
135 |
+
# Get system status
|
136 |
+
system_status = await self.agentic_system.get_system_status()
|
137 |
+
|
138 |
+
# Get team status
|
139 |
+
team_status = {}
|
140 |
+
for team_id, team in self.team_manager.teams.items():
|
141 |
+
team_status[team.name] = await self.team_manager.monitor_objective_progress(team_id)
|
142 |
+
|
143 |
+
# Get objective status
|
144 |
+
objective_status = {}
|
145 |
+
for obj_id, obj in self.active_objectives.items():
|
146 |
+
objective_status[obj_id] = await self.team_manager.monitor_objective_progress(obj_id)
|
147 |
+
|
148 |
+
return self._format_status_response(system_status, team_status, objective_status)
|
149 |
+
|
150 |
+
async def _handle_general_chat(self, message: str) -> str:
|
151 |
+
"""Handle general chat interactions."""
|
152 |
+
# Use reasoning engine for response generation
|
153 |
+
response = await self.orchestrator.reasoning_engine.reason(
|
154 |
+
query=message,
|
155 |
+
context={
|
156 |
+
"chat_history": self.chat_history,
|
157 |
+
"system_state": await self.agentic_system.get_system_status()
|
158 |
+
}
|
159 |
+
)
|
160 |
+
|
161 |
+
return response.get("response", "I'm not sure how to respond to that.")
|
162 |
+
|
163 |
+
async def _get_team_response(self, team_type: TeamType, query: str) -> Dict[str, Any]:
|
164 |
+
"""Get response from a specific team."""
|
165 |
+
team_id = next(
|
166 |
+
(tid for tid, team in self.team_manager.teams.items()
|
167 |
+
if team.type == team_type),
|
168 |
+
None
|
169 |
+
)
|
170 |
+
|
171 |
+
if not team_id:
|
172 |
+
return {
|
173 |
+
"team": team_type.value,
|
174 |
+
"response": "Team not available",
|
175 |
+
"confidence": 0.0
|
176 |
+
}
|
177 |
+
|
178 |
+
# Get team agents
|
179 |
+
team_agents = self.team_manager.agents[team_id]
|
180 |
+
|
181 |
+
# Aggregate responses from team agents
|
182 |
+
responses = []
|
183 |
+
for agent in team_agents.values():
|
184 |
+
agent_response = await agent.process_query(query)
|
185 |
+
responses.append(agent_response)
|
186 |
+
|
187 |
+
# Combine responses
|
188 |
+
combined_response = self._combine_agent_responses(responses)
|
189 |
+
|
190 |
+
return {
|
191 |
+
"team": team_type.value,
|
192 |
+
"response": combined_response,
|
193 |
+
"confidence": sum(r.get("confidence", 0) for r in responses) / len(responses)
|
194 |
+
}
|
195 |
+
|
196 |
+
def _combine_agent_responses(self, responses: List[Dict[str, Any]]) -> str:
|
197 |
+
"""Combine multiple agent responses into a coherent response."""
|
198 |
+
# Sort by confidence
|
199 |
+
valid_responses = [
|
200 |
+
r for r in responses
|
201 |
+
if r.get("success", False) and r.get("response")
|
202 |
+
]
|
203 |
+
|
204 |
+
if not valid_responses:
|
205 |
+
return "No valid response available"
|
206 |
+
|
207 |
+
sorted_responses = sorted(
|
208 |
+
valid_responses,
|
209 |
+
key=lambda x: x.get("confidence", 0),
|
210 |
+
reverse=True
|
211 |
+
)
|
212 |
+
|
213 |
+
# Take the highest confidence response
|
214 |
+
best_response = sorted_responses[0]
|
215 |
+
|
216 |
+
return best_response.get("response", "No response available")
|
217 |
+
|
218 |
+
def _format_team_responses(self, responses: List[Dict[str, Any]]) -> str:
|
219 |
+
"""Format team responses into a readable message."""
|
220 |
+
formatted = []
|
221 |
+
|
222 |
+
for response in responses:
|
223 |
+
if response.get("confidence", 0) > 0.3: # Confidence threshold
|
224 |
+
formatted.append(
|
225 |
+
f"Team {response['team'].title()}:\n"
|
226 |
+
f"{response['response']}\n"
|
227 |
+
)
|
228 |
+
|
229 |
+
if not formatted:
|
230 |
+
return "No team was able to provide a confident response."
|
231 |
+
|
232 |
+
return "\n".join(formatted)
|
233 |
+
|
234 |
+
def _format_objective_creation(self, objective_id: str) -> str:
|
235 |
+
"""Format objective creation response."""
|
236 |
+
objective = self.active_objectives[objective_id]
|
237 |
+
|
238 |
+
return (
|
239 |
+
f"Objective created successfully!\n\n"
|
240 |
+
f"Objective ID: {objective_id}\n"
|
241 |
+
f"Description: {objective['description']}\n"
|
242 |
+
f"Assigned Teams: {', '.join(t.value for t in objective['teams'])}\n"
|
243 |
+
f"Status: {objective['status']}\n"
|
244 |
+
f"Created: {objective['created_at'].strftime('%Y-%m-%d %H:%M:%S')}"
|
245 |
+
)
|
246 |
+
|
247 |
+
def _format_status_response(
|
248 |
+
self,
|
249 |
+
system_status: Dict[str, Any],
|
250 |
+
team_status: Dict[str, Any],
|
251 |
+
objective_status: Dict[str, Any]
|
252 |
+
) -> str:
|
253 |
+
"""Format status response."""
|
254 |
+
# Format system status
|
255 |
+
status = [
|
256 |
+
"System Status:",
|
257 |
+
f"- State: {system_status['state']}",
|
258 |
+
f"- Active Agents: {system_status['agent_count']}",
|
259 |
+
f"- Active Tasks: {system_status['active_tasks']}",
|
260 |
+
"\nTeam Status:"
|
261 |
+
]
|
262 |
+
|
263 |
+
# Add team status
|
264 |
+
for team_name, team_info in team_status.items():
|
265 |
+
status.extend([
|
266 |
+
f"\n{team_name}:",
|
267 |
+
f"- Active Agents: {team_info['active_agents']}",
|
268 |
+
f"- Completion Rate: {team_info['completion_rate']:.2%}",
|
269 |
+
f"- Collaboration Score: {team_info['collaboration_score']:.2f}"
|
270 |
+
])
|
271 |
+
|
272 |
+
# Add objective status
|
273 |
+
if objective_status:
|
274 |
+
status.append("\nActive Objectives:")
|
275 |
+
for obj_id, obj_info in objective_status.items():
|
276 |
+
obj = self.active_objectives[obj_id]
|
277 |
+
status.extend([
|
278 |
+
f"\n{obj['description']}:",
|
279 |
+
f"- Status: {obj['status']}",
|
280 |
+
f"- Teams: {', '.join(t.value for t in obj['teams'])}",
|
281 |
+
f"- Progress: {sum(t['completion_rate'] for t in obj_info.values())/len(obj_info):.2%}"
|
282 |
+
])
|
283 |
+
|
284 |
+
return "\n".join(status)
|
285 |
+
|
286 |
+
class VentureUI:
|
287 |
+
def __init__(self, app):
|
288 |
+
self.app = app
|
289 |
+
|
290 |
+
def create_interface(self):
|
291 |
+
return gr.Interface(
|
292 |
+
fn=self.app,
|
293 |
+
inputs=[
|
294 |
+
gr.Textbox(
|
295 |
+
label="Message",
|
296 |
+
placeholder="Chat with the Agentic System...",
|
297 |
+
lines=2
|
298 |
+
),
|
299 |
+
gr.State([]) # For chat history
|
300 |
+
],
|
301 |
+
outputs=gr.Textbox(
|
302 |
+
label="Response",
|
303 |
+
lines=10
|
304 |
+
),
|
305 |
+
title="Advanced Agentic System Chat Interface",
|
306 |
+
description="""
|
307 |
+
Chat with our autonomous agent teams:
|
308 |
+
- Team A: Coders (App/Software Developers)
|
309 |
+
- Team B: Business (Entrepreneurs)
|
310 |
+
- Team C: Research (Deep Online Research)
|
311 |
+
- Team D: Crypto & Sports Trading
|
312 |
+
|
313 |
+
You can:
|
314 |
+
1. Ask questions
|
315 |
+
2. Create new objectives
|
316 |
+
3. Check status of teams and objectives
|
317 |
+
4. Get insights and recommendations
|
318 |
+
""",
|
319 |
+
theme="default",
|
320 |
+
allow_flagging="never"
|
321 |
+
)
|
322 |
+
|
323 |
+
def create_chat_interface() -> gr.Interface:
|
324 |
+
"""Create Gradio chat interface."""
|
325 |
+
chat = ChatInterface()
|
326 |
+
ui = VentureUI(chat.process_message)
|
327 |
+
|
328 |
+
return ui.create_interface()
|
329 |
+
|
330 |
+
# Create and launch the interface
|
331 |
+
interface = create_chat_interface()
|
332 |
+
|
333 |
+
if __name__ == "__main__":
|
334 |
+
interface.launch(
|
335 |
+
server_name="0.0.0.0",
|
336 |
+
server_port=7860,
|
337 |
+
share=True
|
338 |
+
)
|
app.yaml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Advanced Reasoning System
|
2 |
+
emoji: 🧠
|
3 |
+
colorFrom: indigo
|
4 |
+
colorTo: purple
|
5 |
+
sdk: gradio
|
6 |
+
sdk_version: 4.16.0
|
7 |
+
app_file: app.py
|
8 |
+
pinned: false
|
9 |
+
license: mit
|
check_space_status.py
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from huggingface_hub import HfApi
|
2 |
+
import time
|
3 |
+
import os
|
4 |
+
import requests
|
5 |
+
|
6 |
+
def check_space_status():
|
7 |
+
api = HfApi()
|
8 |
+
space_name = "nananie143/Agentic_llm"
|
9 |
+
|
10 |
+
try:
|
11 |
+
# First try direct API request
|
12 |
+
response = requests.get(
|
13 |
+
f"https://huggingface.co/api/spaces/{space_name}/runtime",
|
14 |
+
headers={"Authorization": f"Bearer {os.environ['HUGGINGFACE_TOKEN']}"}
|
15 |
+
)
|
16 |
+
print(f"\nAPI Response Status: {response.status_code}")
|
17 |
+
if response.ok:
|
18 |
+
data = response.json()
|
19 |
+
print(f"Space Info: {data}")
|
20 |
+
return data.get("stage")
|
21 |
+
|
22 |
+
# Fallback to HF API
|
23 |
+
space_info = api.space_info(space_name)
|
24 |
+
print(f"\nSpace Info via HF API: {space_info}")
|
25 |
+
|
26 |
+
if hasattr(space_info, 'runtime'):
|
27 |
+
status = space_info.runtime.stage
|
28 |
+
print(f"Status: {status}")
|
29 |
+
return status
|
30 |
+
|
31 |
+
print("No status information available")
|
32 |
+
return None
|
33 |
+
|
34 |
+
except Exception as e:
|
35 |
+
print(f"Error checking status: {e}")
|
36 |
+
return None
|
37 |
+
|
38 |
+
print("Starting Space status check...")
|
39 |
+
print("Will check every 30 seconds until the Space is running...")
|
40 |
+
|
41 |
+
while True:
|
42 |
+
status = check_space_status()
|
43 |
+
print(f"Current status: {status}")
|
44 |
+
|
45 |
+
if status == "RUNNING":
|
46 |
+
print("\nSpace is now running! ")
|
47 |
+
print(f"Access your Space at: https://huggingface.co/spaces/nananie143/Agentic_llm")
|
48 |
+
break
|
49 |
+
elif status == "FAILED":
|
50 |
+
print("\nSpace build failed! Please check the logs for details.")
|
51 |
+
break
|
52 |
+
elif status is None:
|
53 |
+
print("\nCouldn't determine status. Will try again...")
|
54 |
+
|
55 |
+
time.sleep(30)
|
config.py
ADDED
@@ -0,0 +1,321 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
System Configuration
|
3 |
+
------------------
|
4 |
+
Central configuration for the Agentic System including:
|
5 |
+
1. Local Model Settings
|
6 |
+
2. Team Settings
|
7 |
+
3. System Parameters
|
8 |
+
4. Resource Limits
|
9 |
+
5. Free API Configurations
|
10 |
+
"""
|
11 |
+
|
12 |
+
import os
|
13 |
+
from typing import Dict, Any
|
14 |
+
from pathlib import Path
|
15 |
+
from dotenv import load_dotenv
|
16 |
+
|
17 |
+
# Load environment variables
|
18 |
+
load_dotenv()
|
19 |
+
|
20 |
+
class SystemConfig:
|
21 |
+
"""System-wide configuration."""
|
22 |
+
|
23 |
+
# Base Paths
|
24 |
+
BASE_DIR = Path(__file__).parent.absolute()
|
25 |
+
CACHE_DIR = BASE_DIR / "cache"
|
26 |
+
LOG_DIR = BASE_DIR / "logs"
|
27 |
+
DATA_DIR = BASE_DIR / "data"
|
28 |
+
MODEL_DIR = BASE_DIR / "models"
|
29 |
+
|
30 |
+
# System Parameters
|
31 |
+
DEBUG_MODE = os.getenv("DEBUG_MODE", "False").lower() == "true"
|
32 |
+
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
|
33 |
+
MAX_WORKERS = int(os.getenv("MAX_WORKERS", "4"))
|
34 |
+
ASYNC_TIMEOUT = int(os.getenv("ASYNC_TIMEOUT", "30"))
|
35 |
+
|
36 |
+
# Local Model Configurations
|
37 |
+
MODEL_CONFIG = {
|
38 |
+
"quick_coder": {
|
39 |
+
"name": "tugstugi/Qwen2.5-Coder-0.5B-QwQ-draft",
|
40 |
+
"type": "transformers",
|
41 |
+
"description": "Fast code completion and simple tasks",
|
42 |
+
"temperature": 0.2,
|
43 |
+
"max_tokens": 1000,
|
44 |
+
"timeout": 30
|
45 |
+
},
|
46 |
+
"deep_coder": {
|
47 |
+
"name": "YorkieOH10/deepseek-coder-6.7B-kexer-Q8_0-GGUF",
|
48 |
+
"type": "gguf",
|
49 |
+
"description": "Complex code generation and refactoring",
|
50 |
+
"temperature": 0.3,
|
51 |
+
"max_tokens": 2000,
|
52 |
+
"timeout": 45
|
53 |
+
},
|
54 |
+
"text_gen": {
|
55 |
+
"name": "Orenguteng/Llama-3-8B-Lexi-Uncensored",
|
56 |
+
"type": "transformers",
|
57 |
+
"description": "General text generation and reasoning",
|
58 |
+
"temperature": 0.7,
|
59 |
+
"max_tokens": 1500,
|
60 |
+
"timeout": 40
|
61 |
+
},
|
62 |
+
"workflow": {
|
63 |
+
"name": "deepseek-ai/JanusFlow-1.3B",
|
64 |
+
"type": "transformers",
|
65 |
+
"description": "Task planning and workflow management",
|
66 |
+
"temperature": 0.5,
|
67 |
+
"max_tokens": 1000,
|
68 |
+
"timeout": 30
|
69 |
+
}
|
70 |
+
}
|
71 |
+
|
72 |
+
# Team Configurations
|
73 |
+
TEAM_CONFIG = {
|
74 |
+
"coders": {
|
75 |
+
"min_agents": 3,
|
76 |
+
"max_agents": 7,
|
77 |
+
"capabilities": [
|
78 |
+
"full_stack_development",
|
79 |
+
"cloud_architecture",
|
80 |
+
"ai_ml",
|
81 |
+
"blockchain",
|
82 |
+
"mobile_development"
|
83 |
+
],
|
84 |
+
"resource_limits": {
|
85 |
+
"cpu_percent": 80,
|
86 |
+
"memory_mb": 4096,
|
87 |
+
"gpu_memory_mb": 2048
|
88 |
+
}
|
89 |
+
},
|
90 |
+
"business": {
|
91 |
+
"min_agents": 2,
|
92 |
+
"max_agents": 5,
|
93 |
+
"capabilities": [
|
94 |
+
"market_analysis",
|
95 |
+
"business_strategy",
|
96 |
+
"digital_transformation",
|
97 |
+
"startup_innovation",
|
98 |
+
"product_management"
|
99 |
+
],
|
100 |
+
"resource_limits": {
|
101 |
+
"cpu_percent": 60,
|
102 |
+
"memory_mb": 2048,
|
103 |
+
"api_calls_per_minute": 100
|
104 |
+
}
|
105 |
+
},
|
106 |
+
"research": {
|
107 |
+
"min_agents": 2,
|
108 |
+
"max_agents": 6,
|
109 |
+
"capabilities": [
|
110 |
+
"deep_research",
|
111 |
+
"data_analysis",
|
112 |
+
"trend_forecasting",
|
113 |
+
"competitive_analysis",
|
114 |
+
"technology_assessment"
|
115 |
+
],
|
116 |
+
"resource_limits": {
|
117 |
+
"cpu_percent": 70,
|
118 |
+
"memory_mb": 3072,
|
119 |
+
"api_calls_per_minute": 150
|
120 |
+
}
|
121 |
+
},
|
122 |
+
"traders": {
|
123 |
+
"min_agents": 2,
|
124 |
+
"max_agents": 5,
|
125 |
+
"capabilities": [
|
126 |
+
"crypto_trading",
|
127 |
+
"sports_betting",
|
128 |
+
"risk_management",
|
129 |
+
"market_timing",
|
130 |
+
"portfolio_optimization"
|
131 |
+
],
|
132 |
+
"resource_limits": {
|
133 |
+
"cpu_percent": 60,
|
134 |
+
"memory_mb": 2048,
|
135 |
+
"api_calls_per_minute": 200
|
136 |
+
}
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
# Resource Management
|
141 |
+
RESOURCE_LIMITS = {
|
142 |
+
"total_cpu_percent": 90,
|
143 |
+
"total_memory_mb": 8192,
|
144 |
+
"total_gpu_memory_mb": 4096,
|
145 |
+
"max_api_calls_per_minute": 500,
|
146 |
+
"max_concurrent_tasks": 20
|
147 |
+
}
|
148 |
+
|
149 |
+
# Collaboration Settings
|
150 |
+
COLLABORATION_CONFIG = {
|
151 |
+
"min_confidence_threshold": 0.6,
|
152 |
+
"max_team_size": 10,
|
153 |
+
"max_concurrent_objectives": 5,
|
154 |
+
"objective_timeout_minutes": 60,
|
155 |
+
"team_sync_interval_seconds": 30
|
156 |
+
}
|
157 |
+
|
158 |
+
# Error Recovery
|
159 |
+
ERROR_RECOVERY = {
|
160 |
+
"max_retries": 3,
|
161 |
+
"retry_delay_seconds": 5,
|
162 |
+
"error_threshold": 0.2,
|
163 |
+
"recovery_timeout": 300
|
164 |
+
}
|
165 |
+
|
166 |
+
# Monitoring
|
167 |
+
MONITORING = {
|
168 |
+
"metrics_interval_seconds": 60,
|
169 |
+
"health_check_interval": 30,
|
170 |
+
"performance_log_retention_days": 7,
|
171 |
+
"alert_threshold": {
|
172 |
+
"cpu": 85,
|
173 |
+
"memory": 90,
|
174 |
+
"error_rate": 0.1
|
175 |
+
}
|
176 |
+
}
|
177 |
+
|
178 |
+
# Free API Configurations (No API Keys Required)
|
179 |
+
API_CONFIG = {
|
180 |
+
"search": {
|
181 |
+
"duckduckgo": {
|
182 |
+
"base_url": "https://api.duckduckgo.com",
|
183 |
+
"rate_limit": 100,
|
184 |
+
"requires_auth": False,
|
185 |
+
"method": "GET"
|
186 |
+
},
|
187 |
+
"wikipedia": {
|
188 |
+
"base_url": "https://en.wikipedia.org/w/api.php",
|
189 |
+
"rate_limit": 200,
|
190 |
+
"requires_auth": False,
|
191 |
+
"method": "GET"
|
192 |
+
},
|
193 |
+
"arxiv": {
|
194 |
+
"base_url": "http://export.arxiv.org/api/query",
|
195 |
+
"rate_limit": 60,
|
196 |
+
"requires_auth": False,
|
197 |
+
"method": "GET"
|
198 |
+
},
|
199 |
+
"crossref": {
|
200 |
+
"base_url": "https://api.crossref.org/works",
|
201 |
+
"rate_limit": 50,
|
202 |
+
"requires_auth": False,
|
203 |
+
"method": "GET"
|
204 |
+
},
|
205 |
+
"unpaywall": {
|
206 |
+
"base_url": "https://api.unpaywall.org/v2",
|
207 |
+
"rate_limit": 100,
|
208 |
+
"requires_auth": False,
|
209 |
+
"method": "GET"
|
210 |
+
}
|
211 |
+
},
|
212 |
+
"crypto": {
|
213 |
+
"coincap": {
|
214 |
+
"base_url": "https://api.coincap.io/v2",
|
215 |
+
"rate_limit": 200,
|
216 |
+
"requires_auth": False,
|
217 |
+
"method": "GET",
|
218 |
+
"endpoints": {
|
219 |
+
"assets": "/assets",
|
220 |
+
"rates": "/rates",
|
221 |
+
"markets": "/markets"
|
222 |
+
}
|
223 |
+
},
|
224 |
+
"blockchair": {
|
225 |
+
"base_url": "https://api.blockchair.com",
|
226 |
+
"rate_limit": 30,
|
227 |
+
"requires_auth": False,
|
228 |
+
"method": "GET"
|
229 |
+
}
|
230 |
+
},
|
231 |
+
"news": {
|
232 |
+
"wikinews": {
|
233 |
+
"base_url": "https://en.wikinews.org/w/api.php",
|
234 |
+
"rate_limit": 200,
|
235 |
+
"requires_auth": False,
|
236 |
+
"method": "GET"
|
237 |
+
},
|
238 |
+
"reddit": {
|
239 |
+
"base_url": "https://www.reddit.com/r/news/.json",
|
240 |
+
"rate_limit": 60,
|
241 |
+
"requires_auth": False,
|
242 |
+
"method": "GET"
|
243 |
+
},
|
244 |
+
"hackernews": {
|
245 |
+
"base_url": "https://hacker-news.firebaseio.com/v0",
|
246 |
+
"rate_limit": 100,
|
247 |
+
"requires_auth": False,
|
248 |
+
"method": "GET"
|
249 |
+
}
|
250 |
+
},
|
251 |
+
"market_data": {
|
252 |
+
"yahoo_finance": {
|
253 |
+
"base_url": "https://query1.finance.yahoo.com/v8/finance",
|
254 |
+
"rate_limit": 100,
|
255 |
+
"requires_auth": False,
|
256 |
+
"method": "GET"
|
257 |
+
},
|
258 |
+
"marketstack_free": {
|
259 |
+
"base_url": "https://api.marketstack.com/v1",
|
260 |
+
"rate_limit": 100,
|
261 |
+
"requires_auth": False,
|
262 |
+
"method": "GET"
|
263 |
+
}
|
264 |
+
},
|
265 |
+
"sports": {
|
266 |
+
"football_data": {
|
267 |
+
"base_url": "https://www.football-data.org/v4",
|
268 |
+
"rate_limit": 10,
|
269 |
+
"requires_auth": False,
|
270 |
+
"method": "GET",
|
271 |
+
"free_endpoints": [
|
272 |
+
"/competitions",
|
273 |
+
"/matches"
|
274 |
+
]
|
275 |
+
},
|
276 |
+
"nhl": {
|
277 |
+
"base_url": "https://statsapi.web.nhl.com/api/v1",
|
278 |
+
"rate_limit": 50,
|
279 |
+
"requires_auth": False,
|
280 |
+
"method": "GET"
|
281 |
+
},
|
282 |
+
"mlb": {
|
283 |
+
"base_url": "https://statsapi.mlb.com/api/v1",
|
284 |
+
"rate_limit": 50,
|
285 |
+
"requires_auth": False,
|
286 |
+
"method": "GET"
|
287 |
+
}
|
288 |
+
},
|
289 |
+
"web_scraping": {
|
290 |
+
"web_archive": {
|
291 |
+
"base_url": "https://archive.org/wayback/available",
|
292 |
+
"rate_limit": 40,
|
293 |
+
"requires_auth": False,
|
294 |
+
"method": "GET"
|
295 |
+
},
|
296 |
+
"metahtml": {
|
297 |
+
"base_url": "https://html.spec.whatwg.org/multipage",
|
298 |
+
"rate_limit": 30,
|
299 |
+
"requires_auth": False,
|
300 |
+
"method": "GET"
|
301 |
+
}
|
302 |
+
}
|
303 |
+
}
|
304 |
+
|
305 |
+
@classmethod
|
306 |
+
def get_team_config(cls, team_name: str) -> Dict[str, Any]:
|
307 |
+
"""Get configuration for a specific team."""
|
308 |
+
return cls.TEAM_CONFIG.get(team_name, {})
|
309 |
+
|
310 |
+
@classmethod
|
311 |
+
def get_model_config(cls, model_type: str) -> Dict[str, Any]:
|
312 |
+
"""Get configuration for a specific model type."""
|
313 |
+
return cls.MODEL_CONFIG.get(model_type, {})
|
314 |
+
|
315 |
+
@classmethod
|
316 |
+
def get_api_config(cls, api_name: str) -> Dict[str, Any]:
|
317 |
+
"""Get configuration for a specific API."""
|
318 |
+
for category in cls.API_CONFIG.values():
|
319 |
+
if api_name in category:
|
320 |
+
return category[api_name]
|
321 |
+
return {}
|
fix_indentation.patch
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
--- reasoning.py
|
2 |
+
+++ reasoning.py
|
3 |
+
@@ -2796,297 +2796,297 @@
|
4 |
+
async def _cross_modal_alignment(self, modalities: Dict[str, List[Dict[str, Any]]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
5 |
+
"""Align information across different modalities."""
|
6 |
+
try:
|
7 |
+
# Extract modality types
|
8 |
+
modal_types = list(modalities.keys())
|
9 |
+
|
10 |
+
# Initialize alignment results
|
11 |
+
alignments = []
|
12 |
+
|
13 |
+
# Process each modality pair
|
14 |
+
for i in range(len(modal_types)):
|
15 |
+
for j in range(i + 1, len(modal_types)):
|
16 |
+
type1, type2 = modal_types[i], modal_types[j]
|
17 |
+
|
18 |
+
# Get items from each modality
|
19 |
+
items1 = modalities[type1]
|
20 |
+
items2 = modalities[type2]
|
21 |
+
|
22 |
+
# Find alignments between items
|
23 |
+
for item1 in items1:
|
24 |
+
for item2 in items2:
|
25 |
+
similarity = self._calculate_similarity(item1, item2)
|
26 |
+
if similarity > 0.5: # Threshold for alignment
|
27 |
+
alignments.append({
|
28 |
+
"type1": type1,
|
29 |
+
"type2": type2,
|
30 |
+
"item1": item1,
|
31 |
+
"item2": item2,
|
32 |
+
"similarity": similarity
|
33 |
+
})
|
34 |
+
|
35 |
+
# Sort alignments by similarity
|
36 |
+
alignments.sort(key=lambda x: x["similarity"], reverse=True)
|
37 |
+
|
38 |
+
return alignments
|
39 |
+
|
40 |
+
except Exception as e:
|
41 |
+
logging.error(f"Error in cross-modal alignment: {str(e)}")
|
42 |
+
return []
|
meta_learning.py
ADDED
@@ -0,0 +1,406 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Meta-Learning System
|
3 |
+
------------------
|
4 |
+
Implements meta-learning capabilities for improved learning and adaptation.
|
5 |
+
"""
|
6 |
+
|
7 |
+
from typing import Dict, Any, List, Optional, Tuple
|
8 |
+
import numpy as np
|
9 |
+
from dataclasses import dataclass, field
|
10 |
+
import logging
|
11 |
+
from datetime import datetime
|
12 |
+
from enum import Enum
|
13 |
+
import json
|
14 |
+
from .quantum_learning import QuantumLearningSystem, Pattern, PatternType
|
15 |
+
|
16 |
+
class LearningStrategy(Enum):
|
17 |
+
GRADIENT_BASED = "gradient_based"
|
18 |
+
MEMORY_BASED = "memory_based"
|
19 |
+
EVOLUTIONARY = "evolutionary"
|
20 |
+
REINFORCEMENT = "reinforcement"
|
21 |
+
QUANTUM = "quantum"
|
22 |
+
|
23 |
+
@dataclass
|
24 |
+
class MetaParameters:
|
25 |
+
"""Meta-parameters for learning strategies"""
|
26 |
+
learning_rate: float = 0.01
|
27 |
+
memory_size: int = 1000
|
28 |
+
evolution_rate: float = 0.1
|
29 |
+
exploration_rate: float = 0.2
|
30 |
+
quantum_interference: float = 0.5
|
31 |
+
adaptation_threshold: float = 0.7
|
32 |
+
|
33 |
+
@dataclass
|
34 |
+
class LearningMetrics:
|
35 |
+
"""Metrics for learning performance"""
|
36 |
+
accuracy: float
|
37 |
+
convergence_rate: float
|
38 |
+
adaptation_speed: float
|
39 |
+
resource_usage: float
|
40 |
+
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
|
41 |
+
|
42 |
+
class MetaLearningSystem:
|
43 |
+
"""Meta-learning system for optimizing learning strategies"""
|
44 |
+
|
45 |
+
def __init__(self):
|
46 |
+
self.logger = logging.getLogger(__name__)
|
47 |
+
self.quantum_system = QuantumLearningSystem()
|
48 |
+
self.strategies = {}
|
49 |
+
self.performance_history = []
|
50 |
+
self.meta_parameters = MetaParameters()
|
51 |
+
|
52 |
+
async def optimize_learning(
|
53 |
+
self,
|
54 |
+
observation: Dict[str, Any],
|
55 |
+
current_strategy: LearningStrategy
|
56 |
+
) -> Tuple[Dict[str, Any], LearningMetrics]:
|
57 |
+
"""Optimize learning strategy based on observation"""
|
58 |
+
try:
|
59 |
+
# Process with quantum system
|
60 |
+
quantum_result = await self.quantum_system.process_observation(observation)
|
61 |
+
|
62 |
+
# Evaluate current strategy
|
63 |
+
current_metrics = self._evaluate_strategy(
|
64 |
+
current_strategy,
|
65 |
+
observation,
|
66 |
+
quantum_result
|
67 |
+
)
|
68 |
+
|
69 |
+
# Update performance history
|
70 |
+
self._update_performance_history(current_metrics)
|
71 |
+
|
72 |
+
# Adapt meta-parameters
|
73 |
+
self._adapt_meta_parameters(current_metrics)
|
74 |
+
|
75 |
+
# Select optimal strategy
|
76 |
+
optimal_strategy = self._select_optimal_strategy(
|
77 |
+
observation,
|
78 |
+
current_metrics
|
79 |
+
)
|
80 |
+
|
81 |
+
# Apply selected strategy
|
82 |
+
result = await self._apply_strategy(
|
83 |
+
optimal_strategy,
|
84 |
+
observation,
|
85 |
+
quantum_result
|
86 |
+
)
|
87 |
+
|
88 |
+
return result, current_metrics
|
89 |
+
|
90 |
+
except Exception as e:
|
91 |
+
self.logger.error(f"Failed to optimize learning: {str(e)}")
|
92 |
+
raise
|
93 |
+
|
94 |
+
def _evaluate_strategy(
|
95 |
+
self,
|
96 |
+
strategy: LearningStrategy,
|
97 |
+
observation: Dict[str, Any],
|
98 |
+
quantum_result: Dict[str, Any]
|
99 |
+
) -> LearningMetrics:
|
100 |
+
"""Evaluate performance of current learning strategy"""
|
101 |
+
# Calculate accuracy
|
102 |
+
accuracy = self._calculate_accuracy(
|
103 |
+
strategy,
|
104 |
+
observation,
|
105 |
+
quantum_result
|
106 |
+
)
|
107 |
+
|
108 |
+
# Calculate convergence rate
|
109 |
+
convergence_rate = self._calculate_convergence_rate(
|
110 |
+
strategy,
|
111 |
+
self.performance_history
|
112 |
+
)
|
113 |
+
|
114 |
+
# Calculate adaptation speed
|
115 |
+
adaptation_speed = self._calculate_adaptation_speed(
|
116 |
+
strategy,
|
117 |
+
observation
|
118 |
+
)
|
119 |
+
|
120 |
+
# Calculate resource usage
|
121 |
+
resource_usage = self._calculate_resource_usage(strategy)
|
122 |
+
|
123 |
+
return LearningMetrics(
|
124 |
+
accuracy=accuracy,
|
125 |
+
convergence_rate=convergence_rate,
|
126 |
+
adaptation_speed=adaptation_speed,
|
127 |
+
resource_usage=resource_usage
|
128 |
+
)
|
129 |
+
|
130 |
+
def _update_performance_history(
|
131 |
+
self,
|
132 |
+
metrics: LearningMetrics
|
133 |
+
) -> None:
|
134 |
+
"""Update performance history with new metrics"""
|
135 |
+
self.performance_history.append(metrics)
|
136 |
+
|
137 |
+
# Maintain history size
|
138 |
+
if len(self.performance_history) > self.meta_parameters.memory_size:
|
139 |
+
self.performance_history.pop(0)
|
140 |
+
|
141 |
+
def _adapt_meta_parameters(
|
142 |
+
self,
|
143 |
+
metrics: LearningMetrics
|
144 |
+
) -> None:
|
145 |
+
"""Adapt meta-parameters based on performance metrics"""
|
146 |
+
# Adjust learning rate
|
147 |
+
if metrics.convergence_rate < self.meta_parameters.adaptation_threshold:
|
148 |
+
self.meta_parameters.learning_rate *= 0.9
|
149 |
+
else:
|
150 |
+
self.meta_parameters.learning_rate *= 1.1
|
151 |
+
|
152 |
+
# Adjust memory size
|
153 |
+
if metrics.resource_usage > 0.8:
|
154 |
+
self.meta_parameters.memory_size = int(
|
155 |
+
self.meta_parameters.memory_size * 0.9
|
156 |
+
)
|
157 |
+
elif metrics.resource_usage < 0.2:
|
158 |
+
self.meta_parameters.memory_size = int(
|
159 |
+
self.meta_parameters.memory_size * 1.1
|
160 |
+
)
|
161 |
+
|
162 |
+
# Adjust evolution rate
|
163 |
+
if metrics.adaptation_speed < self.meta_parameters.adaptation_threshold:
|
164 |
+
self.meta_parameters.evolution_rate *= 1.1
|
165 |
+
else:
|
166 |
+
self.meta_parameters.evolution_rate *= 0.9
|
167 |
+
|
168 |
+
# Adjust exploration rate
|
169 |
+
if metrics.accuracy < self.meta_parameters.adaptation_threshold:
|
170 |
+
self.meta_parameters.exploration_rate *= 1.1
|
171 |
+
else:
|
172 |
+
self.meta_parameters.exploration_rate *= 0.9
|
173 |
+
|
174 |
+
# Adjust quantum interference
|
175 |
+
if metrics.accuracy > 0.8:
|
176 |
+
self.meta_parameters.quantum_interference *= 1.1
|
177 |
+
else:
|
178 |
+
self.meta_parameters.quantum_interference *= 0.9
|
179 |
+
|
180 |
+
# Ensure parameters stay within reasonable bounds
|
181 |
+
self._normalize_parameters()
|
182 |
+
|
183 |
+
def _normalize_parameters(self) -> None:
|
184 |
+
"""Normalize meta-parameters to stay within bounds"""
|
185 |
+
self.meta_parameters.learning_rate = np.clip(
|
186 |
+
self.meta_parameters.learning_rate,
|
187 |
+
0.001,
|
188 |
+
0.1
|
189 |
+
)
|
190 |
+
self.meta_parameters.memory_size = np.clip(
|
191 |
+
self.meta_parameters.memory_size,
|
192 |
+
100,
|
193 |
+
10000
|
194 |
+
)
|
195 |
+
self.meta_parameters.evolution_rate = np.clip(
|
196 |
+
self.meta_parameters.evolution_rate,
|
197 |
+
0.01,
|
198 |
+
0.5
|
199 |
+
)
|
200 |
+
self.meta_parameters.exploration_rate = np.clip(
|
201 |
+
self.meta_parameters.exploration_rate,
|
202 |
+
0.1,
|
203 |
+
0.9
|
204 |
+
)
|
205 |
+
self.meta_parameters.quantum_interference = np.clip(
|
206 |
+
self.meta_parameters.quantum_interference,
|
207 |
+
0.1,
|
208 |
+
0.9
|
209 |
+
)
|
210 |
+
|
211 |
+
def _select_optimal_strategy(
|
212 |
+
self,
|
213 |
+
observation: Dict[str, Any],
|
214 |
+
metrics: LearningMetrics
|
215 |
+
) -> LearningStrategy:
|
216 |
+
"""Select optimal learning strategy"""
|
217 |
+
strategies = list(LearningStrategy)
|
218 |
+
scores = []
|
219 |
+
|
220 |
+
for strategy in strategies:
|
221 |
+
# Calculate strategy score
|
222 |
+
score = self._calculate_strategy_score(
|
223 |
+
strategy,
|
224 |
+
observation,
|
225 |
+
metrics
|
226 |
+
)
|
227 |
+
scores.append((strategy, score))
|
228 |
+
|
229 |
+
# Select strategy with highest score
|
230 |
+
optimal_strategy = max(scores, key=lambda x: x[1])[0]
|
231 |
+
|
232 |
+
return optimal_strategy
|
233 |
+
|
234 |
+
async def _apply_strategy(
|
235 |
+
self,
|
236 |
+
strategy: LearningStrategy,
|
237 |
+
observation: Dict[str, Any],
|
238 |
+
quantum_result: Dict[str, Any]
|
239 |
+
) -> Dict[str, Any]:
|
240 |
+
"""Apply selected learning strategy"""
|
241 |
+
if strategy == LearningStrategy.GRADIENT_BASED:
|
242 |
+
return await self._apply_gradient_strategy(
|
243 |
+
observation,
|
244 |
+
quantum_result
|
245 |
+
)
|
246 |
+
elif strategy == LearningStrategy.MEMORY_BASED:
|
247 |
+
return await self._apply_memory_strategy(
|
248 |
+
observation,
|
249 |
+
quantum_result
|
250 |
+
)
|
251 |
+
elif strategy == LearningStrategy.EVOLUTIONARY:
|
252 |
+
return await self._apply_evolutionary_strategy(
|
253 |
+
observation,
|
254 |
+
quantum_result
|
255 |
+
)
|
256 |
+
elif strategy == LearningStrategy.REINFORCEMENT:
|
257 |
+
return await self._apply_reinforcement_strategy(
|
258 |
+
observation,
|
259 |
+
quantum_result
|
260 |
+
)
|
261 |
+
else: # QUANTUM
|
262 |
+
return quantum_result
|
263 |
+
|
264 |
+
def _calculate_accuracy(
|
265 |
+
self,
|
266 |
+
strategy: LearningStrategy,
|
267 |
+
observation: Dict[str, Any],
|
268 |
+
quantum_result: Dict[str, Any]
|
269 |
+
) -> float:
|
270 |
+
"""Calculate accuracy of learning strategy"""
|
271 |
+
if "patterns" not in quantum_result:
|
272 |
+
return 0.0
|
273 |
+
|
274 |
+
patterns = quantum_result["patterns"]
|
275 |
+
if not patterns:
|
276 |
+
return 0.0
|
277 |
+
|
278 |
+
# Calculate pattern confidence
|
279 |
+
confidence_sum = sum(pattern.confidence for pattern in patterns)
|
280 |
+
return confidence_sum / len(patterns)
|
281 |
+
|
282 |
+
def _calculate_convergence_rate(
|
283 |
+
self,
|
284 |
+
strategy: LearningStrategy,
|
285 |
+
history: List[LearningMetrics]
|
286 |
+
) -> float:
|
287 |
+
"""Calculate convergence rate of learning strategy"""
|
288 |
+
if not history:
|
289 |
+
return 0.0
|
290 |
+
|
291 |
+
# Calculate rate of improvement
|
292 |
+
accuracies = [metrics.accuracy for metrics in history[-10:]]
|
293 |
+
if len(accuracies) < 2:
|
294 |
+
return 0.0
|
295 |
+
|
296 |
+
differences = np.diff(accuracies)
|
297 |
+
return float(np.mean(differences > 0))
|
298 |
+
|
299 |
+
def _calculate_adaptation_speed(
|
300 |
+
self,
|
301 |
+
strategy: LearningStrategy,
|
302 |
+
observation: Dict[str, Any]
|
303 |
+
) -> float:
|
304 |
+
"""Calculate adaptation speed of learning strategy"""
|
305 |
+
if not self.performance_history:
|
306 |
+
return 0.0
|
307 |
+
|
308 |
+
# Calculate time to reach adaptation threshold
|
309 |
+
threshold = self.meta_parameters.adaptation_threshold
|
310 |
+
for i, metrics in enumerate(self.performance_history):
|
311 |
+
if metrics.accuracy >= threshold:
|
312 |
+
return 1.0 / (i + 1)
|
313 |
+
|
314 |
+
return 0.0
|
315 |
+
|
316 |
+
def _calculate_resource_usage(
|
317 |
+
self,
|
318 |
+
strategy: LearningStrategy
|
319 |
+
) -> float:
|
320 |
+
"""Calculate resource usage of learning strategy"""
|
321 |
+
# Simulate resource usage based on strategy
|
322 |
+
base_usage = {
|
323 |
+
LearningStrategy.GRADIENT_BASED: 0.4,
|
324 |
+
LearningStrategy.MEMORY_BASED: 0.6,
|
325 |
+
LearningStrategy.EVOLUTIONARY: 0.7,
|
326 |
+
LearningStrategy.REINFORCEMENT: 0.5,
|
327 |
+
LearningStrategy.QUANTUM: 0.8
|
328 |
+
}
|
329 |
+
|
330 |
+
return base_usage[strategy]
|
331 |
+
|
332 |
+
def _calculate_strategy_score(
|
333 |
+
self,
|
334 |
+
strategy: LearningStrategy,
|
335 |
+
observation: Dict[str, Any],
|
336 |
+
metrics: LearningMetrics
|
337 |
+
) -> float:
|
338 |
+
"""Calculate score for learning strategy"""
|
339 |
+
# Weight different factors
|
340 |
+
weights = {
|
341 |
+
"accuracy": 0.4,
|
342 |
+
"convergence": 0.2,
|
343 |
+
"adaptation": 0.2,
|
344 |
+
"resources": 0.2
|
345 |
+
}
|
346 |
+
|
347 |
+
score = (
|
348 |
+
weights["accuracy"] * metrics.accuracy +
|
349 |
+
weights["convergence"] * metrics.convergence_rate +
|
350 |
+
weights["adaptation"] * metrics.adaptation_speed +
|
351 |
+
weights["resources"] * (1 - metrics.resource_usage)
|
352 |
+
)
|
353 |
+
|
354 |
+
# Add exploration bonus
|
355 |
+
if np.random.random() < self.meta_parameters.exploration_rate:
|
356 |
+
score += 0.1
|
357 |
+
|
358 |
+
return score
|
359 |
+
|
360 |
+
async def _apply_gradient_strategy(
|
361 |
+
self,
|
362 |
+
observation: Dict[str, Any],
|
363 |
+
quantum_result: Dict[str, Any]
|
364 |
+
) -> Dict[str, Any]:
|
365 |
+
"""Apply gradient-based learning strategy"""
|
366 |
+
return {
|
367 |
+
"result": "gradient_optimization",
|
368 |
+
"quantum_enhanced": quantum_result,
|
369 |
+
"meta_parameters": self.meta_parameters.__dict__
|
370 |
+
}
|
371 |
+
|
372 |
+
async def _apply_memory_strategy(
|
373 |
+
self,
|
374 |
+
observation: Dict[str, Any],
|
375 |
+
quantum_result: Dict[str, Any]
|
376 |
+
) -> Dict[str, Any]:
|
377 |
+
"""Apply memory-based learning strategy"""
|
378 |
+
return {
|
379 |
+
"result": "memory_optimization",
|
380 |
+
"quantum_enhanced": quantum_result,
|
381 |
+
"meta_parameters": self.meta_parameters.__dict__
|
382 |
+
}
|
383 |
+
|
384 |
+
async def _apply_evolutionary_strategy(
|
385 |
+
self,
|
386 |
+
observation: Dict[str, Any],
|
387 |
+
quantum_result: Dict[str, Any]
|
388 |
+
) -> Dict[str, Any]:
|
389 |
+
"""Apply evolutionary learning strategy"""
|
390 |
+
return {
|
391 |
+
"result": "evolutionary_optimization",
|
392 |
+
"quantum_enhanced": quantum_result,
|
393 |
+
"meta_parameters": self.meta_parameters.__dict__
|
394 |
+
}
|
395 |
+
|
396 |
+
async def _apply_reinforcement_strategy(
|
397 |
+
self,
|
398 |
+
observation: Dict[str, Any],
|
399 |
+
quantum_result: Dict[str, Any]
|
400 |
+
) -> Dict[str, Any]:
|
401 |
+
"""Apply reinforcement learning strategy"""
|
402 |
+
return {
|
403 |
+
"result": "reinforcement_optimization",
|
404 |
+
"quantum_enhanced": quantum_result,
|
405 |
+
"meta_parameters": self.meta_parameters.__dict__
|
406 |
+
}
|
multimodal_reasoning.py
ADDED
@@ -0,0 +1,273 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Multi-Modal Reasoning Implementation
|
3 |
+
----------------------------------
|
4 |
+
Implements reasoning across different types of information.
|
5 |
+
"""
|
6 |
+
|
7 |
+
import logging
|
8 |
+
from typing import Dict, Any, List
|
9 |
+
from datetime import datetime
|
10 |
+
import json
|
11 |
+
import numpy as np
|
12 |
+
from .reasoning import ReasoningStrategy
|
13 |
+
|
14 |
+
class MultiModalReasoning(ReasoningStrategy):
|
15 |
+
"""Implements multi-modal reasoning across different types of information."""
|
16 |
+
|
17 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
18 |
+
try:
|
19 |
+
# Process different modalities
|
20 |
+
modalities = await self._process_modalities(query, context)
|
21 |
+
|
22 |
+
# Align across modalities
|
23 |
+
alignment = await self._cross_modal_alignment(modalities, context)
|
24 |
+
|
25 |
+
# Integrated analysis
|
26 |
+
integration = await self._integrated_analysis(alignment, context)
|
27 |
+
|
28 |
+
# Generate final response
|
29 |
+
response = await self._generate_response(integration, context)
|
30 |
+
|
31 |
+
return {
|
32 |
+
"success": True,
|
33 |
+
"answer": response["conclusion"],
|
34 |
+
"modalities": modalities,
|
35 |
+
"alignment": alignment,
|
36 |
+
"integration": integration,
|
37 |
+
"confidence": response["confidence"]
|
38 |
+
}
|
39 |
+
except Exception as e:
|
40 |
+
logging.error(f"Error in multi-modal reasoning: {str(e)}")
|
41 |
+
return {"success": False, "error": str(e)}
|
42 |
+
|
43 |
+
async def _process_modalities(self, query: str, context: Dict[str, Any]) -> Dict[str, List[Dict[str, Any]]]:
|
44 |
+
"""Process query across different modalities."""
|
45 |
+
prompt = f"""
|
46 |
+
Process query across modalities:
|
47 |
+
Query: {query}
|
48 |
+
Context: {json.dumps(context)}
|
49 |
+
|
50 |
+
For each modality extract:
|
51 |
+
1. [Type]: Modality type
|
52 |
+
2. [Content]: Relevant content
|
53 |
+
3. [Features]: Key features
|
54 |
+
4. [Quality]: Content quality
|
55 |
+
|
56 |
+
Format as:
|
57 |
+
[M1]
|
58 |
+
Type: ...
|
59 |
+
Content: ...
|
60 |
+
Features: ...
|
61 |
+
Quality: ...
|
62 |
+
"""
|
63 |
+
|
64 |
+
response = await context["groq_api"].predict(prompt)
|
65 |
+
return self._parse_modalities(response["answer"])
|
66 |
+
|
67 |
+
async def _cross_modal_alignment(self, modalities: Dict[str, List[Dict[str, Any]]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
68 |
+
"""Align information across different modalities."""
|
69 |
+
try:
|
70 |
+
# Extract modality types
|
71 |
+
modal_types = list(modalities.keys())
|
72 |
+
|
73 |
+
# Initialize alignment results
|
74 |
+
alignments = []
|
75 |
+
|
76 |
+
# Process each modality pair
|
77 |
+
for i in range(len(modal_types)):
|
78 |
+
for j in range(i + 1, len(modal_types)):
|
79 |
+
type1, type2 = modal_types[i], modal_types[j]
|
80 |
+
|
81 |
+
# Get items from each modality
|
82 |
+
items1 = modalities[type1]
|
83 |
+
items2 = modalities[type2]
|
84 |
+
|
85 |
+
# Find alignments between items
|
86 |
+
for item1 in items1:
|
87 |
+
for item2 in items2:
|
88 |
+
similarity = self._calculate_similarity(item1, item2)
|
89 |
+
if similarity > 0.5: # Threshold for alignment
|
90 |
+
alignments.append({
|
91 |
+
"type1": type1,
|
92 |
+
"type2": type2,
|
93 |
+
"item1": item1,
|
94 |
+
"item2": item2,
|
95 |
+
"similarity": similarity
|
96 |
+
})
|
97 |
+
|
98 |
+
# Sort alignments by similarity
|
99 |
+
alignments.sort(key=lambda x: x["similarity"], reverse=True)
|
100 |
+
|
101 |
+
return alignments
|
102 |
+
|
103 |
+
except Exception as e:
|
104 |
+
logging.error(f"Error in cross-modal alignment: {str(e)}")
|
105 |
+
return []
|
106 |
+
|
107 |
+
def _calculate_similarity(self, item1: Dict[str, Any], item2: Dict[str, Any]) -> float:
|
108 |
+
"""Calculate similarity between two items from different modalities."""
|
109 |
+
try:
|
110 |
+
# Extract content from items
|
111 |
+
content1 = str(item1.get("content", ""))
|
112 |
+
content2 = str(item2.get("content", ""))
|
113 |
+
|
114 |
+
# Calculate basic similarity (can be enhanced with more sophisticated methods)
|
115 |
+
common_words = set(content1.lower().split()) & set(content2.lower().split())
|
116 |
+
total_words = set(content1.lower().split()) | set(content2.lower().split())
|
117 |
+
|
118 |
+
if not total_words:
|
119 |
+
return 0.0
|
120 |
+
|
121 |
+
return len(common_words) / len(total_words)
|
122 |
+
|
123 |
+
except Exception as e:
|
124 |
+
logging.error(f"Error calculating similarity: {str(e)}")
|
125 |
+
return 0.0
|
126 |
+
|
127 |
+
async def _integrated_analysis(self, alignment: List[Dict[str, Any]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
128 |
+
prompt = f"""
|
129 |
+
Perform integrated multi-modal analysis:
|
130 |
+
Alignment: {json.dumps(alignment)}
|
131 |
+
Context: {json.dumps(context)}
|
132 |
+
|
133 |
+
For each insight:
|
134 |
+
1. [Insight]: Key finding
|
135 |
+
2. [Sources]: Contributing modalities
|
136 |
+
3. [Support]: Supporting evidence
|
137 |
+
4. [Confidence]: Confidence level
|
138 |
+
|
139 |
+
Format as:
|
140 |
+
[I1]
|
141 |
+
Insight: ...
|
142 |
+
Sources: ...
|
143 |
+
Support: ...
|
144 |
+
Confidence: ...
|
145 |
+
"""
|
146 |
+
|
147 |
+
response = await context["groq_api"].predict(prompt)
|
148 |
+
return self._parse_integration(response["answer"])
|
149 |
+
|
150 |
+
async def _generate_response(self, integration: List[Dict[str, Any]], context: Dict[str, Any]) -> Dict[str, Any]:
|
151 |
+
prompt = f"""
|
152 |
+
Generate unified multi-modal response:
|
153 |
+
Integration: {json.dumps(integration)}
|
154 |
+
Context: {json.dumps(context)}
|
155 |
+
|
156 |
+
Provide:
|
157 |
+
1. Main conclusion
|
158 |
+
2. Modal contributions
|
159 |
+
3. Integration benefits
|
160 |
+
4. Confidence level (0-1)
|
161 |
+
"""
|
162 |
+
|
163 |
+
response = await context["groq_api"].predict(prompt)
|
164 |
+
return self._parse_response(response["answer"])
|
165 |
+
|
166 |
+
def _parse_modalities(self, response: str) -> Dict[str, List[Dict[str, Any]]]:
|
167 |
+
"""Parse modalities from response."""
|
168 |
+
modalities = {}
|
169 |
+
current_modality = None
|
170 |
+
|
171 |
+
for line in response.split('\n'):
|
172 |
+
line = line.strip()
|
173 |
+
if not line:
|
174 |
+
continue
|
175 |
+
|
176 |
+
if line.startswith('[M'):
|
177 |
+
if current_modality:
|
178 |
+
if current_modality["type"] not in modalities:
|
179 |
+
modalities[current_modality["type"]] = []
|
180 |
+
modalities[current_modality["type"]].append(current_modality)
|
181 |
+
current_modality = {
|
182 |
+
"type": "",
|
183 |
+
"content": "",
|
184 |
+
"features": "",
|
185 |
+
"quality": ""
|
186 |
+
}
|
187 |
+
elif current_modality:
|
188 |
+
if line.startswith('Type:'):
|
189 |
+
current_modality["type"] = line[5:].strip()
|
190 |
+
elif line.startswith('Content:'):
|
191 |
+
current_modality["content"] = line[8:].strip()
|
192 |
+
elif line.startswith('Features:'):
|
193 |
+
current_modality["features"] = line[9:].strip()
|
194 |
+
elif line.startswith('Quality:'):
|
195 |
+
current_modality["quality"] = line[8:].strip()
|
196 |
+
|
197 |
+
if current_modality:
|
198 |
+
if current_modality["type"] not in modalities:
|
199 |
+
modalities[current_modality["type"]] = []
|
200 |
+
modalities[current_modality["type"]].append(current_modality)
|
201 |
+
|
202 |
+
return modalities
|
203 |
+
|
204 |
+
def _parse_integration(self, response: str) -> List[Dict[str, Any]]:
|
205 |
+
"""Parse integration from response."""
|
206 |
+
integration = []
|
207 |
+
current_insight = None
|
208 |
+
|
209 |
+
for line in response.split('\n'):
|
210 |
+
line = line.strip()
|
211 |
+
if not line:
|
212 |
+
continue
|
213 |
+
|
214 |
+
if line.startswith('[I'):
|
215 |
+
if current_insight:
|
216 |
+
integration.append(current_insight)
|
217 |
+
current_insight = {
|
218 |
+
"insight": "",
|
219 |
+
"sources": "",
|
220 |
+
"support": "",
|
221 |
+
"confidence": 0.0
|
222 |
+
}
|
223 |
+
elif current_insight:
|
224 |
+
if line.startswith('Insight:'):
|
225 |
+
current_insight["insight"] = line[8:].strip()
|
226 |
+
elif line.startswith('Sources:'):
|
227 |
+
current_insight["sources"] = line[8:].strip()
|
228 |
+
elif line.startswith('Support:'):
|
229 |
+
current_insight["support"] = line[8:].strip()
|
230 |
+
elif line.startswith('Confidence:'):
|
231 |
+
try:
|
232 |
+
current_insight["confidence"] = float(line[11:].strip())
|
233 |
+
except:
|
234 |
+
pass
|
235 |
+
|
236 |
+
if current_insight:
|
237 |
+
integration.append(current_insight)
|
238 |
+
|
239 |
+
return integration
|
240 |
+
|
241 |
+
def _parse_response(self, response: str) -> Dict[str, Any]:
|
242 |
+
"""Parse response from response."""
|
243 |
+
response_dict = {
|
244 |
+
"conclusion": "",
|
245 |
+
"modal_contributions": [],
|
246 |
+
"integration_benefits": [],
|
247 |
+
"confidence": 0.0
|
248 |
+
}
|
249 |
+
|
250 |
+
mode = None
|
251 |
+
for line in response.split('\n'):
|
252 |
+
line = line.strip()
|
253 |
+
if not line:
|
254 |
+
continue
|
255 |
+
|
256 |
+
if line.startswith('Conclusion:'):
|
257 |
+
response_dict["conclusion"] = line[11:].strip()
|
258 |
+
elif line.startswith('Modal Contributions:'):
|
259 |
+
mode = "modal"
|
260 |
+
elif line.startswith('Integration Benefits:'):
|
261 |
+
mode = "integration"
|
262 |
+
elif line.startswith('Confidence:'):
|
263 |
+
try:
|
264 |
+
response_dict["confidence"] = float(line[11:].strip())
|
265 |
+
except:
|
266 |
+
response_dict["confidence"] = 0.5
|
267 |
+
mode = None
|
268 |
+
elif mode == "modal" and line.startswith('- '):
|
269 |
+
response_dict["modal_contributions"].append(line[2:].strip())
|
270 |
+
elif mode == "integration" and line.startswith('- '):
|
271 |
+
response_dict["integration_benefits"].append(line[2:].strip())
|
272 |
+
|
273 |
+
return response_dict
|
orchestrator.py
ADDED
@@ -0,0 +1,522 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Agentic Orchestrator for Advanced AI System
|
3 |
+
-----------------------------------------
|
4 |
+
Manages and coordinates multiple agentic components:
|
5 |
+
1. Task Planning & Decomposition
|
6 |
+
2. Resource Management
|
7 |
+
3. Agent Communication
|
8 |
+
4. State Management
|
9 |
+
5. Error Recovery
|
10 |
+
6. Performance Monitoring
|
11 |
+
"""
|
12 |
+
|
13 |
+
import logging
|
14 |
+
from typing import Dict, Any, List, Optional, Union, TypeVar, Generic
|
15 |
+
from dataclasses import dataclass, field
|
16 |
+
from enum import Enum
|
17 |
+
import json
|
18 |
+
import asyncio
|
19 |
+
from datetime import datetime
|
20 |
+
import uuid
|
21 |
+
from concurrent.futures import ThreadPoolExecutor
|
22 |
+
import networkx as nx
|
23 |
+
from collections import defaultdict
|
24 |
+
import numpy as np
|
25 |
+
|
26 |
+
from reasoning import ReasoningEngine, ReasoningMode
|
27 |
+
from meta_learning import MetaLearningStrategy
|
28 |
+
|
29 |
+
T = TypeVar('T')
|
30 |
+
|
31 |
+
class AgentRole(Enum):
|
32 |
+
"""Different roles an agent can take."""
|
33 |
+
PLANNER = "planner"
|
34 |
+
EXECUTOR = "executor"
|
35 |
+
MONITOR = "monitor"
|
36 |
+
COORDINATOR = "coordinator"
|
37 |
+
LEARNER = "learner"
|
38 |
+
|
39 |
+
class AgentState(Enum):
|
40 |
+
"""Possible states of an agent."""
|
41 |
+
IDLE = "idle"
|
42 |
+
BUSY = "busy"
|
43 |
+
ERROR = "error"
|
44 |
+
LEARNING = "learning"
|
45 |
+
TERMINATED = "terminated"
|
46 |
+
|
47 |
+
class TaskPriority(Enum):
|
48 |
+
"""Task priority levels."""
|
49 |
+
LOW = 0
|
50 |
+
MEDIUM = 1
|
51 |
+
HIGH = 2
|
52 |
+
CRITICAL = 3
|
53 |
+
|
54 |
+
@dataclass
|
55 |
+
class AgentMetadata:
|
56 |
+
"""Metadata about an agent."""
|
57 |
+
id: str
|
58 |
+
role: AgentRole
|
59 |
+
capabilities: List[str]
|
60 |
+
state: AgentState
|
61 |
+
load: float
|
62 |
+
last_active: datetime
|
63 |
+
metrics: Dict[str, float]
|
64 |
+
|
65 |
+
@dataclass
|
66 |
+
class Task:
|
67 |
+
"""Represents a task in the system."""
|
68 |
+
id: str
|
69 |
+
description: str
|
70 |
+
priority: TaskPriority
|
71 |
+
dependencies: List[str]
|
72 |
+
assigned_to: Optional[str]
|
73 |
+
state: str
|
74 |
+
created_at: datetime
|
75 |
+
deadline: Optional[datetime]
|
76 |
+
metadata: Dict[str, Any]
|
77 |
+
|
78 |
+
class AgentOrchestrator:
|
79 |
+
"""Advanced orchestrator for managing agentic system."""
|
80 |
+
|
81 |
+
def __init__(self, config: Dict[str, Any] = None):
|
82 |
+
self.config = config or {}
|
83 |
+
|
84 |
+
# Core components
|
85 |
+
self.agents: Dict[str, AgentMetadata] = {}
|
86 |
+
self.tasks: Dict[str, Task] = {}
|
87 |
+
self.task_graph = nx.DiGraph()
|
88 |
+
|
89 |
+
# State management
|
90 |
+
self.state_history: List[Dict[str, Any]] = []
|
91 |
+
self.global_state: Dict[str, Any] = {}
|
92 |
+
|
93 |
+
# Resource management
|
94 |
+
self.resource_pool: Dict[str, Any] = {}
|
95 |
+
self.resource_locks: Dict[str, asyncio.Lock] = {}
|
96 |
+
|
97 |
+
# Communication
|
98 |
+
self.message_queue = asyncio.Queue()
|
99 |
+
self.event_bus = asyncio.Queue()
|
100 |
+
|
101 |
+
# Performance monitoring
|
102 |
+
self.metrics = defaultdict(list)
|
103 |
+
self.performance_log = []
|
104 |
+
|
105 |
+
# Error handling
|
106 |
+
self.error_handlers: Dict[str, callable] = {}
|
107 |
+
self.recovery_strategies: Dict[str, callable] = {}
|
108 |
+
|
109 |
+
# Async support
|
110 |
+
self.executor = ThreadPoolExecutor(max_workers=4)
|
111 |
+
self.lock = asyncio.Lock()
|
112 |
+
|
113 |
+
# Logging
|
114 |
+
self.logger = logging.getLogger(__name__)
|
115 |
+
|
116 |
+
# Initialize components
|
117 |
+
self._init_components()
|
118 |
+
|
119 |
+
def _init_components(self):
|
120 |
+
"""Initialize orchestrator components."""
|
121 |
+
# Initialize reasoning engine
|
122 |
+
self.reasoning_engine = ReasoningEngine(
|
123 |
+
model_manager=None, # Will be injected
|
124 |
+
max_depth=5,
|
125 |
+
beam_width=3,
|
126 |
+
config=self.config.get("reasoning", {})
|
127 |
+
)
|
128 |
+
|
129 |
+
# Initialize meta-learning
|
130 |
+
self.meta_learning = MetaLearningStrategy()
|
131 |
+
|
132 |
+
# Register basic error handlers
|
133 |
+
self._register_error_handlers()
|
134 |
+
|
135 |
+
async def register_agent(
|
136 |
+
self,
|
137 |
+
role: AgentRole,
|
138 |
+
capabilities: List[str]
|
139 |
+
) -> str:
|
140 |
+
"""Register a new agent with the orchestrator."""
|
141 |
+
agent_id = str(uuid.uuid4())
|
142 |
+
|
143 |
+
agent = AgentMetadata(
|
144 |
+
id=agent_id,
|
145 |
+
role=role,
|
146 |
+
capabilities=capabilities,
|
147 |
+
state=AgentState.IDLE,
|
148 |
+
load=0.0,
|
149 |
+
last_active=datetime.now(),
|
150 |
+
metrics={}
|
151 |
+
)
|
152 |
+
|
153 |
+
async with self.lock:
|
154 |
+
self.agents[agent_id] = agent
|
155 |
+
self.logger.info(f"Registered new agent: {agent_id} with role {role}")
|
156 |
+
|
157 |
+
return agent_id
|
158 |
+
|
159 |
+
async def submit_task(
|
160 |
+
self,
|
161 |
+
description: str,
|
162 |
+
priority: TaskPriority = TaskPriority.MEDIUM,
|
163 |
+
dependencies: List[str] = None,
|
164 |
+
deadline: Optional[datetime] = None,
|
165 |
+
metadata: Dict[str, Any] = None
|
166 |
+
) -> str:
|
167 |
+
"""Submit a new task to the orchestrator."""
|
168 |
+
task_id = str(uuid.uuid4())
|
169 |
+
|
170 |
+
task = Task(
|
171 |
+
id=task_id,
|
172 |
+
description=description,
|
173 |
+
priority=priority,
|
174 |
+
dependencies=dependencies or [],
|
175 |
+
assigned_to=None,
|
176 |
+
state="pending",
|
177 |
+
created_at=datetime.now(),
|
178 |
+
deadline=deadline,
|
179 |
+
metadata=metadata or {}
|
180 |
+
)
|
181 |
+
|
182 |
+
async with self.lock:
|
183 |
+
self.tasks[task_id] = task
|
184 |
+
self._update_task_graph(task)
|
185 |
+
|
186 |
+
# Trigger task planning
|
187 |
+
await self._plan_task_execution(task_id)
|
188 |
+
|
189 |
+
return task_id
|
190 |
+
|
191 |
+
async def _plan_task_execution(self, task_id: str) -> None:
|
192 |
+
"""Plan the execution of a task."""
|
193 |
+
task = self.tasks[task_id]
|
194 |
+
|
195 |
+
# Check dependencies
|
196 |
+
if not await self._check_dependencies(task):
|
197 |
+
self.logger.info(f"Task {task_id} waiting for dependencies")
|
198 |
+
return
|
199 |
+
|
200 |
+
# Find suitable agent
|
201 |
+
agent_id = await self._find_suitable_agent(task)
|
202 |
+
if not agent_id:
|
203 |
+
self.logger.warning(f"No suitable agent found for task {task_id}")
|
204 |
+
return
|
205 |
+
|
206 |
+
# Assign task
|
207 |
+
await self._assign_task(task_id, agent_id)
|
208 |
+
|
209 |
+
async def _check_dependencies(self, task: Task) -> bool:
|
210 |
+
"""Check if all task dependencies are satisfied."""
|
211 |
+
for dep_id in task.dependencies:
|
212 |
+
if dep_id not in self.tasks:
|
213 |
+
return False
|
214 |
+
if self.tasks[dep_id].state != "completed":
|
215 |
+
return False
|
216 |
+
return True
|
217 |
+
|
218 |
+
async def _find_suitable_agent(self, task: Task) -> Optional[str]:
|
219 |
+
"""Find the most suitable agent for a task."""
|
220 |
+
best_agent = None
|
221 |
+
best_score = float('-inf')
|
222 |
+
|
223 |
+
for agent_id, agent in self.agents.items():
|
224 |
+
if agent.state != AgentState.IDLE:
|
225 |
+
continue
|
226 |
+
|
227 |
+
score = await self._calculate_agent_suitability(agent, task)
|
228 |
+
if score > best_score:
|
229 |
+
best_score = score
|
230 |
+
best_agent = agent_id
|
231 |
+
|
232 |
+
return best_agent
|
233 |
+
|
234 |
+
async def _calculate_agent_suitability(
|
235 |
+
self,
|
236 |
+
agent: AgentMetadata,
|
237 |
+
task: Task
|
238 |
+
) -> float:
|
239 |
+
"""Calculate how suitable an agent is for a task."""
|
240 |
+
# Base score on capabilities match
|
241 |
+
capability_score = sum(
|
242 |
+
1 for cap in task.metadata.get("required_capabilities", [])
|
243 |
+
if cap in agent.capabilities
|
244 |
+
)
|
245 |
+
|
246 |
+
# Consider agent load
|
247 |
+
load_score = 1 - agent.load
|
248 |
+
|
249 |
+
# Consider agent's recent performance
|
250 |
+
performance_score = sum(agent.metrics.values()) / len(agent.metrics) if agent.metrics else 0.5
|
251 |
+
|
252 |
+
# Weighted combination
|
253 |
+
weights = self.config.get("agent_selection_weights", {
|
254 |
+
"capabilities": 0.5,
|
255 |
+
"load": 0.3,
|
256 |
+
"performance": 0.2
|
257 |
+
})
|
258 |
+
|
259 |
+
return (
|
260 |
+
weights["capabilities"] * capability_score +
|
261 |
+
weights["load"] * load_score +
|
262 |
+
weights["performance"] * performance_score
|
263 |
+
)
|
264 |
+
|
265 |
+
async def _assign_task(self, task_id: str, agent_id: str) -> None:
|
266 |
+
"""Assign a task to an agent."""
|
267 |
+
async with self.lock:
|
268 |
+
task = self.tasks[task_id]
|
269 |
+
agent = self.agents[agent_id]
|
270 |
+
|
271 |
+
task.assigned_to = agent_id
|
272 |
+
task.state = "assigned"
|
273 |
+
agent.state = AgentState.BUSY
|
274 |
+
agent.load += 1
|
275 |
+
agent.last_active = datetime.now()
|
276 |
+
|
277 |
+
self.logger.info(f"Assigned task {task_id} to agent {agent_id}")
|
278 |
+
|
279 |
+
# Notify agent
|
280 |
+
await self.message_queue.put({
|
281 |
+
"type": "task_assignment",
|
282 |
+
"task_id": task_id,
|
283 |
+
"agent_id": agent_id,
|
284 |
+
"timestamp": datetime.now()
|
285 |
+
})
|
286 |
+
|
287 |
+
def _update_task_graph(self, task: Task) -> None:
|
288 |
+
"""Update the task dependency graph."""
|
289 |
+
self.task_graph.add_node(task.id, task=task)
|
290 |
+
for dep_id in task.dependencies:
|
291 |
+
self.task_graph.add_edge(dep_id, task.id)
|
292 |
+
|
293 |
+
async def _monitor_system_state(self):
|
294 |
+
"""Monitor overall system state."""
|
295 |
+
while True:
|
296 |
+
try:
|
297 |
+
# Collect agent states
|
298 |
+
agent_states = {
|
299 |
+
agent_id: {
|
300 |
+
"state": agent.state,
|
301 |
+
"load": agent.load,
|
302 |
+
"metrics": agent.metrics
|
303 |
+
}
|
304 |
+
for agent_id, agent in self.agents.items()
|
305 |
+
}
|
306 |
+
|
307 |
+
# Collect task states
|
308 |
+
task_states = {
|
309 |
+
task_id: {
|
310 |
+
"state": task.state,
|
311 |
+
"assigned_to": task.assigned_to,
|
312 |
+
"deadline": task.deadline
|
313 |
+
}
|
314 |
+
for task_id, task in self.tasks.items()
|
315 |
+
}
|
316 |
+
|
317 |
+
# Update global state
|
318 |
+
self.global_state = {
|
319 |
+
"timestamp": datetime.now(),
|
320 |
+
"agents": agent_states,
|
321 |
+
"tasks": task_states,
|
322 |
+
"resource_usage": self._get_resource_usage(),
|
323 |
+
"performance_metrics": self._calculate_performance_metrics()
|
324 |
+
}
|
325 |
+
|
326 |
+
# Archive state
|
327 |
+
self.state_history.append(self.global_state.copy())
|
328 |
+
|
329 |
+
# Trim history if too long
|
330 |
+
if len(self.state_history) > 1000:
|
331 |
+
self.state_history = self.state_history[-1000:]
|
332 |
+
|
333 |
+
# Check for anomalies
|
334 |
+
await self._check_anomalies()
|
335 |
+
|
336 |
+
await asyncio.sleep(1) # Monitor frequency
|
337 |
+
|
338 |
+
except Exception as e:
|
339 |
+
self.logger.error(f"Error in system monitoring: {e}")
|
340 |
+
await self._handle_error("monitoring_error", e)
|
341 |
+
|
342 |
+
def _get_resource_usage(self) -> Dict[str, float]:
|
343 |
+
"""Get current resource usage statistics."""
|
344 |
+
return {
|
345 |
+
"cpu_usage": sum(agent.load for agent in self.agents.values()) / len(self.agents),
|
346 |
+
"memory_usage": len(self.state_history) * 1000, # Rough estimate
|
347 |
+
"queue_size": self.message_queue.qsize()
|
348 |
+
}
|
349 |
+
|
350 |
+
def _calculate_performance_metrics(self) -> Dict[str, float]:
|
351 |
+
"""Calculate current performance metrics."""
|
352 |
+
metrics = {}
|
353 |
+
|
354 |
+
# Task completion rate
|
355 |
+
completed_tasks = sum(1 for task in self.tasks.values() if task.state == "completed")
|
356 |
+
total_tasks = len(self.tasks)
|
357 |
+
metrics["task_completion_rate"] = completed_tasks / max(1, total_tasks)
|
358 |
+
|
359 |
+
# Average task duration
|
360 |
+
durations = []
|
361 |
+
for task in self.tasks.values():
|
362 |
+
if task.state == "completed" and "completion_time" in task.metadata:
|
363 |
+
duration = (task.metadata["completion_time"] - task.created_at).total_seconds()
|
364 |
+
durations.append(duration)
|
365 |
+
metrics["avg_task_duration"] = sum(durations) / len(durations) if durations else 0
|
366 |
+
|
367 |
+
# Agent utilization
|
368 |
+
metrics["agent_utilization"] = sum(agent.load for agent in self.agents.values()) / len(self.agents)
|
369 |
+
|
370 |
+
return metrics
|
371 |
+
|
372 |
+
async def _check_anomalies(self):
|
373 |
+
"""Check for system anomalies."""
|
374 |
+
# Check for overloaded agents
|
375 |
+
for agent_id, agent in self.agents.items():
|
376 |
+
if agent.load > 0.9: # 90% load threshold
|
377 |
+
await self._handle_overload(agent_id)
|
378 |
+
|
379 |
+
# Check for stalled tasks
|
380 |
+
now = datetime.now()
|
381 |
+
for task_id, task in self.tasks.items():
|
382 |
+
if task.state == "assigned":
|
383 |
+
duration = (now - task.created_at).total_seconds()
|
384 |
+
if duration > 3600: # 1 hour threshold
|
385 |
+
await self._handle_stalled_task(task_id)
|
386 |
+
|
387 |
+
# Check for missed deadlines
|
388 |
+
for task_id, task in self.tasks.items():
|
389 |
+
if task.deadline and now > task.deadline and task.state != "completed":
|
390 |
+
await self._handle_missed_deadline(task_id)
|
391 |
+
|
392 |
+
async def _handle_overload(self, agent_id: str):
|
393 |
+
"""Handle an overloaded agent."""
|
394 |
+
agent = self.agents[agent_id]
|
395 |
+
|
396 |
+
# Try to redistribute tasks
|
397 |
+
assigned_tasks = [
|
398 |
+
task_id for task_id, task in self.tasks.items()
|
399 |
+
if task.assigned_to == agent_id and task.state == "assigned"
|
400 |
+
]
|
401 |
+
|
402 |
+
for task_id in assigned_tasks:
|
403 |
+
# Find another suitable agent
|
404 |
+
new_agent_id = await self._find_suitable_agent(self.tasks[task_id])
|
405 |
+
if new_agent_id:
|
406 |
+
await self._reassign_task(task_id, new_agent_id)
|
407 |
+
|
408 |
+
async def _handle_stalled_task(self, task_id: str):
|
409 |
+
"""Handle a stalled task."""
|
410 |
+
task = self.tasks[task_id]
|
411 |
+
|
412 |
+
# First, try to ping the assigned agent
|
413 |
+
if task.assigned_to:
|
414 |
+
agent = self.agents[task.assigned_to]
|
415 |
+
if agent.state == AgentState.ERROR:
|
416 |
+
# Agent is in error state, reassign task
|
417 |
+
await self._reassign_task(task_id, None)
|
418 |
+
else:
|
419 |
+
# Request status update from agent
|
420 |
+
await self.message_queue.put({
|
421 |
+
"type": "status_request",
|
422 |
+
"task_id": task_id,
|
423 |
+
"agent_id": task.assigned_to,
|
424 |
+
"timestamp": datetime.now()
|
425 |
+
})
|
426 |
+
|
427 |
+
async def _handle_missed_deadline(self, task_id: str):
|
428 |
+
"""Handle a missed deadline."""
|
429 |
+
task = self.tasks[task_id]
|
430 |
+
|
431 |
+
# Log the incident
|
432 |
+
self.logger.warning(f"Task {task_id} missed deadline: {task.deadline}")
|
433 |
+
|
434 |
+
# Update task priority to CRITICAL
|
435 |
+
task.priority = TaskPriority.CRITICAL
|
436 |
+
|
437 |
+
# If task is assigned, try to speed it up
|
438 |
+
if task.assigned_to:
|
439 |
+
await self.message_queue.put({
|
440 |
+
"type": "expedite_request",
|
441 |
+
"task_id": task_id,
|
442 |
+
"agent_id": task.assigned_to,
|
443 |
+
"timestamp": datetime.now()
|
444 |
+
})
|
445 |
+
else:
|
446 |
+
# If not assigned, try to assign to fastest available agent
|
447 |
+
await self._plan_task_execution(task_id)
|
448 |
+
|
449 |
+
async def _reassign_task(self, task_id: str, new_agent_id: Optional[str] = None):
|
450 |
+
"""Reassign a task to a new agent."""
|
451 |
+
task = self.tasks[task_id]
|
452 |
+
old_agent_id = task.assigned_to
|
453 |
+
|
454 |
+
if old_agent_id:
|
455 |
+
# Update old agent
|
456 |
+
old_agent = self.agents[old_agent_id]
|
457 |
+
old_agent.load -= 1
|
458 |
+
if old_agent.load <= 0:
|
459 |
+
old_agent.state = AgentState.IDLE
|
460 |
+
|
461 |
+
if new_agent_id is None:
|
462 |
+
# Find new suitable agent
|
463 |
+
new_agent_id = await self._find_suitable_agent(task)
|
464 |
+
|
465 |
+
if new_agent_id:
|
466 |
+
# Assign to new agent
|
467 |
+
await self._assign_task(task_id, new_agent_id)
|
468 |
+
else:
|
469 |
+
# No suitable agent found, mark task as pending
|
470 |
+
task.state = "pending"
|
471 |
+
task.assigned_to = None
|
472 |
+
|
473 |
+
def _register_error_handlers(self):
|
474 |
+
"""Register basic error handlers."""
|
475 |
+
self.error_handlers.update({
|
476 |
+
"monitoring_error": self._handle_monitoring_error,
|
477 |
+
"agent_error": self._handle_agent_error,
|
478 |
+
"task_error": self._handle_task_error,
|
479 |
+
"resource_error": self._handle_resource_error
|
480 |
+
})
|
481 |
+
|
482 |
+
self.recovery_strategies.update({
|
483 |
+
"agent_recovery": self._recover_agent,
|
484 |
+
"task_recovery": self._recover_task,
|
485 |
+
"resource_recovery": self._recover_resource
|
486 |
+
})
|
487 |
+
|
488 |
+
async def _handle_error(self, error_type: str, error: Exception):
|
489 |
+
"""Handle an error using registered handlers."""
|
490 |
+
handler = self.error_handlers.get(error_type)
|
491 |
+
if handler:
|
492 |
+
try:
|
493 |
+
await handler(error)
|
494 |
+
except Exception as e:
|
495 |
+
self.logger.error(f"Error in error handler: {e}")
|
496 |
+
else:
|
497 |
+
self.logger.error(f"No handler for error type: {error_type}")
|
498 |
+
self.logger.error(f"Error: {error}")
|
499 |
+
|
500 |
+
async def _handle_monitoring_error(self, error: Exception):
|
501 |
+
"""Handle monitoring system errors."""
|
502 |
+
self.logger.error(f"Monitoring error: {error}")
|
503 |
+
# Implement recovery logic
|
504 |
+
pass
|
505 |
+
|
506 |
+
async def _handle_agent_error(self, error: Exception):
|
507 |
+
"""Handle agent-related errors."""
|
508 |
+
self.logger.error(f"Agent error: {error}")
|
509 |
+
# Implement recovery logic
|
510 |
+
pass
|
511 |
+
|
512 |
+
async def _handle_task_error(self, error: Exception):
|
513 |
+
"""Handle task-related errors."""
|
514 |
+
self.logger.error(f"Task error: {error}")
|
515 |
+
# Implement recovery logic
|
516 |
+
pass
|
517 |
+
|
518 |
+
async def _handle_resource_error(self, error: Exception):
|
519 |
+
"""Handle resource-related errors."""
|
520 |
+
self.logger.error(f"Resource error: {error}")
|
521 |
+
# Implement recovery logic
|
522 |
+
pass
|
quick_check.py
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import requests
|
2 |
+
import os
|
3 |
+
import time
|
4 |
+
from datetime import datetime
|
5 |
+
import sys
|
6 |
+
|
7 |
+
def check_space():
|
8 |
+
url = "https://huggingface.co/api/spaces/nananie143/Agentic_llm"
|
9 |
+
headers = {"Authorization": f"Bearer {os.environ['HUGGINGFACE_TOKEN']}"}
|
10 |
+
|
11 |
+
try:
|
12 |
+
response = requests.get(url, headers=headers)
|
13 |
+
if response.ok:
|
14 |
+
data = response.json()
|
15 |
+
runtime = data.get('runtime', {})
|
16 |
+
stage = runtime.get('stage', 'UNKNOWN')
|
17 |
+
hardware = runtime.get('hardware', {})
|
18 |
+
domains = runtime.get('domains', [{}])[0]
|
19 |
+
|
20 |
+
status_time = datetime.now().strftime('%H:%M:%S')
|
21 |
+
sys.stdout.write(f"\n[{status_time}] Space Status:\n")
|
22 |
+
sys.stdout.write(f"Stage: {stage}\n")
|
23 |
+
sys.stdout.write(f"Hardware: {hardware.get('current', 'Not assigned')} (requested: {hardware.get('requested', 'None')})\n")
|
24 |
+
sys.stdout.write(f"Domain: {domains.get('domain', 'Not assigned')} (status: {domains.get('stage', 'Unknown')})\n")
|
25 |
+
sys.stdout.flush()
|
26 |
+
|
27 |
+
if stage == "RUNNING":
|
28 |
+
sys.stdout.write("\n🚀 Space is now running!\n")
|
29 |
+
sys.stdout.write(f"Access your Space at: https://{domains.get('domain', 'nananie143-agentic-llm.hf.space')}\n")
|
30 |
+
sys.stdout.flush()
|
31 |
+
return True
|
32 |
+
elif stage == "FAILED":
|
33 |
+
sys.stdout.write("\n❌ Space build failed!\n")
|
34 |
+
sys.stdout.flush()
|
35 |
+
return True
|
36 |
+
|
37 |
+
return False
|
38 |
+
|
39 |
+
except Exception as e:
|
40 |
+
sys.stdout.write(f"\n[{datetime.now().strftime('%H:%M:%S')}] Error checking status: {e}\n")
|
41 |
+
sys.stdout.flush()
|
42 |
+
return False
|
43 |
+
|
44 |
+
sys.stdout.write("\nStarting automatic Space status check...\n")
|
45 |
+
sys.stdout.write("Will check every 2 minutes until the Space is running or fails...\n")
|
46 |
+
sys.stdout.write("Press Ctrl+C to stop checking\n\n")
|
47 |
+
sys.stdout.flush()
|
48 |
+
|
49 |
+
while True:
|
50 |
+
should_stop = check_space()
|
51 |
+
if should_stop:
|
52 |
+
break
|
53 |
+
time.sleep(120) # Wait 2 minutes
|
reasoning.py
ADDED
The diff for this file is too large to render.
See raw diff
|
|
reasoning.py.bak2
ADDED
The diff for this file is too large to render.
See raw diff
|
|
reasoning/__init__.py
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Advanced Reasoning Engine for Multi-Model System
|
3 |
+
---------------------------------------------
|
4 |
+
A highly sophisticated reasoning system combining:
|
5 |
+
|
6 |
+
Core Reasoning:
|
7 |
+
1. Chain of Thought (CoT)
|
8 |
+
2. Tree of Thoughts (ToT)
|
9 |
+
3. Graph of Thoughts (GoT)
|
10 |
+
4. Recursive Reasoning
|
11 |
+
5. Analogical Reasoning
|
12 |
+
6. Meta-Learning
|
13 |
+
|
14 |
+
Advanced Reasoning:
|
15 |
+
7. Neurosymbolic Reasoning
|
16 |
+
8. Counterfactual Reasoning
|
17 |
+
9. State Space Search
|
18 |
+
10. Probabilistic Reasoning
|
19 |
+
11. Causal Inference
|
20 |
+
12. Temporal Reasoning
|
21 |
+
|
22 |
+
Learning & Adaptation:
|
23 |
+
13. Online Learning
|
24 |
+
14. Transfer Learning
|
25 |
+
15. Meta-Learning
|
26 |
+
16. Active Learning
|
27 |
+
|
28 |
+
Robustness Features:
|
29 |
+
17. Uncertainty Quantification
|
30 |
+
18. Error Recovery
|
31 |
+
19. Consistency Checking
|
32 |
+
20. Bias Detection
|
33 |
+
"""
|
34 |
+
|
35 |
+
from .base import ReasoningStrategy
|
36 |
+
from .multimodal import MultiModalReasoning
|
37 |
+
from .bayesian import BayesianReasoning
|
38 |
+
from .quantum import QuantumReasoning, QuantumInspiredStrategy
|
39 |
+
from .neurosymbolic import NeurosymbolicReasoning
|
40 |
+
from .emergent import EmergentReasoning
|
41 |
+
from .meta import MetaLearningStrategy
|
42 |
+
from .chain_of_thought import ChainOfThoughtStrategy
|
43 |
+
from .tree_of_thoughts import TreeOfThoughtsStrategy
|
44 |
+
from .recursive import RecursiveReasoning
|
45 |
+
from .analogical import AnalogicalReasoning
|
46 |
+
from .causal import CausalReasoning
|
47 |
+
from .state_space import StateSpaceSearch
|
48 |
+
from .counterfactual import CounterfactualReasoning
|
49 |
+
from .meta_reasoning import MetaReasoning
|
50 |
+
from .engine import BavePantherReasoning
|
51 |
+
|
52 |
+
__all__ = [
|
53 |
+
'ReasoningStrategy',
|
54 |
+
'MultiModalReasoning',
|
55 |
+
'BayesianReasoning',
|
56 |
+
'QuantumReasoning',
|
57 |
+
'QuantumInspiredStrategy',
|
58 |
+
'NeurosymbolicReasoning',
|
59 |
+
'EmergentReasoning',
|
60 |
+
'MetaLearningStrategy',
|
61 |
+
'ChainOfThoughtStrategy',
|
62 |
+
'TreeOfThoughtsStrategy',
|
63 |
+
'RecursiveReasoning',
|
64 |
+
'AnalogicalReasoning',
|
65 |
+
'CausalReasoning',
|
66 |
+
'StateSpaceSearch',
|
67 |
+
'CounterfactualReasoning',
|
68 |
+
'MetaReasoning',
|
69 |
+
'BavePantherReasoning'
|
70 |
+
]
|
reasoning/agentic.py
ADDED
@@ -0,0 +1,345 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Specialized reasoning strategies for Agentic Workflow."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import asyncio
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class TaskType(Enum):
|
15 |
+
"""Types of tasks in agentic workflow."""
|
16 |
+
CODE_GENERATION = "code_generation"
|
17 |
+
CODE_MODIFICATION = "code_modification"
|
18 |
+
CODE_REVIEW = "code_review"
|
19 |
+
DEBUGGING = "debugging"
|
20 |
+
ARCHITECTURE = "architecture"
|
21 |
+
OPTIMIZATION = "optimization"
|
22 |
+
DOCUMENTATION = "documentation"
|
23 |
+
TESTING = "testing"
|
24 |
+
|
25 |
+
class ResourceType(Enum):
|
26 |
+
"""Types of resources in agentic workflow."""
|
27 |
+
CODE_CONTEXT = "code_context"
|
28 |
+
SYSTEM_CONTEXT = "system_context"
|
29 |
+
USER_CONTEXT = "user_context"
|
30 |
+
TOOLS = "tools"
|
31 |
+
APIS = "apis"
|
32 |
+
DOCUMENTATION = "documentation"
|
33 |
+
DEPENDENCIES = "dependencies"
|
34 |
+
HISTORY = "history"
|
35 |
+
|
36 |
+
@dataclass
|
37 |
+
class TaskComponent:
|
38 |
+
"""Component of a decomposed task."""
|
39 |
+
id: str
|
40 |
+
type: TaskType
|
41 |
+
description: str
|
42 |
+
dependencies: List[str]
|
43 |
+
resources: Dict[ResourceType, Any]
|
44 |
+
constraints: List[str]
|
45 |
+
priority: float
|
46 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
47 |
+
|
48 |
+
@dataclass
|
49 |
+
class ResourceAllocation:
|
50 |
+
"""Resource allocation for a task."""
|
51 |
+
resource_type: ResourceType
|
52 |
+
quantity: Union[int, float]
|
53 |
+
priority: float
|
54 |
+
constraints: List[str]
|
55 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
56 |
+
|
57 |
+
@dataclass
|
58 |
+
class ExecutionStep:
|
59 |
+
"""Step in task execution."""
|
60 |
+
id: str
|
61 |
+
task_id: str
|
62 |
+
action: str
|
63 |
+
resources: Dict[ResourceType, Any]
|
64 |
+
status: str
|
65 |
+
result: Optional[Dict[str, Any]]
|
66 |
+
feedback: List[str]
|
67 |
+
timestamp: datetime = field(default_factory=datetime.now)
|
68 |
+
|
69 |
+
class TaskDecompositionStrategy(ReasoningStrategy):
|
70 |
+
"""
|
71 |
+
Advanced task decomposition strategy that:
|
72 |
+
1. Analyzes task complexity and dependencies
|
73 |
+
2. Breaks down tasks into manageable components
|
74 |
+
3. Identifies resource requirements
|
75 |
+
4. Establishes execution order
|
76 |
+
5. Manages constraints and priorities
|
77 |
+
"""
|
78 |
+
|
79 |
+
def __init__(self, max_components: int = 10):
|
80 |
+
self.max_components = max_components
|
81 |
+
self.components: Dict[str, TaskComponent] = {}
|
82 |
+
|
83 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
84 |
+
"""Decompose task into components."""
|
85 |
+
try:
|
86 |
+
# Analyze task
|
87 |
+
task_analysis = await self._analyze_task(query, context)
|
88 |
+
|
89 |
+
# Generate components
|
90 |
+
components = await self._generate_components(task_analysis, context)
|
91 |
+
|
92 |
+
# Establish dependencies
|
93 |
+
dependency_graph = await self._establish_dependencies(components, context)
|
94 |
+
|
95 |
+
# Determine execution order
|
96 |
+
execution_order = await self._determine_execution_order(
|
97 |
+
components, dependency_graph, context)
|
98 |
+
|
99 |
+
return {
|
100 |
+
"success": True,
|
101 |
+
"components": [self._component_to_dict(c) for c in components],
|
102 |
+
"dependency_graph": dependency_graph,
|
103 |
+
"execution_order": execution_order,
|
104 |
+
"metadata": {
|
105 |
+
"total_components": len(components),
|
106 |
+
"complexity_score": task_analysis.get("complexity_score", 0.0),
|
107 |
+
"resource_requirements": task_analysis.get("resource_requirements", {})
|
108 |
+
}
|
109 |
+
}
|
110 |
+
except Exception as e:
|
111 |
+
logging.error(f"Error in task decomposition: {str(e)}")
|
112 |
+
return {"success": False, "error": str(e)}
|
113 |
+
|
114 |
+
class ResourceManagementStrategy(ReasoningStrategy):
|
115 |
+
"""
|
116 |
+
Advanced resource management strategy that:
|
117 |
+
1. Tracks available resources
|
118 |
+
2. Allocates resources to tasks
|
119 |
+
3. Handles resource constraints
|
120 |
+
4. Optimizes resource utilization
|
121 |
+
5. Manages resource dependencies
|
122 |
+
"""
|
123 |
+
|
124 |
+
def __init__(self):
|
125 |
+
self.allocations: Dict[str, ResourceAllocation] = {}
|
126 |
+
self.utilization_history: List[Dict[str, Any]] = []
|
127 |
+
|
128 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
129 |
+
"""Manage resource allocation."""
|
130 |
+
try:
|
131 |
+
# Analyze resource requirements
|
132 |
+
requirements = await self._analyze_requirements(query, context)
|
133 |
+
|
134 |
+
# Check resource availability
|
135 |
+
availability = await self._check_availability(requirements, context)
|
136 |
+
|
137 |
+
# Generate allocation plan
|
138 |
+
allocation_plan = await self._generate_allocation_plan(
|
139 |
+
requirements, availability, context)
|
140 |
+
|
141 |
+
# Optimize allocations
|
142 |
+
optimized_plan = await self._optimize_allocations(allocation_plan, context)
|
143 |
+
|
144 |
+
return {
|
145 |
+
"success": True,
|
146 |
+
"allocation_plan": optimized_plan,
|
147 |
+
"resource_metrics": {
|
148 |
+
"utilization": self._calculate_utilization(),
|
149 |
+
"efficiency": self._calculate_efficiency(),
|
150 |
+
"constraints_satisfied": self._check_constraints(optimized_plan)
|
151 |
+
}
|
152 |
+
}
|
153 |
+
except Exception as e:
|
154 |
+
logging.error(f"Error in resource management: {str(e)}")
|
155 |
+
return {"success": False, "error": str(e)}
|
156 |
+
|
157 |
+
class ContextualPlanningStrategy(ReasoningStrategy):
|
158 |
+
"""
|
159 |
+
Advanced contextual planning strategy that:
|
160 |
+
1. Analyzes multiple context types
|
161 |
+
2. Generates context-aware plans
|
162 |
+
3. Handles context changes
|
163 |
+
4. Maintains context consistency
|
164 |
+
5. Optimizes for context constraints
|
165 |
+
"""
|
166 |
+
|
167 |
+
def __init__(self):
|
168 |
+
self.context_history: List[Dict[str, Any]] = []
|
169 |
+
self.plan_adaptations: List[Dict[str, Any]] = []
|
170 |
+
|
171 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
172 |
+
"""Generate context-aware plan."""
|
173 |
+
try:
|
174 |
+
# Analyze contexts
|
175 |
+
context_analysis = await self._analyze_contexts(query, context)
|
176 |
+
|
177 |
+
# Generate base plan
|
178 |
+
base_plan = await self._generate_base_plan(context_analysis, context)
|
179 |
+
|
180 |
+
# Adapt to contexts
|
181 |
+
adapted_plan = await self._adapt_to_contexts(base_plan, context_analysis)
|
182 |
+
|
183 |
+
# Validate plan
|
184 |
+
validation = await self._validate_plan(adapted_plan, context)
|
185 |
+
|
186 |
+
return {
|
187 |
+
"success": True,
|
188 |
+
"plan": adapted_plan,
|
189 |
+
"context_impact": context_analysis.get("impact_assessment", {}),
|
190 |
+
"adaptations": self.plan_adaptations,
|
191 |
+
"validation_results": validation
|
192 |
+
}
|
193 |
+
except Exception as e:
|
194 |
+
logging.error(f"Error in contextual planning: {str(e)}")
|
195 |
+
return {"success": False, "error": str(e)}
|
196 |
+
|
197 |
+
class AdaptiveExecutionStrategy(ReasoningStrategy):
|
198 |
+
"""
|
199 |
+
Advanced adaptive execution strategy that:
|
200 |
+
1. Monitors execution progress
|
201 |
+
2. Adapts to changes and feedback
|
202 |
+
3. Handles errors and exceptions
|
203 |
+
4. Optimizes execution flow
|
204 |
+
5. Maintains execution state
|
205 |
+
"""
|
206 |
+
|
207 |
+
def __init__(self):
|
208 |
+
self.execution_steps: List[ExecutionStep] = []
|
209 |
+
self.adaptation_history: List[Dict[str, Any]] = []
|
210 |
+
|
211 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
212 |
+
"""Execute task adaptively."""
|
213 |
+
try:
|
214 |
+
# Initialize execution
|
215 |
+
execution_state = await self._initialize_execution(query, context)
|
216 |
+
|
217 |
+
# Monitor and adapt
|
218 |
+
while not self._is_execution_complete(execution_state):
|
219 |
+
# Execute step
|
220 |
+
step_result = await self._execute_step(execution_state, context)
|
221 |
+
|
222 |
+
# Process feedback
|
223 |
+
feedback = await self._process_feedback(step_result, context)
|
224 |
+
|
225 |
+
# Adapt execution
|
226 |
+
execution_state = await self._adapt_execution(
|
227 |
+
execution_state, feedback, context)
|
228 |
+
|
229 |
+
# Record step
|
230 |
+
self._record_step(step_result, feedback)
|
231 |
+
|
232 |
+
return {
|
233 |
+
"success": True,
|
234 |
+
"execution_trace": [self._step_to_dict(s) for s in self.execution_steps],
|
235 |
+
"adaptations": self.adaptation_history,
|
236 |
+
"final_state": execution_state
|
237 |
+
}
|
238 |
+
except Exception as e:
|
239 |
+
logging.error(f"Error in adaptive execution: {str(e)}")
|
240 |
+
return {"success": False, "error": str(e)}
|
241 |
+
|
242 |
+
class FeedbackIntegrationStrategy(ReasoningStrategy):
|
243 |
+
"""
|
244 |
+
Advanced feedback integration strategy that:
|
245 |
+
1. Collects multiple types of feedback
|
246 |
+
2. Analyzes feedback patterns
|
247 |
+
3. Generates improvement suggestions
|
248 |
+
4. Tracks feedback implementation
|
249 |
+
5. Measures feedback impact
|
250 |
+
"""
|
251 |
+
|
252 |
+
def __init__(self):
|
253 |
+
self.feedback_history: List[Dict[str, Any]] = []
|
254 |
+
self.improvement_history: List[Dict[str, Any]] = []
|
255 |
+
|
256 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
257 |
+
"""Integrate and apply feedback."""
|
258 |
+
try:
|
259 |
+
# Collect feedback
|
260 |
+
feedback = await self._collect_feedback(query, context)
|
261 |
+
|
262 |
+
# Analyze patterns
|
263 |
+
patterns = await self._analyze_patterns(feedback, context)
|
264 |
+
|
265 |
+
# Generate improvements
|
266 |
+
improvements = await self._generate_improvements(patterns, context)
|
267 |
+
|
268 |
+
# Implement changes
|
269 |
+
implementation = await self._implement_improvements(improvements, context)
|
270 |
+
|
271 |
+
# Measure impact
|
272 |
+
impact = await self._measure_impact(implementation, context)
|
273 |
+
|
274 |
+
return {
|
275 |
+
"success": True,
|
276 |
+
"feedback_analysis": patterns,
|
277 |
+
"improvements": improvements,
|
278 |
+
"implementation_status": implementation,
|
279 |
+
"impact_metrics": impact
|
280 |
+
}
|
281 |
+
except Exception as e:
|
282 |
+
logging.error(f"Error in feedback integration: {str(e)}")
|
283 |
+
return {"success": False, "error": str(e)}
|
284 |
+
|
285 |
+
async def _collect_feedback(self, query: str, context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
286 |
+
"""Collect feedback from multiple sources."""
|
287 |
+
prompt = f"""
|
288 |
+
Collect feedback from:
|
289 |
+
Query: {query}
|
290 |
+
Context: {json.dumps(context)}
|
291 |
+
|
292 |
+
Consider:
|
293 |
+
1. User feedback
|
294 |
+
2. System metrics
|
295 |
+
3. Code analysis
|
296 |
+
4. Performance data
|
297 |
+
5. Error patterns
|
298 |
+
|
299 |
+
Format as:
|
300 |
+
[Feedback]
|
301 |
+
Source: ...
|
302 |
+
Type: ...
|
303 |
+
Content: ...
|
304 |
+
Priority: ...
|
305 |
+
"""
|
306 |
+
|
307 |
+
response = await context["groq_api"].predict(prompt)
|
308 |
+
return self._parse_feedback(response["answer"])
|
309 |
+
|
310 |
+
def _parse_feedback(self, response: str) -> List[Dict[str, Any]]:
|
311 |
+
"""Parse feedback from response."""
|
312 |
+
feedback_items = []
|
313 |
+
current = None
|
314 |
+
|
315 |
+
for line in response.split('\n'):
|
316 |
+
line = line.strip()
|
317 |
+
if not line:
|
318 |
+
continue
|
319 |
+
|
320 |
+
if line.startswith('[Feedback]'):
|
321 |
+
if current:
|
322 |
+
feedback_items.append(current)
|
323 |
+
current = {
|
324 |
+
"source": "",
|
325 |
+
"type": "",
|
326 |
+
"content": "",
|
327 |
+
"priority": 0.0
|
328 |
+
}
|
329 |
+
elif current:
|
330 |
+
if line.startswith('Source:'):
|
331 |
+
current["source"] = line[7:].strip()
|
332 |
+
elif line.startswith('Type:'):
|
333 |
+
current["type"] = line[5:].strip()
|
334 |
+
elif line.startswith('Content:'):
|
335 |
+
current["content"] = line[8:].strip()
|
336 |
+
elif line.startswith('Priority:'):
|
337 |
+
try:
|
338 |
+
current["priority"] = float(line[9:].strip())
|
339 |
+
except:
|
340 |
+
pass
|
341 |
+
|
342 |
+
if current:
|
343 |
+
feedback_items.append(current)
|
344 |
+
|
345 |
+
return feedback_items
|
reasoning/analogical.py
ADDED
@@ -0,0 +1,600 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Analogical reasoning implementation with advanced pattern matching and transfer learning."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Tuple, Callable
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class AnalogicalLevel(Enum):
|
15 |
+
"""Levels of analogical similarity."""
|
16 |
+
SURFACE = "surface"
|
17 |
+
STRUCTURAL = "structural"
|
18 |
+
SEMANTIC = "semantic"
|
19 |
+
FUNCTIONAL = "functional"
|
20 |
+
CAUSAL = "causal"
|
21 |
+
ABSTRACT = "abstract"
|
22 |
+
|
23 |
+
class MappingType(Enum):
|
24 |
+
"""Types of analogical mappings."""
|
25 |
+
DIRECT = "direct"
|
26 |
+
TRANSFORMED = "transformed"
|
27 |
+
COMPOSITE = "composite"
|
28 |
+
ABSTRACT = "abstract"
|
29 |
+
METAPHORICAL = "metaphorical"
|
30 |
+
HYBRID = "hybrid"
|
31 |
+
|
32 |
+
@dataclass
|
33 |
+
class AnalogicalPattern:
|
34 |
+
"""Represents a pattern for analogical matching."""
|
35 |
+
id: str
|
36 |
+
level: AnalogicalLevel
|
37 |
+
features: Dict[str, Any]
|
38 |
+
relations: List[Tuple[str, str, str]] # (entity1, relation, entity2)
|
39 |
+
constraints: List[str]
|
40 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
41 |
+
|
42 |
+
@dataclass
|
43 |
+
class AnalogicalMapping:
|
44 |
+
"""Represents a mapping between source and target domains."""
|
45 |
+
id: str
|
46 |
+
type: MappingType
|
47 |
+
source_elements: Dict[str, Any]
|
48 |
+
target_elements: Dict[str, Any]
|
49 |
+
correspondences: List[Tuple[str, str, float]] # (source, target, strength)
|
50 |
+
transformations: List[Dict[str, Any]]
|
51 |
+
confidence: float
|
52 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
53 |
+
|
54 |
+
@dataclass
|
55 |
+
class AnalogicalSolution:
|
56 |
+
"""Represents a solution derived through analogical reasoning."""
|
57 |
+
id: str
|
58 |
+
source_analogy: str
|
59 |
+
mapping: AnalogicalMapping
|
60 |
+
adaptation: Dict[str, Any]
|
61 |
+
inference: Dict[str, Any]
|
62 |
+
confidence: float
|
63 |
+
validation: Dict[str, Any]
|
64 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
65 |
+
|
66 |
+
class AnalogicalReasoning(ReasoningStrategy):
|
67 |
+
"""
|
68 |
+
Advanced Analogical Reasoning implementation with:
|
69 |
+
- Multi-level pattern matching
|
70 |
+
- Sophisticated similarity metrics
|
71 |
+
- Transfer learning capabilities
|
72 |
+
- Dynamic adaptation mechanisms
|
73 |
+
- Quality assessment
|
74 |
+
- Learning from experience
|
75 |
+
"""
|
76 |
+
|
77 |
+
def __init__(self,
|
78 |
+
min_similarity: float = 0.6,
|
79 |
+
max_candidates: int = 5,
|
80 |
+
adaptation_threshold: float = 0.7,
|
81 |
+
learning_rate: float = 0.1):
|
82 |
+
self.min_similarity = min_similarity
|
83 |
+
self.max_candidates = max_candidates
|
84 |
+
self.adaptation_threshold = adaptation_threshold
|
85 |
+
self.learning_rate = learning_rate
|
86 |
+
|
87 |
+
# Knowledge base
|
88 |
+
self.patterns: Dict[str, AnalogicalPattern] = {}
|
89 |
+
self.mappings: Dict[str, AnalogicalMapping] = {}
|
90 |
+
self.solutions: Dict[str, AnalogicalSolution] = {}
|
91 |
+
|
92 |
+
# Learning components
|
93 |
+
self.pattern_weights: Dict[str, float] = defaultdict(float)
|
94 |
+
self.success_history: List[Dict[str, Any]] = []
|
95 |
+
self.adaptation_history: List[Dict[str, Any]] = []
|
96 |
+
|
97 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
98 |
+
"""Main reasoning method implementing analogical reasoning."""
|
99 |
+
try:
|
100 |
+
# Extract patterns from query
|
101 |
+
patterns = await self._extract_patterns(query, context)
|
102 |
+
|
103 |
+
# Find analogical matches
|
104 |
+
matches = await self._find_matches(patterns, context)
|
105 |
+
|
106 |
+
# Create and evaluate mappings
|
107 |
+
mappings = await self._create_mappings(matches, context)
|
108 |
+
|
109 |
+
# Generate and adapt solutions
|
110 |
+
solutions = await self._generate_solutions(mappings, context)
|
111 |
+
|
112 |
+
# Select best solution
|
113 |
+
best_solution = await self._select_best_solution(solutions, context)
|
114 |
+
|
115 |
+
# Learn from experience
|
116 |
+
self._update_knowledge(patterns, mappings, best_solution)
|
117 |
+
|
118 |
+
return {
|
119 |
+
"success": True,
|
120 |
+
"answer": best_solution.inference["conclusion"],
|
121 |
+
"confidence": best_solution.confidence,
|
122 |
+
"analogy": {
|
123 |
+
"source": best_solution.source_analogy,
|
124 |
+
"mapping": self._mapping_to_dict(best_solution.mapping),
|
125 |
+
"adaptation": best_solution.adaptation
|
126 |
+
},
|
127 |
+
"reasoning_trace": best_solution.metadata.get("reasoning_trace", []),
|
128 |
+
"meta_insights": best_solution.metadata.get("meta_insights", [])
|
129 |
+
}
|
130 |
+
except Exception as e:
|
131 |
+
logging.error(f"Error in analogical reasoning: {str(e)}")
|
132 |
+
return {"success": False, "error": str(e)}
|
133 |
+
|
134 |
+
async def _extract_patterns(self, query: str, context: Dict[str, Any]) -> List[AnalogicalPattern]:
|
135 |
+
"""Extract patterns from query for analogical matching."""
|
136 |
+
prompt = f"""
|
137 |
+
Extract analogical patterns from query:
|
138 |
+
Query: {query}
|
139 |
+
Context: {json.dumps(context)}
|
140 |
+
|
141 |
+
For each pattern level:
|
142 |
+
1. Surface features
|
143 |
+
2. Structural relations
|
144 |
+
3. Semantic concepts
|
145 |
+
4. Functional roles
|
146 |
+
5. Causal relationships
|
147 |
+
6. Abstract principles
|
148 |
+
|
149 |
+
Format as:
|
150 |
+
[P1]
|
151 |
+
Level: ...
|
152 |
+
Features: ...
|
153 |
+
Relations: ...
|
154 |
+
Constraints: ...
|
155 |
+
|
156 |
+
[P2]
|
157 |
+
...
|
158 |
+
"""
|
159 |
+
|
160 |
+
response = await context["groq_api"].predict(prompt)
|
161 |
+
return self._parse_patterns(response["answer"])
|
162 |
+
|
163 |
+
async def _find_matches(self, patterns: List[AnalogicalPattern], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
164 |
+
"""Find matching patterns in knowledge base."""
|
165 |
+
prompt = f"""
|
166 |
+
Find analogical matches:
|
167 |
+
Patterns: {json.dumps([self._pattern_to_dict(p) for p in patterns])}
|
168 |
+
Context: {json.dumps(context)}
|
169 |
+
|
170 |
+
For each match provide:
|
171 |
+
1. Source domain
|
172 |
+
2. Similarity assessment
|
173 |
+
3. Key correspondences
|
174 |
+
4. Transfer potential
|
175 |
+
|
176 |
+
Format as:
|
177 |
+
[M1]
|
178 |
+
Source: ...
|
179 |
+
Similarity: ...
|
180 |
+
Correspondences: ...
|
181 |
+
Transfer: ...
|
182 |
+
|
183 |
+
[M2]
|
184 |
+
...
|
185 |
+
"""
|
186 |
+
|
187 |
+
response = await context["groq_api"].predict(prompt)
|
188 |
+
return self._parse_matches(response["answer"])
|
189 |
+
|
190 |
+
async def _create_mappings(self, matches: List[Dict[str, Any]], context: Dict[str, Any]) -> List[AnalogicalMapping]:
|
191 |
+
"""Create mappings between source and target domains."""
|
192 |
+
prompt = f"""
|
193 |
+
Create analogical mappings:
|
194 |
+
Matches: {json.dumps(matches)}
|
195 |
+
Context: {json.dumps(context)}
|
196 |
+
|
197 |
+
For each mapping specify:
|
198 |
+
1. [Type]: {" | ".join([t.value for t in MappingType])}
|
199 |
+
2. [Elements]: Source and target elements
|
200 |
+
3. [Correspondences]: Element mappings
|
201 |
+
4. [Transformations]: Required adaptations
|
202 |
+
5. [Confidence]: Mapping strength
|
203 |
+
|
204 |
+
Format as:
|
205 |
+
[Map1]
|
206 |
+
Type: ...
|
207 |
+
Elements: ...
|
208 |
+
Correspondences: ...
|
209 |
+
Transformations: ...
|
210 |
+
Confidence: ...
|
211 |
+
"""
|
212 |
+
|
213 |
+
response = await context["groq_api"].predict(prompt)
|
214 |
+
return self._parse_mappings(response["answer"])
|
215 |
+
|
216 |
+
async def _generate_solutions(self, mappings: List[AnalogicalMapping], context: Dict[str, Any]) -> List[AnalogicalSolution]:
|
217 |
+
"""Generate solutions through analogical transfer."""
|
218 |
+
prompt = f"""
|
219 |
+
Generate analogical solutions:
|
220 |
+
Mappings: {json.dumps([self._mapping_to_dict(m) for m in mappings])}
|
221 |
+
Context: {json.dumps(context)}
|
222 |
+
|
223 |
+
For each solution provide:
|
224 |
+
1. Analogical inference
|
225 |
+
2. Required adaptations
|
226 |
+
3. Validation criteria
|
227 |
+
4. Confidence assessment
|
228 |
+
5. Reasoning trace
|
229 |
+
|
230 |
+
Format as:
|
231 |
+
[S1]
|
232 |
+
Inference: ...
|
233 |
+
Adaptation: ...
|
234 |
+
Validation: ...
|
235 |
+
Confidence: ...
|
236 |
+
Trace: ...
|
237 |
+
"""
|
238 |
+
|
239 |
+
response = await context["groq_api"].predict(prompt)
|
240 |
+
return self._parse_solutions(response["answer"], mappings)
|
241 |
+
|
242 |
+
async def _select_best_solution(self, solutions: List[AnalogicalSolution], context: Dict[str, Any]) -> AnalogicalSolution:
|
243 |
+
"""Select the best solution based on multiple criteria."""
|
244 |
+
prompt = f"""
|
245 |
+
Evaluate and select best solution:
|
246 |
+
Solutions: {json.dumps([self._solution_to_dict(s) for s in solutions])}
|
247 |
+
Context: {json.dumps(context)}
|
248 |
+
|
249 |
+
Evaluate based on:
|
250 |
+
1. Inference quality
|
251 |
+
2. Adaptation feasibility
|
252 |
+
3. Validation strength
|
253 |
+
4. Overall confidence
|
254 |
+
|
255 |
+
Format as:
|
256 |
+
[Evaluation]
|
257 |
+
Rankings: ...
|
258 |
+
Rationale: ...
|
259 |
+
Selection: ...
|
260 |
+
Confidence: ...
|
261 |
+
"""
|
262 |
+
|
263 |
+
response = await context["groq_api"].predict(prompt)
|
264 |
+
selection = self._parse_selection(response["answer"])
|
265 |
+
|
266 |
+
# Find selected solution
|
267 |
+
selected = max(solutions, key=lambda s: s.confidence)
|
268 |
+
for solution in solutions:
|
269 |
+
if solution.id == selection.get("selected_id"):
|
270 |
+
selected = solution
|
271 |
+
break
|
272 |
+
|
273 |
+
return selected
|
274 |
+
|
275 |
+
def _update_knowledge(self, patterns: List[AnalogicalPattern], mappings: List[AnalogicalMapping], solution: AnalogicalSolution):
|
276 |
+
"""Update knowledge base with new patterns and successful mappings."""
|
277 |
+
# Update patterns
|
278 |
+
for pattern in patterns:
|
279 |
+
if pattern.id not in self.patterns:
|
280 |
+
self.patterns[pattern.id] = pattern
|
281 |
+
self.pattern_weights[pattern.id] += self.learning_rate * solution.confidence
|
282 |
+
|
283 |
+
# Update mappings
|
284 |
+
if solution.mapping.id not in self.mappings:
|
285 |
+
self.mappings[solution.mapping.id] = solution.mapping
|
286 |
+
|
287 |
+
# Record solution
|
288 |
+
self.solutions[solution.id] = solution
|
289 |
+
|
290 |
+
# Update history
|
291 |
+
self.success_history.append({
|
292 |
+
"timestamp": datetime.now().isoformat(),
|
293 |
+
"solution_id": solution.id,
|
294 |
+
"confidence": solution.confidence,
|
295 |
+
"patterns": [p.id for p in patterns],
|
296 |
+
"mapping_type": solution.mapping.type.value
|
297 |
+
})
|
298 |
+
|
299 |
+
# Update adaptation history
|
300 |
+
self.adaptation_history.append({
|
301 |
+
"timestamp": datetime.now().isoformat(),
|
302 |
+
"solution_id": solution.id,
|
303 |
+
"adaptations": solution.adaptation,
|
304 |
+
"success": solution.confidence >= self.adaptation_threshold
|
305 |
+
})
|
306 |
+
|
307 |
+
def _parse_patterns(self, response: str) -> List[AnalogicalPattern]:
|
308 |
+
"""Parse patterns from response."""
|
309 |
+
patterns = []
|
310 |
+
current = None
|
311 |
+
|
312 |
+
for line in response.split('\n'):
|
313 |
+
line = line.strip()
|
314 |
+
if not line:
|
315 |
+
continue
|
316 |
+
|
317 |
+
if line.startswith('[P'):
|
318 |
+
if current:
|
319 |
+
patterns.append(current)
|
320 |
+
current = None
|
321 |
+
elif line.startswith('Level:'):
|
322 |
+
level_str = line[6:].strip().lower()
|
323 |
+
try:
|
324 |
+
level = AnalogicalLevel(level_str)
|
325 |
+
current = AnalogicalPattern(
|
326 |
+
id=f"pattern_{len(patterns)}",
|
327 |
+
level=level,
|
328 |
+
features={},
|
329 |
+
relations=[],
|
330 |
+
constraints=[],
|
331 |
+
metadata={}
|
332 |
+
)
|
333 |
+
except ValueError:
|
334 |
+
logging.warning(f"Invalid analogical level: {level_str}")
|
335 |
+
elif current:
|
336 |
+
if line.startswith('Features:'):
|
337 |
+
try:
|
338 |
+
current.features = json.loads(line[9:].strip())
|
339 |
+
except:
|
340 |
+
current.features = {"raw": line[9:].strip()}
|
341 |
+
elif line.startswith('Relations:'):
|
342 |
+
relations = [r.strip() for r in line[10:].split(',')]
|
343 |
+
current.relations = [(r.split()[0], r.split()[1], r.split()[2])
|
344 |
+
for r in relations if len(r.split()) >= 3]
|
345 |
+
elif line.startswith('Constraints:'):
|
346 |
+
current.constraints = [c.strip() for c in line[12:].split(',')]
|
347 |
+
|
348 |
+
if current:
|
349 |
+
patterns.append(current)
|
350 |
+
|
351 |
+
return patterns
|
352 |
+
|
353 |
+
def _parse_matches(self, response: str) -> List[Dict[str, Any]]:
|
354 |
+
"""Parse matches from response."""
|
355 |
+
matches = []
|
356 |
+
current = None
|
357 |
+
|
358 |
+
for line in response.split('\n'):
|
359 |
+
line = line.strip()
|
360 |
+
if not line:
|
361 |
+
continue
|
362 |
+
|
363 |
+
if line.startswith('[M'):
|
364 |
+
if current:
|
365 |
+
matches.append(current)
|
366 |
+
current = {
|
367 |
+
"source": "",
|
368 |
+
"similarity": 0.0,
|
369 |
+
"correspondences": [],
|
370 |
+
"transfer": []
|
371 |
+
}
|
372 |
+
elif current:
|
373 |
+
if line.startswith('Source:'):
|
374 |
+
current["source"] = line[7:].strip()
|
375 |
+
elif line.startswith('Similarity:'):
|
376 |
+
try:
|
377 |
+
current["similarity"] = float(line[11:].strip())
|
378 |
+
except:
|
379 |
+
pass
|
380 |
+
elif line.startswith('Correspondences:'):
|
381 |
+
current["correspondences"] = [c.strip() for c in line[16:].split(',')]
|
382 |
+
elif line.startswith('Transfer:'):
|
383 |
+
current["transfer"] = [t.strip() for t in line[9:].split(',')]
|
384 |
+
|
385 |
+
if current:
|
386 |
+
matches.append(current)
|
387 |
+
|
388 |
+
return matches
|
389 |
+
|
390 |
+
def _parse_mappings(self, response: str) -> List[AnalogicalMapping]:
|
391 |
+
"""Parse mappings from response."""
|
392 |
+
mappings = []
|
393 |
+
current = None
|
394 |
+
|
395 |
+
for line in response.split('\n'):
|
396 |
+
line = line.strip()
|
397 |
+
if not line:
|
398 |
+
continue
|
399 |
+
|
400 |
+
if line.startswith('[Map'):
|
401 |
+
if current:
|
402 |
+
mappings.append(current)
|
403 |
+
current = None
|
404 |
+
elif line.startswith('Type:'):
|
405 |
+
type_str = line[5:].strip().lower()
|
406 |
+
try:
|
407 |
+
mapping_type = MappingType(type_str)
|
408 |
+
current = AnalogicalMapping(
|
409 |
+
id=f"mapping_{len(mappings)}",
|
410 |
+
type=mapping_type,
|
411 |
+
source_elements={},
|
412 |
+
target_elements={},
|
413 |
+
correspondences=[],
|
414 |
+
transformations=[],
|
415 |
+
confidence=0.0,
|
416 |
+
metadata={}
|
417 |
+
)
|
418 |
+
except ValueError:
|
419 |
+
logging.warning(f"Invalid mapping type: {type_str}")
|
420 |
+
elif current:
|
421 |
+
if line.startswith('Elements:'):
|
422 |
+
try:
|
423 |
+
elements = json.loads(line[9:].strip())
|
424 |
+
current.source_elements = elements.get("source", {})
|
425 |
+
current.target_elements = elements.get("target", {})
|
426 |
+
except:
|
427 |
+
pass
|
428 |
+
elif line.startswith('Correspondences:'):
|
429 |
+
pairs = [c.strip() for c in line[16:].split(',')]
|
430 |
+
for pair in pairs:
|
431 |
+
parts = pair.split(':')
|
432 |
+
if len(parts) >= 2:
|
433 |
+
source = parts[0].strip()
|
434 |
+
target = parts[1].strip()
|
435 |
+
strength = float(parts[2]) if len(parts) > 2 else 1.0
|
436 |
+
current.correspondences.append((source, target, strength))
|
437 |
+
elif line.startswith('Transformations:'):
|
438 |
+
try:
|
439 |
+
current.transformations = json.loads(line[16:].strip())
|
440 |
+
except:
|
441 |
+
current.transformations = [{"raw": line[16:].strip()}]
|
442 |
+
elif line.startswith('Confidence:'):
|
443 |
+
try:
|
444 |
+
current.confidence = float(line[11:].strip())
|
445 |
+
except:
|
446 |
+
pass
|
447 |
+
|
448 |
+
if current:
|
449 |
+
mappings.append(current)
|
450 |
+
|
451 |
+
return mappings
|
452 |
+
|
453 |
+
def _parse_solutions(self, response: str, mappings: List[AnalogicalMapping]) -> List[AnalogicalSolution]:
|
454 |
+
"""Parse solutions from response."""
|
455 |
+
solutions = []
|
456 |
+
current = None
|
457 |
+
|
458 |
+
for line in response.split('\n'):
|
459 |
+
line = line.strip()
|
460 |
+
if not line:
|
461 |
+
continue
|
462 |
+
|
463 |
+
if line.startswith('[S'):
|
464 |
+
if current:
|
465 |
+
solutions.append(current)
|
466 |
+
current = None
|
467 |
+
mapping_idx = len(solutions)
|
468 |
+
if mapping_idx < len(mappings):
|
469 |
+
current = AnalogicalSolution(
|
470 |
+
id=f"solution_{len(solutions)}",
|
471 |
+
source_analogy="",
|
472 |
+
mapping=mappings[mapping_idx],
|
473 |
+
adaptation={},
|
474 |
+
inference={},
|
475 |
+
confidence=0.0,
|
476 |
+
validation={},
|
477 |
+
metadata={}
|
478 |
+
)
|
479 |
+
elif current:
|
480 |
+
if line.startswith('Inference:'):
|
481 |
+
try:
|
482 |
+
current.inference = json.loads(line[10:].strip())
|
483 |
+
except:
|
484 |
+
current.inference = {"conclusion": line[10:].strip()}
|
485 |
+
elif line.startswith('Adaptation:'):
|
486 |
+
try:
|
487 |
+
current.adaptation = json.loads(line[11:].strip())
|
488 |
+
except:
|
489 |
+
current.adaptation = {"steps": [line[11:].strip()]}
|
490 |
+
elif line.startswith('Validation:'):
|
491 |
+
try:
|
492 |
+
current.validation = json.loads(line[11:].strip())
|
493 |
+
except:
|
494 |
+
current.validation = {"criteria": [line[11:].strip()]}
|
495 |
+
elif line.startswith('Confidence:'):
|
496 |
+
try:
|
497 |
+
current.confidence = float(line[11:].strip())
|
498 |
+
except:
|
499 |
+
pass
|
500 |
+
elif line.startswith('Trace:'):
|
501 |
+
current.metadata["reasoning_trace"] = [t.strip() for t in line[6:].split(',')]
|
502 |
+
|
503 |
+
if current:
|
504 |
+
solutions.append(current)
|
505 |
+
|
506 |
+
return solutions
|
507 |
+
|
508 |
+
def _parse_selection(self, response: str) -> Dict[str, Any]:
|
509 |
+
"""Parse solution selection from response."""
|
510 |
+
selection = {
|
511 |
+
"selected_id": None,
|
512 |
+
"confidence": 0.0,
|
513 |
+
"rationale": []
|
514 |
+
}
|
515 |
+
|
516 |
+
for line in response.split('\n'):
|
517 |
+
line = line.strip()
|
518 |
+
if line.startswith('Selection:'):
|
519 |
+
selection["selected_id"] = line[10:].strip()
|
520 |
+
elif line.startswith('Confidence:'):
|
521 |
+
try:
|
522 |
+
selection["confidence"] = float(line[11:].strip())
|
523 |
+
except:
|
524 |
+
pass
|
525 |
+
elif line.startswith('Rationale:'):
|
526 |
+
selection["rationale"] = [r.strip() for r in line[10:].split(',')]
|
527 |
+
|
528 |
+
return selection
|
529 |
+
|
530 |
+
def _pattern_to_dict(self, pattern: AnalogicalPattern) -> Dict[str, Any]:
|
531 |
+
"""Convert pattern to dictionary for serialization."""
|
532 |
+
return {
|
533 |
+
"id": pattern.id,
|
534 |
+
"level": pattern.level.value,
|
535 |
+
"features": pattern.features,
|
536 |
+
"relations": pattern.relations,
|
537 |
+
"constraints": pattern.constraints,
|
538 |
+
"metadata": pattern.metadata
|
539 |
+
}
|
540 |
+
|
541 |
+
def _mapping_to_dict(self, mapping: AnalogicalMapping) -> Dict[str, Any]:
|
542 |
+
"""Convert mapping to dictionary for serialization."""
|
543 |
+
return {
|
544 |
+
"id": mapping.id,
|
545 |
+
"type": mapping.type.value,
|
546 |
+
"source_elements": mapping.source_elements,
|
547 |
+
"target_elements": mapping.target_elements,
|
548 |
+
"correspondences": mapping.correspondences,
|
549 |
+
"transformations": mapping.transformations,
|
550 |
+
"confidence": mapping.confidence,
|
551 |
+
"metadata": mapping.metadata
|
552 |
+
}
|
553 |
+
|
554 |
+
def _solution_to_dict(self, solution: AnalogicalSolution) -> Dict[str, Any]:
|
555 |
+
"""Convert solution to dictionary for serialization."""
|
556 |
+
return {
|
557 |
+
"id": solution.id,
|
558 |
+
"source_analogy": solution.source_analogy,
|
559 |
+
"mapping": self._mapping_to_dict(solution.mapping),
|
560 |
+
"adaptation": solution.adaptation,
|
561 |
+
"inference": solution.inference,
|
562 |
+
"confidence": solution.confidence,
|
563 |
+
"validation": solution.validation,
|
564 |
+
"metadata": solution.metadata
|
565 |
+
}
|
566 |
+
|
567 |
+
def get_pattern_statistics(self) -> Dict[str, Any]:
|
568 |
+
"""Get statistics about pattern usage and effectiveness."""
|
569 |
+
return {
|
570 |
+
"total_patterns": len(self.patterns),
|
571 |
+
"level_distribution": defaultdict(int, {p.level.value: 1 for p in self.patterns.values()}),
|
572 |
+
"average_constraints": sum(len(p.constraints) for p in self.patterns.values()) / len(self.patterns) if self.patterns else 0,
|
573 |
+
"pattern_weights": dict(self.pattern_weights)
|
574 |
+
}
|
575 |
+
|
576 |
+
def get_mapping_statistics(self) -> Dict[str, Any]:
|
577 |
+
"""Get statistics about mapping effectiveness."""
|
578 |
+
return {
|
579 |
+
"total_mappings": len(self.mappings),
|
580 |
+
"type_distribution": defaultdict(int, {m.type.value: 1 for m in self.mappings.values()}),
|
581 |
+
"average_confidence": sum(m.confidence for m in self.mappings.values()) / len(self.mappings) if self.mappings else 0,
|
582 |
+
"transformation_counts": defaultdict(int, {m.id: len(m.transformations) for m in self.mappings.values()})
|
583 |
+
}
|
584 |
+
|
585 |
+
def get_solution_statistics(self) -> Dict[str, Any]:
|
586 |
+
"""Get statistics about solution quality."""
|
587 |
+
return {
|
588 |
+
"total_solutions": len(self.solutions),
|
589 |
+
"average_confidence": sum(s.confidence for s in self.solutions.values()) / len(self.solutions) if self.solutions else 0,
|
590 |
+
"adaptation_success_rate": sum(1 for h in self.adaptation_history if h["success"]) / len(self.adaptation_history) if self.adaptation_history else 0
|
591 |
+
}
|
592 |
+
|
593 |
+
def clear_knowledge_base(self):
|
594 |
+
"""Clear the knowledge base."""
|
595 |
+
self.patterns.clear()
|
596 |
+
self.mappings.clear()
|
597 |
+
self.solutions.clear()
|
598 |
+
self.pattern_weights.clear()
|
599 |
+
self.success_history.clear()
|
600 |
+
self.adaptation_history.clear()
|
reasoning/base.py
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Base class for all reasoning strategies."""
|
2 |
+
|
3 |
+
from typing import Dict, Any
|
4 |
+
|
5 |
+
class ReasoningStrategy:
|
6 |
+
"""Base class for reasoning strategies."""
|
7 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
8 |
+
"""Apply reasoning strategy to query with context.
|
9 |
+
|
10 |
+
Args:
|
11 |
+
query: The query to reason about
|
12 |
+
context: Additional context for reasoning
|
13 |
+
|
14 |
+
Returns:
|
15 |
+
Dictionary containing reasoning results
|
16 |
+
"""
|
17 |
+
raise NotImplementedError
|
reasoning/bayesian.py
ADDED
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Bayesian reasoning implementation."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List
|
5 |
+
import json
|
6 |
+
import re
|
7 |
+
from datetime import datetime
|
8 |
+
|
9 |
+
from .base import ReasoningStrategy
|
10 |
+
|
11 |
+
class BayesianReasoning(ReasoningStrategy):
|
12 |
+
"""Implements Bayesian reasoning for probabilistic analysis."""
|
13 |
+
|
14 |
+
def __init__(self, prior_weight: float = 0.3):
|
15 |
+
self.prior_weight = prior_weight
|
16 |
+
|
17 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
18 |
+
try:
|
19 |
+
# Generate hypotheses
|
20 |
+
hypotheses = await self._generate_hypotheses(query, context)
|
21 |
+
|
22 |
+
# Calculate prior probabilities
|
23 |
+
priors = await self._calculate_priors(hypotheses, context)
|
24 |
+
|
25 |
+
# Update with evidence
|
26 |
+
posteriors = await self._update_with_evidence(hypotheses, priors, context)
|
27 |
+
|
28 |
+
# Generate final analysis
|
29 |
+
analysis = await self._generate_analysis(posteriors, context)
|
30 |
+
|
31 |
+
return {
|
32 |
+
"success": True,
|
33 |
+
"answer": analysis["conclusion"],
|
34 |
+
"hypotheses": hypotheses,
|
35 |
+
"priors": priors,
|
36 |
+
"posteriors": posteriors,
|
37 |
+
"confidence": analysis["confidence"],
|
38 |
+
"reasoning_path": analysis["reasoning_path"]
|
39 |
+
}
|
40 |
+
except Exception as e:
|
41 |
+
return {"success": False, "error": str(e)}
|
42 |
+
|
43 |
+
async def _generate_hypotheses(self, query: str, context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
44 |
+
prompt = f"""
|
45 |
+
Generate 3-4 hypotheses for this problem:
|
46 |
+
Query: {query}
|
47 |
+
Context: {json.dumps(context)}
|
48 |
+
|
49 |
+
For each hypothesis:
|
50 |
+
1. [Statement]: Clear statement of the hypothesis
|
51 |
+
2. [Assumptions]: Key assumptions made
|
52 |
+
3. [Testability]: How it could be tested/verified
|
53 |
+
|
54 |
+
Format as:
|
55 |
+
[H1]
|
56 |
+
Statement: ...
|
57 |
+
Assumptions: ...
|
58 |
+
Testability: ...
|
59 |
+
"""
|
60 |
+
|
61 |
+
response = await context["groq_api"].predict(prompt)
|
62 |
+
return self._parse_hypotheses(response["answer"])
|
63 |
+
|
64 |
+
async def _calculate_priors(self, hypotheses: List[Dict[str, Any]], context: Dict[str, Any]) -> Dict[str, float]:
|
65 |
+
prompt = f"""
|
66 |
+
Calculate prior probabilities for these hypotheses:
|
67 |
+
Context: {json.dumps(context)}
|
68 |
+
|
69 |
+
Hypotheses:
|
70 |
+
{json.dumps(hypotheses, indent=2)}
|
71 |
+
|
72 |
+
For each hypothesis, estimate its prior probability (0-1) based on:
|
73 |
+
1. Alignment with known principles
|
74 |
+
2. Historical precedent
|
75 |
+
3. Domain expertise
|
76 |
+
|
77 |
+
Format: [H1]: 0.XX, [H2]: 0.XX, ...
|
78 |
+
"""
|
79 |
+
|
80 |
+
response = await context["groq_api"].predict(prompt)
|
81 |
+
return self._parse_probabilities(response["answer"])
|
82 |
+
|
83 |
+
async def _update_with_evidence(self, hypotheses: List[Dict[str, Any]], priors: Dict[str, float],
|
84 |
+
context: Dict[str, Any]) -> Dict[str, float]:
|
85 |
+
prompt = f"""
|
86 |
+
Update probabilities with available evidence:
|
87 |
+
Context: {json.dumps(context)}
|
88 |
+
|
89 |
+
Hypotheses and Priors:
|
90 |
+
{json.dumps(list(zip(hypotheses, priors.values())), indent=2)}
|
91 |
+
|
92 |
+
Consider:
|
93 |
+
1. How well each hypothesis explains the evidence
|
94 |
+
2. Any new evidence from the context
|
95 |
+
3. Potential conflicts or support between hypotheses
|
96 |
+
|
97 |
+
Format: [H1]: 0.XX, [H2]: 0.XX, ...
|
98 |
+
"""
|
99 |
+
|
100 |
+
response = await context["groq_api"].predict(prompt)
|
101 |
+
return self._parse_probabilities(response["answer"])
|
102 |
+
|
103 |
+
async def _generate_analysis(self, posteriors: Dict[str, float], context: Dict[str, Any]) -> Dict[str, Any]:
|
104 |
+
prompt = f"""
|
105 |
+
Generate final Bayesian analysis:
|
106 |
+
Context: {json.dumps(context)}
|
107 |
+
|
108 |
+
Posterior Probabilities:
|
109 |
+
{json.dumps(posteriors, indent=2)}
|
110 |
+
|
111 |
+
Provide:
|
112 |
+
1. Main conclusion based on highest probability hypotheses
|
113 |
+
2. Confidence level (0-1)
|
114 |
+
3. Key reasoning steps taken
|
115 |
+
"""
|
116 |
+
|
117 |
+
response = await context["groq_api"].predict(prompt)
|
118 |
+
return self._parse_analysis(response["answer"])
|
119 |
+
|
120 |
+
def _parse_hypotheses(self, response: str) -> List[Dict[str, Any]]:
|
121 |
+
"""Parse hypotheses from response."""
|
122 |
+
hypotheses = []
|
123 |
+
current = None
|
124 |
+
|
125 |
+
for line in response.split('\n'):
|
126 |
+
line = line.strip()
|
127 |
+
if not line:
|
128 |
+
continue
|
129 |
+
|
130 |
+
if line.startswith('[H'):
|
131 |
+
if current:
|
132 |
+
hypotheses.append(current)
|
133 |
+
current = {
|
134 |
+
"statement": "",
|
135 |
+
"assumptions": "",
|
136 |
+
"testability": ""
|
137 |
+
}
|
138 |
+
elif current:
|
139 |
+
if line.startswith('Statement:'):
|
140 |
+
current["statement"] = line[10:].strip()
|
141 |
+
elif line.startswith('Assumptions:'):
|
142 |
+
current["assumptions"] = line[12:].strip()
|
143 |
+
elif line.startswith('Testability:'):
|
144 |
+
current["testability"] = line[12:].strip()
|
145 |
+
|
146 |
+
if current:
|
147 |
+
hypotheses.append(current)
|
148 |
+
|
149 |
+
return hypotheses
|
150 |
+
|
151 |
+
def _parse_probabilities(self, response: str) -> Dict[str, float]:
|
152 |
+
"""Parse probabilities from response."""
|
153 |
+
probs = {}
|
154 |
+
pattern = r'\[H(\d+)\]:\s*(0\.\d+)'
|
155 |
+
|
156 |
+
for match in re.finditer(pattern, response):
|
157 |
+
h_num = int(match.group(1))
|
158 |
+
prob = float(match.group(2))
|
159 |
+
probs[f"H{h_num}"] = prob
|
160 |
+
|
161 |
+
return probs
|
162 |
+
|
163 |
+
def _parse_analysis(self, response: str) -> Dict[str, Any]:
|
164 |
+
"""Parse analysis from response."""
|
165 |
+
lines = response.split('\n')
|
166 |
+
analysis = {
|
167 |
+
"conclusion": "",
|
168 |
+
"confidence": 0.0,
|
169 |
+
"reasoning_path": []
|
170 |
+
}
|
171 |
+
|
172 |
+
for line in lines:
|
173 |
+
line = line.strip()
|
174 |
+
if not line:
|
175 |
+
continue
|
176 |
+
|
177 |
+
if line.startswith('Conclusion:'):
|
178 |
+
analysis["conclusion"] = line[11:].strip()
|
179 |
+
elif line.startswith('Confidence:'):
|
180 |
+
try:
|
181 |
+
analysis["confidence"] = float(line[11:].strip())
|
182 |
+
except:
|
183 |
+
analysis["confidence"] = 0.5
|
184 |
+
elif line.startswith('- '):
|
185 |
+
analysis["reasoning_path"].append(line[2:].strip())
|
186 |
+
|
187 |
+
return analysis
|
reasoning/chain_of_thought.py
ADDED
@@ -0,0 +1,410 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Chain of Thought reasoning implementation with advanced features."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass
|
7 |
+
from enum import Enum
|
8 |
+
|
9 |
+
from .base import ReasoningStrategy
|
10 |
+
|
11 |
+
class ThoughtType(Enum):
|
12 |
+
"""Types of thoughts in the chain."""
|
13 |
+
OBSERVATION = "observation"
|
14 |
+
ANALYSIS = "analysis"
|
15 |
+
HYPOTHESIS = "hypothesis"
|
16 |
+
VERIFICATION = "verification"
|
17 |
+
CONCLUSION = "conclusion"
|
18 |
+
REFLECTION = "reflection"
|
19 |
+
REFINEMENT = "refinement"
|
20 |
+
|
21 |
+
@dataclass
|
22 |
+
class Thought:
|
23 |
+
"""Represents a single thought in the chain."""
|
24 |
+
type: ThoughtType
|
25 |
+
content: str
|
26 |
+
confidence: float
|
27 |
+
evidence: List[str]
|
28 |
+
alternatives: List[str]
|
29 |
+
next_steps: List[str]
|
30 |
+
metadata: Dict[str, Any]
|
31 |
+
|
32 |
+
class ChainOfThoughtStrategy(ReasoningStrategy):
|
33 |
+
"""
|
34 |
+
Advanced Chain of Thought reasoning implementation with:
|
35 |
+
- Hierarchical thought chains
|
36 |
+
- Confidence scoring
|
37 |
+
- Alternative path exploration
|
38 |
+
- Self-reflection and refinement
|
39 |
+
- Evidence tracking
|
40 |
+
- Meta-learning capabilities
|
41 |
+
"""
|
42 |
+
|
43 |
+
def __init__(self,
|
44 |
+
max_chain_length: int = 10,
|
45 |
+
min_confidence: float = 0.7,
|
46 |
+
exploration_breadth: int = 3,
|
47 |
+
enable_reflection: bool = True):
|
48 |
+
self.max_chain_length = max_chain_length
|
49 |
+
self.min_confidence = min_confidence
|
50 |
+
self.exploration_breadth = exploration_breadth
|
51 |
+
self.enable_reflection = enable_reflection
|
52 |
+
self.thought_history: List[Thought] = []
|
53 |
+
|
54 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
55 |
+
"""Main reasoning method implementing chain of thought."""
|
56 |
+
try:
|
57 |
+
# Initialize reasoning chain
|
58 |
+
chain = await self._initialize_chain(query, context)
|
59 |
+
|
60 |
+
# Generate initial thoughts
|
61 |
+
thoughts = await self._generate_thoughts(query, context)
|
62 |
+
|
63 |
+
# Build thought chain
|
64 |
+
chain = await self._build_chain(thoughts, context)
|
65 |
+
|
66 |
+
# Reflect and refine
|
67 |
+
if self.enable_reflection:
|
68 |
+
chain = await self._reflect_and_refine(chain, context)
|
69 |
+
|
70 |
+
# Extract conclusion
|
71 |
+
conclusion = await self._extract_conclusion(chain, context)
|
72 |
+
|
73 |
+
# Update thought history
|
74 |
+
self.thought_history.extend(chain)
|
75 |
+
|
76 |
+
return {
|
77 |
+
"success": True,
|
78 |
+
"answer": conclusion["answer"],
|
79 |
+
"confidence": conclusion["confidence"],
|
80 |
+
"reasoning_chain": [self._thought_to_dict(t) for t in chain],
|
81 |
+
"alternatives": conclusion["alternatives"],
|
82 |
+
"evidence": conclusion["evidence"],
|
83 |
+
"meta_insights": conclusion["meta_insights"]
|
84 |
+
}
|
85 |
+
except Exception as e:
|
86 |
+
logging.error(f"Error in chain of thought reasoning: {str(e)}")
|
87 |
+
return {"success": False, "error": str(e)}
|
88 |
+
|
89 |
+
async def _initialize_chain(self, query: str, context: Dict[str, Any]) -> List[Thought]:
|
90 |
+
"""Initialize the thought chain with observations."""
|
91 |
+
prompt = f"""
|
92 |
+
Initialize chain of thought for query:
|
93 |
+
Query: {query}
|
94 |
+
Context: {json.dumps(context)}
|
95 |
+
|
96 |
+
Provide initial observations:
|
97 |
+
1. Key elements in query
|
98 |
+
2. Relevant context factors
|
99 |
+
3. Initial hypotheses
|
100 |
+
4. Potential approaches
|
101 |
+
|
102 |
+
Format as:
|
103 |
+
[O1] Element: ... | Relevance: ... | Confidence: ...
|
104 |
+
[O2] Context: ... | Impact: ... | Confidence: ...
|
105 |
+
[O3] Hypothesis: ... | Support: ... | Confidence: ...
|
106 |
+
[O4] Approach: ... | Rationale: ... | Confidence: ...
|
107 |
+
"""
|
108 |
+
|
109 |
+
response = await context["groq_api"].predict(prompt)
|
110 |
+
return self._parse_observations(response["answer"])
|
111 |
+
|
112 |
+
async def _generate_thoughts(self, query: str, context: Dict[str, Any]) -> List[Thought]:
|
113 |
+
"""Generate candidate thoughts for the chain."""
|
114 |
+
prompt = f"""
|
115 |
+
Generate thoughts for query analysis:
|
116 |
+
Query: {query}
|
117 |
+
Context: {json.dumps(context)}
|
118 |
+
|
119 |
+
For each thought provide:
|
120 |
+
1. [Type]: {" | ".join([t.value for t in ThoughtType])}
|
121 |
+
2. [Content]: Main thought
|
122 |
+
3. [Evidence]: Supporting evidence
|
123 |
+
4. [Alternatives]: Alternative perspectives
|
124 |
+
5. [Next]: Potential next steps
|
125 |
+
6. [Confidence]: 0-1 score
|
126 |
+
|
127 |
+
Format as:
|
128 |
+
[T1]
|
129 |
+
Type: ...
|
130 |
+
Content: ...
|
131 |
+
Evidence: ...
|
132 |
+
Alternatives: ...
|
133 |
+
Next: ...
|
134 |
+
Confidence: ...
|
135 |
+
"""
|
136 |
+
|
137 |
+
response = await context["groq_api"].predict(prompt)
|
138 |
+
return self._parse_thoughts(response["answer"])
|
139 |
+
|
140 |
+
async def _build_chain(self, thoughts: List[Thought], context: Dict[str, Any]) -> List[Thought]:
|
141 |
+
"""Build coherent chain from candidate thoughts."""
|
142 |
+
prompt = f"""
|
143 |
+
Build coherent thought chain:
|
144 |
+
Thoughts: {json.dumps([self._thought_to_dict(t) for t in thoughts])}
|
145 |
+
Context: {json.dumps(context)}
|
146 |
+
|
147 |
+
For each step specify:
|
148 |
+
1. Selected thought
|
149 |
+
2. Reasoning for selection
|
150 |
+
3. Connection to previous
|
151 |
+
4. Expected impact
|
152 |
+
|
153 |
+
Format as:
|
154 |
+
[S1]
|
155 |
+
Thought: ...
|
156 |
+
Reason: ...
|
157 |
+
Connection: ...
|
158 |
+
Impact: ...
|
159 |
+
"""
|
160 |
+
|
161 |
+
response = await context["groq_api"].predict(prompt)
|
162 |
+
return self._parse_chain(response["answer"], thoughts)
|
163 |
+
|
164 |
+
async def _reflect_and_refine(self, chain: List[Thought], context: Dict[str, Any]) -> List[Thought]:
|
165 |
+
"""Reflect on and refine the thought chain."""
|
166 |
+
prompt = f"""
|
167 |
+
Reflect on thought chain:
|
168 |
+
Chain: {json.dumps([self._thought_to_dict(t) for t in chain])}
|
169 |
+
Context: {json.dumps(context)}
|
170 |
+
|
171 |
+
Analyze for:
|
172 |
+
1. Logical gaps
|
173 |
+
2. Weak assumptions
|
174 |
+
3. Missing evidence
|
175 |
+
4. Alternative perspectives
|
176 |
+
|
177 |
+
Suggest refinements:
|
178 |
+
1. Additional thoughts
|
179 |
+
2. Modified reasoning
|
180 |
+
3. New connections
|
181 |
+
4. Evidence needs
|
182 |
+
|
183 |
+
Format as:
|
184 |
+
[Analysis]
|
185 |
+
Gaps: ...
|
186 |
+
Assumptions: ...
|
187 |
+
Missing: ...
|
188 |
+
Alternatives: ...
|
189 |
+
|
190 |
+
[Refinements]
|
191 |
+
Thoughts: ...
|
192 |
+
Reasoning: ...
|
193 |
+
Connections: ...
|
194 |
+
Evidence: ...
|
195 |
+
"""
|
196 |
+
|
197 |
+
response = await context["groq_api"].predict(prompt)
|
198 |
+
return self._apply_refinements(chain, response["answer"])
|
199 |
+
|
200 |
+
async def _extract_conclusion(self, chain: List[Thought], context: Dict[str, Any]) -> Dict[str, Any]:
|
201 |
+
"""Extract final conclusion from thought chain."""
|
202 |
+
prompt = f"""
|
203 |
+
Extract conclusion from thought chain:
|
204 |
+
Chain: {json.dumps([self._thought_to_dict(t) for t in chain])}
|
205 |
+
Context: {json.dumps(context)}
|
206 |
+
|
207 |
+
Provide:
|
208 |
+
1. Main conclusion
|
209 |
+
2. Confidence level
|
210 |
+
3. Supporting evidence
|
211 |
+
4. Alternative conclusions
|
212 |
+
5. Meta-insights gained
|
213 |
+
6. Future considerations
|
214 |
+
|
215 |
+
Format as:
|
216 |
+
[Conclusion]
|
217 |
+
Answer: ...
|
218 |
+
Confidence: ...
|
219 |
+
Evidence: ...
|
220 |
+
Alternatives: ...
|
221 |
+
|
222 |
+
[Meta]
|
223 |
+
Insights: ...
|
224 |
+
Future: ...
|
225 |
+
"""
|
226 |
+
|
227 |
+
response = await context["groq_api"].predict(prompt)
|
228 |
+
return self._parse_conclusion(response["answer"])
|
229 |
+
|
230 |
+
def _parse_observations(self, response: str) -> List[Thought]:
|
231 |
+
"""Parse initial observations into thoughts."""
|
232 |
+
observations = []
|
233 |
+
lines = response.split('\n')
|
234 |
+
|
235 |
+
for line in lines:
|
236 |
+
if line.startswith('[O'):
|
237 |
+
parts = line.split('|')
|
238 |
+
if len(parts) >= 3:
|
239 |
+
main_part = parts[0].split(']')[1].strip()
|
240 |
+
key, content = main_part.split(':', 1)
|
241 |
+
|
242 |
+
evidence = [p.strip() for p in parts[1].split(':')[1].strip().split(',')]
|
243 |
+
|
244 |
+
try:
|
245 |
+
confidence = float(parts[2].split(':')[1].strip())
|
246 |
+
except:
|
247 |
+
confidence = 0.5
|
248 |
+
|
249 |
+
observations.append(Thought(
|
250 |
+
type=ThoughtType.OBSERVATION,
|
251 |
+
content=content.strip(),
|
252 |
+
confidence=confidence,
|
253 |
+
evidence=evidence,
|
254 |
+
alternatives=[],
|
255 |
+
next_steps=[],
|
256 |
+
metadata={"key": key}
|
257 |
+
))
|
258 |
+
|
259 |
+
return observations
|
260 |
+
|
261 |
+
def _parse_thoughts(self, response: str) -> List[Thought]:
|
262 |
+
"""Parse generated thoughts."""
|
263 |
+
thoughts = []
|
264 |
+
current = None
|
265 |
+
|
266 |
+
for line in response.split('\n'):
|
267 |
+
line = line.strip()
|
268 |
+
if not line:
|
269 |
+
continue
|
270 |
+
|
271 |
+
if line.startswith('[T'):
|
272 |
+
if current:
|
273 |
+
thoughts.append(current)
|
274 |
+
current = None
|
275 |
+
elif line.startswith('Type:'):
|
276 |
+
type_str = line[5:].strip()
|
277 |
+
try:
|
278 |
+
thought_type = ThoughtType(type_str.lower())
|
279 |
+
current = Thought(
|
280 |
+
type=thought_type,
|
281 |
+
content="",
|
282 |
+
confidence=0.0,
|
283 |
+
evidence=[],
|
284 |
+
alternatives=[],
|
285 |
+
next_steps=[],
|
286 |
+
metadata={}
|
287 |
+
)
|
288 |
+
except ValueError:
|
289 |
+
logging.warning(f"Invalid thought type: {type_str}")
|
290 |
+
elif current:
|
291 |
+
if line.startswith('Content:'):
|
292 |
+
current.content = line[8:].strip()
|
293 |
+
elif line.startswith('Evidence:'):
|
294 |
+
current.evidence = [e.strip() for e in line[9:].split(',')]
|
295 |
+
elif line.startswith('Alternatives:'):
|
296 |
+
current.alternatives = [a.strip() for a in line[13:].split(',')]
|
297 |
+
elif line.startswith('Next:'):
|
298 |
+
current.next_steps = [n.strip() for n in line[5:].split(',')]
|
299 |
+
elif line.startswith('Confidence:'):
|
300 |
+
try:
|
301 |
+
current.confidence = float(line[11:].strip())
|
302 |
+
except:
|
303 |
+
current.confidence = 0.5
|
304 |
+
|
305 |
+
if current:
|
306 |
+
thoughts.append(current)
|
307 |
+
|
308 |
+
return thoughts
|
309 |
+
|
310 |
+
def _parse_chain(self, response: str, thoughts: List[Thought]) -> List[Thought]:
|
311 |
+
"""Parse and order thoughts into a chain."""
|
312 |
+
chain = []
|
313 |
+
thought_map = {self._thought_to_dict(t)["content"]: t for t in thoughts}
|
314 |
+
|
315 |
+
for line in response.split('\n'):
|
316 |
+
if line.startswith('Thought:'):
|
317 |
+
content = line[8:].strip()
|
318 |
+
if content in thought_map:
|
319 |
+
chain.append(thought_map[content])
|
320 |
+
|
321 |
+
return chain
|
322 |
+
|
323 |
+
def _apply_refinements(self, chain: List[Thought], response: str) -> List[Thought]:
|
324 |
+
"""Apply refinements to thought chain."""
|
325 |
+
refined_chain = chain.copy()
|
326 |
+
|
327 |
+
# Parse refinements
|
328 |
+
sections = response.split('[')
|
329 |
+
for section in sections:
|
330 |
+
if section.startswith('Refinements]'):
|
331 |
+
lines = section.split('\n')[1:]
|
332 |
+
for line in lines:
|
333 |
+
if line.startswith('Thoughts:'):
|
334 |
+
new_thoughts = self._parse_refinement_thoughts(line[9:])
|
335 |
+
refined_chain.extend(new_thoughts)
|
336 |
+
|
337 |
+
return refined_chain
|
338 |
+
|
339 |
+
def _parse_refinement_thoughts(self, refinements: str) -> List[Thought]:
|
340 |
+
"""Parse refinement thoughts."""
|
341 |
+
thoughts = []
|
342 |
+
for refinement in refinements.split(';'):
|
343 |
+
if refinement.strip():
|
344 |
+
thoughts.append(Thought(
|
345 |
+
type=ThoughtType.REFINEMENT,
|
346 |
+
content=refinement.strip(),
|
347 |
+
confidence=0.8, # Refinements typically have high confidence
|
348 |
+
evidence=[],
|
349 |
+
alternatives=[],
|
350 |
+
next_steps=[],
|
351 |
+
metadata={"refined": True}
|
352 |
+
))
|
353 |
+
return thoughts
|
354 |
+
|
355 |
+
def _parse_conclusion(self, response: str) -> Dict[str, Any]:
|
356 |
+
"""Parse final conclusion."""
|
357 |
+
conclusion = {
|
358 |
+
"answer": "",
|
359 |
+
"confidence": 0.0,
|
360 |
+
"evidence": [],
|
361 |
+
"alternatives": [],
|
362 |
+
"meta_insights": [],
|
363 |
+
"future_considerations": []
|
364 |
+
}
|
365 |
+
|
366 |
+
sections = response.split('[')
|
367 |
+
for section in sections:
|
368 |
+
if section.startswith('Conclusion]'):
|
369 |
+
lines = section.split('\n')[1:]
|
370 |
+
for line in lines:
|
371 |
+
if line.startswith('Answer:'):
|
372 |
+
conclusion["answer"] = line[7:].strip()
|
373 |
+
elif line.startswith('Confidence:'):
|
374 |
+
try:
|
375 |
+
conclusion["confidence"] = float(line[11:].strip())
|
376 |
+
except:
|
377 |
+
conclusion["confidence"] = 0.5
|
378 |
+
elif line.startswith('Evidence:'):
|
379 |
+
conclusion["evidence"] = [e.strip() for e in line[9:].split(',')]
|
380 |
+
elif line.startswith('Alternatives:'):
|
381 |
+
conclusion["alternatives"] = [a.strip() for a in line[13:].split(',')]
|
382 |
+
elif section.startswith('Meta]'):
|
383 |
+
lines = section.split('\n')[1:]
|
384 |
+
for line in lines:
|
385 |
+
if line.startswith('Insights:'):
|
386 |
+
conclusion["meta_insights"] = [i.strip() for i in line[9:].split(',')]
|
387 |
+
elif line.startswith('Future:'):
|
388 |
+
conclusion["future_considerations"] = [f.strip() for f in line[7:].split(',')]
|
389 |
+
|
390 |
+
return conclusion
|
391 |
+
|
392 |
+
def _thought_to_dict(self, thought: Thought) -> Dict[str, Any]:
|
393 |
+
"""Convert thought to dictionary for serialization."""
|
394 |
+
return {
|
395 |
+
"type": thought.type.value,
|
396 |
+
"content": thought.content,
|
397 |
+
"confidence": thought.confidence,
|
398 |
+
"evidence": thought.evidence,
|
399 |
+
"alternatives": thought.alternatives,
|
400 |
+
"next_steps": thought.next_steps,
|
401 |
+
"metadata": thought.metadata
|
402 |
+
}
|
403 |
+
|
404 |
+
def get_thought_history(self) -> List[Dict[str, Any]]:
|
405 |
+
"""Get the history of all thoughts processed."""
|
406 |
+
return [self._thought_to_dict(t) for t in self.thought_history]
|
407 |
+
|
408 |
+
def clear_history(self) -> None:
|
409 |
+
"""Clear thought history."""
|
410 |
+
self.thought_history = []
|
reasoning/coordination.py
ADDED
@@ -0,0 +1,525 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Advanced strategy coordination patterns for the unified reasoning engine."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Callable
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import asyncio
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
from .unified_engine import StrategyType, StrategyResult, UnifiedResult
|
14 |
+
|
15 |
+
class CoordinationPattern(Enum):
|
16 |
+
"""Types of strategy coordination patterns."""
|
17 |
+
PIPELINE = "pipeline"
|
18 |
+
PARALLEL = "parallel"
|
19 |
+
HIERARCHICAL = "hierarchical"
|
20 |
+
FEEDBACK = "feedback"
|
21 |
+
ADAPTIVE = "adaptive"
|
22 |
+
ENSEMBLE = "ensemble"
|
23 |
+
|
24 |
+
class CoordinationPhase(Enum):
|
25 |
+
"""Phases in strategy coordination."""
|
26 |
+
INITIALIZATION = "initialization"
|
27 |
+
EXECUTION = "execution"
|
28 |
+
SYNCHRONIZATION = "synchronization"
|
29 |
+
ADAPTATION = "adaptation"
|
30 |
+
COMPLETION = "completion"
|
31 |
+
|
32 |
+
@dataclass
|
33 |
+
class CoordinationState:
|
34 |
+
"""State of strategy coordination."""
|
35 |
+
pattern: CoordinationPattern
|
36 |
+
active_strategies: Dict[StrategyType, bool]
|
37 |
+
phase: CoordinationPhase
|
38 |
+
shared_context: Dict[str, Any]
|
39 |
+
synchronization_points: List[str]
|
40 |
+
adaptation_history: List[Dict[str, Any]]
|
41 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
42 |
+
|
43 |
+
@dataclass
|
44 |
+
class StrategyInteraction:
|
45 |
+
"""Interaction between strategies."""
|
46 |
+
source: StrategyType
|
47 |
+
target: StrategyType
|
48 |
+
interaction_type: str
|
49 |
+
data: Dict[str, Any]
|
50 |
+
timestamp: datetime = field(default_factory=datetime.now)
|
51 |
+
|
52 |
+
class StrategyCoordinator:
|
53 |
+
"""
|
54 |
+
Advanced strategy coordinator that:
|
55 |
+
1. Manages strategy interactions
|
56 |
+
2. Implements coordination patterns
|
57 |
+
3. Handles state synchronization
|
58 |
+
4. Adapts coordination dynamically
|
59 |
+
5. Optimizes strategy combinations
|
60 |
+
"""
|
61 |
+
|
62 |
+
def __init__(self,
|
63 |
+
strategies: Dict[StrategyType, ReasoningStrategy],
|
64 |
+
learning_rate: float = 0.1):
|
65 |
+
self.strategies = strategies
|
66 |
+
self.learning_rate = learning_rate
|
67 |
+
|
68 |
+
# Coordination state
|
69 |
+
self.states: Dict[str, CoordinationState] = {}
|
70 |
+
self.interactions: List[StrategyInteraction] = []
|
71 |
+
|
72 |
+
# Pattern performance
|
73 |
+
self.pattern_performance: Dict[CoordinationPattern, List[float]] = defaultdict(list)
|
74 |
+
self.pattern_weights: Dict[CoordinationPattern, float] = {
|
75 |
+
pattern: 1.0 for pattern in CoordinationPattern
|
76 |
+
}
|
77 |
+
|
78 |
+
async def coordinate(self,
|
79 |
+
query: str,
|
80 |
+
context: Dict[str, Any],
|
81 |
+
pattern: Optional[CoordinationPattern] = None) -> Dict[str, Any]:
|
82 |
+
"""Coordinate strategy execution using specified pattern."""
|
83 |
+
try:
|
84 |
+
# Select pattern if not specified
|
85 |
+
if not pattern:
|
86 |
+
pattern = await self._select_pattern(query, context)
|
87 |
+
|
88 |
+
# Initialize coordination
|
89 |
+
state = await self._initialize_coordination(pattern, context)
|
90 |
+
|
91 |
+
# Execute coordination pattern
|
92 |
+
if pattern == CoordinationPattern.PIPELINE:
|
93 |
+
result = await self._coordinate_pipeline(query, context, state)
|
94 |
+
elif pattern == CoordinationPattern.PARALLEL:
|
95 |
+
result = await self._coordinate_parallel(query, context, state)
|
96 |
+
elif pattern == CoordinationPattern.HIERARCHICAL:
|
97 |
+
result = await self._coordinate_hierarchical(query, context, state)
|
98 |
+
elif pattern == CoordinationPattern.FEEDBACK:
|
99 |
+
result = await self._coordinate_feedback(query, context, state)
|
100 |
+
elif pattern == CoordinationPattern.ADAPTIVE:
|
101 |
+
result = await self._coordinate_adaptive(query, context, state)
|
102 |
+
elif pattern == CoordinationPattern.ENSEMBLE:
|
103 |
+
result = await self._coordinate_ensemble(query, context, state)
|
104 |
+
else:
|
105 |
+
raise ValueError(f"Unsupported coordination pattern: {pattern}")
|
106 |
+
|
107 |
+
# Update performance metrics
|
108 |
+
self._update_pattern_performance(pattern, result)
|
109 |
+
|
110 |
+
return result
|
111 |
+
|
112 |
+
except Exception as e:
|
113 |
+
logging.error(f"Error in strategy coordination: {str(e)}")
|
114 |
+
return {
|
115 |
+
"success": False,
|
116 |
+
"error": str(e),
|
117 |
+
"pattern": pattern.value if pattern else None
|
118 |
+
}
|
119 |
+
|
120 |
+
async def _select_pattern(self, query: str, context: Dict[str, Any]) -> CoordinationPattern:
|
121 |
+
"""Select appropriate coordination pattern."""
|
122 |
+
prompt = f"""
|
123 |
+
Select coordination pattern:
|
124 |
+
Query: {query}
|
125 |
+
Context: {json.dumps(context)}
|
126 |
+
|
127 |
+
Consider:
|
128 |
+
1. Task complexity and type
|
129 |
+
2. Strategy dependencies
|
130 |
+
3. Resource constraints
|
131 |
+
4. Performance history
|
132 |
+
5. Adaptation needs
|
133 |
+
|
134 |
+
Format as:
|
135 |
+
[Selection]
|
136 |
+
Pattern: ...
|
137 |
+
Rationale: ...
|
138 |
+
Confidence: ...
|
139 |
+
"""
|
140 |
+
|
141 |
+
response = await context["groq_api"].predict(prompt)
|
142 |
+
selection = self._parse_pattern_selection(response["answer"])
|
143 |
+
|
144 |
+
# Weight by performance history
|
145 |
+
weighted_patterns = {
|
146 |
+
pattern: self.pattern_weights[pattern] * selection.get(pattern.value, 0.0)
|
147 |
+
for pattern in CoordinationPattern
|
148 |
+
}
|
149 |
+
|
150 |
+
return max(weighted_patterns.items(), key=lambda x: x[1])[0]
|
151 |
+
|
152 |
+
async def _coordinate_pipeline(self,
|
153 |
+
query: str,
|
154 |
+
context: Dict[str, Any],
|
155 |
+
state: CoordinationState) -> Dict[str, Any]:
|
156 |
+
"""Coordinate strategies in pipeline pattern."""
|
157 |
+
results = []
|
158 |
+
current_context = context.copy()
|
159 |
+
|
160 |
+
# Determine optimal order
|
161 |
+
strategy_order = await self._determine_pipeline_order(query, context)
|
162 |
+
|
163 |
+
for strategy_type in strategy_order:
|
164 |
+
try:
|
165 |
+
# Execute strategy
|
166 |
+
strategy = self.strategies[strategy_type]
|
167 |
+
result = await strategy.reason(query, current_context)
|
168 |
+
|
169 |
+
# Update context with result
|
170 |
+
current_context.update({
|
171 |
+
"previous_result": result,
|
172 |
+
"pipeline_position": len(results)
|
173 |
+
})
|
174 |
+
|
175 |
+
results.append(StrategyResult(
|
176 |
+
strategy_type=strategy_type,
|
177 |
+
success=result.get("success", False),
|
178 |
+
answer=result.get("answer"),
|
179 |
+
confidence=result.get("confidence", 0.0),
|
180 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
181 |
+
metadata=result.get("metadata", {}),
|
182 |
+
performance_metrics=result.get("performance_metrics", {})
|
183 |
+
))
|
184 |
+
|
185 |
+
# Record interaction
|
186 |
+
self._record_interaction(
|
187 |
+
source=strategy_type,
|
188 |
+
target=strategy_order[len(results)] if len(results) < len(strategy_order) else None,
|
189 |
+
interaction_type="pipeline_transfer",
|
190 |
+
data={"result": result}
|
191 |
+
)
|
192 |
+
|
193 |
+
except Exception as e:
|
194 |
+
logging.error(f"Error in pipeline strategy {strategy_type}: {str(e)}")
|
195 |
+
|
196 |
+
return {
|
197 |
+
"success": any(r.success for r in results),
|
198 |
+
"results": results,
|
199 |
+
"pattern": CoordinationPattern.PIPELINE.value,
|
200 |
+
"metrics": {
|
201 |
+
"total_steps": len(results),
|
202 |
+
"success_rate": sum(1 for r in results if r.success) / len(results) if results else 0
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
+
async def _coordinate_parallel(self,
|
207 |
+
query: str,
|
208 |
+
context: Dict[str, Any],
|
209 |
+
state: CoordinationState) -> Dict[str, Any]:
|
210 |
+
"""Coordinate strategies in parallel pattern."""
|
211 |
+
async def execute_strategy(strategy_type: StrategyType) -> StrategyResult:
|
212 |
+
try:
|
213 |
+
strategy = self.strategies[strategy_type]
|
214 |
+
result = await strategy.reason(query, context)
|
215 |
+
|
216 |
+
return StrategyResult(
|
217 |
+
strategy_type=strategy_type,
|
218 |
+
success=result.get("success", False),
|
219 |
+
answer=result.get("answer"),
|
220 |
+
confidence=result.get("confidence", 0.0),
|
221 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
222 |
+
metadata=result.get("metadata", {}),
|
223 |
+
performance_metrics=result.get("performance_metrics", {})
|
224 |
+
)
|
225 |
+
except Exception as e:
|
226 |
+
logging.error(f"Error in parallel strategy {strategy_type}: {str(e)}")
|
227 |
+
return StrategyResult(
|
228 |
+
strategy_type=strategy_type,
|
229 |
+
success=False,
|
230 |
+
answer=None,
|
231 |
+
confidence=0.0,
|
232 |
+
reasoning_trace=[{"error": str(e)}],
|
233 |
+
metadata={},
|
234 |
+
performance_metrics={}
|
235 |
+
)
|
236 |
+
|
237 |
+
# Execute strategies in parallel
|
238 |
+
tasks = [execute_strategy(strategy_type)
|
239 |
+
for strategy_type in state.active_strategies
|
240 |
+
if state.active_strategies[strategy_type]]
|
241 |
+
|
242 |
+
results = await asyncio.gather(*tasks)
|
243 |
+
|
244 |
+
# Synthesize results
|
245 |
+
synthesis = await self._synthesize_parallel_results(results, context)
|
246 |
+
|
247 |
+
return {
|
248 |
+
"success": synthesis.get("success", False),
|
249 |
+
"results": results,
|
250 |
+
"synthesis": synthesis,
|
251 |
+
"pattern": CoordinationPattern.PARALLEL.value,
|
252 |
+
"metrics": {
|
253 |
+
"total_strategies": len(results),
|
254 |
+
"success_rate": sum(1 for r in results if r.success) / len(results) if results else 0
|
255 |
+
}
|
256 |
+
}
|
257 |
+
|
258 |
+
async def _coordinate_hierarchical(self,
|
259 |
+
query: str,
|
260 |
+
context: Dict[str, Any],
|
261 |
+
state: CoordinationState) -> Dict[str, Any]:
|
262 |
+
"""Coordinate strategies in hierarchical pattern."""
|
263 |
+
# Build strategy hierarchy
|
264 |
+
hierarchy = await self._build_strategy_hierarchy(query, context)
|
265 |
+
results = {}
|
266 |
+
|
267 |
+
async def execute_level(level_strategies: List[StrategyType],
|
268 |
+
level_context: Dict[str, Any]) -> List[StrategyResult]:
|
269 |
+
tasks = []
|
270 |
+
for strategy_type in level_strategies:
|
271 |
+
if strategy_type in state.active_strategies and state.active_strategies[strategy_type]:
|
272 |
+
strategy = self.strategies[strategy_type]
|
273 |
+
tasks.append(strategy.reason(query, level_context))
|
274 |
+
|
275 |
+
level_results = await asyncio.gather(*tasks)
|
276 |
+
return [
|
277 |
+
StrategyResult(
|
278 |
+
strategy_type=strategy_type,
|
279 |
+
success=result.get("success", False),
|
280 |
+
answer=result.get("answer"),
|
281 |
+
confidence=result.get("confidence", 0.0),
|
282 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
283 |
+
metadata=result.get("metadata", {}),
|
284 |
+
performance_metrics=result.get("performance_metrics", {})
|
285 |
+
)
|
286 |
+
for strategy_type, result in zip(level_strategies, level_results)
|
287 |
+
]
|
288 |
+
|
289 |
+
# Execute hierarchy levels
|
290 |
+
current_context = context.copy()
|
291 |
+
for level, level_strategies in enumerate(hierarchy):
|
292 |
+
results[level] = await execute_level(level_strategies, current_context)
|
293 |
+
|
294 |
+
# Update context for next level
|
295 |
+
current_context.update({
|
296 |
+
"previous_level_results": results[level],
|
297 |
+
"hierarchy_level": level
|
298 |
+
})
|
299 |
+
|
300 |
+
return {
|
301 |
+
"success": any(any(r.success for r in level_results)
|
302 |
+
for level_results in results.values()),
|
303 |
+
"results": results,
|
304 |
+
"hierarchy": hierarchy,
|
305 |
+
"pattern": CoordinationPattern.HIERARCHICAL.value,
|
306 |
+
"metrics": {
|
307 |
+
"total_levels": len(hierarchy),
|
308 |
+
"level_success_rates": {
|
309 |
+
level: sum(1 for r in results[level] if r.success) / len(results[level])
|
310 |
+
for level in results if results[level]
|
311 |
+
}
|
312 |
+
}
|
313 |
+
}
|
314 |
+
|
315 |
+
async def _coordinate_feedback(self,
|
316 |
+
query: str,
|
317 |
+
context: Dict[str, Any],
|
318 |
+
state: CoordinationState) -> Dict[str, Any]:
|
319 |
+
"""Coordinate strategies with feedback loops."""
|
320 |
+
results = []
|
321 |
+
feedback_history = []
|
322 |
+
current_context = context.copy()
|
323 |
+
|
324 |
+
max_iterations = 5 # Prevent infinite loops
|
325 |
+
iteration = 0
|
326 |
+
|
327 |
+
while iteration < max_iterations:
|
328 |
+
iteration += 1
|
329 |
+
|
330 |
+
# Execute strategies
|
331 |
+
iteration_results = []
|
332 |
+
for strategy_type in state.active_strategies:
|
333 |
+
if state.active_strategies[strategy_type]:
|
334 |
+
try:
|
335 |
+
strategy = self.strategies[strategy_type]
|
336 |
+
result = await strategy.reason(query, current_context)
|
337 |
+
|
338 |
+
strategy_result = StrategyResult(
|
339 |
+
strategy_type=strategy_type,
|
340 |
+
success=result.get("success", False),
|
341 |
+
answer=result.get("answer"),
|
342 |
+
confidence=result.get("confidence", 0.0),
|
343 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
344 |
+
metadata=result.get("metadata", {}),
|
345 |
+
performance_metrics=result.get("performance_metrics", {})
|
346 |
+
)
|
347 |
+
|
348 |
+
iteration_results.append(strategy_result)
|
349 |
+
|
350 |
+
except Exception as e:
|
351 |
+
logging.error(f"Error in feedback strategy {strategy_type}: {str(e)}")
|
352 |
+
|
353 |
+
results.append(iteration_results)
|
354 |
+
|
355 |
+
# Generate feedback
|
356 |
+
feedback = await self._generate_feedback(iteration_results, current_context)
|
357 |
+
feedback_history.append(feedback)
|
358 |
+
|
359 |
+
# Check termination condition
|
360 |
+
if self._should_terminate_feedback(feedback, iteration_results):
|
361 |
+
break
|
362 |
+
|
363 |
+
# Update context with feedback
|
364 |
+
current_context.update({
|
365 |
+
"previous_results": iteration_results,
|
366 |
+
"feedback": feedback,
|
367 |
+
"iteration": iteration
|
368 |
+
})
|
369 |
+
|
370 |
+
return {
|
371 |
+
"success": any(any(r.success for r in iteration_results)
|
372 |
+
for iteration_results in results),
|
373 |
+
"results": results,
|
374 |
+
"feedback_history": feedback_history,
|
375 |
+
"pattern": CoordinationPattern.FEEDBACK.value,
|
376 |
+
"metrics": {
|
377 |
+
"total_iterations": iteration,
|
378 |
+
"feedback_impact": self._calculate_feedback_impact(results, feedback_history)
|
379 |
+
}
|
380 |
+
}
|
381 |
+
|
382 |
+
async def _coordinate_adaptive(self,
|
383 |
+
query: str,
|
384 |
+
context: Dict[str, Any],
|
385 |
+
state: CoordinationState) -> Dict[str, Any]:
|
386 |
+
"""Coordinate strategies with adaptive selection."""
|
387 |
+
results = []
|
388 |
+
adaptations = []
|
389 |
+
current_context = context.copy()
|
390 |
+
|
391 |
+
while len(results) < len(state.active_strategies):
|
392 |
+
# Select next strategy
|
393 |
+
next_strategy = await self._select_next_strategy(
|
394 |
+
results, state.active_strategies, current_context)
|
395 |
+
|
396 |
+
if not next_strategy:
|
397 |
+
break
|
398 |
+
|
399 |
+
try:
|
400 |
+
# Execute strategy
|
401 |
+
strategy = self.strategies[next_strategy]
|
402 |
+
result = await strategy.reason(query, current_context)
|
403 |
+
|
404 |
+
strategy_result = StrategyResult(
|
405 |
+
strategy_type=next_strategy,
|
406 |
+
success=result.get("success", False),
|
407 |
+
answer=result.get("answer"),
|
408 |
+
confidence=result.get("confidence", 0.0),
|
409 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
410 |
+
metadata=result.get("metadata", {}),
|
411 |
+
performance_metrics=result.get("performance_metrics", {})
|
412 |
+
)
|
413 |
+
|
414 |
+
results.append(strategy_result)
|
415 |
+
|
416 |
+
# Adapt strategy selection
|
417 |
+
adaptation = await self._adapt_strategy_selection(
|
418 |
+
strategy_result, current_context)
|
419 |
+
adaptations.append(adaptation)
|
420 |
+
|
421 |
+
# Update context
|
422 |
+
current_context.update({
|
423 |
+
"previous_results": results,
|
424 |
+
"adaptations": adaptations,
|
425 |
+
"current_strategy": next_strategy
|
426 |
+
})
|
427 |
+
|
428 |
+
except Exception as e:
|
429 |
+
logging.error(f"Error in adaptive strategy {next_strategy}: {str(e)}")
|
430 |
+
|
431 |
+
return {
|
432 |
+
"success": any(r.success for r in results),
|
433 |
+
"results": results,
|
434 |
+
"adaptations": adaptations,
|
435 |
+
"pattern": CoordinationPattern.ADAPTIVE.value,
|
436 |
+
"metrics": {
|
437 |
+
"total_strategies": len(results),
|
438 |
+
"adaptation_impact": self._calculate_adaptation_impact(results, adaptations)
|
439 |
+
}
|
440 |
+
}
|
441 |
+
|
442 |
+
async def _coordinate_ensemble(self,
|
443 |
+
query: str,
|
444 |
+
context: Dict[str, Any],
|
445 |
+
state: CoordinationState) -> Dict[str, Any]:
|
446 |
+
"""Coordinate strategies as an ensemble."""
|
447 |
+
# Execute all strategies
|
448 |
+
results = []
|
449 |
+
for strategy_type in state.active_strategies:
|
450 |
+
if state.active_strategies[strategy_type]:
|
451 |
+
try:
|
452 |
+
strategy = self.strategies[strategy_type]
|
453 |
+
result = await strategy.reason(query, context)
|
454 |
+
|
455 |
+
strategy_result = StrategyResult(
|
456 |
+
strategy_type=strategy_type,
|
457 |
+
success=result.get("success", False),
|
458 |
+
answer=result.get("answer"),
|
459 |
+
confidence=result.get("confidence", 0.0),
|
460 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
461 |
+
metadata=result.get("metadata", {}),
|
462 |
+
performance_metrics=result.get("performance_metrics", {})
|
463 |
+
)
|
464 |
+
|
465 |
+
results.append(strategy_result)
|
466 |
+
|
467 |
+
except Exception as e:
|
468 |
+
logging.error(f"Error in ensemble strategy {strategy_type}: {str(e)}")
|
469 |
+
|
470 |
+
# Combine results using ensemble methods
|
471 |
+
ensemble_result = await self._combine_ensemble_results(results, context)
|
472 |
+
|
473 |
+
return {
|
474 |
+
"success": ensemble_result.get("success", False),
|
475 |
+
"results": results,
|
476 |
+
"ensemble_result": ensemble_result,
|
477 |
+
"pattern": CoordinationPattern.ENSEMBLE.value,
|
478 |
+
"metrics": {
|
479 |
+
"total_members": len(results),
|
480 |
+
"ensemble_confidence": ensemble_result.get("confidence", 0.0)
|
481 |
+
}
|
482 |
+
}
|
483 |
+
|
484 |
+
def _record_interaction(self,
|
485 |
+
source: StrategyType,
|
486 |
+
target: Optional[StrategyType],
|
487 |
+
interaction_type: str,
|
488 |
+
data: Dict[str, Any]):
|
489 |
+
"""Record strategy interaction."""
|
490 |
+
self.interactions.append(StrategyInteraction(
|
491 |
+
source=source,
|
492 |
+
target=target,
|
493 |
+
interaction_type=interaction_type,
|
494 |
+
data=data
|
495 |
+
))
|
496 |
+
|
497 |
+
def _update_pattern_performance(self, pattern: CoordinationPattern, result: Dict[str, Any]):
|
498 |
+
"""Update pattern performance metrics."""
|
499 |
+
success_rate = result["metrics"].get("success_rate", 0.0)
|
500 |
+
self.pattern_performance[pattern].append(success_rate)
|
501 |
+
|
502 |
+
# Update weights using exponential moving average
|
503 |
+
current_weight = self.pattern_weights[pattern]
|
504 |
+
self.pattern_weights[pattern] = (
|
505 |
+
(1 - self.learning_rate) * current_weight +
|
506 |
+
self.learning_rate * success_rate
|
507 |
+
)
|
508 |
+
|
509 |
+
def get_performance_metrics(self) -> Dict[str, Any]:
|
510 |
+
"""Get comprehensive performance metrics."""
|
511 |
+
return {
|
512 |
+
"pattern_weights": dict(self.pattern_weights),
|
513 |
+
"average_performance": {
|
514 |
+
pattern.value: sum(scores) / len(scores) if scores else 0
|
515 |
+
for pattern, scores in self.pattern_performance.items()
|
516 |
+
},
|
517 |
+
"interaction_counts": defaultdict(int, {
|
518 |
+
interaction.interaction_type: 1
|
519 |
+
for interaction in self.interactions
|
520 |
+
}),
|
521 |
+
"active_patterns": [
|
522 |
+
pattern.value for pattern, weight in self.pattern_weights.items()
|
523 |
+
if weight > 0.5
|
524 |
+
]
|
525 |
+
}
|
reasoning/learning.py
ADDED
@@ -0,0 +1,394 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Enhanced learning mechanisms for reasoning strategies."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
@dataclass
|
13 |
+
class LearningEvent:
|
14 |
+
"""Event for strategy learning."""
|
15 |
+
strategy_type: str
|
16 |
+
event_type: str
|
17 |
+
data: Dict[str, Any]
|
18 |
+
outcome: Optional[float]
|
19 |
+
timestamp: datetime = field(default_factory=datetime.now)
|
20 |
+
|
21 |
+
class LearningMode(Enum):
|
22 |
+
"""Types of learning modes."""
|
23 |
+
SUPERVISED = "supervised"
|
24 |
+
REINFORCEMENT = "reinforcement"
|
25 |
+
ACTIVE = "active"
|
26 |
+
TRANSFER = "transfer"
|
27 |
+
META = "meta"
|
28 |
+
ENSEMBLE = "ensemble"
|
29 |
+
|
30 |
+
@dataclass
|
31 |
+
class LearningState:
|
32 |
+
"""State for learning process."""
|
33 |
+
mode: LearningMode
|
34 |
+
parameters: Dict[str, Any]
|
35 |
+
history: List[LearningEvent]
|
36 |
+
metrics: Dict[str, float]
|
37 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
38 |
+
|
39 |
+
class EnhancedLearningManager:
|
40 |
+
"""
|
41 |
+
Advanced learning manager that:
|
42 |
+
1. Implements multiple learning modes
|
43 |
+
2. Tracks learning progress
|
44 |
+
3. Adapts learning parameters
|
45 |
+
4. Optimizes strategy performance
|
46 |
+
5. Transfers knowledge between strategies
|
47 |
+
"""
|
48 |
+
|
49 |
+
def __init__(self,
|
50 |
+
learning_rate: float = 0.1,
|
51 |
+
exploration_rate: float = 0.2,
|
52 |
+
memory_size: int = 1000):
|
53 |
+
self.learning_rate = learning_rate
|
54 |
+
self.exploration_rate = exploration_rate
|
55 |
+
self.memory_size = memory_size
|
56 |
+
|
57 |
+
# Learning states
|
58 |
+
self.states: Dict[str, LearningState] = {}
|
59 |
+
|
60 |
+
# Performance tracking
|
61 |
+
self.performance_history: List[Dict[str, Any]] = []
|
62 |
+
self.strategy_metrics: Dict[str, List[float]] = defaultdict(list)
|
63 |
+
|
64 |
+
# Knowledge transfer
|
65 |
+
self.knowledge_base: Dict[str, Any] = {}
|
66 |
+
self.transfer_history: List[Dict[str, Any]] = []
|
67 |
+
|
68 |
+
async def learn(self,
|
69 |
+
strategy_type: str,
|
70 |
+
event: LearningEvent,
|
71 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
72 |
+
"""Learn from strategy execution event."""
|
73 |
+
try:
|
74 |
+
# Initialize or get learning state
|
75 |
+
state = self._get_learning_state(strategy_type)
|
76 |
+
|
77 |
+
# Select learning mode
|
78 |
+
mode = await self._select_learning_mode(event, state, context)
|
79 |
+
|
80 |
+
# Execute learning
|
81 |
+
if mode == LearningMode.SUPERVISED:
|
82 |
+
result = await self._supervised_learning(event, state, context)
|
83 |
+
elif mode == LearningMode.REINFORCEMENT:
|
84 |
+
result = await self._reinforcement_learning(event, state, context)
|
85 |
+
elif mode == LearningMode.ACTIVE:
|
86 |
+
result = await self._active_learning(event, state, context)
|
87 |
+
elif mode == LearningMode.TRANSFER:
|
88 |
+
result = await self._transfer_learning(event, state, context)
|
89 |
+
elif mode == LearningMode.META:
|
90 |
+
result = await self._meta_learning(event, state, context)
|
91 |
+
elif mode == LearningMode.ENSEMBLE:
|
92 |
+
result = await self._ensemble_learning(event, state, context)
|
93 |
+
else:
|
94 |
+
raise ValueError(f"Unsupported learning mode: {mode}")
|
95 |
+
|
96 |
+
# Update state
|
97 |
+
self._update_learning_state(state, result)
|
98 |
+
|
99 |
+
# Record performance
|
100 |
+
self._record_performance(strategy_type, result)
|
101 |
+
|
102 |
+
return result
|
103 |
+
|
104 |
+
except Exception as e:
|
105 |
+
logging.error(f"Error in learning: {str(e)}")
|
106 |
+
return {
|
107 |
+
"success": False,
|
108 |
+
"error": str(e),
|
109 |
+
"mode": mode.value if 'mode' in locals() else None
|
110 |
+
}
|
111 |
+
|
112 |
+
async def _supervised_learning(self,
|
113 |
+
event: LearningEvent,
|
114 |
+
state: LearningState,
|
115 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
116 |
+
"""Implement supervised learning."""
|
117 |
+
# Extract features and labels
|
118 |
+
features = await self._extract_features(event.data, context)
|
119 |
+
labels = event.outcome if event.outcome is not None else 0.0
|
120 |
+
|
121 |
+
# Train model
|
122 |
+
model_update = await self._update_model(features, labels, state, context)
|
123 |
+
|
124 |
+
# Validate performance
|
125 |
+
validation = await self._validate_model(model_update, state, context)
|
126 |
+
|
127 |
+
return {
|
128 |
+
"success": True,
|
129 |
+
"mode": LearningMode.SUPERVISED.value,
|
130 |
+
"model_update": model_update,
|
131 |
+
"validation": validation,
|
132 |
+
"metrics": {
|
133 |
+
"accuracy": validation.get("accuracy", 0.0),
|
134 |
+
"loss": validation.get("loss", 0.0)
|
135 |
+
}
|
136 |
+
}
|
137 |
+
|
138 |
+
async def _reinforcement_learning(self,
|
139 |
+
event: LearningEvent,
|
140 |
+
state: LearningState,
|
141 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
142 |
+
"""Implement reinforcement learning."""
|
143 |
+
# Extract state and action
|
144 |
+
current_state = await self._extract_state(event.data, context)
|
145 |
+
action = event.data.get("action")
|
146 |
+
reward = event.outcome if event.outcome is not None else 0.0
|
147 |
+
|
148 |
+
# Update policy
|
149 |
+
policy_update = await self._update_policy(
|
150 |
+
current_state, action, reward, state, context)
|
151 |
+
|
152 |
+
# Optimize value function
|
153 |
+
value_update = await self._update_value_function(
|
154 |
+
current_state, reward, state, context)
|
155 |
+
|
156 |
+
return {
|
157 |
+
"success": True,
|
158 |
+
"mode": LearningMode.REINFORCEMENT.value,
|
159 |
+
"policy_update": policy_update,
|
160 |
+
"value_update": value_update,
|
161 |
+
"metrics": {
|
162 |
+
"reward": reward,
|
163 |
+
"value_error": value_update.get("error", 0.0)
|
164 |
+
}
|
165 |
+
}
|
166 |
+
|
167 |
+
async def _active_learning(self,
|
168 |
+
event: LearningEvent,
|
169 |
+
state: LearningState,
|
170 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
171 |
+
"""Implement active learning."""
|
172 |
+
# Query selection
|
173 |
+
query = await self._select_query(event.data, state, context)
|
174 |
+
|
175 |
+
# Get feedback
|
176 |
+
feedback = await self._get_feedback(query, context)
|
177 |
+
|
178 |
+
# Update model
|
179 |
+
model_update = await self._update_model_active(
|
180 |
+
query, feedback, state, context)
|
181 |
+
|
182 |
+
return {
|
183 |
+
"success": True,
|
184 |
+
"mode": LearningMode.ACTIVE.value,
|
185 |
+
"query": query,
|
186 |
+
"feedback": feedback,
|
187 |
+
"model_update": model_update,
|
188 |
+
"metrics": {
|
189 |
+
"uncertainty": query.get("uncertainty", 0.0),
|
190 |
+
"feedback_quality": feedback.get("quality", 0.0)
|
191 |
+
}
|
192 |
+
}
|
193 |
+
|
194 |
+
async def _transfer_learning(self,
|
195 |
+
event: LearningEvent,
|
196 |
+
state: LearningState,
|
197 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
198 |
+
"""Implement transfer learning."""
|
199 |
+
# Source task selection
|
200 |
+
source_task = await self._select_source_task(event.data, state, context)
|
201 |
+
|
202 |
+
# Knowledge extraction
|
203 |
+
knowledge = await self._extract_knowledge(source_task, context)
|
204 |
+
|
205 |
+
# Transfer adaptation
|
206 |
+
adaptation = await self._adapt_knowledge(
|
207 |
+
knowledge, event.data, state, context)
|
208 |
+
|
209 |
+
# Apply transfer
|
210 |
+
transfer = await self._apply_transfer(adaptation, state, context)
|
211 |
+
|
212 |
+
return {
|
213 |
+
"success": True,
|
214 |
+
"mode": LearningMode.TRANSFER.value,
|
215 |
+
"source_task": source_task,
|
216 |
+
"knowledge": knowledge,
|
217 |
+
"adaptation": adaptation,
|
218 |
+
"transfer": transfer,
|
219 |
+
"metrics": {
|
220 |
+
"transfer_efficiency": transfer.get("efficiency", 0.0),
|
221 |
+
"adaptation_quality": adaptation.get("quality", 0.0)
|
222 |
+
}
|
223 |
+
}
|
224 |
+
|
225 |
+
async def _meta_learning(self,
|
226 |
+
event: LearningEvent,
|
227 |
+
state: LearningState,
|
228 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
229 |
+
"""Implement meta-learning."""
|
230 |
+
# Task characterization
|
231 |
+
task_char = await self._characterize_task(event.data, context)
|
232 |
+
|
233 |
+
# Strategy selection
|
234 |
+
strategy = await self._select_strategy(task_char, state, context)
|
235 |
+
|
236 |
+
# Parameter optimization
|
237 |
+
optimization = await self._optimize_parameters(
|
238 |
+
strategy, task_char, state, context)
|
239 |
+
|
240 |
+
# Apply meta-learning
|
241 |
+
meta_update = await self._apply_meta_learning(
|
242 |
+
optimization, state, context)
|
243 |
+
|
244 |
+
return {
|
245 |
+
"success": True,
|
246 |
+
"mode": LearningMode.META.value,
|
247 |
+
"task_characterization": task_char,
|
248 |
+
"strategy": strategy,
|
249 |
+
"optimization": optimization,
|
250 |
+
"meta_update": meta_update,
|
251 |
+
"metrics": {
|
252 |
+
"strategy_fit": strategy.get("fit_score", 0.0),
|
253 |
+
"optimization_improvement": optimization.get("improvement", 0.0)
|
254 |
+
}
|
255 |
+
}
|
256 |
+
|
257 |
+
async def _ensemble_learning(self,
|
258 |
+
event: LearningEvent,
|
259 |
+
state: LearningState,
|
260 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
261 |
+
"""Implement ensemble learning."""
|
262 |
+
# Member selection
|
263 |
+
members = await self._select_members(event.data, state, context)
|
264 |
+
|
265 |
+
# Weight optimization
|
266 |
+
weights = await self._optimize_weights(members, state, context)
|
267 |
+
|
268 |
+
# Combine predictions
|
269 |
+
combination = await self._combine_predictions(
|
270 |
+
members, weights, event.data, context)
|
271 |
+
|
272 |
+
return {
|
273 |
+
"success": True,
|
274 |
+
"mode": LearningMode.ENSEMBLE.value,
|
275 |
+
"members": members,
|
276 |
+
"weights": weights,
|
277 |
+
"combination": combination,
|
278 |
+
"metrics": {
|
279 |
+
"ensemble_diversity": weights.get("diversity", 0.0),
|
280 |
+
"combination_strength": combination.get("strength", 0.0)
|
281 |
+
}
|
282 |
+
}
|
283 |
+
|
284 |
+
def _get_learning_state(self, strategy_type: str) -> LearningState:
|
285 |
+
"""Get or initialize learning state for strategy."""
|
286 |
+
if strategy_type not in self.states:
|
287 |
+
self.states[strategy_type] = LearningState(
|
288 |
+
mode=LearningMode.SUPERVISED,
|
289 |
+
parameters={
|
290 |
+
"learning_rate": self.learning_rate,
|
291 |
+
"exploration_rate": self.exploration_rate
|
292 |
+
},
|
293 |
+
history=[],
|
294 |
+
metrics={}
|
295 |
+
)
|
296 |
+
return self.states[strategy_type]
|
297 |
+
|
298 |
+
def _update_learning_state(self, state: LearningState, result: Dict[str, Any]):
|
299 |
+
"""Update learning state with result."""
|
300 |
+
# Update history
|
301 |
+
state.history.append(LearningEvent(
|
302 |
+
strategy_type=result.get("strategy_type", "unknown"),
|
303 |
+
event_type="learning_update",
|
304 |
+
data=result,
|
305 |
+
outcome=result.get("metrics", {}).get("accuracy", 0.0),
|
306 |
+
timestamp=datetime.now()
|
307 |
+
))
|
308 |
+
|
309 |
+
# Update metrics
|
310 |
+
for metric, value in result.get("metrics", {}).items():
|
311 |
+
if metric in state.metrics:
|
312 |
+
state.metrics[metric] = (
|
313 |
+
0.9 * state.metrics[metric] + 0.1 * value # Exponential moving average
|
314 |
+
)
|
315 |
+
else:
|
316 |
+
state.metrics[metric] = value
|
317 |
+
|
318 |
+
# Adapt parameters
|
319 |
+
self._adapt_parameters(state, result)
|
320 |
+
|
321 |
+
def _record_performance(self, strategy_type: str, result: Dict[str, Any]):
|
322 |
+
"""Record learning performance."""
|
323 |
+
self.performance_history.append({
|
324 |
+
"timestamp": datetime.now().isoformat(),
|
325 |
+
"strategy_type": strategy_type,
|
326 |
+
"mode": result.get("mode"),
|
327 |
+
"metrics": result.get("metrics", {}),
|
328 |
+
"success": result.get("success", False)
|
329 |
+
})
|
330 |
+
|
331 |
+
# Update strategy metrics
|
332 |
+
for metric, value in result.get("metrics", {}).items():
|
333 |
+
self.strategy_metrics[f"{strategy_type}_{metric}"].append(value)
|
334 |
+
|
335 |
+
# Maintain memory size
|
336 |
+
if len(self.performance_history) > self.memory_size:
|
337 |
+
self.performance_history = self.performance_history[-self.memory_size:]
|
338 |
+
|
339 |
+
def _adapt_parameters(self, state: LearningState, result: Dict[str, Any]):
|
340 |
+
"""Adapt learning parameters based on performance."""
|
341 |
+
# Adapt learning rate
|
342 |
+
if "accuracy" in result.get("metrics", {}):
|
343 |
+
accuracy = result["metrics"]["accuracy"]
|
344 |
+
if accuracy > 0.8:
|
345 |
+
state.parameters["learning_rate"] *= 0.95 # Decrease if performing well
|
346 |
+
elif accuracy < 0.6:
|
347 |
+
state.parameters["learning_rate"] *= 1.05 # Increase if performing poorly
|
348 |
+
|
349 |
+
# Adapt exploration rate
|
350 |
+
if "reward" in result.get("metrics", {}):
|
351 |
+
reward = result["metrics"]["reward"]
|
352 |
+
if reward > 0:
|
353 |
+
state.parameters["exploration_rate"] *= 0.95 # Decrease if getting rewards
|
354 |
+
else:
|
355 |
+
state.parameters["exploration_rate"] *= 1.05 # Increase if not getting rewards
|
356 |
+
|
357 |
+
# Clip parameters to reasonable ranges
|
358 |
+
state.parameters["learning_rate"] = np.clip(
|
359 |
+
state.parameters["learning_rate"], 0.001, 0.5)
|
360 |
+
state.parameters["exploration_rate"] = np.clip(
|
361 |
+
state.parameters["exploration_rate"], 0.01, 0.5)
|
362 |
+
|
363 |
+
def get_performance_metrics(self) -> Dict[str, Any]:
|
364 |
+
"""Get comprehensive performance metrics."""
|
365 |
+
return {
|
366 |
+
"learning_states": {
|
367 |
+
strategy_type: {
|
368 |
+
"mode": state.mode.value,
|
369 |
+
"parameters": state.parameters,
|
370 |
+
"metrics": state.metrics
|
371 |
+
}
|
372 |
+
for strategy_type, state in self.states.items()
|
373 |
+
},
|
374 |
+
"strategy_performance": {
|
375 |
+
metric: {
|
376 |
+
"mean": np.mean(values) if values else 0.0,
|
377 |
+
"std": np.std(values) if values else 0.0,
|
378 |
+
"min": min(values) if values else 0.0,
|
379 |
+
"max": max(values) if values else 0.0
|
380 |
+
}
|
381 |
+
for metric, values in self.strategy_metrics.items()
|
382 |
+
},
|
383 |
+
"transfer_metrics": {
|
384 |
+
"total_transfers": len(self.transfer_history),
|
385 |
+
"success_rate": sum(1 for t in self.transfer_history if t.get("success", False)) / len(self.transfer_history) if self.transfer_history else 0
|
386 |
+
}
|
387 |
+
}
|
388 |
+
|
389 |
+
def clear_history(self):
|
390 |
+
"""Clear learning history and reset states."""
|
391 |
+
self.states.clear()
|
392 |
+
self.performance_history.clear()
|
393 |
+
self.strategy_metrics.clear()
|
394 |
+
self.transfer_history.clear()
|
reasoning/local_llm.py
ADDED
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Local LLM integration for the reasoning system."""
|
2 |
+
|
3 |
+
import os
|
4 |
+
from typing import Dict, Any, Optional
|
5 |
+
from datetime import datetime
|
6 |
+
import logging
|
7 |
+
from llama_cpp import Llama
|
8 |
+
import huggingface_hub
|
9 |
+
from .base import ReasoningStrategy
|
10 |
+
|
11 |
+
class LocalLLMStrategy(ReasoningStrategy):
|
12 |
+
"""Implements reasoning using local LLM."""
|
13 |
+
|
14 |
+
def __init__(self):
|
15 |
+
"""Initialize the local LLM strategy."""
|
16 |
+
self.repo_id = "tensorblock/Llama-3.2-3B-Overthinker-GGUF"
|
17 |
+
self.filename = "Llama-3.2-3B-Overthinker-Q8_0.gguf"
|
18 |
+
self.model_dir = "models"
|
19 |
+
self.logger = logging.getLogger(__name__)
|
20 |
+
self.model = None
|
21 |
+
|
22 |
+
async def initialize(self):
|
23 |
+
"""Initialize the model."""
|
24 |
+
try:
|
25 |
+
# Create models directory if it doesn't exist
|
26 |
+
os.makedirs(self.model_dir, exist_ok=True)
|
27 |
+
model_path = os.path.join(self.model_dir, self.filename)
|
28 |
+
|
29 |
+
# Download model if it doesn't exist
|
30 |
+
if not os.path.exists(model_path):
|
31 |
+
self.logger.info(f"Downloading model to {model_path}...")
|
32 |
+
model_path = huggingface_hub.hf_hub_download(
|
33 |
+
repo_id=self.repo_id,
|
34 |
+
filename=self.filename,
|
35 |
+
repo_type="model",
|
36 |
+
local_dir=self.model_dir,
|
37 |
+
local_dir_use_symlinks=False
|
38 |
+
)
|
39 |
+
self.logger.info("Model downloaded successfully!")
|
40 |
+
else:
|
41 |
+
self.logger.info("Using existing model file...")
|
42 |
+
|
43 |
+
# Try to use GPU, fall back to CPU if not available
|
44 |
+
try:
|
45 |
+
self.model = Llama(
|
46 |
+
model_path=model_path,
|
47 |
+
n_ctx=4096,
|
48 |
+
n_batch=512,
|
49 |
+
n_threads=8,
|
50 |
+
n_gpu_layers=35
|
51 |
+
)
|
52 |
+
self.logger.info("Model loaded with GPU acceleration!")
|
53 |
+
except Exception as e:
|
54 |
+
self.logger.warning(f"GPU loading failed: {e}, falling back to CPU...")
|
55 |
+
self.model = Llama(
|
56 |
+
model_path=model_path,
|
57 |
+
n_ctx=2048,
|
58 |
+
n_batch=512,
|
59 |
+
n_threads=4,
|
60 |
+
n_gpu_layers=0
|
61 |
+
)
|
62 |
+
self.logger.info("Model loaded in CPU-only mode")
|
63 |
+
|
64 |
+
except Exception as e:
|
65 |
+
self.logger.error(f"Error initializing model: {e}")
|
66 |
+
raise
|
67 |
+
|
68 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
69 |
+
"""Generate reasoning response using local LLM."""
|
70 |
+
try:
|
71 |
+
if not self.model:
|
72 |
+
await self.initialize()
|
73 |
+
|
74 |
+
# Format prompt with context
|
75 |
+
prompt = self._format_prompt(query, context)
|
76 |
+
|
77 |
+
# Generate response
|
78 |
+
response = self.model(
|
79 |
+
prompt,
|
80 |
+
max_tokens=1024 if self.model.n_ctx >= 4096 else 512,
|
81 |
+
temperature=0.7,
|
82 |
+
top_p=0.95,
|
83 |
+
repeat_penalty=1.1,
|
84 |
+
echo=False
|
85 |
+
)
|
86 |
+
|
87 |
+
# Extract and structure the response
|
88 |
+
result = self._parse_response(response['choices'][0]['text'])
|
89 |
+
|
90 |
+
return {
|
91 |
+
'success': True,
|
92 |
+
'answer': result['answer'],
|
93 |
+
'reasoning': result['reasoning'],
|
94 |
+
'confidence': result['confidence'],
|
95 |
+
'timestamp': datetime.now(),
|
96 |
+
'metadata': {
|
97 |
+
'model': self.repo_id,
|
98 |
+
'strategy': 'local_llm',
|
99 |
+
'context_length': len(prompt),
|
100 |
+
'response_length': len(response['choices'][0]['text'])
|
101 |
+
}
|
102 |
+
}
|
103 |
+
|
104 |
+
except Exception as e:
|
105 |
+
self.logger.error(f"Error in reasoning: {e}")
|
106 |
+
return {
|
107 |
+
'success': False,
|
108 |
+
'error': str(e),
|
109 |
+
'timestamp': datetime.now()
|
110 |
+
}
|
111 |
+
|
112 |
+
def _format_prompt(self, query: str, context: Dict[str, Any]) -> str:
|
113 |
+
"""Format the prompt with query and context."""
|
114 |
+
# Include relevant context
|
115 |
+
context_str = "\n".join([
|
116 |
+
f"{k}: {v}" for k, v in context.items()
|
117 |
+
if k in ['objective', 'constraints', 'background']
|
118 |
+
])
|
119 |
+
|
120 |
+
return f"""Let's solve this problem step by step.
|
121 |
+
|
122 |
+
Context:
|
123 |
+
{context_str}
|
124 |
+
|
125 |
+
Question: {query}
|
126 |
+
|
127 |
+
Let me break this down:
|
128 |
+
1."""
|
129 |
+
|
130 |
+
def _parse_response(self, text: str) -> Dict[str, Any]:
|
131 |
+
"""Parse the response into structured output."""
|
132 |
+
# Simple parsing for now
|
133 |
+
lines = text.strip().split('\n')
|
134 |
+
|
135 |
+
return {
|
136 |
+
'answer': lines[-1] if lines else '',
|
137 |
+
'reasoning': '\n'.join(lines[:-1]) if len(lines) > 1 else '',
|
138 |
+
'confidence': 0.8 # Default confidence
|
139 |
+
}
|
reasoning/market_analysis.py
ADDED
@@ -0,0 +1,342 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Advanced market analysis tools for venture strategies."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
@dataclass
|
13 |
+
class MarketSegment:
|
14 |
+
"""Market segment analysis."""
|
15 |
+
size: float
|
16 |
+
growth_rate: float
|
17 |
+
cagr: float
|
18 |
+
competition: List[Dict[str, Any]]
|
19 |
+
barriers: List[str]
|
20 |
+
opportunities: List[str]
|
21 |
+
risks: List[str]
|
22 |
+
|
23 |
+
@dataclass
|
24 |
+
class CompetitorAnalysis:
|
25 |
+
"""Competitor analysis."""
|
26 |
+
name: str
|
27 |
+
market_share: float
|
28 |
+
strengths: List[str]
|
29 |
+
weaknesses: List[str]
|
30 |
+
strategy: str
|
31 |
+
revenue: Optional[float]
|
32 |
+
valuation: Optional[float]
|
33 |
+
|
34 |
+
@dataclass
|
35 |
+
class MarketTrend:
|
36 |
+
"""Market trend analysis."""
|
37 |
+
name: str
|
38 |
+
impact: float
|
39 |
+
timeline: str
|
40 |
+
adoption_rate: float
|
41 |
+
market_potential: float
|
42 |
+
risk_level: float
|
43 |
+
|
44 |
+
class MarketAnalyzer:
|
45 |
+
"""
|
46 |
+
Advanced market analysis toolkit that:
|
47 |
+
1. Analyzes market segments
|
48 |
+
2. Tracks competitors
|
49 |
+
3. Identifies trends
|
50 |
+
4. Predicts opportunities
|
51 |
+
5. Assesses risks
|
52 |
+
"""
|
53 |
+
|
54 |
+
def __init__(self):
|
55 |
+
self.segments: Dict[str, MarketSegment] = {}
|
56 |
+
self.competitors: Dict[str, CompetitorAnalysis] = {}
|
57 |
+
self.trends: List[MarketTrend] = []
|
58 |
+
|
59 |
+
async def analyze_market(self,
|
60 |
+
segment: str,
|
61 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
62 |
+
"""Perform comprehensive market analysis."""
|
63 |
+
try:
|
64 |
+
# Segment analysis
|
65 |
+
segment_analysis = await self._analyze_segment(segment, context)
|
66 |
+
|
67 |
+
# Competitor analysis
|
68 |
+
competitor_analysis = await self._analyze_competitors(segment, context)
|
69 |
+
|
70 |
+
# Trend analysis
|
71 |
+
trend_analysis = await self._analyze_trends(segment, context)
|
72 |
+
|
73 |
+
# Opportunity analysis
|
74 |
+
opportunity_analysis = await self._analyze_opportunities(
|
75 |
+
segment_analysis, competitor_analysis, trend_analysis, context)
|
76 |
+
|
77 |
+
# Risk analysis
|
78 |
+
risk_analysis = await self._analyze_risks(
|
79 |
+
segment_analysis, competitor_analysis, trend_analysis, context)
|
80 |
+
|
81 |
+
return {
|
82 |
+
"success": True,
|
83 |
+
"segment_analysis": segment_analysis,
|
84 |
+
"competitor_analysis": competitor_analysis,
|
85 |
+
"trend_analysis": trend_analysis,
|
86 |
+
"opportunity_analysis": opportunity_analysis,
|
87 |
+
"risk_analysis": risk_analysis,
|
88 |
+
"metrics": {
|
89 |
+
"market_score": self._calculate_market_score(segment_analysis),
|
90 |
+
"opportunity_score": self._calculate_opportunity_score(opportunity_analysis),
|
91 |
+
"risk_score": self._calculate_risk_score(risk_analysis)
|
92 |
+
}
|
93 |
+
}
|
94 |
+
except Exception as e:
|
95 |
+
logging.error(f"Error in market analysis: {str(e)}")
|
96 |
+
return {"success": False, "error": str(e)}
|
97 |
+
|
98 |
+
async def _analyze_segment(self,
|
99 |
+
segment: str,
|
100 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
101 |
+
"""Analyze market segment."""
|
102 |
+
prompt = f"""
|
103 |
+
Analyze market segment:
|
104 |
+
Segment: {segment}
|
105 |
+
Context: {json.dumps(context)}
|
106 |
+
|
107 |
+
Analyze:
|
108 |
+
1. Market size and growth
|
109 |
+
2. Customer segments
|
110 |
+
3. Value chain
|
111 |
+
4. Entry barriers
|
112 |
+
5. Competitive dynamics
|
113 |
+
|
114 |
+
Format as:
|
115 |
+
[Analysis]
|
116 |
+
Size: ...
|
117 |
+
Growth: ...
|
118 |
+
Segments: ...
|
119 |
+
Value_Chain: ...
|
120 |
+
Barriers: ...
|
121 |
+
"""
|
122 |
+
|
123 |
+
response = await context["groq_api"].predict(prompt)
|
124 |
+
return self._parse_segment_analysis(response["answer"])
|
125 |
+
|
126 |
+
async def _analyze_competitors(self,
|
127 |
+
segment: str,
|
128 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
129 |
+
"""Analyze competitors in segment."""
|
130 |
+
prompt = f"""
|
131 |
+
Analyze competitors:
|
132 |
+
Segment: {segment}
|
133 |
+
Context: {json.dumps(context)}
|
134 |
+
|
135 |
+
For each competitor analyze:
|
136 |
+
1. Market share
|
137 |
+
2. Business model
|
138 |
+
3. Strengths/weaknesses
|
139 |
+
4. Strategy
|
140 |
+
5. Performance metrics
|
141 |
+
|
142 |
+
Format as:
|
143 |
+
[Competitor1]
|
144 |
+
Share: ...
|
145 |
+
Model: ...
|
146 |
+
Strengths: ...
|
147 |
+
Weaknesses: ...
|
148 |
+
Strategy: ...
|
149 |
+
Metrics: ...
|
150 |
+
"""
|
151 |
+
|
152 |
+
response = await context["groq_api"].predict(prompt)
|
153 |
+
return self._parse_competitor_analysis(response["answer"])
|
154 |
+
|
155 |
+
async def _analyze_trends(self,
|
156 |
+
segment: str,
|
157 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
158 |
+
"""Analyze market trends."""
|
159 |
+
prompt = f"""
|
160 |
+
Analyze market trends:
|
161 |
+
Segment: {segment}
|
162 |
+
Context: {json.dumps(context)}
|
163 |
+
|
164 |
+
Analyze trends in:
|
165 |
+
1. Technology
|
166 |
+
2. Customer behavior
|
167 |
+
3. Business models
|
168 |
+
4. Regulation
|
169 |
+
5. Market dynamics
|
170 |
+
|
171 |
+
Format as:
|
172 |
+
[Trend1]
|
173 |
+
Type: ...
|
174 |
+
Impact: ...
|
175 |
+
Timeline: ...
|
176 |
+
Adoption: ...
|
177 |
+
Potential: ...
|
178 |
+
"""
|
179 |
+
|
180 |
+
response = await context["groq_api"].predict(prompt)
|
181 |
+
return self._parse_trend_analysis(response["answer"])
|
182 |
+
|
183 |
+
async def _analyze_opportunities(self,
|
184 |
+
segment_analysis: Dict[str, Any],
|
185 |
+
competitor_analysis: Dict[str, Any],
|
186 |
+
trend_analysis: Dict[str, Any],
|
187 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
188 |
+
"""Analyze market opportunities."""
|
189 |
+
prompt = f"""
|
190 |
+
Analyze market opportunities:
|
191 |
+
Segment: {json.dumps(segment_analysis)}
|
192 |
+
Competitors: {json.dumps(competitor_analysis)}
|
193 |
+
Trends: {json.dumps(trend_analysis)}
|
194 |
+
Context: {json.dumps(context)}
|
195 |
+
|
196 |
+
Identify opportunities in:
|
197 |
+
1. Unmet needs
|
198 |
+
2. Market gaps
|
199 |
+
3. Innovation potential
|
200 |
+
4. Scaling potential
|
201 |
+
5. Value creation
|
202 |
+
|
203 |
+
Format as:
|
204 |
+
[Opportunity1]
|
205 |
+
Type: ...
|
206 |
+
Description: ...
|
207 |
+
Potential: ...
|
208 |
+
Requirements: ...
|
209 |
+
Timeline: ...
|
210 |
+
"""
|
211 |
+
|
212 |
+
response = await context["groq_api"].predict(prompt)
|
213 |
+
return self._parse_opportunity_analysis(response["answer"])
|
214 |
+
|
215 |
+
async def _analyze_risks(self,
|
216 |
+
segment_analysis: Dict[str, Any],
|
217 |
+
competitor_analysis: Dict[str, Any],
|
218 |
+
trend_analysis: Dict[str, Any],
|
219 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
220 |
+
"""Analyze market risks."""
|
221 |
+
prompt = f"""
|
222 |
+
Analyze market risks:
|
223 |
+
Segment: {json.dumps(segment_analysis)}
|
224 |
+
Competitors: {json.dumps(competitor_analysis)}
|
225 |
+
Trends: {json.dumps(trend_analysis)}
|
226 |
+
Context: {json.dumps(context)}
|
227 |
+
|
228 |
+
Analyze risks in:
|
229 |
+
1. Market dynamics
|
230 |
+
2. Competition
|
231 |
+
3. Technology
|
232 |
+
4. Regulation
|
233 |
+
5. Execution
|
234 |
+
|
235 |
+
Format as:
|
236 |
+
[Risk1]
|
237 |
+
Type: ...
|
238 |
+
Description: ...
|
239 |
+
Impact: ...
|
240 |
+
Probability: ...
|
241 |
+
Mitigation: ...
|
242 |
+
"""
|
243 |
+
|
244 |
+
response = await context["groq_api"].predict(prompt)
|
245 |
+
return self._parse_risk_analysis(response["answer"])
|
246 |
+
|
247 |
+
def _calculate_market_score(self, analysis: Dict[str, Any]) -> float:
|
248 |
+
"""Calculate market attractiveness score."""
|
249 |
+
weights = {
|
250 |
+
"size": 0.3,
|
251 |
+
"growth": 0.3,
|
252 |
+
"competition": 0.2,
|
253 |
+
"barriers": 0.1,
|
254 |
+
"dynamics": 0.1
|
255 |
+
}
|
256 |
+
|
257 |
+
scores = {
|
258 |
+
"size": min(analysis.get("size", 0) / 1e9, 1.0), # Normalize to 1B
|
259 |
+
"growth": min(analysis.get("growth", 0) / 30, 1.0), # Normalize to 30%
|
260 |
+
"competition": 1.0 - min(len(analysis.get("competitors", [])) / 10, 1.0),
|
261 |
+
"barriers": 1.0 - min(len(analysis.get("barriers", [])) / 5, 1.0),
|
262 |
+
"dynamics": analysis.get("dynamics_score", 0.5)
|
263 |
+
}
|
264 |
+
|
265 |
+
return sum(weights[k] * scores[k] for k in weights)
|
266 |
+
|
267 |
+
def _calculate_opportunity_score(self, analysis: Dict[str, Any]) -> float:
|
268 |
+
"""Calculate opportunity attractiveness score."""
|
269 |
+
weights = {
|
270 |
+
"market_potential": 0.3,
|
271 |
+
"innovation_potential": 0.2,
|
272 |
+
"execution_feasibility": 0.2,
|
273 |
+
"competitive_advantage": 0.2,
|
274 |
+
"timing": 0.1
|
275 |
+
}
|
276 |
+
|
277 |
+
scores = {
|
278 |
+
"market_potential": analysis.get("market_potential", 0.5),
|
279 |
+
"innovation_potential": analysis.get("innovation_potential", 0.5),
|
280 |
+
"execution_feasibility": analysis.get("execution_feasibility", 0.5),
|
281 |
+
"competitive_advantage": analysis.get("competitive_advantage", 0.5),
|
282 |
+
"timing": analysis.get("timing_score", 0.5)
|
283 |
+
}
|
284 |
+
|
285 |
+
return sum(weights[k] * scores[k] for k in weights)
|
286 |
+
|
287 |
+
def _calculate_risk_score(self, analysis: Dict[str, Any]) -> float:
|
288 |
+
"""Calculate risk level score."""
|
289 |
+
weights = {
|
290 |
+
"market_risk": 0.2,
|
291 |
+
"competition_risk": 0.2,
|
292 |
+
"technology_risk": 0.2,
|
293 |
+
"regulatory_risk": 0.2,
|
294 |
+
"execution_risk": 0.2
|
295 |
+
}
|
296 |
+
|
297 |
+
scores = {
|
298 |
+
"market_risk": analysis.get("market_risk", 0.5),
|
299 |
+
"competition_risk": analysis.get("competition_risk", 0.5),
|
300 |
+
"technology_risk": analysis.get("technology_risk", 0.5),
|
301 |
+
"regulatory_risk": analysis.get("regulatory_risk", 0.5),
|
302 |
+
"execution_risk": analysis.get("execution_risk", 0.5)
|
303 |
+
}
|
304 |
+
|
305 |
+
return sum(weights[k] * scores[k] for k in weights)
|
306 |
+
|
307 |
+
def get_market_insights(self) -> Dict[str, Any]:
|
308 |
+
"""Get comprehensive market insights."""
|
309 |
+
return {
|
310 |
+
"segment_insights": {
|
311 |
+
segment: {
|
312 |
+
"size": s.size,
|
313 |
+
"growth_rate": s.growth_rate,
|
314 |
+
"cagr": s.cagr,
|
315 |
+
"opportunity_score": self._calculate_market_score({
|
316 |
+
"size": s.size,
|
317 |
+
"growth": s.growth_rate,
|
318 |
+
"competitors": s.competition,
|
319 |
+
"barriers": s.barriers
|
320 |
+
})
|
321 |
+
}
|
322 |
+
for segment, s in self.segments.items()
|
323 |
+
},
|
324 |
+
"competitor_insights": {
|
325 |
+
competitor: {
|
326 |
+
"market_share": c.market_share,
|
327 |
+
"strength_score": len(c.strengths) / (len(c.strengths) + len(c.weaknesses)),
|
328 |
+
"revenue": c.revenue,
|
329 |
+
"valuation": c.valuation
|
330 |
+
}
|
331 |
+
for competitor, c in self.competitors.items()
|
332 |
+
},
|
333 |
+
"trend_insights": [
|
334 |
+
{
|
335 |
+
"name": t.name,
|
336 |
+
"impact": t.impact,
|
337 |
+
"potential": t.market_potential,
|
338 |
+
"risk": t.risk_level
|
339 |
+
}
|
340 |
+
for t in self.trends
|
341 |
+
]
|
342 |
+
}
|
reasoning/meta_learning.py
ADDED
@@ -0,0 +1,412 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Meta-learning reasoning implementation with advanced adaptation capabilities."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Tuple, Callable
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from collections import defaultdict
|
9 |
+
import numpy as np
|
10 |
+
from datetime import datetime
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class MetaFeatureType(Enum):
|
15 |
+
"""Types of meta-features for learning."""
|
16 |
+
PROBLEM_STRUCTURE = "problem_structure"
|
17 |
+
SOLUTION_PATTERN = "solution_pattern"
|
18 |
+
REASONING_STYLE = "reasoning_style"
|
19 |
+
ERROR_PATTERN = "error_pattern"
|
20 |
+
PERFORMANCE_METRIC = "performance_metric"
|
21 |
+
ADAPTATION_SIGNAL = "adaptation_signal"
|
22 |
+
|
23 |
+
@dataclass
|
24 |
+
class MetaFeature:
|
25 |
+
"""Represents a meta-feature for learning."""
|
26 |
+
type: MetaFeatureType
|
27 |
+
name: str
|
28 |
+
value: Any
|
29 |
+
confidence: float
|
30 |
+
timestamp: datetime
|
31 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
32 |
+
|
33 |
+
@dataclass
|
34 |
+
class LearningEpisode:
|
35 |
+
"""Represents a learning episode."""
|
36 |
+
id: str
|
37 |
+
query: str
|
38 |
+
features: List[MetaFeature]
|
39 |
+
outcome: Dict[str, Any]
|
40 |
+
performance: float
|
41 |
+
timestamp: datetime
|
42 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
43 |
+
|
44 |
+
class MetaLearningStrategy(ReasoningStrategy):
|
45 |
+
"""
|
46 |
+
Advanced Meta-Learning reasoning implementation with:
|
47 |
+
- Dynamic strategy adaptation
|
48 |
+
- Performance tracking
|
49 |
+
- Pattern recognition
|
50 |
+
- Automated optimization
|
51 |
+
- Cross-episode learning
|
52 |
+
"""
|
53 |
+
|
54 |
+
def __init__(self,
|
55 |
+
learning_rate: float = 0.1,
|
56 |
+
memory_size: int = 1000,
|
57 |
+
adaptation_threshold: float = 0.7,
|
58 |
+
exploration_rate: float = 0.2):
|
59 |
+
self.learning_rate = learning_rate
|
60 |
+
self.memory_size = memory_size
|
61 |
+
self.adaptation_threshold = adaptation_threshold
|
62 |
+
self.exploration_rate = exploration_rate
|
63 |
+
|
64 |
+
# Learning components
|
65 |
+
self.episode_memory: List[LearningEpisode] = []
|
66 |
+
self.feature_patterns: Dict[str, Dict[str, float]] = defaultdict(lambda: defaultdict(float))
|
67 |
+
self.strategy_performance: Dict[str, List[float]] = defaultdict(list)
|
68 |
+
self.adaptation_history: List[Dict[str, Any]] = []
|
69 |
+
|
70 |
+
# Performance tracking
|
71 |
+
self.success_rate: float = 0.0
|
72 |
+
self.adaptation_rate: float = 0.0
|
73 |
+
self.exploration_count: int = 0
|
74 |
+
|
75 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
76 |
+
"""Main reasoning method implementing meta-learning."""
|
77 |
+
try:
|
78 |
+
# Extract meta-features
|
79 |
+
features = await self._extract_meta_features(query, context)
|
80 |
+
|
81 |
+
# Select optimal strategy
|
82 |
+
strategy = await self._select_strategy(features, context)
|
83 |
+
|
84 |
+
# Apply strategy with adaptation
|
85 |
+
result = await self._apply_strategy(strategy, query, features, context)
|
86 |
+
|
87 |
+
# Learn from episode
|
88 |
+
episode = self._create_episode(query, features, result)
|
89 |
+
self._learn_from_episode(episode)
|
90 |
+
|
91 |
+
# Optimize performance
|
92 |
+
self._optimize_performance()
|
93 |
+
|
94 |
+
return {
|
95 |
+
"success": True,
|
96 |
+
"answer": result["answer"],
|
97 |
+
"confidence": result["confidence"],
|
98 |
+
"meta_features": [self._feature_to_dict(f) for f in features],
|
99 |
+
"selected_strategy": strategy,
|
100 |
+
"adaptations": result["adaptations"],
|
101 |
+
"performance_metrics": result["performance_metrics"],
|
102 |
+
"meta_insights": result["meta_insights"]
|
103 |
+
}
|
104 |
+
except Exception as e:
|
105 |
+
logging.error(f"Error in meta-learning reasoning: {str(e)}")
|
106 |
+
return {"success": False, "error": str(e)}
|
107 |
+
|
108 |
+
async def _extract_meta_features(self, query: str, context: Dict[str, Any]) -> List[MetaFeature]:
|
109 |
+
"""Extract meta-features from query and context."""
|
110 |
+
prompt = f"""
|
111 |
+
Extract meta-features for learning:
|
112 |
+
Query: {query}
|
113 |
+
Context: {json.dumps(context)}
|
114 |
+
|
115 |
+
For each feature type:
|
116 |
+
1. Problem Structure
|
117 |
+
2. Solution Patterns
|
118 |
+
3. Reasoning Style
|
119 |
+
4. Error Patterns
|
120 |
+
5. Performance Metrics
|
121 |
+
6. Adaptation Signals
|
122 |
+
|
123 |
+
Format as:
|
124 |
+
[Type1]
|
125 |
+
Name: ...
|
126 |
+
Value: ...
|
127 |
+
Confidence: ...
|
128 |
+
Metadata: ...
|
129 |
+
|
130 |
+
[Type2]
|
131 |
+
...
|
132 |
+
"""
|
133 |
+
|
134 |
+
response = await context["groq_api"].predict(prompt)
|
135 |
+
return self._parse_meta_features(response["answer"])
|
136 |
+
|
137 |
+
async def _select_strategy(self, features: List[MetaFeature], context: Dict[str, Any]) -> str:
|
138 |
+
"""Select optimal reasoning strategy based on meta-features."""
|
139 |
+
prompt = f"""
|
140 |
+
Select optimal reasoning strategy:
|
141 |
+
Features: {json.dumps([self._feature_to_dict(f) for f in features])}
|
142 |
+
Context: {json.dumps(context)}
|
143 |
+
|
144 |
+
Consider:
|
145 |
+
1. Past performance patterns
|
146 |
+
2. Feature relevance
|
147 |
+
3. Adaptation potential
|
148 |
+
4. Resource constraints
|
149 |
+
|
150 |
+
Format as:
|
151 |
+
[Selection]
|
152 |
+
Strategy: ...
|
153 |
+
Rationale: ...
|
154 |
+
Confidence: ...
|
155 |
+
Adaptations: ...
|
156 |
+
"""
|
157 |
+
|
158 |
+
response = await context["groq_api"].predict(prompt)
|
159 |
+
return self._parse_strategy_selection(response["answer"])
|
160 |
+
|
161 |
+
async def _apply_strategy(self, strategy: str, query: str, features: List[MetaFeature], context: Dict[str, Any]) -> Dict[str, Any]:
|
162 |
+
"""Apply selected strategy with dynamic adaptation."""
|
163 |
+
prompt = f"""
|
164 |
+
Apply strategy with meta-learning:
|
165 |
+
Strategy: {strategy}
|
166 |
+
Query: {query}
|
167 |
+
Features: {json.dumps([self._feature_to_dict(f) for f in features])}
|
168 |
+
Context: {json.dumps(context)}
|
169 |
+
|
170 |
+
Provide:
|
171 |
+
1. Main reasoning steps
|
172 |
+
2. Adaptation points
|
173 |
+
3. Performance metrics
|
174 |
+
4. Meta-insights
|
175 |
+
|
176 |
+
Format as:
|
177 |
+
[Application]
|
178 |
+
Steps: ...
|
179 |
+
Adaptations: ...
|
180 |
+
Metrics: ...
|
181 |
+
Insights: ...
|
182 |
+
|
183 |
+
[Result]
|
184 |
+
Answer: ...
|
185 |
+
Confidence: ...
|
186 |
+
"""
|
187 |
+
|
188 |
+
response = await context["groq_api"].predict(prompt)
|
189 |
+
return self._parse_strategy_application(response["answer"])
|
190 |
+
|
191 |
+
def _create_episode(self, query: str, features: List[MetaFeature], result: Dict[str, Any]) -> LearningEpisode:
|
192 |
+
"""Create a learning episode from the current interaction."""
|
193 |
+
return LearningEpisode(
|
194 |
+
id=f"episode_{len(self.episode_memory)}",
|
195 |
+
query=query,
|
196 |
+
features=features,
|
197 |
+
outcome=result,
|
198 |
+
performance=result.get("confidence", 0.0),
|
199 |
+
timestamp=datetime.now(),
|
200 |
+
metadata={
|
201 |
+
"adaptations": result.get("adaptations", []),
|
202 |
+
"metrics": result.get("performance_metrics", {})
|
203 |
+
}
|
204 |
+
)
|
205 |
+
|
206 |
+
def _learn_from_episode(self, episode: LearningEpisode):
|
207 |
+
"""Learn from a completed episode."""
|
208 |
+
# Update episode memory
|
209 |
+
self.episode_memory.append(episode)
|
210 |
+
if len(self.episode_memory) > self.memory_size:
|
211 |
+
self.episode_memory.pop(0)
|
212 |
+
|
213 |
+
# Update feature patterns
|
214 |
+
for feature in episode.features:
|
215 |
+
pattern_key = f"{feature.type.value}:{feature.name}"
|
216 |
+
self.feature_patterns[pattern_key]["count"] += 1
|
217 |
+
self.feature_patterns[pattern_key]["success"] += episode.performance
|
218 |
+
|
219 |
+
# Update strategy performance
|
220 |
+
strategy = episode.metadata.get("selected_strategy", "default")
|
221 |
+
self.strategy_performance[strategy].append(episode.performance)
|
222 |
+
|
223 |
+
# Track adaptations
|
224 |
+
self.adaptation_history.append({
|
225 |
+
"timestamp": episode.timestamp,
|
226 |
+
"adaptations": episode.metadata.get("adaptations", []),
|
227 |
+
"performance": episode.performance
|
228 |
+
})
|
229 |
+
|
230 |
+
# Update performance metrics
|
231 |
+
self._update_performance_metrics(episode)
|
232 |
+
|
233 |
+
def _optimize_performance(self):
|
234 |
+
"""Optimize meta-learning performance."""
|
235 |
+
# Adjust learning rate
|
236 |
+
recent_performance = [e.performance for e in self.episode_memory[-10:]]
|
237 |
+
if recent_performance:
|
238 |
+
avg_performance = sum(recent_performance) / len(recent_performance)
|
239 |
+
if avg_performance > 0.8:
|
240 |
+
self.learning_rate *= 0.9 # Reduce learning rate when performing well
|
241 |
+
elif avg_performance < 0.5:
|
242 |
+
self.learning_rate *= 1.1 # Increase learning rate when performing poorly
|
243 |
+
|
244 |
+
# Adjust exploration rate
|
245 |
+
self.exploration_rate = max(0.1, self.exploration_rate * 0.995) # Gradually reduce exploration
|
246 |
+
|
247 |
+
# Prune ineffective patterns
|
248 |
+
for pattern, stats in list(self.feature_patterns.items()):
|
249 |
+
if stats["count"] > 10 and stats["success"] / stats["count"] < 0.3:
|
250 |
+
del self.feature_patterns[pattern]
|
251 |
+
|
252 |
+
# Update adaptation threshold
|
253 |
+
recent_adaptations = [a["performance"] for a in self.adaptation_history[-10:]]
|
254 |
+
if recent_adaptations:
|
255 |
+
self.adaptation_threshold = sum(recent_adaptations) / len(recent_adaptations)
|
256 |
+
|
257 |
+
def _update_performance_metrics(self, episode: LearningEpisode):
|
258 |
+
"""Update performance tracking metrics."""
|
259 |
+
# Update success rate
|
260 |
+
self.success_rate = (self.success_rate * len(self.episode_memory) + episode.performance) / (len(self.episode_memory) + 1)
|
261 |
+
|
262 |
+
# Update adaptation rate
|
263 |
+
adaptations = len(episode.metadata.get("adaptations", []))
|
264 |
+
self.adaptation_rate = (self.adaptation_rate * len(self.adaptation_history) + (adaptations > 0)) / (len(self.adaptation_history) + 1)
|
265 |
+
|
266 |
+
# Track exploration
|
267 |
+
if episode.metadata.get("exploration", False):
|
268 |
+
self.exploration_count += 1
|
269 |
+
|
270 |
+
def _parse_meta_features(self, response: str) -> List[MetaFeature]:
|
271 |
+
"""Parse meta-features from response."""
|
272 |
+
features = []
|
273 |
+
current_type = None
|
274 |
+
current_feature = None
|
275 |
+
|
276 |
+
for line in response.split('\n'):
|
277 |
+
line = line.strip()
|
278 |
+
if not line:
|
279 |
+
continue
|
280 |
+
|
281 |
+
if line.startswith('[Type'):
|
282 |
+
if current_feature:
|
283 |
+
features.append(current_feature)
|
284 |
+
current_feature = None
|
285 |
+
try:
|
286 |
+
type_str = line[1:-1].lower()
|
287 |
+
current_type = MetaFeatureType(type_str)
|
288 |
+
except ValueError:
|
289 |
+
current_type = None
|
290 |
+
elif current_type and line.startswith('Name:'):
|
291 |
+
current_feature = MetaFeature(
|
292 |
+
type=current_type,
|
293 |
+
name=line[5:].strip(),
|
294 |
+
value=None,
|
295 |
+
confidence=0.0,
|
296 |
+
timestamp=datetime.now(),
|
297 |
+
metadata={}
|
298 |
+
)
|
299 |
+
elif current_feature:
|
300 |
+
if line.startswith('Value:'):
|
301 |
+
current_feature.value = line[6:].strip()
|
302 |
+
elif line.startswith('Confidence:'):
|
303 |
+
try:
|
304 |
+
current_feature.confidence = float(line[11:].strip())
|
305 |
+
except:
|
306 |
+
pass
|
307 |
+
elif line.startswith('Metadata:'):
|
308 |
+
try:
|
309 |
+
current_feature.metadata = json.loads(line[9:].strip())
|
310 |
+
except:
|
311 |
+
pass
|
312 |
+
|
313 |
+
if current_feature:
|
314 |
+
features.append(current_feature)
|
315 |
+
|
316 |
+
return features
|
317 |
+
|
318 |
+
def _parse_strategy_selection(self, response: str) -> str:
|
319 |
+
"""Parse strategy selection from response."""
|
320 |
+
lines = response.split('\n')
|
321 |
+
strategy = "default"
|
322 |
+
|
323 |
+
for line in lines:
|
324 |
+
if line.startswith('Strategy:'):
|
325 |
+
strategy = line[9:].strip()
|
326 |
+
break
|
327 |
+
|
328 |
+
return strategy
|
329 |
+
|
330 |
+
def _parse_strategy_application(self, response: str) -> Dict[str, Any]:
|
331 |
+
"""Parse strategy application results."""
|
332 |
+
result = {
|
333 |
+
"answer": "",
|
334 |
+
"confidence": 0.0,
|
335 |
+
"steps": [],
|
336 |
+
"adaptations": [],
|
337 |
+
"performance_metrics": {},
|
338 |
+
"meta_insights": []
|
339 |
+
}
|
340 |
+
|
341 |
+
section = None
|
342 |
+
for line in response.split('\n'):
|
343 |
+
line = line.strip()
|
344 |
+
if not line:
|
345 |
+
continue
|
346 |
+
|
347 |
+
if line.startswith('[Application]'):
|
348 |
+
section = "application"
|
349 |
+
elif line.startswith('[Result]'):
|
350 |
+
section = "result"
|
351 |
+
elif section == "application":
|
352 |
+
if line.startswith('Steps:'):
|
353 |
+
result["steps"] = [s.strip() for s in line[6:].split(',')]
|
354 |
+
elif line.startswith('Adaptations:'):
|
355 |
+
result["adaptations"] = [a.strip() for a in line[12:].split(',')]
|
356 |
+
elif line.startswith('Metrics:'):
|
357 |
+
try:
|
358 |
+
result["performance_metrics"] = json.loads(line[8:].strip())
|
359 |
+
except:
|
360 |
+
pass
|
361 |
+
elif line.startswith('Insights:'):
|
362 |
+
result["meta_insights"] = [i.strip() for i in line[9:].split(',')]
|
363 |
+
elif section == "result":
|
364 |
+
if line.startswith('Answer:'):
|
365 |
+
result["answer"] = line[7:].strip()
|
366 |
+
elif line.startswith('Confidence:'):
|
367 |
+
try:
|
368 |
+
result["confidence"] = float(line[11:].strip())
|
369 |
+
except:
|
370 |
+
result["confidence"] = 0.5
|
371 |
+
|
372 |
+
return result
|
373 |
+
|
374 |
+
def _feature_to_dict(self, feature: MetaFeature) -> Dict[str, Any]:
|
375 |
+
"""Convert feature to dictionary for serialization."""
|
376 |
+
return {
|
377 |
+
"type": feature.type.value,
|
378 |
+
"name": feature.name,
|
379 |
+
"value": feature.value,
|
380 |
+
"confidence": feature.confidence,
|
381 |
+
"timestamp": feature.timestamp.isoformat(),
|
382 |
+
"metadata": feature.metadata
|
383 |
+
}
|
384 |
+
|
385 |
+
def get_performance_metrics(self) -> Dict[str, Any]:
|
386 |
+
"""Get current performance metrics."""
|
387 |
+
return {
|
388 |
+
"success_rate": self.success_rate,
|
389 |
+
"adaptation_rate": self.adaptation_rate,
|
390 |
+
"exploration_count": self.exploration_count,
|
391 |
+
"episode_count": len(self.episode_memory),
|
392 |
+
"pattern_count": len(self.feature_patterns),
|
393 |
+
"learning_rate": self.learning_rate,
|
394 |
+
"exploration_rate": self.exploration_rate
|
395 |
+
}
|
396 |
+
|
397 |
+
def get_top_patterns(self, n: int = 10) -> List[Tuple[str, float]]:
|
398 |
+
"""Get top performing patterns."""
|
399 |
+
pattern_scores = []
|
400 |
+
for pattern, stats in self.feature_patterns.items():
|
401 |
+
if stats["count"] > 0:
|
402 |
+
score = stats["success"] / stats["count"]
|
403 |
+
pattern_scores.append((pattern, score))
|
404 |
+
|
405 |
+
return sorted(pattern_scores, key=lambda x: x[1], reverse=True)[:n]
|
406 |
+
|
407 |
+
def clear_memory(self):
|
408 |
+
"""Clear learning memory."""
|
409 |
+
self.episode_memory.clear()
|
410 |
+
self.feature_patterns.clear()
|
411 |
+
self.strategy_performance.clear()
|
412 |
+
self.adaptation_history.clear()
|
reasoning/monetization.py
ADDED
@@ -0,0 +1,278 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Advanced monetization strategies for venture optimization."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
@dataclass
|
13 |
+
class MonetizationModel:
|
14 |
+
"""Monetization model configuration."""
|
15 |
+
name: str
|
16 |
+
type: str
|
17 |
+
pricing_tiers: List[Dict[str, Any]]
|
18 |
+
features: List[str]
|
19 |
+
constraints: List[str]
|
20 |
+
metrics: Dict[str, float]
|
21 |
+
|
22 |
+
@dataclass
|
23 |
+
class RevenueStream:
|
24 |
+
"""Revenue stream configuration."""
|
25 |
+
name: str
|
26 |
+
type: str
|
27 |
+
volume: float
|
28 |
+
unit_economics: Dict[str, float]
|
29 |
+
growth_rate: float
|
30 |
+
churn_rate: float
|
31 |
+
|
32 |
+
class MonetizationOptimizer:
|
33 |
+
"""
|
34 |
+
Advanced monetization optimization that:
|
35 |
+
1. Designs pricing models
|
36 |
+
2. Optimizes revenue streams
|
37 |
+
3. Maximizes customer value
|
38 |
+
4. Reduces churn
|
39 |
+
5. Increases lifetime value
|
40 |
+
"""
|
41 |
+
|
42 |
+
def __init__(self):
|
43 |
+
self.models: Dict[str, MonetizationModel] = {}
|
44 |
+
self.streams: Dict[str, RevenueStream] = {}
|
45 |
+
|
46 |
+
async def optimize_monetization(self,
|
47 |
+
venture_type: str,
|
48 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
49 |
+
"""Optimize monetization strategy."""
|
50 |
+
try:
|
51 |
+
# Design models
|
52 |
+
models = await self._design_models(venture_type, context)
|
53 |
+
|
54 |
+
# Optimize pricing
|
55 |
+
pricing = await self._optimize_pricing(models, context)
|
56 |
+
|
57 |
+
# Revenue optimization
|
58 |
+
revenue = await self._optimize_revenue(pricing, context)
|
59 |
+
|
60 |
+
# Value optimization
|
61 |
+
value = await self._optimize_value(revenue, context)
|
62 |
+
|
63 |
+
# Performance projections
|
64 |
+
projections = await self._project_performance(value, context)
|
65 |
+
|
66 |
+
return {
|
67 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
68 |
+
"models": models,
|
69 |
+
"pricing": pricing,
|
70 |
+
"revenue": revenue,
|
71 |
+
"value": value,
|
72 |
+
"projections": projections
|
73 |
+
}
|
74 |
+
except Exception as e:
|
75 |
+
logging.error(f"Error in monetization optimization: {str(e)}")
|
76 |
+
return {"success": False, "error": str(e)}
|
77 |
+
|
78 |
+
async def _design_models(self,
|
79 |
+
venture_type: str,
|
80 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
81 |
+
"""Design monetization models."""
|
82 |
+
prompt = f"""
|
83 |
+
Design monetization models:
|
84 |
+
Venture: {venture_type}
|
85 |
+
Context: {json.dumps(context)}
|
86 |
+
|
87 |
+
Design models for:
|
88 |
+
1. Subscription tiers
|
89 |
+
2. Usage-based pricing
|
90 |
+
3. Hybrid models
|
91 |
+
4. Enterprise pricing
|
92 |
+
5. Marketplace fees
|
93 |
+
|
94 |
+
Format as:
|
95 |
+
[Model1]
|
96 |
+
Name: ...
|
97 |
+
Type: ...
|
98 |
+
Tiers: ...
|
99 |
+
Features: ...
|
100 |
+
Constraints: ...
|
101 |
+
"""
|
102 |
+
|
103 |
+
response = await context["groq_api"].predict(prompt)
|
104 |
+
return self._parse_model_design(response["answer"])
|
105 |
+
|
106 |
+
async def _optimize_pricing(self,
|
107 |
+
models: Dict[str, Any],
|
108 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
109 |
+
"""Optimize pricing strategy."""
|
110 |
+
prompt = f"""
|
111 |
+
Optimize pricing strategy:
|
112 |
+
Models: {json.dumps(models)}
|
113 |
+
Context: {json.dumps(context)}
|
114 |
+
|
115 |
+
Optimize for:
|
116 |
+
1. Market positioning
|
117 |
+
2. Value perception
|
118 |
+
3. Competitive dynamics
|
119 |
+
4. Customer segments
|
120 |
+
5. Growth potential
|
121 |
+
|
122 |
+
Format as:
|
123 |
+
[Strategy1]
|
124 |
+
Model: ...
|
125 |
+
Positioning: ...
|
126 |
+
Value_Props: ...
|
127 |
+
Segments: ...
|
128 |
+
Growth: ...
|
129 |
+
"""
|
130 |
+
|
131 |
+
response = await context["groq_api"].predict(prompt)
|
132 |
+
return self._parse_pricing_strategy(response["answer"])
|
133 |
+
|
134 |
+
async def _optimize_revenue(self,
|
135 |
+
pricing: Dict[str, Any],
|
136 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
137 |
+
"""Optimize revenue streams."""
|
138 |
+
prompt = f"""
|
139 |
+
Optimize revenue streams:
|
140 |
+
Pricing: {json.dumps(pricing)}
|
141 |
+
Context: {json.dumps(context)}
|
142 |
+
|
143 |
+
Optimize for:
|
144 |
+
1. Revenue mix
|
145 |
+
2. Growth drivers
|
146 |
+
3. Retention factors
|
147 |
+
4. Expansion potential
|
148 |
+
5. Risk mitigation
|
149 |
+
|
150 |
+
Format as:
|
151 |
+
[Stream1]
|
152 |
+
Type: ...
|
153 |
+
Drivers: ...
|
154 |
+
Retention: ...
|
155 |
+
Expansion: ...
|
156 |
+
Risks: ...
|
157 |
+
"""
|
158 |
+
|
159 |
+
response = await context["groq_api"].predict(prompt)
|
160 |
+
return self._parse_revenue_optimization(response["answer"])
|
161 |
+
|
162 |
+
async def _optimize_value(self,
|
163 |
+
revenue: Dict[str, Any],
|
164 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
165 |
+
"""Optimize customer value."""
|
166 |
+
prompt = f"""
|
167 |
+
Optimize customer value:
|
168 |
+
Revenue: {json.dumps(revenue)}
|
169 |
+
Context: {json.dumps(context)}
|
170 |
+
|
171 |
+
Optimize for:
|
172 |
+
1. Acquisition cost
|
173 |
+
2. Lifetime value
|
174 |
+
3. Churn reduction
|
175 |
+
4. Upsell potential
|
176 |
+
5. Network effects
|
177 |
+
|
178 |
+
Format as:
|
179 |
+
[Value1]
|
180 |
+
Metric: ...
|
181 |
+
Strategy: ...
|
182 |
+
Potential: ...
|
183 |
+
Actions: ...
|
184 |
+
Timeline: ...
|
185 |
+
"""
|
186 |
+
|
187 |
+
response = await context["groq_api"].predict(prompt)
|
188 |
+
return self._parse_value_optimization(response["answer"])
|
189 |
+
|
190 |
+
async def _project_performance(self,
|
191 |
+
value: Dict[str, Any],
|
192 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
193 |
+
"""Project monetization performance."""
|
194 |
+
prompt = f"""
|
195 |
+
Project performance:
|
196 |
+
Value: {json.dumps(value)}
|
197 |
+
Context: {json.dumps(context)}
|
198 |
+
|
199 |
+
Project:
|
200 |
+
1. Revenue growth
|
201 |
+
2. Customer metrics
|
202 |
+
3. Unit economics
|
203 |
+
4. Profitability
|
204 |
+
5. Scale effects
|
205 |
+
|
206 |
+
Format as:
|
207 |
+
[Projections]
|
208 |
+
Revenue: ...
|
209 |
+
Metrics: ...
|
210 |
+
Economics: ...
|
211 |
+
Profit: ...
|
212 |
+
Scale: ...
|
213 |
+
"""
|
214 |
+
|
215 |
+
response = await context["groq_api"].predict(prompt)
|
216 |
+
return self._parse_performance_projections(response["answer"])
|
217 |
+
|
218 |
+
def _calculate_revenue_potential(self, model: MonetizationModel) -> float:
|
219 |
+
"""Calculate revenue potential for model."""
|
220 |
+
base_potential = sum(
|
221 |
+
tier.get("price", 0) * tier.get("volume", 0)
|
222 |
+
for tier in model.pricing_tiers
|
223 |
+
)
|
224 |
+
|
225 |
+
growth_factor = 1.0 + (model.metrics.get("growth_rate", 0) / 100)
|
226 |
+
retention_factor = 1.0 - (model.metrics.get("churn_rate", 0) / 100)
|
227 |
+
|
228 |
+
return base_potential * growth_factor * retention_factor
|
229 |
+
|
230 |
+
def _calculate_customer_ltv(self, stream: RevenueStream) -> float:
|
231 |
+
"""Calculate customer lifetime value."""
|
232 |
+
monthly_revenue = stream.volume * stream.unit_economics.get("arpu", 0)
|
233 |
+
churn_rate = stream.churn_rate / 100
|
234 |
+
discount_rate = 0.1 # 10% annual discount rate
|
235 |
+
|
236 |
+
if churn_rate > 0:
|
237 |
+
ltv = monthly_revenue / churn_rate
|
238 |
+
else:
|
239 |
+
ltv = monthly_revenue * 12 # Assume 1 year if no churn
|
240 |
+
|
241 |
+
return ltv / (1 + discount_rate)
|
242 |
+
|
243 |
+
def get_monetization_metrics(self) -> Dict[str, Any]:
|
244 |
+
"""Get comprehensive monetization metrics."""
|
245 |
+
return {
|
246 |
+
"model_metrics": {
|
247 |
+
model.name: {
|
248 |
+
"revenue_potential": self._calculate_revenue_potential(model),
|
249 |
+
"tier_count": len(model.pricing_tiers),
|
250 |
+
"feature_count": len(model.features),
|
251 |
+
"constraint_count": len(model.constraints)
|
252 |
+
}
|
253 |
+
for model in self.models.values()
|
254 |
+
},
|
255 |
+
"stream_metrics": {
|
256 |
+
stream.name: {
|
257 |
+
"monthly_revenue": stream.volume * stream.unit_economics.get("arpu", 0),
|
258 |
+
"ltv": self._calculate_customer_ltv(stream),
|
259 |
+
"growth_rate": stream.growth_rate,
|
260 |
+
"churn_rate": stream.churn_rate
|
261 |
+
}
|
262 |
+
for stream in self.streams.values()
|
263 |
+
},
|
264 |
+
"aggregate_metrics": {
|
265 |
+
"total_revenue_potential": sum(
|
266 |
+
self._calculate_revenue_potential(model)
|
267 |
+
for model in self.models.values()
|
268 |
+
),
|
269 |
+
"average_ltv": np.mean([
|
270 |
+
self._calculate_customer_ltv(stream)
|
271 |
+
for stream in self.streams.values()
|
272 |
+
]) if self.streams else 0,
|
273 |
+
"weighted_growth_rate": np.average(
|
274 |
+
[stream.growth_rate for stream in self.streams.values()],
|
275 |
+
weights=[stream.volume for stream in self.streams.values()]
|
276 |
+
) if self.streams else 0
|
277 |
+
}
|
278 |
+
}
|
reasoning/multimodal.py
ADDED
@@ -0,0 +1,268 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Multi-modal reasoning implementation."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List
|
5 |
+
import json
|
6 |
+
|
7 |
+
from .base import ReasoningStrategy
|
8 |
+
|
9 |
+
class MultiModalReasoning(ReasoningStrategy):
|
10 |
+
"""Implements multi-modal reasoning across different types of information."""
|
11 |
+
|
12 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
13 |
+
try:
|
14 |
+
# Process different modalities
|
15 |
+
modalities = await self._process_modalities(query, context)
|
16 |
+
|
17 |
+
# Cross-modal alignment
|
18 |
+
alignment = await self._cross_modal_alignment(modalities, context)
|
19 |
+
|
20 |
+
# Integrated analysis
|
21 |
+
integration = await self._integrated_analysis(alignment, context)
|
22 |
+
|
23 |
+
# Generate unified response
|
24 |
+
response = await self._generate_response(integration, context)
|
25 |
+
|
26 |
+
return {
|
27 |
+
"success": True,
|
28 |
+
"answer": response["conclusion"],
|
29 |
+
"modalities": modalities,
|
30 |
+
"alignment": alignment,
|
31 |
+
"integration": integration,
|
32 |
+
"confidence": response["confidence"]
|
33 |
+
}
|
34 |
+
except Exception as e:
|
35 |
+
logging.error(f"Error in multi-modal reasoning: {str(e)}")
|
36 |
+
return {"success": False, "error": str(e)}
|
37 |
+
|
38 |
+
async def _process_modalities(self, query: str, context: Dict[str, Any]) -> Dict[str, List[Dict[str, Any]]]:
|
39 |
+
"""Process query across different modalities."""
|
40 |
+
prompt = f"""
|
41 |
+
Process query across modalities:
|
42 |
+
Query: {query}
|
43 |
+
Context: {json.dumps(context)}
|
44 |
+
|
45 |
+
For each modality extract:
|
46 |
+
1. [Type]: Modality type
|
47 |
+
2. [Content]: Relevant content
|
48 |
+
3. [Features]: Key features
|
49 |
+
4. [Quality]: Content quality
|
50 |
+
|
51 |
+
Format as:
|
52 |
+
[M1]
|
53 |
+
Type: ...
|
54 |
+
Content: ...
|
55 |
+
Features: ...
|
56 |
+
Quality: ...
|
57 |
+
"""
|
58 |
+
|
59 |
+
response = await context["groq_api"].predict(prompt)
|
60 |
+
return self._parse_modalities(response["answer"])
|
61 |
+
|
62 |
+
async def _cross_modal_alignment(self, modalities: Dict[str, List[Dict[str, Any]]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
63 |
+
"""Align information across different modalities."""
|
64 |
+
try:
|
65 |
+
# Extract modality types
|
66 |
+
modal_types = list(modalities.keys())
|
67 |
+
|
68 |
+
# Initialize alignment results
|
69 |
+
alignments = []
|
70 |
+
|
71 |
+
# Process each modality pair
|
72 |
+
for i in range(len(modal_types)):
|
73 |
+
for j in range(i + 1, len(modal_types)):
|
74 |
+
type1, type2 = modal_types[i], modal_types[j]
|
75 |
+
|
76 |
+
# Get items from each modality
|
77 |
+
items1 = modalities[type1]
|
78 |
+
items2 = modalities[type2]
|
79 |
+
|
80 |
+
# Find alignments between items
|
81 |
+
for item1 in items1:
|
82 |
+
for item2 in items2:
|
83 |
+
similarity = self._calculate_similarity(item1, item2)
|
84 |
+
if similarity > 0.5: # Threshold for alignment
|
85 |
+
alignments.append({
|
86 |
+
"type1": type1,
|
87 |
+
"type2": type2,
|
88 |
+
"item1": item1,
|
89 |
+
"item2": item2,
|
90 |
+
"similarity": similarity
|
91 |
+
})
|
92 |
+
|
93 |
+
# Sort alignments by similarity
|
94 |
+
alignments.sort(key=lambda x: x["similarity"], reverse=True)
|
95 |
+
|
96 |
+
return alignments
|
97 |
+
|
98 |
+
except Exception as e:
|
99 |
+
logging.error(f"Error in cross-modal alignment: {str(e)}")
|
100 |
+
return []
|
101 |
+
|
102 |
+
def _calculate_similarity(self, item1: Dict[str, Any], item2: Dict[str, Any]) -> float:
|
103 |
+
"""Calculate similarity between two items from different modalities."""
|
104 |
+
try:
|
105 |
+
# Extract content from items
|
106 |
+
content1 = str(item1.get("content", ""))
|
107 |
+
content2 = str(item2.get("content", ""))
|
108 |
+
|
109 |
+
# Calculate basic similarity (can be enhanced with more sophisticated methods)
|
110 |
+
common_words = set(content1.lower().split()) & set(content2.lower().split())
|
111 |
+
total_words = set(content1.lower().split()) | set(content2.lower().split())
|
112 |
+
|
113 |
+
if not total_words:
|
114 |
+
return 0.0
|
115 |
+
|
116 |
+
return len(common_words) / len(total_words)
|
117 |
+
|
118 |
+
except Exception as e:
|
119 |
+
logging.error(f"Error calculating similarity: {str(e)}")
|
120 |
+
return 0.0
|
121 |
+
|
122 |
+
async def _integrated_analysis(self, alignment: List[Dict[str, Any]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
123 |
+
prompt = f"""
|
124 |
+
Perform integrated multi-modal analysis:
|
125 |
+
Alignment: {json.dumps(alignment)}
|
126 |
+
Context: {json.dumps(context)}
|
127 |
+
|
128 |
+
For each insight:
|
129 |
+
1. [Insight]: Key finding
|
130 |
+
2. [Sources]: Contributing modalities
|
131 |
+
3. [Support]: Supporting evidence
|
132 |
+
4. [Confidence]: Confidence level
|
133 |
+
|
134 |
+
Format as:
|
135 |
+
[I1]
|
136 |
+
Insight: ...
|
137 |
+
Sources: ...
|
138 |
+
Support: ...
|
139 |
+
Confidence: ...
|
140 |
+
"""
|
141 |
+
|
142 |
+
response = await context["groq_api"].predict(prompt)
|
143 |
+
return self._parse_integration(response["answer"])
|
144 |
+
|
145 |
+
async def _generate_response(self, integration: List[Dict[str, Any]], context: Dict[str, Any]) -> Dict[str, Any]:
|
146 |
+
prompt = f"""
|
147 |
+
Generate unified multi-modal response:
|
148 |
+
Integration: {json.dumps(integration)}
|
149 |
+
Context: {json.dumps(context)}
|
150 |
+
|
151 |
+
Provide:
|
152 |
+
1. Main conclusion
|
153 |
+
2. Modal contributions
|
154 |
+
3. Integration benefits
|
155 |
+
4. Confidence level (0-1)
|
156 |
+
"""
|
157 |
+
|
158 |
+
response = await context["groq_api"].predict(prompt)
|
159 |
+
return self._parse_response(response["answer"])
|
160 |
+
|
161 |
+
def _parse_modalities(self, response: str) -> Dict[str, List[Dict[str, Any]]]:
|
162 |
+
"""Parse modalities from response."""
|
163 |
+
modalities = {}
|
164 |
+
current_modality = None
|
165 |
+
|
166 |
+
for line in response.split('\n'):
|
167 |
+
line = line.strip()
|
168 |
+
if not line:
|
169 |
+
continue
|
170 |
+
|
171 |
+
if line.startswith('[M'):
|
172 |
+
if current_modality:
|
173 |
+
if current_modality["type"] not in modalities:
|
174 |
+
modalities[current_modality["type"]] = []
|
175 |
+
modalities[current_modality["type"]].append(current_modality)
|
176 |
+
current_modality = {
|
177 |
+
"type": "",
|
178 |
+
"content": "",
|
179 |
+
"features": "",
|
180 |
+
"quality": ""
|
181 |
+
}
|
182 |
+
elif current_modality:
|
183 |
+
if line.startswith('Type:'):
|
184 |
+
current_modality["type"] = line[5:].strip()
|
185 |
+
elif line.startswith('Content:'):
|
186 |
+
current_modality["content"] = line[8:].strip()
|
187 |
+
elif line.startswith('Features:'):
|
188 |
+
current_modality["features"] = line[9:].strip()
|
189 |
+
elif line.startswith('Quality:'):
|
190 |
+
current_modality["quality"] = line[8:].strip()
|
191 |
+
|
192 |
+
if current_modality:
|
193 |
+
if current_modality["type"] not in modalities:
|
194 |
+
modalities[current_modality["type"]] = []
|
195 |
+
modalities[current_modality["type"]].append(current_modality)
|
196 |
+
|
197 |
+
return modalities
|
198 |
+
|
199 |
+
def _parse_integration(self, response: str) -> List[Dict[str, Any]]:
|
200 |
+
"""Parse integration from response."""
|
201 |
+
integration = []
|
202 |
+
current_insight = None
|
203 |
+
|
204 |
+
for line in response.split('\n'):
|
205 |
+
line = line.strip()
|
206 |
+
if not line:
|
207 |
+
continue
|
208 |
+
|
209 |
+
if line.startswith('[I'):
|
210 |
+
if current_insight:
|
211 |
+
integration.append(current_insight)
|
212 |
+
current_insight = {
|
213 |
+
"insight": "",
|
214 |
+
"sources": "",
|
215 |
+
"support": "",
|
216 |
+
"confidence": 0.0
|
217 |
+
}
|
218 |
+
elif current_insight:
|
219 |
+
if line.startswith('Insight:'):
|
220 |
+
current_insight["insight"] = line[8:].strip()
|
221 |
+
elif line.startswith('Sources:'):
|
222 |
+
current_insight["sources"] = line[8:].strip()
|
223 |
+
elif line.startswith('Support:'):
|
224 |
+
current_insight["support"] = line[8:].strip()
|
225 |
+
elif line.startswith('Confidence:'):
|
226 |
+
try:
|
227 |
+
current_insight["confidence"] = float(line[11:].strip())
|
228 |
+
except:
|
229 |
+
pass
|
230 |
+
|
231 |
+
if current_insight:
|
232 |
+
integration.append(current_insight)
|
233 |
+
|
234 |
+
return integration
|
235 |
+
|
236 |
+
def _parse_response(self, response: str) -> Dict[str, Any]:
|
237 |
+
"""Parse response from response."""
|
238 |
+
response_dict = {
|
239 |
+
"conclusion": "",
|
240 |
+
"modal_contributions": [],
|
241 |
+
"integration_benefits": [],
|
242 |
+
"confidence": 0.0
|
243 |
+
}
|
244 |
+
|
245 |
+
mode = None
|
246 |
+
for line in response.split('\n'):
|
247 |
+
line = line.strip()
|
248 |
+
if not line:
|
249 |
+
continue
|
250 |
+
|
251 |
+
if line.startswith('Conclusion:'):
|
252 |
+
response_dict["conclusion"] = line[11:].strip()
|
253 |
+
elif line.startswith('Modal Contributions:'):
|
254 |
+
mode = "modal"
|
255 |
+
elif line.startswith('Integration Benefits:'):
|
256 |
+
mode = "integration"
|
257 |
+
elif line.startswith('Confidence:'):
|
258 |
+
try:
|
259 |
+
response_dict["confidence"] = float(line[11:].strip())
|
260 |
+
except:
|
261 |
+
response_dict["confidence"] = 0.5
|
262 |
+
mode = None
|
263 |
+
elif mode == "modal" and line.startswith('- '):
|
264 |
+
response_dict["modal_contributions"].append(line[2:].strip())
|
265 |
+
elif mode == "integration" and line.startswith('- '):
|
266 |
+
response_dict["integration_benefits"].append(line[2:].strip())
|
267 |
+
|
268 |
+
return response_dict
|
reasoning/neurosymbolic.py
ADDED
@@ -0,0 +1,264 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Neurosymbolic reasoning implementation."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Tuple
|
5 |
+
import json
|
6 |
+
|
7 |
+
from .base import ReasoningStrategy
|
8 |
+
|
9 |
+
class NeurosymbolicReasoning(ReasoningStrategy):
|
10 |
+
"""Implements neurosymbolic reasoning combining neural and symbolic approaches."""
|
11 |
+
|
12 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
13 |
+
try:
|
14 |
+
# Neural processing
|
15 |
+
neural_features = await self._neural_processing(query, context)
|
16 |
+
|
17 |
+
# Symbolic reasoning
|
18 |
+
symbolic_rules = await self._symbolic_reasoning(neural_features, context)
|
19 |
+
|
20 |
+
# Integration
|
21 |
+
integrated = await self._neurosymbolic_integration(neural_features, symbolic_rules, context)
|
22 |
+
|
23 |
+
# Final inference
|
24 |
+
conclusion = await self._final_inference(integrated, context)
|
25 |
+
|
26 |
+
return {
|
27 |
+
"success": True,
|
28 |
+
"answer": conclusion["answer"],
|
29 |
+
"neural_features": neural_features,
|
30 |
+
"symbolic_rules": symbolic_rules,
|
31 |
+
"integrated_reasoning": integrated,
|
32 |
+
"confidence": conclusion["confidence"],
|
33 |
+
"explanation": conclusion["explanation"]
|
34 |
+
}
|
35 |
+
except Exception as e:
|
36 |
+
return {"success": False, "error": str(e)}
|
37 |
+
|
38 |
+
async def _neural_processing(self, query: str, context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
39 |
+
prompt = f"""
|
40 |
+
Extract neural features from query:
|
41 |
+
Query: {query}
|
42 |
+
Context: {json.dumps(context)}
|
43 |
+
|
44 |
+
For each feature:
|
45 |
+
1. [Type]: Feature type
|
46 |
+
2. [Value]: Extracted value
|
47 |
+
3. [Confidence]: Extraction confidence
|
48 |
+
4. [Relations]: Related concepts
|
49 |
+
|
50 |
+
Format as:
|
51 |
+
[F1]
|
52 |
+
Type: ...
|
53 |
+
Value: ...
|
54 |
+
Confidence: ...
|
55 |
+
Relations: ...
|
56 |
+
"""
|
57 |
+
|
58 |
+
response = await context["groq_api"].predict(prompt)
|
59 |
+
return self._parse_features(response["answer"])
|
60 |
+
|
61 |
+
async def _symbolic_reasoning(self, features: List[Dict[str, Any]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
62 |
+
prompt = f"""
|
63 |
+
Generate symbolic rules from features:
|
64 |
+
Features: {json.dumps(features)}
|
65 |
+
Context: {json.dumps(context)}
|
66 |
+
|
67 |
+
For each rule:
|
68 |
+
1. [Condition]: Rule condition
|
69 |
+
2. [Implication]: What it implies
|
70 |
+
3. [Certainty]: Rule certainty
|
71 |
+
4. [Source]: Derivation source
|
72 |
+
|
73 |
+
Format as:
|
74 |
+
[R1]
|
75 |
+
Condition: ...
|
76 |
+
Implication: ...
|
77 |
+
Certainty: ...
|
78 |
+
Source: ...
|
79 |
+
"""
|
80 |
+
|
81 |
+
response = await context["groq_api"].predict(prompt)
|
82 |
+
return self._parse_rules(response["answer"])
|
83 |
+
|
84 |
+
async def _neurosymbolic_integration(self, features: List[Dict[str, Any]], rules: List[Dict[str, Any]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
85 |
+
prompt = f"""
|
86 |
+
Integrate neural and symbolic components:
|
87 |
+
Features: {json.dumps(features)}
|
88 |
+
Rules: {json.dumps(rules)}
|
89 |
+
Context: {json.dumps(context)}
|
90 |
+
|
91 |
+
For each integration:
|
92 |
+
1. [Components]: What is being integrated
|
93 |
+
2. [Method]: How they are combined
|
94 |
+
3. [Result]: Integration outcome
|
95 |
+
4. [Confidence]: Integration confidence
|
96 |
+
|
97 |
+
Format as:
|
98 |
+
[I1]
|
99 |
+
Components: ...
|
100 |
+
Method: ...
|
101 |
+
Result: ...
|
102 |
+
Confidence: ...
|
103 |
+
"""
|
104 |
+
|
105 |
+
response = await context["groq_api"].predict(prompt)
|
106 |
+
return self._parse_integration(response["answer"])
|
107 |
+
|
108 |
+
async def _final_inference(self, integrated: List[Dict[str, Any]], context: Dict[str, Any]) -> Dict[str, Any]:
|
109 |
+
prompt = f"""
|
110 |
+
Draw final conclusions from integrated reasoning:
|
111 |
+
Integrated: {json.dumps(integrated)}
|
112 |
+
Context: {json.dumps(context)}
|
113 |
+
|
114 |
+
Provide:
|
115 |
+
1. Final answer/conclusion
|
116 |
+
2. Confidence level (0-1)
|
117 |
+
3. Explanation of reasoning
|
118 |
+
4. Key factors considered
|
119 |
+
"""
|
120 |
+
|
121 |
+
response = await context["groq_api"].predict(prompt)
|
122 |
+
return self._parse_conclusion(response["answer"])
|
123 |
+
|
124 |
+
def _parse_features(self, response: str) -> List[Dict[str, Any]]:
|
125 |
+
"""Parse neural features from response."""
|
126 |
+
features = []
|
127 |
+
current = None
|
128 |
+
|
129 |
+
for line in response.split('\n'):
|
130 |
+
line = line.strip()
|
131 |
+
if not line:
|
132 |
+
continue
|
133 |
+
|
134 |
+
if line.startswith('[F'):
|
135 |
+
if current:
|
136 |
+
features.append(current)
|
137 |
+
current = {
|
138 |
+
"type": "",
|
139 |
+
"value": "",
|
140 |
+
"confidence": 0.0,
|
141 |
+
"relations": []
|
142 |
+
}
|
143 |
+
elif current:
|
144 |
+
if line.startswith('Type:'):
|
145 |
+
current["type"] = line[5:].strip()
|
146 |
+
elif line.startswith('Value:'):
|
147 |
+
current["value"] = line[6:].strip()
|
148 |
+
elif line.startswith('Confidence:'):
|
149 |
+
try:
|
150 |
+
current["confidence"] = float(line[11:].strip())
|
151 |
+
except:
|
152 |
+
pass
|
153 |
+
elif line.startswith('Relations:'):
|
154 |
+
current["relations"] = [r.strip() for r in line[10:].split(',')]
|
155 |
+
|
156 |
+
if current:
|
157 |
+
features.append(current)
|
158 |
+
|
159 |
+
return features
|
160 |
+
|
161 |
+
def _parse_rules(self, response: str) -> List[Dict[str, Any]]:
|
162 |
+
"""Parse symbolic rules from response."""
|
163 |
+
rules = []
|
164 |
+
current = None
|
165 |
+
|
166 |
+
for line in response.split('\n'):
|
167 |
+
line = line.strip()
|
168 |
+
if not line:
|
169 |
+
continue
|
170 |
+
|
171 |
+
if line.startswith('[R'):
|
172 |
+
if current:
|
173 |
+
rules.append(current)
|
174 |
+
current = {
|
175 |
+
"condition": "",
|
176 |
+
"implication": "",
|
177 |
+
"certainty": 0.0,
|
178 |
+
"source": ""
|
179 |
+
}
|
180 |
+
elif current:
|
181 |
+
if line.startswith('Condition:'):
|
182 |
+
current["condition"] = line[10:].strip()
|
183 |
+
elif line.startswith('Implication:'):
|
184 |
+
current["implication"] = line[12:].strip()
|
185 |
+
elif line.startswith('Certainty:'):
|
186 |
+
try:
|
187 |
+
current["certainty"] = float(line[10:].strip())
|
188 |
+
except:
|
189 |
+
pass
|
190 |
+
elif line.startswith('Source:'):
|
191 |
+
current["source"] = line[7:].strip()
|
192 |
+
|
193 |
+
if current:
|
194 |
+
rules.append(current)
|
195 |
+
|
196 |
+
return rules
|
197 |
+
|
198 |
+
def _parse_integration(self, response: str) -> List[Dict[str, Any]]:
|
199 |
+
"""Parse integration results from response."""
|
200 |
+
integrations = []
|
201 |
+
current = None
|
202 |
+
|
203 |
+
for line in response.split('\n'):
|
204 |
+
line = line.strip()
|
205 |
+
if not line:
|
206 |
+
continue
|
207 |
+
|
208 |
+
if line.startswith('[I'):
|
209 |
+
if current:
|
210 |
+
integrations.append(current)
|
211 |
+
current = {
|
212 |
+
"components": "",
|
213 |
+
"method": "",
|
214 |
+
"result": "",
|
215 |
+
"confidence": 0.0
|
216 |
+
}
|
217 |
+
elif current:
|
218 |
+
if line.startswith('Components:'):
|
219 |
+
current["components"] = line[11:].strip()
|
220 |
+
elif line.startswith('Method:'):
|
221 |
+
current["method"] = line[7:].strip()
|
222 |
+
elif line.startswith('Result:'):
|
223 |
+
current["result"] = line[7:].strip()
|
224 |
+
elif line.startswith('Confidence:'):
|
225 |
+
try:
|
226 |
+
current["confidence"] = float(line[11:].strip())
|
227 |
+
except:
|
228 |
+
pass
|
229 |
+
|
230 |
+
if current:
|
231 |
+
integrations.append(current)
|
232 |
+
|
233 |
+
return integrations
|
234 |
+
|
235 |
+
def _parse_conclusion(self, response: str) -> Dict[str, Any]:
|
236 |
+
"""Parse final conclusion from response."""
|
237 |
+
conclusion = {
|
238 |
+
"answer": "",
|
239 |
+
"confidence": 0.0,
|
240 |
+
"explanation": "",
|
241 |
+
"factors": []
|
242 |
+
}
|
243 |
+
|
244 |
+
mode = None
|
245 |
+
for line in response.split('\n'):
|
246 |
+
line = line.strip()
|
247 |
+
if not line:
|
248 |
+
continue
|
249 |
+
|
250 |
+
if line.startswith('Answer:'):
|
251 |
+
conclusion["answer"] = line[7:].strip()
|
252 |
+
elif line.startswith('Confidence:'):
|
253 |
+
try:
|
254 |
+
conclusion["confidence"] = float(line[11:].strip())
|
255 |
+
except:
|
256 |
+
conclusion["confidence"] = 0.5
|
257 |
+
elif line.startswith('Explanation:'):
|
258 |
+
conclusion["explanation"] = line[12:].strip()
|
259 |
+
elif line.startswith('Factors:'):
|
260 |
+
mode = "factors"
|
261 |
+
elif mode == "factors" and line.startswith('- '):
|
262 |
+
conclusion["factors"].append(line[2:].strip())
|
263 |
+
|
264 |
+
return conclusion
|
reasoning/portfolio_optimization.py
ADDED
@@ -0,0 +1,352 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Advanced portfolio optimization for venture strategies."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
@dataclass
|
13 |
+
class VentureMetrics:
|
14 |
+
"""Venture performance metrics."""
|
15 |
+
revenue: float
|
16 |
+
profit: float
|
17 |
+
growth_rate: float
|
18 |
+
risk_score: float
|
19 |
+
resource_usage: Dict[str, float]
|
20 |
+
synergy_score: float
|
21 |
+
|
22 |
+
@dataclass
|
23 |
+
class ResourceAllocation:
|
24 |
+
"""Resource allocation configuration."""
|
25 |
+
venture_id: str
|
26 |
+
resources: Dict[str, float]
|
27 |
+
constraints: List[str]
|
28 |
+
dependencies: List[str]
|
29 |
+
priority: float
|
30 |
+
|
31 |
+
class PortfolioOptimizer:
|
32 |
+
"""
|
33 |
+
Advanced portfolio optimization that:
|
34 |
+
1. Optimizes venture mix
|
35 |
+
2. Allocates resources
|
36 |
+
3. Manages risks
|
37 |
+
4. Maximizes synergies
|
38 |
+
5. Balances growth
|
39 |
+
"""
|
40 |
+
|
41 |
+
def __init__(self):
|
42 |
+
self.ventures: Dict[str, VentureMetrics] = {}
|
43 |
+
self.allocations: Dict[str, ResourceAllocation] = {}
|
44 |
+
|
45 |
+
async def optimize_portfolio(self,
|
46 |
+
ventures: List[str],
|
47 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
48 |
+
"""Optimize venture portfolio."""
|
49 |
+
try:
|
50 |
+
# Analyze ventures
|
51 |
+
analysis = await self._analyze_ventures(ventures, context)
|
52 |
+
|
53 |
+
# Optimize allocation
|
54 |
+
allocation = await self._optimize_allocation(analysis, context)
|
55 |
+
|
56 |
+
# Risk optimization
|
57 |
+
risk = await self._optimize_risk(allocation, context)
|
58 |
+
|
59 |
+
# Synergy optimization
|
60 |
+
synergy = await self._optimize_synergies(risk, context)
|
61 |
+
|
62 |
+
# Performance projections
|
63 |
+
projections = await self._project_performance(synergy, context)
|
64 |
+
|
65 |
+
return {
|
66 |
+
"success": projections["annual_profit"] >= 1_000_000,
|
67 |
+
"analysis": analysis,
|
68 |
+
"allocation": allocation,
|
69 |
+
"risk": risk,
|
70 |
+
"synergy": synergy,
|
71 |
+
"projections": projections
|
72 |
+
}
|
73 |
+
except Exception as e:
|
74 |
+
logging.error(f"Error in portfolio optimization: {str(e)}")
|
75 |
+
return {"success": False, "error": str(e)}
|
76 |
+
|
77 |
+
async def _analyze_ventures(self,
|
78 |
+
ventures: List[str],
|
79 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
80 |
+
"""Analyze venture characteristics."""
|
81 |
+
prompt = f"""
|
82 |
+
Analyze ventures:
|
83 |
+
Ventures: {json.dumps(ventures)}
|
84 |
+
Context: {json.dumps(context)}
|
85 |
+
|
86 |
+
Analyze:
|
87 |
+
1. Performance metrics
|
88 |
+
2. Resource requirements
|
89 |
+
3. Risk factors
|
90 |
+
4. Growth potential
|
91 |
+
5. Synergy opportunities
|
92 |
+
|
93 |
+
Format as:
|
94 |
+
[Venture1]
|
95 |
+
Metrics: ...
|
96 |
+
Resources: ...
|
97 |
+
Risks: ...
|
98 |
+
Growth: ...
|
99 |
+
Synergies: ...
|
100 |
+
"""
|
101 |
+
|
102 |
+
response = await context["groq_api"].predict(prompt)
|
103 |
+
return self._parse_venture_analysis(response["answer"])
|
104 |
+
|
105 |
+
async def _optimize_allocation(self,
|
106 |
+
analysis: Dict[str, Any],
|
107 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
108 |
+
"""Optimize resource allocation."""
|
109 |
+
prompt = f"""
|
110 |
+
Optimize resource allocation:
|
111 |
+
Analysis: {json.dumps(analysis)}
|
112 |
+
Context: {json.dumps(context)}
|
113 |
+
|
114 |
+
Optimize for:
|
115 |
+
1. Resource efficiency
|
116 |
+
2. Growth potential
|
117 |
+
3. Risk balance
|
118 |
+
4. Synergy capture
|
119 |
+
5. Constraint satisfaction
|
120 |
+
|
121 |
+
Format as:
|
122 |
+
[Allocation1]
|
123 |
+
Venture: ...
|
124 |
+
Resources: ...
|
125 |
+
Constraints: ...
|
126 |
+
Dependencies: ...
|
127 |
+
Priority: ...
|
128 |
+
"""
|
129 |
+
|
130 |
+
response = await context["groq_api"].predict(prompt)
|
131 |
+
return self._parse_allocation_optimization(response["answer"])
|
132 |
+
|
133 |
+
async def _optimize_risk(self,
|
134 |
+
allocation: Dict[str, Any],
|
135 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
136 |
+
"""Optimize risk management."""
|
137 |
+
prompt = f"""
|
138 |
+
Optimize risk management:
|
139 |
+
Allocation: {json.dumps(allocation)}
|
140 |
+
Context: {json.dumps(context)}
|
141 |
+
|
142 |
+
Optimize for:
|
143 |
+
1. Risk diversification
|
144 |
+
2. Exposure limits
|
145 |
+
3. Correlation management
|
146 |
+
4. Hedging strategies
|
147 |
+
5. Contingency planning
|
148 |
+
|
149 |
+
Format as:
|
150 |
+
[Risk1]
|
151 |
+
Type: ...
|
152 |
+
Exposure: ...
|
153 |
+
Mitigation: ...
|
154 |
+
Contingency: ...
|
155 |
+
Impact: ...
|
156 |
+
"""
|
157 |
+
|
158 |
+
response = await context["groq_api"].predict(prompt)
|
159 |
+
return self._parse_risk_optimization(response["answer"])
|
160 |
+
|
161 |
+
async def _optimize_synergies(self,
|
162 |
+
risk: Dict[str, Any],
|
163 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
164 |
+
"""Optimize portfolio synergies."""
|
165 |
+
prompt = f"""
|
166 |
+
Optimize synergies:
|
167 |
+
Risk: {json.dumps(risk)}
|
168 |
+
Context: {json.dumps(context)}
|
169 |
+
|
170 |
+
Optimize for:
|
171 |
+
1. Resource sharing
|
172 |
+
2. Knowledge transfer
|
173 |
+
3. Market leverage
|
174 |
+
4. Technology reuse
|
175 |
+
5. Customer cross-sell
|
176 |
+
|
177 |
+
Format as:
|
178 |
+
[Synergy1]
|
179 |
+
Type: ...
|
180 |
+
Ventures: ...
|
181 |
+
Potential: ...
|
182 |
+
Requirements: ...
|
183 |
+
Timeline: ...
|
184 |
+
"""
|
185 |
+
|
186 |
+
response = await context["groq_api"].predict(prompt)
|
187 |
+
return self._parse_synergy_optimization(response["answer"])
|
188 |
+
|
189 |
+
async def _project_performance(self,
|
190 |
+
synergy: Dict[str, Any],
|
191 |
+
context: Dict[str, Any]) -> Dict[str, Any]:
|
192 |
+
"""Project portfolio performance."""
|
193 |
+
prompt = f"""
|
194 |
+
Project performance:
|
195 |
+
Synergy: {json.dumps(synergy)}
|
196 |
+
Context: {json.dumps(context)}
|
197 |
+
|
198 |
+
Project:
|
199 |
+
1. Revenue growth
|
200 |
+
2. Profit margins
|
201 |
+
3. Resource utilization
|
202 |
+
4. Risk metrics
|
203 |
+
5. Synergy capture
|
204 |
+
|
205 |
+
Format as:
|
206 |
+
[Projections]
|
207 |
+
Revenue: ...
|
208 |
+
Profit: ...
|
209 |
+
Resources: ...
|
210 |
+
Risk: ...
|
211 |
+
Synergies: ...
|
212 |
+
"""
|
213 |
+
|
214 |
+
response = await context["groq_api"].predict(prompt)
|
215 |
+
return self._parse_performance_projections(response["answer"])
|
216 |
+
|
217 |
+
def _calculate_portfolio_metrics(self) -> Dict[str, float]:
|
218 |
+
"""Calculate comprehensive portfolio metrics."""
|
219 |
+
if not self.ventures:
|
220 |
+
return {
|
221 |
+
"total_revenue": 0.0,
|
222 |
+
"total_profit": 0.0,
|
223 |
+
"avg_growth": 0.0,
|
224 |
+
"avg_risk": 0.0,
|
225 |
+
"resource_efficiency": 0.0,
|
226 |
+
"synergy_capture": 0.0
|
227 |
+
}
|
228 |
+
|
229 |
+
metrics = {
|
230 |
+
"total_revenue": sum(v.revenue for v in self.ventures.values()),
|
231 |
+
"total_profit": sum(v.profit for v in self.ventures.values()),
|
232 |
+
"avg_growth": np.mean([v.growth_rate for v in self.ventures.values()]),
|
233 |
+
"avg_risk": np.mean([v.risk_score for v in self.ventures.values()]),
|
234 |
+
"resource_efficiency": self._calculate_resource_efficiency(),
|
235 |
+
"synergy_capture": np.mean([v.synergy_score for v in self.ventures.values()])
|
236 |
+
}
|
237 |
+
|
238 |
+
return metrics
|
239 |
+
|
240 |
+
def _calculate_resource_efficiency(self) -> float:
|
241 |
+
"""Calculate resource utilization efficiency."""
|
242 |
+
if not self.ventures or not self.allocations:
|
243 |
+
return 0.0
|
244 |
+
|
245 |
+
total_resources = defaultdict(float)
|
246 |
+
used_resources = defaultdict(float)
|
247 |
+
|
248 |
+
# Sum up total and used resources
|
249 |
+
for venture_id, allocation in self.allocations.items():
|
250 |
+
for resource, amount in allocation.resources.items():
|
251 |
+
total_resources[resource] += amount
|
252 |
+
if venture_id in self.ventures:
|
253 |
+
used_resources[resource] += (
|
254 |
+
amount * self.ventures[venture_id].resource_usage.get(resource, 0)
|
255 |
+
)
|
256 |
+
|
257 |
+
# Calculate efficiency for each resource
|
258 |
+
efficiencies = []
|
259 |
+
for resource in total_resources:
|
260 |
+
if total_resources[resource] > 0:
|
261 |
+
efficiency = used_resources[resource] / total_resources[resource]
|
262 |
+
efficiencies.append(efficiency)
|
263 |
+
|
264 |
+
return np.mean(efficiencies) if efficiencies else 0.0
|
265 |
+
|
266 |
+
def get_portfolio_insights(self) -> Dict[str, Any]:
|
267 |
+
"""Get comprehensive portfolio insights."""
|
268 |
+
metrics = self._calculate_portfolio_metrics()
|
269 |
+
|
270 |
+
return {
|
271 |
+
"portfolio_metrics": metrics,
|
272 |
+
"venture_metrics": {
|
273 |
+
venture_id: {
|
274 |
+
"revenue": v.revenue,
|
275 |
+
"profit": v.profit,
|
276 |
+
"growth_rate": v.growth_rate,
|
277 |
+
"risk_score": v.risk_score,
|
278 |
+
"synergy_score": v.synergy_score
|
279 |
+
}
|
280 |
+
for venture_id, v in self.ventures.items()
|
281 |
+
},
|
282 |
+
"resource_allocation": {
|
283 |
+
venture_id: {
|
284 |
+
"resources": a.resources,
|
285 |
+
"priority": a.priority,
|
286 |
+
"constraints": len(a.constraints),
|
287 |
+
"dependencies": len(a.dependencies)
|
288 |
+
}
|
289 |
+
for venture_id, a in self.allocations.items()
|
290 |
+
},
|
291 |
+
"risk_profile": {
|
292 |
+
"portfolio_risk": metrics["avg_risk"],
|
293 |
+
"risk_concentration": self._calculate_risk_concentration(),
|
294 |
+
"risk_correlation": self._calculate_risk_correlation()
|
295 |
+
},
|
296 |
+
"optimization_opportunities": self._identify_optimization_opportunities()
|
297 |
+
}
|
298 |
+
|
299 |
+
def _calculate_risk_concentration(self) -> float:
|
300 |
+
"""Calculate risk concentration in portfolio."""
|
301 |
+
if not self.ventures:
|
302 |
+
return 0.0
|
303 |
+
|
304 |
+
risk_weights = [v.risk_score for v in self.ventures.values()]
|
305 |
+
return np.std(risk_weights) if len(risk_weights) > 1 else 0.0
|
306 |
+
|
307 |
+
def _calculate_risk_correlation(self) -> float:
|
308 |
+
"""Calculate risk correlation between ventures."""
|
309 |
+
if len(self.ventures) < 2:
|
310 |
+
return 0.0
|
311 |
+
|
312 |
+
# Create correlation matrix of risk scores and resource usage
|
313 |
+
venture_metrics = [
|
314 |
+
[v.risk_score] + list(v.resource_usage.values())
|
315 |
+
for v in self.ventures.values()
|
316 |
+
]
|
317 |
+
|
318 |
+
correlation_matrix = np.corrcoef(venture_metrics)
|
319 |
+
return np.mean(correlation_matrix[np.triu_indices_from(correlation_matrix, k=1)])
|
320 |
+
|
321 |
+
def _identify_optimization_opportunities(self) -> List[Dict[str, Any]]:
|
322 |
+
"""Identify portfolio optimization opportunities."""
|
323 |
+
opportunities = []
|
324 |
+
|
325 |
+
# Resource optimization opportunities
|
326 |
+
resource_efficiency = self._calculate_resource_efficiency()
|
327 |
+
if resource_efficiency < 0.8:
|
328 |
+
opportunities.append({
|
329 |
+
"type": "resource_optimization",
|
330 |
+
"potential": 1.0 - resource_efficiency,
|
331 |
+
"description": "Improve resource utilization efficiency"
|
332 |
+
})
|
333 |
+
|
334 |
+
# Risk optimization opportunities
|
335 |
+
risk_concentration = self._calculate_risk_concentration()
|
336 |
+
if risk_concentration > 0.2:
|
337 |
+
opportunities.append({
|
338 |
+
"type": "risk_diversification",
|
339 |
+
"potential": risk_concentration,
|
340 |
+
"description": "Reduce risk concentration"
|
341 |
+
})
|
342 |
+
|
343 |
+
# Synergy optimization opportunities
|
344 |
+
avg_synergy = np.mean([v.synergy_score for v in self.ventures.values()]) if self.ventures else 0
|
345 |
+
if avg_synergy < 0.7:
|
346 |
+
opportunities.append({
|
347 |
+
"type": "synergy_capture",
|
348 |
+
"potential": 1.0 - avg_synergy,
|
349 |
+
"description": "Increase synergy capture"
|
350 |
+
})
|
351 |
+
|
352 |
+
return opportunities
|
reasoning/quantum.py
ADDED
@@ -0,0 +1,353 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Quantum-inspired reasoning implementations."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List
|
5 |
+
import json
|
6 |
+
|
7 |
+
from .base import ReasoningStrategy
|
8 |
+
|
9 |
+
class QuantumReasoning(ReasoningStrategy):
|
10 |
+
"""Implements quantum-inspired reasoning using superposition and entanglement principles."""
|
11 |
+
|
12 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
13 |
+
try:
|
14 |
+
# Create superposition of possibilities
|
15 |
+
superposition = await self._create_superposition(query, context)
|
16 |
+
|
17 |
+
# Analyze entanglements
|
18 |
+
entanglements = await self._analyze_entanglements(superposition, context)
|
19 |
+
|
20 |
+
# Perform quantum interference
|
21 |
+
interference = await self._quantum_interference(superposition, entanglements, context)
|
22 |
+
|
23 |
+
# Collapse to solution
|
24 |
+
solution = await self._collapse_to_solution(interference, context)
|
25 |
+
|
26 |
+
return {
|
27 |
+
"success": True,
|
28 |
+
"answer": solution["conclusion"],
|
29 |
+
"superposition": superposition,
|
30 |
+
"entanglements": entanglements,
|
31 |
+
"interference_patterns": interference,
|
32 |
+
"measurement": solution["measurement"],
|
33 |
+
"confidence": solution["confidence"]
|
34 |
+
}
|
35 |
+
except Exception as e:
|
36 |
+
return {"success": False, "error": str(e)}
|
37 |
+
|
38 |
+
async def _create_superposition(self, query: str, context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
39 |
+
prompt = f"""
|
40 |
+
Create superposition of possible solutions:
|
41 |
+
Query: {query}
|
42 |
+
Context: {json.dumps(context)}
|
43 |
+
|
44 |
+
For each possibility state:
|
45 |
+
1. [State]: Description of possibility
|
46 |
+
2. [Amplitude]: Relative strength (0-1)
|
47 |
+
3. [Phase]: Relationship to other states
|
48 |
+
4. [Basis]: Underlying assumptions
|
49 |
+
|
50 |
+
Format as:
|
51 |
+
[S1]
|
52 |
+
State: ...
|
53 |
+
Amplitude: ...
|
54 |
+
Phase: ...
|
55 |
+
Basis: ...
|
56 |
+
"""
|
57 |
+
|
58 |
+
response = await context["groq_api"].predict(prompt)
|
59 |
+
return self._parse_superposition(response["answer"])
|
60 |
+
|
61 |
+
async def _analyze_entanglements(self, superposition: List[Dict[str, Any]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
62 |
+
prompt = f"""
|
63 |
+
Analyze entanglements between possibilities:
|
64 |
+
Superposition: {json.dumps(superposition)}
|
65 |
+
Context: {json.dumps(context)}
|
66 |
+
|
67 |
+
For each entanglement describe:
|
68 |
+
1. [States]: Entangled states
|
69 |
+
2. [Type]: Nature of entanglement
|
70 |
+
3. [Strength]: Correlation strength
|
71 |
+
4. [Impact]: Effect on outcomes
|
72 |
+
|
73 |
+
Format as:
|
74 |
+
[E1]
|
75 |
+
States: ...
|
76 |
+
Type: ...
|
77 |
+
Strength: ...
|
78 |
+
Impact: ...
|
79 |
+
"""
|
80 |
+
|
81 |
+
response = await context["groq_api"].predict(prompt)
|
82 |
+
return self._parse_entanglements(response["answer"])
|
83 |
+
|
84 |
+
async def _quantum_interference(self, superposition: List[Dict[str, Any]], entanglements: List[Dict[str, Any]], context: Dict[str, Any]) -> List[Dict[str, Any]]:
|
85 |
+
prompt = f"""
|
86 |
+
Calculate quantum interference patterns:
|
87 |
+
Superposition: {json.dumps(superposition)}
|
88 |
+
Entanglements: {json.dumps(entanglements)}
|
89 |
+
Context: {json.dumps(context)}
|
90 |
+
|
91 |
+
For each interference pattern:
|
92 |
+
1. [Pattern]: Description
|
93 |
+
2. [Amplitude]: Combined strength
|
94 |
+
3. [Phase]: Combined phase
|
95 |
+
4. [Effect]: Impact on solution space
|
96 |
+
|
97 |
+
Format as:
|
98 |
+
[I1]
|
99 |
+
Pattern: ...
|
100 |
+
Amplitude: ...
|
101 |
+
Phase: ...
|
102 |
+
Effect: ...
|
103 |
+
"""
|
104 |
+
|
105 |
+
response = await context["groq_api"].predict(prompt)
|
106 |
+
return self._parse_interference(response["answer"])
|
107 |
+
|
108 |
+
async def _collapse_to_solution(self, interference: List[Dict[str, Any]], context: Dict[str, Any]) -> Dict[str, Any]:
|
109 |
+
prompt = f"""
|
110 |
+
Collapse quantum state to final solution:
|
111 |
+
Interference: {json.dumps(interference)}
|
112 |
+
Context: {json.dumps(context)}
|
113 |
+
|
114 |
+
Provide:
|
115 |
+
1. Final measured state
|
116 |
+
2. Measurement confidence
|
117 |
+
3. Key quantum effects utilized
|
118 |
+
4. Overall conclusion
|
119 |
+
5. Confidence level (0-1)
|
120 |
+
"""
|
121 |
+
|
122 |
+
response = await context["groq_api"].predict(prompt)
|
123 |
+
return self._parse_collapse(response["answer"])
|
124 |
+
|
125 |
+
def _parse_superposition(self, response: str) -> List[Dict[str, Any]]:
|
126 |
+
"""Parse superposition states from response."""
|
127 |
+
superposition = []
|
128 |
+
current_state = None
|
129 |
+
|
130 |
+
for line in response.split('\n'):
|
131 |
+
line = line.strip()
|
132 |
+
if not line:
|
133 |
+
continue
|
134 |
+
|
135 |
+
if line.startswith('[S'):
|
136 |
+
if current_state:
|
137 |
+
superposition.append(current_state)
|
138 |
+
current_state = {
|
139 |
+
"state": "",
|
140 |
+
"amplitude": 0.0,
|
141 |
+
"phase": "",
|
142 |
+
"basis": ""
|
143 |
+
}
|
144 |
+
elif current_state:
|
145 |
+
if line.startswith('State:'):
|
146 |
+
current_state["state"] = line[6:].strip()
|
147 |
+
elif line.startswith('Amplitude:'):
|
148 |
+
try:
|
149 |
+
current_state["amplitude"] = float(line[10:].strip())
|
150 |
+
except:
|
151 |
+
pass
|
152 |
+
elif line.startswith('Phase:'):
|
153 |
+
current_state["phase"] = line[6:].strip()
|
154 |
+
elif line.startswith('Basis:'):
|
155 |
+
current_state["basis"] = line[6:].strip()
|
156 |
+
|
157 |
+
if current_state:
|
158 |
+
superposition.append(current_state)
|
159 |
+
|
160 |
+
return superposition
|
161 |
+
|
162 |
+
def _parse_entanglements(self, response: str) -> List[Dict[str, Any]]:
|
163 |
+
"""Parse entanglements from response."""
|
164 |
+
entanglements = []
|
165 |
+
current_entanglement = None
|
166 |
+
|
167 |
+
for line in response.split('\n'):
|
168 |
+
line = line.strip()
|
169 |
+
if not line:
|
170 |
+
continue
|
171 |
+
|
172 |
+
if line.startswith('[E'):
|
173 |
+
if current_entanglement:
|
174 |
+
entanglements.append(current_entanglement)
|
175 |
+
current_entanglement = {
|
176 |
+
"states": "",
|
177 |
+
"type": "",
|
178 |
+
"strength": 0.0,
|
179 |
+
"impact": ""
|
180 |
+
}
|
181 |
+
elif current_entanglement:
|
182 |
+
if line.startswith('States:'):
|
183 |
+
current_entanglement["states"] = line[7:].strip()
|
184 |
+
elif line.startswith('Type:'):
|
185 |
+
current_entanglement["type"] = line[5:].strip()
|
186 |
+
elif line.startswith('Strength:'):
|
187 |
+
try:
|
188 |
+
current_entanglement["strength"] = float(line[9:].strip())
|
189 |
+
except:
|
190 |
+
pass
|
191 |
+
elif line.startswith('Impact:'):
|
192 |
+
current_entanglement["impact"] = line[7:].strip()
|
193 |
+
|
194 |
+
if current_entanglement:
|
195 |
+
entanglements.append(current_entanglement)
|
196 |
+
|
197 |
+
return entanglements
|
198 |
+
|
199 |
+
def _parse_interference(self, response: str) -> List[Dict[str, Any]]:
|
200 |
+
"""Parse interference patterns from response."""
|
201 |
+
interference = []
|
202 |
+
current_pattern = None
|
203 |
+
|
204 |
+
for line in response.split('\n'):
|
205 |
+
line = line.strip()
|
206 |
+
if not line:
|
207 |
+
continue
|
208 |
+
|
209 |
+
if line.startswith('[I'):
|
210 |
+
if current_pattern:
|
211 |
+
interference.append(current_pattern)
|
212 |
+
current_pattern = {
|
213 |
+
"pattern": "",
|
214 |
+
"amplitude": 0.0,
|
215 |
+
"phase": "",
|
216 |
+
"effect": ""
|
217 |
+
}
|
218 |
+
elif current_pattern:
|
219 |
+
if line.startswith('Pattern:'):
|
220 |
+
current_pattern["pattern"] = line[8:].strip()
|
221 |
+
elif line.startswith('Amplitude:'):
|
222 |
+
try:
|
223 |
+
current_pattern["amplitude"] = float(line[10:].strip())
|
224 |
+
except:
|
225 |
+
pass
|
226 |
+
elif line.startswith('Phase:'):
|
227 |
+
current_pattern["phase"] = line[6:].strip()
|
228 |
+
elif line.startswith('Effect:'):
|
229 |
+
current_pattern["effect"] = line[7:].strip()
|
230 |
+
|
231 |
+
if current_pattern:
|
232 |
+
interference.append(current_pattern)
|
233 |
+
|
234 |
+
return interference
|
235 |
+
|
236 |
+
def _parse_collapse(self, response: str) -> Dict[str, Any]:
|
237 |
+
"""Parse collapse to solution from response."""
|
238 |
+
collapse = {
|
239 |
+
"measurement": "",
|
240 |
+
"confidence": 0.0,
|
241 |
+
"quantum_effects": [],
|
242 |
+
"conclusion": ""
|
243 |
+
}
|
244 |
+
|
245 |
+
mode = None
|
246 |
+
for line in response.split('\n'):
|
247 |
+
line = line.strip()
|
248 |
+
if not line:
|
249 |
+
continue
|
250 |
+
|
251 |
+
if line.startswith('Measurement:'):
|
252 |
+
collapse["measurement"] = line[12:].strip()
|
253 |
+
elif line.startswith('Confidence:'):
|
254 |
+
try:
|
255 |
+
collapse["confidence"] = float(line[11:].strip())
|
256 |
+
except:
|
257 |
+
collapse["confidence"] = 0.5
|
258 |
+
elif line.startswith('Quantum Effects:'):
|
259 |
+
mode = "effects"
|
260 |
+
elif mode == "effects" and line.startswith('- '):
|
261 |
+
collapse["quantum_effects"].append(line[2:].strip())
|
262 |
+
elif line.startswith('Conclusion:'):
|
263 |
+
collapse["conclusion"] = line[11:].strip()
|
264 |
+
|
265 |
+
return collapse
|
266 |
+
|
267 |
+
|
268 |
+
class QuantumInspiredStrategy(ReasoningStrategy):
|
269 |
+
"""Implements Quantum-Inspired reasoning."""
|
270 |
+
|
271 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
272 |
+
try:
|
273 |
+
# Create a clean context for serialization
|
274 |
+
clean_context = {k: v for k, v in context.items() if k != "groq_api"}
|
275 |
+
|
276 |
+
prompt = f"""
|
277 |
+
You are a meta-learning reasoning system that adapts its approach based on problem characteristics.
|
278 |
+
|
279 |
+
Problem Type:
|
280 |
+
Query: {query}
|
281 |
+
Context: {json.dumps(clean_context)}
|
282 |
+
|
283 |
+
Analyze this problem using meta-learning principles. Structure your response EXACTLY as follows:
|
284 |
+
|
285 |
+
PROBLEM ANALYSIS:
|
286 |
+
- [First key aspect or complexity factor]
|
287 |
+
- [Second key aspect or complexity factor]
|
288 |
+
- [Third key aspect or complexity factor]
|
289 |
+
|
290 |
+
SOLUTION PATHS:
|
291 |
+
- Path 1: [Specific solution approach]
|
292 |
+
- Path 2: [Alternative solution approach]
|
293 |
+
- Path 3: [Another alternative approach]
|
294 |
+
|
295 |
+
META INSIGHTS:
|
296 |
+
- Learning 1: [Key insight about the problem space]
|
297 |
+
- Learning 2: [Key insight about solution approaches]
|
298 |
+
- Learning 3: [Key insight about trade-offs]
|
299 |
+
|
300 |
+
CONCLUSION:
|
301 |
+
[Final synthesized solution incorporating meta-learnings]
|
302 |
+
"""
|
303 |
+
|
304 |
+
response = await context["groq_api"].predict(prompt)
|
305 |
+
|
306 |
+
if not response["success"]:
|
307 |
+
return response
|
308 |
+
|
309 |
+
# Parse response into components
|
310 |
+
lines = response["answer"].split("\n")
|
311 |
+
problem_analysis = []
|
312 |
+
solution_paths = []
|
313 |
+
meta_insights = []
|
314 |
+
conclusion = ""
|
315 |
+
|
316 |
+
section = None
|
317 |
+
for line in lines:
|
318 |
+
line = line.strip()
|
319 |
+
if not line:
|
320 |
+
continue
|
321 |
+
|
322 |
+
if "PROBLEM ANALYSIS:" in line:
|
323 |
+
section = "analysis"
|
324 |
+
elif "SOLUTION PATHS:" in line:
|
325 |
+
section = "paths"
|
326 |
+
elif "META INSIGHTS:" in line:
|
327 |
+
section = "insights"
|
328 |
+
elif "CONCLUSION:" in line:
|
329 |
+
section = "conclusion"
|
330 |
+
elif line.startswith("-"):
|
331 |
+
content = line.lstrip("- ").strip()
|
332 |
+
if section == "analysis":
|
333 |
+
problem_analysis.append(content)
|
334 |
+
elif section == "paths":
|
335 |
+
solution_paths.append(content)
|
336 |
+
elif section == "insights":
|
337 |
+
meta_insights.append(content)
|
338 |
+
elif section == "conclusion":
|
339 |
+
conclusion += line + " "
|
340 |
+
|
341 |
+
return {
|
342 |
+
"success": True,
|
343 |
+
"problem_analysis": problem_analysis,
|
344 |
+
"solution_paths": solution_paths,
|
345 |
+
"meta_insights": meta_insights,
|
346 |
+
"conclusion": conclusion.strip(),
|
347 |
+
# Add standard fields for compatibility
|
348 |
+
"reasoning_path": problem_analysis + solution_paths + meta_insights,
|
349 |
+
"conclusion": conclusion.strip()
|
350 |
+
}
|
351 |
+
|
352 |
+
except Exception as e:
|
353 |
+
return {"success": False, "error": str(e)}
|
reasoning/recursive.py
ADDED
@@ -0,0 +1,566 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Recursive reasoning implementation with advanced decomposition and synthesis."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Tuple, Callable
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import asyncio
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class SubproblemType(Enum):
|
15 |
+
"""Types of subproblems in recursive reasoning."""
|
16 |
+
ATOMIC = "atomic"
|
17 |
+
COMPOSITE = "composite"
|
18 |
+
PARALLEL = "parallel"
|
19 |
+
SEQUENTIAL = "sequential"
|
20 |
+
CONDITIONAL = "conditional"
|
21 |
+
ITERATIVE = "iterative"
|
22 |
+
|
23 |
+
class SolutionStatus(Enum):
|
24 |
+
"""Status of subproblem solutions."""
|
25 |
+
PENDING = "pending"
|
26 |
+
IN_PROGRESS = "in_progress"
|
27 |
+
SOLVED = "solved"
|
28 |
+
FAILED = "failed"
|
29 |
+
BLOCKED = "blocked"
|
30 |
+
OPTIMIZING = "optimizing"
|
31 |
+
|
32 |
+
@dataclass
|
33 |
+
class Subproblem:
|
34 |
+
"""Represents a subproblem in recursive reasoning."""
|
35 |
+
id: str
|
36 |
+
type: SubproblemType
|
37 |
+
query: str
|
38 |
+
context: Dict[str, Any]
|
39 |
+
parent_id: Optional[str]
|
40 |
+
children: List[str]
|
41 |
+
status: SolutionStatus
|
42 |
+
solution: Optional[Dict[str, Any]]
|
43 |
+
confidence: float
|
44 |
+
dependencies: List[str]
|
45 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
46 |
+
|
47 |
+
@dataclass
|
48 |
+
class RecursiveStep:
|
49 |
+
"""Represents a step in recursive reasoning."""
|
50 |
+
id: str
|
51 |
+
subproblem_id: str
|
52 |
+
action: str
|
53 |
+
timestamp: datetime
|
54 |
+
result: Optional[Dict[str, Any]]
|
55 |
+
metrics: Dict[str, float]
|
56 |
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
57 |
+
|
58 |
+
class RecursiveReasoning(ReasoningStrategy):
|
59 |
+
"""
|
60 |
+
Advanced Recursive Reasoning implementation with:
|
61 |
+
- Dynamic problem decomposition
|
62 |
+
- Parallel subproblem solving
|
63 |
+
- Solution synthesis
|
64 |
+
- Cycle detection
|
65 |
+
- Optimization strategies
|
66 |
+
"""
|
67 |
+
|
68 |
+
def __init__(self,
|
69 |
+
max_depth: int = 5,
|
70 |
+
min_confidence: float = 0.7,
|
71 |
+
parallel_threshold: int = 3,
|
72 |
+
optimization_rounds: int = 2):
|
73 |
+
self.max_depth = max_depth
|
74 |
+
self.min_confidence = min_confidence
|
75 |
+
self.parallel_threshold = parallel_threshold
|
76 |
+
self.optimization_rounds = optimization_rounds
|
77 |
+
|
78 |
+
# Problem tracking
|
79 |
+
self.subproblems: Dict[str, Subproblem] = {}
|
80 |
+
self.steps: List[RecursiveStep] = []
|
81 |
+
self.solution_cache: Dict[str, Dict[str, Any]] = {}
|
82 |
+
self.cycle_detection: Set[str] = set()
|
83 |
+
|
84 |
+
# Performance metrics
|
85 |
+
self.depth_distribution: Dict[int, int] = defaultdict(int)
|
86 |
+
self.type_distribution: Dict[SubproblemType, int] = defaultdict(int)
|
87 |
+
self.success_rate: Dict[SubproblemType, float] = defaultdict(float)
|
88 |
+
|
89 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
90 |
+
"""Main reasoning method implementing recursive reasoning."""
|
91 |
+
try:
|
92 |
+
# Initialize root problem
|
93 |
+
root = await self._initialize_problem(query, context)
|
94 |
+
self.subproblems[root.id] = root
|
95 |
+
|
96 |
+
# Recursively solve
|
97 |
+
solution = await self._solve_recursive(root.id, depth=0)
|
98 |
+
|
99 |
+
# Optimize solution
|
100 |
+
optimized = await self._optimize_solution(solution, root, context)
|
101 |
+
|
102 |
+
# Update metrics
|
103 |
+
self._update_metrics(root.id)
|
104 |
+
|
105 |
+
return {
|
106 |
+
"success": True,
|
107 |
+
"answer": optimized["answer"],
|
108 |
+
"confidence": optimized["confidence"],
|
109 |
+
"decomposition": self._get_problem_tree(root.id),
|
110 |
+
"solution_trace": self._get_solution_trace(root.id),
|
111 |
+
"performance_metrics": self._get_performance_metrics(),
|
112 |
+
"meta_insights": optimized["meta_insights"]
|
113 |
+
}
|
114 |
+
except Exception as e:
|
115 |
+
logging.error(f"Error in recursive reasoning: {str(e)}")
|
116 |
+
return {"success": False, "error": str(e)}
|
117 |
+
|
118 |
+
async def _initialize_problem(self, query: str, context: Dict[str, Any]) -> Subproblem:
|
119 |
+
"""Initialize the root problem."""
|
120 |
+
prompt = f"""
|
121 |
+
Initialize recursive reasoning problem:
|
122 |
+
Query: {query}
|
123 |
+
Context: {json.dumps(context)}
|
124 |
+
|
125 |
+
Analyze for:
|
126 |
+
1. Problem type classification
|
127 |
+
2. Initial decomposition strategy
|
128 |
+
3. Key dependencies
|
129 |
+
4. Solution approach
|
130 |
+
|
131 |
+
Format as:
|
132 |
+
[Problem]
|
133 |
+
Type: ...
|
134 |
+
Strategy: ...
|
135 |
+
Dependencies: ...
|
136 |
+
Approach: ...
|
137 |
+
"""
|
138 |
+
|
139 |
+
response = await context["groq_api"].predict(prompt)
|
140 |
+
return self._parse_problem_init(response["answer"], query, context)
|
141 |
+
|
142 |
+
async def _decompose_problem(self, problem: Subproblem, context: Dict[str, Any]) -> List[Subproblem]:
|
143 |
+
"""Decompose a problem into subproblems."""
|
144 |
+
prompt = f"""
|
145 |
+
Decompose problem into subproblems:
|
146 |
+
Problem: {json.dumps(self._problem_to_dict(problem))}
|
147 |
+
Context: {json.dumps(context)}
|
148 |
+
|
149 |
+
For each subproblem specify:
|
150 |
+
1. [Type]: {" | ".join([t.value for t in SubproblemType])}
|
151 |
+
2. [Query]: Specific question
|
152 |
+
3. [Dependencies]: Required solutions
|
153 |
+
4. [Approach]: Solution strategy
|
154 |
+
|
155 |
+
Format as:
|
156 |
+
[S1]
|
157 |
+
Type: ...
|
158 |
+
Query: ...
|
159 |
+
Dependencies: ...
|
160 |
+
Approach: ...
|
161 |
+
"""
|
162 |
+
|
163 |
+
response = await context["groq_api"].predict(prompt)
|
164 |
+
return self._parse_subproblems(response["answer"], problem.id, context)
|
165 |
+
|
166 |
+
async def _solve_recursive(self, problem_id: str, depth: int) -> Dict[str, Any]:
|
167 |
+
"""Recursively solve a problem and its subproblems."""
|
168 |
+
if depth > self.max_depth:
|
169 |
+
return {"success": False, "error": "Maximum recursion depth exceeded"}
|
170 |
+
|
171 |
+
if problem_id in self.cycle_detection:
|
172 |
+
return {"success": False, "error": "Cycle detected in recursive solving"}
|
173 |
+
|
174 |
+
problem = self.subproblems[problem_id]
|
175 |
+
self.cycle_detection.add(problem_id)
|
176 |
+
self.depth_distribution[depth] += 1
|
177 |
+
|
178 |
+
try:
|
179 |
+
# Check cache
|
180 |
+
cache_key = f"{problem.query}:{json.dumps(problem.context)}"
|
181 |
+
if cache_key in self.solution_cache:
|
182 |
+
return self.solution_cache[cache_key]
|
183 |
+
|
184 |
+
# Check if atomic
|
185 |
+
if problem.type == SubproblemType.ATOMIC:
|
186 |
+
solution = await self._solve_atomic(problem)
|
187 |
+
else:
|
188 |
+
# Decompose
|
189 |
+
subproblems = await self._decompose_problem(problem, problem.context)
|
190 |
+
for sub in subproblems:
|
191 |
+
self.subproblems[sub.id] = sub
|
192 |
+
problem.children.append(sub.id)
|
193 |
+
|
194 |
+
# Solve subproblems
|
195 |
+
if problem.type == SubproblemType.PARALLEL and len(subproblems) >= self.parallel_threshold:
|
196 |
+
# Solve in parallel
|
197 |
+
tasks = [self._solve_recursive(sub.id, depth + 1) for sub in subproblems]
|
198 |
+
subsolutions = await asyncio.gather(*tasks)
|
199 |
+
else:
|
200 |
+
# Solve sequentially
|
201 |
+
subsolutions = []
|
202 |
+
for sub in subproblems:
|
203 |
+
subsolution = await self._solve_recursive(sub.id, depth + 1)
|
204 |
+
subsolutions.append(subsolution)
|
205 |
+
|
206 |
+
# Synthesize solutions
|
207 |
+
solution = await self._synthesize_solutions(subsolutions, problem, problem.context)
|
208 |
+
|
209 |
+
# Cache solution
|
210 |
+
self.solution_cache[cache_key] = solution
|
211 |
+
problem.solution = solution
|
212 |
+
problem.status = SolutionStatus.SOLVED if solution["success"] else SolutionStatus.FAILED
|
213 |
+
|
214 |
+
return solution
|
215 |
+
|
216 |
+
finally:
|
217 |
+
self.cycle_detection.remove(problem_id)
|
218 |
+
|
219 |
+
async def _solve_atomic(self, problem: Subproblem) -> Dict[str, Any]:
|
220 |
+
"""Solve an atomic problem."""
|
221 |
+
prompt = f"""
|
222 |
+
Solve atomic problem:
|
223 |
+
Problem: {json.dumps(self._problem_to_dict(problem))}
|
224 |
+
|
225 |
+
Provide:
|
226 |
+
1. Direct solution
|
227 |
+
2. Confidence level
|
228 |
+
3. Supporting evidence
|
229 |
+
4. Alternative approaches
|
230 |
+
|
231 |
+
Format as:
|
232 |
+
[Solution]
|
233 |
+
Answer: ...
|
234 |
+
Confidence: ...
|
235 |
+
Evidence: ...
|
236 |
+
Alternatives: ...
|
237 |
+
"""
|
238 |
+
|
239 |
+
response = await problem.context["groq_api"].predict(prompt)
|
240 |
+
solution = self._parse_atomic_solution(response["answer"])
|
241 |
+
|
242 |
+
self._record_step(RecursiveStep(
|
243 |
+
id=f"step_{len(self.steps)}",
|
244 |
+
subproblem_id=problem.id,
|
245 |
+
action="atomic_solve",
|
246 |
+
timestamp=datetime.now(),
|
247 |
+
result=solution,
|
248 |
+
metrics={"confidence": solution.get("confidence", 0.0)},
|
249 |
+
metadata={}
|
250 |
+
))
|
251 |
+
|
252 |
+
return solution
|
253 |
+
|
254 |
+
async def _synthesize_solutions(self, subsolutions: List[Dict[str, Any]], problem: Subproblem, context: Dict[str, Any]) -> Dict[str, Any]:
|
255 |
+
"""Synthesize solutions from subproblems."""
|
256 |
+
prompt = f"""
|
257 |
+
Synthesize solutions:
|
258 |
+
Problem: {json.dumps(self._problem_to_dict(problem))}
|
259 |
+
Solutions: {json.dumps(subsolutions)}
|
260 |
+
Context: {json.dumps(context)}
|
261 |
+
|
262 |
+
Provide:
|
263 |
+
1. Integrated solution
|
264 |
+
2. Confidence assessment
|
265 |
+
3. Integration method
|
266 |
+
4. Quality metrics
|
267 |
+
|
268 |
+
Format as:
|
269 |
+
[Synthesis]
|
270 |
+
Solution: ...
|
271 |
+
Confidence: ...
|
272 |
+
Method: ...
|
273 |
+
Metrics: ...
|
274 |
+
"""
|
275 |
+
|
276 |
+
response = await context["groq_api"].predict(prompt)
|
277 |
+
synthesis = self._parse_synthesis(response["answer"])
|
278 |
+
|
279 |
+
self._record_step(RecursiveStep(
|
280 |
+
id=f"step_{len(self.steps)}",
|
281 |
+
subproblem_id=problem.id,
|
282 |
+
action="synthesize",
|
283 |
+
timestamp=datetime.now(),
|
284 |
+
result=synthesis,
|
285 |
+
metrics={"confidence": synthesis.get("confidence", 0.0)},
|
286 |
+
metadata={"num_subsolutions": len(subsolutions)}
|
287 |
+
))
|
288 |
+
|
289 |
+
return synthesis
|
290 |
+
|
291 |
+
async def _optimize_solution(self, solution: Dict[str, Any], problem: Subproblem, context: Dict[str, Any]) -> Dict[str, Any]:
|
292 |
+
"""Optimize the final solution."""
|
293 |
+
prompt = f"""
|
294 |
+
Optimize recursive solution:
|
295 |
+
Original: {json.dumps(solution)}
|
296 |
+
Problem: {json.dumps(self._problem_to_dict(problem))}
|
297 |
+
Context: {json.dumps(context)}
|
298 |
+
|
299 |
+
Optimize for:
|
300 |
+
1. Completeness
|
301 |
+
2. Consistency
|
302 |
+
3. Efficiency
|
303 |
+
4. Clarity
|
304 |
+
|
305 |
+
Format as:
|
306 |
+
[Optimization]
|
307 |
+
Answer: ...
|
308 |
+
Improvements: ...
|
309 |
+
Metrics: ...
|
310 |
+
Insights: ...
|
311 |
+
"""
|
312 |
+
|
313 |
+
response = await context["groq_api"].predict(prompt)
|
314 |
+
return self._parse_optimization(response["answer"])
|
315 |
+
|
316 |
+
def _update_metrics(self, root_id: str):
|
317 |
+
"""Update performance metrics."""
|
318 |
+
def update_recursive(problem_id: str):
|
319 |
+
problem = self.subproblems[problem_id]
|
320 |
+
self.type_distribution[problem.type] += 1
|
321 |
+
|
322 |
+
if problem.status == SolutionStatus.SOLVED:
|
323 |
+
self.success_rate[problem.type] = (
|
324 |
+
self.success_rate[problem.type] * (self.type_distribution[problem.type] - 1) +
|
325 |
+
problem.confidence
|
326 |
+
) / self.type_distribution[problem.type]
|
327 |
+
|
328 |
+
for child_id in problem.children:
|
329 |
+
update_recursive(child_id)
|
330 |
+
|
331 |
+
update_recursive(root_id)
|
332 |
+
|
333 |
+
def _get_problem_tree(self, root_id: str) -> Dict[str, Any]:
|
334 |
+
"""Get the problem decomposition tree."""
|
335 |
+
def build_tree(problem_id: str) -> Dict[str, Any]:
|
336 |
+
problem = self.subproblems[problem_id]
|
337 |
+
return {
|
338 |
+
"id": problem.id,
|
339 |
+
"type": problem.type.value,
|
340 |
+
"query": problem.query,
|
341 |
+
"status": problem.status.value,
|
342 |
+
"confidence": problem.confidence,
|
343 |
+
"children": [build_tree(child_id) for child_id in problem.children]
|
344 |
+
}
|
345 |
+
|
346 |
+
return build_tree(root_id)
|
347 |
+
|
348 |
+
def _get_solution_trace(self, root_id: str) -> List[Dict[str, Any]]:
|
349 |
+
"""Get the solution trace for a problem."""
|
350 |
+
return [self._step_to_dict(step) for step in self.steps
|
351 |
+
if step.subproblem_id == root_id or
|
352 |
+
any(step.subproblem_id == sub_id for sub_id in self.subproblems[root_id].children)]
|
353 |
+
|
354 |
+
def _get_performance_metrics(self) -> Dict[str, Any]:
|
355 |
+
"""Get current performance metrics."""
|
356 |
+
return {
|
357 |
+
"depth_distribution": dict(self.depth_distribution),
|
358 |
+
"type_distribution": {t.value: c for t, c in self.type_distribution.items()},
|
359 |
+
"success_rate": {t.value: r for t, r in self.success_rate.items()},
|
360 |
+
"cache_hits": len(self.solution_cache),
|
361 |
+
"total_steps": len(self.steps)
|
362 |
+
}
|
363 |
+
|
364 |
+
def _record_step(self, step: RecursiveStep):
|
365 |
+
"""Record a reasoning step."""
|
366 |
+
self.steps.append(step)
|
367 |
+
|
368 |
+
def _parse_problem_init(self, response: str, query: str, context: Dict[str, Any]) -> Subproblem:
|
369 |
+
"""Parse initial problem configuration."""
|
370 |
+
problem_type = SubproblemType.COMPOSITE # default
|
371 |
+
dependencies = []
|
372 |
+
metadata = {}
|
373 |
+
|
374 |
+
for line in response.split('\n'):
|
375 |
+
line = line.strip()
|
376 |
+
if line.startswith('Type:'):
|
377 |
+
try:
|
378 |
+
problem_type = SubproblemType(line[5:].strip().lower())
|
379 |
+
except ValueError:
|
380 |
+
pass
|
381 |
+
elif line.startswith('Dependencies:'):
|
382 |
+
dependencies = [d.strip() for d in line[13:].split(',')]
|
383 |
+
elif line.startswith('Strategy:') or line.startswith('Approach:'):
|
384 |
+
metadata["strategy"] = line.split(':', 1)[1].strip()
|
385 |
+
|
386 |
+
return Subproblem(
|
387 |
+
id="root",
|
388 |
+
type=problem_type,
|
389 |
+
query=query,
|
390 |
+
context=context,
|
391 |
+
parent_id=None,
|
392 |
+
children=[],
|
393 |
+
status=SolutionStatus.PENDING,
|
394 |
+
solution=None,
|
395 |
+
confidence=0.0,
|
396 |
+
dependencies=dependencies,
|
397 |
+
metadata=metadata
|
398 |
+
)
|
399 |
+
|
400 |
+
def _parse_subproblems(self, response: str, parent_id: str, context: Dict[str, Any]) -> List[Subproblem]:
|
401 |
+
"""Parse subproblems from response."""
|
402 |
+
subproblems = []
|
403 |
+
current = None
|
404 |
+
|
405 |
+
for line in response.split('\n'):
|
406 |
+
line = line.strip()
|
407 |
+
if not line:
|
408 |
+
continue
|
409 |
+
|
410 |
+
if line.startswith('[S'):
|
411 |
+
if current:
|
412 |
+
subproblems.append(current)
|
413 |
+
current = None
|
414 |
+
elif line.startswith('Type:'):
|
415 |
+
try:
|
416 |
+
problem_type = SubproblemType(line[5:].strip().lower())
|
417 |
+
current = Subproblem(
|
418 |
+
id=f"{parent_id}_{len(subproblems)}",
|
419 |
+
type=problem_type,
|
420 |
+
query="",
|
421 |
+
context=context,
|
422 |
+
parent_id=parent_id,
|
423 |
+
children=[],
|
424 |
+
status=SolutionStatus.PENDING,
|
425 |
+
solution=None,
|
426 |
+
confidence=0.0,
|
427 |
+
dependencies=[],
|
428 |
+
metadata={}
|
429 |
+
)
|
430 |
+
except ValueError:
|
431 |
+
current = None
|
432 |
+
elif current:
|
433 |
+
if line.startswith('Query:'):
|
434 |
+
current.query = line[6:].strip()
|
435 |
+
elif line.startswith('Dependencies:'):
|
436 |
+
current.dependencies = [d.strip() for d in line[13:].split(',')]
|
437 |
+
elif line.startswith('Approach:'):
|
438 |
+
current.metadata["approach"] = line[9:].strip()
|
439 |
+
|
440 |
+
if current:
|
441 |
+
subproblems.append(current)
|
442 |
+
|
443 |
+
return subproblems
|
444 |
+
|
445 |
+
def _parse_atomic_solution(self, response: str) -> Dict[str, Any]:
|
446 |
+
"""Parse atomic solution from response."""
|
447 |
+
solution = {
|
448 |
+
"success": True,
|
449 |
+
"answer": "",
|
450 |
+
"confidence": 0.0,
|
451 |
+
"evidence": [],
|
452 |
+
"alternatives": []
|
453 |
+
}
|
454 |
+
|
455 |
+
for line in response.split('\n'):
|
456 |
+
line = line.strip()
|
457 |
+
if line.startswith('Answer:'):
|
458 |
+
solution["answer"] = line[7:].strip()
|
459 |
+
elif line.startswith('Confidence:'):
|
460 |
+
try:
|
461 |
+
solution["confidence"] = float(line[11:].strip())
|
462 |
+
except:
|
463 |
+
pass
|
464 |
+
elif line.startswith('Evidence:'):
|
465 |
+
solution["evidence"] = [e.strip() for e in line[9:].split(',')]
|
466 |
+
elif line.startswith('Alternatives:'):
|
467 |
+
solution["alternatives"] = [a.strip() for a in line[13:].split(',')]
|
468 |
+
|
469 |
+
return solution
|
470 |
+
|
471 |
+
def _parse_synthesis(self, response: str) -> Dict[str, Any]:
|
472 |
+
"""Parse synthesis result from response."""
|
473 |
+
synthesis = {
|
474 |
+
"success": True,
|
475 |
+
"solution": "",
|
476 |
+
"confidence": 0.0,
|
477 |
+
"method": "",
|
478 |
+
"metrics": {}
|
479 |
+
}
|
480 |
+
|
481 |
+
for line in response.split('\n'):
|
482 |
+
line = line.strip()
|
483 |
+
if line.startswith('Solution:'):
|
484 |
+
synthesis["solution"] = line[9:].strip()
|
485 |
+
elif line.startswith('Confidence:'):
|
486 |
+
try:
|
487 |
+
synthesis["confidence"] = float(line[11:].strip())
|
488 |
+
except:
|
489 |
+
pass
|
490 |
+
elif line.startswith('Method:'):
|
491 |
+
synthesis["method"] = line[7:].strip()
|
492 |
+
elif line.startswith('Metrics:'):
|
493 |
+
try:
|
494 |
+
synthesis["metrics"] = json.loads(line[8:].strip())
|
495 |
+
except:
|
496 |
+
pass
|
497 |
+
|
498 |
+
return synthesis
|
499 |
+
|
500 |
+
def _parse_optimization(self, response: str) -> Dict[str, Any]:
|
501 |
+
"""Parse optimization result from response."""
|
502 |
+
optimization = {
|
503 |
+
"answer": "",
|
504 |
+
"confidence": 0.0,
|
505 |
+
"improvements": [],
|
506 |
+
"metrics": {},
|
507 |
+
"meta_insights": []
|
508 |
+
}
|
509 |
+
|
510 |
+
for line in response.split('\n'):
|
511 |
+
line = line.strip()
|
512 |
+
if line.startswith('Answer:'):
|
513 |
+
optimization["answer"] = line[7:].strip()
|
514 |
+
elif line.startswith('Improvements:'):
|
515 |
+
optimization["improvements"] = [i.strip() for i in line[13:].split(',')]
|
516 |
+
elif line.startswith('Metrics:'):
|
517 |
+
try:
|
518 |
+
optimization["metrics"] = json.loads(line[8:].strip())
|
519 |
+
except:
|
520 |
+
pass
|
521 |
+
elif line.startswith('Insights:'):
|
522 |
+
optimization["meta_insights"] = [i.strip() for i in line[9:].split(',')]
|
523 |
+
|
524 |
+
return optimization
|
525 |
+
|
526 |
+
def _problem_to_dict(self, problem: Subproblem) -> Dict[str, Any]:
|
527 |
+
"""Convert problem to dictionary for serialization."""
|
528 |
+
return {
|
529 |
+
"id": problem.id,
|
530 |
+
"type": problem.type.value,
|
531 |
+
"query": problem.query,
|
532 |
+
"parent_id": problem.parent_id,
|
533 |
+
"children": problem.children,
|
534 |
+
"status": problem.status.value,
|
535 |
+
"confidence": problem.confidence,
|
536 |
+
"dependencies": problem.dependencies,
|
537 |
+
"metadata": problem.metadata
|
538 |
+
}
|
539 |
+
|
540 |
+
def _step_to_dict(self, step: RecursiveStep) -> Dict[str, Any]:
|
541 |
+
"""Convert step to dictionary for serialization."""
|
542 |
+
return {
|
543 |
+
"id": step.id,
|
544 |
+
"subproblem_id": step.subproblem_id,
|
545 |
+
"action": step.action,
|
546 |
+
"timestamp": step.timestamp.isoformat(),
|
547 |
+
"result": step.result,
|
548 |
+
"metrics": step.metrics,
|
549 |
+
"metadata": step.metadata
|
550 |
+
}
|
551 |
+
|
552 |
+
def clear_cache(self):
|
553 |
+
"""Clear solution cache."""
|
554 |
+
self.solution_cache.clear()
|
555 |
+
|
556 |
+
def get_statistics(self) -> Dict[str, Any]:
|
557 |
+
"""Get detailed statistics about the reasoning process."""
|
558 |
+
return {
|
559 |
+
"total_problems": len(self.subproblems),
|
560 |
+
"total_steps": len(self.steps),
|
561 |
+
"cache_size": len(self.solution_cache),
|
562 |
+
"type_distribution": dict(self.type_distribution),
|
563 |
+
"depth_distribution": dict(self.depth_distribution),
|
564 |
+
"success_rates": dict(self.success_rate),
|
565 |
+
"average_confidence": sum(p.confidence for p in self.subproblems.values()) / len(self.subproblems) if self.subproblems else 0.0
|
566 |
+
}
|
reasoning/specialized.py
ADDED
@@ -0,0 +1,313 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Specialized reasoning strategies for specific domains and tasks."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Callable
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import asyncio
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class CodeRewriteStrategy(ReasoningStrategy):
|
15 |
+
"""
|
16 |
+
Advanced code rewriting strategy that:
|
17 |
+
1. Analyzes code structure and patterns
|
18 |
+
2. Identifies refactoring opportunities
|
19 |
+
3. Maintains code semantics
|
20 |
+
4. Optimizes code quality
|
21 |
+
5. Ensures backward compatibility
|
22 |
+
"""
|
23 |
+
|
24 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
25 |
+
"""Rewrite code while preserving functionality."""
|
26 |
+
try:
|
27 |
+
# Analyze code
|
28 |
+
analysis = await self._analyze_code(query, context)
|
29 |
+
|
30 |
+
# Generate rewrite plan
|
31 |
+
plan = await self._generate_rewrite_plan(analysis, context)
|
32 |
+
|
33 |
+
# Execute rewrites
|
34 |
+
rewrites = await self._execute_rewrites(plan, context)
|
35 |
+
|
36 |
+
# Validate changes
|
37 |
+
validation = await self._validate_changes(rewrites, context)
|
38 |
+
|
39 |
+
return {
|
40 |
+
"success": validation["success"],
|
41 |
+
"rewrites": rewrites,
|
42 |
+
"validation": validation,
|
43 |
+
"metrics": {
|
44 |
+
"quality_improvement": validation.get("quality_score", 0.0),
|
45 |
+
"semantic_preservation": validation.get("semantic_score", 0.0)
|
46 |
+
}
|
47 |
+
}
|
48 |
+
except Exception as e:
|
49 |
+
logging.error(f"Error in code rewrite: {str(e)}")
|
50 |
+
return {"success": False, "error": str(e)}
|
51 |
+
|
52 |
+
class SecurityAuditStrategy(ReasoningStrategy):
|
53 |
+
"""
|
54 |
+
Advanced security audit strategy that:
|
55 |
+
1. Identifies security vulnerabilities
|
56 |
+
2. Analyzes attack vectors
|
57 |
+
3. Recommends security fixes
|
58 |
+
4. Validates security measures
|
59 |
+
5. Monitors security state
|
60 |
+
"""
|
61 |
+
|
62 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
63 |
+
"""Perform security audit and generate recommendations."""
|
64 |
+
try:
|
65 |
+
# Scan for vulnerabilities
|
66 |
+
vulnerabilities = await self._scan_vulnerabilities(query, context)
|
67 |
+
|
68 |
+
# Analyze risks
|
69 |
+
risks = await self._analyze_risks(vulnerabilities, context)
|
70 |
+
|
71 |
+
# Generate fixes
|
72 |
+
fixes = await self._generate_fixes(risks, context)
|
73 |
+
|
74 |
+
# Validate security
|
75 |
+
validation = await self._validate_security(fixes, context)
|
76 |
+
|
77 |
+
return {
|
78 |
+
"success": True,
|
79 |
+
"vulnerabilities": vulnerabilities,
|
80 |
+
"risks": risks,
|
81 |
+
"fixes": fixes,
|
82 |
+
"validation": validation
|
83 |
+
}
|
84 |
+
except Exception as e:
|
85 |
+
logging.error(f"Error in security audit: {str(e)}")
|
86 |
+
return {"success": False, "error": str(e)}
|
87 |
+
|
88 |
+
class PerformanceOptimizationStrategy(ReasoningStrategy):
|
89 |
+
"""
|
90 |
+
Advanced performance optimization strategy that:
|
91 |
+
1. Profiles code performance
|
92 |
+
2. Identifies bottlenecks
|
93 |
+
3. Generates optimizations
|
94 |
+
4. Measures improvements
|
95 |
+
5. Validates optimizations
|
96 |
+
"""
|
97 |
+
|
98 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
99 |
+
"""Optimize code performance."""
|
100 |
+
try:
|
101 |
+
# Profile performance
|
102 |
+
profile = await self._profile_performance(query, context)
|
103 |
+
|
104 |
+
# Identify bottlenecks
|
105 |
+
bottlenecks = await self._identify_bottlenecks(profile, context)
|
106 |
+
|
107 |
+
# Generate optimizations
|
108 |
+
optimizations = await self._generate_optimizations(bottlenecks, context)
|
109 |
+
|
110 |
+
# Measure improvements
|
111 |
+
measurements = await self._measure_improvements(optimizations, context)
|
112 |
+
|
113 |
+
return {
|
114 |
+
"success": measurements["success"],
|
115 |
+
"profile": profile,
|
116 |
+
"bottlenecks": bottlenecks,
|
117 |
+
"optimizations": optimizations,
|
118 |
+
"improvements": measurements
|
119 |
+
}
|
120 |
+
except Exception as e:
|
121 |
+
logging.error(f"Error in performance optimization: {str(e)}")
|
122 |
+
return {"success": False, "error": str(e)}
|
123 |
+
|
124 |
+
class TestGenerationStrategy(ReasoningStrategy):
|
125 |
+
"""
|
126 |
+
Advanced test generation strategy that:
|
127 |
+
1. Analyzes code coverage
|
128 |
+
2. Generates test cases
|
129 |
+
3. Creates test fixtures
|
130 |
+
4. Validates test quality
|
131 |
+
5. Maintains test suite
|
132 |
+
"""
|
133 |
+
|
134 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
135 |
+
"""Generate comprehensive test suite."""
|
136 |
+
try:
|
137 |
+
# Analyze coverage
|
138 |
+
coverage = await self._analyze_coverage(query, context)
|
139 |
+
|
140 |
+
# Generate test cases
|
141 |
+
test_cases = await self._generate_test_cases(coverage, context)
|
142 |
+
|
143 |
+
# Create fixtures
|
144 |
+
fixtures = await self._create_fixtures(test_cases, context)
|
145 |
+
|
146 |
+
# Validate tests
|
147 |
+
validation = await self._validate_tests(test_cases, fixtures, context)
|
148 |
+
|
149 |
+
return {
|
150 |
+
"success": validation["success"],
|
151 |
+
"test_cases": test_cases,
|
152 |
+
"fixtures": fixtures,
|
153 |
+
"validation": validation,
|
154 |
+
"metrics": {
|
155 |
+
"coverage": coverage.get("percentage", 0.0),
|
156 |
+
"quality_score": validation.get("quality_score", 0.0)
|
157 |
+
}
|
158 |
+
}
|
159 |
+
except Exception as e:
|
160 |
+
logging.error(f"Error in test generation: {str(e)}")
|
161 |
+
return {"success": False, "error": str(e)}
|
162 |
+
|
163 |
+
class DocumentationStrategy(ReasoningStrategy):
|
164 |
+
"""
|
165 |
+
Advanced documentation strategy that:
|
166 |
+
1. Analyzes code structure
|
167 |
+
2. Generates documentation
|
168 |
+
3. Maintains consistency
|
169 |
+
4. Updates references
|
170 |
+
5. Validates completeness
|
171 |
+
"""
|
172 |
+
|
173 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
174 |
+
"""Generate and maintain documentation."""
|
175 |
+
try:
|
176 |
+
# Analyze structure
|
177 |
+
structure = await self._analyze_structure(query, context)
|
178 |
+
|
179 |
+
# Generate documentation
|
180 |
+
documentation = await self._generate_documentation(structure, context)
|
181 |
+
|
182 |
+
# Update references
|
183 |
+
references = await self._update_references(documentation, context)
|
184 |
+
|
185 |
+
# Validate completeness
|
186 |
+
validation = await self._validate_documentation(documentation, references, context)
|
187 |
+
|
188 |
+
return {
|
189 |
+
"success": validation["success"],
|
190 |
+
"documentation": documentation,
|
191 |
+
"references": references,
|
192 |
+
"validation": validation,
|
193 |
+
"metrics": {
|
194 |
+
"completeness": validation.get("completeness_score", 0.0),
|
195 |
+
"consistency": validation.get("consistency_score", 0.0)
|
196 |
+
}
|
197 |
+
}
|
198 |
+
except Exception as e:
|
199 |
+
logging.error(f"Error in documentation: {str(e)}")
|
200 |
+
return {"success": False, "error": str(e)}
|
201 |
+
|
202 |
+
class APIDesignStrategy(ReasoningStrategy):
|
203 |
+
"""
|
204 |
+
Advanced API design strategy that:
|
205 |
+
1. Analyzes requirements
|
206 |
+
2. Designs API structure
|
207 |
+
3. Generates specifications
|
208 |
+
4. Validates design
|
209 |
+
5. Maintains versioning
|
210 |
+
"""
|
211 |
+
|
212 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
213 |
+
"""Design and validate API."""
|
214 |
+
try:
|
215 |
+
# Analyze requirements
|
216 |
+
requirements = await self._analyze_requirements(query, context)
|
217 |
+
|
218 |
+
# Design structure
|
219 |
+
design = await self._design_structure(requirements, context)
|
220 |
+
|
221 |
+
# Generate specs
|
222 |
+
specs = await self._generate_specs(design, context)
|
223 |
+
|
224 |
+
# Validate design
|
225 |
+
validation = await self._validate_design(specs, context)
|
226 |
+
|
227 |
+
return {
|
228 |
+
"success": validation["success"],
|
229 |
+
"requirements": requirements,
|
230 |
+
"design": design,
|
231 |
+
"specs": specs,
|
232 |
+
"validation": validation
|
233 |
+
}
|
234 |
+
except Exception as e:
|
235 |
+
logging.error(f"Error in API design: {str(e)}")
|
236 |
+
return {"success": False, "error": str(e)}
|
237 |
+
|
238 |
+
class DependencyManagementStrategy(ReasoningStrategy):
|
239 |
+
"""
|
240 |
+
Advanced dependency management strategy that:
|
241 |
+
1. Analyzes dependencies
|
242 |
+
2. Resolves conflicts
|
243 |
+
3. Optimizes versions
|
244 |
+
4. Ensures compatibility
|
245 |
+
5. Maintains security
|
246 |
+
"""
|
247 |
+
|
248 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
249 |
+
"""Manage and optimize dependencies."""
|
250 |
+
try:
|
251 |
+
# Analyze dependencies
|
252 |
+
analysis = await self._analyze_dependencies(query, context)
|
253 |
+
|
254 |
+
# Resolve conflicts
|
255 |
+
resolution = await self._resolve_conflicts(analysis, context)
|
256 |
+
|
257 |
+
# Optimize versions
|
258 |
+
optimization = await self._optimize_versions(resolution, context)
|
259 |
+
|
260 |
+
# Validate compatibility
|
261 |
+
validation = await self._validate_compatibility(optimization, context)
|
262 |
+
|
263 |
+
return {
|
264 |
+
"success": validation["success"],
|
265 |
+
"analysis": analysis,
|
266 |
+
"resolution": resolution,
|
267 |
+
"optimization": optimization,
|
268 |
+
"validation": validation
|
269 |
+
}
|
270 |
+
except Exception as e:
|
271 |
+
logging.error(f"Error in dependency management: {str(e)}")
|
272 |
+
return {"success": False, "error": str(e)}
|
273 |
+
|
274 |
+
class CodeReviewStrategy(ReasoningStrategy):
|
275 |
+
"""
|
276 |
+
Advanced code review strategy that:
|
277 |
+
1. Analyzes code quality
|
278 |
+
2. Identifies issues
|
279 |
+
3. Suggests improvements
|
280 |
+
4. Tracks changes
|
281 |
+
5. Validates fixes
|
282 |
+
"""
|
283 |
+
|
284 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
285 |
+
"""Perform comprehensive code review."""
|
286 |
+
try:
|
287 |
+
# Analyze quality
|
288 |
+
quality = await self._analyze_quality(query, context)
|
289 |
+
|
290 |
+
# Identify issues
|
291 |
+
issues = await self._identify_issues(quality, context)
|
292 |
+
|
293 |
+
# Generate suggestions
|
294 |
+
suggestions = await self._generate_suggestions(issues, context)
|
295 |
+
|
296 |
+
# Track changes
|
297 |
+
tracking = await self._track_changes(suggestions, context)
|
298 |
+
|
299 |
+
return {
|
300 |
+
"success": True,
|
301 |
+
"quality": quality,
|
302 |
+
"issues": issues,
|
303 |
+
"suggestions": suggestions,
|
304 |
+
"tracking": tracking,
|
305 |
+
"metrics": {
|
306 |
+
"quality_score": quality.get("score", 0.0),
|
307 |
+
"issues_found": len(issues),
|
308 |
+
"suggestions_made": len(suggestions)
|
309 |
+
}
|
310 |
+
}
|
311 |
+
except Exception as e:
|
312 |
+
logging.error(f"Error in code review: {str(e)}")
|
313 |
+
return {"success": False, "error": str(e)}
|
reasoning/tree_of_thoughts.py
ADDED
@@ -0,0 +1,513 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Tree of Thoughts reasoning implementation with advanced tree exploration."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass
|
7 |
+
from enum import Enum
|
8 |
+
import heapq
|
9 |
+
from collections import defaultdict
|
10 |
+
|
11 |
+
from .base import ReasoningStrategy
|
12 |
+
|
13 |
+
class NodeType(Enum):
|
14 |
+
"""Types of nodes in the thought tree."""
|
15 |
+
ROOT = "root"
|
16 |
+
HYPOTHESIS = "hypothesis"
|
17 |
+
EVIDENCE = "evidence"
|
18 |
+
ANALYSIS = "analysis"
|
19 |
+
SYNTHESIS = "synthesis"
|
20 |
+
EVALUATION = "evaluation"
|
21 |
+
CONCLUSION = "conclusion"
|
22 |
+
|
23 |
+
@dataclass
|
24 |
+
class TreeNode:
|
25 |
+
"""Represents a node in the thought tree."""
|
26 |
+
id: str
|
27 |
+
type: NodeType
|
28 |
+
content: str
|
29 |
+
confidence: float
|
30 |
+
children: List['TreeNode']
|
31 |
+
parent: Optional['TreeNode']
|
32 |
+
metadata: Dict[str, Any]
|
33 |
+
depth: int
|
34 |
+
evaluation_score: float = 0.0
|
35 |
+
|
36 |
+
class TreeOfThoughtsStrategy(ReasoningStrategy):
|
37 |
+
"""
|
38 |
+
Advanced Tree of Thoughts reasoning implementation with:
|
39 |
+
- Beam search for path exploration
|
40 |
+
- Dynamic node evaluation
|
41 |
+
- Pruning strategies
|
42 |
+
- Path optimization
|
43 |
+
- Meta-learning from tree patterns
|
44 |
+
"""
|
45 |
+
|
46 |
+
def __init__(self,
|
47 |
+
max_depth: int = 5,
|
48 |
+
beam_width: int = 3,
|
49 |
+
min_confidence: float = 0.6,
|
50 |
+
exploration_factor: float = 0.3,
|
51 |
+
prune_threshold: float = 0.4):
|
52 |
+
self.max_depth = max_depth
|
53 |
+
self.beam_width = beam_width
|
54 |
+
self.min_confidence = min_confidence
|
55 |
+
self.exploration_factor = exploration_factor
|
56 |
+
self.prune_threshold = prune_threshold
|
57 |
+
self.node_history: Dict[str, TreeNode] = {}
|
58 |
+
self.path_patterns: Dict[str, float] = defaultdict(float)
|
59 |
+
|
60 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
61 |
+
"""Main reasoning method implementing tree of thoughts."""
|
62 |
+
try:
|
63 |
+
# Initialize root node
|
64 |
+
root = await self._create_root_node(query, context)
|
65 |
+
|
66 |
+
# Build and explore tree
|
67 |
+
tree = await self._build_tree(root, context)
|
68 |
+
|
69 |
+
# Find best paths
|
70 |
+
paths = await self._find_best_paths(tree, context)
|
71 |
+
|
72 |
+
# Synthesize conclusion
|
73 |
+
conclusion = await self._synthesize_conclusion(paths, context)
|
74 |
+
|
75 |
+
# Update history and patterns
|
76 |
+
self._update_history(tree)
|
77 |
+
self._update_patterns(paths)
|
78 |
+
|
79 |
+
return {
|
80 |
+
"success": True,
|
81 |
+
"answer": conclusion["answer"],
|
82 |
+
"confidence": conclusion["confidence"],
|
83 |
+
"tree": self._tree_to_dict(tree),
|
84 |
+
"best_paths": [self._path_to_dict(p) for p in paths],
|
85 |
+
"reasoning_trace": conclusion["trace"],
|
86 |
+
"meta_insights": conclusion["meta_insights"]
|
87 |
+
}
|
88 |
+
except Exception as e:
|
89 |
+
logging.error(f"Error in tree of thoughts reasoning: {str(e)}")
|
90 |
+
return {"success": False, "error": str(e)}
|
91 |
+
|
92 |
+
async def _create_root_node(self, query: str, context: Dict[str, Any]) -> TreeNode:
|
93 |
+
"""Create the root node of the thought tree."""
|
94 |
+
prompt = f"""
|
95 |
+
Initialize root thought node for query:
|
96 |
+
Query: {query}
|
97 |
+
Context: {json.dumps(context)}
|
98 |
+
|
99 |
+
Provide:
|
100 |
+
1. Initial problem decomposition
|
101 |
+
2. Key aspects to explore
|
102 |
+
3. Evaluation criteria
|
103 |
+
4. Success metrics
|
104 |
+
|
105 |
+
Format as:
|
106 |
+
[Root]
|
107 |
+
Decomposition: ...
|
108 |
+
Aspects: ...
|
109 |
+
Criteria: ...
|
110 |
+
Metrics: ...
|
111 |
+
"""
|
112 |
+
|
113 |
+
response = await context["groq_api"].predict(prompt)
|
114 |
+
return self._parse_root_node(response["answer"], query)
|
115 |
+
|
116 |
+
async def _build_tree(self, root: TreeNode, context: Dict[str, Any]) -> TreeNode:
|
117 |
+
"""Build and explore the thought tree."""
|
118 |
+
# Initialize beam with root
|
119 |
+
beam = [(root.evaluation_score, root)]
|
120 |
+
visited: Set[str] = set()
|
121 |
+
|
122 |
+
for depth in range(self.max_depth):
|
123 |
+
next_beam = []
|
124 |
+
|
125 |
+
for _, node in beam:
|
126 |
+
if node.id in visited:
|
127 |
+
continue
|
128 |
+
|
129 |
+
visited.add(node.id)
|
130 |
+
|
131 |
+
# Generate child nodes
|
132 |
+
children = await self._generate_children(node, context)
|
133 |
+
|
134 |
+
# Evaluate and filter children
|
135 |
+
evaluated_children = await self._evaluate_nodes(children, context)
|
136 |
+
|
137 |
+
# Add to beam
|
138 |
+
for child in evaluated_children:
|
139 |
+
if child.evaluation_score > self.prune_threshold:
|
140 |
+
next_beam.append((child.evaluation_score, child))
|
141 |
+
node.children.append(child)
|
142 |
+
|
143 |
+
# Select best nodes for next iteration
|
144 |
+
beam = heapq.nlargest(self.beam_width, next_beam, key=lambda x: x[0])
|
145 |
+
|
146 |
+
if not beam:
|
147 |
+
break
|
148 |
+
|
149 |
+
return root
|
150 |
+
|
151 |
+
async def _generate_children(self, parent: TreeNode, context: Dict[str, Any]) -> List[TreeNode]:
|
152 |
+
"""Generate child nodes for a given parent."""
|
153 |
+
prompt = f"""
|
154 |
+
Generate child thoughts for node:
|
155 |
+
Parent: {json.dumps(self._node_to_dict(parent))}
|
156 |
+
Context: {json.dumps(context)}
|
157 |
+
|
158 |
+
For each child provide:
|
159 |
+
1. [Type]: {" | ".join([t.value for t in NodeType if t != NodeType.ROOT])}
|
160 |
+
2. [Content]: Main thought
|
161 |
+
3. [Confidence]: 0-1 score
|
162 |
+
4. [Rationale]: Why this follows from parent
|
163 |
+
5. [Potential]: Future exploration potential
|
164 |
+
|
165 |
+
Format as:
|
166 |
+
[C1]
|
167 |
+
Type: ...
|
168 |
+
Content: ...
|
169 |
+
Confidence: ...
|
170 |
+
Rationale: ...
|
171 |
+
Potential: ...
|
172 |
+
"""
|
173 |
+
|
174 |
+
response = await context["groq_api"].predict(prompt)
|
175 |
+
return self._parse_child_nodes(response["answer"], parent)
|
176 |
+
|
177 |
+
async def _evaluate_nodes(self, nodes: List[TreeNode], context: Dict[str, Any]) -> List[TreeNode]:
|
178 |
+
"""Evaluate a list of nodes."""
|
179 |
+
prompt = f"""
|
180 |
+
Evaluate thought nodes:
|
181 |
+
Nodes: {json.dumps([self._node_to_dict(n) for n in nodes])}
|
182 |
+
Context: {json.dumps(context)}
|
183 |
+
|
184 |
+
For each node evaluate:
|
185 |
+
1. Logical coherence
|
186 |
+
2. Evidence support
|
187 |
+
3. Novelty value
|
188 |
+
4. Exploration potential
|
189 |
+
|
190 |
+
Format as:
|
191 |
+
[N1]
|
192 |
+
Coherence: 0-1
|
193 |
+
Evidence: 0-1
|
194 |
+
Novelty: 0-1
|
195 |
+
Potential: 0-1
|
196 |
+
Overall: 0-1
|
197 |
+
"""
|
198 |
+
|
199 |
+
response = await context["groq_api"].predict(prompt)
|
200 |
+
return self._apply_evaluations(nodes, response["answer"])
|
201 |
+
|
202 |
+
async def _find_best_paths(self, root: TreeNode, context: Dict[str, Any]) -> List[List[TreeNode]]:
|
203 |
+
"""Find the best paths through the tree."""
|
204 |
+
paths = []
|
205 |
+
current_path = [root]
|
206 |
+
|
207 |
+
def dfs(node: TreeNode, path: List[TreeNode]):
|
208 |
+
if not node.children:
|
209 |
+
paths.append(path[:])
|
210 |
+
return
|
211 |
+
|
212 |
+
# Sort children by score
|
213 |
+
sorted_children = sorted(node.children, key=lambda x: x.evaluation_score, reverse=True)
|
214 |
+
|
215 |
+
# Explore top paths
|
216 |
+
for child in sorted_children[:self.beam_width]:
|
217 |
+
path.append(child)
|
218 |
+
dfs(child, path)
|
219 |
+
path.pop()
|
220 |
+
|
221 |
+
dfs(root, current_path)
|
222 |
+
|
223 |
+
# Evaluate complete paths
|
224 |
+
evaluated_paths = await self._evaluate_paths(paths, context)
|
225 |
+
|
226 |
+
# Return top paths
|
227 |
+
return sorted(evaluated_paths, key=lambda p: sum(n.evaluation_score for n in p), reverse=True)[:self.beam_width]
|
228 |
+
|
229 |
+
async def _synthesize_conclusion(self, paths: List[List[TreeNode]], context: Dict[str, Any]) -> Dict[str, Any]:
|
230 |
+
"""Synthesize final conclusion from best paths."""
|
231 |
+
prompt = f"""
|
232 |
+
Synthesize conclusion from thought paths:
|
233 |
+
Paths: {json.dumps([[self._node_to_dict(n) for n in path] for path in paths])}
|
234 |
+
Context: {json.dumps(context)}
|
235 |
+
|
236 |
+
Provide:
|
237 |
+
1. Main conclusion
|
238 |
+
2. Confidence level
|
239 |
+
3. Reasoning trace
|
240 |
+
4. Supporting evidence
|
241 |
+
5. Alternative perspectives
|
242 |
+
6. Meta-insights
|
243 |
+
|
244 |
+
Format as:
|
245 |
+
[Conclusion]
|
246 |
+
Answer: ...
|
247 |
+
Confidence: ...
|
248 |
+
Trace: ...
|
249 |
+
Evidence: ...
|
250 |
+
Alternatives: ...
|
251 |
+
|
252 |
+
[Meta]
|
253 |
+
Insights: ...
|
254 |
+
Patterns: ...
|
255 |
+
"""
|
256 |
+
|
257 |
+
response = await context["groq_api"].predict(prompt)
|
258 |
+
return self._parse_conclusion(response["answer"])
|
259 |
+
|
260 |
+
def _parse_root_node(self, response: str, query: str) -> TreeNode:
|
261 |
+
"""Parse root node from response."""
|
262 |
+
root = TreeNode(
|
263 |
+
id="root",
|
264 |
+
type=NodeType.ROOT,
|
265 |
+
content=query,
|
266 |
+
confidence=1.0,
|
267 |
+
children=[],
|
268 |
+
parent=None,
|
269 |
+
metadata={},
|
270 |
+
depth=0
|
271 |
+
)
|
272 |
+
|
273 |
+
for line in response.split('\n'):
|
274 |
+
line = line.strip()
|
275 |
+
if line.startswith('Decomposition:'):
|
276 |
+
root.metadata["decomposition"] = line[14:].strip()
|
277 |
+
elif line.startswith('Aspects:'):
|
278 |
+
root.metadata["aspects"] = [a.strip() for a in line[8:].split(',')]
|
279 |
+
elif line.startswith('Criteria:'):
|
280 |
+
root.metadata["criteria"] = [c.strip() for c in line[9:].split(',')]
|
281 |
+
elif line.startswith('Metrics:'):
|
282 |
+
root.metadata["metrics"] = [m.strip() for m in line[8:].split(',')]
|
283 |
+
|
284 |
+
return root
|
285 |
+
|
286 |
+
def _parse_child_nodes(self, response: str, parent: TreeNode) -> List[TreeNode]:
|
287 |
+
"""Parse child nodes from response."""
|
288 |
+
children = []
|
289 |
+
current = None
|
290 |
+
|
291 |
+
for line in response.split('\n'):
|
292 |
+
line = line.strip()
|
293 |
+
if not line:
|
294 |
+
continue
|
295 |
+
|
296 |
+
if line.startswith('[C'):
|
297 |
+
if current:
|
298 |
+
children.append(current)
|
299 |
+
current = None
|
300 |
+
elif line.startswith('Type:'):
|
301 |
+
type_str = line[5:].strip()
|
302 |
+
try:
|
303 |
+
node_type = NodeType(type_str.lower())
|
304 |
+
current = TreeNode(
|
305 |
+
id=f"{parent.id}_{len(children)}",
|
306 |
+
type=node_type,
|
307 |
+
content="",
|
308 |
+
confidence=0.0,
|
309 |
+
children=[],
|
310 |
+
parent=parent,
|
311 |
+
metadata={},
|
312 |
+
depth=parent.depth + 1
|
313 |
+
)
|
314 |
+
except ValueError:
|
315 |
+
logging.warning(f"Invalid node type: {type_str}")
|
316 |
+
elif current:
|
317 |
+
if line.startswith('Content:'):
|
318 |
+
current.content = line[8:].strip()
|
319 |
+
elif line.startswith('Confidence:'):
|
320 |
+
try:
|
321 |
+
current.confidence = float(line[11:].strip())
|
322 |
+
except:
|
323 |
+
current.confidence = 0.5
|
324 |
+
elif line.startswith('Rationale:'):
|
325 |
+
current.metadata["rationale"] = line[10:].strip()
|
326 |
+
elif line.startswith('Potential:'):
|
327 |
+
current.metadata["potential"] = line[10:].strip()
|
328 |
+
|
329 |
+
if current:
|
330 |
+
children.append(current)
|
331 |
+
|
332 |
+
return children
|
333 |
+
|
334 |
+
def _apply_evaluations(self, nodes: List[TreeNode], response: str) -> List[TreeNode]:
|
335 |
+
"""Apply evaluation scores to nodes."""
|
336 |
+
current_node_idx = 0
|
337 |
+
current_scores = {}
|
338 |
+
|
339 |
+
for line in response.split('\n'):
|
340 |
+
line = line.strip()
|
341 |
+
if not line:
|
342 |
+
continue
|
343 |
+
|
344 |
+
if line.startswith('[N'):
|
345 |
+
if current_scores and current_node_idx < len(nodes):
|
346 |
+
nodes[current_node_idx].evaluation_score = current_scores.get("Overall", 0.0)
|
347 |
+
nodes[current_node_idx].metadata.update(current_scores)
|
348 |
+
current_node_idx += 1
|
349 |
+
current_scores = {}
|
350 |
+
elif ':' in line:
|
351 |
+
key, value = line.split(':')
|
352 |
+
try:
|
353 |
+
current_scores[key.strip()] = float(value.strip())
|
354 |
+
except:
|
355 |
+
pass
|
356 |
+
|
357 |
+
if current_scores and current_node_idx < len(nodes):
|
358 |
+
nodes[current_node_idx].evaluation_score = current_scores.get("Overall", 0.0)
|
359 |
+
nodes[current_node_idx].metadata.update(current_scores)
|
360 |
+
|
361 |
+
return nodes
|
362 |
+
|
363 |
+
async def _evaluate_paths(self, paths: List[List[TreeNode]], context: Dict[str, Any]) -> List[List[TreeNode]]:
|
364 |
+
"""Evaluate complete reasoning paths."""
|
365 |
+
prompt = f"""
|
366 |
+
Evaluate complete reasoning paths:
|
367 |
+
Paths: {json.dumps([[self._node_to_dict(n) for n in path] for path in paths])}
|
368 |
+
Context: {json.dumps(context)}
|
369 |
+
|
370 |
+
For each path evaluate:
|
371 |
+
1. Coherence of progression
|
372 |
+
2. Evidence support
|
373 |
+
3. Conclusion strength
|
374 |
+
4. Novel insights
|
375 |
+
|
376 |
+
Format as:
|
377 |
+
[P1]
|
378 |
+
Coherence: 0-1
|
379 |
+
Evidence: 0-1
|
380 |
+
Conclusion: 0-1
|
381 |
+
Insights: 0-1
|
382 |
+
Overall: 0-1
|
383 |
+
"""
|
384 |
+
|
385 |
+
response = await context["groq_api"].predict(prompt)
|
386 |
+
scores = self._parse_path_scores(response["answer"])
|
387 |
+
|
388 |
+
# Apply scores to paths
|
389 |
+
for i, path in enumerate(paths):
|
390 |
+
if i < len(scores):
|
391 |
+
for node in path:
|
392 |
+
node.evaluation_score *= scores[i]
|
393 |
+
|
394 |
+
return paths
|
395 |
+
|
396 |
+
def _parse_path_scores(self, response: str) -> List[float]:
|
397 |
+
"""Parse path evaluation scores."""
|
398 |
+
scores = []
|
399 |
+
current_score = None
|
400 |
+
|
401 |
+
for line in response.split('\n'):
|
402 |
+
line = line.strip()
|
403 |
+
if not line:
|
404 |
+
continue
|
405 |
+
|
406 |
+
if line.startswith('[P'):
|
407 |
+
if current_score is not None:
|
408 |
+
scores.append(current_score)
|
409 |
+
current_score = None
|
410 |
+
elif line.startswith('Overall:'):
|
411 |
+
try:
|
412 |
+
current_score = float(line[8:].strip())
|
413 |
+
except:
|
414 |
+
current_score = 0.5
|
415 |
+
|
416 |
+
if current_score is not None:
|
417 |
+
scores.append(current_score)
|
418 |
+
|
419 |
+
return scores
|
420 |
+
|
421 |
+
def _parse_conclusion(self, response: str) -> Dict[str, Any]:
|
422 |
+
"""Parse final conclusion."""
|
423 |
+
conclusion = {
|
424 |
+
"answer": "",
|
425 |
+
"confidence": 0.0,
|
426 |
+
"trace": [],
|
427 |
+
"evidence": [],
|
428 |
+
"alternatives": [],
|
429 |
+
"meta_insights": []
|
430 |
+
}
|
431 |
+
|
432 |
+
section = None
|
433 |
+
for line in response.split('\n'):
|
434 |
+
line = line.strip()
|
435 |
+
if not line:
|
436 |
+
continue
|
437 |
+
|
438 |
+
if line.startswith('[Conclusion]'):
|
439 |
+
section = "conclusion"
|
440 |
+
elif line.startswith('[Meta]'):
|
441 |
+
section = "meta"
|
442 |
+
elif section == "conclusion":
|
443 |
+
if line.startswith('Answer:'):
|
444 |
+
conclusion["answer"] = line[7:].strip()
|
445 |
+
elif line.startswith('Confidence:'):
|
446 |
+
try:
|
447 |
+
conclusion["confidence"] = float(line[11:].strip())
|
448 |
+
except:
|
449 |
+
conclusion["confidence"] = 0.5
|
450 |
+
elif line.startswith('Trace:'):
|
451 |
+
conclusion["trace"] = [t.strip() for t in line[6:].split(',')]
|
452 |
+
elif line.startswith('Evidence:'):
|
453 |
+
conclusion["evidence"] = [e.strip() for e in line[9:].split(',')]
|
454 |
+
elif line.startswith('Alternatives:'):
|
455 |
+
conclusion["alternatives"] = [a.strip() for a in line[13:].split(',')]
|
456 |
+
elif section == "meta":
|
457 |
+
if line.startswith('Insights:'):
|
458 |
+
conclusion["meta_insights"].extend([i.strip() for i in line[9:].split(',')])
|
459 |
+
|
460 |
+
return conclusion
|
461 |
+
|
462 |
+
def _node_to_dict(self, node: TreeNode) -> Dict[str, Any]:
|
463 |
+
"""Convert node to dictionary for serialization."""
|
464 |
+
return {
|
465 |
+
"id": node.id,
|
466 |
+
"type": node.type.value,
|
467 |
+
"content": node.content,
|
468 |
+
"confidence": node.confidence,
|
469 |
+
"evaluation_score": node.evaluation_score,
|
470 |
+
"metadata": node.metadata,
|
471 |
+
"depth": node.depth
|
472 |
+
}
|
473 |
+
|
474 |
+
def _tree_to_dict(self, root: TreeNode) -> Dict[str, Any]:
|
475 |
+
"""Convert entire tree to dictionary."""
|
476 |
+
def convert_node(node: TreeNode) -> Dict[str, Any]:
|
477 |
+
node_dict = self._node_to_dict(node)
|
478 |
+
node_dict["children"] = [convert_node(c) for c in node.children]
|
479 |
+
return node_dict
|
480 |
+
|
481 |
+
return convert_node(root)
|
482 |
+
|
483 |
+
def _path_to_dict(self, path: List[TreeNode]) -> List[Dict[str, Any]]:
|
484 |
+
"""Convert path to dictionary."""
|
485 |
+
return [self._node_to_dict(n) for n in path]
|
486 |
+
|
487 |
+
def _update_history(self, root: TreeNode):
|
488 |
+
"""Update node history."""
|
489 |
+
def add_to_history(node: TreeNode):
|
490 |
+
self.node_history[node.id] = node
|
491 |
+
for child in node.children:
|
492 |
+
add_to_history(child)
|
493 |
+
|
494 |
+
add_to_history(root)
|
495 |
+
|
496 |
+
def _update_patterns(self, paths: List[List[TreeNode]]):
|
497 |
+
"""Update path patterns."""
|
498 |
+
for path in paths:
|
499 |
+
pattern = "->".join(n.type.value for n in path)
|
500 |
+
self.path_patterns[pattern] += path[-1].evaluation_score
|
501 |
+
|
502 |
+
def get_node_history(self) -> Dict[str, Dict[str, Any]]:
|
503 |
+
"""Get history of all nodes."""
|
504 |
+
return {k: self._node_to_dict(v) for k, v in self.node_history.items()}
|
505 |
+
|
506 |
+
def get_successful_patterns(self) -> Dict[str, float]:
|
507 |
+
"""Get successful reasoning patterns."""
|
508 |
+
return dict(sorted(self.path_patterns.items(), key=lambda x: x[1], reverse=True))
|
509 |
+
|
510 |
+
def clear_history(self):
|
511 |
+
"""Clear node history and patterns."""
|
512 |
+
self.node_history.clear()
|
513 |
+
self.path_patterns.clear()
|
reasoning/unified_engine.py
ADDED
@@ -0,0 +1,427 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Unified reasoning engine that combines multiple reasoning strategies."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import asyncio
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
from .chain_of_thought import ChainOfThoughtStrategy
|
14 |
+
from .tree_of_thoughts import TreeOfThoughtsStrategy
|
15 |
+
from .meta_learning import MetaLearningStrategy
|
16 |
+
from .recursive import RecursiveReasoning
|
17 |
+
from .analogical import AnalogicalReasoning
|
18 |
+
from .local_llm import LocalLLMStrategy
|
19 |
+
from .agentic import (
|
20 |
+
TaskDecompositionStrategy,
|
21 |
+
ResourceManagementStrategy,
|
22 |
+
ContextualPlanningStrategy,
|
23 |
+
AdaptiveExecutionStrategy,
|
24 |
+
FeedbackIntegrationStrategy
|
25 |
+
)
|
26 |
+
|
27 |
+
class StrategyType(str, Enum):
|
28 |
+
"""Types of reasoning strategies."""
|
29 |
+
CHAIN_OF_THOUGHT = "chain_of_thought"
|
30 |
+
TREE_OF_THOUGHTS = "tree_of_thoughts"
|
31 |
+
META_LEARNING = "meta_learning"
|
32 |
+
RECURSIVE = "recursive"
|
33 |
+
ANALOGICAL = "analogical"
|
34 |
+
TASK_DECOMPOSITION = "task_decomposition"
|
35 |
+
RESOURCE_MANAGEMENT = "resource_management"
|
36 |
+
CONTEXTUAL_PLANNING = "contextual_planning"
|
37 |
+
ADAPTIVE_EXECUTION = "adaptive_execution"
|
38 |
+
FEEDBACK_INTEGRATION = "feedback_integration"
|
39 |
+
LOCAL_LLM = "local_llm"
|
40 |
+
|
41 |
+
@dataclass
|
42 |
+
class StrategyResult:
|
43 |
+
"""Result from a reasoning strategy."""
|
44 |
+
strategy_type: StrategyType
|
45 |
+
success: bool
|
46 |
+
answer: Optional[str]
|
47 |
+
confidence: float
|
48 |
+
reasoning_trace: List[Dict[str, Any]]
|
49 |
+
metadata: Dict[str, Any]
|
50 |
+
performance_metrics: Dict[str, Any]
|
51 |
+
timestamp: datetime = field(default_factory=datetime.now)
|
52 |
+
|
53 |
+
@dataclass
|
54 |
+
class UnifiedResult:
|
55 |
+
"""Combined result from multiple strategies."""
|
56 |
+
success: bool
|
57 |
+
answer: str
|
58 |
+
confidence: float
|
59 |
+
strategy_results: Dict[StrategyType, StrategyResult]
|
60 |
+
synthesis_method: str
|
61 |
+
meta_insights: List[str]
|
62 |
+
performance_metrics: Dict[str, Any]
|
63 |
+
timestamp: datetime = field(default_factory=datetime.now)
|
64 |
+
|
65 |
+
class UnifiedReasoningEngine:
|
66 |
+
"""
|
67 |
+
Advanced unified reasoning engine that:
|
68 |
+
1. Combines multiple reasoning strategies
|
69 |
+
2. Dynamically selects and weights strategies
|
70 |
+
3. Synthesizes results from different approaches
|
71 |
+
4. Learns from experience
|
72 |
+
5. Adapts to different types of tasks
|
73 |
+
"""
|
74 |
+
|
75 |
+
def __init__(self,
|
76 |
+
min_confidence: float = 0.7,
|
77 |
+
strategy_weights: Optional[Dict[StrategyType, float]] = None,
|
78 |
+
parallel_threshold: int = 3,
|
79 |
+
learning_rate: float = 0.1):
|
80 |
+
self.min_confidence = min_confidence
|
81 |
+
self.parallel_threshold = parallel_threshold
|
82 |
+
self.learning_rate = learning_rate
|
83 |
+
|
84 |
+
# Initialize strategies
|
85 |
+
self.strategies: Dict[StrategyType, ReasoningStrategy] = {
|
86 |
+
StrategyType.CHAIN_OF_THOUGHT: ChainOfThoughtStrategy(),
|
87 |
+
StrategyType.TREE_OF_THOUGHTS: TreeOfThoughtsStrategy(),
|
88 |
+
StrategyType.META_LEARNING: MetaLearningStrategy(),
|
89 |
+
StrategyType.RECURSIVE: RecursiveReasoning(),
|
90 |
+
StrategyType.ANALOGICAL: AnalogicalReasoning(),
|
91 |
+
StrategyType.TASK_DECOMPOSITION: TaskDecompositionStrategy(),
|
92 |
+
StrategyType.RESOURCE_MANAGEMENT: ResourceManagementStrategy(),
|
93 |
+
StrategyType.CONTEXTUAL_PLANNING: ContextualPlanningStrategy(),
|
94 |
+
StrategyType.ADAPTIVE_EXECUTION: AdaptiveExecutionStrategy(),
|
95 |
+
StrategyType.FEEDBACK_INTEGRATION: FeedbackIntegrationStrategy(),
|
96 |
+
StrategyType.LOCAL_LLM: LocalLLMStrategy() # Add local LLM strategy
|
97 |
+
}
|
98 |
+
|
99 |
+
# Strategy weights with higher weight for LOCAL_LLM
|
100 |
+
self.strategy_weights = strategy_weights or {
|
101 |
+
**{strategy_type: 1.0 for strategy_type in StrategyType},
|
102 |
+
StrategyType.LOCAL_LLM: 2.0 # Higher weight for local LLM
|
103 |
+
}
|
104 |
+
|
105 |
+
# Performance tracking
|
106 |
+
self.strategy_performance: Dict[StrategyType, List[float]] = defaultdict(list)
|
107 |
+
self.task_type_performance: Dict[str, Dict[StrategyType, float]] = defaultdict(lambda: defaultdict(float))
|
108 |
+
self.synthesis_performance: Dict[str, List[float]] = defaultdict(list)
|
109 |
+
|
110 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> UnifiedResult:
|
111 |
+
"""Main reasoning method combining multiple strategies."""
|
112 |
+
try:
|
113 |
+
# Analyze task
|
114 |
+
task_analysis = await self._analyze_task(query, context)
|
115 |
+
|
116 |
+
# Select strategies
|
117 |
+
selected_strategies = await self._select_strategies(task_analysis, context)
|
118 |
+
|
119 |
+
# Execute strategies
|
120 |
+
strategy_results = await self._execute_strategies(
|
121 |
+
selected_strategies, query, context)
|
122 |
+
|
123 |
+
# Synthesize results
|
124 |
+
unified_result = await self._synthesize_results(
|
125 |
+
strategy_results, task_analysis, context)
|
126 |
+
|
127 |
+
# Learn from experience
|
128 |
+
self._update_performance(unified_result)
|
129 |
+
|
130 |
+
return unified_result
|
131 |
+
|
132 |
+
except Exception as e:
|
133 |
+
logging.error(f"Error in unified reasoning: {str(e)}")
|
134 |
+
return UnifiedResult(
|
135 |
+
success=False,
|
136 |
+
answer=f"Error: {str(e)}",
|
137 |
+
confidence=0.0,
|
138 |
+
strategy_results={},
|
139 |
+
synthesis_method="failed",
|
140 |
+
meta_insights=[f"Error occurred: {str(e)}"],
|
141 |
+
performance_metrics={}
|
142 |
+
)
|
143 |
+
|
144 |
+
async def _analyze_task(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
145 |
+
"""Analyze the task to determine optimal strategy selection."""
|
146 |
+
prompt = f"""
|
147 |
+
Analyze reasoning task:
|
148 |
+
Query: {query}
|
149 |
+
Context: {json.dumps(context)}
|
150 |
+
|
151 |
+
Determine:
|
152 |
+
1. Task type and complexity
|
153 |
+
2. Required reasoning capabilities
|
154 |
+
3. Resource requirements
|
155 |
+
4. Success criteria
|
156 |
+
5. Risk factors
|
157 |
+
|
158 |
+
Format as:
|
159 |
+
[Analysis]
|
160 |
+
Type: ...
|
161 |
+
Complexity: ...
|
162 |
+
Capabilities: ...
|
163 |
+
Resources: ...
|
164 |
+
Criteria: ...
|
165 |
+
Risks: ...
|
166 |
+
"""
|
167 |
+
|
168 |
+
response = await context["groq_api"].predict(prompt)
|
169 |
+
return self._parse_task_analysis(response["answer"])
|
170 |
+
|
171 |
+
async def _select_strategies(self, task_analysis: Dict[str, Any], context: Dict[str, Any]) -> List[StrategyType]:
|
172 |
+
"""Select appropriate strategies based on task analysis."""
|
173 |
+
# Calculate strategy scores
|
174 |
+
scores: Dict[StrategyType, float] = {}
|
175 |
+
for strategy_type in StrategyType:
|
176 |
+
base_score = self.strategy_weights[strategy_type]
|
177 |
+
|
178 |
+
# Task type performance
|
179 |
+
task_type = task_analysis["type"]
|
180 |
+
type_score = self.task_type_performance[task_type][strategy_type]
|
181 |
+
|
182 |
+
# Recent performance
|
183 |
+
recent_performance = (
|
184 |
+
sum(self.strategy_performance[strategy_type][-5:]) / 5
|
185 |
+
if self.strategy_performance[strategy_type] else 0.5
|
186 |
+
)
|
187 |
+
|
188 |
+
# Resource match
|
189 |
+
resource_match = self._calculate_resource_match(
|
190 |
+
strategy_type, task_analysis["resources"])
|
191 |
+
|
192 |
+
# Capability match
|
193 |
+
capability_match = self._calculate_capability_match(
|
194 |
+
strategy_type, task_analysis["capabilities"])
|
195 |
+
|
196 |
+
# Combined score
|
197 |
+
scores[strategy_type] = (
|
198 |
+
0.3 * base_score +
|
199 |
+
0.2 * type_score +
|
200 |
+
0.2 * recent_performance +
|
201 |
+
0.15 * resource_match +
|
202 |
+
0.15 * capability_match
|
203 |
+
)
|
204 |
+
|
205 |
+
# Select top strategies
|
206 |
+
selected = sorted(
|
207 |
+
StrategyType,
|
208 |
+
key=lambda x: scores[x],
|
209 |
+
reverse=True
|
210 |
+
)[:self.parallel_threshold]
|
211 |
+
|
212 |
+
return selected
|
213 |
+
|
214 |
+
async def _execute_strategies(self,
|
215 |
+
strategies: List[StrategyType],
|
216 |
+
query: str,
|
217 |
+
context: Dict[str, Any]) -> Dict[StrategyType, StrategyResult]:
|
218 |
+
"""Execute selected strategies in parallel."""
|
219 |
+
async def execute_strategy(strategy_type: StrategyType) -> StrategyResult:
|
220 |
+
strategy = self.strategies[strategy_type]
|
221 |
+
start_time = datetime.now()
|
222 |
+
|
223 |
+
try:
|
224 |
+
result = await strategy.reason(query, context)
|
225 |
+
|
226 |
+
return StrategyResult(
|
227 |
+
strategy_type=strategy_type,
|
228 |
+
success=result.get("success", False),
|
229 |
+
answer=result.get("answer"),
|
230 |
+
confidence=result.get("confidence", 0.0),
|
231 |
+
reasoning_trace=result.get("reasoning_trace", []),
|
232 |
+
metadata=result.get("metadata", {}),
|
233 |
+
performance_metrics={
|
234 |
+
"execution_time": (datetime.now() - start_time).total_seconds(),
|
235 |
+
**result.get("performance_metrics", {})
|
236 |
+
}
|
237 |
+
)
|
238 |
+
except Exception as e:
|
239 |
+
logging.error(f"Error in strategy {strategy_type}: {str(e)}")
|
240 |
+
return StrategyResult(
|
241 |
+
strategy_type=strategy_type,
|
242 |
+
success=False,
|
243 |
+
answer=None,
|
244 |
+
confidence=0.0,
|
245 |
+
reasoning_trace=[{"error": str(e)}],
|
246 |
+
metadata={},
|
247 |
+
performance_metrics={"execution_time": (datetime.now() - start_time).total_seconds()}
|
248 |
+
)
|
249 |
+
|
250 |
+
# Execute strategies in parallel
|
251 |
+
tasks = [execute_strategy(strategy) for strategy in strategies]
|
252 |
+
results = await asyncio.gather(*tasks)
|
253 |
+
|
254 |
+
return {result.strategy_type: result for result in results}
|
255 |
+
|
256 |
+
async def _synthesize_results(self,
|
257 |
+
strategy_results: Dict[StrategyType, StrategyResult],
|
258 |
+
task_analysis: Dict[str, Any],
|
259 |
+
context: Dict[str, Any]) -> UnifiedResult:
|
260 |
+
"""Synthesize results from multiple strategies."""
|
261 |
+
prompt = f"""
|
262 |
+
Synthesize reasoning results:
|
263 |
+
Results: {json.dumps({str(k): self._strategy_result_to_dict(v)
|
264 |
+
for k, v in strategy_results.items()})}
|
265 |
+
Task Analysis: {json.dumps(task_analysis)}
|
266 |
+
Context: {json.dumps(context)}
|
267 |
+
|
268 |
+
Provide:
|
269 |
+
1. Optimal synthesis method
|
270 |
+
2. Combined answer
|
271 |
+
3. Confidence assessment
|
272 |
+
4. Meta-insights
|
273 |
+
5. Performance analysis
|
274 |
+
|
275 |
+
Format as:
|
276 |
+
[Synthesis]
|
277 |
+
Method: ...
|
278 |
+
Answer: ...
|
279 |
+
Confidence: ...
|
280 |
+
Insights: ...
|
281 |
+
Performance: ...
|
282 |
+
"""
|
283 |
+
|
284 |
+
response = await context["groq_api"].predict(prompt)
|
285 |
+
synthesis = self._parse_synthesis(response["answer"])
|
286 |
+
|
287 |
+
return UnifiedResult(
|
288 |
+
success=synthesis["confidence"] >= self.min_confidence,
|
289 |
+
answer=synthesis["answer"],
|
290 |
+
confidence=synthesis["confidence"],
|
291 |
+
strategy_results=strategy_results,
|
292 |
+
synthesis_method=synthesis["method"],
|
293 |
+
meta_insights=synthesis["insights"],
|
294 |
+
performance_metrics=synthesis["performance"]
|
295 |
+
)
|
296 |
+
|
297 |
+
def _update_performance(self, result: UnifiedResult):
|
298 |
+
"""Update performance metrics and strategy weights."""
|
299 |
+
# Update strategy performance
|
300 |
+
for strategy_type, strategy_result in result.strategy_results.items():
|
301 |
+
self.strategy_performance[strategy_type].append(strategy_result.confidence)
|
302 |
+
|
303 |
+
# Update weights using exponential moving average
|
304 |
+
current_weight = self.strategy_weights[strategy_type]
|
305 |
+
performance = strategy_result.confidence
|
306 |
+
self.strategy_weights[strategy_type] = (
|
307 |
+
(1 - self.learning_rate) * current_weight +
|
308 |
+
self.learning_rate * performance
|
309 |
+
)
|
310 |
+
|
311 |
+
# Update synthesis performance
|
312 |
+
self.synthesis_performance[result.synthesis_method].append(result.confidence)
|
313 |
+
|
314 |
+
def _calculate_resource_match(self, strategy_type: StrategyType, required_resources: Dict[str, Any]) -> float:
|
315 |
+
"""Calculate how well a strategy matches required resources."""
|
316 |
+
# Implementation-specific resource matching logic
|
317 |
+
return 0.8 # Placeholder
|
318 |
+
|
319 |
+
def _calculate_capability_match(self, strategy_type: StrategyType, required_capabilities: List[str]) -> float:
|
320 |
+
"""Calculate how well a strategy matches required capabilities."""
|
321 |
+
# Implementation-specific capability matching logic
|
322 |
+
return 0.8 # Placeholder
|
323 |
+
|
324 |
+
def _parse_task_analysis(self, response: str) -> Dict[str, Any]:
|
325 |
+
"""Parse task analysis from response."""
|
326 |
+
analysis = {
|
327 |
+
"type": "",
|
328 |
+
"complexity": 0.0,
|
329 |
+
"capabilities": [],
|
330 |
+
"resources": {},
|
331 |
+
"criteria": [],
|
332 |
+
"risks": []
|
333 |
+
}
|
334 |
+
|
335 |
+
for line in response.split('\n'):
|
336 |
+
line = line.strip()
|
337 |
+
if line.startswith('Type:'):
|
338 |
+
analysis["type"] = line[5:].strip()
|
339 |
+
elif line.startswith('Complexity:'):
|
340 |
+
try:
|
341 |
+
analysis["complexity"] = float(line[11:].strip())
|
342 |
+
except:
|
343 |
+
pass
|
344 |
+
elif line.startswith('Capabilities:'):
|
345 |
+
analysis["capabilities"] = [c.strip() for c in line[13:].split(',')]
|
346 |
+
elif line.startswith('Resources:'):
|
347 |
+
try:
|
348 |
+
analysis["resources"] = json.loads(line[10:].strip())
|
349 |
+
except:
|
350 |
+
analysis["resources"] = {"raw": line[10:].strip()}
|
351 |
+
elif line.startswith('Criteria:'):
|
352 |
+
analysis["criteria"] = [c.strip() for c in line[9:].split(',')]
|
353 |
+
elif line.startswith('Risks:'):
|
354 |
+
analysis["risks"] = [r.strip() for r in line[7:].split(',')]
|
355 |
+
|
356 |
+
return analysis
|
357 |
+
|
358 |
+
def _parse_synthesis(self, response: str) -> Dict[str, Any]:
|
359 |
+
"""Parse synthesis result from response."""
|
360 |
+
synthesis = {
|
361 |
+
"method": "",
|
362 |
+
"answer": "",
|
363 |
+
"confidence": 0.0,
|
364 |
+
"insights": [],
|
365 |
+
"performance": {}
|
366 |
+
}
|
367 |
+
|
368 |
+
for line in response.split('\n'):
|
369 |
+
line = line.strip()
|
370 |
+
if line.startswith('Method:'):
|
371 |
+
synthesis["method"] = line[7:].strip()
|
372 |
+
elif line.startswith('Answer:'):
|
373 |
+
synthesis["answer"] = line[7:].strip()
|
374 |
+
elif line.startswith('Confidence:'):
|
375 |
+
try:
|
376 |
+
synthesis["confidence"] = float(line[11:].strip())
|
377 |
+
except:
|
378 |
+
pass
|
379 |
+
elif line.startswith('Insights:'):
|
380 |
+
synthesis["insights"] = [i.strip() for i in line[9:].split(',')]
|
381 |
+
elif line.startswith('Performance:'):
|
382 |
+
try:
|
383 |
+
synthesis["performance"] = json.loads(line[12:].strip())
|
384 |
+
except:
|
385 |
+
synthesis["performance"] = {"raw": line[12:].strip()}
|
386 |
+
|
387 |
+
return synthesis
|
388 |
+
|
389 |
+
def _strategy_result_to_dict(self, result: StrategyResult) -> Dict[str, Any]:
|
390 |
+
"""Convert strategy result to dictionary for serialization."""
|
391 |
+
return {
|
392 |
+
"strategy_type": result.strategy_type.value,
|
393 |
+
"success": result.success,
|
394 |
+
"answer": result.answer,
|
395 |
+
"confidence": result.confidence,
|
396 |
+
"reasoning_trace": result.reasoning_trace,
|
397 |
+
"metadata": result.metadata,
|
398 |
+
"performance_metrics": result.performance_metrics,
|
399 |
+
"timestamp": result.timestamp.isoformat()
|
400 |
+
}
|
401 |
+
|
402 |
+
def get_performance_metrics(self) -> Dict[str, Any]:
|
403 |
+
"""Get comprehensive performance metrics."""
|
404 |
+
return {
|
405 |
+
"strategy_weights": dict(self.strategy_weights),
|
406 |
+
"average_performance": {
|
407 |
+
strategy_type.value: sum(scores) / len(scores) if scores else 0
|
408 |
+
for strategy_type, scores in self.strategy_performance.items()
|
409 |
+
},
|
410 |
+
"synthesis_success": {
|
411 |
+
method: sum(scores) / len(scores) if scores else 0
|
412 |
+
for method, scores in self.synthesis_performance.items()
|
413 |
+
},
|
414 |
+
"task_type_performance": {
|
415 |
+
task_type: dict(strategy_scores)
|
416 |
+
for task_type, strategy_scores in self.task_type_performance.items()
|
417 |
+
}
|
418 |
+
}
|
419 |
+
|
420 |
+
def clear_performance_history(self):
|
421 |
+
"""Clear performance history and reset weights."""
|
422 |
+
self.strategy_performance.clear()
|
423 |
+
self.task_type_performance.clear()
|
424 |
+
self.synthesis_performance.clear()
|
425 |
+
self.strategy_weights = {
|
426 |
+
strategy_type: 1.0 for strategy_type in StrategyType
|
427 |
+
}
|
reasoning/venture_strategies.py
ADDED
@@ -0,0 +1,423 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Specialized strategies for autonomous business and revenue generation."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class VentureType(Enum):
|
15 |
+
"""Types of business ventures."""
|
16 |
+
AI_STARTUP = "ai_startup"
|
17 |
+
SAAS = "saas"
|
18 |
+
API_SERVICE = "api_service"
|
19 |
+
DATA_ANALYTICS = "data_analytics"
|
20 |
+
AUTOMATION_SERVICE = "automation_service"
|
21 |
+
CONSULTING = "consulting"
|
22 |
+
DIGITAL_PRODUCTS = "digital_products"
|
23 |
+
MARKETPLACE = "marketplace"
|
24 |
+
|
25 |
+
class RevenueStream(Enum):
|
26 |
+
"""Types of revenue streams."""
|
27 |
+
SUBSCRIPTION = "subscription"
|
28 |
+
USAGE_BASED = "usage_based"
|
29 |
+
LICENSING = "licensing"
|
30 |
+
CONSULTING = "consulting"
|
31 |
+
PRODUCT_SALES = "product_sales"
|
32 |
+
COMMISSION = "commission"
|
33 |
+
ADVERTISING = "advertising"
|
34 |
+
PARTNERSHIP = "partnership"
|
35 |
+
|
36 |
+
@dataclass
|
37 |
+
class VentureMetrics:
|
38 |
+
"""Key business metrics."""
|
39 |
+
revenue: float
|
40 |
+
profit_margin: float
|
41 |
+
customer_acquisition_cost: float
|
42 |
+
lifetime_value: float
|
43 |
+
churn_rate: float
|
44 |
+
growth_rate: float
|
45 |
+
burn_rate: float
|
46 |
+
runway_months: float
|
47 |
+
roi: float
|
48 |
+
|
49 |
+
@dataclass
|
50 |
+
class MarketOpportunity:
|
51 |
+
"""Market opportunity analysis."""
|
52 |
+
market_size: float
|
53 |
+
growth_potential: float
|
54 |
+
competition_level: float
|
55 |
+
entry_barriers: float
|
56 |
+
regulatory_risks: float
|
57 |
+
technology_risks: float
|
58 |
+
monetization_potential: float
|
59 |
+
|
60 |
+
class AIStartupStrategy(ReasoningStrategy):
|
61 |
+
"""
|
62 |
+
Advanced AI startup strategy that:
|
63 |
+
1. Identifies profitable AI applications
|
64 |
+
2. Analyzes market opportunities
|
65 |
+
3. Develops MVP strategies
|
66 |
+
4. Plans scaling approaches
|
67 |
+
5. Optimizes revenue streams
|
68 |
+
"""
|
69 |
+
|
70 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
71 |
+
"""Generate AI startup strategy."""
|
72 |
+
try:
|
73 |
+
# Market analysis
|
74 |
+
market = await self._analyze_market(query, context)
|
75 |
+
|
76 |
+
# Technology assessment
|
77 |
+
tech = await self._assess_technology(market, context)
|
78 |
+
|
79 |
+
# Business model
|
80 |
+
model = await self._develop_business_model(tech, context)
|
81 |
+
|
82 |
+
# Growth strategy
|
83 |
+
strategy = await self._create_growth_strategy(model, context)
|
84 |
+
|
85 |
+
# Financial projections
|
86 |
+
projections = await self._project_financials(strategy, context)
|
87 |
+
|
88 |
+
return {
|
89 |
+
"success": projections["annual_profit"] >= 1_000_000,
|
90 |
+
"market_analysis": market,
|
91 |
+
"tech_assessment": tech,
|
92 |
+
"business_model": model,
|
93 |
+
"growth_strategy": strategy,
|
94 |
+
"financials": projections,
|
95 |
+
"confidence": self._calculate_confidence(projections)
|
96 |
+
}
|
97 |
+
except Exception as e:
|
98 |
+
logging.error(f"Error in AI startup strategy: {str(e)}")
|
99 |
+
return {"success": False, "error": str(e)}
|
100 |
+
|
101 |
+
class SaaSVentureStrategy(ReasoningStrategy):
|
102 |
+
"""
|
103 |
+
Advanced SaaS venture strategy that:
|
104 |
+
1. Identifies scalable SaaS opportunities
|
105 |
+
2. Develops pricing strategies
|
106 |
+
3. Plans customer acquisition
|
107 |
+
4. Optimizes retention
|
108 |
+
5. Maximizes recurring revenue
|
109 |
+
"""
|
110 |
+
|
111 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
112 |
+
"""Generate SaaS venture strategy."""
|
113 |
+
try:
|
114 |
+
# Opportunity analysis
|
115 |
+
opportunity = await self._analyze_opportunity(query, context)
|
116 |
+
|
117 |
+
# Product strategy
|
118 |
+
product = await self._develop_product_strategy(opportunity, context)
|
119 |
+
|
120 |
+
# Pricing model
|
121 |
+
pricing = await self._create_pricing_model(product, context)
|
122 |
+
|
123 |
+
# Growth plan
|
124 |
+
growth = await self._plan_growth(pricing, context)
|
125 |
+
|
126 |
+
# Revenue projections
|
127 |
+
projections = await self._project_revenue(growth, context)
|
128 |
+
|
129 |
+
return {
|
130 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
131 |
+
"opportunity": opportunity,
|
132 |
+
"product": product,
|
133 |
+
"pricing": pricing,
|
134 |
+
"growth": growth,
|
135 |
+
"projections": projections
|
136 |
+
}
|
137 |
+
except Exception as e:
|
138 |
+
logging.error(f"Error in SaaS venture strategy: {str(e)}")
|
139 |
+
return {"success": False, "error": str(e)}
|
140 |
+
|
141 |
+
class AutomationVentureStrategy(ReasoningStrategy):
|
142 |
+
"""
|
143 |
+
Advanced automation venture strategy that:
|
144 |
+
1. Identifies automation opportunities
|
145 |
+
2. Analyzes cost-saving potential
|
146 |
+
3. Develops automation solutions
|
147 |
+
4. Plans implementation
|
148 |
+
5. Maximizes ROI
|
149 |
+
"""
|
150 |
+
|
151 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
152 |
+
"""Generate automation venture strategy."""
|
153 |
+
try:
|
154 |
+
# Opportunity identification
|
155 |
+
opportunities = await self._identify_opportunities(query, context)
|
156 |
+
|
157 |
+
# Solution development
|
158 |
+
solutions = await self._develop_solutions(opportunities, context)
|
159 |
+
|
160 |
+
# Implementation strategy
|
161 |
+
implementation = await self._create_implementation_strategy(solutions, context)
|
162 |
+
|
163 |
+
# ROI analysis
|
164 |
+
roi = await self._analyze_roi(implementation, context)
|
165 |
+
|
166 |
+
# Scale strategy
|
167 |
+
scale = await self._create_scale_strategy(roi, context)
|
168 |
+
|
169 |
+
return {
|
170 |
+
"success": roi["annual_profit"] >= 1_000_000,
|
171 |
+
"opportunities": opportunities,
|
172 |
+
"solutions": solutions,
|
173 |
+
"implementation": implementation,
|
174 |
+
"roi": roi,
|
175 |
+
"scale": scale
|
176 |
+
}
|
177 |
+
except Exception as e:
|
178 |
+
logging.error(f"Error in automation venture strategy: {str(e)}")
|
179 |
+
return {"success": False, "error": str(e)}
|
180 |
+
|
181 |
+
class DataVentureStrategy(ReasoningStrategy):
|
182 |
+
"""
|
183 |
+
Advanced data venture strategy that:
|
184 |
+
1. Identifies valuable data opportunities
|
185 |
+
2. Develops data products
|
186 |
+
3. Creates monetization strategies
|
187 |
+
4. Ensures compliance
|
188 |
+
5. Maximizes data value
|
189 |
+
"""
|
190 |
+
|
191 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
192 |
+
"""Generate data venture strategy."""
|
193 |
+
try:
|
194 |
+
# Data opportunity analysis
|
195 |
+
opportunity = await self._analyze_data_opportunity(query, context)
|
196 |
+
|
197 |
+
# Product development
|
198 |
+
product = await self._develop_data_product(opportunity, context)
|
199 |
+
|
200 |
+
# Monetization strategy
|
201 |
+
monetization = await self._create_monetization_strategy(product, context)
|
202 |
+
|
203 |
+
# Compliance plan
|
204 |
+
compliance = await self._ensure_compliance(monetization, context)
|
205 |
+
|
206 |
+
# Scale plan
|
207 |
+
scale = await self._plan_scaling(compliance, context)
|
208 |
+
|
209 |
+
return {
|
210 |
+
"success": monetization["annual_revenue"] >= 1_000_000,
|
211 |
+
"opportunity": opportunity,
|
212 |
+
"product": product,
|
213 |
+
"monetization": monetization,
|
214 |
+
"compliance": compliance,
|
215 |
+
"scale": scale
|
216 |
+
}
|
217 |
+
except Exception as e:
|
218 |
+
logging.error(f"Error in data venture strategy: {str(e)}")
|
219 |
+
return {"success": False, "error": str(e)}
|
220 |
+
|
221 |
+
class APIVentureStrategy(ReasoningStrategy):
|
222 |
+
"""
|
223 |
+
Advanced API venture strategy that:
|
224 |
+
1. Identifies API opportunities
|
225 |
+
2. Develops API products
|
226 |
+
3. Creates pricing models
|
227 |
+
4. Plans scaling
|
228 |
+
5. Maximizes API value
|
229 |
+
"""
|
230 |
+
|
231 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
232 |
+
"""Generate API venture strategy."""
|
233 |
+
try:
|
234 |
+
# API opportunity analysis
|
235 |
+
opportunity = await self._analyze_api_opportunity(query, context)
|
236 |
+
|
237 |
+
# Product development
|
238 |
+
product = await self._develop_api_product(opportunity, context)
|
239 |
+
|
240 |
+
# Pricing strategy
|
241 |
+
pricing = await self._create_api_pricing(product, context)
|
242 |
+
|
243 |
+
# Scale strategy
|
244 |
+
scale = await self._plan_api_scaling(pricing, context)
|
245 |
+
|
246 |
+
# Revenue projections
|
247 |
+
projections = await self._project_api_revenue(scale, context)
|
248 |
+
|
249 |
+
return {
|
250 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
251 |
+
"opportunity": opportunity,
|
252 |
+
"product": product,
|
253 |
+
"pricing": pricing,
|
254 |
+
"scale": scale,
|
255 |
+
"projections": projections
|
256 |
+
}
|
257 |
+
except Exception as e:
|
258 |
+
logging.error(f"Error in API venture strategy: {str(e)}")
|
259 |
+
return {"success": False, "error": str(e)}
|
260 |
+
|
261 |
+
class MarketplaceVentureStrategy(ReasoningStrategy):
|
262 |
+
"""
|
263 |
+
Advanced marketplace venture strategy that:
|
264 |
+
1. Identifies marketplace opportunities
|
265 |
+
2. Develops platform strategy
|
266 |
+
3. Plans liquidity generation
|
267 |
+
4. Optimizes matching
|
268 |
+
5. Maximizes transaction value
|
269 |
+
"""
|
270 |
+
|
271 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
272 |
+
"""Generate marketplace venture strategy."""
|
273 |
+
try:
|
274 |
+
# Opportunity analysis
|
275 |
+
opportunity = await self._analyze_marketplace_opportunity(query, context)
|
276 |
+
|
277 |
+
# Platform strategy
|
278 |
+
platform = await self._develop_platform_strategy(opportunity, context)
|
279 |
+
|
280 |
+
# Liquidity strategy
|
281 |
+
liquidity = await self._create_liquidity_strategy(platform, context)
|
282 |
+
|
283 |
+
# Growth strategy
|
284 |
+
growth = await self._plan_marketplace_growth(liquidity, context)
|
285 |
+
|
286 |
+
# Revenue projections
|
287 |
+
projections = await self._project_marketplace_revenue(growth, context)
|
288 |
+
|
289 |
+
return {
|
290 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
291 |
+
"opportunity": opportunity,
|
292 |
+
"platform": platform,
|
293 |
+
"liquidity": liquidity,
|
294 |
+
"growth": growth,
|
295 |
+
"projections": projections
|
296 |
+
}
|
297 |
+
except Exception as e:
|
298 |
+
logging.error(f"Error in marketplace venture strategy: {str(e)}")
|
299 |
+
return {"success": False, "error": str(e)}
|
300 |
+
|
301 |
+
class VenturePortfolioStrategy(ReasoningStrategy):
|
302 |
+
"""
|
303 |
+
Advanced venture portfolio strategy that:
|
304 |
+
1. Optimizes venture mix
|
305 |
+
2. Balances risk-reward
|
306 |
+
3. Allocates resources
|
307 |
+
4. Manages dependencies
|
308 |
+
5. Maximizes portfolio value
|
309 |
+
"""
|
310 |
+
|
311 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
312 |
+
"""Generate venture portfolio strategy."""
|
313 |
+
try:
|
314 |
+
# Portfolio analysis
|
315 |
+
analysis = await self._analyze_portfolio(query, context)
|
316 |
+
|
317 |
+
# Venture selection
|
318 |
+
selection = await self._select_ventures(analysis, context)
|
319 |
+
|
320 |
+
# Resource allocation
|
321 |
+
allocation = await self._allocate_resources(selection, context)
|
322 |
+
|
323 |
+
# Risk management
|
324 |
+
risk = await self._manage_risk(allocation, context)
|
325 |
+
|
326 |
+
# Portfolio projections
|
327 |
+
projections = await self._project_portfolio(risk, context)
|
328 |
+
|
329 |
+
return {
|
330 |
+
"success": projections["annual_profit"] >= 1_000_000,
|
331 |
+
"analysis": analysis,
|
332 |
+
"selection": selection,
|
333 |
+
"allocation": allocation,
|
334 |
+
"risk": risk,
|
335 |
+
"projections": projections
|
336 |
+
}
|
337 |
+
except Exception as e:
|
338 |
+
logging.error(f"Error in venture portfolio strategy: {str(e)}")
|
339 |
+
return {"success": False, "error": str(e)}
|
340 |
+
|
341 |
+
async def _analyze_portfolio(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
342 |
+
"""Analyze potential venture portfolio."""
|
343 |
+
prompt = f"""
|
344 |
+
Analyze venture portfolio opportunities:
|
345 |
+
Query: {query}
|
346 |
+
Context: {json.dumps(context)}
|
347 |
+
|
348 |
+
Consider:
|
349 |
+
1. Market opportunities
|
350 |
+
2. Technology trends
|
351 |
+
3. Resource requirements
|
352 |
+
4. Risk factors
|
353 |
+
5. Synergy potential
|
354 |
+
|
355 |
+
Format as:
|
356 |
+
[Analysis]
|
357 |
+
Opportunities: ...
|
358 |
+
Trends: ...
|
359 |
+
Resources: ...
|
360 |
+
Risks: ...
|
361 |
+
Synergies: ...
|
362 |
+
"""
|
363 |
+
|
364 |
+
response = await context["groq_api"].predict(prompt)
|
365 |
+
return self._parse_portfolio_analysis(response["answer"])
|
366 |
+
|
367 |
+
def _parse_portfolio_analysis(self, response: str) -> Dict[str, Any]:
|
368 |
+
"""Parse portfolio analysis from response."""
|
369 |
+
analysis = {
|
370 |
+
"opportunities": [],
|
371 |
+
"trends": [],
|
372 |
+
"resources": {},
|
373 |
+
"risks": [],
|
374 |
+
"synergies": []
|
375 |
+
}
|
376 |
+
|
377 |
+
current_section = None
|
378 |
+
for line in response.split('\n'):
|
379 |
+
line = line.strip()
|
380 |
+
if line.startswith('Opportunities:'):
|
381 |
+
current_section = "opportunities"
|
382 |
+
elif line.startswith('Trends:'):
|
383 |
+
current_section = "trends"
|
384 |
+
elif line.startswith('Resources:'):
|
385 |
+
current_section = "resources"
|
386 |
+
elif line.startswith('Risks:'):
|
387 |
+
current_section = "risks"
|
388 |
+
elif line.startswith('Synergies:'):
|
389 |
+
current_section = "synergies"
|
390 |
+
elif current_section and line:
|
391 |
+
if current_section == "resources":
|
392 |
+
try:
|
393 |
+
key, value = line.split(':')
|
394 |
+
analysis[current_section][key.strip()] = value.strip()
|
395 |
+
except:
|
396 |
+
pass
|
397 |
+
else:
|
398 |
+
analysis[current_section].append(line)
|
399 |
+
|
400 |
+
return analysis
|
401 |
+
|
402 |
+
def get_venture_metrics(self) -> Dict[str, Any]:
|
403 |
+
"""Get comprehensive venture metrics."""
|
404 |
+
return {
|
405 |
+
"portfolio_metrics": {
|
406 |
+
"total_ventures": len(self.ventures),
|
407 |
+
"profitable_ventures": sum(1 for v in self.ventures if v.metrics.profit_margin > 0),
|
408 |
+
"total_revenue": sum(v.metrics.revenue for v in self.ventures),
|
409 |
+
"average_margin": np.mean([v.metrics.profit_margin for v in self.ventures]),
|
410 |
+
"portfolio_roi": np.mean([v.metrics.roi for v in self.ventures])
|
411 |
+
},
|
412 |
+
"market_metrics": {
|
413 |
+
"total_market_size": sum(v.opportunity.market_size for v in self.ventures),
|
414 |
+
"average_growth": np.mean([v.opportunity.growth_potential for v in self.ventures]),
|
415 |
+
"risk_score": np.mean([v.opportunity.regulatory_risks + v.opportunity.technology_risks for v in self.ventures])
|
416 |
+
},
|
417 |
+
"performance_metrics": {
|
418 |
+
"customer_acquisition": np.mean([v.metrics.customer_acquisition_cost for v in self.ventures]),
|
419 |
+
"lifetime_value": np.mean([v.metrics.lifetime_value for v in self.ventures]),
|
420 |
+
"churn_rate": np.mean([v.metrics.churn_rate for v in self.ventures]),
|
421 |
+
"burn_rate": sum(v.metrics.burn_rate for v in self.ventures)
|
422 |
+
}
|
423 |
+
}
|
reasoning/venture_types.py
ADDED
@@ -0,0 +1,332 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Additional venture types for business optimization."""
|
2 |
+
|
3 |
+
import logging
|
4 |
+
from typing import Dict, Any, List, Optional, Set, Union, Type, Tuple
|
5 |
+
import json
|
6 |
+
from dataclasses import dataclass, field
|
7 |
+
from enum import Enum
|
8 |
+
from datetime import datetime
|
9 |
+
import numpy as np
|
10 |
+
from collections import defaultdict
|
11 |
+
|
12 |
+
from .base import ReasoningStrategy
|
13 |
+
|
14 |
+
class AIInfrastructureStrategy(ReasoningStrategy):
|
15 |
+
"""
|
16 |
+
AI infrastructure venture strategy that:
|
17 |
+
1. Identifies infrastructure needs
|
18 |
+
2. Develops cloud solutions
|
19 |
+
3. Optimizes compute resources
|
20 |
+
4. Manages scalability
|
21 |
+
5. Ensures reliability
|
22 |
+
"""
|
23 |
+
|
24 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
25 |
+
"""Generate AI infrastructure strategy."""
|
26 |
+
try:
|
27 |
+
# Market analysis
|
28 |
+
market = await self._analyze_market(query, context)
|
29 |
+
|
30 |
+
# Infrastructure design
|
31 |
+
design = await self._design_infrastructure(market, context)
|
32 |
+
|
33 |
+
# Optimization strategy
|
34 |
+
optimization = await self._create_optimization_strategy(design, context)
|
35 |
+
|
36 |
+
# Scaling plan
|
37 |
+
scaling = await self._plan_scaling(optimization, context)
|
38 |
+
|
39 |
+
# Revenue projections
|
40 |
+
projections = await self._project_revenue(scaling, context)
|
41 |
+
|
42 |
+
return {
|
43 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
44 |
+
"market": market,
|
45 |
+
"design": design,
|
46 |
+
"optimization": optimization,
|
47 |
+
"scaling": scaling,
|
48 |
+
"projections": projections
|
49 |
+
}
|
50 |
+
except Exception as e:
|
51 |
+
logging.error(f"Error in AI infrastructure strategy: {str(e)}")
|
52 |
+
return {"success": False, "error": str(e)}
|
53 |
+
|
54 |
+
class AIConsultingStrategy(ReasoningStrategy):
|
55 |
+
"""
|
56 |
+
AI consulting venture strategy that:
|
57 |
+
1. Identifies consulting opportunities
|
58 |
+
2. Develops service offerings
|
59 |
+
3. Creates delivery frameworks
|
60 |
+
4. Manages client relationships
|
61 |
+
5. Scales operations
|
62 |
+
"""
|
63 |
+
|
64 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
65 |
+
"""Generate AI consulting strategy."""
|
66 |
+
try:
|
67 |
+
# Market analysis
|
68 |
+
market = await self._analyze_consulting_market(query, context)
|
69 |
+
|
70 |
+
# Service design
|
71 |
+
services = await self._design_services(market, context)
|
72 |
+
|
73 |
+
# Delivery framework
|
74 |
+
framework = await self._create_delivery_framework(services, context)
|
75 |
+
|
76 |
+
# Growth strategy
|
77 |
+
growth = await self._plan_growth(framework, context)
|
78 |
+
|
79 |
+
# Revenue projections
|
80 |
+
projections = await self._project_consulting_revenue(growth, context)
|
81 |
+
|
82 |
+
return {
|
83 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
84 |
+
"market": market,
|
85 |
+
"services": services,
|
86 |
+
"framework": framework,
|
87 |
+
"growth": growth,
|
88 |
+
"projections": projections
|
89 |
+
}
|
90 |
+
except Exception as e:
|
91 |
+
logging.error(f"Error in AI consulting strategy: {str(e)}")
|
92 |
+
return {"success": False, "error": str(e)}
|
93 |
+
|
94 |
+
class AIProductStrategy(ReasoningStrategy):
|
95 |
+
"""
|
96 |
+
AI product venture strategy that:
|
97 |
+
1. Identifies product opportunities
|
98 |
+
2. Develops product roadmap
|
99 |
+
3. Creates go-to-market strategy
|
100 |
+
4. Manages product lifecycle
|
101 |
+
5. Scales distribution
|
102 |
+
"""
|
103 |
+
|
104 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
105 |
+
"""Generate AI product strategy."""
|
106 |
+
try:
|
107 |
+
# Market analysis
|
108 |
+
market = await self._analyze_product_market(query, context)
|
109 |
+
|
110 |
+
# Product development
|
111 |
+
product = await self._develop_product_strategy(market, context)
|
112 |
+
|
113 |
+
# Go-to-market
|
114 |
+
gtm = await self._create_gtm_strategy(product, context)
|
115 |
+
|
116 |
+
# Scale strategy
|
117 |
+
scale = await self._plan_product_scaling(gtm, context)
|
118 |
+
|
119 |
+
# Revenue projections
|
120 |
+
projections = await self._project_product_revenue(scale, context)
|
121 |
+
|
122 |
+
return {
|
123 |
+
"success": projections["annual_revenue"] >= 1_000_000,
|
124 |
+
"market": market,
|
125 |
+
"product": product,
|
126 |
+
"gtm": gtm,
|
127 |
+
"scale": scale,
|
128 |
+
"projections": projections
|
129 |
+
}
|
130 |
+
except Exception as e:
|
131 |
+
logging.error(f"Error in AI product strategy: {str(e)}")
|
132 |
+
return {"success": False, "error": str(e)}
|
133 |
+
|
134 |
+
class FinTechStrategy(ReasoningStrategy):
|
135 |
+
"""
|
136 |
+
FinTech venture strategy that:
|
137 |
+
1. Identifies fintech opportunities
|
138 |
+
2. Develops financial products
|
139 |
+
3. Ensures compliance
|
140 |
+
4. Manages risk
|
141 |
+
5. Scales operations
|
142 |
+
"""
|
143 |
+
|
144 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
145 |
+
"""Generate FinTech strategy."""
|
146 |
+
try:
|
147 |
+
# Market analysis
|
148 |
+
market = await self._analyze_fintech_market(query, context)
|
149 |
+
|
150 |
+
# Product development
|
151 |
+
product = await self._develop_fintech_product(market, context)
|
152 |
+
|
153 |
+
# Compliance strategy
|
154 |
+
compliance = await self._ensure_compliance(product, context)
|
155 |
+
|
156 |
+
# Risk management
|
157 |
+
risk = await self._manage_risk(compliance, context)
|
158 |
+
|
159 |
+
# Scale strategy
|
160 |
+
scale = await self._plan_fintech_scaling(risk, context)
|
161 |
+
|
162 |
+
return {
|
163 |
+
"success": scale["annual_revenue"] >= 1_000_000,
|
164 |
+
"market": market,
|
165 |
+
"product": product,
|
166 |
+
"compliance": compliance,
|
167 |
+
"risk": risk,
|
168 |
+
"scale": scale
|
169 |
+
}
|
170 |
+
except Exception as e:
|
171 |
+
logging.error(f"Error in FinTech strategy: {str(e)}")
|
172 |
+
return {"success": False, "error": str(e)}
|
173 |
+
|
174 |
+
class HealthTechStrategy(ReasoningStrategy):
|
175 |
+
"""
|
176 |
+
HealthTech venture strategy that:
|
177 |
+
1. Identifies healthcare opportunities
|
178 |
+
2. Develops health solutions
|
179 |
+
3. Ensures compliance
|
180 |
+
4. Manages patient data
|
181 |
+
5. Scales operations
|
182 |
+
"""
|
183 |
+
|
184 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
185 |
+
"""Generate HealthTech strategy."""
|
186 |
+
try:
|
187 |
+
# Market analysis
|
188 |
+
market = await self._analyze_healthtech_market(query, context)
|
189 |
+
|
190 |
+
# Solution development
|
191 |
+
solution = await self._develop_health_solution(market, context)
|
192 |
+
|
193 |
+
# Compliance strategy
|
194 |
+
compliance = await self._ensure_health_compliance(solution, context)
|
195 |
+
|
196 |
+
# Data strategy
|
197 |
+
data = await self._manage_health_data(compliance, context)
|
198 |
+
|
199 |
+
# Scale strategy
|
200 |
+
scale = await self._plan_healthtech_scaling(data, context)
|
201 |
+
|
202 |
+
return {
|
203 |
+
"success": scale["annual_revenue"] >= 1_000_000,
|
204 |
+
"market": market,
|
205 |
+
"solution": solution,
|
206 |
+
"compliance": compliance,
|
207 |
+
"data": data,
|
208 |
+
"scale": scale
|
209 |
+
}
|
210 |
+
except Exception as e:
|
211 |
+
logging.error(f"Error in HealthTech strategy: {str(e)}")
|
212 |
+
return {"success": False, "error": str(e)}
|
213 |
+
|
214 |
+
class EdTechStrategy(ReasoningStrategy):
|
215 |
+
"""
|
216 |
+
EdTech venture strategy that:
|
217 |
+
1. Identifies education opportunities
|
218 |
+
2. Develops learning solutions
|
219 |
+
3. Creates content strategy
|
220 |
+
4. Manages user engagement
|
221 |
+
5. Scales platform
|
222 |
+
"""
|
223 |
+
|
224 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
225 |
+
"""Generate EdTech strategy."""
|
226 |
+
try:
|
227 |
+
# Market analysis
|
228 |
+
market = await self._analyze_edtech_market(query, context)
|
229 |
+
|
230 |
+
# Solution development
|
231 |
+
solution = await self._develop_learning_solution(market, context)
|
232 |
+
|
233 |
+
# Content strategy
|
234 |
+
content = await self._create_content_strategy(solution, context)
|
235 |
+
|
236 |
+
# Engagement strategy
|
237 |
+
engagement = await self._manage_engagement(content, context)
|
238 |
+
|
239 |
+
# Scale strategy
|
240 |
+
scale = await self._plan_edtech_scaling(engagement, context)
|
241 |
+
|
242 |
+
return {
|
243 |
+
"success": scale["annual_revenue"] >= 1_000_000,
|
244 |
+
"market": market,
|
245 |
+
"solution": solution,
|
246 |
+
"content": content,
|
247 |
+
"engagement": engagement,
|
248 |
+
"scale": scale
|
249 |
+
}
|
250 |
+
except Exception as e:
|
251 |
+
logging.error(f"Error in EdTech strategy: {str(e)}")
|
252 |
+
return {"success": False, "error": str(e)}
|
253 |
+
|
254 |
+
class BlockchainStrategy(ReasoningStrategy):
|
255 |
+
"""
|
256 |
+
Blockchain venture strategy that:
|
257 |
+
1. Identifies blockchain opportunities
|
258 |
+
2. Develops blockchain solutions
|
259 |
+
3. Ensures security
|
260 |
+
4. Manages tokenomics
|
261 |
+
5. Scales network
|
262 |
+
"""
|
263 |
+
|
264 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
265 |
+
"""Generate blockchain strategy."""
|
266 |
+
try:
|
267 |
+
# Market analysis
|
268 |
+
market = await self._analyze_blockchain_market(query, context)
|
269 |
+
|
270 |
+
# Solution development
|
271 |
+
solution = await self._develop_blockchain_solution(market, context)
|
272 |
+
|
273 |
+
# Security strategy
|
274 |
+
security = await self._ensure_blockchain_security(solution, context)
|
275 |
+
|
276 |
+
# Tokenomics
|
277 |
+
tokenomics = await self._design_tokenomics(security, context)
|
278 |
+
|
279 |
+
# Scale strategy
|
280 |
+
scale = await self._plan_blockchain_scaling(tokenomics, context)
|
281 |
+
|
282 |
+
return {
|
283 |
+
"success": scale["annual_revenue"] >= 1_000_000,
|
284 |
+
"market": market,
|
285 |
+
"solution": solution,
|
286 |
+
"security": security,
|
287 |
+
"tokenomics": tokenomics,
|
288 |
+
"scale": scale
|
289 |
+
}
|
290 |
+
except Exception as e:
|
291 |
+
logging.error(f"Error in blockchain strategy: {str(e)}")
|
292 |
+
return {"success": False, "error": str(e)}
|
293 |
+
|
294 |
+
class AIMarketplaceStrategy(ReasoningStrategy):
|
295 |
+
"""
|
296 |
+
AI marketplace venture strategy that:
|
297 |
+
1. Creates AI model marketplace
|
298 |
+
2. Manages model deployment
|
299 |
+
3. Handles transactions
|
300 |
+
4. Ensures quality
|
301 |
+
5. Scales platform
|
302 |
+
"""
|
303 |
+
|
304 |
+
async def reason(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
305 |
+
"""Generate AI marketplace strategy."""
|
306 |
+
try:
|
307 |
+
# Market analysis
|
308 |
+
market = await self._analyze_ai_marketplace(query, context)
|
309 |
+
|
310 |
+
# Platform development
|
311 |
+
platform = await self._develop_marketplace_platform(market, context)
|
312 |
+
|
313 |
+
# Quality strategy
|
314 |
+
quality = await self._ensure_model_quality(platform, context)
|
315 |
+
|
316 |
+
# Transaction system
|
317 |
+
transactions = await self._design_transaction_system(quality, context)
|
318 |
+
|
319 |
+
# Scale strategy
|
320 |
+
scale = await self._plan_marketplace_scaling(transactions, context)
|
321 |
+
|
322 |
+
return {
|
323 |
+
"success": scale["annual_revenue"] >= 1_000_000,
|
324 |
+
"market": market,
|
325 |
+
"platform": platform,
|
326 |
+
"quality": quality,
|
327 |
+
"transactions": transactions,
|
328 |
+
"scale": scale
|
329 |
+
}
|
330 |
+
except Exception as e:
|
331 |
+
logging.error(f"Error in AI marketplace strategy: {str(e)}")
|
332 |
+
return {"success": False, "error": str(e)}
|
requirements.txt
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fastapi>=0.68.0
|
2 |
+
uvicorn>=0.15.0
|
3 |
+
pydantic>=2.0.0
|
4 |
+
gradio>=4.16.0
|
5 |
+
llama-cpp-python>=0.2.23
|
6 |
+
huggingface-hub>=0.19.4
|
7 |
+
numpy>=1.24.0
|
8 |
+
networkx>=3.2.1
|
9 |
+
scikit-learn>=1.3.2
|
10 |
+
scipy==1.11.4
|
11 |
+
pandas>=2.1.0
|
12 |
+
plotly>=5.18.0
|
13 |
+
typing-extensions>=4.0.0
|
14 |
+
aiohttp>=3.8.0
|
15 |
+
asyncio>=3.4.3
|
16 |
+
joblib==1.3.2
|
17 |
+
tqdm>=4.66.0
|
18 |
+
python-dotenv>=0.19.0
|
19 |
+
httpx>=0.24.0
|
requirements.txt.backup
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fastapi>=0.68.0
|
2 |
+
uvicorn>=0.15.0
|
3 |
+
pydantic>=2.0.0
|
4 |
+
gradio>=3.50.0
|
5 |
+
transformers>=4.36.2
|
6 |
+
torch>=2.1.2
|
7 |
+
huggingface-hub==0.19.4
|
8 |
+
ctransformers==0.2.27
|
9 |
+
numpy>=1.24.0
|
10 |
+
networkx>=3.2.1
|
11 |
+
scikit-learn>=1.3.2
|
12 |
+
scipy==1.11.4
|
13 |
+
pandas>=2.1.0
|
14 |
+
plotly>=5.18.0
|
15 |
+
typing-extensions>=4.0.0
|
16 |
+
aiohttp>=3.8.0
|
17 |
+
asyncio>=3.4.3
|
18 |
+
joblib==1.3.2
|
19 |
+
tqdm>=4.66.1
|
20 |
+
python-dotenv>=0.19.0
|
21 |
+
httpx>=0.24.0
|
22 |
+
python-multipart>=0.0.5
|
23 |
+
websockets>=10.0
|
24 |
+
jinja2>=3.0.0
|
25 |
+
markdown>=3.3.0
|
26 |
+
pygments>=2.10.0
|
27 |
+
starlette>=0.14.0
|
28 |
+
requests>=2.26.0
|
simple_reasoning.py
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Simple Reasoning Agent using local models"""
|
2 |
+
|
3 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
4 |
+
import torch
|
5 |
+
|
6 |
+
class ReasoningAgent:
|
7 |
+
"""A simple reasoning agent using local models."""
|
8 |
+
|
9 |
+
def __init__(self, model_name="TinyLlama/TinyLlama-1.1B-Chat-v1.0"):
|
10 |
+
"""Initialize the agent with a local model."""
|
11 |
+
# Load model and tokenizer
|
12 |
+
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
|
13 |
+
self.model = AutoModelForCausalLM.from_pretrained(
|
14 |
+
model_name,
|
15 |
+
torch_dtype=torch.float16,
|
16 |
+
device_map="auto"
|
17 |
+
)
|
18 |
+
|
19 |
+
def get_response(self, query: str) -> str:
|
20 |
+
"""Generate a response using the local model."""
|
21 |
+
try:
|
22 |
+
# Format the prompt
|
23 |
+
prompt = f"""<|system|>
|
24 |
+
You are a helpful AI assistant.
|
25 |
+
</s>
|
simple_reasoning/__init__.py
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Simple reasoning system using local LLM."""
|
2 |
+
|
3 |
+
from .agent import ReasoningAgent
|
4 |
+
|
5 |
+
__all__ = ['ReasoningAgent']
|
simple_reasoning/agent.py
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Local reasoning agent using TinyLlama."""
|
2 |
+
|
3 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
4 |
+
import torch
|
5 |
+
|
6 |
+
class ReasoningAgent:
|
7 |
+
"""Local reasoning agent using TinyLlama with chain of thought prompting."""
|
8 |
+
|
9 |
+
def __init__(self, model_name="TinyLlama/TinyLlama-1.1B-Chat-v1.0"):
|
10 |
+
"""Initialize the agent with local model."""
|
11 |
+
# Load model and tokenizer
|
12 |
+
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
|
13 |
+
self.model = AutoModelForCausalLM.from_pretrained(
|
14 |
+
model_name,
|
15 |
+
torch_dtype=torch.float16,
|
16 |
+
device_map="auto"
|
17 |
+
)
|
18 |
+
|
19 |
+
def get_response(self, message: str) -> str:
|
20 |
+
"""Generate response using local model with chain of thought prompting."""
|
21 |
+
try:
|
22 |
+
# Format prompt with chain of thought structure
|
23 |
+
prompt = f"""<|system|>
|
24 |
+
You are a helpful AI assistant that uses chain of thought reasoning to answer questions.
|
25 |
+
For each response, break down your thinking into steps before giving the final answer.
|
26 |
+
</s>
|
team_management.py
ADDED
@@ -0,0 +1,442 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Advanced Team Management System
|
3 |
+
-----------------------------
|
4 |
+
Manages specialized teams of agents that work together towards common goals:
|
5 |
+
1. Team A: Coders (App/Software Developers)
|
6 |
+
2. Team B: Business (Entrepreneurs)
|
7 |
+
3. Team C: Research (Deep Online Research)
|
8 |
+
4. Team D: Crypto & Sports Trading
|
9 |
+
|
10 |
+
Features:
|
11 |
+
- Cross-team collaboration
|
12 |
+
- Goal alignment
|
13 |
+
- Resource sharing
|
14 |
+
- Synchronized execution
|
15 |
+
"""
|
16 |
+
|
17 |
+
from typing import Dict, List, Optional, Set, Union, TypeVar
|
18 |
+
from dataclasses import dataclass, field
|
19 |
+
from enum import Enum
|
20 |
+
import asyncio
|
21 |
+
from datetime import datetime
|
22 |
+
import uuid
|
23 |
+
from collections import defaultdict
|
24 |
+
|
25 |
+
from orchestrator import AgentOrchestrator, TaskPriority
|
26 |
+
from agentic_system import AgentRole, AgentCapability, AgentPersonality, Agent
|
27 |
+
|
28 |
+
class TeamType(Enum):
|
29 |
+
"""Specialized team types."""
|
30 |
+
CODERS = "coders"
|
31 |
+
BUSINESS = "business"
|
32 |
+
RESEARCH = "research"
|
33 |
+
TRADERS = "traders"
|
34 |
+
|
35 |
+
class TeamObjective(Enum):
|
36 |
+
"""Types of team objectives."""
|
37 |
+
SOFTWARE_DEVELOPMENT = "software_development"
|
38 |
+
BUSINESS_OPPORTUNITY = "business_opportunity"
|
39 |
+
MARKET_RESEARCH = "market_research"
|
40 |
+
TRADING_STRATEGY = "trading_strategy"
|
41 |
+
CROSS_TEAM_PROJECT = "cross_team_project"
|
42 |
+
|
43 |
+
@dataclass
|
44 |
+
class TeamProfile:
|
45 |
+
"""Team profile and capabilities."""
|
46 |
+
id: str
|
47 |
+
type: TeamType
|
48 |
+
name: str
|
49 |
+
primary_objective: TeamObjective
|
50 |
+
secondary_objectives: List[TeamObjective]
|
51 |
+
agent_count: int
|
52 |
+
expertise_areas: List[str]
|
53 |
+
collaboration_score: float = 0.0
|
54 |
+
success_rate: float = 0.0
|
55 |
+
active_projects: int = 0
|
56 |
+
|
57 |
+
@dataclass
|
58 |
+
class CollaborationLink:
|
59 |
+
"""Defines collaboration between teams."""
|
60 |
+
team_a_id: str
|
61 |
+
team_b_id: str
|
62 |
+
strength: float
|
63 |
+
active_projects: int
|
64 |
+
last_interaction: datetime
|
65 |
+
success_rate: float
|
66 |
+
|
67 |
+
class TeamManager:
|
68 |
+
"""Manages specialized teams and their collaboration."""
|
69 |
+
|
70 |
+
def __init__(self, orchestrator: AgentOrchestrator):
|
71 |
+
self.orchestrator = orchestrator
|
72 |
+
self.teams: Dict[str, TeamProfile] = {}
|
73 |
+
self.agents: Dict[str, Dict[str, Agent]] = {} # team_id -> {agent_id -> Agent}
|
74 |
+
self.collaboration_network: Dict[str, CollaborationLink] = {}
|
75 |
+
self.shared_objectives: Dict[str, Set[str]] = defaultdict(set) # objective_id -> set of team_ids
|
76 |
+
self.lock = asyncio.Lock()
|
77 |
+
|
78 |
+
# Initialize specialized teams
|
79 |
+
self._init_teams()
|
80 |
+
|
81 |
+
def _init_teams(self):
|
82 |
+
"""Initialize specialized teams."""
|
83 |
+
team_configs = {
|
84 |
+
TeamType.CODERS: {
|
85 |
+
"name": "Development Team",
|
86 |
+
"primary": TeamObjective.SOFTWARE_DEVELOPMENT,
|
87 |
+
"secondary": [
|
88 |
+
TeamObjective.BUSINESS_OPPORTUNITY,
|
89 |
+
TeamObjective.MARKET_RESEARCH
|
90 |
+
],
|
91 |
+
"expertise": [
|
92 |
+
"full_stack_development",
|
93 |
+
"cloud_architecture",
|
94 |
+
"ai_ml",
|
95 |
+
"blockchain",
|
96 |
+
"mobile_development"
|
97 |
+
]
|
98 |
+
},
|
99 |
+
TeamType.BUSINESS: {
|
100 |
+
"name": "Business Strategy Team",
|
101 |
+
"primary": TeamObjective.BUSINESS_OPPORTUNITY,
|
102 |
+
"secondary": [
|
103 |
+
TeamObjective.MARKET_RESEARCH,
|
104 |
+
TeamObjective.TRADING_STRATEGY
|
105 |
+
],
|
106 |
+
"expertise": [
|
107 |
+
"market_analysis",
|
108 |
+
"business_strategy",
|
109 |
+
"digital_transformation",
|
110 |
+
"startup_innovation",
|
111 |
+
"product_management"
|
112 |
+
]
|
113 |
+
},
|
114 |
+
TeamType.RESEARCH: {
|
115 |
+
"name": "Research & Analysis Team",
|
116 |
+
"primary": TeamObjective.MARKET_RESEARCH,
|
117 |
+
"secondary": [
|
118 |
+
TeamObjective.BUSINESS_OPPORTUNITY,
|
119 |
+
TeamObjective.TRADING_STRATEGY
|
120 |
+
],
|
121 |
+
"expertise": [
|
122 |
+
"deep_research",
|
123 |
+
"data_analysis",
|
124 |
+
"trend_forecasting",
|
125 |
+
"competitive_analysis",
|
126 |
+
"technology_assessment"
|
127 |
+
]
|
128 |
+
},
|
129 |
+
TeamType.TRADERS: {
|
130 |
+
"name": "Trading & Investment Team",
|
131 |
+
"primary": TeamObjective.TRADING_STRATEGY,
|
132 |
+
"secondary": [
|
133 |
+
TeamObjective.MARKET_RESEARCH,
|
134 |
+
TeamObjective.BUSINESS_OPPORTUNITY
|
135 |
+
],
|
136 |
+
"expertise": [
|
137 |
+
"crypto_trading",
|
138 |
+
"sports_betting",
|
139 |
+
"risk_management",
|
140 |
+
"market_timing",
|
141 |
+
"portfolio_optimization"
|
142 |
+
]
|
143 |
+
}
|
144 |
+
}
|
145 |
+
|
146 |
+
for team_type, config in team_configs.items():
|
147 |
+
team_id = str(uuid.uuid4())
|
148 |
+
self.teams[team_id] = TeamProfile(
|
149 |
+
id=team_id,
|
150 |
+
type=team_type,
|
151 |
+
name=config["name"],
|
152 |
+
primary_objective=config["primary"],
|
153 |
+
secondary_objectives=config["secondary"],
|
154 |
+
agent_count=5, # Default size
|
155 |
+
expertise_areas=config["expertise"]
|
156 |
+
)
|
157 |
+
self.agents[team_id] = {}
|
158 |
+
|
159 |
+
async def initialize_team_agents(self):
|
160 |
+
"""Initialize agents for each team with appropriate roles and capabilities."""
|
161 |
+
for team_id, team in self.teams.items():
|
162 |
+
await self._create_team_agents(team_id)
|
163 |
+
await self._establish_collaboration_links(team_id)
|
164 |
+
|
165 |
+
async def _create_team_agents(self, team_id: str):
|
166 |
+
"""Create specialized agents for a team."""
|
167 |
+
team = self.teams[team_id]
|
168 |
+
|
169 |
+
# Define agent configurations based on team type
|
170 |
+
agent_configs = self._get_agent_configs(team.type)
|
171 |
+
|
172 |
+
for config in agent_configs:
|
173 |
+
agent_id = await self.orchestrator.create_agent(
|
174 |
+
role=config["role"],
|
175 |
+
capabilities=config["capabilities"]
|
176 |
+
)
|
177 |
+
|
178 |
+
agent = Agent(
|
179 |
+
profile=config["profile"],
|
180 |
+
reasoning_engine=self.orchestrator.reasoning_engine,
|
181 |
+
meta_learning=self.orchestrator.meta_learning
|
182 |
+
)
|
183 |
+
|
184 |
+
self.agents[team_id][agent_id] = agent
|
185 |
+
|
186 |
+
def _get_agent_configs(self, team_type: TeamType) -> List[Dict]:
|
187 |
+
"""Get agent configurations based on team type."""
|
188 |
+
base_configs = [
|
189 |
+
{
|
190 |
+
"role": AgentRole.COORDINATOR,
|
191 |
+
"capabilities": [
|
192 |
+
AgentCapability.COORDINATION,
|
193 |
+
AgentCapability.REASONING
|
194 |
+
],
|
195 |
+
"personality": AgentPersonality.PROACTIVE
|
196 |
+
},
|
197 |
+
{
|
198 |
+
"role": AgentRole.EXECUTOR,
|
199 |
+
"capabilities": [
|
200 |
+
AgentCapability.EXECUTION,
|
201 |
+
AgentCapability.LEARNING
|
202 |
+
],
|
203 |
+
"personality": AgentPersonality.ANALYTICAL
|
204 |
+
}
|
205 |
+
]
|
206 |
+
|
207 |
+
# Add team-specific configurations
|
208 |
+
if team_type == TeamType.CODERS:
|
209 |
+
base_configs.extend([
|
210 |
+
{
|
211 |
+
"role": AgentRole.EXECUTOR,
|
212 |
+
"capabilities": [
|
213 |
+
AgentCapability.EXECUTION,
|
214 |
+
AgentCapability.REASONING
|
215 |
+
],
|
216 |
+
"personality": AgentPersonality.CREATIVE,
|
217 |
+
"expertise": ["software_development", "system_design"]
|
218 |
+
}
|
219 |
+
])
|
220 |
+
elif team_type == TeamType.BUSINESS:
|
221 |
+
base_configs.extend([
|
222 |
+
{
|
223 |
+
"role": AgentRole.PLANNER,
|
224 |
+
"capabilities": [
|
225 |
+
AgentCapability.REASONING,
|
226 |
+
AgentCapability.LEARNING
|
227 |
+
],
|
228 |
+
"personality": AgentPersonality.PROACTIVE,
|
229 |
+
"expertise": ["business_strategy", "market_analysis"]
|
230 |
+
}
|
231 |
+
])
|
232 |
+
elif team_type == TeamType.RESEARCH:
|
233 |
+
base_configs.extend([
|
234 |
+
{
|
235 |
+
"role": AgentRole.MONITOR,
|
236 |
+
"capabilities": [
|
237 |
+
AgentCapability.MONITORING,
|
238 |
+
AgentCapability.LEARNING
|
239 |
+
],
|
240 |
+
"personality": AgentPersonality.ANALYTICAL,
|
241 |
+
"expertise": ["research", "data_analysis"]
|
242 |
+
}
|
243 |
+
])
|
244 |
+
elif team_type == TeamType.TRADERS:
|
245 |
+
base_configs.extend([
|
246 |
+
{
|
247 |
+
"role": AgentRole.EXECUTOR,
|
248 |
+
"capabilities": [
|
249 |
+
AgentCapability.EXECUTION,
|
250 |
+
AgentCapability.REASONING
|
251 |
+
],
|
252 |
+
"personality": AgentPersonality.CAUTIOUS,
|
253 |
+
"expertise": ["trading", "risk_management"]
|
254 |
+
}
|
255 |
+
])
|
256 |
+
|
257 |
+
return base_configs
|
258 |
+
|
259 |
+
async def _establish_collaboration_links(self, team_id: str):
|
260 |
+
"""Establish collaboration links with other teams."""
|
261 |
+
team = self.teams[team_id]
|
262 |
+
|
263 |
+
for other_id, other_team in self.teams.items():
|
264 |
+
if other_id != team_id:
|
265 |
+
link_id = f"{min(team_id, other_id)}_{max(team_id, other_id)}"
|
266 |
+
if link_id not in self.collaboration_network:
|
267 |
+
self.collaboration_network[link_id] = CollaborationLink(
|
268 |
+
team_a_id=team_id,
|
269 |
+
team_b_id=other_id,
|
270 |
+
strength=0.5, # Initial collaboration strength
|
271 |
+
active_projects=0,
|
272 |
+
last_interaction=datetime.now(),
|
273 |
+
success_rate=0.0
|
274 |
+
)
|
275 |
+
|
276 |
+
async def create_cross_team_objective(
|
277 |
+
self,
|
278 |
+
objective: str,
|
279 |
+
required_teams: List[TeamType],
|
280 |
+
priority: TaskPriority = TaskPriority.MEDIUM
|
281 |
+
) -> str:
|
282 |
+
"""Create an objective that requires multiple teams."""
|
283 |
+
objective_id = str(uuid.uuid4())
|
284 |
+
|
285 |
+
# Find relevant teams
|
286 |
+
selected_teams = []
|
287 |
+
for team_id, team in self.teams.items():
|
288 |
+
if team.type in required_teams:
|
289 |
+
selected_teams.append(team_id)
|
290 |
+
|
291 |
+
if len(selected_teams) < len(required_teams):
|
292 |
+
raise ValueError("Not all required teams are available")
|
293 |
+
|
294 |
+
# Create shared objective
|
295 |
+
self.shared_objectives[objective_id].update(selected_teams)
|
296 |
+
|
297 |
+
# Create tasks for each team
|
298 |
+
tasks = []
|
299 |
+
for team_id in selected_teams:
|
300 |
+
task_id = await self.orchestrator.submit_task(
|
301 |
+
description=f"Team {self.teams[team_id].name} contribution to: {objective}",
|
302 |
+
priority=priority
|
303 |
+
)
|
304 |
+
tasks.append(task_id)
|
305 |
+
|
306 |
+
return objective_id
|
307 |
+
|
308 |
+
async def monitor_objective_progress(self, objective_id: str) -> Dict:
|
309 |
+
"""Monitor progress of a cross-team objective."""
|
310 |
+
if objective_id not in self.shared_objectives:
|
311 |
+
raise ValueError("Unknown objective")
|
312 |
+
|
313 |
+
team_progress = {}
|
314 |
+
for team_id in self.shared_objectives[objective_id]:
|
315 |
+
team = self.teams[team_id]
|
316 |
+
team_agents = self.agents[team_id]
|
317 |
+
|
318 |
+
# Calculate team progress
|
319 |
+
active_agents = sum(1 for agent in team_agents.values() if agent.state == "busy")
|
320 |
+
completion_rate = sum(agent.get_task_completion_rate() for agent in team_agents.values()) / len(team_agents)
|
321 |
+
|
322 |
+
team_progress[team.name] = {
|
323 |
+
"active_agents": active_agents,
|
324 |
+
"completion_rate": completion_rate,
|
325 |
+
"collaboration_score": team.collaboration_score
|
326 |
+
}
|
327 |
+
|
328 |
+
return team_progress
|
329 |
+
|
330 |
+
async def optimize_team_collaboration(self):
|
331 |
+
"""Optimize collaboration between teams."""
|
332 |
+
for link in self.collaboration_network.values():
|
333 |
+
team_a = self.teams[link.team_a_id]
|
334 |
+
team_b = self.teams[link.team_b_id]
|
335 |
+
|
336 |
+
# Update collaboration strength based on:
|
337 |
+
# 1. Number of successful joint projects
|
338 |
+
# 2. Frequency of interaction
|
339 |
+
# 3. Complementary expertise
|
340 |
+
|
341 |
+
success_factor = link.success_rate
|
342 |
+
interaction_factor = min((datetime.now() - link.last_interaction).days / 30.0, 1.0)
|
343 |
+
expertise_overlap = len(
|
344 |
+
set(team_a.expertise_areas) & set(team_b.expertise_areas)
|
345 |
+
) / len(set(team_a.expertise_areas) | set(team_b.expertise_areas))
|
346 |
+
|
347 |
+
new_strength = (
|
348 |
+
0.4 * success_factor +
|
349 |
+
0.3 * (1 - interaction_factor) +
|
350 |
+
0.3 * (1 - expertise_overlap)
|
351 |
+
)
|
352 |
+
|
353 |
+
link.strength = 0.7 * link.strength + 0.3 * new_strength
|
354 |
+
|
355 |
+
async def get_team_recommendations(self, objective: str) -> List[TeamType]:
|
356 |
+
"""Get recommended teams for an objective based on expertise and collaboration history."""
|
357 |
+
# Analyze objective to determine required expertise
|
358 |
+
required_expertise = await self._analyze_objective(objective)
|
359 |
+
|
360 |
+
# Score each team
|
361 |
+
team_scores = {}
|
362 |
+
for team_id, team in self.teams.items():
|
363 |
+
# Calculate expertise match
|
364 |
+
expertise_match = len(
|
365 |
+
set(required_expertise) & set(team.expertise_areas)
|
366 |
+
) / len(required_expertise)
|
367 |
+
|
368 |
+
# Calculate collaboration potential
|
369 |
+
collab_potential = self._calculate_collaboration_potential(team_id)
|
370 |
+
|
371 |
+
# Calculate success history
|
372 |
+
success_history = team.success_rate
|
373 |
+
|
374 |
+
# Weighted score
|
375 |
+
score = (
|
376 |
+
0.4 * expertise_match +
|
377 |
+
0.3 * collab_potential +
|
378 |
+
0.3 * success_history
|
379 |
+
)
|
380 |
+
|
381 |
+
team_scores[team.type] = score
|
382 |
+
|
383 |
+
# Return sorted recommendations
|
384 |
+
return sorted(
|
385 |
+
team_scores.keys(),
|
386 |
+
key=lambda x: team_scores[x],
|
387 |
+
reverse=True
|
388 |
+
)
|
389 |
+
|
390 |
+
async def _analyze_objective(self, objective: str) -> List[str]:
|
391 |
+
"""Analyze an objective to determine required expertise."""
|
392 |
+
# Use reasoning engine to analyze objective
|
393 |
+
analysis = await self.orchestrator.reasoning_engine.reason(
|
394 |
+
query=f"Analyze required expertise for: {objective}",
|
395 |
+
context={
|
396 |
+
"available_expertise": [
|
397 |
+
expertise
|
398 |
+
for team in self.teams.values()
|
399 |
+
for expertise in team.expertise_areas
|
400 |
+
]
|
401 |
+
}
|
402 |
+
)
|
403 |
+
|
404 |
+
return analysis.get("required_expertise", [])
|
405 |
+
|
406 |
+
def _calculate_collaboration_potential(self, team_id: str) -> float:
|
407 |
+
"""Calculate a team's collaboration potential based on history."""
|
408 |
+
team_links = [
|
409 |
+
link for link in self.collaboration_network.values()
|
410 |
+
if team_id in (link.team_a_id, link.team_b_id)
|
411 |
+
]
|
412 |
+
|
413 |
+
if not team_links:
|
414 |
+
return 0.5
|
415 |
+
|
416 |
+
return sum(link.strength for link in team_links) / len(team_links)
|
417 |
+
|
418 |
+
async def update_team_metrics(self):
|
419 |
+
"""Update performance metrics for all teams."""
|
420 |
+
for team_id, team in self.teams.items():
|
421 |
+
team_agents = self.agents[team_id]
|
422 |
+
|
423 |
+
# Calculate success rate
|
424 |
+
completed_tasks = sum(
|
425 |
+
agent.get_completed_task_count()
|
426 |
+
for agent in team_agents.values()
|
427 |
+
)
|
428 |
+
total_tasks = sum(
|
429 |
+
agent.get_total_task_count()
|
430 |
+
for agent in team_agents.values()
|
431 |
+
)
|
432 |
+
team.success_rate = completed_tasks / max(1, total_tasks)
|
433 |
+
|
434 |
+
# Calculate collaboration score
|
435 |
+
team_links = [
|
436 |
+
link for link in self.collaboration_network.values()
|
437 |
+
if team_id in (link.team_a_id, link.team_b_id)
|
438 |
+
]
|
439 |
+
team.collaboration_score = (
|
440 |
+
sum(link.strength for link in team_links) /
|
441 |
+
len(team_links) if team_links else 0.5
|
442 |
+
)
|
ui/venture_ui.py
ADDED
@@ -0,0 +1,399 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""UI components for venture strategies and analysis."""
|
2 |
+
|
3 |
+
import gradio as gr
|
4 |
+
import json
|
5 |
+
from typing import Dict, Any, List
|
6 |
+
import plotly.graph_objects as go
|
7 |
+
import plotly.express as px
|
8 |
+
import pandas as pd
|
9 |
+
from datetime import datetime
|
10 |
+
|
11 |
+
class VentureUI:
|
12 |
+
"""UI for venture strategies and analysis."""
|
13 |
+
|
14 |
+
def __init__(self, api_client):
|
15 |
+
self.api_client = api_client
|
16 |
+
|
17 |
+
def create_interface(self):
|
18 |
+
"""Create Gradio interface."""
|
19 |
+
with gr.Blocks(title="Venture Strategy Optimizer") as interface:
|
20 |
+
gr.Markdown("# Venture Strategy Optimizer")
|
21 |
+
|
22 |
+
with gr.Tabs():
|
23 |
+
# Venture Analysis Tab
|
24 |
+
with gr.Tab("Venture Analysis"):
|
25 |
+
with gr.Row():
|
26 |
+
with gr.Column():
|
27 |
+
venture_type = gr.Dropdown(
|
28 |
+
choices=self._get_venture_types(),
|
29 |
+
label="Venture Type"
|
30 |
+
)
|
31 |
+
query = gr.Textbox(
|
32 |
+
lines=3,
|
33 |
+
label="Analysis Query"
|
34 |
+
)
|
35 |
+
analyze_btn = gr.Button("Analyze Venture")
|
36 |
+
|
37 |
+
with gr.Column():
|
38 |
+
analysis_output = gr.JSON(label="Analysis Results")
|
39 |
+
metrics_plot = gr.Plot(label="Key Metrics")
|
40 |
+
|
41 |
+
analyze_btn.click(
|
42 |
+
fn=self._analyze_venture,
|
43 |
+
inputs=[venture_type, query],
|
44 |
+
outputs=[analysis_output, metrics_plot]
|
45 |
+
)
|
46 |
+
|
47 |
+
# Market Analysis Tab
|
48 |
+
with gr.Tab("Market Analysis"):
|
49 |
+
with gr.Row():
|
50 |
+
with gr.Column():
|
51 |
+
segment = gr.Textbox(
|
52 |
+
label="Market Segment"
|
53 |
+
)
|
54 |
+
market_btn = gr.Button("Analyze Market")
|
55 |
+
|
56 |
+
with gr.Column():
|
57 |
+
market_output = gr.JSON(label="Market Analysis")
|
58 |
+
market_plot = gr.Plot(label="Market Trends")
|
59 |
+
|
60 |
+
market_btn.click(
|
61 |
+
fn=self._analyze_market,
|
62 |
+
inputs=[segment],
|
63 |
+
outputs=[market_output, market_plot]
|
64 |
+
)
|
65 |
+
|
66 |
+
# Portfolio Optimization Tab
|
67 |
+
with gr.Tab("Portfolio Optimization"):
|
68 |
+
with gr.Row():
|
69 |
+
with gr.Column():
|
70 |
+
ventures = gr.CheckboxGroup(
|
71 |
+
choices=self._get_venture_types(),
|
72 |
+
label="Select Ventures"
|
73 |
+
)
|
74 |
+
optimize_btn = gr.Button("Optimize Portfolio")
|
75 |
+
|
76 |
+
with gr.Column():
|
77 |
+
portfolio_output = gr.JSON(label="Portfolio Strategy")
|
78 |
+
portfolio_plot = gr.Plot(label="Portfolio Allocation")
|
79 |
+
|
80 |
+
optimize_btn.click(
|
81 |
+
fn=self._optimize_portfolio,
|
82 |
+
inputs=[ventures],
|
83 |
+
outputs=[portfolio_output, portfolio_plot]
|
84 |
+
)
|
85 |
+
|
86 |
+
# Monetization Strategy Tab
|
87 |
+
with gr.Tab("Monetization Strategy"):
|
88 |
+
with gr.Row():
|
89 |
+
with gr.Column():
|
90 |
+
monetization_type = gr.Dropdown(
|
91 |
+
choices=self._get_venture_types(),
|
92 |
+
label="Venture Type"
|
93 |
+
)
|
94 |
+
monetize_btn = gr.Button("Optimize Monetization")
|
95 |
+
|
96 |
+
with gr.Column():
|
97 |
+
monetization_output = gr.JSON(label="Monetization Strategy")
|
98 |
+
revenue_plot = gr.Plot(label="Revenue Projections")
|
99 |
+
|
100 |
+
monetize_btn.click(
|
101 |
+
fn=self._optimize_monetization,
|
102 |
+
inputs=[monetization_type],
|
103 |
+
outputs=[monetization_output, revenue_plot]
|
104 |
+
)
|
105 |
+
|
106 |
+
# Insights Dashboard Tab
|
107 |
+
with gr.Tab("Insights Dashboard"):
|
108 |
+
with gr.Row():
|
109 |
+
refresh_btn = gr.Button("Refresh Insights")
|
110 |
+
|
111 |
+
with gr.Row():
|
112 |
+
with gr.Column():
|
113 |
+
market_insights = gr.JSON(label="Market Insights")
|
114 |
+
market_trends = gr.Plot(label="Market Trends")
|
115 |
+
|
116 |
+
with gr.Column():
|
117 |
+
portfolio_insights = gr.JSON(label="Portfolio Insights")
|
118 |
+
portfolio_trends = gr.Plot(label="Portfolio Performance")
|
119 |
+
|
120 |
+
refresh_btn.click(
|
121 |
+
fn=self._refresh_insights,
|
122 |
+
outputs=[
|
123 |
+
market_insights, market_trends,
|
124 |
+
portfolio_insights, portfolio_trends
|
125 |
+
]
|
126 |
+
)
|
127 |
+
|
128 |
+
return interface
|
129 |
+
|
130 |
+
def _get_venture_types(self) -> List[str]:
|
131 |
+
"""Get available venture types."""
|
132 |
+
try:
|
133 |
+
response = self.api_client.list_strategies()
|
134 |
+
return response.get("strategies", [])
|
135 |
+
except Exception as e:
|
136 |
+
print(f"Error getting venture types: {e}")
|
137 |
+
return []
|
138 |
+
|
139 |
+
def _analyze_venture(self,
|
140 |
+
venture_type: str,
|
141 |
+
query: str) -> tuple[Dict[str, Any], go.Figure]:
|
142 |
+
"""Analyze venture opportunity."""
|
143 |
+
try:
|
144 |
+
# Get analysis
|
145 |
+
response = self.api_client.analyze_venture({
|
146 |
+
"venture_type": venture_type,
|
147 |
+
"query": query
|
148 |
+
})
|
149 |
+
result = response.get("result", {})
|
150 |
+
|
151 |
+
# Create visualization
|
152 |
+
fig = self._create_venture_plot(result)
|
153 |
+
|
154 |
+
return result, fig
|
155 |
+
except Exception as e:
|
156 |
+
print(f"Error in venture analysis: {e}")
|
157 |
+
return {"error": str(e)}, go.Figure()
|
158 |
+
|
159 |
+
def _analyze_market(self,
|
160 |
+
segment: str) -> tuple[Dict[str, Any], go.Figure]:
|
161 |
+
"""Analyze market opportunity."""
|
162 |
+
try:
|
163 |
+
# Get analysis
|
164 |
+
response = self.api_client.analyze_market({
|
165 |
+
"segment": segment
|
166 |
+
})
|
167 |
+
result = response.get("result", {})
|
168 |
+
|
169 |
+
# Create visualization
|
170 |
+
fig = self._create_market_plot(result)
|
171 |
+
|
172 |
+
return result, fig
|
173 |
+
except Exception as e:
|
174 |
+
print(f"Error in market analysis: {e}")
|
175 |
+
return {"error": str(e)}, go.Figure()
|
176 |
+
|
177 |
+
def _optimize_portfolio(self,
|
178 |
+
ventures: List[str]) -> tuple[Dict[str, Any], go.Figure]:
|
179 |
+
"""Optimize venture portfolio."""
|
180 |
+
try:
|
181 |
+
# Get optimization
|
182 |
+
response = self.api_client.optimize_portfolio({
|
183 |
+
"ventures": ventures
|
184 |
+
})
|
185 |
+
result = response.get("result", {})
|
186 |
+
|
187 |
+
# Create visualization
|
188 |
+
fig = self._create_portfolio_plot(result)
|
189 |
+
|
190 |
+
return result, fig
|
191 |
+
except Exception as e:
|
192 |
+
print(f"Error in portfolio optimization: {e}")
|
193 |
+
return {"error": str(e)}, go.Figure()
|
194 |
+
|
195 |
+
def _optimize_monetization(self,
|
196 |
+
venture_type: str) -> tuple[Dict[str, Any], go.Figure]:
|
197 |
+
"""Optimize monetization strategy."""
|
198 |
+
try:
|
199 |
+
# Get optimization
|
200 |
+
response = self.api_client.optimize_monetization({
|
201 |
+
"venture_type": venture_type
|
202 |
+
})
|
203 |
+
result = response.get("result", {})
|
204 |
+
|
205 |
+
# Create visualization
|
206 |
+
fig = self._create_revenue_plot(result)
|
207 |
+
|
208 |
+
return result, fig
|
209 |
+
except Exception as e:
|
210 |
+
print(f"Error in monetization optimization: {e}")
|
211 |
+
return {"error": str(e)}, go.Figure()
|
212 |
+
|
213 |
+
def _refresh_insights(self) -> tuple[Dict[str, Any], go.Figure,
|
214 |
+
Dict[str, Any], go.Figure]:
|
215 |
+
"""Refresh insights dashboard."""
|
216 |
+
try:
|
217 |
+
# Get insights
|
218 |
+
market_response = self.api_client.get_market_insights()
|
219 |
+
portfolio_response = self.api_client.get_portfolio_insights()
|
220 |
+
|
221 |
+
market_insights = market_response.get("insights", {})
|
222 |
+
portfolio_insights = portfolio_response.get("insights", {})
|
223 |
+
|
224 |
+
# Create visualizations
|
225 |
+
market_fig = self._create_market_trends_plot(market_insights)
|
226 |
+
portfolio_fig = self._create_portfolio_trends_plot(portfolio_insights)
|
227 |
+
|
228 |
+
return market_insights, market_fig, portfolio_insights, portfolio_fig
|
229 |
+
except Exception as e:
|
230 |
+
print(f"Error refreshing insights: {e}")
|
231 |
+
return (
|
232 |
+
{"error": str(e)}, go.Figure(),
|
233 |
+
{"error": str(e)}, go.Figure()
|
234 |
+
)
|
235 |
+
|
236 |
+
def _create_venture_plot(self, data: Dict[str, Any]) -> go.Figure:
|
237 |
+
"""Create venture analysis visualization."""
|
238 |
+
try:
|
239 |
+
metrics = data.get("metrics", {})
|
240 |
+
|
241 |
+
fig = go.Figure()
|
242 |
+
fig.add_trace(go.Scatterpolar(
|
243 |
+
r=[
|
244 |
+
metrics.get("market_score", 0),
|
245 |
+
metrics.get("opportunity_score", 0),
|
246 |
+
metrics.get("risk_score", 0),
|
247 |
+
metrics.get("growth_potential", 0),
|
248 |
+
metrics.get("profitability", 0)
|
249 |
+
],
|
250 |
+
theta=[
|
251 |
+
"Market Score",
|
252 |
+
"Opportunity Score",
|
253 |
+
"Risk Score",
|
254 |
+
"Growth Potential",
|
255 |
+
"Profitability"
|
256 |
+
],
|
257 |
+
fill='toself'
|
258 |
+
))
|
259 |
+
|
260 |
+
fig.update_layout(
|
261 |
+
polar=dict(
|
262 |
+
radialaxis=dict(
|
263 |
+
visible=True,
|
264 |
+
range=[0, 1]
|
265 |
+
)
|
266 |
+
),
|
267 |
+
showlegend=False
|
268 |
+
)
|
269 |
+
|
270 |
+
return fig
|
271 |
+
except Exception as e:
|
272 |
+
print(f"Error creating venture plot: {e}")
|
273 |
+
return go.Figure()
|
274 |
+
|
275 |
+
def _create_market_plot(self, data: Dict[str, Any]) -> go.Figure:
|
276 |
+
"""Create market analysis visualization."""
|
277 |
+
try:
|
278 |
+
trends = data.get("trend_analysis", {})
|
279 |
+
|
280 |
+
df = pd.DataFrame([
|
281 |
+
{
|
282 |
+
"Trend": trend["name"],
|
283 |
+
"Impact": trend["impact"],
|
284 |
+
"Potential": trend["market_potential"],
|
285 |
+
"Risk": trend["risk_level"]
|
286 |
+
}
|
287 |
+
for trend in trends
|
288 |
+
])
|
289 |
+
|
290 |
+
fig = px.scatter(
|
291 |
+
df,
|
292 |
+
x="Impact",
|
293 |
+
y="Potential",
|
294 |
+
size="Risk",
|
295 |
+
hover_data=["Trend"],
|
296 |
+
title="Market Trends Analysis"
|
297 |
+
)
|
298 |
+
|
299 |
+
return fig
|
300 |
+
except Exception as e:
|
301 |
+
print(f"Error creating market plot: {e}")
|
302 |
+
return go.Figure()
|
303 |
+
|
304 |
+
def _create_portfolio_plot(self, data: Dict[str, Any]) -> go.Figure:
|
305 |
+
"""Create portfolio optimization visualization."""
|
306 |
+
try:
|
307 |
+
allocation = data.get("allocation", {})
|
308 |
+
|
309 |
+
fig = go.Figure(data=[
|
310 |
+
go.Bar(
|
311 |
+
name=venture,
|
312 |
+
x=["Resources", "Priority", "Risk"],
|
313 |
+
y=[
|
314 |
+
sum(resources.values()),
|
315 |
+
priority,
|
316 |
+
len(constraints)
|
317 |
+
]
|
318 |
+
)
|
319 |
+
for venture, (resources, priority, constraints) in allocation.items()
|
320 |
+
])
|
321 |
+
|
322 |
+
fig.update_layout(
|
323 |
+
barmode='group',
|
324 |
+
title="Portfolio Allocation"
|
325 |
+
)
|
326 |
+
|
327 |
+
return fig
|
328 |
+
except Exception as e:
|
329 |
+
print(f"Error creating portfolio plot: {e}")
|
330 |
+
return go.Figure()
|
331 |
+
|
332 |
+
def _create_revenue_plot(self, data: Dict[str, Any]) -> go.Figure:
|
333 |
+
"""Create revenue projection visualization."""
|
334 |
+
try:
|
335 |
+
projections = data.get("projections", {})
|
336 |
+
|
337 |
+
months = list(range(12))
|
338 |
+
revenue = [
|
339 |
+
projections.get("monthly_revenue", {}).get(str(m), 0)
|
340 |
+
for m in months
|
341 |
+
]
|
342 |
+
|
343 |
+
fig = go.Figure()
|
344 |
+
fig.add_trace(go.Scatter(
|
345 |
+
x=months,
|
346 |
+
y=revenue,
|
347 |
+
mode='lines+markers',
|
348 |
+
name='Revenue'
|
349 |
+
))
|
350 |
+
|
351 |
+
fig.update_layout(
|
352 |
+
title="Revenue Projections",
|
353 |
+
xaxis_title="Month",
|
354 |
+
yaxis_title="Revenue ($)"
|
355 |
+
)
|
356 |
+
|
357 |
+
return fig
|
358 |
+
except Exception as e:
|
359 |
+
print(f"Error creating revenue plot: {e}")
|
360 |
+
return go.Figure()
|
361 |
+
|
362 |
+
def _create_market_trends_plot(self, data: Dict[str, Any]) -> go.Figure:
|
363 |
+
"""Create market trends visualization."""
|
364 |
+
try:
|
365 |
+
trends = data.get("trend_insights", [])
|
366 |
+
|
367 |
+
df = pd.DataFrame(trends)
|
368 |
+
|
369 |
+
fig = px.scatter(
|
370 |
+
df,
|
371 |
+
x="impact",
|
372 |
+
y="potential",
|
373 |
+
size="risk",
|
374 |
+
hover_data=["name"],
|
375 |
+
title="Market Trends Overview"
|
376 |
+
)
|
377 |
+
|
378 |
+
return fig
|
379 |
+
except Exception as e:
|
380 |
+
print(f"Error creating market trends plot: {e}")
|
381 |
+
return go.Figure()
|
382 |
+
|
383 |
+
def _create_portfolio_trends_plot(self, data: Dict[str, Any]) -> go.Figure:
|
384 |
+
"""Create portfolio trends visualization."""
|
385 |
+
try:
|
386 |
+
metrics = data.get("portfolio_metrics", {})
|
387 |
+
|
388 |
+
fig = go.Figure()
|
389 |
+
fig.add_trace(go.Indicator(
|
390 |
+
mode="gauge+number",
|
391 |
+
value=metrics.get("total_revenue", 0),
|
392 |
+
title={'text': "Total Revenue ($M)"},
|
393 |
+
gauge={'axis': {'range': [None, 10]}}
|
394 |
+
))
|
395 |
+
|
396 |
+
return fig
|
397 |
+
except Exception as e:
|
398 |
+
print(f"Error creating portfolio trends plot: {e}")
|
399 |
+
return go.Figure()
|
upload_to_hub.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from huggingface_hub import HfApi
|
2 |
+
import os
|
3 |
+
|
4 |
+
# Initialize the Hugging Face API
|
5 |
+
api = HfApi()
|
6 |
+
|
7 |
+
print("Starting upload to Hugging Face Space...")
|
8 |
+
|
9 |
+
# Create a new Space if it doesn't exist
|
10 |
+
try:
|
11 |
+
api.create_repo(
|
12 |
+
repo_id="nananie143/advanced-reasoning",
|
13 |
+
repo_type="space",
|
14 |
+
space_sdk="gradio",
|
15 |
+
private=False
|
16 |
+
)
|
17 |
+
except Exception as e:
|
18 |
+
print(f"Space might already exist or there was an error: {e}")
|
19 |
+
|
20 |
+
# Upload the files
|
21 |
+
api.upload_folder(
|
22 |
+
folder_path=".",
|
23 |
+
repo_id="nananie143/advanced-reasoning",
|
24 |
+
repo_type="space",
|
25 |
+
ignore_patterns=["*.pyc", "__pycache__", ".git", ".env", "*.gguf"]
|
26 |
+
)
|
27 |
+
|
28 |
+
print("Upload completed successfully!")
|