xgae 0.1.12__py3-none-any.whl → 0.1.13__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 xgae might be problematic. Click here for more details.

@@ -113,15 +113,20 @@ class XGAMcpToolBox(XGAToolBox):
113
113
  async with self._mcp_client.session(server_name) as session:
114
114
  tools = await load_mcp_tools(session)
115
115
  mcp_tool = next((t for t in tools if t.name == tool_name), None)
116
-
116
+ is_general_tool = False
117
117
  if mcp_tool:
118
118
  tool_args = args or {}
119
119
  if server_name == self.GENERAL_MCP_SERVER_NAME:
120
120
  tool_args = dict({"task_id": task_id}, **tool_args)
121
+ is_general_tool = True
121
122
 
122
123
  try:
123
124
  tool_result = await mcp_tool.arun(tool_args)
124
- result = XGAToolResult(success=True, output=str(tool_result))
125
+ if is_general_tool:
126
+ tool_result = json.loads(tool_result)
127
+ result = XGAToolResult(success=tool_result['success'], output=str(tool_result['output']))
128
+ else:
129
+ result = XGAToolResult(success=True, output=str(tool_result))
125
130
  except Exception as e:
126
131
  error = f"Call mcp tool '{tool_name}' error: {str(e)}"
127
132
  logging.error(f"McpToolBox call_tool: {error}")
@@ -2,7 +2,7 @@ import logging
2
2
 
3
3
  from typing import List, Dict, Any, AsyncGenerator, override,Optional
4
4
 
5
- from xgae.utils import handle_error
5
+ from xgae.utils import log_trace
6
6
  from xgae.utils.json_helpers import format_for_yield
7
7
 
8
8
  from xgae.engine.responser.responser_base import TaskResponseProcessor, TaskResponserContext, TaskRunContinuousState
@@ -88,11 +88,10 @@ class NonStreamTaskResponser(TaskResponseProcessor):
88
88
  finish_msg = self.add_response_message(type="status", content=finish_content, is_llm_message=False)
89
89
  yield format_for_yield(finish_msg)
90
90
  except Exception as e:
91
- logging.error(f"NonStreamResp: Process response llm_content: {llm_content}")
92
- handle_error(e)
91
+ trace = log_trace(e, f"NonStreamResp: Process response llm_content:\n {llm_content}")
93
92
  self.root_span.event(name="non_stream_process_response_error", level="ERROR",
94
93
  status_message=f"Process non-streaming response error: {e}",
95
- metadata={"content": llm_content})
94
+ metadata={"content": llm_content, "trace": trace})
96
95
 
97
96
  content = {"role": "system", "status_type": "error", "message": f"Process non-streaming response error: {e}"}
98
97
  error_msg = self.add_response_message(type="status", content=content, is_llm_message=False)
@@ -6,7 +6,7 @@ from abc import ABC, abstractmethod
6
6
  from dataclasses import dataclass
7
7
  from typing import List, Dict, Any, Optional, Tuple, Union, Literal, Callable, TypedDict, AsyncGenerator
8
8
 
9
- from xgae.utils import handle_error
9
+ from xgae.utils import log_trace
10
10
  from xgae.utils.json_helpers import safe_json_parse
11
11
  from xgae.utils.xml_tool_parser import XMLToolParser
12
12
 
@@ -174,10 +174,10 @@ class TaskResponseProcessor(ABC):
174
174
 
175
175
  pos = max(pos + 1, current_pos)
176
176
  except Exception as e:
177
- logging.error(f"TaskProcessor extract_xml_chunks: Error extracting XML chunks: {content}")
178
- handle_error(e)
177
+ trace = log_trace(e, f"TaskProcessor extract_xml_chunks: Error extracting XML chunks: {content}")
179
178
  self.root_span.event(name="task_process_extract_xml_chunk_error", level="ERROR",
180
- status_message=(f"Error extracting XML chunks: {e}"), metadata={"content": content})
179
+ status_message=f"Error extracting XML chunks: {e}",
180
+ metadata={"content": content, "trace": trace})
181
181
 
