trustgraph-cli 2.2.11__tar.gz → 2.2.13__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.
Files changed (86) hide show
  1. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/PKG-INFO +1 -1
  2. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_agent.py +19 -8
  3. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_explain_trace.py +143 -53
  4. trustgraph_cli-2.2.13/trustgraph/cli_version.py +1 -0
  5. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph_cli.egg-info/PKG-INFO +1 -1
  6. trustgraph_cli-2.2.11/trustgraph/cli_version.py +0 -1
  7. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/README.md +0 -0
  8. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/pyproject.toml +0 -0
  9. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/setup.cfg +0 -0
  10. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/__init__.py +0 -0
  11. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/add_library_document.py +0 -0
  12. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/delete_collection.py +0 -0
  13. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/delete_config_item.py +0 -0
  14. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/delete_flow_blueprint.py +0 -0
  15. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/delete_kg_core.py +0 -0
  16. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/delete_mcp_tool.py +0 -0
  17. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/delete_tool.py +0 -0
  18. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/dump_msgpack.py +0 -0
  19. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/dump_queues.py +0 -0
  20. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/get_config_item.py +0 -0
  21. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/get_document_content.py +0 -0
  22. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/get_flow_blueprint.py +0 -0
  23. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/get_kg_core.py +0 -0
  24. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/graph_to_turtle.py +0 -0
  25. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/init_pulsar_manager.py +0 -0
  26. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/init_trustgraph.py +0 -0
  27. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_document_embeddings.py +0 -0
  28. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_document_rag.py +0 -0
  29. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_embeddings.py +0 -0
  30. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_graph_embeddings.py +0 -0
  31. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_graph_rag.py +0 -0
  32. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_llm.py +0 -0
  33. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_mcp_tool.py +0 -0
  34. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_nlp_query.py +0 -0
  35. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_prompt.py +0 -0
  36. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_row_embeddings.py +0 -0
  37. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_rows_query.py +0 -0
  38. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/invoke_structured_query.py +0 -0
  39. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/list_collections.py +0 -0
  40. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/list_config_items.py +0 -0
  41. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/list_explain_traces.py +0 -0
  42. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/load_doc_embeds.py +0 -0
  43. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/load_kg_core.py +0 -0
  44. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/load_knowledge.py +0 -0
  45. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/load_sample_documents.py +0 -0
  46. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/load_structured_data.py +0 -0
  47. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/load_turtle.py +0 -0
  48. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/monitor_prompts.py +0 -0
  49. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/put_config_item.py +0 -0
  50. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/put_flow_blueprint.py +0 -0
  51. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/put_kg_core.py +0 -0
  52. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/query_graph.py +0 -0
  53. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/remove_library_document.py +0 -0
  54. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/save_doc_embeds.py +0 -0
  55. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/set_collection.py +0 -0
  56. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/set_mcp_tool.py +0 -0
  57. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/set_prompt.py +0 -0
  58. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/set_token_costs.py +0 -0
  59. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/set_tool.py +0 -0
  60. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_config.py +0 -0
  61. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_extraction_provenance.py +0 -0
  62. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_flow_blueprints.py +0 -0
  63. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_flow_state.py +0 -0
  64. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_flows.py +0 -0
  65. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_graph.py +0 -0
  66. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_kg_cores.py +0 -0
  67. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_library_documents.py +0 -0
  68. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_library_processing.py +0 -0
  69. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_mcp_tools.py +0 -0
  70. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_parameter_types.py +0 -0
  71. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_processor_state.py +0 -0
  72. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_prompts.py +0 -0
  73. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_token_costs.py +0 -0
  74. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_token_rate.py +0 -0
  75. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/show_tools.py +0 -0
  76. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/start_flow.py +0 -0
  77. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/start_library_processing.py +0 -0
  78. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/stop_flow.py +0 -0
  79. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/stop_library_processing.py +0 -0
  80. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/unload_kg_core.py +0 -0
  81. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph/cli/verify_system_status.py +0 -0
  82. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph_cli.egg-info/SOURCES.txt +0 -0
  83. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph_cli.egg-info/dependency_links.txt +0 -0
  84. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph_cli.egg-info/entry_points.txt +0 -0
  85. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph_cli.egg-info/requires.txt +0 -0
  86. {trustgraph_cli-2.2.11 → trustgraph_cli-2.2.13}/trustgraph_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trustgraph-cli
