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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 19 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,39 +10,47 @@ ReplyGuy is an agent on farcaster that helps you in discovering most relevant co

## The problem it solves

Content discovery is one of those problems that people don't really think about. People waste hours of their life in scrolling through the internet in search of content that is not relevant to them.
People waste hours of their life in scrolling through the internet in search of content that is not relevant to them.

### Why does this problem exist?

1. Lack of personalization in the content that is being consumed.
2. Lack of context in the content that is being consumed.
Lack of personalization and context in the content that is being consumed.


### What are the possible solutions to this problem?

The generic solution to this is to ask user to define their interests and preferences, and then based on that, the content is personalized. But this is not a good or scalable solution. No one has time to define their interests or select the option to "Not Interested".
The generic solution to this is to ask user to define their interests and preferences, and then based on that, the content is personalized.

But this is not a good or scalable solution. No one has time to define their interests or select the option to "Not Interested".

### How does ReplyGuy solve this problem?

ReplyGuy uses AI intelligence to understand each and every user's post and its intent, and if the post is reply worthy, then the agent will fetch the most relevant content across Farcaster and reply to the user's post with a link to it.

And to use the ReplyGuy, the user need to do the following:
How it works :

1. Single click subscribe to the ReplyGuy in the Farcaster miniapp.
Single click subscribe to the ReplyGuy in the Farcaster miniapp.

That's it! User not require to provide any information or context.

Now cast like before and get the most relevant content in your feed.


## Challenges we ran into

In starting we were happy with the responses from the AI and in getting our first [ **120 subscribers**](https://warpcast.com/yourreplyguy/0xa9cfb518), but when we lookout for the feedback from the users, we found two major issues:
In starting we were happy with the responses from the AI and in getting our first 120 Subscribers.

Link : https://warpcast.com/yourreplyguy/0xa9cfb518

But when we lookout for the feedback from the users, we found two major issues:

1. The reply frequency was really high.
2. Sometimes the reply was not relevant to the post.

So we sat, screamed through the night and came up with the following solution:

**Conditional reply based on the post.**
Conditional reply based on the post.

Examples:

- If the post is just a reply to some other post or any empty quote post, then don't reply.
Expand All @@ -52,13 +60,13 @@ Another issue was verifying that the data is being fetched from the trusted serv

To fix this we came up with the following solution:

**Verifiable Agent using Eigen Layer.**
Verifiable Agent using Eigen Layer.

We built an Eigen Layer AVS on Base and Ethereum to verify the data and the replies posted by the agent, using Reclaim Protocol and Othentic stack.

> **NOTE**
> NOTE
> We have deployed AVS on the *Base Sepolia and Ethereum Sepolia testnet*, due to the cost and setup of the reward distribution mechanism for validators, as we are not generating revenue right now.
> But we have a solid plan to generate revenue that is to provide a service to **subscribers to boost their posts' visibility on Farcaster to a targeted audience.** This is a well-requested feature and is present on every social media platform at a very high price, but we will be able to provide it at a very low price with much better results.
> But we have a solid plan to generate revenue that is to provide a service to subscribers to boost their posts' visibility on Farcaster to a targeted audience. This is a well-requested feature and is present on every social media platform at a very high price, but we will be able to provide it at a very low price with much better results.

## Tech Stack

Expand Down
15 changes: 9 additions & 6 deletions backend/MCP_Execution_Server/src/services/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ export class UserService {
}

async registerCast(fid: string, cast: any) {
console.log("registering cast", `https://warpcast.com/yourreplyguy/${cast.hash}`);
console.log("registering cast", `https://warpcast.com/${cast.author.username}/${cast.hash}`);

if (cast.text === "") {
console.log("Cast text is empty, skipping");
Expand Down Expand Up @@ -281,7 +281,6 @@ export class UserService {

const { data: similarUsers, error: similarityError } =
await this.db.fetchSimilarFIDs(castEmbeddings, 0.4, 3);
console.log("Similar users", similarUsers);
if (similarityError || !similarUsers) {
throw new Error("Error finding similar users");
}
Expand Down Expand Up @@ -317,15 +316,19 @@ export class UserService {
}

if (
aiResponse.replyText ===
"No relevant trending casts found in the provided data." ||
aiResponse.replyText === "No relevant trending casts found in the provided data." ||
aiResponse.replyText === "No response needed for this cast."
|| aiResponse.link === ""
) {
console.log("No relevant trending casts found");
console.log(`AI indicated no reply needed or no relevant data: ${aiResponse.replyText}`);
return { success: true, data: aiResponse };
}

if (aiResponse.link === "") {
// Assuming a link is mandatory for a reply. If not, this logic might need to change.
console.log("AI response generated, but no link was provided. Skipping reply.");
return { success: true, data: aiResponse }; // Still returning success as the process didn't fail, but decided not to act.
}

const castReply = await this.neynarService.replyToCast({
text: aiResponse.replyText,
parentHash: cast.hash,
Expand Down