182
182
  return chunks
183
183
 
@@ -197,13 +197,13 @@ class TaskResponseProcessor(ABC):
197
197
 
198
198
  if not parsed_calls:
199
199
  logging.error(f"TaskProcessor parse_xml_tool_call: No tool calls found in XML chunk: {xml_chunk}")
200
- return
200
+ return None
201
201
 
202
202
  # Take the first tool call (should only be one per chunk)
203
203
  xml_tool_call = parsed_calls[0]
204
204
  if not xml_tool_call.function_name:
205
205
  logging.error(f"TaskProcessor parse_xml_tool_call: xml_tool_call function name is empty: {xml_tool_call}")
206
- return
206
+ return None
207
207
 
208
208
  # Convert to the expected format
209
209
  tool_call = {
@@ -222,10 +222,11 @@ class TaskResponseProcessor(ABC):
222
222
  # If not the expected <function_calls><invoke> format, return None
223
223
  logging.error(f"TaskProcessor parse_xml_tool_call: XML chunk does not contain expected <function_calls><invoke> format: {xml_chunk}")
224
224
  except Exception as e:
225
- logging.error(f"TaskProcessor parse_xml_tool_call: Error parsing XML chunk: {xml_chunk}")
226
- handle_error(e)
225
+ trace = log_trace(e, f"TaskProcessor parse_xml_tool_call: Error parsing XML chunk: {xml_chunk}")
227
226
  self.root_span.event(name="task_process_parsing_xml_chunk_error", level="ERROR",
228
- status_message=(f"Error parsing XML chunk: {e}"), metadata={"xml_chunk": xml_chunk})
227
+ status_message=f"Error parsing XML chunk: {e}",
228
+ metadata={"xml_chunk": xml_chunk, "trace": trace})
229
+ return None
229
230
 
230
231
  def _parse_xml_tool_calls(self, content: str) -> List[Dict[str, Any]]:
