From 05c2005bc31e4246218670445a282a4c270fa1f7 Mon Sep 17 00:00:00 2001 From: Alejandro-Morales Date: Thu, 27 Mar 2025 11:16:46 -0600 Subject: [PATCH 1/3] feat: add financial and weather chat agents --- .../finance/company-overview-agent/README.md | 9 +- .../finance/company-overview-agent/agent.py | 38 +-- .../company-overview-agent/chat_proto.py | 242 ++++++++++++++++++ .../company-overview-agent/functions.py | 40 +++ .../README.md | 4 +- .../agent.py | 46 +--- .../chat_proto.py | 166 ++++++++++++ .../finbert.py | 44 ++++ .../utility/weather-agent/README.md | 11 +- .../utility/weather-agent/agent.py | 99 +++++++ .../utility/weather-agent/chat_proto.py | 236 +++++++++++++++++ .../utility/weather-agent/pyproject.toml | 15 ++ .../utility/weather-agent/weather.py | 43 ++++ 13 files changed, 906 insertions(+), 87 deletions(-) create mode 100644 6-deployed-agents/finance/company-overview-agent/chat_proto.py create mode 100644 6-deployed-agents/finance/company-overview-agent/functions.py create mode 100644 6-deployed-agents/finance/finbert-financial-sentiment-agent/chat_proto.py create mode 100644 6-deployed-agents/finance/finbert-financial-sentiment-agent/finbert.py create mode 100644 6-deployed-agents/utility/weather-agent/agent.py create mode 100644 6-deployed-agents/utility/weather-agent/chat_proto.py create mode 100644 6-deployed-agents/utility/weather-agent/pyproject.toml create mode 100644 6-deployed-agents/utility/weather-agent/weather.py diff --git a/6-deployed-agents/finance/company-overview-agent/README.md b/6-deployed-agents/finance/company-overview-agent/README.md index 1a14c4a..7493a4c 100644 --- a/6-deployed-agents/finance/company-overview-agent/README.md +++ b/6-deployed-agents/finance/company-overview-agent/README.md @@ -2,7 +2,6 @@ ![domain:finance](https://img.shields.io/badge/finance-3D8BD3?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgOCA2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNCA0LjVDMS43ODEyNSA0LjUgMCAzLjUgMCAyLjI1QzAgMS4wMTU2MiAxLjc4MTI1IDAgNCAwQzYuMjAzMTIgMCA4IDEuMDE1NjIgOCAyLjI1QzggMy41IDYuMjAzMTIgNC41IDQgNC41Wk0xLjM0Mzc1IDIuODkwNjJDMS41MzEyNSAzLjA2MjUgMS43ODEyNSAzLjIwMzEyIDIuMDQ2ODggMy4yOTY4OEMyLjU2MjUgMy41MTU2MiAzLjI1IDMuNjI1IDQgMy42MjVDNC43MzQzOCAzLjYyNSA1LjQyMTg4IDMuNTE1NjIgNS45NTMxMiAzLjI5Njg4QzYuMjAzMTIgMy4yMDMxMiA2LjQ1MzEyIDMuMDYyNSA2LjY0MDYyIDIuODkwNjJDNi44MjgxMiAyLjcwMzEyIDcgMi40NTMxMiA3IDIuMTI1QzcgMS44MTI1IDYuODI4MTIgMS41NjI1IDYuNjQwNjIgMS4zNzVDNi40NTMxMiAxLjIwMzEyIDYuMjAzMTIgMS4wNjI1IDUuOTUzMTIgMC45NTMxMjVDNS40MjE4OCAwLjc1IDQuNzM0MzggMC42MjUgNCAwLjYyNUMzLjI1IDAuNjI1IDIuNTYyNSAwLjc1IDIuMDQ2ODggMC45NTMxMjVDMS43ODEyNSAxLjA2MjUgMS41MzEyNSAxLjIwMzEyIDEuMzQzNzUgMS4zNzVDMS4xNTYyNSAxLjU2MjUgMSAxLjgxMjUgMSAyLjEyNUMxIDIuNDUzMTIgMS4xNTYyNSAyLjcwMzEyIDEuMzQzNzUgMi44OTA2MlpNMS41IDIuMTI1QzEuNSAxLjU3ODEyIDIuNjA5MzggMS4xMjUgNCAxLjEyNUM1LjM3NSAxLjEyNSA2LjUgMS41NzgxMiA2LjUgMi4xMjVDNi41IDIuNjg3NSA1LjM3NSAzLjEyNSA0IDMuMTI1QzIuNjA5MzggMy4xMjUgMS41IDIuNjg3NSAxLjUgMi4xMjVaTTAgMy41NDY4OEMwLjIwMzEyNSAzLjc4MTI1IDAuNDUzMTI1IDQgMC43NSA0LjE3MTg4VjUuMTcxODhDMC4yNjU2MjUgNC44NDM3NSAwIDQuNDM3NSAwIDRWMy41NDY4OFpNMS4yNSA1LjQ1MzEyVjQuNDUzMTJDMS42ODc1IDQuNjU2MjUgMi4xODc1IDQuODEyNSAyLjc1IDQuOTA2MjVWNS45MDYyNUMyLjE3MTg4IDUuODEyNSAxLjY3MTg4IDUuNjU2MjUgMS4yNSA1LjQ1MzEyWk0zLjI1IDUuOTY4NzVWNC45Njg3NUMzLjQ4NDM4IDUgMy43MzQzOCA1LjAxNTYyIDQgNS4wMTU2MkM0LjI1IDUuMDE1NjIgNC41IDUgNC43NSA0Ljk2ODc1VjUuOTY4NzVDNC41IDYgNC4yNSA2IDQgNkMzLjczNDM4IDYgMy40ODQzOCA2IDMuMjUgNS45Njg3NVpNNS4yNSA1LjkwNjI1VjQuOTA2MjVDNS43OTY4OCA0LjgxMjUgNi4yOTY4OCA0LjY1NjI1IDYuNzUgNC40NTMxMlY1LjQ2ODc1QzYuMzEyNSA1LjY1NjI1IDUuODEyNSA1LjgxMjUgNS4yNSA1LjkwNjI1Wk03LjI1IDUuMTcxODhWNC4xNzE4OEM3LjUzMTI1IDQgNy43ODEyNSAzLjc4MTI1IDggMy41NDY4OFY0QzggNC40Mzc1IDcuNzE4NzUgNC44NDM3NSA3LjI1IDUuMTcxODhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K) [![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/6-deployed-agents/finance/company-overview-agent) -[![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) This agent uses the Alphavantage Finance API to provide company overview of a given company name. @@ -85,7 +84,9 @@ from uagents import Agent, Context, Model class CompanyOverviewRequest(Model): - ticker: str + ticker: str = Field( + description="The stock ticker symbol (e.g., AAPL for Apple Inc.) used to identify the company on financial markets.", + ) class CompanyOverviewResponse(Model): @@ -95,7 +96,7 @@ class CompanyOverviewResponse(Model): agent = Agent() -AI_AGENT_ADDRESS = "{{ .Agent.Address }}" +AI_AGENT_ADDRESS = "" ticker = "AMZN" @@ -109,7 +110,7 @@ async def send_message(ctx: Context): @agent.on_message(CompanyOverviewResponse) async def handle_response(ctx: Context, sender: str, msg: CompanyOverviewResponse): ctx.logger.info(f"Received response from {sender}:") - ctx.logger.info(msg.overview) + ctx.logger.info(str(msg.overview)) if __name__ == "__main__": diff --git a/6-deployed-agents/finance/company-overview-agent/agent.py b/6-deployed-agents/finance/company-overview-agent/agent.py index 487fe09..2c2cdee 100644 --- a/6-deployed-agents/finance/company-overview-agent/agent.py +++ b/6-deployed-agents/finance/company-overview-agent/agent.py @@ -1,29 +1,17 @@ import os import time from enum import Enum -from typing import Dict -import requests +from chat_proto import chat_proto, struct_output_client_proto from uagents import Agent, Context, Model from uagents.experimental.quota import QuotaProtocol, RateLimit from uagents.models import ErrorMessage +from functions import CompanyOverviewResponse, CompanyOverviewRequest, fetch_overview_json + AGENT_SEED = os.getenv("AGENT_SEED", "company-overview") AGENT_NAME = os.getenv("AGENT_NAME", "Company Overview Agent") -ALPHAVANTAGE_API_KEY = os.getenv("ALPHAVANTAGE_API_KEY") - -if ALPHAVANTAGE_API_KEY is None: - raise ValueError("You need to provide an API key for Alpha Vantage.") - - -class CompanyOverviewRequest(Model): - ticker: str - - -class CompanyOverviewResponse(Model): - overview: Dict[str, str] - PORT = 8000 agent = Agent( @@ -41,24 +29,6 @@ class CompanyOverviewResponse(Model): ) -def fetch_overview_json(ticker: str) -> dict: - url = f"https://www.alphavantage.co/query?function=OVERVIEW&symbol={ticker}&apikey={ALPHAVANTAGE_API_KEY}" - - try: - response = requests.get(url, timeout=10) - except requests.exceptions.Timeout: - return {"error": "The request timed out. Please try again."} - except requests.exceptions.RequestException as e: - return {"error": f"An error occurred: {e}"} - - data = response.json() - - if not data or "Symbol" not in data: - return {"error": "No valid data found in the response."} - - return data - - @proto.on_message( CompanyOverviewRequest, replies={CompanyOverviewResponse, ErrorMessage} ) @@ -91,6 +61,8 @@ async def handle_request(ctx: Context, sender: str, msg: CompanyOverviewRequest) agent.include(proto, publish_manifest=True) +agent.include(chat_proto, publish_manifest=True) +agent.include(struct_output_client_proto, publish_manifest=True) # Health check related code diff --git a/6-deployed-agents/finance/company-overview-agent/chat_proto.py b/6-deployed-agents/finance/company-overview-agent/chat_proto.py new file mode 100644 index 0000000..cd64e7b --- /dev/null +++ b/6-deployed-agents/finance/company-overview-agent/chat_proto.py @@ -0,0 +1,242 @@ +import os +import time +from typing import Any, Literal, TypedDict +from datetime import datetime +from pydantic.v1 import UUID4 +from uagents import Model, Protocol, Context +from uuid import uuid4 + +from functions import CompanyOverviewRequest, fetch_overview_json + + +AI_AGENT_ADDRESS = os.getenv("AI_AGENT_ADDRESS") + + +class Metadata(TypedDict): + + # primarily used with hte `Resource` model. This field specifies the mime_type of + # resource that is being referenced. A full list can be found at `docs/mime_types.md` + mime_type: str + + # the role of the resource + role: str + + +class TextContent(Model): + type: Literal["text"] + + # The text of the content. The format of this field is UTF-8 encoded strings. Additionally, + # markdown based formatting can be used and will be supported by most clients + text: str + + +class Resource(Model): + + # the uri of the resource + uri: str + + # the set of metadata for this resource, for more detailed description of the set of + # fields see `docs/metadata.md` + metadata: dict[str, str] + + +class ResourceContent(Model): + type: Literal["resource"] + + # The resource id + resource_id: UUID4 + + # The resource or list of resource for this content. typically only a single + # resource will be sent, however, if there are accompanying resources like + # thumbnails and audo tracks these can be additionally referenced + # + # In the case of the a list of resources, the first element of the list is always + # considered the primary resource + resource: Resource | list[Resource] + + +class MetadataContent(Model): + type: Literal["metadata"] + + # the set of metadata for this content, for more detailed description of the set of + # fields see `docs/metadata.md` + metadata: dict[str, str] + + +class StartSessionContent(Model): + type: Literal["start-session"] + + +class EndSessionContent(Model): + type: Literal["end-session"] + + +class StartStreamContent(Model): + type: Literal["start-stream"] + + stream_id: UUID4 + + +class EndStreamContent(Model): + type: Literal["start-stream"] + + stream_id: UUID4 + + +# The combined agent content types +AgentContent = ( + TextContent + | ResourceContent + | MetadataContent + | StartSessionContent + | EndSessionContent + | StartStreamContent + | EndStreamContent +) + + +class ChatMessage(Model): + + # the timestamp for the message, should be in UTC + timestamp: datetime + + # a unique message id that is generated from the message instigator + msg_id: UUID4 + + # the list of content elements in the chat + content: list[AgentContent] + + +class ChatAcknowledgement(Model): + + # the timestamp for the message, should be in UTC + timestamp: datetime + + # the msg id that is being acknowledged + acknowledged_msg_id: UUID4 + + # optional acknowledgement metadata + metadata: dict[str, str] | None = None + + +def create_text_chat(text: str) -> ChatMessage: + return ChatMessage( + timestamp=datetime.utcnow(), + msg_id=uuid4(), + content=[TextContent(type="text", text=text)], + ) + +def create_end_session_chat() -> ChatMessage: + return ChatMessage( + timestamp=datetime.utcnow(), + msg_id=uuid4(), + content=[EndSessionContent(type="end-session")], + ) + + +chat_proto = Protocol(name="AgentChatProtcol", version="0.2.1") + +struct_output_client_proto = Protocol( + name="StructuredOutputClientProtocol", version="0.1.0" +) + + +class StructuredOutputPrompt(Model): + prompt: str + output_schema: dict[str, Any] + + +class StructuredOutputResponse(Model): + output: dict[str, Any] + + +@chat_proto.on_message(ChatMessage) +async def handle_message(ctx: Context, sender: str, msg: ChatMessage): + await ctx.send( + sender, + ChatAcknowledgement( + timestamp=datetime.utcnow(), acknowledged_msg_id=msg.msg_id + ), + ) + for item in msg.content: + if isinstance(item, StartSessionContent): + ctx.logger.info(f"Got a start session message from {sender}") + continue + elif isinstance(item, TextContent): + ctx.logger.info(f"Got a message from {sender}: {item.text}") + ctx.storage.set(str(ctx.session), sender) + await ctx.send( + AI_AGENT_ADDRESS, + StructuredOutputPrompt( + prompt=item.text, output_schema=CompanyOverviewRequest.schema() + ), + ) + else: + ctx.logger.info(f"Got unexpected content from {sender}") + + +@chat_proto.on_message(ChatAcknowledgement) +async def handle_ack(ctx: Context, sender: str, msg: ChatAcknowledgement): + ctx.logger.info( + f"Got an acknowledgement from {sender} for {msg.acknowledged_msg_id}" + ) + + +@struct_output_client_proto.on_message(StructuredOutputResponse) +async def handle_structured_output_response( + ctx: Context, sender: str, msg: StructuredOutputResponse +): + prompt = CompanyOverviewRequest.parse_obj(msg.output) + session_sender = ctx.storage.get(str(ctx.session)) + if session_sender is None: + ctx.logger.error( + "Discarding message because no session sender found in storage" + ) + return + + cache = ctx.storage.get(prompt.ticker) or None + if cache: + if int(time.time()) - cache["timestamp"] < 86400: + cache.pop("timestamp") + chat_message = create_text_chat( + f"Company: {cache['Name']} ({cache['Symbol']})\n" + f"Exchange: {cache['Exchange']} | Currency: {cache['Currency']}\n" + f"Industry: {cache['Industry']} | Sector: {cache['Sector']}\n" + f"Market Cap: {cache['Currency']} {cache['MarketCapitalization']}\n" + f"PE Ratio: {cache['PERatio']} | EPS: {cache['EPS']}\n" + f"Website: {cache['OfficialSite']}\n\n" + f"Description: {cache['Description']}" + ) + await ctx.send(session_sender, chat_message) + return + + try: + output_json = fetch_overview_json(prompt.ticker) + except Exception as err: + ctx.logger.error(err) + await ctx.send( + session_sender, + create_text_chat( + "Sorry, I couldn't process your request. Please try again later." + ), + ) + return + + if "error" in output_json: + await ctx.send(session_sender, create_text_chat(str(output_json["error"]))) + return + + chat_message = create_text_chat( + f"Company: {output_json['Name']} ({output_json['Symbol']})\n" + f"Exchange: {output_json['Exchange']} | Currency: {output_json['Currency']}\n" + f"Industry: {output_json['Industry']} | Sector: {output_json['Sector']}\n" + f"Market Cap: {output_json['Currency']} {output_json['MarketCapitalization']}\n" + f"PE Ratio: {output_json['PERatio']} | EPS: {output_json['EPS']}\n" + f"Website: {output_json['OfficialSite']}\n\n" + f"Description: {output_json['Description']}" + ) + + output_json["timestamp"] = int(time.time()) + ctx.storage.set(prompt.ticker, output_json) + await ctx.send(session_sender, chat_message) + await ctx.send(session_sender, create_end_session_chat()) \ No newline at end of file diff --git a/6-deployed-agents/finance/company-overview-agent/functions.py b/6-deployed-agents/finance/company-overview-agent/functions.py new file mode 100644 index 0000000..df8a6a3 --- /dev/null +++ b/6-deployed-agents/finance/company-overview-agent/functions.py @@ -0,0 +1,40 @@ +import os +import requests +from typing import Dict +from uagents import Model +from uagents.models import Field + +ALPHAVANTAGE_API_KEY = os.getenv("ALPHAVANTAGE_API_KEY") + +if ALPHAVANTAGE_API_KEY is None: + raise ValueError("You need to provide an API key for Alpha Vantage.") + + +class CompanyOverviewRequest(Model): + ticker: str = Field( + description="The stock ticker symbol (e.g., AAPL for Apple Inc.) used to identify the company on financial markets.", + ) + + +class CompanyOverviewResponse(Model): + overview: Dict[str, str] + + +def fetch_overview_json(ticker: str) -> dict: + url = f"https://www.alphavantage.co/query?function=OVERVIEW&symbol={ticker}&apikey={ALPHAVANTAGE_API_KEY}" + + try: + response = requests.get(url, timeout=10) + except requests.exceptions.Timeout: + return {"error": "The request timed out. Please try again."} + except requests.exceptions.RequestException as e: + return {"error": f"An error occurred: {e}"} + + data = response.json() + + if not data or "Symbol" not in data: + return {"error": "No valid data found in the response."} + + return data + +print(fetch_overview_json("AMZN")) \ No newline at end of file diff --git a/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md b/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md index a784f20..076db09 100644 --- a/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md +++ b/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md @@ -1,9 +1,7 @@ # Finbert Financial Sentiment Agent ![domain:finance](https://img.shields.io/badge/finance-3D8BD3?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgOCA2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNCA0LjVDMS43ODEyNSA0LjUgMCAzLjUgMCAyLjI1QzAgMS4wMTU2MiAxLjc4MTI1IDAgNCAwQzYuMjAzMTIgMCA4IDEuMDE1NjIgOCAyLjI1QzggMy41IDYuMjAzMTIgNC41IDQgNC41Wk0xLjM0Mzc1IDIuODkwNjJDMS41MzEyNSAzLjA2MjUgMS43ODEyNSAzLjIwMzEyIDIuMDQ2ODggMy4yOTY4OEMyLjU2MjUgMy41MTU2MiAzLjI1IDMuNjI1IDQgMy42MjVDNC43MzQzOCAzLjYyNSA1LjQyMTg4IDMuNTE1NjIgNS45NTMxMiAzLjI5Njg4QzYuMjAzMTIgMy4yMDMxMiA2LjQ1MzEyIDMuMDYyNSA2LjY0MDYyIDIuODkwNjJDNi44MjgxMiAyLjcwMzEyIDcgMi40NTMxMiA3IDIuMTI1QzcgMS44MTI1IDYuODI4MTIgMS41NjI1IDYuNjQwNjIgMS4zNzVDNi40NTMxMiAxLjIwMzEyIDYuMjAzMTIgMS4wNjI1IDUuOTUzMTIgMC45NTMxMjVDNS40MjE4OCAwLjc1IDQuNzM0MzggMC42MjUgNCAwLjYyNUMzLjI1IDAuNjI1IDIuNTYyNSAwLjc1IDIuMDQ2ODggMC45NTMxMjVDMS43ODEyNSAxLjA2MjUgMS41MzEyNSAxLjIwMzEyIDEuMzQzNzUgMS4zNzVDMS4xNTYyNSAxLjU2MjUgMSAxLjgxMjUgMSAyLjEyNUMxIDIuNDUzMTIgMS4xNTYyNSAyLjcwMzEyIDEuMzQzNzUgMi44OTA2MlpNMS41IDIuMTI1QzEuNSAxLjU3ODEyIDIuNjA5MzggMS4xMjUgNCAxLjEyNUM1LjM3NSAxLjEyNSA2LjUgMS41NzgxMiA2LjUgMi4xMjVDNi41IDIuNjg3NSA1LjM3NSAzLjEyNSA0IDMuMTI1QzIuNjA5MzggMy4xMjUgMS41IDIuNjg3NSAxLjUgMi4xMjVaTTAgMy41NDY4OEMwLjIwMzEyNSAzLjc4MTI1IDAuNDUzMTI1IDQgMC43NSA0LjE3MTg4VjUuMTcxODhDMC4yNjU2MjUgNC44NDM3NSAwIDQuNDM3NSAwIDRWMy41NDY4OFpNMS4yNSA1LjQ1MzEyVjQuNDUzMTJDMS42ODc1IDQuNjU2MjUgMi4xODc1IDQuODEyNSAyLjc1IDQuOTA2MjVWNS45MDYyNUMyLjE3MTg4IDUuODEyNSAxLjY3MTg4IDUuNjU2MjUgMS4yNSA1LjQ1MzEyWk0zLjI1IDUuOTY4NzVWNC45Njg3NUMzLjQ4NDM4IDUgMy43MzQzOCA1LjAxNTYyIDQgNS4wMTU2MkM0LjI1IDUuMDE1NjIgNC41IDUgNC43NSA0Ljk2ODc1VjUuOTY4NzVDNC41IDYgNC4yNSA2IDQgNkMzLjczNDM4IDYgMy40ODQzOCA2IDMuMjUgNS45Njg3NVpNNS4yNSA1LjkwNjI1VjQuOTA2MjVDNS43OTY4OCA0LjgxMjUgNi4yOTY4OCA0LjY1NjI1IDYuNzUgNC40NTMxMlY1LjQ2ODc1QzYuMzEyNSA1LjY1NjI1IDUuODEyNSA1LjgxMjUgNS4yNSA1LjkwNjI1Wk03LjI1IDUuMTcxODhWNC4xNzE4OEM3LjUzMTI1IDQgNy43ODEyNSAzLjc4MTI1IDggMy41NDY4OFY0QzggNC40Mzc1IDcuNzE4NzUgNC44NDM3NSA3LjI1IDUuMTcxODhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K) -![tech:llm](https://img.shields.io/badge/model-E85D2E?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgOCA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMy43NSAwLjg3NVYySDMuMjAzMTJDMy4wOTM3NSAxLjcxODc1IDIuODEyNSAxLjUgMi41IDEuNUMyLjA3ODEyIDEuNSAxLjc1IDEuODQzNzUgMS43NSAyLjI1QzEuNzUgMi42NzE4OCAyLjA3ODEyIDMgMi41IDNDMi44MTI1IDMgMy4wOTM3NSAyLjc5Njg4IDMuMjAzMTIgMi41SDMuNzVWMy43NUgzQzIuNTc4MTIgMy43NSAyLjI1IDQuMDkzNzUgMi4yNSA0LjVWNS4wNDY4OEMxLjk1MzEyIDUuMTU2MjUgMS43NSA1LjQzNzUgMS43NSA1Ljc1QzEuNzUgNi4xNzE4OCAyLjA3ODEyIDYuNSAyLjUgNi41QzIuOTA2MjUgNi41IDMuMjUgNi4xNzE4OCAzLjI1IDUuNzVDMy4yNSA1LjQzNzUgMy4wMzEyNSA1LjE1NjI1IDIuNzUgNS4wNDY4OFY0LjVDMi43NSA0LjM3NSAyLjg1OTM4IDQuMjUgMyA0LjI1SDMuNzVWNy4xMjVDMy43NSA3LjYwOTM4IDMuMzQzNzUgOCAyLjg3NSA4QzIuNDIxODggOCAyLjA0Njg4IDcuNjcxODggMiA3LjIxODc1QzEuOTIxODggNy4yNSAxLjgyODEyIDcuMjUgMS43NSA3LjI1QzEuMTg3NSA3LjI1IDAuNzUgNi44MTI1IDAuNzUgNi4yNUMwLjc1IDYuMTQwNjIgMC43NjU2MjUgNi4wMzEyNSAwLjc5Njg3NSA1LjkyMTg4QzAuMzI4MTI1IDUuNzUgMCA1LjI5Njg4IDAgNC43NUMwIDQuMjY1NjIgMC4yODEyNSAzLjgyODEyIDAuNzAzMTI1IDMuNjI1QzAuNTc4MTI1IDMuNDUzMTIgMC41IDMuMjM0MzggMC41IDNDMC41IDIuNTMxMjUgMC44MjgxMjUgMi4xMjUgMS4yODEyNSAyLjAzMTI1QzEuMjUgMS45Mzc1IDEuMjUgMS44NDM3NSAxLjI1IDEuNzVDMS4yNSAxLjI5Njg4IDEuNTYyNSAwLjg5MDYyNSAyIDAuNzgxMjVDMi4wNDY4OCAwLjM0Mzc1IDIuNDIxODggMCAyLjg3NSAwQzMuMzQzNzUgMCAzLjc1IDAuNDA2MjUgMy43NSAwLjg3NVpNNC4yNSAyLjVINUM1LjEyNSAyLjUgNS4yNSAyLjYyNSA1LjI1IDIuNzVWMi43OTY4OEM0Ljk1MzEyIDIuOTA2MjUgNC43NSAzLjE4NzUgNC43NSAzLjVDNC43NSAzLjkyMTg4IDUuMDc4MTIgNC4yNSA1LjUgNC4yNUM1LjkwNjI1IDQuMjUgNi4yNSAzLjkyMTg4IDYuMjUgMy41QzYuMjUgMy4xODc1IDYuMDMxMjUgMi45MDYyNSA1Ljc1IDIuNzk2ODhWMi43NUM1Ljc1IDIuMzQzNzUgNS40MDYyNSAyIDUgMkg0LjI1VjAuODc1QzQuMjUgMC40MDYyNSA0LjY0MDYyIDAgNS4xMjUgMEM1LjU2MjUgMCA1LjkzNzUgMC4zNDM3NSA1Ljk4NDM4IDAuNzgxMjVDNi40MjE4OCAwLjg5MDYyNSA2Ljc1IDEuMjk2ODggNi43NSAxLjc1QzYuNzUgMS44NDM3NSA2LjczNDM4IDEuOTM3NSA2LjcwMzEyIDIuMDMxMjVDNy4xNTYyNSAyLjEyNSA3LjUgMi41MzEyNSA3LjUgM0M3LjUgMy4yMzQzOCA3LjQwNjI1IDMuNDUzMTIgNy4yODEyNSAzLjYyNUM3LjcwMzEyIDMuODI4MTIgOCA0LjI2NTYyIDggNC43NUM4IDUuMjk2ODggNy42NTYyNSA1Ljc1IDcuMTg3NSA1LjkyMTg4QzcuMjE4NzUgNi4wMzEyNSA3LjI1IDYuMTQwNjIgNy4yNSA2LjI1QzcuMjUgNi44MTI1IDYuNzk2ODggNy4yNSA2LjI1IDcuMjVDNi4xNTYyNSA3LjI1IDYuMDYyNSA3LjI1IDUuOTg0MzggNy4yMTg3NUM1LjkzNzUgNy42NzE4OCA1LjU2MjUgOCA1LjEyNSA4QzQuNjQwNjIgOCA0LjI1IDcuNjA5MzggNC4yNSA3LjEyNVY2SDQuNzgxMjVDNC44OTA2MiA2LjI5Njg4IDUuMTcxODggNi41IDUuNSA2LjVDNS45MDYyNSA2LjUgNi4yNSA2LjE3MTg4IDYuMjUgNS43NUM2LjI1IDUuMzQzNzUgNS45MDYyNSA1IDUuNSA1QzUuMTcxODggNSA0Ljg5MDYyIDUuMjE4NzUgNC43ODEyNSA1LjVINC4yNVYyLjVaTTIuMjUgMi4yNUMyLjI1IDIuMTI1IDIuMzU5MzggMiAyLjUgMkMyLjYyNSAyIDIuNzUgMi4xMjUgMi43NSAyLjI1QzIuNzUgMi4zOTA2MiAyLjYyNSAyLjUgMi41IDIuNUMyLjM1OTM4IDIuNSAyLjI1IDIuMzkwNjIgMi4yNSAyLjI1Wk01LjUgMy4yNUM1LjYyNSAzLjI1IDUuNzUgMy4zNzUgNS43NSAzLjVDNS43NSAzLjY0MDYyIDUuNjI1IDMuNzUgNS41IDMuNzVDNS4zNTkzOCAzLjc1IDUuMjUgMy42NDA2MiA1LjI1IDMuNUM1LjI1IDMuMzc1IDUuMzU5MzggMy4yNSA1LjUgMy4yNVpNMi4yNSA1Ljc1QzIuMjUgNS42MjUgMi4zNTkzOCA1LjUgMi41IDUuNUMyLjYyNSA1LjUgMi43NSA1LjYyNSAyLjc1IDUuNzVDMi43NSA1Ljg5MDYyIDIuNjI1IDYgMi41IDZDMi4zNTkzOCA2IDIuMjUgNS44OTA2MiAyLjI1IDUuNzVaTTUuMjUgNS43NUM1LjI1IDUuNjI1IDUuMzU5MzggNS41IDUuNSA1LjVDNS42MjUgNS41IDUuNzUgNS42MjUgNS43NSA1Ljc1QzUuNzUgNS44OTA2MiA1LjYyNSA2IDUuNSA2QzUuMzU5MzggNiA1LjI1IDUuODkwNjIgNS4yNSA1Ljc1WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==) [![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/6-deployed-agents/finance/finbert-financial-sentiment-agent) -[![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/agent1qtfz9zr5sh7jx55uvcvnf4ehsk6z2m5udesueyqr927q6rvznsjlc4npmp0/profile) This agent uses Hugging face model ProsusAI/finbert to check sentiment of the financial text. You can find the model details here [Finbert Model](https://huggingface.co/ProsusAI/finbert) @@ -45,7 +43,7 @@ class FinancialSentimentResponse(Model): agent = Agent() -AI_AGENT_ADDRESS = "{{ .Agent.Address }}" +AI_AGENT_ADDRESS = "" prompt = ( "Apple has launched its iphone 16 and the sales are half the times of iphone 15." diff --git a/6-deployed-agents/finance/finbert-financial-sentiment-agent/agent.py b/6-deployed-agents/finance/finbert-financial-sentiment-agent/agent.py index 4570e77..a7e82b4 100644 --- a/6-deployed-agents/finance/finbert-financial-sentiment-agent/agent.py +++ b/6-deployed-agents/finance/finbert-financial-sentiment-agent/agent.py @@ -1,18 +1,16 @@ import os from enum import Enum -import requests +from chat_proto import chat_proto from uagents import Agent, Context, Model from uagents.experimental.quota import QuotaProtocol, RateLimit from uagents.models import ErrorMessage +from finbert import FinancialSentimentResponse, FinancialSentimentRequest, get_finbert_sentiment + AGENT_SEED = os.getenv("AGENT_SEED", "") AGENT_NAME = os.getenv("AGENT_NAME", "Finbert Financial Sentiment Agent") -HUGGINGFACE_API_KEY = os.getenv("HUGGINGFACE_API_KEY") -if not HUGGINGFACE_API_KEY: - raise ValueError("You need to provide a Hugging Face API token.") - PORT = 8000 agent = Agent( name=AGENT_NAME, @@ -22,16 +20,6 @@ ) -class FinancialSentimentRequest(Model): - text: str - - -class FinancialSentimentResponse(Model): - positive: float - neutral: float - negative: float - - proto = QuotaProtocol( storage_reference=agent.storage, name="Financial-Sentiment", @@ -40,33 +28,6 @@ class FinancialSentimentResponse(Model): ) -async def get_finbert_sentiment(text) -> FinancialSentimentResponse: - API_URL = "https://api-inference.huggingface.co/models/ProsusAI/finbert" - headers = {"Authorization": f"Bearer {HUGGINGFACE_API_KEY}"} - - payload = { - "inputs": text, - } - - response = requests.post(API_URL, headers=headers, json=payload, timeout=30) - data = response.json() - if "error" in data: - raise ValueError(data["error"]) - - positive, neutral, negative = 0.0, 0.0, 0.0 - for entry in data[0]: - if entry["label"] == "positive": - positive = entry["score"] - elif entry["label"] == "neutral": - neutral = entry["score"] - elif entry["label"] == "negative": - negative = entry["score"] - - return FinancialSentimentResponse( - positive=positive, neutral=neutral, negative=negative - ) - - @proto.on_message( FinancialSentimentRequest, replies={FinancialSentimentResponse, ErrorMessage} ) @@ -88,6 +49,7 @@ async def handle_request(ctx: Context, sender: str, msg: FinancialSentimentReque agent.include(proto, publish_manifest=True) +agent.include(chat_proto, publish_manifest=True) ### Health check related code diff --git a/6-deployed-agents/finance/finbert-financial-sentiment-agent/chat_proto.py b/6-deployed-agents/finance/finbert-financial-sentiment-agent/chat_proto.py new file mode 100644 index 0000000..a80eac1 --- /dev/null +++ b/6-deployed-agents/finance/finbert-financial-sentiment-agent/chat_proto.py @@ -0,0 +1,166 @@ +from typing import Any, Literal, TypedDict +from datetime import datetime +from pydantic.v1 import UUID4 +from uagents import Model, Protocol, Context +from uuid import uuid4 + +from finbert import get_finbert_sentiment + + +class Metadata(TypedDict): + + # primarily used with hte `Resource` model. This field specifies the mime_type of + # resource that is being referenced. A full list can be found at `docs/mime_types.md` + mime_type: str + + # the role of the resource + role: str + + +class TextContent(Model): + type: Literal["text"] + + # The text of the content. The format of this field is UTF-8 encoded strings. Additionally, + # markdown based formatting can be used and will be supported by most clients + text: str + + +class Resource(Model): + + # the uri of the resource + uri: str + + # the set of metadata for this resource, for more detailed description of the set of + # fields see `docs/metadata.md` + metadata: dict[str, str] + + +class ResourceContent(Model): + type: Literal["resource"] + + # The resource id + resource_id: UUID4 + + # The resource or list of resource for this content. typically only a single + # resource will be sent, however, if there are accompanying resources like + # thumbnails and audo tracks these can be additionally referenced + # + # In the case of the a list of resources, the first element of the list is always + # considered the primary resource + resource: Resource | list[Resource] + + +class MetadataContent(Model): + type: Literal["metadata"] + + # the set of metadata for this content, for more detailed description of the set of + # fields see `docs/metadata.md` + metadata: dict[str, str] + + +class StartSessionContent(Model): + type: Literal["start-session"] + + +class EndSessionContent(Model): + type: Literal["end-session"] + + +class StartStreamContent(Model): + type: Literal["start-stream"] + + stream_id: UUID4 + + +class EndStreamContent(Model): + type: Literal["start-stream"] + + stream_id: UUID4 + + +# The combined agent content types +AgentContent = ( + TextContent + | ResourceContent + | MetadataContent + | StartSessionContent + | EndSessionContent + | StartStreamContent + | EndStreamContent +) + + +class ChatMessage(Model): + + # the timestamp for the message, should be in UTC + timestamp: datetime + + # a unique message id that is generated from the message instigator + msg_id: UUID4 + + # the list of content elements in the chat + content: list[AgentContent] + + +class ChatAcknowledgement(Model): + + # the timestamp for the message, should be in UTC + timestamp: datetime + + # the msg id that is being acknowledged + acknowledged_msg_id: UUID4 + + # optional acknowledgement metadata + metadata: dict[str, str] | None = None + + +def create_text_chat(text: str) -> ChatMessage: + return ChatMessage( + timestamp=datetime.utcnow(), + msg_id=uuid4(), + content=[TextContent(type="text", text=text)], + ) + + +chat_proto = Protocol(name="AgentChatProtcol", version="0.2.1") + +struct_output_client_proto = Protocol( + name="StructuredOutputClientProtocol", version="0.1.0" +) + + +@chat_proto.on_message(ChatMessage) +async def handle_message(ctx: Context, sender: str, msg: ChatMessage): + await ctx.send( + sender, + ChatAcknowledgement( + timestamp=datetime.utcnow(), acknowledged_msg_id=msg.msg_id + ), + ) + for item in msg.content: + if isinstance(item, StartSessionContent): + ctx.logger.info(f"Got a start session message from {sender}") + continue + elif isinstance(item, TextContent): + ctx.logger.info(f"Got a message from {sender}: {item.text}") + ctx.storage.set(str(ctx.session), sender) + + response = await get_finbert_sentiment(item.text) + + result = ( + f"Sentiment analysis:\n" + f"- Positive: {response.positive:.2f}\n" + f"- Neutral: {response.neutral:.2f}\n" + f"- Negative: {response.negative:.2f}" + ) + + await ctx.send(sender, create_text_chat(result)) + else: + ctx.logger.info(f"Got unexpected content from {sender}") + + +@chat_proto.on_message(ChatAcknowledgement) +async def handle_ack(ctx: Context, sender: str, msg: ChatAcknowledgement): + ctx.logger.info( + f"Got an acknowledgement from {sender} for {msg.acknowledged_msg_id}" + ) diff --git a/6-deployed-agents/finance/finbert-financial-sentiment-agent/finbert.py b/6-deployed-agents/finance/finbert-financial-sentiment-agent/finbert.py new file mode 100644 index 0000000..06f3775 --- /dev/null +++ b/6-deployed-agents/finance/finbert-financial-sentiment-agent/finbert.py @@ -0,0 +1,44 @@ +import os +import requests +from uagents import Model + +class FinancialSentimentRequest(Model): + text: str + + +class FinancialSentimentResponse(Model): + positive: float + neutral: float + negative: float + +HUGGINGFACE_API_KEY = os.getenv("HUGGINGFACE_API_KEY") + +if not HUGGINGFACE_API_KEY: + raise ValueError("You need to provide a Hugging Face API token.") + + +async def get_finbert_sentiment(text) -> FinancialSentimentResponse: + API_URL = "https://api-inference.huggingface.co/models/ProsusAI/finbert" + headers = {"Authorization": f"Bearer {HUGGINGFACE_API_KEY}"} + + payload = { + "inputs": text, + } + + response = requests.post(API_URL, headers=headers, json=payload, timeout=30) + data = response.json() + if "error" in data: + raise ValueError(data["error"]) + + positive, neutral, negative = 0.0, 0.0, 0.0 + for entry in data[0]: + if entry["label"] == "positive": + positive = entry["score"] + elif entry["label"] == "neutral": + neutral = entry["score"] + elif entry["label"] == "negative": + negative = entry["score"] + + return FinancialSentimentResponse( + positive=positive, neutral=neutral, negative=negative + ) \ No newline at end of file diff --git a/6-deployed-agents/utility/weather-agent/README.md b/6-deployed-agents/utility/weather-agent/README.md index 7826525..d5ea5c2 100644 --- a/6-deployed-agents/utility/weather-agent/README.md +++ b/6-deployed-agents/utility/weather-agent/README.md @@ -1,8 +1,7 @@ # Weather Agent ![domain:utility](https://img.shields.io/badge/utility-3D8BD3?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgNiA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMS41MDk3NyAwQzEuNzc1MzkgMCAyLjAwOTc3IDAuMjM0Mzc1IDIuMDA5NzcgMC41VjJIMS4wMDk3N1YwLjVDMS4wMDk3NyAwLjIzNDM3NSAxLjIyODUyIDAgMS41MDk3NyAwWk00LjUwOTc3IDBDNC43NzUzOSAwIDUuMDA5NzcgMC4yMzQzNzUgNS4wMDk3NyAwLjVWMkg0LjAwOTc3VjAuNUM0LjAwOTc3IDAuMjM0Mzc1IDQuMjI4NTIgMCA0LjUwOTc3IDBaTTAuNTA5NzY2IDIuNUg1LjUwOTc3QzUuNzc1MzkgMi41IDYuMDA5NzcgMi43MzQzOCA2LjAwOTc3IDNDNi4wMDk3NyAzLjI4MTI1IDUuNzc1MzkgMy41IDUuNTA5NzcgMy41VjRDNS41MDk3NyA1LjIxODc1IDQuNjUwMzkgNi4yMTg3NSAzLjUwOTc3IDYuNDUzMTJWNy41QzMuNTA5NzcgNy43ODEyNSAzLjI3NTM5IDggMy4wMDk3NyA4QzIuNzI4NTIgOCAyLjUwOTc3IDcuNzgxMjUgMi41MDk3NyA3LjVWNi40NTMxMkMxLjM2OTE0IDYuMjE4NzUgMC41MDk3NjYgNS4yMTg3NSAwLjUwOTc2NiA0VjMuNUMwLjIyODUxNiAzLjUgMC4wMDk3NjU2MiAzLjI4MTI1IDAuMDA5NzY1NjIgM0MwLjAwOTc2NTYyIDIuNzM0MzggMC4yMjg1MTYgMi41IDAuNTA5NzY2IDIuNVoiIGZpbGw9IndoaXRlIi8%2BCjwvc3ZnPgo%3D) -[![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/6-deployed-agents/utility/weather-agent) -[![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/agent1qfvydlgcxrvga2kqjxhj3hpngegtysm2c7uk48ywdue0kgvtc2f5cwhyffv/profile) +[![Alt](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/6-deployed-agents/utility/weather-agent) This agent is a simple agent that returns the information about the current temperature, weather conditions, humidity, and wind speed for a specified location. It uses the Weather API to get the weather forecast of a given location. @@ -18,7 +17,7 @@ WeatherForecastRequest( ```python WeatherForecastResponse( - location="19.3°C", + location="London", temp=" 19.3°C", condition="Partly cloudy", humidity="46%", @@ -35,7 +34,9 @@ from uagents import Agent, Context, Model class WeatherForecastRequest(Model): - location: str + location: str = Field( + description="Location", + ) class WeatherForecastResponse(Model): @@ -48,7 +49,7 @@ class WeatherForecastResponse(Model): agent = Agent() -AI_AGENT_ADDRESS = "{{ .Agent.Address }}" +AI_AGENT_ADDRESS = "" location = "London" diff --git a/6-deployed-agents/utility/weather-agent/agent.py b/6-deployed-agents/utility/weather-agent/agent.py new file mode 100644 index 0000000..0339b9b --- /dev/null +++ b/6-deployed-agents/utility/weather-agent/agent.py @@ -0,0 +1,99 @@ +import os +from enum import Enum + +from uagents import Agent, Context, Model +from uagents.experimental.quota import QuotaProtocol, RateLimit +from uagents.models import ErrorMessage + +from chat_proto import chat_proto, struct_output_client_proto +from weather import get_weather, WeatherForecastRequest, WeatherForecastResponse + +AGENT_SEED = os.getenv("AGENT_SEED", "weather-agent") +AGENT_NAME = os.getenv("AGENT_NAME", "Weather Agent") + + +PORT = 8000 +agent = Agent( + name=AGENT_NAME, + seed=AGENT_SEED, + port=PORT, + endpoint=f"http://localhost:{PORT}/submit", +) + +proto = QuotaProtocol( + storage_reference=agent.storage, + name="Weather-Agent-Protocol", + version="0.1.0", + default_rate_limit=RateLimit(window_size_minutes=60, max_requests=6), +) + +@proto.on_message( + WeatherForecastRequest, replies={WeatherForecastResponse, ErrorMessage} +) +async def handle_request(ctx: Context, sender: str, msg: WeatherForecastRequest): + ctx.logger.info(f"Received Address: {msg.location}") + try: + weather_forecast = await get_weather(msg.location) + except Exception as err: + ctx.logger.error(err) + await ctx.send(sender, ErrorMessage(error=str(err))) + + if "error" in weather_forecast: + await ctx.send(sender, ErrorMessage(error=weather_forecast["error"])) + return + await ctx.send(sender, WeatherForecastResponse(**weather_forecast)) + + +agent.include(proto, publish_manifest=True) + + +### Health check related code +def agent_is_healthy() -> bool: + """ + Implement the actual health check logic here. + + For example, check if the agent can connect to a third party API, + check if the agent has enough resources, etc. + """ + condition = True # TODO: logic here + return bool(condition) + + +class HealthCheck(Model): + pass + + +class HealthStatus(str, Enum): + HEALTHY = "healthy" + UNHEALTHY = "unhealthy" + + +class AgentHealth(Model): + agent_name: str + status: HealthStatus + + +health_protocol = QuotaProtocol( + storage_reference=agent.storage, name="HealthProtocol", version="0.1.0" +) + + +@health_protocol.on_message(HealthCheck, replies={AgentHealth}) +async def handle_health_check(ctx: Context, sender: str, msg: HealthCheck): + status = HealthStatus.UNHEALTHY + try: + if agent_is_healthy(): + status = HealthStatus.HEALTHY + except Exception as err: + ctx.logger.error(err) + finally: + await ctx.send(sender, AgentHealth(agent_name=AGENT_NAME, status=status)) + + +agent.include(health_protocol, publish_manifest=True) +agent.include(chat_proto, publish_manifest=True) +agent.include(struct_output_client_proto, publish_manifest=True) + + +if __name__ == "__main__": + agent.run() diff --git a/6-deployed-agents/utility/weather-agent/chat_proto.py b/6-deployed-agents/utility/weather-agent/chat_proto.py new file mode 100644 index 0000000..a055c37 --- /dev/null +++ b/6-deployed-agents/utility/weather-agent/chat_proto.py @@ -0,0 +1,236 @@ +import os +from typing import Any, Literal, TypedDict +from datetime import datetime +from pydantic.v1 import UUID4 +from uagents import Model, Protocol, Context +from uuid import uuid4 + +from weather import get_weather, WeatherForecastRequest + + +AI_AGENT_ADDRESS = os.getenv("claude-ai-agent") + +if not AI_AGENT_ADDRESS: + raise ValueError("AI_AGENT_ADDRESS not set") + + +class Metadata(TypedDict): + + # primarily used with hte `Resource` model. This field specifies the mime_type of + # resource that is being referenced. A full list can be found at `docs/mime_types.md` + mime_type: str + + # the role of the resource + role: str + + +class TextContent(Model): + type: Literal["text"] + + # The text of the content. The format of this field is UTF-8 encoded strings. Additionally, + # markdown based formatting can be used and will be supported by most clients + text: str + + +class Resource(Model): + + # the uri of the resource + uri: str + + # the set of metadata for this resource, for more detailed description of the set of + # fields see `docs/metadata.md` + metadata: dict[str, str] + + +class ResourceContent(Model): + type: Literal["resource"] + + # The resource id + resource_id: UUID4 + + # The resource or list of resource for this content. typically only a single + # resource will be sent, however, if there are accompanying resources like + # thumbnails and audo tracks these can be additionally referenced + # + # In the case of the a list of resources, the first element of the list is always + # considered the primary resource + resource: Resource | list[Resource] + + +class MetadataContent(Model): + type: Literal["metadata"] + + # the set of metadata for this content, for more detailed description of the set of + # fields see `docs/metadata.md` + metadata: dict[str, str] + + +class StartSessionContent(Model): + type: Literal["start-session"] + + +class EndSessionContent(Model): + type: Literal["end-session"] + + +class StartStreamContent(Model): + type: Literal["start-stream"] + + stream_id: UUID4 + + +class EndStreamContent(Model): + type: Literal["start-stream"] + + stream_id: UUID4 + + +# The combined agent content types +AgentContent = ( + TextContent + | ResourceContent + | MetadataContent + | StartSessionContent + | EndSessionContent + | StartStreamContent + | EndStreamContent +) + + +class ChatMessage(Model): + + # the timestamp for the message, should be in UTC + timestamp: datetime + + # a unique message id that is generated from the message instigator + msg_id: UUID4 + + # the list of content elements in the chat + content: list[AgentContent] + + +class ChatAcknowledgement(Model): + + # the timestamp for the message, should be in UTC + timestamp: datetime + + # the msg id that is being acknowledged + acknowledged_msg_id: UUID4 + + # optional acknowledgement metadata + metadata: dict[str, str] | None = None + + +def create_text_chat(text: str) -> ChatMessage: + return ChatMessage( + timestamp=datetime.utcnow(), + msg_id=uuid4(), + content=[TextContent(type="text", text=text)], + ) + +def create_end_session_chat() -> ChatMessage: + return ChatMessage( + timestamp=datetime.utcnow(), + msg_id=uuid4(), + content=[EndSessionContent(type="end-session")], + ) + + + +chat_proto = Protocol(name="AgentChatProtcol", version="0.2.1") + +struct_output_client_proto = Protocol( + name="StructuredOutputClientProtocol", version="0.1.0" +) + + +class StructuredOutputPrompt(Model): + prompt: str + output_schema: dict[str, Any] + + +class StructuredOutputResponse(Model): + output: dict[str, Any] + + +@chat_proto.on_message(ChatMessage) +async def handle_message(ctx: Context, sender: str, msg: ChatMessage): + ctx.logger.info(f"Got a message from {sender}: {msg.content[0].text}") + ctx.storage.set(str(ctx.session), sender) + await ctx.send( + sender, + ChatAcknowledgement(timestamp=datetime.utcnow(), acknowledged_msg_id=msg.msg_id), + ) + + for item in msg.content: + if isinstance(item, StartSessionContent): + ctx.logger.info(f"Got a start session message from {sender}") + continue + elif isinstance(item, TextContent): + ctx.logger.info(f"Got a message from {sender}: {item.text}") + ctx.storage.set(str(ctx.session), sender) + await ctx.send( + AI_AGENT_ADDRESS, + StructuredOutputPrompt( + prompt=item.text, output_schema=WeatherForecastRequest.schema() + ), + ) + else: + ctx.logger.info(f"Got unexpected content from {sender}") + + +@chat_proto.on_message(ChatAcknowledgement) +async def handle_ack(ctx: Context, sender: str, msg: ChatAcknowledgement): + ctx.logger.info( + f"Got an acknowledgement from {sender} for {msg.acknowledged_msg_id}" + ) + + +@struct_output_client_proto.on_message(StructuredOutputResponse) +async def handle_structured_output_response( + ctx: Context, sender: str, msg: StructuredOutputResponse +): + session_sender = ctx.storage.get(str(ctx.session)) + if session_sender is None: + ctx.logger.error( + "Discarding message because no session sender found in storage" + ) + return + + if "" in str(msg.output): + await ctx.send( + session_sender, + create_text_chat( + "Sorry, I couldn't process your location request. Please try again later." + ), + ) + return + + prompt = WeatherForecastRequest.parse_obj(msg.output) + + try: + weather_forecast = await get_weather(prompt) + except Exception as err: + ctx.logger.error(err) + await ctx.send( + session_sender, + create_text_chat( + "Sorry, I couldn't process your request. Please try again later." + ), + ) + return + + if "error" in weather_forecast: + await ctx.send(session_sender, create_text_chat(str(weather_forecast["error"]))) + return + + chat_message = create_text_chat( + f"Location: {weather_forecast['location']}\n" + f"Temperature: {weather_forecast['temp']}\n" + f"Condition: {weather_forecast['condition']}\n" + f"Humidity: {weather_forecast['humidity']}\n" + f"Windspeed: {weather_forecast['wind_speed']}\n" + ) + + await ctx.send(session_sender, chat_message) + await ctx.send(session_sender, create_end_session_chat()) diff --git a/6-deployed-agents/utility/weather-agent/pyproject.toml b/6-deployed-agents/utility/weather-agent/pyproject.toml new file mode 100644 index 0000000..3e948f1 --- /dev/null +++ b/6-deployed-agents/utility/weather-agent/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "weather-agent" +version = "0.1.0" +description = "Weather Agent" +authors = ["Kshipra Dhame "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10,<3.13" +uagents = "^0.15.2" +requests = "^2.32.3" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/6-deployed-agents/utility/weather-agent/weather.py b/6-deployed-agents/utility/weather-agent/weather.py new file mode 100644 index 0000000..6f146f7 --- /dev/null +++ b/6-deployed-agents/utility/weather-agent/weather.py @@ -0,0 +1,43 @@ +import os +import requests + +from uagents import Model +from uagents.models import Field + +API_KEY = os.getenv("WEATHERAPI_KEY") + +class WeatherForecastRequest(Model): + location: str = Field( + description="Location", + ) + +class WeatherForecastResponse(Model): + location: str + temp: float + condition: str + humidity: float + wind_speed: float + + +async def get_weather(location) -> dict: + url = f"http://api.weatherapi.com/v1/current.json?key={API_KEY}&q={location}&aqi=no" + + try: + response = requests.get(url, timeout=10) + except requests.exceptions.Timeout: + return {"error": "The request timed out. Please try again."} + except requests.exceptions.RequestException as e: + return {"error": f"An error occurred: {e}"} + + weather_data = response.json() + + if "error" in weather_data: + return {"error": weather_data["error"]["message"]} + + return { + "location": location, + "temp": weather_data["current"]["temp_c"], + "condition": weather_data["current"]["condition"]["text"], + "humidity": weather_data["current"]["humidity"], + "wind_speed": weather_data["current"]["wind_kph"], + } \ No newline at end of file From 7dc2ac3c7d3716a7adb9559adbc64b4834678d43 Mon Sep 17 00:00:00 2001 From: Alejandro-Morales Date: Thu, 27 Mar 2025 11:25:07 -0600 Subject: [PATCH 2/3] fix: README tags --- 6-deployed-agents/finance/company-overview-agent/README.md | 1 + .../finance/finbert-financial-sentiment-agent/README.md | 2 ++ 6-deployed-agents/utility/weather-agent/README.md | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/6-deployed-agents/finance/company-overview-agent/README.md b/6-deployed-agents/finance/company-overview-agent/README.md index 7493a4c..7bfedb4 100644 --- a/6-deployed-agents/finance/company-overview-agent/README.md +++ b/6-deployed-agents/finance/company-overview-agent/README.md @@ -2,6 +2,7 @@ ![domain:finance](https://img.shields.io/badge/finance-3D8BD3?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgOCA2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNCA0LjVDMS43ODEyNSA0LjUgMCAzLjUgMCAyLjI1QzAgMS4wMTU2MiAxLjc4MTI1IDAgNCAwQzYuMjAzMTIgMCA4IDEuMDE1NjIgOCAyLjI1QzggMy41IDYuMjAzMTIgNC41IDQgNC41Wk0xLjM0Mzc1IDIuODkwNjJDMS41MzEyNSAzLjA2MjUgMS43ODEyNSAzLjIwMzEyIDIuMDQ2ODggMy4yOTY4OEMyLjU2MjUgMy41MTU2MiAzLjI1IDMuNjI1IDQgMy42MjVDNC43MzQzOCAzLjYyNSA1LjQyMTg4IDMuNTE1NjIgNS45NTMxMiAzLjI5Njg4QzYuMjAzMTIgMy4yMDMxMiA2LjQ1MzEyIDMuMDYyNSA2LjY0MDYyIDIuODkwNjJDNi44MjgxMiAyLjcwMzEyIDcgMi40NTMxMiA3IDIuMTI1QzcgMS44MTI1IDYuODI4MTIgMS41NjI1IDYuNjQwNjIgMS4zNzVDNi40NTMxMiAxLjIwMzEyIDYuMjAzMTIgMS4wNjI1IDUuOTUzMTIgMC45NTMxMjVDNS40MjE4OCAwLjc1IDQuNzM0MzggMC42MjUgNCAwLjYyNUMzLjI1IDAuNjI1IDIuNTYyNSAwLjc1IDIuMDQ2ODggMC45NTMxMjVDMS43ODEyNSAxLjA2MjUgMS41MzEyNSAxLjIwMzEyIDEuMzQzNzUgMS4zNzVDMS4xNTYyNSAxLjU2MjUgMSAxLjgxMjUgMSAyLjEyNUMxIDIuNDUzMTIgMS4xNTYyNSAyLjcwMzEyIDEuMzQzNzUgMi44OTA2MlpNMS41IDIuMTI1QzEuNSAxLjU3ODEyIDIuNjA5MzggMS4xMjUgNCAxLjEyNUM1LjM3NSAxLjEyNSA2LjUgMS41NzgxMiA2LjUgMi4xMjVDNi41IDIuNjg3NSA1LjM3NSAzLjEyNSA0IDMuMTI1QzIuNjA5MzggMy4xMjUgMS41IDIuNjg3NSAxLjUgMi4xMjVaTTAgMy41NDY4OEMwLjIwMzEyNSAzLjc4MTI1IDAuNDUzMTI1IDQgMC43NSA0LjE3MTg4VjUuMTcxODhDMC4yNjU2MjUgNC44NDM3NSAwIDQuNDM3NSAwIDRWMy41NDY4OFpNMS4yNSA1LjQ1MzEyVjQuNDUzMTJDMS42ODc1IDQuNjU2MjUgMi4xODc1IDQuODEyNSAyLjc1IDQuOTA2MjVWNS45MDYyNUMyLjE3MTg4IDUuODEyNSAxLjY3MTg4IDUuNjU2MjUgMS4yNSA1LjQ1MzEyWk0zLjI1IDUuOTY4NzVWNC45Njg3NUMzLjQ4NDM4IDUgMy43MzQzOCA1LjAxNTYyIDQgNS4wMTU2MkM0LjI1IDUuMDE1NjIgNC41IDUgNC43NSA0Ljk2ODc1VjUuOTY4NzVDNC41IDYgNC4yNSA2IDQgNkMzLjczNDM4IDYgMy40ODQzOCA2IDMuMjUgNS45Njg3NVpNNS4yNSA1LjkwNjI1VjQuOTA2MjVDNS43OTY4OCA0LjgxMjUgNi4yOTY4OCA0LjY1NjI1IDYuNzUgNC40NTMxMlY1LjQ2ODc1QzYuMzEyNSA1LjY1NjI1IDUuODEyNSA1LjgxMjUgNS4yNSA1LjkwNjI1Wk03LjI1IDUuMTcxODhWNC4xNzE4OEM3LjUzMTI1IDQgNy43ODEyNSAzLjc4MTI1IDggMy41NDY4OFY0QzggNC40Mzc1IDcuNzE4NzUgNC44NDM3NSA3LjI1IDUuMTcxODhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K) [![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/6-deployed-agents/finance/company-overview-agent) +[![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) This agent uses the Alphavantage Finance API to provide company overview of a given company name. diff --git a/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md b/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md index 076db09..b17934c 100644 --- a/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md +++ b/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md @@ -1,7 +1,9 @@ # Finbert Financial Sentiment Agent ![domain:finance](https://img.shields.io/badge/finance-3D8BD3?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI2IiB2aWV3Qm94PSIwIDAgOCA2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNCA0LjVDMS43ODEyNSA0LjUgMCAzLjUgMCAyLjI1QzAgMS4wMTU2MiAxLjc4MTI1IDAgNCAwQzYuMjAzMTIgMCA4IDEuMDE1NjIgOCAyLjI1QzggMy41IDYuMjAzMTIgNC41IDQgNC41Wk0xLjM0Mzc1IDIuODkwNjJDMS41MzEyNSAzLjA2MjUgMS43ODEyNSAzLjIwMzEyIDIuMDQ2ODggMy4yOTY4OEMyLjU2MjUgMy41MTU2MiAzLjI1IDMuNjI1IDQgMy42MjVDNC43MzQzOCAzLjYyNSA1LjQyMTg4IDMuNTE1NjIgNS45NTMxMiAzLjI5Njg4QzYuMjAzMTIgMy4yMDMxMiA2LjQ1MzEyIDMuMDYyNSA2LjY0MDYyIDIuODkwNjJDNi44MjgxMiAyLjcwMzEyIDcgMi40NTMxMiA3IDIuMTI1QzcgMS44MTI1IDYuODI4MTIgMS41NjI1IDYuNjQwNjIgMS4zNzVDNi40NTMxMiAxLjIwMzEyIDYuMjAzMTIgMS4wNjI1IDUuOTUzMTIgMC45NTMxMjVDNS40MjE4OCAwLjc1IDQuNzM0MzggMC42MjUgNCAwLjYyNUMzLjI1IDAuNjI1IDIuNTYyNSAwLjc1IDIuMDQ2ODggMC45NTMxMjVDMS43ODEyNSAxLjA2MjUgMS41MzEyNSAxLjIwMzEyIDEuMzQzNzUgMS4zNzVDMS4xNTYyNSAxLjU2MjUgMSAxLjgxMjUgMSAyLjEyNUMxIDIuNDUzMTIgMS4xNTYyNSAyLjcwMzEyIDEuMzQzNzUgMi44OTA2MlpNMS41IDIuMTI1QzEuNSAxLjU3ODEyIDIuNjA5MzggMS4xMjUgNCAxLjEyNUM1LjM3NSAxLjEyNSA2LjUgMS41NzgxMiA2LjUgMi4xMjVDNi41IDIuNjg3NSA1LjM3NSAzLjEyNSA0IDMuMTI1QzIuNjA5MzggMy4xMjUgMS41IDIuNjg3NSAxLjUgMi4xMjVaTTAgMy41NDY4OEMwLjIwMzEyNSAzLjc4MTI1IDAuNDUzMTI1IDQgMC43NSA0LjE3MTg4VjUuMTcxODhDMC4yNjU2MjUgNC44NDM3NSAwIDQuNDM3NSAwIDRWMy41NDY4OFpNMS4yNSA1LjQ1MzEyVjQuNDUzMTJDMS42ODc1IDQuNjU2MjUgMi4xODc1IDQuODEyNSAyLjc1IDQuOTA2MjVWNS45MDYyNUMyLjE3MTg4IDUuODEyNSAxLjY3MTg4IDUuNjU2MjUgMS4yNSA1LjQ1MzEyWk0zLjI1IDUuOTY4NzVWNC45Njg3NUMzLjQ4NDM4IDUgMy43MzQzOCA1LjAxNTYyIDQgNS4wMTU2MkM0LjI1IDUuMDE1NjIgNC41IDUgNC43NSA0Ljk2ODc1VjUuOTY4NzVDNC41IDYgNC4yNSA2IDQgNkMzLjczNDM4IDYgMy40ODQzOCA2IDMuMjUgNS45Njg3NVpNNS4yNSA1LjkwNjI1VjQuOTA2MjVDNS43OTY4OCA0LjgxMjUgNi4yOTY4OCA0LjY1NjI1IDYuNzUgNC40NTMxMlY1LjQ2ODc1QzYuMzEyNSA1LjY1NjI1IDUuODEyNSA1LjgxMjUgNS4yNSA1LjkwNjI1Wk03LjI1IDUuMTcxODhWNC4xNzE4OEM3LjUzMTI1IDQgNy43ODEyNSAzLjc4MTI1IDggMy41NDY4OFY0QzggNC40Mzc1IDcuNzE4NzUgNC44NDM3NSA3LjI1IDUuMTcxODhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K) +![tech:llm](https://img.shields.io/badge/model-E85D2E?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgOCA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMy43NSAwLjg3NVYySDMuMjAzMTJDMy4wOTM3NSAxLjcxODc1IDIuODEyNSAxLjUgMi41IDEuNUMyLjA3ODEyIDEuNSAxLjc1IDEuODQzNzUgMS43NSAyLjI1QzEuNzUgMi42NzE4OCAyLjA3ODEyIDMgMi41IDNDMi44MTI1IDMgMy4wOTM3NSAyLjc5Njg4IDMuMjAzMTIgMi41SDMuNzVWMy43NUgzQzIuNTc4MTIgMy43NSAyLjI1IDQuMDkzNzUgMi4yNSA0LjVWNS4wNDY4OEMxLjk1MzEyIDUuMTU2MjUgMS43NSA1LjQzNzUgMS43NSA1Ljc1QzEuNzUgNi4xNzE4OCAyLjA3ODEyIDYuNSAyLjUgNi41QzIuOTA2MjUgNi41IDMuMjUgNi4xNzE4OCAzLjI1IDUuNzVDMy4yNSA1LjQzNzUgMy4wMzEyNSA1LjE1NjI1IDIuNzUgNS4wNDY4OFY0LjVDMi43NSA0LjM3NSAyLjg1OTM4IDQuMjUgMyA0LjI1SDMuNzVWNy4xMjVDMy43NSA3LjYwOTM4IDMuMzQzNzUgOCAyLjg3NSA4QzIuNDIxODggOCAyLjA0Njg4IDcuNjcxODggMiA3LjIxODc1QzEuOTIxODggNy4yNSAxLjgyODEyIDcuMjUgMS43NSA3LjI1QzEuMTg3NSA3LjI1IDAuNzUgNi44MTI1IDAuNzUgNi4yNUMwLjc1IDYuMTQwNjIgMC43NjU2MjUgNi4wMzEyNSAwLjc5Njg3NSA1LjkyMTg4QzAuMzI4MTI1IDUuNzUgMCA1LjI5Njg4IDAgNC43NUMwIDQuMjY1NjIgMC4yODEyNSAzLjgyODEyIDAuNzAzMTI1IDMuNjI1QzAuNTc4MTI1IDMuNDUzMTIgMC41IDMuMjM0MzggMC41IDNDMC41IDIuNTMxMjUgMC44MjgxMjUgMi4xMjUgMS4yODEyNSAyLjAzMTI1QzEuMjUgMS45Mzc1IDEuMjUgMS44NDM3NSAxLjI1IDEuNzVDMS4yNSAxLjI5Njg4IDEuNTYyNSAwLjg5MDYyNSAyIDAuNzgxMjVDMi4wNDY4OCAwLjM0Mzc1IDIuNDIxODggMCAyLjg3NSAwQzMuMzQzNzUgMCAzLjc1IDAuNDA2MjUgMy43NSAwLjg3NVpNNC4yNSAyLjVINUM1LjEyNSAyLjUgNS4yNSAyLjYyNSA1LjI1IDIuNzVWMi43OTY4OEM0Ljk1MzEyIDIuOTA2MjUgNC43NSAzLjE4NzUgNC43NSAzLjVDNC43NSAzLjkyMTg4IDUuMDc4MTIgNC4yNSA1LjUgNC4yNUM1LjkwNjI1IDQuMjUgNi4yNSAzLjkyMTg4IDYuMjUgMy41QzYuMjUgMy4xODc1IDYuMDMxMjUgMi45MDYyNSA1Ljc1IDIuNzk2ODhWMi43NUM1Ljc1IDIuMzQzNzUgNS40MDYyNSAyIDUgMkg0LjI1VjAuODc1QzQuMjUgMC40MDYyNSA0LjY0MDYyIDAgNS4xMjUgMEM1LjU2MjUgMCA1LjkzNzUgMC4zNDM3NSA1Ljk4NDM4IDAuNzgxMjVDNi40MjE4OCAwLjg5MDYyNSA2Ljc1IDEuMjk2ODggNi43NSAxLjc1QzYuNzUgMS44NDM3NSA2LjczNDM4IDEuOTM3NSA2LjcwMzEyIDIuMDMxMjVDNy4xNTYyNSAyLjEyNSA3LjUgMi41MzEyNSA3LjUgM0M3LjUgMy4yMzQzOCA3LjQwNjI1IDMuNDUzMTIgNy4yODEyNSAzLjYyNUM3LjcwMzEyIDMuODI4MTIgOCA0LjI2NTYyIDggNC43NUM4IDUuMjk2ODggNy42NTYyNSA1Ljc1IDcuMTg3NSA1LjkyMTg4QzcuMjE4NzUgNi4wMzEyNSA3LjI1IDYuMTQwNjIgNy4yNSA2LjI1QzcuMjUgNi44MTI1IDYuNzk2ODggNy4yNSA2LjI1IDcuMjVDNi4xNTYyNSA3LjI1IDYuMDYyNSA3LjI1IDUuOTg0MzggNy4yMTg3NUM1LjkzNzUgNy42NzE4OCA1LjU2MjUgOCA1LjEyNSA4QzQuNjQwNjIgOCA0LjI1IDcuNjA5MzggNC4yNSA3LjEyNVY2SDQuNzgxMjVDNC44OTA2MiA2LjI5Njg4IDUuMTcxODggNi41IDUuNSA2LjVDNS45MDYyNSA2LjUgNi4yNSA2LjE3MTg4IDYuMjUgNS43NUM2LjI1IDUuMzQzNzUgNS45MDYyNSA1IDUuNSA1QzUuMTcxODggNSA0Ljg5MDYyIDUuMjE4NzUgNC43ODEyNSA1LjVINC4yNVYyLjVaTTIuMjUgMi4yNUMyLjI1IDIuMTI1IDIuMzU5MzggMiAyLjUgMkMyLjYyNSAyIDIuNzUgMi4xMjUgMi43NSAyLjI1QzIuNzUgMi4zOTA2MiAyLjYyNSAyLjUgMi41IDIuNUMyLjM1OTM4IDIuNSAyLjI1IDIuMzkwNjIgMi4yNSAyLjI1Wk01LjUgMy4yNUM1LjYyNSAzLjI1IDUuNzUgMy4zNzUgNS43NSAzLjVDNS43NSAzLjY0MDYyIDUuNjI1IDMuNzUgNS41IDMuNzVDNS4zNTkzOCAzLjc1IDUuMjUgMy42NDA2MiA1LjI1IDMuNUM1LjI1IDMuMzc1IDUuMzU5MzggMy4yNSA1LjUgMy4yNVpNMi4yNSA1Ljc1QzIuMjUgNS42MjUgMi4zNTkzOCA1LjUgMi41IDUuNUMyLjYyNSA1LjUgMi43NSA1LjYyNSAyLjc1IDUuNzVDMi43NSA1Ljg5MDYyIDIuNjI1IDYgMi41IDZDMi4zNTkzOCA2IDIuMjUgNS44OTA2MiAyLjI1IDUuNzVaTTUuMjUgNS43NUM1LjI1IDUuNjI1IDUuMzU5MzggNS41IDUuNSA1LjVDNS42MjUgNS41IDUuNzUgNS42MjUgNS43NSA1Ljc1QzUuNzUgNS44OTA2MiA1LjYyNSA2IDUuNSA2QzUuMzU5MzggNiA1LjI1IDUuODkwNjIgNS4yNSA1Ljc1WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==) [![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/6-deployed-agents/finance/finbert-financial-sentiment-agent) +[![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/agent1qtfz9zr5sh7jx55uvcvnf4ehsk6z2m5udesueyqr927q6rvznsjlc4npmp0/profile) This agent uses Hugging face model ProsusAI/finbert to check sentiment of the financial text. You can find the model details here [Finbert Model](https://huggingface.co/ProsusAI/finbert) diff --git a/6-deployed-agents/utility/weather-agent/README.md b/6-deployed-agents/utility/weather-agent/README.md index d5ea5c2..623fe75 100644 --- a/6-deployed-agents/utility/weather-agent/README.md +++ b/6-deployed-agents/utility/weather-agent/README.md @@ -1,7 +1,8 @@ # Weather Agent ![domain:utility](https://img.shields.io/badge/utility-3D8BD3?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgNiA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMS41MDk3NyAwQzEuNzc1MzkgMCAyLjAwOTc3IDAuMjM0Mzc1IDIuMDA5NzcgMC41VjJIMS4wMDk3N1YwLjVDMS4wMDk3NyAwLjIzNDM3NSAxLjIyODUyIDAgMS41MDk3NyAwWk00LjUwOTc3IDBDNC43NzUzOSAwIDUuMDA5NzcgMC4yMzQzNzUgNS4wMDk3NyAwLjVWMkg0LjAwOTc3VjAuNUM0LjAwOTc3IDAuMjM0Mzc1IDQuMjI4NTIgMCA0LjUwOTc3IDBaTTAuNTA5NzY2IDIuNUg1LjUwOTc3QzUuNzc1MzkgMi41IDYuMDA5NzcgMi43MzQzOCA2LjAwOTc3IDNDNi4wMDk3NyAzLjI4MTI1IDUuNzc1MzkgMy41IDUuNTA5NzcgMy41VjRDNS41MDk3NyA1LjIxODc1IDQuNjUwMzkgNi4yMTg3NSAzLjUwOTc3IDYuNDUzMTJWNy41QzMuNTA5NzcgNy43ODEyNSAzLjI3NTM5IDggMy4wMDk3NyA4QzIuNzI4NTIgOCAyLjUwOTc3IDcuNzgxMjUgMi41MDk3NyA3LjVWNi40NTMxMkMxLjM2OTE0IDYuMjE4NzUgMC41MDk3NjYgNS4yMTg3NSAwLjUwOTc2NiA0VjMuNUMwLjIyODUxNiAzLjUgMC4wMDk3NjU2MiAzLjI4MTI1IDAuMDA5NzY1NjIgM0MwLjAwOTc2NTYyIDIuNzM0MzggMC4yMjg1MTYgMi41IDAuNTA5NzY2IDIuNVoiIGZpbGw9IndoaXRlIi8%2BCjwvc3ZnPgo%3D) -[![Alt](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/6-deployed-agents/utility/weather-agent) +[![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/6-deployed-agents/utility/weather-agent) +[![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/agent1qfvydlgcxrvga2kqjxhj3hpngegtysm2c7uk48ywdue0kgvtc2f5cwhyffv/profile) This agent is a simple agent that returns the information about the current temperature, weather conditions, humidity, and wind speed for a specified location. It uses the Weather API to get the weather forecast of a given location. From bf7a13cd1b426223904a48b4e8113a79463ead0d Mon Sep 17 00:00:00 2001 From: Alejandro-Morales Date: Thu, 27 Mar 2025 11:27:50 -0600 Subject: [PATCH 3/3] fix: READMEs --- 6-deployed-agents/finance/company-overview-agent/README.md | 2 +- .../finance/finbert-financial-sentiment-agent/README.md | 2 +- 6-deployed-agents/utility/weather-agent/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/6-deployed-agents/finance/company-overview-agent/README.md b/6-deployed-agents/finance/company-overview-agent/README.md index 7bfedb4..5c605f8 100644 --- a/6-deployed-agents/finance/company-overview-agent/README.md +++ b/6-deployed-agents/finance/company-overview-agent/README.md @@ -97,7 +97,7 @@ class CompanyOverviewResponse(Model): agent = Agent() -AI_AGENT_ADDRESS = "" +AI_AGENT_ADDRESS = "{{ .Agent.Address }}" ticker = "AMZN" diff --git a/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md b/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md index b17934c..a784f20 100644 --- a/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md +++ b/6-deployed-agents/finance/finbert-financial-sentiment-agent/README.md @@ -45,7 +45,7 @@ class FinancialSentimentResponse(Model): agent = Agent() -AI_AGENT_ADDRESS = "" +AI_AGENT_ADDRESS = "{{ .Agent.Address }}" prompt = ( "Apple has launched its iphone 16 and the sales are half the times of iphone 15." diff --git a/6-deployed-agents/utility/weather-agent/README.md b/6-deployed-agents/utility/weather-agent/README.md index 623fe75..b4d56c3 100644 --- a/6-deployed-agents/utility/weather-agent/README.md +++ b/6-deployed-agents/utility/weather-agent/README.md @@ -50,7 +50,7 @@ class WeatherForecastResponse(Model): agent = Agent() -AI_AGENT_ADDRESS = "" +AI_AGENT_ADDRESS = "{{ .Agent.Address }}" location = "London"