Skip to content

Commit 6bbbf65

Browse files
authored
chore: sorting folers (#62)
* hard cuts and refactor * numbering * minor reorder * fixing deployment agents
1 parent 6bc01f2 commit 6bbbf65

File tree

143 files changed

+9695
-7
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

143 files changed

+9695
-7
lines changed

.github/workflows/deploy-agents.yaml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ on:
55
branches:
66
- main
77
paths:
8-
- "1-uagents/finance/**"
9-
- "1-uagents/geo/**"
10-
- "1-uagents/knowledge-base/**"
11-
- "1-uagents/search/**"
12-
- "1-uagents/travel/**"
13-
- "1-uagents/utility/**"
14-
- "1-uagents/communication/**"
8+
- "6-deployed-agents/finance/**"
9+
- "6-deployed-agents/geo/**"
10+
- "6-deployed-agents/knowledge-base/**"
11+
- "6-deployed-agents/search/**"
12+
- "6-deployed-agents/travel/**"
13+
- "6-deployed-agents/utility/**"
1514
- "scripts/deploy-all-agents.sh"
1615
- ".github/workflows/deploy-agents.yaml"
1716

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[agent]
2+
address = "agent1qggzwfa032ddngqkrsgn9d3qwp4a7dh34q9cnpy9np7vzzvp8ws5u0rq5d8"
3+
include = ""
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALPHAVANTAGE_API_KEY=
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# Company Overview Agent
2+
3+
![domain:finance](https://img.shields.io/badge/finance-3D8BD3?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgOCA2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNCA0LjVDMS43ODEyNSA0LjUgMCAzLjUgMCAyLjI1QzAgMS4wMTU2MiAxLjc4MTI1IDAgNCAwQzYuMjAzMTIgMCA4IDEuMDE1NjIgOCAyLjI1QzggMy41IDYuMjAzMTIgNC41IDQgNC41Wk0xLjM0Mzc1IDIuODkwNjJDMS41MzEyNSAzLjA2MjUgMS43ODEyNSAzLjIwMzEyIDIuMDQ2ODggMy4yOTY4OEMyLjU2MjUgMy41MTU2MiAzLjI1IDMuNjI1IDQgMy42MjVDNC43MzQzOCAzLjYyNSA1LjQyMTg4IDMuNTE1NjIgNS45NTMxMiAzLjI5Njg4QzYuMjAzMTIgMy4yMDMxMiA2LjQ1MzEyIDMuMDYyNSA2LjY0MDYyIDIuODkwNjJDNi44MjgxMiAyLjcwMzEyIDcgMi40NTMxMiA3IDIuMTI1QzcgMS44MTI1IDYuODI4MTIgMS41NjI1IDYuNjQwNjIgMS4zNzVDNi40NTMxMiAxLjIwMzEyIDYuMjAzMTIgMS4wNjI1IDUuOTUzMTIgMC45NTMxMjVDNS40MjE4OCAwLjc1IDQuNzM0MzggMC42MjUgNCAwLjYyNUMzLjI1IDAuNjI1IDIuNTYyNSAwLjc1IDIuMDQ2ODggMC45NTMxMjVDMS43ODEyNSAxLjA2MjUgMS41MzEyNSAxLjIwMzEyIDEuMzQzNzUgMS4zNzVDMS4xNTYyNSAxLjU2MjUgMSAxLjgxMjUgMSAyLjEyNUMxIDIuNDUzMTIgMS4xNTYyNSAyLjcwMzEyIDEuMzQzNzUgMi44OTA2MlpNMS41IDIuMTI1QzEuNSAxLjU3ODEyIDIuNjA5MzggMS4xMjUgNCAxLjEyNUM1LjM3NSAxLjEyNSA2LjUgMS41NzgxMiA2LjUgMi4xMjVDNi41IDIuNjg3NSA1LjM3NSAzLjEyNSA0IDMuMTI1QzIuNjA5MzggMy4xMjUgMS41IDIuNjg3NSAxLjUgMi4xMjVaTTAgMy41NDY4OEMwLjIwMzEyNSAzLjc4MTI1IDAuNDUzMTI1IDQgMC43NSA0LjE3MTg4VjUuMTcxODhDMC4yNjU2MjUgNC44NDM3NSAwIDQuNDM3NSAwIDRWMy41NDY4OFpNMS4yNSA1LjQ1MzEyVjQuNDUzMTJDMS42ODc1IDQuNjU2MjUgMi4xODc1IDQuODEyNSAyLjc1IDQuOTA2MjVWNS45MDYyNUMyLjE3MTg4IDUuODEyNSAxLjY3MTg4IDUuNjU2MjUgMS4yNSA1LjQ1MzEyWk0zLjI1IDUuOTY4NzVWNC45Njg3NUMzLjQ4NDM4IDUgMy43MzQzOCA1LjAxNTYyIDQgNS4wMTU2MkM0LjI1IDUuMDE1NjIgNC41IDUgNC43NSA0Ljk2ODc1VjUuOTY4NzVDNC41IDYgNC4yNSA2IDQgNkMzLjczNDM4IDYgMy40ODQzOCA2IDMuMjUgNS45Njg3NVpNNS4yNSA1LjkwNjI1VjQuOTA2MjVDNS43OTY4OCA0LjgxMjUgNi4yOTY4OCA0LjY1NjI1IDYuNzUgNC40NTMxMlY1LjQ2ODc1QzYuMzEyNSA1LjY1NjI1IDUuODEyNSA1LjgxMjUgNS4yNSA1LjkwNjI1Wk03LjI1IDUuMTcxODhWNC4xNzE4OEM3LjUzMTI1IDQgNy43ODEyNSAzLjc4MTI1IDggMy41NDY4OFY0QzggNC40Mzc1IDcuNzE4NzUgNC44NDM3NSA3LjI1IDUuMTcxODhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K)
4+
[![link to source code](https://img.shields.io/badge/source%20code-E8ECF1?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgOCA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNCAwLjA5ODk5OUMxLjc5IDAuMDk4OTk5IDAgMS44OSAwIDQuMDk5QzAgNS44NjY2NyAxLjE0NiA3LjM2NTY2IDIuNzM1IDcuODk0QzIuOTM1IDcuOTMxNjYgMy4wMDgzMyA3LjgwOCAzLjAwODMzIDcuNzAxNjZDMy4wMDgzMyA3LjYwNjY2IDMuMDA1IDcuMzU1IDMuMDAzMzMgNy4wMjE2N0MxLjg5MDY3IDcuMjYzIDEuNjU2IDYuNDg1IDEuNjU2IDYuNDg1QzEuNDc0IDYuMDIzMzMgMS4yMTEgNS45IDEuMjExIDUuOUMwLjg0ODY2NyA1LjY1MiAxLjIzOSA1LjY1NyAxLjIzOSA1LjY1N0MxLjY0MDY3IDUuNjg1IDEuODUxNjcgNi4wNjkgMS44NTE2NyA2LjA2OUMyLjIwODMzIDYuNjgwNjcgMi43ODggNi41MDQgMy4wMTY2NyA2LjQwMTY2QzMuMDUyNjcgNi4xNDMgMy4xNTU2NyA1Ljk2NjY3IDMuMjcgNS44NjY2N0MyLjM4MTY3IDUuNzY2NjcgMS40NDggNS40MjI2NyAxLjQ0OCAzLjg5QzEuNDQ4IDMuNDUzMzMgMS42MDMgMy4wOTY2NyAxLjg1OTY3IDIuODE2NjdDMS44MTQ2NyAyLjcxNTY3IDEuNjc5NjcgMi4zMDkgMS44OTQ2NyAxLjc1OEMxLjg5NDY3IDEuNzU4IDIuMjI5NjcgMS42NTA2NyAyLjk5NDY3IDIuMTY4QzMuMzE0NjcgMi4wNzkgMy42NTQ2NyAyLjAzNSAzLjk5NDY3IDIuMDMzQzQuMzM0NjcgMi4wMzUgNC42NzQ2NyAyLjA3OSA0Ljk5NDY3IDIuMTY4QzUuNzU0NjcgMS42NTA2NyA2LjA4OTY3IDEuNzU4IDYuMDg5NjcgMS43NThDNi4zMDQ2NyAyLjMwOSA2LjE2OTY3IDIuNzE1NjcgNi4xMjk2NyAyLjgxNjY3QzYuMzg0NjcgMy4wOTY2NyA2LjUzOTY3IDMuNDUzMzMgNi41Mzk2NyAzLjg5QzYuNTM5NjcgNS40MjY2NyA1LjYwNDY3IDUuNzY1IDQuNzE0NjcgNS44NjMzM0M0Ljg1NDY3IDUuOTgzMzMgNC45ODQ2NyA2LjIyODY2IDQuOTg0NjcgNi42MDMzM0M0Ljk4NDY3IDcuMTM4NjYgNC45Nzk2NyA3LjU2ODY3IDQuOTc5NjcgNy42OTg2N0M0Ljk3OTY3IDcuODAzNjcgNS4wNDk2NyA3LjkyODY3IDUuMjU0NjcgNy44ODg2N0M2Ljg1NSA3LjM2NCA4IDUuODY0IDggNC4wOTlDOCAxLjg5IDYuMjA5IDAuMDk4OTk5IDQgMC4wOTg5OTlaIiBmaWxsPSIjNTU2NTc4Ii8%2BCjwvc3ZnPgo%3D)](https://github.com/fetchai/uAgent-Examples/tree/main/1-uagents/finance/company-overview-agent)
5+
[![live](https://img.shields.io/badge/Live-8A2BE2?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOCIgdmlld0JveD0iMCAwIDEwIDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI%2BCjxwYXRoIGQ9Ik0yLjI1IDcuNUMxIDcuNSAwIDYuNSAwIDUuMjVDMCA0LjI4MTI1IDAuNjI1IDMuNDM3NSAxLjUgMy4xNDA2MkMxLjUgMy4wOTM3NSAxLjUgMy4wNDY4OCAxLjUgM0MxLjUgMS42MjUgMi42MDkzOCAwLjUgNCAwLjVDNC45MjE4OCAwLjUgNS43MzQzOCAxLjAxNTYyIDYuMTU2MjUgMS43NjU2MkM2LjM5MDYyIDEuNTkzNzUgNi42ODc1IDEuNSA3IDEuNUM3LjgyODEyIDEuNSA4LjUgMi4xNzE4OCA4LjUgM0M4LjUgMy4yMDMxMiA4LjQ1MzEyIDMuMzc1IDguMzkwNjIgMy41NDY4OEM5LjMxMjUgMy43MzQzOCAxMCA0LjU0Njg4IDEwIDUuNUMxMCA2LjYwOTM4IDkuMDkzNzUgNy41IDggNy41SDIuMjVaTTYuNzY1NjIgMy43NjU2MkM2LjkwNjI1IDMuNjI1IDYuOTA2MjUgMy4zOTA2MiA2Ljc2NTYyIDMuMjVDNi42MDkzOCAzLjA5Mzc1IDYuMzc1IDMuMDkzNzUgNi4yMzQzOCAzLjI1TDQuNSA0Ljk4NDM4TDMuNzY1NjIgNC4yNUMzLjYwOTM4IDQuMDkzNzUgMy4zNzUgNC4wOTM3NSAzLjIzNDM4IDQuMjVDMy4wNzgxMiA0LjM5MDYyIDMuMDc4MTIgNC42MjUgMy4yMzQzOCA0Ljc2NTYyTDQuMjM0MzggNS43NjU2MkM0LjM3NSA1LjkyMTg4IDQuNjA5MzggNS45MjE4OCA0Ljc2NTYyIDUuNzY1NjJMNi43NjU2MiAzLjc2NTYyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc%2BCg%3D%3D)](https://agentverse.ai/agents/details/agent1qggzwfa032ddngqkrsgn9d3qwp4a7dh34q9cnpy9np7vzzvp8ws5u0rq5d8/profile)
6+
7+
This agent uses the Alphavantage Finance API to provide company overview of a given company name.
8+
9+
## Example input
10+
11+
```python
12+
CompanyOverviewRequest(
13+
ticker: "AMZN"
14+
)
15+
```
16+
17+
## Example output
18+
19+
```python
20+
CompanyOverviewResponse(
21+
overview={
22+
"Symbol": "AMZN",
23+
"AssetType": "Common Stock",
24+
"Name": "Amazon.com Inc",
25+
"Description": "Amazon.com, Inc. is an American multinational technology company which focuses on e-commerce, cloud computing, digital streaming, and artificial intelligence. It is one of the Big Five companies in the U.S. information technology industry, along with Google, Apple, Microsoft, and Facebook. The company has been referred to as one of the most influential economic and cultural forces in the world, as well as the world's most valuable brand.",
26+
"CIK": "1018724",
27+
"Exchange": "NASDAQ",
28+
"Currency": "USD",
29+
"Country": "USA",
30+
"Sector": "TRADE & SERVICES",
31+
"Industry": "RETAIL-CATALOG & MAIL-ORDER HOUSES",
32+
"Address": "410 TERRY AVENUE NORTH, SEATTLE, WA, US",
33+
"OfficialSite": "https://www.aboutamazon.com",
34+
"FiscalYearEnd": "December",
35+
"LatestQuarter": "2024-06-30",
36+
"MarketCapitalization": "1957324390000",
37+
"EBITDA": "104049000000",
38+
"PERatio": "44.51",
39+
"PEGRatio": "1.771",
40+
"BookValue": "22.54",
41+
"DividendPerShare": "None",
42+
"DividendYield": "None",
43+
"EPS": "4.19",
44+
"RevenuePerShareTTM": "58.22",
45+
"ProfitMargin": "0.0735",
46+
"OperatingMarginTTM": "0.0992",
47+
"ReturnOnAssetsTTM": "0.0658",
48+
"ReturnOnEquityTTM": "0.219",
49+
"RevenueTTM": "604333998000",
50+
"GrossProfitTTM": "225152000000",
51+
"DilutedEPSTTM": "4.19",
52+
"QuarterlyEarningsGrowthYOY": "0.938",
53+
"QuarterlyRevenueGrowthYOY": "0.101",
54+
"AnalystTargetPrice": "218.35",
55+
"AnalystRatingStrongBuy": "17",
56+
"AnalystRatingBuy": "44",
57+
"AnalystRatingHold": "2",
58+
"AnalystRatingSell": "0",
59+
"AnalystRatingStrongSell": "0",
60+
"TrailingPE": "44.51",
61+
"ForwardPE": "31.55",
62+
"PriceToSalesRatioTTM": "3.239",
63+
"PriceToBookRatio": "8.28",
64+
"EVToRevenue": "3.311",
65+
"EVToEBITDA": "18.79",
66+
"Beta": "1.146",
67+
"52WeekHigh": "201.2",
68+
"52WeekLow": "118.35",
69+
"50DayMovingAverage": "179.94",
70+
"200DayMovingAverage": "173.92",
71+
"SharesOutstanding": "10495600000",
72+
"DividendDate": "None",
73+
"ExDividendDate": "None"
74+
}
75+
)
76+
```
77+
78+
## Usage Example
79+
80+
Copy and paste the following code into a new [Blank agent](https://agentverse.ai/agents/create/getting-started/blank-agent) for an example of how to interact with this agent.
81+
82+
```python
83+
from typing import Dict
84+
from uagents import Agent, Context, Model
85+
86+
87+
class CompanyOverviewRequest(Model):
88+
ticker: str
89+
90+
91+
class CompanyOverviewResponse(Model):
92+
overview: Dict[str, str]
93+
94+
95+
agent = Agent()
96+
97+
98+
AI_AGENT_ADDRESS = "{{ .Agent.Address }}"
99+
100+
ticker = "AMZN"
101+
102+
103+
@agent.on_event("startup")
104+
async def send_message(ctx: Context):
105+
await ctx.send(AI_AGENT_ADDRESS, CompanyOverviewRequest(ticker=ticker))
106+
ctx.logger.info(f"Sent prompt to AI agent: {ticker}")
107+
108+
109+
@agent.on_message(CompanyOverviewResponse)
110+
async def handle_response(ctx: Context, sender: str, msg: CompanyOverviewResponse):
111+
ctx.logger.info(f"Received response from {sender}:")
112+
ctx.logger.info(msg.overview)
113+
114+
115+
if __name__ == "__main__":
116+
agent.run()
117+
```
118+
119+
### Local Agent
120+
121+
1. Install the necessary packages:
122+
123+
```bash
124+
pip install uagents
125+
```
126+
127+
2. To interact with this agent from a local agent instead, replace `agent = Agent()` in the above with:
128+
129+
```python
130+
agent = Agent(
131+
name="user",
132+
endpoint="http://localhost:8001/submit",
133+
)
134+
```
135+
136+
3. Run the agent:
137+
```bash
138+
python agent.py
139+
```
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import os
2+
import time
3+
from enum import Enum
4+
from typing import Dict
5+
6+
import requests
7+
from uagents import Agent, Context, Model
8+
from uagents.experimental.quota import QuotaProtocol, RateLimit
9+
from uagents.models import ErrorMessage
10+
11+
AGENT_SEED = os.getenv("AGENT_SEED", "company-overview")
12+
AGENT_NAME = os.getenv("AGENT_NAME", "Company Overview Agent")
13+
14+
ALPHAVANTAGE_API_KEY = os.getenv("ALPHAVANTAGE_API_KEY")
15+
16+
if ALPHAVANTAGE_API_KEY is None:
17+
raise ValueError("You need to provide an API key for Alpha Vantage.")
18+
19+
20+
class CompanyOverviewRequest(Model):
21+
ticker: str
22+
23+
24+
class CompanyOverviewResponse(Model):
25+
overview: Dict[str, str]
26+
27+
28+
PORT = 8000
29+
agent = Agent(
30+
name=AGENT_NAME,
31+
seed=AGENT_SEED,
32+
port=PORT,
33+
endpoint=f"http://localhost:{PORT}/submit",
34+
)
35+
36+
proto = QuotaProtocol(
37+
storage_reference=agent.storage,
38+
name="Company-Overview",
39+
version="0.1.0",
40+
default_rate_limit=RateLimit(window_size_minutes=60, max_requests=6),
41+
)
42+
43+
44+
def fetch_overview_json(ticker: str) -> dict:
45+
url = f"https://www.alphavantage.co/query?function=OVERVIEW&symbol={ticker}&apikey={ALPHAVANTAGE_API_KEY}"
46+
47+
try:
48+
response = requests.get(url, timeout=10)
49+
except requests.exceptions.Timeout:
50+
return {"error": "The request timed out. Please try again."}
51+
except requests.exceptions.RequestException as e:
52+
return {"error": f"An error occurred: {e}"}
53+
54+
data = response.json()
55+
56+
if not data or "Symbol" not in data:
57+
return {"error": "No valid data found in the response."}
58+
59+
return data
60+
61+
62+
@proto.on_message(
63+
CompanyOverviewRequest, replies={CompanyOverviewResponse, ErrorMessage}
64+
)
65+
async def handle_request(ctx: Context, sender: str, msg: CompanyOverviewRequest):
66+
ctx.logger.info(f"Received company overview request for ticker: {msg.ticker}")
67+
cache = ctx.storage.get(msg.ticker) or None
68+
if cache:
69+
if int(time.time()) - cache["timestamp"] < 86400:
70+
cache.pop("timestamp")
71+
ctx.logger.info(f"Sending cached data for ticker: {msg.ticker}")
72+
await ctx.send(sender, CompanyOverviewResponse(overview=cache))
73+
return
74+
75+
try:
76+
ctx.logger.info(f"Fetching company overview for ticker: {msg.ticker}")
77+
output_json = fetch_overview_json(msg.ticker)
78+
except Exception as err:
79+
ctx.logger.error(err)
80+
await ctx.send(
81+
sender,
82+
ErrorMessage(
83+
error="An error occurred while processing the request. Please try again later."
84+
),
85+
)
86+
return
87+
await ctx.send(sender, CompanyOverviewResponse(overview=output_json))
88+
if "error" not in output_json:
89+
output_json["timestamp"] = int(time.time())
90+
ctx.storage.set(msg.ticker, output_json)
91+
92+
93+
agent.include(proto, publish_manifest=True)
94+
95+
96+
# Health check related code
97+
def agent_is_healthy():
98+
return True
99+
100+
101+
class HealthCheck(Model):
102+
pass
103+
104+
105+
class HealthStatus(str, Enum):
106+
HEALTHY = "healthy"
107+
UNHEALTHY = "unhealthy"
108+
109+
110+
class AgentHealth(Model):
111+
agent_name: str
112+
status: HealthStatus
113+
114+
115+
health_protocol = QuotaProtocol(
116+
storage_reference=agent.storage, name="HealthProtocol", version="0.1.0"
117+
)
118+
119+
120+
@health_protocol.on_message(HealthCheck, replies={AgentHealth})
121+
async def handle_health_check(ctx: Context, sender: str, msg: HealthCheck):
122+
status = HealthStatus.UNHEALTHY
123+
try:
124+
agent_is_healthy()
125+
status = HealthStatus.HEALTHY
126+
except Exception as err:
127+
ctx.logger.error(err)
128+
finally:
129+
await ctx.send(sender, AgentHealth(agent_name=AGENT_NAME, status=status))
130+
131+
132+
agent.include(health_protocol, publish_manifest=True)
133+
134+
if __name__ == "__main__":
135+
agent.run()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[tool.poetry]
2+
name = "company-overview-agent"
3+
version = "0.1.0"
4+
description = "This agent helps you to get overview of a given company's ticker symbol."
5+
authors = ["abhifetch <[email protected]>"]
6+
readme = "README.md"
7+
8+
[tool.poetry.dependencies]
9+
python = "^3.10,<3.13"
10+
uagents = "^0.15.2"
11+
requests = "^2.32.3"
12+
13+
[build-system]
14+
requires = ["poetry-core"]
15+
build-backend = "poetry.core.masonry.api"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[agent]
2+
address = "agent1qd5rat92njmv3ye7wqustxeum3agjz7atanw02cjyn9ksuuyz85vkvmhy6x"
3+
include = ""
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALPHAVANTAGE_API_KEY=
2+
OPENAI_API_KEY=

0 commit comments

Comments
 (0)