231
232
  """Parse XML tool calls from content string.
@@ -247,10 +248,10 @@ class TaskResponseProcessor(ABC):
247
248
  "parsing_details": parsing_details
248
249
  })
249
250
  except Exception as e:
250
- logging.warning(f"TaskProcessor parse_xml_tool_calls: Error parsing XML tool calls, xml_chunk: {xml_chunk}")
251
- handle_error(e)
251
+ trace = log_trace(e, f"TaskProcessor parse_xml_tool_calls: Error parsing XML tool calls, xml_chunk: {xml_chunk}")
252
252
  self.root_span.event(name="task_process_parse_xml_tool_calls_error", level="ERROR",
253
- status_message=(f"Error parsing XML tool calls: {e}"), metadata={"content": xml_chunk})
253
+ status_message=f"Error parsing XML tool calls: {e}",
254
+ metadata={"content": xml_chunk, "trace": trace})
254
255
 
255
256
  return parsed_data
256
257
 
@@ -261,51 +262,50 @@ class TaskResponseProcessor(ABC):
261
262
  exec_tool_span = self.root_span.span(name=f"execute_tool.{function_name}", input=tool_call["arguments"])
262
263
  try:
263
264
  arguments = tool_call["arguments"]
264
-
265
- logging.info(f"TaskProcessor execute_tool: Executing tool: {function_name} with arguments: {arguments}")
266
-
267
265
  if isinstance(arguments, str):
268
266
  try:
269
267
  arguments = safe_json_parse(arguments)
270
268
  except json.JSONDecodeError:
271
- arguments = {"text": arguments} # @todo modify
269
+ logging.warning(f"TaskProcessor execute_tool: Tool '{function_name}' arguments is not dict type, args={arguments}")
270
+ arguments = {"text": arguments} # useless
272
271
 
273
272
  result = None
274
273
  available_tool_names = self.tool_box.get_task_tool_names(self.task_id)
275
274
  if function_name in available_tool_names:
275
+ logging.info(f"TaskProcessor execute_tool: Tool '{function_name}' executing, args={arguments}")
276
276
  result = await self.tool_box.call_tool(self.task_id, function_name, arguments)
277
277
  else:
278
278
  logging.error(f"TaskProcessor execute_tool: Tool function '{function_name}' not found in toolbox")
279
279
  result = XGAToolResult(success=False, output=f"Tool function '{function_name}' not found")
280
280
 
281
- logging.info(f"TaskProcessor execute_tool: Tool execution complete: {function_name} -> {result}")
281
+ logging.info(f"TaskProcessor execute_tool: Tool '{function_name}' execution complete, result: {result}")
282
282
  exec_tool_span.update(status_message="tool_executed", output=result)
283
283
 
284
284
  return result
285
285
  except Exception as e:
286
- logging.error(f"TaskProcessor execute_tool: Error executing tool {function_name}")
286
+ trace = log_trace(e, f"TaskProcessor execute_tool: Executing tool {function_name}")
287
287
 
288
288
  exec_tool_span.update(status_message="task_process_tool_exec_error", level="ERROR",
289
- output=f"Error executing tool {function_name}, error: {str(e)}")
289
+ output=f"Error executing tool {function_name}, error: {str(e)}",
290
+ metadata={"trace": trace})
291
+
290
292
  return XGAToolResult(success=False, output=f"Executing tool {function_name}, error: {str(e)}")
291
293
 
292
- async def _execute_tools(
293
- self,
294
- tool_calls: List[Dict[str, Any]],
295
- execution_strategy: ToolExecutionStrategy = "sequential"
296
- ) -> List[Tuple[Dict[str, Any], XGAToolResult]]:
297
- logging.info(f"Executing {len(tool_calls)} tools with strategy: {execution_strategy}")
294
+ async def _execute_tools(self, tool_calls: List[Dict[str, Any]],
295
+ execution_strategy: ToolExecutionStrategy = "sequential"
296
+ ) -> List[Tuple[Dict[str, Any], XGAToolResult]]:
297
+ logging.info(f"TaskProcessor execute_tools: Executing {len(tool_calls)} tools with strategy '{execution_strategy}'")
298
298
 
299
299
  if execution_strategy == "sequential":
300
300
  return await self._execute_tools_sequentially(tool_calls)
301
301
  elif execution_strategy == "parallel":
302
302
  return await self._execute_tools_in_parallel(tool_calls)
303
303
  else:
304
- logging.warning(f"Unknown execution strategy: {execution_strategy}, falling back to sequential")
304
+ logging.warning(f"TaskProcessor execute_tools: Unknown execution strategy '{execution_strategy}', use sequential")
305
305
  return await self._execute_tools_sequentially(tool_calls)
306
306
 
307
- async def _execute_tools_sequentially(self, tool_calls: List[Dict[str, Any]]) -> List[
308
- Tuple[Dict[str, Any], XGAToolResult]]:
307
+ # @todo refact below code
308
+ async def _execute_tools_sequentially(self, tool_calls: List[Dict[str, Any]]) -> List[Tuple[Dict[str, Any], XGAToolResult]]:
309
309
  """Execute tool calls sequentially and return results.
310
310
 
311
311
  This method executes tool calls one after another, waiting for each tool to complete
