Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions frameworks/agno/research-agent/.agentuity-crash-1756999580.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"id": "fb2343c7-b989-4468-b86e-bd22d55dae6c",
"timestamp": "2025-09-04T11:26:20-04:00",
"error": "failed to install dependencies (exit code 2): exit status 2. error: Unable to find lockfile at `uv.lock`. To create a lockfile, run `uv lock` or `uv sync`.\n",
"error_type": {
"code": "CLI-0006",
"message": "Invalid configuration"
},
"username": "dhilanfye",
"os_name": "darwin",
"os_arch": "arm64",
"cli_version": "0.0.166",
"attributes": {
"message": "Failed to bundle project: failed to install dependencies (exit code 2): exit status 2. error: Unable to find lockfile at `uv.lock`. To create a lockfile, run `uv lock` or `uv sync`.\n",
"user_id": "user_2x3CH4tR8dMwfWSkzUsyLznYKQT"
},
"stack_trace": "goroutine 73 [running]:\nruntime/debug.Stack()\n\t/home/runner/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.linux-amd64/src/runtime/debug/stack.go:26 +0x64\ngithub.com/agentuity/cli/internal/errsystem.(*errSystem).ShowErrorAndExit(0x14000236230)\n\t/home/runner/_work/cli/cli/internal/errsystem/console.go:103 +0x7c\ngithub.com/agentuity/cli/cmd.init.func31.2.1()\n\t/home/runner/_work/cli/cli/cmd/dev.go:168 +0x188\ngithub.com/agentuity/go-common/tui.ShowSpinner.func1()\n\t/home/runner/go/pkg/mod/github.com/agentuity/go-common@v1.0.72/tui/spinner.go:31 +0x48\ngithub.com/agentuity/go-common/tui.ShowSpinner.(*Spinner).Action.func2({0x0?, 0x0?})\n\t/home/runner/go/pkg/mod/github.com/charmbracelet/huh/spinner@v0.0.0-20250313000648-36d9de46d64e/spinner.go:74 +0x24\ngithub.com/charmbracelet/huh/spinner.(*Spinner).Init.func1()\n\t/home/runner/go/pkg/mod/github.com/charmbracelet/huh/spinner@v0.0.0-20250313000648-36d9de46d64e/spinner.go:131 +0x34\ngithub.com/charmbracelet/bubbletea.(*Program).handleCommands.func1.1()\n\t/home/runner/go/pkg/mod/github.com/charmbracelet/bubbletea@v1.3.4/tea.go:352 +0x5c\ncreated by github.com/charmbracelet/bubbletea.(*Program).handleCommands.func1 in goroutine 105\n\t/home/runner/go/pkg/mod/github.com/charmbracelet/bubbletea@v1.3.4/tea.go:346 +0xf4\n"
}
1 change: 1 addition & 0 deletions frameworks/agno/research-agent/.agentuity/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"agents":[{"id":"agent_bbfdb1c16507278cbc24ba49019b06b4","name":"ResearchAgent","filename":"agents/ResearchAgent/agent.py"}],"app":{"name":"agno-research-agent","version":"0.1.0"},"cli_version":"0.0.166","environment":"development"}
18 changes: 18 additions & 0 deletions frameworks/agno/research-agent/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true

[*.{yml,yaml}]
indent_size = 2

