aiecs 1.7.6__py3-none-any.whl → 1.7.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of aiecs might be problematic. Click here for more details.

@@ -798,13 +798,18 @@ class DocumentParserTool(BaseTool):
798
798
  raise UnsupportedDocumentError("ImageTool not available for image OCR")
799
799
 
800
800
  try:
801
- # Use image tool for OCR
802
- ocr_result = self.image_tool.ocr_image(file_path)
801
+ # Use image tool for OCR - the ocr method returns a string directly
802
+ ocr_text = self.image_tool.ocr(file_path=file_path)
803
803
 
804
804
  if strategy == ParsingStrategy.TEXT_ONLY:
805
- return ocr_result.get("text", "")
805
+ return ocr_text
806
806
  else:
807
- return ocr_result
807
+ # Return structured result for other strategies
808
+ return {
809
+ "text": ocr_text,
810
+ "file_path": file_path,
811
+ "document_type": DocumentType.IMAGE,
812
+ }
808
813
 
809
814
  except Exception as e:
810
815
  raise ParseError(f"Failed to parse image document: {str(e)}")
@@ -32,6 +32,8 @@ class DocumentFormat(str, Enum):
32
32
  PDF = "pdf"
33
33
  DOCX = "docx"
34
34
  XLSX = "xlsx"
35
+ PPTX = "pptx"
36
+ PPT = "ppt"
35
37
  BINARY = "binary"
36
38
 
37
39
 
@@ -214,6 +216,9 @@ class DocumentWriterTool(BaseTool):
214
216
  # Initialize cloud storage
215
217
  self._init_cloud_storage()
216
218
 
219
+ # Initialize office tool for PPTX/DOCX writing
220
+ self._init_office_tool()
221
+
217
222
  # Initialize content validators
218
223
  self._init_validators()
219
224
 
@@ -260,6 +265,17 @@ class DocumentWriterTool(BaseTool):
260
265
  self.logger.warning(f"Cloud storage initialization failed: {e}")
261
266
  self.file_storage = None
262
267
 
268
+ def _init_office_tool(self):
269
+ """Initialize office tool for PPTX/DOCX writing"""
270
+ try:
271
+ from aiecs.tools.task_tools.office_tool import OfficeTool
272
+
273
+ self.office_tool = OfficeTool()
274
+ self.logger.info("OfficeTool initialized successfully for PPTX/DOCX support")
275
+ except ImportError:
276
+ self.logger.warning("OfficeTool not available, PPTX/DOCX writing will be limited")
277
+ self.office_tool = None
278
+
263
279
  def _init_validators(self):
264
280
  """Initialize content validators"""
