pycsamt.agents.report#

pycsamt.agents.report#

ReportAgent — Assemble all agent results into a survey report.

The report is built in three formats:

  • Markdown — always produced; human-readable plain text + embedded image paths.

  • HTML — produced when markdown package is installed.

  • PDF — produced when weasyprint or pdfkit is installed.

The agent queries the LLM once per section (optional) to write a narrative paragraph, then assembles everything into a structured document:

  1. Title & metadata

  2. Data loading summary

  3. QC summary + figure

  4. Static-shift correction summary + figure

  5. Phase tensor analysis summary + figures

  6. Forward modelling summary + figure

  7. Recommendations

Classes

ReportAgent(*[, api_key, model, ...])

Generate a structured MT survey report from agent results.

class pycsamt.agents.report.ReportAgent(*, api_key=None, model=None, llm_provider='claude', report_title='MT/AMT Survey Report', formats=None)[source]#

Bases: BaseAgent

Generate a structured MT survey report from agent results.

Parameters:
  • api_key (str)

  • model (str)

  • llm_provider (str)

  • report_title (str) – Title for the report.

  • formats (list of {"md", "html", "pdf"}) – Output formats. Default ["md", "html"].

  • keys (Output data)

  • ----------

  • results (dict) – Keyed by agent step name → AgentResult. Expected keys: "load", "qc", "static_shift", "phase_analysis", "forward" (all optional).

  • output_dir (str)

  • title (str, optional — overrides constructor default)

  • keys

  • ----------------

  • text (report_md str — full markdown)

  • None (report_path_html str or)

  • file (report_path_md str — path to .md)

  • None

  • name (sections dict — section text keyed by)

Examples

>>> agent  = ReportAgent(api_key="sk-ant-…")
>>> result = agent.execute({
...     "results":    {"load": load_result, "qc": qc_result},
...     "output_dir": "/out/report",
...     "title":      "WILLY_DATA AMT Survey — L22PLT",
... })
>>> print(result["report_path_md"])
/out/report/survey_report.md
SYSTEM_PROMPT: str = 'You are a geophysics technical writer specialising in MT surveys.\nWrite clear, concise report sections in formal scientific English.\nUse complete sentences. No markdown headings inside your response.\nKeep each section to 3–5 sentences.\n'#

Override in subclasses to give the LLM its domain expertise.

execute(input_data)[source]#

Run this agent on input_data and return an AgentResult.

Subclasses must implement this method. The contract:

  • Reset self._last_cost = 0.0 at the top.

  • Record wall-clock time with t0 = time.time().

  • Return AgentResult(elapsed_seconds=time.time()-t0, cost_estimate_usd=self._last_cost, ...).

Parameters:

input_data (dict[str, Any])

Return type:

AgentResult