diff --git a/README.md b/README.md index 524ecce..0136ef8 100644 --- a/README.md +++ b/README.md @@ -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. @@ -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 diff --git a/backend/MCP_Execution_Server/src/services/user.service.ts b/backend/MCP_Execution_Server/src/services/user.service.ts index 56dea2c..b719682 100644 --- a/backend/MCP_Execution_Server/src/services/user.service.ts +++ b/backend/MCP_Execution_Server/src/services/user.service.ts @@ -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"); @@ -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"); } @@ -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,