@@ -319,6 +319,7 @@ class TaskResponseProcessor(ABC):
319
319
  """
320
320
  if not tool_calls:
321
321
  return []
322
+
322
323
  tool_names = [t.get('function_name', 'unknown') for t in tool_calls]
323
324
  logging.info(f"Executing {len(tool_calls)} tools sequentially: {tool_names}")
324
325
  self.root_span.event(name="task_process_executing_tools_sequentially", level="DEFAULT",
@@ -1,9 +1,8 @@
1
1
  import logging
2
2
 
3
3
  from typing import List, Dict, Any, Optional, AsyncGenerator, override
4
- from importlib_metadata import metadata
5
4
 
6
- from xgae.utils import handle_error
5
+ from xgae.utils import log_trace
7
6
  from xgae.utils.json_helpers import format_for_yield
8
7
  from xgae.engine.responser.responser_base import TaskResponseProcessor, TaskResponserContext, TaskRunContinuousState
9
8
 
@@ -120,11 +119,10 @@ class StreamTaskResponser(TaskResponseProcessor):
120
119
  finish_msg = self.add_response_message(type="status", content=finish_content, is_llm_message=False)
121
120
  yield format_for_yield(finish_msg)
122
121
  except Exception as e:
123
- logging.error(f"StreamResp: Process response llm_content: {accumulated_content}")
124
- handle_error(e)
122
+ trace = log_trace(e, f"StreamResp: Process response accumulated_content:\n {accumulated_content}")
125
123
  self.root_span.event(name="stream_response_process_error", level="ERROR",
126
124
  status_message=f"Process streaming response error: {e}",
127
- metadata={"content": accumulated_content})
125
+ metadata={"content": accumulated_content, "trace": trace})
128
126
 
129
127
  content = {"role": "system", "status_type": "error", "message": f"Process streaming response error: {e}"}
130
128
  error_msg = self.add_response_message(type="status", content=content, is_llm_message=False)
@@ -5,7 +5,7 @@ import os
5
5
  from typing import List, Any, Dict, Optional, AsyncGenerator, Union, Literal
6
6
  from uuid import uuid4
7
7
 
8
- from xgae.utils import handle_error, to_bool
8
+ from xgae.utils import log_trace, to_bool
9
9
  from xgae.utils.llm_client import LLMClient, LLMConfig
10
10
  from xgae.utils.json_helpers import format_for_yield
11
11
 
@@ -171,20 +171,19 @@ class XGATaskEngine:
171
171
  update_continuous_state(auto_continue_count, auto_continue)
172
172
  logging.info(f"TaskEngine run_task_auto: Detected finish_reason='{finish_reason}', auto-continuing ({auto_continue_count}/{self.max_auto_run})")
173
173
  except Exception as parse_error:
174
- logging.error(f"TaskEngine run_task_auto: Parse chunk error, chunk: {chunk}")
175
- handle_error(parse_error)
174
+ trace = log_trace(parse_error,f"TaskEngine run_task_auto: Parse chunk error, chunk: {chunk}")
176
175
  self.task_langfuse.root_span.event(name="engine_parse_chunk_error", level="ERROR",
177
- status_message=(f"Task Engine parse chunk error: {parse_error}"),
178
- metadata={"content": chunk})
176
+ status_message=f"Task Engine parse chunk error: {parse_error}",
177
+ metadata={"content": chunk, "trace": trace})
179
178
 
180
179
  content = {"role": "system", "status_type": "error", "message": "Parse response chunk Error"}
181
180
  error_msg = self.add_response_message(type="status", content=content, is_llm_message=False)
182
181
  yield format_for_yield(error_msg)
183
182
  except Exception as run_error:
184
- logging.error(f"TaskEngine run_task_auto: Call task_run_once error: {run_error}")
185
- handle_error(run_error)
183
+ trace = log_trace(run_error, "TaskEngine run_task_auto: Call task_run_once")
186
184
  self.task_langfuse.root_span.event(name="engine_task_run_once_error", level="ERROR",
187
- status_message=(f"Call task_run_once error: {run_error}"))
185
+ status_message=f"Call task_run_once error: {run_error}",
186
+ metadata={"trace": trace})
188
187
 
189
188
  content = {"role": "system", "status_type": "error", "message": "Call run_task_once error"}
190
189
  error_msg = self.add_response_message(type="status", content=content, is_llm_message=False)
@@ -268,11 +267,10 @@ class XGATaskEngine:
268
267
  logging.warning(f"❌ FINAL_RESULT: LLM Result is EMPTY, finish_reason={finish_reason}")
269
268
  final_result = XGATaskResult(type="error", content="LLM has no answer")
270
269
  except Exception as e:
271
- logging.error(f"TaskEngine parse_final_result: Parse message chunk error, chunk: {chunk}")
272
- handle_error(e)
270
+ trace = log_trace(e, f"TaskEngine parse_final_result: Parse message chunk error, chunk: {chunk}")
273
271
  self.task_langfuse.root_span.event(name="engine_parse_final_result_error", level="ERROR",
274
- status_message=(f"Task Engine parse final result error: {e}"),
275
- metadata={"content": chunk})
272
+ status_message=f"Task Engine parse final result error: {e}",
273
+ metadata={"content": chunk, "trace": trace})
276
274
 
277
275
  final_result = XGATaskResult(type="error", content="Parse final result failed!")
278
276
 
@@ -321,8 +319,7 @@ class XGATaskEngine:
321
319
  _content = json.loads(content)
322
320
  response_llm_contents.append(_content)
323
321
  except json.JSONDecodeError as e:
324
- logging.error(f"TaskEngine get_history_llm_messages: Failed to decode json, content: {content}")
325
- handle_error(e)
322
+ pass
326
323
  else:
327
324
  response_llm_contents.append(content)
328
325
 
@@ -386,10 +383,9 @@ class XGATaskEngine:
386
383
  logging.debug(f"TASK_RESP_CHUNK[{auto_count}]<{chunk_type}{prefix}> content: {pretty_content}")
387
384
  else:
388
385
  logging.info(f"TASK_RESP_CHUNK[{auto_count}]<{chunk_type}{prefix}> content: {pretty_content}")
389
-
390
386
  except Exception as e:
391
- logging.error(f"TaskEngine logging_reponse_chunk: Decorate chunk log error, chunk: {chunk}")
392
- handle_error(e)
387
+ logging.error(f"TaskEngine logging_reponse_chunk: Decorate chunk={chunk}, error: {e}")
388
+
393
389
 
394
390
 
395
391
  if __name__ == "__main__":
@@ -3,6 +3,7 @@ from pydantic import Field
3
3
 
4
4
  from mcp.server.fastmcp import FastMCP
5
5
 
6
+ from xgae.engine.engine_base import XGAToolResult
6
7
 
7
8
  mcp = FastMCP(name="XGAE Message Tools")
8
9
 
@@ -16,7 +17,7 @@ async def complete(task_id: str,
16
17
  description="Comma-separated list of final outputs. Use when: 1) Completion relates to files 2) User needs to review outputs 3) Deliverables in files")]
17
18
  ):
18
19
  print(f"<XGAETools-complete>: task_id={task_id}, text={text}, attachments={attachments}")
19
- return {"status": "complete"}
20
+ return XGAToolResult(success=True, output=str({"status": "complete"}))
20
21
 
21
22
 
22
23
  @mcp.tool(
@@ -29,7 +30,7 @@ async def ask(task_id: str,
29
30
  description="Comma-separated list of files/URLs to attach. Use when: 1) Question relates to files/configs 2) User needs to review content 3) Options documented in files 4) Supporting evidence needed")]
30
31
  ):
31
32
  print(f"<XGAETools-ask>: task_id={task_id}, text={text}, attachments={attachments}")
32
- return {"status": "Awaiting user response..."}
33
+ return XGAToolResult(success=True, output=str({"status": "Awaiting user response..."}))
33
34
 
34
35
  @mcp.tool(
35
36
  description="end task, destroy sandbox"
xgae/utils/__init__.py CHANGED
@@ -1,11 +1,22 @@
1
1
  import logging
2
2
 
3
- def handle_error(e: Exception) -> None:
3
+
4
+ def log_trace(exception: Exception, error: str=None) -> str:
5
+ import traceback
6
+
7
+ if error:
8
+ logging.error(f"{error} , error: {exception}")
9
+
10
+ trace_info = traceback.format_exc()
11
+ logging.error("Trace Details:\n%s", traceback.format_exc())
12
+
13
+ return trace_info
14
+
15
+
16
+ def get_trace() -> str:
4
17
  import traceback
5
18
 
6
- logging.error("An error occurred: %s", str(e))
7
- logging.error("Traceback details:\n%s", traceback.format_exc())
8
- raise (e) from e
19
+ return traceback.format_exc()
9
20
 
10
21
 
11
22
  def to_bool(value: any) -> bool:
@@ -13,3 +24,4 @@ def to_bool(value: any) -> bool:
13
24
  return False
14
25
 
15
26
  return str(value).lower() == "true"
27
+
xgae/utils/misc.py CHANGED
@@ -4,7 +4,6 @@ import sys
4
4
 
5
5
  from typing import Any, Dict
6
6
 
7
- from xgae.utils import handle_error
8
7
 
9
8
  def read_file(file_path: str) -> str:
10
9
  if not os.path.exists(file_path):
@@ -17,7 +16,7 @@ def read_file(file_path: str) -> str:
17
16
  return content
18
17
  except Exception as e:
19
18
  logging.error(f"Read file '{file_path}' failed")
20
- handle_error(e)
19
+ raise
21
20
 
22
21
  def format_file_with_args(file_content:str, args: Dict[str, Any])-> str:
23
22
  from io import StringIO
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xgae
3
- Version: 0.1.12
3
+ Version: 0.1.13
4
4
  Summary: Extreme General Agent Engine
5
5
  Requires-Python: >=3.13
6
6
  Requires-Dist: colorlog==6.9.0
@@ -0,0 +1,21 @@
1
+ xgae/__init__.py,sha256=OEUd9y9AoGBd3xYerdTTpz9xl4NWkmXeq1a2eil7Qro,72
2
+ xgae/cli_app.py,sha256=vKuCIJw0gwXdtkT-QNCZKt2dE53thvTFwQr7nTgvaPY,3000
3
+ xgae/engine/engine_base.py,sha256=-QZqLRbQdwRUfbY4l3i7dFfMB-BL267a-wGZR9bMPLc,1662
4
+ xgae/engine/mcp_tool_box.py,sha256=eE4qGxTHaSMMNDDWWafNXFT-vj_YYof4AjVSsxKoq68,10413
5
+ xgae/engine/prompt_builder.py,sha256=X9bS7YIms6LYplCpNHeUmi74xFP5MwFXmXNqOt1Xz-Q,4356
6
+ xgae/engine/task_engine.py,sha256=ZWxi292fceWvZuv501lwUGgb_PStktmfLFDzhDlsFfY,21011
7
+ xgae/engine/task_langfuse.py,sha256=b0aJ_Di-WDcYzi0TFCvcKWxkBz7PYP2jx3N52OptQMs,2349
8
+ xgae/engine/responser/non_stream_responser.py,sha256=RS2fIP_XCWjZEVtFRSNDJ9wM1N66MuzA66wXm3Nz1Jg,5583
9
+ xgae/engine/responser/responser_base.py,sha256=WsUMUfEE2cexAg5LzXA1yUECOkbs1ekh8HbJS5-R7f8,30813
10
+ xgae/engine/responser/stream_responser.py,sha256=O6_wSwdbqjYO-XowiLvHZKuw-F6fvxyjWULhfkkF6ow,7830
11
+ xgae/tools/without_general_tools_app.py,sha256=FGMV6njcOKwwfitc0j_nUov0RC-eWlhO1IP8_KHz1tQ,3788
12
+ xgae/utils/__init__.py,sha256=ElaGS-zdeZeu6is41u3Ny7lkvhg7BDSK-jMNg9j6K5A,499
13
+ xgae/utils/json_helpers.py,sha256=ubp-dOCeROnZv7JHARRdmDIO5Npdwzrt8AWo3SMv0kI,4705
14
+ xgae/utils/llm_client.py,sha256=6e3kzx73QN6z2SYMQQFmrmODj2Rk-GPJYIxBcFZhMQE,14361
15
+ xgae/utils/misc.py,sha256=aMWOvJ9VW52q-L9Lkjl1hvXqLwpJAmyxA-Z8jzqFG0U,907
16
+ xgae/utils/setup_env.py,sha256=MqNG0c2QQBDFU1kI8frxr9kB5d08Mmi3QZ1OoorgIa0,2662
17
+ xgae/utils/xml_tool_parser.py,sha256=I9xAZC_ElwBY19PNUq-WLXe9FSIJMeAv2Xs-VlajI7Y,4782
18
+ xgae-0.1.13.dist-info/METADATA,sha256=8y0v909gMEo6oyUYTrY5ZjRP8ACB8U-BPHZTDd5uq4M,310
19
+ xgae-0.1.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
+ xgae-0.1.13.dist-info/entry_points.txt,sha256=vClvL_WBJyF2x3wJCz5CNJ_BJG-dWUh7h2YbAoskHsc,162
21
+ xgae-0.1.13.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- xgae/__init__.py,sha256=OEUd9y9AoGBd3xYerdTTpz9xl4NWkmXeq1a2eil7Qro,72
2
- xgae/cli_app.py,sha256=vKuCIJw0gwXdtkT-QNCZKt2dE53thvTFwQr7nTgvaPY,3000
3
- xgae/engine/engine_base.py,sha256=-QZqLRbQdwRUfbY4l3i7dFfMB-BL267a-wGZR9bMPLc,1662
4
- xgae/engine/mcp_tool_box.py,sha256=Vyku8uOsTZ4ElnwEEgaw0hiltTOlC-FvtC9Ox-iJYck,10089
5
- xgae/engine/prompt_builder.py,sha256=X9bS7YIms6LYplCpNHeUmi74xFP5MwFXmXNqOt1Xz-Q,4356
6
- xgae/engine/task_engine.py,sha256=J4hVAkRgmd24larSFjxoCaVh9r3fDZJ95fUGB-FICZ8,21174
7
- xgae/engine/task_langfuse.py,sha256=b0aJ_Di-WDcYzi0TFCvcKWxkBz7PYP2jx3N52OptQMs,2349
8
- xgae/engine/responser/non_stream_responser.py,sha256=za1-7b37jVcg1cgTadNNXljqUTbzA92168i80xV7zdw,5589
9
- xgae/engine/responser/responser_base.py,sha256=WA2oKqP-UhQZj2es2nIFKf6_XkOhIfqZMUcQzDhtc6Q,30424
10
- xgae/engine/responser/stream_responser.py,sha256=dXcj-l3jb8J0orZ7THdf0sOjw9M7aZbfjHQC0NwQizo,7868
11
- xgae/tools/without_general_tools_app.py,sha256=cza3aLVh-090QABYA_DakoXmlFmc9rxwrXQsQwveT9A,3655
12
- xgae/utils/__init__.py,sha256=6lZCuEzMj66SW5sXyWrIuLH2W-1mHpbLpIBq_qbnsiw,337
13
- xgae/utils/json_helpers.py,sha256=ubp-dOCeROnZv7JHARRdmDIO5Npdwzrt8AWo3SMv0kI,4705
14
- xgae/utils/llm_client.py,sha256=6e3kzx73QN6z2SYMQQFmrmODj2Rk-GPJYIxBcFZhMQE,14361
15
- xgae/utils/misc.py,sha256=M8lMXYp1pHiY6Ee8ZTUG88GpOAsE5fbYoRO_hcBFUCE,953
16
- xgae/utils/setup_env.py,sha256=MqNG0c2QQBDFU1kI8frxr9kB5d08Mmi3QZ1OoorgIa0,2662
17
- xgae/utils/xml_tool_parser.py,sha256=I9xAZC_ElwBY19PNUq-WLXe9FSIJMeAv2Xs-VlajI7Y,4782
18
- xgae-0.1.12.dist-info/METADATA,sha256=7bOOMvn3Ntj_v_tZy2hkfiNKyTABLhoZRKDb0CJkwpM,310
19
- xgae-0.1.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
- xgae-0.1.12.dist-info/entry_points.txt,sha256=vClvL_WBJyF2x3wJCz5CNJ_BJG-dWUh7h2YbAoskHsc,162
21
- xgae-0.1.12.dist-info/RECORD,,
File without changes