[*.{json,js,ts}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false
1 change: 1 addition & 0 deletions frameworks/agno/research-agent/.env.development
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# This file is used to store development environment variables
132 changes: 132 additions & 0 deletions frameworks/agno/research-agent/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# UV
uv.lock
97 changes: 97 additions & 0 deletions frameworks/agno/research-agent/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<div align="center">
<img src="https://raw.githubusercontent.com/agentuity/cli/refs/heads/main/.github/Agentuity.png" alt="Agentuity" width="100"/> <br/>
<strong>Build Agents, Not Infrastructure</strong> <br/>
<br/>
<a target="_blank" href="https://app.agentuity.com/deploy" alt="Agentuity">
<img src="https://app.agentuity.com/img/deploy.svg" />
</a>
<br />
</div>

# Agno Research Agent for Agentuity

This example demonstrates how to convert an [Agno Research Agent](https://docs.agno.com/examples/agents/research-agent) to work with the Agentuity platform while preserving all original framework functionality.

## Overview

The Research Agent is a sophisticated AI journalist that combines web search capabilities with advanced content analysis to produce professional-grade investigative reports. It performs comprehensive research using multiple sources, fact-checks information, and delivers polished, New York Times-style articles on any topic.

**Original Agno Agent**: https://docs.agno.com/examples/agents/research-agent

## Key Features

- **Advanced Web Search**: Uses DuckDuckGo for comprehensive topic research
- **Content Analysis**: Leverages Newspaper4k for article extraction and analysis
- **Professional Reporting**: Generates NYT-style investigative articles
- **Multi-source Verification**: Cross-references facts across multiple sources
- **Structured Output**: Delivers well-formatted reports with sections for findings, analysis, and sources

## Architecture

This implementation follows the Agentuity framework wrapper pattern:

1. **Original Agno Agent** (`research_agent.py`): Preserves the complete original Agno implementation
2. **Agentuity Wrapper** (`agent.py`): Provides the Agentuity interface while calling the original agent
3. **Framework Integration**: Maintains all Agno tools, models, and configurations

## Example Usage

```python
# The agent accepts research topics and generates comprehensive reports
"Analyze the impact of AI on healthcare delivery and patient outcomes"
"Report on the latest breakthroughs in quantum computing"
"Investigate the global transition to renewable energy sources"
```

## Dependencies

- **Agno**: Core framework for the research agent
- **DuckDuckGo Search**: Web search capabilities
- **Newspaper4k**: Content extraction and analysis
- **Agentuity SDK**: Platform integration

## 📋 Prerequisites

Before you begin, ensure you have the following installed:

- **Python**: Version 3.10 or higher
- **UV**: Version 0.5.25 or higher ([Documentation](https://docs.astral.sh/uv/))

## 🚀 Getting Started

1. Install dependencies:
```bash
uv sync
```

2. Set up environment variables (create `.env` file):
```bash
OPENAI_API_KEY=your_openai_api_key_here
```

3. Run the development server:
```bash
agentuity dev
```

4. Test the agent in the Agentuity Console or deploy to production:
```bash
agentuity deploy
```

## 📖 Documentation

For comprehensive documentation on the Agentuity Python SDK, visit:
[https://agentuity.dev/SDKs/python](https://agentuity.dev/SDKs/python)

## 🆘 Troubleshooting

If you encounter any issues:

1. Check the [documentation](https://agentuity.dev/SDKs/python)
2. Join our [Discord community](https://discord.gg/agentuity) for support
3. Contact the Agentuity support team

## 📝 License

This project is licensed under the terms specified in the LICENSE file.
Empty file.
45 changes: 45 additions & 0 deletions frameworks/agno/research-agent/agents/ResearchAgent/agent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from agentuity import AgentRequest, AgentResponse, AgentContext
import asyncio

from agents.ResearchAgent.research_agent import research_agent

def welcome():
return {
"welcome": "📰 I'm a Research Agent powered by Agno. Give me a topic and I'll deliver a professional-grade investigative article with comprehensive research and analysis.",
"examples": [
"Analyze the impact of AI on healthcare delivery and patient outcomes",
"Report on the latest breakthroughs in quantum computing",
"Investigate the global transition to renewable energy sources",
"Explore the evolution of cybersecurity threats and defenses",
"Research the development of autonomous vehicle technology"
]
}

async def run(request: AgentRequest, response: AgentResponse, context: AgentContext):
try:
prompt = await request.data.text()
context.logger.info(f"[ResearchAgent] Received research topic: {prompt!r}")

loop = asyncio.get_running_loop()
raw_result = await loop.run_in_executor(None, lambda: research_agent.run(prompt))

if isinstance(raw_result, str):
output = raw_result
elif hasattr(raw_result, "content"):
output = raw_result.content
elif hasattr(raw_result, "reply"):
output = raw_result.reply
else:
output = str(raw_result)

if not output.strip():
context.logger.error("[ResearchAgent] Empty output from Agno agent")
return response.text("⚠️ Unable to generate research report. Please try again with a more specific topic.")

context.logger.info(f"[ResearchAgent] Successfully generated report of {len(output)} characters")

return response.text(output)

except Exception as exc:
context.logger.error(f"[ResearchAgent] Error during research: {exc}", exc_info=True)
return response.text("❌ An error occurred while conducting research. Please try again with a different topic.")
Loading