3
- Version: 2.2.11
3
+ Version: 2.2.13
4
4
  Summary: TrustGraph provides a means to run a pipeline of flexible AI processing components in a flexible means to achieve a processing pipeline.
5
5
  Author-email: "trustgraph.ai" <security@trustgraph.ai>
6
6
  Project-URL: Homepage, https://github.com/trustgraph-ai/trustgraph
@@ -12,6 +12,7 @@ from trustgraph.api import (
12
12
  ProvenanceEvent,
13
13
  Question,
14
14
  Analysis,
15
+ Observation,
15
16
  Conclusion,
16
17
  Decomposition,
17
18
  Finding,
@@ -206,13 +207,13 @@ def question_explainable(
206
207
  print(f" Time: {entity.timestamp}", file=sys.stderr)
207
208
 
208
209
  elif isinstance(entity, Analysis):
209
- print(f"\n [iteration] {prov_id}", file=sys.stderr)
210
- if entity.action:
211
- print(f" Action: {entity.action}", file=sys.stderr)
212
- if entity.thought:
213
- print(f" Thought: {entity.thought}", file=sys.stderr)
214
- if entity.observation:
215
- print(f" Observation: {entity.observation}", file=sys.stderr)
210
+ action_label = f": {entity.action}" if entity.action else ""
211
+ print(f"\n [analysis{action_label}] {prov_id}", file=sys.stderr)
212
+
213
+ elif isinstance(entity, Observation):
214
+ print(f"\n [observation] {prov_id}", file=sys.stderr)
215
+ if entity.document:
216
+ print(f" Document: {entity.document}", file=sys.stderr)
216
217
 
217
218
  elif isinstance(entity, Decomposition):
218
219
  print(f"\n [decompose] {prov_id}", file=sys.stderr)
@@ -267,7 +268,8 @@ def question_explainable(
267
268
 
268
269
  def question(
269
270
  url, question, flow_id, user, collection,
270
- plan=None, state=None, group=None, verbose=False, streaming=True,
271
+ plan=None, state=None, group=None, pattern=None,
272
+ verbose=False, streaming=True,
271
273
  token=None, explainable=False, debug=False
272
274
  ):
273
275
  # Explainable mode uses the API to capture and process provenance events
@@ -307,6 +309,8 @@ def question(
307
309
  request_params["state"] = state
308
310
  if group is not None:
309
311
  request_params["group"] = group
312
+ if pattern is not None:
313
+ request_params["pattern"] = pattern
310
314
 
311
315
  try:
312
316
  # Call agent
@@ -430,6 +434,12 @@ def main():
430
434
  help=f'Agent plan (default: unspecified)'
431
435
  )
432
436
 
437
+ parser.add_argument(
438
+ '-p', '--pattern',
439
+ choices=['react', 'plan-then-execute', 'supervisor'],
440
+ help='Force execution pattern (default: auto-selected by meta-router)'
441
+ )
442
+
433
443
  parser.add_argument(
434
444
  '-s', '--state',
435
445
  help=f'Agent initial state (default: unspecified)'
@@ -478,6 +488,7 @@ def main():
478
488
  plan = args.plan,
479
489
  state = args.state,
480
490
  group = args.group,
491
+ pattern = args.pattern,
481
492
  verbose = args.verbose,
482
493
  streaming = not args.no_streaming,
483
494
  token = args.token,
@@ -26,7 +26,12 @@ from trustgraph.api import (
26
26
  Focus,
27
27
  Synthesis,
28
28
  Analysis,
29
+ Observation,
29
30
  Conclusion,
31
+ Decomposition,
32
+ Finding,
33
+ Plan,
34
+ StepResult,
30
35
  )
31
36
 
32
37
  default_url = os.getenv("TRUSTGRAPH_URL", 'http://localhost:8088/')
@@ -297,6 +302,23 @@ def print_docrag_text(trace, explain_client, api, user):
297
302
  print("No synthesis data found")
298
303
 
299
304
 
305
+ def _print_document_content(explain_client, api, user, document_uri, label="Answer"):
306
+ """Fetch and print document content, or fall back to URI."""
307
+ if not document_uri:
308
+ return
309
+ content = ""
310
+ if api:
311
+ content = explain_client.fetch_document_content(
312
+ document_uri, api, user
313
+ )
314
+ if content:
315
+ print(f"{label}:")
316
+ for line in content.split("\n"):
317
+ print(f" {line}")
318
+ else:
319
+ print(f"Document: {document_uri}")
320
+
321
+
300
322
  def print_agent_text(trace, explain_client, api, user):
301
323
  """Print Agent trace in text format."""
302
324
  question = trace.get("question")
@@ -310,82 +332,150 @@ def print_agent_text(trace, explain_client, api, user):
310
332
  print(f"Time: {question.timestamp}")
311
333
  print()
312
334
 
313
- # Analysis steps
314
- print("--- Analysis ---")
315
- iterations = trace.get("iterations", [])
316
- if iterations:
317
- for i, analysis in enumerate(iterations, 1):
318
- print(f"Analysis {i}:")
319
- print(f" Thought: {analysis.thought or 'N/A'}")
320
- print(f" Action: {analysis.action or 'N/A'}")
335
+ # Walk the steps list which contains all entity types
336
+ steps = trace.get("steps", [])
337
+
338
+ for step in steps:
339
+
340
+ if isinstance(step, Decomposition):
341
+ print("--- Decomposition ---")
342
+ print(f"Decomposed into {len(step.goals)} research threads:")
343
+ for i, goal in enumerate(step.goals):
344
+ print(f" {i}: {goal}")
345
+ print()
346
+
347
+ elif isinstance(step, Finding):
348
+ print("--- Finding ---")
349
+ print(f"Goal: {step.goal}")
350
+ _print_document_content(
351
+ explain_client, api, user, step.document, "Result",
352
+ )
353
+ print()
321
354
 
355
+ elif isinstance(step, Plan):
356
+ print("--- Plan ---")
357
+ print(f"Plan with {len(step.steps)} steps:")
358
+ for i, s in enumerate(step.steps):
359
+ print(f" {i}: {s}")
360
+ print()
322
361
 
323
- if analysis.arguments:
324
- # Try to pretty-print JSON arguments
362
+ elif isinstance(step, StepResult):
363
+ print("--- Step Result ---")
364
+ print(f"Step: {step.step}")
365
+ _print_document_content(
366
+ explain_client, api, user, step.document, "Result",
367
+ )
368
+ print()
369
+
370
+ elif isinstance(step, Analysis):
371
+ print("--- Analysis ---")
372
+ print(f" Action: {step.action or 'N/A'}")
373
+
374
+ if step.arguments:
325
375
  try:
326
- args_obj = json.loads(analysis.arguments)
376
+ args_obj = json.loads(step.arguments)
327
377
  args_str = json.dumps(args_obj, indent=4)
328
378
  print(f" Arguments:")
329
379
  for line in args_str.split('\n'):
330
380
  print(f" {line}")
331
381
  except Exception:
332
- print(f" Arguments: {analysis.arguments}")
333
- else:
334
- print(f" Arguments: N/A")
382
+ print(f" Arguments: {step.arguments}")
383
+ print()
335
384
 
336
- obs = analysis.observation or 'N/A'
337
- if obs and len(obs) > 200:
338
- obs = obs[:200] + "... [truncated]"
339
- print(f" Observation: {obs}")
385
+ elif isinstance(step, Observation):
386
+ print("--- Observation ---")
387
+ _print_document_content(
388
+ explain_client, api, user, step.document, "Content",
389
+ )
340
390
  print()
341
- else:
342
- print("No analysis steps recorded")
343
- print()
344
391
 
345
- # Conclusion
346
- print("--- Conclusion ---")
347
- conclusion = trace.get("conclusion")
348
- if conclusion:
349
- content = ""
350
- if conclusion.document and api:
351
- content = explain_client.fetch_document_content(
352
- conclusion.document, api, user
392
+ elif isinstance(step, Synthesis):
393
+ print("--- Synthesis ---")
394
+ _print_document_content(
395
+ explain_client, api, user, step.document, "Answer",
353
396
  )
354
- if content:
355
- print("Answer:")
356
- for line in content.split("\n"):
357
- print(f" {line}")
358
- elif conclusion.document:
359
- print(f"Document: {conclusion.document}")
360
- else:
361
- print("No conclusion recorded")
362
- else:
363
- print("No conclusion recorded")
397
+ print()
398
+
399
+ elif isinstance(step, Conclusion):
400
+ print("--- Conclusion ---")
401
+ _print_document_content(
402
+ explain_client, api, user, step.document, "Answer",
403
+ )
404
+ print()
405
+
406
+ if not steps:
407
+ print("No trace steps recorded")
408
+ print()
364
409
 
365
410
 
366
411
  def trace_to_dict(trace, trace_type):
367
412
  """Convert trace entities to JSON-serializable dict."""
368
413
  if trace_type == "agent":
369
414
  question = trace.get("question")
415
+
416
+ def _step_to_dict(step):
417
+ if isinstance(step, Decomposition):
418
+ return {
419
+ "type": "decomposition",
420
+ "id": step.uri,
421
+ "goals": step.goals,
422
+ }
423
+ elif isinstance(step, Finding):
424
+ return {
425
+ "type": "finding",
426
+ "id": step.uri,
427
+ "goal": step.goal,
428
+ "document": step.document,
429
+ }
430
+ elif isinstance(step, Plan):
431
+ return {
432
+ "type": "plan",
433
+ "id": step.uri,
434
+ "steps": step.steps,
435
+ }
436
+ elif isinstance(step, StepResult):
437
+ return {
438
+ "type": "step-result",
439
+ "id": step.uri,
440
+ "step": step.step,
441
+ "document": step.document,
442
+ }
443
+ elif isinstance(step, Observation):
444
+ return {
445
+ "type": "observation",
446
+ "id": step.uri,
447
+ "document": step.document,
448
+ }
449
+ elif isinstance(step, Analysis):
450
+ return {
451
+ "type": "analysis",
452
+ "id": step.uri,
453
+ "action": step.action,
454
+ "arguments": step.arguments,
455
+ "thought": step.thought,
456
+ }
457
+ elif isinstance(step, Synthesis):
458
+ return {
459
+ "type": "synthesis",
460
+ "id": step.uri,
461
+ "document": step.document,
462
+ }
463
+ elif isinstance(step, Conclusion):
464
+ return {
465
+ "type": "conclusion",
466
+ "id": step.uri,
467
+ "document": step.document,
468
+ }
469
+ return {"type": step.entity_type, "id": step.uri}
470
+
471
+ steps = trace.get("steps", [])
472
+
370
473
  return {
371
474
  "type": "agent",
372
475
  "session_id": question.uri if question else None,
373
476
  "question": question.query if question else None,
374
477
  "time": question.timestamp if question else None,
375
- "iterations": [
376
- {
377
- "id": a.uri,
378
- "thought": a.thought,
379
- "action": a.action,
380
- "arguments": a.arguments,
381
- "observation": a.observation,
382
- }
383
- for a in trace.get("iterations", [])
384
- ],
385
- "conclusion": {
386
- "id": trace["conclusion"].uri,
387
- "document": trace["conclusion"].document,
388
- } if trace.get("conclusion") else None,
478
+ "steps": [_step_to_dict(s) for s in steps],
389
479
  }
390
480
  elif trace_type == "docrag":
391
481
  question = trace.get("question")
@@ -0,0 +1 @@
1
+ __version__ = "2.2.13"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trustgraph-cli
3
- Version: 2.2.11
3
+ Version: 2.2.13
4
4
  Summary: TrustGraph provides a means to run a pipeline of flexible AI processing components in a flexible means to achieve a processing pipeline.
5
5
  Author-email: "trustgraph.ai" <security@trustgraph.ai>
6
6
  Project-URL: Homepage, https://github.com/trustgraph-ai/trustgraph
@@ -1 +0,0 @@
1
- __version__ = "2.2.11"