aiecs 1.3.4__tar.gz → 1.3.5__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.
Potentially problematic release.
This version of aiecs might be problematic. Click here for more details.
- {aiecs-1.3.4/aiecs.egg-info → aiecs-1.3.5}/PKG-INFO +1 -1
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/__init__.py +1 -1
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/clients/vertex_client.py +96 -41
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/main.py +2 -2
- {aiecs-1.3.4 → aiecs-1.3.5/aiecs.egg-info}/PKG-INFO +1 -1
- {aiecs-1.3.4 → aiecs-1.3.5}/pyproject.toml +1 -1
- {aiecs-1.3.4 → aiecs-1.3.5}/LICENSE +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/MANIFEST.in +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/README.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/__main__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/aiecs_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/application/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/application/executors/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/application/executors/operation_executor.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/config/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/config/config.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/config/registry.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/core/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/core/interface/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/core/interface/execution_interface.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/core/interface/storage_interface.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/agent_adapter.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/analytics.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/collaborative_workflow.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/communication_hub.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/community_builder.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/community_integration.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/community_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/decision_engine.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/exceptions.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/models/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/models/community_models.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/resource_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/community/shared_context_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/context/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/context/context_engine.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/context/conversation_models.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/execution/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/execution/model.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/task/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/task/dsl_processor.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/task/model.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/domain/task/task_context.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/messaging/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/messaging/celery_task_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/messaging/websocket_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/monitoring/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/monitoring/executor_metrics.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/monitoring/global_metrics_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/monitoring/structured_logger.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/monitoring/tracing_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/persistence/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/persistence/context_engine_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/persistence/database_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/persistence/file_storage.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/infrastructure/persistence/redis_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/callbacks/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/callbacks/custom_callbacks.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/client_factory.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/clients/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/clients/base_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/clients/googleai_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/clients/openai_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/clients/xai_client.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/config/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/config/config_loader.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/config/config_validator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/config/model_config.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/utils/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/llm/utils/validate_config.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/aid/VERSION_MANAGEMENT.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/aid/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/aid/version_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/dependency_checker.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/dependency_fixer.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/download_nlp_data.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/quick_dependency_check.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_check/setup_nlp_data.sh +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/tools_develop/README.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/tools_develop/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/tools_develop/check_type_annotations.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/tools_develop/validate_tool_schemas.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/tools_develop/verify_tools.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tasks/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tasks/worker.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/intelligence/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/intelligence/data_fusion.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/intelligence/query_analyzer.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/intelligence/search_enhancer.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/monitoring/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/monitoring/metrics.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/providers/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/providers/base.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/providers/census.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/providers/fred.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/providers/newsapi.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/providers/worldbank.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/reliability/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/reliability/error_handler.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/reliability/fallback_strategy.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/utils/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/apisource/utils/validators.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/base_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/ai_document_orchestrator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/ai_document_writer_orchestrator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/content_insertion_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/document_creator_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/document_layout_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/document_parser_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/docs/document_writer_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/langchain_adapter.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/schema_generator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/analyzers.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/cache.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/constants.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/context.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/core.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/deduplicator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/error_handler.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/metrics.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/rate_limiter.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/search_tool/schemas.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/ai_data_analysis_orchestrator.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/ai_insight_generator_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/ai_report_orchestrator_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/data_loader_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/data_profiler_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/data_transformer_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/data_visualizer_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/model_trainer_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/statistics/statistical_analyzer_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/chart_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/classfire_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/image_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/office_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/pandas_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/report_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/research_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/scraper_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/task_tools/stats_tool.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/temp_file_manager.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/tool_executor/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/tools/tool_executor/tool_executor.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/LLM_output_structor.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/base_callback.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/cache_provider.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/execution_utils.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/logging.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/prompt_loader.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/utils/token_usage_repository.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/ws/__init__.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs/ws/socket_server.py +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs.egg-info/SOURCES.txt +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs.egg-info/dependency_links.txt +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs.egg-info/entry_points.txt +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs.egg-info/requires.txt +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/aiecs.egg-info/top_level.txt +0 -0
- {aiecs-1.3.4 → aiecs-1.3.5}/setup.cfg +0 -0
|
@@ -5,7 +5,7 @@ A powerful Python middleware framework for building AI-powered applications
|
|
|
5
5
|
with tool orchestration, task execution, and multi-provider LLM support.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.3.
|
|
8
|
+
__version__ = "1.3.5"
|
|
9
9
|
__author__ = "AIECS Team"
|
|
10
10
|
__email__ = "iretbl@gmail.com"
|
|
11
11
|
|
|
@@ -23,6 +23,12 @@ class VertexAIClient(BaseLLMClient):
|
|
|
23
23
|
super().__init__("Vertex")
|
|
24
24
|
self.settings = get_settings()
|
|
25
25
|
self._initialized = False
|
|
26
|
+
# Track part count statistics for monitoring
|
|
27
|
+
self._part_count_stats = {
|
|
28
|
+
"total_responses": 0,
|
|
29
|
+
"part_counts": {}, # {part_count: frequency}
|
|
30
|
+
"last_part_count": None
|
|
31
|
+
}
|
|
26
32
|
|
|
27
33
|
def _init_vertex_ai(self):
|
|
28
34
|
"""Lazy initialization of Vertex AI with proper authentication"""
|
|
@@ -141,52 +147,44 @@ class VertexAIClient(BaseLLMClient):
|
|
|
141
147
|
text_parts.append(part.text)
|
|
142
148
|
|
|
143
149
|
if text_parts:
|
|
150
|
+
# Log part count for monitoring
|
|
151
|
+
part_count = len(text_parts)
|
|
152
|
+
self.logger.info(f"📊 Vertex AI response: {part_count} parts detected")
|
|
153
|
+
|
|
154
|
+
# Update statistics
|
|
155
|
+
self._part_count_stats["total_responses"] += 1
|
|
156
|
+
self._part_count_stats["part_counts"][part_count] = self._part_count_stats["part_counts"].get(part_count, 0) + 1
|
|
157
|
+
self._part_count_stats["last_part_count"] = part_count
|
|
158
|
+
|
|
159
|
+
# Log statistics if significant variation detected
|
|
160
|
+
if part_count != self._part_count_stats.get("last_part_count", part_count):
|
|
161
|
+
self.logger.warning(f"⚠️ Part count variation detected: {part_count} parts (previous: {self._part_count_stats.get('last_part_count', 'unknown')})")
|
|
162
|
+
|
|
144
163
|
# Handle multi-part response format
|
|
145
164
|
if len(text_parts) > 1:
|
|
146
|
-
# Multi-part response
|
|
147
|
-
#
|
|
148
|
-
|
|
149
|
-
has_thinking_tags = '<thinking>' in first_part
|
|
165
|
+
# Multi-part response
|
|
166
|
+
# Minimal fix: only fix incomplete <thinking> tags, preserve original order
|
|
167
|
+
# Do NOT reorganize content - let downstream code handle semantics
|
|
150
168
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
thinking_match = re.search(r'<thinking>(.*?)</thinking>', part, re.DOTALL)
|
|
161
|
-
if thinking_match:
|
|
162
|
-
thinking_contents.append(thinking_match.group(1).strip())
|
|
163
|
-
|
|
164
|
-
# Extract content after </thinking>
|
|
165
|
-
after_thinking = part[thinking_match.end():].strip()
|
|
166
|
-
if after_thinking:
|
|
167
|
-
actual_outputs.append(after_thinking)
|
|
168
|
-
else:
|
|
169
|
-
# This part doesn't have thinking tags, treat as actual output
|
|
170
|
-
actual_outputs.append(part)
|
|
171
|
-
|
|
172
|
-
# Combine thinking content and actual outputs
|
|
173
|
-
if thinking_contents:
|
|
174
|
-
combined_thinking = '\n\n'.join(thinking_contents)
|
|
175
|
-
content = f"<thinking>\n{combined_thinking}\n</thinking>"
|
|
176
|
-
if actual_outputs:
|
|
177
|
-
content += "\n" + "\n".join(actual_outputs)
|
|
178
|
-
else:
|
|
179
|
-
content = "\n".join(text_parts)
|
|
169
|
+
processed_parts = []
|
|
170
|
+
fixed_count = 0
|
|
171
|
+
|
|
172
|
+
for i, part in enumerate(text_parts):
|
|
173
|
+
if '<thinking>' in part and '</thinking>' not in part:
|
|
174
|
+
# Incomplete thinking tag: add closing tag
|
|
175
|
+
part = part + '\n</thinking>'
|
|
176
|
+
fixed_count += 1
|
|
177
|
+
self.logger.debug(f" Part {i+1}: Incomplete <thinking> tag fixed")
|
|
180
178
|
|
|
181
|
-
|
|
179
|
+
processed_parts.append(part)
|
|
180
|
+
|
|
181
|
+
# Merge in original order
|
|
182
|
+
content = "\n".join(processed_parts)
|
|
183
|
+
|
|
184
|
+
if fixed_count > 0:
|
|
185
|
+
self.logger.info(f"✅ Multi-part response merged: {len(text_parts)} parts, {fixed_count} incomplete tags fixed, order preserved")
|
|
182
186
|
else:
|
|
183
|
-
|
|
184
|
-
thinking_part = text_parts[0]
|
|
185
|
-
actual_output_parts = text_parts[1:]
|
|
186
|
-
|
|
187
|
-
# Format: <thinking>Part 1</thinking>\nPart 2\nPart 3...
|
|
188
|
-
content = f"<thinking>\n{thinking_part}\n</thinking>\n" + "\n".join(actual_output_parts)
|
|
189
|
-
self.logger.info(f"✅ Multi-part response wrapped with <thinking> tags: {len(text_parts)} parts")
|
|
187
|
+
self.logger.info(f"✅ Multi-part response merged: {len(text_parts)} parts, order preserved")
|
|
190
188
|
else:
|
|
191
189
|
# Single part response - use as is
|
|
192
190
|
content = text_parts[0]
|
|
@@ -271,7 +269,64 @@ class VertexAIClient(BaseLLMClient):
|
|
|
271
269
|
yield word + " "
|
|
272
270
|
await asyncio.sleep(0.05) # Small delay to simulate streaming
|
|
273
271
|
|
|
272
|
+
def get_part_count_stats(self) -> Dict[str, Any]:
|
|
273
|
+
"""
|
|
274
|
+
Get statistics about part count variations in Vertex AI responses.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
Dictionary containing part count statistics and analysis
|
|
278
|
+
"""
|
|
279
|
+
stats = self._part_count_stats.copy()
|
|
280
|
+
|
|
281
|
+
if stats["total_responses"] > 0:
|
|
282
|
+
# Calculate variation metrics
|
|
283
|
+
part_counts = list(stats["part_counts"].keys())
|
|
284
|
+
stats["variation_analysis"] = {
|
|
285
|
+
"unique_part_counts": len(part_counts),
|
|
286
|
+
"most_common_count": max(stats["part_counts"].items(), key=lambda x: x[1])[0] if stats["part_counts"] else None,
|
|
287
|
+
"part_count_range": f"{min(part_counts)}-{max(part_counts)}" if part_counts else "N/A",
|
|
288
|
+
"stability_score": 1.0 - (len(part_counts) - 1) / max(stats["total_responses"], 1) # 0-1, higher is more stable
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
# Generate recommendations
|
|
292
|
+
if stats["variation_analysis"]["stability_score"] < 0.7:
|
|
293
|
+
stats["recommendations"] = [
|
|
294
|
+
"High part count variation detected",
|
|
295
|
+
"Consider optimizing prompt structure",
|
|
296
|
+
"Monitor input complexity patterns",
|
|
297
|
+
"Review tool calling configuration"
|
|
298
|
+
]
|
|
299
|
+
else:
|
|
300
|
+
stats["recommendations"] = [
|
|
301
|
+
"Part count variation is within acceptable range",
|
|
302
|
+
"Continue monitoring for patterns"
|
|
303
|
+
]
|
|
304
|
+
|
|
305
|
+
return stats
|
|
306
|
+
|
|
307
|
+
def log_part_count_summary(self):
|
|
308
|
+
"""Log a summary of part count statistics"""
|
|
309
|
+
stats = self.get_part_count_stats()
|
|
310
|
+
|
|
311
|
+
if stats["total_responses"] > 0:
|
|
312
|
+
self.logger.info("📈 Vertex AI Part Count Summary:")
|
|
313
|
+
self.logger.info(f" Total responses: {stats['total_responses']}")
|
|
314
|
+
self.logger.info(f" Part count distribution: {stats['part_counts']}")
|
|
315
|
+
|
|
316
|
+
if "variation_analysis" in stats:
|
|
317
|
+
analysis = stats["variation_analysis"]
|
|
318
|
+
self.logger.info(f" Stability score: {analysis['stability_score']:.2f}")
|
|
319
|
+
self.logger.info(f" Most common count: {analysis['most_common_count']}")
|
|
320
|
+
self.logger.info(f" Count range: {analysis['part_count_range']}")
|
|
321
|
+
|
|
322
|
+
if "recommendations" in stats:
|
|
323
|
+
self.logger.info(" Recommendations:")
|
|
324
|
+
for rec in stats["recommendations"]:
|
|
325
|
+
self.logger.info(f" • {rec}")
|
|
326
|
+
|
|
274
327
|
async def close(self):
|
|
275
328
|
"""Clean up resources"""
|
|
329
|
+
# Log final statistics before cleanup
|
|
330
|
+
self.log_part_count_summary()
|
|
276
331
|
# Vertex AI doesn't require explicit cleanup
|
|
277
332
|
self._initialized = False
|
|
@@ -142,7 +142,7 @@ async def lifespan(app: FastAPI):
|
|
|
142
142
|
app = FastAPI(
|
|
143
143
|
title="AIECS - AI Execute Services",
|
|
144
144
|
description="Middleware service for AI-powered task execution and tool orchestration",
|
|
145
|
-
version="1.3.
|
|
145
|
+
version="1.3.5",
|
|
146
146
|
lifespan=lifespan
|
|
147
147
|
)
|
|
148
148
|
|
|
@@ -167,7 +167,7 @@ async def health_check():
|
|
|
167
167
|
return {
|
|
168
168
|
"status": "healthy",
|
|
169
169
|
"service": "aiecs",
|
|
170
|
-
"version": "1.3.
|
|
170
|
+
"version": "1.3.5"
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
|
|
@@ -28,7 +28,7 @@ pytest-timeout = "^2.4.0"
|
|
|
28
28
|
|
|
29
29
|
[project]
|
|
30
30
|
name = "aiecs"
|
|
31
|
-
version = "1.3.
|
|
31
|
+
version = "1.3.5"
|
|
32
32
|
description = "AI Execute Services - A middleware framework for AI-powered task execution and tool orchestration"
|
|
33
33
|
authors = [
|
|
34
34
|
{name = "AIECS Team", email = "iretbl@gmail.com"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md
RENAMED
|
File without changes
|
|
File without changes
|
{aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py
RENAMED
|
File without changes
|
{aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh
RENAMED
|
File without changes
|
{aiecs-1.3.4 → aiecs-1.3.5}/aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|