Surveillez et analysez en temps réel l’opinion du public à propos de votre marque ou vos produits grâce à l’IA, qui classe les commentaires selon leur tonalité.
Surveillez et analysez en temps réel l’opinion du public à propos de votre marque ou vos produits grâce à l’IA, qui classe les commentaires selon leur tonalité.
{
"_id": "28d4f50a9684-402b-9e94-f3ca9c5fdc9c_-_c58b27ea-be22-47bf-8319-d2822689f761_-_latest",
"active_version_id": "5fa28fc9-c771-4445-959a-57ee6657f623",
"creator_first_name": "Jagjit",
"creator_last_name": "Singh",
"creator_user_id": "931425b5-f378-494a-8333-3daf839def25",
"description": "This agent conducts deep analysis of a prospect's LinkedIn profile and recent posts to generate 3 personalized connection request variations and insights on prospect. Each message is tailored to their interests, tone, and activity — helping you build real relationships, not just connections.",
"in_marketplace": false,
"insert_date_": "2025-05-16T14:02:24.511Z",
"metadata": {
"clone_count_percentage": 1.48,
"source_project": "6f60e3e2-1ce3-465d-9af8-c9648f990248",
"source_region": "bcbe5a",
"source_studio_id": "6e2d3fcc-3dd0-4f6f-97d5-faa2944ecfd1",
"last_run_date": "2025-05-17T18:31:55.183Z"
},
"project": "28d4f50a9684-402b-9e94-f3ca9c5fdc9c",
"public": false,
"share_styles": {
"primary_color": "#FF872E",
"hide_guidance_tip": true,
"guidance_tip_text": "👆 Fill in the options above to get started....",
"cta_text": "Personalize Connection Request",
"cta_icon": "pd/play",
"hide_logo": true,
"selected_format": "shareable-link"
},
"studio_id": "c58b27ea-be22-47bf-8319-d2822689f761",
"tags": {
"categories": {
"Research": true,
"data_extraction": true,
"web_scraping": true,
"bosh": true
},
"integrations": {
"LinkedIn": true
},
"use_cases": {
"Data scraper": true
}
},
"title": "AI-Powered LinkedIn Prospect Research Agent",
"update_date_": "2025-05-17T18:57:57.765Z",
"version": "latest",
"publicly_triggerable": true,
"machine_user_id": "b3e90048-62a2-49de-84b5-68a366cf8c37",
"prompt_description": "Get a personal profile details from LinkedIn given a LinkedIn URL. Must contain: linkedin.com/in/xxx to be a valid URL.",
"emoji": "https://userdata-bcbe5a.stack.tryrelevance.com/files/public/4dc088f2dcfc-4e60-807e-353c334d4a5b/notebook-emoji-linkedin.png/6a7c68cc-8cc2-47eb-86fa-41da0df606a9.png",
"transformations": {
"steps": [
{
"transformation": "js_code_transformation",
"name": "parsed",
"output": {
"output": "{{transformed}}"
},
"params": {
"code": "const regex = /(((https?:\/\/)?((www|\w\w)\.)?linkedin\.com\/in\/)((([\w\d\-&#?=])+\/?){1,}))/;nconst match = linkedin_url.match(regex);nif (!match) {n throw new Error("Personal LinkedIn URL incorrect format. Must contain: linkedin.com/in/xxx");n}nreturn match[0];n"
},
"display_name": "Parse LinkedIn URL",
"continue_on_error": false
},
{
"transformation": "get_linkedin_profile",
"name": "person_li_profile",
"params": {
"method": "Get User Profile",
"url": "{{parsed.output}}"
},
"display_name": "Get Person's LinkedIn Profile"
},
{
"transformation": "run_chain",
"name": "get_recent_posts_from_linked_in",
"foreach": "",
"output": {
"output": "{{output}}",
"job_info": "{{job_info}}",
"errors": "{{errors}}"
},
"params": {
"studio_id": "ff57d1d6-2312-41ad-a9cb-f695a578c7e6",
"project": "28d4f50a9684-402b-9e94-f3ca9c5fdc9c",
"params": {
"last_x_days": 30,
"linkedin_url": "{{parsed.output}}"
},
"studio_override": {
"_id": "28d4f50a9684-402b-9e94-f3ca9c5fdc9c_-_ff57d1d6-2312-41ad-a9cb-f695a578c7e6_-_latest",
"active_version_id": "99d5ffad-49d5-4965-aea6-f8b3bfad23b4",
"description": "Get a set of recent LinkedIn posts by a company or person. Includes their reposts if they've added commentary.",
"in_marketplace": false,
"insert_date_": "2025-05-16T14:04:34.001Z",
"metadata": {
"clone_count_percentage": 1.78,
"source_project": "6f60e3e2-1ce3-465d-9af8-c9648f990248",
"source_region": "bcbe5a",
"source_studio_id": "29f36764-12ae-4150-897a-46735aeb0fbb",
"last_run_date": "2025-05-16T14:05:35.205Z"
},
"public": false,
"share_styles": {
"primary_color": "#008080",
"hide_guidance_tip": true,
"guidance_tip_text": "👆 Fill in the options above to get started....",
"cta_text": "Run tool",
"cta_icon": "pd/play",
"hide_logo": false,
"selected_format": "template"
},
"studio_id": "ff57d1d6-2312-41ad-a9cb-f695a578c7e6",
"tags": {
"categories": {
"Research": true,
"data_extraction": true,
"web_scraping": true,
"bosh": true,
"cloned_from_marketplace": true
},
"integrations": {
"LinkedIn": true
},
"use_cases": {
"Data scraper": true
},
"type": "transformation"
},
"title": "Get Recent Posts from LinkedIn",
"update_date_": "2025-05-16T14:04:34.001Z",
"version": "latest",
"prompt_description": "Get a set of recent LinkedIn posts by a company or person. Include how 'recent' the posts should be (in days).",
"emoji": "https://userdata-bcbe5a.stack.tryrelevance.com/files/public/4dc088f2dcfc-4e60-807e-353c334d4a5b/notebook-emoji-linkedin.png/6a7c68cc-8cc2-47eb-86fa-41da0df606a9.png",
"transformations": {
"steps": [
{
"transformation": "js_code_transformation",
"name": "parsed",
"output": {
"output": "{{transformed}}"
},
"params": {
"code": "/**n * Validates if the given LinkedIn URL is for a user or company.n */nfunction LIprofileURL(text) {n const regex = /(((https?:\/\/)?((www|\w\w)\.)?linkedin\.com\/in\/)((([\w\d\-&#?=])+\/?){1,}))/;n const match = text.match(regex);n if (match !== null) {n return { url: match[0], action: 'Get User Posts', error: false };n } else {n return null;n }n}nfunction LIcompanyURL(text) {n const regex = /(((https?:\/\/)?((www|\w\w)\.)?linkedin\.com\/company\/)((([\w\d\-&#?=])+\/?){1,}))/;n const match = text.match(regex);n if (match !== null) {n return { url: match[0], action: 'Get Company Posts', error: false };n } else {n return null;n }n}nfunction main(text) {n const profileResult = LIprofileURL(text);n if (profileResult !== null) {n return profileResult;n }nn const companyResult = LIcompanyURL(text);n if (companyResult !== null) {n return companyResult;n }nn // Return error message if neither matchesn return { error: true };n}nreturn main(params.linkedin_url);n"
},
"display_name": "Parse LinkedIn URL",
"continue_on_error": false
},
{
"transformation": "get_linkedin_profile",
"name": "linkedin",
"if": "{{parsed.output.error === false }}",
"params": {
"method": "{{parsed.output.action}}",
"url": "{{parsed.output.url}}"
},
"display_name": "Get a LinkedIn Posts"
},
{
"transformation": "python_code_transformation",
"name": "parsed_posts",
"if": "{{parsed.output.error === false }}",
"output": {
"output": "{{transformed}}"
},
"params": {
"code": "import renfrom datetime import datetime, timedeltanfrom typing import List, Dict, Anynndef extract_poster(url):n return re.search(r'linkedin\.com/(?:company|in)/([^/?]+)', url).group(1)nndef parse_repost(post) -> Dict[str, Any]:n clean_post = {n 'original_post': post.get('text'),n 'posted': post.get('posted').split(' ')[0],n 'post_id': post.get('urn')n }n if post.get('article_title'):n clean_post['shared_article_title'] = post['article_title']n if post.get('article_subtitle'):n clean_post['shared_article_subtitle'] = post['article_subtitle']n clean_post['user_comment'] = post.get('resharer_comment')n clean_post['user_posted'] = post.get('posted').split(' ')[0]n n return clean_postnndef parse_post(post) -> Dict[str, Any]:n clean_post = {n 'user_post': post.get('text'),n 'posted': post.get('posted').split(' ')[0],n 'post_id': post.get('urn')n }n if post.get('article_title'):n clean_post['shared_article_title'] = post['article_title']n if post.get('article_subtitle'):n clean_post['shared_article_subtitle'] = post['article_subtitle']n return clean_postnndef parse_linkedin_posts(posts: List[Dict[str, Any]], input_url: str, days: int) -> Dict[str, list]:n result = {n 'user_original_posts': [],n 'user_replies': []n }n if not posts:n return resultn cutoff_date = datetime.now() - timedelta(days=days)n for post in posts:n post_date = datetime.strptime(post.get('posted').split(' ')[0], '%Y-%m-%d')n if post_date < cutoff_date:n continuen n poster = (post.get('poster_linkedin_url') or n (post.get('poster') or {}).get('linkedin_url'))n is_original_poster = (input_url in poster) or (poster in input_url)n is_reshared = post.get('reshared', False)n is_commented = post.get('resharer_comment', None) is not Nonenn if is_original_poster:n # This is an original post by the usern result['user_original_posts'].append(parse_post(post))n elif not is_original_poster and is_reshared and is_commented:n # This is a repost by the user with a commentn result['user_replies'].append(parse_repost(post))nn # Sort both arrays by date (newest first)n result['user_original_posts'].sort(n key=lambda x: datetime.strptime(x['posted'], '%Y-%m-%d'),n reverse=Truen )n result['user_replies'].sort(n key=lambda x: datetime.strptime(x['user_posted'], '%Y-%m-%d'),n reverse=Truen )n return resultnnresults = parse_linkedin_posts(linkedin['data'], parsed['output']['url'], params['last_x_days'])nnif params.get('include_reposts', None):n return resultsnreturn results['user_original_posts']"
},
"display_name": "Python- filter out other posts"
}
]
},
"params_schema": {
"properties": {
"linkedin_url": {
"description": "The url of a person (https://linkedin.com/in/xxx) or company (https://linkedin.com/company/xxx) to get recent posts of.",
"frontend_metadata": {
"required": true
},
"order": 1,
"title": "LinkedIn URL",
"type": "string",
"metadata": {}
},
"last_x_days": {
"type": "number",
"min": 0,
"value": 0,
"order": 2,
"title": "Last x Days",
"metadata": {
"advanced": true
},
"description": "How many weeks back should we get posts for? [Default: 30]",
"default": 30
},
"include_reposts": {
"type": "boolean",
"value": false,
"default": false,
"order": 0,
"title": "Include Reposts?",
"description": "Check if you'd like to include any reports the profile has made that includes their own commentary on the original post. Otherwise, will only return original posts from the profile.",
"metadata": {
"is_fixed_param": true
}
}
},
"required": [
"linkedin_url",
"last_x_days"
],
"type": "object"
},
"output_schema": {},
"state_mapping": {
"linkedin": "steps.linkedin.output",
"parsed": "steps.parsed.output",
"parsed_posts": "steps.parsed_posts.output",
"linkedin_url": "params.linkedin_url",
"last_x_days": "params.last_x_days",
"include_reposts": "params.include_reposts"
},
"publicly_triggerable": false
}
}
},
{
"transformation": "prompt_completion",
"name": "summary",
"output": {
"answer": "{{answer}}"
},
"params": {
"prompt": "You will be provided with a prospect LinkedIn profile details and recent posts they made on their profile. Summarize and highlight key points that will help to connect and grow relationship with prospect. Avoid pronouns and use their name.nnOUTPUT FORMAT: {{format}}nnLinkedIn Prospect Profile:nn1. {{get_recent_posts_from_linked_in.output}}nnLinkedIn Prospect Recent Posts:nn1. {{person_li_profile.data}}"
},
"display_name": "Summary"
},
{
"transformation": "prompt_completion",
"name": "personalization",
"output": {
"answer": "{{answer}}"
},
"params": {
"prompt": "## Personalized LinkedIn Connection Request GeneratornnYou are a connection request assistant.nn### 🎯 Objective:nnGenerate **3 personalized LinkedIn connection request variations** for the person described below.nnEach variation should:nn* Be **conversational and professional. Be less enthusiastic.**nn* Reference either their **profile summary** or a **recent post**nn* Be **under 300 characters**nn* Avoid buzzwords and fluff. Keep it natural.nn* All 3 variations need to be different and not sound similar.nn---nn### 👤 LinkedIn Profile Summary:nn{{person_li_profile.data}}nn### 📝 Recent Posts (1–3 posts max):nn{{get_recent_posts_from_linked_in.output.output}}nn---nn### 🔁 Output Format:nn**Personalized Connection Request**nn1. **Variation 1**: [Connection request under 300 characters]nn2. **Variation 2**: [Connection request under 300 characters]nn3. **Variation 3**: [Connection request under 300 characters]"
},
"display_name": "Personalization"
},
{
"transformation": "send_email",
"name": "send_email",
"if": "{{email !== "" }}",
"params": {
"oauth_account_id": "dfac88ae-8aa6-40d5-a0ff-8bda8edd399b",
"provider": {
"_oneof_type_": "Gmail"
},
"to": [
"{{email}}"
],
"cc": [
""
],
"subject": "Hey There! ",
"body": "Thanks for trying out the LinkedIn Research Agent—your personalized connection messages are ready and should help you start stronger conversations. nnHere’s your breakdown of {{person_li_profile.data.first_name}}'s profile and some other insights, plus 3 message variations that you asked.nnMost people love the results but quickly realize... doing this for every lead? Not scalable, you’re not alone. We consult and implement AI solutions for businesses like yours and here are some templates that we’ve put together. nnTake a look at how it works: 👉 Done-For-You Agents - https://www.leadaisolutions.com/ai-agents nnCheers, Sahan nnFounder, LeadAi Solutionsnn{{summary.answer}}nn{{personalization.answer}}",
"limit_per_email": 30
}
}
],
"output": {
"Personalized Connection Request": "{{personalization.answer}}"
}
},
"params_schema": {
"properties": {
"linkedin_url": {
"description": "The url of a person's LinkedIn main page (ie: https://linkedin.com/in/john-smith)",
"frontend_metadata": {
"required": true
},
"order": 0,
"title": "Personal LinkedIn URL",
"type": "string",
"metadata": {}
},
"job_history_count": {
"type": "number",
"min": 0,
"value": 0,
"order": 2,
"title": "Job Experience Count",
"description": "Limit the number of records in the job history for the profile. Can be useful to reduce the context an agent is given. Default: 2",
"metadata": {
"is_fixed_param": true,
"advanced": true
},
"default": 2
},
"output_format": {
"type": "string",
"enum": [
"Markdown",
"JSON"
],
"value": "Yes",
"order": 4,
"metadata": {
"is_fixed_param": true,
"advanced": true
},
"title": "Output Format",
"description": "Define how you would like the output to look.",
"default": "Markdown"
},
"email": {
"type": "string",
"order": 5,
"title": "Email",
"description": "To send insights on ICP",
"metadata": {
"advanced": false
}
},
"opt_in": {
"type": "boolean",
"value": false,
"default": false,
"order": 6,
"title": "Yes, I’d like to receive occasional emails with AI prospecting tips, workflow automation insights, and updates from LeadAi Solutions.",
"metadata": {}
},
"format": {
"type": "string",
"metadata": {
"content_type": "long_text",
"advanced": true
},
"order": 8,
"title": "Summary Format",
"description": "This is the format of the prospect summary",
"default": "Current Role:nProfessional Background:nKey Interests and Expertise:nKey Insights from Recent Posts:nEducational Background:nConnection Opportunities:nContact Information:"
}
},
"required": [
"linkedin_url"
],
"type": "object"
},
"output_schema": {
"properties": {
"personalization_answer": {
"metadata": {
"render_mode": "auto"
}
},
"summary_answer": {
"metadata": {
"render_mode": "auto"
}
}
}
},
"state_mapping": {
"parsed": "steps.parsed.output",
"linkedin_url": "params.linkedin_url",
"job_history_count": "params.job_history_count",
"person_li_profile": "steps.person_li_profile.output",
"output_format": "params.output_format",
"get_recent_posts_from_linked_in": "steps.get_recent_posts_from_linked_in.output",
"personalization": "steps.personalization.output",
"summary": "steps.summary.output",
"email": "params.email",
"send_email": "steps.send_email.output",
"opt_in": "params.opt_in",
"format": "params.format"
},
"params": {
"job_history_count": 2,
"output_format": "Markdown",
"format": "Current Role:nProfessional Background:nKey Interests and Expertise:nKey Insights from Recent Posts:nEducational Background:nConnection Opportunities:nContact Information:"
}
}