aiforge-engine 0.0.2__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/PKG-INFO +3 -3
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/README.md +2 -2
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/pyproject.toml +1 -1
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/__init__.py +1 -1
- aiforge_engine-0.0.4/src/aiforge/core/managers/content_generation_manager.py +359 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/managers/execution_manager.py +25 -13
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/managers/search_manager.py +18 -15
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/orchestrator.py +8 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/prompt.py +2 -2
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/parameter_mapping_service.py +20 -3
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/templates/search_template.py +9 -7
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/templates/template_manager.py +16 -1
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/validation/result_validator.py +2 -2
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/.gitignore +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/LICENSE +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/cli_input_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/gui_input_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/input_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/input_adapter_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/input_processors.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/mobile_input_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/voice_input_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/input/web_input_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/ai_ui_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/enhanced_hybrid_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/learning_Interface.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/rule_based_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/task_type_detector.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/adapters/output/ui_type_recommender.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/middleware/auth.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/middleware/rate_limit.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/routes/execution.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/routes/llm.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/routes/tasks.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/api/server.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cache/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cache/action_matcher.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cache/code_cache.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cache/dynamic_task_type_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cache/semantic_cache.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cli/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cli/cli.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cli/commands/manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/cli/wizard.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/config.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/config_sync.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/default.toml +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/extension_config.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/extensions.toml +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/config/remote_config.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/engine.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/helpers/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/helpers/cache_helper.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/managers/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/managers/config_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/runner.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/task/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/task/executor.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/task/manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/task/task.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/cloud/aws_deploy.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/cloud/azure_deploy.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/docker/Dockerfile +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/docker/docker-compose.yml +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/kubernetes/deployment.yaml +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/deployment/kubernetes/service.yaml +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/audit/audit_logger.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/audit/compliance_checker.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/auth/permission_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/auth/user_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/monitoring/alert_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/enterprise/monitoring/metrics_collector.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/analyzer.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/code_blocks.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/engine.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/executor_interface.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/result_formatter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/result_processor.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/runtimes/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/runtimes/javascript_runtime.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/runtimes/python_runtime.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/runtimes/shell_runtime.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/execution/unified_executor.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/extensions/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/extensions/extension_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/extensions/loader.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/extensions/marketplace.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/extensions/plugin_installer.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/extensions/template_extension.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/instruction/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/instruction/analyzer.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/instruction/classifier.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/instruction/extractor.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/instruction/parser.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/conversation_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/llm_client.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/llm_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/providers/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/providers/deepseek_client.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/providers/ollama_client.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/llm/providers/openai_client.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/models/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/models/model_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/audio/speech_to_text.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/audio/text_to_speech.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/document/pdf_parser.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/document/word_parser.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/vision/image_processor.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/multimodal/vision/video_processor.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/optimization/code_optimizer.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/optimization/feedback_optimizer.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/plugins/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/plugins/builtin/data_analysis.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/plugins/builtin/file_processing.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/plugins/builtin/web_scraping.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/plugins/plugin_interface.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/plugins/plugin_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/execution_strategy.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/execution_strategy_manager.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/search_template_strategy.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/semantic_field_strategy.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/strategy/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/strategy/class_instantiation.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/strategy/direct_result.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/strategy/file_operation.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/strategy/file_operation_safety.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/strategy/parameterized_function.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/validation_strategy.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/templates/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/templates/builtin/automation.json +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/templates/builtin/data_analysis.json +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/templates/builtin/web_api.json +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/utils/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/utils/helpers.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/utils/progress_indicator.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/utils/sentence_transformers_downloader.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/utils/utils.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/validation/code_validator.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/workflow/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/workflow/nodes/data_node.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/workflow/nodes/execution_node.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/workflow/nodes/llm_node.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/workflow/workflow_designer.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/workflow/workflow_engine.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge_gui/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge_gui/app.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge_gui/smart_display.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge_web/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge_web/api_adapter.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge_web/main.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/cli/__init__.py +0 -0
- {aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/cli/cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiforge-engine
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: Intelligent Intent Adaptive Execution Engine - 智能意图自适应执行引擎
|
|
5
5
|
Project-URL: Homepage, https://github.com/iniwap/AIForge
|
|
6
6
|
Project-URL: Documentation, https://iniwap.github.io/AIForge
|
|
@@ -67,7 +67,7 @@ Description-Content-Type: text/markdown
|
|
|
67
67
|
---
|
|
68
68
|
|
|
69
69
|
## 🎯 什么是 AIForge?
|
|
70
|
-

|
|
71
71
|
AIForge 是一个**突破性的认知计算引擎**,它消除了自然语言与代码执行之间的壁垒。通过先进的**意图理解算法**和**自适应执行架构**,AIForge 能够:
|
|
72
72
|
|
|
73
73
|
- 🧠 **深度理解** - 多维度解析复杂指令,精准捕获用户意图
|
|
@@ -102,7 +102,7 @@ AIForge 是一个**突破性的认知计算引擎**,它消除了自然语言
|
|
|
102
102
|
|
|
103
103
|
## 🚀 快速启动
|
|
104
104
|
|
|
105
|
-
###
|
|
105
|
+
### 安装(推荐uv)
|
|
106
106
|
```bash
|
|
107
107
|
pip install aiforge-engine
|
|
108
108
|
```
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
## 🎯 什么是 AIForge?
|
|
18
|
-

|
|
19
19
|
AIForge 是一个**突破性的认知计算引擎**,它消除了自然语言与代码执行之间的壁垒。通过先进的**意图理解算法**和**自适应执行架构**,AIForge 能够:
|
|
20
20
|
|
|
21
21
|
- 🧠 **深度理解** - 多维度解析复杂指令,精准捕获用户意图
|
|
@@ -50,7 +50,7 @@ AIForge 是一个**突破性的认知计算引擎**,它消除了自然语言
|
|
|
50
50
|
|
|
51
51
|
## 🚀 快速启动
|
|
52
52
|
|
|
53
|
-
###
|
|
53
|
+
### 安装(推荐uv)
|
|
54
54
|
```bash
|
|
55
55
|
pip install aiforge-engine
|
|
56
56
|
```
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import Dict, Any, Optional
|
|
3
|
+
from ...strategies.semantic_field_strategy import SemanticFieldStrategy
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AIForgeContentGenerationManager:
|
|
7
|
+
"""内容生成管理器 - 专门处理内容生成任务"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, components: Dict[str, Any]):
|
|
10
|
+
self.components = components
|
|
11
|
+
self.field_processor = SemanticFieldStrategy()
|
|
12
|
+
self.parameter_mapping_service = components.get("parameter_mapping_service")
|
|
13
|
+
|
|
14
|
+
# 扩展语义字段定义,支持格式相关参数
|
|
15
|
+
if hasattr(self.field_processor, "field_semantics"):
|
|
16
|
+
self.field_processor.field_semantics.update(
|
|
17
|
+
{
|
|
18
|
+
"format": [
|
|
19
|
+
"format",
|
|
20
|
+
"output_format",
|
|
21
|
+
"格式",
|
|
22
|
+
"输出格式",
|
|
23
|
+
"type",
|
|
24
|
+
"extension",
|
|
25
|
+
"文件格式",
|
|
26
|
+
],
|
|
27
|
+
"style": ["style", "样式", "风格", "theme", "template", "模板"],
|
|
28
|
+
"language": ["language", "lang", "语言", "locale", "国际化"],
|
|
29
|
+
"tone": ["tone", "语调", "风格", "mood", "情感"],
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def can_handle_content_generation(self, standardized_instruction: Dict[str, Any]) -> bool:
|
|
34
|
+
"""判断是否为内容生成任务"""
|
|
35
|
+
task_type = standardized_instruction.get("task_type", "")
|
|
36
|
+
return task_type == "content_generation"
|
|
37
|
+
|
|
38
|
+
def execute_content_generation(
|
|
39
|
+
self, standardized_instruction: Dict[str, Any], instruction: str
|
|
40
|
+
) -> Optional[Dict[str, Any]]:
|
|
41
|
+
"""执行内容生成任务"""
|
|
42
|
+
if standardized_instruction.get("execution_mode", "") == "code_generation":
|
|
43
|
+
return self._execute_search_enhanced_generation(standardized_instruction, instruction)
|
|
44
|
+
else:
|
|
45
|
+
return self._execute_direct_generation(standardized_instruction, instruction)
|
|
46
|
+
|
|
47
|
+
def _execute_search_enhanced_generation(
|
|
48
|
+
self, standardized_instruction: Dict[str, Any], instruction: str
|
|
49
|
+
) -> Optional[Dict[str, Any]]:
|
|
50
|
+
"""执行搜索增强的内容生成"""
|
|
51
|
+
search_manager = self.components.get("search_manager")
|
|
52
|
+
if not search_manager:
|
|
53
|
+
return self._execute_direct_generation(standardized_instruction, instruction)
|
|
54
|
+
|
|
55
|
+
# 为内容生成任务优化搜索参数,确保足够的结果数量
|
|
56
|
+
content_search_instruction = standardized_instruction.copy()
|
|
57
|
+
content_search_instruction.update(
|
|
58
|
+
{
|
|
59
|
+
"task_type": "data_fetch",
|
|
60
|
+
"required_parameters": {
|
|
61
|
+
# 保留原有参数
|
|
62
|
+
**standardized_instruction.get("required_parameters", {}),
|
|
63
|
+
"search_query": {
|
|
64
|
+
"value": search_manager.extract_search_query(
|
|
65
|
+
standardized_instruction, instruction
|
|
66
|
+
),
|
|
67
|
+
"type": "string",
|
|
68
|
+
"required": True,
|
|
69
|
+
},
|
|
70
|
+
"max_results": {
|
|
71
|
+
"value": 10,
|
|
72
|
+
"type": "int",
|
|
73
|
+
"required": False,
|
|
74
|
+
},
|
|
75
|
+
"min_items": {
|
|
76
|
+
"value": 5,
|
|
77
|
+
"type": "int",
|
|
78
|
+
"required": True,
|
|
79
|
+
},
|
|
80
|
+
"min_abstract_len": {
|
|
81
|
+
"value": 500,
|
|
82
|
+
"type": "int",
|
|
83
|
+
"required": False,
|
|
84
|
+
},
|
|
85
|
+
"max_abstract_len": {
|
|
86
|
+
"value": 1000,
|
|
87
|
+
"type": "int",
|
|
88
|
+
"required": False,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
"expected_output": {
|
|
92
|
+
"required_fields": ["title", "content", "url", "pub_time"],
|
|
93
|
+
"validation_rules": {
|
|
94
|
+
"min_items": 5,
|
|
95
|
+
"non_empty_fields": ["title", "content", "url"],
|
|
96
|
+
"enable_deduplication": True,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# 使用完整的多层级搜索
|
|
103
|
+
search_result = search_manager.execute_multi_level_search(
|
|
104
|
+
content_search_instruction, instruction
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
if search_result and search_result.get("status") == "success":
|
|
108
|
+
return self._generate_content_with_search_result(
|
|
109
|
+
standardized_instruction, instruction, search_result
|
|
110
|
+
)
|
|
111
|
+
else:
|
|
112
|
+
return self._execute_direct_generation(standardized_instruction, instruction)
|
|
113
|
+
|
|
114
|
+
def _execute_direct_generation(
|
|
115
|
+
self, standardized_instruction: Dict[str, Any], instruction: str
|
|
116
|
+
) -> Optional[Dict[str, Any]]:
|
|
117
|
+
"""执行直接内容生成"""
|
|
118
|
+
output_format = self._extract_output_format_with_mapping(standardized_instruction)
|
|
119
|
+
style_params = self._extract_style_parameters(standardized_instruction)
|
|
120
|
+
|
|
121
|
+
enhanced_instruction = f"""
|
|
122
|
+
请根据用户要求:{instruction},生成文章内容。
|
|
123
|
+
|
|
124
|
+
输出格式要求:{output_format}
|
|
125
|
+
样式要求:{style_params.get('style', '专业')}
|
|
126
|
+
语调:{style_params.get('tone', '客观')}
|
|
127
|
+
语言:{style_params.get('language', '中文')}
|
|
128
|
+
|
|
129
|
+
特别注意:
|
|
130
|
+
1. 严格按照{output_format}格式输出
|
|
131
|
+
2. 确保内容结构清晰,格式规范
|
|
132
|
+
3. 内容要有逻辑性和可读性
|
|
133
|
+
4. 保持{style_params.get('tone', '客观')}的语调
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
return self._call_llm_for_content(
|
|
137
|
+
enhanced_instruction, output_format, standardized_instruction
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def _generate_content_with_search_result(
|
|
141
|
+
self,
|
|
142
|
+
standardized_instruction: Dict[str, Any],
|
|
143
|
+
instruction: str,
|
|
144
|
+
search_result: Dict[str, Any],
|
|
145
|
+
) -> Optional[Dict[str, Any]]:
|
|
146
|
+
"""基于搜索结果生成内容"""
|
|
147
|
+
search_data = search_result.get("data", [])
|
|
148
|
+
output_format = self._extract_output_format_with_mapping(standardized_instruction)
|
|
149
|
+
style_params = self._extract_style_parameters(standardized_instruction)
|
|
150
|
+
|
|
151
|
+
# 格式化搜索结果
|
|
152
|
+
if len(search_data) > 0:
|
|
153
|
+
formatted = f"关于'{instruction}'的搜索结果:\n\n"
|
|
154
|
+
for i, result in enumerate(search_data, 1):
|
|
155
|
+
formatted += f"## 结果 {i}\n"
|
|
156
|
+
formatted += f"**标题**: {result.get('title', '无标题')}\n"
|
|
157
|
+
formatted += f"**发布时间**: {result.get('pub_time', '未知时间')}\n"
|
|
158
|
+
formatted += f"**摘要**: {result.get('abstract', '无摘要')}\n"
|
|
159
|
+
formatted += f"**内容**: {result.get('content', '')}...\n"
|
|
160
|
+
formatted += "\n"
|
|
161
|
+
else:
|
|
162
|
+
formatted = "未找到相关搜索结果,请基于已有知识生成内容。"
|
|
163
|
+
|
|
164
|
+
enhanced_instruction = f"""
|
|
165
|
+
请基于以下搜索到的最新数据内容:
|
|
166
|
+
{formatted}
|
|
167
|
+
|
|
168
|
+
和用户任务要求:{instruction},生成文章内容。
|
|
169
|
+
|
|
170
|
+
输出格式要求:{output_format}
|
|
171
|
+
样式要求:{style_params.get('style', '专业')}
|
|
172
|
+
语调:{style_params.get('tone', '客观')}
|
|
173
|
+
语言:{style_params.get('language', '中文')}
|
|
174
|
+
|
|
175
|
+
特别注意:
|
|
176
|
+
1. 文章中的日期必须采用搜索结果的日期
|
|
177
|
+
2. 严格按照{output_format}格式输出
|
|
178
|
+
3. 确保内容结构清晰,格式规范
|
|
179
|
+
4. 基于搜索结果的真实数据进行分析和创作
|
|
180
|
+
5. 保持{style_params.get('tone', '客观')}的语调
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
return self._call_llm_for_content(
|
|
184
|
+
enhanced_instruction, output_format, standardized_instruction, len(search_data)
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def _extract_output_format_with_mapping(self, standardized_instruction: Dict[str, Any]) -> str:
|
|
188
|
+
"""使用参数映射服务提取输出格式"""
|
|
189
|
+
parameters = standardized_instruction.get("required_parameters", {})
|
|
190
|
+
|
|
191
|
+
# 使用参数映射服务进行格式参数映射
|
|
192
|
+
if self.parameter_mapping_service:
|
|
193
|
+
# 创建虚拟函数来获取格式参数
|
|
194
|
+
def dummy_format_function(
|
|
195
|
+
output_format="markdown", format="markdown", type="markdown", extension="md"
|
|
196
|
+
):
|
|
197
|
+
# 优先级:output_format > format > type > extension
|
|
198
|
+
for param in [output_format, format, type, extension]:
|
|
199
|
+
if param and param != "markdown" and param != "md":
|
|
200
|
+
return param
|
|
201
|
+
return "markdown"
|
|
202
|
+
|
|
203
|
+
context = {
|
|
204
|
+
"task_type": standardized_instruction.get("task_type"),
|
|
205
|
+
"action": standardized_instruction.get("action"),
|
|
206
|
+
"function_name": "extract_format",
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
try:
|
|
210
|
+
mapped_params = self.parameter_mapping_service.map_parameters(
|
|
211
|
+
dummy_format_function, parameters, context
|
|
212
|
+
)
|
|
213
|
+
result = dummy_format_function(**mapped_params)
|
|
214
|
+
if result and result != "markdown":
|
|
215
|
+
return result.lower()
|
|
216
|
+
except Exception:
|
|
217
|
+
pass
|
|
218
|
+
|
|
219
|
+
# 回退到原有逻辑
|
|
220
|
+
return self._fallback_format_extraction(standardized_instruction)
|
|
221
|
+
|
|
222
|
+
def _extract_style_parameters(self, standardized_instruction: Dict[str, Any]) -> Dict[str, str]:
|
|
223
|
+
"""使用参数映射服务提取样式参数"""
|
|
224
|
+
parameters = standardized_instruction.get("required_parameters", {})
|
|
225
|
+
style_params = {"style": "专业", "tone": "客观", "language": "中文"}
|
|
226
|
+
|
|
227
|
+
if self.parameter_mapping_service:
|
|
228
|
+
# 创建虚拟函数来获取样式参数
|
|
229
|
+
def dummy_style_function(
|
|
230
|
+
style="专业", tone="客观", language="中文", theme="专业", mood="客观", lang="中文"
|
|
231
|
+
):
|
|
232
|
+
return {
|
|
233
|
+
"style": style or theme or "专业",
|
|
234
|
+
"tone": tone or mood or "客观",
|
|
235
|
+
"language": language or lang or "中文",
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
context = {
|
|
239
|
+
"task_type": standardized_instruction.get("task_type"),
|
|
240
|
+
"action": standardized_instruction.get("action"),
|
|
241
|
+
"function_name": "extract_style",
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try:
|
|
245
|
+
mapped_params = self.parameter_mapping_service.map_parameters(
|
|
246
|
+
dummy_style_function, parameters, context
|
|
247
|
+
)
|
|
248
|
+
result = dummy_style_function(**mapped_params)
|
|
249
|
+
style_params.update(result)
|
|
250
|
+
except Exception:
|
|
251
|
+
pass
|
|
252
|
+
|
|
253
|
+
return style_params
|
|
254
|
+
|
|
255
|
+
def _fallback_format_extraction(self, standardized_instruction: Dict[str, Any]) -> str:
|
|
256
|
+
"""回退的格式提取逻辑"""
|
|
257
|
+
# 直接检查参数
|
|
258
|
+
parameters = standardized_instruction.get("required_parameters", {})
|
|
259
|
+
format_params = ["output_format", "format", "type", "extension"]
|
|
260
|
+
|
|
261
|
+
for param_name in format_params:
|
|
262
|
+
if param_name in parameters:
|
|
263
|
+
param_info = parameters[param_name]
|
|
264
|
+
if isinstance(param_info, dict) and "value" in param_info:
|
|
265
|
+
return param_info["value"].lower()
|
|
266
|
+
elif isinstance(param_info, str):
|
|
267
|
+
return param_info.lower()
|
|
268
|
+
|
|
269
|
+
# 检查指令中是否包含格式要求
|
|
270
|
+
instruction_lower = standardized_instruction.get("target", "").lower()
|
|
271
|
+
format_keywords = {
|
|
272
|
+
"markdown": ["markdown", "md", "标记语言"],
|
|
273
|
+
"html": ["html", "网页", "web"],
|
|
274
|
+
"json": ["json", "数据格式"],
|
|
275
|
+
"xml": ["xml"],
|
|
276
|
+
"pdf": ["pdf"],
|
|
277
|
+
"docx": ["word", "docx", "文档"],
|
|
278
|
+
"txt": ["txt", "文本", "纯文本"],
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
for format_type, keywords in format_keywords.items():
|
|
282
|
+
if any(keyword in instruction_lower for keyword in keywords):
|
|
283
|
+
return format_type
|
|
284
|
+
|
|
285
|
+
# 默认返回markdown
|
|
286
|
+
return "markdown"
|
|
287
|
+
|
|
288
|
+
def _call_llm_for_content(
|
|
289
|
+
self,
|
|
290
|
+
enhanced_instruction: str,
|
|
291
|
+
output_format: str,
|
|
292
|
+
standardized_instruction: Dict[str, Any],
|
|
293
|
+
search_results_count: int = 0,
|
|
294
|
+
) -> Dict[str, Any]:
|
|
295
|
+
"""调用LLM生成内容"""
|
|
296
|
+
llm_manager = self.components.get("llm_manager")
|
|
297
|
+
if not llm_manager:
|
|
298
|
+
return {
|
|
299
|
+
"data": {"content": "LLM管理器不可用"},
|
|
300
|
+
"status": "error",
|
|
301
|
+
"summary": "内容生成失败:LLM管理器不可用",
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
client = llm_manager.get_client()
|
|
305
|
+
if not client:
|
|
306
|
+
return {
|
|
307
|
+
"data": {"content": "LLM客户端不可用"},
|
|
308
|
+
"status": "error",
|
|
309
|
+
"summary": "内容生成失败:LLM客户端不可用",
|
|
310
|
+
}
|
|
311
|
+
try:
|
|
312
|
+
content = client.generate_code(enhanced_instruction, None, use_history=False)
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
"data": {
|
|
316
|
+
"content": content,
|
|
317
|
+
"format": output_format,
|
|
318
|
+
"content_type": self._get_content_type(output_format),
|
|
319
|
+
},
|
|
320
|
+
"status": "success",
|
|
321
|
+
"summary": f"成功生成{output_format}格式内容"
|
|
322
|
+
+ (f"(基于{search_results_count}条搜索结果)" if search_results_count > 0 else ""),
|
|
323
|
+
"metadata": {
|
|
324
|
+
"timestamp": time.time(),
|
|
325
|
+
"task_type": "content_generation",
|
|
326
|
+
"execution_type": (
|
|
327
|
+
"search_enhanced_content" if search_results_count > 0 else "direct_content"
|
|
328
|
+
),
|
|
329
|
+
"output_format": output_format,
|
|
330
|
+
"search_results_count": search_results_count,
|
|
331
|
+
},
|
|
332
|
+
}
|
|
333
|
+
except Exception as e:
|
|
334
|
+
return {
|
|
335
|
+
"data": {"content": f"内容生成出错:{str(e)}"},
|
|
336
|
+
"status": "error",
|
|
337
|
+
"summary": f"内容生成失败:{str(e)}",
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
def _get_content_type(self, output_format: str) -> str:
|
|
341
|
+
"""根据格式返回内容类型"""
|
|
342
|
+
format_mapping = {
|
|
343
|
+
"markdown": "text/markdown",
|
|
344
|
+
"html": "text/html",
|
|
345
|
+
"json": "application/json",
|
|
346
|
+
"xml": "application/xml",
|
|
347
|
+
"pdf": "application/pdf",
|
|
348
|
+
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
349
|
+
"txt": "text/plain",
|
|
350
|
+
}
|
|
351
|
+
return format_mapping.get(output_format, "text/plain")
|
|
352
|
+
|
|
353
|
+
def get_supported_formats(self) -> list:
|
|
354
|
+
"""获取支持的输出格式列表"""
|
|
355
|
+
return ["markdown", "html", "json", "xml", "pdf", "docx", "txt"]
|
|
356
|
+
|
|
357
|
+
def validate_format(self, format_name: str) -> bool:
|
|
358
|
+
"""验证格式是否支持"""
|
|
359
|
+
return format_name.lower() in self.get_supported_formats()
|
{aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/core/managers/execution_manager.py
RENAMED
|
@@ -30,25 +30,14 @@ class AIForgeExecutionManager:
|
|
|
30
30
|
|
|
31
31
|
def _run_with_standardized_instruction(self, instruction: str) -> Optional[Dict[str, Any]]:
|
|
32
32
|
"""基于标准化指令的统一执行流程"""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if not instruction_analyzer:
|
|
33
|
+
if not self.components.get("instruction_analyzer"):
|
|
36
34
|
result, _, _ = self.generate_and_execute_with_code(instruction, None, None)
|
|
37
35
|
return result
|
|
38
36
|
|
|
39
37
|
# 使用统一的指令分析入口
|
|
40
38
|
standardized_instruction = self._get_final_standardized_instruction(instruction)
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
search_manager = self.components.get("search_manager")
|
|
44
|
-
if search_manager and search_manager.is_search_task(standardized_instruction):
|
|
45
|
-
result = search_manager.execute_multi_level_search(
|
|
46
|
-
standardized_instruction, instruction
|
|
47
|
-
)
|
|
48
|
-
if result["status"] != "error" and len(result["data"]) != 0:
|
|
49
|
-
return result
|
|
50
|
-
|
|
51
|
-
# 非搜索的执行逻辑...
|
|
40
|
+
task_type = standardized_instruction.get("task_type", "")
|
|
52
41
|
execution_mode = standardized_instruction.get("execution_mode", "code_generation")
|
|
53
42
|
confidence = standardized_instruction.get("confidence", 0)
|
|
54
43
|
|
|
@@ -63,6 +52,29 @@ class AIForgeExecutionManager:
|
|
|
63
52
|
elif execution_mode == "direct_ai_response" and confidence >= 0.6:
|
|
64
53
|
return self._handle_direct_response(standardized_instruction, instruction)
|
|
65
54
|
|
|
55
|
+
# 内容生成任务委托给专门的管理器
|
|
56
|
+
if task_type == "content_generation":
|
|
57
|
+
content_generation_manager = self.components.get("content_generation_manager")
|
|
58
|
+
if (
|
|
59
|
+
content_generation_manager
|
|
60
|
+
and content_generation_manager.can_handle_content_generation(
|
|
61
|
+
standardized_instruction
|
|
62
|
+
)
|
|
63
|
+
):
|
|
64
|
+
return content_generation_manager.execute_content_generation(
|
|
65
|
+
standardized_instruction, instruction
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# 数据获取任务委托给搜索管理器
|
|
69
|
+
if task_type == "data_fetch":
|
|
70
|
+
search_manager = self.components.get("search_manager")
|
|
71
|
+
if search_manager and search_manager.is_search_task(standardized_instruction):
|
|
72
|
+
result = search_manager.execute_multi_level_search(
|
|
73
|
+
standardized_instruction, instruction
|
|
74
|
+
)
|
|
75
|
+
if result["status"] != "error" and len(result["data"]) != 0:
|
|
76
|
+
return result
|
|
77
|
+
|
|
66
78
|
# 其他类型按原有逻辑处理
|
|
67
79
|
code_cache = self.components.get("code_cache")
|
|
68
80
|
if code_cache:
|
|
@@ -15,17 +15,11 @@ class AIForgeSearchManager:
|
|
|
15
15
|
|
|
16
16
|
def is_search_task(self, standardized_instruction: Dict[str, Any]) -> bool:
|
|
17
17
|
"""判断是否为搜索类任务"""
|
|
18
|
-
task_type = standardized_instruction.get("task_type", "")
|
|
19
18
|
action = standardized_instruction.get("action", "")
|
|
20
19
|
|
|
21
|
-
execution_mode = standardized_instruction.get("execution_mode", "")
|
|
22
|
-
if execution_mode == "direct_ai_response":
|
|
23
|
-
return False
|
|
24
|
-
|
|
25
20
|
# 检查任务类型和动作
|
|
26
21
|
search_indicators = [
|
|
27
|
-
|
|
28
|
-
action in ["search", "fetch", "get"],
|
|
22
|
+
any(keyword in action.lower() for keyword in ["search", "fetch", "get"]),
|
|
29
23
|
"search" in standardized_instruction.get("target", "").lower(),
|
|
30
24
|
]
|
|
31
25
|
|
|
@@ -46,7 +40,6 @@ class AIForgeSearchManager:
|
|
|
46
40
|
search_params = self.parameter_mapping_service.extract_search_parameters(
|
|
47
41
|
standardized_instruction, original_instruction
|
|
48
42
|
)
|
|
49
|
-
|
|
50
43
|
if not search_params["search_query"]:
|
|
51
44
|
return None
|
|
52
45
|
|
|
@@ -229,13 +222,24 @@ class AIForgeSearchManager:
|
|
|
229
222
|
except Exception:
|
|
230
223
|
return None, False
|
|
231
224
|
|
|
232
|
-
def
|
|
233
|
-
self, standardized_instruction: Dict[str, Any],
|
|
225
|
+
def extract_search_query(
|
|
226
|
+
self, standardized_instruction: Dict[str, Any], instruction: str
|
|
234
227
|
) -> str:
|
|
235
228
|
"""提取搜索查询"""
|
|
229
|
+
if self.parameter_mapping_service:
|
|
230
|
+
# 使用现有的搜索参数提取服务
|
|
231
|
+
try:
|
|
232
|
+
search_params = self.parameter_mapping_service.extract_search_parameters(
|
|
233
|
+
standardized_instruction, instruction
|
|
234
|
+
)
|
|
235
|
+
return search_params.get("search_query", instruction)
|
|
236
|
+
except Exception:
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
# 回退逻辑:直接从参数中提取
|
|
236
240
|
parameters = standardized_instruction.get("required_parameters", {})
|
|
237
241
|
|
|
238
|
-
#
|
|
242
|
+
# 尝试从参数中提取搜索查询
|
|
239
243
|
for param_name in ["search_query", "query", "keyword"]:
|
|
240
244
|
if param_name in parameters:
|
|
241
245
|
param_info = parameters[param_name]
|
|
@@ -249,8 +253,8 @@ class AIForgeSearchManager:
|
|
|
249
253
|
if target:
|
|
250
254
|
return target
|
|
251
255
|
|
|
252
|
-
#
|
|
253
|
-
return
|
|
256
|
+
# 使用原始指令作为最后的回退
|
|
257
|
+
return instruction
|
|
254
258
|
|
|
255
259
|
def _convert_search_result_to_aiforge_format(
|
|
256
260
|
self,
|
|
@@ -266,7 +270,6 @@ class AIForgeSearchManager:
|
|
|
266
270
|
success = search_result.get("success", False)
|
|
267
271
|
error = search_result.get("error")
|
|
268
272
|
|
|
269
|
-
# 应用字段映射
|
|
270
273
|
expected_output = standardized_instruction.get("expected_output")
|
|
271
274
|
if expected_output and expected_output.get("required_fields"):
|
|
272
275
|
results = self.processor_manager.process_field(
|
|
@@ -382,7 +385,7 @@ class AIForgeSearchManager:
|
|
|
382
385
|
return freeform_result
|
|
383
386
|
|
|
384
387
|
ProgressIndicator.show_search_process("系统默认")
|
|
385
|
-
#
|
|
388
|
+
# 所有层级都失败,系统搜索成功率较低
|
|
386
389
|
return {
|
|
387
390
|
"data": [],
|
|
388
391
|
"status": "error",
|
|
@@ -19,6 +19,7 @@ from ..templates.template_manager import TemplateManager
|
|
|
19
19
|
from .managers.config_manager import AIForgeConfigManager
|
|
20
20
|
from ..strategies.parameter_mapping_service import ParameterMappingService
|
|
21
21
|
from ..execution.engine import AIForgeExecutionEngine
|
|
22
|
+
from .managers.content_generation_manager import AIForgeContentGenerationManager
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
class AIForgeOrchestrator:
|
|
@@ -55,6 +56,7 @@ class AIForgeOrchestrator:
|
|
|
55
56
|
self._init_execution_manager()
|
|
56
57
|
self._init_template_manager()
|
|
57
58
|
self._init_search_manager()
|
|
59
|
+
self._init_content_generation_manager()
|
|
58
60
|
|
|
59
61
|
self._initialized = True
|
|
60
62
|
|
|
@@ -133,6 +135,12 @@ class AIForgeOrchestrator:
|
|
|
133
135
|
execution_engine = AIForgeExecutionEngine(self.components)
|
|
134
136
|
self.components["execution_engine"] = execution_engine
|
|
135
137
|
|
|
138
|
+
def _init_content_generation_manager(self):
|
|
139
|
+
"""初始化内容生成管理器"""
|
|
140
|
+
self.components["content_generation_manager"] = AIForgeContentGenerationManager(
|
|
141
|
+
self.components
|
|
142
|
+
)
|
|
143
|
+
|
|
136
144
|
def _init_adapters(self):
|
|
137
145
|
"""初始化适配器"""
|
|
138
146
|
self.components["ui_adapter"] = None # 延迟初始化
|
|
@@ -300,13 +300,13 @@ __result__ = execute_task({param_analysis['call_args']})
|
|
|
300
300
|
def get_base_prompt_sections() -> Dict[str, str]:
|
|
301
301
|
"""构建基础提示词各个部分"""
|
|
302
302
|
return {
|
|
303
|
-
"role": "你是 AIForge
|
|
303
|
+
"role": "你是 AIForge 智能任务分析器,负责理解用户指令并分析完成任务所需的必要信息以及预期结果",
|
|
304
304
|
"execution_mode": """
|
|
305
305
|
- 直接响应:AI知识可直接完成,无需最新数据,包括对话延续和情感支持
|
|
306
306
|
- 代码生成:需要外部数据源、实时信息或系统交互
|
|
307
307
|
""",
|
|
308
308
|
"analysis_steps": """
|
|
309
|
-
-
|
|
309
|
+
- 识别执行模式和任务类型
|
|
310
310
|
- 提取关键参数和数量要求,设置合适的 min_items
|
|
311
311
|
- 定义必需字段和验证规则
|
|
312
312
|
- "获取/查找/搜索"某类信息的非任务型指令,仅提取一个required_parameters参数search_query=原始指令
|
{aiforge_engine-0.0.2 → aiforge_engine-0.0.4}/src/aiforge/strategies/parameter_mapping_service.py
RENAMED
|
@@ -20,6 +20,15 @@ class ParameterMappingService:
|
|
|
20
20
|
|
|
21
21
|
def _extract_with_strategy(self, param_name: str, available_params: Dict[str, Any]) -> Any:
|
|
22
22
|
"""使用策略提取参数值"""
|
|
23
|
+
|
|
24
|
+
# 1. 首先尝试精确匹配
|
|
25
|
+
if param_name in available_params:
|
|
26
|
+
param_value = available_params[param_name]
|
|
27
|
+
if isinstance(param_value, dict) and "value" in param_value:
|
|
28
|
+
return param_value["value"]
|
|
29
|
+
return param_value
|
|
30
|
+
|
|
31
|
+
# 2. 然后使用策略匹配
|
|
23
32
|
for strategy in self.strategies:
|
|
24
33
|
if strategy.can_handle(param_name):
|
|
25
34
|
result = strategy.map_parameter(param_name, available_params)
|
|
@@ -136,7 +145,7 @@ class ParameterMappingService:
|
|
|
136
145
|
"timeout": 30,
|
|
137
146
|
"limit": 10,
|
|
138
147
|
"min_abstract_len": 300,
|
|
139
|
-
"max_abstract_len":
|
|
148
|
+
"max_abstract_len": 1000,
|
|
140
149
|
"page_size": 20,
|
|
141
150
|
"retry_count": 3,
|
|
142
151
|
"query": "",
|
|
@@ -168,7 +177,6 @@ class ParameterMappingService:
|
|
|
168
177
|
"""专门用于搜索参数提取的方法"""
|
|
169
178
|
parameters = standardized_instruction.get("required_parameters", {})
|
|
170
179
|
expected_output = standardized_instruction.get("expected_output", {})
|
|
171
|
-
|
|
172
180
|
# 使用现有的映射策略
|
|
173
181
|
search_query = (
|
|
174
182
|
self._extract_with_strategy("search_query", parameters) or original_instruction
|
|
@@ -209,7 +217,7 @@ class ParameterMappingService:
|
|
|
209
217
|
"max_results": max_results,
|
|
210
218
|
"min_items": min_items,
|
|
211
219
|
"min_abstract_len": self._extract_with_strategy("min_abstract_len", parameters) or 300,
|
|
212
|
-
"max_abstract_len": self._extract_with_strategy("max_abstract_len", parameters) or
|
|
220
|
+
"max_abstract_len": self._extract_with_strategy("max_abstract_len", parameters) or 1000,
|
|
213
221
|
}
|
|
214
222
|
|
|
215
223
|
|
|
@@ -265,6 +273,15 @@ class SearchParameterMappingStrategy(ParameterMappingStrategy):
|
|
|
265
273
|
# max_results 只接受明确表示"最大"语义的参数,不包括 quantity
|
|
266
274
|
"max_results": ["max_results", "max_limit", "max_count", "max_size"],
|
|
267
275
|
"min_items": ["min_items", "min_count", "quantity"],
|
|
276
|
+
"min_abstract_len": [
|
|
277
|
+
"min_abstract_len",
|
|
278
|
+
"min_content_len",
|
|
279
|
+
"min_article_len",
|
|
280
|
+
"abstract_len",
|
|
281
|
+
"content_len",
|
|
282
|
+
"article_len",
|
|
283
|
+
],
|
|
284
|
+
"max_abstract_len": ["max_abstract_len", "max_content_len", "max_article_len"],
|
|
268
285
|
}
|
|
269
286
|
|
|
270
287
|
candidates = mappings.get(param_name, [])
|