265
281
  self.validators = {
@@ -722,6 +738,14 @@ class DocumentWriterTool(BaseTool):
722
738
  """Write to local file system with atomic operation"""
723
739
 
724
740
  try:
741
+ # Handle PPTX format using office_tool
742
+ if format in [DocumentFormat.PPTX, DocumentFormat.PPT]:
743
+ return self._write_pptx_file(target_path, content, plan)
744
+
745
+ # Handle DOCX format using office_tool
746
+ if format == DocumentFormat.DOCX:
747
+ return self._write_docx_file(target_path, content, plan)
748
+
725
749
  # Create parent directories
726
750
  os.makedirs(os.path.dirname(target_path), exist_ok=True)
727
751
 
@@ -789,6 +813,161 @@ class DocumentWriterTool(BaseTool):
789
813
  except Exception as e:
790
814
  raise StorageError(f"Local file write failed: {e}")
791
815
 
816
+ def _write_pptx_file(self, target_path: str, content: Union[str, bytes], plan: Dict) -> Dict:
817
+ """Write content to PPTX file using office_tool"""
818
+ if not self.office_tool:
819
+ raise StorageError("OfficeTool not available. Cannot write PPTX files.")
820
+
821
+ try:
822
+ # Convert bytes to string if needed
823
+ if isinstance(content, bytes):
824
+ content_str = content.decode("utf-8")
825
+ else:
826
+ content_str = str(content)
827
+
828
+ # Parse content to extract slides
829
+ slides = self._parse_content_to_slides(content_str)
830
+
831
+ # Handle append mode
832
+ if plan["mode"] == WriteMode.APPEND and plan["file_exists"]:
833
+ # Read existing slides
834
+ existing_slides = self.office_tool.read_pptx(target_path)
835
+ slides = existing_slides + slides
836
+
837
+ # Use office_tool to write PPTX
838
+ result = self.office_tool.write_pptx(
839
+ slides=slides,
840
+ output_path=target_path,
841
+ image_path=None,
842
+ )
843
+
844
+ if not result.get("success"):
845
+ raise StorageError(f"Failed to write PPTX file: {result}")
846
+
847
+ # Get file stats
848
+ stat = os.stat(target_path)
849
+
850
+ return {
851
+ "path": target_path,
852
+ "size": stat.st_size,
853
+ "checksum": self._calculate_file_checksum(target_path),
854
+ "modified_time": datetime.fromtimestamp(stat.st_mtime).isoformat(),
855
+ "atomic_write": False, # Office tool handles its own atomicity
856
+ }
857
+
858
+ except Exception as e:
859
+ raise StorageError(f"PPTX file write failed: {e}")
860
+
861
+ def _write_docx_file(self, target_path: str, content: Union[str, bytes], plan: Dict) -> Dict:
862
+ """Write content to DOCX file using office_tool"""
863
+ if not self.office_tool:
864
+ raise StorageError("OfficeTool not available. Cannot write DOCX files.")
865
+
866
+ try:
867
+ # Convert bytes to string if needed
868
+ if isinstance(content, bytes):
869
+ content_str = content.decode("utf-8")
870
+ else:
871
+ content_str = str(content)
872
+
873
+ # Handle append mode
874
+ if plan["mode"] == WriteMode.APPEND and plan["file_exists"]:
875
+ # Read existing content
876
+ existing_doc = self.office_tool.read_docx(target_path)
877
+ existing_text = "\n".join(existing_doc.get("paragraphs", []))
878
+ content_str = existing_text + "\n" + content_str
879
+
880
+ # Use office_tool to write DOCX
881
+ result = self.office_tool.write_docx(
882
+ text=content_str,
883
+ output_path=target_path,
884
+ table_data=None,
885
+ )
886
+
887
+ if not result.get("success"):
888
+ raise StorageError(f"Failed to write DOCX file: {result}")
889
+
890
+ # Get file stats
891
+ stat = os.stat(target_path)
892
+
893
+ return {
894
+ "path": target_path,
895
+ "size": stat.st_size,
896
+ "checksum": self._calculate_file_checksum(target_path),
897
+ "modified_time": datetime.fromtimestamp(stat.st_mtime).isoformat(),
898
+ "atomic_write": False, # Office tool handles its own atomicity
899
+ }
900
+
901
+ except Exception as e:
902
+ raise StorageError(f"DOCX file write failed: {e}")
903
+
904
+ def _parse_content_to_slides(self, content: str) -> List[str]:
905
+ """Parse content string into list of slide contents
906
+
907
+ Supports multiple slide separation formats:
908
+ - "---" separator (markdown style)
909
+ - "## Slide X:" headers
910
+ - Empty lines between slides
911
+ """
912
+ slides = []
913
+
914
+ # Split by "---" separator (common in markdown presentations)
915
+ if "---" in content:
916
+ parts = content.split("---")
917
+ for part in parts:
918
+ part = part.strip()
919
+ if part:
920
+ # Remove slide headers like "## Slide X: Title"
921
+ lines = part.split("\n")
922
+ cleaned_lines = []
923
+ for line in lines:
924
+ # Skip slide headers
925
+ if line.strip().startswith("## Slide") and ":" in line:
926
+ continue
927
+ cleaned_lines.append(line)
928
+ slide_content = "\n".join(cleaned_lines).strip()
929
+ if slide_content:
930
+ slides.append(slide_content)
931
+ else:
932
+ # Try to split by "## Slide" headers
933
+ if "## Slide" in content:
934
+ parts = content.split("## Slide")
935
+ for i, part in enumerate(parts):
936
+ if i == 0:
937
+ # First part might be title slide
938
+ part = part.strip()
939
+ if part:
940
+ slides.append(part)
941
+ else:
942
+ # Extract content after "Slide X: Title"
943
+ lines = part.split("\n", 1)
944
+ if len(lines) > 1:
945
+ slide_content = lines[1].strip()
946
+ if slide_content:
947
+ slides.append(slide_content)
948
+ else:
949
+ # Fallback: split by double newlines (paragraph breaks)
950
+ parts = content.split("\n\n")
951
+ current_slide = []
952
+ for part in parts:
953
+ part = part.strip()
954
+ if part:
955
+ # If it's a header, start a new slide
956
+ if part.startswith("#"):
957
+ if current_slide:
958
+ slides.append("\n".join(current_slide))
959
+ current_slide = []
960
+ current_slide.append(part)
961
+
962
+ if current_slide:
963
+ slides.append("\n".join(current_slide))
964
+
965
+ # If no slides found, create a single slide with all content
966
+ if not slides:
967
+ slides = [content.strip()] if content.strip() else [""]
968
+
969
+ return slides
970
+
792
971
  async def _write_to_cloud_storage(
793
972
  self,
794
973
  target_path: str,
@@ -148,6 +148,10 @@ class ImageTool(BaseTool):
148
148
  description="Allowed image file extensions",
149
149
  )
150
150
  tesseract_pool_size: int = Field(default=2, description="Number of Tesseract processes for OCR")
151
+ default_ocr_language: str = Field(
152
+ default="eng",
153
+ description="Default OCR language code (e.g., 'eng', 'chi_sim'). Supports multi-language format like 'eng+chi_sim'"
154
+ )
151
155
 
152
156
  # Schema definitions
153
157
  class LoadSchema(BaseFileSchema):
@@ -159,7 +163,10 @@ class ImageTool(BaseTool):
159
163
  """Schema for ocr operation"""
160
164
 
161
165
  file_path: str = Field(description="Path to the image file for OCR text extraction")
162
- lang: Optional[str] = Field(default=None, description="Optional language code for OCR (e.g., 'eng', 'chi_sim'). Uses default 'eng' if not specified")
166
+ lang: Optional[str] = Field(
167
+ default=None,
168
+ description="Optional language code for OCR (e.g., 'eng', 'chi_sim', 'eng+chi_sim'). If not specified, uses the configured default_ocr_language"
169
+ )
163
170
 
164
171
  class MetadataSchema(BaseFileSchema):
165
172
  """Schema for metadata operation"""
@@ -228,10 +235,16 @@ class ImageTool(BaseTool):
228
235
 
229
236
  Configuration is automatically loaded by BaseTool from:
230
237
  1. Explicit config dict (highest priority)
231
- 2. YAML config files (config/tools/image.yaml)
232
- 3. Environment variables (via dotenv from .env files)
238
+ 2. YAML config files (config/tools/image.yaml, config/tools/image_tool.yaml, or config/tools/ImageTool.yaml)
239
+ 3. Environment variables (via dotenv from .env files with IMAGE_TOOL_ prefix)
233
240
  4. Tool defaults (lowest priority)
241
+
242
+ YAML configuration files are automatically discovered by ToolConfigLoader using multiple naming conventions.
243
+ See examples/config/tools/image_tool.yaml.example for a configuration template.
234
244
  """
245
+ # Pass tool_name="image" to BaseTool so it can find config/tools/image.yaml
246
+ if "tool_name" not in kwargs:
247
+ kwargs["tool_name"] = "image"
235
248
  super().__init__(config, **kwargs)
236
249
 
237
250
  # Configuration is automatically loaded by BaseTool into self._config_obj
@@ -298,11 +311,12 @@ class ImageTool(BaseTool):
298
311
 
299
312
  def ocr(self, file_path: str, lang: Optional[str] = None) -> str:
300
313
  """
301
- Extract text from an image using a pooled Tesseract process.
314
+ Extract text from an image using Tesseract OCR.
302
315
 
303
316
  Args:
304
317
  file_path (str): Path to the image file.
305
- lang (Optional[str]): Language code for OCR (e.g., 'eng').
318
+ lang (Optional[str]): Language code for OCR (e.g., 'eng', 'chi_sim', 'eng+chi_sim').
319
+ If not specified, uses the configured default_ocr_language.
306
320
 
307
321
  Returns:
308
322
  str: Extracted text.
@@ -312,23 +326,44 @@ class ImageTool(BaseTool):
312
326
  """
313
327
  # Validate input using schema
314
328
  validated_input = self.OcrSchema(file_path=file_path, lang=lang)
329
+
330
+ # Use configured default language if lang is not specified
331
+ ocr_lang = lang if lang is not None else self.config.default_ocr_language
315
332
 
316
- proc = self._tesseract_manager.get_process()
317
- if not proc:
318
- raise FileOperationError(f"ocr: No Tesseract processes available (lang: {lang or 'eng'})")
333
+ # Prepare temporary file for image processing
319
334
  with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
320
335
  temp_path = temp_file.name
321
336
  try:
337
+ # Preprocess image for better OCR results
322
338
  img = Image.open(validated_input.file_path).convert("L").filter(ImageFilter.SHARPEN)
323
339
  img.save(temp_path)
324
- stdout, stderr = proc.communicate(input=temp_path, timeout=30)
325
- if proc.returncode != 0:
326
- raise FileOperationError(f"ocr: Tesseract failed for '{file_path}' (lang: {lang or 'eng'}): {stderr}")
327
- return stdout.strip()
340
+
341
+ # Call Tesseract with dynamic language parameter
342
+ # Use subprocess.run instead of process pool to support dynamic languages
343
+ try:
344
+ result = subprocess.run(
345
+ ["tesseract", "--oem", "1", temp_path, "stdout", "-l", ocr_lang],
346
+ capture_output=True,
347
+ text=True,
348
+ timeout=30,
349
+ check=False, # Don't raise on non-zero return code, handle manually
350
+ )
351
+ except subprocess.TimeoutExpired:
352
+ raise FileOperationError(f"ocr: Tesseract timeout for '{file_path}' (lang: {ocr_lang})")
353
+ except FileNotFoundError:
354
+ raise FileOperationError("ocr: Tesseract not found. Please install Tesseract OCR.")
355
+
356
+ if result.returncode != 0:
357
+ raise FileOperationError(
358
+ f"ocr: Tesseract failed for '{file_path}' (lang: {ocr_lang}): {result.stderr}"
359
+ )
360
+
361
+ return result.stdout.strip()
362
+ except FileOperationError:
363
+ raise # Re-raise FileOperationError as-is
328
364
  except Exception as e:
329
- raise FileOperationError(f"ocr: Failed to process '{file_path}' (lang: {lang or 'eng'}): {e}")
365
+ raise FileOperationError(f"ocr: Failed to process '{file_path}' (lang: {ocr_lang}): {e}")
330
366
  finally:
331
- self._tesseract_manager.return_process(proc)
332
367
  if os.path.exists(temp_path):
333
368
  try:
334
369
  os.unlink(temp_path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiecs
3
- Version: 1.7.6
3
+ Version: 1.7.17
4
4
  Summary: AI Execute Services - A middleware framework for AI-powered task execution and tool orchestration
5
5
  Author-email: AIECS Team <iretbl@gmail.com>
6
6
  License-Expression: MIT
@@ -1,7 +1,7 @@
1
- aiecs/__init__.py,sha256=9Q2bXVfdJxuXuad_JyKZLZJFxzZlxcIoHPvxEtofzIQ,1836
1
+ aiecs/__init__.py,sha256=E2PYbWAzU7vTEUbmirpTecpqae3VBiyuZsyNM2KQ3h0,1837
2
2
  aiecs/__main__.py,sha256=SUsWL1jOdR3zv6yOi1dAdNH4wvzSVg07Vhlb6I9-bQY,1048
3
3
  aiecs/aiecs_client.py,sha256=CjSeiPZ9X0u6xkJcpVRXmCbIm0Wqyx3ejl7o7CaTzUI,18039
4
- aiecs/main.py,sha256=lGgmS9oeW5FbRM-cjiPQpPYIHD5AMAbMy6iPI5O8dnc,10720
4
+ aiecs/main.py,sha256=zYHFgadRkqvbzGBwargGVKHIxWDNm5EkMv3REMGiY6s,10722
5
5
  aiecs/application/__init__.py,sha256=NkmrUH1DqxJ3vaVC8QwscNdlWqHfC7ZagL4k3nZ_qz4,192
6
6
  aiecs/application/executors/__init__.py,sha256=WIl7L9HBsEhNfbNtJdvBvFUJXzESvNZVaiAA6tdtJcs,191
7
7
  aiecs/application/executors/operation_executor.py,sha256=WXPLnSYesTrkyVMd5HbOKG705k4eJiEV8200-ZSL0L8,14798
@@ -78,7 +78,7 @@ aiecs/common/knowledge_graph/runnable.py,sha256=BLsV9HHfO4lT3_LkFQbf_rUT_iXloZi4
78
78
  aiecs/config/__init__.py,sha256=aQk0xVquxBZmLTol8wvF4Jv8Yl9G6qyMvA1RL_JE99k,974
79
79
  aiecs/config/config.py,sha256=jI5d4xLbU-7NoUcQIydpB9CCKUFyXElJt_OENaHGy_8,33657
80
80
  aiecs/config/graph_config.py,sha256=9-Xrgd1kswfoIep5nzKmVhEz2vPENqtm_l9nZkXLXL0,3993
81
- aiecs/config/tool_config.py,sha256=NP2svAyge6llJ68C4e7wesqaf_Ow7aC44y8guftJz64,14821
81
+ aiecs/config/tool_config.py,sha256=iuMBlHlNWoXzcXxVaGuU1BOruh0yQbAZtPTrAqkNPkQ,16301
82
82
  aiecs/core/__init__.py,sha256=WnY-iEE0BpdRg26vVSCILvERzcXg6kajS4IiO2-NovI,1471
83
83
  aiecs/core/interface/__init__.py,sha256=BwngZE6IqA7UBql71C5mCgVhfzmDtdZKFM7Dd3KIlTM,690
84
84
  aiecs/core/interface/execution_interface.py,sha256=4_aqjLPhPvLFq-EsVHLlzlLJw6IoKw49fv8Zeh3iMpY,4618
@@ -87,14 +87,14 @@ aiecs/core/registry/__init__.py,sha256=Dd0UspDS1RLCIawmKN8w9rQa4Nx-vVE6yHNhGEMne
87
87
  aiecs/core/registry/service_registry.py,sha256=RqKh4C7X3TJlJRBiT9tNZnwFIcXux05BSPTG6Mxswus,2445
88
88
  aiecs/domain/__init__.py,sha256=hRyDL-WbPk16S0abxtMdPY0vzU3qaHRV2REYRo_fHiU,6854
89
89
  aiecs/domain/agent/__init__.py,sha256=yMDE7r_z8EHGmteWc4E9JoNBVRgeR72VNU7p3c5Oblg,4084
90
- aiecs/domain/agent/base_agent.py,sha256=Evnt_qEoIJXRcy7pxRxC4fTE49xxuIFzGyr999_GHF4,144346
90
+ aiecs/domain/agent/base_agent.py,sha256=r6jn8Ux9FswRAYXSx8IrsB_SigeCC5VebPLCb7OmJMk,148078
91
91
  aiecs/domain/agent/exceptions.py,sha256=axBRJebHP_JpMfjDstOGRxRXsvPXpmZ78Tccv5TxUs0,2951
92
92
  aiecs/domain/agent/graph_aware_mixin.py,sha256=1LScf_JuAU67JtuUgoL7DRCQ6WNJA66-U7AXdgEms1Q,18665
93
- aiecs/domain/agent/hybrid_agent.py,sha256=lSvI6VpAllwECCuw4eYSA-ZSyYJsfa6xHRz8t7L8TKI,55909
93
+ aiecs/domain/agent/hybrid_agent.py,sha256=EmuAqUZvlPiquMhHiAEsG0N9ZEi3qqhNXGj5rVlfDD4,72468
94
94
  aiecs/domain/agent/knowledge_aware_agent.py,sha256=xkCY12RFK1cNwrRdFGIOKkX6BuwBFO0jIjRRCCsn-ew,74013
95
95
  aiecs/domain/agent/lifecycle.py,sha256=Mqi0YJYBsTfsD-NC0EZOA1Di889qrnRPzQAehxZO32M,8719
96
96
  aiecs/domain/agent/llm_agent.py,sha256=Aj6MvoiKTC8Qxfm6JtCruz77onLa5qUah98SituU8XU,24592
97
- aiecs/domain/agent/models.py,sha256=5NKFX3hYOrAe1uNCxUjBR8PErCTpaLzLQqcwSuMeNwk,35759
97
+ aiecs/domain/agent/models.py,sha256=c7cgW5Oydw86zcfT39CctByWTuZk2FpvWLFjpWjd9pw,36751
98
98
  aiecs/domain/agent/observability.py,sha256=BjCzX0f7GJkusEYsYrVZKFXuIoRO9kH3wgVgHb-W5T0,13806
99
99
  aiecs/domain/agent/persistence.py,sha256=Qfd8LWR9am4vueJp5eAjjBKuPxlbGsOScSQkUbIwt84,14399
100
100
  aiecs/domain/agent/registry.py,sha256=IvPJeFi7PY2Av8qzywGqhLmycR96k5PA8YVCVxnKvqg,6841
@@ -115,7 +115,7 @@ aiecs/domain/agent/prompts/builder.py,sha256=uWkuBbLSk1leQu4Lx82_gZQ1CxlOFZOevgg
115
115
  aiecs/domain/agent/prompts/formatters.py,sha256=VuH42B02TUM5EP0aEyXVbdwD3xhuDQvsFpFz1R7s61c,4596
116
116
  aiecs/domain/agent/prompts/template.py,sha256=5hLTJKGUa9I1DTsfL7HhErG1wXTe18jVBanCXqYUL2U,7365
117
117
  aiecs/domain/agent/tools/__init__.py,sha256=fdeZxTqlimXuDjAoEEKmYRXhQK3Gyba2rIDU4JE2jVE,239
118
- aiecs/domain/agent/tools/schema_generator.py,sha256=ydDIXmd0zm03c60n4vWIUthXgc2Yf4gBAmoYuNge0pA,12613
118
+ aiecs/domain/agent/tools/schema_generator.py,sha256=r7TP0h8qAkRAkVFygEng8Wkr5lU90WfZlgtObuHQGE0,13290
119
119
  aiecs/domain/community/__init__.py,sha256=CcS5o6dpRM7NWm0HCl3d6MeDunwAQ1IABZlEVAQAZnU,3587
120
120
  aiecs/domain/community/agent_adapter.py,sha256=3WeIPeOTgLEvjnv-Ee8oqL3mzh8R1r4CQfm8uqM4OA8,15139
121
121
  aiecs/domain/community/analytics.py,sha256=CUczcN_cB7qatbeJYPVTbxb9vF9MDtZO1UkYXSrP5-o,17607
@@ -195,18 +195,18 @@ aiecs/infrastructure/persistence/database_manager.py,sha256=Oe8Sl-itZBs7bGKcM_50
195
195
  aiecs/infrastructure/persistence/file_storage.py,sha256=4cZ8AbPMdajfJHUL8ZnuVuLRm7gW74HNQl1fUyfJ90A,26838
196
196
  aiecs/infrastructure/persistence/redis_client.py,sha256=oL2C2wmDJC5lFpTEfPle7a1-lvP-3TBxPTIyrskpTlk,7569
197
197
  aiecs/llm/__init__.py,sha256=vLn52v1LQgz75iZy6CvTb_vq5rMYbpZFZMFPKxJV-1k,2183
198
- aiecs/llm/client_factory.py,sha256=E-k680cT0EEJcsSZK0hS0GRN7IclpUSMziQFnliNO8U,19715
198
+ aiecs/llm/client_factory.py,sha256=in7ZyKxHHdz1jqD8jA0TOeZoT9VRE0M8NC4j97JFTGA,20031
199
199
  aiecs/llm/client_resolver.py,sha256=rRyHYajOk6YpsTRJJW6Y2FwWwpJLe0b77ncaJXX2fwU,5075
200
200
  aiecs/llm/protocols.py,sha256=8Qj7ryOGQ07_j5Xd-UHsIU9wiBU1BxLE-tdzf_bj__4,4516
201
201
  aiecs/llm/callbacks/__init__.py,sha256=u02K5Tvlu-87NXxYzXuxFHuhHAF4OPIje_IvPIF93Lw,191
202
202
  aiecs/llm/callbacks/custom_callbacks.py,sha256=g87NK2Zpgvpd_-6PLRFG_fTgIYqGucWL_xEnuU3Kq0g,9904
203
203
  aiecs/llm/clients/__init__.py,sha256=GaUkYc0mnKrsBceGrjDZ3K6LZUVxGxHqxjB9zSxWRq8,822
204
- aiecs/llm/clients/base_client.py,sha256=6Cg1gdTMDc3PcNtA216Th_XjzGZHyHyZhGN3pqg0hGo,10972
205
- aiecs/llm/clients/google_function_calling_mixin.py,sha256=qss9Kn40-hXHdaHzxjNCiKvOjPr8rtDpQnfW6GSlVYA,17995
206
- aiecs/llm/clients/googleai_client.py,sha256=ha5yaS4eyFGvjttqkKbg-vtoeWyYiNIidJzUzGoBe5M,9202
204
+ aiecs/llm/clients/base_client.py,sha256=8L3C9dK3-cHqVCLGISBZIA89j36HM_2G5mhpmvTskbY,11144
205
+ aiecs/llm/clients/google_function_calling_mixin.py,sha256=od9-kgnhKtqJc_b-M0Xi2VGAlu8QwGR5MyXt0XpoxdM,16636
206
+ aiecs/llm/clients/googleai_client.py,sha256=c5tPbKQS8JVE687CYP_izStf4x0upgyyBT6eNmXOqcQ,12039
207
207
  aiecs/llm/clients/openai_client.py,sha256=sgrYM7KGfCKNOe-wtz3fwVhG27VqYCvnz2hQggt12oM,5582
208
208
  aiecs/llm/clients/openai_compatible_mixin.py,sha256=uJfycFcDF8Zlv5x2xAVVB0n6mUND4IcJ1pEInaxHB1s,14463
209
- aiecs/llm/clients/vertex_client.py,sha256=eHnxraUThJY5BWwJ8p4Cjj9qD80-AFrd20KCexswc3c,40925
209
+ aiecs/llm/clients/vertex_client.py,sha256=z-3bfsS9yyZwKyyC5159PmzWMlYMscSHx7nKD8Pq1Bk,54527
210
210
  aiecs/llm/clients/xai_client.py,sha256=mJW8hV12FcJtI8nhU34NV-by5o4Xhzv-Ua3Go8ET1kQ,7172
211
211
  aiecs/llm/config/__init__.py,sha256=LCPZXrV4-zUMh6IS32WaUBMT43pSF8dqbhqH3xBcwJU,1107
212
212
  aiecs/llm/config/config_loader.py,sha256=Jhd6y4FyMQO73Mwv45Qq--pmPh8XRAzbVxi1xqAgWF8,8653
@@ -278,10 +278,10 @@ aiecs/tools/docs/__init__.py,sha256=PBSBqnPPCbPfKF4CFc49uTcdxf36i0aBp7gNeD2166w,
278
278
  aiecs/tools/docs/ai_document_orchestrator.py,sha256=i_wCs_OzzwSvZKdkP_JRkXiUGWO1levkqbRIKSGynLI,24966
279
279
  aiecs/tools/docs/ai_document_writer_orchestrator.py,sha256=tss4kbYW378rqIET_F3XqDpl2iIZHoiP0WqW_nRx_HQ,95313
280
280
  aiecs/tools/docs/content_insertion_tool.py,sha256=3ojzrByhFY4PhWImHWfXQ5eG5S3Z6nHMU7YgwQc9piE,48968
281
- aiecs/tools/docs/document_creator_tool.py,sha256=wJHq-4gHveNDKdzYcE2S0P72xOI_C53F3oiVxCYxwhU,40929
281
+ aiecs/tools/docs/document_creator_tool.py,sha256=RYsHNZopWx1KE24O-_tCjSHgUiDheS14G0_1WcDUsT0,46857
282
282
  aiecs/tools/docs/document_layout_tool.py,sha256=FSi1REQlGyqhIkZcHpr2dwaIXuR_iZVsJk_nFwEJGDw,44761
283
- aiecs/tools/docs/document_parser_tool.py,sha256=LuCagJoJ82Foce9C-qIH7NsJ-dyznY46evMrldfMRQA,40449
284
- aiecs/tools/docs/document_writer_tool.py,sha256=4fseSoFsSRrZOvfYMLQQ1hz9-ooDWwmaFZK3o4JXgy8,70878
283
+ aiecs/tools/docs/document_parser_tool.py,sha256=vJQzR-SE7TrWwy2YwbUEkk5lJAx9ej6Zs95qTGscix8,40688
284
+ aiecs/tools/docs/document_writer_tool.py,sha256=CYYBiSBRX2_fsoe1LXGPKpjWQ92Sj9o88BSSt7koRgI,78079
285
285
  aiecs/tools/knowledge_graph/__init__.py,sha256=-UEMSWpQ6IJFPU6RkKQ4TIckf2iSbPTAVdjy2X_sWOk,430
286
286
  aiecs/tools/knowledge_graph/graph_reasoning_tool.py,sha256=ntuF7JlCXum_Ajaa977rWR9OfXh5WgwxYIRVfZg9arg,32650
287
287
  aiecs/tools/knowledge_graph/graph_search_tool.py,sha256=Td7LTKsobvXnSugw6o62BNsqghQuZ8OSSkKTfLLy9H0,34365
@@ -310,7 +310,7 @@ aiecs/tools/statistics/statistical_analyzer_tool.py,sha256=c62Y2RURvy6nSttS9Nvyb
310
310
  aiecs/tools/task_tools/__init__.py,sha256=q9sqlTm7Acxbr8YQ5fVCREEi-8GxdENh6zAv-lKjLY8,2826
311
311
  aiecs/tools/task_tools/chart_tool.py,sha256=FGbE6slb5nFSkdGqfJNsNsnHMSE2codo0hYfrhfX3u4,27153
312
312
  aiecs/tools/task_tools/classfire_tool.py,sha256=FLkUUTFPlgzliVsfpS4zR1frppnIWNQj4u6hyqazdkA,32457
313
- aiecs/tools/task_tools/image_tool.py,sha256=VjyyiIM-UKwr4n9wDPsiH0jCOqB5IB4vk2cUJoTuZSI,16856
313
+ aiecs/tools/task_tools/image_tool.py,sha256=UYfONlOuWkhtlaxYhTpOZV8GZ65crxw3v7aql_jiN8s,18610
314
314
  aiecs/tools/task_tools/office_tool.py,sha256=0Nw5ppP9sXnnk65yVt9BQYy3Nil8Td33N6ue2qcUJoU,26264
315
315
  aiecs/tools/task_tools/pandas_tool.py,sha256=5MHoVz24p178xBZPhIo_dsiej4645jmZvEiy_i0e1mo,41832
316
316
  aiecs/tools/task_tools/report_tool.py,sha256=8vIoFLfQvmOjUhFoht2tyZ5Wq7DqsPfXvx0lzORnxs0,34934
@@ -329,9 +329,9 @@ aiecs/utils/prompt_loader.py,sha256=iNBNeUSnvbSE1SrllOlBllDdQXtfzq5dO5rjkcFEsSw,
329
329
  aiecs/utils/token_usage_repository.py,sha256=gFTu-AHawFmScq35T3ib5pTElZrXezu3ijxRRCxW6vc,10497
330
330
  aiecs/ws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
331
331
  aiecs/ws/socket_server.py,sha256=4jJBx93DEOKs2JO-gZAH9R_MfMTVtLLTLtyYnRyCVew,1591
332
- aiecs-1.7.6.dist-info/licenses/LICENSE,sha256=_1YRaIS0eZu1pv6xfz245UkU0i1Va2B841hv3OWRwqg,12494
333
- aiecs-1.7.6.dist-info/METADATA,sha256=Q5RK9kLDHU_92m4smP_lDmnFL7BjzSYrjqLJVsPWlR8,18100
334
- aiecs-1.7.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
335
- aiecs-1.7.6.dist-info/entry_points.txt,sha256=t_mIkFuLDmK-2si0thMfgK0WIBg-Ub94V3MchpWMaAs,899
336
- aiecs-1.7.6.dist-info/top_level.txt,sha256=22IlUlOqh9Ni3jXlQNMNUqzbW8dcxXPeR_EQ-BJVcV8,6
337
- aiecs-1.7.6.dist-info/RECORD,,
332
+ aiecs-1.7.17.dist-info/licenses/LICENSE,sha256=_1YRaIS0eZu1pv6xfz245UkU0i1Va2B841hv3OWRwqg,12494
333
+ aiecs-1.7.17.dist-info/METADATA,sha256=EJfH7jPBLmDasjx0k48dHRWQmtb6iNhwxlPSbFntMXQ,18101
334
+ aiecs-1.7.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
335
+ aiecs-1.7.17.dist-info/entry_points.txt,sha256=t_mIkFuLDmK-2si0thMfgK0WIBg-Ub94V3MchpWMaAs,899
336
+ aiecs-1.7.17.dist-info/top_level.txt,sha256=22IlUlOqh9Ni3jXlQNMNUqzbW8dcxXPeR_EQ-BJVcV8,6
337
+ aiecs-1.7.17.dist-info/RECORD,,
File without changes