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.
- xgae/engine/mcp_tool_box.py +7 -2
- xgae/engine/responser/non_stream_responser.py +3 -4
- xgae/engine/responser/responser_base.py +29 -28
- xgae/engine/responser/stream_responser.py +3 -5
- xgae/engine/task_engine.py +13 -17
- xgae/tools/without_general_tools_app.py +3 -2
- xgae/utils/__init__.py +16 -4
- xgae/utils/misc.py +1 -2
- {xgae-0.1.12.dist-info → xgae-0.1.13.dist-info}/METADATA +1 -1
- xgae-0.1.13.dist-info/RECORD +21 -0
- xgae-0.1.12.dist-info/RECORD +0 -21
- {xgae-0.1.12.dist-info → xgae-0.1.13.dist-info}/WHEEL +0 -0
- {xgae-0.1.12.dist-info → xgae-0.1.13.dist-info}/entry_points.txt +0 -0
xgae/engine/mcp_tool_box.py
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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: {
|
|
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
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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
|
|
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
|
-
|
|
308
|
-
|
|
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
|
|
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
|
-
|
|
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)
|
xgae/engine/task_engine.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
|
392
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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,,
|
xgae-0.1.12.dist-info/RECORD
DELETED
|
@@ -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
|
|
File without changes
|