From ab74e30cd21228ea70270ac7c99b612a1a5ac3e9 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 18:46:15 +0000 Subject: [PATCH 1/4] examples: add Haystack 2.x OpenAI example; wire into examples CI; fix docs links Co-Authored-By: Alex --- .../workflows/examples-integration-test.yml | 5 ++++- docs/v1/integrations/haystack.mdx | 5 ++--- examples/haystack/haystack_example.py | 20 +++++++++++++++++++ examples/haystack/requirements.txt | 2 ++ 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 examples/haystack/haystack_example.py create mode 100644 examples/haystack/requirements.txt diff --git a/.github/workflows/examples-integration-test.yml b/.github/workflows/examples-integration-test.yml index fadc4bce9..e16e878f5 100644 --- a/.github/workflows/examples-integration-test.yml +++ b/.github/workflows/examples-integration-test.yml @@ -105,6 +105,9 @@ jobs: # DSPy examples - { path: 'examples/dspy/dspy_calculator.py', name: 'DSPy ReAct Agent' } + + # Haystack examples + - { path: 'examples/haystack/haystack_example.py', name: 'Haystack OpenAI' } # Add more examples as needed @@ -189,4 +192,4 @@ jobs: echo "āœ… All examples passed!" >> $GITHUB_STEP_SUMMARY else echo "āŒ Some examples failed. Check the logs above." >> $GITHUB_STEP_SUMMARY - fi \ No newline at end of file + fi \ No newline at end of file diff --git a/docs/v1/integrations/haystack.mdx b/docs/v1/integrations/haystack.mdx index 02c63187c..9b570541a 100644 --- a/docs/v1/integrations/haystack.mdx +++ b/docs/v1/integrations/haystack.mdx @@ -69,10 +69,9 @@ AgentOps makes monitoring your Haystack agents seamless. Haystack, much like Aut ## Full Examples -You can refer to the following examples - +You can refer to the following example - -- [Philosopher Agent](https://github.com/AgentOps-AI/agentops/blob/main/examples/haystack_examples/haystack_anthropic_example.ipynb) -- [Mathematician Agent](https://github.com/AgentOps-AI/agentops/blob/main/examples/haystack_examples/haystack_openai_example.ipynb) +- [Simple Haystack example (OpenAI)](https://github.com/AgentOps-AI/agentops/blob/main/examples/haystack/haystack_example.py) diff --git a/examples/haystack/haystack_example.py b/examples/haystack/haystack_example.py new file mode 100644 index 000000000..7864dd19d --- /dev/null +++ b/examples/haystack/haystack_example.py @@ -0,0 +1,20 @@ +import os + +import agentops +from haystack.components.generators import OpenAIGenerator + + +def main(): + agentops.init(os.getenv("AGENTOPS_API_KEY")) + + prompt = "In one sentence, what is AgentOps?" + generator = OpenAIGenerator(model="gpt-4o-mini") + result = generator.run(prompt) + replies = result.get("replies") or [] + print("Haystack reply:", replies[0] if replies else "") + + agentops.end_session("Success") + + +if __name__ == "__main__": + main() diff --git a/examples/haystack/requirements.txt b/examples/haystack/requirements.txt new file mode 100644 index 000000000..dc4b30512 --- /dev/null +++ b/examples/haystack/requirements.txt @@ -0,0 +1,2 @@ +haystack-ai>=2.0.0 +openai>=1.0.0 From 5c0bc8f91805fd3b27d92b834904901cd31caa8f Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 18:48:17 +0000 Subject: [PATCH 2/4] examples(haystack): fix import path for OpenAIGenerator (Haystack 2.x) and use named argument Co-Authored-By: Alex --- examples/haystack/haystack_example.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/haystack/haystack_example.py b/examples/haystack/haystack_example.py index 7864dd19d..7250d9a5c 100644 --- a/examples/haystack/haystack_example.py +++ b/examples/haystack/haystack_example.py @@ -1,7 +1,7 @@ import os import agentops -from haystack.components.generators import OpenAIGenerator +from haystack.components.generators.openai import OpenAIGenerator def main(): @@ -9,7 +9,7 @@ def main(): prompt = "In one sentence, what is AgentOps?" generator = OpenAIGenerator(model="gpt-4o-mini") - result = generator.run(prompt) + result = generator.run(prompt=prompt) replies = result.get("replies") or [] print("Haystack reply:", replies[0] if replies else "") From 75f9a29059965cab1baa8fbe746f4f7efc3c34d7 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 19:16:13 +0000 Subject: [PATCH 3/4] examples(haystack): add post-run validation via agentops.validate_trace_spans and print summary Co-Authored-By: Alex --- examples/haystack/haystack_example.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/haystack/haystack_example.py b/examples/haystack/haystack_example.py index 7250d9a5c..7b46dd8c3 100644 --- a/examples/haystack/haystack_example.py +++ b/examples/haystack/haystack_example.py @@ -13,6 +13,14 @@ def main(): replies = result.get("replies") or [] print("Haystack reply:", replies[0] if replies else "") + print("\n" + "=" * 50) + print("Now let's verify that our LLM calls were tracked properly...") + try: + validation_result = agentops.validate_trace_spans(trace_context=None) + agentops.print_validation_summary(validation_result) + except agentops.ValidationError as e: + print(f"\nāŒ Error validating spans: {e}") + agentops.end_session("Success") From 5729c26d918e0f005b71b46466d5eef6e70dcc2a Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 19:16:50 +0000 Subject: [PATCH 4/4] examples(haystack): start a trace and validate against it; end with end_trace to ensure session URL and proper validation Co-Authored-By: Alex --- examples/haystack/haystack_example.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/haystack/haystack_example.py b/examples/haystack/haystack_example.py index 7b46dd8c3..541ab2dd8 100644 --- a/examples/haystack/haystack_example.py +++ b/examples/haystack/haystack_example.py @@ -7,6 +7,11 @@ def main(): agentops.init(os.getenv("AGENTOPS_API_KEY")) + tracer = agentops.start_trace( + trace_name="Haystack OpenAI Example", + tags=["haystack", "openai", "agentops-example"], + ) + prompt = "In one sentence, what is AgentOps?" generator = OpenAIGenerator(model="gpt-4o-mini") result = generator.run(prompt=prompt) @@ -16,12 +21,13 @@ def main(): print("\n" + "=" * 50) print("Now let's verify that our LLM calls were tracked properly...") try: - validation_result = agentops.validate_trace_spans(trace_context=None) + validation_result = agentops.validate_trace_spans(trace_context=tracer) agentops.print_validation_summary(validation_result) except agentops.ValidationError as e: print(f"\nāŒ Error validating spans: {e}") + raise - agentops.end_session("Success") + agentops.end_trace(tracer, end_state="Success") if __name__ == "__main__":