xgae 0.1.18__py3-none-any.whl → 0.1.20__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/__init__.py +1 -1
- xgae/engine/task_engine.py +41 -30
- xgae/engine/task_langfuse.py +21 -7
- xgae/{cli_app.py → engine_cli_app.py} +16 -19
- xgae/utils/llm_client.py +27 -5
- {xgae-0.1.18.dist-info → xgae-0.1.20.dist-info}/METADATA +2 -1
- {xgae-0.1.18.dist-info → xgae-0.1.20.dist-info}/RECORD +9 -9
- {xgae-0.1.18.dist-info → xgae-0.1.20.dist-info}/entry_points.txt +1 -1
- {xgae-0.1.18.dist-info → xgae-0.1.20.dist-info}/WHEEL +0 -0
xgae/__init__.py
CHANGED
xgae/engine/task_engine.py
CHANGED
|
@@ -17,8 +17,9 @@ from xgae.engine.responser.responser_base import TaskResponserContext, TaskRespo
|
|
|
17
17
|
|
|
18
18
|
class XGATaskEngine:
|
|
19
19
|
def __init__(self,
|
|
20
|
-
session_id: Optional[str] = None,
|
|
21
20
|
task_id: Optional[str] = None,
|
|
21
|
+
session_id: Optional[str] = None,
|
|
22
|
+
user_id: Optional[str] = None,
|
|
22
23
|
agent_id: Optional[str] = None,
|
|
23
24
|
general_tools: Optional[List[str]] = None,
|
|
24
25
|
custom_tools: Optional[List[str]] = None,
|
|
@@ -27,10 +28,12 @@ class XGATaskEngine:
|
|
|
27
28
|
tool_exec_parallel: Optional[bool] = None,
|
|
28
29
|
llm_config: Optional[LLMConfig] = None,
|
|
29
30
|
prompt_builder: Optional[XGAPromptBuilder] = None,
|
|
30
|
-
tool_box: Optional[XGAToolBox] = None
|
|
31
|
+
tool_box: Optional[XGAToolBox] = None
|
|
32
|
+
):
|
|
31
33
|
self.task_id = task_id if task_id else f"xga_task_{uuid4()}"
|
|
32
|
-
self.agent_id = agent_id
|
|
33
34
|
self.session_id = session_id
|
|
35
|
+
self.user_id = user_id
|
|
36
|
+
self.agent_id = agent_id
|
|
34
37
|
|
|
35
38
|
self.llm_client = LLMClient(llm_config)
|
|
36
39
|
self.model_name = self.llm_client.model_name
|
|
@@ -56,16 +59,16 @@ class XGATaskEngine:
|
|
|
56
59
|
self.task_response_msgs: List[XGAResponseMessage] = []
|
|
57
60
|
|
|
58
61
|
async def run_task_with_final_answer(self,
|
|
59
|
-
|
|
62
|
+
task_input: Dict[str, Any],
|
|
60
63
|
trace_id: Optional[str] = None) -> XGATaskResult:
|
|
61
|
-
final_result:XGATaskResult = None
|
|
64
|
+
final_result: XGATaskResult = None
|
|
62
65
|
try:
|
|
63
66
|
await self._init_task()
|
|
64
67
|
|
|
65
|
-
self.task_langfuse.start_root_span("run_task_with_final_answer",
|
|
68
|
+
self.task_langfuse.start_root_span("run_task_with_final_answer", task_input, trace_id)
|
|
66
69
|
|
|
67
70
|
chunks = []
|
|
68
|
-
async for chunk in self.run_task(
|
|
71
|
+
async for chunk in self.run_task(task_input, trace_id):
|
|
69
72
|
chunks.append(chunk)
|
|
70
73
|
|
|
71
74
|
if len(chunks) > 0:
|
|
@@ -79,14 +82,14 @@ class XGATaskEngine:
|
|
|
79
82
|
|
|
80
83
|
|
|
81
84
|
async def run_task(self,
|
|
82
|
-
|
|
85
|
+
task_input: Dict[str, Any],
|
|
83
86
|
trace_id: Optional[str] = None) -> AsyncGenerator[Dict[str, Any], None]:
|
|
84
87
|
try:
|
|
85
88
|
await self._init_task()
|
|
86
89
|
|
|
87
|
-
self.task_langfuse.start_root_span("run_task",
|
|
90
|
+
self.task_langfuse.start_root_span("run_task", task_input, trace_id)
|
|
88
91
|
|
|
89
|
-
self.add_response_message(type="user", content=
|
|
92
|
+
self.add_response_message(type="user", content=task_input, is_llm_message=True)
|
|
90
93
|
|
|
91
94
|
async for chunk in self._run_task_auto():
|
|
92
95
|
yield chunk
|
|
@@ -153,30 +156,30 @@ class XGATaskEngine:
|
|
|
153
156
|
status_content = chunk['content']
|
|
154
157
|
status_type = status_content['status_type']
|
|
155
158
|
if status_type == "error":
|
|
156
|
-
logging.error(f"
|
|
159
|
+
logging.error(f"XGATaskEngine run_task_auto: task_response error: {chunk.get('message')}")
|
|
157
160
|
auto_continue = False
|
|
158
161
|
break
|
|
159
162
|
elif status_type == "finish":
|
|
160
163
|
finish_reason = status_content['finish_reason']
|
|
161
164
|
if finish_reason == "completed":
|
|
162
|
-
logging.info(f"
|
|
165
|
+
logging.info(f"XGATaskEngine run_task_auto: Detected finish_reason='completed', TASK_COMPLETE Success !")
|
|
163
166
|
auto_continue = False
|
|
164
167
|
break
|
|
165
168
|
elif finish_reason == "xml_tool_limit_reached":
|
|
166
|
-
logging.warning(f"
|
|
169
|
+
logging.warning(f"XGATaskEngine run_task_auto: Detected finish_reason='xml_tool_limit_reached', stop auto-continue")
|
|
167
170
|
auto_continue = False
|
|
168
171
|
break
|
|
169
172
|
elif finish_reason == "non_tool_call":
|
|
170
|
-
logging.warning(f"
|
|
173
|
+
logging.warning(f"XGATaskEngine run_task_auto: Detected finish_reason='non_tool_call', stop auto-continue")
|
|
171
174
|
auto_continue = False
|
|
172
175
|
break
|
|
173
176
|
elif finish_reason in ["stop", "length"]: # 'length' occur on some LLM
|
|
174
177
|
auto_continue_count += 1
|
|
175
178
|
auto_continue = True if auto_continue_count < self.max_auto_run else False
|
|
176
179
|
update_continuous_state(auto_continue_count, auto_continue)
|
|
177
|
-
logging.info(f"
|
|
180
|
+
logging.info(f"XGATaskEngine run_task_auto: Detected finish_reason='{finish_reason}', auto-continuing ({auto_continue_count}/{self.max_auto_run})")
|
|
178
181
|
except Exception as parse_error:
|
|
179
|
-
trace = log_trace(parse_error,f"
|
|
182
|
+
trace = log_trace(parse_error,f"XGATaskEngine run_task_auto: Parse chunk error, chunk: {chunk}")
|
|
180
183
|
self.task_langfuse.root_span.event(name="engine_parse_chunk_error", level="ERROR",
|
|
181
184
|
status_message=f"Task Engine parse chunk error: {parse_error}",
|
|
182
185
|
metadata={"content": chunk, "trace": trace})
|
|
@@ -185,7 +188,7 @@ class XGATaskEngine:
|
|
|
185
188
|
error_msg = self.add_response_message(type="status", content=status_content, is_llm_message=False)
|
|
186
189
|
yield error_msg
|
|
187
190
|
except Exception as run_error:
|
|
188
|
-
trace = log_trace(run_error, "
|
|
191
|
+
trace = log_trace(run_error, "XGATaskEngine run_task_auto: Call task_run_once")
|
|
189
192
|
self.task_langfuse.root_span.event(name="engine_task_run_once_error", level="ERROR",
|
|
190
193
|
status_message=f"Call task_run_once error: {run_error}",
|
|
191
194
|
metadata={"trace": trace})
|
|
@@ -211,7 +214,7 @@ class XGATaskEngine:
|
|
|
211
214
|
auto_count = continuous_state.get("auto_continue_count")
|
|
212
215
|
langfuse_metadata = self.task_langfuse.create_llm_langfuse_meta(auto_count)
|
|
213
216
|
|
|
214
|
-
llm_response = await self.llm_client.
|
|
217
|
+
llm_response = await self.llm_client.acompletion(llm_messages, langfuse_metadata)
|
|
215
218
|
response_processor = self._create_response_processer()
|
|
216
219
|
|
|
217
220
|
async for chunk in response_processor.process_response(llm_response, llm_messages, continuous_state):
|
|
@@ -271,7 +274,7 @@ class XGATaskEngine:
|
|
|
271
274
|
logging.warning(f"❌ FINAL_RESULT: LLM Result is EMPTY, finish_reason={finish_reason}")
|
|
272
275
|
final_result = XGATaskResult(type="error", content="LLM has no answer")
|
|
273
276
|
except Exception as e:
|
|
274
|
-
trace = log_trace(e, f"
|
|
277
|
+
trace = log_trace(e, f"XGATaskEngine parse_final_result: Parse message chunk error, chunk: {chunk}")
|
|
275
278
|
self.task_langfuse.root_span.event(name="engine_parse_final_result_error", level="ERROR",
|
|
276
279
|
status_message=f"Task Engine parse final result error: {e}",
|
|
277
280
|
metadata={"content": chunk, "trace": trace})
|
|
@@ -285,11 +288,12 @@ class XGATaskEngine:
|
|
|
285
288
|
is_llm_message: bool,
|
|
286
289
|
metadata: Optional[Dict[str, Any]]=None)-> XGAResponseMessage:
|
|
287
290
|
metadata = metadata or {}
|
|
288
|
-
metadata[
|
|
289
|
-
metadata[
|
|
290
|
-
metadata[
|
|
291
|
-
metadata[
|
|
292
|
-
metadata[
|
|
291
|
+
metadata['task_id'] = self.task_id
|
|
292
|
+
metadata['task_run_id'] = self.task_run_id
|
|
293
|
+
metadata['trace_id'] = self.task_langfuse.trace_id
|
|
294
|
+
metadata['session_id'] = self.session_id
|
|
295
|
+
metadata['user_id'] = self.user_id
|
|
296
|
+
metadata['agent_id'] = self.agent_id
|
|
293
297
|
|
|
294
298
|
message = XGAResponseMessage(
|
|
295
299
|
message_id = f"xga_msg_{uuid4()}",
|
|
@@ -312,7 +316,7 @@ class XGATaskEngine:
|
|
|
312
316
|
def get_history_llm_messages (self) -> List[Dict[str, Any]]:
|
|
313
317
|
llm_messages = []
|
|
314
318
|
for message in self.task_response_msgs:
|
|
315
|
-
if message['is_llm_message']:
|
|
319
|
+
if message['is_llm_message'] and message['type'] != "assistant_chunk":
|
|
316
320
|
llm_messages.append(message)
|
|
317
321
|
|
|
318
322
|
response_llm_contents = []
|
|
@@ -359,7 +363,14 @@ class XGATaskEngine:
|
|
|
359
363
|
|
|
360
364
|
|
|
361
365
|
def _create_task_langfuse(self)-> XGATaskLangFuse:
|
|
362
|
-
return XGATaskLangFuse(
|
|
366
|
+
return XGATaskLangFuse(
|
|
367
|
+
task_id = self.task_id,
|
|
368
|
+
task_run_id = self.task_run_id,
|
|
369
|
+
task_no = self.task_no,
|
|
370
|
+
session_id = self.session_id,
|
|
371
|
+
agent_id = self.agent_id,
|
|
372
|
+
user_id = self.user_id
|
|
373
|
+
)
|
|
363
374
|
|
|
364
375
|
|
|
365
376
|
def _logging_reponse_chunk(self, chunk, auto_count: int)-> None:
|
|
@@ -384,11 +395,11 @@ class XGATaskEngine:
|
|
|
384
395
|
pretty_content = json.dumps(status_content, ensure_ascii=False, indent=2)
|
|
385
396
|
|
|
386
397
|
if chunk_type == "assistant_chunk":
|
|
387
|
-
logging.debug(f"TASK_RESP_CHUNK[{auto_count}
|
|
398
|
+
logging.debug(f"TASK_RESP_CHUNK[{self.task_no}]({auto_count})<{chunk_type}{prefix}> content: {pretty_content}")
|
|
388
399
|
else:
|
|
389
|
-
logging.info(f"TASK_RESP_CHUNK[{auto_count}
|
|
400
|
+
logging.info(f"TASK_RESP_CHUNK[{self.task_no}]({auto_count})<{chunk_type}{prefix}> content: {pretty_content}")
|
|
390
401
|
except Exception as e:
|
|
391
|
-
logging.error(f"
|
|
402
|
+
logging.error(f"XGATaskEngine logging_reponse_chunk: Decorate chunk={chunk}, error: {e}")
|
|
392
403
|
|
|
393
404
|
|
|
394
405
|
|
|
@@ -410,7 +421,7 @@ if __name__ == "__main__":
|
|
|
410
421
|
agent_id="agent_1"
|
|
411
422
|
)
|
|
412
423
|
user_input = "locate 10.0.0.1 fault and solution"
|
|
413
|
-
final_result = await engine.run_task_with_final_answer(
|
|
424
|
+
final_result = await engine.run_task_with_final_answer(task_input={'role': "user", 'content': user_input})
|
|
414
425
|
print(f"FINAL RESULT:{final_result}")
|
|
415
426
|
|
|
416
427
|
|
xgae/engine/task_langfuse.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import logging
|
|
2
2
|
from typing import Any, Dict, Optional
|
|
3
3
|
from langfuse import Langfuse
|
|
4
4
|
|
|
@@ -10,10 +10,11 @@ class XGATaskLangFuse:
|
|
|
10
10
|
langfuse: Langfuse = None
|
|
11
11
|
|
|
12
12
|
def __init__(self,
|
|
13
|
-
session_id: str,
|
|
14
13
|
task_id:str,
|
|
15
14
|
task_run_id: str,
|
|
16
15
|
task_no: int,
|
|
16
|
+
session_id: str,
|
|
17
|
+
user_id: str,
|
|
17
18
|
agent_id: str) -> None:
|
|
18
19
|
if XGATaskLangFuse.langfuse is None:
|
|
19
20
|
XGATaskLangFuse.langfuse = setup_langfuse()
|
|
@@ -22,6 +23,7 @@ class XGATaskLangFuse:
|
|
|
22
23
|
self.task_id = task_id
|
|
23
24
|
self.task_run_id = task_run_id
|
|
24
25
|
self.task_no = task_no
|
|
26
|
+
self.user_id = user_id
|
|
25
27
|
self.agent_id = agent_id
|
|
26
28
|
|
|
27
29
|
self.trace_id = None
|
|
@@ -31,7 +33,7 @@ class XGATaskLangFuse:
|
|
|
31
33
|
|
|
32
34
|
def start_root_span(self,
|
|
33
35
|
root_span_name: str,
|
|
34
|
-
|
|
36
|
+
task_input: Dict[str, Any],
|
|
35
37
|
trace_id: Optional[str] = None):
|
|
36
38
|
if self.root_span is None:
|
|
37
39
|
trace = None
|
|
@@ -39,13 +41,25 @@ class XGATaskLangFuse:
|
|
|
39
41
|
self.trace_id = trace_id
|
|
40
42
|
trace = XGATaskLangFuse.langfuse.trace(id=trace_id)
|
|
41
43
|
else:
|
|
42
|
-
trace = XGATaskLangFuse.langfuse.trace(name="xga_task_engine")
|
|
44
|
+
trace = XGATaskLangFuse.langfuse.trace(name="xga_task_engine", session_id=self.session_id)
|
|
43
45
|
self.trace_id = trace.id
|
|
44
46
|
|
|
45
|
-
metadata = {
|
|
46
|
-
|
|
47
|
+
metadata = {
|
|
48
|
+
'task_id' : self.task_id,
|
|
49
|
+
'session_id' : self.session_id,
|
|
50
|
+
'user_id' : self.user_id,
|
|
51
|
+
'agent_id' : self.agent_id
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
self.root_span = trace.span(
|
|
55
|
+
id = self.task_run_id,
|
|
56
|
+
name = f"{root_span_name}[{self.task_no}]",
|
|
57
|
+
input = task_input,
|
|
58
|
+
metadata = metadata
|
|
59
|
+
)
|
|
47
60
|
self.root_span_name = root_span_name
|
|
48
61
|
|
|
62
|
+
logging.info(f"{root_span_name} TASK_INPUT: {task_input}")
|
|
49
63
|
|
|
50
64
|
def end_root_span(self, root_span_name:str, output: Optional[XGATaskResult]=None):
|
|
51
65
|
if self.root_span and self.root_span_name == root_span_name:
|
|
@@ -55,7 +69,7 @@ class XGATaskLangFuse:
|
|
|
55
69
|
|
|
56
70
|
|
|
57
71
|
def create_llm_langfuse_meta(self, llm_count:int)-> LangfuseMetadata:
|
|
58
|
-
generation_name = f"
|
|
72
|
+
generation_name = f"xga_engine_llm_completion[{self.task_no}]({llm_count})"
|
|
59
73
|
generation_id = f"{self.task_run_id}({llm_count})"
|
|
60
74
|
return LangfuseMetadata(
|
|
61
75
|
generation_name = generation_name,
|
|
@@ -14,7 +14,7 @@ langfuse = setup_langfuse()
|
|
|
14
14
|
def get_user_message(question)-> str:
|
|
15
15
|
while True:
|
|
16
16
|
user_message = input(f"\n💬 {question}: ")
|
|
17
|
-
if user_message.lower() == 'exit':
|
|
17
|
+
if user_message.lower() == 'exit' or user_message.lower() == 'quit':
|
|
18
18
|
print("\n====== Extreme General Agent Engine CLI EXIT ======")
|
|
19
19
|
sys.exit()
|
|
20
20
|
|
|
@@ -44,7 +44,7 @@ async def cli() -> None:
|
|
|
44
44
|
general_tools = ["*"]
|
|
45
45
|
|
|
46
46
|
while True:
|
|
47
|
-
user_message = get_user_message("Enter your message (or 'exit' to quit)")
|
|
47
|
+
user_message = get_user_message("Enter your task input message (or 'exit' to quit)")
|
|
48
48
|
|
|
49
49
|
print("\n🔄 Running XGA Engine ...\n")
|
|
50
50
|
engine = XGATaskEngine(tool_box=tool_box,
|
|
@@ -54,27 +54,24 @@ async def cli() -> None:
|
|
|
54
54
|
|
|
55
55
|
# Two task run in same langfuse trace
|
|
56
56
|
trace_id = langfuse.trace(name="xgae_cli").trace_id
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
trace_id=trace_id
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
if final_result["type"] == "ask":
|
|
64
|
-
await asyncio.sleep(1)
|
|
65
|
-
print(f"\n📌 ASK INFO: {final_result['content']}")
|
|
66
|
-
user_message = get_user_message("Enter ASK information (or 'exit' to quit)")
|
|
57
|
+
auto_continue = True
|
|
58
|
+
while auto_continue:
|
|
59
|
+
auto_continue = False
|
|
67
60
|
final_result = await engine.run_task_with_final_answer(
|
|
68
|
-
|
|
61
|
+
task_input={'role': "user", 'content': user_message},
|
|
69
62
|
trace_id=trace_id
|
|
70
63
|
)
|
|
71
64
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
65
|
+
if final_result["type"] == "ask":
|
|
66
|
+
await asyncio.sleep(1)
|
|
67
|
+
print(f"\n📌 ASK INFO: {final_result['content']}")
|
|
68
|
+
user_message = get_user_message("Enter ASK information (or 'exit' to quit)")
|
|
69
|
+
auto_continue = True
|
|
70
|
+
continue
|
|
71
|
+
|
|
72
|
+
await asyncio.sleep(1)
|
|
73
|
+
result_prefix = "✅" if final_result["type"] == "answer" else "❌"
|
|
74
|
+
print(f"\n {result_prefix} FINAL RESULT: {final_result['content']}")
|
|
78
75
|
|
|
79
76
|
|
|
80
77
|
def main():
|
xgae/utils/llm_client.py
CHANGED
|
@@ -226,7 +226,10 @@ class LLMClient:
|
|
|
226
226
|
logging.debug(f"LLMClient: Waiting {delay} seconds before retry llm completion...")
|
|
227
227
|
await asyncio.sleep(delay)
|
|
228
228
|
|
|
229
|
-
async def
|
|
229
|
+
async def acompletion(self,
|
|
230
|
+
messages: List[Dict[str, Any]],
|
|
231
|
+
langfuse_metadata: Optional[LangfuseMetadata]=None
|
|
232
|
+
) -> Union[ModelResponse, CustomStreamWrapper]:
|
|
230
233
|
complete_params = self._prepare_complete_params(messages)
|
|
231
234
|
if LLMClient.langfuse_enabled and langfuse_metadata:
|
|
232
235
|
complete_params["metadata"] = langfuse_metadata
|
|
@@ -234,19 +237,38 @@ class LLMClient:
|
|
|
234
237
|
last_error = None
|
|
235
238
|
for attempt in range(self.max_retries):
|
|
236
239
|
try:
|
|
237
|
-
logging.info(f"*** LLMClient
|
|
240
|
+
logging.info(f"*** LLMClient acompletion: LLM '{self.model_name}' completion attempt {attempt + 1}/{self.max_retries}")
|
|
238
241
|
response = await litellm.acompletion(**complete_params)
|
|
239
242
|
return response
|
|
240
243
|
except (litellm.exceptions.RateLimitError, OpenAIError, json.JSONDecodeError) as e:
|
|
241
244
|
last_error = e
|
|
242
245
|
await self._handle_llm_error(e, attempt)
|
|
243
246
|
except Exception as e:
|
|
244
|
-
logging.error(f"LLMClient
|
|
247
|
+
logging.error(f"LLMClient acompletion: Unexpected error during LLM completion: {str(e)}", exc_info=True)
|
|
245
248
|
raise LLMError(f"LLMClient create completion failed: {e}")
|
|
246
249
|
|
|
247
|
-
logging.error(f"LLMClient
|
|
250
|
+
logging.error(f"LLMClient acompletion: LLM completion failed after {self.max_retries} attempts: {last_error}", exc_info=True)
|
|
248
251
|
raise LLMError(f"LLMClient create completion failed after {self.max_retries} attempts !")
|
|
249
252
|
|
|
253
|
+
|
|
254
|
+
async def get_response_result(self, response: Union[ModelResponse, CustomStreamWrapper]) -> str:
|
|
255
|
+
response_text: str = ""
|
|
256
|
+
|
|
257
|
+
if self.is_stream:
|
|
258
|
+
async for chunk in response:
|
|
259
|
+
choices = chunk.get("choices", [{}])
|
|
260
|
+
if not choices:
|
|
261
|
+
continue
|
|
262
|
+
delta = choices[0].get("delta", {})
|
|
263
|
+
content = delta.get("content", "")
|
|
264
|
+
if content:
|
|
265
|
+
response_text += content
|
|
266
|
+
else:
|
|
267
|
+
response_text = response.choices[0].message.content
|
|
268
|
+
|
|
269
|
+
return response_text
|
|
270
|
+
|
|
271
|
+
|
|
250
272
|
if __name__ == "__main__":
|
|
251
273
|
from xgae.utils.setup_env import setup_logging
|
|
252
274
|
|
|
@@ -267,7 +289,7 @@ if __name__ == "__main__":
|
|
|
267
289
|
session_id="session_0",
|
|
268
290
|
)
|
|
269
291
|
|
|
270
|
-
response = await llm_client.
|
|
292
|
+
response = await llm_client.acompletion(messages, meta)
|
|
271
293
|
if llm_client.is_stream:
|
|
272
294
|
async for chunk in response:
|
|
273
295
|
choices = chunk.get("choices", [{}])
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: xgae
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.20
|
|
4
4
|
Summary: Extreme General Agent Engine
|
|
5
5
|
Requires-Python: >=3.13
|
|
6
6
|
Requires-Dist: colorlog==6.9.0
|
|
7
7
|
Requires-Dist: langchain-mcp-adapters==0.1.9
|
|
8
|
+
Requires-Dist: langchain==0.3.27
|
|
8
9
|
Requires-Dist: langfuse==2.60.9
|
|
9
10
|
Requires-Dist: langgraph==0.6.5
|
|
10
11
|
Requires-Dist: litellm==1.74.15
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
xgae/__init__.py,sha256=
|
|
2
|
-
xgae/
|
|
1
|
+
xgae/__init__.py,sha256=oBX_YzTliM-343BAlR-sD7BUZmsCJ7PY2oYrGBhsdLM,79
|
|
2
|
+
xgae/engine_cli_app.py,sha256=FdmIpq8KDsgyZNfwCDgNX7FEZFeRFyGOt_H1oZF8aKs,2890
|
|
3
3
|
xgae/engine/engine_base.py,sha256=RR1em2wHiM2jP-peHt77SKdHWjnYOjdIIzN93zT61cA,1715
|
|
4
4
|
xgae/engine/mcp_tool_box.py,sha256=G4hKIMguwg1cO4Us2NMfdloYim8kuikVyVTIPucJr7o,10903
|
|
5
5
|
xgae/engine/prompt_builder.py,sha256=6I5rjgvNJ27QJ8DDuBTplutoPZdGs9LYFv3TSgT7zmc,5045
|
|
6
|
-
xgae/engine/task_engine.py,sha256=
|
|
7
|
-
xgae/engine/task_langfuse.py,sha256=
|
|
6
|
+
xgae/engine/task_engine.py,sha256=l0wOIIkyVUtyf95wSi4oXTHZjv15m9XB68pTk24baig,21641
|
|
7
|
+
xgae/engine/task_langfuse.py,sha256=ifkGrPBv2daLTKE-fCfEtOoI0n4Pd-lCwhyRRL0h308,2850
|
|
8
8
|
xgae/engine/responser/non_stream_responser.py,sha256=zEJjqCgZVe2B8gkHYRFU7tmBV834f7w2a4Ws25P1N-c,5289
|
|
9
9
|
xgae/engine/responser/responser_base.py,sha256=jhl1Bdz1Fs3KofGEymThNXlQuCORFTTkTAR_U47krds,24403
|
|
10
10
|
xgae/engine/responser/stream_responser.py,sha256=cv4UGcxj8OksEogW7DUGTCvSJabu-DF6GceFyUwaXI4,7627
|
|
11
11
|
xgae/tools/without_general_tools_app.py,sha256=KqsdhxD3hvTpiygaGUVHysRFjvv_1A8zOwMKN1J0J0U,3821
|
|
12
12
|
xgae/utils/__init__.py,sha256=ElaGS-zdeZeu6is41u3Ny7lkvhg7BDSK-jMNg9j6K5A,499
|
|
13
13
|
xgae/utils/json_helpers.py,sha256=WD4G5U9Dh8N6J9O0L5wGyqj-NHi09kcXHGdLD_26nlc,3607
|
|
14
|
-
xgae/utils/llm_client.py,sha256=
|
|
14
|
+
xgae/utils/llm_client.py,sha256=AphZ57n9VvaQBq6xu2_cRQE6DtIGN2PfQ2h7D50cATw,15056
|
|
15
15
|
xgae/utils/misc.py,sha256=aMWOvJ9VW52q-L9Lkjl1hvXqLwpJAmyxA-Z8jzqFG0U,907
|
|
16
16
|
xgae/utils/setup_env.py,sha256=MqNG0c2QQBDFU1kI8frxr9kB5d08Mmi3QZ1OoorgIa0,2662
|
|
17
17
|
xgae/utils/xml_tool_parser.py,sha256=Mb0d8kBrfyAEvUwW1Nqir-3BgxZRr0ZX3WymQouuFSo,4859
|
|
18
|
-
xgae-0.1.
|
|
19
|
-
xgae-0.1.
|
|
20
|
-
xgae-0.1.
|
|
21
|
-
xgae-0.1.
|
|
18
|
+
xgae-0.1.20.dist-info/METADATA,sha256=H8uCaLYabJqLy0BCBC_tP8B0Ti-dKiefMWqkZ_d3ySs,343
|
|
19
|
+
xgae-0.1.20.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
20
|
+
xgae-0.1.20.dist-info/entry_points.txt,sha256=wmvgtMQbtzTbDPETS-tbQJD7jVlcs4hp0w6wOB0ooCc,229
|
|
21
|
+
xgae-0.1.20.dist-info/RECORD,,
|
|
File without changes
|