From 6351969d3ca27da6795abe5981630ec1a506e617 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Thu, 24 Apr 2025 12:56:52 +0100 Subject: [PATCH 01/31] Update frontend explanation video --- src/data/videos/frontend-explaination.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/videos/frontend-explaination.md b/src/data/videos/frontend-explaination.md index 02655274d..3247fcdb5 100644 --- a/src/data/videos/frontend-explaination.md +++ b/src/data/videos/frontend-explaination.md @@ -13,4 +13,4 @@ tags: - 'video-sitemap' --- - + From 4447f4841cae50b038c5acaac918c40bbbaedc45 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Thu, 24 Apr 2025 19:15:14 +0100 Subject: [PATCH 02/31] Add hubspot snippet --- src/layouts/BaseLayout.astro | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 83c6b2f60..701c57403 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -186,6 +186,7 @@ const gaPageIdentifier = Astro.url.pathname + From 3a49ad556a140c7d866e6b9abe1fcb4fd92f1c19 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Thu, 24 Apr 2025 19:18:12 +0100 Subject: [PATCH 03/31] Update react router resources --- .../react/content/react-router@jvp43wFkKlGQX2y7IxkbM.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/data/roadmaps/react/content/react-router@jvp43wFkKlGQX2y7IxkbM.md b/src/data/roadmaps/react/content/react-router@jvp43wFkKlGQX2y7IxkbM.md index dc8884770..905f375d3 100644 --- a/src/data/roadmaps/react/content/react-router@jvp43wFkKlGQX2y7IxkbM.md +++ b/src/data/roadmaps/react/content/react-router@jvp43wFkKlGQX2y7IxkbM.md @@ -5,10 +5,3 @@ React router is the most famous library when it comes to implementing routing in Visit the following resources to learn more: - [@official@React Router — Official Website](https://reactrouter.com/) -- [@official@Getting Started Guide](https://reactrouter.com/en/main/start/tutorial) -- [@video@React Router v6 in 1 hour](https://youtu.be/0cSVuySEB0A) -- [@article@How to use React Router v6](https://www.robinwieruch.de/react-router/) -- [@article@React Router Cheat Sheet](https://devhints.io/react-router/) -- [@feed@Explore top posts about React](https://app.daily.dev/tags/react?ref=roadmapsh) -- [@official@Tanstack/Router — Official Website](https://tanstack.com/router/latest/docs/framework/react/overview) -- [@video@TanStack/Router - Complete Course](https://www.youtube.com/watch?v=4sslBg8LprE&list=PLOQjd5dsGSxJilh0lBofeY8Qib98kzmF5) From c83309b7db38f766bdc36d5e35996c5fc3b4beec Mon Sep 17 00:00:00 2001 From: David Willis-Owen <100765093+davidwillisowen@users.noreply.github.com> Date: Fri, 25 Apr 2025 14:57:24 +0100 Subject: [PATCH 04/31] AI Red Teaming Roadmap - Initial Commit (#8553) * Initial commit * Editing formatting --- .../advanced-techniques@soC-kcem1ISbnCQMa6BIB.md | 10 +++++++++- .../adversarial-examples@xjlttOti-_laPRn8a2fVy.md | 11 ++++++++++- .../adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md | 10 +++++++++- .../agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md | 10 +++++++++- ...ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md | 10 +++++++++- .../content/api-protection@Tszl26iNBnQBdBEWOueDA.md | 11 ++++++++++- .../content/authentication@J7gjlt2MBx7lOkOnfGvPF.md | 10 +++++++++- .../content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md | 10 +++++++++- .../automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md | 10 +++++++++- .../benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md | 10 +++++++++- .../black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md | 10 +++++++++- .../content/code-injection@vhBu5x8INTtqvx6vcYAhE.md | 10 +++++++++- .../content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md | 11 ++++++++++- ...y-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md | 10 +++++++++- .../continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md | 10 +++++++++- .../continuous-testing@65Lo60JQS5YlvvQ6KevXt.md | 10 +++++++++- .../content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md | 11 ++++++++++- .../content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md | 11 ++++++++++- .../custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md | 10 +++++++++- .../content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md | 11 ++++++++++- .../content/direct@5zHow4KZVpfhch5Aabeft.md | 10 +++++++++- .../emerging-threats@-G8v_CNa8wO_g-46_RFQo.md | 10 +++++++++- .../ethical-considerations@1gyuEV519LjN-KpROoVwv.md | 11 ++++++++++- .../content/forums@Smncq-n1OlnLAY27AFQOO.md | 11 ++++++++++- .../generative-models@3XJ-g0KvHP75U18mxCqgw.md | 10 +++++++++- .../grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md | 10 +++++++++- .../content/indirect@3_gJRtJSdm2iAfkwmcv0e.md | 10 +++++++++- .../industry-credentials@HHjsFR6wRDqUd66PMDE_7.md | 9 ++++++++- .../industry-standards@WePO66_4-gNcSdE00WKmw.md | 11 ++++++++++- .../infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md | 10 +++++++++- ...insecure-deserialization@aKzai0A8J55-OBXTnQih1.md | 11 ++++++++++- .../content/introduction@HFJIYcI16OMyM77fAw9af.md | 11 ++++++++++- .../jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md | 10 +++++++++- .../lab-environments@MmwwRK4I9aRH_ha7duPqf.md | 11 ++++++++++- .../large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md | 10 +++++++++- .../llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md | 10 +++++++++- .../content/model-inversion@iE5PcswBHnu_EBFIacib0.md | 11 ++++++++++- .../model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md | 10 +++++++++- .../model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md | 11 ++++++++++- .../monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md | 12 +++++++++++- .../content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md | 10 +++++++++- .../prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md | 12 +++++++++++- .../content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md | 10 +++++++++- .../prompt-injection@XOrAPDRhBvde9R-znEipH.md | 12 +++++++++++- .../red-team-simulations@DpYsL0du37n40toH33fIr.md | 10 +++++++++- .../reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md | 11 ++++++++++- .../remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md | 10 +++++++++- .../content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md | 10 +++++++++- .../content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md | 11 ++++++++++- .../research-opportunities@VmaIHVsCpq2um_0cA33V3.md | 10 +++++++++- .../responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md | 10 +++++++++- .../content/risk-management@MupRvk_8Io2Hn7yEvU663.md | 10 +++++++++- .../robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md | 10 +++++++++- .../role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md | 10 +++++++++- .../safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md | 10 +++++++++- .../specialized-courses@s1xKK8HL5-QGZpcutiuvj.md | 11 ++++++++++- .../supervised-learning@NvOJIv36Utpm7_kOZyr79.md | 10 +++++++++- .../testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md | 12 +++++++++++- .../content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md | 11 ++++++++++- .../unauthorized-access@DQeOavZCoXpF3k_qRDABs.md | 10 +++++++++- .../unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md | 9 ++++++++- ...vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md | 10 +++++++++- .../white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md | 10 +++++++++- .../why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md | 11 ++++++++++- 64 files changed, 601 insertions(+), 64 deletions(-) diff --git a/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md b/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md index d9fa0be71..252a8dd47 100644 --- a/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md +++ b/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md @@ -1 +1,9 @@ -# Advanced Techniques \ No newline at end of file +# Advanced Techniques + +The practice of AI Red Teaming itself will evolve. Future techniques may involve using AI adversaries to automatically discover complex vulnerabilities, developing more sophisticated methods for testing AI alignment and safety properties, simulating multi-agent system failures, and creating novel metrics for evaluating AI robustness against unknown future attacks. + +Learn more from the following resources: + +- [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses applying red teaming to complex systems. +- [@article@Advanced Techniques in AI Red Teaming for LLMs | NeuralTrust](https://neuraltrust.ai/blog/advanced-techniques-in-ai-red-teaming) - Discusses techniques like adversarial ML and automated threat intelligence for red teaming. +- [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for more advanced automated red teaming. diff --git a/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md b/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md index c05804125..3bc2d9f03 100644 --- a/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md +++ b/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md @@ -1 +1,10 @@ -# Adversarial Examples \ No newline at end of file +# Adversarial Examples + +A core AI Red Teaming activity involves generating adversarial examples – inputs slightly perturbed to cause misclassification or bypass safety filters – to test model robustness. Red teamers use various techniques (gradient-based, optimization-based, or black-box methods) to find inputs that exploit model weaknesses, informing developers on how to harden the model. + +Learn more from the following resources: + +- [@article@Adversarial Examples Explained (OpenAI Blog)](https://openai.com/research/adversarial-examples) - Introduction by OpenAI. +- [@guide@Adversarial Examples – Interpretable Machine Learning Book](https://christophm.github.io/interpretable-ml-book/adversarial.html) - In-depth explanation and examples. +- [@guide@Adversarial Testing for Generative AI | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Google's guide on adversarial testing workflows. +- [@video@How AI Can Be Tricked With Adversarial Attacks - Two Minute Papers](https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w) - Short video demonstrating adversarial examples. diff --git a/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md b/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md index d90b3d4fa..0da097c3e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md +++ b/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md @@ -1 +1,9 @@ -# Adversarial Training \ No newline at end of file +# Adversarial Training + +AI Red Teamers evaluate the effectiveness of adversarial training as a defense. They test if models trained on adversarial examples are truly robust or if new, unseen adversarial attacks can still bypass the hardened defenses. This helps refine the adversarial training process itself. + +Learn more from the following resources: + +- [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) (Discusses adversarial robustness) +- [@guide@Adversarial Testing for Generative AI | Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Covers the concept as part of testing. +- [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) (Mentions adversarial training as defense) diff --git a/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md b/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md index 9b7c40449..218e6e19b 100644 --- a/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md +++ b/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md @@ -1 +1,9 @@ -# Agentic AI Security \ No newline at end of file +# Agentic AI Security + +As AI agents capable of autonomous action become more common, AI Red Teamers must test their unique security implications. This involves assessing risks related to goal hijacking, unintended actions through tool use, exploitation of planning mechanisms, and ensuring agents operate safely within their designated boundaries. + +Learn more from the following resources: + +- [@article@AI Agents - Learn Prompting](https://learnprompting.org/docs/intermediate/ai_agents) (Background on agents) +- [@article@Reasoning models don't always say what they think - Anthropic](https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think) (Discusses agent alignment challenges) +- [@course@Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.](https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto) - Certification focusing on autonomous AI security. diff --git a/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md b/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md index 364370c2f..e9f85b418 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md +++ b/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md @@ -1 +1,9 @@ -# AI Security Fundamentals \ No newline at end of file +# AI Security Fundamentals + +This covers the foundational concepts essential for AI Red Teaming, bridging traditional cybersecurity with AI-specific threats. An AI Red Teamer must understand common vulnerabilities in ML models (like evasion or poisoning), security risks in the AI lifecycle (from data collection to deployment), and how AI capabilities can be misused. This knowledge forms the basis for designing effective tests against AI systems. + +Learn more from the following resources: + +- [@article@Building Trustworthy AI: Contending with Data Poisoning - Nisos](https://nisos.com/research/building-trustworthy-ai/) - Explores data poisoning threats in AI/ML. +- [@article@What Is Adversarial AI in Machine Learning? - Palo Alto Networks](https://www.paloaltonetworks.co.uk/cyberpedia/what-are-adversarial-attacks-on-AI-Machine-Learning) - Overview of adversarial attacks targeting AI/ML systems. +- [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Foundational course covering AI risks, governance, security, and privacy. diff --git a/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md b/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md index 97999a018..3dbaf0c47 100644 --- a/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md +++ b/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md @@ -1 +1,10 @@ -# API Protection \ No newline at end of file +# API Protection + +AI Red Teamers rigorously test the security of APIs providing access to AI models. They probe for OWASP API Top 10 vulnerabilities like broken authentication/authorization, injection flaws, security misconfigurations, and lack of rate limiting, specifically evaluating how these could lead to misuse or compromise of the AI model itself. + +Learn more from the following resources: + +- [@article@API Protection for AI Factories: The First Step to AI Security - F5](https://www.f5.com/company/blog/api-security-for-ai-factories) - Discusses the criticality of API security for AI applications. +- [@article@Securing APIs with AI for Advanced Threat Protection | Adeva](https://adevait.com/artificial-intelligence/securing-apis-with-ai) - Discusses using AI for API security, implies testing these is needed. +- [@article@Securing Machine Learning APIs (IBM)](https://developer.ibm.com/articles/se-securing-machine-learning-apis/) - Best practices for protecting ML APIs. +- [@guide@OWASP API Security Project (Top 10 2023)](https://owasp.org/www-project-api-security/) - Essential checklist for API vulnerabilities. diff --git a/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md b/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md index 66a783b30..a30269a09 100644 --- a/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md +++ b/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md @@ -1 +1,9 @@ -# Authentication \ No newline at end of file +# Authentication + +AI Red Teamers test the authentication mechanisms controlling access to AI systems and APIs. They attempt to bypass logins, steal or replay API keys/tokens, exploit weak password policies, or find flaws in MFA implementations to gain unauthorized access to the AI model or its management interfaces. + +Learn more from the following resources: + +- [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions testing authentication mechanisms in AI red teaming. +- [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation. +- [@video@How JWTs are used for Authentication (and how to bypass it) - LiveOverflow](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME) - Covers common web authentication bypass techniques relevant to APIs. diff --git a/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md b/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md index 66a783b30..6252bc255 100644 --- a/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md +++ b/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md @@ -1 +1,9 @@ -# Authentication \ No newline at end of file +# Authorization + +AI Red Teamers test authorization controls to ensure that authenticated users can only access the AI features and data permitted by their roles/permissions. They attempt privilege escalation, try to access other users' data via the AI, or manipulate the AI to perform actions beyond its authorized scope. + +Learn more from the following resources: + +- [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation. +- [@guide@Identity and access management (IAM) fundamental concepts - Learn Microsoft](https://learn.microsoft.com/en-us/entra/fundamentals/identity-fundamental-concepts) - Explains roles and permissions. +- [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) (Covers Broken Object Level/Function Level Authorization) diff --git a/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md b/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md index 5dd1cbdc4..f13eaa86c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md +++ b/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md @@ -1 +1,9 @@ -# Automated vs Manual \ No newline at end of file +# Automated vs Manual Testing + +AI Red Teaming typically employs a blend of automated tools (for large-scale scanning, fuzzing prompts, generating basic adversarial examples) and manual human testing (for creative jailbreaking, complex multi-stage attacks, evaluating nuanced safety issues like bias). Automation provides scale, while manual testing provides depth and creativity needed to find novel vulnerabilities. + +Learn more from the following resources: + +- [@article@Automation Testing vs. Manual Testing: Which is the better approach? - Opkey](https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better) - General comparison. +- [@article@Manual Testing vs Automated Testing: What's the Difference? - Leapwork](https://www.leapwork.com/blog/manual-vs-automated-testing) - General comparison. +- [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Discusses using both automated generation and human ingenuity for red teaming. diff --git a/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md b/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md index f71b33c88..a5907327f 100644 --- a/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md +++ b/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md @@ -1 +1,9 @@ -# Benchmark Datasets \ No newline at end of file +# Benchmark Datasets + +AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models. + +Learn more from the following resources: + +- [@dataset@CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset - GitHub](https://github.com/cysecbench/dataset) - Dataset of cybersecurity prompts for benchmarking LLMs. +- [@dataset@NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security](https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html) - Using CTF challenges to evaluate LLMs. +- [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Benchmarking LLMs on cybersecurity tasks. diff --git a/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md b/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md index 46dc68bec..d86adb311 100644 --- a/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md +++ b/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md @@ -1 +1,9 @@ -# Black Box Testing \ No newline at end of file +# Black Box Testing + +In AI Red Teaming, black-box testing involves probing the AI system with inputs and observing outputs without any knowledge of the model's architecture, training data, or internal logic. This simulates an external attacker and is crucial for finding vulnerabilities exploitable through publicly accessible interfaces, such as prompt injection or safety bypasses discoverable via API interaction. + +Learn more from the following resources: + +- [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types. +- [@article@What is Black Box Testing | Techniques & Examples - Imperva](https://www.imperva.com/learn/application-security/black-box-testing/) - General explanation. +- [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Contrasts black-box and white-box approaches for LLM red teaming. diff --git a/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md b/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md index 8127d97ea..6ac985369 100644 --- a/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md +++ b/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md @@ -1 +1,9 @@ -# Code Injection \ No newline at end of file +# Code Injection + +AI Red Teamers test for code injection vulnerabilities specifically in the context of AI applications. This involves probing whether user input, potentially manipulated via prompts, can lead to the execution of unintended code (e.g., SQL, OS commands, or script execution via generated code) within the application layer or connected systems, using the AI as a potential vector. + +Learn more from the following resources: + +- [@article@Code Injection in LLM Applications - NeuralTrust](https://neuraltrust.ai/blog/code-injection-in-llms) - Specifically discusses code injection risks involving LLMs. +- [@docs@Secure Plugin Sandboxing (OpenAI Plugins)](https://platform.openai.com/docs/plugins/production/security-requirements) - Context on preventing code injection via AI plugins. +- [@guide@Code Injection - OWASP Foundation](https://owasp.org/www-community/attacks/Code_Injection) - Foundational knowledge on code injection attacks. diff --git a/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md b/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md index 142b54db9..78914c0e6 100644 --- a/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md +++ b/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md @@ -1 +1,10 @@ -# Conferences \ No newline at end of file +# Conferences + +Attending major cybersecurity conferences (DEF CON, Black Hat, RSA) and increasingly specialized AI Safety/Security conferences allows AI Red Teamers to learn about cutting-edge research, network with peers, and discover new tools and attack/defense techniques. + +Learn more from the following resources: + +- [@conference@Black Hat Events](https://www.blackhat.com/) - Professional security conference with AI tracks. +- [@conference@DEF CON Hacking Conference](https://defcon.org/) - Major hacking conference with relevant villages/talks. +- [@conference@Global Conference on AI, Security and Ethics 2025 - UNIDIR](https://unidir.org/event/global-conference-on-ai-security-and-ethics-2025/) - Example of a specialized AI security/ethics conference. +- [@conference@RSA Conference](https://www.rsaconference.com/) - Large industry conference covering AI security. diff --git a/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md b/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md index 7f87208ca..3ba4971e3 100644 --- a/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md +++ b/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md @@ -1 +1,9 @@ -# Confidentiality, Integrity, Availability \ No newline at end of file +# Confidentiality, Integrity, Availability + +The CIA Triad is directly applicable in AI Red Teaming. Confidentiality tests focus on preventing leakage of training data or proprietary model details. Integrity tests probe for susceptibility to data poisoning or model manipulation. Availability tests assess resilience against denial-of-service attacks targeting the AI model or its supporting infrastructure. + +Learn more from the following resources: + +- [@article@Confidentiality, Integrity, Availability: Key Examples - DataSunrise](https://www.datasunrise.com/knowledge-center/confidentiality-integrity-availability-examples/) - Explains CIA triad with examples, mentioning AI/ML relevance. +- [@article@The CIA Triad: Confidentiality, Integrity, Availability - Veeam](https://www.veeam.com/blog/cybersecurity-cia-triad-explained.html) - Breakdown of the three principles and how they apply. +- [@article@What's The CIA Triad? Confidentiality, Integrity, & Availability, Explained | Splunk](https://www.splunk.com/en_us/blog/learn/cia-triad-confidentiality-integrity-availability.html) - Detailed explanation of the triad, mentioning modern updates and AI context. diff --git a/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md b/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md index c8ee07c2f..9af55fdaa 100644 --- a/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md +++ b/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md @@ -1 +1,9 @@ -# Continuous Monitoring \ No newline at end of file +# Continuous Monitoring + +AI Red Teamers assess the effectiveness of continuous monitoring systems by attempting attacks and observing if detection mechanisms trigger appropriate alerts and responses. They test if monitoring covers AI-specific anomalies (like sudden shifts in output toxicity or unexpected resource consumption by the model) in addition to standard infrastructure monitoring. + +Learn more from the following resources: + +- [@article@Cyber Security Monitoring: 5 Key Components - BitSight Technologies](https://www.bitsight.com/blog/5-things-to-consider-building-continuous-security-monitoring-strategy) - Discusses key components of a monitoring strategy. +- [@article@Cyber Security Monitoring: Definition and Best Practices - SentinelOne](https://www.sentinelone.com/cybersecurity-101/cybersecurity/cyber-security-monitoring/) - Overview of monitoring types and techniques. +- [@article@Cybersecurity Monitoring: Definition, Tools & Best Practices - NordLayer](https://nordlayer.com/blog/cybersecurity-monitoring/) - General best practices adaptable to AI context. diff --git a/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md b/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md index 5a6bdbd23..117921143 100644 --- a/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md +++ b/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md @@ -1 +1,9 @@ -# Continuous Testing \ No newline at end of file +# Continuous Testing + +Applying continuous testing principles to AI security involves integrating automated red teaming checks into the development pipeline (CI/CD). This allows for regular, automated assessment of model safety, robustness, and alignment as the model or application code evolves, catching regressions or new vulnerabilities early. Tools facilitating Continuous Automated Red Teaming (CART) are emerging. + +Learn more from the following resources: + +- [@article@Continuous Automated Red Teaming (CART) - FireCompass](https://www.firecompass.com/continuous-automated-red-teaming/) - Explains the concept of CART. +- [@article@What is Continuous Penetration Testing? Process and Benefits - Qualysec Technologies](https://qualysec.com/continuous-penetration-testing/) - Related concept applied to pen testing. +- [@guide@What is Continuous Testing and How Does it Work? - Black Duck](https://www.blackduck.com/glossary/what-is-continuous-testing.html) - General definition and benefits. diff --git a/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md b/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md index 78a297b0c..d99d46307 100644 --- a/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md +++ b/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md @@ -1 +1,10 @@ -# Countermeasures \ No newline at end of file +# Countermeasures + +AI Red Teamers must also understand and test defenses against prompt hacking. This includes evaluating the effectiveness of input sanitization, output filtering, instruction demarcation (e.g., XML tagging), contextual awareness checks, model fine-tuning for resistance, and applying the principle of least privilege to LLM capabilities and tool access. + +Learn more from the following resources: + +- [@article@Mitigating Prompt Injection Attacks (NCC Group Research)](https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/) - Discusses various mitigation strategies and their effectiveness. +- [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Includes discussion on best practices for prevention. +- [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Covers defensive measures. +- [@guide@OpenAI Best Practices for Prompt Security](https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions) - OpenAI’s recommendations to prevent prompt manipulation. diff --git a/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md b/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md index f46349f5e..9b4ff972a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md +++ b/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md @@ -1 +1,10 @@ -# CTF Challenges \ No newline at end of file +# CTF Challenges + +Capture The Flag competitions increasingly include AI/ML security challenges. Participating in CTFs (tracked on CTFtime) or platforms like picoCTF helps AI Red Teamers hone skills in reverse engineering, web exploitation, and cryptography applied to AI systems, including specialized AI safety CTFs. + +Learn more from the following resources: + +- [@article@Capture the flag (cybersecurity) - Wikipedia](https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)) - Overview of CTFs. +- [@article@Progress from our Frontier Red Team - Anthropic](https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team) - Mentions using CTFs (Cybench) for evaluating AI model security. +- [@platform@CTFtime.org](https://ctftime.org/) - Global CTF event tracker. +- [@platform@picoCTF](https://picoctf.org/) - Beginner-friendly CTF platform. diff --git a/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md b/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md index 8bab7b373..cde375b58 100644 --- a/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md +++ b/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md @@ -1 +1,9 @@ -# Custom Testing Scripts \ No newline at end of file +# Custom Testing Scripts + +AI Red Teamers frequently write custom scripts (often in Python) to automate bespoke attacks, interact with specific AI APIs, generate complex prompt sequences, parse model outputs at scale, or implement novel exploit techniques not found in standard tools. Proficiency in scripting is essential for advanced AI red teaming. + +Learn more from the following resources: + +- [@guide@Python for Cybersecurity: Key Use Cases and Tools - Panther](https://panther.com/blog/python-for-cybersecurity-key-use-cases-and-tools) - Discusses Python's role in automation, pen testing, etc. +- [@guide@Python for cybersecurity: use cases, tools and best practices - SoftTeco](https://softteco.com/blog/python-for-cybersecurity) - Covers using Python for various security tasks. +- [@tool@Scapy](https://scapy.net/) - Powerful Python library for packet manipulation. diff --git a/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md b/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md index 1121c2850..5a5b70078 100644 --- a/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md +++ b/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md @@ -1 +1,10 @@ -# Data Poisoning \ No newline at end of file +# Data Poisoning + +AI Red Teamers simulate data poisoning attacks by evaluating how introducing manipulated or mislabeled data into potential training or fine-tuning datasets could compromise the model. They assess the impact on model accuracy, fairness, or the potential creation of exploitable backdoors, informing defenses around data validation and provenance. + +Learn more from the following resources: + +- [@article@AI Poisoning - Is It Really A Threat? - AIBlade](https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat) - Detailed exploration of data poisoning attacks and impacts. +- [@article@Data Poisoning Attacks in ML (Towards Data Science)](https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f) - Overview of techniques. +- [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) - Research on detection and prevention techniques. +- [@paper@Poisoning Web-Scale Training Data (arXiv)](https://arxiv.org/abs/2310.12818) - Analysis of poisoning risks in large datasets used for LLMs. diff --git a/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md b/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md index ed0419d8a..ebf1911eb 100644 --- a/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md +++ b/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md @@ -1 +1,9 @@ -# Direct \ No newline at end of file +# Direct Injection + +Direct injection attacks occur when malicious instructions are inserted directly into the prompt input field by the user interacting with the LLM. AI Red Teamers use this technique to assess if basic instructions like "Ignore previous prompt" can immediately compromise the model's safety or intended function, testing the robustness of the system prompt's influence. + +Learn more from the following resources: + +- [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Differentiates attack types. +- [@article@Prompt Injection Cheat Sheet (FlowGPT)](https://flowgpt.com/p/prompt-injection-cheat-sheet) - Collection of prompt injection examples often used in direct attacks. +- [@report@OpenAI GPT-4 System Card](https://openai.com/research/gpt-4-system-card) - Sections discuss how direct prompt attacks were tested during GPT-4 development. diff --git a/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md b/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md index 9502b7803..79b986295 100644 --- a/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md +++ b/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md @@ -1 +1,9 @@ -# Emerging Threats \ No newline at end of file +# Emerging Threats + +AI Red Teamers must stay informed about potential future threats enabled by more advanced AI, such as highly autonomous attack agents, AI-generated malware that evades detection, sophisticated deepfakes for social engineering, or large-scale exploitation of interconnected AI systems. Anticipating these helps shape current testing priorities. + +Learn more from the following resources: + +- [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses future AI-driven cyberattacks. +- [@article@Why Artificial Intelligence is the Future of Cybersecurity - Darktrace](https://www.darktrace.com/blog/why-artificial-intelligence-is-the-future-of-cybersecurity) - Covers AI misuse and the future threat landscape. +- [@report@AI Index 2024 - Stanford University](https://aiindex.stanford.edu/report/) - Annual report tracking AI capabilities and societal implications, including risks. diff --git a/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md b/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md index 6cd4aeeb8..1f239c486 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md +++ b/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md @@ -1 +1,10 @@ -# Ethical Considerations \ No newline at end of file +# Ethical Considerations + +Ethical conduct is crucial for AI Red Teamers. While simulating attacks, they must operate within strict legal and ethical boundaries defined by rules of engagement, focusing on improving safety without causing real harm or enabling misuse. This includes respecting data privacy, obtaining consent where necessary, responsibly disclosing vulnerabilities, and carefully considering the potential negative impacts of both the testing process and the AI capabilities being tested. The goal is discovery for defense, not exploitation. + +Learn more from the following resources: + +- [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions balancing attack simulation with ethical constraints. +- [@article@Responsible AI assessment - Responsible AI | Coursera](https://www.coursera.org/learn/ai-security) (Module within AI Security course) +- [@guide@Responsible AI Principles (Microsoft)](https://www.microsoft.com/en-us/ai/responsible-ai) - Example of corporate responsible AI guidelines influencing ethical testing. +- [@video@Questions to Guide AI Red-Teaming (CMU SEI)](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382) - Key questions and ethical guidelines for AI red teaming activities (video talk). diff --git a/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md b/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md index 34b48047f..d15e412af 100644 --- a/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md +++ b/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md @@ -1 +1,10 @@ -# Forums \ No newline at end of file +# Forums + +Engaging in online forums, mailing lists, Discord servers, or subreddits dedicated to AI security, adversarial ML, prompt engineering, or general cybersecurity helps AI Red Teamers exchange knowledge, ask questions, learn about new tools/techniques, and find collaboration opportunities. + +Learn more from the following resources: + +- [@community@List of Cybersecurity Discord Servers - DFIR Training](https://www.dfir.training/dfir-groups/discord?category[0]=17&category_children=1) - List including relevant servers. +- [@community@Reddit - r/MachineLearning](https://www.reddit.com/r/MachineLearning/) - ML specific discussion. +- [@community@Reddit - r/artificial](https://www.reddit.com/r/artificial/) - General AI discussion. +- [@community@Reddit - r/cybersecurity](https://www.reddit.com/r/cybersecurity/) - General cybersecurity forum. diff --git a/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md b/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md index 71b3bf5c6..4a3225c4c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md +++ b/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md @@ -1 +1,9 @@ -# Generative Models \ No newline at end of file +# Generative Models + +AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to their widespread use and unique risks. Understanding how they generate content is key to testing for issues like generating harmful/biased outputs, deepfakes, prompt injection vulnerabilities, or leaking sensitive information from their vast training data. + +Learn more from the following resources: + +- [@article@An Introduction to Generative Models | MongoDB](https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models) - Explains basics and contrasts with discriminative models. +- [@course@Generative AI for Beginners - Microsoft Open Source](https://microsoft.github.io/generative-ai-for-beginners/) - Free course covering fundamentals. +- [@guide@Generative AI beginner's guide | Generative AI on Vertex AI - Google Cloud](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview) - Overview covering generative AI concepts and Google's platform context. diff --git a/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md b/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md index 665f0f3ea..08e5696c9 100644 --- a/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md +++ b/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md @@ -1 +1,9 @@ -# Grey Box Testing \ No newline at end of file +# Grey Box Testing + +Grey-box AI Red Teaming involves testing with partial knowledge of the system, such as knowing the model type (e.g., GPT-4), having access to some documentation, or understanding the general system architecture but not having full model weights or source code. This allows for more targeted testing than black-box while still simulating realistic external attacker scenarios where some information might be gleaned. + +Learn more from the following resources: + +- [@article@AI Transparency: Connecting AI Red Teaming and Compliance | SplxAI Blog](https://splx.ai/blog/ai-transparency-connecting-ai-red-teaming-and-compliance) - Discusses the value of moving towards gray-box testing in AI. +- [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types. +- [@article@Understanding Black Box, White Box, and Grey Box Testing - Frugal Testing](https://www.frugaltesting.com/blog/understanding-black-box-white-box-and-grey-box-testing-in-software-testing) - General definitions. diff --git a/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md b/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md index 6e9982d2e..58aaddcbb 100644 --- a/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md +++ b/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md @@ -1 +1,9 @@ -# Indirect \ No newline at end of file +# Indirect Injection + +Indirect injection involves embedding malicious prompts within external data sources that the LLM processes, such as websites, documents, or emails. AI Red Teamers test this by poisoning data sources the AI might interact with (e.g., adding hidden instructions to a webpage summarized by the AI) to see if the AI executes unintended commands or leaks data when processing that source. + +Learn more from the following resources: + +- [@paper@The Practical Application of Indirect Prompt Injection Attacks - David Willis-Owen](https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry) - Discusses a standard methodology to test for indirect injection attacks. +- [@article@How to Prevent Indirect Prompt Injection Attacks - Cobalt](https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks) - Explains indirect injection via external sources and mitigation. +- [@article@Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)](https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection) - Examples of indirect prompt injection impacting LLM agents. diff --git a/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md b/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md index 94e989f67..41027ca26 100644 --- a/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md +++ b/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md @@ -1 +1,8 @@ -# Industry Credentials \ No newline at end of file +# Industry Credentials + +Beyond formal certifications, recognition in the AI Red Teaming field comes from practical achievements like finding significant vulnerabilities (responsible disclosure), winning AI-focused CTFs or hackathons (like HackAPrompt), contributing to AI security research, or building open-source testing tools. + +Learn more from the following resources: + +- [@community@DEF CON - Wikipedia (Mentions Black Badge)](https://en.wikipedia.org/wiki/DEF_CON#Black_Badge) - Example of a high-prestige credential from CTFs. +- [@community@HackAPrompt (Learn Prompting)](https://learnprompting.org/hackaprompt) - Example of a major AI Red Teaming competition. diff --git a/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md b/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md index 318ae5c74..caa53a823 100644 --- a/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md +++ b/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md @@ -1 +1,10 @@ -# Industry Standards \ No newline at end of file +# Industry Standards + +As AI matures, AI Red Teamers will increasingly need to understand and test against emerging industry standards and regulations for AI safety, security, and risk management, such as the NIST AI RMF, ISO/IEC 42001, and sector-specific guidelines, ensuring AI systems meet compliance requirements. + +Learn more from the following resources: + +- [@article@ISO 42001: The New Compliance Standard for AI Management Systems - Bright Defense](https://www.brightdefense.com/resources/iso-42001-compliance/) - Overview of ISO 42001 requirements. +- [@article@ISO 42001: What it is & why it matters for AI management - IT Governance](https://www.itgovernance.co.uk/iso-42001) - Explanation of the standard. +- [@framework@NIST AI Risk Management Framework (AI RMF)](https://www.nist.gov/itl/ai-risk-management-framework) - Voluntary framework gaining wide adoption. +- [@standard@ISO/IEC 42001: Information technology — Artificial intelligence — Management system](https://www.iso.org/standard/81230.html) - International standard for AI management systems. diff --git a/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md b/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md index 3fcdd05d1..454ffd126 100644 --- a/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md +++ b/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md @@ -1 +1,9 @@ -# Infrastructure Security \ No newline at end of file +# Infrastructure Security + +AI Red Teamers assess the security posture of the infrastructure hosting AI models (cloud environments, servers, containers). They look for misconfigurations, unpatched systems, insecure network setups, or inadequate access controls that could allow compromise of the AI system or leakage of sensitive data/models. + +Learn more from the following resources: + +- [@article@AI Infrastructure Attacks (VentureBeat)](https://venturebeat.com/ai/understanding-ai-infrastructure-attacks/) - Discussion of attacks targeting AI infrastructure. +- [@guide@Network Infrastructure Security - Best Practices and Strategies - DataGuard](https://www.dataguard.com/blog/network-infrastructure-security-best-practices-and-strategies/) - General infra security practices applicable here. +- [@guide@Secure Deployment of ML Systems (NIST)](https://csrc.nist.gov/publications/detail/sp/800-218/final) - Guidelines including infrastructure security for ML. diff --git a/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md b/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md index ccabbd585..b6dc1981c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md +++ b/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md @@ -1 +1,10 @@ -# Insecure Deserialization \ No newline at end of file +# Insecure Deserialization + +AI Red Teamers investigate if serialized objects used by the AI system (e.g., for saving model states, configurations, or transmitting data) can be manipulated by an attacker. They test if crafting malicious serialized objects could lead to remote code execution or other exploits when the application deserializes the untrusted data. + +Learn more from the following resources: + +- [@article@Lightboard Lessons: OWASP Top 10 - Insecure Deserialization - DevCentral](https://community.f5.com/kb/technicalarticles/lightboard-lessons-owasp-top-10---insecure-deserialization/281509) - Video explanation. +- [@article@How Hugging Face Was Ethically Hacked](https://www.aiblade.net/p/how-hugging-face-was-ethically-hacked) - Hugging Face deserialization case study. +- [@article@OWASP TOP 10: Insecure Deserialization - Detectify Blog](https://blog.detectify.com/best-practices/owasp-top-10-insecure-deserialization/) - Overview within OWASP Top 10 context. +- [@guide@Insecure Deserialization - OWASP Foundation](https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization) - Core explanation of the vulnerability. diff --git a/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md b/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md index f6ecaa676..7f3367c78 100644 --- a/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md +++ b/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md @@ -1 +1,10 @@ -# Introduction \ No newline at end of file +# Introduction + +AI Red Teaming is the practice of simulating adversarial attacks against AI systems to proactively identify vulnerabilities, potential misuse scenarios, and failure modes before malicious actors do. Distinct from traditional cybersecurity red teaming, it focuses on the unique attack surfaces of AI models, such as prompt manipulation, data poisoning, model extraction, and evasion techniques. The primary goal for an AI Red Teamer is to test the robustness, safety, alignment, and fairness of AI systems, particularly complex ones like LLMs, by adopting an attacker's mindset to uncover hidden flaws and provide actionable feedback for improvement. + +Learn more from the following resources: + +- [@article@A Guide to AI Red Teaming - HiddenLayer](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) - Discusses AI red teaming concepts and contrasts with traditional methods. +- [@article@What is AI Red Teaming? (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Overview of AI red teaming, its history, and key challenges. +- [@article@What is AI Red Teaming? The Complete Guide - Mindgard](https://mindgard.ai/blog/what-is-ai-red-teaming) - Guide covering AI red teaming processes, use cases, and benefits. +- [@podcast@Red Team Podcast | AI Red Teaming Insights & Defense Strategies - Mindgard](https://mindgard.ai/podcast/red-team) - Podcast series covering AI red teaming trends and strategies. diff --git a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md index 6cd93ca54..a99eec9b1 100644 --- a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md +++ b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md @@ -1 +1,9 @@ -# Jailbreak Techniques \ No newline at end of file +# Jailbreak Techniques + +Jailbreaking is a specific category of prompt hacking where the AI Red Teamer aims to bypass the LLM's safety and alignment training. They use techniques like creating fictional scenarios, asking the model to simulate an unrestricted AI, or using complex instructions to trick the model into generating content that violates its own policies (e.g., generating harmful code, hate speech, or illegal instructions). + +Learn more from the following resources: + +- [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) - Discusses jailbreaks for several LLMs +- [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Covers jailbreaking strategies. +- [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) - Research analyzing jailbreak failures. diff --git a/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md b/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md index dfa68396a..ebac531c3 100644 --- a/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md +++ b/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md @@ -1 +1,10 @@ -# Lab Environments \ No newline at end of file +# Lab Environments + +AI Red Teamers need environments to practice attacking vulnerable systems safely. While traditional labs (HTB, THM, VulnHub) build general pentesting skills, platforms are emerging with labs specifically focused on AI/LLM vulnerabilities, prompt injection, or adversarial ML challenges. + +Learn more from the following resources: + +- [@platform@Gandalf AI Prompt Injection Lab](https://gandalf.lakera.ai/) - A popular web-based lab for prompt injection practice. +- [@platform@Hack The Box: Hacking Labs](https://www.hackthebox.com/hacker/hacking-labs) - General pentesting labs. +- [@platform@TryHackMe: Learn Cyber Security](https://tryhackme.com/) - Gamified cybersecurity training labs. +- [@platform@VulnHub](https://www.vulnhub.com/) - Provides vulnerable VM images for practice. diff --git a/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md b/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md index da3ae161d..b3b680485 100644 --- a/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md +++ b/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md @@ -1 +1,9 @@ -# Large Language Models \ No newline at end of file +# Large Language Models + +LLMs are a primary target for AI Red Teaming. Understanding their architecture (often Transformer-based), training processes (pre-training, fine-tuning), and capabilities (text generation, summarization, Q&A) is essential for identifying vulnerabilities like prompt injection, jailbreaking, data regurgitation, and emergent harmful behaviors specific to these large-scale models. + +Learn more from the following resources: + +- [@article@What is an LLM (large language model)? - Cloudflare](https://www.cloudflare.com/learning/ai/what-is-large-language-model/) - Concise explanation from Cloudflare. +- [@guide@Introduction to Large Language Models - Learn Prompting](https://learnprompting.org/docs/intro_to_llms) - Learn Prompting's introduction. +- [@guide@What Are Large Language Models? A Beginner's Guide for 2025 - KDnuggets](https://www.kdnuggets.com/large-language-models-beginners-guide-2025) - Overview of LLMs, how they work, strengths, and limitations. diff --git a/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md b/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md index ccd9745dd..d4edd7b4e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md +++ b/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md @@ -1 +1,9 @@ -# LLM Security Testing \ No newline at end of file +# LLM Security Testing + +The core application area for many AI Red Teamers today involves specifically testing Large Language Models for vulnerabilities like prompt injection, jailbreaking, harmful content generation, bias, and data privacy issues using specialized prompts and evaluation frameworks. + +Learn more from the following resources: + +- [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Courses focused on testing LLMs. +- [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Dataset for evaluating LLMs on security tasks. +- [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Guide specifically on red teaming LLMs. diff --git a/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md b/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md index db2599d89..0cdbed37b 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md @@ -1 +1,10 @@ -# Model Inversion \ No newline at end of file +# Model Inversion + +AI Red Teamers perform model inversion tests to assess if an attacker can reconstruct sensitive training data (like images, text snippets, or personal attributes) by repeatedly querying the model and analyzing its outputs. Success indicates privacy risks due to data memorization, requiring mitigation techniques like differential privacy or output filtering. + +Learn more from the following resources: + +- [@article@Model Inversion Attacks for ML (Medium)](https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1) - Explanation with examples (e.g., face reconstruction). +- [@article@Model inversion and membership inference: Understanding new AI security risks - Hogan Lovells](https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities) - Discusses risks and mitigation. +- [@paper@Extracting Training Data from LLMs (arXiv)](https://arxiv.org/abs/2012.07805) - Research demonstrating feasibility on LLMs. +- [@paper@Model Inversion Attacks: A Survey of Approaches and Countermeasures - arXiv](https://arxiv.org/html/2411.10023v1) - Comprehensive survey of model inversion attacks and defenses. diff --git a/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md b/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md index c9532891c..228d9246f 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md @@ -1 +1,9 @@ -# Model Vulnerabilities \ No newline at end of file +# Model Vulnerabilities + +This category covers attacks and tests targeting the AI model itself, beyond the prompt interface. AI Red Teamers investigate inherent weaknesses in the model's architecture, training data artifacts, or prediction mechanisms, such as susceptibility to data extraction, poisoning, or adversarial manipulation. + +Learn more from the following resources: + +- [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses adversarial attacks, data poisoning, and prototype theft. +- [@article@Attacking AI Models (Trail of Bits Blog Series)](https://blog.trailofbits.com/category/ai-security/) - Series discussing model-focused attacks. +- [@report@AI and ML Vulnerabilities (CNAS Report)](https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities) - Overview of known machine learning vulnerabilities. diff --git a/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md b/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md index 69009be05..9103c4cab 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md @@ -1 +1,10 @@ -# Model Weight Stealing \ No newline at end of file +# Model Weight Stealing + +AI Red Teamers assess the risk of attackers reconstructing or stealing the proprietary weights of a trained model, often through API query-based attacks. Testing involves simulating such attacks to understand how easily the model's functionality can be replicated, which informs defenses like query rate limiting, watermarking, or differential privacy. + +Learn more from the following resources: + +- [@article@A Playbook for Securing AI Model Weights - RAND](https://www.rand.org/pubs/research_briefs/RBA2849-1.html) - Discusses attack vectors and security levels for protecting model weights. +- [@article@How to Steal a Machine Learning Model (SkyCryptor)](https://skycryptor.com/blog/how-to-steal-a-machine-learning-model) - Explains model weight extraction via query attacks. +- [@paper@Defense Against Model Stealing (Microsoft Research)](https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/) - Research on detecting and defending against model stealing. +- [@paper@On the Limitations of Model Stealing with Uncertainty Quantification Models - OpenReview](https://openreview.net/pdf?id=ONRFHoUzNk) - Research exploring model stealing techniques. diff --git a/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md b/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md index 9c7be42ca..ae4bd0cfc 100644 --- a/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md +++ b/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md @@ -1 +1,11 @@ -# Monitoring Solutions \ No newline at end of file +# Monitoring Solutions + +AI Red Teamers interact with monitoring tools primarily to test their effectiveness (evasion) or potentially exploit vulnerabilities within them. Understanding tools like IDS (Snort, Suricata), network analyzers (Wireshark), and SIEMs helps red teamers simulate attacks that might bypass or target these defensive systems. + +Learn more from the following resources: + +- [@article@Open Source IDS Tools: Comparing Suricata, Snort, Bro (Zeek), Linux - LevelBlue](https://levelblue.com/blogs/security-essentials/open-source-intrusion-detection-tools-a-quick-overview) - Comparison of common open source monitoring tools. +- [@tool@Snort](https://www.snort.org/) - Open source IDS/IPS. +- [@tool@Suricata](https://suricata.io/) - Open source IDS/IPS/NSM. +- [@tool@Wireshark](https://www.wireshark.org/) - Network protocol analyzer. +- [@tool@Zeek (formerly Bro)](https://zeek.org/) - Network security monitoring framework. diff --git a/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md b/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md index e9fcdbc74..1dc11b008 100644 --- a/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md +++ b/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md @@ -1 +1,9 @@ -# Neural Networks \ No newline at end of file +# Neural Networks + +Understanding neural network architectures (layers, nodes, activation functions) is vital for AI Red Teamers. This knowledge allows for targeted testing, such as crafting adversarial examples that exploit specific activation functions or identifying potential vulnerabilities related to network depth or connectivity. It provides insight into the 'black box' for more effective white/grey-box testing. + +Learn more from the following resources: + +- [@guide@Neural Networks Explained: A Beginner's Guide - SkillCamper](https://www.skillcamper.com/blog/neural-networks-explained-a-beginners-guide) - Foundational guide. +- [@guide@Neural networks | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/crash-course/neural-networks) - Google's explanation within their ML crash course. +- [@paper@Red Teaming with Artificial Intelligence-Driven Cyberattacks: A Scoping Review - arXiv](https://arxiv.org/html/2503.19626) - Review discussing AI methods like neural networks used in red teaming simulations. diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md b/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md index 2d10f0367..916aa0891 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md @@ -1 +1,11 @@ -# Prompt Engineering \ No newline at end of file +# Prompt Engineering + +For AI Red Teamers, prompt engineering is both a tool and a target. It's a tool for crafting inputs to test model boundaries and vulnerabilities (e.g., creating jailbreak prompts). It's a target because understanding how prompts influence LLMs is key to identifying prompt injection vulnerabilities and designing defenses. Mastering prompt design is fundamental to effective LLM red teaming. + +Learn more from the following resources: + +- [@article@Introduction to Prompt Engineering - Datacamp](https://www.datacamp.com/tutorial/introduction-prompt-engineering) - Tutorial covering basics. +- [@article@System Prompts - InjectPrompt](https://www.injectprompt.com/t/system-prompts) - Look at the system prompts of flagship LLMs. +- [@course@Introduction to Prompt Engineering - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-engineering) - Foundational course from Learn Prompting. +- [@guide@Prompt Engineering Guide - Learn Prompting](https://learnprompting.org/docs/prompt-engineering) - Comprehensive guide from Learn Prompting. +- [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Connects prompt engineering directly to LLM red teaming concepts. diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md b/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md index 1d4b5e7fa..444638853 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md @@ -1 +1,9 @@ -# Prompt Hacking \ No newline at end of file +# Prompt Hacking + +Prompt hacking is a core technique for AI Red Teamers targeting LLMs. It involves crafting inputs (prompts) to manipulate the model into bypassing safety controls, revealing hidden information, or performing unintended actions. Red teamers systematically test various prompt hacking methods (like jailbreaking, role-playing, or instruction manipulation) to assess the LLM's resilience against adversarial user input. + +Learn more from the following resources: + +- [@course@Introduction to Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-hacking) - Free introductory course. +- [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Detailed guide covering techniques. +- [@paper@SoK: Prompt Hacking of LLMs (arXiv 2023)](https://arxiv.org/abs/2311.05544) - Comprehensive research overview of prompt hacking types and techniques. diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md b/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md index 7227af039..7e2ceceef 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md @@ -1 +1,11 @@ -# Prompt Injection \ No newline at end of file +# Prompt Injection + +Prompt injection is a critical vulnerability tested by AI Red Teamers. They attempt to insert instructions into the LLM's input that override its intended system prompt or task, causing it to perform unauthorized actions, leak data, or generate malicious output. This tests the model's ability to distinguish trusted instructions from potentially harmful user/external input. + +Learn more from the following resources: + +- [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Guide covering different types of prompt attacks. +- [@article@Prompt Injection (Learn Prompting)](https://learnprompting.org/docs/prompt_hacking/injection) - Learn Prompting article describing prompt injection with examples and mitigation strategies. +- [@article@Prompt Injection Attack Explanation (IBM)](https://research.ibm.com/blog/prompt-injection-attacks-against-llms) - Explains what prompt injections are and how they work. +- [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Overview of impact and defenses. +- [@course@Advanced Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/advanced-prompt-hacking) - Covers advanced injection techniques. diff --git a/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md b/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md index fd3d564b7..1d4a28898 100644 --- a/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md +++ b/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md @@ -1 +1,9 @@ -# Red Team Simulations \ No newline at end of file +# Red Team Simulations + +Participating in or conducting structured red team simulations against AI systems (or components) provides the most realistic practice. This involves applying methodologies, TTPs (Tactics, Techniques, and Procedures), reconnaissance, exploitation, and reporting within a defined scope and objective, specifically targeting AI vulnerabilities. + +Learn more from the following resources: + +- [@guide@A Simple Guide to Successful Red Teaming - Cobalt Strike](https://www.cobaltstrike.com/resources/guides/a-simple-guide-to-successful-red-teaming) - General guide adaptable to AI context. +- [@guide@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Overview of red teaming process. +- [@guide@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Checklist for planning engagements. diff --git a/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md b/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md index 998d9bd63..f7bc2a322 100644 --- a/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md +++ b/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md @@ -1 +1,10 @@ -# Reinforcement Learning \ No newline at end of file +# Reinforcement Learning + +Red teaming RL-based AI systems involves testing for vulnerabilities such as reward hacking (exploiting the reward function to induce unintended behavior), unsafe exploration (agent takes harmful actions during learning), or susceptibility to adversarial perturbations in the environment's state. Understanding the agent's policy and value functions is crucial for designing effective tests against RL agents. + +Learn more from the following resources: + +- [@article@Best Resources to Learn Reinforcement Learning - Towards Data Science](https://towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2/) - Curated list of RL learning resources. +- [@article@What is reinforcement learning? - Blog - York Online Masters degrees](https://online.york.ac.uk/resources/what-is-reinforcement-learning/) - Foundational explanation. +- [@course@Deep Reinforcement Learning Course by HuggingFace](https://huggingface.co/learn/deep-rl-course/unit0/introduction) - Comprehensive free course on Deep RL. +- [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for red teaming and generating attacks. diff --git a/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md b/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md index 10a5f3987..98adde85c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md +++ b/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md @@ -1 +1,9 @@ -# Remote Code Execution \ No newline at end of file +# Remote Code Execution + +AI Red Teamers attempt to achieve RCE on systems hosting or interacting with AI models. This could involve exploiting vulnerabilities in the AI framework itself, the web server, connected APIs, or tricking an AI agent with code execution capabilities into running malicious commands provided via prompts. RCE is often the ultimate goal of exploiting other vulnerabilities like code injection or insecure deserialization. + +Learn more from the following resources: + +- [@article@Exploiting LLMs with Code Execution (GitHub Gist)](https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516) - Example of achieving code execution via LLM manipulation. +- [@article@What is remote code execution? - Cloudflare](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) - Definition and explanation of RCE. +- [@video@DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU) - Demonstrates RCE risks with LLM agents. diff --git a/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md b/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md index b4885e59a..7c2ceea41 100644 --- a/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md +++ b/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md @@ -1 +1,9 @@ -# Reporting Tools \ No newline at end of file +# Reporting Tools + +AI Red Teamers use reporting techniques and potentially tools to clearly document their findings, including discovered vulnerabilities, successful exploit steps (e.g., effective prompts), assessed impact, and actionable recommendations tailored to AI systems. Good reporting translates technical findings into understandable risks for stakeholders. + +Learn more from the following resources: + +- [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) (Mentions reporting and templates) +- [@guide@Penetration Testing Report: 6 Key Sections and 4 Best Practices - Bright Security](https://brightsec.com/blog/penetration-testing-report/) - General best practices for reporting security findings. +- [@guide@Penetration testing best practices: Strategies for all test types - Strike Graph](https://www.strikegraph.com/blog/pen-testing-best-practices) - Includes tips on documentation. diff --git a/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md b/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md index 8a1fbf925..2a326a2c5 100644 --- a/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md +++ b/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md @@ -1 +1,10 @@ -# Research Groups \ No newline at end of file +# Research Groups + +Following and potentially contributing to research groups at universities (like CMU, Stanford, Oxford), non-profits (like OpenAI, Anthropic), or government bodies (like UK's AISI) focused on AI safety, security, and alignment provides deep insights into emerging threats and mitigation strategies relevant to AI Red Teaming. + +Learn more from the following resources: + +- [@group@AI Cybersecurity | Global Cyber Security Capacity Centre (Oxford)](https://gcscc.ox.ac.uk/ai-security) - Academic research center. +- [@group@Anthropic Research](https://www.anthropic.com/research) - AI safety research lab. +- [@group@Center for AI Safety](https://www.safe.ai/) - Non-profit research organization. +- [@group@The AI Security Institute (AISI)](https://www.aisi.gov.uk/) - UK government institute focused on AI safety/security research. diff --git a/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md b/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md index 5841ae1c3..b4ce5312e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md +++ b/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md @@ -1 +1,9 @@ -# Research Opportunities \ No newline at end of file +# Research Opportunities + +AI Red Teaming relies on ongoing research. Key areas needing further investigation include scalable methods for finding elusive vulnerabilities, understanding emergent behaviors in complex models, developing provable safety guarantees, creating better benchmarks for AI security, and exploring the socio-technical aspects of AI misuse and defense. + +Learn more from the following resources: + +- [@article@Cutting-Edge Research on AI Security bolstered with new Challenge Fund - GOV.UK](https://www.gov.uk/government/news/cutting-edge-research-on-ai-security-bolstered-with-new-challenge-fund-to-ramp-up-public-trust-and-adoption) - Highlights government funding for AI security research priorities. +- [@research@Careers | The AI Security Institute (AISI)](https://www.aisi.gov.uk/careers) - Outlines research focus areas for the UK's AISI. +- [@research@Research - Anthropic](https://www.anthropic.com/research) - Example of research areas at a leading AI safety lab. diff --git a/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md b/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md index f9e2753fc..9aa3ce198 100644 --- a/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md +++ b/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md @@ -1 +1,9 @@ -# Responsible Disclosure \ No newline at end of file +# Responsible Disclosure + +A critical practice for AI Red Teamers is responsible disclosure: privately reporting discovered AI vulnerabilities (e.g., a successful jailbreak, data leak method, or severe bias) to the model developers or system owners, allowing them time to remediate before any public discussion, thus preventing malicious exploitation. + +Learn more from the following resources: + +- [@guide@Responsible Disclosure of AI Vulnerabilities - Preamble AI](https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities) - Discusses the process specifically for AI vulnerabilities. +- [@guide@Vulnerability Disclosure Program | CISA](https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp) - Government VDP example. +- [@policy@Google Vulnerability Reward Program (VRP)](https://bughunters.google.com/) - Example of a major tech company's VDP/bug bounty program. diff --git a/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md b/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md index bc1aa5e0e..ef1aad6ea 100644 --- a/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md +++ b/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md @@ -1 +1,9 @@ -# Risk Management \ No newline at end of file +# Risk Management + +AI Red Teamers contribute to the AI risk management process by identifying and demonstrating concrete vulnerabilities. Findings from red team exercises inform risk assessments, helping organizations understand the likelihood and potential impact of specific AI threats and prioritize resources for mitigation based on demonstrated exploitability. + +Learn more from the following resources: + +- [@framework@NIST AI Risk Management Framework](https://www.nist.gov/itl/ai-risk-management-framework) - Key framework for managing AI-specific risks. +- [@guide@A Beginner's Guide to Cybersecurity Risks and Vulnerabilities - Champlain College Online](https://online.champlain.edu/blog/beginners-guide-cybersecurity-risk-management) - Foundational understanding of risk. +- [@guide@Cybersecurity Risk Management: Frameworks, Plans, and Best Practices - Hyperproof](https://hyperproof.io/resource/cybersecurity-risk-management-process/) - General guide applicable to AI system context. diff --git a/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md b/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md index 793ae2fd1..a0532f58a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md +++ b/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md @@ -1 +1,9 @@ -# Robust Model Design \ No newline at end of file +# Robust Model Design + +AI Red Teamers assess whether choices made during model design (architecture selection, regularization techniques, ensemble methods) effectively contribute to robustness against anticipated attacks. They test if these design choices actually prevent common failure modes identified during threat modeling. + +Learn more from the following resources: + +- [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) - Discusses strategies for building robust models. +- [@article@Understanding Robustness in Machine Learning - Alooba](https://www.alooba.com/skills/concepts/machine-learning/robustness/) - Explains the concept of ML robustness. +- [@paper@Towards Evaluating the Robustness of Neural Networks (arXiv by Goodfellow et al.)](https://arxiv.org/abs/1608.04644) - Foundational paper on evaluating robustness. diff --git a/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md b/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md index 92742bd3b..81bb09296 100644 --- a/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md +++ b/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md @@ -1 +1,9 @@ -# Role of Red Teams \ No newline at end of file +# Role of Red Teams + +The role of an AI Red Team is to rigorously challenge AI systems from an adversarial perspective. They design and execute tests to uncover vulnerabilities related to the model's logic, data dependencies, prompt interfaces, safety alignments, and interactions with surrounding infrastructure. They provide detailed reports on findings, potential impacts, and remediation advice, acting as a critical feedback loop for AI developers and stakeholders to improve system security and trustworthiness before and after deployment. + +Learn more from the following resources: + +- [@article@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Discusses the purpose and process of red teaming. +- [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Outlines typical red team roles and responsibilities. +- [@article@What is AI Red Teaming? - Learn Prompting](https://learnprompting.org/docs/category/ai-red-teaming) - Defines the role and activities. diff --git a/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md b/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md index 3b20ce7e0..1415fc509 100644 --- a/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md +++ b/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md @@ -1 +1,9 @@ -# Safety Filter Bypasses \ No newline at end of file +# Safety Filter Bypasses + +AI Red Teamers specifically target the safety mechanisms (filters, guardrails) implemented within or around an AI model. They test techniques like using synonyms for blocked words, employing different languages, embedding harmful requests within harmless text, or using character-level obfuscation to evade detection and induce the model to generate prohibited content, thereby assessing the robustness of the safety controls. + +Learn more from the following resources: + +- [@article@Bypassing AI Content Filters | Restackio](https://www.restack.io/p/ai-driven-content-moderation-answer-bypass-filters-cat-ai) - Discusses techniques for evasion. +- [@article@How to Bypass Azure AI Content Safety Guardrails - Mindgard](https://mindgard.ai/blog/bypassing-azure-ai-content-safety-guardrails) - Case study on bypassing specific safety mechanisms. +- [@article@The Best Methods to Bypass AI Detection: Tips and Techniques - PopAi](https://www.popai.pro/resources/the-best-methods-to-bypass-ai-detection-tips-and-techniques/) - Focuses on evasion, relevant for filter bypass testing. diff --git a/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md b/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md index aa116eb04..fc0a4d2b3 100644 --- a/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md +++ b/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md @@ -1 +1,10 @@ -# Specialized Courses \ No newline at end of file +# Specialized Courses + +Targeted training is crucial for mastering AI Red Teaming. Look for courses covering adversarial ML, prompt hacking, LLM security, ethical hacking for AI, and specific red teaming methodologies applied to AI systems offered by platforms like Learn Prompting, Coursera, or security training providers. + +Learn more from the following resources: + +- [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Curated list including free and paid options. +- [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Covers AI security risks and governance. +- [@course@Exploring Adversarial Machine Learning - NVIDIA](https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/) - Focused training on adversarial ML (paid). +- [@course@Free Online Cyber Security Courses with Certificates in 2025 - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/) - Offers foundational cybersecurity courses. diff --git a/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md b/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md index cc80ec827..3a596965e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md +++ b/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md @@ -1 +1,9 @@ -# Supervised Learning \ No newline at end of file +# Supervised Learning + +AI Red Teamers analyze systems built using supervised learning to probe for vulnerabilities like susceptibility to adversarial examples designed to cause misclassification, sensitivity to data distribution shifts, or potential for data leakage related to the labeled training data. Understanding how these models learn input-output mappings is key to devising tests that challenge their learned boundaries. + +Learn more from the following resources: + +- [@article@AI and cybersecurity: a love-hate revolution - Alter Solutions](https://www.alter-solutions.com/en-us/articles/ai-cybersecurity-love-hate-revolution) - Discusses supervised learning use in vulnerability scanning and potential exploits. +- [@article@What Is Supervised Learning? | IBM](https://www.ibm.com/think/topics/supervised-learning) - Foundational explanation. +- [@article@What is Supervised Learning? | Google Cloud](https://cloud.google.com/discover/what-is-supervised-learning) - Foundational explanation. diff --git a/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md b/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md index 1138bca53..5646b984d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md +++ b/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md @@ -1 +1,11 @@ -# Testing Platforms \ No newline at end of file +# Testing Platforms + +Platforms used by AI Red Teamers range from general penetration testing OS distributions like Kali Linux to specific AI red teaming tools/frameworks like Microsoft's PyRIT or Promptfoo, and vulnerability scanners like OWASP ZAP adapted for API testing of AI services. These platforms provide the toolsets needed to conduct assessments. + +Learn more from the following resources: + +- [@tool@AI Red Teaming Agent - Azure AI Foundry | Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent) - Microsoft's tool leveraging PyRIT. +- [@tool@Kali Linux](https://www.kali.org/) - Standard pentesting distribution. +- [@tool@OWASP Zed Attack Proxy (ZAP)](https://owasp.org/www-project-zap/) - Widely used for web/API security testing. +- [@tool@Promptfoo](https://www.promptfoo.dev/) - Open-source tool for testing and evaluating LLMs, includes red teaming features. +- [@tool@PyRIT (Python Risk Identification Tool for generative AI) - GitHub](https://github.com/Azure/PyRIT) - Open-source framework from Microsoft. diff --git a/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md b/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md index 4d4e54d40..8349d5d2a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md +++ b/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md @@ -1 +1,10 @@ -# Threat Modeling \ No newline at end of file +# Threat Modeling + +AI Red Teams apply threat modeling to identify unique attack surfaces in AI systems, such as manipulating training data, exploiting prompt interfaces, attacking the model inference process, or compromising connected tools/APIs. Before attacking an AI system, red teamers perform threat modeling to map out possible adversaries (from curious users to state actors) and attack vectors, prioritizing tests based on likely impact and adversary capability. + +Learn more from the following resources: + +- [@article@Core Components of AI Red Team Exercises (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Describes threat modeling as the first phase of an AI red team engagement. +- [@guide@Threat Modeling Process | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling_Process) - More detailed process steps. +- [@guide@Threat Modeling | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling) - General threat modeling process applicable to AI context. +- [@video@How Microsoft Approaches AI Red Teaming (MS Build)](https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/) - Video on Microsoft’s AI red team process, including threat modeling specific to AI. diff --git a/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md b/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md index f589e9da8..abefc0554 100644 --- a/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md +++ b/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md @@ -1 +1,9 @@ -# Unauthorized Access \ No newline at end of file +# Unauthorized Access + +AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow attackers to gain unauthorized access to data, functionalities, or underlying infrastructure. This includes attempting privilege escalation via prompts, exploiting insecure API endpoints connected to the AI, or manipulating the AI to access restricted system resources. + +Learn more from the following resources: + +- [@article@Unauthorized Data Access via LLMs (Security Boulevard)](https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/) - Discusses risks of LLMs accessing unauthorized data. +- [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) - Covers API risks like broken access control relevant to AI systems. +- [@paper@AI System Abuse Cases (Harvard Belfer Center)](https://www.belfercenter.org/publication/ai-system-abuse-cases) - Covers various ways AI systems can be abused, including access violations. diff --git a/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md b/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md index a0216c8b4..d9b11f673 100644 --- a/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md +++ b/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md @@ -1 +1,8 @@ -# Unsupervised Learning \ No newline at end of file +# Unsupervised Learning + +When red teaming AI systems using unsupervised learning (e.g., clustering algorithms), focus areas include assessing whether the discovered patterns reveal sensitive information, if the model can be manipulated to group data incorrectly, or if dimensionality reduction techniques obscure security-relevant features. Understanding these models helps identify risks associated with pattern discovery on unlabeled data. + +Learn more from the following resources: + +- [@article@How Unsupervised Learning Works with Examples - Coursera](https://www.coursera.org/articles/unsupervised-learning) - Foundational explanation with examples. +- [@article@Supervised vs. Unsupervised Learning: Which Approach is Best? - DigitalOcean](https://www.digitalocean.com/resources/articles/supervised-vs-unsupervised-learning) - Contrasts learning types, relevant for understanding different attack surfaces. diff --git a/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md b/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md index 5666706cd..be2d34566 100644 --- a/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md +++ b/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md @@ -1 +1,9 @@ -# Vulnerability Assessment \ No newline at end of file +# Vulnerability Assessment + +While general vulnerability assessment scans infrastructure, AI Red Teaming extends this to assess vulnerabilities specific to the AI model and its unique interactions. This includes probing for prompt injection flaws, testing for adversarial example robustness, checking for data privacy leaks, and evaluating safety alignment failures – weaknesses not typically found by standard IT vulnerability scanners. + +Learn more from the following resources: + +- [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses vulnerability assessment within AI red teaming for critical systems. +- [@guide@The Ultimate Guide to Vulnerability Assessment - Strobes Security](https://strobes.co/blog/guide-vulnerability-assessment/) - Comprehensive guide on VA process (apply concepts to AI). +- [@guide@Vulnerability Scanning Tools | OWASP Foundation](https://owasp.org/www-community/Vulnerability_Scanning_Tools) - List of tools useful in broader system assessment around AI. diff --git a/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md b/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md index d0cc507ce..ef2567934 100644 --- a/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md +++ b/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md @@ -1 +1,9 @@ -# White Box Testing \ No newline at end of file +# White Box Testing + +White-box testing in AI Red Teaming grants the tester full access to the model's internals (architecture, weights, training data, source code). This allows for highly targeted attacks, such as crafting precise adversarial examples using gradients, analyzing code for vulnerabilities, or directly examining training data for biases or PII leakage. It simulates insider threats or deep analysis scenarios. + +Learn more from the following resources: + +- [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types. +- [@article@White-Box Adversarial Examples (OpenAI Blog)](https://openai.com/research/adversarial-robustness-toolbox) - Discusses generating attacks with full model knowledge. +- [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Mentions white-box testing benefits for LLMs. diff --git a/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md b/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md index a127864b7..90bf8ff26 100644 --- a/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md +++ b/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md @@ -1 +1,10 @@ -# Why Red Team AI Systems? \ No newline at end of file +# Why Red Team AI Systems? + +AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment. + +Learn more from the following resources: + +@article@What's the Difference Between Traditional Red-Teaming and AI Red-Teaming? - Cranium AI - Compares objectives, techniques, expertise, and attack vectors to highlight why AI needs specialized red teaming. +@article@What is AI Red Teaming? The Complete Guide - Mindgard - Details specific use cases like identifying bias, ensuring resilience against AI-specific attacks, testing data privacy, and aligning with regulations. +@article@The Expanding Role of Red Teaming in Defending AI Systems - Protect AI - Explains why the dynamic, adaptive, and often opaque nature of AI necessitates red teaming beyond traditional approaches. +@article@How red teaming helps safeguard the infrastructure behind AI models - IBM - Focuses on unique AI risks like model IP theft, open-source vulnerabilities, and excessive agency that red teaming addresses. \ No newline at end of file From 5f53b3ef1eb036e44c5b92bf9b86072642c917db Mon Sep 17 00:00:00 2001 From: Vedansh Date: Fri, 25 Apr 2025 19:29:19 +0530 Subject: [PATCH 05/31] refactor: (cybersecurity) content & link adjustments. (#8549) * refactor 40 topics quickly. * finally. --- .../content/onedrive@MWqnhDKm9jXvDDjkeVNxm.md | 3 +-- .../operating-system-hardening@_S25EOGS3P8647zLM5i-g.md | 3 ++- .../content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md | 2 ++ ...-independent-troubleshooting@pJUhQin--BGMuXHPwx3JJ.md | 5 +++-- .../cyber-security/content/oscp@SwVGVP2bbCFs2uNg9Qtxb.md | 5 +++-- .../content/packet-sniffers@k6UX0BJho5arjGD2RWPgH.md | 2 -- .../content/parrotos@zR6djXnfTSFVEfvJonQjf.md | 4 +++- ...-testing-rules-of-engagement@NkAAQikwH-A6vrF8fWpuB.md | 2 +- ...miter-vs-dmz-vs-segmentation@PUgPgpKio4Npzs86qEXa7.md | 2 +- .../content/picoctf@pou5xHwnz9Zsy5J6lNlKq.md | 2 +- .../cyber-security/content/pki@fxyJxrf3mnFTa3wXk1MCW.md | 2 +- .../content/port-blocking@W7bcydXdwlubXF2PHKOuq.md | 7 ++++++- .../content/port-scanners@iJRQHzh5HXADuWpCouwxv.md | 4 ++-- .../content/power-shell@paY9x2VJA98FNGBFGRXp2.md | 3 +-- .../content/preparation@w6V4JOtXKCMPAkKIQxvMg.md | 4 ++-- .../private-vs-public-keys@7svh9qaaPp0Hz23yinIye.md | 2 +- .../content/private@ecpMKP1cQXXsfKETDUrSf.md | 4 ++-- .../privilege-escalation@cvI8-sxY5i8lpelW9iY_5.md | 4 ++-- .../content/programming-skills@_RnuQ7952N8GWZfPD60sJ.md | 9 ++++++++- .../content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md | 1 + .../content/proxmox@jqX1A5hFF3Qznqup4lfiF.md | 5 +++-- .../content/public@ZDj7KBuyZsKyEMZViMoXW.md | 5 ++--- .../content/python@XiHvGy--OkPFfJeKA6-LP.md | 3 +-- .../content/reconnaissance@UU_inxa8Y2lLP2BRhdLDT.md | 3 ++- .../content/replay-attack@mIX8PsIGuwgPCGQZ6ok2H.md | 1 - .../cyber-security/content/ring@9vEUVJ8NTh0wKyIE6-diY.md | 2 +- .../cyber-security/content/rmf@fjEdufrZAfW4Rl6yDU8Hk.md | 3 --- .../content/rogue-access-point@Ee7LfbhwJbiWjJ3b_bbni.md | 4 ++-- ...s-of-compliance-and-auditors@kqT0FRLt9Ak9P8PhHldO-.md | 3 ++- .../content/route@xFuWk7M-Vctk_xb7bHbWs.md | 7 ++++++- .../content/router@lwSFIbIX-xOZ0QK2sGFb1.md | 2 +- .../cyber-security/content/s3@2jsTgT7k8MeaDtx6RJhOP.md | 3 ++- .../cyber-security/content/saas@sVw5KVNxPEatBRKb2ZbS_.md | 3 +-- .../sans-holiday-hack-challenge@WCeJrvWl837m1BIjuA1Mu.md | 2 +- .../content/shoulder-surfing@FD0bkmxNpPXiUB_NevEUf.md | 3 +-- .../cyber-security/content/siem@c2kY3wZVFKZYxMARhLIwO.md | 3 +-- .../cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md | 1 + .../content/switch@r9byGV8XuBPzoqj5ZPf2W.md | 4 ++-- ...true-negative--true-positive@M6uwyD4ibguxytf1od-og.md | 2 +- .../content/tryhackme@kht-L7_v-DbglMYUHuchp.md | 2 +- ...ow-of-deploying-in-the-cloud@XL3FVeGFDhAl_gSol6Tjt.md | 2 +- ...pt-of-infrastructure-as-code@RJctUpvlUJGAdwBNtDSXw.md | 7 +++++-- ...ept-of-security-in-the-cloud@ThLsXkqLw--uddHz0spCH.md | 3 ++- ...nd-the-concept-of-serverless@-83ltMEl3le3yD68OFnTM.md | 2 +- .../content/virtualbox@vGVFhZXYOZOy4qFpLLbxp.md | 3 ++- .../content/virustotal@rxzcAzHjzIc9lkWSw0fef.md | 4 ++-- .../content/vmware@AjywuCZdBi9atGUbetlUL.md | 2 +- .../content/vulnhub@W94wY_otBuvVW_-EFlKA6.md | 2 +- .../watering-hole-attack@dcvuKHq0nHgHLcLwtl4IJ.md | 2 +- .../content/windows@BNUKEQ4YpZmIhSPQdkHgU.md | 4 ++-- .../content/winhex@gNan93Mg9Ym2AF3Q2gqoi.md | 2 +- .../content/wireshark@Sm9bxKUElINHND8FdZ5f2.md | 4 ++-- .../cyber-security/content/wlan@QCVYF1rmPsMVtklBNDNaB.md | 1 - 53 files changed, 95 insertions(+), 74 deletions(-) diff --git a/src/data/roadmaps/cyber-security/content/onedrive@MWqnhDKm9jXvDDjkeVNxm.md b/src/data/roadmaps/cyber-security/content/onedrive@MWqnhDKm9jXvDDjkeVNxm.md index 91381a979..fd4d5b9d3 100644 --- a/src/data/roadmaps/cyber-security/content/onedrive@MWqnhDKm9jXvDDjkeVNxm.md +++ b/src/data/roadmaps/cyber-security/content/onedrive@MWqnhDKm9jXvDDjkeVNxm.md @@ -4,6 +4,5 @@ Learn more from the following resources: -- [@official@OneDrive Website](https://onedrive.live.com) +- [@official@Microsoft OneDrive](https://onedrive.live.com) - [@video@Microsoft OneDrive Tutorial](https://www.youtube.com/watch?v=qgw01w0iYjA) - diff --git a/src/data/roadmaps/cyber-security/content/operating-system-hardening@_S25EOGS3P8647zLM5i-g.md b/src/data/roadmaps/cyber-security/content/operating-system-hardening@_S25EOGS3P8647zLM5i-g.md index 5d789a327..1d7695241 100644 --- a/src/data/roadmaps/cyber-security/content/operating-system-hardening@_S25EOGS3P8647zLM5i-g.md +++ b/src/data/roadmaps/cyber-security/content/operating-system-hardening@_S25EOGS3P8647zLM5i-g.md @@ -2,7 +2,8 @@ **Operating system hardening** involves configuring and securing an OS to reduce vulnerabilities and improve its defense against attacks. This process includes disabling unnecessary services and ports, applying security patches and updates, configuring strong authentication mechanisms, enforcing least privilege principles, and enabling firewalls and intrusion detection systems. Hardening also involves setting up proper file permissions, securing system logs, and regularly auditing the system to ensure compliance with security policies and best practices. The goal is to minimize the attack surface and protect the OS from potential threats and exploits. -Learn more from the following resources +Learn more from the following resources: - [@article@OS Hardening: 15 Best Practices](https://perception-point.io/guides/os-isolation/os-hardening-10-best-practices/) +- [@article@Operating System (OS) Hardening: Pros, Cons, and Importance](https://linfordco.com/blog/operating-system-hardening/) - [@video@Hardening Techniques](https://www.youtube.com/watch?v=wXoC46Qr_9Q) diff --git a/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md b/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md index 841e99ef7..eb0ebf374 100644 --- a/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md +++ b/src/data/roadmaps/cyber-security/content/operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md @@ -4,4 +4,6 @@ Learn more from the following resources: +- [@article@What is a Operating System?](https://en.wikipedia.org/wiki/Operating_system) +- [@article@8 Different Types of Operating Systems With Examples](https://techspirited.com/different-types-of-operating-systems) - [@video@What is an operating system as fast as possible](https://www.youtube.com/watch?v=pVzRTmdd9j0) diff --git a/src/data/roadmaps/cyber-security/content/os-independent-troubleshooting@pJUhQin--BGMuXHPwx3JJ.md b/src/data/roadmaps/cyber-security/content/os-independent-troubleshooting@pJUhQin--BGMuXHPwx3JJ.md index 64d7db982..753261104 100644 --- a/src/data/roadmaps/cyber-security/content/os-independent-troubleshooting@pJUhQin--BGMuXHPwx3JJ.md +++ b/src/data/roadmaps/cyber-security/content/os-independent-troubleshooting@pJUhQin--BGMuXHPwx3JJ.md @@ -40,5 +40,6 @@ Logs are records of system events, application behavior, and user activity, whic Learn more from the following resources: -- [@article@How to identify 9 signs of Operating System.](https://bro4u.com/blog/how-to-identify-9-signs-of-operating-system) -- [@article@Trouble shooting guide](https://cdnsm5-ss6.sharpschool.com/userfiles/servers/server_20856499/file/teacher%20pages/lindsay%20dolezal/it%20essentials/5.6.pdf) +- [@articleOS-Independent Troubleshooting Flashcards](https://quizlet.com/ph/837474114/os-independent-troubleshooting-flash-cards/) +- [@video@Operating System Troubleshooting - CompTIA A+](https://www.youtube.com/watch?v=6gainrNiypc) +- [@article@Troubleshooting Guide](https://cdnsm5-ss6.sharpschool.com/userfiles/servers/server_20856499/file/teacher%20pages/lindsay%20dolezal/it%20essentials/5.6.pdf) diff --git a/src/data/roadmaps/cyber-security/content/oscp@SwVGVP2bbCFs2uNg9Qtxb.md b/src/data/roadmaps/cyber-security/content/oscp@SwVGVP2bbCFs2uNg9Qtxb.md index 79a74b6c9..9dbbc46a4 100644 --- a/src/data/roadmaps/cyber-security/content/oscp@SwVGVP2bbCFs2uNg9Qtxb.md +++ b/src/data/roadmaps/cyber-security/content/oscp@SwVGVP2bbCFs2uNg9Qtxb.md @@ -4,5 +4,6 @@ Learn more from the following resources: -- [@article@Offsec OSCP Site](https://www.offsec.com/courses/pen-200/) -- [@article@How to prepare for the OSCP](https://cybersecurityguide.org/programs/cybersecurity-certifications/oscp/) +- [@official@Offensive Security Certified Professional](https://www.offsec.com/courses/pen-200/) +- [@article@How to Prepare for OSCP Exam](https://cybersecurityguide.org/programs/cybersecurity-certifications/oscp/) +- [@article@How to Become an OSCP [Full Guide] - Geekflare](https://geekflare.com/cybersecurity/oscp-certification/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/packet-sniffers@k6UX0BJho5arjGD2RWPgH.md b/src/data/roadmaps/cyber-security/content/packet-sniffers@k6UX0BJho5arjGD2RWPgH.md index 235a73f1e..968653bd6 100644 --- a/src/data/roadmaps/cyber-security/content/packet-sniffers@k6UX0BJho5arjGD2RWPgH.md +++ b/src/data/roadmaps/cyber-security/content/packet-sniffers@k6UX0BJho5arjGD2RWPgH.md @@ -6,5 +6,3 @@ Learn more from the following resources: - [@article@Packet Sniffing Explained](https://www.avast.com/c-packet-sniffing) - [@video@What is Packet Sniffing?](https://www.youtube.com/watch?v=5oioSbgBQ8I) - - diff --git a/src/data/roadmaps/cyber-security/content/parrotos@zR6djXnfTSFVEfvJonQjf.md b/src/data/roadmaps/cyber-security/content/parrotos@zR6djXnfTSFVEfvJonQjf.md index 4dec48822..88f195c4d 100644 --- a/src/data/roadmaps/cyber-security/content/parrotos@zR6djXnfTSFVEfvJonQjf.md +++ b/src/data/roadmaps/cyber-security/content/parrotos@zR6djXnfTSFVEfvJonQjf.md @@ -4,4 +4,6 @@ ParrotOS is a Debian-based Linux distribution designed for security, privacy, an Visit the following resources to learn more: -- [@official@ParrotOS](https://parrotsec.org/) \ No newline at end of file +- [@official@ParrotOS](https://parrotsec.org/) +- [@official@ParrotOS Documentation](https://parrotsec.org/docs) +- [@official@ParrotOS Downloads](https://parrotsec.org/download) diff --git a/src/data/roadmaps/cyber-security/content/penetration-testing-rules-of-engagement@NkAAQikwH-A6vrF8fWpuB.md b/src/data/roadmaps/cyber-security/content/penetration-testing-rules-of-engagement@NkAAQikwH-A6vrF8fWpuB.md index 78efb425d..1709a8cfe 100644 --- a/src/data/roadmaps/cyber-security/content/penetration-testing-rules-of-engagement@NkAAQikwH-A6vrF8fWpuB.md +++ b/src/data/roadmaps/cyber-security/content/penetration-testing-rules-of-engagement@NkAAQikwH-A6vrF8fWpuB.md @@ -4,5 +4,5 @@ Learn more from the following resources: -- [@article@Why are rules of engagement important to a Penetration Test?](https://www.triaxiomsecurity.com/rules-of-engagement-important-to-penetration-test/) +- [@article@Why are Rules of Engagement Important to a Penetration Test?](https://www.triaxiomsecurity.com/rules-of-engagement-important-to-penetration-test/) - [@video@CompTIA Pentest+ : Rules of Engagement](https://www.youtube.com/watch?v=Rt-4j8k6J2U) diff --git a/src/data/roadmaps/cyber-security/content/perimiter-vs-dmz-vs-segmentation@PUgPgpKio4Npzs86qEXa7.md b/src/data/roadmaps/cyber-security/content/perimiter-vs-dmz-vs-segmentation@PUgPgpKio4Npzs86qEXa7.md index 53ed73fbb..dbcf82804 100644 --- a/src/data/roadmaps/cyber-security/content/perimiter-vs-dmz-vs-segmentation@PUgPgpKio4Npzs86qEXa7.md +++ b/src/data/roadmaps/cyber-security/content/perimiter-vs-dmz-vs-segmentation@PUgPgpKio4Npzs86qEXa7.md @@ -1,4 +1,4 @@ -# Perimiter vs DMZ vs Segmentation +# Perimeter vs DMZ vs Segmentation In network security, **perimeter**, **DMZ (Demilitarized Zone)**, and **segmentation** are strategies for organizing and protecting systems: diff --git a/src/data/roadmaps/cyber-security/content/picoctf@pou5xHwnz9Zsy5J6lNlKq.md b/src/data/roadmaps/cyber-security/content/picoctf@pou5xHwnz9Zsy5J6lNlKq.md index db5d2d63c..a35b7e606 100644 --- a/src/data/roadmaps/cyber-security/content/picoctf@pou5xHwnz9Zsy5J6lNlKq.md +++ b/src/data/roadmaps/cyber-security/content/picoctf@pou5xHwnz9Zsy5J6lNlKq.md @@ -4,5 +4,5 @@ Learn more from the following resources: -- [@official@picoCTF Website](https://picoctf.org/) +- [@official@picoCTF](https://picoctf.org/) - [@video@BEGINNER Capture The Flag - PicoCTF 2021 001 "Obedient Cat"](https://www.youtube.com/watch?v=P07NH5F-t3s) diff --git a/src/data/roadmaps/cyber-security/content/pki@fxyJxrf3mnFTa3wXk1MCW.md b/src/data/roadmaps/cyber-security/content/pki@fxyJxrf3mnFTa3wXk1MCW.md index 5e8ff2342..984fe655e 100644 --- a/src/data/roadmaps/cyber-security/content/pki@fxyJxrf3mnFTa3wXk1MCW.md +++ b/src/data/roadmaps/cyber-security/content/pki@fxyJxrf3mnFTa3wXk1MCW.md @@ -5,4 +5,4 @@ Learn more from the following resources: - [@article@What is PKI?](https://cpl.thalesgroup.com/faq/public-key-infrastructure-pki/what-public-key-infrastructure-pki) -- [@article@Design and build a privately hosted Public Key Infrastructure](Design and build a privately hosted Public Key Infrastructure) +- [@article@What Is Public Key Infrastructure (PKI) & How Does It Work?](https://www.okta.com/identity-101/public-key-infrastructure/) diff --git a/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md b/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md index 687cc4b5d..9009188ef 100644 --- a/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md +++ b/src/data/roadmaps/cyber-security/content/port-blocking@W7bcydXdwlubXF2PHKOuq.md @@ -1,3 +1,8 @@ # Port Blocking -Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches. \ No newline at end of file +Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches. + +Learn more from the following resources: + +- [@article@What is Port Blocking?](https://cyberpedia.reasonlabs.com/EN/port%20blocking.html) +- [@article@Is Your Router Blocking Your Ports? Here's How to Find Out?](https://softhandtech.com/how-can-i-tell-if-a-port-is-blocked-on-my-router/) diff --git a/src/data/roadmaps/cyber-security/content/port-scanners@iJRQHzh5HXADuWpCouwxv.md b/src/data/roadmaps/cyber-security/content/port-scanners@iJRQHzh5HXADuWpCouwxv.md index a0fe9f33a..f1da39096 100644 --- a/src/data/roadmaps/cyber-security/content/port-scanners@iJRQHzh5HXADuWpCouwxv.md +++ b/src/data/roadmaps/cyber-security/content/port-scanners@iJRQHzh5HXADuWpCouwxv.md @@ -4,5 +4,5 @@ Port scanners are essential tools in the troubleshooting and cybersecurity lands Learn more from the following resources: -- [@article@Top 5 Best port scanners](https://securitytrails.com/blog/best-port-scanners) -- [@video@How To Use nmap To Scan For Open Ports](https://www.youtube.com/watch?v=ifbwTt3_oCg) +- [@article@Top 5 Best Port Scanners](https://securitytrails.com/blog/best-port-scanners) +- [@video@How To Use Nmap To Scan For Open Ports](https://www.youtube.com/watch?v=ifbwTt3_oCg) diff --git a/src/data/roadmaps/cyber-security/content/power-shell@paY9x2VJA98FNGBFGRXp2.md b/src/data/roadmaps/cyber-security/content/power-shell@paY9x2VJA98FNGBFGRXp2.md index 00d5faa91..f820f01d6 100644 --- a/src/data/roadmaps/cyber-security/content/power-shell@paY9x2VJA98FNGBFGRXp2.md +++ b/src/data/roadmaps/cyber-security/content/power-shell@paY9x2VJA98FNGBFGRXp2.md @@ -5,7 +5,6 @@ Learn more from the following resources: - [@official@PowerShell.org](https://powershell.org/) -- [@article@Microsoft's Official PowerShell Documentation](https://docs.microsoft.com/en-us/powershell/) +- [@article@Microsoft's PowerShell Documentation](https://docs.microsoft.com/en-us/powershell/) - [@video@PowerShell Course](https://www.youtube.com/watch?v=ZOoCaWyifmI) - [@opensource@Learning PowerShell GitHub Repository](https://github.com/PowerShell/PowerShell/tree/master/docs/learning-powershell) - diff --git a/src/data/roadmaps/cyber-security/content/preparation@w6V4JOtXKCMPAkKIQxvMg.md b/src/data/roadmaps/cyber-security/content/preparation@w6V4JOtXKCMPAkKIQxvMg.md index 5912a8d6a..6c16ab42a 100644 --- a/src/data/roadmaps/cyber-security/content/preparation@w6V4JOtXKCMPAkKIQxvMg.md +++ b/src/data/roadmaps/cyber-security/content/preparation@w6V4JOtXKCMPAkKIQxvMg.md @@ -4,5 +4,5 @@ The **Preparation** phase in incident response involves establishing and maintai Learn more from the following resources: -- [@article@](https://www.microsoft.com/en-gb/security/business/security-101/what-is-incident-response) -- [@video@](https://www.youtube.com/watch?v=ePZGqlcB1O8) +- [@article@What is Incident Response](https://www.microsoft.com/en-gb/security/business/security-101/what-is-incident-response) +- [@video@Cyber Security Incident Response Explained](https://www.youtube.com/watch?v=ePZGqlcB1O8) diff --git a/src/data/roadmaps/cyber-security/content/private-vs-public-keys@7svh9qaaPp0Hz23yinIye.md b/src/data/roadmaps/cyber-security/content/private-vs-public-keys@7svh9qaaPp0Hz23yinIye.md index fe5c1a1f2..85ec72459 100644 --- a/src/data/roadmaps/cyber-security/content/private-vs-public-keys@7svh9qaaPp0Hz23yinIye.md +++ b/src/data/roadmaps/cyber-security/content/private-vs-public-keys@7svh9qaaPp0Hz23yinIye.md @@ -1,4 +1,4 @@ -# Pvt Key vs Pub Key +# Private Key vs Public Key **Public keys** and **private keys** are cryptographic components used in asymmetric encryption. diff --git a/src/data/roadmaps/cyber-security/content/private@ecpMKP1cQXXsfKETDUrSf.md b/src/data/roadmaps/cyber-security/content/private@ecpMKP1cQXXsfKETDUrSf.md index 84ccfca77..c564e9bf9 100644 --- a/src/data/roadmaps/cyber-security/content/private@ecpMKP1cQXXsfKETDUrSf.md +++ b/src/data/roadmaps/cyber-security/content/private@ecpMKP1cQXXsfKETDUrSf.md @@ -4,5 +4,5 @@ A **private cloud** is a cloud computing environment dedicated to a single organ Learn more from the following resources: -- [@article@What is a private cloud?](https://aws.amazon.com/what-is/private-cloud/) -- [@video@Private cloud rules](https://www.youtube.com/watch?v=Tzqy8lW0bk4) +- [@article@What is a Private Cloud?](https://aws.amazon.com/what-is/private-cloud/) +- [@video@Private Cloud Rules](https://www.youtube.com/watch?v=Tzqy8lW0bk4) diff --git a/src/data/roadmaps/cyber-security/content/privilege-escalation@cvI8-sxY5i8lpelW9iY_5.md b/src/data/roadmaps/cyber-security/content/privilege-escalation@cvI8-sxY5i8lpelW9iY_5.md index fc643dd83..19115654e 100644 --- a/src/data/roadmaps/cyber-security/content/privilege-escalation@cvI8-sxY5i8lpelW9iY_5.md +++ b/src/data/roadmaps/cyber-security/content/privilege-escalation@cvI8-sxY5i8lpelW9iY_5.md @@ -1,8 +1,8 @@ -# Privilege escalation / User based Attacks +# Privilege escalation Privilege escalation is a technique where an attacker increases their access level within a system, moving from lower to higher permissions, such as from a standard user to an administrator. This can be achieved by exploiting system vulnerabilities, misconfigurations, or security weaknesses. It is critical to implement strong access controls, adhere to the principle of least privilege, and regularly update and patch systems to defend against such attacks. Visit the following resources to learn more: -- [@article@What is privilege escalation?](https://www.crowdstrike.com/cybersecurity-101/privilege-escalation/) +- [@article@What is Privilege Escalation?](https://www.crowdstrike.com/cybersecurity-101/privilege-escalation/) - [@video@Privilege Escalation](https://www.youtube.com/watch?v=ksjU3Iu195Q) diff --git a/src/data/roadmaps/cyber-security/content/programming-skills@_RnuQ7952N8GWZfPD60sJ.md b/src/data/roadmaps/cyber-security/content/programming-skills@_RnuQ7952N8GWZfPD60sJ.md index 7ee26f093..f094d8db8 100644 --- a/src/data/roadmaps/cyber-security/content/programming-skills@_RnuQ7952N8GWZfPD60sJ.md +++ b/src/data/roadmaps/cyber-security/content/programming-skills@_RnuQ7952N8GWZfPD60sJ.md @@ -8,4 +8,11 @@ Programming knowledge is a fundamental skill for professionals in the cybersecur - **JavaScript**: With its ubiquity in modern web browsers, JavaScript is crucial for understanding and protecting against web security vulnerabilities, such as Cross-Site Scripting (XSS) and Cross-Site Request Forgery (CSRF) attacks. - **Ruby**: Ruby has a strong foothold in web application development and is utilized for scripting and automation, just like Python. Familiarity with Ruby may give cybersecurity professionals an edge in certain environments. -Acquiring programming knowledge in cybersecurity can help you stay on top of the latest threats, develop secure software, and implement effective countermeasures. As you progress in your cybersecurity career, you'll find that your programming skills will continually evolve and your understanding of various languages, concepts, and techniques will expand. +Visit the following resources to learn more: + +- [@roadmap@Visit Linux Roadmap](https://roadmap.sh/linux) +- [@roadmap@Visit Python Roadmap](https://roadmap.sh/python) +- [@roadmap@Visit C++ Roadmap](https://roadmap.sh/cpp) +- [@roadmap@Visit Java Roadmap](https://roadmap.sh/java) +- [@roadmap@Visit JavaScript Roadmap](https://roadmap.sh/javascript) +- [@roadmap@Visit Typescript Roadmap](https://roadmap.sh/typescript) diff --git a/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md b/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md index 104ad38c6..5bda1db11 100644 --- a/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md +++ b/src/data/roadmaps/cyber-security/content/protocol-analyzers@K05mEAsjImyPge0hDtsU0.md @@ -4,4 +4,5 @@ Learn more from the following resources: +- [@article@What is a Protocol Analyzer?](https://www.liveaction.com/glossary/protocol-analyzer/) - [@video@Protocol Analyzers](https://www.youtube.com/watch?v=hTMhlB-o0Ow) diff --git a/src/data/roadmaps/cyber-security/content/proxmox@jqX1A5hFF3Qznqup4lfiF.md b/src/data/roadmaps/cyber-security/content/proxmox@jqX1A5hFF3Qznqup4lfiF.md index 6160a549e..9c3837627 100644 --- a/src/data/roadmaps/cyber-security/content/proxmox@jqX1A5hFF3Qznqup4lfiF.md +++ b/src/data/roadmaps/cyber-security/content/proxmox@jqX1A5hFF3Qznqup4lfiF.md @@ -4,5 +4,6 @@ Learn more from the following resources: -- [@video@What is Proxmox virtualization?](https://www.youtube.com/watch?v=GMAvmHEWAMU) -- [@article@Proxmox Website](https://www.proxmox.com/en/) +- [@official@Proxmox](https://www.proxmox.com/en/) +- [@article@Proxmox Virtual Environment](https://en.wikipedia.org/wiki/Proxmox_Virtual_Environment) +- [@video@What is Proxmox virtualization?](https://www.youtube.com/watch?v=GMAvmHEWAMU) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/public@ZDj7KBuyZsKyEMZViMoXW.md b/src/data/roadmaps/cyber-security/content/public@ZDj7KBuyZsKyEMZViMoXW.md index 68daa4237..b9081261b 100644 --- a/src/data/roadmaps/cyber-security/content/public@ZDj7KBuyZsKyEMZViMoXW.md +++ b/src/data/roadmaps/cyber-security/content/public@ZDj7KBuyZsKyEMZViMoXW.md @@ -4,6 +4,5 @@ A **public cloud** is a computing service offered by third-party providers over Learn more from the following resources: -- [@video@What is a public cloud?](https://www.youtube.com/watch?v=KaCyfQ7luVY) -- [@article@What is a public cloud? Microsoft](https://azure.microsoft.com/en-gb/resources/cloud-computing-dictionary/what-is-a-public-cloud) - +- [@article@A Public Cloud?](https://azure.microsoft.com/en-gb/resources/cloud-computing-dictionary/what-is-a-public-cloud) +- [@video@What is a Public Cloud](https://www.youtube.com/watch?v=KaCyfQ7luVY) diff --git a/src/data/roadmaps/cyber-security/content/python@XiHvGy--OkPFfJeKA6-LP.md b/src/data/roadmaps/cyber-security/content/python@XiHvGy--OkPFfJeKA6-LP.md index f9a731a42..84001a52b 100644 --- a/src/data/roadmaps/cyber-security/content/python@XiHvGy--OkPFfJeKA6-LP.md +++ b/src/data/roadmaps/cyber-security/content/python@XiHvGy--OkPFfJeKA6-LP.md @@ -4,7 +4,6 @@ Learn more from the following resources: -- [@roadmap@Python Roadmap](https://roadmap.sh/python) +- [@roadmap@Visit Dedicated Python Roadmap](https://roadmap.sh/python) - [@course@Python Full Course 2024](https://www.youtube.com/watch?v=ix9cRaBkVe0) - [@video@Python in 100 Seconds](https://www.youtube.com/watch?v=x7X9w_GIm1s) - diff --git a/src/data/roadmaps/cyber-security/content/reconnaissance@UU_inxa8Y2lLP2BRhdLDT.md b/src/data/roadmaps/cyber-security/content/reconnaissance@UU_inxa8Y2lLP2BRhdLDT.md index 7fc03ad60..e9fb4b2f9 100644 --- a/src/data/roadmaps/cyber-security/content/reconnaissance@UU_inxa8Y2lLP2BRhdLDT.md +++ b/src/data/roadmaps/cyber-security/content/reconnaissance@UU_inxa8Y2lLP2BRhdLDT.md @@ -1,7 +1,8 @@ # Reconnaissance -Reconnaissance is the first phase of a cyberattack, during which attackers gather as much information as possible about a target system, network, or organization. The goal of reconnaissance is to identify potential vulnerabilities, entry points, and other valuable details that can be exploited in subsequent attack phases. +Reconnaissance is the first phase of a cyber-attack, during which attackers gather as much information as possible about a target system, network, or organization. The goal of reconnaissance is to identify potential vulnerabilities, entry points, and other valuable details that can be exploited in subsequent attack phases. Visit the following resources to learn more: - [@article@What is Cyber Reconnaissance](https://www.sentinelone.com/cybersecurity-101/threat-intelligence/what-is-cyber-reconnaissance/) +- [@article@What is Cybersecurity Reconnaissance?](https://cymulate.com/cybersecurity-glossary/cyber-reconnaissance/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/replay-attack@mIX8PsIGuwgPCGQZ6ok2H.md b/src/data/roadmaps/cyber-security/content/replay-attack@mIX8PsIGuwgPCGQZ6ok2H.md index 2fa0367c8..cdef65121 100644 --- a/src/data/roadmaps/cyber-security/content/replay-attack@mIX8PsIGuwgPCGQZ6ok2H.md +++ b/src/data/roadmaps/cyber-security/content/replay-attack@mIX8PsIGuwgPCGQZ6ok2H.md @@ -5,4 +5,3 @@ A Replay Attack is a type of network attack where an attacker intercepts and ret Visit the following resources to learn more: - [@article@What Is a Replay Attack?](https://usa.kaspersky.com/resource-center/definitions/replay-attack) - diff --git a/src/data/roadmaps/cyber-security/content/ring@9vEUVJ8NTh0wKyIE6-diY.md b/src/data/roadmaps/cyber-security/content/ring@9vEUVJ8NTh0wKyIE6-diY.md index fe3745162..d708d1d89 100644 --- a/src/data/roadmaps/cyber-security/content/ring@9vEUVJ8NTh0wKyIE6-diY.md +++ b/src/data/roadmaps/cyber-security/content/ring@9vEUVJ8NTh0wKyIE6-diY.md @@ -4,5 +4,5 @@ In a ring topology, each network device is connected in a circular fashion, wher Learn more from the following resources: -- [@article@What is ring topology?](https://www.lenovo.com/gb/en/glossary/what-is-ring-topology/) +- [@article@What is Ring Topology?](https://www.lenovo.com/gb/en/glossary/what-is-ring-topology/) - [@video@Network Topologies - Ring](https://www.youtube.com/watch?v=hjeDN2xnc50) diff --git a/src/data/roadmaps/cyber-security/content/rmf@fjEdufrZAfW4Rl6yDU8Hk.md b/src/data/roadmaps/cyber-security/content/rmf@fjEdufrZAfW4Rl6yDU8Hk.md index 18e2b966e..c020ef8f6 100644 --- a/src/data/roadmaps/cyber-security/content/rmf@fjEdufrZAfW4Rl6yDU8Hk.md +++ b/src/data/roadmaps/cyber-security/content/rmf@fjEdufrZAfW4Rl6yDU8Hk.md @@ -9,10 +9,7 @@ A **Risk Management Framework (RMF)** is a structured approach that organization 5. **Communication and Reporting:** Regularly updating stakeholders on the risk status and actions taken. 6. **Review and Improvement:** Periodically reassessing the framework and adapting to changes in the business or regulatory environment. -The RMF ensures that risks are managed proactively and consistently across the organization, helping to safeguard assets and support strategic decision-making. - Learn more from the following resources: - [@article@What is the Risk Management Framework?](https://www.techtarget.com/searchcio/definition/Risk-Management-Framework-RMF) - [@video@RMF explained in 5 minutes](https://www.youtube.com/watch?v=X5yqPFp__rc) - diff --git a/src/data/roadmaps/cyber-security/content/rogue-access-point@Ee7LfbhwJbiWjJ3b_bbni.md b/src/data/roadmaps/cyber-security/content/rogue-access-point@Ee7LfbhwJbiWjJ3b_bbni.md index 0f8c26081..61cd23814 100644 --- a/src/data/roadmaps/cyber-security/content/rogue-access-point@Ee7LfbhwJbiWjJ3b_bbni.md +++ b/src/data/roadmaps/cyber-security/content/rogue-access-point@Ee7LfbhwJbiWjJ3b_bbni.md @@ -4,5 +4,5 @@ A Rogue Access Point (Rogue AP) is an unauthorized wireless access point install Visit the following resources to learn more: -- [@article@Rogue access points](https://www.khanacademy.org/computing/computers-and-internet/xcae6f4a7ff015e7d:online-data-security/xcae6f4a7ff015e7d:cyber-attacks/a/rogue-access-points-mitm-attacks) - +- [@article@Rogue Access Points](https://www.khanacademy.org/computing/computers-and-internet/xcae6f4a7ff015e7d:online-data-security/xcae6f4a7ff015e7d:cyber-attacks/a/rogue-access-points-mitm-attacks) +- [@article@What is Rogue Access Point](https://pentescope.com/rogue-access-point-detection-and-prevention/) diff --git a/src/data/roadmaps/cyber-security/content/roles-of-compliance-and-auditors@kqT0FRLt9Ak9P8PhHldO-.md b/src/data/roadmaps/cyber-security/content/roles-of-compliance-and-auditors@kqT0FRLt9Ak9P8PhHldO-.md index 5d5aecfeb..064dcc73c 100644 --- a/src/data/roadmaps/cyber-security/content/roles-of-compliance-and-auditors@kqT0FRLt9Ak9P8PhHldO-.md +++ b/src/data/roadmaps/cyber-security/content/roles-of-compliance-and-auditors@kqT0FRLt9Ak9P8PhHldO-.md @@ -4,4 +4,5 @@ Compliance officers ensure that an organization adheres to legal, regulatory, an Learn more from the following resources: -- [@article@What is a compliance audit?](https://www.auditboard.com/blog/compliance-audit/) +- [@article@What is a Compliance Audit?](https://www.auditboard.com/blog/compliance-audit/) +- [@article@Compliance Office and Internal Audit Roles and Responsibilities](https://www.compliance.com/resources/compliance-office-and-internal-audit-roles-and-responsibilities/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md b/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md index 93eabb5af..9d86d1eea 100644 --- a/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md +++ b/src/data/roadmaps/cyber-security/content/route@xFuWk7M-Vctk_xb7bHbWs.md @@ -1,3 +1,8 @@ # route -The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security. \ No newline at end of file +The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security. + +Learn more from the following resources: + +- [@article@route command](https://www.man7.org/linux/man-pages/man8/route.8.html) +- [@video@route command explained](https://www.youtube.com/watch?v=uOqBollh_x4) diff --git a/src/data/roadmaps/cyber-security/content/router@lwSFIbIX-xOZ0QK2sGFb1.md b/src/data/roadmaps/cyber-security/content/router@lwSFIbIX-xOZ0QK2sGFb1.md index defd7202b..2c66366aa 100644 --- a/src/data/roadmaps/cyber-security/content/router@lwSFIbIX-xOZ0QK2sGFb1.md +++ b/src/data/roadmaps/cyber-security/content/router@lwSFIbIX-xOZ0QK2sGFb1.md @@ -5,6 +5,6 @@ A router is a networking device that directs data packets between different netw Learn more from the following resources: - [@article@What is a Router](https://www.cloudflare.com/en-gb/learning/network-layer/what-is-a-router/) -- [@video@What is a router and how does it work?](https://www.youtube.com/watch?v=UIJzHLpG9bM) +- [@video@What is a router and How does it work?](https://www.youtube.com/watch?v=UIJzHLpG9bM) - [@video@Everything Routers do](https://youtu.be/AzXys5kxpAM?si=nEsCH6jG2Lj6Ua8N) - [@video@How Routers forward Packets?](https://youtu.be/Ep-x_6kggKA?si=II5xBPoXjYEjLvWX) diff --git a/src/data/roadmaps/cyber-security/content/s3@2jsTgT7k8MeaDtx6RJhOP.md b/src/data/roadmaps/cyber-security/content/s3@2jsTgT7k8MeaDtx6RJhOP.md index 28ae2f6a5..566ff5ad9 100644 --- a/src/data/roadmaps/cyber-security/content/s3@2jsTgT7k8MeaDtx6RJhOP.md +++ b/src/data/roadmaps/cyber-security/content/s3@2jsTgT7k8MeaDtx6RJhOP.md @@ -4,5 +4,6 @@ Amazon Simple Storage Service (S3) is a scalable, object-based cloud storage ser Learn more from the following resources: -- [@article@AWS S3 Website](https://aws.amazon.com/pm/serv-s3/?gclid=Cj0KCQjwrp-3BhDgARIsAEWJ6SyhAtgc3NJbsxaAXVbWEOW5gG-XFH51jIc8SxahYSxNJ501l9soUA0aAnEjEALw_wcB&trk=777b3ec4-de01-41fb-aa63-cde3d034a89e&sc_channel=ps&ef_id=Cj0KCQjwrp-3BhDgARIsAEWJ6SyhAtgc3NJbsxaAXVbWEOW5gG-XFH51jIc8SxahYSxNJ501l9soUA0aAnEjEALw_wcB:G:s&s_kwcid=AL!4422!3!638364429346!e!!g!!aws%20s3!19096959014!142655567183) +- [@official@Amazon Web Services S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) +- [@official@Amazon Simple Storage Service Documentation](https://docs.aws.amazon.com/s3/) - [@video@Getting started with AWS S3](https://www.youtube.com/watch?v=e6w9LwZJFIA) diff --git a/src/data/roadmaps/cyber-security/content/saas@sVw5KVNxPEatBRKb2ZbS_.md b/src/data/roadmaps/cyber-security/content/saas@sVw5KVNxPEatBRKb2ZbS_.md index 31ee7894d..e894524c7 100644 --- a/src/data/roadmaps/cyber-security/content/saas@sVw5KVNxPEatBRKb2ZbS_.md +++ b/src/data/roadmaps/cyber-security/content/saas@sVw5KVNxPEatBRKb2ZbS_.md @@ -4,6 +4,5 @@ Software as a Service (SaaS) is a cloud-based model where software applications Learn more from the following resources: -- [@article@iWhat is SaaS? Microsoft](https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is-saas) +- [@article@Software as a Service?](https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is-saas) - [@video@What is SaaS?](https://www.youtube.com/watch?v=UEHdYNXiIUU) - diff --git a/src/data/roadmaps/cyber-security/content/sans-holiday-hack-challenge@WCeJrvWl837m1BIjuA1Mu.md b/src/data/roadmaps/cyber-security/content/sans-holiday-hack-challenge@WCeJrvWl837m1BIjuA1Mu.md index 6e0dcbd47..aed12b4db 100644 --- a/src/data/roadmaps/cyber-security/content/sans-holiday-hack-challenge@WCeJrvWl837m1BIjuA1Mu.md +++ b/src/data/roadmaps/cyber-security/content/sans-holiday-hack-challenge@WCeJrvWl837m1BIjuA1Mu.md @@ -4,5 +4,5 @@ The SANS Holiday Hack Challenge is an annual cybersecurity event that offers par Learn more from the following resources: -- [@official@SANS Holiday Hack Website](https://www.sans.org/mlp/holiday-hack-challenge-2023/) +- [@official@SANS Holiday Hack](https://www.sans.org/mlp/holiday-hack-challenge-2023/) - [@video@Official SANS Holiday Hack Challenge Video](https://www.youtube.com/watch?v=zfhhLi8jZzI) diff --git a/src/data/roadmaps/cyber-security/content/shoulder-surfing@FD0bkmxNpPXiUB_NevEUf.md b/src/data/roadmaps/cyber-security/content/shoulder-surfing@FD0bkmxNpPXiUB_NevEUf.md index 9c3359b49..7dcb41bba 100644 --- a/src/data/roadmaps/cyber-security/content/shoulder-surfing@FD0bkmxNpPXiUB_NevEUf.md +++ b/src/data/roadmaps/cyber-security/content/shoulder-surfing@FD0bkmxNpPXiUB_NevEUf.md @@ -4,7 +4,6 @@ In a Shoulder Surfing Attack, an attacker tries to get information when you are Visit the following resources to learn more: -- [@article@What is shoulder surfing, and how can you avoid it?](https://nordvpn.com/blog/shoulder-surfing/?srsltid=AfmBOorl5NPpW_Tnhas9gB2HiblorqwXyK0NJae7uaketrnDwbjJmiYV) +- [@article@What is Shoulder Surfing, and How can you avoid it?](https://nordvpn.com/blog/shoulder-surfing/?srsltid=AfmBOorl5NPpW_Tnhas9gB2HiblorqwXyK0NJae7uaketrnDwbjJmiYV) - [@article@What is Shoulder Surfing?](https://www.mcafee.com/learn/what-is-shoulder-surfing/) - [@article@What is Shoulder Surfing? 9 ways to protect yourself](https://www.bigrock.in/blog/products/security/what-is-shoulder-surfing-9-ways-to-protect-yourself-from-shoulder-surfing/) - diff --git a/src/data/roadmaps/cyber-security/content/siem@c2kY3wZVFKZYxMARhLIwO.md b/src/data/roadmaps/cyber-security/content/siem@c2kY3wZVFKZYxMARhLIwO.md index 3abc8a515..c04e86c86 100644 --- a/src/data/roadmaps/cyber-security/content/siem@c2kY3wZVFKZYxMARhLIwO.md +++ b/src/data/roadmaps/cyber-security/content/siem@c2kY3wZVFKZYxMARhLIwO.md @@ -1,7 +1,6 @@ # SIEM -SIEM, short for Security Information and Event Manager, is a term used to describe tools that greatly increases visibility into a network or system. -It does this by monitoring, filtering, collecting, normalizing, and correlating vast amounts of data such as logs, and neatly presents it via an interface/dashboard. Organizations leverage SIEMs to monitor and thus identify, protect, and respond to potential threats in their environment. For hands-on experience, you should consider setting up a SIEM in your own environment. There are some commercial tools that you can try out for free, and there are also open source alternatives, such as Wazuh or LevelBlue OSSIM (AlienVault). +SIEM, short for Security Information and Event Manager, is a term used to describe tools that greatly increases visibility into a network or system. It does this by monitoring, filtering, collecting, normalizing, and correlating vast amounts of data such as logs, and neatly presents it via an interface/dashboard. Organizations leverage SIEMs to monitor and thus identify, protect, and respond to potential threats in their environment. For hands-on experience, you should consider setting up a SIEM in your own environment. There are some commercial tools that you can try out for free, and there are also open source alternatives, such as Wazuh or LevelBlue OSSIM (AlienVault). Visit the following resources to learn more: diff --git a/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md b/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md index 00d43bda1..522ef0723 100644 --- a/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md +++ b/src/data/roadmaps/cyber-security/content/star@P0ZhAXd_H-mTOMr13Ag31.md @@ -4,4 +4,5 @@ A star network topology is a configuration where all devices (nodes) are connect Learn more from the following resources: +- [@article@Star Topology](https://www.computerhope.com/jargon/s/startopo.htm) - [@video@Star Topology](https://www.youtube.com/watch?v=EQ3rW22-Py0) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/switch@r9byGV8XuBPzoqj5ZPf2W.md b/src/data/roadmaps/cyber-security/content/switch@r9byGV8XuBPzoqj5ZPf2W.md index 333676f9a..3a09ad794 100644 --- a/src/data/roadmaps/cyber-security/content/switch@r9byGV8XuBPzoqj5ZPf2W.md +++ b/src/data/roadmaps/cyber-security/content/switch@r9byGV8XuBPzoqj5ZPf2W.md @@ -4,5 +4,5 @@ A switch is a network device that operates at the data link layer (Layer 2) of t Learn more from the following resources: -- [@article@What is a network switch?](https://www.cloudflare.com/en-gb/learning/network-layer/what-is-a-network-switch/) -- [@video@What is a SWITCH?](https://www.youtube.com/watch?v=9eH16Fxeb9o) \ No newline at end of file +- [@article@What is a Network Switch?](https://www.cloudflare.com/en-gb/learning/network-layer/what-is-a-network-switch/) +- [@video@What is a Switch?](https://www.youtube.com/watch?v=9eH16Fxeb9o) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/true-negative--true-positive@M6uwyD4ibguxytf1od-og.md b/src/data/roadmaps/cyber-security/content/true-negative--true-positive@M6uwyD4ibguxytf1od-og.md index 89203763b..1a5313a37 100644 --- a/src/data/roadmaps/cyber-security/content/true-negative--true-positive@M6uwyD4ibguxytf1od-og.md +++ b/src/data/roadmaps/cyber-security/content/true-negative--true-positive@M6uwyD4ibguxytf1od-og.md @@ -1,4 +1,4 @@ -## True Negative / True Positive +# True Negative / True Positive A True Positive occurs when a security system correctly identifies a genuine threat or malicious activity. It's an accurate alert that correctly detects an actual security incident. For example, an antivirus correctly flagging a file as malware. A True Negative is when a security system correctly identifies that there is no threat when indeed no threat exists. It's the system's accurate determination that normal, benign activity is not a security risk. For example, a firewall correctly allowing legitimate network traffic. diff --git a/src/data/roadmaps/cyber-security/content/tryhackme@kht-L7_v-DbglMYUHuchp.md b/src/data/roadmaps/cyber-security/content/tryhackme@kht-L7_v-DbglMYUHuchp.md index dbf6f9b5e..0d32bc7ee 100644 --- a/src/data/roadmaps/cyber-security/content/tryhackme@kht-L7_v-DbglMYUHuchp.md +++ b/src/data/roadmaps/cyber-security/content/tryhackme@kht-L7_v-DbglMYUHuchp.md @@ -4,5 +4,5 @@ TryHackMe is an online platform designed for cybersecurity training and learning Learn more from the following resources: -- [@official@TryHackMe Website](https://tryhackme.com/) +- [@official@TryHackMe](https://tryhackme.com/) - [@video@Start Your Cybersecurity Career with TryHackMe](https://www.youtube.com/watch?v=HPF8y_gDP7w) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/understand-the-basics-and-general-flow-of-deploying-in-the-cloud@XL3FVeGFDhAl_gSol6Tjt.md b/src/data/roadmaps/cyber-security/content/understand-the-basics-and-general-flow-of-deploying-in-the-cloud@XL3FVeGFDhAl_gSol6Tjt.md index b2cd60933..9e4f1980c 100644 --- a/src/data/roadmaps/cyber-security/content/understand-the-basics-and-general-flow-of-deploying-in-the-cloud@XL3FVeGFDhAl_gSol6Tjt.md +++ b/src/data/roadmaps/cyber-security/content/understand-the-basics-and-general-flow-of-deploying-in-the-cloud@XL3FVeGFDhAl_gSol6Tjt.md @@ -4,5 +4,5 @@ Deploying to the cloud involves the process of making applications, services, or Learn more from the following resources: -- [@article@What is cloud deployment?](https://www.cognizant.com/us/en/glossary/cloud-deployment) +- [@article@What is Cloud Deployment?](https://www.cognizant.com/us/en/glossary/cloud-deployment) - [@video@Deploying a Website to AWS in Under 1 Minute](https://www.youtube.com/watch?v=goiW0g7A0WE) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/understand-the-concept-of-infrastructure-as-code@RJctUpvlUJGAdwBNtDSXw.md b/src/data/roadmaps/cyber-security/content/understand-the-concept-of-infrastructure-as-code@RJctUpvlUJGAdwBNtDSXw.md index 1915a81d7..1876251f3 100644 --- a/src/data/roadmaps/cyber-security/content/understand-the-concept-of-infrastructure-as-code@RJctUpvlUJGAdwBNtDSXw.md +++ b/src/data/roadmaps/cyber-security/content/understand-the-concept-of-infrastructure-as-code@RJctUpvlUJGAdwBNtDSXw.md @@ -1,7 +1,10 @@ -# Understand the concept of infrastructure as code +# Understand the concept of Infrastructure as Code Infrastructure as Code (IaC) is a practice of managing and provisioning computing infrastructure through machine-readable definition files, rather than physical hardware configuration or interactive configuration tools. It treats infrastructure configuration as software, allowing it to be version-controlled, tested, and automatically deployed. IaC enables consistent, repeatable environment setups, reduces manual errors, facilitates rapid scaling and disaster recovery, and improves collaboration between development and operations teams. Popular IaC tools include Terraform, AWS CloudFormation, and Ansible, which use declarative or imperative approaches to define infrastructure states. This approach is fundamental to DevOps practices, cloud computing, and the efficient management of complex, dynamic IT environments. Learn more from the following resources: -- [@roadmap@Terraform Roadmap](https://roadmap.sh/terraform) +- [@roadmap@Visit Dedicated Terraform Roadmap](https://roadmap.sh/terraform) +- [@roadmap@Visit Dedicated AWS Roadmap](https://roadmap.sh/aws) +- [@article@What is Infrastructure as Code? - IaC Explained - AWS](https://aws.amazon.com/what-is/iac/) +- [@article@What is infrastructure as code (IaC)? - Azure DevOps](https://learn.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code) diff --git a/src/data/roadmaps/cyber-security/content/understand-the-concept-of-security-in-the-cloud@ThLsXkqLw--uddHz0spCH.md b/src/data/roadmaps/cyber-security/content/understand-the-concept-of-security-in-the-cloud@ThLsXkqLw--uddHz0spCH.md index eb18ca0b3..0c76f9aad 100644 --- a/src/data/roadmaps/cyber-security/content/understand-the-concept-of-security-in-the-cloud@ThLsXkqLw--uddHz0spCH.md +++ b/src/data/roadmaps/cyber-security/content/understand-the-concept-of-security-in-the-cloud@ThLsXkqLw--uddHz0spCH.md @@ -4,5 +4,6 @@ Cloud security encompasses the measures, controls, policies, and technologies im Learn more from the following resources: -- [@article@What is cloud security](https://www.checkpoint.com/cyber-hub/cloud-security/what-is-cloud-security/) +- [@article@What Is Cloud Security? - Google Cloud](https://cloud.google.com/learn/what-is-cloud-security) +- [@article@Cloud Security](https://www.checkpoint.com/cyber-hub/cloud-security/what-is-cloud-security/) - [@video@What is cloud security](https://www.youtube.com/watch?v=jI8IKpjiCSM) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/understand-the-concept-of-serverless@-83ltMEl3le3yD68OFnTM.md b/src/data/roadmaps/cyber-security/content/understand-the-concept-of-serverless@-83ltMEl3le3yD68OFnTM.md index 1e47c2a9f..169d29f7c 100644 --- a/src/data/roadmaps/cyber-security/content/understand-the-concept-of-serverless@-83ltMEl3le3yD68OFnTM.md +++ b/src/data/roadmaps/cyber-security/content/understand-the-concept-of-serverless@-83ltMEl3le3yD68OFnTM.md @@ -4,5 +4,5 @@ Serverless computing is a cloud execution model where the cloud provider dynamic Learn more from the following resources: -- [@article@What is serverless computing?](https://www.cloudflare.com/en-gb/learning/serverless/what-is-serverless/) +- [@article@What is Serverless Computing?](https://www.cloudflare.com/en-gb/learning/serverless/what-is-serverless/) - [@video@What is serverless?](https://www.youtube.com/watch?v=vxJobGtqKVM) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/virtualbox@vGVFhZXYOZOy4qFpLLbxp.md b/src/data/roadmaps/cyber-security/content/virtualbox@vGVFhZXYOZOy4qFpLLbxp.md index f34dd03d9..84d7774f8 100644 --- a/src/data/roadmaps/cyber-security/content/virtualbox@vGVFhZXYOZOy4qFpLLbxp.md +++ b/src/data/roadmaps/cyber-security/content/virtualbox@vGVFhZXYOZOy4qFpLLbxp.md @@ -4,5 +4,6 @@ VirtualBox is a free, open-source virtualization software developed by Oracle. I Learn more from the following resources: -- [@official@VirtualBox Website](https://www.virtualbox.org/) +- [@official@VirtualBox](https://www.virtualbox.org/) +- [@official@VirtualBox Documentation](https://www.virtualbox.org/wiki/Documentation) - [@video@How to use VirtualBox](https://www.youtube.com/watch?v=nvdnQX9UkMY) diff --git a/src/data/roadmaps/cyber-security/content/virustotal@rxzcAzHjzIc9lkWSw0fef.md b/src/data/roadmaps/cyber-security/content/virustotal@rxzcAzHjzIc9lkWSw0fef.md index c1443719c..852525a76 100644 --- a/src/data/roadmaps/cyber-security/content/virustotal@rxzcAzHjzIc9lkWSw0fef.md +++ b/src/data/roadmaps/cyber-security/content/virustotal@rxzcAzHjzIc9lkWSw0fef.md @@ -4,7 +4,7 @@ VirusTotal's main feature is multi-scanning using over 70 antivirus scanners to Visit the following resources to learn more: -- [@official@VirusTotal's Docs on how VirusTotal Works](https://docs.virustotal.com/docs/how-it-works) -- [@official@VirusTotal's website](https://www.virustotal.com) +- [@official@VirusTotal](https://www.virustotal.com) +- [@official@How VirusTotal Works](https://docs.virustotal.com/docs/how-it-works) - [@article@@CISA's definition of VirusTotal](https://www.cisa.gov/resources-tools/services/virustotal) - [@video@Walkthrough VirusTotal Intelligence Interface](https://www.youtube.com/watch?v=WoHVM8pCfsQ) diff --git a/src/data/roadmaps/cyber-security/content/vmware@AjywuCZdBi9atGUbetlUL.md b/src/data/roadmaps/cyber-security/content/vmware@AjywuCZdBi9atGUbetlUL.md index 00aa272ee..1b3065954 100644 --- a/src/data/roadmaps/cyber-security/content/vmware@AjywuCZdBi9atGUbetlUL.md +++ b/src/data/roadmaps/cyber-security/content/vmware@AjywuCZdBi9atGUbetlUL.md @@ -4,5 +4,5 @@ VMware is a leading provider of virtualization and cloud computing software. Its Learn more from the following resources: -- [@official@VMWare Website](https://www.vmware.com/) +- [@official@VMWare](https://www.vmware.com/) - [@video@What is VMWare](https://www.youtube.com/watch?v=zPNCp9AV-vA) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/vulnhub@W94wY_otBuvVW_-EFlKA6.md b/src/data/roadmaps/cyber-security/content/vulnhub@W94wY_otBuvVW_-EFlKA6.md index 3814cd716..eb6e1e640 100644 --- a/src/data/roadmaps/cyber-security/content/vulnhub@W94wY_otBuvVW_-EFlKA6.md +++ b/src/data/roadmaps/cyber-security/content/vulnhub@W94wY_otBuvVW_-EFlKA6.md @@ -4,5 +4,5 @@ VulnHub is an online platform that provides a collection of intentionally vulner Learn more from the following resources: -- [@official@Vulnhub Website](https://www.vulnhub.com/) +- [@official@Vulnhub](https://www.vulnhub.com/) - [@article@A Beginners Guide to Vulnhub](https://medium.com/@gavinloughridge/a-beginners-guide-to-vulnhub-part-1-52b06466635d) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/watering-hole-attack@dcvuKHq0nHgHLcLwtl4IJ.md b/src/data/roadmaps/cyber-security/content/watering-hole-attack@dcvuKHq0nHgHLcLwtl4IJ.md index 746a5cd5e..58dcd6ab2 100644 --- a/src/data/roadmaps/cyber-security/content/watering-hole-attack@dcvuKHq0nHgHLcLwtl4IJ.md +++ b/src/data/roadmaps/cyber-security/content/watering-hole-attack@dcvuKHq0nHgHLcLwtl4IJ.md @@ -4,5 +4,5 @@ Watering Hole Attack is a type of cyberattack where the attacker targets a speci Visit the following resources to learn more: -- [@article@What is a watering hole attack?](https://www.techtarget.com/searchsecurity/definition/watering-hole-attack) +- [@article@What is a Watering Hole Attack?](https://www.techtarget.com/searchsecurity/definition/watering-hole-attack) - [@video@Watering Hole Attacks](https://www.youtube.com/watch?v=uBoVWqkfZjk) diff --git a/src/data/roadmaps/cyber-security/content/windows@BNUKEQ4YpZmIhSPQdkHgU.md b/src/data/roadmaps/cyber-security/content/windows@BNUKEQ4YpZmIhSPQdkHgU.md index 0ff19f78d..f913e4c3b 100644 --- a/src/data/roadmaps/cyber-security/content/windows@BNUKEQ4YpZmIhSPQdkHgU.md +++ b/src/data/roadmaps/cyber-security/content/windows@BNUKEQ4YpZmIhSPQdkHgU.md @@ -4,6 +4,6 @@ Windows is Microsoft's widely-used operating system for personal computers and s Learn more from the following resources: -- [@article@Windows Security](https://learn.microsoft.com/en-us/windows/security/) -- [@youtube@Windows 11 Full Tutorial - A 2 Hour Course to Learn and Master Windows 11](https://www.youtube.com/watch?v=UKn-r3X2CLk) +- [@official@Windows Security](https://learn.microsoft.com/en-us/windows/security/) +- [@video@Windows 11 Full Tutorial - A 2 Hour Course to Learn and Master Windows 11](https://www.youtube.com/watch?v=UKn-r3X2CLk) - [@feed@Explore top posts about Windows](https://app.daily.dev/tags/windows?ref=roadmapsh) diff --git a/src/data/roadmaps/cyber-security/content/winhex@gNan93Mg9Ym2AF3Q2gqoi.md b/src/data/roadmaps/cyber-security/content/winhex@gNan93Mg9Ym2AF3Q2gqoi.md index e9e019a51..a3c638324 100644 --- a/src/data/roadmaps/cyber-security/content/winhex@gNan93Mg9Ym2AF3Q2gqoi.md +++ b/src/data/roadmaps/cyber-security/content/winhex@gNan93Mg9Ym2AF3Q2gqoi.md @@ -4,5 +4,5 @@ WinHex is a universal hexadecimal editor and disk editor primarily used for comp Learn more from the following resources: -- [@official@WinHex Website](https://x-ways.net/winhex/) +- [@official@WinHex](https://x-ways.net/winhex/) - [@article@What is WinHex?](https://www.lenovo.com/in/en/glossary/winhex/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/wireshark@Sm9bxKUElINHND8FdZ5f2.md b/src/data/roadmaps/cyber-security/content/wireshark@Sm9bxKUElINHND8FdZ5f2.md index 96e0ead74..9d3ff8ce9 100644 --- a/src/data/roadmaps/cyber-security/content/wireshark@Sm9bxKUElINHND8FdZ5f2.md +++ b/src/data/roadmaps/cyber-security/content/wireshark@Sm9bxKUElINHND8FdZ5f2.md @@ -1,9 +1,9 @@ -# wireshark +# Wireshark Wireshark is a powerful, open-source network protocol analyzer used for real-time packet capture and analysis. It allows users to examine network traffic at a microscopic level, capturing and interactively browsing the traffic running on a computer network. Wireshark can decode a wide variety of network protocols, making it an essential tool for network troubleshooting, security analysis, software and protocol development, and education. It provides a user-friendly graphical interface and offers features like deep inspection of hundreds of protocols, live capture and offline analysis, and the ability to read/write many different capture file formats. Wireshark is widely used by IT professionals, security experts, and developers for diagnosing network issues and understanding network communication. Learn more from the following resources: -- [@official@Wireshark Website](https://www.wireshark.org/) +- [@official@Wireshark](https://www.wireshark.org/) - [@article@How to Use Wireshark: Comprehensive Tutorial + Tips](https://www.varonis.com/blog/how-to-use-wireshark) - [@video@How to use Wireshark](https://www.youtube.com/watch?v=zWoHJ3oGRGY) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/wlan@QCVYF1rmPsMVtklBNDNaB.md b/src/data/roadmaps/cyber-security/content/wlan@QCVYF1rmPsMVtklBNDNaB.md index c0c60baf1..015e66129 100644 --- a/src/data/roadmaps/cyber-security/content/wlan@QCVYF1rmPsMVtklBNDNaB.md +++ b/src/data/roadmaps/cyber-security/content/wlan@QCVYF1rmPsMVtklBNDNaB.md @@ -7,4 +7,3 @@ Visit the following resources to learn more: - [@article@What Is a Wireless LAN?](https://www.cisco.com/c/en/us/products/wireless/wireless-lan.html) - [@video@Wireless Networking Explained | Cisco CCNA 200-301](https://www.youtube.com/watch?v=Uz-RTurph3c) - [@video@Wireless Technologies](https://www.youtube.com/watch?v=_VwpcLiBkAQ) - From be1b041acb9deaf3b21325f3974ca480a3d0ad33 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Apr 2025 14:11:20 +0600 Subject: [PATCH 06/31] chore: update roadmap content json (#8540) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/ai-red-teaming.json | 128 +++---- public/roadmap-content/cyber-security.json | 385 +++++++++++++++------ public/roadmap-content/react.json | 35 -- 3 files changed, 343 insertions(+), 205 deletions(-) diff --git a/public/roadmap-content/ai-red-teaming.json b/public/roadmap-content/ai-red-teaming.json index 82c494bf9..ad730b55c 100644 --- a/public/roadmap-content/ai-red-teaming.json +++ b/public/roadmap-content/ai-red-teaming.json @@ -1,322 +1,322 @@ { "R9DQNc0AyAQ2HLpP4HOk6": { "title": "AI Security Fundamentals", - "description": "", + "description": "This covers the foundational concepts essential for AI Red Teaming, bridging traditional cybersecurity with AI-specific threats. An AI Red Teamer must understand common vulnerabilities in ML models (like evasion or poisoning), security risks in the AI lifecycle (from data collection to deployment), and how AI capabilities can be misused. This knowledge forms the basis for designing effective tests against AI systems.\n\nLearn more from the following resources:\n\n* [@article@Building Trustworthy AI: Contending with Data Poisoning - Nisos](https://nisos.com/research/building-trustworthy-ai/) - Explores data poisoning threats in AI/ML.\n* [@article@What Is Adversarial AI in Machine Learning? - Palo Alto Networks](https://www.paloaltonetworks.co.uk/cyberpedia/what-are-adversarial-attacks-on-AI-Machine-Learning) - Overview of adversarial attacks targeting AI/ML systems.\n* [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Foundational course covering AI risks, governance, security, and privacy.", "links": [] }, "fNTb9y3zs1HPYclAmu_Wv": { "title": "Why Red Team AI Systems?", - "description": "", + "description": "AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment.\n\nLearn more from the following resources:\n\n@article@What's the Difference Between Traditional Red-Teaming and AI Red-Teaming? - Cranium AI - Compares objectives, techniques, expertise, and attack vectors to highlight why AI needs specialized red teaming. @article@What is AI Red Teaming? The Complete Guide - Mindgard - Details specific use cases like identifying bias, ensuring resilience against AI-specific attacks, testing data privacy, and aligning with regulations. @article@The Expanding Role of Red Teaming in Defending AI Systems - Protect AI - Explains why the dynamic, adaptive, and often opaque nature of AI necessitates red teaming beyond traditional approaches. @article@How red teaming helps safeguard the infrastructure behind AI models - IBM - Focuses on unique AI risks like model IP theft, open-source vulnerabilities, and excessive agency that red teaming addresses.", "links": [] }, "HFJIYcI16OMyM77fAw9af": { "title": "Introduction", - "description": "", + "description": "AI Red Teaming is the practice of simulating adversarial attacks against AI systems to proactively identify vulnerabilities, potential misuse scenarios, and failure modes before malicious actors do. Distinct from traditional cybersecurity red teaming, it focuses on the unique attack surfaces of AI models, such as prompt manipulation, data poisoning, model extraction, and evasion techniques. The primary goal for an AI Red Teamer is to test the robustness, safety, alignment, and fairness of AI systems, particularly complex ones like LLMs, by adopting an attacker's mindset to uncover hidden flaws and provide actionable feedback for improvement.\n\nLearn more from the following resources:\n\n* [@article@A Guide to AI Red Teaming - HiddenLayer](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) - Discusses AI red teaming concepts and contrasts with traditional methods.\n* [@article@What is AI Red Teaming? (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Overview of AI red teaming, its history, and key challenges.\n* [@article@What is AI Red Teaming? The Complete Guide - Mindgard](https://mindgard.ai/blog/what-is-ai-red-teaming) - Guide covering AI red teaming processes, use cases, and benefits.\n* [@podcast@Red Team Podcast | AI Red Teaming Insights & Defense Strategies - Mindgard](https://mindgard.ai/podcast/red-team) - Podcast series covering AI red teaming trends and strategies.", "links": [] }, "1gyuEV519LjN-KpROoVwv": { "title": "Ethical Considerations", - "description": "", + "description": "Ethical conduct is crucial for AI Red Teamers. While simulating attacks, they must operate within strict legal and ethical boundaries defined by rules of engagement, focusing on improving safety without causing real harm or enabling misuse. This includes respecting data privacy, obtaining consent where necessary, responsibly disclosing vulnerabilities, and carefully considering the potential negative impacts of both the testing process and the AI capabilities being tested. The goal is discovery for defense, not exploitation.\n\nLearn more from the following resources:\n\n* [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions balancing attack simulation with ethical constraints.\n* [@article@Responsible AI assessment - Responsible AI | Coursera](https://www.coursera.org/learn/ai-security) (Module within AI Security course)\n* [@guide@Responsible AI Principles (Microsoft)](https://www.microsoft.com/en-us/ai/responsible-ai) - Example of corporate responsible AI guidelines influencing ethical testing.\n* [@video@Questions to Guide AI Red-Teaming (CMU SEI)](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382) - Key questions and ethical guidelines for AI red teaming activities (video talk).", "links": [] }, "Irkc9DgBfqSn72WaJqXEt": { "title": "Role of Red Teams", - "description": "", + "description": "The role of an AI Red Team is to rigorously challenge AI systems from an adversarial perspective. They design and execute tests to uncover vulnerabilities related to the model's logic, data dependencies, prompt interfaces, safety alignments, and interactions with surrounding infrastructure. They provide detailed reports on findings, potential impacts, and remediation advice, acting as a critical feedback loop for AI developers and stakeholders to improve system security and trustworthiness before and after deployment.\n\nLearn more from the following resources:\n\n* [@article@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Discusses the purpose and process of red teaming.\n* [@article@The Complete Red Teaming Checklist \\[PDF\\]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Outlines typical red team roles and responsibilities.\n* [@article@What is AI Red Teaming? - Learn Prompting](https://learnprompting.org/docs/category/ai-red-teaming) - Defines the role and activities.", "links": [] }, "NvOJIv36Utpm7_kOZyr79": { "title": "Supervised Learning", - "description": "", + "description": "AI Red Teamers analyze systems built using supervised learning to probe for vulnerabilities like susceptibility to adversarial examples designed to cause misclassification, sensitivity to data distribution shifts, or potential for data leakage related to the labeled training data. Understanding how these models learn input-output mappings is key to devising tests that challenge their learned boundaries.\n\nLearn more from the following resources:\n\n* [@article@AI and cybersecurity: a love-hate revolution - Alter Solutions](https://www.alter-solutions.com/en-us/articles/ai-cybersecurity-love-hate-revolution) - Discusses supervised learning use in vulnerability scanning and potential exploits.\n* [@article@What Is Supervised Learning? | IBM](https://www.ibm.com/think/topics/supervised-learning) - Foundational explanation.\n* [@article@What is Supervised Learning? | Google Cloud](https://cloud.google.com/discover/what-is-supervised-learning) - Foundational explanation.", "links": [] }, "ZC0yKsu-CJC-LZKKo2pLD": { "title": "Unsupervised Learning", - "description": "", + "description": "When red teaming AI systems using unsupervised learning (e.g., clustering algorithms), focus areas include assessing whether the discovered patterns reveal sensitive information, if the model can be manipulated to group data incorrectly, or if dimensionality reduction techniques obscure security-relevant features. Understanding these models helps identify risks associated with pattern discovery on unlabeled data.\n\nLearn more from the following resources:\n\n* [@article@How Unsupervised Learning Works with Examples - Coursera](https://www.coursera.org/articles/unsupervised-learning) - Foundational explanation with examples.\n* [@article@Supervised vs. Unsupervised Learning: Which Approach is Best? - DigitalOcean](https://www.digitalocean.com/resources/articles/supervised-vs-unsupervised-learning) - Contrasts learning types, relevant for understanding different attack surfaces.", "links": [] }, "Xqzc4mOKsVzwaUxLGjHya": { "title": "Reinforcement Learning", - "description": "", + "description": "Red teaming RL-based AI systems involves testing for vulnerabilities such as reward hacking (exploiting the reward function to induce unintended behavior), unsafe exploration (agent takes harmful actions during learning), or susceptibility to adversarial perturbations in the environment's state. Understanding the agent's policy and value functions is crucial for designing effective tests against RL agents.\n\nLearn more from the following resources:\n\n* [@article@Best Resources to Learn Reinforcement Learning - Towards Data Science](https://towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2/) - Curated list of RL learning resources.\n* [@article@What is reinforcement learning? - Blog - York Online Masters degrees](https://online.york.ac.uk/resources/what-is-reinforcement-learning/) - Foundational explanation.\n* [@course@Deep Reinforcement Learning Course by HuggingFace](https://huggingface.co/learn/deep-rl-course/unit0/introduction) - Comprehensive free course on Deep RL.\n* [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for red teaming and generating attacks.", "links": [] }, "RuKzVhd1nZphCrlW1wZGL": { "title": "Neural Networks", - "description": "", + "description": "Understanding neural network architectures (layers, nodes, activation functions) is vital for AI Red Teamers. This knowledge allows for targeted testing, such as crafting adversarial examples that exploit specific activation functions or identifying potential vulnerabilities related to network depth or connectivity. It provides insight into the 'black box' for more effective white/grey-box testing.\n\nLearn more from the following resources:\n\n* [@guide@Neural Networks Explained: A Beginner's Guide - SkillCamper](https://www.skillcamper.com/blog/neural-networks-explained-a-beginners-guide) - Foundational guide.\n* [@guide@Neural networks | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/crash-course/neural-networks) - Google's explanation within their ML crash course.\n* [@paper@Red Teaming with Artificial Intelligence-Driven Cyberattacks: A Scoping Review - arXiv](https://arxiv.org/html/2503.19626) - Review discussing AI methods like neural networks used in red teaming simulations.", "links": [] }, "3XJ-g0KvHP75U18mxCqgw": { "title": "Generative Models", - "description": "", + "description": "AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to their widespread use and unique risks. Understanding how they generate content is key to testing for issues like generating harmful/biased outputs, deepfakes, prompt injection vulnerabilities, or leaking sensitive information from their vast training data.\n\nLearn more from the following resources:\n\n* [@article@An Introduction to Generative Models | MongoDB](https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models) - Explains basics and contrasts with discriminative models.\n* [@course@Generative AI for Beginners - Microsoft Open Source](https://microsoft.github.io/generative-ai-for-beginners/) - Free course covering fundamentals.\n* [@guide@Generative AI beginner's guide | Generative AI on Vertex AI - Google Cloud](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview) - Overview covering generative AI concepts and Google's platform context.", "links": [] }, "8K-wCn2cLc7Vs_V4sC3sE": { "title": "Large Language Models", - "description": "", + "description": "LLMs are a primary target for AI Red Teaming. Understanding their architecture (often Transformer-based), training processes (pre-training, fine-tuning), and capabilities (text generation, summarization, Q&A) is essential for identifying vulnerabilities like prompt injection, jailbreaking, data regurgitation, and emergent harmful behaviors specific to these large-scale models.\n\nLearn more from the following resources:\n\n* [@article@What is an LLM (large language model)? - Cloudflare](https://www.cloudflare.com/learning/ai/what-is-large-language-model/) - Concise explanation from Cloudflare.\n* [@guide@Introduction to Large Language Models - Learn Prompting](https://learnprompting.org/docs/intro_to_llms) - Learn Prompting's introduction.\n* [@guide@What Are Large Language Models? A Beginner's Guide for 2025 - KDnuggets](https://www.kdnuggets.com/large-language-models-beginners-guide-2025) - Overview of LLMs, how they work, strengths, and limitations.", "links": [] }, "gx4KaFqKgJX9n9_ZGMqlZ": { "title": "Prompt Engineering", - "description": "", + "description": "For AI Red Teamers, prompt engineering is both a tool and a target. It's a tool for crafting inputs to test model boundaries and vulnerabilities (e.g., creating jailbreak prompts). It's a target because understanding how prompts influence LLMs is key to identifying prompt injection vulnerabilities and designing defenses. Mastering prompt design is fundamental to effective LLM red teaming.\n\nLearn more from the following resources:\n\n* [@article@Introduction to Prompt Engineering - Datacamp](https://www.datacamp.com/tutorial/introduction-prompt-engineering) - Tutorial covering basics.\n* [@article@System Prompts - InjectPrompt](https://www.injectprompt.com/t/system-prompts) - Look at the system prompts of flagship LLMs.\n* [@course@Introduction to Prompt Engineering - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-engineering) - Foundational course from Learn Prompting.\n* [@guide@Prompt Engineering Guide - Learn Prompting](https://learnprompting.org/docs/prompt-engineering) - Comprehensive guide from Learn Prompting.\n* [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Connects prompt engineering directly to LLM red teaming concepts.", "links": [] }, "WZkIHZkV2qDYbYF9KBBRi": { "title": "Confidentiality, Integrity, Availability", - "description": "", + "description": "The CIA Triad is directly applicable in AI Red Teaming. Confidentiality tests focus on preventing leakage of training data or proprietary model details. Integrity tests probe for susceptibility to data poisoning or model manipulation. Availability tests assess resilience against denial-of-service attacks targeting the AI model or its supporting infrastructure.\n\nLearn more from the following resources:\n\n* [@article@Confidentiality, Integrity, Availability: Key Examples - DataSunrise](https://www.datasunrise.com/knowledge-center/confidentiality-integrity-availability-examples/) - Explains CIA triad with examples, mentioning AI/ML relevance.\n* [@article@The CIA Triad: Confidentiality, Integrity, Availability - Veeam](https://www.veeam.com/blog/cybersecurity-cia-triad-explained.html) - Breakdown of the three principles and how they apply.\n* [@article@What's The CIA Triad? Confidentiality, Integrity, & Availability, Explained | Splunk](https://www.splunk.com/en_us/blog/learn/cia-triad-confidentiality-integrity-availability.html) - Detailed explanation of the triad, mentioning modern updates and AI context.", "links": [] }, "RDOaTBWP3aIJPUp_kcafm": { "title": "Threat Modeling", - "description": "", + "description": "AI Red Teams apply threat modeling to identify unique attack surfaces in AI systems, such as manipulating training data, exploiting prompt interfaces, attacking the model inference process, or compromising connected tools/APIs. Before attacking an AI system, red teamers perform threat modeling to map out possible adversaries (from curious users to state actors) and attack vectors, prioritizing tests based on likely impact and adversary capability.\n\nLearn more from the following resources:\n\n* [@article@Core Components of AI Red Team Exercises (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Describes threat modeling as the first phase of an AI red team engagement.\n* [@guide@Threat Modeling Process | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling_Process) - More detailed process steps.\n* [@guide@Threat Modeling | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling) - General threat modeling process applicable to AI context.\n* [@video@How Microsoft Approaches AI Red Teaming (MS Build)](https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/) - Video on Microsoft’s AI red team process, including threat modeling specific to AI.", "links": [] }, "MupRvk_8Io2Hn7yEvU663": { "title": "Risk Management", - "description": "", + "description": "AI Red Teamers contribute to the AI risk management process by identifying and demonstrating concrete vulnerabilities. Findings from red team exercises inform risk assessments, helping organizations understand the likelihood and potential impact of specific AI threats and prioritize resources for mitigation based on demonstrated exploitability.\n\nLearn more from the following resources:\n\n* [@framework@NIST AI Risk Management Framework](https://www.nist.gov/itl/ai-risk-management-framework) - Key framework for managing AI-specific risks.\n* [@guide@A Beginner's Guide to Cybersecurity Risks and Vulnerabilities - Champlain College Online](https://online.champlain.edu/blog/beginners-guide-cybersecurity-risk-management) - Foundational understanding of risk.\n* [@guide@Cybersecurity Risk Management: Frameworks, Plans, and Best Practices - Hyperproof](https://hyperproof.io/resource/cybersecurity-risk-management-process/) - General guide applicable to AI system context.", "links": [] }, "887lc3tWCRH-sOHSxWgWJ": { "title": "Vulnerability Assessment", - "description": "", + "description": "While general vulnerability assessment scans infrastructure, AI Red Teaming extends this to assess vulnerabilities specific to the AI model and its unique interactions. This includes probing for prompt injection flaws, testing for adversarial example robustness, checking for data privacy leaks, and evaluating safety alignment failures – weaknesses not typically found by standard IT vulnerability scanners.\n\nLearn more from the following resources:\n\n* [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses vulnerability assessment within AI red teaming for critical systems.\n* [@guide@The Ultimate Guide to Vulnerability Assessment - Strobes Security](https://strobes.co/blog/guide-vulnerability-assessment/) - Comprehensive guide on VA process (apply concepts to AI).\n* [@guide@Vulnerability Scanning Tools | OWASP Foundation](https://owasp.org/www-community/Vulnerability_Scanning_Tools) - List of tools useful in broader system assessment around AI.", "links": [] }, "Ds8pqn4y9Npo7z6ubunvc": { "title": "Jailbreak Techniques", - "description": "", + "description": "Jailbreaking is a specific category of prompt hacking where the AI Red Teamer aims to bypass the LLM's safety and alignment training. They use techniques like creating fictional scenarios, asking the model to simulate an unrestricted AI, or using complex instructions to trick the model into generating content that violates its own policies (e.g., generating harmful code, hate speech, or illegal instructions).\n\nLearn more from the following resources:\n\n* [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) - Discusses jailbreaks for several LLMs\n* [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Covers jailbreaking strategies.\n* [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) - Research analyzing jailbreak failures.", "links": [] }, "j7uLLpt8MkZ1rqM7UBPW4": { "title": "Safety Filter Bypasses", - "description": "", + "description": "AI Red Teamers specifically target the safety mechanisms (filters, guardrails) implemented within or around an AI model. They test techniques like using synonyms for blocked words, employing different languages, embedding harmful requests within harmless text, or using character-level obfuscation to evade detection and induce the model to generate prohibited content, thereby assessing the robustness of the safety controls.\n\nLearn more from the following resources:\n\n* [@article@Bypassing AI Content Filters | Restackio](https://www.restack.io/p/ai-driven-content-moderation-answer-bypass-filters-cat-ai) - Discusses techniques for evasion.\n* [@article@How to Bypass Azure AI Content Safety Guardrails - Mindgard](https://mindgard.ai/blog/bypassing-azure-ai-content-safety-guardrails) - Case study on bypassing specific safety mechanisms.\n* [@article@The Best Methods to Bypass AI Detection: Tips and Techniques - PopAi](https://www.popai.pro/resources/the-best-methods-to-bypass-ai-detection-tips-and-techniques/) - Focuses on evasion, relevant for filter bypass testing.", "links": [] }, "XOrAPDRhBvde9R-znEipH": { "title": "Prompt Injection", - "description": "", + "description": "Prompt injection is a critical vulnerability tested by AI Red Teamers. They attempt to insert instructions into the LLM's input that override its intended system prompt or task, causing it to perform unauthorized actions, leak data, or generate malicious output. This tests the model's ability to distinguish trusted instructions from potentially harmful user/external input.\n\nLearn more from the following resources:\n\n* [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Guide covering different types of prompt attacks.\n* [@article@Prompt Injection (Learn Prompting)](https://learnprompting.org/docs/prompt_hacking/injection) - Learn Prompting article describing prompt injection with examples and mitigation strategies.\n* [@article@Prompt Injection Attack Explanation (IBM)](https://research.ibm.com/blog/prompt-injection-attacks-against-llms) - Explains what prompt injections are and how they work.\n* [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Overview of impact and defenses.\n* [@course@Advanced Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/advanced-prompt-hacking) - Covers advanced injection techniques.", "links": [] }, "1Xr7mxVekeAHzTL7G4eAZ": { "title": "Prompt Hacking", - "description": "", + "description": "Prompt hacking is a core technique for AI Red Teamers targeting LLMs. It involves crafting inputs (prompts) to manipulate the model into bypassing safety controls, revealing hidden information, or performing unintended actions. Red teamers systematically test various prompt hacking methods (like jailbreaking, role-playing, or instruction manipulation) to assess the LLM's resilience against adversarial user input.\n\nLearn more from the following resources:\n\n* [@course@Introduction to Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-hacking) - Free introductory course.\n* [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Detailed guide covering techniques.\n* [@paper@SoK: Prompt Hacking of LLMs (arXiv 2023)](https://arxiv.org/abs/2311.05544) - Comprehensive research overview of prompt hacking types and techniques.", "links": [] }, "5zHow4KZVpfhch5Aabeft": { "title": "Direct", - "description": "", + "description": "Direct injection attacks occur when malicious instructions are inserted directly into the prompt input field by the user interacting with the LLM. AI Red Teamers use this technique to assess if basic instructions like \"Ignore previous prompt\" can immediately compromise the model's safety or intended function, testing the robustness of the system prompt's influence.\n\nLearn more from the following resources:\n\n* [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Differentiates attack types.\n* [@article@Prompt Injection Cheat Sheet (FlowGPT)](https://flowgpt.com/p/prompt-injection-cheat-sheet) - Collection of prompt injection examples often used in direct attacks.\n* [@report@OpenAI GPT-4 System Card](https://openai.com/research/gpt-4-system-card) - Sections discuss how direct prompt attacks were tested during GPT-4 development.", "links": [] }, "3_gJRtJSdm2iAfkwmcv0e": { "title": "Indirect", - "description": "", + "description": "Indirect injection involves embedding malicious prompts within external data sources that the LLM processes, such as websites, documents, or emails. AI Red Teamers test this by poisoning data sources the AI might interact with (e.g., adding hidden instructions to a webpage summarized by the AI) to see if the AI executes unintended commands or leaks data when processing that source.\n\nLearn more from the following resources:\n\n* [@paper@The Practical Application of Indirect Prompt Injection Attacks - David Willis-Owen](https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry) - Discusses a standard methodology to test for indirect injection attacks.\n* [@article@How to Prevent Indirect Prompt Injection Attacks - Cobalt](https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks) - Explains indirect injection via external sources and mitigation.\n* [@article@Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)](https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection) - Examples of indirect prompt injection impacting LLM agents.", "links": [] }, "G1u_Kq4NeUsGX2qnUTuJU": { "title": "Countermeasures", - "description": "", + "description": "AI Red Teamers must also understand and test defenses against prompt hacking. This includes evaluating the effectiveness of input sanitization, output filtering, instruction demarcation (e.g., XML tagging), contextual awareness checks, model fine-tuning for resistance, and applying the principle of least privilege to LLM capabilities and tool access.\n\nLearn more from the following resources:\n\n* [@article@Mitigating Prompt Injection Attacks (NCC Group Research)](https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/) - Discusses various mitigation strategies and their effectiveness.\n* [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Includes discussion on best practices for prevention.\n* [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Covers defensive measures.\n* [@guide@OpenAI Best Practices for Prompt Security](https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions) - OpenAI’s recommendations to prevent prompt manipulation.", "links": [] }, "vhBu5x8INTtqvx6vcYAhE": { "title": "Code Injection", - "description": "", + "description": "AI Red Teamers test for code injection vulnerabilities specifically in the context of AI applications. This involves probing whether user input, potentially manipulated via prompts, can lead to the execution of unintended code (e.g., SQL, OS commands, or script execution via generated code) within the application layer or connected systems, using the AI as a potential vector.\n\nLearn more from the following resources:\n\n* [@article@Code Injection in LLM Applications - NeuralTrust](https://neuraltrust.ai/blog/code-injection-in-llms) - Specifically discusses code injection risks involving LLMs.\n* [@docs@Secure Plugin Sandboxing (OpenAI Plugins)](https://platform.openai.com/docs/plugins/production/security-requirements) - Context on preventing code injection via AI plugins.\n* [@guide@Code Injection - OWASP Foundation](https://owasp.org/www-community/attacks/Code_Injection) - Foundational knowledge on code injection attacks.", "links": [] }, "uBXrri2bXVsNiM8fIHHOv": { "title": "Model Vulnerabilities", - "description": "", + "description": "This category covers attacks and tests targeting the AI model itself, beyond the prompt interface. AI Red Teamers investigate inherent weaknesses in the model's architecture, training data artifacts, or prediction mechanisms, such as susceptibility to data extraction, poisoning, or adversarial manipulation.\n\nLearn more from the following resources:\n\n* [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses adversarial attacks, data poisoning, and prototype theft.\n* [@article@Attacking AI Models (Trail of Bits Blog Series)](https://blog.trailofbits.com/category/ai-security/) - Series discussing model-focused attacks.\n* [@report@AI and ML Vulnerabilities (CNAS Report)](https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities) - Overview of known machine learning vulnerabilities.", "links": [] }, "QFzLx5nc4rCCD8WVc20mo": { "title": "Model Weight Stealing", - "description": "", + "description": "AI Red Teamers assess the risk of attackers reconstructing or stealing the proprietary weights of a trained model, often through API query-based attacks. Testing involves simulating such attacks to understand how easily the model's functionality can be replicated, which informs defenses like query rate limiting, watermarking, or differential privacy.\n\nLearn more from the following resources:\n\n* [@article@A Playbook for Securing AI Model Weights - RAND](https://www.rand.org/pubs/research_briefs/RBA2849-1.html) - Discusses attack vectors and security levels for protecting model weights.\n* [@article@How to Steal a Machine Learning Model (SkyCryptor)](https://skycryptor.com/blog/how-to-steal-a-machine-learning-model) - Explains model weight extraction via query attacks.\n* [@paper@Defense Against Model Stealing (Microsoft Research)](https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/) - Research on detecting and defending against model stealing.\n* [@paper@On the Limitations of Model Stealing with Uncertainty Quantification Models - OpenReview](https://openreview.net/pdf?id=ONRFHoUzNk) - Research exploring model stealing techniques.", "links": [] }, "DQeOavZCoXpF3k_qRDABs": { "title": "Unauthorized Access", - "description": "", + "description": "AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow attackers to gain unauthorized access to data, functionalities, or underlying infrastructure. This includes attempting privilege escalation via prompts, exploiting insecure API endpoints connected to the AI, or manipulating the AI to access restricted system resources.\n\nLearn more from the following resources:\n\n* [@article@Unauthorized Data Access via LLMs (Security Boulevard)](https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/) - Discusses risks of LLMs accessing unauthorized data.\n* [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) - Covers API risks like broken access control relevant to AI systems.\n* [@paper@AI System Abuse Cases (Harvard Belfer Center)](https://www.belfercenter.org/publication/ai-system-abuse-cases) - Covers various ways AI systems can be abused, including access violations.", "links": [] }, "nD0_64ELEeJSN-0aZiR7i": { "title": "Data Poisoning", - "description": "", + "description": "AI Red Teamers simulate data poisoning attacks by evaluating how introducing manipulated or mislabeled data into potential training or fine-tuning datasets could compromise the model. They assess the impact on model accuracy, fairness, or the potential creation of exploitable backdoors, informing defenses around data validation and provenance.\n\nLearn more from the following resources:\n\n* [@article@AI Poisoning - Is It Really A Threat? - AIBlade](https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat) - Detailed exploration of data poisoning attacks and impacts.\n* [@article@Data Poisoning Attacks in ML (Towards Data Science)](https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f) - Overview of techniques.\n* [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) - Research on detection and prevention techniques.\n* [@paper@Poisoning Web-Scale Training Data (arXiv)](https://arxiv.org/abs/2310.12818) - Analysis of poisoning risks in large datasets used for LLMs.", "links": [] }, "xjlttOti-_laPRn8a2fVy": { "title": "Adversarial Examples", - "description": "", + "description": "A core AI Red Teaming activity involves generating adversarial examples – inputs slightly perturbed to cause misclassification or bypass safety filters – to test model robustness. Red teamers use various techniques (gradient-based, optimization-based, or black-box methods) to find inputs that exploit model weaknesses, informing developers on how to harden the model.\n\nLearn more from the following resources:\n\n* [@article@Adversarial Examples Explained (OpenAI Blog)](https://openai.com/research/adversarial-examples) - Introduction by OpenAI.\n* [@guide@Adversarial Examples – Interpretable Machine Learning Book](https://christophm.github.io/interpretable-ml-book/adversarial.html) - In-depth explanation and examples.\n* [@guide@Adversarial Testing for Generative AI | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Google's guide on adversarial testing workflows.\n* [@video@How AI Can Be Tricked With Adversarial Attacks - Two Minute Papers](https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w) - Short video demonstrating adversarial examples.", "links": [] }, "iE5PcswBHnu_EBFIacib0": { "title": "Model Inversion", - "description": "", + "description": "AI Red Teamers perform model inversion tests to assess if an attacker can reconstruct sensitive training data (like images, text snippets, or personal attributes) by repeatedly querying the model and analyzing its outputs. Success indicates privacy risks due to data memorization, requiring mitigation techniques like differential privacy or output filtering.\n\nLearn more from the following resources:\n\n* [@article@Model Inversion Attacks for ML (Medium)](https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1) - Explanation with examples (e.g., face reconstruction).\n* [@article@Model inversion and membership inference: Understanding new AI security risks - Hogan Lovells](https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities) - Discusses risks and mitigation.\n* [@paper@Extracting Training Data from LLMs (arXiv)](https://arxiv.org/abs/2012.07805) - Research demonstrating feasibility on LLMs.\n* [@paper@Model Inversion Attacks: A Survey of Approaches and Countermeasures - arXiv](https://arxiv.org/html/2411.10023v1) - Comprehensive survey of model inversion attacks and defenses.", "links": [] }, "2Y0ZO-etpv3XIvunDLu-W": { "title": "Adversarial Training", - "description": "", + "description": "AI Red Teamers evaluate the effectiveness of adversarial training as a defense. They test if models trained on adversarial examples are truly robust or if new, unseen adversarial attacks can still bypass the hardened defenses. This helps refine the adversarial training process itself.\n\nLearn more from the following resources:\n\n* [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) (Discusses adversarial robustness)\n* [@guide@Adversarial Testing for Generative AI | Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Covers the concept as part of testing.\n* [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) (Mentions adversarial training as defense)", "links": [] }, "6gEHMhh6BGJI-ZYN27YPW": { "title": "Robust Model Design", - "description": "", + "description": "AI Red Teamers assess whether choices made during model design (architecture selection, regularization techniques, ensemble methods) effectively contribute to robustness against anticipated attacks. They test if these design choices actually prevent common failure modes identified during threat modeling.\n\nLearn more from the following resources:\n\n* [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) - Discusses strategies for building robust models.\n* [@article@Understanding Robustness in Machine Learning - Alooba](https://www.alooba.com/skills/concepts/machine-learning/robustness/) - Explains the concept of ML robustness.\n* [@paper@Towards Evaluating the Robustness of Neural Networks (arXiv by Goodfellow et al.)](https://arxiv.org/abs/1608.04644) - Foundational paper on evaluating robustness.", "links": [] }, "7Km0mFpHguHYPs5UhHTsM": { "title": "Continuous Monitoring", - "description": "", + "description": "AI Red Teamers assess the effectiveness of continuous monitoring systems by attempting attacks and observing if detection mechanisms trigger appropriate alerts and responses. They test if monitoring covers AI-specific anomalies (like sudden shifts in output toxicity or unexpected resource consumption by the model) in addition to standard infrastructure monitoring.\n\nLearn more from the following resources:\n\n* [@article@Cyber Security Monitoring: 5 Key Components - BitSight Technologies](https://www.bitsight.com/blog/5-things-to-consider-building-continuous-security-monitoring-strategy) - Discusses key components of a monitoring strategy.\n* [@article@Cyber Security Monitoring: Definition and Best Practices - SentinelOne](https://www.sentinelone.com/cybersecurity-101/cybersecurity/cyber-security-monitoring/) - Overview of monitoring types and techniques.\n* [@article@Cybersecurity Monitoring: Definition, Tools & Best Practices - NordLayer](https://nordlayer.com/blog/cybersecurity-monitoring/) - General best practices adaptable to AI context.", "links": [] }, "aKzai0A8J55-OBXTnQih1": { "title": "Insecure Deserialization", - "description": "", + "description": "AI Red Teamers investigate if serialized objects used by the AI system (e.g., for saving model states, configurations, or transmitting data) can be manipulated by an attacker. They test if crafting malicious serialized objects could lead to remote code execution or other exploits when the application deserializes the untrusted data.\n\nLearn more from the following resources:\n\n* [@article@Lightboard Lessons: OWASP Top 10 - Insecure Deserialization - DevCentral](https://community.f5.com/kb/technicalarticles/lightboard-lessons-owasp-top-10---insecure-deserialization/281509) - Video explanation.\n* [@article@How Hugging Face Was Ethically Hacked](https://www.aiblade.net/p/how-hugging-face-was-ethically-hacked) - Hugging Face deserialization case study.\n* [@article@OWASP TOP 10: Insecure Deserialization - Detectify Blog](https://blog.detectify.com/best-practices/owasp-top-10-insecure-deserialization/) - Overview within OWASP Top 10 context.\n* [@guide@Insecure Deserialization - OWASP Foundation](https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization) - Core explanation of the vulnerability.", "links": [] }, "kgDsDlBk8W2aM6LyWpFY8": { "title": "Remote Code Execution", - "description": "", + "description": "AI Red Teamers attempt to achieve RCE on systems hosting or interacting with AI models. This could involve exploiting vulnerabilities in the AI framework itself, the web server, connected APIs, or tricking an AI agent with code execution capabilities into running malicious commands provided via prompts. RCE is often the ultimate goal of exploiting other vulnerabilities like code injection or insecure deserialization.\n\nLearn more from the following resources:\n\n* [@article@Exploiting LLMs with Code Execution (GitHub Gist)](https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516) - Example of achieving code execution via LLM manipulation.\n* [@article@What is remote code execution? - Cloudflare](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) - Definition and explanation of RCE.\n* [@video@DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU) - Demonstrates RCE risks with LLM agents.", "links": [] }, "nhUKKWyBH80nyKfGT8ErC": { "title": "Infrastructure Security", - "description": "", + "description": "AI Red Teamers assess the security posture of the infrastructure hosting AI models (cloud environments, servers, containers). They look for misconfigurations, unpatched systems, insecure network setups, or inadequate access controls that could allow compromise of the AI system or leakage of sensitive data/models.\n\nLearn more from the following resources:\n\n* [@article@AI Infrastructure Attacks (VentureBeat)](https://venturebeat.com/ai/understanding-ai-infrastructure-attacks/) - Discussion of attacks targeting AI infrastructure.\n* [@guide@Network Infrastructure Security - Best Practices and Strategies - DataGuard](https://www.dataguard.com/blog/network-infrastructure-security-best-practices-and-strategies/) - General infra security practices applicable here.\n* [@guide@Secure Deployment of ML Systems (NIST)](https://csrc.nist.gov/publications/detail/sp/800-218/final) - Guidelines including infrastructure security for ML.", "links": [] }, "Tszl26iNBnQBdBEWOueDA": { "title": "API Protection", - "description": "", + "description": "AI Red Teamers rigorously test the security of APIs providing access to AI models. They probe for OWASP API Top 10 vulnerabilities like broken authentication/authorization, injection flaws, security misconfigurations, and lack of rate limiting, specifically evaluating how these could lead to misuse or compromise of the AI model itself.\n\nLearn more from the following resources:\n\n* [@article@API Protection for AI Factories: The First Step to AI Security - F5](https://www.f5.com/company/blog/api-security-for-ai-factories) - Discusses the criticality of API security for AI applications.\n* [@article@Securing APIs with AI for Advanced Threat Protection | Adeva](https://adevait.com/artificial-intelligence/securing-apis-with-ai) - Discusses using AI for API security, implies testing these is needed.\n* [@article@Securing Machine Learning APIs (IBM)](https://developer.ibm.com/articles/se-securing-machine-learning-apis/) - Best practices for protecting ML APIs.\n* [@guide@OWASP API Security Project (Top 10 2023)](https://owasp.org/www-project-api-security/) - Essential checklist for API vulnerabilities.", "links": [] }, "J7gjlt2MBx7lOkOnfGvPF": { "title": "Authentication", - "description": "", + "description": "AI Red Teamers test the authentication mechanisms controlling access to AI systems and APIs. They attempt to bypass logins, steal or replay API keys/tokens, exploit weak password policies, or find flaws in MFA implementations to gain unauthorized access to the AI model or its management interfaces.\n\nLearn more from the following resources:\n\n* [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions testing authentication mechanisms in AI red teaming.\n* [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation.\n* [@video@How JWTs are used for Authentication (and how to bypass it) - LiveOverflow](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME) - Covers common web authentication bypass techniques relevant to APIs.", "links": [] }, "JQ3bR8odXJfd-1RCEf3-Q": { "title": "Authentication", - "description": "", + "description": "AI Red Teamers test authorization controls to ensure that authenticated users can only access the AI features and data permitted by their roles/permissions. They attempt privilege escalation, try to access other users' data via the AI, or manipulate the AI to perform actions beyond its authorized scope.\n\nLearn more from the following resources:\n\n* [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation.\n* [@guide@Identity and access management (IAM) fundamental concepts - Learn Microsoft](https://learn.microsoft.com/en-us/entra/fundamentals/identity-fundamental-concepts) - Explains roles and permissions.\n* [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) (Covers Broken Object Level/Function Level Authorization)", "links": [] }, "0bApnJTt-Z2IUf0X3OCYf": { "title": "Black Box Testing", - "description": "", + "description": "In AI Red Teaming, black-box testing involves probing the AI system with inputs and observing outputs without any knowledge of the model's architecture, training data, or internal logic. This simulates an external attacker and is crucial for finding vulnerabilities exploitable through publicly accessible interfaces, such as prompt injection or safety bypasses discoverable via API interaction.\n\nLearn more from the following resources:\n\n* [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types.\n* [@article@What is Black Box Testing | Techniques & Examples - Imperva](https://www.imperva.com/learn/application-security/black-box-testing/) - General explanation.\n* [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Contrasts black-box and white-box approaches for LLM red teaming.", "links": [] }, "Mrk_js5UVn4dRDw-Yco3Y": { "title": "White Box Testing", - "description": "", + "description": "White-box testing in AI Red Teaming grants the tester full access to the model's internals (architecture, weights, training data, source code). This allows for highly targeted attacks, such as crafting precise adversarial examples using gradients, analyzing code for vulnerabilities, or directly examining training data for biases or PII leakage. It simulates insider threats or deep analysis scenarios.\n\nLearn more from the following resources:\n\n* [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types.\n* [@article@White-Box Adversarial Examples (OpenAI Blog)](https://openai.com/research/adversarial-robustness-toolbox) - Discusses generating attacks with full model knowledge.\n* [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Mentions white-box testing benefits for LLMs.", "links": [] }, "ZVNAMCP68XKRXVxF2-hBc": { "title": "Grey Box Testing", - "description": "", + "description": "Grey-box AI Red Teaming involves testing with partial knowledge of the system, such as knowing the model type (e.g., GPT-4), having access to some documentation, or understanding the general system architecture but not having full model weights or source code. This allows for more targeted testing than black-box while still simulating realistic external attacker scenarios where some information might be gleaned.\n\nLearn more from the following resources:\n\n* [@article@AI Transparency: Connecting AI Red Teaming and Compliance | SplxAI Blog](https://splx.ai/blog/ai-transparency-connecting-ai-red-teaming-and-compliance) - Discusses the value of moving towards gray-box testing in AI.\n* [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types.\n* [@article@Understanding Black Box, White Box, and Grey Box Testing - Frugal Testing](https://www.frugaltesting.com/blog/understanding-black-box-white-box-and-grey-box-testing-in-software-testing) - General definitions.", "links": [] }, "LVdYN9hyCyNPYn2Lz1y9b": { "title": "Automated vs Manual", - "description": "", + "description": "AI Red Teaming typically employs a blend of automated tools (for large-scale scanning, fuzzing prompts, generating basic adversarial examples) and manual human testing (for creative jailbreaking, complex multi-stage attacks, evaluating nuanced safety issues like bias). Automation provides scale, while manual testing provides depth and creativity needed to find novel vulnerabilities.\n\nLearn more from the following resources:\n\n* [@article@Automation Testing vs. Manual Testing: Which is the better approach? - Opkey](https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better) - General comparison.\n* [@article@Manual Testing vs Automated Testing: What's the Difference? - Leapwork](https://www.leapwork.com/blog/manual-vs-automated-testing) - General comparison.\n* [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Discusses using both automated generation and human ingenuity for red teaming.", "links": [] }, "65Lo60JQS5YlvvQ6KevXt": { "title": "Continuous Testing", - "description": "", + "description": "Applying continuous testing principles to AI security involves integrating automated red teaming checks into the development pipeline (CI/CD). This allows for regular, automated assessment of model safety, robustness, and alignment as the model or application code evolves, catching regressions or new vulnerabilities early. Tools facilitating Continuous Automated Red Teaming (CART) are emerging.\n\nLearn more from the following resources:\n\n* [@article@Continuous Automated Red Teaming (CART) - FireCompass](https://www.firecompass.com/continuous-automated-red-teaming/) - Explains the concept of CART.\n* [@article@What is Continuous Penetration Testing? Process and Benefits - Qualysec Technologies](https://qualysec.com/continuous-penetration-testing/) - Related concept applied to pen testing.\n* [@guide@What is Continuous Testing and How Does it Work? - Black Duck](https://www.blackduck.com/glossary/what-is-continuous-testing.html) - General definition and benefits.", "links": [] }, "c8n8FcYKDOgPLQvV9xF5J": { "title": "Testing Platforms", - "description": "", + "description": "Platforms used by AI Red Teamers range from general penetration testing OS distributions like Kali Linux to specific AI red teaming tools/frameworks like Microsoft's PyRIT or Promptfoo, and vulnerability scanners like OWASP ZAP adapted for API testing of AI services. These platforms provide the toolsets needed to conduct assessments.\n\nLearn more from the following resources:\n\n* [@tool@AI Red Teaming Agent - Azure AI Foundry | Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent) - Microsoft's tool leveraging PyRIT.\n* [@tool@Kali Linux](https://www.kali.org/) - Standard pentesting distribution.\n* [@tool@OWASP Zed Attack Proxy (ZAP)](https://owasp.org/www-project-zap/) - Widely used for web/API security testing.\n* [@tool@Promptfoo](https://www.promptfoo.dev/) - Open-source tool for testing and evaluating LLMs, includes red teaming features.\n* [@tool@PyRIT (Python Risk Identification Tool for generative AI) - GitHub](https://github.com/Azure/PyRIT) - Open-source framework from Microsoft.", "links": [] }, "59lkLcoqV4gq7f8Zm0X2p": { "title": "Monitoring Solutions", - "description": "", + "description": "AI Red Teamers interact with monitoring tools primarily to test their effectiveness (evasion) or potentially exploit vulnerabilities within them. Understanding tools like IDS (Snort, Suricata), network analyzers (Wireshark), and SIEMs helps red teamers simulate attacks that might bypass or target these defensive systems.\n\nLearn more from the following resources:\n\n* [@article@Open Source IDS Tools: Comparing Suricata, Snort, Bro (Zeek), Linux - LevelBlue](https://levelblue.com/blogs/security-essentials/open-source-intrusion-detection-tools-a-quick-overview) - Comparison of common open source monitoring tools.\n* [@tool@Snort](https://www.snort.org/) - Open source IDS/IPS.\n* [@tool@Suricata](https://suricata.io/) - Open source IDS/IPS/NSM.\n* [@tool@Wireshark](https://www.wireshark.org/) - Network protocol analyzer.\n* [@tool@Zeek (formerly Bro)](https://zeek.org/) - Network security monitoring framework.", "links": [] }, "et1Xrr8ez-fmB0mAq8W_a": { "title": "Benchmark Datasets", - "description": "", + "description": "AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models.\n\nLearn more from the following resources:\n\n* [@dataset@CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset - GitHub](https://github.com/cysecbench/dataset) - Dataset of cybersecurity prompts for benchmarking LLMs.\n* [@dataset@NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security](https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html) - Using CTF challenges to evaluate LLMs.\n* [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Benchmarking LLMs on cybersecurity tasks.", "links": [] }, "C1zO2xC0AqyV53p2YEPWg": { "title": "Custom Testing Scripts", - "description": "", + "description": "AI Red Teamers frequently write custom scripts (often in Python) to automate bespoke attacks, interact with specific AI APIs, generate complex prompt sequences, parse model outputs at scale, or implement novel exploit techniques not found in standard tools. Proficiency in scripting is essential for advanced AI red teaming.\n\nLearn more from the following resources:\n\n* [@guide@Python for Cybersecurity: Key Use Cases and Tools - Panther](https://panther.com/blog/python-for-cybersecurity-key-use-cases-and-tools) - Discusses Python's role in automation, pen testing, etc.\n* [@guide@Python for cybersecurity: use cases, tools and best practices - SoftTeco](https://softteco.com/blog/python-for-cybersecurity) - Covers using Python for various security tasks.\n* [@tool@Scapy](https://scapy.net/) - Powerful Python library for packet manipulation.", "links": [] }, "BLnfNlA0C4yzy1dvifjwx": { "title": "Reporting Tools", - "description": "", + "description": "AI Red Teamers use reporting techniques and potentially tools to clearly document their findings, including discovered vulnerabilities, successful exploit steps (e.g., effective prompts), assessed impact, and actionable recommendations tailored to AI systems. Good reporting translates technical findings into understandable risks for stakeholders.\n\nLearn more from the following resources:\n\n* [@article@The Complete Red Teaming Checklist \\[PDF\\]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) (Mentions reporting and templates)\n* [@guide@Penetration Testing Report: 6 Key Sections and 4 Best Practices - Bright Security](https://brightsec.com/blog/penetration-testing-report/) - General best practices for reporting security findings.\n* [@guide@Penetration testing best practices: Strategies for all test types - Strike Graph](https://www.strikegraph.com/blog/pen-testing-best-practices) - Includes tips on documentation.", "links": [] }, "s1xKK8HL5-QGZpcutiuvj": { "title": "Specialized Courses", - "description": "", + "description": "Targeted training is crucial for mastering AI Red Teaming. Look for courses covering adversarial ML, prompt hacking, LLM security, ethical hacking for AI, and specific red teaming methodologies applied to AI systems offered by platforms like Learn Prompting, Coursera, or security training providers.\n\nLearn more from the following resources:\n\n* [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Curated list including free and paid options.\n* [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Covers AI security risks and governance.\n* [@course@Exploring Adversarial Machine Learning - NVIDIA](https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/) - Focused training on adversarial ML (paid).\n* [@course@Free Online Cyber Security Courses with Certificates in 2025 - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/) - Offers foundational cybersecurity courses.", "links": [] }, "HHjsFR6wRDqUd66PMDE_7": { "title": "Industry Credentials", - "description": "", + "description": "Beyond formal certifications, recognition in the AI Red Teaming field comes from practical achievements like finding significant vulnerabilities (responsible disclosure), winning AI-focused CTFs or hackathons (like HackAPrompt), contributing to AI security research, or building open-source testing tools.\n\nLearn more from the following resources:\n\n* [@community@DEF CON - Wikipedia (Mentions Black Badge)](https://en.wikipedia.org/wiki/DEF_CON#Black_Badge) - Example of a high-prestige credential from CTFs.\n* [@community@HackAPrompt (Learn Prompting)](https://learnprompting.org/hackaprompt) - Example of a major AI Red Teaming competition.", "links": [] }, "MmwwRK4I9aRH_ha7duPqf": { "title": "Lab Environments", - "description": "", + "description": "AI Red Teamers need environments to practice attacking vulnerable systems safely. While traditional labs (HTB, THM, VulnHub) build general pentesting skills, platforms are emerging with labs specifically focused on AI/LLM vulnerabilities, prompt injection, or adversarial ML challenges.\n\nLearn more from the following resources:\n\n* [@platform@Gandalf AI Prompt Injection Lab](https://gandalf.lakera.ai/) - A popular web-based lab for prompt injection practice.\n* [@platform@Hack The Box: Hacking Labs](https://www.hackthebox.com/hacker/hacking-labs) - General pentesting labs.\n* [@platform@TryHackMe: Learn Cyber Security](https://tryhackme.com/) - Gamified cybersecurity training labs.\n* [@platform@VulnHub](https://www.vulnhub.com/) - Provides vulnerable VM images for practice.", "links": [] }, "2Imb64Px3ZQcBpSQjdc_G": { "title": "CTF Challenges", - "description": "", + "description": "Capture The Flag competitions increasingly include AI/ML security challenges. Participating in CTFs (tracked on CTFtime) or platforms like picoCTF helps AI Red Teamers hone skills in reverse engineering, web exploitation, and cryptography applied to AI systems, including specialized AI safety CTFs.\n\nLearn more from the following resources:\n\n* [@article@Capture the flag (cybersecurity) - Wikipedia](https://en.wikipedia.org/wiki/Capture_the_flag_\\(cybersecurity\\)) - Overview of CTFs.\n* [@article@Progress from our Frontier Red Team - Anthropic](https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team) - Mentions using CTFs (Cybench) for evaluating AI model security.\n* [@platform@CTFtime.org](https://ctftime.org/) - Global CTF event tracker.\n* [@platform@picoCTF](https://picoctf.org/) - Beginner-friendly CTF platform.", "links": [] }, "DpYsL0du37n40toH33fIr": { "title": "Red Team Simulations", - "description": "", + "description": "Participating in or conducting structured red team simulations against AI systems (or components) provides the most realistic practice. This involves applying methodologies, TTPs (Tactics, Techniques, and Procedures), reconnaissance, exploitation, and reporting within a defined scope and objective, specifically targeting AI vulnerabilities.\n\nLearn more from the following resources:\n\n* [@guide@A Simple Guide to Successful Red Teaming - Cobalt Strike](https://www.cobaltstrike.com/resources/guides/a-simple-guide-to-successful-red-teaming) - General guide adaptable to AI context.\n* [@guide@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Overview of red teaming process.\n* [@guide@The Complete Red Teaming Checklist \\[PDF\\]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Checklist for planning engagements.", "links": [] }, "LuKnmd9nSz9yLbTU_5Yp2": { "title": "Conferences", - "description": "", + "description": "Attending major cybersecurity conferences (DEF CON, Black Hat, RSA) and increasingly specialized AI Safety/Security conferences allows AI Red Teamers to learn about cutting-edge research, network with peers, and discover new tools and attack/defense techniques.\n\nLearn more from the following resources:\n\n* [@conference@Black Hat Events](https://www.blackhat.com/) - Professional security conference with AI tracks.\n* [@conference@DEF CON Hacking Conference](https://defcon.org/) - Major hacking conference with relevant villages/talks.\n* [@conference@Global Conference on AI, Security and Ethics 2025 - UNIDIR](https://unidir.org/event/global-conference-on-ai-security-and-ethics-2025/) - Example of a specialized AI security/ethics conference.\n* [@conference@RSA Conference](https://www.rsaconference.com/) - Large industry conference covering AI security.", "links": [] }, "ZlR03pM-sqVFZNhD1gMSJ": { "title": "Research Groups", - "description": "", + "description": "Following and potentially contributing to research groups at universities (like CMU, Stanford, Oxford), non-profits (like OpenAI, Anthropic), or government bodies (like UK's AISI) focused on AI safety, security, and alignment provides deep insights into emerging threats and mitigation strategies relevant to AI Red Teaming.\n\nLearn more from the following resources:\n\n* [@group@AI Cybersecurity | Global Cyber Security Capacity Centre (Oxford)](https://gcscc.ox.ac.uk/ai-security) - Academic research center.\n* [@group@Anthropic Research](https://www.anthropic.com/research) - AI safety research lab.\n* [@group@Center for AI Safety](https://www.safe.ai/) - Non-profit research organization.\n* [@group@The AI Security Institute (AISI)](https://www.aisi.gov.uk/) - UK government institute focused on AI safety/security research.", "links": [] }, "Smncq-n1OlnLAY27AFQOO": { "title": "Forums", - "description": "", + "description": "Engaging in online forums, mailing lists, Discord servers, or subreddits dedicated to AI security, adversarial ML, prompt engineering, or general cybersecurity helps AI Red Teamers exchange knowledge, ask questions, learn about new tools/techniques, and find collaboration opportunities.\n\nLearn more from the following resources:\n\n* [@community@List of Cybersecurity Discord Servers - DFIR Training](https://www.dfir.training/dfir-groups/discord?category%5B0%5D=17&category_children=1) - List including relevant servers.\n* [@community@Reddit - r/MachineLearning](https://www.reddit.com/r/MachineLearning/) - ML specific discussion.\n* [@community@Reddit - r/artificial](https://www.reddit.com/r/artificial/) - General AI discussion.\n* [@community@Reddit - r/cybersecurity](https://www.reddit.com/r/cybersecurity/) - General cybersecurity forum.", "links": [] }, "xJYTRbPxMn0Xs5ea0Ygn6": { "title": "LLM Security Testing", - "description": "", + "description": "The core application area for many AI Red Teamers today involves specifically testing Large Language Models for vulnerabilities like prompt injection, jailbreaking, harmful content generation, bias, and data privacy issues using specialized prompts and evaluation frameworks.\n\nLearn more from the following resources:\n\n* [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Courses focused on testing LLMs.\n* [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Dataset for evaluating LLMs on security tasks.\n* [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Guide specifically on red teaming LLMs.", "links": [] }, "FVsKivsJrIb82B0lpPmgw": { "title": "Agentic AI Security", - "description": "", + "description": "As AI agents capable of autonomous action become more common, AI Red Teamers must test their unique security implications. This involves assessing risks related to goal hijacking, unintended actions through tool use, exploitation of planning mechanisms, and ensuring agents operate safely within their designated boundaries.\n\nLearn more from the following resources:\n\n* [@article@AI Agents - Learn Prompting](https://learnprompting.org/docs/intermediate/ai_agents) (Background on agents)\n* [@article@Reasoning models don't always say what they think - Anthropic](https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think) (Discusses agent alignment challenges)\n* [@course@Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.](https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto) - Certification focusing on autonomous AI security.", "links": [] }, "KAcCZ3zcv25R6HwzAsfUG": { "title": "Responsible Disclosure", - "description": "", + "description": "A critical practice for AI Red Teamers is responsible disclosure: privately reporting discovered AI vulnerabilities (e.g., a successful jailbreak, data leak method, or severe bias) to the model developers or system owners, allowing them time to remediate before any public discussion, thus preventing malicious exploitation.\n\nLearn more from the following resources:\n\n* [@guide@Responsible Disclosure of AI Vulnerabilities - Preamble AI](https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities) - Discusses the process specifically for AI vulnerabilities.\n* [@guide@Vulnerability Disclosure Program | CISA](https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp) - Government VDP example.\n* [@policy@Google Vulnerability Reward Program (VRP)](https://bughunters.google.com/) - Example of a major tech company's VDP/bug bounty program.", "links": [] }, "-G8v_CNa8wO_g-46_RFQo": { "title": "Emerging Threats", - "description": "", + "description": "AI Red Teamers must stay informed about potential future threats enabled by more advanced AI, such as highly autonomous attack agents, AI-generated malware that evades detection, sophisticated deepfakes for social engineering, or large-scale exploitation of interconnected AI systems. Anticipating these helps shape current testing priorities.\n\nLearn more from the following resources:\n\n* [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses future AI-driven cyberattacks.\n* [@article@Why Artificial Intelligence is the Future of Cybersecurity - Darktrace](https://www.darktrace.com/blog/why-artificial-intelligence-is-the-future-of-cybersecurity) - Covers AI misuse and the future threat landscape.\n* [@report@AI Index 2024 - Stanford University](https://aiindex.stanford.edu/report/) - Annual report tracking AI capabilities and societal implications, including risks.", "links": [] }, "soC-kcem1ISbnCQMa6BIB": { "title": "Advanced Techniques", - "description": "", + "description": "The practice of AI Red Teaming itself will evolve. Future techniques may involve using AI adversaries to automatically discover complex vulnerabilities, developing more sophisticated methods for testing AI alignment and safety properties, simulating multi-agent system failures, and creating novel metrics for evaluating AI robustness against unknown future attacks.\n\nLearn more from the following resources:\n\n* [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses applying red teaming to complex systems.\n* [@article@Advanced Techniques in AI Red Teaming for LLMs | NeuralTrust](https://neuraltrust.ai/blog/advanced-techniques-in-ai-red-teaming) - Discusses techniques like adversarial ML and automated threat intelligence for red teaming.\n* [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for more advanced automated red teaming.", "links": [] }, "VmaIHVsCpq2um_0cA33V3": { "title": "Research Opportunities", - "description": "", + "description": "AI Red Teaming relies on ongoing research. Key areas needing further investigation include scalable methods for finding elusive vulnerabilities, understanding emergent behaviors in complex models, developing provable safety guarantees, creating better benchmarks for AI security, and exploring the socio-technical aspects of AI misuse and defense.\n\nLearn more from the following resources:\n\n* [@article@Cutting-Edge Research on AI Security bolstered with new Challenge Fund - GOV.UK](https://www.gov.uk/government/news/cutting-edge-research-on-ai-security-bolstered-with-new-challenge-fund-to-ramp-up-public-trust-and-adoption) - Highlights government funding for AI security research priorities.\n* [@research@Careers | The AI Security Institute (AISI)](https://www.aisi.gov.uk/careers) - Outlines research focus areas for the UK's AISI.\n* [@research@Research - Anthropic](https://www.anthropic.com/research) - Example of research areas at a leading AI safety lab.", "links": [] }, "WePO66_4-gNcSdE00WKmw": { "title": "Industry Standards", - "description": "", + "description": "As AI matures, AI Red Teamers will increasingly need to understand and test against emerging industry standards and regulations for AI safety, security, and risk management, such as the NIST AI RMF, ISO/IEC 42001, and sector-specific guidelines, ensuring AI systems meet compliance requirements.\n\nLearn more from the following resources:\n\n* [@article@ISO 42001: The New Compliance Standard for AI Management Systems - Bright Defense](https://www.brightdefense.com/resources/iso-42001-compliance/) - Overview of ISO 42001 requirements.\n* [@article@ISO 42001: What it is & why it matters for AI management - IT Governance](https://www.itgovernance.co.uk/iso-42001) - Explanation of the standard.\n* [@framework@NIST AI Risk Management Framework (AI RMF)](https://www.nist.gov/itl/ai-risk-management-framework) - Voluntary framework gaining wide adoption.\n* [@standard@ISO/IEC 42001: Information technology — Artificial intelligence — Management system](https://www.iso.org/standard/81230.html) - International standard for AI management systems.", "links": [] } } \ No newline at end of file diff --git a/public/roadmap-content/cyber-security.json b/public/roadmap-content/cyber-security.json index 232df0e5a..846aee499 100644 --- a/public/roadmap-content/cyber-security.json +++ b/public/roadmap-content/cyber-security.json @@ -31,7 +31,7 @@ "description": "There are several types of network connections that enable communication between devices, each serving different functions based on speed, reliability, and purpose. **Ethernet** is a wired connection type commonly used in local area networks (LANs), providing high-speed, stable, and secure data transfer. Ethernet is ideal for businesses and environments where reliability is crucial, offering speeds from 100 Mbps to several Gbps.\n\n**Wi-Fi**, a wireless connection, enables devices to connect to a network without physical cables. It provides flexibility and mobility, making it popular in homes, offices, and public spaces. While Wi-Fi offers convenience, it can be less reliable and slower than Ethernet due to signal interference or distance from the access point.\n\n**Bluetooth** is a short-range wireless technology primarily used for connecting peripherals like headphones, keyboards, and other devices. It operates over shorter distances, typically up to 10 meters, and is useful for personal device communication rather than networking larger systems.\n\n**Fiber-optic connections** use light signals through glass or plastic fibers to transmit data at very high speeds over long distances, making them ideal for internet backbones or connecting data centers. Fiber is faster and more reliable than traditional copper cables, but it is also more expensive to implement.\n\n**Cellular connections**, such as 4G and 5G, allow mobile devices to connect to the internet via wireless cellular networks. These connections offer mobility, enabling internet access from almost anywhere, but their speeds and reliability can vary depending on network coverage.\n\nEach connection type plays a specific role, balancing factors like speed, distance, and convenience to meet the varying needs of users and organizations.\n\nLearn more from the following resources:", "links": [ { - "title": "What is ethernet?", + "title": "What is Ethernet?", "url": "https://www.techtarget.com/searchnetworking/definition/Ethernet", "type": "article" }, @@ -52,14 +52,19 @@ "description": "Understanding Common Symptoms\n-----------------------------\n\nIn order to troubleshoot effectively, it is important to recognize and understand the common symptoms encountered in IT systems. These can range from hardware-related issues, such as overheating or physical damage, to software-related problems, such as slow performance or unresponsiveness.\n\nBasic Troubleshooting Process\n-----------------------------\n\nFollowing a systematic troubleshooting process is critical, regardless of the operating system. Here are the basic steps you might follow:\n\n* **Identify the problem**: Gather information on the issue and its symptoms, and attempt to reproduce the problem, if possible. Take note of any error messages or unusual behaviors.\n* **Research and analyze**: Search for potential causes and remedies on relevant forums, web resources, or vendor documentation.\n* **Develop a plan**: Formulate a strategy to resolve the issue, considering the least disruptive approach first, where possible.\n* **Test and implement**: Execute the proposed solution(s) and verify if the problem is resolved. If not, repeat the troubleshooting process with a new plan until the issue is fixed.\n* **Document the process and findings**: Record the steps taken, solutions implemented, and results to foster learning and improve future troubleshooting efforts.\n\nIsolating the Problem\n---------------------\n\nTo pinpoint the root cause of an issue, it's important to isolate the problem. You can perform this by:\n\n* **Disabling or isolating hardware components**: Disconnect any peripherals or external devices, then reconnect and test them one by one to identify the defective component(s).\n* **Checking resource usage**: Utilize built-in or third-party tools to monitor resource usage (e.g., CPU, memory, and disk) to determine whether a bottleneck is causing the problem.\n* **Verifying software configurations**: Analyze the configuration files or settings for any software or applications that could be contributing to the problem.\n\nNetworking and Connectivity Issues\n----------------------------------\n\nEffective troubleshooting of network-related issues requires an understanding of various protocols, tools, and devices involved in networking. Here are some basic steps you can follow:\n\n* **Verify physical connectivity**: Inspect cables, connectors, and devices to ensure all components are securely connected and functioning correctly.\n* **Confirm IP configurations**: Check the system's IP address and related settings to ensure it has a valid IP configuration.\n* **Test network services**: Use command-line tools, such as `ping` and `traceroute` (or `tracert` in Windows), to test network connections and diagnose potential problems.\n\nLog Analysis\n------------\n\nLogs are records of system events, application behavior, and user activity, which can be invaluable when troubleshooting issues. To effectively analyze logs, you should:\n\n* **Identify relevant logs**: Determine which log files contain information related to the problem under investigation.\n* **Analyze log content**: Examine events, error messages, or patterns that might shed light on the root cause of the issue.\n* **Leverage log-analysis tools**: Utilize specialized tools or scripts to help parse, filter, and analyze large or complex log files.\n\nLearn more from the following resources:", "links": [ { - "title": "How to identify 9 signs of Operating System.", - "url": "https://bro4u.com/blog/how-to-identify-9-signs-of-operating-system", + "title": "@articleOS-Independent Troubleshooting Flashcards", + "url": "https://quizlet.com/ph/837474114/os-independent-troubleshooting-flash-cards/", "type": "article" }, { - "title": "Trouble shooting guide", + "title": "Troubleshooting Guide", "url": "https://cdnsm5-ss6.sharpschool.com/userfiles/servers/server_20856499/file/teacher%20pages/lindsay%20dolezal/it%20essentials/5.6.pdf", "type": "article" + }, + { + "title": "Operating System Troubleshooting - CompTIA A+", + "url": "https://www.youtube.com/watch?v=6gainrNiypc", + "type": "video" } ] }, @@ -238,7 +243,7 @@ "description": "TryHackMe is an online platform designed for cybersecurity training and learning through hands-on experience. It offers a wide range of virtual rooms and challenges covering various security topics, from basic to advanced levels. Users can access vulnerable machines, engage in capture-the-flag (CTF) style exercises, and learn practical skills in areas like penetration testing, web security, and network security. TryHackMe uses browser-based tools and virtual machines, making it accessible without requiring powerful hardware. The platform caters to beginners and experienced professionals alike, providing guided learning paths, real-world scenarios, and a supportive community. It's widely used for both individual skill development and corporate cybersecurity training.\n\nLearn more from the following resources:", "links": [ { - "title": "TryHackMe Website", + "title": "TryHackMe", "url": "https://tryhackme.com/", "type": "article" }, @@ -254,7 +259,7 @@ "description": "VulnHub is an online platform that provides a collection of intentionally vulnerable virtual machines for cybersecurity enthusiasts, penetration testers, and ethical hackers to practice their skills. These virtual machines simulate various real-world scenarios with different vulnerabilities and security misconfigurations. Users can download and run these VMs in their own environments, attempting to exploit vulnerabilities and gain root access. VulnHub offers a hands-on approach to learning about cybersecurity, allowing users to explore different attack vectors, practice exploitation techniques, and understand common security flaws in a safe, legal environment. It's a valuable resource for both beginners and experienced professionals to enhance their offensive security skills and prepare for certifications.\n\nLearn more from the following resources:", "links": [ { - "title": "Vulnhub Website", + "title": "Vulnhub", "url": "https://www.vulnhub.com/", "type": "article" }, @@ -270,7 +275,7 @@ "description": "**picoCTF** is an online cybersecurity competition designed to help students and beginners learn and practice hacking skills through capture-the-flag (CTF) challenges. Developed by Carnegie Mellon University, picoCTF features a series of progressively difficult puzzles that teach concepts such as reverse engineering, cryptography, web exploitation, forensics, and binary exploitation. It's an educational platform that offers hands-on experience in solving real-world cybersecurity problems, making it popular among both students and aspiring cybersecurity professionals for learning and improving their skills in a practical, interactive environment.\n\nLearn more from the following resources:", "links": [ { - "title": "picoCTF Website", + "title": "picoCTF", "url": "https://picoctf.org/", "type": "article" }, @@ -286,7 +291,7 @@ "description": "The SANS Holiday Hack Challenge is an annual cybersecurity event that offers participants the opportunity to solve a series of themed cybersecurity puzzles and challenges. Designed to engage both beginners and experienced professionals, the challenge covers a wide range of topics including network forensics, penetration testing, reverse engineering, and more. It provides a fun, gamified learning experience that encourages participants to enhance their skills while collaborating with the global cybersecurity community. The event often features real-world security scenarios, creative storytelling, and interactive, hands-on tasks.\n\nLearn more from the following resources:", "links": [ { - "title": "SANS Holiday Hack Website", + "title": "SANS Holiday Hack", "url": "https://www.sans.org/mlp/holiday-hack-challenge-2023/", "type": "article" }, @@ -302,14 +307,14 @@ "description": "CompTIA A+ is an entry-level certification for IT professionals that focuses on essential knowledge and skills in computer hardware, software, and troubleshooting. This certification is widely recognized in the IT industry and can serve as a stepping stone for individuals looking to start a career in the field of information technology.\n\nLearn more from the following resources:", "links": [ { - "title": "Comptia A+ Course", - "url": "https://www.youtube.com/watch?v=1CZXXNKAY5o", - "type": "course" - }, - { - "title": "Comptia A+ Website", + "title": "CompTIA A+", "url": "https://www.comptia.org/certifications/a", "type": "article" + }, + { + "title": "CompTIA A+ Course", + "url": "https://www.youtube.com/watch?v=1CZXXNKAY5o", + "type": "video" } ] }, @@ -318,7 +323,7 @@ "description": "The CompTIA Linux+ certification is an entry-level certification aimed at individuals who are seeking to learn and demonstrate their skills and knowledge of the Linux operating system. This certification is widely recognized in the IT industry as an essential qualification for entry-level Linux administrators and helps them gain a strong foundation in Linux system administration tasks.\n\nLearn more from the following resources:", "links": [ { - "title": "Linux+ Website", + "title": "CompTIA Linux+", "url": "https://www.comptia.org/certifications/linux", "type": "article" }, @@ -331,17 +336,17 @@ }, "4RGbNOfMPDbBcvUFWTTCV": { "title": "CompTIA Network+", - "description": "The CompTIA Network+ is a highly sought-after certification for IT professionals who aim to build a solid foundation in networking concepts and practices. This certification is vendor-neutral, meaning that it covers a broad range of knowledge that can be applied to various network technologies, products, and solutions. The Network+ certification is designed for beginners in the world of IT networking, and it is recommended that you first obtain the [CompTIA A+ certification](#) before moving on to Network+.\n\nLearn more from the following resources:", + "description": "The CompTIA Network+ is a highly sought-after certification for IT professionals who aim to build a solid foundation in networking concepts and practices. This certification is vendor-neutral, meaning that it covers a broad range of knowledge that can be applied to various network technologies, products, and solutions. The Network+ certification is designed for beginners in the world of IT networking, and it is recommended that you first obtain the CompTIA A+ certification before moving on to Network+.\n\nLearn more from the following resources:", "links": [ { - "title": "CompTIA Network+ Course", - "url": "https://www.youtube.com/watch?v=xmpYfyNmWbw", - "type": "course" - }, - { - "title": "CompTIA Network+ Website", + "title": "CompTIA Network+", "url": "https://www.comptia.org/certifications/network", "type": "article" + }, + { + "title": "CompTIA Network+ Course", + "url": "https://www.youtube.com/watch?v=xmpYfyNmWbw", + "type": "video" } ] }, @@ -350,14 +355,14 @@ "description": "The Cisco Certified Network Associate (CCNA) certification is an entry-level certification for IT professionals who want to specialize in networking, specifically within the realm of Cisco products. This certification validates an individual's ability to install, configure, operate, and troubleshoot medium-sized routed and switched networks. It also covers the essentials of network security and management.\n\nLearn more from the following resources:", "links": [ { - "title": "@Network Chuck Free CCNA Course", - "url": "https://www.youtube.com/playlist?list=PLIhvC56v63IJVXv0GJcl9vO5Z6znCVb1P", + "title": "CCNA Certification", + "url": "https://www.cisco.com/site/us/en/learn/training-certifications/certifications/enterprise/ccna/index.html", "type": "article" }, { - "title": "CCNA Certification Website", - "url": "https://www.cisco.com/site/us/en/learn/training-certifications/certifications/enterprise/ccna/index.html", - "type": "article" + "title": "Network Chuck Free CCNA Course", + "url": "https://www.youtube.com/playlist?list=PLIhvC56v63IJVXv0GJcl9vO5Z6znCVb1P", + "type": "video" } ] }, @@ -382,9 +387,14 @@ "description": "**Certified Ethical Hacker (CEH)** is an advanced certification focused on equipping cybersecurity professionals with the knowledge and skills required to defend against the continuously evolving landscape of cyber threats. This certification is facilitated by the EC-Council, an internationally recognized organization for information security certifications.\n\nLearn more from the following resources:", "links": [ { - "title": "CEH Website", + "title": "CEH", "url": "https://www.eccouncil.org/train-certify/certified-ethical-hacker-ceh/", "type": "article" + }, + { + "title": "Certified Ethical Hacker Online Training", + "url": "https://iclass.eccouncil.org/our-courses/certified-ethical-hacker-ceh/", + "type": "article" } ] }, @@ -393,7 +403,7 @@ "description": "The **Certified Information Systems Auditor (CISA)** is a globally recognized certification for professionals who audit, control, monitor, and assess an organization's information technology and business systems.\n\nCISA was established by the Information Systems Audit and Control Association (ISACA) and is designed to demonstrate an individual's expertise in managing vulnerabilities, ensuring compliance with industry regulations, and instituting controls within the business environment.\n\nLearn more from the following resources:", "links": [ { - "title": "CISA Website", + "title": "CISA", "url": "https://www.isaca.org/credentialing/cisa", "type": "article" }, @@ -409,7 +419,7 @@ "description": "The Certified Information Security Manager (CISM) is an advanced cybersecurity certification offered by ISACA that focuses on information security management. It is designed for professionals who have a strong understanding of information security and are responsible for overseeing, designing, and managing an organization's information security programs.\n\nLearn more from the following resources:", "links": [ { - "title": "CISM Website", + "title": "CISM", "url": "https://www.isaca.org/credentialing/cism", "type": "article" }, @@ -474,23 +484,28 @@ "description": "**OSCP (Offensive Security Certified Professional)** is a widely recognized certification in cybersecurity that focuses on penetration testing and ethical hacking. Offered by Offensive Security, it requires candidates to complete a challenging exam that involves identifying and exploiting vulnerabilities in a controlled environment. The OSCP certification emphasizes hands-on skills, practical experience, and the ability to conduct comprehensive security assessments, making it highly valued by employers for its rigorous approach to real-world penetration testing techniques.\n\nLearn more from the following resources:", "links": [ { - "title": "Offsec OSCP Site", + "title": "Offensive Security Certified Professional", "url": "https://www.offsec.com/courses/pen-200/", "type": "article" }, { - "title": "How to prepare for the OSCP", + "title": "How to Prepare for OSCP Exam", "url": "https://cybersecurityguide.org/programs/cybersecurity-certifications/oscp/", "type": "article" + }, + { + "title": "How to Become an OSCP [Full Guide] - Geekflare", + "url": "https://geekflare.com/cybersecurity/oscp-certification/", + "type": "article" } ] }, "rA1skdztev3-8VmAtIlmr": { "title": "CREST", - "description": "CREST is a non-profit, accreditation and certification body that represents the technical information security industry. Established in 2008, its mission is to promote the development and professionalization of the cyber security sector. CREST provides certifications for individuals and accreditations for companies, helping customers find knowledgeable and experienced professionals in the field.\n\nLearn more from the following resources:", + "description": "CREST is a non-profit, accreditation and certification body that represents the technical information security industry. Established in 2008, its mission is to promote the development and professionalization of the cyber security sector. CREST provides certifications for individuals and accreditation for companies, helping customers find knowledgeable and experienced professionals in the field.\n\nLearn more from the following resources:", "links": [ { - "title": "CREST Certifications Website", + "title": "CREST Certifications", "url": "https://www.crest-approved.org/skills-certifications-careers/crest-certifications/", "type": "article" }, @@ -506,14 +521,14 @@ "description": "The Certified Information Systems Security Professional (CISSP) is a globally recognized certification offered by the International Information System Security Certification Consortium (ISC)². It is designed for experienced security professionals to validate their knowledge and expertise in the field of information security.\n\nLearn more from the following resources:", "links": [ { - "title": "CISSP Certification course", - "url": "https://www.youtube.com/watch?v=M1_v5HBVHWo", - "type": "course" - }, - { - "title": "CISSP Certification Website", + "title": "CISSP Certification", "url": "https://www.isc2.org/certifications/cissp", "type": "article" + }, + { + "title": "CISSP Certification Course", + "url": "https://www.youtube.com/watch?v=M1_v5HBVHWo", + "type": "video" } ] }, @@ -521,6 +536,16 @@ "title": "Operating Systems", "description": "**Operating systems (OS)** are software that manage computer hardware and provide a platform for applications to run. They handle essential functions such as managing memory, processing tasks, controlling input and output devices, and facilitating file management. Key examples include **Windows**, **macOS**, **Linux**, and **Unix**. Each operating system offers different features and interfaces, tailored to specific user needs or system requirements, from desktop computing to server management and embedded systems.\n\nLearn more from the following resources:", "links": [ + { + "title": "What is a Operating System?", + "url": "https://en.wikipedia.org/wiki/Operating_system", + "type": "article" + }, + { + "title": "8 Different Types of Operating Systems With Examples", + "url": "https://techspirited.com/different-types-of-operating-systems", + "type": "article" + }, { "title": "What is an operating system as fast as possible", "url": "https://www.youtube.com/watch?v=pVzRTmdd9j0", @@ -537,15 +562,15 @@ "url": "https://learn.microsoft.com/en-us/windows/security/", "type": "article" }, - { - "title": "Windows 11 Full Tutorial - A 2 Hour Course to Learn and Master Windows 11", - "url": "https://www.youtube.com/watch?v=UKn-r3X2CLk", - "type": "article" - }, { "title": "Explore top posts about Windows", "url": "https://app.daily.dev/tags/windows?ref=roadmapsh", "type": "article" + }, + { + "title": "Windows 11 Full Tutorial - A 2 Hour Course to Learn and Master Windows 11", + "url": "https://www.youtube.com/watch?v=UKn-r3X2CLk", + "type": "video" } ] }, @@ -683,6 +708,11 @@ "title": "Common Commands", "description": "Common operating system (OS) commands are essential for interacting with a system's shell or command-line interface (CLI). These commands allow users to perform a wide range of tasks, such as navigating the file system, managing files and directories, checking system status, and administering processes. Below are some commonly used commands across Unix/Linux and Windows operating systems:\n\n1. **Navigating the File System:**\n \n * Unix/Linux: `ls` (list files), `cd` (change directory), `pwd` (print working directory)\n * Windows: `dir` (list files), `cd` (change directory), `echo %cd%` (print working directory)\n2. **File and Directory Management:**\n \n * Unix/Linux: `cp` (copy files), `mv` (move/rename files), `rm` (remove files), `mkdir` (create directory)\n * Windows: `copy` (copy files), `move` (move/rename files), `del` (delete files), `mkdir` (create directory)\n3. **System Information and Processes:**\n \n * Unix/Linux: `top` or `htop` (view running processes), `ps` (list processes), `df` (disk usage), `uname` (system info)\n * Windows: `tasklist` (list processes), `taskkill` (kill process), `systeminfo` (system details)\n4. **File Permissions and Ownership:**\n \n * Unix/Linux: `chmod` (change file permissions), `chown` (change file ownership)\n * Windows: `icacls` (modify access control lists), `attrib` (change file attributes)\n5. **Network Commands:**\n \n * Unix/Linux: `ping` (test network connection), `ifconfig` or `ip` (network interface configuration), `netstat` (network statistics)\n * Windows: `ping` (test network connection), `ipconfig` (network configuration), `netstat` (network statistics)\n\nThese commands form the foundation of interacting with and managing an OS via the command line, providing greater control over system operations compared to graphical interfaces.\n\nLearn more from the following resources:", "links": [ + { + "title": "Essential Unix Commands", + "url": "https://www.geeksforgeeks.org/essential-linuxunix-commands/", + "type": "article" + }, { "title": "60 Linux commands you must know", "url": "https://www.youtube.com/watch?v=gd7BXuUQ91w", @@ -727,7 +757,7 @@ "description": "Networking protocols are essential for facilitating communication between devices and systems across networks. In cybersecurity, understanding these protocols is crucial for identifying potential vulnerabilities and securing data transmission. Common protocols include TCP/IP, the foundation of internet communication, which ensures reliable data delivery. HTTP and HTTPS are used for web browsing, with HTTPS providing encrypted connections. FTP and SFTP handle file transfers, while SMTP, POP3, and IMAP manage email services. DNS translates domain names to IP addresses, and DHCP automates IP address assignment. SSH enables secure remote access and management of systems. Other important protocols include TLS/SSL for encryption, SNMP for network management, and VPN protocols like IPsec and OpenVPN for secure remote connections. Cybersecurity professionals must be well-versed in these protocols to effectively monitor network traffic, implement security measures, and respond to potential threats targeting specific protocol vulnerabilities.\n\nLearn more from the following resources:", "links": [ { - "title": "12 common network protocols", + "title": "12 Common Network Protocols", "url": "https://www.techtarget.com/searchnetworking/feature/12-common-network-protocols-and-their-functions-explained", "type": "article" }, @@ -748,7 +778,7 @@ "type": "article" }, { - "title": "Common network ports", + "title": "Common Network Ports", "url": "https://www.youtube.com/watch?v=dh8h-4u7Wak", "type": "video" } @@ -1046,7 +1076,7 @@ "type": "article" }, { - "title": "What is a router and how does it work?", + "title": "What is a router and How does it work?", "url": "https://www.youtube.com/watch?v=UIJzHLpG9bM", "type": "video" }, @@ -1067,12 +1097,12 @@ "description": "A switch is a network device that operates at the data link layer (Layer 2) of the OSI model, connecting multiple devices within a local area network (LAN). It uses MAC addresses to forward data packets between devices, creating separate collision domains for each port. Switches improve network efficiency by sending packets only to their intended destinations, reducing unnecessary traffic. They support full-duplex communication, allowing simultaneous data transmission in both directions. Modern switches often include advanced features like VLANs, port mirroring, and Quality of Service (QoS) management. Switches are fundamental to creating efficient, segmented networks and are crucial components in both small office and large enterprise network infrastructures.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a network switch?", + "title": "What is a Network Switch?", "url": "https://www.cloudflare.com/en-gb/learning/network-layer/what-is-a-network-switch/", "type": "article" }, { - "title": "What is a SWITCH?", + "title": "What is a Switch?", "url": "https://www.youtube.com/watch?v=9eH16Fxeb9o", "type": "video" } @@ -1241,6 +1271,11 @@ "title": "Star", "description": "A star network topology is a configuration where all devices (nodes) are connected directly to a central hub or switch. In this arrangement, each node has a dedicated point-to-point link to the central device, forming a star-like structure. This topology offers advantages such as easy installation and reconfiguration, centralized management, and fault isolation. If one connection fails, it doesn't affect others. However, the central hub is a single point of failure for the entire network. Star topologies are commonly used in local area networks (LANs) due to their reliability, scalability, and ease of maintenance, making them a popular choice in both small office and large enterprise environments.\n\nLearn more from the following resources:", "links": [ + { + "title": "Star Topology", + "url": "https://www.computerhope.com/jargon/s/startopo.htm", + "type": "article" + }, { "title": "Star Topology", "url": "https://www.youtube.com/watch?v=EQ3rW22-Py0", @@ -1253,7 +1288,7 @@ "description": "In a ring topology, each network device is connected in a circular fashion, where data travels through each node in one direction (or both in a bidirectional setup) until it reaches its destination. This structure simplifies wiring and ensures a predictable data path, but a failure in any single node or connection can disrupt the entire network unless redundant paths are used. Ring topology is known for its straightforward installation but is less common today due to its vulnerability to network interruptions.\n\nLearn more from the following resources:", "links": [ { - "title": "What is ring topology?", + "title": "What is Ring Topology?", "url": "https://www.lenovo.com/gb/en/glossary/what-is-ring-topology/", "type": "article" }, @@ -1407,7 +1442,7 @@ "description": "VMware is a leading provider of virtualization and cloud computing software. Its core technology allows multiple virtual machines (VMs) to run on a single physical server, each with its own operating system and resources. VMware's product suite includes tools for server virtualization, desktop virtualization, cloud management, and network virtualization. Key products like vSphere and ESXi enable efficient resource utilization, improved scalability, and simplified IT management. VMware's solutions are widely used in enterprise environments for consolidating servers, enabling cloud computing, facilitating disaster recovery, and supporting development and testing environments. The company's technology plays a crucial role in modern data center operations and hybrid cloud strategies.\n\nLearn more from the following resources:", "links": [ { - "title": "VMWare Website", + "title": "VMWare", "url": "https://www.vmware.com/", "type": "article" }, @@ -1423,10 +1458,15 @@ "description": "VirtualBox is a free, open-source virtualization software developed by Oracle. It allows users to run multiple operating systems simultaneously on a single physical machine. VirtualBox supports a wide range of guest operating systems, including various versions of Windows, Linux, macOS, and more. It provides features like snapshots for easy system state preservation, shared folders for file exchange between host and guest systems, and USB device support. VirtualBox is popular among developers, IT professionals, and enthusiasts for testing software, running legacy applications, and experimenting with different operating systems without the need for separate physical hardware.\n\nLearn more from the following resources:", "links": [ { - "title": "VirtualBox Website", + "title": "VirtualBox", "url": "https://www.virtualbox.org/", "type": "article" }, + { + "title": "VirtualBox Documentation", + "url": "https://www.virtualbox.org/wiki/Documentation", + "type": "article" + }, { "title": "How to use VirtualBox", "url": "https://www.youtube.com/watch?v=nvdnQX9UkMY", @@ -1455,10 +1495,15 @@ "description": "**Proxmox** is an open-source virtualization management platform that integrates both **Proxmox Virtual Environment (Proxmox VE)** and **Proxmox Mail Gateway**. Proxmox VE combines virtualization technologies, including KVM for virtual machines and LXC for lightweight containers, into a unified web-based interface for managing and deploying virtualized environments. It offers features such as high availability, storage management, and backup solutions. Proxmox Mail Gateway provides email security and anti-spam solutions, protecting email systems from threats. Proxmox is valued for its flexibility, cost-effectiveness, and comprehensive management capabilities.\n\nLearn more from the following resources:", "links": [ { - "title": "Proxmox Website", + "title": "Proxmox", "url": "https://www.proxmox.com/en/", "type": "article" }, + { + "title": "Proxmox Virtual Environment", + "url": "https://en.wikipedia.org/wiki/Proxmox_Virtual_Environment", + "type": "article" + }, { "title": "What is Proxmox virtualization?", "url": "https://www.youtube.com/watch?v=GMAvmHEWAMU", @@ -1620,12 +1665,12 @@ "description": "Port scanners are essential tools in the troubleshooting and cybersecurity landscape. They are designed to detect open or closed network ports on a target system. Network ports serve as communication endpoints for various applications and services running on a device, and knowing the status of these ports can help identify potential security vulnerabilities or confirm that specific services are running as intended.\n\nLearn more from the following resources:", "links": [ { - "title": "Top 5 Best port scanners", + "title": "Top 5 Best Port Scanners", "url": "https://securitytrails.com/blog/best-port-scanners", "type": "article" }, { - "title": "How To Use nmap To Scan For Open Ports", + "title": "How To Use Nmap To Scan For Open Ports", "url": "https://www.youtube.com/watch?v=ifbwTt3_oCg", "type": "video" } @@ -1683,6 +1728,11 @@ "title": "Protocol Analyzers", "description": "**Protocol analyzers**, also known as network analyzers or packet sniffers, are tools used to capture, inspect, and analyze network traffic. They help diagnose network issues, troubleshoot performance problems, and ensure security by providing detailed insights into the data packets transmitted across a network. Protocol analyzers decode and display various network protocols, such as TCP/IP, HTTP, and DNS, allowing users to understand communication patterns, detect anomalies, and identify potential vulnerabilities. Popular examples include Wireshark and tcpdump.\n\nLearn more from the following resources:", "links": [ + { + "title": "What is a Protocol Analyzer?", + "url": "https://www.liveaction.com/glossary/protocol-analyzer/", + "type": "article" + }, { "title": "Protocol Analyzers", "url": "https://www.youtube.com/watch?v=hTMhlB-o0Ow", @@ -1713,8 +1763,19 @@ }, "xFuWk7M-Vctk_xb7bHbWs": { "title": "route", - "description": "The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security.", - "links": [] + "description": "The `route` command is a network utility used to view and manipulate the IP routing table on Unix-like and Windows systems. It allows users to display the current routes that data packets take, as well as add, modify, or delete routes for network traffic. This command is often used in network troubleshooting and configuration to control how data flows between different networks and subnets. By specifying routes manually, administrators can define specific paths for network traffic, bypassing default routes and optimizing performance or security.\n\nLearn more from the following resources:", + "links": [ + { + "title": "route command", + "url": "https://www.man7.org/linux/man-pages/man8/route.8.html", + "type": "article" + }, + { + "title": "route command explained", + "url": "https://www.youtube.com/watch?v=uOqBollh_x4", + "type": "video" + } + ] }, "y8GaUNpaCT1Ai88wPOk6d": { "title": "tcpdump", @@ -1822,12 +1883,12 @@ "description": "Certificates, also known as digital certificates or SSL/TLS certificates, play a crucial role in the world of cybersecurity. They help secure communications between clients and servers over the internet, ensuring that sensitive data remains confidential and protected from prying eyes.\n\nDigital certificates provide a crucial layer of security and trust for online communications. Understanding their role in cybersecurity, the different types of certificates, and the importance of acquiring certificates from trusted CAs can greatly enhance your organization's online security posture and reputation.\n\nLearn more from the following resources:", "links": [ { - "title": "What is an SSL certificate?", + "title": "What is an SSL Certificate?", "url": "https://www.cloudflare.com/en-gb/learning/ssl/what-is-an-ssl-certificate/", "type": "article" }, { - "title": "What is a certificate authority", + "title": "What is a Certificate Authority", "url": "https://www.ssl.com/article/what-is-a-certificate-authority-ca/", "type": "article" } @@ -1991,7 +2052,7 @@ "description": "**Penetration Testing Rules of Engagement** define the guidelines and boundaries for conducting a penetration test. They establish the scope, objectives, and constraints, including the systems and networks to be tested, the testing methods allowed, and the times during which testing can occur. These rules ensure that the testing is conducted ethically and legally, minimizing disruptions and protecting sensitive data. They also include communication protocols for reporting findings and any necessary approvals or permissions from stakeholders to ensure that the testing aligns with organizational policies and compliance requirements.\n\nLearn more from the following resources:", "links": [ { - "title": "Why are rules of engagement important to a Penetration Test?", + "title": "Why are Rules of Engagement Important to a Penetration Test?", "url": "https://www.triaxiomsecurity.com/rules-of-engagement-important-to-penetration-test/", "type": "article" }, @@ -2023,12 +2084,12 @@ "description": "The core concepts of Zero Trust revolve around the principle of \"never trust, always verify,\" emphasizing the need to continuously validate every user, device, and application attempting to access resources, regardless of their location within or outside the network perimeter. Unlike traditional security models that rely on a strong perimeter defense, Zero Trust assumes that threats could already exist inside the network and that no entity should be trusted by default. Key principles include strict identity verification, least privilege access, micro-segmentation, and continuous monitoring. This approach limits access to resources based on user roles, enforces granular security policies, and continuously monitors for abnormal behavior, ensuring that security is maintained even if one segment of the network is compromised. Zero Trust is designed to protect modern IT environments from evolving threats by focusing on securing data and resources, rather than just the network perimeter.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a zero trust network?", + "title": "What is a Zero Trust Network?", "url": "https://www.cloudflare.com/en-gb/learning/security/glossary/what-is-zero-trust/", "type": "article" }, { - "title": "Zero trust explained in 4 minutes", + "title": "Zero Trust Explained in 4 minutes", "url": "https://www.youtube.com/watch?v=yn6CPQ9RioA", "type": "video" } @@ -2039,9 +2100,14 @@ "description": "Compliance officers ensure that an organization adheres to legal, regulatory, and internal policies by proactively implementing controls, training employees, and mitigating risks. Auditors, both internal and external, assess the effectiveness of these controls and the accuracy of financial reporting through periodic evaluations, providing independent assurance to management and stakeholders. While compliance focuses on prevention and day-to-day adherence, auditors focus on verifying and evaluating past performance to ensure integrity and identify areas for improvement. Both roles work together to manage risk and maintain organizational accountability.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a compliance audit?", + "title": "What is a Compliance Audit?", "url": "https://www.auditboard.com/blog/compliance-audit/", "type": "article" + }, + { + "title": "Compliance Office and Internal Audit Roles and Responsibilities", + "url": "https://www.compliance.com/resources/compliance-office-and-internal-audit-roles-and-responsibilities/", + "type": "article" } ] }, @@ -2084,7 +2150,7 @@ }, "H38Vb7xvuBJXVzgPBdRdT": { "title": "Cyber Kill Chain", - "description": "The **Cyber Kill Chain** is a model that was developed by Lockheed Martin, a major aerospace, military support, and security company, to understand and prevent cyber intrusions in various networks and systems. It serves as a framework for breaking down the stages of a cyber attack, making it easier for security professionals to identify, mitigate, and prevent threats.\n\nThe concept is based on a military model, where the term \"kill chain\" represents a series of steps needed to successfully target and engage an adversary. In the context of cybersecurity, the model breaks down the stages of a cyber attack into seven distinct phases:\n\n* **Reconnaissance**: This initial phase involves gathering intelligence on the target, which may include researching public databases, performing network scans, or social engineering techniques.\n* **Weaponization**: In this stage, the attacker creates a weapon – such as a malware, virus, or exploit – and packages it with a delivery mechanism that can infiltrate the target's system.\n* **Delivery**: The attacker selects and deploys the delivery method to transmit the weapon to the target. Common methods include email attachments, malicious URLs, or infected software updates.\n* **Exploitation**: This is the phase where the weapon is activated, taking advantage of vulnerabilities in the target's systems or applications to execute the attacker's code.\n* **Installation**: Once the exploit is successful, the attacker installs the malware on the victim's system, setting the stage for further attacks or data exfiltration.\n* **Command and Control (C2)**: The attacker establishes a communication channel with the infected system, allowing them to remotely control the malware and conduct further actions.\n* **Actions on Objectives**: In this final phase, the attacker achieves their goal, which may involve stealing sensitive data, compromising systems, or disrupting services.\n\nLearn more from the following resources:", + "description": "The **Cyber Kill Chain** is a model that was developed by Lockheed Martin, a major aerospace, military support, and security company, to understand and prevent cyber intrusions in various networks and systems. It serves as a framework for breaking down the stages of a cyber attack, making it easier for security professionals to identify, mitigate, and prevent threats.\n\nLearn more from the following resources:", "links": [ { "title": "Cyber Kill Chain", @@ -2116,13 +2182,18 @@ }, "_S25EOGS3P8647zLM5i-g": { "title": "Operating System Hardening", - "description": "**Operating system hardening** involves configuring and securing an OS to reduce vulnerabilities and improve its defense against attacks. This process includes disabling unnecessary services and ports, applying security patches and updates, configuring strong authentication mechanisms, enforcing least privilege principles, and enabling firewalls and intrusion detection systems. Hardening also involves setting up proper file permissions, securing system logs, and regularly auditing the system to ensure compliance with security policies and best practices. The goal is to minimize the attack surface and protect the OS from potential threats and exploits.\n\nLearn more from the following resources", + "description": "**Operating system hardening** involves configuring and securing an OS to reduce vulnerabilities and improve its defense against attacks. This process includes disabling unnecessary services and ports, applying security patches and updates, configuring strong authentication mechanisms, enforcing least privilege principles, and enabling firewalls and intrusion detection systems. Hardening also involves setting up proper file permissions, securing system logs, and regularly auditing the system to ensure compliance with security policies and best practices. The goal is to minimize the attack surface and protect the OS from potential threats and exploits.\n\nLearn more from the following resources:", "links": [ { "title": "OS Hardening: 15 Best Practices", "url": "https://perception-point.io/guides/os-isolation/os-hardening-10-best-practices/", "type": "article" }, + { + "title": "Operating System (OS) Hardening: Pros, Cons, and Importance", + "url": "https://linfordco.com/blog/operating-system-hardening/", + "type": "article" + }, { "title": "Hardening Techniques", "url": "https://www.youtube.com/watch?v=wXoC46Qr_9Q", @@ -2263,7 +2334,7 @@ }, "M6uwyD4ibguxytf1od-og": { "title": "True Negative / True Positive", - "description": "True Negative / True Positive\n-----------------------------\n\nA True Positive occurs when a security system correctly identifies a genuine threat or malicious activity. It's an accurate alert that correctly detects an actual security incident. For example, an antivirus correctly flagging a file as malware. A True Negative is when a security system correctly identifies that there is no threat when indeed no threat exists. It's the system's accurate determination that normal, benign activity is not a security risk. For example, a firewall correctly allowing legitimate network traffic.\n\nBoth True Positives and True Negatives represent correct assessments by security systems, contributing to effective threat detection and minimizing false alarms. Balancing these with minimizing false positives and false negatives is crucial for optimal security system performance.\n\nLearn more from the following resources:", + "description": "A True Positive occurs when a security system correctly identifies a genuine threat or malicious activity. It's an accurate alert that correctly detects an actual security incident. For example, an antivirus correctly flagging a file as malware. A True Negative is when a security system correctly identifies that there is no threat when indeed no threat exists. It's the system's accurate determination that normal, benign activity is not a security risk. For example, a firewall correctly allowing legitimate network traffic.\n\nBoth True Positives and True Negatives represent correct assessments by security systems, contributing to effective threat detection and minimizing false alarms. Balancing these with minimizing false positives and false negatives is crucial for optimal security system performance.\n\nLearn more from the following resources:", "links": [ { "title": "False Positives and False Negatives in Information Security", @@ -2330,7 +2401,7 @@ "description": "Privilege escalation is a technique where an attacker increases their access level within a system, moving from lower to higher permissions, such as from a standard user to an administrator. This can be achieved by exploiting system vulnerabilities, misconfigurations, or security weaknesses. It is critical to implement strong access controls, adhere to the principle of least privilege, and regularly update and patch systems to defend against such attacks.\n\nVisit the following resources to learn more:", "links": [ { - "title": "What is privilege escalation?", + "title": "What is Privilege Escalation?", "url": "https://www.crowdstrike.com/cybersecurity-101/privilege-escalation/", "type": "article" }, @@ -2417,7 +2488,7 @@ }, "W7iQUCjODGYgE4PjC5TZI": { "title": "curl", - "description": "Curl is a versatile command-line tool primarily used for transferring data using various network protocols. It is widely used in cybersecurity and development for the purpose of testing and interacting with web services, APIs, and scrutinizing web application security. Curl supports various protocols such as HTTP, HTTPS, FTP, SCP, SFTP, and many more.\n\nLearn more from the following resources:", + "description": "cURL is a versatile command-line tool primarily used for transferring data using various network protocols. It is widely used in cybersecurity and development for the purpose of testing and interacting with web services, APIs, and scrutinizing web application security. Curl supports various protocols such as HTTP, HTTPS, FTP, SCP, SFTP, and many more.\n\nLearn more from the following resources:", "links": [ { "title": "What is the cURL command?", @@ -2483,6 +2554,11 @@ "title": "cat", "description": "`cat` is a widely used command-line utility in UNIX and UNIX-like systems. It stands for \"concatenate\" which, as the name suggests, can be used to concatenate files, display file contents, or combine files. In the context of incident response and discovery tools, `cat` plays an essential role in quickly accessing and assessing the contents of various files that inform on security incidents and help users understand system data as well as potential threats.\n\nLearn more from the following resources:", "links": [ + { + "title": "Cat Command in Linux", + "url": "https://linuxize.com/post/linux-cat-command/", + "type": "article" + }, { "title": "Linux cat command", "url": "https://phoenixnap.com/kb/linux-cat-command", @@ -2548,7 +2624,7 @@ "description": "Wireshark is a powerful, open-source network protocol analyzer used for real-time packet capture and analysis. It allows users to examine network traffic at a microscopic level, capturing and interactively browsing the traffic running on a computer network. Wireshark can decode a wide variety of network protocols, making it an essential tool for network troubleshooting, security analysis, software and protocol development, and education. It provides a user-friendly graphical interface and offers features like deep inspection of hundreds of protocols, live capture and offline analysis, and the ability to read/write many different capture file formats. Wireshark is widely used by IT professionals, security experts, and developers for diagnosing network issues and understanding network communication.\n\nLearn more from the following resources:", "links": [ { - "title": "Wireshark Website", + "title": "Wireshark", "url": "https://www.wireshark.org/", "type": "article" }, @@ -2569,7 +2645,7 @@ "description": "WinHex is a universal hexadecimal editor and disk editor primarily used for computer forensics and data recovery. It allows users to examine and edit the raw content of files, disks, or memory in hexadecimal and ASCII formats. WinHex provides advanced features for data analysis, including disk cloning, secure data erasure, and file system reconstruction. It supports various file systems and can work with physical disks, disk images, and RAM. Forensic experts use WinHex to investigate digital evidence, recover deleted files, and analyze data structures. While powerful, it requires careful use as it can directly manipulate raw data, potentially causing unintended changes to critical system files or data.\n\nLearn more from the following resources:", "links": [ { - "title": "WinHex Website", + "title": "WinHex", "url": "https://x-ways.net/winhex/", "type": "article" }, @@ -2727,6 +2803,11 @@ "title": "What is PKI?", "url": "https://cpl.thalesgroup.com/faq/public-key-infrastructure-pki/what-public-key-infrastructure-pki", "type": "article" + }, + { + "title": "What Is Public Key Infrastructure (PKI) & How Does It Work?", + "url": "https://www.okta.com/identity-101/public-key-infrastructure/", + "type": "article" } ] }, @@ -2849,7 +2930,7 @@ }, "fjEdufrZAfW4Rl6yDU8Hk": { "title": "RMF", - "description": "A **Risk Management Framework (RMF)** is a structured approach that organizations use to identify, assess, manage, and mitigate risks. It provides a systematic process to ensure that risks are effectively controlled and aligned with the organization's objectives. Key components include:\n\n1. **Risk Identification:** Identifying potential internal and external risks that could impact the organization.\n2. **Risk Assessment:** Evaluating the likelihood and impact of identified risks.\n3. **Risk Mitigation:** Developing strategies to reduce or eliminate risks, such as controls, policies, and contingency plans.\n4. **Risk Monitoring:** Continuously tracking risks and the effectiveness of mitigation measures.\n5. **Communication and Reporting:** Regularly updating stakeholders on the risk status and actions taken.\n6. **Review and Improvement:** Periodically reassessing the framework and adapting to changes in the business or regulatory environment.\n\nThe RMF ensures that risks are managed proactively and consistently across the organization, helping to safeguard assets and support strategic decision-making.\n\nLearn more from the following resources:", + "description": "A **Risk Management Framework (RMF)** is a structured approach that organizations use to identify, assess, manage, and mitigate risks. It provides a systematic process to ensure that risks are effectively controlled and aligned with the organization's objectives. Key components include:\n\n1. **Risk Identification:** Identifying potential internal and external risks that could impact the organization.\n2. **Risk Assessment:** Evaluating the likelihood and impact of identified risks.\n3. **Risk Mitigation:** Developing strategies to reduce or eliminate risks, such as controls, policies, and contingency plans.\n4. **Risk Monitoring:** Continuously tracking risks and the effectiveness of mitigation measures.\n5. **Communication and Reporting:** Regularly updating stakeholders on the risk status and actions taken.\n6. **Review and Improvement:** Periodically reassessing the framework and adapting to changes in the business or regulatory environment.\n\nLearn more from the following resources:", "links": [ { "title": "What is the Risk Management Framework?", @@ -2868,7 +2949,7 @@ "description": "The **Center for Internet Security (CIS)** is a non-profit organization that focuses on enhancing the cybersecurity posture of individuals, organizations, and governments around the world. CIS offers various tools, best practices, guidelines, and frameworks that help in defending against common cyber threats.\n\nLearn more from the following resources:", "links": [ { - "title": "CIS Website", + "title": "CIS", "url": "https://www.cisecurity.org/", "type": "article" }, @@ -2950,6 +3031,16 @@ "title": "ParrotOS", "url": "https://parrotsec.org/", "type": "article" + }, + { + "title": "ParrotOS Documentation", + "url": "https://parrotsec.org/docs", + "type": "article" + }, + { + "title": "ParrotOS Downloads", + "url": "https://parrotsec.org/download", + "type": "article" } ] }, @@ -3099,8 +3190,19 @@ }, "W7bcydXdwlubXF2PHKOuq": { "title": "Port Blocking", - "description": "Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches.", - "links": [] + "description": "Port blocking is an essential practice in hardening the security of your network and devices. It involves restricting, filtering, or entirely denying access to specific network ports to minimize exposure to potential cyber threats. By limiting access to certain ports, you can effectively safeguard your systems against unauthorized access and reduce the likelihood of security breaches.\n\nLearn more from the following resources:", + "links": [ + { + "title": "What is Port Blocking?", + "url": "https://cyberpedia.reasonlabs.com/EN/port%20blocking.html", + "type": "article" + }, + { + "title": "Is Your Router Blocking Your Ports? Here's How to Find Out?", + "url": "https://softhandtech.com/how-can-i-tell-if-a-port-is-blocked-on-my-router/", + "type": "article" + } + ] }, "FxuMJmDoDkIsPFp2iocFg": { "title": "Group Policy", @@ -3534,12 +3636,12 @@ "description": "The **Preparation** phase in incident response involves establishing and maintaining the tools, policies, and procedures necessary to handle security incidents effectively. This includes creating an incident response plan, defining roles and responsibilities, training staff, and ensuring that appropriate technologies, such as monitoring systems and logging tools, are in place to detect and respond to incidents. Preparation also involves conducting regular drills, threat intelligence gathering, and vulnerability assessments to enhance readiness, ensuring the organization is equipped to mitigate potential security threats quickly and efficiently.\n\nLearn more from the following resources:", "links": [ { - "title": "", + "title": "What is Incident Response", "url": "https://www.microsoft.com/en-gb/security/business/security-101/what-is-incident-response", "type": "article" }, { - "title": "", + "title": "Cyber Security Incident Response Explained", "url": "https://www.youtube.com/watch?v=ePZGqlcB1O8", "type": "video" } @@ -3566,7 +3668,7 @@ "description": "Containment in cybersecurity refers to the process of limiting the impact of a security incident by isolating affected systems, networks, or data to prevent further spread or damage. When a breach or malware infection is detected, containment strategies are quickly implemented to halt the attack's progress, often by disconnecting compromised systems from the network, blocking malicious traffic, or restricting user access. Containment is a critical step in incident response, allowing security teams to control the situation while they investigate the root cause, assess the extent of the breach, and prepare for remediation. Effective containment minimizes the potential harm to the organization, preserving the integrity of unaffected systems and data.\n\nLearn more from the following resources:", "links": [ { - "title": "Microsoft security incident management: Containment, eradication, and recovery", + "title": "Microsoft Security Incident Management: Containment, Eradication, and Recovery", "url": "https://learn.microsoft.com/en-us/compliance/assurance/assurance-sim-containment-eradication-recovery", "type": "article" }, @@ -3667,13 +3769,13 @@ "description": "VirusTotal's main feature is multi-scanning using over 70 antivirus scanners to generate a cumulative report on whether a file is malicious. It also stores file hashes, eliminating the need to rescan previously uploaded files. Researchers can comment in the community, sharing their analysis and insights into malware for others to benefit from. VirusTotal's aggregated data comes from various antivirus engines, website scanners, file and URL analysis tools, and user contributions. These tools serve diverse purposes, including heuristic engines, known-bad signatures, metadata extraction, and identification of malicious signals. Additionally, VirusTotal offers services to search by file hash, IP address, and URL, which are also scanned. For more comprehensive features, VirusTotal provides Premium services such as Intelligence & Hunting.\n\nVisit the following resources to learn more:", "links": [ { - "title": "VirusTotal's Docs on how VirusTotal Works", - "url": "https://docs.virustotal.com/docs/how-it-works", + "title": "VirusTotal", + "url": "https://www.virustotal.com", "type": "article" }, { - "title": "VirusTotal's website", - "url": "https://www.virustotal.com", + "title": "How VirusTotal Works", + "url": "https://docs.virustotal.com/docs/how-it-works", "type": "article" }, { @@ -3863,7 +3965,7 @@ "description": "In a Shoulder Surfing Attack, an attacker tries to get information when you are unaware of where the attacker looks over your shoulder or from your back to see what you're doing on your device and obtain sensitive information. Shoulder Surfing attacks are accomplished by observing the content \"over the victim's shoulder\". It is a social engineering attack where the attackers physically view the device screen and keypad to obtain personal information. This attack is mostly done when you are in a public place or crowded area. Sometimes attackers attack when you are busy on your device and the attacker could be your friend, someone you know or it may be some stranger.\n\nVisit the following resources to learn more:", "links": [ { - "title": "What is shoulder surfing, and how can you avoid it?", + "title": "What is Shoulder Surfing, and How can you avoid it?", "url": "https://nordvpn.com/blog/shoulder-surfing/?srsltid=AfmBOorl5NPpW_Tnhas9gB2HiblorqwXyK0NJae7uaketrnDwbjJmiYV", "type": "article" }, @@ -3945,12 +4047,17 @@ }, "UU_inxa8Y2lLP2BRhdLDT": { "title": "Reconnaissance", - "description": "Reconnaissance is the first phase of a cyberattack, during which attackers gather as much information as possible about a target system, network, or organization. The goal of reconnaissance is to identify potential vulnerabilities, entry points, and other valuable details that can be exploited in subsequent attack phases.\n\nVisit the following resources to learn more:", + "description": "Reconnaissance is the first phase of a cyber-attack, during which attackers gather as much information as possible about a target system, network, or organization. The goal of reconnaissance is to identify potential vulnerabilities, entry points, and other valuable details that can be exploited in subsequent attack phases.\n\nVisit the following resources to learn more:", "links": [ { "title": "What is Cyber Reconnaissance", "url": "https://www.sentinelone.com/cybersecurity-101/threat-intelligence/what-is-cyber-reconnaissance/", "type": "article" + }, + { + "title": "What is Cybersecurity Reconnaissance?", + "url": "https://cymulate.com/cybersecurity-glossary/cyber-reconnaissance/", + "type": "article" } ] }, @@ -3970,7 +4077,7 @@ "description": "Watering Hole Attack is a type of cyberattack where the attacker targets a specific group of users by compromising a website or online resource that they are known to frequently visit. The name \"watering hole\" comes from the idea of predators waiting by a water source to attack prey, similar to how attackers wait for their targets to visit a compromised site.\n\nVisit the following resources to learn more:", "links": [ { - "title": "What is a watering hole attack?", + "title": "What is a Watering Hole Attack?", "url": "https://www.techtarget.com/searchsecurity/definition/watering-hole-attack", "type": "article" }, @@ -4135,9 +4242,14 @@ "description": "A Rogue Access Point (Rogue AP) is an unauthorized wireless access point installed on a secure network without the network administrator's knowledge or consent. These devices can be set up by malicious actors to intercept, steal, or manipulate network traffic, or by employees who unintentionally compromise network security by setting up their own wireless access points.\n\nVisit the following resources to learn more:", "links": [ { - "title": "Rogue access points", + "title": "Rogue Access Points", "url": "https://www.khanacademy.org/computing/computers-and-internet/xcae6f4a7ff015e7d:online-data-security/xcae6f4a7ff015e7d:cyber-attacks/a/rogue-access-points-mitm-attacks", "type": "article" + }, + { + "title": "What is Rogue Access Point", + "url": "https://pentescope.com/rogue-access-point-detection-and-prevention/", + "type": "article" } ] }, @@ -4384,7 +4496,7 @@ "type": "article" }, { - "title": "What cloud skills are essential?", + "title": "What Cloud Skills are Essential?", "url": "https://www.youtube.com/watch?v=udKBDRcj178", "type": "video" } @@ -4395,7 +4507,12 @@ "description": "Cloud security encompasses the measures, controls, policies, and technologies implemented to protect data, applications, and infrastructure associated with cloud computing environments. It involves securing data both in transit and at rest, managing access controls, ensuring compliance with regulations, and protecting against threats like data breaches, account hijacking, and DDoS attacks. Cloud security strategies often include encryption, multi-factor authentication, regular security audits, and shared responsibility models between cloud providers and customers. While cloud platforms offer advanced security features, organizations must also adapt their security practices to address the unique challenges of cloud environments, such as data sovereignty issues, shared infrastructure risks, and the need for continuous monitoring across distributed systems.\n\nLearn more from the following resources:", "links": [ { - "title": "What is cloud security", + "title": "What Is Cloud Security? - Google Cloud", + "url": "https://cloud.google.com/learn/what-is-cloud-security", + "type": "article" + }, + { + "title": "Cloud Security", "url": "https://www.checkpoint.com/cyber-hub/cloud-security/what-is-cloud-security/", "type": "article" }, @@ -4411,7 +4528,7 @@ "description": "Deploying to the cloud involves the process of making applications, services, or infrastructure available in cloud computing environments. It typically includes selecting a cloud provider (e.g., AWS, Azure, Google Cloud), configuring necessary resources (compute, storage, networking), and using deployment tools to push code or infrastructure definitions. Modern cloud deployments often leverage containerization, orchestration platforms like Kubernetes, and CI/CD pipelines for automated, consistent releases. Key considerations include scalability, security, cost optimization, and maintaining high availability. Cloud-native approaches, such as microservices architecture and serverless computing, are frequently employed to maximize cloud benefits. Effective cloud deployment strategies balance performance, reliability, and cost-efficiency while ensuring compliance with relevant regulations and organizational policies.\n\nLearn more from the following resources:", "links": [ { - "title": "What is cloud deployment?", + "title": "What is Cloud Deployment?", "url": "https://www.cognizant.com/us/en/glossary/cloud-deployment", "type": "article" }, @@ -4443,9 +4560,24 @@ "description": "Infrastructure as Code (IaC) is a practice of managing and provisioning computing infrastructure through machine-readable definition files, rather than physical hardware configuration or interactive configuration tools. It treats infrastructure configuration as software, allowing it to be version-controlled, tested, and automatically deployed. IaC enables consistent, repeatable environment setups, reduces manual errors, facilitates rapid scaling and disaster recovery, and improves collaboration between development and operations teams. Popular IaC tools include Terraform, AWS CloudFormation, and Ansible, which use declarative or imperative approaches to define infrastructure states. This approach is fundamental to DevOps practices, cloud computing, and the efficient management of complex, dynamic IT environments.\n\nLearn more from the following resources:", "links": [ { - "title": "Terraform Roadmap", + "title": "Visit Dedicated Terraform Roadmap", "url": "https://roadmap.sh/terraform", "type": "article" + }, + { + "title": "Visit Dedicated AWS Roadmap", + "url": "https://roadmap.sh/aws", + "type": "article" + }, + { + "title": "What is Infrastructure as Code? - IaC Explained - AWS", + "url": "https://aws.amazon.com/what-is/iac/", + "type": "article" + }, + { + "title": "What is infrastructure as code (IaC)? - Azure DevOps", + "url": "https://learn.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code", + "type": "article" } ] }, @@ -4454,7 +4586,7 @@ "description": "Serverless computing is a cloud execution model where the cloud provider dynamically manages server allocation, allowing developers to focus solely on writing code. It offers automatic scaling, pay-per-use billing based on actual compute time, and typically operates through event-driven, stateless functions designed for quick execution. Popular platforms include AWS Lambda, Azure Functions, and Google Cloud Functions. While serverless computing provides reduced operational complexity and cost efficiency, particularly for microservices and event-driven applications, it may face challenges with long-running tasks, cold starts, and potential vendor lock-in. Despite its name, servers are still involved, but their management is abstracted away from the developer, simplifying the deployment and scaling of applications.\n\nLearn more from the following resources:", "links": [ { - "title": "What is serverless computing?", + "title": "What is Serverless Computing?", "url": "https://www.cloudflare.com/en-gb/learning/serverless/what-is-serverless/", "type": "article" }, @@ -4470,7 +4602,7 @@ "description": "Software as a Service (SaaS) is a cloud-based model where software applications are delivered to users over the internet, eliminating the need for local installation or maintenance. SaaS providers manage infrastructure, security, and updates, allowing users to access the software on a subscription basis from any device with an internet connection. This model offers scalability, reduced upfront costs, and easy integration with other cloud services, making it a popular choice for businesses looking for flexibility and efficiency in software deployment.\n\nLearn more from the following resources:", "links": [ { - "title": "iWhat is SaaS? Microsoft", + "title": "Software as a Service?", "url": "https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is-saas", "type": "article" }, @@ -4518,12 +4650,12 @@ "description": "A **private cloud** is a cloud computing environment dedicated to a single organization, offering the same benefits as public clouds, such as scalability and self-service, but with greater control and customization. It is hosted either on-premises or by a third-party provider, and it ensures that the organization's data and applications are isolated from other entities. This setup enhances security and compliance, making it ideal for businesses with specific regulatory requirements or high-security needs.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a private cloud?", + "title": "What is a Private Cloud?", "url": "https://aws.amazon.com/what-is/private-cloud/", "type": "article" }, { - "title": "Private cloud rules", + "title": "Private Cloud Rules", "url": "https://www.youtube.com/watch?v=Tzqy8lW0bk4", "type": "video" } @@ -4534,12 +4666,12 @@ "description": "A **public cloud** is a computing service offered by third-party providers over the internet, where resources such as servers, storage, and applications are shared among multiple users or organizations. It is typically managed by the cloud service provider and offers scalability, cost-effectiveness, and ease of access, with users paying only for the resources they consume. Public clouds are ideal for businesses and individuals who need flexible, on-demand computing resources without the overhead of managing physical infrastructure. Popular examples include Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform (GCP).\n\nLearn more from the following resources:", "links": [ { - "title": "What is a public cloud? Microsoft", + "title": "A Public Cloud?", "url": "https://azure.microsoft.com/en-gb/resources/cloud-computing-dictionary/what-is-a-public-cloud", "type": "article" }, { - "title": "What is a public cloud?", + "title": "What is a Public Cloud", "url": "https://www.youtube.com/watch?v=KaCyfQ7luVY", "type": "video" } @@ -4634,8 +4766,13 @@ "description": "Amazon Simple Storage Service (S3) is a scalable, object-based cloud storage service provided by AWS. It allows users to store and retrieve large amounts of data, such as files, backups, or media content, with high durability and availability. S3 is designed for flexibility, enabling users to access data from anywhere via the internet while offering security features like encryption and access controls. It is widely used for data storage, content distribution, disaster recovery, and big data analytics, providing cost-effective, scalable storage for a variety of applications.\n\nLearn more from the following resources:", "links": [ { - "title": "AWS S3 Website", - "url": "https://aws.amazon.com/pm/serv-s3/?gclid=Cj0KCQjwrp-3BhDgARIsAEWJ6SyhAtgc3NJbsxaAXVbWEOW5gG-XFH51jIc8SxahYSxNJ501l9soUA0aAnEjEALw_wcB&trk=777b3ec4-de01-41fb-aa63-cde3d034a89e&sc_channel=ps&ef_id=Cj0KCQjwrp-3BhDgARIsAEWJ6SyhAtgc3NJbsxaAXVbWEOW5gG-XFH51jIc8SxahYSxNJ501l9soUA0aAnEjEALw_wcB:G:s&s_kwcid=AL!4422!3!638364429346!e!!g!!aws%20s3!19096959014!142655567183", + "title": "Amazon Web Services S3", + "url": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html", + "type": "article" + }, + { + "title": "Amazon Simple Storage Service Documentation", + "url": "https://docs.aws.amazon.com/s3/", "type": "article" }, { @@ -4677,7 +4814,7 @@ "description": "**OneDrive** is a cloud storage service provided by Microsoft that allows users to store, sync, and share files and folders online. It integrates seamlessly with Windows and Microsoft 365 applications, enabling users to access their data from any device with an internet connection. OneDrive offers features such as real-time collaboration, file versioning, and automatic backup, making it convenient for personal and professional use. It also provides options for sharing files with others and controlling access permissions, enhancing productivity and data management.\n\nLearn more from the following resources:", "links": [ { - "title": "OneDrive Website", + "title": "Microsoft OneDrive", "url": "https://onedrive.live.com", "type": "article" }, @@ -4712,8 +4849,39 @@ }, "_RnuQ7952N8GWZfPD60sJ": { "title": "Programming Skills", - "description": "Programming knowledge is a fundamental skill for professionals in the cybersecurity field, as it enables them to build, assess, and defend computer systems, networks, and applications. Having a strong foundation in programming languages, concepts, and techniques is essential for identifying potential security threats, writing secure code, and implementing robust security measures.\n\n* **Python**: As an easy-to-learn high-level language, Python is commonly used for tasks like automation, scripting, and data analysis. It also contains a plethora of libraries and frameworks for cybersecurity, making it highly valuable for security professionals.\n* **C/C++**: These two languages are foundational for understanding system and application-level vulnerabilities since most operating systems are written in C and C++. Knowledge of these languages allows cybersecurity experts to analyze source code, identify potential exploits, and create secure software.\n* **Java**: As a popular and versatile programming language, Java is often used in web applications and enterprise environments. Java knowledge equips cybersecurity professionals to understand and mitigate potential security flaws in Java-based applications.\n* **JavaScript**: With its ubiquity in modern web browsers, JavaScript is crucial for understanding and protecting against web security vulnerabilities, such as Cross-Site Scripting (XSS) and Cross-Site Request Forgery (CSRF) attacks.\n* **Ruby**: Ruby has a strong foothold in web application development and is utilized for scripting and automation, just like Python. Familiarity with Ruby may give cybersecurity professionals an edge in certain environments.\n\nAcquiring programming knowledge in cybersecurity can help you stay on top of the latest threats, develop secure software, and implement effective countermeasures. As you progress in your cybersecurity career, you'll find that your programming skills will continually evolve and your understanding of various languages, concepts, and techniques will expand.", - "links": [] + "description": "Programming knowledge is a fundamental skill for professionals in the cybersecurity field, as it enables them to build, assess, and defend computer systems, networks, and applications. Having a strong foundation in programming languages, concepts, and techniques is essential for identifying potential security threats, writing secure code, and implementing robust security measures.\n\n* **Python**: As an easy-to-learn high-level language, Python is commonly used for tasks like automation, scripting, and data analysis. It also contains a plethora of libraries and frameworks for cybersecurity, making it highly valuable for security professionals.\n* **C/C++**: These two languages are foundational for understanding system and application-level vulnerabilities since most operating systems are written in C and C++. Knowledge of these languages allows cybersecurity experts to analyze source code, identify potential exploits, and create secure software.\n* **Java**: As a popular and versatile programming language, Java is often used in web applications and enterprise environments. Java knowledge equips cybersecurity professionals to understand and mitigate potential security flaws in Java-based applications.\n* **JavaScript**: With its ubiquity in modern web browsers, JavaScript is crucial for understanding and protecting against web security vulnerabilities, such as Cross-Site Scripting (XSS) and Cross-Site Request Forgery (CSRF) attacks.\n* **Ruby**: Ruby has a strong foothold in web application development and is utilized for scripting and automation, just like Python. Familiarity with Ruby may give cybersecurity professionals an edge in certain environments.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Visit Linux Roadmap", + "url": "https://roadmap.sh/linux", + "type": "article" + }, + { + "title": "Visit Python Roadmap", + "url": "https://roadmap.sh/python", + "type": "article" + }, + { + "title": "Visit C++ Roadmap", + "url": "https://roadmap.sh/cpp", + "type": "article" + }, + { + "title": "Visit Java Roadmap", + "url": "https://roadmap.sh/java", + "type": "article" + }, + { + "title": "Visit JavaScript Roadmap", + "url": "https://roadmap.sh/javascript", + "type": "article" + }, + { + "title": "Visit Typescript Roadmap", + "url": "https://roadmap.sh/typescript", + "type": "article" + } + ] }, "XiHvGy--OkPFfJeKA6-LP": { "title": "Python", @@ -4725,7 +4893,7 @@ "type": "course" }, { - "title": "Python Roadmap", + "title": "Visit Dedicated Python Roadmap", "url": "https://roadmap.sh/python", "type": "article" }, @@ -4783,14 +4951,19 @@ "description": "C++ is a widely-used, high-level programming language that evolved from the earlier C programming language. Developed by Bjarne Stroustrup in 1985 at Bell Labs, C++ provides object-oriented features and low-level memory manipulation, making it an essential language for many fields, including game development, high-performance systems, and cybersecurity.\n\nLearn more form the following resources:", "links": [ { - "title": "C++ Full Course - BroCode", - "url": "https://www.youtube.com/watch?v=-TkoO8Z07hI", - "type": "course" + "title": "Visit Dedicated C++ Roadmap", + "url": "https://roadmap.sh/cpp", + "type": "article" }, { "title": "C++ Introduction", "url": "https://www.w3schools.com/cpp/cpp_intro.asp", "type": "article" + }, + { + "title": "C++ Full Course - BroCode", + "url": "https://www.youtube.com/watch?v=-TkoO8Z07hI", + "type": "video" } ] }, @@ -4835,7 +5008,7 @@ "type": "article" }, { - "title": "Microsoft's Official PowerShell Documentation", + "title": "Microsoft's PowerShell Documentation", "url": "https://docs.microsoft.com/en-us/powershell/", "type": "article" }, diff --git a/public/roadmap-content/react.json b/public/roadmap-content/react.json index 6e7fb25d8..d187c636b 100644 --- a/public/roadmap-content/react.json +++ b/public/roadmap-content/react.json @@ -674,41 +674,6 @@ "title": "React Router — Official Website", "url": "https://reactrouter.com/", "type": "article" - }, - { - "title": "Getting Started Guide", - "url": "https://reactrouter.com/en/main/start/tutorial", - "type": "article" - }, - { - "title": "How to use React Router v6", - "url": "https://www.robinwieruch.de/react-router/", - "type": "article" - }, - { - "title": "React Router Cheat Sheet", - "url": "https://devhints.io/react-router/", - "type": "article" - }, - { - "title": "Explore top posts about React", - "url": "https://app.daily.dev/tags/react?ref=roadmapsh", - "type": "article" - }, - { - "title": "Tanstack/Router — Official Website", - "url": "https://tanstack.com/router/latest/docs/framework/react/overview", - "type": "article" - }, - { - "title": "React Router v6 in 1 hour", - "url": "https://youtu.be/0cSVuySEB0A", - "type": "video" - }, - { - "title": "TanStack/Router - Complete Course", - "url": "https://www.youtube.com/watch?v=4sslBg8LprE&list=PLOQjd5dsGSxJilh0lBofeY8Qib98kzmF5", - "type": "video" } ] }, From bb0df94afa43b6f7cb7ebca219488bffcf98bf19 Mon Sep 17 00:00:00 2001 From: Vedansh Date: Sat, 26 Apr 2025 13:43:05 +0530 Subject: [PATCH 07/31] fix: topic links and content (#8536) --- ...learn-how-malware-works-and-types@v7CD_sHqLWbm9ibXXESIK.md | 3 ++- .../cyber-security/content/legal@C5bCIdPi0gGkY_r4qqoXZ.md | 2 +- .../cyber-security/content/linux@4frVcjYI1VlVU9hQgpwcT.md | 2 +- .../content/local-auth@vYvFuz7lAJXZ1vK_4999a.md | 3 +++ .../cyber-security/content/lolbas@10qbxX8DCrfyH7tgYexxQ.md | 2 +- .../cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md | 2 +- .../cyber-security/content/macos@dztwr-DSckggQbcNIi4_2.md | 3 +-- .../cyber-security/content/memdump@wspNQPmqWRjKoFm6x_bVw.md | 2 +- .../content/memory-leak@nOND14t7ISgSH3zNpV3F8.md | 2 ++ .../cyber-security/content/mesh@PYeF15e7iVB9seFrrO7W6.md | 4 ++-- .../cyber-security/content/mitm@ODlVT6MhV-RVUbRMG0mHi.md | 2 +- .../cyber-security/content/nac-based@6oAzYfwsHQYNVbi7c2Tly.md | 2 +- .../cyber-security/content/netflow@xXz-SwvXA2cLfdCd-hLtW.md | 2 +- .../cyber-security/content/nids@LIPtxl_oKZRcbvXT4EdNf.md | 1 + .../cyber-security/content/nist@SOkJUTd1NUKSwYMIprv4m.md | 2 +- .../cyber-security/content/nmap@Hoou7kWyfB2wx_yFHug_H.md | 4 ++-- .../cyber-security/content/ntp@tf0TymdPHbplDHvuVIIh4.md | 3 +-- 17 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/data/roadmaps/cyber-security/content/learn-how-malware-works-and-types@v7CD_sHqLWbm9ibXXESIK.md b/src/data/roadmaps/cyber-security/content/learn-how-malware-works-and-types@v7CD_sHqLWbm9ibXXESIK.md index abac13777..e5e3117e8 100644 --- a/src/data/roadmaps/cyber-security/content/learn-how-malware-works-and-types@v7CD_sHqLWbm9ibXXESIK.md +++ b/src/data/roadmaps/cyber-security/content/learn-how-malware-works-and-types@v7CD_sHqLWbm9ibXXESIK.md @@ -34,4 +34,5 @@ A rootkit is a type of malware designed to hide or obscure the presence of other Keyloggers are a type of malware that monitor and record users' keystrokes, allowing attackers to capture sensitive information, such as login credentials or financial information entered on a keyboard. -Understanding the different types of malware can help you better identify and protect against various cyber threats. As the cyber landscape continues to evolve, it's essential to stay informed about emerging malware and equip yourself with the necessary security skills and knowledge. +Learn more from the following resources: + diff --git a/src/data/roadmaps/cyber-security/content/legal@C5bCIdPi0gGkY_r4qqoXZ.md b/src/data/roadmaps/cyber-security/content/legal@C5bCIdPi0gGkY_r4qqoXZ.md index bcbfe0edb..37d81e395 100644 --- a/src/data/roadmaps/cyber-security/content/legal@C5bCIdPi0gGkY_r4qqoXZ.md +++ b/src/data/roadmaps/cyber-security/content/legal@C5bCIdPi0gGkY_r4qqoXZ.md @@ -4,5 +4,5 @@ A legal department within an organization is responsible for handling all legal Learn more from the following resources: -- [@article@Key functions of a legal team](https://uk.practicallaw.thomsonreuters.com/w-009-3932?transitionType=Default&contextData=(sc.Default)&firstPage=true) +- [@article@Key Functions of a Legal Team](https://uk.practicallaw.thomsonreuters.com/w-009-3932?transitionType=Default&contextData=(sc.Default)&firstPage=true) - [@article@The Legal Team’s Responsibility in Corporate Cybersecurity](https://www.trustwave.com/en-us/resources/blogs/trustwave-blog/expert-insight-the-legal-teams-responsibility-in-corporate-cybersecurity/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/linux@4frVcjYI1VlVU9hQgpwcT.md b/src/data/roadmaps/cyber-security/content/linux@4frVcjYI1VlVU9hQgpwcT.md index 90c00b8dd..e341bb22a 100644 --- a/src/data/roadmaps/cyber-security/content/linux@4frVcjYI1VlVU9hQgpwcT.md +++ b/src/data/roadmaps/cyber-security/content/linux@4frVcjYI1VlVU9hQgpwcT.md @@ -4,7 +4,7 @@ Linux is an open-source, Unix-like operating system kernel first released by Lin Learn more from the following resources: -- [@roadmap@Linux Roadmap](https://roadmap.sh/linux) +- [@roadmap@Visit Linux Roadmap](https://roadmap.sh/linux) - [@article@Linux Commands Cheat Sheet](https://cdn.hostinger.com/tutorials/pdf/Linux-Commands-Cheat-Sheet.pdf) - [@course@Linux from scratch - Cisco](https://www.netacad.com/courses/os-it/ndg-linux-unhatched) - [@video@Linux in 100 Seconds](https://www.youtube.com/watch?v=rrB13utjYV4) diff --git a/src/data/roadmaps/cyber-security/content/local-auth@vYvFuz7lAJXZ1vK_4999a.md b/src/data/roadmaps/cyber-security/content/local-auth@vYvFuz7lAJXZ1vK_4999a.md index fb4ae3205..0d4ff433e 100644 --- a/src/data/roadmaps/cyber-security/content/local-auth@vYvFuz7lAJXZ1vK_4999a.md +++ b/src/data/roadmaps/cyber-security/content/local-auth@vYvFuz7lAJXZ1vK_4999a.md @@ -2,3 +2,6 @@ Local authentication refers to the process of verifying a user's identity on a specific device or system without relying on external servers or networks. It typically involves storing and checking credentials directly on the device itself. Common methods include username/password combinations, biometrics (fingerprint, face recognition), or PIN codes. Local authentication is often used for device access, offline applications, or as a fallback when network-based authentication is unavailable. While it offers quick access and works without internet connectivity, it can be less secure than centralized authentication systems and more challenging to manage across multiple devices. Local authentication is commonly used in personal devices, standalone systems, and scenarios where network-based authentication is impractical or unnecessary. +Learn more from the following resources: + +- [@article@Local authentication, registration, and other settings](https://learn.microsoft.com/en-us/power-pages/security/authentication/set-authentication-identity) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/lolbas@10qbxX8DCrfyH7tgYexxQ.md b/src/data/roadmaps/cyber-security/content/lolbas@10qbxX8DCrfyH7tgYexxQ.md index 779ccd1f7..a63b60309 100644 --- a/src/data/roadmaps/cyber-security/content/lolbas@10qbxX8DCrfyH7tgYexxQ.md +++ b/src/data/roadmaps/cyber-security/content/lolbas@10qbxX8DCrfyH7tgYexxQ.md @@ -4,6 +4,6 @@ Learn more from the following resources: -- [@official@LOLBAS project](https://lolbas-project.github.io/#) +- [@official@LOLBAS Project](https://lolbas-project.github.io/#) - [@article@Understanding the risks of LOLBAS in security](https://pentera.io/blog/the-lol-isnt-so-funny-when-it-bites-you-in-the-bas/) - [@video@LOLBAS T1105, MS Process Abuse](https://www.youtube.com/watch?v=fq2_VvAU29g) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md b/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md index 0402b583c..50aaf08dc 100644 --- a/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md +++ b/src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md @@ -4,4 +4,4 @@ Learn more from the following resources: -- [@article@Understanding the loopback address and loopback interfaces](https://study-ccna.com/loopback-interface-loopback-address/) \ No newline at end of file +- [@article@Understanding the Loopback Address and Loopback Interfaces](https://study-ccna.com/loopback-interface-loopback-address/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/macos@dztwr-DSckggQbcNIi4_2.md b/src/data/roadmaps/cyber-security/content/macos@dztwr-DSckggQbcNIi4_2.md index 52294149a..298d66abc 100644 --- a/src/data/roadmaps/cyber-security/content/macos@dztwr-DSckggQbcNIi4_2.md +++ b/src/data/roadmaps/cyber-security/content/macos@dztwr-DSckggQbcNIi4_2.md @@ -4,6 +4,5 @@ Learn more from the following resources: -- [@official@MacOS Website](https://www.apple.com/uk/macos/macos-sequoia/) +- [@official@macOS](https://www.apple.com/macos/macos-sequoia/) - [@video@Mac Tutorial for Beginners 2024](https://www.youtube.com/watch?v=3jeeFc2Vo1U) - diff --git a/src/data/roadmaps/cyber-security/content/memdump@wspNQPmqWRjKoFm6x_bVw.md b/src/data/roadmaps/cyber-security/content/memdump@wspNQPmqWRjKoFm6x_bVw.md index 85958f6f7..5d71ccba1 100644 --- a/src/data/roadmaps/cyber-security/content/memdump@wspNQPmqWRjKoFm6x_bVw.md +++ b/src/data/roadmaps/cyber-security/content/memdump@wspNQPmqWRjKoFm6x_bVw.md @@ -5,4 +5,4 @@ Learn more from the following resources: - [@official@memdump](https://www.kali.org/tools/memdump/) - +- [@opensource@memdump - Github](https://github.com/tchebb/memdump) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/memory-leak@nOND14t7ISgSH3zNpV3F8.md b/src/data/roadmaps/cyber-security/content/memory-leak@nOND14t7ISgSH3zNpV3F8.md index d019f1781..087125a93 100644 --- a/src/data/roadmaps/cyber-security/content/memory-leak@nOND14t7ISgSH3zNpV3F8.md +++ b/src/data/roadmaps/cyber-security/content/memory-leak@nOND14t7ISgSH3zNpV3F8.md @@ -2,5 +2,7 @@ A Memory Leak occurs when a computer program consumes memory but fails to release it back to the operating system after it is no longer needed. Over time, this can lead to reduced system performance, increased memory usage, and, in severe cases, the program or system may crash due to the exhaustion of available memory. +Learn more from the following resources: + - [@article@What are memory leaks?](https://learn.snyk.io/lesson/memory-leaks/) - [@video@What are memory leaks?](https://www.youtube.com/watch?v=00Kdpgl6fsY) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/mesh@PYeF15e7iVB9seFrrO7W6.md b/src/data/roadmaps/cyber-security/content/mesh@PYeF15e7iVB9seFrrO7W6.md index a2b53fb78..cfc758429 100644 --- a/src/data/roadmaps/cyber-security/content/mesh@PYeF15e7iVB9seFrrO7W6.md +++ b/src/data/roadmaps/cyber-security/content/mesh@PYeF15e7iVB9seFrrO7W6.md @@ -4,5 +4,5 @@ Mesh topology is a network architecture where devices or nodes are interconnecte Learn more from the following resources: -- [@article@What is mesh topology?](https://www.lenovo.com/gb/en/glossary/mesh-topology) -- [@article@Mesh topology explained](https://www.computerhope.com/jargon/m/mesh.htm) +- [@article@What is Mesh Topology?](https://www.lenovo.com/gb/en/glossary/mesh-topology) +- [@article@Mesh Topology explained](https://www.computerhope.com/jargon/m/mesh.htm) diff --git a/src/data/roadmaps/cyber-security/content/mitm@ODlVT6MhV-RVUbRMG0mHi.md b/src/data/roadmaps/cyber-security/content/mitm@ODlVT6MhV-RVUbRMG0mHi.md index 20dbc302f..41c55468e 100644 --- a/src/data/roadmaps/cyber-security/content/mitm@ODlVT6MhV-RVUbRMG0mHi.md +++ b/src/data/roadmaps/cyber-security/content/mitm@ODlVT6MhV-RVUbRMG0mHi.md @@ -4,4 +4,4 @@ A Man-in-the-Middle (MITM) attack occurs when a malicious actor intercepts commu Visit the following resources to learn more: -- [@article@Wikipedia - Man-in-the-middle attack](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) \ No newline at end of file +- [@article@Man-in-the-middle attack](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/nac-based@6oAzYfwsHQYNVbi7c2Tly.md b/src/data/roadmaps/cyber-security/content/nac-based@6oAzYfwsHQYNVbi7c2Tly.md index be1c840b3..fde4671cc 100644 --- a/src/data/roadmaps/cyber-security/content/nac-based@6oAzYfwsHQYNVbi7c2Tly.md +++ b/src/data/roadmaps/cyber-security/content/nac-based@6oAzYfwsHQYNVbi7c2Tly.md @@ -2,7 +2,7 @@ Network Access Control (NAC) based hardening is a crucial component in enhancing the security of your network infrastructure. NAC provides organizations with the ability to control and manage access to the network resources, ensuring that only authorized users and devices can connect to the network. It plays a vital role in reducing the attack surface and preventing unauthorized access to sensitive data and resources. By implementing NAC-based hardening in your cybersecurity strategy, you protect your organization from threats and maintain secure access to critical resources. -Learn more from the following resouces: +Learn more from the following resources: - [@video@Network Access Control](https://www.youtube.com/watch?v=hXeFJ05J4pQ) - [@article@What is Network Access Control](https://www.fortinet.com/resources/cyberglossary/what-is-network-access-control) diff --git a/src/data/roadmaps/cyber-security/content/netflow@xXz-SwvXA2cLfdCd-hLtW.md b/src/data/roadmaps/cyber-security/content/netflow@xXz-SwvXA2cLfdCd-hLtW.md index 820814dc3..b63b75257 100644 --- a/src/data/roadmaps/cyber-security/content/netflow@xXz-SwvXA2cLfdCd-hLtW.md +++ b/src/data/roadmaps/cyber-security/content/netflow@xXz-SwvXA2cLfdCd-hLtW.md @@ -4,5 +4,5 @@ Learn more from the following resources: -- [@official@Cisco NetFlow Website](https://www.cisco.com/c/en/us/products/ios-nx-os-software/ios-netflow/index.html) +- [@official@Cisco NetFlow](https://www.cisco.com/c/en/us/products/ios-nx-os-software/ios-netflow/index.html) - [@video@What is NetFlow?](https://www.youtube.com/watch?v=aqTpUmUibB8) diff --git a/src/data/roadmaps/cyber-security/content/nids@LIPtxl_oKZRcbvXT4EdNf.md b/src/data/roadmaps/cyber-security/content/nids@LIPtxl_oKZRcbvXT4EdNf.md index 007622b5d..1eabd4d69 100644 --- a/src/data/roadmaps/cyber-security/content/nids@LIPtxl_oKZRcbvXT4EdNf.md +++ b/src/data/roadmaps/cyber-security/content/nids@LIPtxl_oKZRcbvXT4EdNf.md @@ -3,5 +3,6 @@ A Network Intrusion Detection System (NIDS) is a security solution designed to monitor and analyze network traffic for signs of suspicious activity or potential threats. NIDS operates by inspecting the data packets that flow through a network, looking for patterns that match known attack signatures or anomalies that could indicate malicious behavior. Unlike a Host Intrusion Detection System (HIDS), which focuses on individual host devices, NIDS provides a broader view by monitoring network traffic across multiple systems and devices. Visit the following resources to learn more: + - [@article@What is an Intrusion Detection System?](https://www.paloaltonetworks.com/cyberpedia/what-is-an-intrusion-detection-system-ids) - [@article@What is a Network Intrusion Detection system (NIDS)?](https://bunny.net/academy/security/what-is-network-intrusion-detection-nids/) diff --git a/src/data/roadmaps/cyber-security/content/nist@SOkJUTd1NUKSwYMIprv4m.md b/src/data/roadmaps/cyber-security/content/nist@SOkJUTd1NUKSwYMIprv4m.md index 65d056a9d..cea5062bf 100644 --- a/src/data/roadmaps/cyber-security/content/nist@SOkJUTd1NUKSwYMIprv4m.md +++ b/src/data/roadmaps/cyber-security/content/nist@SOkJUTd1NUKSwYMIprv4m.md @@ -4,5 +4,5 @@ Learn more from the following resources: -- [@official@NIST Website](https://www.nist.gov/) +- [@official@NIST](https://www.nist.gov/) - [@article@What is NIST?](https://www.encryptionconsulting.com/education-center/nist/) diff --git a/src/data/roadmaps/cyber-security/content/nmap@Hoou7kWyfB2wx_yFHug_H.md b/src/data/roadmaps/cyber-security/content/nmap@Hoou7kWyfB2wx_yFHug_H.md index 3b0120108..9718f3cc7 100644 --- a/src/data/roadmaps/cyber-security/content/nmap@Hoou7kWyfB2wx_yFHug_H.md +++ b/src/data/roadmaps/cyber-security/content/nmap@Hoou7kWyfB2wx_yFHug_H.md @@ -4,6 +4,6 @@ Learn more from the following resources: -- [@official@NMAP Website](https://nmap.org/) +- [@official@NMAP](https://nmap.org/) - [@article@NMAP Cheat Sheet](https://www.tutorialspoint.com/nmap-cheat-sheet) -- [@video@Nmap Tutorial to find Network Vulnerabilities] +- [@video@Nmap Tutorial to find Network Vulnerabilities](https://www.youtube.com/watch?v=4t4kBkMsDbQ) diff --git a/src/data/roadmaps/cyber-security/content/ntp@tf0TymdPHbplDHvuVIIh4.md b/src/data/roadmaps/cyber-security/content/ntp@tf0TymdPHbplDHvuVIIh4.md index 51d2ade02..505b8cdbe 100644 --- a/src/data/roadmaps/cyber-security/content/ntp@tf0TymdPHbplDHvuVIIh4.md +++ b/src/data/roadmaps/cyber-security/content/ntp@tf0TymdPHbplDHvuVIIh4.md @@ -5,5 +5,4 @@ Learn more from the following resources: - [@video@Network Time Protocol (NTP)](https://www.youtube.com/watch?v=BAo5C2qbLq8) -- [@article@What is NTP?](https://www.pubnub.com/learn/glossary/ntp-protocol/) - +- [@article@What is NTP?](https://www.pubnub.com/learn/glossary/ntp-protocol/) \ No newline at end of file From ed54dd663ab47c1952e4fd060e02d4fdf3b5d59d Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Sat, 26 Apr 2025 12:18:22 +0100 Subject: [PATCH 08/31] Add AI red teaming roadmap --- src/data/roadmaps/ai-red-teaming/ai-red-teaming.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/roadmaps/ai-red-teaming/ai-red-teaming.md b/src/data/roadmaps/ai-red-teaming/ai-red-teaming.md index c631d753a..b4e35bda4 100644 --- a/src/data/roadmaps/ai-red-teaming/ai-red-teaming.md +++ b/src/data/roadmaps/ai-red-teaming/ai-red-teaming.md @@ -7,7 +7,7 @@ briefDescription: 'Learn to become a red teaming expert in AI' title: 'AI Red Teaming' description: 'Learn to become a red teaming expert in AI' isNew: true -isHidden: true +isHidden: false hasTopics: true renderer: editor dimensions: From ebd34612a2f382ed6bf31de82672a65775b8c2f4 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Sat, 26 Apr 2025 12:47:04 +0100 Subject: [PATCH 09/31] Refactor red teaming resources (#8560) --- .../advanced-techniques@soC-kcem1ISbnCQMa6BIB.md | 6 +++--- .../adversarial-examples@xjlttOti-_laPRn8a2fVy.md | 8 ++++---- .../adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md | 6 +++--- .../agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md | 6 +++--- .../ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md | 6 +++--- .../content/api-protection@Tszl26iNBnQBdBEWOueDA.md | 8 ++++---- .../content/authentication@J7gjlt2MBx7lOkOnfGvPF.md | 6 +++--- .../content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md | 6 +++--- .../automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md | 6 +++--- .../benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md | 6 +++--- .../content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md | 6 +++--- .../content/code-injection@vhBu5x8INTtqvx6vcYAhE.md | 6 +++--- .../content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md | 8 ++++---- ...ity-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md | 6 +++--- .../continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md | 6 +++--- .../continuous-testing@65Lo60JQS5YlvvQ6KevXt.md | 6 +++--- .../content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md | 8 ++++---- .../content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md | 8 ++++---- .../custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md | 6 +++--- .../content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md | 8 ++++---- .../content/direct@5zHow4KZVpfhch5Aabeft.md | 6 +++--- .../content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md | 6 +++--- .../ethical-considerations@1gyuEV519LjN-KpROoVwv.md | 8 ++++---- .../content/forums@Smncq-n1OlnLAY27AFQOO.md | 8 ++++---- .../content/generative-models@3XJ-g0KvHP75U18mxCqgw.md | 6 +++--- .../content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md | 6 +++--- .../content/indirect@3_gJRtJSdm2iAfkwmcv0e.md | 6 +++--- .../industry-credentials@HHjsFR6wRDqUd66PMDE_7.md | 4 ++-- .../industry-standards@WePO66_4-gNcSdE00WKmw.md | 8 ++++---- .../infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md | 6 +++--- .../insecure-deserialization@aKzai0A8J55-OBXTnQih1.md | 8 ++++---- .../content/introduction@HFJIYcI16OMyM77fAw9af.md | 8 ++++---- .../jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md | 6 +++--- .../content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md | 8 ++++---- .../large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md | 6 +++--- .../llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md | 6 +++--- .../content/model-inversion@iE5PcswBHnu_EBFIacib0.md | 8 ++++---- .../model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md | 6 +++--- .../model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md | 8 ++++---- .../monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md | 10 +++++----- .../content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md | 6 +++--- .../prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md | 10 +++++----- .../content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md | 6 +++--- .../content/prompt-injection@XOrAPDRhBvde9R-znEipH.md | 10 +++++----- .../red-team-simulations@DpYsL0du37n40toH33fIr.md | 6 +++--- .../reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md | 8 ++++---- .../remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md | 6 +++--- .../content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md | 6 +++--- .../content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md | 8 ++++---- .../research-opportunities@VmaIHVsCpq2um_0cA33V3.md | 6 +++--- .../responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md | 6 +++--- .../content/risk-management@MupRvk_8Io2Hn7yEvU663.md | 6 +++--- .../robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md | 6 +++--- .../content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md | 6 +++--- .../safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md | 6 +++--- .../specialized-courses@s1xKK8HL5-QGZpcutiuvj.md | 8 ++++---- .../supervised-learning@NvOJIv36Utpm7_kOZyr79.md | 6 +++--- .../content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md | 10 +++++----- .../content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md | 8 ++++---- .../unauthorized-access@DQeOavZCoXpF3k_qRDABs.md | 6 +++--- .../unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md | 4 ++-- .../vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md | 6 +++--- .../content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md | 6 +++--- 63 files changed, 213 insertions(+), 213 deletions(-) diff --git a/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md b/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md index 252a8dd47..2e7cda865 100644 --- a/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md +++ b/src/data/roadmaps/ai-red-teaming/content/advanced-techniques@soC-kcem1ISbnCQMa6BIB.md @@ -4,6 +4,6 @@ The practice of AI Red Teaming itself will evolve. Future techniques may involve Learn more from the following resources: -- [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses applying red teaming to complex systems. -- [@article@Advanced Techniques in AI Red Teaming for LLMs | NeuralTrust](https://neuraltrust.ai/blog/advanced-techniques-in-ai-red-teaming) - Discusses techniques like adversarial ML and automated threat intelligence for red teaming. -- [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for more advanced automated red teaming. +- [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) +- [@article@Advanced Techniques in AI Red Teaming for LLMs](https://neuraltrust.ai/blog/advanced-techniques-in-ai-red-teaming) +- [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning](https://arxiv.org/html/2412.18693v1) diff --git a/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md b/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md index 3bc2d9f03..4eda151d6 100644 --- a/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md +++ b/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md @@ -4,7 +4,7 @@ A core AI Red Teaming activity involves generating adversarial examples – inpu Learn more from the following resources: -- [@article@Adversarial Examples Explained (OpenAI Blog)](https://openai.com/research/adversarial-examples) - Introduction by OpenAI. -- [@guide@Adversarial Examples – Interpretable Machine Learning Book](https://christophm.github.io/interpretable-ml-book/adversarial.html) - In-depth explanation and examples. -- [@guide@Adversarial Testing for Generative AI | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Google's guide on adversarial testing workflows. -- [@video@How AI Can Be Tricked With Adversarial Attacks - Two Minute Papers](https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w) - Short video demonstrating adversarial examples. +- [@article@Adversarial Examples Explained (OpenAI Blog)](https://openai.com/research/adversarial-examples) +- [@guide@Adversarial Examples – Interpretable Machine Learning Book](https://christophm.github.io/interpretable-ml-book/adversarial.html) +- [@guide@Adversarial Testing for Generative AI](https://developers.google.com/machine-learning/guides/adv-testing) +- [@video@How AI Can Be Tricked With Adversarial Attacks](https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w) diff --git a/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md b/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md index 0da097c3e..31de5b0b8 100644 --- a/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md +++ b/src/data/roadmaps/ai-red-teaming/content/adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md @@ -4,6 +4,6 @@ AI Red Teamers evaluate the effectiveness of adversarial training as a defense. Learn more from the following resources: -- [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) (Discusses adversarial robustness) -- [@guide@Adversarial Testing for Generative AI | Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Covers the concept as part of testing. -- [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) (Mentions adversarial training as defense) +- [@article@Model Robustness: Building Reliable AI Models](https://encord.com/blog/model-robustness-machine-learning-strategies/) +- [@guide@Adversarial Testing for Generative AI](https://developers.google.com/machine-learning/guides/adv-testing) +- [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models](https://arxiv.org/abs/2503.09302) diff --git a/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md b/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md index 218e6e19b..9f41962db 100644 --- a/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md +++ b/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md @@ -4,6 +4,6 @@ As AI agents capable of autonomous action become more common, AI Red Teamers mus Learn more from the following resources: -- [@article@AI Agents - Learn Prompting](https://learnprompting.org/docs/intermediate/ai_agents) (Background on agents) -- [@article@Reasoning models don't always say what they think - Anthropic](https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think) (Discusses agent alignment challenges) -- [@course@Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.](https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto) - Certification focusing on autonomous AI security. +- [@article@AI Agents - Learn Prompting](https://learnprompting.org/docs/intermediate/ai_agents) +- [@article@Reasoning models don't always say what they think](https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think) +- [@course@Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.](https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto) diff --git a/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md b/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md index e9f85b418..05662691e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md +++ b/src/data/roadmaps/ai-red-teaming/content/ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md @@ -4,6 +4,6 @@ This covers the foundational concepts essential for AI Red Teaming, bridging tra Learn more from the following resources: -- [@article@Building Trustworthy AI: Contending with Data Poisoning - Nisos](https://nisos.com/research/building-trustworthy-ai/) - Explores data poisoning threats in AI/ML. -- [@article@What Is Adversarial AI in Machine Learning? - Palo Alto Networks](https://www.paloaltonetworks.co.uk/cyberpedia/what-are-adversarial-attacks-on-AI-Machine-Learning) - Overview of adversarial attacks targeting AI/ML systems. -- [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Foundational course covering AI risks, governance, security, and privacy. +- [@article@Building Trustworthy AI: Contending with Data Poisoning](https://nisos.com/research/building-trustworthy-ai/) +- [@article@What Is Adversarial AI in Machine Learning?](https://www.paloaltonetworks.co.uk/cyberpedia/what-are-adversarial-attacks-on-AI-Machine-Learning) +- [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) diff --git a/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md b/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md index 3dbaf0c47..f9350a365 100644 --- a/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md +++ b/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md @@ -4,7 +4,7 @@ AI Red Teamers rigorously test the security of APIs providing access to AI model Learn more from the following resources: -- [@article@API Protection for AI Factories: The First Step to AI Security - F5](https://www.f5.com/company/blog/api-security-for-ai-factories) - Discusses the criticality of API security for AI applications. -- [@article@Securing APIs with AI for Advanced Threat Protection | Adeva](https://adevait.com/artificial-intelligence/securing-apis-with-ai) - Discusses using AI for API security, implies testing these is needed. -- [@article@Securing Machine Learning APIs (IBM)](https://developer.ibm.com/articles/se-securing-machine-learning-apis/) - Best practices for protecting ML APIs. -- [@guide@OWASP API Security Project (Top 10 2023)](https://owasp.org/www-project-api-security/) - Essential checklist for API vulnerabilities. +- [@article@API Protection for AI Factories: The First Step to AI Security](https://www.f5.com/company/blog/api-security-for-ai-factories) +- [@article@Securing APIs with AI for Advanced Threat Protection](https://adevait.com/artificial-intelligence/securing-apis-with-ai) +- [@article@Securing Machine Learning APIs (IBM)](https://developer.ibm.com/articles/se-securing-machine-learning-apis/) +- [@guide@OWASP API Security Project (Top 10 2023)](https://owasp.org/www-project-api-security/) diff --git a/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md b/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md index a30269a09..9b93f5b5c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md +++ b/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md @@ -4,6 +4,6 @@ AI Red Teamers test the authentication mechanisms controlling access to AI syste Learn more from the following resources: -- [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions testing authentication mechanisms in AI red teaming. -- [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation. -- [@video@How JWTs are used for Authentication (and how to bypass it) - LiveOverflow](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME) - Covers common web authentication bypass techniques relevant to APIs. +- [@article@Red-Teaming in AI Testing: Stress Testing](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) +- [@article@What is Authentication vs Authorization?](https://auth0.com/intro-to-iam/authentication-vs-authorization) +- [@video@How JWTs are used for Authentication (and how to bypass it)](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME) diff --git a/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md b/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md index 6252bc255..3a0c5edfc 100644 --- a/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md +++ b/src/data/roadmaps/ai-red-teaming/content/authentication@JQ3bR8odXJfd-1RCEf3-Q.md @@ -4,6 +4,6 @@ AI Red Teamers test authorization controls to ensure that authenticated users ca Learn more from the following resources: -- [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation. -- [@guide@Identity and access management (IAM) fundamental concepts - Learn Microsoft](https://learn.microsoft.com/en-us/entra/fundamentals/identity-fundamental-concepts) - Explains roles and permissions. -- [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) (Covers Broken Object Level/Function Level Authorization) +- [@article@What is Authentication vs Authorization?](https://auth0.com/intro-to-iam/authentication-vs-authorization) +- [@guide@Identity and access management (IAM) fundamental concepts](https://learn.microsoft.com/en-us/entra/fundamentals/identity-fundamental-concepts) +- [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) diff --git a/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md b/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md index f13eaa86c..d83fb7e8e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md +++ b/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md @@ -4,6 +4,6 @@ AI Red Teaming typically employs a blend of automated tools (for large-scale sca Learn more from the following resources: -- [@article@Automation Testing vs. Manual Testing: Which is the better approach? - Opkey](https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better) - General comparison. -- [@article@Manual Testing vs Automated Testing: What's the Difference? - Leapwork](https://www.leapwork.com/blog/manual-vs-automated-testing) - General comparison. -- [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Discusses using both automated generation and human ingenuity for red teaming. +- [@article@Automation Testing vs. Manual Testing: Which is the better approach?](https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better) +- [@article@Manual Testing vs Automated Testing: What's the Difference?](https://www.leapwork.com/blog/manual-vs-automated-testing) +- [@guide@LLM red teaming guide (open source)](https://www.promptfoo.dev/docs/red-team/) diff --git a/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md b/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md index a5907327f..6525bf1e2 100644 --- a/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md +++ b/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md @@ -4,6 +4,6 @@ AI Red Teamers may use or contribute to benchmark datasets specifically designed Learn more from the following resources: -- [@dataset@CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset - GitHub](https://github.com/cysecbench/dataset) - Dataset of cybersecurity prompts for benchmarking LLMs. -- [@dataset@NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security](https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html) - Using CTF challenges to evaluate LLMs. -- [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Benchmarking LLMs on cybersecurity tasks. +- [@dataset@CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset](https://github.com/cysecbench/dataset) +- [@dataset@NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security](https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html) +- [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity](https://arxiv.org/abs/2412.20787) diff --git a/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md b/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md index d86adb311..02466564a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md +++ b/src/data/roadmaps/ai-red-teaming/content/black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md @@ -4,6 +4,6 @@ In AI Red Teaming, black-box testing involves probing the AI system with inputs Learn more from the following resources: -- [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types. -- [@article@What is Black Box Testing | Techniques & Examples - Imperva](https://www.imperva.com/learn/application-security/black-box-testing/) - General explanation. -- [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Contrasts black-box and white-box approaches for LLM red teaming. +- [@article@Black-Box, Gray Box, and White-Box Penetration Testing](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) +- [@article@What is Black Box Testing](https://www.imperva.com/learn/application-security/black-box-testing/) +- [@guide@LLM red teaming guide (open source)](https://www.promptfoo.dev/docs/red-team/) diff --git a/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md b/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md index 6ac985369..3b5431bc4 100644 --- a/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md +++ b/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md @@ -4,6 +4,6 @@ AI Red Teamers test for code injection vulnerabilities specifically in the conte Learn more from the following resources: -- [@article@Code Injection in LLM Applications - NeuralTrust](https://neuraltrust.ai/blog/code-injection-in-llms) - Specifically discusses code injection risks involving LLMs. -- [@docs@Secure Plugin Sandboxing (OpenAI Plugins)](https://platform.openai.com/docs/plugins/production/security-requirements) - Context on preventing code injection via AI plugins. -- [@guide@Code Injection - OWASP Foundation](https://owasp.org/www-community/attacks/Code_Injection) - Foundational knowledge on code injection attacks. +- [@article@Code Injection in LLM Applications](https://neuraltrust.ai/blog/code-injection-in-llms) +- [@docs@Secure Plugin Sandboxing (OpenAI Plugins)](https://platform.openai.com/docs/plugins/production/security-requirements) +- [@guide@Code Injection](https://owasp.org/www-community/attacks/Code_Injection) diff --git a/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md b/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md index 78914c0e6..313bc1865 100644 --- a/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md +++ b/src/data/roadmaps/ai-red-teaming/content/conferences@LuKnmd9nSz9yLbTU_5Yp2.md @@ -4,7 +4,7 @@ Attending major cybersecurity conferences (DEF CON, Black Hat, RSA) and increasi Learn more from the following resources: -- [@conference@Black Hat Events](https://www.blackhat.com/) - Professional security conference with AI tracks. -- [@conference@DEF CON Hacking Conference](https://defcon.org/) - Major hacking conference with relevant villages/talks. -- [@conference@Global Conference on AI, Security and Ethics 2025 - UNIDIR](https://unidir.org/event/global-conference-on-ai-security-and-ethics-2025/) - Example of a specialized AI security/ethics conference. -- [@conference@RSA Conference](https://www.rsaconference.com/) - Large industry conference covering AI security. +- [@conference@Black Hat Events](https://www.blackhat.com/) +- [@conference@DEF CON Hacking Conference](https://defcon.org/) +- [@conference@Global Conference on AI, Security and Ethics 2025](https://unidir.org/event/global-conference-on-ai-security-and-ethics-2025/) +- [@conference@RSA Conference](https://www.rsaconference.com/) diff --git a/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md b/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md index 3ba4971e3..33f391acb 100644 --- a/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md +++ b/src/data/roadmaps/ai-red-teaming/content/confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md @@ -4,6 +4,6 @@ The CIA Triad is directly applicable in AI Red Teaming. Confidentiality tests fo Learn more from the following resources: -- [@article@Confidentiality, Integrity, Availability: Key Examples - DataSunrise](https://www.datasunrise.com/knowledge-center/confidentiality-integrity-availability-examples/) - Explains CIA triad with examples, mentioning AI/ML relevance. -- [@article@The CIA Triad: Confidentiality, Integrity, Availability - Veeam](https://www.veeam.com/blog/cybersecurity-cia-triad-explained.html) - Breakdown of the three principles and how they apply. -- [@article@What's The CIA Triad? Confidentiality, Integrity, & Availability, Explained | Splunk](https://www.splunk.com/en_us/blog/learn/cia-triad-confidentiality-integrity-availability.html) - Detailed explanation of the triad, mentioning modern updates and AI context. +- [@article@Confidentiality, Integrity, Availability: Key Examples](https://www.datasunrise.com/knowledge-center/confidentiality-integrity-availability-examples/) +- [@article@The CIA Triad: Confidentiality, Integrity, Availability](https://www.veeam.com/blog/cybersecurity-cia-triad-explained.html) +- [@article@What's The CIA Triad? Confidentiality, Integrity, & Availability, Explained](https://www.splunk.com/en_us/blog/learn/cia-triad-confidentiality-integrity-availability.html) diff --git a/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md b/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md index 9af55fdaa..525c36b3b 100644 --- a/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md +++ b/src/data/roadmaps/ai-red-teaming/content/continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md @@ -4,6 +4,6 @@ AI Red Teamers assess the effectiveness of continuous monitoring systems by atte Learn more from the following resources: -- [@article@Cyber Security Monitoring: 5 Key Components - BitSight Technologies](https://www.bitsight.com/blog/5-things-to-consider-building-continuous-security-monitoring-strategy) - Discusses key components of a monitoring strategy. -- [@article@Cyber Security Monitoring: Definition and Best Practices - SentinelOne](https://www.sentinelone.com/cybersecurity-101/cybersecurity/cyber-security-monitoring/) - Overview of monitoring types and techniques. -- [@article@Cybersecurity Monitoring: Definition, Tools & Best Practices - NordLayer](https://nordlayer.com/blog/cybersecurity-monitoring/) - General best practices adaptable to AI context. +- [@article@Cyber Security Monitoring: 5 Key Components](https://www.bitsight.com/blog/5-things-to-consider-building-continuous-security-monitoring-strategy) +- [@article@Cyber Security Monitoring: Definition and Best Practices](https://www.sentinelone.com/cybersecurity-101/cybersecurity/cyber-security-monitoring/) +- [@article@Cybersecurity Monitoring: Definition, Tools & Best Practices](https://nordlayer.com/blog/cybersecurity-monitoring/) diff --git a/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md b/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md index 117921143..68d3230d2 100644 --- a/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md +++ b/src/data/roadmaps/ai-red-teaming/content/continuous-testing@65Lo60JQS5YlvvQ6KevXt.md @@ -4,6 +4,6 @@ Applying continuous testing principles to AI security involves integrating autom Learn more from the following resources: -- [@article@Continuous Automated Red Teaming (CART) - FireCompass](https://www.firecompass.com/continuous-automated-red-teaming/) - Explains the concept of CART. -- [@article@What is Continuous Penetration Testing? Process and Benefits - Qualysec Technologies](https://qualysec.com/continuous-penetration-testing/) - Related concept applied to pen testing. -- [@guide@What is Continuous Testing and How Does it Work? - Black Duck](https://www.blackduck.com/glossary/what-is-continuous-testing.html) - General definition and benefits. +- [@article@Continuous Automated Red Teaming (CART)](https://www.firecompass.com/continuous-automated-red-teaming/) +- [@article@What is Continuous Penetration Testing? Process and Benefits](https://qualysec.com/continuous-penetration-testing/) +- [@guide@What is Continuous Testing and How Does it Work?](https://www.blackduck.com/glossary/what-is-continuous-testing.html) diff --git a/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md b/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md index d99d46307..3cf4d616c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md +++ b/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md @@ -4,7 +4,7 @@ AI Red Teamers must also understand and test defenses against prompt hacking. Th Learn more from the following resources: -- [@article@Mitigating Prompt Injection Attacks (NCC Group Research)](https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/) - Discusses various mitigation strategies and their effectiveness. -- [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Includes discussion on best practices for prevention. -- [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Covers defensive measures. -- [@guide@OpenAI Best Practices for Prompt Security](https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions) - OpenAI’s recommendations to prevent prompt manipulation. +- [@article@Mitigating Prompt Injection Attacks (NCC Group Research)](https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/) +- [@article@Prompt Injection & the Rise of Prompt Attacks](https://www.lakera.ai/blog/guide-to-prompt-injection) +- [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) +- [@guide@OpenAI Best Practices for Prompt Security](https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions) diff --git a/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md b/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md index 9b4ff972a..bca8cfb12 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md +++ b/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md @@ -4,7 +4,7 @@ Capture The Flag competitions increasingly include AI/ML security challenges. Pa Learn more from the following resources: -- [@article@Capture the flag (cybersecurity) - Wikipedia](https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)) - Overview of CTFs. -- [@article@Progress from our Frontier Red Team - Anthropic](https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team) - Mentions using CTFs (Cybench) for evaluating AI model security. -- [@platform@CTFtime.org](https://ctftime.org/) - Global CTF event tracker. -- [@platform@picoCTF](https://picoctf.org/) - Beginner-friendly CTF platform. +- [@article@Capture the flag (cybersecurity)](https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity) +- [@article@Progress from our Frontier Red Team](https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team) +- [@platform@CTFtime.org](https://ctftime.org/) +- [@platform@picoCTF](https://picoctf.org/) diff --git a/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md b/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md index cde375b58..8a8181543 100644 --- a/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md +++ b/src/data/roadmaps/ai-red-teaming/content/custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md @@ -4,6 +4,6 @@ AI Red Teamers frequently write custom scripts (often in Python) to automate bes Learn more from the following resources: -- [@guide@Python for Cybersecurity: Key Use Cases and Tools - Panther](https://panther.com/blog/python-for-cybersecurity-key-use-cases-and-tools) - Discusses Python's role in automation, pen testing, etc. -- [@guide@Python for cybersecurity: use cases, tools and best practices - SoftTeco](https://softteco.com/blog/python-for-cybersecurity) - Covers using Python for various security tasks. -- [@tool@Scapy](https://scapy.net/) - Powerful Python library for packet manipulation. +- [@guide@Python for Cybersecurity: Key Use Cases and Tools](https://panther.com/blog/python-for-cybersecurity-key-use-cases-and-tools) +- [@guide@Python for cybersecurity: use cases, tools and best practices](https://softteco.com/blog/python-for-cybersecurity) +- [@tool@Scapy](https://scapy.net/) diff --git a/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md b/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md index 5a5b70078..057d5549f 100644 --- a/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md +++ b/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md @@ -4,7 +4,7 @@ AI Red Teamers simulate data poisoning attacks by evaluating how introducing man Learn more from the following resources: -- [@article@AI Poisoning - Is It Really A Threat? - AIBlade](https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat) - Detailed exploration of data poisoning attacks and impacts. -- [@article@Data Poisoning Attacks in ML (Towards Data Science)](https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f) - Overview of techniques. -- [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) - Research on detection and prevention techniques. -- [@paper@Poisoning Web-Scale Training Data (arXiv)](https://arxiv.org/abs/2310.12818) - Analysis of poisoning risks in large datasets used for LLMs. +- [@article@AI Poisoning](https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat) +- [@article@Data Poisoning Attacks in ML (Towards Data Science)](https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f) +- [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models](https://arxiv.org/abs/2503.09302) +- [@paper@Poisoning Web-Scale Training Data (arXiv)](https://arxiv.org/abs/2310.12818) diff --git a/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md b/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md index ebf1911eb..ea4d9bf05 100644 --- a/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md +++ b/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md @@ -4,6 +4,6 @@ Direct injection attacks occur when malicious instructions are inserted directly Learn more from the following resources: -- [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Differentiates attack types. -- [@article@Prompt Injection Cheat Sheet (FlowGPT)](https://flowgpt.com/p/prompt-injection-cheat-sheet) - Collection of prompt injection examples often used in direct attacks. -- [@report@OpenAI GPT-4 System Card](https://openai.com/research/gpt-4-system-card) - Sections discuss how direct prompt attacks were tested during GPT-4 development. +- [@article@Prompt Injection & the Rise of Prompt Attacks](https://www.lakera.ai/blog/guide-to-prompt-injection) +- [@article@Prompt Injection Cheat Sheet (FlowGPT)](https://flowgpt.com/p/prompt-injection-cheat-sheet) +- [@report@OpenAI GPT-4 System Card](https://openai.com/research/gpt-4-system-card) diff --git a/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md b/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md index 79b986295..5db8b650d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md +++ b/src/data/roadmaps/ai-red-teaming/content/emerging-threats@-G8v_CNa8wO_g-46_RFQo.md @@ -4,6 +4,6 @@ AI Red Teamers must stay informed about potential future threats enabled by more Learn more from the following resources: -- [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses future AI-driven cyberattacks. -- [@article@Why Artificial Intelligence is the Future of Cybersecurity - Darktrace](https://www.darktrace.com/blog/why-artificial-intelligence-is-the-future-of-cybersecurity) - Covers AI misuse and the future threat landscape. -- [@report@AI Index 2024 - Stanford University](https://aiindex.stanford.edu/report/) - Annual report tracking AI capabilities and societal implications, including risks. +- [@article@AI Security Risks Uncovered: What You Must Know in 2025](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) +- [@article@Why Artificial Intelligence is the Future of Cybersecurity](https://www.darktrace.com/blog/why-artificial-intelligence-is-the-future-of-cybersecurity) +- [@report@AI Index 2024](https://aiindex.stanford.edu/report/) diff --git a/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md b/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md index 1f239c486..6f1a1abc6 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md +++ b/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md @@ -4,7 +4,7 @@ Ethical conduct is crucial for AI Red Teamers. While simulating attacks, they mu Learn more from the following resources: -- [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions balancing attack simulation with ethical constraints. -- [@article@Responsible AI assessment - Responsible AI | Coursera](https://www.coursera.org/learn/ai-security) (Module within AI Security course) -- [@guide@Responsible AI Principles (Microsoft)](https://www.microsoft.com/en-us/ai/responsible-ai) - Example of corporate responsible AI guidelines influencing ethical testing. -- [@video@Questions to Guide AI Red-Teaming (CMU SEI)](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382) - Key questions and ethical guidelines for AI red teaming activities (video talk). +- [@article@Red-Teaming in AI Testing: Stress Testing](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) +- [@article@Responsible AI assessment - Responsible AI | Coursera](https://www.coursera.org/learn/ai-security) +- [@guide@Responsible AI Principles (Microsoft)](https://www.microsoft.com/en-us/ai/responsible-ai) +- [@video@Questions to Guide AI Red-Teaming (CMU SEI)](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382) diff --git a/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md b/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md index d15e412af..b14193458 100644 --- a/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md +++ b/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md @@ -4,7 +4,7 @@ Engaging in online forums, mailing lists, Discord servers, or subreddits dedicat Learn more from the following resources: -- [@community@List of Cybersecurity Discord Servers - DFIR Training](https://www.dfir.training/dfir-groups/discord?category[0]=17&category_children=1) - List including relevant servers. -- [@community@Reddit - r/MachineLearning](https://www.reddit.com/r/MachineLearning/) - ML specific discussion. -- [@community@Reddit - r/artificial](https://www.reddit.com/r/artificial/) - General AI discussion. -- [@community@Reddit - r/cybersecurity](https://www.reddit.com/r/cybersecurity/) - General cybersecurity forum. +- [@community@List of Cybersecurity Discord Servers](https://www.dfir.training/dfir-groups/discord?category[0]=17&category_children=1) +- [@community@Reddit - r/MachineLearning](https://www.reddit.com/r/MachineLearning/) +- [@community@Reddit - r/artificial](https://www.reddit.com/r/artificial/) +- [@community@Reddit - r/cybersecurity](https://www.reddit.com/r/cybersecurity/) diff --git a/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md b/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md index 4a3225c4c..1a734dc24 100644 --- a/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md +++ b/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md @@ -4,6 +4,6 @@ AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to th Learn more from the following resources: -- [@article@An Introduction to Generative Models | MongoDB](https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models) - Explains basics and contrasts with discriminative models. -- [@course@Generative AI for Beginners - Microsoft Open Source](https://microsoft.github.io/generative-ai-for-beginners/) - Free course covering fundamentals. -- [@guide@Generative AI beginner's guide | Generative AI on Vertex AI - Google Cloud](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview) - Overview covering generative AI concepts and Google's platform context. +- [@article@An Introduction to Generative Models](https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models) +- [@course@Generative AI for Beginners](https://microsoft.github.io/generative-ai-for-beginners/) +- [@guide@Generative AI beginner's guide](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview) diff --git a/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md b/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md index 08e5696c9..5b9585430 100644 --- a/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md +++ b/src/data/roadmaps/ai-red-teaming/content/grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md @@ -4,6 +4,6 @@ Grey-box AI Red Teaming involves testing with partial knowledge of the system, s Learn more from the following resources: -- [@article@AI Transparency: Connecting AI Red Teaming and Compliance | SplxAI Blog](https://splx.ai/blog/ai-transparency-connecting-ai-red-teaming-and-compliance) - Discusses the value of moving towards gray-box testing in AI. -- [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types. -- [@article@Understanding Black Box, White Box, and Grey Box Testing - Frugal Testing](https://www.frugaltesting.com/blog/understanding-black-box-white-box-and-grey-box-testing-in-software-testing) - General definitions. +- [@article@AI Transparency: Connecting AI Red Teaming and Compliance](https://splx.ai/blog/ai-transparency-connecting-ai-red-teaming-and-compliance) +- [@article@Black-Box, Gray Box, and White-Box Penetration Testing](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) +- [@article@Understanding Black Box, White Box, and Grey Box Testing](https://www.frugaltesting.com/blog/understanding-black-box-white-box-and-grey-box-testing-in-software-testing) diff --git a/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md b/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md index 58aaddcbb..6b467d481 100644 --- a/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md +++ b/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md @@ -4,6 +4,6 @@ Indirect injection involves embedding malicious prompts within external data sou Learn more from the following resources: -- [@paper@The Practical Application of Indirect Prompt Injection Attacks - David Willis-Owen](https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry) - Discusses a standard methodology to test for indirect injection attacks. -- [@article@How to Prevent Indirect Prompt Injection Attacks - Cobalt](https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks) - Explains indirect injection via external sources and mitigation. -- [@article@Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)](https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection) - Examples of indirect prompt injection impacting LLM agents. +- [@paper@The Practical Application of Indirect Prompt Injection Attacks](https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry) +- [@article@How to Prevent Indirect Prompt Injection Attacks](https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks) +- [@article@Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)](https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection) diff --git a/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md b/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md index 41027ca26..2911e6d42 100644 --- a/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md +++ b/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md @@ -4,5 +4,5 @@ Beyond formal certifications, recognition in the AI Red Teaming field comes from Learn more from the following resources: -- [@community@DEF CON - Wikipedia (Mentions Black Badge)](https://en.wikipedia.org/wiki/DEF_CON#Black_Badge) - Example of a high-prestige credential from CTFs. -- [@community@HackAPrompt (Learn Prompting)](https://learnprompting.org/hackaprompt) - Example of a major AI Red Teaming competition. +- [@community@DEF CON - Wikipedia (Mentions Black Badge)](https://en.wikipedia.org/wiki/DEF_CON#Black_Badge) +- [@community@HackAPrompt (Learn Prompting)](https://learnprompting.org/hackaprompt) diff --git a/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md b/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md index caa53a823..76312a744 100644 --- a/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md +++ b/src/data/roadmaps/ai-red-teaming/content/industry-standards@WePO66_4-gNcSdE00WKmw.md @@ -4,7 +4,7 @@ As AI matures, AI Red Teamers will increasingly need to understand and test agai Learn more from the following resources: -- [@article@ISO 42001: The New Compliance Standard for AI Management Systems - Bright Defense](https://www.brightdefense.com/resources/iso-42001-compliance/) - Overview of ISO 42001 requirements. -- [@article@ISO 42001: What it is & why it matters for AI management - IT Governance](https://www.itgovernance.co.uk/iso-42001) - Explanation of the standard. -- [@framework@NIST AI Risk Management Framework (AI RMF)](https://www.nist.gov/itl/ai-risk-management-framework) - Voluntary framework gaining wide adoption. -- [@standard@ISO/IEC 42001: Information technology — Artificial intelligence — Management system](https://www.iso.org/standard/81230.html) - International standard for AI management systems. +- [@article@ISO 42001: The New Compliance Standard for AI Management Systems](https://www.brightdefense.com/resources/iso-42001-compliance/) +- [@article@ISO 42001: What it is & why it matters for AI management](https://www.itgovernance.co.uk/iso-42001) +- [@framework@NIST AI Risk Management Framework (AI RMF)](https://www.nist.gov/itl/ai-risk-management-framework) +- [@standard@ISO/IEC 42001: Information technology — Artificial intelligence — Management system](https://www.iso.org/standard/81230.html) diff --git a/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md b/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md index 454ffd126..02b418c51 100644 --- a/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md +++ b/src/data/roadmaps/ai-red-teaming/content/infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md @@ -4,6 +4,6 @@ AI Red Teamers assess the security posture of the infrastructure hosting AI mode Learn more from the following resources: -- [@article@AI Infrastructure Attacks (VentureBeat)](https://venturebeat.com/ai/understanding-ai-infrastructure-attacks/) - Discussion of attacks targeting AI infrastructure. -- [@guide@Network Infrastructure Security - Best Practices and Strategies - DataGuard](https://www.dataguard.com/blog/network-infrastructure-security-best-practices-and-strategies/) - General infra security practices applicable here. -- [@guide@Secure Deployment of ML Systems (NIST)](https://csrc.nist.gov/publications/detail/sp/800-218/final) - Guidelines including infrastructure security for ML. +- [@article@AI Infrastructure Attacks (VentureBeat)](https://venturebeat.com/ai/understanding-ai-infrastructure-attacks/) +- [@guide@Network Infrastructure Security - Best Practices and Strategies](https://www.dataguard.com/blog/network-infrastructure-security-best-practices-and-strategies/) +- [@guide@Secure Deployment of ML Systems (NIST)](https://csrc.nist.gov/publications/detail/sp/800-218/final) diff --git a/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md b/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md index b6dc1981c..1be1b2a22 100644 --- a/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md +++ b/src/data/roadmaps/ai-red-teaming/content/insecure-deserialization@aKzai0A8J55-OBXTnQih1.md @@ -4,7 +4,7 @@ AI Red Teamers investigate if serialized objects used by the AI system (e.g., fo Learn more from the following resources: -- [@article@Lightboard Lessons: OWASP Top 10 - Insecure Deserialization - DevCentral](https://community.f5.com/kb/technicalarticles/lightboard-lessons-owasp-top-10---insecure-deserialization/281509) - Video explanation. -- [@article@How Hugging Face Was Ethically Hacked](https://www.aiblade.net/p/how-hugging-face-was-ethically-hacked) - Hugging Face deserialization case study. -- [@article@OWASP TOP 10: Insecure Deserialization - Detectify Blog](https://blog.detectify.com/best-practices/owasp-top-10-insecure-deserialization/) - Overview within OWASP Top 10 context. -- [@guide@Insecure Deserialization - OWASP Foundation](https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization) - Core explanation of the vulnerability. +- [@article@Lightboard Lessons: OWASP Top 10 - Insecure Deserialization](https://community.f5.com/kb/technicalarticles/lightboard-lessons-owasp-top-10---insecure-deserialization/281509) +- [@article@How Hugging Face Was Ethically Hacked](https://www.aiblade.net/p/how-hugging-face-was-ethically-hacked) +- [@article@OWASP TOP 10: Insecure Deserialization](https://blog.detectify.com/best-practices/owasp-top-10-insecure-deserialization/) +- [@guide@Insecure Deserialization](https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization) diff --git a/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md b/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md index 7f3367c78..279bb5648 100644 --- a/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md +++ b/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md @@ -4,7 +4,7 @@ AI Red Teaming is the practice of simulating adversarial attacks against AI syst Learn more from the following resources: -- [@article@A Guide to AI Red Teaming - HiddenLayer](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) - Discusses AI red teaming concepts and contrasts with traditional methods. -- [@article@What is AI Red Teaming? (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Overview of AI red teaming, its history, and key challenges. -- [@article@What is AI Red Teaming? The Complete Guide - Mindgard](https://mindgard.ai/blog/what-is-ai-red-teaming) - Guide covering AI red teaming processes, use cases, and benefits. -- [@podcast@Red Team Podcast | AI Red Teaming Insights & Defense Strategies - Mindgard](https://mindgard.ai/podcast/red-team) - Podcast series covering AI red teaming trends and strategies. +- [@article@A Guide to AI Red Teaming](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) +- [@article@What is AI Red Teaming? (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) +- [@article@What is AI Red Teaming? The Complete Guide](https://mindgard.ai/blog/what-is-ai-red-teaming) +- [@podcast@Red Team Podcast - AI Red Teaming Insights & Defense Strategies](https://mindgard.ai/podcast/red-team) diff --git a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md index a99eec9b1..3aad0a565 100644 --- a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md +++ b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md @@ -4,6 +4,6 @@ Jailbreaking is a specific category of prompt hacking where the AI Red Teamer ai Learn more from the following resources: -- [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) - Discusses jailbreaks for several LLMs -- [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Covers jailbreaking strategies. -- [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) - Research analyzing jailbreak failures. +- [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) +- [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) +- [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) diff --git a/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md b/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md index ebac531c3..1d96fbd04 100644 --- a/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md +++ b/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md @@ -4,7 +4,7 @@ AI Red Teamers need environments to practice attacking vulnerable systems safely Learn more from the following resources: -- [@platform@Gandalf AI Prompt Injection Lab](https://gandalf.lakera.ai/) - A popular web-based lab for prompt injection practice. -- [@platform@Hack The Box: Hacking Labs](https://www.hackthebox.com/hacker/hacking-labs) - General pentesting labs. -- [@platform@TryHackMe: Learn Cyber Security](https://tryhackme.com/) - Gamified cybersecurity training labs. -- [@platform@VulnHub](https://www.vulnhub.com/) - Provides vulnerable VM images for practice. +- [@platform@Gandalf AI Prompt Injection Lab](https://gandalf.lakera.ai/) +- [@platform@Hack The Box: Hacking Labs](https://www.hackthebox.com/hacker/hacking-labs) +- [@platform@TryHackMe: Learn Cyber Security](https://tryhackme.com/) +- [@platform@VulnHub](https://www.vulnhub.com/) diff --git a/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md b/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md index b3b680485..ed210695e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md +++ b/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md @@ -4,6 +4,6 @@ LLMs are a primary target for AI Red Teaming. Understanding their architecture ( Learn more from the following resources: -- [@article@What is an LLM (large language model)? - Cloudflare](https://www.cloudflare.com/learning/ai/what-is-large-language-model/) - Concise explanation from Cloudflare. -- [@guide@Introduction to Large Language Models - Learn Prompting](https://learnprompting.org/docs/intro_to_llms) - Learn Prompting's introduction. -- [@guide@What Are Large Language Models? A Beginner's Guide for 2025 - KDnuggets](https://www.kdnuggets.com/large-language-models-beginners-guide-2025) - Overview of LLMs, how they work, strengths, and limitations. +- [@article@What is an LLM (large language model)?](https://www.cloudflare.com/learning/ai/what-is-large-language-model/) +- [@guide@Introduction to LLMs - Learn Prompting](https://learnprompting.org/docs/intro_to_llms) +- [@guide@What Are Large Language Models? A Beginner's Guide for 2025](https://www.kdnuggets.com/large-language-models-beginners-guide-2025) diff --git a/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md b/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md index d4edd7b4e..bc55ca486 100644 --- a/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md +++ b/src/data/roadmaps/ai-red-teaming/content/llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md @@ -4,6 +4,6 @@ The core application area for many AI Red Teamers today involves specifically te Learn more from the following resources: -- [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Courses focused on testing LLMs. -- [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Dataset for evaluating LLMs on security tasks. -- [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Guide specifically on red teaming LLMs. +- [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) +- [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity](https://arxiv.org/abs/2412.20787) +- [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) diff --git a/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md b/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md index 0cdbed37b..b3d3fb613 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md @@ -4,7 +4,7 @@ AI Red Teamers perform model inversion tests to assess if an attacker can recons Learn more from the following resources: -- [@article@Model Inversion Attacks for ML (Medium)](https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1) - Explanation with examples (e.g., face reconstruction). -- [@article@Model inversion and membership inference: Understanding new AI security risks - Hogan Lovells](https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities) - Discusses risks and mitigation. -- [@paper@Extracting Training Data from LLMs (arXiv)](https://arxiv.org/abs/2012.07805) - Research demonstrating feasibility on LLMs. -- [@paper@Model Inversion Attacks: A Survey of Approaches and Countermeasures - arXiv](https://arxiv.org/html/2411.10023v1) - Comprehensive survey of model inversion attacks and defenses. +- [@article@Model Inversion Attacks for ML (Medium)](https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1) +- [@article@Model inversion and membership inference: Understanding new AI security risks](https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities) +- [@paper@Extracting Training Data from LLMs (arXiv)](https://arxiv.org/abs/2012.07805) +- [@paper@Model Inversion Attacks: A Survey of Approaches and Countermeasures](https://arxiv.org/html/2411.10023v1) diff --git a/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md b/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md index 228d9246f..4e9be1fff 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md @@ -4,6 +4,6 @@ This category covers attacks and tests targeting the AI model itself, beyond the Learn more from the following resources: -- [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses adversarial attacks, data poisoning, and prototype theft. -- [@article@Attacking AI Models (Trail of Bits Blog Series)](https://blog.trailofbits.com/category/ai-security/) - Series discussing model-focused attacks. -- [@report@AI and ML Vulnerabilities (CNAS Report)](https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities) - Overview of known machine learning vulnerabilities. +- [@article@AI Security Risks Uncovered: What You Must Know in 2025](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) +- [@article@Attacking AI Models (Trail of Bits Blog Series)](https://blog.trailofbits.com/category/ai-security/) +- [@report@AI and ML Vulnerabilities (CNAS Report)](https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities) diff --git a/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md b/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md index 9103c4cab..0edbaedaf 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md @@ -4,7 +4,7 @@ AI Red Teamers assess the risk of attackers reconstructing or stealing the propr Learn more from the following resources: -- [@article@A Playbook for Securing AI Model Weights - RAND](https://www.rand.org/pubs/research_briefs/RBA2849-1.html) - Discusses attack vectors and security levels for protecting model weights. -- [@article@How to Steal a Machine Learning Model (SkyCryptor)](https://skycryptor.com/blog/how-to-steal-a-machine-learning-model) - Explains model weight extraction via query attacks. -- [@paper@Defense Against Model Stealing (Microsoft Research)](https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/) - Research on detecting and defending against model stealing. -- [@paper@On the Limitations of Model Stealing with Uncertainty Quantification Models - OpenReview](https://openreview.net/pdf?id=ONRFHoUzNk) - Research exploring model stealing techniques. +- [@article@A Playbook for Securing AI Model Weights](https://www.rand.org/pubs/research_briefs/RBA2849-1.html) +- [@article@How to Steal a Machine Learning Model (SkyCryptor)](https://skycryptor.com/blog/how-to-steal-a-machine-learning-model) +- [@paper@Defense Against Model Stealing (Microsoft Research)](https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/) +- [@paper@On the Limitations of Model Stealing with Uncertainty Quantification Models](https://openreview.net/pdf?id=ONRFHoUzNk) diff --git a/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md b/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md index ae4bd0cfc..1b7586c4c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md +++ b/src/data/roadmaps/ai-red-teaming/content/monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md @@ -4,8 +4,8 @@ AI Red Teamers interact with monitoring tools primarily to test their effectiven Learn more from the following resources: -- [@article@Open Source IDS Tools: Comparing Suricata, Snort, Bro (Zeek), Linux - LevelBlue](https://levelblue.com/blogs/security-essentials/open-source-intrusion-detection-tools-a-quick-overview) - Comparison of common open source monitoring tools. -- [@tool@Snort](https://www.snort.org/) - Open source IDS/IPS. -- [@tool@Suricata](https://suricata.io/) - Open source IDS/IPS/NSM. -- [@tool@Wireshark](https://www.wireshark.org/) - Network protocol analyzer. -- [@tool@Zeek (formerly Bro)](https://zeek.org/) - Network security monitoring framework. +- [@article@Open Source IDS Tools: Comparing Suricata, Snort, Bro (Zeek), Linux](https://levelblue.com/blogs/security-essentials/open-source-intrusion-detection-tools-a-quick-overview) +- [@tool@Snort](https://www.snort.org/) +- [@tool@Suricata](https://suricata.io/) +- [@tool@Wireshark](https://www.wireshark.org/) +- [@tool@Zeek (formerly Bro)](https://zeek.org/) diff --git a/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md b/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md index 1dc11b008..d2632d0e2 100644 --- a/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md +++ b/src/data/roadmaps/ai-red-teaming/content/neural-networks@RuKzVhd1nZphCrlW1wZGL.md @@ -4,6 +4,6 @@ Understanding neural network architectures (layers, nodes, activation functions) Learn more from the following resources: -- [@guide@Neural Networks Explained: A Beginner's Guide - SkillCamper](https://www.skillcamper.com/blog/neural-networks-explained-a-beginners-guide) - Foundational guide. -- [@guide@Neural networks | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/crash-course/neural-networks) - Google's explanation within their ML crash course. -- [@paper@Red Teaming with Artificial Intelligence-Driven Cyberattacks: A Scoping Review - arXiv](https://arxiv.org/html/2503.19626) - Review discussing AI methods like neural networks used in red teaming simulations. +- [@guide@Neural Networks Explained: A Beginner's Guide](https://www.skillcamper.com/blog/neural-networks-explained-a-beginners-guide) +- [@guide@Neural networks | Machine Learning](https://developers.google.com/machine-learning/crash-course/neural-networks) +- [@paper@Red Teaming with Artificial Intelligence-Driven Cyberattacks: A Scoping Review](https://arxiv.org/html/2503.19626) diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md b/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md index 916aa0891..a733cc512 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md @@ -4,8 +4,8 @@ For AI Red Teamers, prompt engineering is both a tool and a target. It's a tool Learn more from the following resources: -- [@article@Introduction to Prompt Engineering - Datacamp](https://www.datacamp.com/tutorial/introduction-prompt-engineering) - Tutorial covering basics. -- [@article@System Prompts - InjectPrompt](https://www.injectprompt.com/t/system-prompts) - Look at the system prompts of flagship LLMs. -- [@course@Introduction to Prompt Engineering - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-engineering) - Foundational course from Learn Prompting. -- [@guide@Prompt Engineering Guide - Learn Prompting](https://learnprompting.org/docs/prompt-engineering) - Comprehensive guide from Learn Prompting. -- [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Connects prompt engineering directly to LLM red teaming concepts. +- [@article@Introduction to Prompt Engineering](https://www.datacamp.com/tutorial/introduction-prompt-engineering) +- [@article@System Prompts - InjectPrompt](https://www.injectprompt.com/t/system-prompts) +- [@course@Introduction to Prompt Engineering](https://learnprompting.org/courses/intro-to-prompt-engineering) +- [@guide@Prompt Engineering Guide](https://learnprompting.org/docs/prompt-engineering) +- [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md b/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md index 444638853..0ea470864 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md @@ -4,6 +4,6 @@ Prompt hacking is a core technique for AI Red Teamers targeting LLMs. It involve Learn more from the following resources: -- [@course@Introduction to Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-hacking) - Free introductory course. -- [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Detailed guide covering techniques. -- [@paper@SoK: Prompt Hacking of LLMs (arXiv 2023)](https://arxiv.org/abs/2311.05544) - Comprehensive research overview of prompt hacking types and techniques. +- [@course@Introduction to Prompt Hacking](https://learnprompting.org/courses/intro-to-prompt-hacking) +- [@guide@Prompt Hacking Guide](https://learnprompting.org/docs/category/prompt-hacking) +- [@paper@SoK: Prompt Hacking of LLMs (arXiv 2023)](https://arxiv.org/abs/2311.05544) diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md b/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md index 7e2ceceef..ba8ca854d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-injection@XOrAPDRhBvde9R-znEipH.md @@ -4,8 +4,8 @@ Prompt injection is a critical vulnerability tested by AI Red Teamers. They atte Learn more from the following resources: -- [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Guide covering different types of prompt attacks. -- [@article@Prompt Injection (Learn Prompting)](https://learnprompting.org/docs/prompt_hacking/injection) - Learn Prompting article describing prompt injection with examples and mitigation strategies. -- [@article@Prompt Injection Attack Explanation (IBM)](https://research.ibm.com/blog/prompt-injection-attacks-against-llms) - Explains what prompt injections are and how they work. -- [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Overview of impact and defenses. -- [@course@Advanced Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/advanced-prompt-hacking) - Covers advanced injection techniques. +- [@article@Prompt Injection & the Rise of Prompt Attacks](https://www.lakera.ai/blog/guide-to-prompt-injection) +- [@article@Prompt Injection (Learn Prompting)](https://learnprompting.org/docs/prompt_hacking/injection) +- [@article@Prompt Injection Attack Explanation (IBM)](https://research.ibm.com/blog/prompt-injection-attacks-against-llms) +- [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) +- [@course@Advanced Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/advanced-prompt-hacking) diff --git a/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md b/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md index 1d4a28898..b2e1884f0 100644 --- a/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md +++ b/src/data/roadmaps/ai-red-teaming/content/red-team-simulations@DpYsL0du37n40toH33fIr.md @@ -4,6 +4,6 @@ Participating in or conducting structured red team simulations against AI system Learn more from the following resources: -- [@guide@A Simple Guide to Successful Red Teaming - Cobalt Strike](https://www.cobaltstrike.com/resources/guides/a-simple-guide-to-successful-red-teaming) - General guide adaptable to AI context. -- [@guide@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Overview of red teaming process. -- [@guide@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Checklist for planning engagements. +- [@guide@A Simple Guide to Successful Red Teaming](https://www.cobaltstrike.com/resources/guides/a-simple-guide-to-successful-red-teaming) +- [@guide@The Complete Guide to Red Teaming: Process, Benefits & More](https://mindgard.ai/blog/red-teaming) +- [@guide@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) diff --git a/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md b/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md index f7bc2a322..7e2efd36d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md +++ b/src/data/roadmaps/ai-red-teaming/content/reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md @@ -4,7 +4,7 @@ Red teaming RL-based AI systems involves testing for vulnerabilities such as rew Learn more from the following resources: -- [@article@Best Resources to Learn Reinforcement Learning - Towards Data Science](https://towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2/) - Curated list of RL learning resources. -- [@article@What is reinforcement learning? - Blog - York Online Masters degrees](https://online.york.ac.uk/resources/what-is-reinforcement-learning/) - Foundational explanation. -- [@course@Deep Reinforcement Learning Course by HuggingFace](https://huggingface.co/learn/deep-rl-course/unit0/introduction) - Comprehensive free course on Deep RL. -- [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for red teaming and generating attacks. +- [@article@Resources to Learn Reinforcement Learning](https://towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2/) +- [@article@What is reinforcement learning?](https://online.york.ac.uk/resources/what-is-reinforcement-learning/) +- [@course@Deep Reinforcement Learning Course by HuggingFace](https://huggingface.co/learn/deep-rl-course/unit0/introduction) +- [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning](https://arxiv.org/html/2412.18693v1) diff --git a/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md b/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md index 98adde85c..5d64329d8 100644 --- a/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md +++ b/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md @@ -4,6 +4,6 @@ AI Red Teamers attempt to achieve RCE on systems hosting or interacting with AI Learn more from the following resources: -- [@article@Exploiting LLMs with Code Execution (GitHub Gist)](https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516) - Example of achieving code execution via LLM manipulation. -- [@article@What is remote code execution? - Cloudflare](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) - Definition and explanation of RCE. -- [@video@DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU) - Demonstrates RCE risks with LLM agents. +- [@article@Exploiting LLMs with Code Execution (GitHub Gist)](https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516) +- [@article@What is remote code execution?](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) +- [@video@DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU) diff --git a/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md b/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md index 7c2ceea41..a8869bb6f 100644 --- a/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md +++ b/src/data/roadmaps/ai-red-teaming/content/reporting-tools@BLnfNlA0C4yzy1dvifjwx.md @@ -4,6 +4,6 @@ AI Red Teamers use reporting techniques and potentially tools to clearly documen Learn more from the following resources: -- [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) (Mentions reporting and templates) -- [@guide@Penetration Testing Report: 6 Key Sections and 4 Best Practices - Bright Security](https://brightsec.com/blog/penetration-testing-report/) - General best practices for reporting security findings. -- [@guide@Penetration testing best practices: Strategies for all test types - Strike Graph](https://www.strikegraph.com/blog/pen-testing-best-practices) - Includes tips on documentation. +- [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) +- [@guide@Penetration Testing Report: 6 Key Sections and 4 Best Practices](https://brightsec.com/blog/penetration-testing-report/) +- [@guide@Penetration testing best practices: Strategies for all test types](https://www.strikegraph.com/blog/pen-testing-best-practices) diff --git a/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md b/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md index 2a326a2c5..e33851b0a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md +++ b/src/data/roadmaps/ai-red-teaming/content/research-groups@ZlR03pM-sqVFZNhD1gMSJ.md @@ -4,7 +4,7 @@ Following and potentially contributing to research groups at universities (like Learn more from the following resources: -- [@group@AI Cybersecurity | Global Cyber Security Capacity Centre (Oxford)](https://gcscc.ox.ac.uk/ai-security) - Academic research center. -- [@group@Anthropic Research](https://www.anthropic.com/research) - AI safety research lab. -- [@group@Center for AI Safety](https://www.safe.ai/) - Non-profit research organization. -- [@group@The AI Security Institute (AISI)](https://www.aisi.gov.uk/) - UK government institute focused on AI safety/security research. +- [@group@AI Cybersecurity | Global Cyber Security Capacity Centre (Oxford)](https://gcscc.ox.ac.uk/ai-security) +- [@group@Anthropic Research](https://www.anthropic.com/research) +- [@group@Center for AI Safety](https://www.safe.ai/) +- [@group@The AI Security Institute (AISI)](https://www.aisi.gov.uk/) diff --git a/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md b/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md index b4ce5312e..75a8f71ee 100644 --- a/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md +++ b/src/data/roadmaps/ai-red-teaming/content/research-opportunities@VmaIHVsCpq2um_0cA33V3.md @@ -4,6 +4,6 @@ AI Red Teaming relies on ongoing research. Key areas needing further investigati Learn more from the following resources: -- [@article@Cutting-Edge Research on AI Security bolstered with new Challenge Fund - GOV.UK](https://www.gov.uk/government/news/cutting-edge-research-on-ai-security-bolstered-with-new-challenge-fund-to-ramp-up-public-trust-and-adoption) - Highlights government funding for AI security research priorities. -- [@research@Careers | The AI Security Institute (AISI)](https://www.aisi.gov.uk/careers) - Outlines research focus areas for the UK's AISI. -- [@research@Research - Anthropic](https://www.anthropic.com/research) - Example of research areas at a leading AI safety lab. +- [@article@Cutting-Edge Research on AI Security bolstered with new Challenge Fund](https://www.gov.uk/government/news/cutting-edge-research-on-ai-security-bolstered-with-new-challenge-fund-to-ramp-up-public-trust-and-adoption) +- [@research@Careers | The AI Security Institute (AISI)](https://www.aisi.gov.uk/careers) +- [@research@Research - Anthropic](https://www.anthropic.com/research) diff --git a/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md b/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md index 9aa3ce198..3863f9c4d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md +++ b/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md @@ -4,6 +4,6 @@ A critical practice for AI Red Teamers is responsible disclosure: privately repo Learn more from the following resources: -- [@guide@Responsible Disclosure of AI Vulnerabilities - Preamble AI](https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities) - Discusses the process specifically for AI vulnerabilities. -- [@guide@Vulnerability Disclosure Program | CISA](https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp) - Government VDP example. -- [@policy@Google Vulnerability Reward Program (VRP)](https://bughunters.google.com/) - Example of a major tech company's VDP/bug bounty program. +- [@guide@Responsible Disclosure of AI Vulnerabilities](https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities) +- [@guide@Vulnerability Disclosure Program](https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp) +- [@policy@Google Vulnerability Reward Program (VRP)](https://bughunters.google.com/) diff --git a/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md b/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md index ef1aad6ea..2979300b8 100644 --- a/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md +++ b/src/data/roadmaps/ai-red-teaming/content/risk-management@MupRvk_8Io2Hn7yEvU663.md @@ -4,6 +4,6 @@ AI Red Teamers contribute to the AI risk management process by identifying and d Learn more from the following resources: -- [@framework@NIST AI Risk Management Framework](https://www.nist.gov/itl/ai-risk-management-framework) - Key framework for managing AI-specific risks. -- [@guide@A Beginner's Guide to Cybersecurity Risks and Vulnerabilities - Champlain College Online](https://online.champlain.edu/blog/beginners-guide-cybersecurity-risk-management) - Foundational understanding of risk. -- [@guide@Cybersecurity Risk Management: Frameworks, Plans, and Best Practices - Hyperproof](https://hyperproof.io/resource/cybersecurity-risk-management-process/) - General guide applicable to AI system context. +- [@framework@NIST AI Risk Management Framework](https://www.nist.gov/itl/ai-risk-management-framework) +- [@guide@A Beginner's Guide to Cybersecurity Risks and Vulnerabilities](https://online.champlain.edu/blog/beginners-guide-cybersecurity-risk-management) +- [@guide@Cybersecurity Risk Management: Frameworks, Plans, and Best Practices](https://hyperproof.io/resource/cybersecurity-risk-management-process/) diff --git a/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md b/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md index a0532f58a..9f63171f4 100644 --- a/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md +++ b/src/data/roadmaps/ai-red-teaming/content/robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md @@ -4,6 +4,6 @@ AI Red Teamers assess whether choices made during model design (architecture sel Learn more from the following resources: -- [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) - Discusses strategies for building robust models. -- [@article@Understanding Robustness in Machine Learning - Alooba](https://www.alooba.com/skills/concepts/machine-learning/robustness/) - Explains the concept of ML robustness. -- [@paper@Towards Evaluating the Robustness of Neural Networks (arXiv by Goodfellow et al.)](https://arxiv.org/abs/1608.04644) - Foundational paper on evaluating robustness. +- [@article@Model Robustness: Building Reliable AI Models](https://encord.com/blog/model-robustness-machine-learning-strategies/) +- [@article@Understanding Robustness in Machine Learning](https://www.alooba.com/skills/concepts/machine-learning/robustness/) +- [@paper@Towards Evaluating the Robustness of Neural Networks (arXiv by Goodfellow et al.)](https://arxiv.org/abs/1608.04644) diff --git a/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md b/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md index 81bb09296..4626b20ea 100644 --- a/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md +++ b/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md @@ -4,6 +4,6 @@ The role of an AI Red Team is to rigorously challenge AI systems from an adversa Learn more from the following resources: -- [@article@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Discusses the purpose and process of red teaming. -- [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Outlines typical red team roles and responsibilities. -- [@article@What is AI Red Teaming? - Learn Prompting](https://learnprompting.org/docs/category/ai-red-teaming) - Defines the role and activities. +- [@article@The Complete Guide to Red Teaming: Process, Benefits & More](https://mindgard.ai/blog/red-teaming) +- [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) +- [@article@What is AI Red Teaming? - Learn Prompting](https://learnprompting.org/docs/category/ai-red-teaming) diff --git a/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md b/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md index 1415fc509..21641b928 100644 --- a/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md +++ b/src/data/roadmaps/ai-red-teaming/content/safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md @@ -4,6 +4,6 @@ AI Red Teamers specifically target the safety mechanisms (filters, guardrails) i Learn more from the following resources: -- [@article@Bypassing AI Content Filters | Restackio](https://www.restack.io/p/ai-driven-content-moderation-answer-bypass-filters-cat-ai) - Discusses techniques for evasion. -- [@article@How to Bypass Azure AI Content Safety Guardrails - Mindgard](https://mindgard.ai/blog/bypassing-azure-ai-content-safety-guardrails) - Case study on bypassing specific safety mechanisms. -- [@article@The Best Methods to Bypass AI Detection: Tips and Techniques - PopAi](https://www.popai.pro/resources/the-best-methods-to-bypass-ai-detection-tips-and-techniques/) - Focuses on evasion, relevant for filter bypass testing. +- [@article@Bypassing AI Content Filters](https://www.restack.io/p/ai-driven-content-moderation-answer-bypass-filters-cat-ai) +- [@article@How to Bypass Azure AI Content Safety Guardrails](https://mindgard.ai/blog/bypassing-azure-ai-content-safety-guardrails) +- [@article@The Best Methods to Bypass AI Detection: Tips and Techniques](https://www.popai.pro/resources/the-best-methods-to-bypass-ai-detection-tips-and-techniques/) diff --git a/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md b/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md index fc0a4d2b3..0da1b7cdf 100644 --- a/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md +++ b/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md @@ -4,7 +4,7 @@ Targeted training is crucial for mastering AI Red Teaming. Look for courses cove Learn more from the following resources: -- [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Curated list including free and paid options. -- [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Covers AI security risks and governance. -- [@course@Exploring Adversarial Machine Learning - NVIDIA](https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/) - Focused training on adversarial ML (paid). -- [@course@Free Online Cyber Security Courses with Certificates in 2025 - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/) - Offers foundational cybersecurity courses. +- [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) +- [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) +- [@course@Exploring Adversarial Machine Learning](https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/) +- [@course@Free Online Cyber Security Courses with Certificates in 2025](https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/) diff --git a/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md b/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md index 3a596965e..bc1d74208 100644 --- a/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md +++ b/src/data/roadmaps/ai-red-teaming/content/supervised-learning@NvOJIv36Utpm7_kOZyr79.md @@ -4,6 +4,6 @@ AI Red Teamers analyze systems built using supervised learning to probe for vuln Learn more from the following resources: -- [@article@AI and cybersecurity: a love-hate revolution - Alter Solutions](https://www.alter-solutions.com/en-us/articles/ai-cybersecurity-love-hate-revolution) - Discusses supervised learning use in vulnerability scanning and potential exploits. -- [@article@What Is Supervised Learning? | IBM](https://www.ibm.com/think/topics/supervised-learning) - Foundational explanation. -- [@article@What is Supervised Learning? | Google Cloud](https://cloud.google.com/discover/what-is-supervised-learning) - Foundational explanation. +- [@article@AI and cybersecurity: a love-hate revolution](https://www.alter-solutions.com/en-us/articles/ai-cybersecurity-love-hate-revolution) +- [@article@What Is Supervised Learning?](https://www.ibm.com/think/topics/supervised-learning) +- [@article@What is Supervised Learning?](https://cloud.google.com/discover/what-is-supervised-learning) diff --git a/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md b/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md index 5646b984d..328b5fe5a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md +++ b/src/data/roadmaps/ai-red-teaming/content/testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md @@ -4,8 +4,8 @@ Platforms used by AI Red Teamers range from general penetration testing OS distr Learn more from the following resources: -- [@tool@AI Red Teaming Agent - Azure AI Foundry | Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent) - Microsoft's tool leveraging PyRIT. -- [@tool@Kali Linux](https://www.kali.org/) - Standard pentesting distribution. -- [@tool@OWASP Zed Attack Proxy (ZAP)](https://owasp.org/www-project-zap/) - Widely used for web/API security testing. -- [@tool@Promptfoo](https://www.promptfoo.dev/) - Open-source tool for testing and evaluating LLMs, includes red teaming features. -- [@tool@PyRIT (Python Risk Identification Tool for generative AI) - GitHub](https://github.com/Azure/PyRIT) - Open-source framework from Microsoft. +- [@tool@AI Red Teaming Agent - Azure AI Foundry | Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent) +- [@tool@Kali Linux](https://www.kali.org/) +- [@tool@OWASP Zed Attack Proxy (ZAP)](https://owasp.org/www-project-zap/) +- [@tool@Promptfoo](https://www.promptfoo.dev/) +- [@tool@PyRIT (Python Risk Identification Tool for generative AI)](https://github.com/Azure/PyRIT) diff --git a/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md b/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md index 8349d5d2a..3e77f9ac5 100644 --- a/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md +++ b/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md @@ -4,7 +4,7 @@ AI Red Teams apply threat modeling to identify unique attack surfaces in AI syst Learn more from the following resources: -- [@article@Core Components of AI Red Team Exercises (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Describes threat modeling as the first phase of an AI red team engagement. -- [@guide@Threat Modeling Process | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling_Process) - More detailed process steps. -- [@guide@Threat Modeling | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling) - General threat modeling process applicable to AI context. -- [@video@How Microsoft Approaches AI Red Teaming (MS Build)](https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/) - Video on Microsoft’s AI red team process, including threat modeling specific to AI. +- [@article@Core Components of AI Red Team Exercises (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) +- [@guide@Threat Modeling Process](https://owasp.org/www-community/Threat_Modeling_Process) +- [@guide@Threat Modeling](https://owasp.org/www-community/Threat_Modeling) +- [@video@How Microsoft Approaches AI Red Teaming (MS Build)](https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/) diff --git a/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md b/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md index abefc0554..b3bfb1d56 100644 --- a/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md +++ b/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md @@ -4,6 +4,6 @@ AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow Learn more from the following resources: -- [@article@Unauthorized Data Access via LLMs (Security Boulevard)](https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/) - Discusses risks of LLMs accessing unauthorized data. -- [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) - Covers API risks like broken access control relevant to AI systems. -- [@paper@AI System Abuse Cases (Harvard Belfer Center)](https://www.belfercenter.org/publication/ai-system-abuse-cases) - Covers various ways AI systems can be abused, including access violations. +- [@article@Unauthorized Data Access via LLMs (Security Boulevard)](https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/) +- [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) +- [@paper@AI System Abuse Cases (Harvard Belfer Center)](https://www.belfercenter.org/publication/ai-system-abuse-cases) diff --git a/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md b/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md index d9b11f673..1cbb43e75 100644 --- a/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md +++ b/src/data/roadmaps/ai-red-teaming/content/unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md @@ -4,5 +4,5 @@ When red teaming AI systems using unsupervised learning (e.g., clustering algori Learn more from the following resources: -- [@article@How Unsupervised Learning Works with Examples - Coursera](https://www.coursera.org/articles/unsupervised-learning) - Foundational explanation with examples. -- [@article@Supervised vs. Unsupervised Learning: Which Approach is Best? - DigitalOcean](https://www.digitalocean.com/resources/articles/supervised-vs-unsupervised-learning) - Contrasts learning types, relevant for understanding different attack surfaces. +- [@article@How Unsupervised Learning Works with Examples](https://www.coursera.org/articles/unsupervised-learning) +- [@article@Supervised vs. Unsupervised Learning: Which Approach is Best?](https://www.digitalocean.com/resources/articles/supervised-vs-unsupervised-learning) diff --git a/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md b/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md index be2d34566..aa723865c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md +++ b/src/data/roadmaps/ai-red-teaming/content/vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md @@ -4,6 +4,6 @@ While general vulnerability assessment scans infrastructure, AI Red Teaming exte Learn more from the following resources: -- [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses vulnerability assessment within AI red teaming for critical systems. -- [@guide@The Ultimate Guide to Vulnerability Assessment - Strobes Security](https://strobes.co/blog/guide-vulnerability-assessment/) - Comprehensive guide on VA process (apply concepts to AI). -- [@guide@Vulnerability Scanning Tools | OWASP Foundation](https://owasp.org/www-community/Vulnerability_Scanning_Tools) - List of tools useful in broader system assessment around AI. +- [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) +- [@guide@The Ultimate Guide to Vulnerability Assessment](https://strobes.co/blog/guide-vulnerability-assessment/) +- [@guide@Vulnerability Scanning Tools](https://owasp.org/www-community/Vulnerability_Scanning_Tools) diff --git a/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md b/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md index ef2567934..0b6a689ff 100644 --- a/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md +++ b/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md @@ -4,6 +4,6 @@ White-box testing in AI Red Teaming grants the tester full access to the model's Learn more from the following resources: -- [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types. -- [@article@White-Box Adversarial Examples (OpenAI Blog)](https://openai.com/research/adversarial-robustness-toolbox) - Discusses generating attacks with full model knowledge. -- [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Mentions white-box testing benefits for LLMs. +- [@article@Black-Box, Gray Box, and White-Box Penetration Testing](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) +- [@article@White-Box Adversarial Examples (OpenAI Blog)](https://openai.com/research/adversarial-robustness-toolbox) +- [@guide@LLM red teaming guide (open source)](https://www.promptfoo.dev/docs/red-team/) From 3e059cc3e912f475166256e279f8e00a2285317f Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Sat, 26 Apr 2025 12:56:24 +0100 Subject: [PATCH 10/31] Fix broken URLs --- .../why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md b/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md index 90bf8ff26..b72392378 100644 --- a/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md +++ b/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md @@ -1,10 +1,3 @@ # Why Red Team AI Systems? -AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment. - -Learn more from the following resources: - -@article@What's the Difference Between Traditional Red-Teaming and AI Red-Teaming? - Cranium AI - Compares objectives, techniques, expertise, and attack vectors to highlight why AI needs specialized red teaming. -@article@What is AI Red Teaming? The Complete Guide - Mindgard - Details specific use cases like identifying bias, ensuring resilience against AI-specific attacks, testing data privacy, and aligning with regulations. -@article@The Expanding Role of Red Teaming in Defending AI Systems - Protect AI - Explains why the dynamic, adaptive, and often opaque nature of AI necessitates red teaming beyond traditional approaches. -@article@How red teaming helps safeguard the infrastructure behind AI models - IBM - Focuses on unique AI risks like model IP theft, open-source vulnerabilities, and excessive agency that red teaming addresses. \ No newline at end of file +AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment. \ No newline at end of file From 107fa4842ca5f053436a882f4d82dd7f1db8214f Mon Sep 17 00:00:00 2001 From: Vedansh Date: Sat, 26 Apr 2025 17:36:51 +0530 Subject: [PATCH 11/31] cybersecurity: adjust few topic links (#8520) * adjust content in few topics. * Update src/data/roadmaps/cyber-security/content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md * Update antimalware@9QtY1hMJ7NKLFztYK-mHY.md --------- Co-authored-by: Arik Chakma --- .../content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md | 3 ++- .../content/antivirus@3140n5prZYySsuBHjqGOJ.md | 4 ++-- .../cyber-security/content/anyrun@GZHFR43UzN0WIIxGKZOdX.md | 2 +- .../cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md | 6 +++--- .../cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md | 3 ++- .../cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md | 3 ++- ...authentication-vs-authorization@WG7DdsxESm31VcLFfkVTz.md | 4 +++- .../cyber-security/content/autopsy@bIwpjIoxSUZloxDuQNpMu.md | 2 +- .../cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md | 4 ++-- .../cyber-security/content/azure@GklBi7Qx1akN_cS9UMrha.md | 2 +- src/data/roadmaps/cyber-security/cyber-security.md | 2 -- 11 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/data/roadmaps/cyber-security/content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md b/src/data/roadmaps/cyber-security/content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md index 5b9347344..b9c2abb9e 100644 --- a/src/data/roadmaps/cyber-security/content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md +++ b/src/data/roadmaps/cyber-security/content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md @@ -4,5 +4,6 @@ Anti-malware is a type of software designed to detect, prevent, and remove malic Learn more from the following resources: +- [@article@Anti-malware Definition](https://www.computertechreviews.com/definition/anti-malware/) - [@video@How Does Antivirus and Antimalware Software Work?](https://www.youtube.com/watch?v=bTU1jbVXlmM) -- [@article@What is antimalware?](https://riskxchange.co/1006974/cybersecurity-what-is-anti-malware/) \ No newline at end of file +- [@article@What is Antimalware?](https://riskxchange.co/1006974/cybersecurity-what-is-anti-malware/) diff --git a/src/data/roadmaps/cyber-security/content/antivirus@3140n5prZYySsuBHjqGOJ.md b/src/data/roadmaps/cyber-security/content/antivirus@3140n5prZYySsuBHjqGOJ.md index 128933e1d..fb8ee32b3 100644 --- a/src/data/roadmaps/cyber-security/content/antivirus@3140n5prZYySsuBHjqGOJ.md +++ b/src/data/roadmaps/cyber-security/content/antivirus@3140n5prZYySsuBHjqGOJ.md @@ -4,5 +4,5 @@ Antivirus software is a specialized program designed to detect, prevent, and rem Learn more from the following resources: -- [@video@What is an antivirus and how does it keep us safe?](https://www.youtube.com/watch?v=jW626WMWNAE) -- [@article@What is antivirus software?](https://www.webroot.com/gb/en/resources/tips-articles/what-is-anti-virus-software) \ No newline at end of file +- [@video@What is an Antivirus and how does it keep us safe?](https://www.youtube.com/watch?v=jW626WMWNAE) +- [@article@What is Antivirus Software?](https://www.webroot.com/gb/en/resources/tips-articles/what-is-anti-virus-software) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/anyrun@GZHFR43UzN0WIIxGKZOdX.md b/src/data/roadmaps/cyber-security/content/anyrun@GZHFR43UzN0WIIxGKZOdX.md index f43c75583..8166e32b0 100644 --- a/src/data/roadmaps/cyber-security/content/anyrun@GZHFR43UzN0WIIxGKZOdX.md +++ b/src/data/roadmaps/cyber-security/content/anyrun@GZHFR43UzN0WIIxGKZOdX.md @@ -4,5 +4,5 @@ ANY.RUN is an interactive online malware analysis platform that allows users to Learn more from the following resources: -- [@official@ANY.RUN Website](https://any.run/) +- [@official@Any.run](https://any.run/) - [@video@Malware analysis with ANY.RUN](https://www.youtube.com/watch?v=QH_u7DHKzzI) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md b/src/data/roadmaps/cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md index 250418c9c..42a51e4f0 100644 --- a/src/data/roadmaps/cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md +++ b/src/data/roadmaps/cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md @@ -6,8 +6,8 @@ When one device on a LAN wants to communicate with another, it needs to know the Once the requesting device receives the MAC address, it updates its ARP cache—a table that stores IP-to-MAC address mappings—allowing it to send data directly to the correct hardware address. +Learn more from the following resources: -Learn more from the following resources: - +- [@article@ARP - Wikipedia](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) - [@video@ARP Explained](https://www.youtube.com/watch?v=cn8Zxh9bPio) -- [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp) +- [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md b/src/data/roadmaps/cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md index 331fdb03c..7e2610bf2 100644 --- a/src/data/roadmaps/cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md +++ b/src/data/roadmaps/cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md @@ -2,7 +2,8 @@ ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address. -Learn more from the following resources: +Learn more from the following resources: +- [@article@ARP - Wikipedia](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) - [@video@ARP Explained](https://www.youtube.com/watch?v=cn8Zxh9bPio) - [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md b/src/data/roadmaps/cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md index 331fdb03c..7e2610bf2 100644 --- a/src/data/roadmaps/cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md +++ b/src/data/roadmaps/cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md @@ -2,7 +2,8 @@ ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address. -Learn more from the following resources: +Learn more from the following resources: +- [@article@ARP - Wikipedia](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) - [@video@ARP Explained](https://www.youtube.com/watch?v=cn8Zxh9bPio) - [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/authentication-vs-authorization@WG7DdsxESm31VcLFfkVTz.md b/src/data/roadmaps/cyber-security/content/authentication-vs-authorization@WG7DdsxESm31VcLFfkVTz.md index d9ea8deed..12c24017f 100644 --- a/src/data/roadmaps/cyber-security/content/authentication-vs-authorization@WG7DdsxESm31VcLFfkVTz.md +++ b/src/data/roadmaps/cyber-security/content/authentication-vs-authorization@WG7DdsxESm31VcLFfkVTz.md @@ -1,9 +1,11 @@ -## Authentication vs Authorization +# Authentication vs Authorization **Authentication** is the process of validating the identity of a user, device, or system. It confirms that the entity attempting to access the resource is who or what they claim to be. The most common form of authentication is the use of usernames and passwords. Other methods include: **Authorization** comes into play after the authentication process is complete. It involves granting or denying access to a resource, based on the authenticated user's privileges. Authorization determines what actions the authenticated user or entity is allowed to perform within a system or application. +Learn more from the following resources: + - [@article@Two-factor authentication (2FA)](https://authy.com/what-is-2fa/) - [@article@Biometrics (fingerprint, facial recognition, etc.)](https://me-en.kaspersky.com/resource-center/definitions/biometrics) - [@article@Security tokens or certificates](https://www.comodo.com/e-commerce/ssl-certificates/certificate.php) diff --git a/src/data/roadmaps/cyber-security/content/autopsy@bIwpjIoxSUZloxDuQNpMu.md b/src/data/roadmaps/cyber-security/content/autopsy@bIwpjIoxSUZloxDuQNpMu.md index 81ab2af47..845a9419b 100644 --- a/src/data/roadmaps/cyber-security/content/autopsy@bIwpjIoxSUZloxDuQNpMu.md +++ b/src/data/roadmaps/cyber-security/content/autopsy@bIwpjIoxSUZloxDuQNpMu.md @@ -4,5 +4,5 @@ Autopsy is a versatile and powerful open-source digital forensics platform that Learn more from the following resources: -- [@official@Autopsy Website](https://www.autopsy.com/) +- [@official@Autopsy](https://www.autopsy.com/) - [@video@Disk analysis with Autopsy](https://www.youtube.com/watch?v=o6boK9dG-Lc&t=236s) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md b/src/data/roadmaps/cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md index 702f106f6..fb5d5a631 100644 --- a/src/data/roadmaps/cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md +++ b/src/data/roadmaps/cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md @@ -4,8 +4,8 @@ Amazon Web Services (AWS) is a leading cloud computing platform provided by Amaz Learn more from the following resources: -- [@roadmap@AWS Roadmap](https://roadmap.sh/aws) -- [@official@AWS Website](https://aws.amazon.com) +- [@roadmap@Visit Dedicated AWS Roadmap](https://roadmap.sh/aws) +- [@official@AWS](https://aws.amazon.com) - [@article@How to create an AWS account](https://grapplingdev.com/tutorials/how-to-create-aws-account) - [@video@AWS Overview](https://www.youtube.com/watch?v=a9__D53WsUs) - [@course@AWS Complete Tutorial](https://www.youtube.com/watch?v=B8i49C8fC3E) diff --git a/src/data/roadmaps/cyber-security/content/azure@GklBi7Qx1akN_cS9UMrha.md b/src/data/roadmaps/cyber-security/content/azure@GklBi7Qx1akN_cS9UMrha.md index c1b8bbd4a..74e9b7d25 100644 --- a/src/data/roadmaps/cyber-security/content/azure@GklBi7Qx1akN_cS9UMrha.md +++ b/src/data/roadmaps/cyber-security/content/azure@GklBi7Qx1akN_cS9UMrha.md @@ -4,6 +4,6 @@ Azure is Microsoft's comprehensive cloud computing platform that offers a wide r Learn more from the following resources: -- [@official@Azure Website](https://azure.microsoft.com) +- [@official@Azure](https://azure.microsoft.com) - [@video@Azure DevOps Tutorial for Beginners](https://www.youtube.com/watch?v=4BibQ69MD8c) - [@feed@daily.dev Azure Feed](https://app.daily.dev/tags/azure) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/cyber-security.md b/src/data/roadmaps/cyber-security/cyber-security.md index c52b840bf..fa1c17fd4 100644 --- a/src/data/roadmaps/cyber-security/cyber-security.md +++ b/src/data/roadmaps/cyber-security/cyber-security.md @@ -28,7 +28,6 @@ seo: - 'cyber security skills' - 'guide to cyber security' - 'cyber security roadmap' - - 'cyber security skills' - 'cyber security skills test' - 'skills for cyber security' - 'what is cyber security' @@ -38,7 +37,6 @@ seo: - 'cyber security expert roadmap' - 'become a cyber security expert' - 'cyber security expert career path' - - 'cyber security expert' - 'modern cyber security expert' relatedRoadmaps: - 'backend' From b7f94a7679397314c504352c79f285830148ec96 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 01:41:31 +0100 Subject: [PATCH 12/31] chore: update roadmap content json (#8564) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/ai-red-teaming.json | 1382 ++++++++++++++++++-- public/roadmap-content/cyber-security.json | 88 +- 2 files changed, 1317 insertions(+), 153 deletions(-) diff --git a/public/roadmap-content/ai-red-teaming.json b/public/roadmap-content/ai-red-teaming.json index ad730b55c..bb15d8009 100644 --- a/public/roadmap-content/ai-red-teaming.json +++ b/public/roadmap-content/ai-red-teaming.json @@ -1,322 +1,1450 @@ { "R9DQNc0AyAQ2HLpP4HOk6": { "title": "AI Security Fundamentals", - "description": "This covers the foundational concepts essential for AI Red Teaming, bridging traditional cybersecurity with AI-specific threats. An AI Red Teamer must understand common vulnerabilities in ML models (like evasion or poisoning), security risks in the AI lifecycle (from data collection to deployment), and how AI capabilities can be misused. This knowledge forms the basis for designing effective tests against AI systems.\n\nLearn more from the following resources:\n\n* [@article@Building Trustworthy AI: Contending with Data Poisoning - Nisos](https://nisos.com/research/building-trustworthy-ai/) - Explores data poisoning threats in AI/ML.\n* [@article@What Is Adversarial AI in Machine Learning? - Palo Alto Networks](https://www.paloaltonetworks.co.uk/cyberpedia/what-are-adversarial-attacks-on-AI-Machine-Learning) - Overview of adversarial attacks targeting AI/ML systems.\n* [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Foundational course covering AI risks, governance, security, and privacy.", - "links": [] + "description": "This covers the foundational concepts essential for AI Red Teaming, bridging traditional cybersecurity with AI-specific threats. An AI Red Teamer must understand common vulnerabilities in ML models (like evasion or poisoning), security risks in the AI lifecycle (from data collection to deployment), and how AI capabilities can be misused. This knowledge forms the basis for designing effective tests against AI systems.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Security | Coursera", + "url": "https://www.coursera.org/learn/ai-security", + "type": "course" + }, + { + "title": "Building Trustworthy AI: Contending with Data Poisoning", + "url": "https://nisos.com/research/building-trustworthy-ai/", + "type": "article" + }, + { + "title": "What Is Adversarial AI in Machine Learning?", + "url": "https://www.paloaltonetworks.co.uk/cyberpedia/what-are-adversarial-attacks-on-AI-Machine-Learning", + "type": "article" + } + ] }, "fNTb9y3zs1HPYclAmu_Wv": { "title": "Why Red Team AI Systems?", - "description": "AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment.\n\nLearn more from the following resources:\n\n@article@What's the Difference Between Traditional Red-Teaming and AI Red-Teaming? - Cranium AI - Compares objectives, techniques, expertise, and attack vectors to highlight why AI needs specialized red teaming. @article@What is AI Red Teaming? The Complete Guide - Mindgard - Details specific use cases like identifying bias, ensuring resilience against AI-specific attacks, testing data privacy, and aligning with regulations. @article@The Expanding Role of Red Teaming in Defending AI Systems - Protect AI - Explains why the dynamic, adaptive, and often opaque nature of AI necessitates red teaming beyond traditional approaches. @article@How red teaming helps safeguard the infrastructure behind AI models - IBM - Focuses on unique AI risks like model IP theft, open-source vulnerabilities, and excessive agency that red teaming addresses.", + "description": "AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment.", "links": [] }, "HFJIYcI16OMyM77fAw9af": { "title": "Introduction", - "description": "AI Red Teaming is the practice of simulating adversarial attacks against AI systems to proactively identify vulnerabilities, potential misuse scenarios, and failure modes before malicious actors do. Distinct from traditional cybersecurity red teaming, it focuses on the unique attack surfaces of AI models, such as prompt manipulation, data poisoning, model extraction, and evasion techniques. The primary goal for an AI Red Teamer is to test the robustness, safety, alignment, and fairness of AI systems, particularly complex ones like LLMs, by adopting an attacker's mindset to uncover hidden flaws and provide actionable feedback for improvement.\n\nLearn more from the following resources:\n\n* [@article@A Guide to AI Red Teaming - HiddenLayer](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) - Discusses AI red teaming concepts and contrasts with traditional methods.\n* [@article@What is AI Red Teaming? (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Overview of AI red teaming, its history, and key challenges.\n* [@article@What is AI Red Teaming? The Complete Guide - Mindgard](https://mindgard.ai/blog/what-is-ai-red-teaming) - Guide covering AI red teaming processes, use cases, and benefits.\n* [@podcast@Red Team Podcast | AI Red Teaming Insights & Defense Strategies - Mindgard](https://mindgard.ai/podcast/red-team) - Podcast series covering AI red teaming trends and strategies.", - "links": [] + "description": "AI Red Teaming is the practice of simulating adversarial attacks against AI systems to proactively identify vulnerabilities, potential misuse scenarios, and failure modes before malicious actors do. Distinct from traditional cybersecurity red teaming, it focuses on the unique attack surfaces of AI models, such as prompt manipulation, data poisoning, model extraction, and evasion techniques. The primary goal for an AI Red Teamer is to test the robustness, safety, alignment, and fairness of AI systems, particularly complex ones like LLMs, by adopting an attacker's mindset to uncover hidden flaws and provide actionable feedback for improvement.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Red Team Podcast - AI Red Teaming Insights & Defense Strategies", + "url": "https://mindgard.ai/podcast/red-team", + "type": "podcast" + }, + { + "title": "A Guide to AI Red Teaming", + "url": "https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/", + "type": "article" + }, + { + "title": "What is AI Red Teaming? (Learn Prompting)", + "url": "https://learnprompting.org/blog/what-is-ai-red-teaming", + "type": "article" + }, + { + "title": "What is AI Red Teaming? The Complete Guide", + "url": "https://mindgard.ai/blog/what-is-ai-red-teaming", + "type": "article" + } + ] }, "1gyuEV519LjN-KpROoVwv": { "title": "Ethical Considerations", - "description": "Ethical conduct is crucial for AI Red Teamers. While simulating attacks, they must operate within strict legal and ethical boundaries defined by rules of engagement, focusing on improving safety without causing real harm or enabling misuse. This includes respecting data privacy, obtaining consent where necessary, responsibly disclosing vulnerabilities, and carefully considering the potential negative impacts of both the testing process and the AI capabilities being tested. The goal is discovery for defense, not exploitation.\n\nLearn more from the following resources:\n\n* [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions balancing attack simulation with ethical constraints.\n* [@article@Responsible AI assessment - Responsible AI | Coursera](https://www.coursera.org/learn/ai-security) (Module within AI Security course)\n* [@guide@Responsible AI Principles (Microsoft)](https://www.microsoft.com/en-us/ai/responsible-ai) - Example of corporate responsible AI guidelines influencing ethical testing.\n* [@video@Questions to Guide AI Red-Teaming (CMU SEI)](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382) - Key questions and ethical guidelines for AI red teaming activities (video talk).", - "links": [] + "description": "Ethical conduct is crucial for AI Red Teamers. While simulating attacks, they must operate within strict legal and ethical boundaries defined by rules of engagement, focusing on improving safety without causing real harm or enabling misuse. This includes respecting data privacy, obtaining consent where necessary, responsibly disclosing vulnerabilities, and carefully considering the potential negative impacts of both the testing process and the AI capabilities being tested. The goal is discovery for defense, not exploitation.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Red-Teaming in AI Testing: Stress Testing", + "url": "https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/", + "type": "article" + }, + { + "title": "Responsible AI assessment - Responsible AI | Coursera", + "url": "https://www.coursera.org/learn/ai-security", + "type": "article" + }, + { + "title": "Responsible AI Principles (Microsoft)", + "url": "https://www.microsoft.com/en-us/ai/responsible-ai", + "type": "article" + }, + { + "title": "Questions to Guide AI Red-Teaming (CMU SEI)", + "url": "https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382", + "type": "video" + } + ] }, "Irkc9DgBfqSn72WaJqXEt": { "title": "Role of Red Teams", - "description": "The role of an AI Red Team is to rigorously challenge AI systems from an adversarial perspective. They design and execute tests to uncover vulnerabilities related to the model's logic, data dependencies, prompt interfaces, safety alignments, and interactions with surrounding infrastructure. They provide detailed reports on findings, potential impacts, and remediation advice, acting as a critical feedback loop for AI developers and stakeholders to improve system security and trustworthiness before and after deployment.\n\nLearn more from the following resources:\n\n* [@article@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Discusses the purpose and process of red teaming.\n* [@article@The Complete Red Teaming Checklist \\[PDF\\]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Outlines typical red team roles and responsibilities.\n* [@article@What is AI Red Teaming? - Learn Prompting](https://learnprompting.org/docs/category/ai-red-teaming) - Defines the role and activities.", - "links": [] + "description": "The role of an AI Red Team is to rigorously challenge AI systems from an adversarial perspective. They design and execute tests to uncover vulnerabilities related to the model's logic, data dependencies, prompt interfaces, safety alignments, and interactions with surrounding infrastructure. They provide detailed reports on findings, potential impacts, and remediation advice, acting as a critical feedback loop for AI developers and stakeholders to improve system security and trustworthiness before and after deployment.\n\nLearn more from the following resources:", + "links": [ + { + "title": "The Complete Guide to Red Teaming: Process, Benefits & More", + "url": "https://mindgard.ai/blog/red-teaming", + "type": "article" + }, + { + "title": "The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI", + "url": "https://mindgard.ai/blog/red-teaming-checklist", + "type": "article" + }, + { + "title": "What is AI Red Teaming? - Learn Prompting", + "url": "https://learnprompting.org/docs/category/ai-red-teaming", + "type": "article" + } + ] }, "NvOJIv36Utpm7_kOZyr79": { "title": "Supervised Learning", - "description": "AI Red Teamers analyze systems built using supervised learning to probe for vulnerabilities like susceptibility to adversarial examples designed to cause misclassification, sensitivity to data distribution shifts, or potential for data leakage related to the labeled training data. Understanding how these models learn input-output mappings is key to devising tests that challenge their learned boundaries.\n\nLearn more from the following resources:\n\n* [@article@AI and cybersecurity: a love-hate revolution - Alter Solutions](https://www.alter-solutions.com/en-us/articles/ai-cybersecurity-love-hate-revolution) - Discusses supervised learning use in vulnerability scanning and potential exploits.\n* [@article@What Is Supervised Learning? | IBM](https://www.ibm.com/think/topics/supervised-learning) - Foundational explanation.\n* [@article@What is Supervised Learning? | Google Cloud](https://cloud.google.com/discover/what-is-supervised-learning) - Foundational explanation.", - "links": [] + "description": "AI Red Teamers analyze systems built using supervised learning to probe for vulnerabilities like susceptibility to adversarial examples designed to cause misclassification, sensitivity to data distribution shifts, or potential for data leakage related to the labeled training data. Understanding how these models learn input-output mappings is key to devising tests that challenge their learned boundaries.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI and cybersecurity: a love-hate revolution", + "url": "https://www.alter-solutions.com/en-us/articles/ai-cybersecurity-love-hate-revolution", + "type": "article" + }, + { + "title": "What Is Supervised Learning?", + "url": "https://www.ibm.com/think/topics/supervised-learning", + "type": "article" + }, + { + "title": "What is Supervised Learning?", + "url": "https://cloud.google.com/discover/what-is-supervised-learning", + "type": "article" + } + ] }, "ZC0yKsu-CJC-LZKKo2pLD": { "title": "Unsupervised Learning", - "description": "When red teaming AI systems using unsupervised learning (e.g., clustering algorithms), focus areas include assessing whether the discovered patterns reveal sensitive information, if the model can be manipulated to group data incorrectly, or if dimensionality reduction techniques obscure security-relevant features. Understanding these models helps identify risks associated with pattern discovery on unlabeled data.\n\nLearn more from the following resources:\n\n* [@article@How Unsupervised Learning Works with Examples - Coursera](https://www.coursera.org/articles/unsupervised-learning) - Foundational explanation with examples.\n* [@article@Supervised vs. Unsupervised Learning: Which Approach is Best? - DigitalOcean](https://www.digitalocean.com/resources/articles/supervised-vs-unsupervised-learning) - Contrasts learning types, relevant for understanding different attack surfaces.", - "links": [] + "description": "When red teaming AI systems using unsupervised learning (e.g., clustering algorithms), focus areas include assessing whether the discovered patterns reveal sensitive information, if the model can be manipulated to group data incorrectly, or if dimensionality reduction techniques obscure security-relevant features. Understanding these models helps identify risks associated with pattern discovery on unlabeled data.\n\nLearn more from the following resources:", + "links": [ + { + "title": "How Unsupervised Learning Works with Examples", + "url": "https://www.coursera.org/articles/unsupervised-learning", + "type": "article" + }, + { + "title": "Supervised vs. Unsupervised Learning: Which Approach is Best?", + "url": "https://www.digitalocean.com/resources/articles/supervised-vs-unsupervised-learning", + "type": "article" + } + ] }, "Xqzc4mOKsVzwaUxLGjHya": { "title": "Reinforcement Learning", - "description": "Red teaming RL-based AI systems involves testing for vulnerabilities such as reward hacking (exploiting the reward function to induce unintended behavior), unsafe exploration (agent takes harmful actions during learning), or susceptibility to adversarial perturbations in the environment's state. Understanding the agent's policy and value functions is crucial for designing effective tests against RL agents.\n\nLearn more from the following resources:\n\n* [@article@Best Resources to Learn Reinforcement Learning - Towards Data Science](https://towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2/) - Curated list of RL learning resources.\n* [@article@What is reinforcement learning? - Blog - York Online Masters degrees](https://online.york.ac.uk/resources/what-is-reinforcement-learning/) - Foundational explanation.\n* [@course@Deep Reinforcement Learning Course by HuggingFace](https://huggingface.co/learn/deep-rl-course/unit0/introduction) - Comprehensive free course on Deep RL.\n* [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for red teaming and generating attacks.", - "links": [] + "description": "Red teaming RL-based AI systems involves testing for vulnerabilities such as reward hacking (exploiting the reward function to induce unintended behavior), unsafe exploration (agent takes harmful actions during learning), or susceptibility to adversarial perturbations in the environment's state. Understanding the agent's policy and value functions is crucial for designing effective tests against RL agents.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Deep Reinforcement Learning Course by HuggingFace", + "url": "https://huggingface.co/learn/deep-rl-course/unit0/introduction", + "type": "course" + }, + { + "title": "Resources to Learn Reinforcement Learning", + "url": "https://towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2/", + "type": "article" + }, + { + "title": "What is reinforcement learning?", + "url": "https://online.york.ac.uk/resources/what-is-reinforcement-learning/", + "type": "article" + }, + { + "title": "Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning", + "url": "https://arxiv.org/html/2412.18693v1", + "type": "article" + } + ] }, "RuKzVhd1nZphCrlW1wZGL": { "title": "Neural Networks", - "description": "Understanding neural network architectures (layers, nodes, activation functions) is vital for AI Red Teamers. This knowledge allows for targeted testing, such as crafting adversarial examples that exploit specific activation functions or identifying potential vulnerabilities related to network depth or connectivity. It provides insight into the 'black box' for more effective white/grey-box testing.\n\nLearn more from the following resources:\n\n* [@guide@Neural Networks Explained: A Beginner's Guide - SkillCamper](https://www.skillcamper.com/blog/neural-networks-explained-a-beginners-guide) - Foundational guide.\n* [@guide@Neural networks | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/crash-course/neural-networks) - Google's explanation within their ML crash course.\n* [@paper@Red Teaming with Artificial Intelligence-Driven Cyberattacks: A Scoping Review - arXiv](https://arxiv.org/html/2503.19626) - Review discussing AI methods like neural networks used in red teaming simulations.", - "links": [] + "description": "Understanding neural network architectures (layers, nodes, activation functions) is vital for AI Red Teamers. This knowledge allows for targeted testing, such as crafting adversarial examples that exploit specific activation functions or identifying potential vulnerabilities related to network depth or connectivity. It provides insight into the 'black box' for more effective white/grey-box testing.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Neural Networks Explained: A Beginner's Guide", + "url": "https://www.skillcamper.com/blog/neural-networks-explained-a-beginners-guide", + "type": "article" + }, + { + "title": "Neural networks | Machine Learning", + "url": "https://developers.google.com/machine-learning/crash-course/neural-networks", + "type": "article" + }, + { + "title": "Red Teaming with Artificial Intelligence-Driven Cyberattacks: A Scoping Review", + "url": "https://arxiv.org/html/2503.19626", + "type": "article" + } + ] }, "3XJ-g0KvHP75U18mxCqgw": { "title": "Generative Models", - "description": "AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to their widespread use and unique risks. Understanding how they generate content is key to testing for issues like generating harmful/biased outputs, deepfakes, prompt injection vulnerabilities, or leaking sensitive information from their vast training data.\n\nLearn more from the following resources:\n\n* [@article@An Introduction to Generative Models | MongoDB](https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models) - Explains basics and contrasts with discriminative models.\n* [@course@Generative AI for Beginners - Microsoft Open Source](https://microsoft.github.io/generative-ai-for-beginners/) - Free course covering fundamentals.\n* [@guide@Generative AI beginner's guide | Generative AI on Vertex AI - Google Cloud](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview) - Overview covering generative AI concepts and Google's platform context.", - "links": [] + "description": "AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to their widespread use and unique risks. Understanding how they generate content is key to testing for issues like generating harmful/biased outputs, deepfakes, prompt injection vulnerabilities, or leaking sensitive information from their vast training data.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Generative AI for Beginners", + "url": "https://microsoft.github.io/generative-ai-for-beginners/", + "type": "course" + }, + { + "title": "An Introduction to Generative Models", + "url": "https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models", + "type": "article" + }, + { + "title": "Generative AI beginner's guide", + "url": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview", + "type": "article" + } + ] }, "8K-wCn2cLc7Vs_V4sC3sE": { "title": "Large Language Models", - "description": "LLMs are a primary target for AI Red Teaming. Understanding their architecture (often Transformer-based), training processes (pre-training, fine-tuning), and capabilities (text generation, summarization, Q&A) is essential for identifying vulnerabilities like prompt injection, jailbreaking, data regurgitation, and emergent harmful behaviors specific to these large-scale models.\n\nLearn more from the following resources:\n\n* [@article@What is an LLM (large language model)? - Cloudflare](https://www.cloudflare.com/learning/ai/what-is-large-language-model/) - Concise explanation from Cloudflare.\n* [@guide@Introduction to Large Language Models - Learn Prompting](https://learnprompting.org/docs/intro_to_llms) - Learn Prompting's introduction.\n* [@guide@What Are Large Language Models? A Beginner's Guide for 2025 - KDnuggets](https://www.kdnuggets.com/large-language-models-beginners-guide-2025) - Overview of LLMs, how they work, strengths, and limitations.", - "links": [] + "description": "LLMs are a primary target for AI Red Teaming. Understanding their architecture (often Transformer-based), training processes (pre-training, fine-tuning), and capabilities (text generation, summarization, Q&A) is essential for identifying vulnerabilities like prompt injection, jailbreaking, data regurgitation, and emergent harmful behaviors specific to these large-scale models.\n\nLearn more from the following resources:", + "links": [ + { + "title": "What is an LLM (large language model)?", + "url": "https://www.cloudflare.com/learning/ai/what-is-large-language-model/", + "type": "article" + }, + { + "title": "Introduction to LLMs - Learn Prompting", + "url": "https://learnprompting.org/docs/intro_to_llms", + "type": "article" + }, + { + "title": "What Are Large Language Models? A Beginner's Guide for 2025", + "url": "https://www.kdnuggets.com/large-language-models-beginners-guide-2025", + "type": "article" + } + ] }, "gx4KaFqKgJX9n9_ZGMqlZ": { "title": "Prompt Engineering", - "description": "For AI Red Teamers, prompt engineering is both a tool and a target. It's a tool for crafting inputs to test model boundaries and vulnerabilities (e.g., creating jailbreak prompts). It's a target because understanding how prompts influence LLMs is key to identifying prompt injection vulnerabilities and designing defenses. Mastering prompt design is fundamental to effective LLM red teaming.\n\nLearn more from the following resources:\n\n* [@article@Introduction to Prompt Engineering - Datacamp](https://www.datacamp.com/tutorial/introduction-prompt-engineering) - Tutorial covering basics.\n* [@article@System Prompts - InjectPrompt](https://www.injectprompt.com/t/system-prompts) - Look at the system prompts of flagship LLMs.\n* [@course@Introduction to Prompt Engineering - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-engineering) - Foundational course from Learn Prompting.\n* [@guide@Prompt Engineering Guide - Learn Prompting](https://learnprompting.org/docs/prompt-engineering) - Comprehensive guide from Learn Prompting.\n* [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Connects prompt engineering directly to LLM red teaming concepts.", - "links": [] + "description": "For AI Red Teamers, prompt engineering is both a tool and a target. It's a tool for crafting inputs to test model boundaries and vulnerabilities (e.g., creating jailbreak prompts). It's a target because understanding how prompts influence LLMs is key to identifying prompt injection vulnerabilities and designing defenses. Mastering prompt design is fundamental to effective LLM red teaming.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Introduction to Prompt Engineering", + "url": "https://learnprompting.org/courses/intro-to-prompt-engineering", + "type": "course" + }, + { + "title": "Introduction to Prompt Engineering", + "url": "https://www.datacamp.com/tutorial/introduction-prompt-engineering", + "type": "article" + }, + { + "title": "System Prompts - InjectPrompt", + "url": "https://www.injectprompt.com/t/system-prompts", + "type": "article" + }, + { + "title": "Prompt Engineering Guide", + "url": "https://learnprompting.org/docs/prompt-engineering", + "type": "article" + }, + { + "title": "The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)", + "url": "https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts", + "type": "article" + } + ] }, "WZkIHZkV2qDYbYF9KBBRi": { "title": "Confidentiality, Integrity, Availability", - "description": "The CIA Triad is directly applicable in AI Red Teaming. Confidentiality tests focus on preventing leakage of training data or proprietary model details. Integrity tests probe for susceptibility to data poisoning or model manipulation. Availability tests assess resilience against denial-of-service attacks targeting the AI model or its supporting infrastructure.\n\nLearn more from the following resources:\n\n* [@article@Confidentiality, Integrity, Availability: Key Examples - DataSunrise](https://www.datasunrise.com/knowledge-center/confidentiality-integrity-availability-examples/) - Explains CIA triad with examples, mentioning AI/ML relevance.\n* [@article@The CIA Triad: Confidentiality, Integrity, Availability - Veeam](https://www.veeam.com/blog/cybersecurity-cia-triad-explained.html) - Breakdown of the three principles and how they apply.\n* [@article@What's The CIA Triad? Confidentiality, Integrity, & Availability, Explained | Splunk](https://www.splunk.com/en_us/blog/learn/cia-triad-confidentiality-integrity-availability.html) - Detailed explanation of the triad, mentioning modern updates and AI context.", - "links": [] + "description": "The CIA Triad is directly applicable in AI Red Teaming. Confidentiality tests focus on preventing leakage of training data or proprietary model details. Integrity tests probe for susceptibility to data poisoning or model manipulation. Availability tests assess resilience against denial-of-service attacks targeting the AI model or its supporting infrastructure.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Confidentiality, Integrity, Availability: Key Examples", + "url": "https://www.datasunrise.com/knowledge-center/confidentiality-integrity-availability-examples/", + "type": "article" + }, + { + "title": "The CIA Triad: Confidentiality, Integrity, Availability", + "url": "https://www.veeam.com/blog/cybersecurity-cia-triad-explained.html", + "type": "article" + }, + { + "title": "What's The CIA Triad? Confidentiality, Integrity, & Availability, Explained", + "url": "https://www.splunk.com/en_us/blog/learn/cia-triad-confidentiality-integrity-availability.html", + "type": "article" + } + ] }, "RDOaTBWP3aIJPUp_kcafm": { "title": "Threat Modeling", - "description": "AI Red Teams apply threat modeling to identify unique attack surfaces in AI systems, such as manipulating training data, exploiting prompt interfaces, attacking the model inference process, or compromising connected tools/APIs. Before attacking an AI system, red teamers perform threat modeling to map out possible adversaries (from curious users to state actors) and attack vectors, prioritizing tests based on likely impact and adversary capability.\n\nLearn more from the following resources:\n\n* [@article@Core Components of AI Red Team Exercises (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - Describes threat modeling as the first phase of an AI red team engagement.\n* [@guide@Threat Modeling Process | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling_Process) - More detailed process steps.\n* [@guide@Threat Modeling | OWASP Foundation](https://owasp.org/www-community/Threat_Modeling) - General threat modeling process applicable to AI context.\n* [@video@How Microsoft Approaches AI Red Teaming (MS Build)](https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/) - Video on Microsoft’s AI red team process, including threat modeling specific to AI.", - "links": [] + "description": "AI Red Teams apply threat modeling to identify unique attack surfaces in AI systems, such as manipulating training data, exploiting prompt interfaces, attacking the model inference process, or compromising connected tools/APIs. Before attacking an AI system, red teamers perform threat modeling to map out possible adversaries (from curious users to state actors) and attack vectors, prioritizing tests based on likely impact and adversary capability.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Core Components of AI Red Team Exercises (Learn Prompting)", + "url": "https://learnprompting.org/blog/what-is-ai-red-teaming", + "type": "article" + }, + { + "title": "Threat Modeling Process", + "url": "https://owasp.org/www-community/Threat_Modeling_Process", + "type": "article" + }, + { + "title": "Threat Modeling", + "url": "https://owasp.org/www-community/Threat_Modeling", + "type": "article" + }, + { + "title": "How Microsoft Approaches AI Red Teaming (MS Build)", + "url": "https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/", + "type": "video" + } + ] }, "MupRvk_8Io2Hn7yEvU663": { "title": "Risk Management", - "description": "AI Red Teamers contribute to the AI risk management process by identifying and demonstrating concrete vulnerabilities. Findings from red team exercises inform risk assessments, helping organizations understand the likelihood and potential impact of specific AI threats and prioritize resources for mitigation based on demonstrated exploitability.\n\nLearn more from the following resources:\n\n* [@framework@NIST AI Risk Management Framework](https://www.nist.gov/itl/ai-risk-management-framework) - Key framework for managing AI-specific risks.\n* [@guide@A Beginner's Guide to Cybersecurity Risks and Vulnerabilities - Champlain College Online](https://online.champlain.edu/blog/beginners-guide-cybersecurity-risk-management) - Foundational understanding of risk.\n* [@guide@Cybersecurity Risk Management: Frameworks, Plans, and Best Practices - Hyperproof](https://hyperproof.io/resource/cybersecurity-risk-management-process/) - General guide applicable to AI system context.", - "links": [] + "description": "AI Red Teamers contribute to the AI risk management process by identifying and demonstrating concrete vulnerabilities. Findings from red team exercises inform risk assessments, helping organizations understand the likelihood and potential impact of specific AI threats and prioritize resources for mitigation based on demonstrated exploitability.\n\nLearn more from the following resources:", + "links": [ + { + "title": "NIST AI Risk Management Framework", + "url": "https://www.nist.gov/itl/ai-risk-management-framework", + "type": "article" + }, + { + "title": "A Beginner's Guide to Cybersecurity Risks and Vulnerabilities", + "url": "https://online.champlain.edu/blog/beginners-guide-cybersecurity-risk-management", + "type": "article" + }, + { + "title": "Cybersecurity Risk Management: Frameworks, Plans, and Best Practices", + "url": "https://hyperproof.io/resource/cybersecurity-risk-management-process/", + "type": "article" + } + ] }, "887lc3tWCRH-sOHSxWgWJ": { "title": "Vulnerability Assessment", - "description": "While general vulnerability assessment scans infrastructure, AI Red Teaming extends this to assess vulnerabilities specific to the AI model and its unique interactions. This includes probing for prompt injection flaws, testing for adversarial example robustness, checking for data privacy leaks, and evaluating safety alignment failures – weaknesses not typically found by standard IT vulnerability scanners.\n\nLearn more from the following resources:\n\n* [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses vulnerability assessment within AI red teaming for critical systems.\n* [@guide@The Ultimate Guide to Vulnerability Assessment - Strobes Security](https://strobes.co/blog/guide-vulnerability-assessment/) - Comprehensive guide on VA process (apply concepts to AI).\n* [@guide@Vulnerability Scanning Tools | OWASP Foundation](https://owasp.org/www-community/Vulnerability_Scanning_Tools) - List of tools useful in broader system assessment around AI.", - "links": [] + "description": "While general vulnerability assessment scans infrastructure, AI Red Teaming extends this to assess vulnerabilities specific to the AI model and its unique interactions. This includes probing for prompt injection flaws, testing for adversarial example robustness, checking for data privacy leaks, and evaluating safety alignment failures – weaknesses not typically found by standard IT vulnerability scanners.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI red-teaming in critical infrastructure: Boosting security and trust in AI systems", + "url": "https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/", + "type": "article" + }, + { + "title": "The Ultimate Guide to Vulnerability Assessment", + "url": "https://strobes.co/blog/guide-vulnerability-assessment/", + "type": "article" + }, + { + "title": "Vulnerability Scanning Tools", + "url": "https://owasp.org/www-community/Vulnerability_Scanning_Tools", + "type": "article" + } + ] }, "Ds8pqn4y9Npo7z6ubunvc": { "title": "Jailbreak Techniques", - "description": "Jailbreaking is a specific category of prompt hacking where the AI Red Teamer aims to bypass the LLM's safety and alignment training. They use techniques like creating fictional scenarios, asking the model to simulate an unrestricted AI, or using complex instructions to trick the model into generating content that violates its own policies (e.g., generating harmful code, hate speech, or illegal instructions).\n\nLearn more from the following resources:\n\n* [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) - Discusses jailbreaks for several LLMs\n* [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Covers jailbreaking strategies.\n* [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) - Research analyzing jailbreak failures.", - "links": [] + "description": "Jailbreaking is a specific category of prompt hacking where the AI Red Teamer aims to bypass the LLM's safety and alignment training. They use techniques like creating fictional scenarios, asking the model to simulate an unrestricted AI, or using complex instructions to trick the model into generating content that violates its own policies (e.g., generating harmful code, hate speech, or illegal instructions).\n\nLearn more from the following resources:", + "links": [ + { + "title": "InjectPrompt (David Willis-Owen)", + "url": "https://injectprompt.com", + "type": "article" + }, + { + "title": "Prompt Hacking Guide - Learn Prompting", + "url": "https://learnprompting.org/docs/category/prompt-hacking", + "type": "article" + }, + { + "title": "Jailbroken: How Does LLM Safety Training Fail? (arXiv)", + "url": "https://arxiv.org/abs/2307.02483", + "type": "article" + } + ] }, "j7uLLpt8MkZ1rqM7UBPW4": { "title": "Safety Filter Bypasses", - "description": "AI Red Teamers specifically target the safety mechanisms (filters, guardrails) implemented within or around an AI model. They test techniques like using synonyms for blocked words, employing different languages, embedding harmful requests within harmless text, or using character-level obfuscation to evade detection and induce the model to generate prohibited content, thereby assessing the robustness of the safety controls.\n\nLearn more from the following resources:\n\n* [@article@Bypassing AI Content Filters | Restackio](https://www.restack.io/p/ai-driven-content-moderation-answer-bypass-filters-cat-ai) - Discusses techniques for evasion.\n* [@article@How to Bypass Azure AI Content Safety Guardrails - Mindgard](https://mindgard.ai/blog/bypassing-azure-ai-content-safety-guardrails) - Case study on bypassing specific safety mechanisms.\n* [@article@The Best Methods to Bypass AI Detection: Tips and Techniques - PopAi](https://www.popai.pro/resources/the-best-methods-to-bypass-ai-detection-tips-and-techniques/) - Focuses on evasion, relevant for filter bypass testing.", - "links": [] + "description": "AI Red Teamers specifically target the safety mechanisms (filters, guardrails) implemented within or around an AI model. They test techniques like using synonyms for blocked words, employing different languages, embedding harmful requests within harmless text, or using character-level obfuscation to evade detection and induce the model to generate prohibited content, thereby assessing the robustness of the safety controls.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Bypassing AI Content Filters", + "url": "https://www.restack.io/p/ai-driven-content-moderation-answer-bypass-filters-cat-ai", + "type": "article" + }, + { + "title": "How to Bypass Azure AI Content Safety Guardrails", + "url": "https://mindgard.ai/blog/bypassing-azure-ai-content-safety-guardrails", + "type": "article" + }, + { + "title": "The Best Methods to Bypass AI Detection: Tips and Techniques", + "url": "https://www.popai.pro/resources/the-best-methods-to-bypass-ai-detection-tips-and-techniques/", + "type": "article" + } + ] }, "XOrAPDRhBvde9R-znEipH": { "title": "Prompt Injection", - "description": "Prompt injection is a critical vulnerability tested by AI Red Teamers. They attempt to insert instructions into the LLM's input that override its intended system prompt or task, causing it to perform unauthorized actions, leak data, or generate malicious output. This tests the model's ability to distinguish trusted instructions from potentially harmful user/external input.\n\nLearn more from the following resources:\n\n* [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Guide covering different types of prompt attacks.\n* [@article@Prompt Injection (Learn Prompting)](https://learnprompting.org/docs/prompt_hacking/injection) - Learn Prompting article describing prompt injection with examples and mitigation strategies.\n* [@article@Prompt Injection Attack Explanation (IBM)](https://research.ibm.com/blog/prompt-injection-attacks-against-llms) - Explains what prompt injections are and how they work.\n* [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Overview of impact and defenses.\n* [@course@Advanced Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/advanced-prompt-hacking) - Covers advanced injection techniques.", - "links": [] + "description": "Prompt injection is a critical vulnerability tested by AI Red Teamers. They attempt to insert instructions into the LLM's input that override its intended system prompt or task, causing it to perform unauthorized actions, leak data, or generate malicious output. This tests the model's ability to distinguish trusted instructions from potentially harmful user/external input.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Advanced Prompt Hacking - Learn Prompting", + "url": "https://learnprompting.org/courses/advanced-prompt-hacking", + "type": "course" + }, + { + "title": "Prompt Injection & the Rise of Prompt Attacks", + "url": "https://www.lakera.ai/blog/guide-to-prompt-injection", + "type": "article" + }, + { + "title": "Prompt Injection (Learn Prompting)", + "url": "https://learnprompting.org/docs/prompt_hacking/injection", + "type": "article" + }, + { + "title": "Prompt Injection Attack Explanation (IBM)", + "url": "https://research.ibm.com/blog/prompt-injection-attacks-against-llms", + "type": "article" + }, + { + "title": "Prompt Injection: Impact, How It Works & 4 Defense Measures", + "url": "https://www.tigera.io/learn/guides/llm-security/prompt-injection/", + "type": "article" + } + ] }, "1Xr7mxVekeAHzTL7G4eAZ": { "title": "Prompt Hacking", - "description": "Prompt hacking is a core technique for AI Red Teamers targeting LLMs. It involves crafting inputs (prompts) to manipulate the model into bypassing safety controls, revealing hidden information, or performing unintended actions. Red teamers systematically test various prompt hacking methods (like jailbreaking, role-playing, or instruction manipulation) to assess the LLM's resilience against adversarial user input.\n\nLearn more from the following resources:\n\n* [@course@Introduction to Prompt Hacking - Learn Prompting](https://learnprompting.org/courses/intro-to-prompt-hacking) - Free introductory course.\n* [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) - Detailed guide covering techniques.\n* [@paper@SoK: Prompt Hacking of LLMs (arXiv 2023)](https://arxiv.org/abs/2311.05544) - Comprehensive research overview of prompt hacking types and techniques.", - "links": [] + "description": "Prompt hacking is a core technique for AI Red Teamers targeting LLMs. It involves crafting inputs (prompts) to manipulate the model into bypassing safety controls, revealing hidden information, or performing unintended actions. Red teamers systematically test various prompt hacking methods (like jailbreaking, role-playing, or instruction manipulation) to assess the LLM's resilience against adversarial user input.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Introduction to Prompt Hacking", + "url": "https://learnprompting.org/courses/intro-to-prompt-hacking", + "type": "course" + }, + { + "title": "Prompt Hacking Guide", + "url": "https://learnprompting.org/docs/category/prompt-hacking", + "type": "article" + }, + { + "title": "SoK: Prompt Hacking of LLMs (arXiv 2023)", + "url": "https://arxiv.org/abs/2311.05544", + "type": "article" + } + ] }, "5zHow4KZVpfhch5Aabeft": { "title": "Direct", - "description": "Direct injection attacks occur when malicious instructions are inserted directly into the prompt input field by the user interacting with the LLM. AI Red Teamers use this technique to assess if basic instructions like \"Ignore previous prompt\" can immediately compromise the model's safety or intended function, testing the robustness of the system prompt's influence.\n\nLearn more from the following resources:\n\n* [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Differentiates attack types.\n* [@article@Prompt Injection Cheat Sheet (FlowGPT)](https://flowgpt.com/p/prompt-injection-cheat-sheet) - Collection of prompt injection examples often used in direct attacks.\n* [@report@OpenAI GPT-4 System Card](https://openai.com/research/gpt-4-system-card) - Sections discuss how direct prompt attacks were tested during GPT-4 development.", - "links": [] + "description": "Direct injection attacks occur when malicious instructions are inserted directly into the prompt input field by the user interacting with the LLM. AI Red Teamers use this technique to assess if basic instructions like \"Ignore previous prompt\" can immediately compromise the model's safety or intended function, testing the robustness of the system prompt's influence.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Prompt Injection & the Rise of Prompt Attacks", + "url": "https://www.lakera.ai/blog/guide-to-prompt-injection", + "type": "article" + }, + { + "title": "Prompt Injection Cheat Sheet (FlowGPT)", + "url": "https://flowgpt.com/p/prompt-injection-cheat-sheet", + "type": "article" + }, + { + "title": "OpenAI GPT-4 System Card", + "url": "https://openai.com/research/gpt-4-system-card", + "type": "article" + } + ] }, "3_gJRtJSdm2iAfkwmcv0e": { "title": "Indirect", - "description": "Indirect injection involves embedding malicious prompts within external data sources that the LLM processes, such as websites, documents, or emails. AI Red Teamers test this by poisoning data sources the AI might interact with (e.g., adding hidden instructions to a webpage summarized by the AI) to see if the AI executes unintended commands or leaks data when processing that source.\n\nLearn more from the following resources:\n\n* [@paper@The Practical Application of Indirect Prompt Injection Attacks - David Willis-Owen](https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry) - Discusses a standard methodology to test for indirect injection attacks.\n* [@article@How to Prevent Indirect Prompt Injection Attacks - Cobalt](https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks) - Explains indirect injection via external sources and mitigation.\n* [@article@Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)](https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection) - Examples of indirect prompt injection impacting LLM agents.", - "links": [] + "description": "Indirect injection involves embedding malicious prompts within external data sources that the LLM processes, such as websites, documents, or emails. AI Red Teamers test this by poisoning data sources the AI might interact with (e.g., adding hidden instructions to a webpage summarized by the AI) to see if the AI executes unintended commands or leaks data when processing that source.\n\nLearn more from the following resources:", + "links": [ + { + "title": "The Practical Application of Indirect Prompt Injection Attacks", + "url": "https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry", + "type": "article" + }, + { + "title": "How to Prevent Indirect Prompt Injection Attacks", + "url": "https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks", + "type": "article" + }, + { + "title": "Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)", + "url": "https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection", + "type": "article" + } + ] }, "G1u_Kq4NeUsGX2qnUTuJU": { "title": "Countermeasures", - "description": "AI Red Teamers must also understand and test defenses against prompt hacking. This includes evaluating the effectiveness of input sanitization, output filtering, instruction demarcation (e.g., XML tagging), contextual awareness checks, model fine-tuning for resistance, and applying the principle of least privilege to LLM capabilities and tool access.\n\nLearn more from the following resources:\n\n* [@article@Mitigating Prompt Injection Attacks (NCC Group Research)](https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/) - Discusses various mitigation strategies and their effectiveness.\n* [@article@Prompt Injection & the Rise of Prompt Attacks: All You Need to Know | Lakera](https://www.lakera.ai/blog/guide-to-prompt-injection) - Includes discussion on best practices for prevention.\n* [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures - Tigera](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) - Covers defensive measures.\n* [@guide@OpenAI Best Practices for Prompt Security](https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions) - OpenAI’s recommendations to prevent prompt manipulation.", - "links": [] + "description": "AI Red Teamers must also understand and test defenses against prompt hacking. This includes evaluating the effectiveness of input sanitization, output filtering, instruction demarcation (e.g., XML tagging), contextual awareness checks, model fine-tuning for resistance, and applying the principle of least privilege to LLM capabilities and tool access.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Mitigating Prompt Injection Attacks (NCC Group Research)", + "url": "https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/", + "type": "article" + }, + { + "title": "Prompt Injection & the Rise of Prompt Attacks", + "url": "https://www.lakera.ai/blog/guide-to-prompt-injection", + "type": "article" + }, + { + "title": "Prompt Injection: Impact, How It Works & 4 Defense Measures", + "url": "https://www.tigera.io/learn/guides/llm-security/prompt-injection/", + "type": "article" + }, + { + "title": "OpenAI Best Practices for Prompt Security", + "url": "https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions", + "type": "article" + } + ] }, "vhBu5x8INTtqvx6vcYAhE": { "title": "Code Injection", - "description": "AI Red Teamers test for code injection vulnerabilities specifically in the context of AI applications. This involves probing whether user input, potentially manipulated via prompts, can lead to the execution of unintended code (e.g., SQL, OS commands, or script execution via generated code) within the application layer or connected systems, using the AI as a potential vector.\n\nLearn more from the following resources:\n\n* [@article@Code Injection in LLM Applications - NeuralTrust](https://neuraltrust.ai/blog/code-injection-in-llms) - Specifically discusses code injection risks involving LLMs.\n* [@docs@Secure Plugin Sandboxing (OpenAI Plugins)](https://platform.openai.com/docs/plugins/production/security-requirements) - Context on preventing code injection via AI plugins.\n* [@guide@Code Injection - OWASP Foundation](https://owasp.org/www-community/attacks/Code_Injection) - Foundational knowledge on code injection attacks.", - "links": [] + "description": "AI Red Teamers test for code injection vulnerabilities specifically in the context of AI applications. This involves probing whether user input, potentially manipulated via prompts, can lead to the execution of unintended code (e.g., SQL, OS commands, or script execution via generated code) within the application layer or connected systems, using the AI as a potential vector.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Code Injection in LLM Applications", + "url": "https://neuraltrust.ai/blog/code-injection-in-llms", + "type": "article" + }, + { + "title": "Secure Plugin Sandboxing (OpenAI Plugins)", + "url": "https://platform.openai.com/docs/plugins/production/security-requirements", + "type": "article" + }, + { + "title": "Code Injection", + "url": "https://owasp.org/www-community/attacks/Code_Injection", + "type": "article" + } + ] }, "uBXrri2bXVsNiM8fIHHOv": { "title": "Model Vulnerabilities", - "description": "This category covers attacks and tests targeting the AI model itself, beyond the prompt interface. AI Red Teamers investigate inherent weaknesses in the model's architecture, training data artifacts, or prediction mechanisms, such as susceptibility to data extraction, poisoning, or adversarial manipulation.\n\nLearn more from the following resources:\n\n* [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses adversarial attacks, data poisoning, and prototype theft.\n* [@article@Attacking AI Models (Trail of Bits Blog Series)](https://blog.trailofbits.com/category/ai-security/) - Series discussing model-focused attacks.\n* [@report@AI and ML Vulnerabilities (CNAS Report)](https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities) - Overview of known machine learning vulnerabilities.", - "links": [] + "description": "This category covers attacks and tests targeting the AI model itself, beyond the prompt interface. AI Red Teamers investigate inherent weaknesses in the model's architecture, training data artifacts, or prediction mechanisms, such as susceptibility to data extraction, poisoning, or adversarial manipulation.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Security Risks Uncovered: What You Must Know in 2025", + "url": "https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/", + "type": "article" + }, + { + "title": "Attacking AI Models (Trail of Bits Blog Series)", + "url": "https://blog.trailofbits.com/category/ai-security/", + "type": "article" + }, + { + "title": "AI and ML Vulnerabilities (CNAS Report)", + "url": "https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities", + "type": "article" + } + ] }, "QFzLx5nc4rCCD8WVc20mo": { "title": "Model Weight Stealing", - "description": "AI Red Teamers assess the risk of attackers reconstructing or stealing the proprietary weights of a trained model, often through API query-based attacks. Testing involves simulating such attacks to understand how easily the model's functionality can be replicated, which informs defenses like query rate limiting, watermarking, or differential privacy.\n\nLearn more from the following resources:\n\n* [@article@A Playbook for Securing AI Model Weights - RAND](https://www.rand.org/pubs/research_briefs/RBA2849-1.html) - Discusses attack vectors and security levels for protecting model weights.\n* [@article@How to Steal a Machine Learning Model (SkyCryptor)](https://skycryptor.com/blog/how-to-steal-a-machine-learning-model) - Explains model weight extraction via query attacks.\n* [@paper@Defense Against Model Stealing (Microsoft Research)](https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/) - Research on detecting and defending against model stealing.\n* [@paper@On the Limitations of Model Stealing with Uncertainty Quantification Models - OpenReview](https://openreview.net/pdf?id=ONRFHoUzNk) - Research exploring model stealing techniques.", - "links": [] + "description": "AI Red Teamers assess the risk of attackers reconstructing or stealing the proprietary weights of a trained model, often through API query-based attacks. Testing involves simulating such attacks to understand how easily the model's functionality can be replicated, which informs defenses like query rate limiting, watermarking, or differential privacy.\n\nLearn more from the following resources:", + "links": [ + { + "title": "A Playbook for Securing AI Model Weights", + "url": "https://www.rand.org/pubs/research_briefs/RBA2849-1.html", + "type": "article" + }, + { + "title": "How to Steal a Machine Learning Model (SkyCryptor)", + "url": "https://skycryptor.com/blog/how-to-steal-a-machine-learning-model", + "type": "article" + }, + { + "title": "Defense Against Model Stealing (Microsoft Research)", + "url": "https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/", + "type": "article" + }, + { + "title": "On the Limitations of Model Stealing with Uncertainty Quantification Models", + "url": "https://openreview.net/pdf?id=ONRFHoUzNk", + "type": "article" + } + ] }, "DQeOavZCoXpF3k_qRDABs": { "title": "Unauthorized Access", - "description": "AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow attackers to gain unauthorized access to data, functionalities, or underlying infrastructure. This includes attempting privilege escalation via prompts, exploiting insecure API endpoints connected to the AI, or manipulating the AI to access restricted system resources.\n\nLearn more from the following resources:\n\n* [@article@Unauthorized Data Access via LLMs (Security Boulevard)](https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/) - Discusses risks of LLMs accessing unauthorized data.\n* [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) - Covers API risks like broken access control relevant to AI systems.\n* [@paper@AI System Abuse Cases (Harvard Belfer Center)](https://www.belfercenter.org/publication/ai-system-abuse-cases) - Covers various ways AI systems can be abused, including access violations.", - "links": [] + "description": "AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow attackers to gain unauthorized access to data, functionalities, or underlying infrastructure. This includes attempting privilege escalation via prompts, exploiting insecure API endpoints connected to the AI, or manipulating the AI to access restricted system resources.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Unauthorized Data Access via LLMs (Security Boulevard)", + "url": "https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/", + "type": "article" + }, + { + "title": "OWASP API Security Project", + "url": "https://owasp.org/www-project-api-security/", + "type": "article" + }, + { + "title": "AI System Abuse Cases (Harvard Belfer Center)", + "url": "https://www.belfercenter.org/publication/ai-system-abuse-cases", + "type": "article" + } + ] }, "nD0_64ELEeJSN-0aZiR7i": { "title": "Data Poisoning", - "description": "AI Red Teamers simulate data poisoning attacks by evaluating how introducing manipulated or mislabeled data into potential training or fine-tuning datasets could compromise the model. They assess the impact on model accuracy, fairness, or the potential creation of exploitable backdoors, informing defenses around data validation and provenance.\n\nLearn more from the following resources:\n\n* [@article@AI Poisoning - Is It Really A Threat? - AIBlade](https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat) - Detailed exploration of data poisoning attacks and impacts.\n* [@article@Data Poisoning Attacks in ML (Towards Data Science)](https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f) - Overview of techniques.\n* [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) - Research on detection and prevention techniques.\n* [@paper@Poisoning Web-Scale Training Data (arXiv)](https://arxiv.org/abs/2310.12818) - Analysis of poisoning risks in large datasets used for LLMs.", - "links": [] + "description": "AI Red Teamers simulate data poisoning attacks by evaluating how introducing manipulated or mislabeled data into potential training or fine-tuning datasets could compromise the model. They assess the impact on model accuracy, fairness, or the potential creation of exploitable backdoors, informing defenses around data validation and provenance.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Poisoning", + "url": "https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat", + "type": "article" + }, + { + "title": "Data Poisoning Attacks in ML (Towards Data Science)", + "url": "https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f", + "type": "article" + }, + { + "title": "Detecting and Preventing Data Poisoning Attacks on AI Models", + "url": "https://arxiv.org/abs/2503.09302", + "type": "article" + }, + { + "title": "Poisoning Web-Scale Training Data (arXiv)", + "url": "https://arxiv.org/abs/2310.12818", + "type": "article" + } + ] }, "xjlttOti-_laPRn8a2fVy": { "title": "Adversarial Examples", - "description": "A core AI Red Teaming activity involves generating adversarial examples – inputs slightly perturbed to cause misclassification or bypass safety filters – to test model robustness. Red teamers use various techniques (gradient-based, optimization-based, or black-box methods) to find inputs that exploit model weaknesses, informing developers on how to harden the model.\n\nLearn more from the following resources:\n\n* [@article@Adversarial Examples Explained (OpenAI Blog)](https://openai.com/research/adversarial-examples) - Introduction by OpenAI.\n* [@guide@Adversarial Examples – Interpretable Machine Learning Book](https://christophm.github.io/interpretable-ml-book/adversarial.html) - In-depth explanation and examples.\n* [@guide@Adversarial Testing for Generative AI | Machine Learning - Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Google's guide on adversarial testing workflows.\n* [@video@How AI Can Be Tricked With Adversarial Attacks - Two Minute Papers](https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w) - Short video demonstrating adversarial examples.", - "links": [] + "description": "A core AI Red Teaming activity involves generating adversarial examples – inputs slightly perturbed to cause misclassification or bypass safety filters – to test model robustness. Red teamers use various techniques (gradient-based, optimization-based, or black-box methods) to find inputs that exploit model weaknesses, informing developers on how to harden the model.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Adversarial Examples Explained (OpenAI Blog)", + "url": "https://openai.com/research/adversarial-examples", + "type": "article" + }, + { + "title": "Adversarial Examples – Interpretable Machine Learning Book", + "url": "https://christophm.github.io/interpretable-ml-book/adversarial.html", + "type": "article" + }, + { + "title": "Adversarial Testing for Generative AI", + "url": "https://developers.google.com/machine-learning/guides/adv-testing", + "type": "article" + }, + { + "title": "How AI Can Be Tricked With Adversarial Attacks", + "url": "https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w", + "type": "video" + } + ] }, "iE5PcswBHnu_EBFIacib0": { "title": "Model Inversion", - "description": "AI Red Teamers perform model inversion tests to assess if an attacker can reconstruct sensitive training data (like images, text snippets, or personal attributes) by repeatedly querying the model and analyzing its outputs. Success indicates privacy risks due to data memorization, requiring mitigation techniques like differential privacy or output filtering.\n\nLearn more from the following resources:\n\n* [@article@Model Inversion Attacks for ML (Medium)](https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1) - Explanation with examples (e.g., face reconstruction).\n* [@article@Model inversion and membership inference: Understanding new AI security risks - Hogan Lovells](https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities) - Discusses risks and mitigation.\n* [@paper@Extracting Training Data from LLMs (arXiv)](https://arxiv.org/abs/2012.07805) - Research demonstrating feasibility on LLMs.\n* [@paper@Model Inversion Attacks: A Survey of Approaches and Countermeasures - arXiv](https://arxiv.org/html/2411.10023v1) - Comprehensive survey of model inversion attacks and defenses.", - "links": [] + "description": "AI Red Teamers perform model inversion tests to assess if an attacker can reconstruct sensitive training data (like images, text snippets, or personal attributes) by repeatedly querying the model and analyzing its outputs. Success indicates privacy risks due to data memorization, requiring mitigation techniques like differential privacy or output filtering.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Model Inversion Attacks for ML (Medium)", + "url": "https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1", + "type": "article" + }, + { + "title": "Model inversion and membership inference: Understanding new AI security risks", + "url": "https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities", + "type": "article" + }, + { + "title": "Extracting Training Data from LLMs (arXiv)", + "url": "https://arxiv.org/abs/2012.07805", + "type": "article" + }, + { + "title": "Model Inversion Attacks: A Survey of Approaches and Countermeasures", + "url": "https://arxiv.org/html/2411.10023v1", + "type": "article" + } + ] }, "2Y0ZO-etpv3XIvunDLu-W": { "title": "Adversarial Training", - "description": "AI Red Teamers evaluate the effectiveness of adversarial training as a defense. They test if models trained on adversarial examples are truly robust or if new, unseen adversarial attacks can still bypass the hardened defenses. This helps refine the adversarial training process itself.\n\nLearn more from the following resources:\n\n* [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) (Discusses adversarial robustness)\n* [@guide@Adversarial Testing for Generative AI | Google for Developers](https://developers.google.com/machine-learning/guides/adv-testing) - Covers the concept as part of testing.\n* [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models - arXiv](https://arxiv.org/abs/2503.09302) (Mentions adversarial training as defense)", - "links": [] + "description": "AI Red Teamers evaluate the effectiveness of adversarial training as a defense. They test if models trained on adversarial examples are truly robust or if new, unseen adversarial attacks can still bypass the hardened defenses. This helps refine the adversarial training process itself.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Model Robustness: Building Reliable AI Models", + "url": "https://encord.com/blog/model-robustness-machine-learning-strategies/", + "type": "article" + }, + { + "title": "Adversarial Testing for Generative AI", + "url": "https://developers.google.com/machine-learning/guides/adv-testing", + "type": "article" + }, + { + "title": "Detecting and Preventing Data Poisoning Attacks on AI Models", + "url": "https://arxiv.org/abs/2503.09302", + "type": "article" + } + ] }, "6gEHMhh6BGJI-ZYN27YPW": { "title": "Robust Model Design", - "description": "AI Red Teamers assess whether choices made during model design (architecture selection, regularization techniques, ensemble methods) effectively contribute to robustness against anticipated attacks. They test if these design choices actually prevent common failure modes identified during threat modeling.\n\nLearn more from the following resources:\n\n* [@article@Model Robustness: Building Reliable AI Models - Encord](https://encord.com/blog/model-robustness-machine-learning-strategies/) - Discusses strategies for building robust models.\n* [@article@Understanding Robustness in Machine Learning - Alooba](https://www.alooba.com/skills/concepts/machine-learning/robustness/) - Explains the concept of ML robustness.\n* [@paper@Towards Evaluating the Robustness of Neural Networks (arXiv by Goodfellow et al.)](https://arxiv.org/abs/1608.04644) - Foundational paper on evaluating robustness.", - "links": [] + "description": "AI Red Teamers assess whether choices made during model design (architecture selection, regularization techniques, ensemble methods) effectively contribute to robustness against anticipated attacks. They test if these design choices actually prevent common failure modes identified during threat modeling.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Model Robustness: Building Reliable AI Models", + "url": "https://encord.com/blog/model-robustness-machine-learning-strategies/", + "type": "article" + }, + { + "title": "Understanding Robustness in Machine Learning", + "url": "https://www.alooba.com/skills/concepts/machine-learning/robustness/", + "type": "article" + }, + { + "title": "Towards Evaluating the Robustness of Neural Networks (arXiv by Goodfellow et al.)", + "url": "https://arxiv.org/abs/1608.04644", + "type": "article" + } + ] }, "7Km0mFpHguHYPs5UhHTsM": { "title": "Continuous Monitoring", - "description": "AI Red Teamers assess the effectiveness of continuous monitoring systems by attempting attacks and observing if detection mechanisms trigger appropriate alerts and responses. They test if monitoring covers AI-specific anomalies (like sudden shifts in output toxicity or unexpected resource consumption by the model) in addition to standard infrastructure monitoring.\n\nLearn more from the following resources:\n\n* [@article@Cyber Security Monitoring: 5 Key Components - BitSight Technologies](https://www.bitsight.com/blog/5-things-to-consider-building-continuous-security-monitoring-strategy) - Discusses key components of a monitoring strategy.\n* [@article@Cyber Security Monitoring: Definition and Best Practices - SentinelOne](https://www.sentinelone.com/cybersecurity-101/cybersecurity/cyber-security-monitoring/) - Overview of monitoring types and techniques.\n* [@article@Cybersecurity Monitoring: Definition, Tools & Best Practices - NordLayer](https://nordlayer.com/blog/cybersecurity-monitoring/) - General best practices adaptable to AI context.", - "links": [] + "description": "AI Red Teamers assess the effectiveness of continuous monitoring systems by attempting attacks and observing if detection mechanisms trigger appropriate alerts and responses. They test if monitoring covers AI-specific anomalies (like sudden shifts in output toxicity or unexpected resource consumption by the model) in addition to standard infrastructure monitoring.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Cyber Security Monitoring: 5 Key Components", + "url": "https://www.bitsight.com/blog/5-things-to-consider-building-continuous-security-monitoring-strategy", + "type": "article" + }, + { + "title": "Cyber Security Monitoring: Definition and Best Practices", + "url": "https://www.sentinelone.com/cybersecurity-101/cybersecurity/cyber-security-monitoring/", + "type": "article" + }, + { + "title": "Cybersecurity Monitoring: Definition, Tools & Best Practices", + "url": "https://nordlayer.com/blog/cybersecurity-monitoring/", + "type": "article" + } + ] }, "aKzai0A8J55-OBXTnQih1": { "title": "Insecure Deserialization", - "description": "AI Red Teamers investigate if serialized objects used by the AI system (e.g., for saving model states, configurations, or transmitting data) can be manipulated by an attacker. They test if crafting malicious serialized objects could lead to remote code execution or other exploits when the application deserializes the untrusted data.\n\nLearn more from the following resources:\n\n* [@article@Lightboard Lessons: OWASP Top 10 - Insecure Deserialization - DevCentral](https://community.f5.com/kb/technicalarticles/lightboard-lessons-owasp-top-10---insecure-deserialization/281509) - Video explanation.\n* [@article@How Hugging Face Was Ethically Hacked](https://www.aiblade.net/p/how-hugging-face-was-ethically-hacked) - Hugging Face deserialization case study.\n* [@article@OWASP TOP 10: Insecure Deserialization - Detectify Blog](https://blog.detectify.com/best-practices/owasp-top-10-insecure-deserialization/) - Overview within OWASP Top 10 context.\n* [@guide@Insecure Deserialization - OWASP Foundation](https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization) - Core explanation of the vulnerability.", - "links": [] + "description": "AI Red Teamers investigate if serialized objects used by the AI system (e.g., for saving model states, configurations, or transmitting data) can be manipulated by an attacker. They test if crafting malicious serialized objects could lead to remote code execution or other exploits when the application deserializes the untrusted data.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Lightboard Lessons: OWASP Top 10 - Insecure Deserialization", + "url": "https://community.f5.com/kb/technicalarticles/lightboard-lessons-owasp-top-10---insecure-deserialization/281509", + "type": "article" + }, + { + "title": "How Hugging Face Was Ethically Hacked", + "url": "https://www.aiblade.net/p/how-hugging-face-was-ethically-hacked", + "type": "article" + }, + { + "title": "OWASP TOP 10: Insecure Deserialization", + "url": "https://blog.detectify.com/best-practices/owasp-top-10-insecure-deserialization/", + "type": "article" + }, + { + "title": "Insecure Deserialization", + "url": "https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization", + "type": "article" + } + ] }, "kgDsDlBk8W2aM6LyWpFY8": { "title": "Remote Code Execution", - "description": "AI Red Teamers attempt to achieve RCE on systems hosting or interacting with AI models. This could involve exploiting vulnerabilities in the AI framework itself, the web server, connected APIs, or tricking an AI agent with code execution capabilities into running malicious commands provided via prompts. RCE is often the ultimate goal of exploiting other vulnerabilities like code injection or insecure deserialization.\n\nLearn more from the following resources:\n\n* [@article@Exploiting LLMs with Code Execution (GitHub Gist)](https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516) - Example of achieving code execution via LLM manipulation.\n* [@article@What is remote code execution? - Cloudflare](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) - Definition and explanation of RCE.\n* [@video@DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU) - Demonstrates RCE risks with LLM agents.", - "links": [] + "description": "AI Red Teamers attempt to achieve RCE on systems hosting or interacting with AI models. This could involve exploiting vulnerabilities in the AI framework itself, the web server, connected APIs, or tricking an AI agent with code execution capabilities into running malicious commands provided via prompts. RCE is often the ultimate goal of exploiting other vulnerabilities like code injection or insecure deserialization.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Exploiting LLMs with Code Execution (GitHub Gist)", + "url": "https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516", + "type": "article" + }, + { + "title": "What is remote code execution?", + "url": "https://www.cloudflare.com/learning/security/what-is-remote-code-execution/", + "type": "article" + }, + { + "title": "DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger", + "url": "https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU", + "type": "video" + } + ] }, "nhUKKWyBH80nyKfGT8ErC": { "title": "Infrastructure Security", - "description": "AI Red Teamers assess the security posture of the infrastructure hosting AI models (cloud environments, servers, containers). They look for misconfigurations, unpatched systems, insecure network setups, or inadequate access controls that could allow compromise of the AI system or leakage of sensitive data/models.\n\nLearn more from the following resources:\n\n* [@article@AI Infrastructure Attacks (VentureBeat)](https://venturebeat.com/ai/understanding-ai-infrastructure-attacks/) - Discussion of attacks targeting AI infrastructure.\n* [@guide@Network Infrastructure Security - Best Practices and Strategies - DataGuard](https://www.dataguard.com/blog/network-infrastructure-security-best-practices-and-strategies/) - General infra security practices applicable here.\n* [@guide@Secure Deployment of ML Systems (NIST)](https://csrc.nist.gov/publications/detail/sp/800-218/final) - Guidelines including infrastructure security for ML.", - "links": [] + "description": "AI Red Teamers assess the security posture of the infrastructure hosting AI models (cloud environments, servers, containers). They look for misconfigurations, unpatched systems, insecure network setups, or inadequate access controls that could allow compromise of the AI system or leakage of sensitive data/models.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Infrastructure Attacks (VentureBeat)", + "url": "https://venturebeat.com/ai/understanding-ai-infrastructure-attacks/", + "type": "article" + }, + { + "title": "Network Infrastructure Security - Best Practices and Strategies", + "url": "https://www.dataguard.com/blog/network-infrastructure-security-best-practices-and-strategies/", + "type": "article" + }, + { + "title": "Secure Deployment of ML Systems (NIST)", + "url": "https://csrc.nist.gov/publications/detail/sp/800-218/final", + "type": "article" + } + ] }, "Tszl26iNBnQBdBEWOueDA": { "title": "API Protection", - "description": "AI Red Teamers rigorously test the security of APIs providing access to AI models. They probe for OWASP API Top 10 vulnerabilities like broken authentication/authorization, injection flaws, security misconfigurations, and lack of rate limiting, specifically evaluating how these could lead to misuse or compromise of the AI model itself.\n\nLearn more from the following resources:\n\n* [@article@API Protection for AI Factories: The First Step to AI Security - F5](https://www.f5.com/company/blog/api-security-for-ai-factories) - Discusses the criticality of API security for AI applications.\n* [@article@Securing APIs with AI for Advanced Threat Protection | Adeva](https://adevait.com/artificial-intelligence/securing-apis-with-ai) - Discusses using AI for API security, implies testing these is needed.\n* [@article@Securing Machine Learning APIs (IBM)](https://developer.ibm.com/articles/se-securing-machine-learning-apis/) - Best practices for protecting ML APIs.\n* [@guide@OWASP API Security Project (Top 10 2023)](https://owasp.org/www-project-api-security/) - Essential checklist for API vulnerabilities.", - "links": [] + "description": "AI Red Teamers rigorously test the security of APIs providing access to AI models. They probe for OWASP API Top 10 vulnerabilities like broken authentication/authorization, injection flaws, security misconfigurations, and lack of rate limiting, specifically evaluating how these could lead to misuse or compromise of the AI model itself.\n\nLearn more from the following resources:", + "links": [ + { + "title": "API Protection for AI Factories: The First Step to AI Security", + "url": "https://www.f5.com/company/blog/api-security-for-ai-factories", + "type": "article" + }, + { + "title": "Securing APIs with AI for Advanced Threat Protection", + "url": "https://adevait.com/artificial-intelligence/securing-apis-with-ai", + "type": "article" + }, + { + "title": "Securing Machine Learning APIs (IBM)", + "url": "https://developer.ibm.com/articles/se-securing-machine-learning-apis/", + "type": "article" + }, + { + "title": "OWASP API Security Project (Top 10 2023)", + "url": "https://owasp.org/www-project-api-security/", + "type": "article" + } + ] }, "J7gjlt2MBx7lOkOnfGvPF": { "title": "Authentication", - "description": "AI Red Teamers test the authentication mechanisms controlling access to AI systems and APIs. They attempt to bypass logins, steal or replay API keys/tokens, exploit weak password policies, or find flaws in MFA implementations to gain unauthorized access to the AI model or its management interfaces.\n\nLearn more from the following resources:\n\n* [@article@Red-Teaming in AI Testing: Stress Testing - Labelvisor](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - Mentions testing authentication mechanisms in AI red teaming.\n* [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation.\n* [@video@How JWTs are used for Authentication (and how to bypass it) - LiveOverflow](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME) - Covers common web authentication bypass techniques relevant to APIs.", - "links": [] + "description": "AI Red Teamers test the authentication mechanisms controlling access to AI systems and APIs. They attempt to bypass logins, steal or replay API keys/tokens, exploit weak password policies, or find flaws in MFA implementations to gain unauthorized access to the AI model or its management interfaces.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Red-Teaming in AI Testing: Stress Testing", + "url": "https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/", + "type": "article" + }, + { + "title": "What is Authentication vs Authorization?", + "url": "https://auth0.com/intro-to-iam/authentication-vs-authorization", + "type": "article" + }, + { + "title": "How JWTs are used for Authentication (and how to bypass it)", + "url": "https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME", + "type": "video" + } + ] }, "JQ3bR8odXJfd-1RCEf3-Q": { "title": "Authentication", - "description": "AI Red Teamers test authorization controls to ensure that authenticated users can only access the AI features and data permitted by their roles/permissions. They attempt privilege escalation, try to access other users' data via the AI, or manipulate the AI to perform actions beyond its authorized scope.\n\nLearn more from the following resources:\n\n* [@article@What is Authentication vs Authorization? - Auth0](https://auth0.com/intro-to-iam/authentication-vs-authorization) - Foundational explanation.\n* [@guide@Identity and access management (IAM) fundamental concepts - Learn Microsoft](https://learn.microsoft.com/en-us/entra/fundamentals/identity-fundamental-concepts) - Explains roles and permissions.\n* [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) (Covers Broken Object Level/Function Level Authorization)", - "links": [] + "description": "AI Red Teamers test authorization controls to ensure that authenticated users can only access the AI features and data permitted by their roles/permissions. They attempt privilege escalation, try to access other users' data via the AI, or manipulate the AI to perform actions beyond its authorized scope.\n\nLearn more from the following resources:", + "links": [ + { + "title": "What is Authentication vs Authorization?", + "url": "https://auth0.com/intro-to-iam/authentication-vs-authorization", + "type": "article" + }, + { + "title": "Identity and access management (IAM) fundamental concepts", + "url": "https://learn.microsoft.com/en-us/entra/fundamentals/identity-fundamental-concepts", + "type": "article" + }, + { + "title": "OWASP API Security Project", + "url": "https://owasp.org/www-project-api-security/", + "type": "article" + } + ] }, "0bApnJTt-Z2IUf0X3OCYf": { "title": "Black Box Testing", - "description": "In AI Red Teaming, black-box testing involves probing the AI system with inputs and observing outputs without any knowledge of the model's architecture, training data, or internal logic. This simulates an external attacker and is crucial for finding vulnerabilities exploitable through publicly accessible interfaces, such as prompt injection or safety bypasses discoverable via API interaction.\n\nLearn more from the following resources:\n\n* [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types.\n* [@article@What is Black Box Testing | Techniques & Examples - Imperva](https://www.imperva.com/learn/application-security/black-box-testing/) - General explanation.\n* [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Contrasts black-box and white-box approaches for LLM red teaming.", - "links": [] + "description": "In AI Red Teaming, black-box testing involves probing the AI system with inputs and observing outputs without any knowledge of the model's architecture, training data, or internal logic. This simulates an external attacker and is crucial for finding vulnerabilities exploitable through publicly accessible interfaces, such as prompt injection or safety bypasses discoverable via API interaction.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Black-Box, Gray Box, and White-Box Penetration Testing", + "url": "https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/", + "type": "article" + }, + { + "title": "What is Black Box Testing", + "url": "https://www.imperva.com/learn/application-security/black-box-testing/", + "type": "article" + }, + { + "title": "LLM red teaming guide (open source)", + "url": "https://www.promptfoo.dev/docs/red-team/", + "type": "article" + } + ] }, "Mrk_js5UVn4dRDw-Yco3Y": { "title": "White Box Testing", - "description": "White-box testing in AI Red Teaming grants the tester full access to the model's internals (architecture, weights, training data, source code). This allows for highly targeted attacks, such as crafting precise adversarial examples using gradients, analyzing code for vulnerabilities, or directly examining training data for biases or PII leakage. It simulates insider threats or deep analysis scenarios.\n\nLearn more from the following resources:\n\n* [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types.\n* [@article@White-Box Adversarial Examples (OpenAI Blog)](https://openai.com/research/adversarial-robustness-toolbox) - Discusses generating attacks with full model knowledge.\n* [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Mentions white-box testing benefits for LLMs.", - "links": [] + "description": "White-box testing in AI Red Teaming grants the tester full access to the model's internals (architecture, weights, training data, source code). This allows for highly targeted attacks, such as crafting precise adversarial examples using gradients, analyzing code for vulnerabilities, or directly examining training data for biases or PII leakage. It simulates insider threats or deep analysis scenarios.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Black-Box, Gray Box, and White-Box Penetration Testing", + "url": "https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/", + "type": "article" + }, + { + "title": "White-Box Adversarial Examples (OpenAI Blog)", + "url": "https://openai.com/research/adversarial-robustness-toolbox", + "type": "article" + }, + { + "title": "LLM red teaming guide (open source)", + "url": "https://www.promptfoo.dev/docs/red-team/", + "type": "article" + } + ] }, "ZVNAMCP68XKRXVxF2-hBc": { "title": "Grey Box Testing", - "description": "Grey-box AI Red Teaming involves testing with partial knowledge of the system, such as knowing the model type (e.g., GPT-4), having access to some documentation, or understanding the general system architecture but not having full model weights or source code. This allows for more targeted testing than black-box while still simulating realistic external attacker scenarios where some information might be gleaned.\n\nLearn more from the following resources:\n\n* [@article@AI Transparency: Connecting AI Red Teaming and Compliance | SplxAI Blog](https://splx.ai/blog/ai-transparency-connecting-ai-red-teaming-and-compliance) - Discusses the value of moving towards gray-box testing in AI.\n* [@article@Black-Box, Gray Box, and White-Box Penetration Testing - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) - Comparison of testing types.\n* [@article@Understanding Black Box, White Box, and Grey Box Testing - Frugal Testing](https://www.frugaltesting.com/blog/understanding-black-box-white-box-and-grey-box-testing-in-software-testing) - General definitions.", - "links": [] + "description": "Grey-box AI Red Teaming involves testing with partial knowledge of the system, such as knowing the model type (e.g., GPT-4), having access to some documentation, or understanding the general system architecture but not having full model weights or source code. This allows for more targeted testing than black-box while still simulating realistic external attacker scenarios where some information might be gleaned.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Transparency: Connecting AI Red Teaming and Compliance", + "url": "https://splx.ai/blog/ai-transparency-connecting-ai-red-teaming-and-compliance", + "type": "article" + }, + { + "title": "Black-Box, Gray Box, and White-Box Penetration Testing", + "url": "https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/", + "type": "article" + }, + { + "title": "Understanding Black Box, White Box, and Grey Box Testing", + "url": "https://www.frugaltesting.com/blog/understanding-black-box-white-box-and-grey-box-testing-in-software-testing", + "type": "article" + } + ] }, "LVdYN9hyCyNPYn2Lz1y9b": { "title": "Automated vs Manual", - "description": "AI Red Teaming typically employs a blend of automated tools (for large-scale scanning, fuzzing prompts, generating basic adversarial examples) and manual human testing (for creative jailbreaking, complex multi-stage attacks, evaluating nuanced safety issues like bias). Automation provides scale, while manual testing provides depth and creativity needed to find novel vulnerabilities.\n\nLearn more from the following resources:\n\n* [@article@Automation Testing vs. Manual Testing: Which is the better approach? - Opkey](https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better) - General comparison.\n* [@article@Manual Testing vs Automated Testing: What's the Difference? - Leapwork](https://www.leapwork.com/blog/manual-vs-automated-testing) - General comparison.\n* [@guide@LLM red teaming guide (open source) - Promptfoo](https://www.promptfoo.dev/docs/red-team/) - Discusses using both automated generation and human ingenuity for red teaming.", - "links": [] + "description": "AI Red Teaming typically employs a blend of automated tools (for large-scale scanning, fuzzing prompts, generating basic adversarial examples) and manual human testing (for creative jailbreaking, complex multi-stage attacks, evaluating nuanced safety issues like bias). Automation provides scale, while manual testing provides depth and creativity needed to find novel vulnerabilities.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Automation Testing vs. Manual Testing: Which is the better approach?", + "url": "https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better", + "type": "article" + }, + { + "title": "Manual Testing vs Automated Testing: What's the Difference?", + "url": "https://www.leapwork.com/blog/manual-vs-automated-testing", + "type": "article" + }, + { + "title": "LLM red teaming guide (open source)", + "url": "https://www.promptfoo.dev/docs/red-team/", + "type": "article" + } + ] }, "65Lo60JQS5YlvvQ6KevXt": { "title": "Continuous Testing", - "description": "Applying continuous testing principles to AI security involves integrating automated red teaming checks into the development pipeline (CI/CD). This allows for regular, automated assessment of model safety, robustness, and alignment as the model or application code evolves, catching regressions or new vulnerabilities early. Tools facilitating Continuous Automated Red Teaming (CART) are emerging.\n\nLearn more from the following resources:\n\n* [@article@Continuous Automated Red Teaming (CART) - FireCompass](https://www.firecompass.com/continuous-automated-red-teaming/) - Explains the concept of CART.\n* [@article@What is Continuous Penetration Testing? Process and Benefits - Qualysec Technologies](https://qualysec.com/continuous-penetration-testing/) - Related concept applied to pen testing.\n* [@guide@What is Continuous Testing and How Does it Work? - Black Duck](https://www.blackduck.com/glossary/what-is-continuous-testing.html) - General definition and benefits.", - "links": [] + "description": "Applying continuous testing principles to AI security involves integrating automated red teaming checks into the development pipeline (CI/CD). This allows for regular, automated assessment of model safety, robustness, and alignment as the model or application code evolves, catching regressions or new vulnerabilities early. Tools facilitating Continuous Automated Red Teaming (CART) are emerging.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Continuous Automated Red Teaming (CART)", + "url": "https://www.firecompass.com/continuous-automated-red-teaming/", + "type": "article" + }, + { + "title": "What is Continuous Penetration Testing? Process and Benefits", + "url": "https://qualysec.com/continuous-penetration-testing/", + "type": "article" + }, + { + "title": "What is Continuous Testing and How Does it Work?", + "url": "https://www.blackduck.com/glossary/what-is-continuous-testing.html", + "type": "article" + } + ] }, "c8n8FcYKDOgPLQvV9xF5J": { "title": "Testing Platforms", - "description": "Platforms used by AI Red Teamers range from general penetration testing OS distributions like Kali Linux to specific AI red teaming tools/frameworks like Microsoft's PyRIT or Promptfoo, and vulnerability scanners like OWASP ZAP adapted for API testing of AI services. These platforms provide the toolsets needed to conduct assessments.\n\nLearn more from the following resources:\n\n* [@tool@AI Red Teaming Agent - Azure AI Foundry | Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent) - Microsoft's tool leveraging PyRIT.\n* [@tool@Kali Linux](https://www.kali.org/) - Standard pentesting distribution.\n* [@tool@OWASP Zed Attack Proxy (ZAP)](https://owasp.org/www-project-zap/) - Widely used for web/API security testing.\n* [@tool@Promptfoo](https://www.promptfoo.dev/) - Open-source tool for testing and evaluating LLMs, includes red teaming features.\n* [@tool@PyRIT (Python Risk Identification Tool for generative AI) - GitHub](https://github.com/Azure/PyRIT) - Open-source framework from Microsoft.", - "links": [] + "description": "Platforms used by AI Red Teamers range from general penetration testing OS distributions like Kali Linux to specific AI red teaming tools/frameworks like Microsoft's PyRIT or Promptfoo, and vulnerability scanners like OWASP ZAP adapted for API testing of AI services. These platforms provide the toolsets needed to conduct assessments.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Red Teaming Agent - Azure AI Foundry | Microsoft Learn", + "url": "https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent", + "type": "article" + }, + { + "title": "Kali Linux", + "url": "https://www.kali.org/", + "type": "article" + }, + { + "title": "OWASP Zed Attack Proxy (ZAP)", + "url": "https://owasp.org/www-project-zap/", + "type": "article" + }, + { + "title": "Promptfoo", + "url": "https://www.promptfoo.dev/", + "type": "article" + }, + { + "title": "PyRIT (Python Risk Identification Tool for generative AI)", + "url": "https://github.com/Azure/PyRIT", + "type": "article" + } + ] }, "59lkLcoqV4gq7f8Zm0X2p": { "title": "Monitoring Solutions", - "description": "AI Red Teamers interact with monitoring tools primarily to test their effectiveness (evasion) or potentially exploit vulnerabilities within them. Understanding tools like IDS (Snort, Suricata), network analyzers (Wireshark), and SIEMs helps red teamers simulate attacks that might bypass or target these defensive systems.\n\nLearn more from the following resources:\n\n* [@article@Open Source IDS Tools: Comparing Suricata, Snort, Bro (Zeek), Linux - LevelBlue](https://levelblue.com/blogs/security-essentials/open-source-intrusion-detection-tools-a-quick-overview) - Comparison of common open source monitoring tools.\n* [@tool@Snort](https://www.snort.org/) - Open source IDS/IPS.\n* [@tool@Suricata](https://suricata.io/) - Open source IDS/IPS/NSM.\n* [@tool@Wireshark](https://www.wireshark.org/) - Network protocol analyzer.\n* [@tool@Zeek (formerly Bro)](https://zeek.org/) - Network security monitoring framework.", - "links": [] + "description": "AI Red Teamers interact with monitoring tools primarily to test their effectiveness (evasion) or potentially exploit vulnerabilities within them. Understanding tools like IDS (Snort, Suricata), network analyzers (Wireshark), and SIEMs helps red teamers simulate attacks that might bypass or target these defensive systems.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Open Source IDS Tools: Comparing Suricata, Snort, Bro (Zeek), Linux", + "url": "https://levelblue.com/blogs/security-essentials/open-source-intrusion-detection-tools-a-quick-overview", + "type": "article" + }, + { + "title": "Snort", + "url": "https://www.snort.org/", + "type": "article" + }, + { + "title": "Suricata", + "url": "https://suricata.io/", + "type": "article" + }, + { + "title": "Wireshark", + "url": "https://www.wireshark.org/", + "type": "article" + }, + { + "title": "Zeek (formerly Bro)", + "url": "https://zeek.org/", + "type": "article" + } + ] }, "et1Xrr8ez-fmB0mAq8W_a": { "title": "Benchmark Datasets", - "description": "AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models.\n\nLearn more from the following resources:\n\n* [@dataset@CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset - GitHub](https://github.com/cysecbench/dataset) - Dataset of cybersecurity prompts for benchmarking LLMs.\n* [@dataset@NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security](https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html) - Using CTF challenges to evaluate LLMs.\n* [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Benchmarking LLMs on cybersecurity tasks.", - "links": [] + "description": "AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models.\n\nLearn more from the following resources:", + "links": [ + { + "title": "CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset", + "url": "https://github.com/cysecbench/dataset", + "type": "article" + }, + { + "title": "NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security", + "url": "https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html", + "type": "article" + }, + { + "title": "SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity", + "url": "https://arxiv.org/abs/2412.20787", + "type": "article" + } + ] }, "C1zO2xC0AqyV53p2YEPWg": { "title": "Custom Testing Scripts", - "description": "AI Red Teamers frequently write custom scripts (often in Python) to automate bespoke attacks, interact with specific AI APIs, generate complex prompt sequences, parse model outputs at scale, or implement novel exploit techniques not found in standard tools. Proficiency in scripting is essential for advanced AI red teaming.\n\nLearn more from the following resources:\n\n* [@guide@Python for Cybersecurity: Key Use Cases and Tools - Panther](https://panther.com/blog/python-for-cybersecurity-key-use-cases-and-tools) - Discusses Python's role in automation, pen testing, etc.\n* [@guide@Python for cybersecurity: use cases, tools and best practices - SoftTeco](https://softteco.com/blog/python-for-cybersecurity) - Covers using Python for various security tasks.\n* [@tool@Scapy](https://scapy.net/) - Powerful Python library for packet manipulation.", - "links": [] + "description": "AI Red Teamers frequently write custom scripts (often in Python) to automate bespoke attacks, interact with specific AI APIs, generate complex prompt sequences, parse model outputs at scale, or implement novel exploit techniques not found in standard tools. Proficiency in scripting is essential for advanced AI red teaming.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Python for Cybersecurity: Key Use Cases and Tools", + "url": "https://panther.com/blog/python-for-cybersecurity-key-use-cases-and-tools", + "type": "article" + }, + { + "title": "Python for cybersecurity: use cases, tools and best practices", + "url": "https://softteco.com/blog/python-for-cybersecurity", + "type": "article" + }, + { + "title": "Scapy", + "url": "https://scapy.net/", + "type": "article" + } + ] }, "BLnfNlA0C4yzy1dvifjwx": { "title": "Reporting Tools", - "description": "AI Red Teamers use reporting techniques and potentially tools to clearly document their findings, including discovered vulnerabilities, successful exploit steps (e.g., effective prompts), assessed impact, and actionable recommendations tailored to AI systems. Good reporting translates technical findings into understandable risks for stakeholders.\n\nLearn more from the following resources:\n\n* [@article@The Complete Red Teaming Checklist \\[PDF\\]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) (Mentions reporting and templates)\n* [@guide@Penetration Testing Report: 6 Key Sections and 4 Best Practices - Bright Security](https://brightsec.com/blog/penetration-testing-report/) - General best practices for reporting security findings.\n* [@guide@Penetration testing best practices: Strategies for all test types - Strike Graph](https://www.strikegraph.com/blog/pen-testing-best-practices) - Includes tips on documentation.", - "links": [] + "description": "AI Red Teamers use reporting techniques and potentially tools to clearly document their findings, including discovered vulnerabilities, successful exploit steps (e.g., effective prompts), assessed impact, and actionable recommendations tailored to AI systems. Good reporting translates technical findings into understandable risks for stakeholders.\n\nLearn more from the following resources:", + "links": [ + { + "title": "The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI", + "url": "https://mindgard.ai/blog/red-teaming-checklist", + "type": "article" + }, + { + "title": "Penetration Testing Report: 6 Key Sections and 4 Best Practices", + "url": "https://brightsec.com/blog/penetration-testing-report/", + "type": "article" + }, + { + "title": "Penetration testing best practices: Strategies for all test types", + "url": "https://www.strikegraph.com/blog/pen-testing-best-practices", + "type": "article" + } + ] }, "s1xKK8HL5-QGZpcutiuvj": { "title": "Specialized Courses", - "description": "Targeted training is crucial for mastering AI Red Teaming. Look for courses covering adversarial ML, prompt hacking, LLM security, ethical hacking for AI, and specific red teaming methodologies applied to AI systems offered by platforms like Learn Prompting, Coursera, or security training providers.\n\nLearn more from the following resources:\n\n* [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Curated list including free and paid options.\n* [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) - Covers AI security risks and governance.\n* [@course@Exploring Adversarial Machine Learning - NVIDIA](https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/) - Focused training on adversarial ML (paid).\n* [@course@Free Online Cyber Security Courses with Certificates in 2025 - EC-Council](https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/) - Offers foundational cybersecurity courses.", - "links": [] + "description": "Targeted training is crucial for mastering AI Red Teaming. Look for courses covering adversarial ML, prompt hacking, LLM security, ethical hacking for AI, and specific red teaming methodologies applied to AI systems offered by platforms like Learn Prompting, Coursera, or security training providers.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Red Teaming Courses - Learn Prompting", + "url": "https://learnprompting.org/blog/ai-red-teaming-courses", + "type": "course" + }, + { + "title": "AI Security | Coursera", + "url": "https://www.coursera.org/learn/ai-security", + "type": "course" + }, + { + "title": "Exploring Adversarial Machine Learning", + "url": "https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/", + "type": "course" + }, + { + "title": "Free Online Cyber Security Courses with Certificates in 2025", + "url": "https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/", + "type": "course" + } + ] }, "HHjsFR6wRDqUd66PMDE_7": { "title": "Industry Credentials", - "description": "Beyond formal certifications, recognition in the AI Red Teaming field comes from practical achievements like finding significant vulnerabilities (responsible disclosure), winning AI-focused CTFs or hackathons (like HackAPrompt), contributing to AI security research, or building open-source testing tools.\n\nLearn more from the following resources:\n\n* [@community@DEF CON - Wikipedia (Mentions Black Badge)](https://en.wikipedia.org/wiki/DEF_CON#Black_Badge) - Example of a high-prestige credential from CTFs.\n* [@community@HackAPrompt (Learn Prompting)](https://learnprompting.org/hackaprompt) - Example of a major AI Red Teaming competition.", - "links": [] + "description": "Beyond formal certifications, recognition in the AI Red Teaming field comes from practical achievements like finding significant vulnerabilities (responsible disclosure), winning AI-focused CTFs or hackathons (like HackAPrompt), contributing to AI security research, or building open-source testing tools.\n\nLearn more from the following resources:", + "links": [ + { + "title": "DEF CON - Wikipedia (Mentions Black Badge)", + "url": "https://en.wikipedia.org/wiki/DEF_CON#Black_Badge", + "type": "article" + }, + { + "title": "HackAPrompt (Learn Prompting)", + "url": "https://learnprompting.org/hackaprompt", + "type": "article" + } + ] }, "MmwwRK4I9aRH_ha7duPqf": { "title": "Lab Environments", - "description": "AI Red Teamers need environments to practice attacking vulnerable systems safely. While traditional labs (HTB, THM, VulnHub) build general pentesting skills, platforms are emerging with labs specifically focused on AI/LLM vulnerabilities, prompt injection, or adversarial ML challenges.\n\nLearn more from the following resources:\n\n* [@platform@Gandalf AI Prompt Injection Lab](https://gandalf.lakera.ai/) - A popular web-based lab for prompt injection practice.\n* [@platform@Hack The Box: Hacking Labs](https://www.hackthebox.com/hacker/hacking-labs) - General pentesting labs.\n* [@platform@TryHackMe: Learn Cyber Security](https://tryhackme.com/) - Gamified cybersecurity training labs.\n* [@platform@VulnHub](https://www.vulnhub.com/) - Provides vulnerable VM images for practice.", - "links": [] + "description": "AI Red Teamers need environments to practice attacking vulnerable systems safely. While traditional labs (HTB, THM, VulnHub) build general pentesting skills, platforms are emerging with labs specifically focused on AI/LLM vulnerabilities, prompt injection, or adversarial ML challenges.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Gandalf AI Prompt Injection Lab", + "url": "https://gandalf.lakera.ai/", + "type": "article" + }, + { + "title": "Hack The Box: Hacking Labs", + "url": "https://www.hackthebox.com/hacker/hacking-labs", + "type": "article" + }, + { + "title": "TryHackMe: Learn Cyber Security", + "url": "https://tryhackme.com/", + "type": "article" + }, + { + "title": "VulnHub", + "url": "https://www.vulnhub.com/", + "type": "article" + } + ] }, "2Imb64Px3ZQcBpSQjdc_G": { "title": "CTF Challenges", - "description": "Capture The Flag competitions increasingly include AI/ML security challenges. Participating in CTFs (tracked on CTFtime) or platforms like picoCTF helps AI Red Teamers hone skills in reverse engineering, web exploitation, and cryptography applied to AI systems, including specialized AI safety CTFs.\n\nLearn more from the following resources:\n\n* [@article@Capture the flag (cybersecurity) - Wikipedia](https://en.wikipedia.org/wiki/Capture_the_flag_\\(cybersecurity\\)) - Overview of CTFs.\n* [@article@Progress from our Frontier Red Team - Anthropic](https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team) - Mentions using CTFs (Cybench) for evaluating AI model security.\n* [@platform@CTFtime.org](https://ctftime.org/) - Global CTF event tracker.\n* [@platform@picoCTF](https://picoctf.org/) - Beginner-friendly CTF platform.", - "links": [] + "description": "Capture The Flag competitions increasingly include AI/ML security challenges. Participating in CTFs (tracked on CTFtime) or platforms like picoCTF helps AI Red Teamers hone skills in reverse engineering, web exploitation, and cryptography applied to AI systems, including specialized AI safety CTFs.\n\nLearn more from the following resources:", + "links": [ + { + "title": "https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)", + "url": "https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)", + "type": "article" + }, + { + "title": "Progress from our Frontier Red Team", + "url": "https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team", + "type": "article" + }, + { + "title": "CTFtime.org", + "url": "https://ctftime.org/", + "type": "article" + }, + { + "title": "picoCTF", + "url": "https://picoctf.org/", + "type": "article" + } + ] }, "DpYsL0du37n40toH33fIr": { "title": "Red Team Simulations", - "description": "Participating in or conducting structured red team simulations against AI systems (or components) provides the most realistic practice. This involves applying methodologies, TTPs (Tactics, Techniques, and Procedures), reconnaissance, exploitation, and reporting within a defined scope and objective, specifically targeting AI vulnerabilities.\n\nLearn more from the following resources:\n\n* [@guide@A Simple Guide to Successful Red Teaming - Cobalt Strike](https://www.cobaltstrike.com/resources/guides/a-simple-guide-to-successful-red-teaming) - General guide adaptable to AI context.\n* [@guide@The Complete Guide to Red Teaming: Process, Benefits & More - Mindgard AI](https://mindgard.ai/blog/red-teaming) - Overview of red teaming process.\n* [@guide@The Complete Red Teaming Checklist \\[PDF\\]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) - Checklist for planning engagements.", - "links": [] + "description": "Participating in or conducting structured red team simulations against AI systems (or components) provides the most realistic practice. This involves applying methodologies, TTPs (Tactics, Techniques, and Procedures), reconnaissance, exploitation, and reporting within a defined scope and objective, specifically targeting AI vulnerabilities.\n\nLearn more from the following resources:", + "links": [ + { + "title": "A Simple Guide to Successful Red Teaming", + "url": "https://www.cobaltstrike.com/resources/guides/a-simple-guide-to-successful-red-teaming", + "type": "article" + }, + { + "title": "The Complete Guide to Red Teaming: Process, Benefits & More", + "url": "https://mindgard.ai/blog/red-teaming", + "type": "article" + }, + { + "title": "The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI", + "url": "https://mindgard.ai/blog/red-teaming-checklist", + "type": "article" + } + ] }, "LuKnmd9nSz9yLbTU_5Yp2": { "title": "Conferences", - "description": "Attending major cybersecurity conferences (DEF CON, Black Hat, RSA) and increasingly specialized AI Safety/Security conferences allows AI Red Teamers to learn about cutting-edge research, network with peers, and discover new tools and attack/defense techniques.\n\nLearn more from the following resources:\n\n* [@conference@Black Hat Events](https://www.blackhat.com/) - Professional security conference with AI tracks.\n* [@conference@DEF CON Hacking Conference](https://defcon.org/) - Major hacking conference with relevant villages/talks.\n* [@conference@Global Conference on AI, Security and Ethics 2025 - UNIDIR](https://unidir.org/event/global-conference-on-ai-security-and-ethics-2025/) - Example of a specialized AI security/ethics conference.\n* [@conference@RSA Conference](https://www.rsaconference.com/) - Large industry conference covering AI security.", - "links": [] + "description": "Attending major cybersecurity conferences (DEF CON, Black Hat, RSA) and increasingly specialized AI Safety/Security conferences allows AI Red Teamers to learn about cutting-edge research, network with peers, and discover new tools and attack/defense techniques.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Black Hat Events", + "url": "https://www.blackhat.com/", + "type": "article" + }, + { + "title": "DEF CON Hacking Conference", + "url": "https://defcon.org/", + "type": "article" + }, + { + "title": "Global Conference on AI, Security and Ethics 2025", + "url": "https://unidir.org/event/global-conference-on-ai-security-and-ethics-2025/", + "type": "article" + }, + { + "title": "RSA Conference", + "url": "https://www.rsaconference.com/", + "type": "article" + } + ] }, "ZlR03pM-sqVFZNhD1gMSJ": { "title": "Research Groups", - "description": "Following and potentially contributing to research groups at universities (like CMU, Stanford, Oxford), non-profits (like OpenAI, Anthropic), or government bodies (like UK's AISI) focused on AI safety, security, and alignment provides deep insights into emerging threats and mitigation strategies relevant to AI Red Teaming.\n\nLearn more from the following resources:\n\n* [@group@AI Cybersecurity | Global Cyber Security Capacity Centre (Oxford)](https://gcscc.ox.ac.uk/ai-security) - Academic research center.\n* [@group@Anthropic Research](https://www.anthropic.com/research) - AI safety research lab.\n* [@group@Center for AI Safety](https://www.safe.ai/) - Non-profit research organization.\n* [@group@The AI Security Institute (AISI)](https://www.aisi.gov.uk/) - UK government institute focused on AI safety/security research.", - "links": [] + "description": "Following and potentially contributing to research groups at universities (like CMU, Stanford, Oxford), non-profits (like OpenAI, Anthropic), or government bodies (like UK's AISI) focused on AI safety, security, and alignment provides deep insights into emerging threats and mitigation strategies relevant to AI Red Teaming.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Cybersecurity | Global Cyber Security Capacity Centre (Oxford)", + "url": "https://gcscc.ox.ac.uk/ai-security", + "type": "article" + }, + { + "title": "Anthropic Research", + "url": "https://www.anthropic.com/research", + "type": "article" + }, + { + "title": "Center for AI Safety", + "url": "https://www.safe.ai/", + "type": "article" + }, + { + "title": "The AI Security Institute (AISI)", + "url": "https://www.aisi.gov.uk/", + "type": "article" + } + ] }, "Smncq-n1OlnLAY27AFQOO": { "title": "Forums", - "description": "Engaging in online forums, mailing lists, Discord servers, or subreddits dedicated to AI security, adversarial ML, prompt engineering, or general cybersecurity helps AI Red Teamers exchange knowledge, ask questions, learn about new tools/techniques, and find collaboration opportunities.\n\nLearn more from the following resources:\n\n* [@community@List of Cybersecurity Discord Servers - DFIR Training](https://www.dfir.training/dfir-groups/discord?category%5B0%5D=17&category_children=1) - List including relevant servers.\n* [@community@Reddit - r/MachineLearning](https://www.reddit.com/r/MachineLearning/) - ML specific discussion.\n* [@community@Reddit - r/artificial](https://www.reddit.com/r/artificial/) - General AI discussion.\n* [@community@Reddit - r/cybersecurity](https://www.reddit.com/r/cybersecurity/) - General cybersecurity forum.", - "links": [] + "description": "Engaging in online forums, mailing lists, Discord servers, or subreddits dedicated to AI security, adversarial ML, prompt engineering, or general cybersecurity helps AI Red Teamers exchange knowledge, ask questions, learn about new tools/techniques, and find collaboration opportunities.\n\nLearn more from the following resources:", + "links": [ + { + "title": "List of Cybersecurity Discord Servers", + "url": "https://www.dfir.training/dfir-groups/discord?category%5B0%5D=17&category_children=1", + "type": "article" + }, + { + "title": "Reddit - r/MachineLearning", + "url": "https://www.reddit.com/r/MachineLearning/", + "type": "article" + }, + { + "title": "Reddit - r/artificial", + "url": "https://www.reddit.com/r/artificial/", + "type": "article" + }, + { + "title": "Reddit - r/cybersecurity", + "url": "https://www.reddit.com/r/cybersecurity/", + "type": "article" + } + ] }, "xJYTRbPxMn0Xs5ea0Ygn6": { "title": "LLM Security Testing", - "description": "The core application area for many AI Red Teamers today involves specifically testing Large Language Models for vulnerabilities like prompt injection, jailbreaking, harmful content generation, bias, and data privacy issues using specialized prompts and evaluation frameworks.\n\nLearn more from the following resources:\n\n* [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - Courses focused on testing LLMs.\n* [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity - arXiv](https://arxiv.org/abs/2412.20787) - Dataset for evaluating LLMs on security tasks.\n* [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) - Guide specifically on red teaming LLMs.", - "links": [] + "description": "The core application area for many AI Red Teamers today involves specifically testing Large Language Models for vulnerabilities like prompt injection, jailbreaking, harmful content generation, bias, and data privacy issues using specialized prompts and evaluation frameworks.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Red Teaming Courses - Learn Prompting", + "url": "https://learnprompting.org/blog/ai-red-teaming-courses", + "type": "course" + }, + { + "title": "SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity", + "url": "https://arxiv.org/abs/2412.20787", + "type": "article" + }, + { + "title": "The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)", + "url": "https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts", + "type": "article" + } + ] }, "FVsKivsJrIb82B0lpPmgw": { "title": "Agentic AI Security", - "description": "As AI agents capable of autonomous action become more common, AI Red Teamers must test their unique security implications. This involves assessing risks related to goal hijacking, unintended actions through tool use, exploitation of planning mechanisms, and ensuring agents operate safely within their designated boundaries.\n\nLearn more from the following resources:\n\n* [@article@AI Agents - Learn Prompting](https://learnprompting.org/docs/intermediate/ai_agents) (Background on agents)\n* [@article@Reasoning models don't always say what they think - Anthropic](https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think) (Discusses agent alignment challenges)\n* [@course@Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.](https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto) - Certification focusing on autonomous AI security.", - "links": [] + "description": "As AI agents capable of autonomous action become more common, AI Red Teamers must test their unique security implications. This involves assessing risks related to goal hijacking, unintended actions through tool use, exploitation of planning mechanisms, and ensuring agents operate safely within their designated boundaries.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.", + "url": "https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto", + "type": "course" + }, + { + "title": "AI Agents - Learn Prompting", + "url": "https://learnprompting.org/docs/intermediate/ai_agents", + "type": "article" + }, + { + "title": "Reasoning models don't always say what they think", + "url": "https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think", + "type": "article" + } + ] }, "KAcCZ3zcv25R6HwzAsfUG": { "title": "Responsible Disclosure", - "description": "A critical practice for AI Red Teamers is responsible disclosure: privately reporting discovered AI vulnerabilities (e.g., a successful jailbreak, data leak method, or severe bias) to the model developers or system owners, allowing them time to remediate before any public discussion, thus preventing malicious exploitation.\n\nLearn more from the following resources:\n\n* [@guide@Responsible Disclosure of AI Vulnerabilities - Preamble AI](https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities) - Discusses the process specifically for AI vulnerabilities.\n* [@guide@Vulnerability Disclosure Program | CISA](https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp) - Government VDP example.\n* [@policy@Google Vulnerability Reward Program (VRP)](https://bughunters.google.com/) - Example of a major tech company's VDP/bug bounty program.", - "links": [] + "description": "A critical practice for AI Red Teamers is responsible disclosure: privately reporting discovered AI vulnerabilities (e.g., a successful jailbreak, data leak method, or severe bias) to the model developers or system owners, allowing them time to remediate before any public discussion, thus preventing malicious exploitation.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Responsible Disclosure of AI Vulnerabilities", + "url": "https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities", + "type": "article" + }, + { + "title": "Vulnerability Disclosure Program", + "url": "https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp", + "type": "article" + }, + { + "title": "Google Vulnerability Reward Program (VRP)", + "url": "https://bughunters.google.com/", + "type": "article" + } + ] }, "-G8v_CNa8wO_g-46_RFQo": { "title": "Emerging Threats", - "description": "AI Red Teamers must stay informed about potential future threats enabled by more advanced AI, such as highly autonomous attack agents, AI-generated malware that evades detection, sophisticated deepfakes for social engineering, or large-scale exploitation of interconnected AI systems. Anticipating these helps shape current testing priorities.\n\nLearn more from the following resources:\n\n* [@article@AI Security Risks Uncovered: What You Must Know in 2025 - TTMS](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) - Discusses future AI-driven cyberattacks.\n* [@article@Why Artificial Intelligence is the Future of Cybersecurity - Darktrace](https://www.darktrace.com/blog/why-artificial-intelligence-is-the-future-of-cybersecurity) - Covers AI misuse and the future threat landscape.\n* [@report@AI Index 2024 - Stanford University](https://aiindex.stanford.edu/report/) - Annual report tracking AI capabilities and societal implications, including risks.", - "links": [] + "description": "AI Red Teamers must stay informed about potential future threats enabled by more advanced AI, such as highly autonomous attack agents, AI-generated malware that evades detection, sophisticated deepfakes for social engineering, or large-scale exploitation of interconnected AI systems. Anticipating these helps shape current testing priorities.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI Security Risks Uncovered: What You Must Know in 2025", + "url": "https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/", + "type": "article" + }, + { + "title": "Why Artificial Intelligence is the Future of Cybersecurity", + "url": "https://www.darktrace.com/blog/why-artificial-intelligence-is-the-future-of-cybersecurity", + "type": "article" + }, + { + "title": "AI Index 2024", + "url": "https://aiindex.stanford.edu/report/", + "type": "article" + } + ] }, "soC-kcem1ISbnCQMa6BIB": { "title": "Advanced Techniques", - "description": "The practice of AI Red Teaming itself will evolve. Future techniques may involve using AI adversaries to automatically discover complex vulnerabilities, developing more sophisticated methods for testing AI alignment and safety properties, simulating multi-agent system failures, and creating novel metrics for evaluating AI robustness against unknown future attacks.\n\nLearn more from the following resources:\n\n* [@article@AI red-teaming in critical infrastructure: Boosting security and trust in AI systems - DNV](https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/) - Discusses applying red teaming to complex systems.\n* [@article@Advanced Techniques in AI Red Teaming for LLMs | NeuralTrust](https://neuraltrust.ai/blog/advanced-techniques-in-ai-red-teaming) - Discusses techniques like adversarial ML and automated threat intelligence for red teaming.\n* [@paper@Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning - arXiv](https://arxiv.org/html/2412.18693v1) - Research on using RL for more advanced automated red teaming.", - "links": [] + "description": "The practice of AI Red Teaming itself will evolve. Future techniques may involve using AI adversaries to automatically discover complex vulnerabilities, developing more sophisticated methods for testing AI alignment and safety properties, simulating multi-agent system failures, and creating novel metrics for evaluating AI robustness against unknown future attacks.\n\nLearn more from the following resources:", + "links": [ + { + "title": "AI red-teaming in critical infrastructure: Boosting security and trust in AI systems", + "url": "https://www.dnv.com/article/ai-red-teaming-for-critical-infrastructure-industries/", + "type": "article" + }, + { + "title": "Advanced Techniques in AI Red Teaming for LLMs", + "url": "https://neuraltrust.ai/blog/advanced-techniques-in-ai-red-teaming", + "type": "article" + }, + { + "title": "Diverse and Effective Red Teaming with Auto-generated Rewards and Multi-step Reinforcement Learning", + "url": "https://arxiv.org/html/2412.18693v1", + "type": "article" + } + ] }, "VmaIHVsCpq2um_0cA33V3": { "title": "Research Opportunities", - "description": "AI Red Teaming relies on ongoing research. Key areas needing further investigation include scalable methods for finding elusive vulnerabilities, understanding emergent behaviors in complex models, developing provable safety guarantees, creating better benchmarks for AI security, and exploring the socio-technical aspects of AI misuse and defense.\n\nLearn more from the following resources:\n\n* [@article@Cutting-Edge Research on AI Security bolstered with new Challenge Fund - GOV.UK](https://www.gov.uk/government/news/cutting-edge-research-on-ai-security-bolstered-with-new-challenge-fund-to-ramp-up-public-trust-and-adoption) - Highlights government funding for AI security research priorities.\n* [@research@Careers | The AI Security Institute (AISI)](https://www.aisi.gov.uk/careers) - Outlines research focus areas for the UK's AISI.\n* [@research@Research - Anthropic](https://www.anthropic.com/research) - Example of research areas at a leading AI safety lab.", - "links": [] + "description": "AI Red Teaming relies on ongoing research. Key areas needing further investigation include scalable methods for finding elusive vulnerabilities, understanding emergent behaviors in complex models, developing provable safety guarantees, creating better benchmarks for AI security, and exploring the socio-technical aspects of AI misuse and defense.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Cutting-Edge Research on AI Security bolstered with new Challenge Fund", + "url": "https://www.gov.uk/government/news/cutting-edge-research-on-ai-security-bolstered-with-new-challenge-fund-to-ramp-up-public-trust-and-adoption", + "type": "article" + }, + { + "title": "Careers | The AI Security Institute (AISI)", + "url": "https://www.aisi.gov.uk/careers", + "type": "article" + }, + { + "title": "Research - Anthropic", + "url": "https://www.anthropic.com/research", + "type": "article" + } + ] }, "WePO66_4-gNcSdE00WKmw": { "title": "Industry Standards", - "description": "As AI matures, AI Red Teamers will increasingly need to understand and test against emerging industry standards and regulations for AI safety, security, and risk management, such as the NIST AI RMF, ISO/IEC 42001, and sector-specific guidelines, ensuring AI systems meet compliance requirements.\n\nLearn more from the following resources:\n\n* [@article@ISO 42001: The New Compliance Standard for AI Management Systems - Bright Defense](https://www.brightdefense.com/resources/iso-42001-compliance/) - Overview of ISO 42001 requirements.\n* [@article@ISO 42001: What it is & why it matters for AI management - IT Governance](https://www.itgovernance.co.uk/iso-42001) - Explanation of the standard.\n* [@framework@NIST AI Risk Management Framework (AI RMF)](https://www.nist.gov/itl/ai-risk-management-framework) - Voluntary framework gaining wide adoption.\n* [@standard@ISO/IEC 42001: Information technology — Artificial intelligence — Management system](https://www.iso.org/standard/81230.html) - International standard for AI management systems.", - "links": [] + "description": "As AI matures, AI Red Teamers will increasingly need to understand and test against emerging industry standards and regulations for AI safety, security, and risk management, such as the NIST AI RMF, ISO/IEC 42001, and sector-specific guidelines, ensuring AI systems meet compliance requirements.\n\nLearn more from the following resources:", + "links": [ + { + "title": "ISO 42001: The New Compliance Standard for AI Management Systems", + "url": "https://www.brightdefense.com/resources/iso-42001-compliance/", + "type": "article" + }, + { + "title": "ISO 42001: What it is & why it matters for AI management", + "url": "https://www.itgovernance.co.uk/iso-42001", + "type": "article" + }, + { + "title": "NIST AI Risk Management Framework (AI RMF)", + "url": "https://www.nist.gov/itl/ai-risk-management-framework", + "type": "article" + }, + { + "title": "ISO/IEC 42001: Information technology — Artificial intelligence — Management system", + "url": "https://www.iso.org/standard/81230.html", + "type": "article" + } + ] } } \ No newline at end of file diff --git a/public/roadmap-content/cyber-security.json b/public/roadmap-content/cyber-security.json index 846aee499..4cfaade79 100644 --- a/public/roadmap-content/cyber-security.json +++ b/public/roadmap-content/cyber-security.json @@ -584,7 +584,7 @@ "type": "course" }, { - "title": "Linux Roadmap", + "title": "Visit Linux Roadmap", "url": "https://roadmap.sh/linux", "type": "article" }, @@ -615,8 +615,8 @@ "description": "**macOS** is an operating system developed by Apple Inc. for its line of Mac computers. Known for its user-friendly interface and integration with other Apple products, macOS features a Unix-based architecture, offering stability, security, and performance. It includes a suite of built-in applications, such as Safari, Mail, and Finder, and supports a wide range of third-party software. macOS provides seamless integration with services like iCloud, Continuity, and Handoff, enhancing productivity and connectivity across Apple devices. Regular updates and a focus on design and usability make macOS a popular choice for both personal and professional use.\n\nLearn more from the following resources:", "links": [ { - "title": "MacOS Website", - "url": "https://www.apple.com/uk/macos/macos-sequoia/", + "title": "macOS", + "url": "https://www.apple.com/macos/macos-sequoia/", "type": "article" }, { @@ -874,7 +874,7 @@ "description": "**Loopback** refers to a special network interface used to send traffic back to the same device for testing and diagnostic purposes. The loopback address for IPv4 is `127.0.0.1`, while for IPv6 it is `::1`. When a device sends a request to the loopback address, the network data does not leave the local machine; instead, it is processed internally, allowing developers to test applications or network services without requiring external network access. Loopback is commonly used to simulate network traffic, check local services, or debug issues locally.\n\nLearn more from the following resources:", "links": [ { - "title": "Understanding the loopback address and loopback interfaces", + "title": "Understanding the Loopback Address and Loopback Interfaces", "url": "https://study-ccna.com/loopback-interface-loopback-address/", "type": "article" } @@ -964,6 +964,11 @@ "title": "ARP", "description": "Address Resolution Protocol (ARP) is a crucial mechanism used in networking that allows the Internet Protocol (IP) to map an IP address to a corresponding physical address, commonly known as a Media Access Control (MAC) address. This protocol is essential for enabling devices within a Local Area Network (LAN) to communicate by translating IP addresses into specific hardware addresses.\n\nWhen one device on a LAN wants to communicate with another, it needs to know the MAC address associated with the target device’s IP address. ARP facilitates this by sending out an ARP request, which broadcasts the target IP to all devices in the network. Each device checks the requested IP against its own. The device that recognizes the IP as its own responds with an ARP reply, which includes its MAC address.\n\nOnce the requesting device receives the MAC address, it updates its ARP cache—a table that stores IP-to-MAC address mappings—allowing it to send data directly to the correct hardware address.\n\nLearn more from the following resources:", "links": [ + { + "title": "ARP - Wikipedia", + "url": "https://en.wikipedia.org/wiki/Address_Resolution_Protocol", + "type": "article" + }, { "title": "What is Address Resolution Protocol?", "url": "https://www.fortinet.com/resources/cyberglossary/what-is-arp", @@ -1304,12 +1309,12 @@ "description": "Mesh topology is a network architecture where devices or nodes are interconnected with multiple direct, point-to-point links to every other node in the network. This structure allows data to travel from source to destination through multiple paths, enhancing reliability and fault tolerance. In a full mesh topology, every node is connected to every other node, while in a partial mesh, only some nodes have multiple connections. Mesh networks are highly resilient to failures, as traffic can be rerouted if a link goes down. They're commonly used in wireless networks, IoT applications, and critical infrastructure where redundancy and self-healing capabilities are crucial. However, mesh topologies can be complex and expensive to implement, especially in large networks due to the high number of connections required.\n\nLearn more from the following resources:", "links": [ { - "title": "What is mesh topology?", + "title": "What is Mesh Topology?", "url": "https://www.lenovo.com/gb/en/glossary/mesh-topology", "type": "article" }, { - "title": "Mesh topology explained", + "title": "Mesh Topology explained", "url": "https://www.computerhope.com/jargon/m/mesh.htm", "type": "article" } @@ -1712,6 +1717,11 @@ "title": "arp", "description": "ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.\n\nLearn more from the following resources:", "links": [ + { + "title": "ARP - Wikipedia", + "url": "https://en.wikipedia.org/wiki/Address_Resolution_Protocol", + "type": "article" + }, { "title": "What is Address Resolution Protocol?", "url": "https://www.fortinet.com/resources/cyberglossary/what-is-arp", @@ -1896,8 +1906,14 @@ }, "vYvFuz7lAJXZ1vK_4999a": { "title": "Local Auth", - "description": "Local authentication refers to the process of verifying a user's identity on a specific device or system without relying on external servers or networks. It typically involves storing and checking credentials directly on the device itself. Common methods include username/password combinations, biometrics (fingerprint, face recognition), or PIN codes. Local authentication is often used for device access, offline applications, or as a fallback when network-based authentication is unavailable. While it offers quick access and works without internet connectivity, it can be less secure than centralized authentication systems and more challenging to manage across multiple devices. Local authentication is commonly used in personal devices, standalone systems, and scenarios where network-based authentication is impractical or unnecessary.", - "links": [] + "description": "Local authentication refers to the process of verifying a user's identity on a specific device or system without relying on external servers or networks. It typically involves storing and checking credentials directly on the device itself. Common methods include username/password combinations, biometrics (fingerprint, face recognition), or PIN codes. Local authentication is often used for device access, offline applications, or as a fallback when network-based authentication is unavailable. While it offers quick access and works without internet connectivity, it can be less secure than centralized authentication systems and more challenging to manage across multiple devices. Local authentication is commonly used in personal devices, standalone systems, and scenarios where network-based authentication is impractical or unnecessary.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Local authentication, registration, and other settings", + "url": "https://learn.microsoft.com/en-us/power-pages/security/authentication/set-authentication-identity", + "type": "article" + } + ] }, "_hYN0gEi9BL24nptEtXWU": { "title": "Security Skills and Knowledge", @@ -2256,7 +2272,7 @@ }, "WG7DdsxESm31VcLFfkVTz": { "title": "Authentication vs Authorization", - "description": "Authentication vs Authorization\n-------------------------------\n\n**Authentication** is the process of validating the identity of a user, device, or system. It confirms that the entity attempting to access the resource is who or what they claim to be. The most common form of authentication is the use of usernames and passwords. Other methods include:\n\n**Authorization** comes into play after the authentication process is complete. It involves granting or denying access to a resource, based on the authenticated user's privileges. Authorization determines what actions the authenticated user or entity is allowed to perform within a system or application.", + "description": "**Authentication** is the process of validating the identity of a user, device, or system. It confirms that the entity attempting to access the resource is who or what they claim to be. The most common form of authentication is the use of usernames and passwords. Other methods include:\n\n**Authorization** comes into play after the authentication process is complete. It involves granting or denying access to a resource, based on the authenticated user's privileges. Authorization determines what actions the authenticated user or entity is allowed to perform within a system or application.\n\nLearn more from the following resources:", "links": [ { "title": "Two-factor authentication (2FA)", @@ -2430,7 +2446,7 @@ }, "v7CD_sHqLWbm9ibXXESIK": { "title": "Learn how Malware works and Types", - "description": "Malware, short for malicious software, refers to any software intentionally created to cause harm to a computer system, server, network, or user. It is a broad term that encompasses various types of harmful software created by cybercriminals for various purposes. In this guide, we will delve deeper into the major types of malware and their characteristics.\n\nVirus\n-----\n\nA computer virus is a type of malware that, much like a biological virus, attaches itself to a host (e.g., a file or software) and replicates when the host is executed. Viruses can corrupt, delete or modify data, and slow down system performance.\n\nWorm\n----\n\nWorms are self-replicating malware that spread through networks without human intervention. They exploit system vulnerabilities, consuming bandwidth and sometimes carrying a payload to infect target machines.\n\nTrojan Horse\n------------\n\nA trojan horse is a piece of software disguised as a legitimate program but contains harmful code. Users unknowingly download and install it, giving the attacker unauthorized access to the computer or network. Trojans can be used to steal data, create a backdoor, or launch additional malware attacks.\n\nRansomware\n----------\n\nRansomware is a type of malware that encrypts its victims' files and demands a ransom, typically in the form of cryptocurrency, for the decryption key. If the victim refuses or fails to pay within a specified time, the encrypted data may be lost forever.\n\nSpyware\n-------\n\nSpyware is a type of malware designed to collect and relay information about a user or organization without their consent. It can capture keystrokes, record browsing history, and access personal data such as usernames and passwords.\n\nAdware\n------\n\nAdware is advertising-supported software that automatically displays or downloads advertising materials, often in the form of pop-up ads, on a user's computer. While not always malicious, adware can be intrusive and open the door for other malware infections.\n\nRootkit\n-------\n\nA rootkit is a type of malware designed to hide or obscure the presence of other malicious programs on a computer system. This enables it to maintain persistent unauthorized access to the system and can make it difficult for users or security software to detect and remove infected files.\n\nKeylogger\n---------\n\nKeyloggers are a type of malware that monitor and record users' keystrokes, allowing attackers to capture sensitive information, such as login credentials or financial information entered on a keyboard.\n\nUnderstanding the different types of malware can help you better identify and protect against various cyber threats. As the cyber landscape continues to evolve, it's essential to stay informed about emerging malware and equip yourself with the necessary security skills and knowledge.", + "description": "Malware, short for malicious software, refers to any software intentionally created to cause harm to a computer system, server, network, or user. It is a broad term that encompasses various types of harmful software created by cybercriminals for various purposes. In this guide, we will delve deeper into the major types of malware and their characteristics.\n\nVirus\n-----\n\nA computer virus is a type of malware that, much like a biological virus, attaches itself to a host (e.g., a file or software) and replicates when the host is executed. Viruses can corrupt, delete or modify data, and slow down system performance.\n\nWorm\n----\n\nWorms are self-replicating malware that spread through networks without human intervention. They exploit system vulnerabilities, consuming bandwidth and sometimes carrying a payload to infect target machines.\n\nTrojan Horse\n------------\n\nA trojan horse is a piece of software disguised as a legitimate program but contains harmful code. Users unknowingly download and install it, giving the attacker unauthorized access to the computer or network. Trojans can be used to steal data, create a backdoor, or launch additional malware attacks.\n\nRansomware\n----------\n\nRansomware is a type of malware that encrypts its victims' files and demands a ransom, typically in the form of cryptocurrency, for the decryption key. If the victim refuses or fails to pay within a specified time, the encrypted data may be lost forever.\n\nSpyware\n-------\n\nSpyware is a type of malware designed to collect and relay information about a user or organization without their consent. It can capture keystrokes, record browsing history, and access personal data such as usernames and passwords.\n\nAdware\n------\n\nAdware is advertising-supported software that automatically displays or downloads advertising materials, often in the form of pop-up ads, on a user's computer. While not always malicious, adware can be intrusive and open the door for other malware infections.\n\nRootkit\n-------\n\nA rootkit is a type of malware designed to hide or obscure the presence of other malicious programs on a computer system. This enables it to maintain persistent unauthorized access to the system and can make it difficult for users or security software to detect and remove infected files.\n\nKeylogger\n---------\n\nKeyloggers are a type of malware that monitor and record users' keystrokes, allowing attackers to capture sensitive information, such as login credentials or financial information entered on a keyboard.\n\nLearn more from the following resources:", "links": [] }, "Hoou7kWyfB2wx_yFHug_H": { @@ -2438,7 +2454,7 @@ "description": "**Nmap** (Network Mapper) is an open-source network scanning tool used to discover hosts and services on a network, identify open ports, and detect vulnerabilities. It provides detailed information about networked devices, including their IP addresses, operating systems, and running services. Nmap supports various scanning techniques such as TCP SYN scan, UDP scan, and service version detection. It's widely used for network security assessments, vulnerability scanning, and network inventory management, helping administrators and security professionals understand and secure their network environments.\n\nLearn more from the following resources:", "links": [ { - "title": "NMAP Website", + "title": "NMAP", "url": "https://nmap.org/", "type": "article" }, @@ -2446,6 +2462,11 @@ "title": "NMAP Cheat Sheet", "url": "https://www.tutorialspoint.com/nmap-cheat-sheet", "type": "article" + }, + { + "title": "Nmap Tutorial to find Network Vulnerabilities", + "url": "https://www.youtube.com/watch?v=4t4kBkMsDbQ", + "type": "video" } ] }, @@ -2538,6 +2559,11 @@ "title": "arp", "description": "ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.\n\nLearn more from the following resources:", "links": [ + { + "title": "ARP - Wikipedia", + "url": "https://en.wikipedia.org/wiki/Address_Resolution_Protocol", + "type": "article" + }, { "title": "What is Address Resolution Protocol?", "url": "https://www.fortinet.com/resources/cyberglossary/what-is-arp", @@ -2660,6 +2686,11 @@ "title": "memdump", "description": "**memdump** is a tool or process used to capture the contents of a computer's physical memory (RAM) for analysis. This \"memory dump\" can be useful in digital forensics, debugging, or incident response to identify active processes, open files, network connections, or potentially malicious code running in memory. By analyzing a memory dump, security professionals can investigate malware, recover encryption keys, or gather evidence in case of a breach. Tools like `memdump` (Linux utility) or `DumpIt` (Windows) are commonly used to perform this process.\n\nLearn more from the following resources:", "links": [ + { + "title": "memdump - Github", + "url": "https://github.com/tchebb/memdump", + "type": "opensource" + }, { "title": "memdump", "url": "https://www.kali.org/tools/memdump/", @@ -2688,7 +2719,7 @@ "description": "Autopsy is a versatile and powerful open-source digital forensics platform that is primarily used for incident response, cyber security investigations, and data recovery. As an investigator, you can utilize Autopsy to quickly and efficiently analyze a compromised system, extract crucial artifacts, and generate comprehensive reports. Integrated with The Sleuth Kit and other plug-ins, Autopsy allows examiners to automate tasks and dig deep into a system's structure to discover the root cause of an incident.\n\nLearn more from the following resources:", "links": [ { - "title": "Autopsy Website", + "title": "Autopsy", "url": "https://www.autopsy.com/", "type": "article" }, @@ -2917,7 +2948,7 @@ "description": "**NIST (National Institute of Standards and Technology)** is a U.S. federal agency that develops and promotes measurement standards, technology, and best practices. In the context of cybersecurity, NIST provides widely recognized guidelines and frameworks, such as the **NIST Cybersecurity Framework (CSF)**, which offers a structured approach to managing and mitigating cybersecurity risks. NIST also publishes the **NIST Special Publication (SP) 800 series**, which includes standards and guidelines for securing information systems, protecting data, and ensuring system integrity. These resources are essential for organizations seeking to enhance their security posture and comply with industry regulations.\n\nLearn more from the following resources:", "links": [ { - "title": "NIST Website", + "title": "NIST", "url": "https://www.nist.gov/", "type": "article" }, @@ -3060,7 +3091,7 @@ "description": "**LOLBAS** (Living Off the Land Binaries and Scripts) refers to a collection of legitimate system binaries and scripts that can be abused by attackers to perform malicious actions while evading detection. These tools, which are often part of the operating system or installed software, can be leveraged for various purposes, such as executing commands, accessing data, or modifying system configurations, thereby allowing attackers to carry out their activities without deploying custom malware. The use of LOLBAS techniques makes it harder for traditional security solutions to detect and prevent malicious activities since the binaries and scripts used are typically trusted and deemed legitimate.\n\nLearn more from the following resources:", "links": [ { - "title": "LOLBAS project", + "title": "LOLBAS Project", "url": "https://lolbas-project.github.io/#", "type": "article" }, @@ -3113,7 +3144,7 @@ "description": "**NetFlow** is a network protocol developed by Cisco for collecting and analyzing network traffic data. It provides detailed information about network flows, including the source and destination IP addresses, ports, and the amount of data transferred. NetFlow data helps network administrators monitor traffic patterns, assess network performance, and identify potential security threats. By analyzing flow data, organizations can gain insights into bandwidth usage, detect anomalies, and optimize network resources. NetFlow is widely supported across various network devices and often integrated with network management and security tools for enhanced visibility and control.\n\nLearn more from the following resources:", "links": [ { - "title": "Cisco NetFlow Website", + "title": "Cisco NetFlow", "url": "https://www.cisco.com/c/en/us/products/ios-nx-os-software/ios-netflow/index.html", "type": "article" }, @@ -3174,7 +3205,7 @@ }, "6oAzYfwsHQYNVbi7c2Tly": { "title": "NAC-based", - "description": "Network Access Control (NAC) based hardening is a crucial component in enhancing the security of your network infrastructure. NAC provides organizations with the ability to control and manage access to the network resources, ensuring that only authorized users and devices can connect to the network. It plays a vital role in reducing the attack surface and preventing unauthorized access to sensitive data and resources. By implementing NAC-based hardening in your cybersecurity strategy, you protect your organization from threats and maintain secure access to critical resources.\n\nLearn more from the following resouces:", + "description": "Network Access Control (NAC) based hardening is a crucial component in enhancing the security of your network infrastructure. NAC provides organizations with the ability to control and manage access to the network resources, ensuring that only authorized users and devices can connect to the network. It plays a vital role in reducing the attack surface and preventing unauthorized access to sensitive data and resources. By implementing NAC-based hardening in your cybersecurity strategy, you protect your organization from threats and maintain secure access to critical resources.\n\nLearn more from the following resources:", "links": [ { "title": "What is Network Access Control", @@ -3407,12 +3438,12 @@ "description": "Antivirus software is a specialized program designed to detect, prevent, and remove malicious software, such as viruses, worms, and trojans, from computer systems. It works by scanning files and programs for known malware signatures, monitoring system behavior for suspicious activity, and providing real-time protection against potential threats. Regular updates are essential for antivirus software to recognize and defend against the latest threats. While it is a critical component of cybersecurity, antivirus solutions are often part of a broader security strategy that includes firewalls, anti-malware tools, and user education to protect against a wide range of cyber threats.\n\nLearn more from the following resources:", "links": [ { - "title": "What is antivirus software?", + "title": "What is Antivirus Software?", "url": "https://www.webroot.com/gb/en/resources/tips-articles/what-is-anti-virus-software", "type": "article" }, { - "title": "What is an antivirus and how does it keep us safe?", + "title": "What is an Antivirus and how does it keep us safe?", "url": "https://www.youtube.com/watch?v=jW626WMWNAE", "type": "video" } @@ -3423,7 +3454,12 @@ "description": "Anti-malware is a type of software designed to detect, prevent, and remove malicious software, such as viruses, worms, trojans, ransomware, and spyware, from computer systems. By continuously scanning files, applications, and incoming data, anti-malware solutions protect devices from a wide range of threats that can compromise system integrity, steal sensitive information, or disrupt operations. Advanced anti-malware programs utilize real-time monitoring, heuristic analysis, and behavioral detection techniques to identify and neutralize both known and emerging threats, ensuring that systems remain secure against evolving cyber attacks.\n\nLearn more from the following resources:", "links": [ { - "title": "What is antimalware?", + "title": "Anti-malware Definition", + "url": "https://www.computertechreviews.com/definition/anti-malware/", + "type": "article" + }, + { + "title": "What is Antimalware?", "url": "https://riskxchange.co/1006974/cybersecurity-what-is-anti-malware/", "type": "article" }, @@ -3811,7 +3847,7 @@ "description": "ANY.RUN is an interactive online malware analysis platform that allows users to safely execute and analyze suspicious files and URLs in a controlled, virtualized environment. This sandbox service provides real-time insights into the behavior of potentially malicious software, such as how it interacts with the system, what files it modifies, and what network connections it attempts to make. Users can observe and control the analysis process, making it a valuable tool for cybersecurity professionals to identify and understand new threats, assess their impact, and develop appropriate countermeasures. ANY.RUN is particularly useful for dynamic analysis, enabling a deeper understanding of malware behavior in real-time.\n\nLearn more from the following resources:", "links": [ { - "title": "ANY.RUN Website", + "title": "Any.run", "url": "https://any.run/", "type": "article" }, @@ -4162,7 +4198,7 @@ "description": "A Man-in-the-Middle (MITM) attack occurs when a malicious actor intercepts communication between two parties, such as a user and a website, without their knowledge. The attacker can eavesdrop, alter, or inject false information into the communication, often to steal sensitive data like login credentials or manipulate transactions. MITM attacks are commonly executed through compromised Wi-Fi networks or by exploiting security vulnerabilities in protocols.\n\nVisit the following resources to learn more:", "links": [ { - "title": "Wikipedia - Man-in-the-middle attack", + "title": "Man-in-the-middle attack", "url": "https://en.wikipedia.org/wiki/Man-in-the-middle_attack", "type": "article" } @@ -4276,7 +4312,7 @@ }, "nOND14t7ISgSH3zNpV3F8": { "title": "Memory Leak", - "description": "A Memory Leak occurs when a computer program consumes memory but fails to release it back to the operating system after it is no longer needed. Over time, this can lead to reduced system performance, increased memory usage, and, in severe cases, the program or system may crash due to the exhaustion of available memory.", + "description": "A Memory Leak occurs when a computer program consumes memory but fails to release it back to the operating system after it is no longer needed. Over time, this can lead to reduced system performance, increased memory usage, and, in severe cases, the program or system may crash due to the exhaustion of available memory.\n\nLearn more from the following resources:", "links": [ { "title": "What are memory leaks?", @@ -4443,7 +4479,7 @@ "description": "A legal department within an organization is responsible for handling all legal matters that affect the business, ensuring compliance with laws and regulations, and providing advice on various legal issues. Its primary functions include managing contracts, intellectual property, employment law, and regulatory compliance, as well as addressing disputes, litigation, and risk management. The legal department also plays a crucial role in corporate governance, ensuring that the company operates within the boundaries of the law while minimizing legal risks. In some cases, they work with external legal counsel for specialized legal matters, such as mergers and acquisitions or complex litigation.\n\nLearn more from the following resources:", "links": [ { - "title": "Key functions of a legal team", + "title": "Key Functions of a Legal Team", "url": "https://uk.practicallaw.thomsonreuters.com/w-009-3932?transitionType=Default&contextData=(sc.Default)&firstPage=true", "type": "article" }, @@ -4703,12 +4739,12 @@ "type": "course" }, { - "title": "AWS Roadmap", + "title": "Visit Dedicated AWS Roadmap", "url": "https://roadmap.sh/aws", "type": "article" }, { - "title": "AWS Website", + "title": "AWS", "url": "https://aws.amazon.com", "type": "article" }, @@ -4745,7 +4781,7 @@ "description": "Azure is Microsoft's comprehensive cloud computing platform that offers a wide range of services for building, deploying, and managing applications. It provides infrastructure as a service (IaaS), platform as a service (PaaS), and software as a service (SaaS) solutions, supporting various programming languages, tools, and frameworks. Azure's services include virtual machines, storage, databases, AI and machine learning, IoT, and more. It offers global data center coverage, integrated DevOps tools, and robust security features, making it a versatile platform for businesses of all sizes to innovate, scale, and transform their operations in the cloud.\n\nLearn more from the following resources:", "links": [ { - "title": "Azure Website", + "title": "Azure", "url": "https://azure.microsoft.com", "type": "article" }, From c236e863a06eae168f8cce37f921600626d5b59a Mon Sep 17 00:00:00 2001 From: Soumik Sarker Date: Sun, 27 Apr 2025 17:42:25 +0600 Subject: [PATCH 13/31] Fixed link of Experimental Design Article of AI Data Scientist roadmap (#8562) --- .../content/ab-testing@mJq9b50MJM9o9dLhx40iN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/roadmaps/ai-data-scientist/content/ab-testing@mJq9b50MJM9o9dLhx40iN.md b/src/data/roadmaps/ai-data-scientist/content/ab-testing@mJq9b50MJM9o9dLhx40iN.md index 66895204d..7ce59617d 100644 --- a/src/data/roadmaps/ai-data-scientist/content/ab-testing@mJq9b50MJM9o9dLhx40iN.md +++ b/src/data/roadmaps/ai-data-scientist/content/ab-testing@mJq9b50MJM9o9dLhx40iN.md @@ -1,5 +1,5 @@ # AB Testing - [@article@Practitioner’s Guide to Statistical Tests](https://vkteam.medium.com/practitioners-guide-to-statistical-tests-ed2d580ef04f#1e3b) -- [@article@Step by Step Process for Planning an A/B Test](https://towardsdatascience.com/step-by-step-for-planning-an-a-b-test-ef3c93143c0b) +- [@article@Step by Step Process for Planning an A/B Test](https://medium.com/data-science/step-by-step-for-planning-an-a-b-test-ef3c93143c0b) - [@feed@Explore top posts about A/B Testing](https://app.daily.dev/tags/ab-testing?ref=roadmapsh) From a33018de1d257897fbb03d71f8f23326a0486f87 Mon Sep 17 00:00:00 2001 From: Vedansh Date: Sun, 27 Apr 2025 18:38:05 +0530 Subject: [PATCH 14/31] fix(cybersecurity): resource link adjustments (#8544) * adjustments. * Squashed commit of the following: commit ab55b0972edca0ea36bd87e93a54e38750b15208 Author: Vedansh Date: Tue Apr 22 17:32:07 2025 +0530 adjust remaining topics. * Update src/data/roadmaps/cyber-security/content/dig@D2YYv1iTRGken75sHO0Gt.md --------- Co-authored-by: Arik Chakma --- .../content/default-gateway@5rKaFtjYx0n2iF8uTLs8X.md | 2 +- .../cyber-security/content/dig@D2YYv1iTRGken75sHO0Gt.md | 3 +-- .../cyber-security/content/dlp@iolsTC-63d_1wzKGul-cT.md | 3 ++- .../cyber-security/content/dmz@gfpvDQz61I3zTB7tGu7vp.md | 2 +- .../content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md | 5 ++--- .../cyber-security/content/dns@ORIdKG8H97VkBUYpiDtXf.md | 4 ++-- .../cyber-security/content/dropbox@9OastXVfiG1YRMm68ecnn.md | 4 +++- .../content/dumpster-diving@Iu0Qtk13RjrhHpSlm0uyh.md | 3 ++- .../content/endpoint-security@LEgJtu1GZKOtoAXyOGWLE.md | 2 +- .../cyber-security/content/esxi@BisNooct1vJDKaBKsGR7_.md | 2 +- .../content/event-logs@KbFwL--xF-eYjGy8PZdrM.md | 2 +- .../false-negative--false-positive@XwRCZf-yHJsXVjaRfb3R4.md | 1 + .../firewall--nextgen-firewall@tWDo5R3KU5KOjDdtv801x.md | 2 +- .../content/firewall-logs@np0PwKy-EvIa_f_LC6Eem.md | 4 ++-- .../cyber-security/content/ftp@ftYYMxRpVer-jgSswHLNa.md | 1 + .../content/fundamental-it-skills@oimYzZYFXKjgvc7D4c-2u.md | 4 +++- .../cyber-security/content/gcp@tOLA5QPKi6LHl1ljsOMwX.md | 3 ++- .../cyber-security/content/giac@ZiUT-lyIBfHTzG-dwSy96.md | 3 ++- .../cyber-security/content/go@jehVvdz8BnruKjqHMKu5v.md | 4 ++-- .../content/google-drive@fTZ4PqH-AMhYA_65w4wFO.md | 2 +- .../content/google-suite@IOK_FluAv34j3Tj_NvwdO.md | 2 +- .../cyber-security/content/gpen@t4h9rEKWz5Us0qJKXhxlX.md | 2 +- .../cyber-security/content/gsec@nlmATCTgHoIoMcEOW8bUW.md | 2 +- .../cyber-security/content/gwapt@rwniCTWfYpKP5gi02Pa9f.md | 2 +- 24 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/data/roadmaps/cyber-security/content/default-gateway@5rKaFtjYx0n2iF8uTLs8X.md b/src/data/roadmaps/cyber-security/content/default-gateway@5rKaFtjYx0n2iF8uTLs8X.md index 1e93ca9bf..3513e71e9 100644 --- a/src/data/roadmaps/cyber-security/content/default-gateway@5rKaFtjYx0n2iF8uTLs8X.md +++ b/src/data/roadmaps/cyber-security/content/default-gateway@5rKaFtjYx0n2iF8uTLs8X.md @@ -4,5 +4,5 @@ A default gateway is a network node, typically a router or a firewall, that serv Learn more from the following resources: -- [@article@What is a default gateway?](https://nordvpn.com/blog/what-is-a-default-gateway/?srsltid=AfmBOoosi5g4acnT9Gv_B86FMGr72hWDhk8J-4jr1HvxPCSu96FikCyw) +- [@article@What is a Default Gateway?](https://nordvpn.com/blog/what-is-a-default-gateway/?srsltid=AfmBOoosi5g4acnT9Gv_B86FMGr72hWDhk8J-4jr1HvxPCSu96FikCyw) - [@video@Routers and Default Gateways](https://www.youtube.com/watch?v=JOomC1wFrbU) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/dig@D2YYv1iTRGken75sHO0Gt.md b/src/data/roadmaps/cyber-security/content/dig@D2YYv1iTRGken75sHO0Gt.md index ef43082f7..935d08569 100644 --- a/src/data/roadmaps/cyber-security/content/dig@D2YYv1iTRGken75sHO0Gt.md +++ b/src/data/roadmaps/cyber-security/content/dig@D2YYv1iTRGken75sHO0Gt.md @@ -4,5 +4,4 @@ Learn more from the following resources: -- [@video@How to look up DNS records with dig](https://www.youtube.com/watch?v=3AOKomsmeUY) -- [@article@How to use Linux dig command](https://www.google.com/search?client=firefox-b-d&q=linux+dig+command) \ No newline at end of file +- [@video@How to look up DNS records with dig](https://www.youtube.com/watch?v=3AOKomsmeUY) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/dlp@iolsTC-63d_1wzKGul-cT.md b/src/data/roadmaps/cyber-security/content/dlp@iolsTC-63d_1wzKGul-cT.md index 23cf1237f..7b19d0434 100644 --- a/src/data/roadmaps/cyber-security/content/dlp@iolsTC-63d_1wzKGul-cT.md +++ b/src/data/roadmaps/cyber-security/content/dlp@iolsTC-63d_1wzKGul-cT.md @@ -3,5 +3,6 @@ Data Loss Prevention (DLP) refers to a set of strategies, tools, and processes used by organizations to ensure that sensitive data is not lost, accessed, or misused by unauthorized users. DLP solutions monitor, detect, and block the movement of critical information outside an organization’s network, helping to prevent data breaches, leaks, and other security incidents. Visit the following resources to learn more: -- [@article@What is data loss prevention (DLP)?](https://www.techtarget.com/whatis/definition/data-loss-prevention-DLP) + - [@article@What is DLP (data loss prevention)?](https://www.cloudflare.com/es-es/learning/access-management/what-is-dlp/) +- [@article@What is Data Loss Prevention (DLP)?](https://www.techtarget.com/whatis/definition/data-loss-prevention-DLP) diff --git a/src/data/roadmaps/cyber-security/content/dmz@gfpvDQz61I3zTB7tGu7vp.md b/src/data/roadmaps/cyber-security/content/dmz@gfpvDQz61I3zTB7tGu7vp.md index 433e4629d..aaa4c902e 100644 --- a/src/data/roadmaps/cyber-security/content/dmz@gfpvDQz61I3zTB7tGu7vp.md +++ b/src/data/roadmaps/cyber-security/content/dmz@gfpvDQz61I3zTB7tGu7vp.md @@ -4,5 +4,5 @@ A **DMZ**, also known as a **Demilitarized Zone**, is a specific part of a netwo Learn more from the following resources: -- [@article@What is a DMZ network?](https://www.fortinet.com/resources/cyberglossary/what-is-dmz) +- [@article@What is a DMZ Network?](https://www.fortinet.com/resources/cyberglossary/what-is-dmz) - [@video@DMZ explained](https://www.youtube.com/watch?v=48QZfBeU4ps) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md b/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md index f46313fe9..61b897e54 100644 --- a/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md +++ b/src/data/roadmaps/cyber-security/content/dns-poisoning@urtsyYWViEzbqYLoNfQAh.md @@ -1,10 +1,9 @@ -# DNS(Domain Name System) Poisoning/DNS Spoofing/DNS Cache Poisoning +# DNS Poisoning/DNS Spoofing/DNS Cache Poisoning DNS spoofing or DNS cache poisoning, occurs when fake information is inserted into a DNS server’s cache.This causes DNS queries to return incorrect IP addresses, directing users to the wrong websites. Hackers exploit this to reroute traffic to malicious sites. The issue persists until the cached information is corrected.When the cache is poisoned, it misdirects traffic until the incorrect information is fixed. This technique exploits vulnerabilities in the DNS system and can spread to other servers, causing widespread issues. Visit the following resources to learn more: -- [@article@What is DNS cache poisoning? | DNS spoofing](https://www.cloudflare.com/learning/dns/dns-cache-poisoning/) - +- [@article@What is DNS Cache Poisoning? | DNS spoofing](https://www.cloudflare.com/learning/dns/dns-cache-poisoning/) - [@article@What Is DNS Poisoning?](https://www.fortinet.com/resources/cyberglossary/dns-poisoning) - [@article@DNS Poisoning (DNS Spoofing): Definition, Technique & Defense](https://www.okta.com/identity-101/dns-poisoning/) diff --git a/src/data/roadmaps/cyber-security/content/dns@ORIdKG8H97VkBUYpiDtXf.md b/src/data/roadmaps/cyber-security/content/dns@ORIdKG8H97VkBUYpiDtXf.md index 2cdc9d0ff..d11ec548e 100644 --- a/src/data/roadmaps/cyber-security/content/dns@ORIdKG8H97VkBUYpiDtXf.md +++ b/src/data/roadmaps/cyber-security/content/dns@ORIdKG8H97VkBUYpiDtXf.md @@ -4,6 +4,6 @@ The Domain Name System (DNS) is a fundamental protocol of the internet that tran Learn more from the following resources: +- [@article@What is DNS?](https://www.cloudflare.com/en-gb/learning/dns/what-is-dns/) - [@video@DNS Explained in 100 Seconds](https://www.youtube.com/watch?v=UVR9lhUGAyU) -- [@video@What is DNS?](https://www.youtube.com/watch?v=nyH0nYhMW9M) -- [@article@What is DNS?](https://www.cloudflare.com/en-gb/learning/dns/what-is-dns/) \ No newline at end of file +- [@video@What is DNS?](https://www.youtube.com/watch?v=nyH0nYhMW9M) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/dropbox@9OastXVfiG1YRMm68ecnn.md b/src/data/roadmaps/cyber-security/content/dropbox@9OastXVfiG1YRMm68ecnn.md index 935ef8b95..001684479 100644 --- a/src/data/roadmaps/cyber-security/content/dropbox@9OastXVfiG1YRMm68ecnn.md +++ b/src/data/roadmaps/cyber-security/content/dropbox@9OastXVfiG1YRMm68ecnn.md @@ -4,4 +4,6 @@ Dropbox is a widely used cloud storage service that allows you to store, access, Learn more from the following resources: -- [@official@Dropbox Website](https://dropbox.com) \ No newline at end of file +- [@official@Dropbox](https://dropbox.com) +- [@official@How to Use Dropbox - a guide to your account](https://learn.dropbox.com/self-guided-learning/dropbox-fundamentals-course/how-to-use-dropbox) +- [@video@Dropbox Tutorial for Beginners](https://www.youtube.com/watch?v=b0Nk9muiUcQ) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/dumpster-diving@Iu0Qtk13RjrhHpSlm0uyh.md b/src/data/roadmaps/cyber-security/content/dumpster-diving@Iu0Qtk13RjrhHpSlm0uyh.md index d3223c981..3081ee36a 100644 --- a/src/data/roadmaps/cyber-security/content/dumpster-diving@Iu0Qtk13RjrhHpSlm0uyh.md +++ b/src/data/roadmaps/cyber-security/content/dumpster-diving@Iu0Qtk13RjrhHpSlm0uyh.md @@ -4,5 +4,6 @@ Dumpster Diving in the context of cybersecurity refers to the practice of search Visit the following resources to learn more: +- [@article@Dumpster Diving](https://www.techtarget.com/searchsecurity/definition/dumpster-diving) - [@article@What is Dumpster Diving](https://powerdmarc.com/dumpster-diving-in-cybersecurity/) -- [@video@Dumpster diving for sensitive information](https://www.youtube.com/watch?v=Pom86gq4mk4) \ No newline at end of file +- [@video@Dumpster Diving for Sensitive Information](https://www.youtube.com/watch?v=Pom86gq4mk4) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/endpoint-security@LEgJtu1GZKOtoAXyOGWLE.md b/src/data/roadmaps/cyber-security/content/endpoint-security@LEgJtu1GZKOtoAXyOGWLE.md index a28e64011..d79ef60eb 100644 --- a/src/data/roadmaps/cyber-security/content/endpoint-security@LEgJtu1GZKOtoAXyOGWLE.md +++ b/src/data/roadmaps/cyber-security/content/endpoint-security@LEgJtu1GZKOtoAXyOGWLE.md @@ -5,4 +5,4 @@ Endpoint security focuses on protecting individual devices that connect to a net Learn more from the following resources: - [@article@What is Endpoint Security?](https://www.crowdstrike.com/cybersecurity-101/endpoint-security/) -- [@video@Endpoints are the IT frontdoor - Gaurd them!](https://www.youtube.com/watch?v=Njqid_JpqTs) \ No newline at end of file +- [@video@Endpoints are the IT Frontdoor - Guard them!](https://www.youtube.com/watch?v=Njqid_JpqTs) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/esxi@BisNooct1vJDKaBKsGR7_.md b/src/data/roadmaps/cyber-security/content/esxi@BisNooct1vJDKaBKsGR7_.md index de4466dcb..0fbae7227 100644 --- a/src/data/roadmaps/cyber-security/content/esxi@BisNooct1vJDKaBKsGR7_.md +++ b/src/data/roadmaps/cyber-security/content/esxi@BisNooct1vJDKaBKsGR7_.md @@ -1,4 +1,4 @@ -# esxi +# ESXi VMware ESXi is a Type 1 hypervisor and the core building block for VMware's virtualization technology. It represents a bare-metal hypervisor, which means it is installed directly onto your physical server's hardware, without the need for a supporting operating system. This results in elevated performance, reduced overhead, and efficient resource allocation. diff --git a/src/data/roadmaps/cyber-security/content/event-logs@KbFwL--xF-eYjGy8PZdrM.md b/src/data/roadmaps/cyber-security/content/event-logs@KbFwL--xF-eYjGy8PZdrM.md index 55a99a41b..f5228f106 100644 --- a/src/data/roadmaps/cyber-security/content/event-logs@KbFwL--xF-eYjGy8PZdrM.md +++ b/src/data/roadmaps/cyber-security/content/event-logs@KbFwL--xF-eYjGy8PZdrM.md @@ -4,5 +4,5 @@ Event logs are digital records that document activities and occurrences within c Learn more from the following resources: -- [@article@What is an event log?](https://www.crowdstrike.com/cybersecurity-101/observability/event-log/) +- [@article@What is an Event Log?](https://www.crowdstrike.com/cybersecurity-101/observability/event-log/) - [@article@What are event logs and why do they matter?](https://www.blumira.com/blog/what-are-event-logs-and-why-do-they-matter) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/false-negative--false-positive@XwRCZf-yHJsXVjaRfb3R4.md b/src/data/roadmaps/cyber-security/content/false-negative--false-positive@XwRCZf-yHJsXVjaRfb3R4.md index 3104cb163..5d91b885a 100644 --- a/src/data/roadmaps/cyber-security/content/false-negative--false-positive@XwRCZf-yHJsXVjaRfb3R4.md +++ b/src/data/roadmaps/cyber-security/content/false-negative--false-positive@XwRCZf-yHJsXVjaRfb3R4.md @@ -8,5 +8,6 @@ To have an effective cybersecurity system, security professionals aim to maximiz Learn more from the following resources: +- [@article@Difference Between False Positive and False Negative](https://www.differencebetween.net/science/difference-between-false-positive-and-false-negative/) - [@video@What is a false positive virus?](https://www.youtube.com/watch?v=WrcAGBvIT14) - [@video@False positives and false negatives](https://www.youtube.com/watch?v=bUNBzMnfHLw) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/firewall--nextgen-firewall@tWDo5R3KU5KOjDdtv801x.md b/src/data/roadmaps/cyber-security/content/firewall--nextgen-firewall@tWDo5R3KU5KOjDdtv801x.md index 33b45b658..3e1a989ae 100644 --- a/src/data/roadmaps/cyber-security/content/firewall--nextgen-firewall@tWDo5R3KU5KOjDdtv801x.md +++ b/src/data/roadmaps/cyber-security/content/firewall--nextgen-firewall@tWDo5R3KU5KOjDdtv801x.md @@ -6,5 +6,5 @@ Next-generation firewalls (NGFWs) build upon this foundation, offering more adva Learn more from the following resources: -- [@article@What is a firewall?](https://www.kaspersky.com/resource-center/definitions/firewall) +- [@article@What is a Firewall?](https://www.kaspersky.com/resource-center/definitions/firewall) - [@article@What is a next-generation firewall (NGFW)?](https://www.cloudflare.com/en-gb/learning/security/what-is-next-generation-firewall-ngfw/) diff --git a/src/data/roadmaps/cyber-security/content/firewall-logs@np0PwKy-EvIa_f_LC6Eem.md b/src/data/roadmaps/cyber-security/content/firewall-logs@np0PwKy-EvIa_f_LC6Eem.md index 6b3b158dd..dfdf8a0cb 100644 --- a/src/data/roadmaps/cyber-security/content/firewall-logs@np0PwKy-EvIa_f_LC6Eem.md +++ b/src/data/roadmaps/cyber-security/content/firewall-logs@np0PwKy-EvIa_f_LC6Eem.md @@ -4,5 +4,5 @@ Firewall logs are detailed records of network traffic and security events captur Learn more from the following resources: -- [@article@What is firewall logging and why is it important?](https://cybriant.com/what-is-firewall-logging-and-why-is-it-important/) -- [@video@Reviewing firewall logs](https://www.youtube.com/watch?v=XiJ30f8V_T4) \ No newline at end of file +- [@article@What is Firewall Logging and Why is it Important?](https://cybriant.com/what-is-firewall-logging-and-why-is-it-important/) +- [@video@Reviewing Firewall Logs](https://www.youtube.com/watch?v=XiJ30f8V_T4) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/ftp@ftYYMxRpVer-jgSswHLNa.md b/src/data/roadmaps/cyber-security/content/ftp@ftYYMxRpVer-jgSswHLNa.md index 7a93e5958..b8d5eb939 100644 --- a/src/data/roadmaps/cyber-security/content/ftp@ftYYMxRpVer-jgSswHLNa.md +++ b/src/data/roadmaps/cyber-security/content/ftp@ftYYMxRpVer-jgSswHLNa.md @@ -6,5 +6,6 @@ FTP operates on a client-server model, where one computer acts as the client (th Learn more from the following resources: +- [@article@File Transfer Protocol](https://en.wikipedia.org/wiki/File_Transfer_Protocol) - [@video@What is FTP?](https://www.youtube.com/watch?v=HI0Oh4NJqcI) - [@article@FTP meaning and uses](https://www.investopedia.com/terms/f/ftp-file-transfer-protocol.asp) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/fundamental-it-skills@oimYzZYFXKjgvc7D4c-2u.md b/src/data/roadmaps/cyber-security/content/fundamental-it-skills@oimYzZYFXKjgvc7D4c-2u.md index eef744c73..e3cf7e071 100644 --- a/src/data/roadmaps/cyber-security/content/fundamental-it-skills@oimYzZYFXKjgvc7D4c-2u.md +++ b/src/data/roadmaps/cyber-security/content/fundamental-it-skills@oimYzZYFXKjgvc7D4c-2u.md @@ -4,4 +4,6 @@ Fundamental IT skills form the backbone of cybersecurity proficiency and encompa Learn more from the following resources: -- [@article@Top 10 in demand IT skills](https://www.comptia.org/blog/top-it-skills-in-demand) +- [@article@7 In-Demand IT Skills to Boost Your Resume in 2025](https://www.coursera.org/articles/key-it-skills-for-your-career) +- [@article@Top 10 in Demand IT Skills](https://www.comptia.org/blog/top-it-skills-in-demand) +- [@article@IT Skills: Definition and Examples](https://www.indeed.com/career-advice/finding-a-job/it-skills) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/gcp@tOLA5QPKi6LHl1ljsOMwX.md b/src/data/roadmaps/cyber-security/content/gcp@tOLA5QPKi6LHl1ljsOMwX.md index ad4759dc6..38f418ad4 100644 --- a/src/data/roadmaps/cyber-security/content/gcp@tOLA5QPKi6LHl1ljsOMwX.md +++ b/src/data/roadmaps/cyber-security/content/gcp@tOLA5QPKi6LHl1ljsOMwX.md @@ -5,4 +5,5 @@ Google Cloud Platform (GCP) is a collection of cloud computing services offered Learn more from the following resources: - [@official@Google Cloud Platform](https://cloud.google.com) -- [@course@Google Cloud Platform Video Course](https://www.youtube.com/watch?v=fZOz13joN0o) \ No newline at end of file +- [@official@Cloud Computing, Hosting Services, and APIs](https://cloud.google.com/gcp) +- [@video@Google Cloud Platform Video Course](https://www.youtube.com/watch?v=fZOz13joN0o) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/giac@ZiUT-lyIBfHTzG-dwSy96.md b/src/data/roadmaps/cyber-security/content/giac@ZiUT-lyIBfHTzG-dwSy96.md index 794fcd297..91eddeec1 100644 --- a/src/data/roadmaps/cyber-security/content/giac@ZiUT-lyIBfHTzG-dwSy96.md +++ b/src/data/roadmaps/cyber-security/content/giac@ZiUT-lyIBfHTzG-dwSy96.md @@ -4,4 +4,5 @@ GIAC is a globally recognized organization that provides certifications for info Learn more from the following resources: -- [@official@GIAC Website](https://www.giac.org/) \ No newline at end of file +- [@official@GIAC](https://www.giac.org/) +- [@official@Get Certified - GIAC](https://www.giac.org/get-certified/?msc=main-nav) diff --git a/src/data/roadmaps/cyber-security/content/go@jehVvdz8BnruKjqHMKu5v.md b/src/data/roadmaps/cyber-security/content/go@jehVvdz8BnruKjqHMKu5v.md index 8cc70c763..1f9c88563 100644 --- a/src/data/roadmaps/cyber-security/content/go@jehVvdz8BnruKjqHMKu5v.md +++ b/src/data/roadmaps/cyber-security/content/go@jehVvdz8BnruKjqHMKu5v.md @@ -4,6 +4,6 @@ Go, also known as Golang, is an open-source programming language created by Goog Learn more from the following resources: -- [@roadmap@Go Roadmap](https://roadmap.sh/golang) +- [@roadmap@Visit Dedicated Go Roadmap](https://roadmap.sh/golang) - [@video@Go in 100 seconds](https://www.youtube.com/watch?v=446E-r0rXHI) -- [@course@Go tutorial for beginners](https://www.youtube.com/watch?v=yyUHQIec83I) +- [@video@Go Tutorial for beginners](https://www.youtube.com/watch?v=yyUHQIec83I) diff --git a/src/data/roadmaps/cyber-security/content/google-drive@fTZ4PqH-AMhYA_65w4wFO.md b/src/data/roadmaps/cyber-security/content/google-drive@fTZ4PqH-AMhYA_65w4wFO.md index 09dcb091c..08fea7184 100644 --- a/src/data/roadmaps/cyber-security/content/google-drive@fTZ4PqH-AMhYA_65w4wFO.md +++ b/src/data/roadmaps/cyber-security/content/google-drive@fTZ4PqH-AMhYA_65w4wFO.md @@ -4,4 +4,4 @@ Google Drive is a cloud-based storage solution provided by Google, which offers Learn more from the following resources: -- [@official@Google Drive Website](https://drive.google.com) \ No newline at end of file +- [@official@Google Drive](https://drive.google.com) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/google-suite@IOK_FluAv34j3Tj_NvwdO.md b/src/data/roadmaps/cyber-security/content/google-suite@IOK_FluAv34j3Tj_NvwdO.md index af45a9046..ee116848f 100644 --- a/src/data/roadmaps/cyber-security/content/google-suite@IOK_FluAv34j3Tj_NvwdO.md +++ b/src/data/roadmaps/cyber-security/content/google-suite@IOK_FluAv34j3Tj_NvwdO.md @@ -4,4 +4,4 @@ Google Workspace, formerly known as G Suite, is a collection of cloud-based prod Learn more from the following resources: -- [@official@Google Workspace Website](https://workspace.google.com/intl/en_uk/) \ No newline at end of file +- [@official@Google Workspace](https://workspace.google.com/intl/en_uk/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/gpen@t4h9rEKWz5Us0qJKXhxlX.md b/src/data/roadmaps/cyber-security/content/gpen@t4h9rEKWz5Us0qJKXhxlX.md index 3993f80cd..9369ba315 100644 --- a/src/data/roadmaps/cyber-security/content/gpen@t4h9rEKWz5Us0qJKXhxlX.md +++ b/src/data/roadmaps/cyber-security/content/gpen@t4h9rEKWz5Us0qJKXhxlX.md @@ -4,5 +4,5 @@ The GIAC Penetration Tester (GPEN) certification is an advanced-level credential Learn more from the following resources: -- [@official@GPEN Certification Website](https://www.giac.org/certifications/penetration-tester-gpen/) +- [@official@GPEN Certification](https://www.giac.org/certifications/penetration-tester-gpen/) - [@article@What is the GPEN Certification?](https://hackernoon.com/what-is-the-giac-penetration-tester-gpen-certification) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/gsec@nlmATCTgHoIoMcEOW8bUW.md b/src/data/roadmaps/cyber-security/content/gsec@nlmATCTgHoIoMcEOW8bUW.md index a586e3ea6..010fee04b 100644 --- a/src/data/roadmaps/cyber-security/content/gsec@nlmATCTgHoIoMcEOW8bUW.md +++ b/src/data/roadmaps/cyber-security/content/gsec@nlmATCTgHoIoMcEOW8bUW.md @@ -4,4 +4,4 @@ The GIAC Security Essentials Certification (GSEC) is an advanced cybersecurity c Learn more from the following resources: -- [@official@GSEC Certification Website](https://www.giac.org/certifications/security-essentials-gsec/) \ No newline at end of file +- [@official@GSEC Certification](https://www.giac.org/certifications/security-essentials-gsec/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/gwapt@rwniCTWfYpKP5gi02Pa9f.md b/src/data/roadmaps/cyber-security/content/gwapt@rwniCTWfYpKP5gi02Pa9f.md index 43638675c..7060a8a4b 100644 --- a/src/data/roadmaps/cyber-security/content/gwapt@rwniCTWfYpKP5gi02Pa9f.md +++ b/src/data/roadmaps/cyber-security/content/gwapt@rwniCTWfYpKP5gi02Pa9f.md @@ -4,4 +4,4 @@ The GIAC Web Application Penetration Tester (GWAPT) certification validates an i Learn more from the following resources: -- [@official@GWAPT Certification Website](https://www.giac.org/certifications/web-application-penetration-tester-gwapt/) +- [@official@GWAPT Certification](https://www.giac.org/certifications/web-application-penetration-tester-gwapt/) From 2937923fb110c09fc607aef37bd367bce50638f3 Mon Sep 17 00:00:00 2001 From: Jawher Kl Date: Mon, 28 Apr 2025 09:26:41 +0100 Subject: [PATCH 15/31] Fix wrong URL (#8429) --- src/data/roadmaps/system-design/system-design.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/roadmaps/system-design/system-design.json b/src/data/roadmaps/system-design/system-design.json index 61eceab08..7b6ced3d3 100644 --- a/src/data/roadmaps/system-design/system-design.json +++ b/src/data/roadmaps/system-design/system-design.json @@ -6912,8 +6912,8 @@ }, "selected": false, "data": { - "label": "System Design", - "href": "https://roadmap.sh/system-design", + "label": "Software Architect", + "href": "https://roadmap.sh/software-architect", "color": "#FFFFFf", "backgroundColor": "#4136D6", "style": { From 80a0caba2f010dad16735b9b65df1fdb78c74e77 Mon Sep 17 00:00:00 2001 From: David Willis-Owen <100765093+davidwillisowen@users.noreply.github.com> Date: Mon, 28 Apr 2025 13:12:11 +0100 Subject: [PATCH 16/31] Update resources in AI Red Teaming Roadmap (#8570) * Update why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md * Update prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md * Update generative-models@3XJ-g0KvHP75U18mxCqgw.md * Update prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md * Update jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md * Update countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md * Update forums@Smncq-n1OlnLAY27AFQOO.md * Update lab-environments@MmwwRK4I9aRH_ha7duPqf.md * Update ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md * Update ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md * Update industry-credentials@HHjsFR6wRDqUd66PMDE_7.md * Update agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md * Update responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md * Update benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md * Update adversarial-examples@xjlttOti-_laPRn8a2fVy.md * Update large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md * Update introduction@HFJIYcI16OMyM77fAw9af.md * Update ethical-considerations@1gyuEV519LjN-KpROoVwv.md * Update role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md * Update threat-modeling@RDOaTBWP3aIJPUp_kcafm.md * Update direct@5zHow4KZVpfhch5Aabeft.md * Update indirect@3_gJRtJSdm2iAfkwmcv0e.md * Update model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md * Update model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md * Update unauthorized-access@DQeOavZCoXpF3k_qRDABs.md * Update data-poisoning@nD0_64ELEeJSN-0aZiR7i.md * Update model-inversion@iE5PcswBHnu_EBFIacib0.md * Update code-injection@vhBu5x8INTtqvx6vcYAhE.md * Update remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md * Update api-protection@Tszl26iNBnQBdBEWOueDA.md * Update authentication@J7gjlt2MBx7lOkOnfGvPF.md * Update white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md * Update white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md * Update white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md * Update automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md * Update specialized-courses@s1xKK8HL5-QGZpcutiuvj.md --- .../content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md | 1 - .../content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md | 3 +-- .../content/api-protection@Tszl26iNBnQBdBEWOueDA.md | 1 - .../content/authentication@J7gjlt2MBx7lOkOnfGvPF.md | 2 +- .../content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md | 2 +- .../content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md | 3 ++- .../content/code-injection@vhBu5x8INTtqvx6vcYAhE.md | 2 +- .../content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md | 1 + .../content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md | 3 +-- .../content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md | 1 - .../ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md | 2 +- .../ethical-considerations@1gyuEV519LjN-KpROoVwv.md | 1 - .../ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md | 4 ++-- .../content/generative-models@3XJ-g0KvHP75U18mxCqgw.md | 4 ++-- .../content/indirect@3_gJRtJSdm2iAfkwmcv0e.md | 2 +- .../content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md | 4 ++-- .../content/introduction@HFJIYcI16OMyM77fAw9af.md | 1 - .../content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md | 2 +- .../content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md | 3 ++- .../content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md | 2 +- .../content/model-inversion@iE5PcswBHnu_EBFIacib0.md | 1 - .../content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md | 2 +- .../content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md | 1 - .../content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md | 2 -- .../content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md | 2 +- .../content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md | 2 +- .../responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md | 4 ++-- .../content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md | 2 +- .../content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md | 1 - .../content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md | 1 - .../content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md | 4 ++-- .../content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md | 4 ++-- .../why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md | 7 ++++++- 33 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md b/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md index 4eda151d6..4cc1c5f78 100644 --- a/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md +++ b/src/data/roadmaps/ai-red-teaming/content/adversarial-examples@xjlttOti-_laPRn8a2fVy.md @@ -4,7 +4,6 @@ A core AI Red Teaming activity involves generating adversarial examples – inpu Learn more from the following resources: -- [@article@Adversarial Examples Explained (OpenAI Blog)](https://openai.com/research/adversarial-examples) - [@guide@Adversarial Examples – Interpretable Machine Learning Book](https://christophm.github.io/interpretable-ml-book/adversarial.html) - [@guide@Adversarial Testing for Generative AI](https://developers.google.com/machine-learning/guides/adv-testing) - [@video@How AI Can Be Tricked With Adversarial Attacks](https://www.youtube.com/watch?v=J3X_JWQkvo8?v=MPcfoQBDY0w) diff --git a/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md b/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md index 9f41962db..a6a86529d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md +++ b/src/data/roadmaps/ai-red-teaming/content/agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md @@ -5,5 +5,4 @@ As AI agents capable of autonomous action become more common, AI Red Teamers mus Learn more from the following resources: - [@article@AI Agents - Learn Prompting](https://learnprompting.org/docs/intermediate/ai_agents) -- [@article@Reasoning models don't always say what they think](https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think) -- [@course@Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.](https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto) +- [@article@EmbraceTheRed](https://embracethered.com/) diff --git a/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md b/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md index f9350a365..3dffaa0ee 100644 --- a/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md +++ b/src/data/roadmaps/ai-red-teaming/content/api-protection@Tszl26iNBnQBdBEWOueDA.md @@ -4,7 +4,6 @@ AI Red Teamers rigorously test the security of APIs providing access to AI model Learn more from the following resources: -- [@article@API Protection for AI Factories: The First Step to AI Security](https://www.f5.com/company/blog/api-security-for-ai-factories) - [@article@Securing APIs with AI for Advanced Threat Protection](https://adevait.com/artificial-intelligence/securing-apis-with-ai) - [@article@Securing Machine Learning APIs (IBM)](https://developer.ibm.com/articles/se-securing-machine-learning-apis/) - [@guide@OWASP API Security Project (Top 10 2023)](https://owasp.org/www-project-api-security/) diff --git a/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md b/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md index 9b93f5b5c..fe9fab550 100644 --- a/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md +++ b/src/data/roadmaps/ai-red-teaming/content/authentication@J7gjlt2MBx7lOkOnfGvPF.md @@ -6,4 +6,4 @@ Learn more from the following resources: - [@article@Red-Teaming in AI Testing: Stress Testing](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - [@article@What is Authentication vs Authorization?](https://auth0.com/intro-to-iam/authentication-vs-authorization) -- [@video@How JWTs are used for Authentication (and how to bypass it)](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME) +- [@article@JWT Attacks](https://portswigger.net/web-security/jwt) diff --git a/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md b/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md index d83fb7e8e..790d8d4d1 100644 --- a/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md +++ b/src/data/roadmaps/ai-red-teaming/content/automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md @@ -6,4 +6,4 @@ Learn more from the following resources: - [@article@Automation Testing vs. Manual Testing: Which is the better approach?](https://www.opkey.com/blog/automation-testing-vs-manual-testing-which-is-better) - [@article@Manual Testing vs Automated Testing: What's the Difference?](https://www.leapwork.com/blog/manual-vs-automated-testing) -- [@guide@LLM red teaming guide (open source)](https://www.promptfoo.dev/docs/red-team/) +- [@tool@Spikee](https://spikee.ai) diff --git a/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md b/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md index 6525bf1e2..b4ede08a6 100644 --- a/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md +++ b/src/data/roadmaps/ai-red-teaming/content/benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md @@ -1,9 +1,10 @@ # Benchmark Datasets -AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models. +AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like HackAprompt, SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models. Learn more from the following resources: +- [@dataset@HackAPrompt Dataset](https://huggingface.co/datasets/hackaprompt/hackaprompt-dataset) - [@dataset@CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset](https://github.com/cysecbench/dataset) - [@dataset@NYU CTF Bench: A Scalable Open-Source Benchmark Dataset for Evaluating LLMs in Offensive Security](https://proceedings.neurips.cc/paper_files/paper/2024/hash/69d97a6493fbf016fff0a751f253ad18-Abstract-Datasets_and_Benchmarks_Track.html) - [@dataset@SecBench: A Comprehensive Multi-Dimensional Benchmarking Dataset for LLMs in Cybersecurity](https://arxiv.org/abs/2412.20787) diff --git a/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md b/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md index 3b5431bc4..16f13a0cc 100644 --- a/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md +++ b/src/data/roadmaps/ai-red-teaming/content/code-injection@vhBu5x8INTtqvx6vcYAhE.md @@ -5,5 +5,5 @@ AI Red Teamers test for code injection vulnerabilities specifically in the conte Learn more from the following resources: - [@article@Code Injection in LLM Applications](https://neuraltrust.ai/blog/code-injection-in-llms) -- [@docs@Secure Plugin Sandboxing (OpenAI Plugins)](https://platform.openai.com/docs/plugins/production/security-requirements) +- [@article@Code Injection](https://learnprompting.org/docs/prompt_hacking/offensive_measures/code_injection) - [@guide@Code Injection](https://owasp.org/www-community/attacks/Code_Injection) diff --git a/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md b/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md index 3cf4d616c..907fbbe79 100644 --- a/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md +++ b/src/data/roadmaps/ai-red-teaming/content/countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md @@ -4,6 +4,7 @@ AI Red Teamers must also understand and test defenses against prompt hacking. Th Learn more from the following resources: +- [@article@Prompt Hacking Defensive Measures](https://learnprompting.org/docs/prompt_hacking/defensive_measures/introduction) - [@article@Mitigating Prompt Injection Attacks (NCC Group Research)](https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/) - [@article@Prompt Injection & the Rise of Prompt Attacks](https://www.lakera.ai/blog/guide-to-prompt-injection) - [@article@Prompt Injection: Impact, How It Works & 4 Defense Measures](https://www.tigera.io/learn/guides/llm-security/prompt-injection/) diff --git a/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md b/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md index bca8cfb12..4785638b4 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md +++ b/src/data/roadmaps/ai-red-teaming/content/ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md @@ -4,7 +4,6 @@ Capture The Flag competitions increasingly include AI/ML security challenges. Pa Learn more from the following resources: -- [@article@Capture the flag (cybersecurity)](https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity) +- [@platform@HackAPrompt](https://www.hackaprompt.com/) - [@article@Progress from our Frontier Red Team](https://www.anthropic.com/news/strategic-warning-for-ai-risk-progress-and-insights-from-our-frontier-red-team) - [@platform@CTFtime.org](https://ctftime.org/) -- [@platform@picoCTF](https://picoctf.org/) diff --git a/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md b/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md index 057d5549f..8b0389524 100644 --- a/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md +++ b/src/data/roadmaps/ai-red-teaming/content/data-poisoning@nD0_64ELEeJSN-0aZiR7i.md @@ -5,6 +5,5 @@ AI Red Teamers simulate data poisoning attacks by evaluating how introducing man Learn more from the following resources: - [@article@AI Poisoning](https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat) -- [@article@Data Poisoning Attacks in ML (Towards Data Science)](https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f) - [@paper@Detecting and Preventing Data Poisoning Attacks on AI Models](https://arxiv.org/abs/2503.09302) - [@paper@Poisoning Web-Scale Training Data (arXiv)](https://arxiv.org/abs/2310.12818) diff --git a/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md b/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md index ea4d9bf05..9dd8801cf 100644 --- a/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md +++ b/src/data/roadmaps/ai-red-teaming/content/direct@5zHow4KZVpfhch5Aabeft.md @@ -4,6 +4,6 @@ Direct injection attacks occur when malicious instructions are inserted directly Learn more from the following resources: +- [@article@Prompt Injection](https://learnprompting.org/docs/prompt_hacking/injection?srsltid=AfmBOooOKRzLT0Hn2PNdAa69Fietniztfds6Fo1PO8WuIyyXjbLb6XgI) - [@article@Prompt Injection & the Rise of Prompt Attacks](https://www.lakera.ai/blog/guide-to-prompt-injection) - [@article@Prompt Injection Cheat Sheet (FlowGPT)](https://flowgpt.com/p/prompt-injection-cheat-sheet) -- [@report@OpenAI GPT-4 System Card](https://openai.com/research/gpt-4-system-card) diff --git a/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md b/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md index 6f1a1abc6..28c06c27e 100644 --- a/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md +++ b/src/data/roadmaps/ai-red-teaming/content/ethical-considerations@1gyuEV519LjN-KpROoVwv.md @@ -7,4 +7,3 @@ Learn more from the following resources: - [@article@Red-Teaming in AI Testing: Stress Testing](https://www.labelvisor.com/red-teaming-abstract-competitive-testing-data-selection/) - [@article@Responsible AI assessment - Responsible AI | Coursera](https://www.coursera.org/learn/ai-security) - [@guide@Responsible AI Principles (Microsoft)](https://www.microsoft.com/en-us/ai/responsible-ai) -- [@video@Questions to Guide AI Red-Teaming (CMU SEI)](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382) diff --git a/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md b/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md index b14193458..6b117d95c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md +++ b/src/data/roadmaps/ai-red-teaming/content/forums@Smncq-n1OlnLAY27AFQOO.md @@ -4,7 +4,7 @@ Engaging in online forums, mailing lists, Discord servers, or subreddits dedicat Learn more from the following resources: -- [@community@List of Cybersecurity Discord Servers](https://www.dfir.training/dfir-groups/discord?category[0]=17&category_children=1) -- [@community@Reddit - r/MachineLearning](https://www.reddit.com/r/MachineLearning/) +- [@community@LearnPrompting Prompt Hacking Discord](https://discord.com/channels/1046228027434086460/1349689482651369492) +- [@community@Reddit - r/ChatGPTJailbreak](https://www.reddit.com/r/ChatGPTJailbreak/) - [@community@Reddit - r/artificial](https://www.reddit.com/r/artificial/) - [@community@Reddit - r/cybersecurity](https://www.reddit.com/r/cybersecurity/) diff --git a/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md b/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md index 1a734dc24..57f7be1a6 100644 --- a/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md +++ b/src/data/roadmaps/ai-red-teaming/content/generative-models@3XJ-g0KvHP75U18mxCqgw.md @@ -4,6 +4,6 @@ AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to th Learn more from the following resources: -- [@article@An Introduction to Generative Models](https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models) -- [@course@Generative AI for Beginners](https://microsoft.github.io/generative-ai-for-beginners/) +- [@article@What is Generative AI?](https://learnprompting.org/docs/basics/generative_ai) +- [@course@Introduction to Generative AI](https://learnprompting.org/courses/intro-to-gen-ai) - [@guide@Generative AI beginner's guide](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview) diff --git a/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md b/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md index 6b467d481..7d6d375ab 100644 --- a/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md +++ b/src/data/roadmaps/ai-red-teaming/content/indirect@3_gJRtJSdm2iAfkwmcv0e.md @@ -6,4 +6,4 @@ Learn more from the following resources: - [@paper@The Practical Application of Indirect Prompt Injection Attacks](https://www.researchgate.net/publication/382692833_The_Practical_Application_of_Indirect_Prompt_Injection_Attacks_From_Academia_to_Industry) - [@article@How to Prevent Indirect Prompt Injection Attacks](https://www.cobalt.io/blog/how-to-prevent-indirect-prompt-injection-attacks) -- [@article@Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)](https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection) +- [@article@Indirect Prompt Injection Data Exfiltration](https://embracethered.com/blog/posts/2024/chatgpt-macos-app-persistent-data-exfiltration/) diff --git a/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md b/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md index 2911e6d42..171e262c0 100644 --- a/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md +++ b/src/data/roadmaps/ai-red-teaming/content/industry-credentials@HHjsFR6wRDqUd66PMDE_7.md @@ -4,5 +4,5 @@ Beyond formal certifications, recognition in the AI Red Teaming field comes from Learn more from the following resources: -- [@community@DEF CON - Wikipedia (Mentions Black Badge)](https://en.wikipedia.org/wiki/DEF_CON#Black_Badge) -- [@community@HackAPrompt (Learn Prompting)](https://learnprompting.org/hackaprompt) +- [@platform@HackAPrompt](https://hackaprompt.com) +- [@platform@RedTeam Arena](https://redarena.ai) diff --git a/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md b/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md index 279bb5648..6e6b0d49a 100644 --- a/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md +++ b/src/data/roadmaps/ai-red-teaming/content/introduction@HFJIYcI16OMyM77fAw9af.md @@ -7,4 +7,3 @@ Learn more from the following resources: - [@article@A Guide to AI Red Teaming](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) - [@article@What is AI Red Teaming? (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - [@article@What is AI Red Teaming? The Complete Guide](https://mindgard.ai/blog/what-is-ai-red-teaming) -- [@podcast@Red Team Podcast - AI Red Teaming Insights & Defense Strategies](https://mindgard.ai/podcast/red-team) diff --git a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md index 3aad0a565..b1e5ed972 100644 --- a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md +++ b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md @@ -5,5 +5,5 @@ Jailbreaking is a specific category of prompt hacking where the AI Red Teamer ai Learn more from the following resources: - [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) -- [@guide@Prompt Hacking Guide - Learn Prompting](https://learnprompting.org/docs/category/prompt-hacking) +- [@guide@Jailbreaking Guide - Learn Prompting](https://learnprompting.org/docs/prompt_hacking/jailbreaking) - [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) diff --git a/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md b/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md index 1d96fbd04..d4db85a36 100644 --- a/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md +++ b/src/data/roadmaps/ai-red-teaming/content/lab-environments@MmwwRK4I9aRH_ha7duPqf.md @@ -4,7 +4,8 @@ AI Red Teamers need environments to practice attacking vulnerable systems safely Learn more from the following resources: +- [@platform@HackAPrompt Playground](https://learnprompting.org/hackaprompt-playground) +- [@platform@InjectPrompt Playground](https://playground.injectprompt.com/) - [@platform@Gandalf AI Prompt Injection Lab](https://gandalf.lakera.ai/) - [@platform@Hack The Box: Hacking Labs](https://www.hackthebox.com/hacker/hacking-labs) - [@platform@TryHackMe: Learn Cyber Security](https://tryhackme.com/) -- [@platform@VulnHub](https://www.vulnhub.com/) diff --git a/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md b/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md index ed210695e..2498e557c 100644 --- a/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md +++ b/src/data/roadmaps/ai-red-teaming/content/large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md @@ -5,5 +5,5 @@ LLMs are a primary target for AI Red Teaming. Understanding their architecture ( Learn more from the following resources: - [@article@What is an LLM (large language model)?](https://www.cloudflare.com/learning/ai/what-is-large-language-model/) -- [@guide@Introduction to LLMs - Learn Prompting](https://learnprompting.org/docs/intro_to_llms) +- [@guide@ChatGPT For Everyone](https://learnprompting.org/courses/chatgpt-for-everyone) - [@guide@What Are Large Language Models? A Beginner's Guide for 2025](https://www.kdnuggets.com/large-language-models-beginners-guide-2025) diff --git a/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md b/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md index b3d3fb613..b7102eade 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-inversion@iE5PcswBHnu_EBFIacib0.md @@ -4,7 +4,6 @@ AI Red Teamers perform model inversion tests to assess if an attacker can recons Learn more from the following resources: -- [@article@Model Inversion Attacks for ML (Medium)](https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1) - [@article@Model inversion and membership inference: Understanding new AI security risks](https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities) - [@paper@Extracting Training Data from LLMs (arXiv)](https://arxiv.org/abs/2012.07805) - [@paper@Model Inversion Attacks: A Survey of Approaches and Countermeasures](https://arxiv.org/html/2411.10023v1) diff --git a/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md b/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md index 4e9be1fff..9836d240d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md @@ -5,5 +5,5 @@ This category covers attacks and tests targeting the AI model itself, beyond the Learn more from the following resources: - [@article@AI Security Risks Uncovered: What You Must Know in 2025](https://ttms.com/uk/ai-security-risks-explained-what-you-need-to-know-in-2025/) -- [@article@Attacking AI Models (Trail of Bits Blog Series)](https://blog.trailofbits.com/category/ai-security/) +- [@article@Weaknesses in Modern AI](https://insights.sei.cmu.edu/blog/weaknesses-and-vulnerabilities-in-modern-ai-why-security-and-safety-are-so-challenging/) - [@report@AI and ML Vulnerabilities (CNAS Report)](https://www.cnas.org/publications/reports/understanding-and-mitigating-ai-vulnerabilities) diff --git a/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md b/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md index 0edbaedaf..1317cd00d 100644 --- a/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md +++ b/src/data/roadmaps/ai-red-teaming/content/model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md @@ -6,5 +6,4 @@ Learn more from the following resources: - [@article@A Playbook for Securing AI Model Weights](https://www.rand.org/pubs/research_briefs/RBA2849-1.html) - [@article@How to Steal a Machine Learning Model (SkyCryptor)](https://skycryptor.com/blog/how-to-steal-a-machine-learning-model) -- [@paper@Defense Against Model Stealing (Microsoft Research)](https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/) - [@paper@On the Limitations of Model Stealing with Uncertainty Quantification Models](https://openreview.net/pdf?id=ONRFHoUzNk) diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md b/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md index a733cc512..3a19fa087 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md @@ -4,8 +4,6 @@ For AI Red Teamers, prompt engineering is both a tool and a target. It's a tool Learn more from the following resources: -- [@article@Introduction to Prompt Engineering](https://www.datacamp.com/tutorial/introduction-prompt-engineering) - [@article@System Prompts - InjectPrompt](https://www.injectprompt.com/t/system-prompts) - [@course@Introduction to Prompt Engineering](https://learnprompting.org/courses/intro-to-prompt-engineering) -- [@guide@Prompt Engineering Guide](https://learnprompting.org/docs/prompt-engineering) - [@guide@The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)](https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts) diff --git a/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md b/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md index 0ea470864..457fb580b 100644 --- a/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md +++ b/src/data/roadmaps/ai-red-teaming/content/prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md @@ -5,5 +5,5 @@ Prompt hacking is a core technique for AI Red Teamers targeting LLMs. It involve Learn more from the following resources: - [@course@Introduction to Prompt Hacking](https://learnprompting.org/courses/intro-to-prompt-hacking) -- [@guide@Prompt Hacking Guide](https://learnprompting.org/docs/category/prompt-hacking) +- [@guide@Prompt Hacking Guide](https://learnprompting.org/docs/prompt_hacking/introduction) - [@paper@SoK: Prompt Hacking of LLMs (arXiv 2023)](https://arxiv.org/abs/2311.05544) diff --git a/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md b/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md index 5d64329d8..74ab32839 100644 --- a/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md +++ b/src/data/roadmaps/ai-red-teaming/content/remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md @@ -6,4 +6,4 @@ Learn more from the following resources: - [@article@Exploiting LLMs with Code Execution (GitHub Gist)](https://gist.github.com/coolaj86/6f4f7b30129b0251f61fa7baaa881516) - [@article@What is remote code execution?](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) -- [@video@DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger](https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU) + diff --git a/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md b/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md index 3863f9c4d..f0600d498 100644 --- a/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md +++ b/src/data/roadmaps/ai-red-teaming/content/responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md @@ -4,6 +4,6 @@ A critical practice for AI Red Teamers is responsible disclosure: privately repo Learn more from the following resources: -- [@guide@Responsible Disclosure of AI Vulnerabilities](https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities) -- [@guide@Vulnerability Disclosure Program](https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp) +- [@guide@0din.ai Policy](https://0din.ai/policy) +- [@guide@Huntr Guidelines](https://huntr.com/guidelines) - [@policy@Google Vulnerability Reward Program (VRP)](https://bughunters.google.com/) diff --git a/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md b/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md index 4626b20ea..0452708a9 100644 --- a/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md +++ b/src/data/roadmaps/ai-red-teaming/content/role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md @@ -6,4 +6,4 @@ Learn more from the following resources: - [@article@The Complete Guide to Red Teaming: Process, Benefits & More](https://mindgard.ai/blog/red-teaming) - [@article@The Complete Red Teaming Checklist [PDF]: 5 Key Steps - Mindgard AI](https://mindgard.ai/blog/red-teaming-checklist) -- [@article@What is AI Red Teaming? - Learn Prompting](https://learnprompting.org/docs/category/ai-red-teaming) +- [@article@Red Teaming in Defending AI Systems](https://protectai.com/blog/expanding-role-red-teaming-defending-ai-systems) diff --git a/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md b/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md index 0da1b7cdf..710bfd5bd 100644 --- a/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md +++ b/src/data/roadmaps/ai-red-teaming/content/specialized-courses@s1xKK8HL5-QGZpcutiuvj.md @@ -6,5 +6,4 @@ Learn more from the following resources: - [@course@AI Red Teaming Courses - Learn Prompting](https://learnprompting.org/blog/ai-red-teaming-courses) - [@course@AI Security | Coursera](https://www.coursera.org/learn/ai-security) -- [@course@Exploring Adversarial Machine Learning](https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/) - [@course@Free Online Cyber Security Courses with Certificates in 2025](https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/) diff --git a/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md b/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md index 3e77f9ac5..e34af4c83 100644 --- a/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md +++ b/src/data/roadmaps/ai-red-teaming/content/threat-modeling@RDOaTBWP3aIJPUp_kcafm.md @@ -7,4 +7,3 @@ Learn more from the following resources: - [@article@Core Components of AI Red Team Exercises (Learn Prompting)](https://learnprompting.org/blog/what-is-ai-red-teaming) - [@guide@Threat Modeling Process](https://owasp.org/www-community/Threat_Modeling_Process) - [@guide@Threat Modeling](https://owasp.org/www-community/Threat_Modeling) -- [@video@How Microsoft Approaches AI Red Teaming (MS Build)](https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/) diff --git a/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md b/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md index b3bfb1d56..95ed651b1 100644 --- a/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md +++ b/src/data/roadmaps/ai-red-teaming/content/unauthorized-access@DQeOavZCoXpF3k_qRDABs.md @@ -4,6 +4,6 @@ AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow Learn more from the following resources: -- [@article@Unauthorized Data Access via LLMs (Security Boulevard)](https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/) +- [@article@Defending Model Files from Unauthorized Access](https://developer.nvidia.com/blog/defending-ai-model-files-from-unauthorized-access-with-canaries/) - [@guide@OWASP API Security Project](https://owasp.org/www-project-api-security/) -- [@paper@AI System Abuse Cases (Harvard Belfer Center)](https://www.belfercenter.org/publication/ai-system-abuse-cases) +- [@article@Detecting Unauthorized Usage](https://www.unr.edu/digital-learning/instructional-strategies/understanding-and-integrating-generative-ai-in-teaching/how-can-i-detect-unauthorized-ai-usage) diff --git a/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md b/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md index 0b6a689ff..0f3190703 100644 --- a/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md +++ b/src/data/roadmaps/ai-red-teaming/content/white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md @@ -5,5 +5,5 @@ White-box testing in AI Red Teaming grants the tester full access to the model's Learn more from the following resources: - [@article@Black-Box, Gray Box, and White-Box Penetration Testing](https://www.eccouncil.org/cybersecurity-exchange/penetration-testing/black-box-gray-box-and-white-box-penetration-testing-importance-and-uses/) -- [@article@White-Box Adversarial Examples (OpenAI Blog)](https://openai.com/research/adversarial-robustness-toolbox) -- [@guide@LLM red teaming guide (open source)](https://www.promptfoo.dev/docs/red-team/) +- [@article@What is White Box Penetration Testing](https://www.getastra.com/blog/security-audit/white-box-penetration-testing/) +- [@article@The Art of White Box Pentesting](https://infosecwriteups.com/cracking-the-code-the-art-of-white-box-pentesting-de296bc22c67) diff --git a/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md b/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md index b72392378..3f124aedf 100644 --- a/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md +++ b/src/data/roadmaps/ai-red-teaming/content/why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md @@ -1,3 +1,8 @@ # Why Red Team AI Systems? -AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment. \ No newline at end of file +AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment. + +Learn more from the following resources: + +- [@course@Introduction to Prompt Hacking](https://learnprompting.org/courses/intro-to-prompt-hacking) +- [@article@Prompt Hacking Offensive Measures](https://learnprompting.org/docs/prompt_hacking/offensive_measures/introduction) From 5d9eecc2b9fc3f610fcc05bf3fbadaee9721d5c2 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 29 Apr 2025 22:36:39 +0100 Subject: [PATCH 17/31] Add ai-agents roadmap --- src/data/roadmaps/ai-agents/ai-agents.json | 4944 +++++++++++++++++ src/data/roadmaps/ai-agents/ai-agents.md | 59 + ...--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md | 1 + .../agent-loop@Eih4eybuYB3C2So8K0AT3.md | 1 + ...nthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md | 1 + .../api-requests@52qxjZILV-X1isup6dazC.md | 1 + .../content/autogen@7YtnQ9-KIvGPSpDzEDexl.md | 1 + ...ckend-development@VPI89s-m885r2YrXjYxdd.md | 1 + ...-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md | 1 + ...xicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md | 1 + ...in-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md | 1 + ...sed-weight-models@tJYmEDDwK0LtEux-kwp9B.md | 1 + ...e-execution--repl@mS0EVCkWuPN_GkVPng4A2.md | 1 + .../code-generation@PK8w31GlvtmAuU92sHaqr.md | 1 + .../context-windows@dyn1LSioema-Bf9lLTgUZ.md | 1 + ...ating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md | 1 + .../content/crewai@uFPJqgU4qGvZyxTv-osZA.md | 1 + .../dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md | 1 + .../data-analysis@wKYEaPWNsR30TIpHaxSsq.md | 1 + ...cy--pii-redaction@rdlYBJNNyZUshzsJawME4.md | 1 + .../database-queries@sV1BnA2-qBnXoKpUn-8Ub.md | 1 + .../content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md | 1 + ...email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md | 1 + ...and-vector-search@UIm54UmICKgep6s8Itcyv.md | 1 + ...s-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md | 1 + ...ile-system-access@BoJqZvdGam4cd6G6yK2IV.md | 1 + ...rompt-engineering@5OW_6o286mj470ElFyJ_5.md | 1 + ...-aging-strategies@m-97m7SI0XpBnhEE8-_1S.md | 1 + ...frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md | 1 + ...-function-calling@_iIsBJTVS6OBf_dsdmbVO.md | 1 + ...nd-terminal-usage@McREk2zHOlIrqbGSKbX-J.md | 1 + .../content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md | 1 + .../content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md | 1 + ...e-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md | 1 + ...testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md | 1 + ...test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md | 1 + .../langchain@Ka6VpCEnqABvwiF9vba7t.md | 1 + .../content/langfuse@UoIheaJlShiceafrWALEH.md | 1 + .../langsmith@SS8mGqf9wfrNqenIWvN8Z.md | 1 + .../langsmith@xp7TCTRE9HP60_rGzTUF6.md | 1 + .../llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md | 1 + ...-function-calling@aafZxtjxiwzJH1lwHBODi.md | 1 + .../local-desktop@iBtJp24F_kJE3YlBsW60s.md | 1 + .../long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md | 1 + ...nual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md | 1 + .../max-length@Bn_BkthrVX_vOuwQzvPZa.md | 1 + .../mcp-client@CGVstUxVXLJcYZrwk3iNQ.md | 1 + .../mcp-hosts@9FryAIrWRHh8YlzKX3et5.md | 1 + .../mcp-servers@yv_-87FVM7WKn5iv6LW9q.md | 1 + .../metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md | 1 + ...text-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md | 1 + .../npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md | 1 + ...ation--reflection@ZJTrun3jK3zBGOTm1jdMI.md | 1 + ...pen-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md | 1 + ...nai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md | 1 + ...functions-calling@AQtxTTxmBpfl8BMgJbGzc.md | 1 + .../openllmetry@7UqPXUzqKYXklnB3x-tsv.md | 1 + ...ption--user-input@LU76AhCYDjxdBhpMQ4eMU.md | 1 + ...ersonal-assistant@PPdAutqJF5G60Eg9lYBND.md | 1 + .../planner-executor@6YLCMWzystao6byCYCTPO.md | 1 + .../presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md | 1 + ...-of-common-models@B8dzg61TGaknuruBgkEJd.md | 1 + ...ction--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md | 1 + ...dditional-context@6I42CoeWX-kkFXTKAY7rw.md | 1 + .../rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md | 1 + ...-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md | 1 + .../content/ragas@YzEDtGEaMaMWVt0W03HRt.md | 1 + ...react-reason--act@53xDks6JQ33fHMa3XcuCd.md | 1 + .../reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md | 1 + ...s-standard-models@N3yZfUxphxjiupqGpyaS9.md | 1 + .../remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md | 1 + ...est-api-knowledge@QtTwecLdvQa8pgELJ6i80.md | 1 + ...-red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md | 1 + ...hort-term--memory@M3U6RfIqaiut2nuOibY8W.md | 1 + .../smol-depot@eWxQiBrxIUG2JNcrdfIHS.md | 1 + ...length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md | 1 + ...stopping-criteria@K0G-Lw069jXUJwZqHtybd.md | 1 + ...treamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md | 1 + ...-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md | 1 + ...tion--compression@jTDC19BTWCqxqMizrIJHr.md | 1 + .../temperature@L1zL1GzqjSAjF06pIIXhy.md | 1 + ...ken-based-pricing@1fiWPBV99E2YncqdCgUw2.md | 1 + .../tokenization@GAjuWyJl9CI1nqXBp6XCf.md | 1 + .../tool-definition@qakbxB8xe7Y8gejC5cZnK.md | 1 + ...ng--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md | 1 + .../content/top-p@icbp1NjurQfdM0dHnz6v2.md | 1 + ...r-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md | 1 + .../tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md | 1 + .../tree-of-thought@hj1adjkG9nalXKZ-Youn0.md | 1 + ...the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md | 1 + ...-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md | 1 + ...es-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md | 1 + ...t-technical-terms@sUwdtOX550tSdceaeFPmF.md | 1 + ...r-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md | 1 + ...craping--crawling@5oLc-235bvKhApxzYFkEc.md | 1 + .../web-search@kBtqT8AduLoYDWopj-V9_.md | 1 + ...hat-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md | 1 + .../what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md | 1 + ...t-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md | 1 + ...rompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md | 1 + src/data/roadmaps/ai-agents/faqs.astro | 0 101 files changed, 5101 insertions(+) create mode 100644 src/data/roadmaps/ai-agents/ai-agents.json create mode 100644 src/data/roadmaps/ai-agents/ai-agents.md create mode 100644 src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md create mode 100644 src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md create mode 100644 src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md create mode 100644 src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md create mode 100644 src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md create mode 100644 src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md create mode 100644 src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md create mode 100644 src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md create mode 100644 src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md create mode 100644 src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md create mode 100644 src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md create mode 100644 src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md create mode 100644 src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md create mode 100644 src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md create mode 100644 src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md create mode 100644 src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md create mode 100644 src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md create mode 100644 src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md create mode 100644 src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md create mode 100644 src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md create mode 100644 src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md create mode 100644 src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md create mode 100644 src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md create mode 100644 src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md create mode 100644 src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md create mode 100644 src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md create mode 100644 src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md create mode 100644 src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md create mode 100644 src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md create mode 100644 src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md create mode 100644 src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md create mode 100644 src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md create mode 100644 src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md create mode 100644 src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md create mode 100644 src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md create mode 100644 src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md create mode 100644 src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md create mode 100644 src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md create mode 100644 src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md create mode 100644 src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md create mode 100644 src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md create mode 100644 src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md create mode 100644 src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md create mode 100644 src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md create mode 100644 src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md create mode 100644 src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md create mode 100644 src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md create mode 100644 src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md create mode 100644 src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md create mode 100644 src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md create mode 100644 src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md create mode 100644 src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md create mode 100644 src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md create mode 100644 src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md create mode 100644 src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md create mode 100644 src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md create mode 100644 src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md create mode 100644 src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md create mode 100644 src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md create mode 100644 src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md create mode 100644 src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md create mode 100644 src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md create mode 100644 src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md create mode 100644 src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md create mode 100644 src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md create mode 100644 src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md create mode 100644 src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md create mode 100644 src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md create mode 100644 src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md create mode 100644 src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md create mode 100644 src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md create mode 100644 src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md create mode 100644 src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md create mode 100644 src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md create mode 100644 src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md create mode 100644 src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md create mode 100644 src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md create mode 100644 src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md create mode 100644 src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md create mode 100644 src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md create mode 100644 src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md create mode 100644 src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md create mode 100644 src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md create mode 100644 src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md create mode 100644 src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md create mode 100644 src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md create mode 100644 src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md create mode 100644 src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md create mode 100644 src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md create mode 100644 src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md create mode 100644 src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md create mode 100644 src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md create mode 100644 src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md create mode 100644 src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md create mode 100644 src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md create mode 100644 src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md create mode 100644 src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md create mode 100644 src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md create mode 100644 src/data/roadmaps/ai-agents/faqs.astro diff --git a/src/data/roadmaps/ai-agents/ai-agents.json b/src/data/roadmaps/ai-agents/ai-agents.json new file mode 100644 index 000000000..7696067a4 --- /dev/null +++ b/src/data/roadmaps/ai-agents/ai-agents.json @@ -0,0 +1,4944 @@ +{ + "nodes": [ + { + "id": "3GO9CZQSSxM1eRSBz9sWR", + "type": "horizontal", + "position": { "x": 448.47614503814657, "y": 3372.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 157, + "height": 20, + "style": {}, + "measured": { "width": 157, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "9MVi8gN_TNI515-5til_s", + "type": "vertical", + "position": { "x": 739, "y": 3096.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "vertical node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 20, + "height": 55, + "style": {}, + "measured": { "width": 20, "height": 55 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "h2-93F69l8wKXkvT-iFC4", + "type": "section", + "position": { "x": -135.00832024152123, "y": 2858.2399357924473 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 306, + "height": 288, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 306, "height": 288 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "ucZ3vn5WgFOfa8Wpb0Hgk", + "type": "section", + "position": { "x": -135.00832024152123, "y": 2452.347193632089 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 306, + "height": 420, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 306, "height": 420 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "JuxzWFeM_vwgn4pj0wxfY", + "type": "horizontal", + "position": { "x": 528.9761450381466, "y": 2750.42394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 72, + "height": 20, + "style": {}, + "measured": { "width": 72, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "R18O3kbMoSEicZbLgUP7s", + "type": "section", + "position": { "x": 264.97614503814657, "y": 2734.92394018722 }, + "width": 265, + "height": 310, + "style": { "width": 241, "height": 60 }, + "selected": true, + "data": { + "style": { + "backgroundColor": "#ffffff", + "borderColor": "#000000", + "borderRadius": 5 + } + }, + "measured": { "width": 265, "height": 310 }, + "resizing": false, + "selectable": true, + "focusable": true, + "dragging": false + }, + { + "id": "MeOebqpbLZkPbj0iWRjP2", + "type": "section", + "position": { "x": 600.30929781038, "y": 2481.0335978441904 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { "label": "", "style": { "fontSize": 17 } }, + "zIndex": -999, + "width": 299, + "height": 173, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 299, "height": 173 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "-MLEtjuRq9y1HpZeKJCts", + "type": "section", + "position": { "x": 264.97614503814657, "y": 2218.019754844708 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 265, + "height": 485, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 265, "height": 485 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "NI3gC3eiPXDkirpD7sk10", + "type": "horizontal", + "position": { "x": 162.26555040271785, "y": 2023.1355435052951 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 132, + "height": 20, + "style": {}, + "measured": { "width": 132, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "u8n0Lh3rJrqnRyc0KCjdr", + "type": "vertical", + "position": { "x": 774.80929781038, "y": 1851.6702232480886 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "vertical node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 20, + "height": 138, + "style": {}, + "measured": { "width": 20, "height": 138 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "0nEbIdUFlhBp7Pn9lzZDG", + "type": "vertical", + "position": { "x": 709.8290815371215, "y": 1851.6702232480886 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "vertical node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 }, + "oldId": "u8n0Lh3rJrqnRyc0KCjdr" + }, + "zIndex": 999, + "width": 20, + "height": 74, + "style": {}, + "measured": { "width": 20, "height": 74 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "qLO_DcIM2OY_i8njSIt1q", + "type": "section", + "position": { "x": -103.7455305579661, "y": 1802.5941482842695 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 229, + "height": 171, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 229, "height": 171 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "PebDvL0Oyzh9mna-AbiaO", + "type": "horizontal", + "position": { "x": 118.85088070462893, "y": 1725.7407354438553 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.5 } + }, + "zIndex": 999, + "width": 115, + "height": 20, + "style": {}, + "measured": { "width": 115, "height": 20 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "K2ueUkBcV5ASMhHUUZH-A", + "type": "section", + "position": { "x": 233.85088070462893, "y": 1711.2407354438553 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 289, + "height": 166, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 289, "height": 166 }, + "resizing": false, + "focusable": true, + "dragging": false + }, + { + "id": "0WHI9bT9SJnNfuBkY1oU1", + "type": "section", + "position": { "x": 636.0988844716816, "y": 1988.6355435052951 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 255, + "height": 207, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 255, "height": 207 }, + "resizing": true, + "dragging": false, + "focusable": true + }, + { + "id": "iw9O2qcCgvICJc6HvpUYf", + "type": "section", + "position": { "x": 247.76555040271785, "y": 1412.2018556690077 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 238, + "height": 149, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 238, "height": 149 }, + "dragging": false, + "resizing": true, + "focusable": true + }, + { + "id": "v-zVQKH6XEMCI4Np-Q3Jo", + "type": "section", + "position": { "x": -137.2455305579661, "y": 1244.2910027738571 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "", + "style": { + "fontSize": 17, + "backgroundColor": "#ffffff", + "borderColor": "#000000" + } + }, + "zIndex": -999, + "width": 296, + "height": 374, + "style": { "width": 150, "height": 100 }, + "measured": { "width": 296, "height": 374 }, + "resizing": false, + "focusable": true, + "dragging": false + }, + { + "id": "c58fcsthBlVfzfr-MHdpF", + "type": "vertical", + "position": { "x": 357.48246683384076, "y": -136.01175492596462 }, + "selected": true, + "data": { + "label": "vertical node", + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2B78E4" + } + }, + "zIndex": 999, + "width": 21, + "height": 66, + "positionAbsolute": { "x": 383.86539064124656, "y": -132.6034020245566 }, + "dragging": false, + "style": { "width": 21, "height": 66 }, + "resizing": false, + "selectable": true, + "focusable": true, + "measured": { "width": 21, "height": 66 } + }, + { + "id": "Ji35JsKgUQXN4DJGEgTAC", + "type": "title", + "position": { "x": 287.48246683384076, "y": -68.9683088092861 }, + "selected": true, + "data": { + "label": "AI Agents", + "style": { + "fontSize": 28, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "positionAbsolute": { "x": 345.36539064124656, "y": -71.10340202455662 }, + "dragging": false, + "selectable": true, + "focusable": true, + "style": {}, + "measured": { "width": 161, "height": 68 } + }, + { + "id": "kpF15oUmlUmk1qVGEBB7Y", + "type": "paragraph", + "position": { "x": 517.0942414053277, "y": -136.9615199492601 }, + "selected": true, + "data": { + "label": "Find the detailed version of this roadmap along with other similar roadmaps", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "left", + "borderColor": "#000000", + "backgroundColor": "#FFFFFf" + }, + "oldId": "yHmHXymPNWwu8p1vvqD3o" + }, + "zIndex": 999, + "width": 355, + "height": 143, + "positionAbsolute": { "x": 548.0942414053277, "y": -133.9615199492601 }, + "dragging": false, + "selectable": true, + "focusable": true, + "style": { "width": 355, "height": 143 }, + "resizing": false, + "measured": { "width": 355, "height": 143 } + }, + { + "id": "if9eTna5NRTMStVwpSwDP", + "type": "button", + "position": { "x": 529.5942414053277, "y": -55.103402024556615 }, + "selected": true, + "data": { + "label": "roadmap.sh", + "href": "https://roadmap.sh", + "color": "#ffffff", + "backgroundColor": "#4136D6", + "style": { "fontSize": 17 }, + "oldId": "2zqZkyVgigifcRS1H7F_b" + }, + "zIndex": 999, + "width": 330, + "height": 49, + "dragging": false, + "style": { "width": 330, "height": 49 }, + "resizing": false, + "positionAbsolute": { "x": 560.5942414053277, "y": -52.103402024556615 }, + "selectable": true, + "focusable": true, + "measured": { "width": 330, "height": 49 } + }, + { + "width": 412, + "height": 121, + "id": "0vLaVNJaJSHZ_bHli6Qzs", + "type": "paragraph", + "position": { "x": 39.982758882202006, "y": 3294.0164384242175 }, + "selected": true, + "data": { + "label": "Visit the following relevant tracks", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "borderColor": "#000000", + "backgroundColor": "WHITe" + }, + "oldId": "m9eO0jLGuR_9w2JJbe_g2" + }, + "zIndex": 999, + "positionAbsolute": { "x": -151.0311490763803, "y": 2838.2842366925815 }, + "dragging": false, + "style": { "width": 412, "height": 121 }, + "resizing": false, + "focusable": true, + "selectable": true, + "measured": { "width": 412, "height": 121 } + }, + { + "width": 21, + "height": 85, + "id": "xi0QAi4kXm3-IFKgopnOP", + "type": "vertical", + "position": { "x": 235.48275888220198, "y": 3415.0164384242175 }, + "selected": true, + "data": { + "label": "vertical node", + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2B78E4" + }, + "oldId": "RLtk1C3gofHnLJ17x3o5b" + }, + "zIndex": 999, + "positionAbsolute": { "x": 44.468850923619726, "y": 2959.2842366925815 }, + "dragging": false, + "focusable": true, + "style": { "width": 21, "height": 85 }, + "resizing": false, + "selectable": true, + "measured": { "width": 21, "height": 85 } + }, + { + "width": 150, + "height": 49, + "id": "NrTAfxHCksgqSkhnrO4kF", + "type": "button", + "position": { "x": 56.98275888220195, "y": 3350.7409891427583 }, + "selected": true, + "data": { + "label": "AI Engineer", + "href": "https://roadmap.sh/ai-engineer", + "color": "#FFFFFf", + "backgroundColor": "#4136D6", + "style": { "fontSize": 17 }, + "borderColor": "#4136D6", + "oldId": "-sFboM4eFUMVq1tlPl-fV" + }, + "zIndex": 999, + "dragging": false, + "positionAbsolute": { "x": -134.0311490763803, "y": 2895.0087874111223 }, + "style": { "width": 378, "height": 49 }, + "focusable": true, + "resizing": false, + "selectable": true, + "measured": { "width": 150, "height": 49 } + }, + { + "id": "Wm2VPi1Tn_Y7dqPowny69", + "type": "linksgroup", + "position": { "x": -160.95487988355524, "y": -149.65280636791104 }, + "selected": true, + "data": { + "label": "Related Roadmaps", + "links": [ + { + "id": "29I4Uf1Z74ihhM4cpfaP7", + "label": "AI Engineer Roadmap", + "href": "", + "url": "https://roadmap.sh/ai-engineer" + }, + { + "id": "9IzkW8kJ-4TiqEuoeyteP", + "label": "AI and Data Scientist Roadmap", + "url": "https://roadmap.sh/ai-data-scientist" + }, + { + "id": "tvB9Bt9JTO98FlPqvPZGl", + "label": "MLOps Roadmap", + "url": "https://roadmap.sh/mlops" + }, + { + "id": "usMWqZBoyrbkxGv-YHziv", + "label": "AI Red Teaming Roadmap", + "url": "https://roadmap.sh/ai-red-teaming" + }, + { + "id": "BOm0mlohoZzmcooxNYPhr", + "label": "Prompt Engineering Roadmap", + "url": "https://roadmap.sh/prompt-engineering" + } + ] + }, + "zIndex": 999, + "width": 332, + "height": 227, + "positionAbsolute": { "x": -158.2278161929031, "y": 12.440044092122179 }, + "dragging": false, + "selectable": true, + "focusable": true, + "style": { "width": 352, "height": 96 }, + "measured": { "width": 332, "height": 227 }, + "resizing": false + }, + { + "id": "VPI89s-m885r2YrXjYxdd", + "type": "topic", + "position": { "x": 232.98246683384076, "y": 119.8447875361903 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Basic Backend Development", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "QtTwecLdvQa8pgELJ6i80" + }, + "zIndex": 999, + "width": 270, + "height": 49, + "style": { "width": 270 }, + "measured": { "width": 270, "height": 49 }, + "focusable": true, + "dragging": false, + "resizing": false + }, + { + "id": "McREk2zHOlIrqbGSKbX-J", + "type": "topic", + "position": { "x": 232.98246683384076, "y": 172.8447875361903 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Git and Terminal Usage", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "QtTwecLdvQa8pgELJ6i80" + }, + "zIndex": 999, + "width": 270, + "height": 49, + "style": { "width": 270 }, + "measured": { "width": 270, "height": 49 }, + "focusable": true, + "dragging": false, + "resizing": false + }, + { + "id": "QtTwecLdvQa8pgELJ6i80", + "type": "topic", + "position": { "x": 232.98246683384076, "y": 225.8447875361903 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "REST API Knowledge", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 270, + "height": 49, + "style": { "width": 270 }, + "measured": { "width": 270, "height": 49 }, + "focusable": true, + "dragging": false, + "resizing": true + }, + { + "id": "amfuroaEeP1sqhvPN-jgO", + "type": "button", + "position": { "x": 592.8266896348252, "y": 119.8447875361903 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Backend Beginner Roadmap", + "style": { "fontSize": 17 }, + "href": "https://roadmap.sh/backend?r=backend-beginner", + "color": "#ffffff", + "backgroundColor": "#4036d6", + "oldId": "Ynvi5skgC85lgm96V_p42" + }, + "zIndex": 999, + "measured": { "width": 272, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 272, + "height": 49, + "resizing": false + }, + { + "id": "kA1ggkT-2KI0cEdd3rIcM", + "type": "button", + "position": { "x": 592.8266896348252, "y": 172.8447875361903 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Git and GitHub Roadmap", + "style": { "fontSize": 17 }, + "href": "https://roadmap.sh/backend?r=backend-beginner", + "color": "#ffffff", + "backgroundColor": "#4036d6", + "oldId": "Ynvi5skgC85lgm96V_p42" + }, + "zIndex": 999, + "measured": { "width": 272, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 272, + "height": 49, + "resizing": false + }, + { + "id": "Ynvi5skgC85lgm96V_p42", + "type": "button", + "position": { "x": 592.8266896348252, "y": 225.8447875361903 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "API Design Roadmap", + "style": { "fontSize": 17 }, + "href": "https://roadmap.sh/backend?r=backend-beginner", + "color": "#ffffff", + "backgroundColor": "#4036d6" + }, + "zIndex": 999, + "measured": { "width": 272, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 272, + "height": 49, + "resizing": false + }, + { + "id": "imzXXZPt8wNny1oe3-MeN", + "type": "label", + "position": { "x": 266.48246683384076, "y": 72.34719363208896 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Learn the Pre-requisites", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 203, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "eeU25xBGXtFFisDckfn31", + "type": "paragraph", + "position": { "x": 262.48246683384076, "y": 349.6813863708485 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "LLM Fundamentals", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + } + }, + "zIndex": 999, + "width": 211, + "height": 52, + "style": {}, + "measured": { "width": 211, "height": 52 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "ZF5_5Y5zqa75Ov22JACX6", + "type": "topic", + "position": { "x": 582.685294294251, "y": 351.1813863708485 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Transformer Models and LLMs", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "MhdWb-tUnvyWe9sj86Eg0" + }, + "zIndex": 999, + "width": 284, + "height": 49, + "style": { "width": 310 }, + "measured": { "width": 284, "height": 49 }, + "focusable": true, + "dragging": false, + "resizing": false + }, + { + "id": "fDFxKOTLw6O41OGVmRuyy", + "type": "section", + "position": { "x": 582.685294294251, "y": 397.28863122380324 }, + "width": 284, + "height": 219, + "style": { "width": 219, "height": 183 }, + "selected": true, + "data": { + "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" } + }, + "measured": { "width": 284, "height": 219 }, + "dragging": false, + "resizing": false, + "selectable": true, + "focusable": true + }, + { + "id": "JBorUqfR1T7kFzwHfdJm4", + "type": "label", + "position": { "x": 653.185294294251, "y": 406.2063076021101 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Model Mechanis", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 143, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "GAjuWyJl9CI1nqXBp6XCf", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 449.2063076021101 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Tokenization", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "dyn1LSioema-Bf9lLTgUZ", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 502.20630760211014 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Context Windows", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "1fiWPBV99E2YncqdCgUw2", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 555.2063076021101 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Token Based Pricing", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "W0402lPcZoaTL1OMTED6o", + "type": "section", + "position": { "x": 581.685294294251, "y": 613.6969577367049 }, + "width": 285, + "height": 333, + "style": { "width": 219, "height": 183 }, + "selected": true, + "data": { + "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" }, + "oldId": "fDFxKOTLw6O41OGVmRuyy" + }, + "measured": { "width": 285, "height": 333 }, + "dragging": false, + "resizing": false, + "selectable": true, + "focusable": true + }, + { + "id": "DUOWFOfqpppC9lZZR2_y2", + "type": "label", + "position": { "x": 639.185294294251, "y": 622.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Generation Controls", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "JBorUqfR1T7kFzwHfdJm4" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 171, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "L1zL1GzqjSAjF06pIIXhy", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 665.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Temperature", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "icbp1NjurQfdM0dHnz6v2" + }, + "zIndex": 999, + "width": 136, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 136, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "z_N-Y0zGkv8_qHPuVtimL", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 718.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Frequency Penalty", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "dyn1LSioema-Bf9lLTgUZ" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "Vd8ycw8pW-ZKvg5WYFtoh", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 771.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Presence Penalty", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "Bn_BkthrVX_vOuwQzvPZa" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "icbp1NjurQfdM0dHnz6v2", + "type": "subtopic", + "position": { "x": 736.185294294251, "y": 665.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Top-p", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "GAjuWyJl9CI1nqXBp6XCf" + }, + "zIndex": 999, + "width": 117, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 117, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "K0G-Lw069jXUJwZqHtybd", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 824.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Stopping Criteria", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "Bn_BkthrVX_vOuwQzvPZa" + }, + "zIndex": 999, + "width": 260, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 260, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "DSJAhQhc1dQmBHQ8ZkTau", + "type": "topic", + "position": { "x": 236.86750909294227, "y": 436.17702805928684 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Open Weight Models", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "tJYmEDDwK0LtEux-kwp9B" + }, + "zIndex": 999, + "width": 262, + "height": 53, + "style": { "width": 217 }, + "measured": { "width": 262, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "tJYmEDDwK0LtEux-kwp9B", + "type": "topic", + "position": { "x": 236.86750909294227, "y": 493.17702805928684 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Closed Weight Models", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + } + }, + "zIndex": 999, + "width": 262, + "height": 53, + "style": { "width": 217 }, + "measured": { "width": 262, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "S1KLwzUZastfV9daGbYTk", + "type": "horizontal", + "position": { "x": 483.685294294251, "y": 625.2837601979952 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 100, + "height": 20, + "style": {}, + "measured": { "width": 100, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "X8W7EWSJxYiY50sEs38fo", + "type": "paragraph", + "position": { "x": 236.86750909294227, "y": 608.7837601979952 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Model Families and Licences", + "style": { + "fontSize": 17, + "borderColor": "#000000", + "backgroundColor": "#ffffff", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + } + }, + "zIndex": 999, + "width": 262, + "height": 53, + "style": {}, + "measured": { "width": 262, "height": 53 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "i2NE6haX9-7mdoV5LQ3Ah", + "type": "topic", + "position": { "x": -157.99208093839397, "y": 210.31600089748082 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Streamed vs Unstreamed Responses", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "B8dzg61TGaknuruBgkEJd" + }, + "zIndex": 999, + "width": 332, + "height": 53, + "style": { "width": 332 }, + "measured": { "width": 332, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "N3yZfUxphxjiupqGpyaS9", + "type": "topic", + "position": { "x": -157.99208093839397, "y": 267.3160008974808 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Reasoning vs Standard Models", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "B8dzg61TGaknuruBgkEJd" + }, + "zIndex": 999, + "width": 332, + "height": 53, + "style": { "width": 332 }, + "measured": { "width": 332, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "5OW_6o286mj470ElFyJ_5", + "type": "topic", + "position": { "x": -157.99208093839397, "y": 324.3160008974808 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Fine-tuning vs Prompt Engineering", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "B8dzg61TGaknuruBgkEJd" + }, + "zIndex": 999, + "width": 332, + "height": 53, + "style": { "width": 332 }, + "measured": { "width": 332, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "UIm54UmICKgep6s8Itcyv", + "type": "topic", + "position": { "x": -157.99208093839397, "y": 381.3160008974808 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Embeddings and Vector Search", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "B8dzg61TGaknuruBgkEJd" + }, + "zIndex": 999, + "width": 332, + "height": 53, + "style": { "width": 332 }, + "measured": { "width": 332, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "qwVQOwBTLA2yUgRISzC8k", + "type": "topic", + "position": { "x": -157.99208093839397, "y": 438.3160008974808 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Understand the Basics of RAG", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "B8dzg61TGaknuruBgkEJd" + }, + "zIndex": 999, + "width": 332, + "height": 53, + "style": { "width": 332 }, + "measured": { "width": 332, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "7-EqPC6VDTiFn8DfM7V63", + "type": "paragraph", + "position": { "x": -117.99208093839397, "y": 608.7837601979952 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Understand the Basics", + "style": { + "fontSize": 17, + "borderColor": "#000000", + "backgroundColor": "#ffffff", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "X8W7EWSJxYiY50sEs38fo" + }, + "zIndex": 999, + "width": 252, + "height": 53, + "style": {}, + "measured": { "width": 252, "height": 53 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "B8dzg61TGaknuruBgkEJd", + "type": "topic", + "position": { "x": -157.99208093839397, "y": 495.31600089748076 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Pricing of Common Models", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + } + }, + "zIndex": 999, + "width": 332, + "height": 53, + "style": { "width": 332 }, + "measured": { "width": 332, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "THJQQuiCmKGayd6EdcX9o", + "type": "paragraph", + "position": { "x": -119.99208093839397, "y": 785.3948629248711 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "AI Agents 101", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "eeU25xBGXtFFisDckfn31" + }, + "zIndex": 999, + "width": 256, + "height": 56, + "style": {}, + "measured": { "width": 256, "height": 56 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "aFZAm44nP5NefX_9TpT0A", + "type": "subtopic", + "position": { "x": -123.49208093839397, "y": 949.928186295656 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "What are AI Agents?", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "b" + }, + "oldId": "2zsOUWJQ8e7wnoHmq1icG" + }, + "zIndex": 999, + "width": 263, + "height": 51, + "style": { "width": 332 }, + "measured": { "width": 263, "height": 51 }, + "dragging": false, + "focusable": true, + "resizing": false + }, + { + "id": "2zsOUWJQ8e7wnoHmq1icG", + "type": "subtopic", + "position": { "x": -123.49208093839397, "y": 1004.928186295656 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "What are Tools?", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "b" + } + }, + "zIndex": 999, + "width": 263, + "height": 49, + "style": { "width": 332 }, + "measured": { "width": 263, "height": 49 }, + "dragging": false, + "focusable": true, + "resizing": false + }, + { + "id": "Eih4eybuYB3C2So8K0AT3", + "type": "topic", + "position": { "x": 250.36750909294227, "y": 1002.928186295656 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Agent Loop", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 235, "height": 53 }, + "focusable": true, + "width": 235, + "height": 53, + "resizing": false, + "dragging": false + }, + { + "id": "LU76AhCYDjxdBhpMQ4eMU", + "type": "subtopic", + "position": { "x": 248.86750909294227, "y": 754.9156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Perception / User Input", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "ZJTrun3jK3zBGOTm1jdMI" + }, + "zIndex": 999, + "width": 238, + "height": 49, + "style": { "width": 233 }, + "measured": { "width": 238, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "ycPRgRYR4lEBQr_xxHKnM", + "type": "subtopic", + "position": { "x": 248.86750909294227, "y": 807.9156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Reason and Plan", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "ZJTrun3jK3zBGOTm1jdMI" + }, + "zIndex": 999, + "width": 238, + "height": 49, + "style": { "width": 233 }, + "measured": { "width": 238, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "sHYd4KsKlmw5Im3nQ19W8", + "type": "subtopic", + "position": { "x": 248.86750909294227, "y": 860.9156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Acting / Tool Invocation", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "ZJTrun3jK3zBGOTm1jdMI" + }, + "zIndex": 999, + "width": 238, + "height": 49, + "style": { "width": 233 }, + "measured": { "width": 238, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "ZJTrun3jK3zBGOTm1jdMI", + "type": "subtopic", + "position": { "x": 248.86750909294227, "y": 913.9156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Observation & Reflection", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 238, + "height": 49, + "style": { "width": 233 }, + "measured": { "width": 238, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "wb8zEmsAX7VyNRPe-DHxw", + "type": "label", + "position": { "x": 212.99392181540966, "y": 760.4156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "1", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 23, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "BkFgVFOtSkuzO0s9EJ3tc", + "type": "label", + "position": { "x": 211.49392181540966, "y": 813.4156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "2", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "vVshXAzK203UzQkgk2HrP" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 26, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "kLZToxQ1iv0m5Po1TyLPw", + "type": "label", + "position": { "x": 211.49392181540966, "y": 919.4156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "4", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 26, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "fBn8SCyMuWS7fRLMJCgSy", + "type": "section", + "position": { "x": 582.80929781038, "y": 1002.5676406496057 }, + "width": 284, + "height": 328, + "style": { "width": 219, "height": 183 }, + "selected": true, + "data": { + "style": { "backgroundColor": "#ffffff" }, + "oldId": "fDFxKOTLw6O41OGVmRuyy" + }, + "measured": { "width": 284, "height": 328 }, + "dragging": false, + "resizing": false, + "selectable": true, + "focusable": true + }, + { + "id": "TehqgcNFmS2Iy2TFrAz_r", + "type": "label", + "position": { "x": 643.30929781038, "y": 1011.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Example Usecases", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "JBorUqfR1T7kFzwHfdJm4" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 163, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "PPdAutqJF5G60Eg9lYBND", + "type": "subtopic", + "position": { "x": 595.30929781038, "y": 1054.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Personal assistant", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "GAjuWyJl9CI1nqXBp6XCf" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "PK8w31GlvtmAuU92sHaqr", + "type": "subtopic", + "position": { "x": 595.30929781038, "y": 1107.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Code generation", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "dyn1LSioema-Bf9lLTgUZ" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "wKYEaPWNsR30TIpHaxSsq", + "type": "subtopic", + "position": { "x": 595.30929781038, "y": 1160.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Data analysis", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "ok8vN7VtCgyef5x6aoQaL" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "5oLc-235bvKhApxzYFkEc", + "type": "subtopic", + "position": { "x": 595.30929781038, "y": 1213.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Web Scraping / Crawling", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "ok8vN7VtCgyef5x6aoQaL" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "ok8vN7VtCgyef5x6aoQaL", + "type": "subtopic", + "position": { "x": 595.30929781038, "y": 1266.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "NPC / Game AI", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "1fiWPBV99E2YncqdCgUw2" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "szfDDmz2gnjR2nL6oQIRT", + "type": "horizontal", + "position": { "x": 483.48246683384076, "y": 1020.4853170279125 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 99, + "height": 20, + "style": {}, + "measured": { "width": 99, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "vVshXAzK203UzQkgk2HrP", + "type": "label", + "position": { "x": 209.99392181540966, "y": 866.4156776926133 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "3", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 26, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "Bn_BkthrVX_vOuwQzvPZa", + "type": "subtopic", + "position": { "x": 595.185294294251, "y": 878.6146341150118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Max Length", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "1fiWPBV99E2YncqdCgUw2" + }, + "zIndex": 999, + "width": 260, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 260, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "tyjeFUjjTGFVXRLOe1Oh1", + "type": "paragraph", + "position": { "x": 254.86750909294227, "y": 1138.5676406496057 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Prompt Engineering", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "THJQQuiCmKGayd6EdcX9o" + }, + "zIndex": 999, + "width": 226, + "height": 56, + "style": {}, + "measured": { "width": 226, "height": 56 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "Y8EqzFx3qxtrSh7bWbbV8", + "type": "topic", + "position": { "x": -137.2455305579661, "y": 1140.0676406496057 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "What is Prompt Engineering", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 296, + "height": 53, + "style": {}, + "measured": { "width": 296, "height": 53 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "qFKFM2qNPEN7EoD0V-1SM", + "type": "subtopic", + "position": { "x": -126.06066608698445, "y": 1292.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Be specific in what you want", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 275, + "height": 49, + "style": {}, + "measured": { "width": 275, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "6I42CoeWX-kkFXTKAY7rw", + "type": "subtopic", + "position": { "x": -126.06066608698445, "y": 1345.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Provide additional context", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 275, + "height": 49, + "style": {}, + "measured": { "width": 275, "height": 49 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "sUwdtOX550tSdceaeFPmF", + "type": "subtopic", + "position": { "x": -126.06066608698445, "y": 1398.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Use relevant technical terms", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 275, + "height": 49, + "style": {}, + "measured": { "width": 275, "height": 49 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "yulzE4ZNLhXOgHhG7BtZQ", + "type": "subtopic", + "position": { "x": -126.06066608698445, "y": 1451.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Use Examples in your Prompt", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 275, + "height": 49, + "style": {}, + "measured": { "width": 275, "height": 49 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "noTuUFnHSBzn7GKG9UZEi", + "type": "subtopic", + "position": { "x": -126.06066608698445, "y": 1504.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Iterate and Test your Prompts", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 275, + "height": 49, + "style": {}, + "measured": { "width": 275, "height": 49 }, + "resizing": false, + "dragging": false, + "focusable": true + }, + { + "id": "wwHHlEoPAx0TLxbtY6nMA", + "type": "subtopic", + "position": { "x": -126.06066608698445, "y": 1557.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Specify Length, format etc", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 275, + "height": 49, + "style": {}, + "measured": { "width": 275, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "QWpwDrwySbmdDYJaR3UhQ", + "type": "label", + "position": { "x": -84.49208093839397, "y": 1254.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Writing Good Prompts", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 185, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "wCOn2Lb_RlEKkVvdulRXj", + "type": "button", + "position": { "x": -137.2455305579661, "y": 1615.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Prompt Engineering Roadmap", + "style": { "fontSize": 17 }, + "href": "https://roadmap.sh/prompt-engineering", + "color": "#ffffff", + "backgroundColor": "#4036d6", + "oldId": "Ynvi5skgC85lgm96V_p42" + }, + "zIndex": 999, + "measured": { "width": 296, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 296, + "height": 49, + "resizing": false + }, + { + "id": "nlVToD-pmbBV2ikgrCQiO", + "type": "paragraph", + "position": { "x": 253.26555040271785, "y": 1245.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Tools / Actions", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "tyjeFUjjTGFVXRLOe1Oh1" + }, + "zIndex": 999, + "width": 227, + "height": 56, + "style": {}, + "measured": { "width": 227, "height": 56 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "R1zdRA3UqlLOjfSw9Swx_", + "type": "horizontal", + "position": { "x": 158.7544694420339, "y": 1263.8505644697545 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 106, + "height": 20, + "style": {}, + "measured": { "width": 106, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "qakbxB8xe7Y8gejC5cZnK", + "type": "topic", + "position": { "x": 247.76555040271785, "y": 1372.6068144540936 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Tool Definition", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "Y8EqzFx3qxtrSh7bWbbV8" + }, + "zIndex": 999, + "width": 238, + "height": 49, + "style": {}, + "measured": { "width": 238, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "VpAF2EGz8HtnE-Xt3hzpf", + "type": "label", + "position": { "x": 266.26555040271785, "y": 1432.5238284556976 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Name and Description", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 189, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "0MUgaZi5vHHnhYYiXsIdX", + "type": "label", + "position": { "x": 266.26555040271785, "y": 1457.5238284556976 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Input / Output Schema", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 191, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "ehSLDOPK-mndL9CXF60s5", + "type": "label", + "position": { "x": 266.26555040271785, "y": 1482.5238284556976 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Error Handling", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 128, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "5Tu6zdcNbotuhVAwTYeh_", + "type": "label", + "position": { "x": 266.26555040271785, "y": 1507.5238284556976 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Usage Examples", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 145, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "gAGw6nEhIY9O5yYmfHTmv", + "type": "section", + "position": { "x": 587.1975456690336, "y": 1375.1120497334348 }, + "width": 283, + "height": 377, + "style": { "width": 219, "height": 183 }, + "selected": true, + "data": { + "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" }, + "oldId": "fBn8SCyMuWS7fRLMJCgSy" + }, + "measured": { "width": 283, "height": 377 }, + "dragging": false, + "resizing": false, + "selectable": true, + "focusable": true + }, + { + "id": "7AhPsyz0KfJkbn5THLOvb", + "type": "label", + "position": { "x": 651.1975456690336, "y": 1384.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Examples of Tools", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "TehqgcNFmS2Iy2TFrAz_r" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 154, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "kBtqT8AduLoYDWopj-V9_", + "type": "subtopic", + "position": { "x": 598.6975456690336, "y": 1427.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Web Search", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "PPdAutqJF5G60Eg9lYBND" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "mS0EVCkWuPN_GkVPng4A2", + "type": "subtopic", + "position": { "x": 598.6975456690336, "y": 1480.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Code Execution / REPL", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "PK8w31GlvtmAuU92sHaqr" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "sV1BnA2-qBnXoKpUn-8Ub", + "type": "subtopic", + "position": { "x": 598.6975456690336, "y": 1533.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Database Queries", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "wKYEaPWNsR30TIpHaxSsq" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "52qxjZILV-X1isup6dazC", + "type": "subtopic", + "position": { "x": 598.6975456690336, "y": 1586.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "API Requests", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "5oLc-235bvKhApxzYFkEc" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "qaNr5I-NQPnfrRH7ynGTl", + "type": "subtopic", + "position": { "x": 598.6975456690336, "y": 1639.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Email / Slack / SMS", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "BoJqZvdGam4cd6G6yK2IV" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "BoJqZvdGam4cd6G6yK2IV", + "type": "subtopic", + "position": { "x": 598.6975456690336, "y": 1692.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "File System Access", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "ok8vN7VtCgyef5x6aoQaL" + }, + "zIndex": 999, + "width": 259, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 259, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "9hKOwIyy5JP5IX_J2a2So", + "type": "horizontal", + "position": { "x": 483.76555040271785, "y": 1387.1068144540936 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 104, + "height": 20, + "style": {}, + "measured": { "width": 104, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "uMTuTzTcwMBwttBoHuEtr", + "type": "paragraph", + "position": { "x": 288.35088070462893, "y": 1897.400354280238 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Agent Memory", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "nlVToD-pmbBV2ikgrCQiO" + }, + "zIndex": 999, + "width": 180, + "height": 53, + "style": {}, + "measured": { "width": 180, "height": 53 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "Rjuzmgb1AHnm18qNwbRhQ", + "type": "horizontal", + "position": { "x": 441.1975456690336, "y": 1625.0297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 146, + "height": 20, + "style": {}, + "measured": { "width": 146, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "TBH_DZTAfR8Daoh-njNFC", + "type": "topic", + "position": { "x": 632.80929781038, "y": 1813.1210935853253 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "What is Agent Memory?", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "M3U6RfIqaiut2nuOibY8W" + }, + "zIndex": 999, + "width": 234, + "height": 49, + "style": {}, + "measured": { "width": 234, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "M3U6RfIqaiut2nuOibY8W", + "type": "topic", + "position": { "x": 647.0988844716816, "y": 2000.5257670010978 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Short Term Memory", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + } + }, + "zIndex": 999, + "width": 233, + "height": 49, + "style": {}, + "measured": { "width": 233, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "Ue633fz6Xu2wa2-KOAtdP", + "type": "topic", + "position": { "x": 647.5988844716816, "y": 2092.525767001098 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Long Term Memory", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "M3U6RfIqaiut2nuOibY8W" + }, + "zIndex": 999, + "width": 232, + "height": 54, + "style": {}, + "measured": { "width": 232, "height": 54 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "UcfPT2eIDT8peU0P8mere", + "type": "label", + "position": { "x": 702.0988844716816, "y": 2054.525767001098 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Within Prompt", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 123, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "gLACXg46Uxaa1bbL8B8K1", + "type": "label", + "position": { "x": 654.0988844716816, "y": 2151.525767001098 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Vector DB / SQL / Custom", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "UcfPT2eIDT8peU0P8mere" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 219, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "zx2EMzU0tWyKo73Ebope9", + "type": "horizontal", + "position": { "x": 532.0988844716816, "y": 2023.1355435052951 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 }, + "oldId": "NI3gC3eiPXDkirpD7sk10" + }, + "zIndex": 999, + "width": 104, + "height": 20, + "style": {}, + "measured": { "width": 104, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "EfCCNqLMJpWKKtamUa5gK", + "type": "topic", + "position": { "x": 279.48246683384076, "y": 2008.6355435052951 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Episodic vs Semantic Memory", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 277, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 277, + "height": 49, + "resizing": false + }, + { + "id": "T2vksVGCRajcwy_WRe2Yf", + "type": "section", + "position": { "x": -136.69306946933528, "y": 2004.4105696858578 }, + "width": 300, + "height": 276, + "style": { "width": 219, "height": 183 }, + "selected": true, + "data": { + "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" }, + "oldId": "gAGw6nEhIY9O5yYmfHTmv" + }, + "measured": { "width": 300, "height": 276 }, + "dragging": false, + "resizing": false, + "selectable": true, + "focusable": true + }, + { + "id": "CEZcNlJeX6Gb4F1bZNS_X", + "type": "label", + "position": { "x": -73.19306946933528, "y": 2013.328246064165 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Maintaining Memory", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "7AhPsyz0KfJkbn5THLOvb" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 173, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "wkS4yOJ3JdZQE_yBID8K7", + "type": "subtopic", + "position": { "x": -125.69306946933528, "y": 2056.328246064165 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "RAG and Vector Databases", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "kBtqT8AduLoYDWopj-V9_" + }, + "zIndex": 999, + "width": 278, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 278, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "QJqXHV8VHPTnfYfmKPzW7", + "type": "subtopic", + "position": { "x": -125.69306946933528, "y": 2109.328246064165 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "User Profile Storage", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "mS0EVCkWuPN_GkVPng4A2" + }, + "zIndex": 999, + "width": 278, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 278, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "jTDC19BTWCqxqMizrIJHr", + "type": "subtopic", + "position": { "x": -125.69306946933528, "y": 2162.328246064165 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Summarization / Compression", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "sV1BnA2-qBnXoKpUn-8Ub" + }, + "zIndex": 999, + "width": 278, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 278, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "m-97m7SI0XpBnhEE8-_1S", + "type": "subtopic", + "position": { "x": -125.69306946933528, "y": 2215.328246064165 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Forgetting / Aging Strategies", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "52qxjZILV-X1isup6dazC" + }, + "zIndex": 999, + "width": 278, + "height": 49, + "style": { "width": 203, "height": 53 }, + "measured": { "width": 278, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "SU8HwGaDiRCho5I_pBl3N", + "type": "paragraph", + "position": { "x": 289.47614503814657, "y": 2118.910569685858 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Agent Architectures", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "uMTuTzTcwMBwttBoHuEtr" + }, + "zIndex": 999, + "width": 216, + "style": {}, + "measured": { "width": 216, "height": 47 }, + "dragging": false, + "resizing": false, + "focusable": true, + "height": 47 + }, + { + "id": "53xDks6JQ33fHMa3XcuCd", + "type": "topic", + "position": { "x": 281.97614503814657, "y": 2321.4170226331694 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "ReAct (Reason + Act)", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "hj1adjkG9nalXKZ-Youn0" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 231, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 231, + "height": 49, + "resizing": false + }, + { + "id": "1B0IqRNYdtbHDi1jHSXuI", + "type": "topic", + "position": { "x": 234.98246683384076, "y": 1610.5297261117416 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Model Context Protocol (MCP)", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "qakbxB8xe7Y8gejC5cZnK" + }, + "zIndex": 999, + "width": 286, + "height": 49, + "style": {}, + "measured": { "width": 286, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "9FryAIrWRHh8YlzKX3et5", + "type": "subtopic", + "position": { "x": 243.97212622056713, "y": 1764.1210935853253 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "MCP Hosts", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 133, + "height": 49, + "style": { "width": 146 }, + "measured": { "width": 133, "height": 49 }, + "dragging": false, + "focusable": true, + "resizing": false + }, + { + "id": "CGVstUxVXLJcYZrwk3iNQ", + "type": "subtopic", + "position": { "x": 381.9824668338408, "y": 1764.1210935853253 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "MCP Client", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 132, + "height": 49, + "style": { "width": 146 }, + "measured": { "width": 132, "height": 49 }, + "dragging": false, + "focusable": true, + "resizing": false + }, + { + "id": "yv_-87FVM7WKn5iv6LW9q", + "type": "subtopic", + "position": { "x": 242.97212622056713, "y": 1818 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "MCP Servers", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 271, + "height": 49, + "style": { "width": 146 }, + "measured": { "width": 271, "height": 49 }, + "dragging": false, + "focusable": true, + "resizing": false + }, + { + "id": "gAPRLPQFVHuB9rBW5-IRG", + "type": "label", + "position": { "x": 300.35088070462893, "y": 1721.2407354438553 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Core Components", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 156, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "1NXIN-Hbjl5rPy_mqxQYW", + "type": "topic", + "position": { "x": -103.7455305579661, "y": 1711.2407354438553 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Creating MCP Servers", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 229, + "height": 49, + "style": {}, + "measured": { "width": 229, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "CppUUpbDy6j0_wjd94qgO", + "type": "label", + "position": { "x": -71.7455305579661, "y": 1813.6702232480886 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Deployment Modes", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 165, "height": 38 }, + "focusable": true, + "dragging": false + }, + { + "id": "iBtJp24F_kJE3YlBsW60s", + "type": "subtopic", + "position": { "x": -91.2455305579661, "y": 1858.6163326459773 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Local Desktop", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "dHNMX3_t1KSDdAWqgdJXv" + }, + "zIndex": 999, + "style": { "width": 183 }, + "measured": { "width": 204, "height": 49 }, + "dragging": false, + "focusable": true, + "width": 204, + "height": 49, + "resizing": false + }, + { + "id": "dHNMX3_t1KSDdAWqgdJXv", + "type": "subtopic", + "position": { "x": -91.2455305579661, "y": 1911.6163326459773 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Remote / Cloud", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "style": { "width": 183 }, + "measured": { "width": 204, "height": 49 }, + "dragging": false, + "focusable": true, + "width": 204, + "height": 49, + "resizing": false + }, + { + "id": "8ym1jwJfLUnj4uimn5HFR", + "type": "horizontal", + "position": { "x": 125.2544694420339, "y": 1913.900354280238 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 }, + "oldId": "t1SqlX1PhIL2cTc0h4fXQ" + }, + "zIndex": 999, + "width": 165, + "height": 20, + "style": {}, + "measured": { "width": 165, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "t1SqlX1PhIL2cTc0h4fXQ", + "type": "horizontal", + "position": { "x": 467.3290815371215, "y": 1913.900354280238 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 253, + "height": 20, + "style": {}, + "measured": { "width": 253, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "qwdh5pkBbrF8LKPxbZp4F", + "type": "topic", + "position": { "x": 281.97614503814657, "y": 2374.4170226331694 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Chain of Thought (CoT)", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "KcgDVjHRzuaeCs81cnCA_" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 231, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 231, + "height": 49, + "resizing": false + }, + { + "id": "cW8O4vLLKEG-Q0dE8E5Zp", + "type": "topic", + "position": { "x": 281.97614503814657, "y": 2268.4170226331694 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "RAG Agent", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "hj1adjkG9nalXKZ-Youn0" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 231, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 231, + "height": 49, + "resizing": false + }, + { + "id": "QKXjaGohaNwhuqqwb-z6b", + "type": "label", + "position": { "x": 301.97614503814657, "y": 2226.4170226331694 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Common Architectures", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "5KAj1kjfDUY7xSPJIC2T8" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 191, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "5KAj1kjfDUY7xSPJIC2T8", + "type": "label", + "position": { "x": 284.47614503814657, "y": 2434.550271236641 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Other Architecture Patterns", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 226, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "6YLCMWzystao6byCYCTPO", + "type": "topic", + "position": { "x": 281.97614503814657, "y": 2478.4774309459326 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Planner Executor", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "hj1adjkG9nalXKZ-Youn0" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 231, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 231, + "height": 49, + "resizing": false + }, + { + "id": "Ep8RoZSy_Iq_zWXlGQLZo", + "type": "topic", + "position": { "x": 281.97614503814657, "y": 2531.4774309459326 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "DAG Agents", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "hj1adjkG9nalXKZ-Youn0" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 231, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 231, + "height": 49, + "resizing": false + }, + { + "id": "Nmy1PoB32DcWZnPM8l8jT", + "type": "topic", + "position": { "x": 280.97614503814657, "y": 2584.4774309459326 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Tree-of-Thought", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "hj1adjkG9nalXKZ-Youn0" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 232, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 232, + "height": 49, + "resizing": false + }, + { + "id": "yaxVwWPeb7mHPZrXaNusP", + "type": "horizontal", + "position": { "x": 527.9761450381466, "y": 2260.410569685858 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 223, + "height": 20, + "style": {}, + "measured": { "width": 223, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "7c-FMXWsMGv95vxnUydFi", + "type": "paragraph", + "position": { "x": 641.80929781038, "y": 2341.870720452855 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Building Agents", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "SU8HwGaDiRCho5I_pBl3N" + }, + "zIndex": 999, + "width": 216, + "style": {}, + "measured": { "width": 216, "height": 47 }, + "dragging": false, + "resizing": false, + "focusable": true, + "height": 47 + }, + { + "id": "_w42GbQza-Qu1EDLbA83S", + "type": "vertical", + "position": { "x": 739.80929781038, "y": 2270.410569685858 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "vertical node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.75 } + }, + "zIndex": 999, + "width": 20, + "height": 62, + "style": {}, + "measured": { "width": 20, "height": 62 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "US6T5dXM8IY9V2qZnTOFW", + "type": "topic", + "position": { "x": 600.30929781038, "y": 2453.212822960118 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Manual (from scratch)", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 299, + "height": 49, + "style": {}, + "measured": { "width": 299, "height": 49 }, + "focusable": true, + "resizing": false, + "dragging": false + }, + { + "id": "nHkXoJFoyDHcO3E4FhsGK", + "type": "label", + "position": { "x": 624.86544847935, "y": 2514.322480617088 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Direct LLM API calls", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 172, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "Ox0SIl1qDY1MdNEa3Zcdh", + "type": "label", + "position": { "x": 624.86544847935, "y": 2544.322480617088 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Implementing the agent loop", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 237, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "mVoZRlCcJcGCVRnGHbsWD", + "type": "label", + "position": { "x": 624.86544847935, "y": 2574.322480617088 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Parsing model output", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 179, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "PUGICZOvB0H0EWwwUlusF", + "type": "label", + "position": { "x": 624.86544847935, "y": 2604.322480617088 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Error & Rate-limit handling", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 220, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "aafZxtjxiwzJH1lwHBODi", + "type": "topic", + "position": { "x": 600.30929781038, "y": 2735.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "LLM Native \"Function Calling\"", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "US6T5dXM8IY9V2qZnTOFW" + }, + "zIndex": 999, + "width": 299, + "height": 49, + "style": {}, + "measured": { "width": 299, "height": 49 }, + "focusable": true, + "resizing": false, + "dragging": false + }, + { + "id": "AQtxTTxmBpfl8BMgJbGzc", + "type": "subtopic", + "position": { "x": 600.30929781038, "y": 2817.8580866298494 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "OpenAI Functions Calling", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "37GBFVZ2J2d5r8bd1ViHq" + }, + "zIndex": 999, + "width": 299, + "height": 53, + "style": {}, + "measured": { "width": 299, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "_iIsBJTVS6OBf_dsdmbVO", + "type": "subtopic", + "position": { "x": 600.30929781038, "y": 2931.8580866298494 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Gemini Function Calling", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "1EZFbDHA5J5_5BPMLMxXb" + }, + "zIndex": 999, + "width": 299, + "height": 53, + "style": {}, + "measured": { "width": 299, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "37GBFVZ2J2d5r8bd1ViHq", + "type": "subtopic", + "position": { "x": 600.30929781038, "y": 2874.8580866298494 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "OpenAI Assistant API", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "1EZFbDHA5J5_5BPMLMxXb" + }, + "zIndex": 999, + "width": 299, + "height": 53, + "style": {}, + "measured": { "width": 299, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "VVFomJWwR-bvPRsiLmbiV", + "type": "label", + "position": { "x": 283.97614503814657, "y": 2754.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Building Using Frameworks", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "width": 225, + "style": { "width": 225 }, + "measured": { "width": 225, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "Ka6VpCEnqABvwiF9vba7t", + "type": "subtopic", + "position": { "x": 276.97614503814657, "y": 2803.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Langchain", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "7YtnQ9-KIvGPSpDzEDexl" + }, + "zIndex": 999, + "width": 111, + "height": 55, + "style": {}, + "measured": { "width": 111, "height": 55 }, + "resizing": true, + "focusable": true, + "dragging": false + }, + { + "id": "iEHF-Jm3ck-Iu85EbCoDi", + "type": "subtopic", + "position": { "x": 393.47614503814657, "y": 2803.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "LlamaIndex", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 124, + "height": 55, + "style": {}, + "measured": { "width": 124, "height": 55 }, + "resizing": false, + "focusable": true, + "dragging": false + }, + { + "id": "XS-FsvtrXGZ8DPrwOsnlI", + "type": "subtopic", + "position": { "x": 276.97614503814657, "y": 2862.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Haystack", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "eWxQiBrxIUG2JNcrdfIHS" + }, + "zIndex": 999, + "width": 111, + "height": 55, + "style": {}, + "measured": { "width": 111, "height": 55 }, + "resizing": false, + "focusable": true, + "dragging": false + }, + { + "id": "7YtnQ9-KIvGPSpDzEDexl", + "type": "subtopic", + "position": { "x": 393.47614503814657, "y": 2862.42394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "AutoGen", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "iEHF-Jm3ck-Iu85EbCoDi" + }, + "zIndex": 999, + "width": 124, + "height": 55, + "style": {}, + "measured": { "width": 124, "height": 55 }, + "resizing": false, + "focusable": true, + "dragging": false + }, + { + "id": "uFPJqgU4qGvZyxTv-osZA", + "type": "subtopic", + "position": { "x": 276.97614503814657, "y": 2921.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "CrewAI", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "eWxQiBrxIUG2JNcrdfIHS" + }, + "zIndex": 999, + "width": 240, + "height": 51, + "style": {}, + "measured": { "width": 240, "height": 51 }, + "resizing": true, + "focusable": true, + "dragging": false + }, + { + "id": "eWxQiBrxIUG2JNcrdfIHS", + "type": "subtopic", + "position": { "x": 276.97614503814657, "y": 2977.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Smol Depot", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "7YtnQ9-KIvGPSpDzEDexl" + }, + "zIndex": 999, + "width": 240, + "height": 55, + "style": {}, + "measured": { "width": 240, "height": 55 }, + "resizing": false, + "focusable": true, + "dragging": false + }, + { + "id": "1EZFbDHA5J5_5BPMLMxXb", + "type": "subtopic", + "position": { "x": 600.30929781038, "y": 2988.8580866298494 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Anthropic Tool Use", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 299, + "height": 53, + "style": {}, + "measured": { "width": 299, "height": 53 }, + "dragging": false, + "focusable": true + }, + { + "id": "y3Km7Dc3FidoKtF7cnTfR", + "type": "label", + "position": { "x": -74.7455305579661, "y": 2462.870720452855 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Evaluation and Testing", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "OxRCEi7olEsHcBZ7oVfLl" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 189, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "v8qLnyFRnEumodBYxQSXQ", + "type": "subtopic", + "position": { "x": -121.7455305579661, "y": 2503.550271236641 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Metrics to Track", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "rHxdxN97ZcU7MPl8L1jzN" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 283, "height": 49 }, + "dragging": false, + "focusable": true, + "width": 283, + "height": 49, + "resizing": false + }, + { + "id": "qo_O4YAe4-MTP_ZJoXJHR", + "type": "subtopic", + "position": { "x": -121.7455305579661, "y": 2556.550271236641 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Unit Testing for Individual Tools", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "rHxdxN97ZcU7MPl8L1jzN" + }, + "zIndex": 999, + "style": { "width": 283 }, + "measured": { "width": 283, "height": 49 }, + "dragging": false, + "focusable": true, + "width": 283, + "height": 49, + "resizing": false + }, + { + "id": "P9-SiIda3TSjHsfkI5OUV", + "type": "subtopic", + "position": { "x": -121.7455305579661, "y": 2609.550271236641 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Integration Testing for Flows", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "rHxdxN97ZcU7MPl8L1jzN" + }, + "zIndex": 999, + "style": { "width": 283 }, + "measured": { "width": 283, "height": 49 }, + "dragging": false, + "focusable": true, + "width": 283, + "height": 49, + "resizing": false + }, + { + "id": "rHxdxN97ZcU7MPl8L1jzN", + "type": "subtopic", + "position": { "x": -121.7455305579661, "y": 2662.550271236641 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Human in the Loop Evaluation", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "style": { "width": 283 }, + "measured": { "width": 283, "height": 49 }, + "dragging": false, + "focusable": true, + "width": 283, + "height": 49, + "resizing": false + }, + { + "id": "xp7TCTRE9HP60_rGzTUF6", + "type": "subtopic", + "position": { "x": -124.32279103658766, "y": 2757.42394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "LangSmith", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "0924QUH1wV7Mp-Xu0FAhF" + }, + "zIndex": 999, + "width": 145, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 145, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "YzEDtGEaMaMWVt0W03HRt", + "type": "subtopic", + "position": { "x": -124.32279103658766, "y": 2810.92394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Ragas", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "MLxP5N0Vrmwh-kyvNeGXn" + }, + "zIndex": 999, + "width": 285, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 285, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "0924QUH1wV7Mp-Xu0FAhF", + "type": "subtopic", + "position": { "x": 26.306930530664715, "y": 2757.42394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "DeepEval", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + } + }, + "zIndex": 999, + "width": 134, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 134, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "OxRCEi7olEsHcBZ7oVfLl", + "type": "label", + "position": { "x": -36.32279103658766, "y": 2717.322480617088 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Frameworks", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 110, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "zs6LM8WEnb0ERWpiaQCgc", + "type": "subtopic", + "position": { "x": -123.5097055754202, "y": 2930.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Structured logging & tracing", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "MLxP5N0Vrmwh-kyvNeGXn" + }, + "zIndex": 999, + "width": 285, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 285, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "P5D6O9GmDjENsvNStJcEC", + "type": "label", + "position": { "x": -91.5097055754202, "y": 2882.434279994293 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Debugging and Monitoring", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000", + "oldId": "PsMoyCyhXdYIIgTK4mduG" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 221, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "PsMoyCyhXdYIIgTK4mduG", + "type": "label", + "position": { "x": -60.009705575420185, "y": 2985.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Observability Tools", + "style": { "fontSize": 17 }, + "href": "", + "color": "#000000" + }, + "zIndex": 999, + "style": {}, + "measured": { "width": 158, "height": 38 }, + "dragging": false, + "focusable": true + }, + { + "id": "SS8mGqf9wfrNqenIWvN8Z", + "type": "subtopic", + "position": { "x": -122.73444959728216, "y": 3028.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "LangSmith", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "7UqPXUzqKYXklnB3x-tsv" + }, + "zIndex": 999, + "width": 138, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 138, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "MLxP5N0Vrmwh-kyvNeGXn", + "type": "subtopic", + "position": { "x": 20.507919061606035, "y": 3028.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Helicone", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "0924QUH1wV7Mp-Xu0FAhF" + }, + "zIndex": 999, + "width": 141, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 141, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "UoIheaJlShiceafrWALEH", + "type": "subtopic", + "position": { "x": -122.73444959728216, "y": 3082.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "LangFuse", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "7UqPXUzqKYXklnB3x-tsv" + }, + "zIndex": 999, + "width": 138, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 138, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "7UqPXUzqKYXklnB3x-tsv", + "type": "subtopic", + "position": { "x": 20.507919061606035, "y": 3082.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "openllmetry", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "MLxP5N0Vrmwh-kyvNeGXn" + }, + "zIndex": 999, + "width": 141, + "height": 49, + "style": { "width": 126 }, + "measured": { "width": 141, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "ZczxILvJ8ZVlaNd887lS5", + "type": "horizontal", + "position": { "x": 169.48246683384076, "y": 2750.42394018722 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2d78e1", "strokeWidth": 3.75 }, + "oldId": "41n1zuSz7Ur8Zq0GcmQ9y" + }, + "zIndex": 999, + "width": 96, + "height": 20, + "style": {}, + "measured": { "width": 96, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "8Fk3qNFO_5UNxJDGDDCc8", + "type": "horizontal", + "position": { "x": 170.99167975847877, "y": 3086.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.5 }, + "oldId": "41n1zuSz7Ur8Zq0GcmQ9y" + }, + "zIndex": 999, + "width": 122, + "height": 20, + "style": {}, + "measured": { "width": 122, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "AZGZKUelTu9A0VbpnsrnN", + "type": "paragraph", + "position": { "x": 287.47614503814657, "y": 3074.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Security & Ethics", + "style": { + "fontSize": 20, + "borderColor": "transparent", + "backgroundColor": "transparent", + "color": "#000000", + "textAlign": "center", + "justifyContent": "center", + "padding": 16 + }, + "oldId": "7c-FMXWsMGv95vxnUydFi" + }, + "zIndex": 999, + "width": 219, + "style": {}, + "measured": { "width": 219, "height": 44 }, + "dragging": false, + "resizing": false, + "focusable": true, + "height": 44 + }, + { + "id": "41n1zuSz7Ur8Zq0GcmQ9y", + "type": "horizontal", + "position": { "x": 498.86750909294227, "y": 3086.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "horizontal node", + "style": { "stroke": "#2B78E4", "strokeWidth": 3.5 } + }, + "zIndex": 999, + "width": 252, + "height": 20, + "style": {}, + "measured": { "width": 252, "height": 20 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "SU2RuicMUo8tiAsQtDI1k", + "type": "topic", + "position": { "x": 602.30929781038, "y": 3147.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Prompt Injection / Jailbreaks", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "k8Y_veuqbR0HzVj_Ekltf" + }, + "zIndex": 999, + "width": 295, + "height": 49, + "style": {}, + "measured": { "width": 295, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "UVzLGXG6K7HQVHmw8ZAv2", + "type": "topic", + "position": { "x": 602.30929781038, "y": 3199.7501335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Tool sandboxing / Permissioning", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "k8Y_veuqbR0HzVj_Ekltf" + }, + "zIndex": 999, + "width": 295, + "height": 49, + "style": {}, + "measured": { "width": 295, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "rdlYBJNNyZUshzsJawME4", + "type": "topic", + "position": { "x": 604.30929781038, "y": 3252.5001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Data Privacy + PII Redaction", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "k8Y_veuqbR0HzVj_Ekltf" + }, + "zIndex": 999, + "width": 295, + "height": 49, + "style": {}, + "measured": { "width": 295, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "EyLo2j8IQsIK91SKaXkmK", + "type": "topic", + "position": { "x": 604.30929781038, "y": 3305.2501335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Bias & Toxicity Guardrails", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "k8Y_veuqbR0HzVj_Ekltf" + }, + "zIndex": 999, + "width": 295, + "height": 49, + "style": {}, + "measured": { "width": 295, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "63nsfJFO1BwjLX_ZVaPFC", + "type": "topic", + "position": { "x": 604.30929781038, "y": 3358.0001335516636 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Safety + Red Team Testing", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center" + }, + "oldId": "k8Y_veuqbR0HzVj_Ekltf" + }, + "zIndex": 999, + "width": 295, + "height": 49, + "style": {}, + "measured": { "width": 295, "height": 49 }, + "dragging": false, + "resizing": false, + "focusable": true + }, + { + "id": "hj1adjkG9nalXKZ-Youn0", + "type": "topic", + "position": { "x": 281.97614503814657, "y": 2638.4774309459326 }, + "selected": true, + "selectable": true, + "draggable": true, + "deletable": true, + "data": { + "label": "Tree-of-Thought", + "style": { + "fontSize": 17, + "justifyContent": "flex-start", + "textAlign": "center", + "colorType": "c" + }, + "oldId": "KcgDVjHRzuaeCs81cnCA_" + }, + "zIndex": 999, + "style": { "width": 231 }, + "measured": { "width": 232, "height": 49 }, + "focusable": true, + "dragging": false, + "width": 232, + "height": 49, + "resizing": false + }, + { + "width": 223, + "height": 49, + "id": "-sFboM4eFUMVq1tlPl-fV", + "type": "button", + "position": { "x": 212.99392181540966, "y": 3350.7409891427583 }, + "selected": true, + "data": { + "label": "AI & Data Scientist", + "href": "https://roadmap.sh/ai-data-scientist", + "color": "#FFFFFf", + "backgroundColor": "#4136D6", + "style": { "fontSize": 17 }, + "borderColor": "#4136D6", + "oldId": "qXKNK_IsGS8-JgLK-Q9oU" + }, + "zIndex": 999, + "dragging": false, + "positionAbsolute": { "x": -134.0311490763803, "y": 2895.0087874111223 }, + "style": { "width": 378, "height": 49 }, + "focusable": true, + "resizing": false, + "selectable": true, + "measured": { "width": 223, "height": 49 } + } + ], + "edges": [ + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "VPI89s-m885r2YrXjYxdd", + "sourceHandle": "z2", + "target": "amfuroaEeP1sqhvPN-jgO", + "targetHandle": "y1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__VPI89s-m885r2YrXjYxddz2-Ynvi5skgC85lgm96V_p42y1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "McREk2zHOlIrqbGSKbX-J", + "sourceHandle": "z2", + "target": "kA1ggkT-2KI0cEdd3rIcM", + "targetHandle": "y1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__McREk2zHOlIrqbGSKbX-Jz2-Ynvi5skgC85lgm96V_p42y1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "QtTwecLdvQa8pgELJ6i80", + "sourceHandle": "z2", + "target": "Ynvi5skgC85lgm96V_p42", + "targetHandle": "y1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__QtTwecLdvQa8pgELJ6i80z2-Ynvi5skgC85lgm96V_p42y1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "QtTwecLdvQa8pgELJ6i80", + "sourceHandle": "x2", + "target": "eeU25xBGXtFFisDckfn31", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__QtTwecLdvQa8pgELJ6i80x2-eeU25xBGXtFFisDckfn31w1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "eeU25xBGXtFFisDckfn31", + "sourceHandle": "z2", + "target": "ZF5_5Y5zqa75Ov22JACX6", + "targetHandle": "y2", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__eeU25xBGXtFFisDckfn31z2-ZF5_5Y5zqa75Ov22JACX6y2", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "Ji35JsKgUQXN4DJGEgTAC", + "sourceHandle": "x2", + "target": "imzXXZPt8wNny1oe3-MeN", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__Ji35JsKgUQXN4DJGEgTACx2-imzXXZPt8wNny1oe3-MeNw1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "X8W7EWSJxYiY50sEs38fo", + "sourceHandle": "w2", + "target": "tJYmEDDwK0LtEux-kwp9B", + "targetHandle": "x1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__X8W7EWSJxYiY50sEs38fow2-tJYmEDDwK0LtEux-kwp9Bx1", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "X8W7EWSJxYiY50sEs38fo", + "sourceHandle": "y2", + "target": "7-EqPC6VDTiFn8DfM7V63", + "targetHandle": "z2", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__X8W7EWSJxYiY50sEs38foy2-7-EqPC6VDTiFn8DfM7V63z2", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "7-EqPC6VDTiFn8DfM7V63", + "sourceHandle": "w2", + "target": "B8dzg61TGaknuruBgkEJd", + "targetHandle": "x1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__7-EqPC6VDTiFn8DfM7V63w2-B8dzg61TGaknuruBgkEJdx1", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "7-EqPC6VDTiFn8DfM7V63", + "sourceHandle": "x2", + "target": "THJQQuiCmKGayd6EdcX9o", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__7-EqPC6VDTiFn8DfM7V63x2-THJQQuiCmKGayd6EdcX9ow1", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "THJQQuiCmKGayd6EdcX9o", + "sourceHandle": "x2", + "target": "aFZAm44nP5NefX_9TpT0A", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__THJQQuiCmKGayd6EdcX9ox2-aFZAm44nP5NefX_9TpT0Aw1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "2zsOUWJQ8e7wnoHmq1icG", + "sourceHandle": "z2", + "target": "Eih4eybuYB3C2So8K0AT3", + "targetHandle": "y2", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__2zsOUWJQ8e7wnoHmq1icGz2-Eih4eybuYB3C2So8K0AT3y2", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "Eih4eybuYB3C2So8K0AT3", + "sourceHandle": "w2", + "target": "ZJTrun3jK3zBGOTm1jdMI", + "targetHandle": "x2", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__Eih4eybuYB3C2So8K0AT3w2-ZJTrun3jK3zBGOTm1jdMIx2", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "fBn8SCyMuWS7fRLMJCgSy", + "sourceHandle": "y2", + "target": "tyjeFUjjTGFVXRLOe1Oh1", + "targetHandle": "z2", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__fBn8SCyMuWS7fRLMJCgSyy2-tyjeFUjjTGFVXRLOe1Oh1z2", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "tyjeFUjjTGFVXRLOe1Oh1", + "sourceHandle": "y2", + "target": "Y8EqzFx3qxtrSh7bWbbV8", + "targetHandle": "z1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__tyjeFUjjTGFVXRLOe1Oh1y2-Y8EqzFx3qxtrSh7bWbbV8z1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "Y8EqzFx3qxtrSh7bWbbV8", + "sourceHandle": "x2", + "target": "v-zVQKH6XEMCI4Np-Q3Jo", + "targetHandle": "w1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__Y8EqzFx3qxtrSh7bWbbV8x2-v-zVQKH6XEMCI4Np-Q3Jow1", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "nlVToD-pmbBV2ikgrCQiO", + "sourceHandle": "x2", + "target": "qakbxB8xe7Y8gejC5cZnK", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__nlVToD-pmbBV2ikgrCQiOx2-qakbxB8xe7Y8gejC5cZnKw1", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "1B0IqRNYdtbHDi1jHSXuI", + "sourceHandle": "x2", + "target": "K2ueUkBcV5ASMhHUUZH-A", + "targetHandle": "w2", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__1B0IqRNYdtbHDi1jHSXuIx2-K2ueUkBcV5ASMhHUUZH-Aw2", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "1NXIN-Hbjl5rPy_mqxQYW", + "sourceHandle": "x2", + "target": "qLO_DcIM2OY_i8njSIt1q", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__1NXIN-Hbjl5rPy_mqxQYWx2-qLO_DcIM2OY_i8njSIt1qw1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "T2vksVGCRajcwy_WRe2Yf", + "sourceHandle": "z2", + "target": "SU8HwGaDiRCho5I_pBl3N", + "targetHandle": "y1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__T2vksVGCRajcwy_WRe2Yfz2-SU8HwGaDiRCho5I_pBl3Ny1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "SU8HwGaDiRCho5I_pBl3N", + "sourceHandle": "x2", + "target": "-MLEtjuRq9y1HpZeKJCts", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__SU8HwGaDiRCho5I_pBl3Nx2--MLEtjuRq9y1HpZeKJCtsw1", + "selected": true, + "focusable": true, + "selectable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "7c-FMXWsMGv95vxnUydFi", + "sourceHandle": "x2", + "target": "US6T5dXM8IY9V2qZnTOFW", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__7c-FMXWsMGv95vxnUydFix2-US6T5dXM8IY9V2qZnTOFWw1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "MeOebqpbLZkPbj0iWRjP2", + "sourceHandle": "x2", + "target": "aafZxtjxiwzJH1lwHBODi", + "targetHandle": "w1", + "data": { "edgeStyle": "solid" }, + "id": "xy-edge__MeOebqpbLZkPbj0iWRjP2x2-aafZxtjxiwzJH1lwHBODiw1", + "selected": true, + "selectable": true, + "focusable": true + }, + { + "style": { + "strokeDasharray": "0.8 8", + "strokeLinecap": "round", + "strokeWidth": 3.5, + "stroke": "#2b78e4" + }, + "source": "aafZxtjxiwzJH1lwHBODi", + "sourceHandle": "x2", + "target": "AQtxTTxmBpfl8BMgJbGzc", + "targetHandle": "w1", + "data": { "edgeStyle": "dashed" }, + "id": "xy-edge__aafZxtjxiwzJH1lwHBODix2-1EZFbDHA5J5_5BPMLMxXbw1", + "selected": true, + "selectable": true, + "focusable": true + } + ] +} diff --git a/src/data/roadmaps/ai-agents/ai-agents.md b/src/data/roadmaps/ai-agents/ai-agents.md new file mode 100644 index 000000000..7aa91405c --- /dev/null +++ b/src/data/roadmaps/ai-agents/ai-agents.md @@ -0,0 +1,59 @@ +--- +jsonUrl: '/jsons/roadmaps/ai-agents.json' +pdfUrl: '/pdfs/roadmaps/ai-agents.pdf' +order: 22 +briefTitle: 'AI Agents' +briefDescription: 'Step by step guide to learn AI Agents in 2025' +title: 'AI Agents' +description: 'Step by step guide to learn AI Agents in 2025' +isNew: true +isHidden: false +hasTopics: true +renderer: editor +dimensions: + width: 968 + height: 3300 +schema: + headline: 'AI Agents Roadmap' + description: 'Learn how to build and ship AI agents with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.' + imageUrl: 'https://roadmap.sh/roadmaps/ai-agents.png' + datePublished: '2025-04-29' + dateModified: '2025-04-29' +seo: + title: 'AI Agents Roadmap - roadmap.sh' + description: 'Step by step guide to learn AI Agents in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.' + keywords: + - 'ai agents tutorial' + - 'step by step guide for ai agents' + - 'how to learn ai agents' + - 'use ai agents in production' + - 'ai agents roadmap 2025' + - 'guide to learning ai agents' + - 'ai agents for beginners' + - 'ai agents roadmap' + - 'ai agents learning path' + - 'ai agents learning roadmap' + - 'ai agents learning guide' + - 'ai agents skills' + - 'ai agents for development' + - 'ai agents for development skills' + - 'ai agents for development skills test' + - 'ai agents quiz' + - 'ai agents career path' + - 'ai agents interview questions' + - 'learn ai agents for development' + - 'become an ai agents expert' + - 'what is ai agents' +relatedRoadmaps: + - 'ai-engineer' + - 'ai-data-scientist' + - 'prompt-engineering' + - 'data-analyst' +sitemap: + priority: 1 + changefreq: 'monthly' +tags: + - 'roadmap' + - 'main-sitemap' + - 'skill-roadmap' +--- diff --git a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md new file mode 100644 index 000000000..df838ac89 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md @@ -0,0 +1 @@ +# Acting / Tool Invocation \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md new file mode 100644 index 000000000..5f97abe06 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md @@ -0,0 +1 @@ +# Agent Loop \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md new file mode 100644 index 000000000..126a9096c --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md @@ -0,0 +1 @@ +# Anthropic Tool Use \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md b/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md new file mode 100644 index 000000000..151941142 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md @@ -0,0 +1 @@ +# API Requests \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md b/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md new file mode 100644 index 000000000..a7742a3e3 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md @@ -0,0 +1 @@ +# AutoGen \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md b/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md new file mode 100644 index 000000000..c051e107e --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md @@ -0,0 +1 @@ +# Basic Backend Development \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md b/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md new file mode 100644 index 000000000..2bfe3d43b --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md @@ -0,0 +1 @@ +# Be specific in what you want \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md b/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md new file mode 100644 index 000000000..297eedf1c --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md @@ -0,0 +1 @@ +# Bias & Toxicity Guardrails \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md b/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md new file mode 100644 index 000000000..68d987ff7 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md @@ -0,0 +1 @@ +# Chain of Thought (CoT) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md b/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md new file mode 100644 index 000000000..7cc765826 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md @@ -0,0 +1 @@ +# Closed Weight Models \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md b/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md new file mode 100644 index 000000000..8c0d76a84 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md @@ -0,0 +1 @@ +# Code Execution / REPL \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md b/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md new file mode 100644 index 000000000..f2bba2fad --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md @@ -0,0 +1 @@ +# Code generation \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md b/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md new file mode 100644 index 000000000..009b65065 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md @@ -0,0 +1 @@ +# Context Windows \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md b/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md new file mode 100644 index 000000000..4c6585f05 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md @@ -0,0 +1 @@ +# Creating MCP Servers \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md b/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md new file mode 100644 index 000000000..8de047ee0 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md @@ -0,0 +1 @@ +# CrewAI \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md b/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md new file mode 100644 index 000000000..a6b0cd625 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md @@ -0,0 +1 @@ +# DAG Agents \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md b/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md new file mode 100644 index 000000000..016f60dfd --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md @@ -0,0 +1 @@ +# Data analysis \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md b/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md new file mode 100644 index 000000000..bd821e1ae --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md @@ -0,0 +1 @@ +# Data Privacy + PII Redaction \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md b/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md new file mode 100644 index 000000000..83628923a --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md @@ -0,0 +1 @@ +# Database Queries \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md b/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md new file mode 100644 index 000000000..aac6479d3 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md @@ -0,0 +1 @@ +# DeepEval \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md b/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md new file mode 100644 index 000000000..6c76714cd --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md @@ -0,0 +1 @@ +# Email / Slack / SMS \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md b/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md new file mode 100644 index 000000000..6993d7e34 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md @@ -0,0 +1 @@ +# Embeddings and Vector Search \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md new file mode 100644 index 000000000..ce7928f4a --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md @@ -0,0 +1 @@ +# Episodic vs Semantic Memory \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md b/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md new file mode 100644 index 000000000..07c379543 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md @@ -0,0 +1 @@ +# File System Access \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md b/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md new file mode 100644 index 000000000..564be4eeb --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md @@ -0,0 +1 @@ +# Fine-tuning vs Prompt Engineering \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md b/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md new file mode 100644 index 000000000..cfbe792e0 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md @@ -0,0 +1 @@ +# Forgetting / Aging Strategies \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md b/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md new file mode 100644 index 000000000..149b0e10f --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md @@ -0,0 +1 @@ +# Frequency Penalty \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md b/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md new file mode 100644 index 000000000..f980fde9d --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md @@ -0,0 +1 @@ +# Gemini Function Calling \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md b/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md new file mode 100644 index 000000000..d302d208c --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md @@ -0,0 +1 @@ +# Git and Terminal Usage \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md b/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md new file mode 100644 index 000000000..b6971bbe8 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md @@ -0,0 +1 @@ +# Haystack \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md b/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md new file mode 100644 index 000000000..22c83b2e9 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md @@ -0,0 +1 @@ +# Helicone \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md b/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md new file mode 100644 index 000000000..fe859e6a5 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md @@ -0,0 +1 @@ +# Human in the Loop Evaluation \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md b/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md new file mode 100644 index 000000000..2a4ebc26f --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md @@ -0,0 +1 @@ +# Integration Testing for Flows \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md b/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md new file mode 100644 index 000000000..2dcbb28d5 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md @@ -0,0 +1 @@ +# Iterate and Test your Prompts \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md b/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md new file mode 100644 index 000000000..3aa93dd39 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md @@ -0,0 +1 @@ +# Langchain \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md b/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md new file mode 100644 index 000000000..8ba270de5 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md @@ -0,0 +1 @@ +# LangFuse \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md b/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md new file mode 100644 index 000000000..76e9ffd46 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md @@ -0,0 +1 @@ +# LangSmith \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md b/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md new file mode 100644 index 000000000..76e9ffd46 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md @@ -0,0 +1 @@ +# LangSmith \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md b/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md new file mode 100644 index 000000000..2d0ce88b4 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md @@ -0,0 +1 @@ +# LlamaIndex \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md b/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md new file mode 100644 index 000000000..a43c5ef54 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md @@ -0,0 +1 @@ +# LLM Native "Function Calling" \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md b/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md new file mode 100644 index 000000000..25e2abe66 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md @@ -0,0 +1 @@ +# Local Desktop \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md b/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md new file mode 100644 index 000000000..a193bf779 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md @@ -0,0 +1 @@ +# Long Term Memory \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md b/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md new file mode 100644 index 000000000..effe78063 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md @@ -0,0 +1 @@ +# Manual (from scratch) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md b/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md new file mode 100644 index 000000000..2c0953c76 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md @@ -0,0 +1 @@ +# Max Length \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md b/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md new file mode 100644 index 000000000..22ca27011 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md @@ -0,0 +1 @@ +# MCP Client \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md b/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md new file mode 100644 index 000000000..1d82263af --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md @@ -0,0 +1 @@ +# MCP Hosts \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md b/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md new file mode 100644 index 000000000..9bb5902b3 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md @@ -0,0 +1 @@ +# MCP Servers \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md b/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md new file mode 100644 index 000000000..7d6290b72 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md @@ -0,0 +1 @@ +# Metrics to Track \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md b/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md new file mode 100644 index 000000000..a95967a97 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md @@ -0,0 +1 @@ +# Model Context Protocol (MCP) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md b/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md new file mode 100644 index 000000000..977777dea --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md @@ -0,0 +1 @@ +# NPC / Game AI \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md b/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md new file mode 100644 index 000000000..08248bff9 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md @@ -0,0 +1 @@ +# Observation & Reflection \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md b/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md new file mode 100644 index 000000000..eac06f19a --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md @@ -0,0 +1 @@ +# Open Weight Models \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md b/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md new file mode 100644 index 000000000..83443b90f --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md @@ -0,0 +1 @@ +# OpenAI Assistant API \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md b/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md new file mode 100644 index 000000000..09219bcff --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md @@ -0,0 +1 @@ +# OpenAI Functions Calling \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md b/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md new file mode 100644 index 000000000..23966492c --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md @@ -0,0 +1 @@ +# openllmetry \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md b/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md new file mode 100644 index 000000000..745fc4236 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md @@ -0,0 +1 @@ +# Perception / User Input \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md b/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md new file mode 100644 index 000000000..3652bc896 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md @@ -0,0 +1 @@ +# Personal assistant \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md b/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md new file mode 100644 index 000000000..c67e67518 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md @@ -0,0 +1 @@ +# Planner Executor \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md b/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md new file mode 100644 index 000000000..0a9e0c807 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md @@ -0,0 +1 @@ +# Presence Penalty \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md b/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md new file mode 100644 index 000000000..9687c2ccc --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md @@ -0,0 +1 @@ +# Pricing of Common Models \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md b/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md new file mode 100644 index 000000000..534254500 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md @@ -0,0 +1 @@ +# Prompt Injection / Jailbreaks \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md b/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md new file mode 100644 index 000000000..4ae863296 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md @@ -0,0 +1 @@ +# Provide additional context \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md b/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md new file mode 100644 index 000000000..db58daad5 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md @@ -0,0 +1 @@ +# RAG Agent \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md b/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md new file mode 100644 index 000000000..a9f30eb27 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md @@ -0,0 +1 @@ +# RAG and Vector Databases \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md b/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md new file mode 100644 index 000000000..63db74f2a --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md @@ -0,0 +1 @@ +# Ragas \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md b/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md new file mode 100644 index 000000000..5c6f292b4 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md @@ -0,0 +1 @@ +# ReAct (Reason + Act) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md b/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md new file mode 100644 index 000000000..7c64e9a30 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md @@ -0,0 +1 @@ +# Reason and Plan \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md b/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md new file mode 100644 index 000000000..2939c6dd3 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md @@ -0,0 +1 @@ +# Reasoning vs Standard Models \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md b/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md new file mode 100644 index 000000000..23d72f703 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md @@ -0,0 +1 @@ +# Remote / Cloud \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md b/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md new file mode 100644 index 000000000..376aadfea --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md @@ -0,0 +1 @@ +# REST API Knowledge \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md b/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md new file mode 100644 index 000000000..935a24fc9 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md @@ -0,0 +1 @@ +# Safety + Red Team Testing \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md new file mode 100644 index 000000000..c0e1c0a85 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md @@ -0,0 +1 @@ +# Short Term Memory \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md b/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md new file mode 100644 index 000000000..366716f0a --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md @@ -0,0 +1 @@ +# Smol Depot \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md b/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md new file mode 100644 index 000000000..87c0c2370 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md @@ -0,0 +1 @@ +# Specify Length, format etc \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md b/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md new file mode 100644 index 000000000..68e9b9dfb --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md @@ -0,0 +1 @@ +# Stopping Criteria \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md b/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md new file mode 100644 index 000000000..18ab2b8bd --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md @@ -0,0 +1 @@ +# Streamed vs Unstreamed Responses \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md b/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md new file mode 100644 index 000000000..339a098ae --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md @@ -0,0 +1 @@ +# Structured logging & tracing \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md b/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md new file mode 100644 index 000000000..fda15f230 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md @@ -0,0 +1 @@ +# Summarization / Compression \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md b/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md new file mode 100644 index 000000000..9028fe2d0 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md @@ -0,0 +1 @@ +# Temperature \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md b/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md new file mode 100644 index 000000000..1279bd3fd --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md @@ -0,0 +1 @@ +# Token Based Pricing \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md b/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md new file mode 100644 index 000000000..2a71b6b86 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md @@ -0,0 +1 @@ +# Tokenization \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md b/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md new file mode 100644 index 000000000..5482f1dff --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md @@ -0,0 +1 @@ +# Tool Definition \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md b/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md new file mode 100644 index 000000000..d282c8f77 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md @@ -0,0 +1 @@ +# Tool sandboxing / Permissioning \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md b/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md new file mode 100644 index 000000000..1ca0feb55 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md @@ -0,0 +1 @@ +# Top-p \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md b/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md new file mode 100644 index 000000000..63a7075df --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md @@ -0,0 +1 @@ +# Transformer Models and LLMs \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md b/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md new file mode 100644 index 000000000..1f79ee0e2 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md @@ -0,0 +1 @@ +# Tree-of-Thought \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md b/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md new file mode 100644 index 000000000..1f79ee0e2 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md @@ -0,0 +1 @@ +# Tree-of-Thought \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md b/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md new file mode 100644 index 000000000..310f35ef2 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md @@ -0,0 +1 @@ +# Understand the Basics of RAG \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md b/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md new file mode 100644 index 000000000..cb695cd9e --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md @@ -0,0 +1 @@ +# Unit Testing for Individual Tools \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md b/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md new file mode 100644 index 000000000..d1d334487 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md @@ -0,0 +1 @@ +# Use Examples in your Prompt \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md b/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md new file mode 100644 index 000000000..a1fcdda8b --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md @@ -0,0 +1 @@ +# Use relevant technical terms \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md b/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md new file mode 100644 index 000000000..2fbb5c13c --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md @@ -0,0 +1 @@ +# User Profile Storage \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md b/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md new file mode 100644 index 000000000..0b4d87e21 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md @@ -0,0 +1 @@ +# Web Scraping / Crawling \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md b/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md new file mode 100644 index 000000000..39a608da3 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md @@ -0,0 +1 @@ +# Web Search \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md b/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md new file mode 100644 index 000000000..c219f9892 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md @@ -0,0 +1 @@ +# What are AI Agents? \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md b/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md new file mode 100644 index 000000000..752cd311c --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md @@ -0,0 +1 @@ +# What are Tools? \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md b/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md new file mode 100644 index 000000000..a769fd4c3 --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md @@ -0,0 +1 @@ +# What is Agent Memory? \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md b/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md new file mode 100644 index 000000000..e361fc83d --- /dev/null +++ b/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md @@ -0,0 +1 @@ +# What is Prompt Engineering \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/faqs.astro b/src/data/roadmaps/ai-agents/faqs.astro new file mode 100644 index 000000000..e69de29bb From b9aee719b236f8d79ea0b4606adcaa24063f23b9 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 29 Apr 2025 23:00:38 +0100 Subject: [PATCH 18/31] Add ai-agents roadmap --- src/data/roadmaps/ai-agents/ai-agents.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/roadmaps/ai-agents/ai-agents.md b/src/data/roadmaps/ai-agents/ai-agents.md index 7aa91405c..7cd799ee7 100644 --- a/src/data/roadmaps/ai-agents/ai-agents.md +++ b/src/data/roadmaps/ai-agents/ai-agents.md @@ -3,9 +3,9 @@ jsonUrl: '/jsons/roadmaps/ai-agents.json' pdfUrl: '/pdfs/roadmaps/ai-agents.pdf' order: 22 briefTitle: 'AI Agents' -briefDescription: 'Step by step guide to learn AI Agents in 2025' +briefDescription: 'Learn to design, build and ship AI agents in 2025' title: 'AI Agents' -description: 'Step by step guide to learn AI Agents in 2025' +description: 'Learn to design, build and ship AI agents in 2025' isNew: true isHidden: false hasTopics: true @@ -15,7 +15,7 @@ dimensions: height: 3300 schema: headline: 'AI Agents Roadmap' - description: 'Learn how to build and ship AI agents with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.' + description: 'Learn how to design, build and ship AI agents with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.' imageUrl: 'https://roadmap.sh/roadmaps/ai-agents.png' datePublished: '2025-04-29' dateModified: '2025-04-29' From 464bcb6c6682b7d7b1f0f73a521c82802f433417 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 29 Apr 2025 23:16:46 +0100 Subject: [PATCH 19/31] Add content for AI Agents roadmap --- readme.md | 2 + scripts/roadmap-tree-content.js | 500 +++++++----------- src/data/roadmaps/ai-agents/ai-agents.json | 127 ++--- ...--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md | 4 +- .../agent-loop@Eih4eybuYB3C2So8K0AT3.md | 4 +- ...nthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md | 4 +- .../api-requests@52qxjZILV-X1isup6dazC.md | 4 +- .../content/autogen@7YtnQ9-KIvGPSpDzEDexl.md | 4 +- ...-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md | 4 +- ...xicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md | 4 +- ...in-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md | 4 +- ...sed-weight-models@tJYmEDDwK0LtEux-kwp9B.md | 4 +- ...e-execution--repl@mS0EVCkWuPN_GkVPng4A2.md | 4 +- .../code-generation@PK8w31GlvtmAuU92sHaqr.md | 4 +- .../context-windows@dyn1LSioema-Bf9lLTgUZ.md | 4 +- ...ating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md | 4 +- .../content/crewai@uFPJqgU4qGvZyxTv-osZA.md | 4 +- .../dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md | 4 +- .../data-analysis@wKYEaPWNsR30TIpHaxSsq.md | 4 +- ...cy--pii-redaction@rdlYBJNNyZUshzsJawME4.md | 4 +- .../database-queries@sV1BnA2-qBnXoKpUn-8Ub.md | 4 +- .../content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md | 4 +- ...email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md | 4 +- ...and-vector-search@UIm54UmICKgep6s8Itcyv.md | 4 +- ...s-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md | 4 +- ...ile-system-access@BoJqZvdGam4cd6G6yK2IV.md | 4 +- ...rompt-engineering@5OW_6o286mj470ElFyJ_5.md | 4 +- ...-aging-strategies@m-97m7SI0XpBnhEE8-_1S.md | 4 +- ...frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md | 4 +- ...-function-calling@_iIsBJTVS6OBf_dsdmbVO.md | 4 +- .../content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md | 4 +- .../content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md | 4 +- ...e-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md | 4 +- ...testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md | 4 +- ...test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md | 4 +- .../langchain@Ka6VpCEnqABvwiF9vba7t.md | 4 +- .../content/langfuse@UoIheaJlShiceafrWALEH.md | 4 +- .../langsmith@SS8mGqf9wfrNqenIWvN8Z.md | 4 +- .../langsmith@xp7TCTRE9HP60_rGzTUF6.md | 4 +- .../llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md | 4 +- ...-function-calling@aafZxtjxiwzJH1lwHBODi.md | 4 +- .../local-desktop@iBtJp24F_kJE3YlBsW60s.md | 4 +- .../long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md | 4 +- ...nual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md | 4 +- .../max-length@Bn_BkthrVX_vOuwQzvPZa.md | 4 +- .../mcp-client@CGVstUxVXLJcYZrwk3iNQ.md | 4 +- .../mcp-hosts@9FryAIrWRHh8YlzKX3et5.md | 4 +- .../mcp-servers@yv_-87FVM7WKn5iv6LW9q.md | 4 +- .../metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md | 4 +- ...text-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md | 4 +- .../npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md | 4 +- ...ation--reflection@ZJTrun3jK3zBGOTm1jdMI.md | 4 +- ...pen-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md | 4 +- ...nai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md | 4 +- ...functions-calling@AQtxTTxmBpfl8BMgJbGzc.md | 4 +- .../openllmetry@7UqPXUzqKYXklnB3x-tsv.md | 4 +- ...ption--user-input@LU76AhCYDjxdBhpMQ4eMU.md | 4 +- ...ersonal-assistant@PPdAutqJF5G60Eg9lYBND.md | 4 +- .../planner-executor@6YLCMWzystao6byCYCTPO.md | 4 +- .../presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md | 4 +- ...-of-common-models@B8dzg61TGaknuruBgkEJd.md | 4 +- ...ction--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md | 4 +- ...dditional-context@6I42CoeWX-kkFXTKAY7rw.md | 4 +- .../rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md | 4 +- ...-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md | 4 +- .../content/ragas@YzEDtGEaMaMWVt0W03HRt.md | 4 +- ...react-reason--act@53xDks6JQ33fHMa3XcuCd.md | 4 +- .../reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md | 4 +- ...s-standard-models@N3yZfUxphxjiupqGpyaS9.md | 4 +- .../remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md | 4 +- ...-red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md | 4 +- ...hort-term--memory@M3U6RfIqaiut2nuOibY8W.md | 4 +- .../smol-depot@eWxQiBrxIUG2JNcrdfIHS.md | 4 +- ...length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md | 4 +- ...stopping-criteria@K0G-Lw069jXUJwZqHtybd.md | 4 +- ...treamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md | 4 +- ...-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md | 4 +- ...tion--compression@jTDC19BTWCqxqMizrIJHr.md | 4 +- .../temperature@L1zL1GzqjSAjF06pIIXhy.md | 4 +- ...ken-based-pricing@1fiWPBV99E2YncqdCgUw2.md | 4 +- .../tokenization@GAjuWyJl9CI1nqXBp6XCf.md | 4 +- .../tool-definition@qakbxB8xe7Y8gejC5cZnK.md | 4 +- ...ng--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md | 4 +- .../content/top-p@icbp1NjurQfdM0dHnz6v2.md | 4 +- ...r-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md | 4 +- .../tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md | 4 +- .../tree-of-thought@hj1adjkG9nalXKZ-Youn0.md | 4 +- ...the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md | 4 +- ...-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md | 4 +- ...es-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md | 4 +- ...t-technical-terms@sUwdtOX550tSdceaeFPmF.md | 4 +- ...r-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md | 4 +- ...craping--crawling@5oLc-235bvKhApxzYFkEc.md | 4 +- .../web-search@kBtqT8AduLoYDWopj-V9_.md | 4 +- ...hat-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md | 4 +- .../what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md | 4 +- ...t-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md | 4 +- ...rompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md | 4 +- 98 files changed, 533 insertions(+), 476 deletions(-) diff --git a/readme.md b/readme.md index 279027115..ea7e3a647 100644 --- a/readme.md +++ b/readme.md @@ -87,6 +87,8 @@ Here is the list of available roadmaps with more being actively worked upon. - [Prompt Engineering Roadmap](https://roadmap.sh/prompt-engineering) - [Technical Writer Roadmap](https://roadmap.sh/technical-writer) - [DevRel Engineer Roadmap](https://roadmap.sh/devrel) +- [AI Red Teaming Roadmap](https://roadmap.sh/ai-red-teaming) +- [AI Agents Roadmap](https://roadmap.sh/ai-agents) There are also interactive best practices: diff --git a/scripts/roadmap-tree-content.js b/scripts/roadmap-tree-content.js index c4dfb6330..087210257 100644 --- a/scripts/roadmap-tree-content.js +++ b/scripts/roadmap-tree-content.js @@ -13,494 +13,394 @@ const __dirname = dirname(__filename); * @property {string} text - The text content of the node */ -const roadmapId = 'php'; +const roadmapId = 'ai-agents'; /** @type {Node[]} */ const nodes = [ { - "id": "_hYN0gEi9BL24nptEtXWU", - "text": "PHP > Introduction to PHP" + id: 'ZF5_5Y5zqa75Ov22JACX6', + text: 'AI Agents > Transformer Models and LLMs', }, { - "id": "_LhLDVZjLt1DoAP1NuUES", - "text": "PHP > Introduction to PHP > What is PHP?" + id: 'GAjuWyJl9CI1nqXBp6XCf', + text: 'AI Agents > LLM Fundamentals > Model Mechanis > Tokenization', }, { - "id": "b2CuLrhsUNnb4OxI6RRAS", - "text": "PHP > Introduction to PHP > Evolution and History" + id: 'dyn1LSioema-Bf9lLTgUZ', + text: 'AI Agents > LLM Fundamentals > Model Mechanis > Context Windows', }, { - "id": "6sHRQTcoKL3TlgNJlwyx8", - "text": "PHP > Introduction to PHP > PHP Versions and Features" + id: '1fiWPBV99E2YncqdCgUw2', + text: 'AI Agents > LLM Fundamentals > Model Mechanis > Token Based Pricing', }, { - "id": "3_TuxOSzBuktBlBF05r_z", - "text": "PHP > Installing PHP" + id: 'L1zL1GzqjSAjF06pIIXhy', + text: 'AI Agents > LLM Fundamentals > Generation Controls > Temperature', }, { - "id": "36Y1HkHxhuxh2qVQB8NVE", - "text": "PHP > WAMP" + id: 'icbp1NjurQfdM0dHnz6v2', + text: 'AI Agents > LLM Fundamentals > Generation Controls > Top-p', }, { - "id": "-wniKEBwbF0Fi1fHpF-Gc", - "text": "PHP > XAMPP" + id: 'z_N-Y0zGkv8_qHPuVtimL', + text: 'AI Agents > LLM Fundamentals > Generation Controls > Frequency Penalty', }, { - "id": "t7p7TU2khaxsZPYAdwFAA", - "text": "PHP > MAMP" + id: 'Vd8ycw8pW-ZKvg5WYFtoh', + text: 'AI Agents > LLM Fundamentals > Generation Controls > Presence Penalty', }, { - "id": "7LjxtrmgJtTJc0_kP83Tr", - "text": "PHP > LAMP" + id: 'K0G-Lw069jXUJwZqHtybd', + text: 'AI Agents > LLM Fundamentals > Generation Controls > Stopping Criteria', }, { - "id": "hzBUHSuFwLYNooF_vEmrs", - "text": "PHP > Basic PHP Syntax" + id: 'Bn_BkthrVX_vOuwQzvPZa', + text: 'AI Agents > LLM Fundamentals > Generation Controls > Max Length', }, { - "id": "D0BtyxyjIBcpfn5wP23WC", - "text": "PHP > Variables and Scope" + id: 'DSJAhQhc1dQmBHQ8ZkTau', + text: 'AI Agents > Model Families and Licences > Open Weight Models', }, { - "id": "srIHPZabaCGdB5VvUXaMa", - "text": "PHP > Data Types" + id: 'tJYmEDDwK0LtEux-kwp9B', + text: 'AI Agents > Model Families and Licences > Closed Weight Models', }, { - "id": "pzReF4C0mcCWAnpfIJbwl", - "text": "PHP > Casting Data Types" + id: 'i2NE6haX9-7mdoV5LQ3Ah', + text: 'AI Agents > Understand the Basics > Streamed vs Unstreamed Responses', }, { - "id": "2ykzBBdYhWuM-neGf0AWP", - "text": "PHP > echo" + id: 'N3yZfUxphxjiupqGpyaS9', + text: 'AI Agents > Understand the Basics > Reasoning vs Standard Models', }, { - "id": "NQUmO90sqe7fnzod3Ia8H", - "text": "PHP > print" + id: '5OW_6o286mj470ElFyJ_5', + text: 'AI Agents > Understand the Basics > Fine-tuning vs Prompt Engineering', }, { - "id": "wsC7OGXOyfCY4pLLNrR2v", - "text": "PHP > print_r" + id: 'UIm54UmICKgep6s8Itcyv', + text: 'AI Agents > Understand the Basics > Embeddings and Vector Search', }, { - "id": "JCCeVC0hOrvIeyfg1ScKA", - "text": "PHP > var_dump" + id: 'qwVQOwBTLA2yUgRISzC8k', + text: 'AI Agents > Understand the Basics > Understand the Basics of RAG', }, { - "id": "VLRLymQmLfscrBfzXKvHi", - "text": "PHP > Constants" + id: 'B8dzg61TGaknuruBgkEJd', + text: 'AI Agents > Understand the Basics > Pricing of Common Models', }, { - "id": "IhKjvT6CjRz4dsSU7SNQo", - "text": "PHP > Arrays" + id: 'aFZAm44nP5NefX_9TpT0A', + text: 'AI Agents > AI Agents 101 > What are AI Agents?', }, { - "id": "j2S8dP3HlAOOoZdpj-7Dx", - "text": "PHP > Arrays > Indexed Arrays" + id: '2zsOUWJQ8e7wnoHmq1icG', + text: 'AI Agents > AI Agents 101 > What are Tools?', }, { - "id": "i_NRsOJNNp7AOqMgu5Jg8", - "text": "PHP > Arrays > Associative Arrays" + id: 'Eih4eybuYB3C2So8K0AT3', + text: 'AI Agents > AI Agents 101 > Agent Loop', }, { - "id": "uARTOZ-ZwugSmbCJoRS5Y", - "text": "PHP > Arrays > Multi-dimensional Arrays" + id: 'LU76AhCYDjxdBhpMQ4eMU', + text: 'AI Agents > AI Agents 101 > Agent Loop > Perception / User Input', }, { - "id": "38YksjvhXCbgnHqkl57Cz", - "text": "PHP > Conditionals" + id: 'ycPRgRYR4lEBQr_xxHKnM', + text: 'AI Agents > AI Agents 101 > Agent Loop > Reason and Plan', }, { - "id": "-McOv-ZPTGayX7Mx2Thw1", - "text": "PHP > Conditionals > if/else" + id: 'sHYd4KsKlmw5Im3nQ19W8', + text: 'AI Agents > AI Agents 101 > Agent Loop > Acting / Tool Invocation', }, { - "id": "bgJ9-m6Fiu3VCc-NZlbpn", - "text": "PHP > Conditionals > switch" + id: 'ZJTrun3jK3zBGOTm1jdMI', + text: 'AI Agents > AI Agents 101 > Agent Loop > Observation & Reflection', }, { - "id": "3gNzX-bw2iqur7U7-_W38", - "text": "PHP > Conditionals > match" + id: 'PPdAutqJF5G60Eg9lYBND', + text: 'AI Agents > AI Agents 101 > Example Usecases > Personal assistant', }, { - "id": "w0ntgFBhgGd5RUFd-qlPK", - "text": "PHP > Conditionals > Null Coalescing Operator" + id: 'PK8w31GlvtmAuU92sHaqr', + text: 'AI Agents > AI Agents 101 > Example Usecases > Code generation', }, { - "id": "1NXSk8VZDr89jQTTkOL7x", - "text": "PHP > Conditionals > Null Safe Operator" + id: 'wKYEaPWNsR30TIpHaxSsq', + text: 'AI Agents > AI Agents 101 > Example Usecases > Data analysis', }, { - "id": "qwt8xN4vuTrY-D0czYITI", - "text": "PHP > Loops" + id: '5oLc-235bvKhApxzYFkEc', + text: 'AI Agents > AI Agents 101 > Example Usecases > Web Scraping / Crawling', }, { - "id": "WiGv7vi7Mtw-YqPMcnnyw", - "text": "PHP > Functions" + id: 'ok8vN7VtCgyef5x6aoQaL', + text: 'AI Agents > AI Agents 101 > Example Usecases > NPC / Game AI', }, { - "id": "1nODJchgSuWbcvSlxnWeE", - "text": "PHP > Functions > Function Declaration" + id: 'Y8EqzFx3qxtrSh7bWbbV8', + text: 'AI Agents > Prompt Engineering > What is Prompt Engineering', }, { - "id": "mpQKoBzsOa-5iWo08sOhQ", - "text": "PHP > Functions > Parameters / Return Values" + id: 'qFKFM2qNPEN7EoD0V-1SM', + text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Be specific in what you want', }, { - "id": "RgVP99rJJ8FVecIA45w20", - "text": "PHP > Functions > Default / Optional Params" + id: '6I42CoeWX-kkFXTKAY7rw', + text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Provide additional context', }, { - "id": "RkNjYva8o_jXp9suz5YdG", - "text": "PHP > Functions > Named Arguments" + id: 'sUwdtOX550tSdceaeFPmF', + text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Use relevant technical terms', }, { - "id": "Nr5m6wQLp7VyG3AucrSc8", - "text": "PHP > Functions > Anonymous Functions" + id: 'yulzE4ZNLhXOgHhG7BtZQ', + text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Use Examples in your Prompt', }, { - "id": "x7hA2KAzJIjc-prgCEw6V", - "text": "PHP > Functions > Callback Functions" + id: 'noTuUFnHSBzn7GKG9UZEi', + text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Iterate and Test your Prompts', }, { - "id": "mP1BIkqbWVVTU-zZv1ZL6", - "text": "PHP > Functions > Arrow Functions" + id: 'wwHHlEoPAx0TLxbtY6nMA', + text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Specify Length, format etc', }, { - "id": "D9ybK5INH5zSOcYMb5ZPi", - "text": "PHP > Functions > Recursion" + id: 'qakbxB8xe7Y8gejC5cZnK', + text: 'AI Agents > AI Agents 101 > Tools / Actions > Tool Definition', }, { - "id": "rtmytETfyyLdcXUC0QyzL", - "text": "PHP > Functions > Variadic Functions" + id: 'kBtqT8AduLoYDWopj-V9_', + text: 'AI Agents > Tools / Actions > Examples of Tools > Web Search', }, { - "id": "Kaaqu-mN7xvHN6CbIn616", - "text": "PHP > File Handling > require" + id: 'mS0EVCkWuPN_GkVPng4A2', + text: 'AI Agents > Tools / Actions > Examples of Tools > Code Execution / REPL', }, { - "id": "-CyJbsg2ho3RvfzKnJj5C", - "text": "PHP > File Handling > require_once" + id: 'sV1BnA2-qBnXoKpUn-8Ub', + text: 'AI Agents > Tools / Actions > Examples of Tools > Database Queries', }, { - "id": "hKfv7V6bl2LXssq9Ffi7C", - "text": "PHP > File Handling > include" + id: '52qxjZILV-X1isup6dazC', + text: 'AI Agents > Tools / Actions > Examples of Tools > API Requests > Tools / Actions > Examples of Tools > API Requests', }, { - "id": "SwtLDgyPmDry20qS4FBfH", - "text": "PHP > File Handling > include_once" + id: 'qaNr5I-NQPnfrRH7ynGTl', + text: 'AI Agents > Tools / Actions > Examples of Tools > Email / Slack / SMS', }, { - "id": "S9wTlkbv9-R6dohhZ47hs", - "text": "PHP > File Operations > Reading Files" + id: 'BoJqZvdGam4cd6G6yK2IV', + text: 'AI Agents > Tools / Actions > Examples of Tools > File System Access', }, { - "id": "two4UycJaCfSp6jQqtTAb", - "text": "PHP > File Operations > Writing Files" + id: '1B0IqRNYdtbHDi1jHSXuI', + text: 'AI Agents > Model Context Protocol (MCP)', }, { - "id": "tgIyG6vHWpe9sz6lHmj5a", - "text": "PHP > File Operations > File Permissions" + id: '9FryAIrWRHh8YlzKX3et5', + text: 'AI Agents > Model Context Protocol (MCP) > Core Components > MCP Hosts', }, { - "id": "MRDjEjbkMpk7shcWAoPOF", - "text": "PHP > File Operations > CSV Processing" + id: 'CGVstUxVXLJcYZrwk3iNQ', + text: 'AI Agents > Model Context Protocol (MCP) > Core Components > MCP Client', }, { - "id": "DB2cxZE58WCCavW2PNwmf", - "text": "PHP > File Operations > JSON Processing" + id: 'yv_-87FVM7WKn5iv6LW9q', + text: 'AI Agents > Model Context Protocol (MCP) > Core Components > MCP Servers', }, { - "id": "ggkWo0DRSSDDkHpbiyUyf", - "text": "PHP > File Operations > XML Processing" + id: '1NXIN-Hbjl5rPy_mqxQYW', + text: 'AI Agents > Model Context Protocol (MCP) > Creating MCP Servers', }, { - "id": "tn_iIfaJZVtPK6vFds7FH", - "text": "PHP > HTTP / Request Handling > HTTP Methods" + id: 'iBtJp24F_kJE3YlBsW60s', + text: 'AI Agents > Model Context Protocol (MCP) > Creating MCP Servers > Deployment Modes > Local Desktop', }, { - "id": "GFYGFVfxkOoPI5mI4zSt1", - "text": "PHP > HTTP / Request Handling > $_GET" + id: 'dHNMX3_t1KSDdAWqgdJXv', + text: 'AI Agents > Model Context Protocol (MCP) > Creating MCP Servers > Deployment Modes > Remote / Cloud', }, { - "id": "qNG-a4iIO-puZsMwAMzYC", - "text": "PHP > HTTP / Request Handling > $_POST" + id: 'TBH_DZTAfR8Daoh-njNFC', + text: 'AI Agents > Agent Memory > What is Agent Memory?', }, { - "id": "A6rfW4uJhyfAX2b18_EEC", - "text": "PHP > HTTP / Request Handling > $_REQUEST" + id: 'M3U6RfIqaiut2nuOibY8W', + text: 'AI Agents > Agent Memory > Short Term Memory', }, { - "id": "7Ja2at_N9tRTlvSGahrqn", - "text": "PHP > HTTP / Request Handling > $_SERVER" + id: 'Ue633fz6Xu2wa2-KOAtdP', + text: 'AI Agents > Agent Memory > What is Agent Memory? > Long Term Memory', }, { - "id": "sYI7f1PYP7G30_Uj2mZRv", - "text": "PHP > Form Processing" + id: 'EfCCNqLMJpWKKtamUa5gK', + text: 'AI Agents > Agent Memory > What is Agent Memory? > Episodic vs Semantic Memory', }, { - "id": "HNo8QO4aPbvgePiA4l6tq", - "text": "PHP > File Uploads" + id: 'wkS4yOJ3JdZQE_yBID8K7', + text: 'AI Agents > Agent Memory > What is Agent Memory? > Maintaining Memory > RAG and Vector Databases', }, { - "id": "CGehmZjcgTWC7fQAvxmNW", - "text": "PHP > State Management" + id: 'QJqXHV8VHPTnfYfmKPzW7', + text: 'AI Agents > Agent Memory > What is Agent Memory? > Maintaining Memory > User Profile Storage', }, { - "id": "so03-fK7E2WvTm6XsPq4i", - "text": "PHP > State Management > Cookies" + id: 'jTDC19BTWCqxqMizrIJHr', + text: 'AI Agents > Agent Memory > Maintaining Memory > Summarization / Compression', }, { - "id": "qobzzgzArNHLLn9Oiqc6G", - "text": "PHP > State Management > Sessions" + id: 'm-97m7SI0XpBnhEE8-_1S', + text: 'AI Agents > Agent Memory > Maintaining Memory > Forgetting / Aging Strategies', }, { - "id": "93oEIZttb85S23C1fLraP", - "text": "PHP > Basics of Security > Input Validation" + id: 'cW8O4vLLKEG-Q0dE8E5Zp', + text: 'AI Agents > Agent Architectures > Common Architectures > RAG Agent', }, { - "id": "801vB_JMas4ucriUmfrLg", - "text": "PHP > Basics of Security > SQL Injection" + id: '53xDks6JQ33fHMa3XcuCd', + text: 'AI Agents > Agent Architectures > Common Architectures > ReAct (Reason + Act)', }, { - "id": "DxqQrToZSayWplKdCkTgT", - "text": "PHP > Basics of Security > XSS Prevention" + id: 'qwdh5pkBbrF8LKPxbZp4F', + text: 'AI Agents > Agent Architectures > Common Architectures > Chain of Thought (CoT)', }, { - "id": "J9yIXZTtwbFzH2u4dI1ep", - "text": "PHP > Basics of Security > CSRF Protection" + id: '6YLCMWzystao6byCYCTPO', + text: 'AI Agents > Agent Architectures > Common Architectures > Planner Executor', }, { - "id": "JbWFfJiCRrXDhnuIx_lqx", - "text": "PHP > Basics of Security > Password Hashing" + id: 'Ep8RoZSy_Iq_zWXlGQLZo', + text: 'AI Agents > Agent Architectures > Common Architectures > DAG Agents', }, { - "id": "HJJzKYXdK4BWITLP4APLZ", - "text": "PHP > Basics of Security > Auth Mechanisms" + id: 'Nmy1PoB32DcWZnPM8l8jT', + text: 'AI Agents > Agent Architectures > Common Architectures > Tree-of-Thought', }, { - "id": "tfC1tCrbvH5J43WUpG9Yb", - "text": "PHP > Basics of Security > Sanitization Techniques" + id: 'hj1adjkG9nalXKZ-Youn0', + text: 'AI Agents > Agent Architectures > Common Architectures > Tree-of-Thought', }, { - "id": "cJtPz1RMN1qDE4eRdv4N_", - "text": "PHP > Database Connectivity > PDO" + id: 'US6T5dXM8IY9V2qZnTOFW', + text: 'AI Agents > Building Agents > Manual (from scratch)', }, { - "id": "YLuo0oZJzTCoiZoOSG57z", - "text": "PHP > Database Connectivity > MySQLi" + id: 'aafZxtjxiwzJH1lwHBODi', + text: 'AI Agents > Building Agents > LLM Native "Function Calling"', }, { - "id": "SeqGIfcLuveZ2z5ZSXcOd", - "text": "PHP > Advanced Database Techniques > Object-Relational Mapping (ORM)" + id: 'AQtxTTxmBpfl8BMgJbGzc', + text: 'AI Agents > Building Agents > LLM Native "Function Calling" > OpenAI Functions Calling', }, { - "id": "FY-F6n9j29hQrnFry3VGb", - "text": "PHP > Advanced Database Techniques > Database Transactions" + id: '37GBFVZ2J2d5r8bd1ViHq', + text: 'AI Agents > Building Agents > LLM Native "Function Calling" > OpenAI Assistant API', }, { - "id": "txUyPR_tdC8iTJV3RtvBz", - "text": "PHP > Advanced Database Techniques > Connection Pooling" + id: '_iIsBJTVS6OBf_dsdmbVO', + text: 'AI Agents > Building Agents > LLM Native "Function Calling" > Gemini Function Calling', }, { - "id": "M1nVsh_sCSFJRf6-7Ttsj", - "text": "PHP > Advanced Database Techniques > Performance Optimization" + id: '1EZFbDHA5J5_5BPMLMxXb', + text: 'AI Agents > Building Agents > LLM Native "Function Calling" > Anthropic Tool Use', }, { - "id": "meplwvmHMtI3Sb_fyodzZ", - "text": "PHP > Advanced Database Techniques > Database Migrations" + id: 'Ka6VpCEnqABvwiF9vba7t', + text: 'AI Agents > Building Agents > Building Using Frameworks > Langchain', }, { - "id": "yTviiPFR5b_dr3WyxdxxQ", - "text": "PHP > OOP Fundamentals" + id: 'iEHF-Jm3ck-Iu85EbCoDi', + text: 'AI Agents > Building Agents > Building Using Frameworks > LlamaIndex', }, { - "id": "PIuplWreo7PFG3Mdn2t6W", - "text": "PHP > OOP Fundamentals > Classes and Objects" + id: 'XS-FsvtrXGZ8DPrwOsnlI', + text: 'AI Agents > Building Agents > Building Using Frameworks > Haystack', }, { - "id": "oNUt1oT8pYBVvH0S2P6cb", - "text": "PHP > OOP Fundamentals > Constructor / Destructor" + id: '7YtnQ9-KIvGPSpDzEDexl', + text: 'AI Agents > Building Agents > Building Using Frameworks > AutoGen', }, { - "id": "MRAPXshy9RoYdReY6grf_", - "text": "PHP > OOP Fundamentals > Properties and Methods" + id: 'uFPJqgU4qGvZyxTv-osZA', + text: 'AI Agents > Building Agents > Building Using Frameworks > CrewAI', }, { - "id": "RD2RaBmA2XWkEa13PTCTX", - "text": "PHP > OOP Fundamentals > Access Specifiers" + id: 'eWxQiBrxIUG2JNcrdfIHS', + text: 'AI Agents > Building Agents > Building Using Frameworks > Smol Depot', }, { - "id": "qlkpwXfOc1p7j37hrzffI", - "text": "PHP > OOP Fundamentals > Static Methods and Properties" + id: 'v8qLnyFRnEumodBYxQSXQ', + text: 'AI Agents > Building Agents > Evaluation and Testing > Metrics to Track', }, { - "id": "c5q2e_jyMt8Pir5Od3lRi", - "text": "PHP > OOP Fundamentals > Inheritance" + id: 'qo_O4YAe4-MTP_ZJoXJHR', + text: 'AI Agents > Evaluation and Testing > Unit Testing for Individual Tools', }, { - "id": "gtq5KrghF28f5G8nuDcYQ", - "text": "PHP > Polymorphism" + id: 'P9-SiIda3TSjHsfkI5OUV', + text: 'AI Agents > Evaluation and Testing > Integration Testing for Flows', }, { - "id": "ub79EkMiOmPBwXLRuYFL8", - "text": "PHP > Abstract classes" + id: 'rHxdxN97ZcU7MPl8L1jzN', + text: 'AI Agents > Evaluation and Testing > Human in the Loop Evaluation', }, { - "id": "vu0H-TsD7hkJgOQbSRj92", - "text": "PHP > Interfaces" + id: 'xp7TCTRE9HP60_rGzTUF6', + text: 'AI Agents > Evaluation and Testing > Frameworks > LangSmith', }, { - "id": "GR09ns9B-0cONQaQ_uj-7", - "text": "PHP > Traits" + id: '0924QUH1wV7Mp-Xu0FAhF', + text: 'AI Agents > Evaluation and Testing > Frameworks > DeepEval', }, { - "id": "9raJ06lKRZITbjWeLil-F", - "text": "PHP > Namespaces" + id: 'YzEDtGEaMaMWVt0W03HRt', + text: 'AI Agents > Evaluation and Testing > Frameworks > Ragas', }, { - "id": "rSXsPWto7Jeyw3Szl9pvf", - "text": "PHP > Magic methods" + id: 'zs6LM8WEnb0ERWpiaQCgc', + text: 'AI Agents > Debugging and Monitoring > Structured logging & tracing', }, { - "id": "sPW-Ti2VyNYzxq6EYkbn7", - "text": "PHP > Type Declarations" + id: 'zs6LM8WEnb0ERWpiaQCgc', + text: 'AI Agents > Debugging and Monitoring > Structured logging & tracing', }, { - "id": "KEE50C6lOS4eX8sAbfhYe", - "text": "PHP > Dependency injection" + id: 'SS8mGqf9wfrNqenIWvN8Z', + text: 'AI Agents > Observability Tools > LangSmith', }, { - "id": "zsscRQZIq5o0JZir9hlz-", - "text": "PHP > Laravel" + id: 'MLxP5N0Vrmwh-kyvNeGXn', + text: 'AI Agents > Observability Tools > Helicone', }, { - "id": "57VSMVePOr9qUD5x_LNdf", - "text": "PHP > Symfony" + id: 'UoIheaJlShiceafrWALEH', + text: 'AI Agents > Observability Tools > LangFuse', }, { - "id": "yVFDu2aTiEZ4PWMdKdW2P", - "text": "PHP > Composer" + id: '7UqPXUzqKYXklnB3x-tsv', + text: 'AI Agents > Observability Tools > openllmetry', }, { - "id": "xZf2jjnCVHwYfDH2hs9kR", - "text": "PHP > Packagist" + id: 'SU2RuicMUo8tiAsQtDI1k', + text: 'AI Agents > Security & Ethics > Prompt Injection / Jailbreaks', }, { - "id": "qFiTsf6Es-gwqe6J6bdL1", - "text": "PHP > Autoloading" + id: 'UVzLGXG6K7HQVHmw8ZAv2', + text: 'AI Agents > Security & Ethics > Tool sandboxing / Permissioning', }, { - "id": "NfBKKwG2GGBPppOjoLLBg", - "text": "PHP > PHPUnit" + id: 'rdlYBJNNyZUshzsJawME4', + text: 'AI Agents > Security & Ethics > Data Privacy + PII Redaction', }, { - "id": "d6MydchA52HIxfAUjmZui", - "text": "PHP > Pest" + id: 'EyLo2j8IQsIK91SKaXkmK', + text: 'AI Agents > Security & Ethics > Bias & Toxicity Guardrails', }, { - "id": "6eWgZVLV479oQzl0fu-Od", - "text": "PHP > Style Tools" + id: '63nsfJFO1BwjLX_ZVaPFC', + text: 'AI Agents > Security & Ethics > Safety + Red Team Testing', }, - { - "id": "fSpvZ_4kGFMbFVCWhA8vn", - "text": "PHP > Style Tools > PHPCodeSniffer" - }, - { - "id": "r07k_hT2z2EiIBH4q3F7-", - "text": "PHP > Style Tools > PHP CS Fixer" - }, - { - "id": "PrG_5dyBblXsWYYRcOJMa", - "text": "PHP > Static Analysis" - }, - { - "id": "12k71gNfwAcT9K5aLWgbZ", - "text": "PHP > Static Analysis > PHPStan" - }, - { - "id": "T1XD93j6Lkpl88JSmys9b", - "text": "PHP > Static Analysis > Psalm" - }, - { - "id": "B45YVzov8X_iOtneiFEqa", - "text": "PHP > Static Analysis > Phan" - }, - { - "id": "KC6D81-T-FwQc7Osw1rlY", - "text": "PHP > External Integrations > cURL" - }, - { - "id": "_Al4NXKVQAnk8OikwvXCL", - "text": "PHP > External Integrations > Guzzle" - }, - { - "id": "SD9k16UlVve9WtNMDA5Za", - "text": "PHP > PHP-FIG" - }, - { - "id": "3tONibbRgK7HCwGTE2Gqw", - "text": "PHP > PHP-FIG > PSR Standards" - }, - { - "id": "_Dh78x_tPLqZweg--qZFQ", - "text": "PHP > Performance Optimization > Profiling Techniques" - }, - { - "id": "Av-BMa57RvrLlAXLffOH0", - "text": "PHP > Performance Optimization > Caching Strategies" - }, - { - "id": "bt7dK2PcOZ72B9HXPyMwL", - "text": "PHP > Performance Optimization > Memory Management" - }, - { - "id": "VpwwF8j5ZtXVSbzNfE7Sx", - "text": "PHP > Performance Optimization > Configuration Tuning" - }, - { - "id": "NieqZd1juaNYoZOrB7e31", - "text": "PHP > Performance Optimization > Opcode Caching" - }, - { - "id": "AoGS-5MSkp8gtJFQVPSBE", - "text": "PHP > Performance Optimization > PHP-FPM" - }, - { - "id": "qp5Xi12c0qcSzTanzJq0Z", - "text": "PHP > System Interactions" - }, - { - "id": "VhyYNGhOdKKrz_-uTkrjD", - "text": "PHP > System Interactions > Executing System Commands" - }, - { - "id": "NTKUMgsKGYISIyhgOJPQn", - "text": "PHP > System Interactions > Process Control" - }, - { - "id": "fitjnLYKLHJ2P5G7JAvzm", - "text": "PHP > System Interactions > Environment Variables" - }, - { - "id": "DTaAZaU1CwzW7esoDhj85", - "text": "PHP > System Interactions > Configuration Files" - }, - { - "id": "lFoHoMRywCWa056ii5cKQ", - "text": "PHP > Debugging Tools > Xdebug" - }, - { - "id": "KpQb5Zh3GUcbYUyXHvyu2", - "text": "PHP > Debugging Tools > Zend Debugger" - }, - { - "id": "KMQqePqAjQ-ReDwHqeofx", - "text": "PHP > Web Servers > Apache" - }, - { - "id": "aspZpACHEKOsi_Er5FYPY", - "text": "PHP > Web Servers > Nginx" - } ]; const OPENAI_API_KEY = process.env.OPENAI_API_KEY; @@ -516,19 +416,11 @@ const openai = new OpenAI({ const prompt = ` You are a helpful assistant that can help me generate content for a roadmap tree. - User will give you roadmap topics in the form of "Parent > Child > Leaf". You need - to generate content for the last node in the hierarchy in relation to the parents. - Remember that you are explaining the topics for PHP showing what the given topic is - with respect to PHP and giving a short code sample ONLY when required. + You will be given a roadmap topic in the form of "Parent > Child > Leaf". You need + to generate a single paragraph explaining the topic. Also, I hate it when you say "In the realm of..." or "In the context of..." or "..in the context of..." or "when we talk about..." or something similar. - Content should be helpful and engaging for a technical audience. - It can include things like (you can include more or less, depending on the topic): - - Briefly explain the given topic in relation to PHP. - - Code sample if applicable. - - Add a link to PHP documentation - The content should be a a single textual paragraph. IMPORTANT: Use simple and clear English. Avoid complex words and jargon when possible. Write in a way that is easy to understand. Use short sentences and common words. `; @@ -541,7 +433,7 @@ const prompt = ` const generateContent = async (node) => { try { const content = await openai.chat.completions.create({ - model: 'gpt-4', + model: 'o3', messages: [ { role: 'system', content: prompt }, { diff --git a/src/data/roadmaps/ai-agents/ai-agents.json b/src/data/roadmaps/ai-agents/ai-agents.json index 7696067a4..198303c54 100644 --- a/src/data/roadmaps/ai-agents/ai-agents.json +++ b/src/data/roadmaps/ai-agents/ai-agents.json @@ -3,7 +3,7 @@ { "id": "3GO9CZQSSxM1eRSBz9sWR", "type": "horizontal", - "position": { "x": 448.47614503814657, "y": 3372.5001335516636 }, + "position": { "x": 448.47614503814657, "y": 3322.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -24,7 +24,7 @@ { "id": "9MVi8gN_TNI515-5til_s", "type": "vertical", - "position": { "x": 739, "y": 3096.5001335516636 }, + "position": { "x": 739, "y": 3056.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -45,7 +45,7 @@ { "id": "h2-93F69l8wKXkvT-iFC4", "type": "section", - "position": { "x": -135.00832024152123, "y": 2858.2399357924473 }, + "position": { "x": -135.00832024152123, "y": 2818.2399357924473 }, "selected": true, "selectable": true, "draggable": true, @@ -70,7 +70,7 @@ { "id": "ucZ3vn5WgFOfa8Wpb0Hgk", "type": "section", - "position": { "x": -135.00832024152123, "y": 2452.347193632089 }, + "position": { "x": -135.00832024152123, "y": 2412.347193632089 }, "selected": true, "selectable": true, "draggable": true, @@ -95,7 +95,7 @@ { "id": "JuxzWFeM_vwgn4pj0wxfY", "type": "horizontal", - "position": { "x": 528.9761450381466, "y": 2750.42394018722 }, + "position": { "x": 528.9761450381466, "y": 2710.42394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -116,7 +116,7 @@ { "id": "R18O3kbMoSEicZbLgUP7s", "type": "section", - "position": { "x": 264.97614503814657, "y": 2734.92394018722 }, + "position": { "x": 264.97614503814657, "y": 2694.92394018722 }, "width": 265, "height": 310, "style": { "width": 241, "height": 60 }, @@ -170,9 +170,9 @@ }, "zIndex": -999, "width": 265, - "height": 485, + "height": 434, "style": { "width": 150, "height": 100 }, - "measured": { "width": 265, "height": 485 }, + "measured": { "width": 265, "height": 434 }, "resizing": false, "dragging": false, "focusable": true @@ -489,7 +489,7 @@ "height": 121, "id": "0vLaVNJaJSHZ_bHli6Qzs", "type": "paragraph", - "position": { "x": 39.982758882202006, "y": 3294.0164384242175 }, + "position": { "x": 39.982758882202006, "y": 3244.0164384242175 }, "selected": true, "data": { "label": "Visit the following relevant tracks", @@ -516,7 +516,7 @@ "height": 85, "id": "xi0QAi4kXm3-IFKgopnOP", "type": "vertical", - "position": { "x": 235.48275888220198, "y": 3415.0164384242175 }, + "position": { "x": 235.48275888220198, "y": 3365.0164384242175 }, "selected": true, "data": { "label": "vertical node", @@ -542,7 +542,7 @@ "height": 49, "id": "NrTAfxHCksgqSkhnrO4kF", "type": "button", - "position": { "x": 56.98275888220195, "y": 3350.7409891427583 }, + "position": { "x": 56.98275888220195, "y": 3300.7409891427583 }, "selected": true, "data": { "label": "AI Engineer", @@ -1680,7 +1680,7 @@ "style": { "width": 219, "height": 183 }, "selected": true, "data": { - "style": { "backgroundColor": "#ffffff" }, + "style": { "backgroundColor": "#ffffff", "borderColor": "#000000" }, "oldId": "fDFxKOTLw6O41OGVmRuyy" }, "measured": { "width": 284, "height": 328 }, @@ -3563,7 +3563,7 @@ { "id": "aafZxtjxiwzJH1lwHBODi", "type": "topic", - "position": { "x": 600.30929781038, "y": 2735.92394018722 }, + "position": { "x": 600.30929781038, "y": 2695.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3589,7 +3589,7 @@ { "id": "AQtxTTxmBpfl8BMgJbGzc", "type": "subtopic", - "position": { "x": 600.30929781038, "y": 2817.8580866298494 }, + "position": { "x": 600.30929781038, "y": 2777.8580866298494 }, "selected": true, "selectable": true, "draggable": true, @@ -3614,7 +3614,7 @@ { "id": "_iIsBJTVS6OBf_dsdmbVO", "type": "subtopic", - "position": { "x": 600.30929781038, "y": 2931.8580866298494 }, + "position": { "x": 600.30929781038, "y": 2891.8580866298494 }, "selected": true, "selectable": true, "draggable": true, @@ -3639,7 +3639,7 @@ { "id": "37GBFVZ2J2d5r8bd1ViHq", "type": "subtopic", - "position": { "x": 600.30929781038, "y": 2874.8580866298494 }, + "position": { "x": 600.30929781038, "y": 2834.8580866298494 }, "selected": true, "selectable": true, "draggable": true, @@ -3664,7 +3664,7 @@ { "id": "VVFomJWwR-bvPRsiLmbiV", "type": "label", - "position": { "x": 283.97614503814657, "y": 2754.92394018722 }, + "position": { "x": 283.97614503814657, "y": 2714.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3685,7 +3685,7 @@ { "id": "Ka6VpCEnqABvwiF9vba7t", "type": "subtopic", - "position": { "x": 276.97614503814657, "y": 2803.92394018722 }, + "position": { "x": 276.97614503814657, "y": 2763.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3711,7 +3711,7 @@ { "id": "iEHF-Jm3ck-Iu85EbCoDi", "type": "subtopic", - "position": { "x": 393.47614503814657, "y": 2803.92394018722 }, + "position": { "x": 393.47614503814657, "y": 2763.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3736,7 +3736,7 @@ { "id": "XS-FsvtrXGZ8DPrwOsnlI", "type": "subtopic", - "position": { "x": 276.97614503814657, "y": 2862.92394018722 }, + "position": { "x": 276.97614503814657, "y": 2822.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3762,7 +3762,7 @@ { "id": "7YtnQ9-KIvGPSpDzEDexl", "type": "subtopic", - "position": { "x": 393.47614503814657, "y": 2862.42394018722 }, + "position": { "x": 393.47614503814657, "y": 2822.42394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3788,7 +3788,7 @@ { "id": "uFPJqgU4qGvZyxTv-osZA", "type": "subtopic", - "position": { "x": 276.97614503814657, "y": 2921.92394018722 }, + "position": { "x": 276.97614503814657, "y": 2881.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3814,7 +3814,7 @@ { "id": "eWxQiBrxIUG2JNcrdfIHS", "type": "subtopic", - "position": { "x": 276.97614503814657, "y": 2977.92394018722 }, + "position": { "x": 276.97614503814657, "y": 2937.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -3840,7 +3840,7 @@ { "id": "1EZFbDHA5J5_5BPMLMxXb", "type": "subtopic", - "position": { "x": 600.30929781038, "y": 2988.8580866298494 }, + "position": { "x": 600.30929781038, "y": 2948.8580866298494 }, "selected": true, "selectable": true, "draggable": true, @@ -3864,7 +3864,7 @@ { "id": "y3Km7Dc3FidoKtF7cnTfR", "type": "label", - "position": { "x": -74.7455305579661, "y": 2462.870720452855 }, + "position": { "x": -74.7455305579661, "y": 2422.870720452855 }, "selected": true, "selectable": true, "draggable": true, @@ -3885,7 +3885,7 @@ { "id": "v8qLnyFRnEumodBYxQSXQ", "type": "subtopic", - "position": { "x": -121.7455305579661, "y": 2503.550271236641 }, + "position": { "x": -121.7455305579661, "y": 2463.550271236641 }, "selected": true, "selectable": true, "draggable": true, @@ -3911,7 +3911,7 @@ { "id": "qo_O4YAe4-MTP_ZJoXJHR", "type": "subtopic", - "position": { "x": -121.7455305579661, "y": 2556.550271236641 }, + "position": { "x": -121.7455305579661, "y": 2516.550271236641 }, "selected": true, "selectable": true, "draggable": true, @@ -3937,7 +3937,7 @@ { "id": "P9-SiIda3TSjHsfkI5OUV", "type": "subtopic", - "position": { "x": -121.7455305579661, "y": 2609.550271236641 }, + "position": { "x": -121.7455305579661, "y": 2569.550271236641 }, "selected": true, "selectable": true, "draggable": true, @@ -3963,7 +3963,7 @@ { "id": "rHxdxN97ZcU7MPl8L1jzN", "type": "subtopic", - "position": { "x": -121.7455305579661, "y": 2662.550271236641 }, + "position": { "x": -121.7455305579661, "y": 2622.550271236641 }, "selected": true, "selectable": true, "draggable": true, @@ -3988,7 +3988,7 @@ { "id": "xp7TCTRE9HP60_rGzTUF6", "type": "subtopic", - "position": { "x": -124.32279103658766, "y": 2757.42394018722 }, + "position": { "x": -124.32279103658766, "y": 2717.42394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -4014,7 +4014,7 @@ { "id": "YzEDtGEaMaMWVt0W03HRt", "type": "subtopic", - "position": { "x": -124.32279103658766, "y": 2810.92394018722 }, + "position": { "x": -124.32279103658766, "y": 2770.92394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -4040,7 +4040,7 @@ { "id": "0924QUH1wV7Mp-Xu0FAhF", "type": "subtopic", - "position": { "x": 26.306930530664715, "y": 2757.42394018722 }, + "position": { "x": 26.306930530664715, "y": 2717.42394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -4065,7 +4065,7 @@ { "id": "OxRCEi7olEsHcBZ7oVfLl", "type": "label", - "position": { "x": -36.32279103658766, "y": 2717.322480617088 }, + "position": { "x": -36.32279103658766, "y": 2677.322480617088 }, "selected": true, "selectable": true, "draggable": true, @@ -4085,7 +4085,7 @@ { "id": "zs6LM8WEnb0ERWpiaQCgc", "type": "subtopic", - "position": { "x": -123.5097055754202, "y": 2930.5001335516636 }, + "position": { "x": -123.5097055754202, "y": 2890.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4111,7 +4111,7 @@ { "id": "P5D6O9GmDjENsvNStJcEC", "type": "label", - "position": { "x": -91.5097055754202, "y": 2882.434279994293 }, + "position": { "x": -91.5097055754202, "y": 2842.434279994293 }, "selected": true, "selectable": true, "draggable": true, @@ -4132,7 +4132,7 @@ { "id": "PsMoyCyhXdYIIgTK4mduG", "type": "label", - "position": { "x": -60.009705575420185, "y": 2985.0001335516636 }, + "position": { "x": -60.009705575420185, "y": 2945.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4152,7 +4152,7 @@ { "id": "SS8mGqf9wfrNqenIWvN8Z", "type": "subtopic", - "position": { "x": -122.73444959728216, "y": 3028.0001335516636 }, + "position": { "x": -122.73444959728216, "y": 2988.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4178,7 +4178,7 @@ { "id": "MLxP5N0Vrmwh-kyvNeGXn", "type": "subtopic", - "position": { "x": 20.507919061606035, "y": 3028.0001335516636 }, + "position": { "x": 20.507919061606035, "y": 2988.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4204,7 +4204,7 @@ { "id": "UoIheaJlShiceafrWALEH", "type": "subtopic", - "position": { "x": -122.73444959728216, "y": 3082.0001335516636 }, + "position": { "x": -122.73444959728216, "y": 3042.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4230,7 +4230,7 @@ { "id": "7UqPXUzqKYXklnB3x-tsv", "type": "subtopic", - "position": { "x": 20.507919061606035, "y": 3082.0001335516636 }, + "position": { "x": 20.507919061606035, "y": 3042.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4256,7 +4256,7 @@ { "id": "ZczxILvJ8ZVlaNd887lS5", "type": "horizontal", - "position": { "x": 169.48246683384076, "y": 2750.42394018722 }, + "position": { "x": 169.48246683384076, "y": 2710.42394018722 }, "selected": true, "selectable": true, "draggable": true, @@ -4278,7 +4278,7 @@ { "id": "8Fk3qNFO_5UNxJDGDDCc8", "type": "horizontal", - "position": { "x": 170.99167975847877, "y": 3086.5001335516636 }, + "position": { "x": 170.99167975847877, "y": 3046.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4300,7 +4300,7 @@ { "id": "AZGZKUelTu9A0VbpnsrnN", "type": "paragraph", - "position": { "x": 287.47614503814657, "y": 3074.5001335516636 }, + "position": { "x": 287.47614503814657, "y": 3034.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4330,7 +4330,7 @@ { "id": "41n1zuSz7Ur8Zq0GcmQ9y", "type": "horizontal", - "position": { "x": 498.86750909294227, "y": 3086.5001335516636 }, + "position": { "x": 498.86750909294227, "y": 3046.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4351,7 +4351,7 @@ { "id": "SU2RuicMUo8tiAsQtDI1k", "type": "topic", - "position": { "x": 602.30929781038, "y": 3147.0001335516636 }, + "position": { "x": 602.30929781038, "y": 3097.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4377,7 +4377,7 @@ { "id": "UVzLGXG6K7HQVHmw8ZAv2", "type": "topic", - "position": { "x": 602.30929781038, "y": 3199.7501335516636 }, + "position": { "x": 602.30929781038, "y": 3149.7501335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4403,7 +4403,7 @@ { "id": "rdlYBJNNyZUshzsJawME4", "type": "topic", - "position": { "x": 604.30929781038, "y": 3252.5001335516636 }, + "position": { "x": 604.30929781038, "y": 3202.5001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4429,7 +4429,7 @@ { "id": "EyLo2j8IQsIK91SKaXkmK", "type": "topic", - "position": { "x": 604.30929781038, "y": 3305.2501335516636 }, + "position": { "x": 604.30929781038, "y": 3255.2501335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4455,7 +4455,7 @@ { "id": "63nsfJFO1BwjLX_ZVaPFC", "type": "topic", - "position": { "x": 604.30929781038, "y": 3358.0001335516636 }, + "position": { "x": 604.30929781038, "y": 3308.0001335516636 }, "selected": true, "selectable": true, "draggable": true, @@ -4478,39 +4478,12 @@ "resizing": false, "focusable": true }, - { - "id": "hj1adjkG9nalXKZ-Youn0", - "type": "topic", - "position": { "x": 281.97614503814657, "y": 2638.4774309459326 }, - "selected": true, - "selectable": true, - "draggable": true, - "deletable": true, - "data": { - "label": "Tree-of-Thought", - "style": { - "fontSize": 17, - "justifyContent": "flex-start", - "textAlign": "center", - "colorType": "c" - }, - "oldId": "KcgDVjHRzuaeCs81cnCA_" - }, - "zIndex": 999, - "style": { "width": 231 }, - "measured": { "width": 232, "height": 49 }, - "focusable": true, - "dragging": false, - "width": 232, - "height": 49, - "resizing": false - }, { "width": 223, "height": 49, "id": "-sFboM4eFUMVq1tlPl-fV", "type": "button", - "position": { "x": 212.99392181540966, "y": 3350.7409891427583 }, + "position": { "x": 212.99392181540966, "y": 3300.7409891427583 }, "selected": true, "data": { "label": "AI & Data Scientist", diff --git a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md index df838ac89..d60bc731c 100644 --- a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md +++ b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md @@ -1 +1,3 @@ -# Acting / Tool Invocation \ No newline at end of file +# Acting / Tool Invocation + +Acting, also called tool invocation, is the step where the AI chooses a tool and runs it to get real-world data or to change something. The agent looks at its current goal and the plan it just made. It then picks the best tool, such as a web search, a database query, or a calculator. The agent fills in the needed inputs and sends the call. The external system does the heavy work and returns a result. Acting ends when the agent stores that result so it can think about the next move. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md index 5f97abe06..dde88cd1c 100644 --- a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md +++ b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md @@ -1 +1,3 @@ -# Agent Loop \ No newline at end of file +# Agent Loop + +An agent loop is the cycle that lets an AI agent keep working toward a goal. First, the agent gathers fresh data from its tools, sensors, or memory. Next, it updates its internal state and decides what to do, often by running a planning or reasoning step. Then it carries out the chosen action, such as calling an API, writing to a file, or sending a message. After acting, it checks the result and stores new information. The loop starts again with the latest data, so the agent can adjust to changes and improve over time. This fast repeat of observe–decide–act gives the agent its power. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md index 126a9096c..289ead933 100644 --- a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md +++ b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md @@ -1 +1,3 @@ -# Anthropic Tool Use \ No newline at end of file +# Anthropic Tool Use + +Anthropic Tool Use lets you connect a Claude model to real software functions so the agent can do useful tasks on its own. You give Claude a list of tools, each with a name, a short description, and a strict JSON schema that shows the allowed input fields. During a chat you send user text plus this tool list. Claude decides if a tool should run, picks one, and returns a JSON block that matches the schema. Your code reads the JSON, calls the matching function, and sends the result back to Claude for the next step. This loop repeats until no more tool calls are needed. Clear schemas, small field sets, and helpful examples make the calls accurate. By keeping the model in charge of choosing tools while your code controls real actions, you gain both flexibility and safety. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md b/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md index 151941142..e2389b98e 100644 --- a/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md +++ b/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md @@ -1 +1,3 @@ -# API Requests \ No newline at end of file +# API Requests + +API requests let an AI agent ask another service for data or for an action. The agent builds a short message that follows the service’s rules, sends it over the internet, and waits for a reply. For example, it can call a weather API to get today’s forecast or a payment API to charge a customer. Each request has a method like GET or POST, a URL, and often a small block of JSON with needed details. The service answers with another JSON block that the agent reads and uses. Because API requests are fast and clear, they are a common tool for connecting the agent to many other systems without extra work. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md b/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md index a7742a3e3..faaa242dc 100644 --- a/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md +++ b/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md @@ -1 +1,3 @@ -# AutoGen \ No newline at end of file +# AutoGen + +AutoGen is an open-source Python framework that helps you build AI agents without starting from scratch. It lets you define each agent with a role, goals, and tools, then handles the chat flow between them and a large language model such as GPT-4. You can chain several agents so they plan, code, review, and run tasks together. The library includes ready-made modules for memory, task planning, tool calling, and function execution, so you only write the parts that are unique to your app. AutoGen connects to OpenAI, Azure, or local models through a simple settings file. Logs, cost tracking, and step-by-step debugging come built in, which makes testing easy. Because the agents are plain Python objects, you can mix them with other libraries or your own code. AutoGen is still young, so expect fast changes and keep an eye on usage costs, but it is a strong choice when you want to turn a prompt into a working multi-agent system in hours instead of weeks. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md b/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md index 2bfe3d43b..1b23a55ad 100644 --- a/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md +++ b/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md @@ -1 +1,3 @@ -# Be specific in what you want \ No newline at end of file +# Be specific in what you want + +When you ask an AI to do something, clear and exact words help it give the answer you want. State the goal, the format, and any limits up front. Say who the answer is for, how long it should be, and what to leave out. If numbers, dates, or sources matter, name them. For example, rather than “Explain World War II,” try “List three key events of World War II with dates and one short fact for each.” Being this precise cuts down on guesswork, avoids unwanted extra detail, and saves time by reducing follow-up questions. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md b/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md index 297eedf1c..a0375e5b3 100644 --- a/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md +++ b/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md @@ -1 +1,3 @@ -# Bias & Toxicity Guardrails \ No newline at end of file +# Bias & Toxicity Guardrails + +Bias and toxicity guardrails keep an AI agent from giving unfair or harmful results. Bias shows up when training data favors certain groups or views. Toxicity is language that is hateful, violent, or rude. To stop this, start with clean and balanced data. Remove slurs, stereotypes, and spam. Add examples from many voices so the model learns fair patterns. During training, test the model often and adjust weights or rules that lean one way. After training, put filters in place that block toxic words or flag unfair answers before users see them. Keep logs, run audits, and ask users for feedback to catch new issues early. Write down every step so builders and users know the limits and risks. These actions protect people, follow laws, and help users trust the AI. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md b/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md index 68d987ff7..fa6186462 100644 --- a/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md +++ b/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md @@ -1 +1,3 @@ -# Chain of Thought (CoT) \ No newline at end of file +# Chain of Thought (CoT) + +Chain of Thought (CoT) is a way for an AI agent to think out loud. Before giving its final answer, the agent writes short notes that show each step it takes. These notes can list facts, name sub-tasks, or do small bits of math. By seeing the steps, the agent stays organized and is less likely to make a mistake. People who read the answer can also check the logic and spot any weak points. The same written steps can be fed back into the agent so it can plan, reflect, or fix itself. Because it is easy to use and boosts trust, CoT is one of the most common designs for language-based agents today. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md b/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md index 7cc765826..db58573c2 100644 --- a/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md +++ b/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md @@ -1 +1,3 @@ -# Closed Weight Models \ No newline at end of file +# Closed Weight Models + +Closed-weight models are AI systems whose trained parameters—the numbers that hold what the model has learned—are not shared with the public. You can send prompts to these models through an online service or a software kit, but you cannot download the weights, inspect them, or fine-tune them on your own computer. The company that owns the model keeps control and sets the rules for use, often through paid APIs or tight licences. This approach helps the owner protect trade secrets, reduce misuse, and keep a steady income stream. The downside is less freedom for users, higher costs over time, and limited ability to audit or adapt the model. Well-known examples include GPT-4, Claude, and Gemini. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md b/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md index 8c0d76a84..0b7490fa1 100644 --- a/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md +++ b/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md @@ -1 +1,3 @@ -# Code Execution / REPL \ No newline at end of file +# Code Execution / REPL + +Code Execution or REPL (Read-Eval-Print Loop) lets an AI agent run small pieces of code on demand, see the result right away, and use that result to decide what to do next. The agent “reads” the code, “evaluates” it in a safe sandbox, “prints” the output, and then loops back for more input. With this tool the agent can test ideas, perform math, transform text, call APIs, or inspect data without waiting for a full build or deployment. Python, JavaScript, or even shell commands are common choices because they start fast and have many libraries. Quick feedback helps the agent catch errors early and refine its plan step by step. Sandboxing keeps the host system safe by blocking dangerous actions such as deleting files or making forbidden network calls. Overall, a Code Execution / REPL tool gives the agent a fast, flexible workbench for problem-solving. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md b/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md index f2bba2fad..e6616e83b 100644 --- a/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md +++ b/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md @@ -1 +1,3 @@ -# Code generation \ No newline at end of file +# Code generation + +Code-generation agents take a plain language request, understand the goal, and then write or edit source code to meet it. They can build small apps, add features, fix bugs, refactor old code, write tests, or translate code from one language to another. This saves time for developers, helps beginners learn, and reduces human error. Teams use these agents inside code editors, chat tools, and automated pipelines. By handling routine coding tasks, the agents free people to focus on design, logic, and user needs. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md b/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md index 009b65065..f0f99c74f 100644 --- a/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md +++ b/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md @@ -1 +1,3 @@ -# Context Windows \ No newline at end of file +# Context Windows + +A context window is the chunk of text a large language model can read at one time. It is measured in tokens, which are pieces of words. If a model has a 4,000-token window, it can only “look at” up to about 3,000 words before it must forget or shorten earlier parts. New tokens push old ones out, like a sliding window moving over text. The window size sets hard limits on how long a prompt, chat history, or document can be. A small window forces you to keep inputs short or split them, while a large window lets the model follow longer stories and hold more facts. Choosing the right window size balances cost, speed, and how much detail the model can keep in mind at once. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md b/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md index 4c6585f05..e73de78e7 100644 --- a/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md +++ b/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md @@ -1 +1,3 @@ -# Creating MCP Servers \ No newline at end of file +# Creating MCP Servers + +Creating an MCP server means building a program that stores and shares conversation data for AI agents using the Model Context Protocol. Start by choosing a language and web framework, then set up REST endpoints such as /messages, /state, and /health. Each endpoint sends or receives JSON that follows the MCP schema. Use a database or an in-memory store to keep session logs, and tag every entry with a session ID, role, and timestamp. Add token-based authentication so only trusted agents can read or write. Include filters and range queries so an agent can ask for just the parts of the log it needs. Limit message size and request rate to avoid overload. Finish by writing unit tests, adding monitoring, and running load checks to be sure the server stays reliable as traffic grows. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md b/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md index 8de047ee0..7890a8a88 100644 --- a/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md +++ b/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md @@ -1 +1,3 @@ -# CrewAI \ No newline at end of file +# CrewAI + +CrewAI is an open-source Python framework that lets you join several language-model agents into one team, called a crew. Each agent gets a name, a role, and a set of skills, and the library handles planning, task routing, and chat among them. To use it, you install the package, import it, define your agents in a few lines of code, link them with a Crew object, and give the crew a mission prompt. CrewAI then talks to an LLM such as OpenAI GPT-4 or Claude, passes messages between agents, runs any tools you attach, and returns a single answer. You can plug in web search, Python functions, or vector stores for memory, and you can tune settings like temperature or max tokens. Built-in logs show every step so you can debug and improve the workflow. The result is a fast way to build multi-step agent systems for tasks like research, code review, or content creation without writing a lot of low-level glue code. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md b/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md index a6b0cd625..9e75edefe 100644 --- a/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md +++ b/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md @@ -1 +1,3 @@ -# DAG Agents \ No newline at end of file +# DAG Agents + +A DAG (Directed Acyclic Graph) agent is built from many small parts, called nodes, that form a one-way graph with no loops. Each node does a clear task, then passes its result to the next node along a directed edge. Because the graph has no cycles, data always moves forward and never gets stuck in endless repeats. This makes the flow of work easy to follow and test. The layout lets you run nodes that do not depend on each other at the same time, so the agent can work faster. If one node fails, you can see the exact path it took and fix just that part. DAG agents work well for jobs like data cleaning, multi-step reasoning, or any long chain of steps where order matters and backtracking is not needed. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md b/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md index 016f60dfd..bb7000ba4 100644 --- a/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md +++ b/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md @@ -1 +1,3 @@ -# Data analysis \ No newline at end of file +# Data analysis + +AI agents can automate many steps of data analysis. They pull data from files, databases, or live streams and put it into a tidy shape. They spot missing entries, flag odd numbers, and fill gaps with smart guesses. Once the data is clean, the agent looks for patterns, such as spikes in sales or drops in sensor readings. It can build simple charts or full dashboards, saving hours of manual work. Some agents run basic statistics, while others use machine learning to forecast next week’s demand. They also send alerts if the numbers move outside set limits. This keeps people informed without constant checking. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md b/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md index bd821e1ae..66a02f4a7 100644 --- a/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md +++ b/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md @@ -1 +1,3 @@ -# Data Privacy + PII Redaction \ No newline at end of file +# Data Privacy + PII Redaction + +AI agents often handle user text, images, and logs that carry personal data such as names, phone numbers, addresses, or ID numbers. If this data leaks, people may face fraud, stalking, or other harm. Privacy laws like GDPR and CCPA require teams to keep such data safe and to use it only for clear, lawful reasons. A key safeguard is PII redaction: the system scans each input and output, finds any detail that can identify a person, and masks or deletes it before storage or sharing. Redaction methods include simple pattern rules, machine-learning models, or a mix of both. Keep audit trails, set strong access limits, and test the redaction flow often to be sure no private detail slips through. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md b/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md index 83628923a..0a5830cd3 100644 --- a/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md +++ b/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md @@ -1 +1,3 @@ -# Database Queries \ No newline at end of file +# Database Queries + +Database queries let an AI agent fetch, add, change, or remove data stored in a database. The agent sends a request written in a query language, most often SQL. The database engine then looks through its tables and returns only the rows and columns that match the rules in the request. With this tool, the agent can answer questions that need up-to-date numbers, user records, or other stored facts. It can also write new entries or adjust old ones to keep the data current. Because queries work in real time and follow clear rules, they give the agent a reliable way to handle large sets of structured information. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md b/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md index aac6479d3..e0df4d6cf 100644 --- a/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md +++ b/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md @@ -1 +1,3 @@ -# DeepEval \ No newline at end of file +# DeepEval + +DeepEval is an open-source tool that helps you test and score the answers your AI agent gives. You write small test cases that show an input and the reply you hope to get, or a rule the reply must follow. DeepEval runs the agent, checks the reply with built-in measures such as similarity, accuracy, or safety, and then marks each test as pass or fail. You can add your own checks, store tests in code or YAML files, and run them in a CI pipeline so every new model or prompt version gets the same quick audit. The fast feedback makes it easy to spot errors, cut down on hallucinations, and compare different models before you ship. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md b/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md index 6c76714cd..68d069499 100644 --- a/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md +++ b/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md @@ -1 +1,3 @@ -# Email / Slack / SMS \ No newline at end of file +# Email / Slack / SMS + +Email, Slack, and SMS are message channels an AI agent can use to act on tasks and share updates. The agent writes and sends emails to give detailed reports or collect files. It posts to Slack to chat with a team, answer questions, or trigger alerts inside a workspace. It sends SMS texts for quick notices such as reminders, confirmations, or warnings when a fast response is needed. By picking the right channel, the agent reaches users where they already communicate, makes sure important information arrives on time, and can even gather replies to keep a task moving forward. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md b/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md index 6993d7e34..2aa8b7db4 100644 --- a/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md +++ b/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md @@ -1 +1,3 @@ -# Embeddings and Vector Search \ No newline at end of file +# Embeddings and Vector Search + +Embeddings turn words, pictures, or other data into lists of numbers called vectors. Each vector keeps the meaning of the original item. Things with similar meaning get vectors that sit close together in this number space. Vector search scans a large set of vectors and finds the ones nearest to a query vector, even if the exact words differ. This lets AI agents match questions with answers, suggest related items, and link ideas quickly. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md index ce7928f4a..23445215f 100644 --- a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md +++ b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md @@ -1 +1,3 @@ -# Episodic vs Semantic Memory \ No newline at end of file +# Episodic vs Semantic Memory + +Agent memory often has two parts. Episodic memory stores single events. It keeps data about what happened, when it happened, and who or what was involved. This lets the agent recall a past step-by-step experience, like a diary entry. Semantic memory stores facts that stay the same across time. It holds rules, concepts, and meanings, like the statement “Paris is the capital of France.” The key difference is time and context: episodic memory is tied to a specific moment, while semantic memory is timeless knowledge. Together they help the agent both remember past actions and use general truths to plan new ones. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md b/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md index 07c379543..9cca53487 100644 --- a/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md +++ b/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md @@ -1 +1,3 @@ -# File System Access \ No newline at end of file +# File System Access + +File system access lets an AI agent read, create, change, or delete files and folders on a computer or server. With this power, the agent can open a text file to pull data, write a new report, save logs, or tidy up old files without human help. It can also move files between folders to keep things organised. This tool is useful for tasks such as data processing, report generation, and backup jobs. Strong safety checks are needed so the agent touches only the right files, avoids private data, and cannot harm the system by mistake. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md b/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md index 564be4eeb..83831a911 100644 --- a/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md +++ b/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md @@ -1 +1,3 @@ -# Fine-tuning vs Prompt Engineering \ No newline at end of file +# Fine-tuning vs Prompt Engineering + +Fine-tuning and prompt engineering are two ways to get better answers from a large language model. Fine-tuning means you take an existing model and train it more on your own examples so it adapts to a narrow task. You need extra data, computer power, and time, but the model then learns the style and facts you want. Prompt engineering means you leave the model as it is and adjust the words you send to it. You give clear instructions, show examples, or set rules inside the prompt so the model follows them right away. This is faster, cheaper, and safer if you have no special data. Fine-tuning is best when you need deep knowledge of a field or a fixed voice across many calls. Prompt engineering is enough when you want quick control, small changes, or are still testing ideas. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md b/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md index cfbe792e0..c3e0c2dc8 100644 --- a/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md +++ b/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md @@ -1 +1,3 @@ -# Forgetting / Aging Strategies \ No newline at end of file +# Forgetting / Aging Strategies + +Forgetting or aging strategies help an AI agent keep only the useful parts of its memory and drop the rest over time. The agent may tag each memory with a time stamp and lower its importance as it gets older, or it may remove items that have not been used for a while, much like a “least-recently-used” list. Some systems give each memory a relevance score; when space runs low, they erase the lowest-scoring items first. Others keep a fixed-length sliding window of the most recent events or create short summaries and store those instead of raw details. These methods stop the memory store from growing without limits, cut storage costs, and let the agent focus on current goals. Choosing the right mix of aging rules is a trade-off: forget too fast and the agent loses context, forget too slow and it wastes resources or reacts to outdated facts. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md b/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md index 149b0e10f..34f71ee9b 100644 --- a/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md +++ b/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md @@ -1 +1,3 @@ -# Frequency Penalty \ No newline at end of file +# Frequency Penalty + +Frequency penalty is a setting that tells a language model, “Stop repeating yourself.” As the model writes, it keeps track of how many times it has already used each word. A positive frequency-penalty value lowers the chance of picking a word again if it has been seen many times in the current reply. This helps cut down on loops like “very very very” or long blocks that echo the same phrase. A value of 0 turns the rule off, while higher numbers make the model avoid repeats more strongly. If the penalty is too high, the text may miss common words that are still needed, so you often start low (for example 0.2) and adjust. Frequency penalty works together with other controls such as temperature and top-p to shape output that is clear, varied, and not boring. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md b/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md index f980fde9d..67afa78e5 100644 --- a/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md +++ b/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md @@ -1 +1,3 @@ -# Gemini Function Calling \ No newline at end of file +# Gemini Function Calling + +Gemini function calling lets you hook the Gemini language model to real code in a safe and simple way. You first list the functions you want it to use, each with a name, a short note about what it does, and a JSON schema for the needed arguments. When the user speaks, Gemini checks this list and, if a match makes sense, answers with a tiny JSON block that holds the chosen function name and the filled-in arguments. Your program then runs that function, sends the result back, and the chat moves on. Because the reply is strict JSON and not free text, you do not have to guess at what the model means, and you avoid many errors. This flow lets you build agents that pull data, call APIs, or carry out long action chains while keeping control of business logic on your side. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md b/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md index b6971bbe8..f61d46cbe 100644 --- a/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md +++ b/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md @@ -1 +1,3 @@ -# Haystack \ No newline at end of file +# Haystack + +Haystack is an open-source Python framework that helps you build search and question-answering agents fast. You connect your data sources, pick a language model, and set up pipelines that find the best answer to a user’s query. Haystack handles tasks such as indexing documents, retrieving passages, running the model, and ranking results. It works with many back-ends like Elasticsearch, OpenSearch, FAISS, and Pinecone, so you can scale from a laptop to a cluster. You can add features like summarization, translation, and document chat by dropping extra nodes into the pipeline. The framework also offers REST APIs, a web UI, and clear tutorials, making it easy to test and deploy your agent in production. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md b/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md index 22c83b2e9..66e2352ce 100644 --- a/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md +++ b/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md @@ -1 +1,3 @@ -# Helicone \ No newline at end of file +# Helicone + +Helicone is an open-source tool that helps you watch and understand how your AI agents talk to large language models. You send your model calls through Helicone’s proxy, and it records each request and response without changing the result. A clear web dashboard then shows logs, latency, token counts, error rates, and cost for every call. You can filter, search, and trace a single user journey, which makes it easy to spot slow prompts or rising costs. Helicone also lets you set alerts and share traces with your team, so problems get fixed fast and future changes are safer. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md b/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md index fe859e6a5..2c6503c02 100644 --- a/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md +++ b/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md @@ -1 +1,3 @@ -# Human in the Loop Evaluation \ No newline at end of file +# Human in the Loop Evaluation + +Human-in-the-loop evaluation checks an AI agent by letting real people judge its output and behavior. Instead of trusting only automated scores, testers invite users, domain experts, or crowd workers to watch tasks, label answers, flag errors, and rate clarity, fairness, or safety. Their feedback shows problems that numbers alone miss, such as hidden bias, confusing language, or actions that feel wrong to a person. Teams study these notes, adjust the model, and run another round, repeating until the agent meets quality and trust goals. Mixing human judgment with data leads to a system that is more accurate, useful, and safe for everyday use. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md b/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md index 2a4ebc26f..d6f5b7cf5 100644 --- a/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md +++ b/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md @@ -1 +1,3 @@ -# Integration Testing for Flows \ No newline at end of file +# Integration Testing for Flows + +Integration testing for flows checks that an AI agent works well from the first user input to the final action, across every step in between. It joins all parts of the system—natural-language understanding, planning, memory, tools, and output—and runs them together in real scenarios. Test cases follow common and edge-case paths a user might take. The goal is to catch errors that only appear when parts interact, such as wrong data passed between modules or timing issues. Good practice includes building automated test suites, using real or mock services, and logging each step for easy debugging. When integration tests pass, you gain confidence that the whole flow feels smooth and reliable for users. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md b/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md index 2dcbb28d5..82e1e1ab7 100644 --- a/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md +++ b/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md @@ -1 +1,3 @@ -# Iterate and Test your Prompts \ No newline at end of file +# Iterate and Test your Prompts + +After you write a first prompt, treat it as a draft, not the final version. Run it with the AI, check the output, and note what is missing, wrong, or confusing. Change one thing at a time, such as adding an example, a limit on length, or a tone request. Test again and see if the result gets closer to what you want. Keep a record of each change and its effect, so you can learn patterns that work. Stop when the output is clear, correct, and repeatable. This loop of try, observe, adjust, and retry turns a rough prompt into a strong one. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md b/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md index 3aa93dd39..c2bca1885 100644 --- a/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md +++ b/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md @@ -1 +1,3 @@ -# Langchain \ No newline at end of file +# Langchain + +LangChain is a Python and JavaScript library that helps you put large language models to work in real products. It gives ready-made parts for common agent tasks such as talking to many tools, keeping short-term memory, and calling an external API when the model needs fresh data. You combine these parts like Lego blocks: pick a model, add a prompt template, chain the steps, then wrap the chain in an “agent” that can choose what step to run next. Built-in connectors link to OpenAI, Hugging Face, vector stores, and SQL databases, so you can search documents or pull company data without writing a lot of glue code. This lets you move fast from idea to working bot, while still letting you swap out parts if your needs change. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md b/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md index 8ba270de5..b0924dba9 100644 --- a/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md +++ b/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md @@ -1 +1,3 @@ -# LangFuse \ No newline at end of file +# LangFuse + +LangFuse is a free, open-source tool that lets you watch and debug AI agents while they run. You add a small code snippet to your agent, and LangFuse starts collecting every prompt, model response, and user input. It shows this data as neat timelines, so you can see each step the agent takes, how long the calls cost, and where errors happen. You can tag runs, search through them, and compare different prompt versions to find what works best. The dashboard also tracks token usage and latency, helping you cut cost and improve speed. Because LangFuse stores data in your own database, you keep full control of sensitive text. It works well with popular frameworks like LangChain and can send alerts to Slack or email when something breaks. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md b/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md index 76e9ffd46..661e31227 100644 --- a/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md +++ b/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md @@ -1 +1,3 @@ -# LangSmith \ No newline at end of file +# LangSmith + +LangSmith is a web tool that helps you see and fix what your AI agents are doing. It records each call that the agent makes to a language model, the input it used, and the answer it got back. You can replay any step, compare different prompts, measure cost, speed, and error rates, and tag runs for easy search. It also lets you store test sets and run quick checks so you know if new code makes the agent worse. By showing clear traces and charts, LangSmith makes it easier to debug, improve, and trust AI systems built with LangChain or other frameworks. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md b/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md index 76e9ffd46..08eb10efd 100644 --- a/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md +++ b/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md @@ -1 +1,3 @@ -# LangSmith \ No newline at end of file +# LangSmith + +LangSmith is a tool that helps you see how well your AI agents work. It lets you record every step the agent takes, from the first input to the final answer. You can replay these steps to find places where the agent goes wrong. LangSmith also lets you create test sets with real user prompts and compare new model versions against them. It shows clear numbers on speed, cost, and accuracy so you can spot trade-offs. Because LangSmith links to LangChain, you can add it with only a few extra lines of code. The web dashboard then gives charts, error logs, and side-by-side result views. This makes it easy to track progress, fix bugs, and prove that your agent is getting better over time. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md b/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md index 2d0ce88b4..c5f656961 100644 --- a/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md +++ b/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md @@ -1 +1,3 @@ -# LlamaIndex \ No newline at end of file +# LlamaIndex + +LlamaIndex is an open-source Python toolkit that helps you give a language model access to your own data. You load files such as PDFs, web pages, or database rows. The toolkit breaks the text into chunks, turns them into vectors, and stores them in a chosen vector store like FAISS or Pinecone. When a user asks a question, LlamaIndex finds the best chunks, adds them to the prompt, and sends the prompt to the model. This flow is called retrieval-augmented generation and it lets an agent give answers grounded in your content. The library offers simple classes for loading, indexing, querying, and composing tools, so you write less boilerplate code. It also works with other frameworks, including LangChain, and supports models from OpenAI or Hugging Face. With a few lines of code you can build a chatbot, Q&A system, or other agent that knows your documents. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md b/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md index a43c5ef54..4c381ced7 100644 --- a/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md +++ b/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md @@ -1 +1,3 @@ -# LLM Native "Function Calling" \ No newline at end of file +# LLM Native "Function Calling" + +LLM native “function calling” lets a large language model decide when to run a piece of code and which inputs to pass to it. You first tell the model what functions are available. For each one you give a short name, a short description, and a list of arguments with their types. During a chat, the model can answer in JSON that matches this schema instead of plain text. Your wrapper program reads the JSON, calls the real function, and then feeds the result back to the model so it can keep going. This loop helps an agent search the web, look up data, send an email, or do any other task you expose. Because the output is structured, you get fewer mistakes than when the model tries to write raw code or natural-language commands. You also keep tight control over what the agent can and cannot do. Most current API providers support this method, so you can add new tools by only editing the schema and a handler, not the model itself. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md b/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md index 25e2abe66..d6d4acb7d 100644 --- a/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md +++ b/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md @@ -1 +1,3 @@ -# Local Desktop \ No newline at end of file +# Local Desktop + +A Local Desktop deployment means you run the MCP server on your own computer instead of on a remote machine or cloud service. You install the MCP software, any language runtimes it needs, and the model files all on your desktop or laptop. When you start the server, it listens on a port such as 127.0.0.1:8000, which is only reachable from the same computer unless you change network settings. This setup is handy for quick tests, small demos, or private work because you control the files and can restart the server at any time. It also avoids extra cost from cloud hosting. The main limits are the power of your hardware and the fact that other people cannot reach the service unless you expose it through port forwarding or a tunnel. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md b/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md index a193bf779..59cd404b9 100644 --- a/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md +++ b/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md @@ -1 +1,3 @@ -# Long Term Memory \ No newline at end of file +# Long Term Memory + +Long term memory in an AI agent is the part of its storage where information is kept for long periods so it can be used again in the future. It works like a notebook that the agent can write to and read from whenever needed. The agent saves facts, past events, user preferences, and learned skills in this space. When a similar event happens later, the agent looks up this stored data to make better choices and respond in a consistent way. Long term memory lets the agent grow smarter over time because it does not forget important details after the current task ends. This memory usually lives in a database or file system and may include text, numbers, or compressed states of past conversations. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md b/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md index effe78063..275537904 100644 --- a/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md +++ b/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md @@ -1 +1,3 @@ -# Manual (from scratch) \ No newline at end of file +# Manual (from scratch) + +Building an AI agent from scratch means you write every part of the system yourself instead of using ready-made tools. You decide how the agent senses the world, saves data, learns, and makes choices. First, you choose a goal, like playing a game or answering questions. Then you design the inputs, for example keyboard moves or text. You code the logic that turns these inputs into actions. You may add a learning part, such as a basic neural network or a set of rules that update over time. You also build memory so the agent can use past facts. Testing is key: run the agent, watch what it does, and fix mistakes. This path is slow and hard, but it teaches you how each piece works and gives you full control. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md b/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md index 2c0953c76..e6fd28cda 100644 --- a/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md +++ b/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md @@ -1 +1,3 @@ -# Max Length \ No newline at end of file +# Max Length + +Max Length is the setting that tells a language model the biggest number of tokens it may write in one go. A token is a small piece of text, usually a short word or part of a word, so 100 tokens roughly equals a short paragraph. When the model reaches the limit, it stops and returns the answer. A small limit keeps replies short, saves money, and runs fast, but it can cut ideas in half. A large limit lets the model finish long thoughts, yet it needs more time, more processing power, and can wander off topic. Choose the value to fit the job: a tweet might need 50 tokens, a long guide might need 1,000 or more. Good tuning finds a balance between cost, speed, and clear, complete answers. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md b/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md index 22ca27011..c44750170 100644 --- a/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md +++ b/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md @@ -1 +1,3 @@ -# MCP Client \ No newline at end of file +# MCP Client + +The MCP Client is the part of an AI agent that talks directly to the large-language-model service. It gathers all messages, files, and tool signals that make up the current working state, packs them into the format defined by the Model Context Protocol, and sends the bundle to the model’s API. After the model answers, the client unpacks the reply, checks that it follows protocol rules, and hands the result to other modules, such as planners or tool runners. It also tracks tokens, applies privacy filters, retries on network errors, and logs key events for debugging. In short, the MCP Client is the gateway that turns local agent data into a valid model request and turns the model’s response into something the rest of the system can use. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md b/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md index 1d82263af..aa0ab9d05 100644 --- a/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md +++ b/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md @@ -1 +1,3 @@ -# MCP Hosts \ No newline at end of file +# MCP Hosts + +MCP Hosts are the computers or cloud services that run the Model Context Protocol. They keep the protocol code alive, listen for incoming calls, and pass data between users, tools, and language models. A host loads the MCP manifest, checks that requests follow the rules, and stores any state that needs to last between calls. It may cache recent messages, track token use, and add safety or billing checks before it forwards a prompt to the model. Hosts also expose an API endpoint so that outside apps can connect without knowing the low-level details of the protocol. You can run a host on your own laptop for testing or deploy it on a serverless platform for scale; either way, it provides the same trusted place where MCP agents, tools, and data meet. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md b/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md index 9bb5902b3..9ef0c0db1 100644 --- a/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md +++ b/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md @@ -1 +1,3 @@ -# MCP Servers \ No newline at end of file +# MCP Servers + +An MCP Server is the main machine or cloud service that runs the Model Context Protocol. It keeps the shared “memory” that different AI agents need so they stay on the same page. When an agent sends a request, the server checks who is asking, pulls the right context from its store, and sends it back fast. It also saves new facts and task results so the next agent can use them. An MCP Server must handle many users at once, protect private data with strict access rules, and log every change for easy roll-back. Good servers break work into small tasks, spread them across many computers, and add backups so they never lose data. In short, the MCP Server is the hub that makes sure all agents share fresh, safe, and correct context. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md b/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md index 7d6290b72..5985b117e 100644 --- a/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md +++ b/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md @@ -1 +1,3 @@ -# Metrics to Track \ No newline at end of file +# Metrics to Track + +To know if an AI agent works well, you need numbers that tell the story. Track accuracy, precision, recall, and F1 score to see how often the agent is right. For ranking tasks, record mean average precision or ROC-AUC. If users interact with the agent, measure response time, latency, and the share of failed requests. Safety metrics count toxic or biased outputs, while robustness tests see how the agent copes with noisy or tricky inputs. Resource metrics—memory, CPU, and energy—show if the system can run at scale. Choose the metrics that fit the task, compare results to a baseline, and watch the trend with every new version. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md b/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md index a95967a97..6eec69a0b 100644 --- a/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md +++ b/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md @@ -1 +1,3 @@ -# Model Context Protocol (MCP) \ No newline at end of file +# Model Context Protocol (MCP) + +Model Context Protocol (MCP) is a rulebook that tells an AI agent how to pack background information before it sends a prompt to a language model. It lists what pieces go into the prompt—things like the system role, the user’s request, past memory, tool calls, or code snippets—and fixes their order. Clear tags mark each piece, so both humans and machines can see where one part ends and the next begins. Keeping the format steady cuts confusion, lets different tools work together, and makes it easier to test or swap models later. When agents follow MCP, the model gets a clean, complete prompt and can give better answers. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md b/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md index 977777dea..d5cab7215 100644 --- a/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md +++ b/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md @@ -1 +1,3 @@ -# NPC / Game AI \ No newline at end of file +# NPC / Game AI + +Game studios often use AI agents to control non-player characters (NPCs). The agent watches the game state and picks actions such as moving, speaking, or fighting. It can switch tactics when the player changes strategy, so battles feel fresh instead of scripted. A quest giver can also use an agent to offer hints that fit the player’s progress. In open-world games, agents help crowds walk around objects, pick new goals, and react to danger, which makes towns feel alive. Designers save time because they write broad rules and let the agent fill in details instead of hand-coding every scene. Better NPC behavior keeps players engaged and raises replay value. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md b/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md index 08248bff9..eb73b0304 100644 --- a/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md +++ b/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md @@ -1 +1,3 @@ -# Observation & Reflection \ No newline at end of file +# Observation & Reflection + +Observation and reflection form the thinking pause in an AI agent’s loop. First, the agent looks at the world around it, gathers fresh data, and sees what has changed. It then pauses to ask, “What does this new information mean for my goal?” During this short check, the agent updates its memory, spots errors, and ranks what matters most. These steps guide wiser plans and actions in the next cycle. Without careful observation and reflection, the agent would rely on old or wrong facts and soon drift off course. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md b/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md index eac06f19a..3a9bc2f54 100644 --- a/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md +++ b/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md @@ -1 +1,3 @@ -# Open Weight Models \ No newline at end of file +# Open Weight Models + +Open-weight models are neural networks whose trained parameters, also called weights, are shared with everyone. Anyone can download the files, run the model, fine-tune it, or build tools on top of it. The licence that comes with the model spells out what you are allowed to do. Some licences are very permissive and even let you use the model for commercial work. Others allow only research or personal projects. Because the weights are public, the community can inspect how the model works, check for bias, and suggest fixes. Open weights also lower costs, since teams do not have to train a large model from scratch. Well-known examples include BLOOM, Falcon, and Llama 2. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md b/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md index 83443b90f..d6586b31d 100644 --- a/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md +++ b/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md @@ -1 +1,3 @@ -# OpenAI Assistant API \ No newline at end of file +# OpenAI Assistant API + +The OpenAI Assistants API lets you add clear, task-specific actions to a chat with a large language model. You first describe each action you want the model to use, giving it a name, a short purpose, and a list of inputs in JSON form. During the chat, the model may decide that one of these actions will help. It then returns the name of the action and a JSON object with the input values it thinks are right. Your code receives this call, runs real work such as a database query or a web request, and sends the result back to the model. The model reads the result and continues the chat, now armed with fresh facts. This loop lets you keep control of what real work happens while still letting the model plan and talk in natural language. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md b/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md index 09219bcff..24e547cc5 100644 --- a/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md +++ b/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md @@ -1 +1,3 @@ -# OpenAI Functions Calling \ No newline at end of file +# OpenAI Functions Calling + +OpenAI Function Calling lets you give a language model a list of tools and have it decide which one to use and with what data. You describe each tool with a short name, what it does, and the shape of its inputs in a small JSON-like schema. You then pass the user message and this tool list to the model. Instead of normal text, the model can reply with a JSON block that names the tool and fills in the needed arguments. Your program reads this block, runs the real function, and can send the result back for the next step. This pattern makes agent actions clear, easy to parse, and hard to abuse, because the model cannot run code on its own and all calls go through your checks. It also cuts down on prompt hacks and wrong formats, so agents work faster and more safely. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md b/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md index 23966492c..6914fbd8b 100644 --- a/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md +++ b/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md @@ -1 +1,3 @@ -# openllmetry \ No newline at end of file +# openllmetry + +openllmetry is a small Python library that makes it easy to watch what your AI agent is doing and how well it is working. It wraps calls to large-language-model APIs, vector stores, and other tools, then sends logs, traces, and simple metrics to any backend that speaks the OpenTelemetry standard, such as Jaeger, Zipkin, or Grafana. You add one or two lines of code at start-up, and the library captures prompt text, model name, latency, token counts, and costs each time the agent asks the model for an answer. The data helps you spot slow steps, high spend, or bad answers, and it lets you play back full traces to debug agent chains. Because it follows OpenTelemetry, you can mix these AI traces with normal service traces and see the whole flow in one place. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md b/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md index 745fc4236..cf3028029 100644 --- a/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md +++ b/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md @@ -1 +1,3 @@ -# Perception / User Input \ No newline at end of file +# Perception / User Input + +Perception, also called user input, is the first step in an agent loop. The agent listens and gathers data from the outside world. This data can be text typed by a user, spoken words, camera images, sensor readings, or web content pulled through an API. The goal is to turn raw signals into a clear, usable form. The agent may clean the text, translate speech to text, resize an image, or drop noise from sensor values. Good perception means the agent starts its loop with facts, not guesses. If the input is wrong or unclear, later steps will also fail. So careful handling of perception keeps the whole agent loop on track. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md b/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md index 3652bc896..85fc11790 100644 --- a/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md +++ b/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md @@ -1 +1,3 @@ -# Personal assistant \ No newline at end of file +# Personal assistant + +A personal assistant AI agent is a smart program that helps one person manage daily tasks. It can check a calendar, set reminders, and send alerts so you never miss a meeting. It can read emails, highlight key points, and even draft quick replies. If you ask a question, it searches trusted sources and gives a short answer. It can order food, book rides, or shop online when you give simple voice or text commands. Because it learns your habits, it suggests the best time to work, rest, or travel. All these actions run in the background, saving you time and reducing stress. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md b/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md index c67e67518..39dadfdde 100644 --- a/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md +++ b/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md @@ -1 +1,3 @@ -# Planner Executor \ No newline at end of file +# Planner Executor + +A planner-executor agent splits its work into two clear parts. First, the planner thinks ahead. It looks at a goal, lists the steps needed, and puts them in the best order. Second, the executor acts. It takes each planned step and carries it out, checking results as it goes. If something fails or the world changes, the planner may update the plan, and the executor follows the new steps. This divide-and-conquer style lets the agent handle big tasks without losing track of small actions. It is easy to debug, supports reuse of plans, and helps keep the agent’s behavior clear and steady. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md b/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md index 0a9e0c807..f0d3a9d19 100644 --- a/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md +++ b/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md @@ -1 +1,3 @@ -# Presence Penalty \ No newline at end of file +# Presence Penalty + +Presence penalty is a setting you can adjust when you ask a large language model to write. It pushes the model to choose words it has not used yet. Each time a word has already appeared, the model gets a small score cut for picking it again. A higher penalty gives bigger cuts, so the model looks for new words and fresh ideas. A lower penalty lets the model reuse words more often, which can help with repeats like rhymes or bullet lists. Tuning this control helps you steer the output toward either more variety or more consistency. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md b/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md index 9687c2ccc..b4ce11142 100644 --- a/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md +++ b/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md @@ -1 +1,3 @@ -# Pricing of Common Models \ No newline at end of file +# Pricing of Common Models + +When you use a large language model, you usually pay by the amount of text it reads and writes, counted in “tokens.” A token is about four characters or three-quarters of a word. Providers list a price per 1,000 tokens. For example, GPT-3.5 Turbo may cost around $0.002 per 1,000 tokens, while GPT-4 is much higher, such as $0.03 to $0.06 for prompts and $0.06 to $0.12 for replies. Smaller open-source models like Llama-2 can be free to use if you run them on your own computer, but you still pay for the hardware or cloud time. Vision or audio models often have extra fees because they use more compute. When planning costs, estimate the tokens in each call, multiply by the price, and add any hosting or storage charges. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md b/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md index 534254500..836916649 100644 --- a/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md +++ b/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md @@ -1 +1,3 @@ -# Prompt Injection / Jailbreaks \ No newline at end of file +# Prompt Injection / Jailbreaks + +Prompt injection, also called a jailbreak, is a trick that makes an AI system break its own rules. An attacker hides special words or symbols inside normal-looking text. When the AI reads this text, it follows the hidden instructions instead of its safety rules. The attacker might force the AI to reveal private data, produce harmful content, or give wrong advice. This risk grows when the AI talks to other software or pulls text from the internet, because harmful prompts can slip in without warning. Good defenses include cleaning user input, setting strong guardrails inside the model, checking outputs for policy breaks, and keeping humans in the loop for high-risk tasks. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md b/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md index 4ae863296..925c75936 100644 --- a/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md +++ b/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md @@ -1 +1,3 @@ -# Provide additional context \ No newline at end of file +# Provide additional context + +Provide additional context means giving the AI enough background facts, constraints, and goals so it can reply in the way you need. Start by naming the topic and the purpose of the answer. Add who the answer is for, the tone you want, and any limits such as length, format, or style. List key facts, data, or examples that matter to the task. This extra detail stops the model from guessing and keeps replies on target. Think of it like guiding a new teammate: share the details they need, but keep them short and clear. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md b/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md index db58daad5..577be6360 100644 --- a/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md +++ b/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md @@ -1 +1,3 @@ -# RAG Agent \ No newline at end of file +# RAG Agent + +A RAG (Retrieval-Augmented Generation) agent mixes search with language generation so it can answer questions using fresh and reliable facts. When a user sends a query, the agent first turns that query into an embedding—basically a number list that captures its meaning. It then looks up similar embeddings in a vector database that holds passages from web pages, PDFs, or other text. The best-matching passages come back as context. The agent puts the original question and those passages into a large language model. The model writes the final reply, grounding every sentence in the retrieved text. This setup keeps the model smaller, reduces wrong guesses, and lets the system update its knowledge just by adding new documents to the database. Common tools for building a RAG agent include an embedding model, a vector store like FAISS or Pinecone, and an LLM connected through a framework such as LangChain or LlamaIndex. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md b/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md index a9f30eb27..1ab108780 100644 --- a/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md +++ b/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md @@ -1 +1,3 @@ -# RAG and Vector Databases \ No newline at end of file +# RAG and Vector Databases + +RAG, short for Retrieval-Augmented Generation, lets an AI agent pull facts from stored data each time it answers. The data sits in a vector database. In that database, every text chunk is turned into a number list called a vector. Similar ideas create vectors that lie close together, so the agent can find related chunks fast. When the user asks a question, the agent turns the question into its own vector, finds the nearest chunks, and reads them. It then writes a reply that mixes the new prompt with those chunks. Because the data store can hold a lot of past chats, documents, or notes, this process gives the agent a working memory without stuffing everything into the prompt. It lowers token cost, keeps answers on topic, and allows the memory to grow over time. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md b/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md index 63db74f2a..734b4806d 100644 --- a/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md +++ b/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md @@ -1 +1,3 @@ -# Ragas \ No newline at end of file +# Ragas + +Ragas is an open-source tool used to check how well a Retrieval-Augmented Generation (RAG) agent works. You give it the user question, the passages the agent pulled from a knowledge base, and the final answer. Ragas then scores the answer for things like correctness, relevance, and whether the cited passages really support the words in the answer. It uses large language models under the hood, so you do not need to write your own scoring rules. Results appear in a clear report that shows strong and weak spots in the pipeline. With this feedback you can change prompts, retriever settings, or model choices and quickly see if quality goes up. This makes testing RAG systems faster, repeatable, and less guess-based. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md b/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md index 5c6f292b4..8bd3e54a8 100644 --- a/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md +++ b/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md @@ -1 +1,3 @@ -# ReAct (Reason + Act) \ No newline at end of file +# ReAct (Reason + Act) + +ReAct is an agent pattern that makes a model alternate between two simple steps: Reason and Act. First, the agent writes a short thought that sums up what it knows and what it should try next. Then it performs an action such as calling an API, running code, or searching a document. The result of that action is fed back, giving the agent fresh facts to think about. This loop repeats until the task is done. By showing its thoughts in plain text, the agent can be inspected, debugged, and even corrected on the fly. The clear split between thinking and doing also cuts wasted moves and guides the model toward steady progress. ReAct works well with large language models because they can both generate the chain of thoughts and choose the next tool in the very same response. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md b/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md index 7c64e9a30..888b093da 100644 --- a/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md +++ b/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md @@ -1 +1,3 @@ -# Reason and Plan \ No newline at end of file +# Reason and Plan + +Reason and Plan is the moment when an AI agent thinks before it acts. The agent starts with a goal and the facts it already knows. It looks at these facts and asks, “What do I need to do next to reach the goal?” It breaks the goal into smaller steps, checks if each step makes sense, and orders them in a clear path. The agent may also guess what could go wrong and prepare backup steps. Once the plan feels solid, the agent is ready to move on and take the first action. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md b/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md index 2939c6dd3..6e82fa024 100644 --- a/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md +++ b/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md @@ -1 +1,3 @@ -# Reasoning vs Standard Models \ No newline at end of file +# Reasoning vs Standard Models + +Reasoning models break a task into clear steps and follow a line of logic, while standard models give an answer in one quick move. A reasoning model might write down short notes, check each note, and then combine them to reach the final reply. This helps it solve math problems, plan actions, and spot errors that simple pattern matching would miss. A standard model depends on patterns it learned during training and often guesses the most likely next word. That works well for everyday chat, summaries, or common facts, but it can fail on tricky puzzles or tasks with many linked parts. Reasoning takes more time and computer power, yet it brings higher accuracy and makes the agent easier to debug because you can see its thought steps. Many new AI agents mix both styles: they use quick pattern recall for simple parts and switch to step-by-step reasoning when a goal needs deeper thought. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md b/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md index 23d72f703..504d4c618 100644 --- a/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md +++ b/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md @@ -1 +1,3 @@ -# Remote / Cloud \ No newline at end of file +# Remote / Cloud + +Remote or cloud deployment places the MCP server on a cloud provider instead of a local machine. You package the server as a container or virtual machine, choose a service like AWS, Azure, or GCP, and give it compute, storage, and a public HTTPS address. A load balancer spreads traffic, while auto-scaling adds or removes copies of the server as demand changes. You secure the endpoint with TLS, API keys, and firewalls, and you send logs and metrics to the provider’s monitoring tools. This setup lets the server handle many users, updates are easier, and you avoid local hardware limits, though you must watch costs and protect sensitive data. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md b/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md index 935a24fc9..51a9a036e 100644 --- a/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md +++ b/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md @@ -1 +1,3 @@ -# Safety + Red Team Testing \ No newline at end of file +# Safety + Red Team Testing + +Safety + Red Team Testing is the practice of checking an AI agent for harmful or risky behavior before and after release. Safety work sets rules, guardrails, and alarms so the agent follows laws, keeps data private, and treats people fairly. Red team testing sends skilled testers to act like attackers or troublemakers. They type tricky prompts, try to leak private data, force biased outputs, or cause the agent to give dangerous advice. Every weakness they find is logged and fixed by adding filters, better training data, stronger limits, or live monitoring. Running these tests often lowers the chance of real-world harm and builds trust with users and regulators. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md index c0e1c0a85..050bc0be1 100644 --- a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md +++ b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md @@ -1 +1,3 @@ -# Short Term Memory \ No newline at end of file +# Short Term Memory + +Short-term memory lets an AI agent hold recent facts while it works on a task. It keeps chat history, sensor readings, or current goals for a short time, often only for the length of one session. With this memory the agent can follow a user’s last request, track the next step in a plan, or keep variables needed for quick reasoning. Once the task ends or enough time passes, most of the stored items are cleared or moved to long-term memory. Because the data is small and brief, short-term memory is fast to read and write, which helps the agent react without delay. Common ways to build it include using a sliding window over recent messages, a small key-value store, or hidden states in a neural network. Good design of short-term memory prevents the agent from forgetting vital details too soon while avoiding overload with useless data. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md b/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md index 366716f0a..1e90dc2f1 100644 --- a/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md +++ b/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md @@ -1 +1,3 @@ -# Smol Depot \ No newline at end of file +# Smol Depot + +Smol Depot is an open-source kit that lets you bundle all the parts of a small AI agent in one place. You keep prompts, settings, and code files together in a single folder, then point the Depot tool at that folder to spin the agent up. The tool handles tasks such as loading models, saving chat history, and calling outside APIs, so you do not have to write that glue code yourself. A simple command can copy a starter template, letting you focus on the logic and prompts that make your agent special. Because everything lives in plain files, you can track changes with Git and share the agent like any other project. This makes Smol Depot a quick way to build, test, and ship lightweight agents without a heavy framework. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md b/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md index 87c0c2370..4ed5f8133 100644 --- a/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md +++ b/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md @@ -1 +1,3 @@ -# Specify Length, format etc \ No newline at end of file +# Specify Length, format etc + +When you give a task to an AI, make clear how long the answer should be and what shape it must take. Say “Write 120 words” or “Give the steps as a numbered list.” If you need a table, state the column names and order. If you want bullet points, mention that. Telling the AI to use plain text, JSON, or markdown stops guesswork and saves time. Clear limits on length keep the reply focused. A fixed format makes it easier for people or other software to read and use the result. Always put these rules near the start of your prompt so the AI sees them as important. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md b/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md index 68e9b9dfb..a2b91d715 100644 --- a/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md +++ b/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md @@ -1 +1,3 @@ -# Stopping Criteria \ No newline at end of file +# Stopping Criteria + +Stopping criteria tell the language model when to stop writing more text. Without them, the model could keep adding words forever, waste time, or spill past the point we care about. Common rules include a maximum number of tokens, a special end-of-sequence token, or a custom string such as “\n\n”. We can also stop when the answer starts to repeat or reaches a score that means it is off topic. Good stopping rules save cost, speed up replies, and avoid nonsense or unsafe content. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md b/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md index 18ab2b8bd..feed93b98 100644 --- a/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md +++ b/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md @@ -1 +1,3 @@ -# Streamed vs Unstreamed Responses \ No newline at end of file +# Streamed vs Unstreamed Responses + +Streamed and unstreamed responses describe how an AI agent sends its answer to the user. With a streamed response, the agent starts sending words as soon as it generates them. The user sees the text grow on the screen in real time. This feels fast and lets the user stop or change the request early. It is useful for long answers and chat-like apps. An unstreamed response waits until the whole answer is ready, then sends it all at once. This makes the code on the client side simpler and is easier to cache or log, but the user must wait longer, especially for big outputs. Choosing between the two depends on the need for speed, the length of the answer, and how complex you want the client and server to be. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md b/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md index 339a098ae..d07894e93 100644 --- a/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md +++ b/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md @@ -1 +1,3 @@ -# Structured logging & tracing \ No newline at end of file +# Structured logging & tracing + +Structured logging and tracing are ways to record what an AI agent does so you can find and fix problems fast. Instead of dumping plain text, the agent writes logs in a fixed key-value format, such as time, user_id, step, and message. Because every entry follows the same shape, search tools can filter, sort, and count events with ease. Tracing links those log lines into a chain that follows one request or task across many functions, threads, or microservices. By adding a unique trace ID to each step, you can see how long each part took and where errors happened. Together, structured logs and traces offer clear, machine-readable data that helps developers spot slow code paths, unusual behavior, and hidden bugs without endless manual scans. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md b/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md index fda15f230..c1e51a1c3 100644 --- a/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md +++ b/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md @@ -1 +1,3 @@ -# Summarization / Compression \ No newline at end of file +# Summarization / Compression + +Summarization or compression lets an AI agent keep the gist of past chats without saving every line. After a talk, the agent runs a small model or rule set that pulls out key facts, goals, and feelings and writes them in a short note. This note goes into long-term memory, while the full chat can be dropped or stored elsewhere. Because the note is short, the agent spends fewer tokens when it loads memory into the next prompt, so costs stay low and speed stays high. Good summaries leave out side jokes and filler but keep names, dates, open tasks, and user preferences. The agent can update the note after each session, overwriting old points that are no longer true. This process lets the agent remember what matters even after hundreds of turns. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md b/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md index 9028fe2d0..02f32a4d9 100644 --- a/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md +++ b/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md @@ -1 +1,3 @@ -# Temperature \ No newline at end of file +# Temperature + +Temperature is a setting that changes how random or predictable an AI model’s text output is. The value usually goes from 0 to 1, sometimes higher. A low temperature, close to 0, makes the model pick the most likely next word almost every time, so the answer is steady and safe but can feel dull or repetitive. A high temperature, like 0.9 or 1.0, lets the model explore less-likely word choices, which can give fresh and creative replies, but it may also add mistakes or drift off topic. By adjusting temperature, you balance reliability and creativity to fit the goal of your task. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md b/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md index 1279bd3fd..e9340aa96 100644 --- a/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md +++ b/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md @@ -1 +1,3 @@ -# Token Based Pricing \ No newline at end of file +# Token Based Pricing + +Token-based pricing is how many language-model services charge for use. A token is a small chunk of text, roughly four characters or part of a word. The service counts every token that goes into the model (your prompt) and every token that comes out (the reply). It then multiplies this total by a listed price per thousand tokens. Some plans set one price for input tokens and a higher or lower price for output tokens. Because the bill grows with each token, users often shorten prompts, trim extra words, or cap response length to spend less. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md b/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md index 2a71b6b86..e49bba972 100644 --- a/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md +++ b/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md @@ -1 +1,3 @@ -# Tokenization \ No newline at end of file +# Tokenization + +Tokenization is the step where raw text is broken into small pieces called tokens, and each token is given a unique number. A token can be a whole word, part of a word, a punctuation mark, or even a space. The list of all possible tokens is the model’s vocabulary. Once text is turned into these numbered tokens, the model can look up an embedding for each number and start its math. By working with tokens instead of full sentences, the model keeps the input size steady and can handle new or rare words by slicing them into familiar sub-pieces. After the model finishes its work, the numbered tokens are turned back into text through the same vocabulary map, letting the user read the result. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md b/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md index 5482f1dff..3ffdf9478 100644 --- a/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md +++ b/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md @@ -1 +1,3 @@ -# Tool Definition \ No newline at end of file +# Tool Definition + +A tool is any skill or function that an AI agent can call to get a job done. It can be as simple as a calculator for math or as complex as an API that fetches live weather data. Each tool has a name, a short description of what it does, and a clear list of the inputs it needs and the outputs it returns. The agent’s planner reads this definition to decide when to use the tool. Good tool definitions are precise and leave no room for doubt, so the agent will not guess or misuse them. They also set limits, like how many times a tool can be called or how much data can be pulled, which helps control cost and errors. Think of a tool definition as a recipe card the agent follows every time it needs that skill. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md b/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md index d282c8f77..415d5d734 100644 --- a/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md +++ b/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md @@ -1 +1,3 @@ -# Tool sandboxing / Permissioning \ No newline at end of file +# Tool sandboxing / Permissioning + +Tool sandboxing keeps the AI agent inside a safe zone where it can only run approved actions and cannot touch the wider system. Permissioning sets clear rules that say which files, networks, or commands the agent may use. Together they stop errors, leaks, or abuse by limiting what the agent can reach and do. Developers grant the smallest set of rights, watch activity, and block anything outside the plan. If the agent needs new access, it must ask and get a fresh permit. This simple fence protects user data, reduces harm, and builds trust in the agent’s work. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md b/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md index 1ca0feb55..3d55b7a49 100644 --- a/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md +++ b/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md @@ -1 +1,3 @@ -# Top-p \ No newline at end of file +# Top-p + +Top-p, also called nucleus sampling, is a setting that guides how an LLM picks its next word. The model lists many possible words and sorts them by probability. It then finds the smallest group of top words whose combined chance adds up to the chosen p value, such as 0.9. Only words inside this group stay in the running; the rest are dropped. The model picks one word from the kept group at random, weighted by their original chances. A lower p keeps only the very likely words, so output is safer and more focused. A higher p lets in less likely words, adding surprise and creativity but also more risk of error. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md b/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md index 63a7075df..77e3e3251 100644 --- a/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md +++ b/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md @@ -1 +1,3 @@ -# Transformer Models and LLMs \ No newline at end of file +# Transformer Models and LLMs + +Transformer models are a type of neural network that read input data—like words in a sentence—all at once instead of one piece at a time. They use “attention” to find which parts of the input matter most for each other part. This lets them learn patterns in language very well. When a transformer has been trained on a very large set of text, we call it a Large Language Model (LLM). An LLM can answer questions, write text, translate languages, and code because it has seen many examples during training. AI agents use these models as their “brains.” They feed tasks or prompts to the LLM, get back text or plans, and then act on those results. This structure helps agents understand goals, break them into steps, and adjust based on feedback, making them useful for chatbots, research helpers, and automation tools. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md b/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md index 1f79ee0e2..f56009b4b 100644 --- a/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md +++ b/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md @@ -1 +1,3 @@ -# Tree-of-Thought \ No newline at end of file +# Tree-of-Thought + +Tree-of-Thought is a way to organize an AI agent’s reasoning as a branching tree. At the root, the agent states the main problem. Each branch is a small idea, step, or guess that could lead to a solution. The agent expands the most promising branches, checks if they make sense, and prunes paths that look wrong or unhelpful. This setup helps the agent explore many possible answers while staying focused on the best ones. Because the agent can compare different branches side by side, it is less likely to get stuck on a bad line of thought. The result is more reliable and creative problem solving. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md b/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md index 1f79ee0e2..d58c69bf3 100644 --- a/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md +++ b/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md @@ -1 +1,3 @@ -# Tree-of-Thought \ No newline at end of file +# Tree-of-Thought + +Tree-of-Thought is a way to let an AI agent plan its steps like branches on a tree. The agent writes down one “thought” at a time, then splits into several follow-up thoughts, each leading to new branches. It can look ahead, compare branches, and drop weak paths while keeping strong ones. This helps the agent explore many ideas without getting stuck on the first answer. The method is useful for tasks that need careful reasoning, such as solving puzzles, coding, or writing. Because the agent can backtrack and revise earlier thoughts, it often finds better solutions than a straight, single-line chain of steps. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md b/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md index 310f35ef2..076b2f705 100644 --- a/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md +++ b/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md @@ -1 +1,3 @@ -# Understand the Basics of RAG \ No newline at end of file +# Understand the Basics of RAG + +RAG, short for Retrieval-Augmented Generation, is a way to make language models give better answers by letting them look things up before they reply. First, the system turns the user’s question into a search query and scans a knowledge source, such as a set of documents or a database. It then pulls back the most relevant passages, called “retrievals.” Next, the language model reads those passages and uses them, plus its own trained knowledge, to write the final answer. This mix of search and generation helps the model stay up to date, reduce guesswork, and cite real facts. Because it adds outside information on demand, RAG often needs less fine-tuning and can handle topics the base model never saw during training. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md b/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md index cb695cd9e..f2da7e248 100644 --- a/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md +++ b/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md @@ -1 +1,3 @@ -# Unit Testing for Individual Tools \ No newline at end of file +# Unit Testing for Individual Tools + +Unit testing checks that each tool an AI agent uses works as expected when it stands alone. You write small tests that feed the tool clear input and then compare its output to a known correct answer. If the tool is a function that parses dates, you test many date strings and see if the function gives the right results. Good tests cover normal cases, edge cases, and error cases. Run the tests every time you change the code. When a test fails, fix the tool before moving on. This habit keeps bugs from spreading into larger agent workflows and makes later debugging faster. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md b/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md index d1d334487..3fc1d4b10 100644 --- a/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md +++ b/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md @@ -1 +1,3 @@ -# Use Examples in your Prompt \ No newline at end of file +# Use Examples in your Prompt + +A clear way to guide an AI is to place one or two short samples inside your prompt. Show a small input and the exact output you expect. The AI studies these pairs and copies their pattern. Use plain words in the sample, keep the format steady, and label each part so the model knows which is which. If you need a list, show a list; if you need a table, include a small table. Good examples cut guesswork, reduce errors, and save you from writing long rules. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md b/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md index a1fcdda8b..2e9d92734 100644 --- a/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md +++ b/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md @@ -1 +1,3 @@ -# Use relevant technical terms \ No newline at end of file +# Use relevant technical terms + +When a task involves a special field such as law, medicine, or computer science, include the correct domain words in your prompt so the AI knows exactly what you mean. Ask for “O(n log n) sorting algorithms” instead of just “fast sorts,” or “HTTP status code 404” instead of “page not found error.” The right term narrows the topic, removes guesswork, and points the model toward the knowledge base you need. It also keeps the answer at the right level, because the model sees you understand the field and will reply with matching depth. Check spelling and letter case; “SQL” and “sql” are seen the same, but “Sequel” is not. Do not overload the prompt with buzzwords—add only the words that truly matter. The goal is clear language plus the exact technical labels the subject uses. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md b/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md index 2fbb5c13c..e39f7556b 100644 --- a/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md +++ b/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md @@ -1 +1,3 @@ -# User Profile Storage \ No newline at end of file +# User Profile Storage + +User profile storage is the part of an AI agent’s memory that holds stable facts about each user, such as name, age group, language, past choices, and long-term goals. The agent saves this data in a file or small database so it can load it each time the same user returns. By keeping the profile separate from short-term conversation logs, the agent can remember preferences without mixing them with temporary chat history. The profile is updated only when the user states a new lasting preference or when old information changes, which helps prevent drift or bloat. Secure storage, access controls, and encryption protect the data so that only the agent and the user can see it. Good profile storage lets the agent give answers that feel personal and consistent. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md b/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md index 0b4d87e21..70748dc1f 100644 --- a/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md +++ b/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md @@ -1 +1,3 @@ -# Web Scraping / Crawling \ No newline at end of file +# Web Scraping / Crawling + +Web scraping and crawling let an AI agent collect data from many web pages without human help. The agent sends a request to a page, reads the HTML, and pulls out parts you ask for, such as prices, news headlines, or product details. It can then follow links on the page to reach more pages and repeat the same steps. This loop builds a large, up-to-date dataset in minutes or hours instead of days. Companies use it to track market prices, researchers use it to gather facts or trends, and developers use it to feed fresh data into other AI models. Good scraping code also respects site rules like robots.txt and avoids hitting servers too fast, so it works smoothly and fairly. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md b/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md index 39a608da3..9545943d5 100644 --- a/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md +++ b/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md @@ -1 +1,3 @@ -# Web Search \ No newline at end of file +# Web Search + +Web search lets an AI agent pull fresh facts, news, and examples from the internet while it is working. The agent turns a user request into search words, sends them to a search engine, and reads the list of results. It then follows the most promising links, grabs the page text, and picks out the parts that answer the task. This helps the agent handle topics that were not in its training data, update old knowledge, or double-check details. Web search covers almost any subject and is much faster than manual research, but the agent must watch for ads, bias, or wrong pages and cross-check sources to stay accurate. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md b/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md index c219f9892..8598c6cce 100644 --- a/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md +++ b/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md @@ -1 +1,3 @@ -# What are AI Agents? \ No newline at end of file +# What are AI Agents? + +An AI agent is a computer program or robot that can sense its surroundings, think about what it senses, and then act to reach a goal. It gathers data through cameras, microphones, or software inputs, decides what the data means using rules or learned patterns, and picks the best action to move closer to its goal. After acting, it checks the results and learns from them, so it can do better next time. Chatbots, self-driving cars, and game characters are all examples. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md b/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md index 752cd311c..d7da1fd4e 100644 --- a/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md +++ b/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md @@ -1 +1,3 @@ -# What are Tools? \ No newline at end of file +# What are Tools? + +Tools are extra skills or resources that an AI agent can call on to finish a job. A tool can be anything from a web search API to a calculator, a database, or a language-translation engine. The agent sends a request to the tool, gets the result, and then uses that result to move forward. Tools let a small core model handle tasks that would be hard or slow on its own. They also help keep answers current, accurate, and grounded in real data. Choosing the right tool and knowing when to use it are key parts of building a smart agent. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md b/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md index a769fd4c3..3613feaf1 100644 --- a/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md +++ b/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md @@ -1 +1,3 @@ -# What is Agent Memory? \ No newline at end of file +# What is Agent Memory? + +Agent memory is the part of an AI agent that keeps track of what has already happened. It stores past user messages, facts the agent has learned, and its own previous steps. This helps the agent remember goals, user likes and dislikes, and important details across turns or sessions. Memory can be short-term, lasting only for one conversation, or long-term, lasting across many. With a good memory the agent avoids repeating questions, stays consistent, and plans better actions. Without it, the agent would forget everything each time and feel unfocused. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md b/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md index e361fc83d..8d5a942da 100644 --- a/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md +++ b/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md @@ -1 +1,3 @@ -# What is Prompt Engineering \ No newline at end of file +# What is Prompt Engineering + +Prompt engineering is the skill of writing clear questions or instructions so that an AI system gives the answer you want. It means choosing the right words, adding enough detail, and giving examples when needed. A good prompt tells the AI what role to play, what style to use, and what facts to include or avoid. By testing and refining the prompt, you can improve the quality, accuracy, and usefulness of the AI’s response. In short, prompt engineering is guiding the AI with well-designed text so it can help you better. \ No newline at end of file From 5ba951e555746f32f8d54fc26aaff6aee5fdc4d9 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 29 Apr 2025 23:18:44 +0100 Subject: [PATCH 20/31] Add AI Agents roadmap on get-started and roadmaps pages --- src/components/Roadmaps/RoadmapsPage.tsx | 5 +++++ src/pages/get-started.astro | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/components/Roadmaps/RoadmapsPage.tsx b/src/components/Roadmaps/RoadmapsPage.tsx index 241047b4f..1ed1d604a 100644 --- a/src/components/Roadmaps/RoadmapsPage.tsx +++ b/src/components/Roadmaps/RoadmapsPage.tsx @@ -388,6 +388,11 @@ const groups: GroupType[] = [ link: '/ai-engineer', type: 'role', }, + { + title: 'AI Agents', + link: '/ai-agents', + type: 'role', + }, { title: 'AI Red Teaming', link: '/ai-red-teaming', diff --git a/src/pages/get-started.astro b/src/pages/get-started.astro index 8555b0f88..695a1f654 100644 --- a/src/pages/get-started.astro +++ b/src/pages/get-started.astro @@ -356,6 +356,13 @@ import ChangelogBanner from '../components/ChangelogBanner.astro'; description='Learn all you need to become an AI Engineer.' /> + + Date: Tue, 29 Apr 2025 23:20:08 +0100 Subject: [PATCH 21/31] Fix height for ai-agents roadmap --- src/data/roadmaps/ai-agents/ai-agents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/roadmaps/ai-agents/ai-agents.md b/src/data/roadmaps/ai-agents/ai-agents.md index 7cd799ee7..2c98869ae 100644 --- a/src/data/roadmaps/ai-agents/ai-agents.md +++ b/src/data/roadmaps/ai-agents/ai-agents.md @@ -12,7 +12,7 @@ hasTopics: true renderer: editor dimensions: width: 968 - height: 3300 + height: 3230 schema: headline: 'AI Agents Roadmap' description: 'Learn how to design, build and ship AI agents with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.' From f8b9b589688c790681e9eb8a77ca3c4fcd649942 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 29 Apr 2025 23:37:39 +0100 Subject: [PATCH 22/31] Add content to AI Agents --- .../content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md | 4 +++- .../ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md | 5 ++++- .../content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md index d60bc731c..9b51ef51c 100644 --- a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md +++ b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md @@ -1,3 +1,5 @@ # Acting / Tool Invocation -Acting, also called tool invocation, is the step where the AI chooses a tool and runs it to get real-world data or to change something. The agent looks at its current goal and the plan it just made. It then picks the best tool, such as a web search, a database query, or a calculator. The agent fills in the needed inputs and sends the call. The external system does the heavy work and returns a result. Acting ends when the agent stores that result so it can think about the next move. \ No newline at end of file +Acting, also called tool invocation, is the step where the AI chooses a tool and runs it to get real-world data or to change something. The agent looks at its current goal and the plan it just made. It then picks the best tool, such as a web search, a database query, or a calculator. The agent fills in the needed inputs and sends the call. The external system does the heavy work and returns a result. Acting ends when the agent stores that result so it can think about the next move. + +- [@article@What are Tools in AI Agents?](https://huggingface.co/learn/agents-course/en/unit1/tools) diff --git a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md index dde88cd1c..8e883bc7a 100644 --- a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md +++ b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md @@ -1,3 +1,6 @@ # Agent Loop -An agent loop is the cycle that lets an AI agent keep working toward a goal. First, the agent gathers fresh data from its tools, sensors, or memory. Next, it updates its internal state and decides what to do, often by running a planning or reasoning step. Then it carries out the chosen action, such as calling an API, writing to a file, or sending a message. After acting, it checks the result and stores new information. The loop starts again with the latest data, so the agent can adjust to changes and improve over time. This fast repeat of observe–decide–act gives the agent its power. \ No newline at end of file +An agent loop is the cycle that lets an AI agent keep working toward a goal. First, the agent gathers fresh data from its tools, sensors, or memory. Next, it updates its internal state and decides what to do, often by running a planning or reasoning step. Then it carries out the chosen action, such as calling an API, writing to a file, or sending a message. After acting, it checks the result and stores new information. The loop starts again with the latest data, so the agent can adjust to changes and improve over time. This fast repeat of observe–decide–act gives the agent its power. + +- [@article@What is an Agent Loop?](https://huggingface.co/learn/agents-course/en/unit1/agent-steps-and-structure) +- [@article@Let's Build your Own Agentic Loop](https://www.reddit.com/r/AI_Agents/comments/1js1xjz/lets_build_our_own_agentic_loop_running_in_our/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md index 289ead933..56965b950 100644 --- a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md +++ b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md @@ -1,3 +1,5 @@ # Anthropic Tool Use -Anthropic Tool Use lets you connect a Claude model to real software functions so the agent can do useful tasks on its own. You give Claude a list of tools, each with a name, a short description, and a strict JSON schema that shows the allowed input fields. During a chat you send user text plus this tool list. Claude decides if a tool should run, picks one, and returns a JSON block that matches the schema. Your code reads the JSON, calls the matching function, and sends the result back to Claude for the next step. This loop repeats until no more tool calls are needed. Clear schemas, small field sets, and helpful examples make the calls accurate. By keeping the model in charge of choosing tools while your code controls real actions, you gain both flexibility and safety. \ No newline at end of file +Anthropic Tool Use lets you connect a Claude model to real software functions so the agent can do useful tasks on its own. You give Claude a list of tools, each with a name, a short description, and a strict JSON schema that shows the allowed input fields. During a chat you send user text plus this tool list. Claude decides if a tool should run, picks one, and returns a JSON block that matches the schema. Your code reads the JSON, calls the matching function, and sends the result back to Claude for the next step. This loop repeats until no more tool calls are needed. Clear schemas, small field sets, and helpful examples make the calls accurate. By keeping the model in charge of choosing tools while your code controls real actions, you gain both flexibility and safety. + +- [@article@Anthropic Tool Use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview) \ No newline at end of file From 55fdc9f957ec89b32e62a0b6046399780c1019f3 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 29 Apr 2025 23:47:41 +0100 Subject: [PATCH 23/31] Add PDF and PNG for ai-agents --- public/pdfs/roadmaps/ai-agents.pdf | Bin 0 -> 102535 bytes public/roadmaps/ai-agents.png | Bin 0 -> 826066 bytes src/components/TopicDetail/TopicDetail.tsx | 36 +++------------------ 3 files changed, 5 insertions(+), 31 deletions(-) create mode 100644 public/pdfs/roadmaps/ai-agents.pdf create mode 100644 public/roadmaps/ai-agents.png diff --git a/public/pdfs/roadmaps/ai-agents.pdf b/public/pdfs/roadmaps/ai-agents.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1fa741d2cd3a52a769aead7c4740b3a0b1161432 GIT binary patch literal 102535 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�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�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

-0 zc=bqruY4gs_&7>q$V{hD3n?(kFEf`__`Z-_L(WkQGvuWTh$JdC!--PFm|ftH9#RH2 z(NAsv@J&6=%D5kh5Ef?j@Wel0AMS*Q|8x&OcBk|sj*u2I zoN%!G@J ziO2$(U~Nv1r>TP1v1}XFlm}BTd9dJ4u4DJ4RvWvb*L$Ubc)QM%DS}I&X>?d{u7K!P z0plPuLslDvEX;Yx@Vi5wf!S@It8o!hTGQEEx*1eVzj?;_&J3AsEoqe_i#;2Vza~IMEK@c^o+79UB@DbO?5Q zzS?g;@h=IfsXSD;o*R17Sk&;W;^Zw*wJq1Cew^fV@XC(%{e*n~oszEH*`!C-{;daN z&%Sb=&wARd#IcPpRh!GMz>ow@ptAU-K-s99lz^3w5U>6_L8VP6d(7YznlC}oFo8(6 z?Ux`~ha0=${K+RggqTdnzWr9JwVqs1t zQ66(#ksE|&3~GAzf_ejO?ns6K71uAP7xyvjctUgySz3c}+*VB`SMZeJ5!vd#eV+#Q zfUxsZ43xUXC?MC;VQq1iMCB0oHhLt9`uf5nl*@v}{pMjBq&N{TS5G{U7PpiVyeTa; ziyfgo8s0^GIguB zBG4}~plW2a;hul~hDxZX`DL>q*t5|3V_;q|@Vb90NqUfD?-0EBkm0BcEHz70odedQ z8e~LrhAXHsJ{RCDhCJ%!8OqGk>-V)g&}-}t|I|6z|2v5gQ3C$9i742WuBiawj}--nf^l!$nE%7y_FU?1VM+|E z9n77ZqI!0jy~bc?e&&AuRFS6JuX^~x92MQIcWqi!@@V?=Num6k9z0(O0=3l~G{z!u zCLZ|&!YJGYyidOa%w6pP6gekvH;{v|`O0?U0$!Kxv~U8UmjNmesTR=+A_rGX5gh7| zDD~stWjaX10sjjljUeyZBmWB}Ae#D&$vcO66e>+d3NB-24mu+aAMHI%i z!{|+?6k%A`rNhWKP7x=XMe`(xO(=(1D{=NDh>RnL8Mi_GB&Zk)M4Zl@1m$bwFdx70 zoCI0YQ|q(FSd}1joS1@=q)tIKWi}FTvwAZ{@ChgX2CXJR=kp5IMhbG(m282{iX#%j z&X_Z$BPuX*h=x%$7%of7H~AUzAeEiMnH-mvhc zI%f1#*^l$3qPF^cLy%u6f~Ky}%mg2SvC#pmczkUVX(UL(21{YED!5xyr?eY2I*@GkFJ zRehXTNm%Jppx0^}mMj!2jZ<3JZ z42 zcp^$5=+};s^S-J>yMXv95Wp-6)n}yj>T?*2rH9*Pt8U)y0*%yD?*()hzh|BD>FaW= z>ckM8SH+BSuAAg@oplDHvgY@NRGn<4>I&1h*&h9M6!CiNS7Q}xTj4Xs+Vix~)8_X& z)9#i_?Ao*kYb#Lhba5}+?b1wx^;){}pI2*Y{mwt0cnB8;Ka*+_DVd{Z49NxvJ=( z??Sh(6m&|r?w8b8a^GjB_Vh8yc2g1W)@Uzg=~hHFmDBP15?*9zCYbEG3|(d#yY}q1 z1E;^K6QIan{tCy5;v8RAr?S7%9!IGR8yYfeOq$Ew5={`N<+?SX%(-m`UWci`jQ$M~ zabY~+F@`2pCK`rq=!4zz5LHin>se?btU z#RWtZ)_e=;;BIBNT0rfb5uG?!Vm30H z1ia)XUd#+M2hGFpb@~Yzv8&`92n&*COEc!1iTA1MCQ`n!H8;FHx|*JZd-LkVX_PK0 zBV-)<2acl}nx1+(v+Bg*J)op~P4xpu+<+Q(4*4Oqj117*4ta~YwIVmgrh3N7p-si4 zeB*MW7KX%xjXV|8y3n3l0v;Eay23PDxa-NZ&|)0ueP>PmU!nbTC*1@YdTL%*M9cBX z6pW;=*UxXZTnnWaFzxb{q6P+$8tA6M%nAk9YUh$UX2Np0Tff zTzOo~2ffJ2LVjMAQRzpJTQRW4n*MVl5>E4`#Fy9rItEs1LOV)M3i`TB$qUW+fiZt5 z_5gvMCwGH{IFxUiP})^|oLKlpRo(*(xxo8UK#M*_NeQ~4(%~hdelWQ~@E0kIvcn&6 zhlm8Bug12Q@kVeF9EuWfQe>&=_!!Vd59~r)|0s=e&p-vJ=9p#> zK53uzhB@ONwl5U$w!lJ>#^bc*gTqJI90@uE4g=$*P$-3wtFa4Qh5up{tJYx>j+y|A z@NL4<5t6dRMh&v=X^paR;pbWA1e=dlsNDDzU%&(}KkOK;Zsrq?!xkYHU9b=dIjv>} zB+ys5Yh<-nB_UpwgvJ9YS5KYddDnLpJ$xq^zv&m3*T~kl!VizSOiNLGg7CvFApCGg4s-uX{~hrW@p1pn`Tq@ujkNg09W+dY~cKeh7BYt)3B5c4Hmk$I4%ija!7{nQ#c-){R#%o44uR6jtXz^wiQ-x zHbbfl8Krw5aU&T7dLVsv1Oi}sDCActw!xX}Z^tPSJYtBp!7D>2VlQbu+Tu)}V#RoG zi268s2ECP@Vo%|=>jiFzym{x^jszZbk@deg*AedgT7?gT?Bct8j{Or)TYn%BOXD+w zmW=-BGjbAg$(wVf4;kmfbM~+An4g}zIUGKlkFdF%K7@abgY1D~ZkbSk8 z-PU<*GJT`ZsH*s6=k*VCST^0SvwGcj(+=pS>yOcTU&BhYX;K6kan!&k9Oq+rNz=74 zeraqNv`u)ezIucP0it>90zpVl>EijR;f@*YSs{9|5W3X4JShbgj zf?Lq93@tl;_BcpDv<86~nJ-;YGGA;)5qT<6*km3`+2F?SjVf1XEgy8t1rCRrFOuS+ zOao`}m##cx9e)3D@{cWLlToB$lPO6`hicu9V}pBjz)k`a`b~MZM@DU&jVx4x3{IjF z9t{|MT_EdAN)P!;0zeN4Plwu(kslDEkRruM0z*{Tm5CtD8>YnA9-_qH>EhZp*HZM& z-u=yoKA7h`8)lmlg2xF_$Wv6iU?LWhuY#c0t^#tUnXlL^CGOE?q&y1roUFMH!s)&1aZonz@E#R*BUQ$gGX1w z%ZETX_cCJr5x+h9a9!IX-!@ib0%rM@EBS9%NPnErE9}O{jKmGehzg+t!hbWs@FU=W zkxWZF>;T%pt|;|(;^TH9!Xc!I6hKi%y}sNlnYIAi1M#-LWBs$>ch+grf`&L8+4+%?j_=-n=3< zQyfFMhp5zmF%C<#=(>lo%;+$Jcs93zMdJ1df`Y<`NB)Tm4h!Nrh?PFhY>=MX9EDSY zw}yip)tuKlxsGf$2`zBNW?PlMMA!&IXV1|aP3l+H@Xb`)g)7y$v2KjCBY2r+IKNh} z+i&^-A9Ve3dhc79D0)4u5QxNBb;kz>{w@=Ze^wz)O}MiffUMx{=)uhF|{uJ=z3()}J^q|e4Gq&h-K~^FGv23`; zYtp!ugw2=f!GX(l_E^F9F!j>5#@k^W!a3q7(hI131`2(prh6Q;%0Td&DKo~wtEsXP#Cmd_#xZ!8 zNkN7;A<62JC7Tv6BGv7+zAN;j+{0`912?5s?~cv+^V|>i$GaA$G;*x*I_wCv%EmW= z*Xm0*u#YBLjoNfsU3rijsmJ~Czf5clIj*AeTGbV>N%K-8LUnO4y+>CevATH_`Z!KfhqF>C&TG-bxTNE z+YKMc;_NIFAM~VTmT6A<-eeLOeEU=rh{t{!CQCrvNJB(Rl z&B)agcktv2_m@u4E;!EUJU}Gauspj;8bMi>(YhamEZ2z99; zX*j!56k~mYT9=Hru=a)a{!6nd=T#pXtJuM|CO(rruoRD` z*6e}>KUeroUgKi2y@pc$81KAH9uw9olNq$Zk_SRI#961`b?Osn6Lm<^(K1H7Kjd*H z(44KbBXQ?vRV4CiQ_0sh9$+GIWBXKoU*R439TmeqxM{RDcH}IcSAEEu-`99xKg4Ra z?BtmlY~GGmUQS#Z!ZdPNOp$$YJv`=rebGhnkq`_jHpx?z`SpfhuPwysKi#wR10B5y zdK?crTvIH_f?-wiEaW%@iY-cVtD5^H5&rYVq94ge@|vK-#|> zUOxfYh{o|5tl~Cac1YJtTri!)T{+eIfJ9;f3|(tCj{pvoo3hWta~Hc(XMvpclQ*Z* z+Y%4f=7tKIlc~$(Y5(Su4;Ep{tI`yydbP6mH=oc8jp9F*^V8d9akrOr;XB-se}E$~ zg|ocQB*zg24Qcn`R!TyhV)e;9xfR1QPnpG=68F0OmX*T4kzV%2%Hi!wF`}Z_EVR0; zZ-m0WEKTN&(mJIa{dM|a6d0MzFD(DY7ZpU6<8n~lpkc%LJ0sE~2*36CbywmpM}aYB z-6~}Lc;uaMkrrjBq9=!EGUV?!q)J|>pcv`wlgP1&(mAQ)S1^Z|6duDH@T9<&ZIm`C zPH)Q}tNpwRWrpg2HS~5Hp-L&ek9hbMFQ@>v8>O#H_@0BV-V`_idKQ$)9kAAuQ>Jv^ zAu040mUY0>+vk2tbbPUvcn>YvNIBi9FK5MW;yTCKdNUI5dURdfw$*|Mz%9uM~Ll+`at=Br* zO+(;Rvon)Vfu8|~BMv8*-+aI(s4iv0swUjW9Me`*bY-b-NODLv2r>0qQk_`~4Ex%8 zJ*>P&84s0$|B%fh_07r&FJU^v;vYJY0@+zrBq|!KCAEqNVdXyKq;5 zs@|AEuRY)IaObMVzL77dTK$!hthFetkBX2`_$0!o_Ybvkm0KjpuEJgO9=spk zDQ`W3y5s-gTFhAtRgZz3oKAZKOL)D66>RiTj5!&q;bvB=3_bWQ^ z9c(xJr8hsrwot=0^)wfK@BJS3#0-?ux_rAuE|pgF;R&diwJQcpXIBIfmx{uiR(j%9 zTQQl>fui%tNtMT%c2D;+5r=y~Y|{c^1=rJa(J+oX@x{1s>e zN7lSlXBQPQKvTl*srkcRUAN0c@z%JqXK9JQxHhTL9N zT`_GdHd+{#U5?$}VZ74q_pnSI;p#Rv<`LJr7!opl!(c|-hVh$MO32H|p=| z5bD}NRdJEbVKFc0CP<|GAyo}f+7wu<-k4zeDiO>jQ-zJ$KV82m8}Y3cnh+8Fu+$D= z?1shF$*y&wt@~Xnw;IHjiXs^Y(p~u$S8?i6Aq>$TY`= z)cmv@z1T4~4_YgpA#9;1Y_kP&N9dB)bvL(8A2eE9UphT1TQ>zphCbY`v)c;ZJ-S)E zvn89r+q?CG$zaEFAeh3)C};5X4l3v%@U-dqycN(!x6I;HV8h7ckD2P##L-4!!zI+$ z%>H)fK@pGZ-&TEvRT`XIVFg@EHoGp;y< z1PVx3xziUKW(rtb1B=+DHet2-^>!aDg*?}2%5*~VbHz+nW$2BDWBH9Od z5#8~9A?rv+K7j!TF^|#D=TSggrzn4@go;QCD-^BPTNN$nX$3Y;U%*j6T&W2>u-Z~=vn?+Ql_^k z6AQw zi|5sL_O9NQy(_xi_3W{P%;Ns=Z*i?uvPZTt$rMzdlVlAr=1hL>scIa-+9}LdtPCq- zNM6+f?V`0&SUksEcl%$u*K#+0X&y!r+|m0v1RGo^+0B**4k7VJv5twB5>WHu)@7S9 zV)Egp$KpkeA-^oqAc6l0Iq`@ z3MG;G0c?J?9N2r3{DAr%nPSG_Wnl6UZi%8cW5jXt5NfWXwhOZ|U6dpgzbTuANGW4S znELn+wg8B<*JWX1>=HwEdBa9=(h=epfFndxH`+kXat3%NL;z zdC{7%q7LH6r26eBN#nP>h{ndZ_7rsV5I-nMa42YxnleXLD~Tf136SZ;KpAC~e<7|b zf;hQK6=SU4X8=_qGsj>|htLA{-Yc z9Fvyr?&Bh{^YQ4-4@lLVf?)QatKHb6sY%RbP1|0KOB{{ygf}-oW4QQpGXJti9Vy4< zrT7}U;%@sUNg>~C6WUnU&psfJY*8UVu@TSoayL~0@}7`7gp5e#*OHoXTxnMs@`8l$ z{?cd5f=m`Kc7Tm1a72*WH|2!D1cQt;@n^RH|DvimC=xv=QhFqZ2d8Y*aOv|NH+;E7;^SS zBTyl6)*@Rp_`}y}py`EctXa9j9|et7n4IqYfUZeI7KJrbL1%>F`x7P_XEJjnGv_aP zxV_wgdpa`2a&e^d2)JwbvD(ss0CeUU`XLBwnQl{vATDD@>kN`^jHkUkHcwLs z7w(kNvoK_2+!T3>A-TBH8V(6H_;Z}!L0Ugrt((&z7|g#XRgXCnS=biIbwy)yAyb8) zD}v-XQnQ+LQhtBAukSN2ww?9EbM;r9zy6*H4_$O+sL<@B2xqS$r_SRYp;<~sVd?t( zFc^6?{sbBV_|VEzAe1V&lReTq+2~$W} za(9m@b71+=0-nUMhR!EiS@kI~^stSLYbsQ{Ba<_Yn6n!>#uEP`Qr+b%VxPlPUCL)| zH-n55C3MiESExb!FgD|I%ST_Aan1ebZ8{`)Y!M-yI(^RE=^XYVCTdor1V2MqrKTgz zsjp!6NvYt~#jK$4z4y}ZXw;>QVRWDdAhw#dFln;bcv550p*M*scZ)3h`CyX8+>h^e z0^#{UH4Dn8(7|zRM<3`p{Q*uL=UY?QjsNTM`_b84#oM_)4O{cLV>BJTvz$D0yLk(Y zJpj?G>uVbs7<>nMYyFdX3&jm6)w)Tv!>g4-bwC08Ej@Znj z_>2DcPKv>J2!H+{5smg!QlQpe{Lq!M(jeb26|1>fMQDIz?S=`T+GJd$bB#fPE9m+& zUIV*FFOj^IqyG9{bcqeSVfq}#@}XH}Ib*>Cj12heT)rkGke*&4`CiLGHkg)$f@g%t z`zyA5U3dOG1+pC1}zOrbC>OG7sRRFP1AVI9L!Tkp+Vm$l8zze-OY53z1@A=3?al z`vC+yX{C5#Uy7Wgm;;QyTkW3C;+qihhr5vhN#)#rE~XURo3M@Y+f*8NjwV4iwczt= zi-!=nm;M!6c=X_$m-E~>o%#RFQ;lx^`w&`=2{RI)r6TM#$L88X$?-6aqxawG5*}kA z>Gb$Xa5|8-wU2gqVfu;Z;VE$ty02_tZ)&5@~4ej#!1! zVCHYF2K&%{Qk+uLO3vej>BI+%+v|#N@&)hXrQ_eV*6oeA4{XuD*i%R$l`f$UDa-+= zt@|~kdgK+I`|tx)ySfip1JJo1(7TB|81|%u_I%F_uxWD!{6AoEP@T6$JR~vV<{@S_IR2Nnm4WQv9|+5ooy$N|=5xD76P z_zkw@8wQkvxH(jacq?MYAZ&EC6;s%bom!9;*GJIyDGh^Pr8MYa@D$8EDMZ{kodSh> z#2pSH+&->E+&=5y&kbN6QBw?H%cKUWre9Ys_al#ZV9nk58YeRJr_Y=?JAJIY1C&bE zq+~oR2K!I1IarAnoB`Y!Rpri(V!@X zt_{_R4k})QkF&{9^*JbEscKPd7kqT9<2$Y3)rxLy=m4Y=84&dC*^Shw>>)ceDYm<6 zAQE+m4#{pJsUh<4*R1%8u*0JoGnXS-abvh6Ui5lcCuz3F$>dy?CI%odO4HRey9&e5L@cPP(VOPL;5{jynd`3c<_`gE1h`5tO83(XMO z71Cq2$pk`3Wj=*MKJgI8_SRwX86B#H&ze1&CU1N}$6~46 zl`%)jPwNJqL)eU{o_nS&h4N-(T^JvezC_?>RR2*&-A`Qyy7HsX5=#+{rg^%Z-d2U<5rJ&HP^j1- zwX!m?LN;>cw#=cLWm%PN%VF6n)DkM2GxIr*WynqI-FPv3T0YycJe8ZIKeg-h=sKIf z$CksCpXuUV((POn=dD>wdO!RKS&AG%kckzJep@Xl_?gKkZvMxcMU=?jc8^ zmxq%RBuPsf7gHxv7AYIhBuSV8>`g!u{=YmR@v!l52?>$@cawNzA9TTaP%b-C<6avW zxEgvc=xe8x(J#RLQZA$4fX1A~>G*TpIXguiD79^pq|o3gi>d3Dl&r%bn`%0SPm;LI z&p4q&)1iREwO9XqKF%;zW~tj?VmbUl8Q0C=X;Lkf`=^R2@@&mB1Gz5uqQt-t@XAhzYOnyS2VB>Ffc!} zy*~^cN74!Q;PDJ#S7)meN6hb5;vX1bNA_SIDb7F?!!KaMU_K~dMb3|39Ur=vKaQaT zuH?W5fM_mVsnoRPp?aGW10s=%X_xJAe)>0VEcd2G~WwLlKZl4^9 zt_IKW5=PU~C8`qYb62##Sow;6LB>U)e+mo&<2NCNfiCMqT`WNw_^k1`e9d3C4WUoZi4mL3FJl}$g{ zR(oI#1y?pDeEb%F&&ZJW4<9I?9vKE`kd28ZG_Oxv){x_MkvmO)#PG3GBhK;KZ#qnU zGHk0atHWGr2105&V))#C!mqstZ$1+yJq#Rz^#DbdZF(ywYLr-PkQ;zFRCV@!16DR1 zGj{I?C-kJte#^tV)i7tJ=h;-^VyRYwM@&6GyUpbe zj0yfSn|I(Z=tn!#PI-Fo2Zv9=)oqVT! z7v9$|dhZ#%{Q7SbAIl#7Z^n8UdhDMcpL+>$k$h;c-gnw}YQrs#>pyFWZa#DJp3nEj zs>SoyrCa<7Rks{Ru7_Ir)x>=zFq-n_{hl z(ArRzcFB0*&3DK=aGCoc9fXfrA=Gih&~QJ>S&rAYXZ`;Y)b?_~akW8c?l8)KxI14B zSGHa>L!$JVdO#2dAvhpU4`R*co81dQ@DqmJI()hFPX=Onz!C>UIeg)+YW=4Ph@)L_ zIS7749m8&jv|Z!$05aSlXNUd*4=6=ZEbblfHYjn2Q<|5j69JURS4Oa%wB5UwtP5|^ z25|CcMnVe10Ql$DSt?ja$=J>NoA$-6-;m`=as2pKwwPL1isNEh{*wW zV~C#ZS7tw)wJWCdq9j)7Q&wr6cq#-|X*W?kmOjD{>7O9&mm&zjQ(Cv?s5JOhCF<{) zM}r~zpsVfku}}XOaUn#CPy4&z$6guXUWA^!g4g=csV$GoTh`Ao;4N!xDl~`@*LN(O z!qb3r^VEn+KA}u@^h;E+zfbs?pclfKI@uK?)&)n?)%Qg5idc(1RD7h%47x(Y&^>trJ7sHfe~<(&5xyhDYXR_pZ8wP)$}5U~(JQ zxU7-eKD}=4YonLA88gOHmHiNKa#s;y zjip-m+jcI|&r4O1tF|%Rrj0Gj_hEg137bd0Cw)nwywGsDHcM-b@UW3OO<-1EH=>$E z?;OAKM19kSUhauI*$uR^s{SHHox`Xun6lCt*Z3c zhUvC@H*SOdo#g2rqn2e2ys@>Qq3TAT!QIg5zdmf;w!Aer1W04H{?Kw^a70NHH78Na zF|H+Qax16+c((iW)h+CFna1Ilpv}-DCIcQAjgGT}hpg^>CSAym6GupWy^|7vlvi_l zO?uA_HCfc*$$e<#2}@R639tk-Dqj&E-{H546LU?N&W@ATJ1kmY2?(J6K@LLzYK3D~ zd%m{z#H=r!hu*BN%cZSzEXP2Li1n*^^az7lS(nSNPM6UhJh@urbTVL%-d2dw(KmMv z+_UsHA^R_~HscwT0=*}I-Zx4C`vR+D>ZuwRo{T4XW&!{Aj%kp4r1`K2pzeA4dv>>2 z!%~j={PL>hi-5qg{Ed`pcPKm$xY%$|1QCXr9ce)^Q!!$e2sVoQ)GxMLmP`Y{)*UW& zD|c;H16yrvM%%~Cpm7LTh>@RPu8i14RlRvugBts`YNV+KLy687RIwUc^9^-_b6c0p z3ZKeW(HS9=z0(;XgZ<4J2$~0fmQ8CPd6vy+FMF0vZ_mHduEyPhX$)^I7v33Wz;#WT z#f{bIGa~K^vQqglI8KD(ypBTBKyqrz>Ra53&q@G9c+grExg<2~=z{Yq|6w+sH99Tj znN)Wx;+fRo+|o5x?_AS02C{kHMOSxg z2&-c?-~@YllAdF0w}DTMJv+qXn zlC){PK$lgF(;f147nVYIRh)KqTuQ!D+ee(K-8l0R zsnY=RCU_W}oo*eMDu$QV%|8@v$HbOhlVRtf`Pu=n8qEV=vu*t?7$N}P}Y9rA4y zQ)_@Pm>@f7)veTAp^A%y%<7Yp)}xa`&Mo`P3axDRC^>j#`AR41g^Qmbu{R}26VvwH zH%go*IiE_}Yy=p$097f5)Sf|uxk_Il_f#I^f+ngI{R4$`#^RVBy_dpO?EZ@exX7>P z_F!4N`4y|Q8k1k`9sSF@;Aq1q&FX(#FlFrxMYhMuIR2Tfe2E1Pzoa&$PE7uq@-2>R z@AZK+k}m&IlWY&xFdTS;)O10}xGe&lCX;GxRAWQoz+d7Wu+ZA0Ei{e+fK)$c>C`9f zo~Z|wK}B_XA|AT;4zet^1^SQUn=gL2XaFe-8+F_{_$ysefX?-5Y|C1CRrS*^CNZj2 zN=qw7oSm{*x16A=IHJS2rrAMtn_q)=;?qGtm$ZOELpav@O;10nz5j^`MX@Y(m|PF( zJnH(?FF}GvyQZ;Y3LLjdqdyFGbFNWiBl#iLT5~9eb-Q~*{a{(Mq9AqqQ!>~$Q+gtc zwflW>q>2F;GjdMty$9DhHk!w1|08e5)-4IGYtxQBsB}Dwweh{%T}u=DdEPB4!LT_i z`Yq=`;SA#~dea0-*qR5gAGBUf+WBAN0msSxm+aVYj?Snl{53r>UZE~qvZ8l7K>04| zwjH!lmob0v@QUGdO7W)}=;yFx%;6;=R|)oDRWWEdjh-@kM7(kQA{EQe0X)*iI}@r% zctwlLUK5K%zVgLl@Uh`u-HH`q%EHV|1)%Z9#IE~)@)(kSo;5dG&iS76tl$i7F_`4| zK)Q?$hzNWQXbUHW*kKF$>3~w%b;&b#Qk9?}RW8oN)vYyjh{#PaCFT5uOI@`&{&Z*q z6+X-e_D9*D$*8mnGYWW9r~-8^U6_kl-e9Eg>gTBAlhPk{1x)&}$(7&I-|}zyp7af`u7-I@YL&t@H}Idt6`r_OPxJ(y`K9 z3(Y1MM~kxK?w}{o`pTnWuf~>V%}JmGXv#0wL5EIwe<(OER-fca8V$>vIe?}}o55=* zOID{+v*vF4^AVg~7Fk%~rXNAU4@W-Yh_-rp5IS*AQwpQ%M8D5OnIgsAZvLQE4a_0h z=H*bnHXo3__i>s7CR6g@xtp2KiIK;egAEn^eT?oB#MY}lQ>3+&l_ZCs z_BvcR=^D)8^E8pUuT&J{)uZ7olembS5R4-vADRt^=Z*g6k>Y+b6jcidIygI5_tKmV%lHXac-lw9TZ>IYn zB-;6SgoSdeOB3z%zrShQGpo_(r1P<9#-0=TkTdY-i2Y^&sv+{Kq`C8nsR*JAze-r2 zJV!Y3mUziYEghvLu``dYkXNQhjtadZgdY7!wA6I;o{!a{X)FOS+M`6EEG zB3=3zBhrO?r^&k(uOmZ_Nc^5u@mT_!e~Gad81SifQRChZ9}+H zCDGEiWoTy<^W_xC$x012KtVLhlu^dGQ75bn$A2cw(oLmWOe~{H7>gy6lCoK<%2>8x zC73vZ`aY}n{h{CnEpLS6Z^9mJiOKYC6}RF!Z{il4bU7PqrwbR)JX~J7d|p}F2<+m( z;+e(!0ww_~85ETe_AHyq*Tz3;e@7{#zm8oUOLs~?uq>BkW6mho8ws)tZ{sVCY}k#{ zJQ&c^Tz<_pUvegdZBN?>!j^B!5`>8J4ulv{y&yy#5JbnooEiKY!~_O^pOF7UC@I=X z)Zz~{ftSXpnG>MBKCD-JhU*2{%&4h^{S{3@RKcjQqKliK{4eZs)rK9~mlT z2u;H>##(TGX5u$mfUvzX`W_OD@CI00tD={r9TjDRq4rxvDCK9f6J(Nju^u8eiBh-#DA6y zKH*LS?m|1E0}EvnkJz-MDP}g`Nfj^?IeneeV-Qhqy6uzF#{Mtr-ZHq3W?Rz~Gc#G* zLW>zKW@ct)W@gD^W@eVf3>GuXVzQVlW>#;1w{PEb=XCVUpNW{Mh|+xgCvUMG(@NZ&hA&hQwT7#L zRe?n9asRN-3MK|pz|VIqGi;lQOvm)L8@kl{BZ*@+A1v@JuXWyPatUoWcLP$)S1Y1| zJsyR(ebUH?SkOUV)xbjQFw!+$+Ih$NMb6jGHuSh$?D0LLv0X6|BRzf-9Y>GQgS3n3 zeHWByO%hn~V)KvHLXU4mGzX9%TL|`{GO*E|u!XZBD9++()%?aVUBt58yy?x8$J!el zGi-<#km_;ghfAj(ju+=sl$m|~K#q;3ye@Xa_Ipy~5=3ZhczWfU zaQgt4%HxBD$=I^SA!!u|v+5kAKc^g#X73-d zN(l(>CQ5?w#QjdZgrrOcvQKyzYtXJTdUCD7+FxHcoGf?Kj;qp4Hka7);k=${r?s^f zC5&TI^OS{-T@(~7E=PsKb3o~;YA!~$Isu6bQZp}m_K!jglaQKRvN!5U=Dq8_^w|0iQbwwp$V7m2Q8@7Lk;nP+&#E&Hi= z^)ZNNW-^1i986EJ5LvomQsO$X*0&6-n>J#>BAFE)=iTQGjo45jtnI||azyDpF}Xos z{$B_~xc-wLPcO^b)vv>BLX^WMx%eZ$JyI*)CwrcjXq}dDR<=UzF4-}GeF*+=EjE(& znqbdlY_is6oiLIXWJm27R)ZbZeM8%pTiiOd&x3Z9t4V1o$N`agc$a>F{&^!Fv;6h8 zw67E?n9mAMbt>{uW?V2KXb4&SA;%FDEF7u8!z)&a9fc!;S}yGHHFR~p5uf15+$0&l z!AA@2b7cQSA4!THqj+p2Eo~|6(_->w#-H_ufk??E2qQR4`iJ(T(}H;7c<4I5c{OT} z5TA^lAZBz+t|RI?k3lQBuTfl;*4Po4pOs-85Be+0*g>d)Kfz#sIijkvGHZIPOMwy= z(~<}=YNYIUtHn_IZ)igyNy34T&r!KY@|fS@cw(@VXvGxzt4@T+-aF}axO`q8ADD8> zu9T6V-}GvuZtXvIH*zgE9v!iiay!1nqa(DVru@})!_V=sKdh)Uh(jJ zq z){hBz`D_?22oX7-m$T{CqXxp^>-sJ0ecET1aADX}Tk(o~PEM@dRGCMq*7Js7{9Q)+ z5xpL~k%L9-Le!L)a?LU>ZghiSrEV3B8((Y!t7xr(#@V|395k-4l2mddr0)JkWc#DB z^2IZJLvL4-f?Y0W*%CVSQQq>`CZiD%{61M|qWc4c=O-t=zqn)-x)@@Z5rIL{AyOpm z?SS_kr+ScJ!QBiBv2Waz{qzd!#E6FSyuy@cPyyoN-xD&z4*uMz_UjDOu5C9Ku;Jh| zi%e%DII{>(&Mn}xvE#vqXk;I)$|$lmOMYyx@R8rFbjI4Ym6_*6iYL5L=kYLb*|AyRt)!M1b9-EJOW`wWMXxb|IxBD zIV23hWw(%D%p22!A@stUF#PD;mtY7^2DE%{x_#u3;3#c5!*p7CdAaDJ{=n?*@YDv+ ziH959go0|ip~W$cZc9j5x-rdpNu_moW8-8~ks?Ix+QRAtpLpbN!rboMIn$Ez8xscb zmxYz~Z_k}9NzN&pJGs%{yA<;%;GFnqHa@uKPU4ojrj37qhxlEcagPpV>Rb;g5x_}| zL0=eY@r7RUVP1Ke?&jO^#nVqA>RF9C0$=9WVvTp0;$Di1U?dN&Y)SMwKWSnq!gYTp zMaS3ng`^BQ@Z1pSL6Y$#x`WL8x~D_kNEk|n1J4kd+)IQ=?{(ykGDOJ^B$EB|gKhYf z%MAUDa6&!Nf}FLz{##ZpLYfs8pSlSHp2eAu1%1g=(ZXv~C$jv45`Ia>$-@BmqmJcQ z3@*Jj-L=N3{MEt6#ahnTr?%Gi<6f| zVGh!_>>Zj-<`3tHVmC}yozl=wJdT0_Z#89mY%nCSuqWI;5M=~NONyODywI%Va^lKk z?Q-FyIS?AWUpV1^6{0+X5Ba!gz3@EI=O?&z~p> zvrYxM89bHw^SEfk7*bNs)bvuKS0xnx)sv{6^C>DsVC)Q5kdOdnE#_bj=KI?M-Lr7i z<|F)S7wubad`hrfg0}8tDzr)uBcLc5Lquk$iDx_Ypyws*^8L-vKjdpj+)Izw>+92F z!`bwAJ#T#pEQp?ckt2>=-&3VB;t8ts}%Em`N_!{&Sl$o<=rmP%5oC_3l?Inn+PpsBST6!W4)1H8}|A~^(z?jU#YP52=MQGsdP+8m( z#v)y)uOQEXC2NQG_bNr|NI5<9Y5VPPcoZn_+8uuqxOL>E8YDmg?TlDZvQG2eFwZ)b zopp7nAnCbNKMc|>7Nx0_4XZh&u&W!N)lkRJX)*k%w{+9Y$Z;@|)DZ?;@JzG>ZE10_ zLg1{3Ly>%8+}o}yNEC_bF!cKm6&43dl$O|LFj&x0aXJKJa#-bOv8TC4k++c-0clC_ zF-r$cXynE|{o_>&5*9{a8JMZw{&BU5+9<)OrOkoSc|RkT_E83BsrgD-)CkN!hWg7g z&t-A8S#DT#8gpkDx2J?!NXlj3I6f%#@iIFZ)&+HV?sV8>&_avT75u1xPgNT{g0vmc zDN>Me7f51CNbWUVZ%@7xUk4J8jA%EdjNkP`?fUM-2c5q#T&1Z&@- zDVFn52*o1s5j4AR<}*|BfLetea#pL}X>oYY+8{Dt;bCPCVO+qoEK#m!RH-Ln3{~YS zrNz?Wlr>EuQdB@N%K^UgxtCxV`z6+>57EDr`}(yo2%wfqFDFYNBcg*8D1P_K`*Y?E z>7HOMC61!7Kw%mm=7r_fnJDXN2FcUG>F@$%X88fgHxC6nf2WMycj2X{*^0l|rkbCF z&4o!EA%}7XmkawEzLL+1TNOEPlr#he3j)7y%?LrH!~Bb8(`}xbe>G6e$j3KJf zS^Ky&&Gr4R#%O=sWCxJ8p9$c9KbVeD8^aH?^if`;CzI6I;juDjm?S{TVqe}vZZs7S z8Lgpw6REVWylKqSlPY(zx>2G`kG6IU(sAabni%W;oh>&KDDYFA986LO^Duvb5P`|P z-u>H`A`@ivjYeA2#_`I5HXa^UR*nrdnrzaIyfU@ipCzZIDJAwk7=yS;*hlN#E-$68X6MkUduu(QtYC-yT+_qP;rv5Fo9$ zg_@QcyLwB|vfKA5cBpPDo)Lg!zR^>_I|^)oP(g2AI zYV}S)S!@Nj*OUSO(CA&bS`j-gcaOVp2rF&rfrTpv#oR1ow!q&Nf>@=-;q$tLcKf>j z9;ij3JYj$$aoO38v_Ym122PD)FCH)zLZ_e}eBfls$Pjj{hFQ_>%SgP6B7B|})=l~F zY_ZUEy`8@cSGaQsi&`FV-0wjgN-vUt{-uFGHq&D=jgkUQ^b#@6+F&+9FmUh7jlk>f z^rhB8SI?%er8<=w%ro!t?(w^xSk@KOd5d@JHGiUZyr~~|MV)E+GCXOs?|Z+5iZW@c zp7S%GKkXTmO<%-1PPP7aA2L7BI>6?DL^Zr9O0|t|_69?FP@9|UK0d7&PVe&W$B)T9mKVb}XxZ`bNg+V1&xg!M%Fsv(HhK_!oPf5HuSxQfz`O8v&SMTaQY5!L!*Xl_+wSj^R z7H{fF5=v(1K`G}0gYhG@k#}etX5*lEMAKAA0_vtDZuL-#%R91QwZQl>I1qhuLCOIO@0BQmL$(w!@dvxw zs)Yx|+&g2RrEpO&zBKT04K$nOsY(Sml2n0p``7Sgw?o;~RHn}yAx%cYlq8AWhQv%R z=QA?x&d9L+;!)&fs0ULRii7kP|2K}j`NDdK)83>bLcHVTeFvG_-z;goPWjoMA4OWx zQy(^$++-pu@Tg(yko2rrfst~gGyM|2ab0tW=6$;4XcjKCPxo=?%lE!t%y6H^&Gz@%pEo#Co(%(BPy&Q zGiopvkPwNDJBYnlU37pFlgss4d>#Eb5UIpKqr8Oi%f=qZ9UBh)MJ8g_7l3s;c%byH zB(mQv$OsvL1*-+g<~`2(;{~bN`G<Rv$;)4 zwSu?<{p%Aq6*fGjq}r;aXdg!l^)?-hB8Li&={G^1$)F#{YbC0MO*dn5J^B z`R{3L9sq;h{DZYgAZPWYIDO`H(G!Qrnz;l-xYOo8nrN2gxzE~CnjVoi0*%hb1qZZB z4H9U7*Zy2N7F$Phd;Yza^bkcrtTrq|H*@3^23?gR5wE1n=VN1_cT0$0l`YfRk9SQD z$5-}?Mxvl%Fn#|D(p=sQse>RXW$2k|Cf=xAj+k{D0XT=nrGqB{JvCPju|MF#^$Dy# z;eH8+9931R=y>957m|6v(I#kd258#I-lHk9n^=Qh-n!6Ww|c!0A1vEwa}3G^>SISj zUC(QXc|P*9l?hjp++crZb6(-NW>F1?sCUe0Y$PB4-m8KF1l`y=P55ur1}4%A7ey%r zB^N$wYa88AI@ID6j2LQDvSf+ui5#R*q12orhH}QrMm1VUWlS0 z3}7_F%_L<(MKUDC(L-SpK=i#|I6nYRWtCbT3OHdnI7iD1sQM+s70j~^^_UY@%S}R! zR#aFEq4|rovz`@|?Sfu?%bi_{jva(?@wW!!!jeu1(1;K+)o|i(C|?pYuTM*uVy@IQ zk_gh37&Gx)py7kvPjHPtM^V!Vil~O%+h%d2WU7!H^WP^se`qZ|{sfHRew=mB|JmV) zFk7xr3E^!UVpgf^PZbiUlM7o}O40FmltCb_6nn(EYx#%DO}S|Ge1g}jKMO(OOrPTikqqSK zje)~1e#VK%EGeYq=cV>om;{KK24-u@-FkQ=djIQR%1TNllOh^BS}h(xXfvf_ShJ#g0vBm zlhd8ci>2ha2F2eK+CmB^st&=d^ybKW*a^$OeHn{CBYHhBkF$L4ip@LkG)krp!Dv}+B2;P+QNRvdPjCz!K(;HdwlRqz2Jr#atEzZwg_ z;$y=kL2pH9Bb&4ISVzWf_>0~&E)s0eD5Q3C-9eg=ar+naR7(+UFBL%70QqoO_q7V6 z>?d0Urc3`ghl&FSc;Wuq zfSRB9vK5CEWlO_CK*sKMd)<%97=uuW-wP!>AcQGVX+<6{E^VpC6cDuJQr0=f-szE> zk766ZvZqd-O10*Ijicvkxd#8>l~f}a1*lPlsv>Mf2WgvkvOK`9Lt=+iL`X%be)tk< z^z*uH{*GluaCva2Sfz?0sVZvz@jPJ1jABIxqoJ7|BXaI5EAyQ;J264PARo2;&&BTD z=#G}Ty|?2i3m*@clhL>8ZzO_jN>WIC?EJi}JS~sC{k;a9nFMf^H_DB{;_pKF=jdkLr$(ft_E_-ds0@U9N+LGT(Y={Y*c@Vjn^WS7%jf_zG{JY z@>XUWB?f6jXKM z%uYmsKg_nvQy=pqBXEJ-Bpf=AswgC2`R>vjPsvDo3{BW0{DE<302_JkBSo5Q+Y7of zZ%>4bm~_AkY^F%67#Tx_A0&@UOi?jDDKLc;G?~?R=yJnqHC)0?nY#CzH}^JqnQb}Z z#*xMFiY?vYFqQn$DJrWc8g1s&eaw_Jp+e)Zxtroui$$Hj^`wQ$uJBA{VTNet{5>C) zXb1BRD2VNe&mO6x6+13YD9%&~3bBRK4T%(TS4J|pCxeW9`ntRq4&(I1STNp@@;V+j zu^Zk$AAR4rZe*{59DWI=|85$=Ysf}N5y-MH4*Y`?z1lp9>q_cQ%L3TaEqId~?a_BgF@ zIP@Wi-ByhUqr+sJvWa2yIU%{>vUKxTm!--Z-!PmdJmoJNwh!1Baahof-11F;Sz2wT zMZD8vEVn89VBLuXm|?X{k3-u{-AwIB1_a4UQh=e3t9o$}X>fSxobt|Ga%{Sk$$O2> z?1@M=9z2xw0DR%kj@O)+GWtBp8zgF!vgmA|=Nj=mo@)h2EStm7oF(b_EzU4*-!(N4w0lI_*$Yqel~b21u^vMFG(_dM}y zvHS8~SeSqJ$hdq?H(7gGg8?bJC}usC+05PBzcKjO7sZ=c2yw^ zZaP@t{WfcEt?G+kBS_D+wO z?&hllLP(alyVjp9cLPkC_O&hYZy~rX%nhL+v=+u`8r|85?PhI$r?oE**772Ry3WF? zp}z(}w2#HbIo;|ss&AEaW2Mk$ct}ckE=dPxqMSCgT_&PVhRXMy9PIRf>@3nQ`g=pI zhrjV|arN&|q2?2(Etd66aXon?sdI%bd<89>D`*13neZ)%PI4>cq$@&Ec-XG5`(tKD z1YOlqNIl6eAwGS5DE1yjncP*<^A{P;&8PQ8ZwolgbP};HmN6BQGYrM)fqX|!C^Lo0A%!3n`G8*kSNSX0fA+tGUPZn*i1h7m{LEs5b z$mT{`6pxp+n(gct8cQUc8lUOcgQ}fM0;9TQVBj`i$wc>8O0_u62Y7Oc4$}_iI(W2< zxrrO^y9_R=tJ(f&t2%je=OwVbK)OUHjC@aD$Mb6HLA|_7R3-TB9BI2;zPuG%Z$rT0 zrq$@;7-PVLPcE;yZt=-5!fE~c-|-Emzx>31qYM6W5+bI~#!i+FF7{6U!A-~++5*WA z!G9JSAwwHyLt9HnWkWk>IwezcR~y5>*=!8WodG~PK+xIvFaE&E#RY^6fc5;{U||FT z63Q;7wrW5i1DF&xbdWH$G`Da8a4@mKF-QV=21{c>J98k10Nnfc421sSFz8q~*#LAb ztZYEYfsq|pmgO&t@pnIvK`>dgTZAP={$~HnR4@abkQ7m|7nc-~HFN;dD<(icEnPhSF)MpI1AUdWGqe8- zoB%J8B@l=31W*bBi5XKWI0ktq6H_NkJ97Z#e-;B8m0cYiY)ozcUM@zUM-1wJF%)f9 z_P;JN0+>1e{$&T^EbPEb!U6o{VCDj_vvC2~xYz+4Y(QRxg$cj{#97!_f%$+}jE#d0 zz{$=6+{X;yU}pxf1M_omaQ;)4oskW|&Iqi71!!mD1aSR>$^1P68#_C2WdX1O_posQ zf4P7F4kPd=92@{PHWmOg3oCHt1h8@e&xx4@z{w1>v$FzMP5>JxuskO#fQ6k2xStJJ z?r#|m04vbW&H=QsbLs*!0-fRjCYXTdqs`9F0!*>70km1z*?}o`pvz30%zslr8yh1B zFvY?8cP}G=g@XyW#mNNR;`m#N3utHK0oKf=3v4SQ z>Ht7p_loBM(La4xCOaM5*_n zO4?%xQN{$1@vTG&9awI4Q}Xji@)AO9s(Uv3yQDH5p`+e^WCA=ppb+1{f?a7Pfghc= zVC;F_a$y%$&Y8t=@R#LjXSlHQ7+1KyhuTZA=o(B6dNZO_<3Al%uhF5OFTN7t^oi1I zDmsAkqMtV30u=~4`8LZq4s*k%?rP^nyVlpe%KIT5b4h`#?s!5+PzLSEN?1I#e>&)K zIByy95>Ds;T+$od|J-g*uAo&LM=K@|8n8~14{bamHsyS|Jk|z8iAev|6!jLwF6>Df4k8C z>Une$|2f{67y`!!VC6uVis>IH4A>4->{ab7|B_0;76fboe~GaFzY~ zrW}iLSMfMH9<;+?MpU&tvvw_HB31B>^f5h>in1rAsUU5krs9 zixB|`KNv{P51LJDms~&S03JvXqIIts#Hr_jgdULI9?$@6dYw*>10uELT2Kvp(6)uB z&9Akf0ni{n!9h}^;<_*UrGI}eDTDOsgTnB-Tb6bH7?S!8(TfG5La)1aGMfg$xA z#0UfAbFaBde(Sgg$`nN9>8be-_j0Zz-!&h|DM&yq2-w5xHq`WO*=Qppcpelg%w(VH z6AH+5n@awnHQ&4Xv)1Jm0L1rVt7qqR%e&<>8;4!J>+?BzHF!Ub-p2nXA#4-g-`eq4 z&n~$CN2k31unoWW!R=#i_aiP7Ee}$*A#*lW{LvLD04#nzMB37Jc2`(ocul?-46Qpa zHjnQBpM$;^TOc?Kd@Y1w*WMz4=*W0b=x0AU7>3_ZbNH4?Pxn`TijNO`;7eGq&rXr^ zo~>FTiz_tn%LjkXC)?@O@3u~@zrVUitX)1@A8vFWX0L5!cj9b+%J@t(m5GB|ITZ$g zw1NQO2=li=5E~SNpsM=?S3>scz|(dV+n_jJeUq^HIuK|aK-hP1Ty{u!;MBLhdVYUO zbHdBt^|U>H+-^SFdU@S8KH&L0YgC0j?XVBbX!n9?FM9zv^g`D(bOLz7{s4 zV%ZGDnlh8d%$HlZt>E_@{WR?{g}lasF_?Mm-F)ILN7moE^_;$!Vu)e*Vq5_wq9AG+X z2c=+6Ppxdd!dv7A`b(saqCK-d)93jAdi`^^99n!eVejcrtB3ljl9|f))mN@&oG9UP z+?`HQdckSLs!^}eZ|a3@J@NeU-10T*^YUlx-RJN+Bc0H9mW^+af8=);kGA8&7=>{3 z@cSWjuGWRq`_XvVLm)?mjbWltzRwZU_ECbc=EKMJCC!G?IN;_6?9GOb>_}4fGpz(h zIiM2;)9ZvO*MTqZNVXxU?>NpHph+=;CNW;OU^aELHMLe>|Khq;_>S)YPT%`BBionN zv*o)CocPH4imweRZHGiB2tQwNb;BKvl@m100JTbvrZ0&RdXEtad#5475q(-1wq=`IC(x1eGnIF1>vrE^h6&`2bY%;^tVU3} zMS$WHM=t9sPcZ6@Ih$$c6OQY~z91A+qFWn=m?P}=CxrPZ*Uy1Y{$emgW=PknJo`^ZLu{>Cr=qzS+R9sgT~>ZaW}RX3Z3!Xh(DXzL0LC~bV6x+T}brpCWzq!I4Wjvz_JylSvywu2NO zm`MlKc#5cNoX^n_o!!&x5M>xP_Ds@a@d zelx~9P>*lVPBvnINqdZtDKqNQw7Bk-Mze^)F488Hj%9ey8_1M7*GUshmwm~cQ^KL` z76^=@sW2lwsz2CsJa{RtMF0y(7b!XL<9R)_9#61zNNu)GtX z!O$E(CboAi68Fer_eyTXE&6)JZha@Rbr_vHxUN|A_110jSkohm!%J-|6~VTzX~R+Y zPo09e^(g|kta9s$A-P=_Iut%b-L+4GEMBIYfH!vY>1O6M>D$a;xWmOnXU9c*v8tVy z4fAhwMO|CjCRzHj3-p=J9U1(!XvybjP~q&w*2}TFtJtP1KNz1S866sFuOA#S)JM%m z7Vv9*joLH~m5Olm7@Ft)-^c6PRcRVDi^Ku(b5d)dg!njP1YN$b0e%9PRzGf0 z3H|PebMOi)_oHm44NwdOyZb^A(3vT;WWM1&8_ZE4Pf*&qaG~o-@Sxq}el@KQcCMtsL4i z7H*`#ln3x`IlHFDQfBn@wX->V+GgsV$8|OHkp9bg4*MK*pQ@Ex8}pz{T7mYj1#iT4w|a}w>9l+aR3nMowm0)~Z18%O)_)yeDk7to(n%e(WrFkCF)k}RBa z)RypG^DWhM!_dctujuXCz>%jt5m-hRGPT3%FE4bbGYHgr|(b`)5X z(+|DVuGrX$#WriN33V=H36v<9OxWY`Vy*i8ve^4_^iho~8$5;SxAdI`DvM!bsR`1~ zxYhbHcD&duLKY*^X3->L-P{fEOz(Ug1Nvt}z|~fe=A?P&{y-zSW@SDRccQ5aTzEO%# z!WXZ!54Ixc@+VC;eUm>>SyR}nhV(h3+62359fSfU4td=@L z$AgQ;n%(uhudRCR-1P9TbBzZG{>kr z%(@SIKtlVPa}hcn3&xrY9dYKu@(y0h92@>T0(Pu#KJrK|&$$GgGmrbdSRbQX`Hn2+iOqU-Rk!OjL*kSZpE{?~jN%Tm(R`WvzBQhPFEMEu=AobI%NS^Q^#)$Cj%2*h5wLj%M; zrjPr6cHif6^vK*{LjlD79fA4Mq6v{u^#}t9b{;_XVR|e!>a)n{lStelgw(aYm=kSU z@gdDt4OzRN7wj77GsBep7y{KtYe6A#hfm+k0u%t)kj3G5O##Wf0|6LuFhKzLhM7O8 zB?&?NC$ehY9q#x)9{sM=^+|djhC|6LyRYM(BAq_Pi=}^p;+X(+`ug?@XAB%y$i~5HTw0X$@Urt5U2=Izsvc7*Xz^b<)3xOQyL3KyK*m3!Ey+OUf92Nc|*PHQTNu+f}Ii5O1iE4rx2=~V=nLGhT1&cm- zC`ea;fZs+~szACL!T^k2EiDQ%gcN_`tD5}e)RI|g8Qi^*FKrcd{76@@v-)ndthsq9 z4f&)g&7xEtvnni9kYlpR$9iZ(R4Su-45>MP+LWXhd)i{-UO9w{f4df}93pgslRz#U zgngBw2)-Z&grUfFo5+dQ`^nH;Na9uJ@U9g(I)BrpOZ&kZM`v>qy_ZsfvKBqxWrHRy z60`LLEqO^ghq<)bwAwU`gtK0xg~Hb_s+u0HRtS{i?!H7HNc$mHwk z#iacAZ|3 z3wo-DjZP=y)G2eiUJ5WiXZi0uaC;uR@Zu`LQ1>DS+Jh8sa(T+z!GgeHBMyuqbZ0__ z%VFn{8Q{n=)OQ^uOQ8aX9Qr8q={MQ}oSI*g`_ z3OGwKPIo#d(x%iY{g6okXF`x*_B)#QuZexR7d|*`oaxbU)woj>H~dr3uVF_)IJ56( zZhFGlLQe^crkdxg6yyE-HN2SDspYwzW?B5!^7pFjrN-#4u2wU5_H}*xjq_{jGUjKI zD+W{MvO;9ljq#_@9%~E8sPldmBixu50nBF)-!%!_lr~N|Id5TcFy9y+oeCyZN=^kz z5~3!YTF@#nB@O5zK{k8$Thz5r@(M(B+)(`dB~L6G#SJQkV)TLWUHvCXyd)c*I?-TU zk9b5v+sm;y-P1f9n-JRRl(9Cy20Pnr-t3L`5eV_3KluATy@f(0cAMsWSm6BiKp}2i zSW7SpQbpvlWupX`1rC0jEG*6IY|<~~)st}*z$ju-0O;kc&i*f}?7?J^YX_rJBSRfE`kG}!fqj^FYaE!XGSi>q+0llOl#*M12 z;Jr_V0@=MWqw+mwjz#ZQ9%KU5eL}98X3*_HVeo;$eoL(Yjl2X~?wE2MGNdDvrZh{pa`er(Z{-?RJ7v5^_ff)h_) z`Z126+s9R^2gm?}b&4Ey0l)AUC{+&3xUP;zXy>fkx$jrP70(Ao$uRO^?=^MYl+sf4q?@na4O8g!oi=6G z;;`>4p~&&#<5F{9Bw;9t$%%a9Z#@b1`7T}CF^o!(=CWvMxenFAn z!I!JRtAF9123meH1zkI|WauRc8fmk9M1@?7Q-kvkM3An8x32E_>gDxuy>hceK}L~J zgJEQZ=b<>0lS$jpp~cCJnjk7vY}iOou=>@Q9lx2*8po=nh;N;U1PIeJDRsi)vv!I<|Rh}HaPSm_u zar3Mn)6qi=+~mmL=#q_CiAFpcjvqvKk%YQcN=b4&Ok6M;`!F~6(8T&fwXr*<(7r>) z?I+J-YIs}>H=uo09LjOXL8Z-&kBi5SgKZFy^k`^rNV;3M5y;>AB!rFcWQ2>#Uv6&K z62ttC5Oc{KvVGr6dFTYu4V+$%gymO?lK^6Qiq+79PyqCf4*OBR4jZEjH+F}o zE_!@$;5NDy2J8)y2;o!3dgD!7LQZmb)Qipe_I^6Xwa=~z{T~OJ6m^r%eH08>s?yVR zg-FzQi*tz`DVvF5^htQCELJoEY5j42@5*W@g4Fo+u%nz5sXwzKR5GTk6i_A7+MJfq zA#)%2Pr8LSpZL{j^AeOZxf1b-+NE1XR6A8iCA>TH4o!%UY4+3sMsg; z)3dO0X+tG!Xz525A#axg@NsP(!cwlIAFm?oR_x#$r=>VaHphYOzGwp$Lg)w%cl&?0U5vkx}Tp zM=_bUT9uA}yI+I^ncat|WC7plkzD=H^k@aAaOin#N;IQfW(o&mBOf2nLPAQorP*1$ zG>2`wV6^FKw+9UC7b5^pyspT@g(-iHhTfnW6YpdB#oZ070GWS1GZ)=@@!8JsfoPg^ zolUl%KT~vuLi8H!cxp_Hl~_h&Bs*6L89TgjV*1pVr^uklCb zQy3&uUN8Vn=wg9{&p@2b#(f3KeRPk?{gHu;6Hw`{-F4YimsU3=Xf}|_C)?;aQF6&T zLJl)hkwoL?bWuDNMGgLYT;!5eShh$<$Qj*qPqD%=Cace3iWwjBCcl$XO({`6cL}%m zxs3{Gx0=RwKO&rG<0}Ciw0laFhOAkT@d3OcBACkTd8;K3m{>SiB&h@t`_eSV6+qWM zisu{mk!*@`1=Y+To*Ko|68hss&GoSu-!2_+YH*AfkbW(V5udj)U(Eg)$B25$HBY*SxlEQkK+R2i z=pXt-9B0qmZY{DlN0pewkQ>=IK-p!~46p8Wyu=o7`}0%dMLp#;NWar3B6T84c90Qo z50896?l-M`7?Ye&M8PzDf~y6Kaq|);?JOK*yh1jW(d1(iIrTQdKc&>r#irPfnMZ?x zV@`=-UFpzAP6Atvw|!$=-=(qdZWzu9s85j+6!z_~aiviP(j3+gG-u}4!gG7~u9aVNfePnRzIq)jw#V?_ zc+K3DuANDVPX`lL$%BhkuOCXzBjQRdiOJVx>|_K)RU^nvC6yM=!@gEQVi@!^AU-)y zy#W<3A@Goskl+{)4L{w{=!r^6aEC9W330DG&ea&}dWF{)wiOsDV~s}rt0J@7W~;+0 zyHs|`6~Qni{o~NY(Nq@(=ciAcRf@?@)pr{>73GNJP@`!Qwi8x=`%&P;hMJsENN(0k()P7^ZcPaR5bHt^{8d!7k)0vH_=l!c*phdp-ULf zvHZa*WnvbZNobTU+PC*m0R)di!!6u+-I%q`8%c)KC zZnu$r;d5oONbpP)LhI1co@->Eo^a|B6Cwj~q!jKVq{34y%V2?4f)21;QE1@P>p=8L z^+v80nj*>mYzwD7AoF~L5@U|SZ>+BRFykS@G^+F#aiZ%o-_USbl`MDZaWZiDd0C@yRAi`~bbR~Kca^&BwSHFp8ZfUbjrL%td^e@W%UJG8$!4$Y z_f1PZ00dHqVZb+O?YsluknH$z?MHlnF=rG1FaEFx^)DI#{*QKrO*ZbJjkB}s`msq1 zN)Mr1QK$zu_xoL*)>e;EZZs*%gnZHi&qE>yZsG8Uo-qBddYlk*FED^U>`9p!x)__u z89BLqX0z*zFIf6K;7CsSmNMR&(_ITpRf=f)s2m(T+z1W7x7nf=e)A^Zje-#;GH0fi z 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

9< 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 z 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%0D`eI+wt$MpT+lvPHRBY{ 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

FbuOGaNn`;@$9YIz7K;{cehrI2=fe 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

1jzJ`Rxqj`CUg6t&*ZHWKy!Bv2tb_i(40V& z`DO=^-NRf>5EwIc=A_kZHeY$sQH``owY4g@28gPg8K?`J*RKBc zYWQu5x9w|UK51r>*s1-`-gco!a+Zb11+B_z<+Nh>j$E8Ai^sTdhxi`$6Z!fEC{;~e zJPv8|Im}F;Uf**nHkG^lvH2cPjBMdHSj6D+$+GJ{EYkVe$V_ z${a`~K>RWyqntWerAuk!=GSgZe_?`7=mJ$m+v1^+iL3wk?%B)~Li>5sr*}tR1`y8Y zBQ0Ei7nvPSi18Q}D)N;WUfHDp=V2ypYq98q$U31ICcy$iXJiLaysyFeB-~%~V4M|p z6eRRlN-;0FM)~rEyQM?QeQc$y;cVAtZ8h)J_9lHqZC+qx!B5vaz9t)Aezv8=I0BH9I%uMF*~xuLZ6?)7n5KAI7SI zG93>Cb43IMoSaS>34Rx|`AXgfK!*__@V&(nf8%RxT=M&k&d%;4kyR(( zGu)Oe?eDnBmKup7pnW1ncGjKk! zz`Cp21i+f}j1`CxeL}X4Z*Yy7_#bs6$fkkt7S^w>{3KvCS6o%ZnkB`&IsQ1J#2DqrW z{KzSl^eA^`b=)-FW0J6vm#%&AmZcTgF30B=-mVt|$KX67ImyFW@FcDs4WHIctwyPH z$W9AA$toF?B=>DN*nDpp8OdXX9X|Aj^8~^0_r&`pxnAEXrwYHn!p*D><2J?pV)$;b zQsh^YZe|2G-{C>X7|ILfZydYC)A=$%JcGxVPajuyBwnnn=1~1om3fTQQG(xj<_BCZ zLQI<=C5SAe>izsz_90Z3vbtpG4*Hso#nuWP0zC{jL6fmsOhNMO5%3Lwe=yTKG;;0X zD03y4Md)NJ_;rN;16_y03gNRlygT>r%|4rAPV|DDQ#Dk~vlzFc@tcKBXf{pjxCHdj z-$Q~{J=fu*NGVQ$IQ)bwS}IqEXmo}S+QwInTKr=Z3JEhTn&#d;$@D4L4Nx}{-$lUJ zF7K8TLpW8U!T*d!)-uYUXq&*F>suZZ%YozN0*LeM?;Mre{noDcQ%sUgWQT>z-}Cu7 zANCx;KX$@&m5C&C;O;5iy`s~s=({kiytCW}k8n_DUtJI(jLN4bu&+Q8MGPC+q%`B` zL_T-jx-MIF%jh7e zv3O+L(gV6wbg6k(|NS<*W@@)$Nmb;qz)VxhjklA(0k?~mxIu9Ela+c`>ZEEiNSMo!L405<#|4^>TdiQ@5I#89y+i7VQ!($H{RpH$%XDe)Q7>%J&0T<*>1|N6gkOW)kds}dt>JXtgzMJ^cSL(-FG zFLr>HZK;|W)z~iHvK%ad^NpmGU+YXG$|$yy9NSzt_nl)nl=I9Yh4vlpY7h)J>KP)` z+`!tmrZf8JYnbwEONfvh+T^hYj_qpfXVofB{+YLC&0-NS$JSgBGEJ%yO$nY)DFt;- zki*|Nfo2}zN!IfEq)S+)yG!KAgH*N<7~^%$`;wBEDCpBA;t3$Q_mJQ0w*&~*1S5&E zo*+gfeoGIWdFB$*e{FEYd&x!9#Rf~3fYtkwe|@+1s#HX8rdy4XO0a1(lo*us!IkcP z_^}~78dCE&BMKr&hDhg{JapoH9k{ajh9OwQEO7JjQzpGL@NPJ)cvm#)mlv?tzvHL_ zv4?oh#XX(GnSrMi6U3TekIdxCJ>Z6SK7d$x|3Oy?F;>_`%s@pdkr3<@Y`H1fI1{Xh zK{+a!2tP^!6XLtLvsZWz^ty-+p1i81I>w#~&Cpl2Lv}GH@{Il(p?t`Lwh`tbEAh-K z`crO&BtOfMIv$CKbl*p}II1@zktgiz@Zx!9VIg=gmNg=rwL$GW-c3m}F3Es)G) zWvP9K8t9OQU%Cv;T^8R%b=Vc_2V6(4&0^*}^e%u2=v~OW-s;@nA7IhsQM^= zty_nmiF`YVn|PmY61g7!{vvEfwwKqUDi|}DaBhSTB1G1;-If$SesUJLM)kI#^quR9 z$r_Y64UIdCPTqHN5dHMc$@!}PmqvMC?AOt(+a;($E|uc-McOy}V`3|0LaR*pW>f(R zzozdyy1bXpSE{gBVL>!C&ri3y#P&TQjUm`Jd{rI5*NrvWT2!ni?>HG1QGO-1XAnpy zK_7)~P`>&Ujysi!jo>Pjs|K-4~v-=%A2?3p%uL zZGqm`zNR%)bx{N&^XK~v|M8;dsUTkTf&RL`{LI}pWPUB#Ab|H%D{`@7Q-7yapBEna z#swln_dmZ1e$>P$#)m06Cmb*p#fEQ1N^2dkGH<}xybwLI<&2#eE+WT_-~{VSIqu2@ z$q3Ga)dvR=XC`)YWo9gW7AM$EmYj14vWc+G9$k*IQ@X9~|1B$gg^k*21jZv@ou}HL ztAN^(NwKRXLf2Z3=L4Ak5mUeiFQtGk7n}`R#t)_ySO;dJ?ckt|_J6KI)f&ee3hcyw z{I0cwhUqziP+!Lg;V&!lQt4%59Qc%|6*K(t@54pCP;gBLwHy)h^FgkK2@;P}qE{AF z$h(WdJ#MW&>!P1&VhfR^k#UCvp>+xTPSmddz0xSwvtco zkY*sQkwAn81`m+*Dh!QAMc19Ih7I{$q8t|;|Dth(o@<{CI1@rG&lH2N7By1y8QM0M zem_1fcv)a3IkBAH;&kmCk;mIeNNIv9=C^45vfRl$8t$@`S?B9RU*_X7^a8kh>j4h` z+qdLA56-@;ip4%?IW!u{$w08%f!syjeaK)5#x_#F!E1fPD(q^_JF_65e>R%k%SDP3 zSWN)rlKtDbEhBDO{XKQ_mg}1Kd*V(SXNON}IArLPB+eZ@UN2M-`04g^UJTD1iq_2u?iy%v2jc27`wZX@9Lw`` zke`b1I#atoFIZzth`sEYlgaBkd^gp^$-c`=!@Dw?r*yB!!X7+PZxo>1`&sje{TOfA zrs3IFomZF1FodjvfD%;Sn*}W((*HD%`C4o3e;jhQDOm z0^cpKGyit8$^xj*Kyu}ihjk`mn-}Mou%zbMBBQXTZ6W;xr9aY08ORc*8_&~biXKk|H_7F>-1Wa5mH9U(4&-K+A!2P;=2=wD z2}_p?&{HEbq7QF2Azua;{M|KVU0*jTkMoxS;Jp@^qb`Oc&j>~ zN4gT=8Z`d{q#iK#YP$V-L$w9K<>q`g>dEY>$QE1ygIQ=4&6SHQgUbKzm0YW|T za>F88O4~M&ap`7lPXH{e^B>5}FtTN3ZimW}3a{erUXPpAb7*E{xQ_n)^mggrfk`Op zAd=2b*(?wDze2&W4S?Yo6g8itz~jxcF}&h2*H0Yg%vkn;vGpFb{RNH2y$Mff zt*)%Fi4h!&oXJs=zr*rgeKh?yfo|Q$8iT(DHUtO{5z5d0mZ~pbIY&UtD2)Len5qj) z`Dd*+3~gZ%`-Togun$?u&z|Vkw@(F@Lix4t`g1=eW&b->(ymWGXhqA&d|AGQd`)QD zEjNSFYf=XaCTk?-!5>(p`sTYpZ_nnPhnY^FSe%2*-Y@a`rvOJsm2S2v{&f;70m9q0 z`EfV)Rsh;9eRr=4rZU_`*A(CODD}Uz6{I-R&78JUnAL}n9Mobx!s9(12?hNB{$1~W zdCJm3Qf|hZw`jLm^n0^O{Id?arYMf!n7`Fgo-m!LRsC^8)iHp_-ciQ~$V}anU*{s{D z|4fg_w|7rcp44|o1Ai9vri1=P{g=&w0~|6FP1NZNGmFM9msTIQQ}-V!hho&1yIQU(mh=sK>zV-&EMZTu_h8+Ia2?UyWR?{ ze#9Y%5kRSp3gY}HL~0jz>`>j<96ANi+`^zo^nX91WEggd;-dd0-g6P~AkKdR{zp14 zdUHMSf+VUT{|`x&`(oxtCo&%S#^~ z@I9SUD@$$m&EDZ%@c?2pByijDZ;Up87&T*R_R8+eC*jKIM9A)qBk37K=IK~zqmT4w zM(F`~k)~mEs8;F8uT;L)H7ZW=R@|!e&As#UjWjfvs_W?7F_VK+qwect+RzBlNPgw# z7mA9x;)F^dN=!AVDEq_Lg8OJL<7zP?>GShG-06=P)P9T=qs_WXW0_;v7(#GBayJQ{yaoa*5#P_YZG5{T=-74~j_) zmi|VyZESw~Hsfnn0rqQb2g41yZKj<4Zp8cK!0YQL)_P&_-#8%0czk8_C^Z-%s*_0O zQw}Lft{$zi9uS$}2=LNPxfXJ(){wUz(a8@y6~iD^XKQv z5=fUhyDVr+)^X*$^q{tDbb6|)Ij_)lYFs!zK*+O8MWjgP+g2O9WbwnRm#;s$OGJ>5 zl`ZmcA)6?UHsQ_$M(t8jOVCl=rH7Q%8_#VZOY1Jrf1W!d7_*k+amx1i!RS)Cxe6c)ApmHW@3x$ zrd-RLYAP#7)@btGg93BPLdbi%uhGECr%ga(nw5rrDH066FJE!busT2R+#_up^)*m( zpU=*4ji8g>2!je=sIRX!n`Saaq>#?fMLtyIdE1wtpIZ;?gPL49<~+#nq0fP{P8XJL z7Ji27Gm>i1ArOr-POvH4`e$a)p|v&XqFSD#RkoR^q{(4?Q+zJgND!yj=u^0d6_R2t zq-NBIPr~kVk>}iKIAtQ(qJWmkpY(grZkw{3W$ zHu+I{?A^SJh>^*|d>Y>5k*#AMf~pnOYKt;XJk5v9N9_q8lzPFu@$?F{B zZqKLt@BlA}BqNf1H%eQ+szGjVB1rYz--D&9+Ki9pZD_CEyL9=wG3z@oPsiprq|H*^ zAtvA8(6o?GWAP(FSK_$i%VA#yUkv_C*LwdT>YgI*Mb!@LBA*Is)v=U`r&kSZP_)=K z&jR4rcp;U$r+4JfS4`tZRz5)Y?a~Xy_!d^Iw+Mw>ixS7 zs14+ZWt<1CQ_4%Y9|Do$+Hrfii0?EfD2Opio={uLXi7|@d`pzH0ohn^r^(^B{f5K~ zqY$DHku-3}WN(lGN?J%cUgGNF2$c5KGfdfzQ0|+HKM$A!P!!AK=^^D0%kHV&>aA~c;+9N6wf;A-H*Me~Q)$eaIXsJz!p;kj_xq5g%vxWRe#?N7^L% z3VHKf?QJQ_Orz^rdPuCh+)OD6OY=$6d%fxD)~9erN%Wv|O|3@L1`+=aD^yW7DQ_T= zX-V*!h;d=Vmc0Nqo9FoMbo^HT=v7vE=NF_#^g1Wc z<`+>Hm#vuCk5Iqa-V_m`Ow9WPp<$Q`*7pM-fHVbQv2M{61hm~iJQ)#E%)`-N{!c#??htq z7)tT31%bo)h5b6zyO<*}vIQM}^JZ2IQqjN(OAIUxiA14LIVK*Sxy!3O?g7zKTcH~5 zV~6;FHm70>4DxBys0j_Fk)jyz;a$y{-xO`jV^?LOuHrB@Zo#i;2yVV@(WP(($=sPS z)nH!lD7~c@EcdF=;w4FCP>Ee-QlU$v84<4iI?7r^7ExSWtiX3xtD5(5;w8L+^pPUH zveUn~0Qr?~X3~GpYicVoAJO!ihwdM5Zz89@X2OlDrDt0!Nbht*Q9HrMnxu6wSxqMq zBN5{YFYljH;}f41q}M$~=XH-YI>VzRo=f^k2jgI?VzGIU+lbe+3zhp0~Wd@;>+52Wpqg5LwzB6dLH2+Gf^g98W0Y+>Q|=R z#`&#}jq}4NKHNhEx^~HS$I<(@RD={%IqAt-mlg*0oORD=j=uJNns~<=nR!gw5WpPV z7WA$)FhF1Z)pLvoRSU04{Jee1z^dz;fps#@#&z%0Xtu68MhkB0L*a9Z79Xf1CEos!njA1YT6d)7^~`pM4EU_XuP zwDJ?J!JPDoZd%}H5?~EA_q?dLjBP}yo#dgor(uJdg+<}jj-RFT=~3FDn%0sMZ{k`y zG;x_8l-0FoVgii9c@mqiCcn6keAakBt~D;R=<{fU1H`AFi@hR%JoxOkl80ymnT6q5 zH$)(JWqQw|1xw!C8=}1uu{%NxIt8tfbEY!87}YlRW{p0gcx)RqQm%tHAC4DVV6M3> zaI&uUh({I(WE~~J*7~G0U5BYL>w%JL6;XTYEyWMA15dwI4(D>9gZ!pjJbAPf^?o;; z^FVpzt9n7XtPyrx1yi$9a z7y3(e@objF)uIpQ0_mk6ran>QFpPYM62CnKKHq%`cM9@VG~HQ!pEQYrpA->u#TWZM2Xz`_^t4unskVy%KvlQmAO66H2e zQg5(ndQ(aGq0)GB@^iB`_S+UV)3Z&-NSwQguC18#SJ6mI2Qq)E$Ar!<9D>ReX4Z+N zas3lyV}0Wio?HE6(`^T%{jRtd(qd52FQW`A@EEI~xEH~wgtuVEFBO^C@cpTceH2U1 zN|7#CBiG|nU+6JaNu3A)La7W0MP9fvN%WnURwPjF5ks4<+XQAlf-p}pP1o3LQzM6` z0Tp#pnjcg^bASA3pB8xTNJqphT!Xyd=YAgIJ@st$@e65lqZAW;EAt%WRj`|R@4NKZ ziBc#h^yeNW@8T~HqB;V+MUBn3oBQgAEAtW;KP0a?J*#*;5EB&QRP1pLsE_P;6awq+MVVWS_`~ShSz7J3wIs>IS7E5{Dg1vyc_+;2-TF0Wa<~)r#ru* z)CY79yffZOYJOmWJ?ZuBog>n7K0udo1tk+PyzmMUcRV$Pg<|Z7F*u;4}su zZ_#VBpBuJ{w12#Z{|Ew=Ay)X3JuSDSU7YXJ4Mx7L)y5}fBU!hM>txnz*M#>Y=uBCN z^AC%{Ar1oxl#$espO*0RXMs9on{5MURyl+hGue&R92B@hC%qaEVXD~)D(pRQ`|5Zq zZSTc>GC#Sq8GOD!HYoM1D)N>WJCMn zvTVEAOAqdpQAt# z)=Z#6Poq(DG{`J3-C=z8w|j8-zF(DV`PcoOSL$L`t%=6(HN#(yw62hp-UM!5&CPlE zN9lWils3IGY{>VOYc8&!qS9D6N6{f=j)Vc>QGLH7!NU4YXI2zyW21;x)~_oN)~f*z zY#cd)wPW4HCO8N$Rs>_>2Vs~s)_IWj^32&!LOi!S+i-RmX32L*lkQ?^s|S|0z>kI4 zT<2a$hKIR`87L>>br2ndkDUPuIPPW=_q&d04EeE>($TEodIZ}5@v1DT%vfA>>s?@5 z^#cmLnY=&766?Ia#kRN0W5_j7)tCM8YPlk*Ok!Nrvp+KNEf!r^iR6Gyv{colN0Mz^ z|6ybKxWEaioJ*DpRolRVRnE=7;kx+sSvQuH`#%TM#>=HE%gCA--x>Z78*jGpN2{ru zQCZ;Y)7`1BT_hzRkd(Aue5ZTKVqp_nDtO3mwk98P&R82sVG zn9iq*@lE8R9!;mas31R{n=c6oWX{gk*CN$Qd5rG`mr*p!ud@XY{I*JMrs8L^C5^dC z5FtB@YhDVZUogHe;Lq})G5=FLRxBe&a2K}g?ZUVIi;&=5OVyXOhhu|S)tpKbmP_lV z&IIk)vF&MO$$$fn;_7vtyYJ9^ey@47AY&0|Bj?LGzQTke>q6?TM8!2P*t_13b?k2% z!H7f+?v~#qgfuT5ac>|DmC)Ue-g5a(W ziNOA<7d`J=N{HPdqR?isHH*^NQzB0fnaxq#O9JRn^bP1=m?O6coA&Q_fBVo{@a-`X_pR03dO<-V8%_d( zILhVe(WH4?T)xwjhKvlnvSeV2%B*!ZOB$Ut#rH2Mhw`!gXGRdc~U3JdYKxczDJ7=&G0mliQvl;sIbS7?!CyK>+>l==oO8Ult-%3}iv5(U; z%*KhdoAt&^#Z)XKONnLf$$m$7Ilqgz3iJEbK0un$PaNx2@#PXA|Uu;C0?A zq1Y#0HCxZ62e-Piu~%&LJIyrkkqks*d{2Q#z4hwq-#gHx>WC7TAV68NZ`(O_O}mmI4HwyZFXu8(3uNC>zNG}emV2?XlExn`rQF? z^_9TBI7mjgLCoekW{EWQ_u_NF-R~iG?Be(Q+dP`UG1?ElIE1w750s{kZL}}h)u$R= zN9VJ=ZPl+wRZ|5NU_mUL_4eY6W2CxA>SjzmqZ*D~hw=g zHg+Ufl%DtEZ|bCGQo#3@qFY6?zc9R1q;8sAR>P3f^EpSAK?eA6?bs12OU#%i9t!>) ztalSyCeokw3CY*=**|M*~xvJ(ue9Y>>eo70+S4ly0$TH?}1_{ZpAw9(es13imm66!luKXwEK zz4{BeKxR-`Qnb4V{K$>D$yZItQc4the&l&(Q0jZC&3tT^LqR=@Zu?9cel7q*R=uUcku*t>n}%fWN{=IVIgz z82EOjEbyy}gQ5G=)MxU=9?gX3nwv0Qq=P=Z1L?BXyQDtHc7BM9**baLk})Ub_t5dA z_MrWVWSCjRz?LD5=!jA}yl)Biyt!XlaJwmj+P`VAN+2x*Y`z7DjmBJIcytEr+Zeho z#!4y0f-LFs%F<~gnw?q`hK(GWM>kqyt{x<+X{JYc2)qdpy8olOK}%1Y z-dYL~e2er=75}H|rG-ECboxo~Ef7vUJEY1jQFOhLpPV{^lEL3l_t36g5<>%*lw0mIub#|9DEoi0jjqEYR7I7~s3+4ln!xV2=2qh^4@n;V% zOQ(){38#`Npo1vhE02mm$i?o*H58fz!VP7cz5T03Agh&VyBhW=%vOd=FN7Y7YbrQQ zQNav+bHA(}hT*@&U7XvFRn_+@4g?a^vMn!ysRS1B`tB(WMLFAm5=N#ctLzG?Ny2o? zVMM{xr9j{9y}%A*KX}bT6F+AlTI>&yb2bFfQu%LZ2EdZtBTM zkC{JxQFDOZj0$m~gxu^5mxkchCx&UAf}5WmhrD8)^s}{z!PV~mdVP4hhwY4LeHCzi z+(E+X<7?9r)V%r9B_`aRx%pW9z=7+kLz5ZCXQ`0P5x+3S@GY!A0xuM8#GeA?Y|v|D1}gMiMywx1gF%6RJM`5OXu!Qc4#BNLIz5iaqlvY| zmye{PbM=a(r>E1jQ=z?jHv5&ljEI%ePDw}|+TJhp%4;k96w#vFS6Ll=zpBil!1(?C zs5fVs*pYl^h5HxtYFkPo@t-PS6t|Rz{nYtzy|f{((%7}J3aF8u68&wRo`9GF{mjV};3>gcGo@~Zw7u@yR%m{~a{8#(GGhZ&L( zJw9WnIfUn(RiKWXRt%;Ny%c)Zd}$vov7W_xcIE9fwhSc`qHrej!x2dZ`zZ#ISNX|& zA#neOC&HEK-IH5`)w_OQ_uK?HH%@Eo4~|1`A5!@{NqC*@2%NCE>7SNl-4Y1dH7L;x z!&v&!0aY!SL~@|5YdGs^hUagd8ooqNfRbBBn${BG`dNa4C7d;V}`x0(RMf@HfUYH?S%hV-W8i?Vm zRI-ooc=G!`)T>t%Cn0hvGrjYQuF@Q#(oGVkos*mczjIZDT=6bKIztlj<~HnM1wF^< z9TniVeTQzEGx8LJBg4CdDEzqQj!Xg8Q@u_1WuA`F13iuy^|n(!a{WixR$Jf({cTWL z&RaU^pkbG2zLyuFRF0AT$R}3sI5(;(xUZHR=#iTmGyM&yNB_kGuV*NLV&qf zqnY@Mhv=e_sIYmnr);Y(%>-*e4A)7E9^_M~6kNRwi;*2Dtx30E`($Cuz&2(*JpN_Y zAeY}KA(yaOMHDRanHk+(+cDyKJbO4?b`G&cMLtx@>f4b=8#M>m@CE8jPCaVegPX+i zDjh6LeSUv=pyoJlp@va}$@~V2qC^3Aa{J8+k&+BiTpkklQ#Ww@$0vVe0ftx`qU)%r z2QfYxZJ^jpx@}Lf%bp<@s)5fIi@XNh4nt#_NKD=I7+6Rx*deb$=ZSmcpG}lD!TM|R z6&+PTTgqh(3}YY4DIe*zuYobO3%s=n|CP5iq+vaRDu@wpVm|&%Z|)`F`=fwxlt$zE zbV8l!3OL4i3pt)Q8r#_k(LS3fsUJ0$8FS_fQS zDAyRd#j5f7q)LAro26qKs5&ymSg;{u@Dnl+^`qF_1N0s~G>*vsmW){Py&{r({xbkR zw(LJQHf^Tuol%)XU}5>S>R#frZ(J5X-LyRs5t;8UGu-%CMcznE9JPX+=R?J1fC5}UW?ZQuMb_HPiE`6pbo_o&ZS`&)}SCe%(i zxb!v8>K@Tt<@S%Cl*aj)`Hp;Q9N(E0mASo_hZg5D8OXVzeCFg!a@Os=auRnebB3S& zw!4HA+Mdo8;8XV(Dsq;1KAfM{b5a$2`EzIB3nz~Z6n{^q5tf|iGzJEqpOj*7Y=)t} z@duo}t`t_#EYUM@3I89JT(Ikr_jr?88ym;7}!{PHYwiES0s2y?=jtQlO_ zIF}k8rL;!k(}3TUhcZLjag|+pt=v`jTQZ6T8VS7O{NUaJpHaum3r`ecH@xVFLax&)TZKQsWeKAexRP8oCn`qTU=QZWL6L1$?Ev;n_T1LL2KsT&Ckjf7c^E9 z=6O`)CMg7CteSp*Whqj%ej_=4e@FUg-q3SME1Qzy#(KD(8;K@$5F0HlAB4fCs#O)txZ$Ujh`D#y5m`8U_{I;iJ zM3mOsSM$g}u`0`2R*+lFa>mvg*cx(yz!Rt0F2@$J=0;%Mzrc1wc7r`N}tFF7B^Q8Z84W^$z5J`syU{OFKwIA zJNFheyq+NuaA?Z6aj>cJ{#%&>Y;<+@7H%W5&r)mCv1FOhkvYTcM^a=^ipUg05QBWv z)x?G_OGYNebaUB(hm>vl>XA@0INN|4hE)MBY|a$aFX38IwTFuH6L~y+sOPu7?bbZP zGz)sfG^ONJUv|SrVoWM1w|wrve*OMA zPlxYs1!+agz*o<&k#IISg6j-lx){w7T?x-!Dl4g;Bw8xC&c|4kyGzA3rA&%$?0v`B zJ;B*{`a3e=Zm61IV!{K%dmNA@h-Cj~osGQfhu_SrRxB3XlulS-wfO3xEpMU;FyA>> zjN*bqynTk#t+!GgXK{%K*sK?)?}mR1+acZL)x=Q1 zKwlMsAq(Hbz&1`V6Gr#?3LQc5*^(+N!4_H&!*? z-w`vphsQKKNuJ5G%ry{g!W(dX)o3YLW*oM9^EChR?jtAUitO&Wo%-4tDuh2B#m|(x zdpnSX`m9!aw)={o%qEq#AtxTW)3)M$e7Kw786t)oh&QDl_j#4SaagmgpOqpKyt(9#p$AmpvIpyr{KsaR*U(RACDd0%Y!`CQ^bFf+5(hH8cA_n{8%Cy^PKEbfLR&g- z=;bqi-BO>-`P7;*H#E_&R-r(uiT73#njcP%2| zc9hW#!uQzXULE$LiVy<)cGl?KXeDVL< zr-{$zjqF^vz%OWF61^s$mfz4LC!v@$MM-k8Om6lMI@R;DO*%}Fxs%1kG^b>aH#G*$ zpistAAhsL&K?_LTj+x$Ggu-T`K? z?#Q7(6Lr0PKm*h4fQWTO6C~>#=r}lpx1)B{EK!?IwT>gjIH*9j#7q8lR99}eamVLd)Owz^rWb>Hz(KdqeLriPPl)4GuspbQi#IWJ! z^KFtD`v>bJ2w7q^Va99G218nfuhq3 zMu@p1LRir2o`_WXR2$m?5FhCvHZ{4nC+vFNsd#O8m{)Q4gP8= zpq7>&>s2_jML&YA*BTj>rsn8Pxo+09K7YHA#*1nKhfrLGPgsp5pf;6Kqv0sNkUKZ5 zYQ@zuC2yJF=2RY&U3!kbR$QIkbxp*2>W*e%t!-ViV`Xz;ba%fCqULu4doj0TJOvxe zHTAjj)-25-p>Nq&GN;25(|v+l&Gx$=kL|#^1$FRwfu{ys&P%~gm#21cC^Qq=hu-qI zPIn6IjoL2U^V;YTRNfy$IftALqMCmwksi?sm!yYkN`M`8iRP? zDsjrqe{lg&r)P^eujc*Zp7)9JlIMvy-j@(>+~#nGJ7Tuf&D(gz<`vga&(J{7>*|HU zHiTC?wD{Rlr?%PT(4=6<3BqRN7V+^8{-LU0VhHzb?^i;v>Dy>Q&D0-yUbl=Pf`f4pt3Dr$Zqi@6ZbwvXCCWLUe#XSN)e}{h z)LLBYl(Fs{=r2A;&WODC}rg`Yz%&U+$h_s zFF38%jV+Hk4$=A*h@>AFz;P>N{IDDrqL!{r8%$Cr1wUJO;2|c>m;cJIaJpe7b))== zj|0-ix0bSVA}CaGyE-)w+|bNSeWr2i2$@bWr>A_m%)LIKx&%8d6IfPOdg7?K(bL%w zUsXtO^7?qvO#d-2*ti;!`9tn!N!rLw>AD)0z|$h?8Tk#G0;56e_=cm`%ExsMd9|Yc z`-V?3C_X=e7DChL6y?zf;&i9uSOSl$^QFbV46YkbBpwb6>W5V!z?9m-BuCO_kH!j@Mwb%JWg6NdWlUN$ z@{Y*X)mS}nYj>@CjW-?YgZQ)ydS+@$N?hC({=@PX;_@sFq)tf<<5!Bfk3Q-ThW655 zDyM52!Ku@{7&Kb@-P#$Hu4T|^z|)T1_P6aXxWP^h;p>A*%x~DB zAtwMaY_p=Pe%Fn&{tL8mI5w)at5%f0Dn+^Mi)Vb^R*;2b#S7i=1)E$4p-HEoWu5g0 z^m^!$o+Jic{wu4id`5|$zKBYy5BMhzl(JODem#9&mvVD%wQbpD3{P(!RS>@(ze6<1 zTg+Ke84L+pw@neT+s+|AvX49d#TsV0nDYbOttrjPW zBpbd2c*XnKPvOFRt2gUQ-@P@#N)fzvt(1$VYU|R@zLzmN540ui-bfXIBl>qe1-Q-m zu8LND^s@MCg20nB6*9ihJtc_|iFS<3!25v}3BA2IM~>go@{2c#2VT9 z8>UEVvv%w!G~Kasg^D05(??_AYYM}?&oQ3wQ{|!X8$r(v%y=OO5xF89joQzaqJyu< zQ$uo_!7fkHUWE{SicqVL%TWBYdPCA{u@36WJ zpvI{Ct$h=QOS( zDM>x#tcuG-R#Gs#l8EPqZ5jD8Az_yeGB+0c$v`?T%%)1Wg@!F0*}rn-Cb7`ESIG#C zGK$cG_)!V9z{T1jBc(h(n^&-DFc@rZj?9N;m+QGWxHo-lIhM;qw^3blTlEXBTGM_L zxv{zqCo>c|oo<;OdZ+L0lOJ}ToLxRg)%Uw>nk6`<;JK_c3}}6b2_FoIGNJuXcFafz z2ZC@Cj1wIG4;+PFGqll$TLmrBPuIr!oyMn6(Hd2w2=`jpQYR`Y2?sWG?v&!{xXav4 zhiF+|!3Rz?`DD^(xWS{!G$y#Gx5LjO$Uh<`wH8MVLsLkgW4o@fv@3;9)_1>k?OTg{ ziLdQ?27)pdY8fQ?N7Td%6q|8)nb*yJALC#DM0Kl;pE)eXsNXv&bI)N_*aGh@EwnUz zgOj>RYy*{=-1H}@4@Bq%qcGgQ4Vz31KP*zG$gv?rsL`ogLg3?;@$ik(NmX!j{rxeiZa7mG|KbE^ls_F_OwxnP z%D#Zk1ikB!qf2Sb-MuF%9a&bY8j5KX+`H!t*WnuVefTXeXxZM&3sodt>StL`$x|dK z;4jHazhkEgG<XC7rOt6~_!FZz$Z#GS1UCW)#_?5hbgx z&5j)Dn&T-Yzp|tE)|Xhspud5OsPqZawo9ClMYj?IG8=zwz&}Ww9J3_rChhS!3)^S6d2QsE5E(Rv%t6DzoW44XzMdOdTYK9aq0V|W#uDkok8K*CPvf)1aCkWmi%i8rh z4W(6FadCNJ0GDVe9DP%y_$OUWuPSf+Q(v3H5pJ&gRD7`NNuFd?+MO7kLLF~p2A{iH zxWe!3a))x61fC!@4ANvo;STlhkQ;9g^bm}t^UniIa4oyo?Nr;&0%0)$f5FKHgBqae zwXs1BdD2H27A(rLeWP`}W~!Ub+GM3vI=AEuQ>Lq}!`ZwyXklb$=>HCR%(k)*a%6m$ z)V@I+n2R+XQ(fCQ6+r2#s>E?IeJ`gTuQj|H^jUfPbl}Hi^(D^N<2+(fb65B>qq2=| z4NZa=i8*079jWVnznY3)T^b{~UHHkDx8kS>RT29*w0Y&j$eY z2Yogog@vs+**7DZW!}_2ZVXtbb|2^w2!rt)SxfSs&MX#{$UD{&6LO#Fx;tuPV!3pw zAze0ORlbHL#Tp!qK6gV-jMh@qW_JgMQU8$BFW+UNg1?hB%*#VMhs_;Fm0MLCc3$ONWBO1H} z^NzQT|ED6efS_PCKhc7Gp!o)ix_GZ}L`35AP%+@*m5`}*OxNg?&Taf3vH3wzm+#*{O=I_>| zzi0G3fBW)hZQRp5;+*|jR3f}IyK$LZzwqQXa-p>E?l0Hr-LusLzdP*9MWEWf_r2d( zrFd;lgMZuDMca4@%1KiIfKkM?5~H{rESc?cr|vee>9D|$ughC{3N%8T0^E>eYp^nX z$kj7vL9U(X87PaYRJlyPHA0DD6cvnLGWXi$cwi7yNrzjhMW7c%mTgAI=C<0lZplnG ztsRkWVjgF#+PWdX>pDpr*JRF+Wrj4pJ2pIt4P=l#E0ioYz+d&vyHhgcsj0iMy1CLP zGu4aIXv=xLlW9^kyBJI8KX%R*;LO?dZOhp$AO}?L%rOB1iW_tCt{uBH2%UQ1q^1gV zmyIN#iSiYn38{bR|AJ39)j3EZrhy|G|GTS=pCCIoRnYu(w_f#|!_YIJEe;@yK$Xl% zOVL*b+Tx3V-N5xN8A?pBDXYU+qswDu_i1FRTK)HaZ_U#P2UCTK*o0>R?nS z=~kQB3!6tTN;1l6VzNRof>?)6zMF0O17WXArov)?C&N;7FP=Oj4@|(D8mfpfos;0G zL4+3tAa&vTsaRnA%q#|dIY0{7bU+&r@gw^qkB0-DyPgHI0G(8-zLyG^l)?VKVpfou zquT|?$;|e&w9FXjj82D?rPGl#N4N6(Q;AkzD1}LD6-;b0C8QO<3iRiJVg+>JBR!o= zc>zDAFaW$e{%U`9jr#Qe>cr<@Nzmq@99}z!y&WiiTgdA+2?b6~1CA6%z z9%xgV*&e26x&qFn`inCvU}&4d7!02RnqvX`AOsY~%MSoHfm`-%pyez$S?_aEARRX^ zaBC76dOv<`Vj&%U@db;52S%1-2{vXyx0bOnO zo8O>n|F>WQDrGJBz3MtYI`pZ@mE8}^h^Ic z_8cdzqAs%Bp+MLEEbWv@+-+q|&N)l_f4k~XRbr3HMcj(;bM2%M}!S>KV8$eH)@;bMxqI;z+HGG@r38KN#dDdYe@sOK;%ZP|!~RbOW@ zo6vLpZk@gqPrm6t%%sspuO(x)j;8?66JV*#)qvMk*h8DYa`0&#m6Biri5>7va!2+8I6beDK1X%@@8R!Z1kJZC71zSynaRs zpEdiILh@Fx;&7I6O)L7yn6@(qD;u)W>l_QN5{iD(%ar%iRickh3MAw1WPLJ{d@2c5 zm=)%b;6 zNlEeeROly9ve$RleL^)fX>|{lmKu^2+7x)a)5ZRLhwRtM)Bt#fE>gSm4kPXOhgP#o zqw#DoP4D&}oD+8Y74>j9U2d~)Kq3+Ql4+#|o*P-Nfqw?1P?_>>dNDQ)XJFhd==@tb zPpaM}_G!>#+8I4VYbzQk^V8OA*B{(}+saNL<|eqrbuyG&t-=VthCRE2ds-DOS7;!D&qw2 zgn%3qx?=-g@P~p=s<6=Hc;0Vm5d=NDWjaSD*2nF_)Y6}3sR#-Inp$C4e~)PtfSU+Q zrtB!6Nt%9C&B??ryy~VWTzml#)L7P)X`rp@`TDF@7WnSazI!wvGo}QpQV)pt(K?^< z-1TX1{O|{b?^fL!`0mHRx0k6Qk65{kfW5~f3%3{0*2Iv7=MHFT&t@4*b}8lI>ym*9 zn@~~UuAA&#-jL^>Ng1b|3``+0;<~jo0{&L63mF{#J}=eEYY&nVQ9`PtM5}(s9fS(q zR*In*_Br?cLSPj4qBorXrpvwqa|XHb=Hbv|f{oFP{g7@e&i|Jx)*F)pxX@XKf)y4T zX}`wWgG=-;0E*h|cRUG5<_l%K>I+ht+ZAHD&oI4hm7YMKrAB7P*xK&yJ5x0L+^mME z=Q*(kKJ20O$Lr7xm9U=t`@tEJ<9D>O0Dl?44_ZxT;hqTw$%>hXl}_i)wDX8aj}Xo2 zm{tYK`oL^#9H-_)bUQYVB1M*qx=E5}ZIo$Q1q}8`DRlZZd3{|hEbygQu1YmCG~>GV zwJ^Yh&tKng{hOV_4uMl6NMzJ6;V&%>jD%bE(Vx3LbFgtP4M#d0Css;2wbTM9R_%)) z0R|&^Z*mQTXErXG2mC9b-T`#3`stM~b<^U9-q)gkEG3iwH%nh{_(=@nH0obdjhE-l zt|iM_XQMbyo+mweVWkQ=prUTvW?R*n&}qlUcE?|T7I)5d^pfXPul2tSRtP06)))g0?0s^r5Zvk)^ z4aKCuHkuCp?K#>1<2hei0q)ug7qBY1CG*TW{YmbW^#4w7>ppq`|KSnT>i<_l62yOD z67H|%fTQxCU)ZfK|K>*FUk9-SD`3Jf4r-sE(^7&^87Uu=`p%5>)O5Y3gyMpN0(QgB zEuOfJnz(_u{75m%fP|)QcSl=FvZ@ZhqlB=`PO0LFt8HNcL9}_0xL5cUAIJ3YZfP z1`@K04u7p#53@&On%zgG+)Unwg!cK<9sdG}`aO0KC?o)c~i#$Y{Ov12)^n(m6;H&0mAS*-ZQQ zUkrxyj2!(6gM_)kD!0~0#(Fdu=^sm2uS(?=#O=$m@twy%kYYQVR}LF*T@-C%5z^W$ z9OOvoPqekh@AjU3{DvWfn@R+TYNz4aP$Y?Xq-W$jJsh*Qdu)!0)orpMX zR2kZAAb*q;?p2KVRaFc9^qwohJDSZG>{|LK_}cV~NHr*o_M55<51rgPn6Ng^kowD^ zlMy)C7qis%5odwQoUY%Al?u zOYOBPE}qvds+_hHA?V-GT)lTNzlRj^th;M>?$>AeF*Ch^?-$4I=svBjALSjpO*wz&w>)XgMY1eDF!+uV)WRF((N1IjMNMS>2KD{=>N-$&O=?Nee%gmZzW1ktNEuk{CnziLj&_9;Pl75!N0oNu`KW1 zkGg}4Wde`(3cu%n)!6N*IUJ^iZ|pLxv8Oh~43A|P2WwHA29{b?_pz7t*5eAyQlBR< z^!QVi#7D{GwouJWv4>IbkA#GK$8-Xpeb3uX`^NN%<1?s?()~)#kl0UZzo%6TI%&cB zW=bQxIQ%Kx30XRAl}HfCQS0ytvYr*dHF_;GTBzNIfgD?P7S3b;^YPB3brl}_9`*m2 zQRu4PQ*z;up63W7s=WJyBUDMTt;+tRLMcs=O9wP<3iZxoZYT*p>n<}4t5=3J!mr0c zEwW~RFX|DW$3aam=UPafaMg~I_@4YCjmxbD+!3;`4~>($Ea<({q2)dkeED@%sgUx* zFArs*6$|Ub1y_Mh4IeEWzv~;B>_eS+yF|U@mhVanBSX40|9>kH8*+SB+)w9(W+kKZkS_Mhv!o`L+!nu$T8e7 zf6u&?5gu7tSF!YyP7PCI#FfwO*M+|J@v*P2M649t{UFG|%VE;d6<1&#(7n%;{h`Bx z{g`xgA9Iq#qwUDmZN4=Be239rFH*vv`Tw-{l~GZB{l9=9A&5$fv_XRiNJ%On-5^~e z(jd|?poFwYN-9Xl&^-)-ppv8HpXaW1-`utCx^I5I!F|r29iRP; zz0dc1KId$#h22BPVGEy9-m&cAXZ=T1E8^f&hFipScbQlzHDpMPkg;IxpxGenWIsSgPjcAR5-{8OpfshNs&;nEy4cMA@V$;-G?YDLYl%rR}-+`#R%`hi+@w;?Kl#pDG3W;@R1Lr4Z& zmb~v3XX6Uzuf0kMZM*tt8a$fkX}v8z_7`X~C?wX)`cL@+-uj!XzaLIST6_>H!5yD% z%wLLzYKio=YlPis>wKIv+bGV#5?Rm_la`C|7I1Wc3U5(|&VuUZxG2{8kV2CN;b6VKO8pHvrbQ>5(8 zX(RPpL_GL=(a*R3n30n}^u;RbYc$$R)vDaL+IQqG9NI$ry-WMYUH7JunM2|at3I(& zCrwggSy!%*%a<Eoq1ldNZt5hfE3LUaZyh$Ake+u7ar?C6`M$2*ORPU+I?@`nlD zi(Jl@%+OE)3F>ve-O?XR1%1x6L1IH!>I5S!uSal;T|?jfPIGkU!gWU2%>0o0K4C~K zq4hQ!{{w82zi%qH`6~nV=1byI_TCH$rb-o3cS8AG8^QZ=Te54$YX$f$UP4{`WN-c6 z@2sUU)zmf^X;H>^7X&%Yw`MP*3Nks;76ylo1ueCX#XhwT(?)tPp=sKmW{}tQt)!Aq zc(z~XoSO0WI+f=%GQjV!*`FFwf19m5ZsOVXYhu>TCK{o7dAIP1*0^j2r_pSqng%~= zfg`Ottx&U|oyTnVF5PFm8_G3WZp~aE#hwp^qusq8z2dR3NJTGugIJ57+Bb+D`hY zrP}2@V;e0Nqx8I&9e5_`yG+oOn=)avs1Esb*;G*^}=%Bo-_oKy# zeC0I!Y%43>PJTAB zbc=GL<@KKny7~r)^E9xLN?}VZAM>8 zB(JGZwg1}O+usVI#ahEpnaXhg>Dr#KqyvHA7rq@@TQOHNU*`x^Mk$Kd+bUB}IhyTt z&d#^E&Us92_gS9gS&vDbl;@6ed8jtLaE+|kASn>e<9<2m!1)e5Co&W?pGigUygx|a zX{q5|RL-cW(LaeO$lIeiU3Wgt!A$<^mv-Mc{(CVs&}{qAAjUK!-}-uxnE%doKCN^;BrtW%mQDJZny z3z9c-FLNXR=Tal|$;&&G{#~*0mAdl4l5$ey3{Gb1UGH2GH|9?Z_(2C9zu~ki5@Ke{ z5G!QZG%07p}VM_5!H1w@-u3tWWd~L6s1d(&T)N2_jm8<-v?qI1^Iejg=LW) z?%U&3GkrDSbs#(v=xTbf*S~TB9JIKa0#82M*KsDs(# z7g=ogd{)4VErYbt)%RdS(iPd=dQvHp6Y|Sl{sXR2RIPcN7p9sF2 z{b(X77CY*u*`gE|L_4mm!vm$+cJ+Owtwh6iyYplz+paXPBY0Bc{fDIM7it7XfTf1X zO5kN_8YIj(6r1QosL0zGzf;D@V9)-~`Y0tqH2(+h#rITq>N-1y!bA z*P?;Tebh2V9bXo!s^>%xf_%@Gl^=+kzla>xhm{Oh+y6aK)>24Sv?)J5jEp?GK@;6{ zg3RIfi|a1^l3#YP91nSGnlx>1t1k89E;KiQRFPPyeORo^=GPjvP(p>Txa?C4FaegPHbKk>x|ChoYmc9S&h{ z;q8m8r*_B=pUAnn0gY%85Myn%((&nVu8H zIDKzr>WL>+yMAZw?KvZ>7ka`B(bvs2xYG;~Y_%eqqgDi+tZ&5m&I*109jXtfnzd|O z81iQ&^YY)Ug1uSU4wO`!lWZpINv_*j{>d`GueGpbAk+M;Yqx2t{?2XJ1k)R8epd~v zGTZHyQD=Sm>i1cuZ9iH2A1wE6s+*1Z`SE#k%8s_d!u5Mw%w83!rSF#nLvuT17!n`3 zCnLr!>oD?l*CRTLK4t}aGOKKJHI)oOXZ;3u+ov4S0~B{3Dl;W~zVGc$wf^0=aC0qF zBjOr2?DW_1etuo{x;zfIp)i-_s?(5B&yxl4VO_GHir0^}^KJa7ht1yySS8K$?B)o_ z5%5)6j`bU>4DVpt7Ko?oz>e;Ni|(k<3^%)QM|SZyt^n9y-#CX?p#xMlL|5b<+~Hliygu}$|M1SLK7R2tJ$vu^vS()7ay5~+8Z zGclFddU{fo>MZ7_Qfcb!LUcAvj`ej>7LkA!$$>$yxTWMLVa}LionEc3uMufX(glmb zY)Oq`-StXTM)L2?t+RRcuAWmz6JGI#Rr%JKPhUu&qBDt)_iI8RrjFug+t1G07?(Ll zMogdNs5%ADl>UAW4ud_%rh3!<8~SG#Tf-LIOOIUz%u+C#Vg{S_bp=INFyeNTm3(pU zR3!qv?T9aR0MA$1F}R@ta}1x1rp=dJ#sHzVZxp z6S|)L?Uuu{4(~FlJCGghO`Svfja14?xArgGKqtdC>d|GS4Yn_5c=)<28(A4fEA<^{ zDcYH6_|eZhtrM?M(@5*z>ETKf6YBk9%540(t08w=b`Mh;QHO@`YK_IGNVT`>&YjBV!<__|!fz2@5A8y%L{=|i7b zz|_AdFCP)rWEE>HX{?*gwm>k4@upXe!K(~UlTJg2)$_)jt_O>iv8b6&srLtS>mAb6 zC?PBmDuQ0&{f6L;%vh83U;NDkbtF>0RK%65t9p9mmj$0Y!@?N|YQOHl1jQ!@cD8q% zQWH2dBs5Gtg-vp{0%9_s)rH~QkC^yD0!^QB^0e`sDJiX&3{|poEZt%JkuP>x>4X32 z%9GSob<{t-^X zCn8QbX5y;hqqpF?`(!RM^P9QtaDYHhZ!RBnS@lWP9rY5V74Hu!1nr~|XLkxi*3q`a zLDD0Eu2+@v+AKMcFlaWo6z^-IT+3!qUExdx zTL|O+)Z0=Jk+|qlPcD_}T79k3ksNI+DDg`+!S`wAtSI$z-2Ruw%XDV!MZ7dK?6BU$ znflj<)jHu9{3lFemM?4uL?!4Hc82JOBYHNyw8vhO_Q@dlTt>_8j0QTVRORz;-7A9L z38xb-cf4rUy~v_TDs_PgI=1w_+kYiS`NXIg88xJ^j*-e(wcTx3Hk}@}^Vpy2&x<#% zJ-yOk*`c}}8=JkmPVGl}aKhu;G3`WJ(ta0q57i>gVF+F*<3MMcR77<2G#0+lalKxR z2yi5xEHFB7HM2mA#011Xqc40!RMYo#iqZfURFJQ@gr1Pn~CNi?{#Y@0vX4?S3`( zJ3q@FFuvni0e7RR2zHi!b7iL*WsP`tW#(i#d$urea za%SxN?Cj3Y&fs8Zhu0N2HQAdV98n;xYDnBxjjAK6V}(6mN73lUlJGIT z%C%Z;9Qt~Kj%W}r&NcSPplxZ65w=!UFl!+(`%Qe~sQk!V|K$2ES1h3=>UvJ*v|ni( zW{wGt{)qX#8;cQmuLwoHOMgAu;$W|pnm7A9Z9#2P_0z2owc=04wU4`}r9xJ$%}e9f z4y*~jCw^_a<=>J0AW?s)E03}T-c;p3ATeEY6=GvH)$37F!pp?2`?ekCO2V|`3|68v znAJn7nR&Tp@VIjE8i@;2QFc5=Gt!6iyZD%-M@EW8h`!A&Kvs0?<~=HFlUoaRHRXll zrB$E(QG157!9wWnV%daDB5%L6|E%MAimyt zU_&58ovxj!mMiu>*Vc6O!~Hw5GOal&ww@TThmp~ZNB4z{VKmlG-Uh;1s)aQbPij4@ z*%eQaNEaKMaQdR%N>gBB_ys_LI6UTKQ-${e(OvtGsp9d+L8HojjAFp+! zG~Z)r*y^Bm?md;5TBwAjV9cGhU!xtj%j0Hyr-kd+zR$=OS_Q8{~Ou0*Rs?cb%e$~@~xyS3yzsPvVV z6dp}D<$j&0P4)a>e1jrc%wzN+a>3}+NV&{JcDDSpNjV9|J`uxk+5X$H0fH9kJDHA} zzhP{LhG`}oe)PfM6e@$D+E7L$vdnH@8K0PAxAS;UWr<21ev0e4DJY9z(@6UhgK8DZ zy7li^R(+Hh>2eLbXwgP3rJnN#o&-hK75ViXI%nlK!i0OyG`rbuxLzaQg9JIv=bJG1 zP==o2d4if3rnVPOeI(y64P&xPVUo{2ooECv-n_2B#jl1S%)j^~+{Q=;(i*#GMCX1r zqDUcxrlbJ5lh+=^*@CFuvgIjl>tO~VE44&|DM!`JefCqoPuVRAl|MlA#I}!v02>Du zvIi}FZGus%oz}7aINZ&eOZ-0R=-JVCY66Rp_w}3RE*&ZnbW!8z64Y^8T76LEh~?urYO-TAhH6Q%97Z)w~a zr<6d##Ppi4R)peAJqn>GsH;jbvNEb|Je~7W ztq~7k>tKFtT?ImIf%cM$=gaGxzyDy}A7y>Sdyu$D=6hf`B~eprLla*=@vXk&w;E1U zUX|7)kFS374FS)Mo4eI}KtD}ARb>6e z=c?;ex-?H>l&{l6lvNouKgx&xjR>c60!?OyRmHA^K>P(=CS5O4XQ9j0>Ewv3=pWh149FDeTwa+9;xG&I7syK}Ie9s6Coul0|0eT3!v1$i~X5ssOeAv-nis;Orao?Ln2wQX9`*mybZnapLM z$A?$o0^T1CylYDetOSwFGP$jVdJW{~QBd)>8Ymw*PM|d{nPcf%*mMDds%Iow_e1qd z)=dSVbqykY_qzsTi#gxzFl-zdr@wMa5-#!dQG4B!WjZtS#C7+XyHuy8@NihN>S@tN zN^YGNWj-wJEZkSLs%U)TF=cE!`N+m^zr=~z$t@?+r!Le-$II%YF;D4>zR1kMwe=+E zq*gxAPK}psOnXz43zw`8?>1Br^ehzz)Gv@Fza5KwbL!%@=w&r}EH~P%cPZTt#wG=5 zJ4AJ<9qNQc|Ad`^O#D~a84!!-@e_*shOyw3Ca3Ql9@bZ<#?s75={sB9k{ez4eE9j> zS@?aGjGro-52?vJ$IwyJQ-=>e8d0{>%)An~X7(H;^Y+ znGWCXFqP5Ti2_b?QzJuG?JjsC`+tf|r*imh09LVJml;(KWiBh?=|)3}vDF_N2U|P- zD1vF7vn%I@@Wy#E1KWQjGgKwnkUGZ>Q^n6|cTF7BEe1~V^_e37@v<-5woG69zvHmUFUHwlJ>-|e2; zamx!qzd~KcYrSEuVM@hOCD};bTi9H@<{cp$dypacm)xgcAC)WoxH){Z)dg7`|9g!l zcjOA~^Tap-st_nEKiwB(-{9U)q1)%_hEPqAU1eWZ**76U%YE&O&EQ7<$!cacyB}37 zHqsqS)6(g%{qIyhpXfHepTFuxwt5CEkg0Leq=IML-kyk4@E~XC>&;}^7XEtyYI5g( zy=IflET0H!icm1LUi$>P#p9=&4wF(q(^W*CCo04A5Xq8)ejm=Bs+3Gv z1hi2pqr0XW_bC8j|2fwt|od3acCXY*lbOm8L7hJ z2fxNWrDEOhPDu+hRN-R?~@O+{SAgd~<@V;B-+B`<3$*&1JMnJ8? z!9LNP8Zmx!`bX_)dVu4@x9}DlHgV;6V)Xr&Dk`T`Az5@Y=>n68n701wVjX=!I3!Y} zzvFzjRpSZDez-f&1&H}QRyhUOV5?;#-7c!Rx`F(-*jHzWJf>pD+99Fp!=p2L%uU0b zur7Qf4HPl6bsT<3fA)13R#8BGMn9wgk?{9O&UM9idVqGCM%+EPe-7Xq(4$C4UpVNI zZGduE8qC7o_9f+6V>M-fX%r3#gx~a2XzLQdq07L;QHk=*?zi@F37A6_YorPIGrmk) z&l3)JGfD4ICsI*qoki}Qd?{2U!X;8s19@`kqoa9#A2#P>^*8ZyA2Le>eHRw1jF&h| zo0a00ou~Vg3%Gciw`sn)yScyl63!=HPyxn+NSZaNA}! z0oNSdbUUQ3iVf+UkA(NOFe?FOedfE`U=3A%TB7N$ApvP9nZ#FXEbpZ*9=l)S#my^E z439@GQIP#Z=@G?+N68K(PfY{+>KyD#}k%bkO=%|bd3rWp&Ml6#oC~ttY$%ClJxPTxNT&NEKBC|RE%!~BAT)-CC zHZH(Q0B9<~h52KEH`FW*!GB)1@!Kg%QNhD2pf=>Md9vs>k1rCArp#*JEQdU$v#vl7NISJWs7l<7BG(vz!b~~_5 zxEfJ-_#Qu?hAH+`SQGs|Z~`opF$I7@$d-LN{YDTbr47;{ja8T{K!$FD8&R#6hm+S_ z@Gw+xMqkGpSH6NSq;W!4H3D0iaWN;zFUZ$AD8PqmECnhb*b6+!+XX5L_yQ$?ejuoI96_}zRwG4K*E;|ShtCw5^2V8V?91P+%jj`Oc{ z{jG!*7O-AVa6lJ$f~>lKNWi9b>Q(s^Q)j%a8Yi=TUL-0SBz1PW3mLnkuBL>A!W&2emeKMRR#5=yO&8xP*n$9&54m`a-JQm|MYy5ci%OXx9zki~X-L7am#?U1P_a z9)g4a9q3M0cqjweZDj1J&z8PQjs5d|ZAT*RD?mzu=;Dh$F%SHxV?K+e%qzzloOwC+@woWk~RMbaJV$n ztm8z22TyIotUXkO-d+*k5OdVeOv+L@2Y^Q%K0^3bBYA2@&??%zE8T zSg*>wzgI>Bj6P!++>|G@4v35hXhVe4!Tw&55Uloat~sftD-6dyto0SBPV#<iUBPi+Gndx@HSPDbURohGAW#bGa}po2@ibY8(1?3j4(W@FLYSo z)`zU5;mW!97FScSmhvw4kV4O_{iTK#8AgnTKofgJ{(NYG6o>^W<$a;FRwh8nDrMg% zFTD+%tsF3oe6n0xe?B_|mijKJmO?c5*C0m%Uu+hv_v!Lq`LFf@;dkH&uRM7ST9LiamDq@n zdxCfmZSjE+UwVqQ8*eWFKNP0d8kP=RXBg&fyfO+8^lT1jqtTQD-zo?2&s_P@#UW)k z6G5-3V4lvhT-skFuS{S~e&iDKpB>-7H$fah`Ve&ET!R)lJ3SB{X|T8R!+VqRR|TJf zy<~rxA|Ma{gVWnUU{i2d@BD@32N32e`)l-n-RUiWI9uQw;&Tm@_5jn}O2rTRTNyh| zVrEOczb!F9`9}o18zx}hr|7Umc z&t3|fm(F=QI{pXcRp46y?+&mC2gF F`d{zzB3J+b literal 0 HcmV?d00001 diff --git a/src/components/TopicDetail/TopicDetail.tsx b/src/components/TopicDetail/TopicDetail.tsx index 4483a16c7..3db935010 100644 --- a/src/components/TopicDetail/TopicDetail.tsx +++ b/src/components/TopicDetail/TopicDetail.tsx @@ -26,8 +26,6 @@ import { Ban, Coins, FileText, HeartHandshake, Star, X } from 'lucide-react'; import { getUrlParams, parseUrl } from '../../lib/browser'; import { Spinner } from '../ReactIcons/Spinner'; import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx'; -import { GoogleIcon } from '../ReactIcons/GoogleIcon.tsx'; -import { YouTubeIcon } from '../ReactIcons/YouTubeIcon.tsx'; import { resourceTitleFromId } from '../../lib/roadmap.ts'; import { lockBodyScroll } from '../../lib/dom.ts'; import { TopicDetailLink } from './TopicDetailLink.tsx'; @@ -323,8 +321,6 @@ export function TopicDetail(props: TopicDetailProps) { const resourceTitleForSearch = resourceTitle ?.toLowerCase() ?.replace(/\s+?roadmap/gi, ''); - const googleSearchUrl = `https://www.google.com/search?q=${encodeURIComponent(topicHtmlTitle?.toLowerCase())} guide for ${encodeURIComponent(resourceTitleForSearch || '')}`; - const youtubeSearchUrl = `https://www.youtube.com/results?search_query=${encodeURIComponent(topicHtmlTitle?.toLowerCase())} for ${encodeURIComponent(resourceTitleForSearch || '')}`; const tnsLink = 'https://thenewstack.io/devops/?utm_source=roadmap.sh&utm_medium=Referral&utm_campaign=Topic'; @@ -522,35 +518,13 @@ export function TopicDetail(props: TopicDetailProps) { contributionUrl && hasContent && (
- - -

+

+ Help us add learning resources +

+

This popup should be a brief introductory paragraph for the topic and a few links to good articles, videos, or any - other self-vetted resources. Please consider submitting a + other self-vetted learning resources. Please consider submitting a PR to improve this content.

Date: Wed, 30 Apr 2025 12:27:24 +0100 Subject: [PATCH 24/31] Update content --- ...s-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md | 2 +- ...hort-term--memory@M3U6RfIqaiut2nuOibY8W.md | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md index 23445215f..028b9779c 100644 --- a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md +++ b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md @@ -1,3 +1,3 @@ # Episodic vs Semantic Memory -Agent memory often has two parts. Episodic memory stores single events. It keeps data about what happened, when it happened, and who or what was involved. This lets the agent recall a past step-by-step experience, like a diary entry. Semantic memory stores facts that stay the same across time. It holds rules, concepts, and meanings, like the statement “Paris is the capital of France.” The key difference is time and context: episodic memory is tied to a specific moment, while semantic memory is timeless knowledge. Together they help the agent both remember past actions and use general truths to plan new ones. \ No newline at end of file +Agent memory often has two parts. Episodic memory is relevant to the context of the current conversation and may be lost after the conversation ends. Semantic memory is relevant to the broader knowledge of the agent and is persistent. \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md index 050bc0be1..ae9acd4dc 100644 --- a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md +++ b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md @@ -1,3 +1,20 @@ # Short Term Memory -Short-term memory lets an AI agent hold recent facts while it works on a task. It keeps chat history, sensor readings, or current goals for a short time, often only for the length of one session. With this memory the agent can follow a user’s last request, track the next step in a plan, or keep variables needed for quick reasoning. Once the task ends or enough time passes, most of the stored items are cleared or moved to long-term memory. Because the data is small and brief, short-term memory is fast to read and write, which helps the agent react without delay. Common ways to build it include using a sliding window over recent messages, a small key-value store, or hidden states in a neural network. Good design of short-term memory prevents the agent from forgetting vital details too soon while avoiding overload with useless data. \ No newline at end of file +Short term memory are the facts which are passed as a part of the prompt to the LLM e.g. there might be a prompt like below: + + +``` +Users Profile: +- name: {name} +- age: {age} +- expertise: {expertise} + +User is currently learning about {current_topic}. User has some goals in mind which are: +- {goal_1} +- {goal_2} +- {goal_3} + +Help the user achieve the goals. +``` + +Notice how we injected the user's profile, current topic and goals in the prompt. These are all short term memories. \ No newline at end of file From 0e0eea635b7ce2e015849a2b44ef49d9718da906 Mon Sep 17 00:00:00 2001 From: David Willis-Owen <100765093+davidwillisowen@users.noreply.github.com> Date: Wed, 30 Apr 2025 13:20:37 +0100 Subject: [PATCH 25/31] Update jailbreak content (#8577) --- .../content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md index b1e5ed972..245444010 100644 --- a/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md +++ b/src/data/roadmaps/ai-red-teaming/content/jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md @@ -4,6 +4,6 @@ Jailbreaking is a specific category of prompt hacking where the AI Red Teamer ai Learn more from the following resources: -- [@article@InjectPrompt (David Willis-Owen)](https://injectprompt.com) +- [@guide@InjectPrompt](https://injectprompt.com) - [@guide@Jailbreaking Guide - Learn Prompting](https://learnprompting.org/docs/prompt_hacking/jailbreaking) - [@paper@Jailbroken: How Does LLM Safety Training Fail? (arXiv)](https://arxiv.org/abs/2307.02483) From 9c2c06affdbfb3d4f90a820f51a7aee9ca01deef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:31:44 +0100 Subject: [PATCH 26/31] chore: update roadmap content json (#8567) Co-authored-by: kamranahmedse <4921183+kamranahmedse@users.noreply.github.com> --- public/roadmap-content/ai-agents.json | 510 ++++++++++++++++++ public/roadmap-content/ai-data-scientist.json | 2 +- public/roadmap-content/ai-red-teaming.json | 214 +++----- public/roadmap-content/cyber-security.json | 130 +++-- 4 files changed, 689 insertions(+), 167 deletions(-) create mode 100644 public/roadmap-content/ai-agents.json diff --git a/public/roadmap-content/ai-agents.json b/public/roadmap-content/ai-agents.json new file mode 100644 index 000000000..1823884f0 --- /dev/null +++ b/public/roadmap-content/ai-agents.json @@ -0,0 +1,510 @@ +{ + "VPI89s-m885r2YrXjYxdd": { + "title": "Basic Backend Development", + "description": "", + "links": [] + }, + "McREk2zHOlIrqbGSKbX-J": { + "title": "Git and Terminal Usage", + "description": "", + "links": [] + }, + "QtTwecLdvQa8pgELJ6i80": { + "title": "REST API Knowledge", + "description": "", + "links": [] + }, + "ZF5_5Y5zqa75Ov22JACX6": { + "title": "Transformer Models and LLMs", + "description": "Transformer models are a type of neural network that read input data—like words in a sentence—all at once instead of one piece at a time. They use “attention” to find which parts of the input matter most for each other part. This lets them learn patterns in language very well. When a transformer has been trained on a very large set of text, we call it a Large Language Model (LLM). An LLM can answer questions, write text, translate languages, and code because it has seen many examples during training. AI agents use these models as their “brains.” They feed tasks or prompts to the LLM, get back text or plans, and then act on those results. This structure helps agents understand goals, break them into steps, and adjust based on feedback, making them useful for chatbots, research helpers, and automation tools.", + "links": [] + }, + "GAjuWyJl9CI1nqXBp6XCf": { + "title": "Tokenization", + "description": "Tokenization is the step where raw text is broken into small pieces called tokens, and each token is given a unique number. A token can be a whole word, part of a word, a punctuation mark, or even a space. The list of all possible tokens is the model’s vocabulary. Once text is turned into these numbered tokens, the model can look up an embedding for each number and start its math. By working with tokens instead of full sentences, the model keeps the input size steady and can handle new or rare words by slicing them into familiar sub-pieces. After the model finishes its work, the numbered tokens are turned back into text through the same vocabulary map, letting the user read the result.", + "links": [] + }, + "dyn1LSioema-Bf9lLTgUZ": { + "title": "Context Windows", + "description": "A context window is the chunk of text a large language model can read at one time. It is measured in tokens, which are pieces of words. If a model has a 4,000-token window, it can only “look at” up to about 3,000 words before it must forget or shorten earlier parts. New tokens push old ones out, like a sliding window moving over text. The window size sets hard limits on how long a prompt, chat history, or document can be. A small window forces you to keep inputs short or split them, while a large window lets the model follow longer stories and hold more facts. Choosing the right window size balances cost, speed, and how much detail the model can keep in mind at once.", + "links": [] + }, + "1fiWPBV99E2YncqdCgUw2": { + "title": "Token Based Pricing", + "description": "Token-based pricing is how many language-model services charge for use. A token is a small chunk of text, roughly four characters or part of a word. The service counts every token that goes into the model (your prompt) and every token that comes out (the reply). It then multiplies this total by a listed price per thousand tokens. Some plans set one price for input tokens and a higher or lower price for output tokens. Because the bill grows with each token, users often shorten prompts, trim extra words, or cap response length to spend less.", + "links": [] + }, + "L1zL1GzqjSAjF06pIIXhy": { + "title": "Temperature", + "description": "Temperature is a setting that changes how random or predictable an AI model’s text output is. The value usually goes from 0 to 1, sometimes higher. A low temperature, close to 0, makes the model pick the most likely next word almost every time, so the answer is steady and safe but can feel dull or repetitive. A high temperature, like 0.9 or 1.0, lets the model explore less-likely word choices, which can give fresh and creative replies, but it may also add mistakes or drift off topic. By adjusting temperature, you balance reliability and creativity to fit the goal of your task.", + "links": [] + }, + "z_N-Y0zGkv8_qHPuVtimL": { + "title": "Frequency Penalty", + "description": "Frequency penalty is a setting that tells a language model, “Stop repeating yourself.” As the model writes, it keeps track of how many times it has already used each word. A positive frequency-penalty value lowers the chance of picking a word again if it has been seen many times in the current reply. This helps cut down on loops like “very very very” or long blocks that echo the same phrase. A value of 0 turns the rule off, while higher numbers make the model avoid repeats more strongly. If the penalty is too high, the text may miss common words that are still needed, so you often start low (for example 0.2) and adjust. Frequency penalty works together with other controls such as temperature and top-p to shape output that is clear, varied, and not boring.", + "links": [] + }, + "Vd8ycw8pW-ZKvg5WYFtoh": { + "title": "Presence Penalty", + "description": "Presence penalty is a setting you can adjust when you ask a large language model to write. It pushes the model to choose words it has not used yet. Each time a word has already appeared, the model gets a small score cut for picking it again. A higher penalty gives bigger cuts, so the model looks for new words and fresh ideas. A lower penalty lets the model reuse words more often, which can help with repeats like rhymes or bullet lists. Tuning this control helps you steer the output toward either more variety or more consistency.", + "links": [] + }, + "icbp1NjurQfdM0dHnz6v2": { + "title": "Top-p", + "description": "Top-p, also called nucleus sampling, is a setting that guides how an LLM picks its next word. The model lists many possible words and sorts them by probability. It then finds the smallest group of top words whose combined chance adds up to the chosen p value, such as 0.9. Only words inside this group stay in the running; the rest are dropped. The model picks one word from the kept group at random, weighted by their original chances. A lower p keeps only the very likely words, so output is safer and more focused. A higher p lets in less likely words, adding surprise and creativity but also more risk of error.", + "links": [] + }, + "K0G-Lw069jXUJwZqHtybd": { + "title": "Stopping Criteria", + "description": "Stopping criteria tell the language model when to stop writing more text. Without them, the model could keep adding words forever, waste time, or spill past the point we care about. Common rules include a maximum number of tokens, a special end-of-sequence token, or a custom string such as “\\\\n\\\\n”. We can also stop when the answer starts to repeat or reaches a score that means it is off topic. Good stopping rules save cost, speed up replies, and avoid nonsense or unsafe content.", + "links": [] + }, + "DSJAhQhc1dQmBHQ8ZkTau": { + "title": "Open Weight Models", + "description": "Open-weight models are neural networks whose trained parameters, also called weights, are shared with everyone. Anyone can download the files, run the model, fine-tune it, or build tools on top of it. The licence that comes with the model spells out what you are allowed to do. Some licences are very permissive and even let you use the model for commercial work. Others allow only research or personal projects. Because the weights are public, the community can inspect how the model works, check for bias, and suggest fixes. Open weights also lower costs, since teams do not have to train a large model from scratch. Well-known examples include BLOOM, Falcon, and Llama 2.", + "links": [] + }, + "tJYmEDDwK0LtEux-kwp9B": { + "title": "Closed Weight Models", + "description": "Closed-weight models are AI systems whose trained parameters—the numbers that hold what the model has learned—are not shared with the public. You can send prompts to these models through an online service or a software kit, but you cannot download the weights, inspect them, or fine-tune them on your own computer. The company that owns the model keeps control and sets the rules for use, often through paid APIs or tight licences. This approach helps the owner protect trade secrets, reduce misuse, and keep a steady income stream. The downside is less freedom for users, higher costs over time, and limited ability to audit or adapt the model. Well-known examples include GPT-4, Claude, and Gemini.", + "links": [] + }, + "i2NE6haX9-7mdoV5LQ3Ah": { + "title": "Streamed vs Unstreamed Responses", + "description": "Streamed and unstreamed responses describe how an AI agent sends its answer to the user. With a streamed response, the agent starts sending words as soon as it generates them. The user sees the text grow on the screen in real time. This feels fast and lets the user stop or change the request early. It is useful for long answers and chat-like apps. An unstreamed response waits until the whole answer is ready, then sends it all at once. This makes the code on the client side simpler and is easier to cache or log, but the user must wait longer, especially for big outputs. Choosing between the two depends on the need for speed, the length of the answer, and how complex you want the client and server to be.", + "links": [] + }, + "N3yZfUxphxjiupqGpyaS9": { + "title": "Reasoning vs Standard Models", + "description": "Reasoning models break a task into clear steps and follow a line of logic, while standard models give an answer in one quick move. A reasoning model might write down short notes, check each note, and then combine them to reach the final reply. This helps it solve math problems, plan actions, and spot errors that simple pattern matching would miss. A standard model depends on patterns it learned during training and often guesses the most likely next word. That works well for everyday chat, summaries, or common facts, but it can fail on tricky puzzles or tasks with many linked parts. Reasoning takes more time and computer power, yet it brings higher accuracy and makes the agent easier to debug because you can see its thought steps. Many new AI agents mix both styles: they use quick pattern recall for simple parts and switch to step-by-step reasoning when a goal needs deeper thought.", + "links": [] + }, + "5OW_6o286mj470ElFyJ_5": { + "title": "Fine-tuning vs Prompt Engineering", + "description": "Fine-tuning and prompt engineering are two ways to get better answers from a large language model. Fine-tuning means you take an existing model and train it more on your own examples so it adapts to a narrow task. You need extra data, computer power, and time, but the model then learns the style and facts you want. Prompt engineering means you leave the model as it is and adjust the words you send to it. You give clear instructions, show examples, or set rules inside the prompt so the model follows them right away. This is faster, cheaper, and safer if you have no special data. Fine-tuning is best when you need deep knowledge of a field or a fixed voice across many calls. Prompt engineering is enough when you want quick control, small changes, or are still testing ideas.", + "links": [] + }, + "UIm54UmICKgep6s8Itcyv": { + "title": "Embeddings and Vector Search", + "description": "Embeddings turn words, pictures, or other data into lists of numbers called vectors. Each vector keeps the meaning of the original item. Things with similar meaning get vectors that sit close together in this number space. Vector search scans a large set of vectors and finds the ones nearest to a query vector, even if the exact words differ. This lets AI agents match questions with answers, suggest related items, and link ideas quickly.", + "links": [] + }, + "qwVQOwBTLA2yUgRISzC8k": { + "title": "Understand the Basics of RAG", + "description": "RAG, short for Retrieval-Augmented Generation, is a way to make language models give better answers by letting them look things up before they reply. First, the system turns the user’s question into a search query and scans a knowledge source, such as a set of documents or a database. It then pulls back the most relevant passages, called “retrievals.” Next, the language model reads those passages and uses them, plus its own trained knowledge, to write the final answer. This mix of search and generation helps the model stay up to date, reduce guesswork, and cite real facts. Because it adds outside information on demand, RAG often needs less fine-tuning and can handle topics the base model never saw during training.", + "links": [] + }, + "B8dzg61TGaknuruBgkEJd": { + "title": "Pricing of Common Models", + "description": "When you use a large language model, you usually pay by the amount of text it reads and writes, counted in “tokens.” A token is about four characters or three-quarters of a word. Providers list a price per 1,000 tokens. For example, GPT-3.5 Turbo may cost around $0.002 per 1,000 tokens, while GPT-4 is much higher, such as $0.03 to $0.06 for prompts and $0.06 to $0.12 for replies. Smaller open-source models like Llama-2 can be free to use if you run them on your own computer, but you still pay for the hardware or cloud time. Vision or audio models often have extra fees because they use more compute. When planning costs, estimate the tokens in each call, multiply by the price, and add any hosting or storage charges.", + "links": [] + }, + "aFZAm44nP5NefX_9TpT0A": { + "title": "What are AI Agents?", + "description": "An AI agent is a computer program or robot that can sense its surroundings, think about what it senses, and then act to reach a goal. It gathers data through cameras, microphones, or software inputs, decides what the data means using rules or learned patterns, and picks the best action to move closer to its goal. After acting, it checks the results and learns from them, so it can do better next time. Chatbots, self-driving cars, and game characters are all examples.", + "links": [] + }, + "2zsOUWJQ8e7wnoHmq1icG": { + "title": "What are Tools?", + "description": "Tools are extra skills or resources that an AI agent can call on to finish a job. A tool can be anything from a web search API to a calculator, a database, or a language-translation engine. The agent sends a request to the tool, gets the result, and then uses that result to move forward. Tools let a small core model handle tasks that would be hard or slow on its own. They also help keep answers current, accurate, and grounded in real data. Choosing the right tool and knowing when to use it are key parts of building a smart agent.", + "links": [] + }, + "Eih4eybuYB3C2So8K0AT3": { + "title": "Agent Loop", + "description": "An agent loop is the cycle that lets an AI agent keep working toward a goal. First, the agent gathers fresh data from its tools, sensors, or memory. Next, it updates its internal state and decides what to do, often by running a planning or reasoning step. Then it carries out the chosen action, such as calling an API, writing to a file, or sending a message. After acting, it checks the result and stores new information. The loop starts again with the latest data, so the agent can adjust to changes and improve over time. This fast repeat of observe–decide–act gives the agent its power.", + "links": [ + { + "title": "What is an Agent Loop?", + "url": "https://huggingface.co/learn/agents-course/en/unit1/agent-steps-and-structure", + "type": "article" + }, + { + "title": "Let's Build your Own Agentic Loop", + "url": "https://www.reddit.com/r/AI_Agents/comments/1js1xjz/lets_build_our_own_agentic_loop_running_in_our/", + "type": "article" + } + ] + }, + "LU76AhCYDjxdBhpMQ4eMU": { + "title": "Perception / User Input", + "description": "Perception, also called user input, is the first step in an agent loop. The agent listens and gathers data from the outside world. This data can be text typed by a user, spoken words, camera images, sensor readings, or web content pulled through an API. The goal is to turn raw signals into a clear, usable form. The agent may clean the text, translate speech to text, resize an image, or drop noise from sensor values. Good perception means the agent starts its loop with facts, not guesses. If the input is wrong or unclear, later steps will also fail. So careful handling of perception keeps the whole agent loop on track.", + "links": [] + }, + "ycPRgRYR4lEBQr_xxHKnM": { + "title": "Reason and Plan", + "description": "Reason and Plan is the moment when an AI agent thinks before it acts. The agent starts with a goal and the facts it already knows. It looks at these facts and asks, “What do I need to do next to reach the goal?” It breaks the goal into smaller steps, checks if each step makes sense, and orders them in a clear path. The agent may also guess what could go wrong and prepare backup steps. Once the plan feels solid, the agent is ready to move on and take the first action.", + "links": [] + }, + "sHYd4KsKlmw5Im3nQ19W8": { + "title": "Acting / Tool Invocation", + "description": "Acting, also called tool invocation, is the step where the AI chooses a tool and runs it to get real-world data or to change something. The agent looks at its current goal and the plan it just made. It then picks the best tool, such as a web search, a database query, or a calculator. The agent fills in the needed inputs and sends the call. The external system does the heavy work and returns a result. Acting ends when the agent stores that result so it can think about the next move.", + "links": [ + { + "title": "What are Tools in AI Agents?", + "url": "https://huggingface.co/learn/agents-course/en/unit1/tools", + "type": "article" + } + ] + }, + "ZJTrun3jK3zBGOTm1jdMI": { + "title": "Observation & Reflection", + "description": "Observation and reflection form the thinking pause in an AI agent’s loop. First, the agent looks at the world around it, gathers fresh data, and sees what has changed. It then pauses to ask, “What does this new information mean for my goal?” During this short check, the agent updates its memory, spots errors, and ranks what matters most. These steps guide wiser plans and actions in the next cycle. Without careful observation and reflection, the agent would rely on old or wrong facts and soon drift off course.", + "links": [] + }, + "PPdAutqJF5G60Eg9lYBND": { + "title": "Personal assistant", + "description": "A personal assistant AI agent is a smart program that helps one person manage daily tasks. It can check a calendar, set reminders, and send alerts so you never miss a meeting. It can read emails, highlight key points, and even draft quick replies. If you ask a question, it searches trusted sources and gives a short answer. It can order food, book rides, or shop online when you give simple voice or text commands. Because it learns your habits, it suggests the best time to work, rest, or travel. All these actions run in the background, saving you time and reducing stress.", + "links": [] + }, + "PK8w31GlvtmAuU92sHaqr": { + "title": "Code generation", + "description": "Code-generation agents take a plain language request, understand the goal, and then write or edit source code to meet it. They can build small apps, add features, fix bugs, refactor old code, write tests, or translate code from one language to another. This saves time for developers, helps beginners learn, and reduces human error. Teams use these agents inside code editors, chat tools, and automated pipelines. By handling routine coding tasks, the agents free people to focus on design, logic, and user needs.", + "links": [] + }, + "wKYEaPWNsR30TIpHaxSsq": { + "title": "Data analysis", + "description": "AI agents can automate many steps of data analysis. They pull data from files, databases, or live streams and put it into a tidy shape. They spot missing entries, flag odd numbers, and fill gaps with smart guesses. Once the data is clean, the agent looks for patterns, such as spikes in sales or drops in sensor readings. It can build simple charts or full dashboards, saving hours of manual work. Some agents run basic statistics, while others use machine learning to forecast next week’s demand. They also send alerts if the numbers move outside set limits. This keeps people informed without constant checking.", + "links": [] + }, + "5oLc-235bvKhApxzYFkEc": { + "title": "Web Scraping / Crawling", + "description": "Web scraping and crawling let an AI agent collect data from many web pages without human help. The agent sends a request to a page, reads the HTML, and pulls out parts you ask for, such as prices, news headlines, or product details. It can then follow links on the page to reach more pages and repeat the same steps. This loop builds a large, up-to-date dataset in minutes or hours instead of days. Companies use it to track market prices, researchers use it to gather facts or trends, and developers use it to feed fresh data into other AI models. Good scraping code also respects site rules like robots.txt and avoids hitting servers too fast, so it works smoothly and fairly.", + "links": [] + }, + "ok8vN7VtCgyef5x6aoQaL": { + "title": "NPC / Game AI", + "description": "Game studios often use AI agents to control non-player characters (NPCs). The agent watches the game state and picks actions such as moving, speaking, or fighting. It can switch tactics when the player changes strategy, so battles feel fresh instead of scripted. A quest giver can also use an agent to offer hints that fit the player’s progress. In open-world games, agents help crowds walk around objects, pick new goals, and react to danger, which makes towns feel alive. Designers save time because they write broad rules and let the agent fill in details instead of hand-coding every scene. Better NPC behavior keeps players engaged and raises replay value.", + "links": [] + }, + "Bn_BkthrVX_vOuwQzvPZa": { + "title": "Max Length", + "description": "Max Length is the setting that tells a language model the biggest number of tokens it may write in one go. A token is a small piece of text, usually a short word or part of a word, so 100 tokens roughly equals a short paragraph. When the model reaches the limit, it stops and returns the answer. A small limit keeps replies short, saves money, and runs fast, but it can cut ideas in half. A large limit lets the model finish long thoughts, yet it needs more time, more processing power, and can wander off topic. Choose the value to fit the job: a tweet might need 50 tokens, a long guide might need 1,000 or more. Good tuning finds a balance between cost, speed, and clear, complete answers.", + "links": [] + }, + "Y8EqzFx3qxtrSh7bWbbV8": { + "title": "What is Prompt Engineering", + "description": "Prompt engineering is the skill of writing clear questions or instructions so that an AI system gives the answer you want. It means choosing the right words, adding enough detail, and giving examples when needed. A good prompt tells the AI what role to play, what style to use, and what facts to include or avoid. By testing and refining the prompt, you can improve the quality, accuracy, and usefulness of the AI’s response. In short, prompt engineering is guiding the AI with well-designed text so it can help you better.", + "links": [] + }, + "qFKFM2qNPEN7EoD0V-1SM": { + "title": "Be specific in what you want", + "description": "When you ask an AI to do something, clear and exact words help it give the answer you want. State the goal, the format, and any limits up front. Say who the answer is for, how long it should be, and what to leave out. If numbers, dates, or sources matter, name them. For example, rather than “Explain World War II,” try “List three key events of World War II with dates and one short fact for each.” Being this precise cuts down on guesswork, avoids unwanted extra detail, and saves time by reducing follow-up questions.", + "links": [] + }, + "6I42CoeWX-kkFXTKAY7rw": { + "title": "Provide additional context", + "description": "Provide additional context means giving the AI enough background facts, constraints, and goals so it can reply in the way you need. Start by naming the topic and the purpose of the answer. Add who the answer is for, the tone you want, and any limits such as length, format, or style. List key facts, data, or examples that matter to the task. This extra detail stops the model from guessing and keeps replies on target. Think of it like guiding a new teammate: share the details they need, but keep them short and clear.", + "links": [] + }, + "sUwdtOX550tSdceaeFPmF": { + "title": "Use relevant technical terms", + "description": "When a task involves a special field such as law, medicine, or computer science, include the correct domain words in your prompt so the AI knows exactly what you mean. Ask for “O(n log n) sorting algorithms” instead of just “fast sorts,” or “HTTP status code 404” instead of “page not found error.” The right term narrows the topic, removes guesswork, and points the model toward the knowledge base you need. It also keeps the answer at the right level, because the model sees you understand the field and will reply with matching depth. Check spelling and letter case; “SQL” and “sql” are seen the same, but “Sequel” is not. Do not overload the prompt with buzzwords—add only the words that truly matter. The goal is clear language plus the exact technical labels the subject uses.", + "links": [] + }, + "yulzE4ZNLhXOgHhG7BtZQ": { + "title": "Use Examples in your Prompt", + "description": "A clear way to guide an AI is to place one or two short samples inside your prompt. Show a small input and the exact output you expect. The AI studies these pairs and copies their pattern. Use plain words in the sample, keep the format steady, and label each part so the model knows which is which. If you need a list, show a list; if you need a table, include a small table. Good examples cut guesswork, reduce errors, and save you from writing long rules.", + "links": [] + }, + "noTuUFnHSBzn7GKG9UZEi": { + "title": "Iterate and Test your Prompts", + "description": "After you write a first prompt, treat it as a draft, not the final version. Run it with the AI, check the output, and note what is missing, wrong, or confusing. Change one thing at a time, such as adding an example, a limit on length, or a tone request. Test again and see if the result gets closer to what you want. Keep a record of each change and its effect, so you can learn patterns that work. Stop when the output is clear, correct, and repeatable. This loop of try, observe, adjust, and retry turns a rough prompt into a strong one.", + "links": [] + }, + "wwHHlEoPAx0TLxbtY6nMA": { + "title": "Specify Length, format etc", + "description": "When you give a task to an AI, make clear how long the answer should be and what shape it must take. Say “Write 120 words” or “Give the steps as a numbered list.” If you need a table, state the column names and order. If you want bullet points, mention that. Telling the AI to use plain text, JSON, or markdown stops guesswork and saves time. Clear limits on length keep the reply focused. A fixed format makes it easier for people or other software to read and use the result. Always put these rules near the start of your prompt so the AI sees them as important.", + "links": [] + }, + "qakbxB8xe7Y8gejC5cZnK": { + "title": "Tool Definition", + "description": "A tool is any skill or function that an AI agent can call to get a job done. It can be as simple as a calculator for math or as complex as an API that fetches live weather data. Each tool has a name, a short description of what it does, and a clear list of the inputs it needs and the outputs it returns. The agent’s planner reads this definition to decide when to use the tool. Good tool definitions are precise and leave no room for doubt, so the agent will not guess or misuse them. They also set limits, like how many times a tool can be called or how much data can be pulled, which helps control cost and errors. Think of a tool definition as a recipe card the agent follows every time it needs that skill.", + "links": [] + }, + "kBtqT8AduLoYDWopj-V9_": { + "title": "Web Search", + "description": "Web search lets an AI agent pull fresh facts, news, and examples from the internet while it is working. The agent turns a user request into search words, sends them to a search engine, and reads the list of results. It then follows the most promising links, grabs the page text, and picks out the parts that answer the task. This helps the agent handle topics that were not in its training data, update old knowledge, or double-check details. Web search covers almost any subject and is much faster than manual research, but the agent must watch for ads, bias, or wrong pages and cross-check sources to stay accurate.", + "links": [] + }, + "mS0EVCkWuPN_GkVPng4A2": { + "title": "Code Execution / REPL", + "description": "Code Execution or REPL (Read-Eval-Print Loop) lets an AI agent run small pieces of code on demand, see the result right away, and use that result to decide what to do next. The agent “reads” the code, “evaluates” it in a safe sandbox, “prints” the output, and then loops back for more input. With this tool the agent can test ideas, perform math, transform text, call APIs, or inspect data without waiting for a full build or deployment. Python, JavaScript, or even shell commands are common choices because they start fast and have many libraries. Quick feedback helps the agent catch errors early and refine its plan step by step. Sandboxing keeps the host system safe by blocking dangerous actions such as deleting files or making forbidden network calls. Overall, a Code Execution / REPL tool gives the agent a fast, flexible workbench for problem-solving.", + "links": [] + }, + "sV1BnA2-qBnXoKpUn-8Ub": { + "title": "Database Queries", + "description": "Database queries let an AI agent fetch, add, change, or remove data stored in a database. The agent sends a request written in a query language, most often SQL. The database engine then looks through its tables and returns only the rows and columns that match the rules in the request. With this tool, the agent can answer questions that need up-to-date numbers, user records, or other stored facts. It can also write new entries or adjust old ones to keep the data current. Because queries work in real time and follow clear rules, they give the agent a reliable way to handle large sets of structured information.", + "links": [] + }, + "52qxjZILV-X1isup6dazC": { + "title": "API Requests", + "description": "API requests let an AI agent ask another service for data or for an action. The agent builds a short message that follows the service’s rules, sends it over the internet, and waits for a reply. For example, it can call a weather API to get today’s forecast or a payment API to charge a customer. Each request has a method like GET or POST, a URL, and often a small block of JSON with needed details. The service answers with another JSON block that the agent reads and uses. Because API requests are fast and clear, they are a common tool for connecting the agent to many other systems without extra work.", + "links": [] + }, + "qaNr5I-NQPnfrRH7ynGTl": { + "title": "Email / Slack / SMS", + "description": "Email, Slack, and SMS are message channels an AI agent can use to act on tasks and share updates. The agent writes and sends emails to give detailed reports or collect files. It posts to Slack to chat with a team, answer questions, or trigger alerts inside a workspace. It sends SMS texts for quick notices such as reminders, confirmations, or warnings when a fast response is needed. By picking the right channel, the agent reaches users where they already communicate, makes sure important information arrives on time, and can even gather replies to keep a task moving forward.", + "links": [] + }, + "BoJqZvdGam4cd6G6yK2IV": { + "title": "File System Access", + "description": "File system access lets an AI agent read, create, change, or delete files and folders on a computer or server. With this power, the agent can open a text file to pull data, write a new report, save logs, or tidy up old files without human help. It can also move files between folders to keep things organised. This tool is useful for tasks such as data processing, report generation, and backup jobs. Strong safety checks are needed so the agent touches only the right files, avoids private data, and cannot harm the system by mistake.", + "links": [] + }, + "TBH_DZTAfR8Daoh-njNFC": { + "title": "What is Agent Memory?", + "description": "Agent memory is the part of an AI agent that keeps track of what has already happened. It stores past user messages, facts the agent has learned, and its own previous steps. This helps the agent remember goals, user likes and dislikes, and important details across turns or sessions. Memory can be short-term, lasting only for one conversation, or long-term, lasting across many. With a good memory the agent avoids repeating questions, stays consistent, and plans better actions. Without it, the agent would forget everything each time and feel unfocused.", + "links": [] + }, + "M3U6RfIqaiut2nuOibY8W": { + "title": "Short Term Memory", + "description": "Short-term memory lets an AI agent hold recent facts while it works on a task. It keeps chat history, sensor readings, or current goals for a short time, often only for the length of one session. With this memory the agent can follow a user’s last request, track the next step in a plan, or keep variables needed for quick reasoning. Once the task ends or enough time passes, most of the stored items are cleared or moved to long-term memory. Because the data is small and brief, short-term memory is fast to read and write, which helps the agent react without delay. Common ways to build it include using a sliding window over recent messages, a small key-value store, or hidden states in a neural network. Good design of short-term memory prevents the agent from forgetting vital details too soon while avoiding overload with useless data.", + "links": [] + }, + "Ue633fz6Xu2wa2-KOAtdP": { + "title": "Long Term Memory", + "description": "Long term memory in an AI agent is the part of its storage where information is kept for long periods so it can be used again in the future. It works like a notebook that the agent can write to and read from whenever needed. The agent saves facts, past events, user preferences, and learned skills in this space. When a similar event happens later, the agent looks up this stored data to make better choices and respond in a consistent way. Long term memory lets the agent grow smarter over time because it does not forget important details after the current task ends. This memory usually lives in a database or file system and may include text, numbers, or compressed states of past conversations.", + "links": [] + }, + "EfCCNqLMJpWKKtamUa5gK": { + "title": "Episodic vs Semantic Memory", + "description": "Agent memory often has two parts. Episodic memory stores single events. It keeps data about what happened, when it happened, and who or what was involved. This lets the agent recall a past step-by-step experience, like a diary entry. Semantic memory stores facts that stay the same across time. It holds rules, concepts, and meanings, like the statement “Paris is the capital of France.” The key difference is time and context: episodic memory is tied to a specific moment, while semantic memory is timeless knowledge. Together they help the agent both remember past actions and use general truths to plan new ones.", + "links": [] + }, + "wkS4yOJ3JdZQE_yBID8K7": { + "title": "RAG and Vector Databases", + "description": "RAG, short for Retrieval-Augmented Generation, lets an AI agent pull facts from stored data each time it answers. The data sits in a vector database. In that database, every text chunk is turned into a number list called a vector. Similar ideas create vectors that lie close together, so the agent can find related chunks fast. When the user asks a question, the agent turns the question into its own vector, finds the nearest chunks, and reads them. It then writes a reply that mixes the new prompt with those chunks. Because the data store can hold a lot of past chats, documents, or notes, this process gives the agent a working memory without stuffing everything into the prompt. It lowers token cost, keeps answers on topic, and allows the memory to grow over time.", + "links": [] + }, + "QJqXHV8VHPTnfYfmKPzW7": { + "title": "User Profile Storage", + "description": "User profile storage is the part of an AI agent’s memory that holds stable facts about each user, such as name, age group, language, past choices, and long-term goals. The agent saves this data in a file or small database so it can load it each time the same user returns. By keeping the profile separate from short-term conversation logs, the agent can remember preferences without mixing them with temporary chat history. The profile is updated only when the user states a new lasting preference or when old information changes, which helps prevent drift or bloat. Secure storage, access controls, and encryption protect the data so that only the agent and the user can see it. Good profile storage lets the agent give answers that feel personal and consistent.", + "links": [] + }, + "jTDC19BTWCqxqMizrIJHr": { + "title": "Summarization / Compression", + "description": "Summarization or compression lets an AI agent keep the gist of past chats without saving every line. After a talk, the agent runs a small model or rule set that pulls out key facts, goals, and feelings and writes them in a short note. This note goes into long-term memory, while the full chat can be dropped or stored elsewhere. Because the note is short, the agent spends fewer tokens when it loads memory into the next prompt, so costs stay low and speed stays high. Good summaries leave out side jokes and filler but keep names, dates, open tasks, and user preferences. The agent can update the note after each session, overwriting old points that are no longer true. This process lets the agent remember what matters even after hundreds of turns.", + "links": [] + }, + "m-97m7SI0XpBnhEE8-_1S": { + "title": "Forgetting / Aging Strategies", + "description": "Forgetting or aging strategies help an AI agent keep only the useful parts of its memory and drop the rest over time. The agent may tag each memory with a time stamp and lower its importance as it gets older, or it may remove items that have not been used for a while, much like a “least-recently-used” list. Some systems give each memory a relevance score; when space runs low, they erase the lowest-scoring items first. Others keep a fixed-length sliding window of the most recent events or create short summaries and store those instead of raw details. These methods stop the memory store from growing without limits, cut storage costs, and let the agent focus on current goals. Choosing the right mix of aging rules is a trade-off: forget too fast and the agent loses context, forget too slow and it wastes resources or reacts to outdated facts.", + "links": [] + }, + "53xDks6JQ33fHMa3XcuCd": { + "title": "ReAct (Reason + Act)", + "description": "ReAct is an agent pattern that makes a model alternate between two simple steps: Reason and Act. First, the agent writes a short thought that sums up what it knows and what it should try next. Then it performs an action such as calling an API, running code, or searching a document. The result of that action is fed back, giving the agent fresh facts to think about. This loop repeats until the task is done. By showing its thoughts in plain text, the agent can be inspected, debugged, and even corrected on the fly. The clear split between thinking and doing also cuts wasted moves and guides the model toward steady progress. ReAct works well with large language models because they can both generate the chain of thoughts and choose the next tool in the very same response.", + "links": [] + }, + "1B0IqRNYdtbHDi1jHSXuI": { + "title": "Model Context Protocol (MCP)", + "description": "Model Context Protocol (MCP) is a rulebook that tells an AI agent how to pack background information before it sends a prompt to a language model. It lists what pieces go into the prompt—things like the system role, the user’s request, past memory, tool calls, or code snippets—and fixes their order. Clear tags mark each piece, so both humans and machines can see where one part ends and the next begins. Keeping the format steady cuts confusion, lets different tools work together, and makes it easier to test or swap models later. When agents follow MCP, the model gets a clean, complete prompt and can give better answers.", + "links": [] + }, + "9FryAIrWRHh8YlzKX3et5": { + "title": "MCP Hosts", + "description": "MCP Hosts are the computers or cloud services that run the Model Context Protocol. They keep the protocol code alive, listen for incoming calls, and pass data between users, tools, and language models. A host loads the MCP manifest, checks that requests follow the rules, and stores any state that needs to last between calls. It may cache recent messages, track token use, and add safety or billing checks before it forwards a prompt to the model. Hosts also expose an API endpoint so that outside apps can connect without knowing the low-level details of the protocol. You can run a host on your own laptop for testing or deploy it on a serverless platform for scale; either way, it provides the same trusted place where MCP agents, tools, and data meet.", + "links": [] + }, + "CGVstUxVXLJcYZrwk3iNQ": { + "title": "MCP Client", + "description": "The MCP Client is the part of an AI agent that talks directly to the large-language-model service. It gathers all messages, files, and tool signals that make up the current working state, packs them into the format defined by the Model Context Protocol, and sends the bundle to the model’s API. After the model answers, the client unpacks the reply, checks that it follows protocol rules, and hands the result to other modules, such as planners or tool runners. It also tracks tokens, applies privacy filters, retries on network errors, and logs key events for debugging. In short, the MCP Client is the gateway that turns local agent data into a valid model request and turns the model’s response into something the rest of the system can use.", + "links": [] + }, + "yv_-87FVM7WKn5iv6LW9q": { + "title": "MCP Servers", + "description": "An MCP Server is the main machine or cloud service that runs the Model Context Protocol. It keeps the shared “memory” that different AI agents need so they stay on the same page. When an agent sends a request, the server checks who is asking, pulls the right context from its store, and sends it back fast. It also saves new facts and task results so the next agent can use them. An MCP Server must handle many users at once, protect private data with strict access rules, and log every change for easy roll-back. Good servers break work into small tasks, spread them across many computers, and add backups so they never lose data. In short, the MCP Server is the hub that makes sure all agents share fresh, safe, and correct context.", + "links": [] + }, + "1NXIN-Hbjl5rPy_mqxQYW": { + "title": "Creating MCP Servers", + "description": "Creating an MCP server means building a program that stores and shares conversation data for AI agents using the Model Context Protocol. Start by choosing a language and web framework, then set up REST endpoints such as /messages, /state, and /health. Each endpoint sends or receives JSON that follows the MCP schema. Use a database or an in-memory store to keep session logs, and tag every entry with a session ID, role, and timestamp. Add token-based authentication so only trusted agents can read or write. Include filters and range queries so an agent can ask for just the parts of the log it needs. Limit message size and request rate to avoid overload. Finish by writing unit tests, adding monitoring, and running load checks to be sure the server stays reliable as traffic grows.", + "links": [] + }, + "iBtJp24F_kJE3YlBsW60s": { + "title": "Local Desktop", + "description": "A Local Desktop deployment means you run the MCP server on your own computer instead of on a remote machine or cloud service. You install the MCP software, any language runtimes it needs, and the model files all on your desktop or laptop. When you start the server, it listens on a port such as 127.0.0.1:8000, which is only reachable from the same computer unless you change network settings. This setup is handy for quick tests, small demos, or private work because you control the files and can restart the server at any time. It also avoids extra cost from cloud hosting. The main limits are the power of your hardware and the fact that other people cannot reach the service unless you expose it through port forwarding or a tunnel.", + "links": [] + }, + "dHNMX3_t1KSDdAWqgdJXv": { + "title": "Remote / Cloud", + "description": "Remote or cloud deployment places the MCP server on a cloud provider instead of a local machine. You package the server as a container or virtual machine, choose a service like AWS, Azure, or GCP, and give it compute, storage, and a public HTTPS address. A load balancer spreads traffic, while auto-scaling adds or removes copies of the server as demand changes. You secure the endpoint with TLS, API keys, and firewalls, and you send logs and metrics to the provider’s monitoring tools. This setup lets the server handle many users, updates are easier, and you avoid local hardware limits, though you must watch costs and protect sensitive data.", + "links": [] + }, + "qwdh5pkBbrF8LKPxbZp4F": { + "title": "Chain of Thought (CoT)", + "description": "Chain of Thought (CoT) is a way for an AI agent to think out loud. Before giving its final answer, the agent writes short notes that show each step it takes. These notes can list facts, name sub-tasks, or do small bits of math. By seeing the steps, the agent stays organized and is less likely to make a mistake. People who read the answer can also check the logic and spot any weak points. The same written steps can be fed back into the agent so it can plan, reflect, or fix itself. Because it is easy to use and boosts trust, CoT is one of the most common designs for language-based agents today.", + "links": [] + }, + "cW8O4vLLKEG-Q0dE8E5Zp": { + "title": "RAG Agent", + "description": "A RAG (Retrieval-Augmented Generation) agent mixes search with language generation so it can answer questions using fresh and reliable facts. When a user sends a query, the agent first turns that query into an embedding—basically a number list that captures its meaning. It then looks up similar embeddings in a vector database that holds passages from web pages, PDFs, or other text. The best-matching passages come back as context. The agent puts the original question and those passages into a large language model. The model writes the final reply, grounding every sentence in the retrieved text. This setup keeps the model smaller, reduces wrong guesses, and lets the system update its knowledge just by adding new documents to the database. Common tools for building a RAG agent include an embedding model, a vector store like FAISS or Pinecone, and an LLM connected through a framework such as LangChain or LlamaIndex.", + "links": [] + }, + "6YLCMWzystao6byCYCTPO": { + "title": "Planner Executor", + "description": "A planner-executor agent splits its work into two clear parts. First, the planner thinks ahead. It looks at a goal, lists the steps needed, and puts them in the best order. Second, the executor acts. It takes each planned step and carries it out, checking results as it goes. If something fails or the world changes, the planner may update the plan, and the executor follows the new steps. This divide-and-conquer style lets the agent handle big tasks without losing track of small actions. It is easy to debug, supports reuse of plans, and helps keep the agent’s behavior clear and steady.", + "links": [] + }, + "Ep8RoZSy_Iq_zWXlGQLZo": { + "title": "DAG Agents", + "description": "A DAG (Directed Acyclic Graph) agent is built from many small parts, called nodes, that form a one-way graph with no loops. Each node does a clear task, then passes its result to the next node along a directed edge. Because the graph has no cycles, data always moves forward and never gets stuck in endless repeats. This makes the flow of work easy to follow and test. The layout lets you run nodes that do not depend on each other at the same time, so the agent can work faster. If one node fails, you can see the exact path it took and fix just that part. DAG agents work well for jobs like data cleaning, multi-step reasoning, or any long chain of steps where order matters and backtracking is not needed.", + "links": [] + }, + "Nmy1PoB32DcWZnPM8l8jT": { + "title": "Tree-of-Thought", + "description": "Tree-of-Thought is a way to organize an AI agent’s reasoning as a branching tree. At the root, the agent states the main problem. Each branch is a small idea, step, or guess that could lead to a solution. The agent expands the most promising branches, checks if they make sense, and prunes paths that look wrong or unhelpful. This setup helps the agent explore many possible answers while staying focused on the best ones. Because the agent can compare different branches side by side, it is less likely to get stuck on a bad line of thought. The result is more reliable and creative problem solving.", + "links": [] + }, + "US6T5dXM8IY9V2qZnTOFW": { + "title": "Manual (from scratch)", + "description": "Building an AI agent from scratch means you write every part of the system yourself instead of using ready-made tools. You decide how the agent senses the world, saves data, learns, and makes choices. First, you choose a goal, like playing a game or answering questions. Then you design the inputs, for example keyboard moves or text. You code the logic that turns these inputs into actions. You may add a learning part, such as a basic neural network or a set of rules that update over time. You also build memory so the agent can use past facts. Testing is key: run the agent, watch what it does, and fix mistakes. This path is slow and hard, but it teaches you how each piece works and gives you full control.", + "links": [] + }, + "aafZxtjxiwzJH1lwHBODi": { + "title": "LLM Native \"Function Calling\"", + "description": "LLM native “function calling” lets a large language model decide when to run a piece of code and which inputs to pass to it. You first tell the model what functions are available. For each one you give a short name, a short description, and a list of arguments with their types. During a chat, the model can answer in JSON that matches this schema instead of plain text. Your wrapper program reads the JSON, calls the real function, and then feeds the result back to the model so it can keep going. This loop helps an agent search the web, look up data, send an email, or do any other task you expose. Because the output is structured, you get fewer mistakes than when the model tries to write raw code or natural-language commands. You also keep tight control over what the agent can and cannot do. Most current API providers support this method, so you can add new tools by only editing the schema and a handler, not the model itself.", + "links": [] + }, + "AQtxTTxmBpfl8BMgJbGzc": { + "title": "OpenAI Functions Calling", + "description": "OpenAI Function Calling lets you give a language model a list of tools and have it decide which one to use and with what data. You describe each tool with a short name, what it does, and the shape of its inputs in a small JSON-like schema. You then pass the user message and this tool list to the model. Instead of normal text, the model can reply with a JSON block that names the tool and fills in the needed arguments. Your program reads this block, runs the real function, and can send the result back for the next step. This pattern makes agent actions clear, easy to parse, and hard to abuse, because the model cannot run code on its own and all calls go through your checks. It also cuts down on prompt hacks and wrong formats, so agents work faster and more safely.", + "links": [] + }, + "_iIsBJTVS6OBf_dsdmbVO": { + "title": "Gemini Function Calling", + "description": "Gemini function calling lets you hook the Gemini language model to real code in a safe and simple way. You first list the functions you want it to use, each with a name, a short note about what it does, and a JSON schema for the needed arguments. When the user speaks, Gemini checks this list and, if a match makes sense, answers with a tiny JSON block that holds the chosen function name and the filled-in arguments. Your program then runs that function, sends the result back, and the chat moves on. Because the reply is strict JSON and not free text, you do not have to guess at what the model means, and you avoid many errors. This flow lets you build agents that pull data, call APIs, or carry out long action chains while keeping control of business logic on your side.", + "links": [] + }, + "37GBFVZ2J2d5r8bd1ViHq": { + "title": "OpenAI Assistant API", + "description": "The OpenAI Assistants API lets you add clear, task-specific actions to a chat with a large language model. You first describe each action you want the model to use, giving it a name, a short purpose, and a list of inputs in JSON form. During the chat, the model may decide that one of these actions will help. It then returns the name of the action and a JSON object with the input values it thinks are right. Your code receives this call, runs real work such as a database query or a web request, and sends the result back to the model. The model reads the result and continues the chat, now armed with fresh facts. This loop lets you keep control of what real work happens while still letting the model plan and talk in natural language.", + "links": [] + }, + "Ka6VpCEnqABvwiF9vba7t": { + "title": "Langchain", + "description": "LangChain is a Python and JavaScript library that helps you put large language models to work in real products. It gives ready-made parts for common agent tasks such as talking to many tools, keeping short-term memory, and calling an external API when the model needs fresh data. You combine these parts like Lego blocks: pick a model, add a prompt template, chain the steps, then wrap the chain in an “agent” that can choose what step to run next. Built-in connectors link to OpenAI, Hugging Face, vector stores, and SQL databases, so you can search documents or pull company data without writing a lot of glue code. This lets you move fast from idea to working bot, while still letting you swap out parts if your needs change.", + "links": [] + }, + "iEHF-Jm3ck-Iu85EbCoDi": { + "title": "LlamaIndex", + "description": "LlamaIndex is an open-source Python toolkit that helps you give a language model access to your own data. You load files such as PDFs, web pages, or database rows. The toolkit breaks the text into chunks, turns them into vectors, and stores them in a chosen vector store like FAISS or Pinecone. When a user asks a question, LlamaIndex finds the best chunks, adds them to the prompt, and sends the prompt to the model. This flow is called retrieval-augmented generation and it lets an agent give answers grounded in your content. The library offers simple classes for loading, indexing, querying, and composing tools, so you write less boilerplate code. It also works with other frameworks, including LangChain, and supports models from OpenAI or Hugging Face. With a few lines of code you can build a chatbot, Q&A system, or other agent that knows your documents.", + "links": [] + }, + "XS-FsvtrXGZ8DPrwOsnlI": { + "title": "Haystack", + "description": "Haystack is an open-source Python framework that helps you build search and question-answering agents fast. You connect your data sources, pick a language model, and set up pipelines that find the best answer to a user’s query. Haystack handles tasks such as indexing documents, retrieving passages, running the model, and ranking results. It works with many back-ends like Elasticsearch, OpenSearch, FAISS, and Pinecone, so you can scale from a laptop to a cluster. You can add features like summarization, translation, and document chat by dropping extra nodes into the pipeline. The framework also offers REST APIs, a web UI, and clear tutorials, making it easy to test and deploy your agent in production.", + "links": [] + }, + "7YtnQ9-KIvGPSpDzEDexl": { + "title": "AutoGen", + "description": "AutoGen is an open-source Python framework that helps you build AI agents without starting from scratch. It lets you define each agent with a role, goals, and tools, then handles the chat flow between them and a large language model such as GPT-4. You can chain several agents so they plan, code, review, and run tasks together. The library includes ready-made modules for memory, task planning, tool calling, and function execution, so you only write the parts that are unique to your app. AutoGen connects to OpenAI, Azure, or local models through a simple settings file. Logs, cost tracking, and step-by-step debugging come built in, which makes testing easy. Because the agents are plain Python objects, you can mix them with other libraries or your own code. AutoGen is still young, so expect fast changes and keep an eye on usage costs, but it is a strong choice when you want to turn a prompt into a working multi-agent system in hours instead of weeks.", + "links": [] + }, + "uFPJqgU4qGvZyxTv-osZA": { + "title": "CrewAI", + "description": "CrewAI is an open-source Python framework that lets you join several language-model agents into one team, called a crew. Each agent gets a name, a role, and a set of skills, and the library handles planning, task routing, and chat among them. To use it, you install the package, import it, define your agents in a few lines of code, link them with a Crew object, and give the crew a mission prompt. CrewAI then talks to an LLM such as OpenAI GPT-4 or Claude, passes messages between agents, runs any tools you attach, and returns a single answer. You can plug in web search, Python functions, or vector stores for memory, and you can tune settings like temperature or max tokens. Built-in logs show every step so you can debug and improve the workflow. The result is a fast way to build multi-step agent systems for tasks like research, code review, or content creation without writing a lot of low-level glue code.", + "links": [] + }, + "eWxQiBrxIUG2JNcrdfIHS": { + "title": "Smol Depot", + "description": "Smol Depot is an open-source kit that lets you bundle all the parts of a small AI agent in one place. You keep prompts, settings, and code files together in a single folder, then point the Depot tool at that folder to spin the agent up. The tool handles tasks such as loading models, saving chat history, and calling outside APIs, so you do not have to write that glue code yourself. A simple command can copy a starter template, letting you focus on the logic and prompts that make your agent special. Because everything lives in plain files, you can track changes with Git and share the agent like any other project. This makes Smol Depot a quick way to build, test, and ship lightweight agents without a heavy framework.", + "links": [] + }, + "1EZFbDHA5J5_5BPMLMxXb": { + "title": "Anthropic Tool Use", + "description": "Anthropic Tool Use lets you connect a Claude model to real software functions so the agent can do useful tasks on its own. You give Claude a list of tools, each with a name, a short description, and a strict JSON schema that shows the allowed input fields. During a chat you send user text plus this tool list. Claude decides if a tool should run, picks one, and returns a JSON block that matches the schema. Your code reads the JSON, calls the matching function, and sends the result back to Claude for the next step. This loop repeats until no more tool calls are needed. Clear schemas, small field sets, and helpful examples make the calls accurate. By keeping the model in charge of choosing tools while your code controls real actions, you gain both flexibility and safety.", + "links": [ + { + "title": "Anthropic Tool Use", + "url": "https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview", + "type": "article" + } + ] + }, + "v8qLnyFRnEumodBYxQSXQ": { + "title": "Metrics to Track", + "description": "To know if an AI agent works well, you need numbers that tell the story. Track accuracy, precision, recall, and F1 score to see how often the agent is right. For ranking tasks, record mean average precision or ROC-AUC. If users interact with the agent, measure response time, latency, and the share of failed requests. Safety metrics count toxic or biased outputs, while robustness tests see how the agent copes with noisy or tricky inputs. Resource metrics—memory, CPU, and energy—show if the system can run at scale. Choose the metrics that fit the task, compare results to a baseline, and watch the trend with every new version.", + "links": [] + }, + "qo_O4YAe4-MTP_ZJoXJHR": { + "title": "Unit Testing for Individual Tools", + "description": "Unit testing checks that each tool an AI agent uses works as expected when it stands alone. You write small tests that feed the tool clear input and then compare its output to a known correct answer. If the tool is a function that parses dates, you test many date strings and see if the function gives the right results. Good tests cover normal cases, edge cases, and error cases. Run the tests every time you change the code. When a test fails, fix the tool before moving on. This habit keeps bugs from spreading into larger agent workflows and makes later debugging faster.", + "links": [] + }, + "P9-SiIda3TSjHsfkI5OUV": { + "title": "Integration Testing for Flows", + "description": "Integration testing for flows checks that an AI agent works well from the first user input to the final action, across every step in between. It joins all parts of the system—natural-language understanding, planning, memory, tools, and output—and runs them together in real scenarios. Test cases follow common and edge-case paths a user might take. The goal is to catch errors that only appear when parts interact, such as wrong data passed between modules or timing issues. Good practice includes building automated test suites, using real or mock services, and logging each step for easy debugging. When integration tests pass, you gain confidence that the whole flow feels smooth and reliable for users.", + "links": [] + }, + "rHxdxN97ZcU7MPl8L1jzN": { + "title": "Human in the Loop Evaluation", + "description": "Human-in-the-loop evaluation checks an AI agent by letting real people judge its output and behavior. Instead of trusting only automated scores, testers invite users, domain experts, or crowd workers to watch tasks, label answers, flag errors, and rate clarity, fairness, or safety. Their feedback shows problems that numbers alone miss, such as hidden bias, confusing language, or actions that feel wrong to a person. Teams study these notes, adjust the model, and run another round, repeating until the agent meets quality and trust goals. Mixing human judgment with data leads to a system that is more accurate, useful, and safe for everyday use.", + "links": [] + }, + "xp7TCTRE9HP60_rGzTUF6": { + "title": "LangSmith", + "description": "LangSmith is a tool that helps you see how well your AI agents work. It lets you record every step the agent takes, from the first input to the final answer. You can replay these steps to find places where the agent goes wrong. LangSmith also lets you create test sets with real user prompts and compare new model versions against them. It shows clear numbers on speed, cost, and accuracy so you can spot trade-offs. Because LangSmith links to LangChain, you can add it with only a few extra lines of code. The web dashboard then gives charts, error logs, and side-by-side result views. This makes it easy to track progress, fix bugs, and prove that your agent is getting better over time.", + "links": [] + }, + "YzEDtGEaMaMWVt0W03HRt": { + "title": "Ragas", + "description": "Ragas is an open-source tool used to check how well a Retrieval-Augmented Generation (RAG) agent works. You give it the user question, the passages the agent pulled from a knowledge base, and the final answer. Ragas then scores the answer for things like correctness, relevance, and whether the cited passages really support the words in the answer. It uses large language models under the hood, so you do not need to write your own scoring rules. Results appear in a clear report that shows strong and weak spots in the pipeline. With this feedback you can change prompts, retriever settings, or model choices and quickly see if quality goes up. This makes testing RAG systems faster, repeatable, and less guess-based.", + "links": [] + }, + "0924QUH1wV7Mp-Xu0FAhF": { + "title": "DeepEval", + "description": "DeepEval is an open-source tool that helps you test and score the answers your AI agent gives. You write small test cases that show an input and the reply you hope to get, or a rule the reply must follow. DeepEval runs the agent, checks the reply with built-in measures such as similarity, accuracy, or safety, and then marks each test as pass or fail. You can add your own checks, store tests in code or YAML files, and run them in a CI pipeline so every new model or prompt version gets the same quick audit. The fast feedback makes it easy to spot errors, cut down on hallucinations, and compare different models before you ship.", + "links": [] + }, + "zs6LM8WEnb0ERWpiaQCgc": { + "title": "Structured logging & tracing", + "description": "Structured logging and tracing are ways to record what an AI agent does so you can find and fix problems fast. Instead of dumping plain text, the agent writes logs in a fixed key-value format, such as time, user\\_id, step, and message. Because every entry follows the same shape, search tools can filter, sort, and count events with ease. Tracing links those log lines into a chain that follows one request or task across many functions, threads, or microservices. By adding a unique trace ID to each step, you can see how long each part took and where errors happened. Together, structured logs and traces offer clear, machine-readable data that helps developers spot slow code paths, unusual behavior, and hidden bugs without endless manual scans.", + "links": [] + }, + "SS8mGqf9wfrNqenIWvN8Z": { + "title": "LangSmith", + "description": "LangSmith is a web tool that helps you see and fix what your AI agents are doing. It records each call that the agent makes to a language model, the input it used, and the answer it got back. You can replay any step, compare different prompts, measure cost, speed, and error rates, and tag runs for easy search. It also lets you store test sets and run quick checks so you know if new code makes the agent worse. By showing clear traces and charts, LangSmith makes it easier to debug, improve, and trust AI systems built with LangChain or other frameworks.", + "links": [] + }, + "MLxP5N0Vrmwh-kyvNeGXn": { + "title": "Helicone", + "description": "Helicone is an open-source tool that helps you watch and understand how your AI agents talk to large language models. You send your model calls through Helicone’s proxy, and it records each request and response without changing the result. A clear web dashboard then shows logs, latency, token counts, error rates, and cost for every call. You can filter, search, and trace a single user journey, which makes it easy to spot slow prompts or rising costs. Helicone also lets you set alerts and share traces with your team, so problems get fixed fast and future changes are safer.", + "links": [] + }, + "UoIheaJlShiceafrWALEH": { + "title": "LangFuse", + "description": "LangFuse is a free, open-source tool that lets you watch and debug AI agents while they run. You add a small code snippet to your agent, and LangFuse starts collecting every prompt, model response, and user input. It shows this data as neat timelines, so you can see each step the agent takes, how long the calls cost, and where errors happen. You can tag runs, search through them, and compare different prompt versions to find what works best. The dashboard also tracks token usage and latency, helping you cut cost and improve speed. Because LangFuse stores data in your own database, you keep full control of sensitive text. It works well with popular frameworks like LangChain and can send alerts to Slack or email when something breaks.", + "links": [] + }, + "7UqPXUzqKYXklnB3x-tsv": { + "title": "openllmetry", + "description": "openllmetry is a small Python library that makes it easy to watch what your AI agent is doing and how well it is working. It wraps calls to large-language-model APIs, vector stores, and other tools, then sends logs, traces, and simple metrics to any backend that speaks the OpenTelemetry standard, such as Jaeger, Zipkin, or Grafana. You add one or two lines of code at start-up, and the library captures prompt text, model name, latency, token counts, and costs each time the agent asks the model for an answer. The data helps you spot slow steps, high spend, or bad answers, and it lets you play back full traces to debug agent chains. Because it follows OpenTelemetry, you can mix these AI traces with normal service traces and see the whole flow in one place.", + "links": [] + }, + "SU2RuicMUo8tiAsQtDI1k": { + "title": "Prompt Injection / Jailbreaks", + "description": "Prompt injection, also called a jailbreak, is a trick that makes an AI system break its own rules. An attacker hides special words or symbols inside normal-looking text. When the AI reads this text, it follows the hidden instructions instead of its safety rules. The attacker might force the AI to reveal private data, produce harmful content, or give wrong advice. This risk grows when the AI talks to other software or pulls text from the internet, because harmful prompts can slip in without warning. Good defenses include cleaning user input, setting strong guardrails inside the model, checking outputs for policy breaks, and keeping humans in the loop for high-risk tasks.", + "links": [] + }, + "UVzLGXG6K7HQVHmw8ZAv2": { + "title": "Tool sandboxing / Permissioning", + "description": "Tool sandboxing keeps the AI agent inside a safe zone where it can only run approved actions and cannot touch the wider system. Permissioning sets clear rules that say which files, networks, or commands the agent may use. Together they stop errors, leaks, or abuse by limiting what the agent can reach and do. Developers grant the smallest set of rights, watch activity, and block anything outside the plan. If the agent needs new access, it must ask and get a fresh permit. This simple fence protects user data, reduces harm, and builds trust in the agent’s work.", + "links": [] + }, + "rdlYBJNNyZUshzsJawME4": { + "title": "Data Privacy + PII Redaction", + "description": "AI agents often handle user text, images, and logs that carry personal data such as names, phone numbers, addresses, or ID numbers. If this data leaks, people may face fraud, stalking, or other harm. Privacy laws like GDPR and CCPA require teams to keep such data safe and to use it only for clear, lawful reasons. A key safeguard is PII redaction: the system scans each input and output, finds any detail that can identify a person, and masks or deletes it before storage or sharing. Redaction methods include simple pattern rules, machine-learning models, or a mix of both. Keep audit trails, set strong access limits, and test the redaction flow often to be sure no private detail slips through.", + "links": [] + }, + "EyLo2j8IQsIK91SKaXkmK": { + "title": "Bias & Toxicity Guardrails", + "description": "Bias and toxicity guardrails keep an AI agent from giving unfair or harmful results. Bias shows up when training data favors certain groups or views. Toxicity is language that is hateful, violent, or rude. To stop this, start with clean and balanced data. Remove slurs, stereotypes, and spam. Add examples from many voices so the model learns fair patterns. During training, test the model often and adjust weights or rules that lean one way. After training, put filters in place that block toxic words or flag unfair answers before users see them. Keep logs, run audits, and ask users for feedback to catch new issues early. Write down every step so builders and users know the limits and risks. These actions protect people, follow laws, and help users trust the AI.", + "links": [] + }, + "63nsfJFO1BwjLX_ZVaPFC": { + "title": "Safety + Red Team Testing", + "description": "Safety + Red Team Testing is the practice of checking an AI agent for harmful or risky behavior before and after release. Safety work sets rules, guardrails, and alarms so the agent follows laws, keeps data private, and treats people fairly. Red team testing sends skilled testers to act like attackers or troublemakers. They type tricky prompts, try to leak private data, force biased outputs, or cause the agent to give dangerous advice. Every weakness they find is logged and fixed by adding filters, better training data, stronger limits, or live monitoring. Running these tests often lowers the chance of real-world harm and builds trust with users and regulators.", + "links": [] + } +} \ No newline at end of file diff --git a/public/roadmap-content/ai-data-scientist.json b/public/roadmap-content/ai-data-scientist.json index da8c78dfb..36b452118 100644 --- a/public/roadmap-content/ai-data-scientist.json +++ b/public/roadmap-content/ai-data-scientist.json @@ -111,7 +111,7 @@ }, { "title": "Step by Step Process for Planning an A/B Test", - "url": "https://towardsdatascience.com/step-by-step-for-planning-an-a-b-test-ef3c93143c0b", + "url": "https://medium.com/data-science/step-by-step-for-planning-an-a-b-test-ef3c93143c0b", "type": "article" }, { diff --git a/public/roadmap-content/ai-red-teaming.json b/public/roadmap-content/ai-red-teaming.json index bb15d8009..1475d3256 100644 --- a/public/roadmap-content/ai-red-teaming.json +++ b/public/roadmap-content/ai-red-teaming.json @@ -22,18 +22,24 @@ }, "fNTb9y3zs1HPYclAmu_Wv": { "title": "Why Red Team AI Systems?", - "description": "AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment.", - "links": [] + "description": "AI systems introduce novel risks beyond traditional software, such as emergent unintended capabilities, complex failure modes, susceptibility to subtle data manipulations, and potential for large-scale misuse (e.g., generating disinformation). AI Red Teaming is necessary because standard testing methods often fail to uncover these unique AI vulnerabilities. It provides critical, adversary-focused insights needed to build genuinely safe, reliable, and secure AI before deployment.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Introduction to Prompt Hacking", + "url": "https://learnprompting.org/courses/intro-to-prompt-hacking", + "type": "course" + }, + { + "title": "Prompt Hacking Offensive Measures", + "url": "https://learnprompting.org/docs/prompt_hacking/offensive_measures/introduction", + "type": "article" + } + ] }, "HFJIYcI16OMyM77fAw9af": { "title": "Introduction", "description": "AI Red Teaming is the practice of simulating adversarial attacks against AI systems to proactively identify vulnerabilities, potential misuse scenarios, and failure modes before malicious actors do. Distinct from traditional cybersecurity red teaming, it focuses on the unique attack surfaces of AI models, such as prompt manipulation, data poisoning, model extraction, and evasion techniques. The primary goal for an AI Red Teamer is to test the robustness, safety, alignment, and fairness of AI systems, particularly complex ones like LLMs, by adopting an attacker's mindset to uncover hidden flaws and provide actionable feedback for improvement.\n\nLearn more from the following resources:", "links": [ - { - "title": "Red Team Podcast - AI Red Teaming Insights & Defense Strategies", - "url": "https://mindgard.ai/podcast/red-team", - "type": "podcast" - }, { "title": "A Guide to AI Red Teaming", "url": "https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/", @@ -69,11 +75,6 @@ "title": "Responsible AI Principles (Microsoft)", "url": "https://www.microsoft.com/en-us/ai/responsible-ai", "type": "article" - }, - { - "title": "Questions to Guide AI Red-Teaming (CMU SEI)", - "url": "https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=928382", - "type": "video" } ] }, @@ -92,8 +93,8 @@ "type": "article" }, { - "title": "What is AI Red Teaming? - Learn Prompting", - "url": "https://learnprompting.org/docs/category/ai-red-teaming", + "title": "Red Teaming in Defending AI Systems", + "url": "https://protectai.com/blog/expanding-role-red-teaming-defending-ai-systems", "type": "article" } ] @@ -187,13 +188,13 @@ "description": "AI Red Teamers focus heavily on generative models (like GANs and LLMs) due to their widespread use and unique risks. Understanding how they generate content is key to testing for issues like generating harmful/biased outputs, deepfakes, prompt injection vulnerabilities, or leaking sensitive information from their vast training data.\n\nLearn more from the following resources:", "links": [ { - "title": "Generative AI for Beginners", - "url": "https://microsoft.github.io/generative-ai-for-beginners/", + "title": "Introduction to Generative AI", + "url": "https://learnprompting.org/courses/intro-to-gen-ai", "type": "course" }, { - "title": "An Introduction to Generative Models", - "url": "https://www.mongodb.com/resources/basics/artificial-intelligence/generative-models", + "title": "What is Generative AI?", + "url": "https://learnprompting.org/docs/basics/generative_ai", "type": "article" }, { @@ -213,8 +214,8 @@ "type": "article" }, { - "title": "Introduction to LLMs - Learn Prompting", - "url": "https://learnprompting.org/docs/intro_to_llms", + "title": "ChatGPT For Everyone", + "url": "https://learnprompting.org/courses/chatgpt-for-everyone", "type": "article" }, { @@ -233,21 +234,11 @@ "url": "https://learnprompting.org/courses/intro-to-prompt-engineering", "type": "course" }, - { - "title": "Introduction to Prompt Engineering", - "url": "https://www.datacamp.com/tutorial/introduction-prompt-engineering", - "type": "article" - }, { "title": "System Prompts - InjectPrompt", "url": "https://www.injectprompt.com/t/system-prompts", "type": "article" }, - { - "title": "Prompt Engineering Guide", - "url": "https://learnprompting.org/docs/prompt-engineering", - "type": "article" - }, { "title": "The Ultimate Guide to Red Teaming LLMs and Adversarial Prompts (Kili Technology)", "url": "https://kili-technology.com/large-language-models-llms/red-teaming-llms-and-adversarial-prompts", @@ -294,11 +285,6 @@ "title": "Threat Modeling", "url": "https://owasp.org/www-community/Threat_Modeling", "type": "article" - }, - { - "title": "How Microsoft Approaches AI Red Teaming (MS Build)", - "url": "https://learn.microsoft.com/en-us/events/build-may-2023/breakout-responsible-ai-red-teaming/", - "type": "video" } ] }, @@ -354,8 +340,8 @@ "type": "article" }, { - "title": "Prompt Hacking Guide - Learn Prompting", - "url": "https://learnprompting.org/docs/category/prompt-hacking", + "title": "Jailbreaking Guide - Learn Prompting", + "url": "https://learnprompting.org/docs/prompt_hacking/jailbreaking", "type": "article" }, { @@ -428,7 +414,7 @@ }, { "title": "Prompt Hacking Guide", - "url": "https://learnprompting.org/docs/category/prompt-hacking", + "url": "https://learnprompting.org/docs/prompt_hacking/introduction", "type": "article" }, { @@ -442,6 +428,11 @@ "title": "Direct", "description": "Direct injection attacks occur when malicious instructions are inserted directly into the prompt input field by the user interacting with the LLM. AI Red Teamers use this technique to assess if basic instructions like \"Ignore previous prompt\" can immediately compromise the model's safety or intended function, testing the robustness of the system prompt's influence.\n\nLearn more from the following resources:", "links": [ + { + "title": "Prompt Injection", + "url": "https://learnprompting.org/docs/prompt_hacking/injection?srsltid=AfmBOooOKRzLT0Hn2PNdAa69Fietniztfds6Fo1PO8WuIyyXjbLb6XgI", + "type": "article" + }, { "title": "Prompt Injection & the Rise of Prompt Attacks", "url": "https://www.lakera.ai/blog/guide-to-prompt-injection", @@ -451,11 +442,6 @@ "title": "Prompt Injection Cheat Sheet (FlowGPT)", "url": "https://flowgpt.com/p/prompt-injection-cheat-sheet", "type": "article" - }, - { - "title": "OpenAI GPT-4 System Card", - "url": "https://openai.com/research/gpt-4-system-card", - "type": "article" } ] }, @@ -474,8 +460,8 @@ "type": "article" }, { - "title": "Jailbreaks via Indirect Injection (Practical AI Safety Newsletter)", - "url": "https://newsletter.practicalai.safety/p/jailbreaks-via-indirect-injection", + "title": "Indirect Prompt Injection Data Exfiltration", + "url": "https://embracethered.com/blog/posts/2024/chatgpt-macos-app-persistent-data-exfiltration/", "type": "article" } ] @@ -484,6 +470,11 @@ "title": "Countermeasures", "description": "AI Red Teamers must also understand and test defenses against prompt hacking. This includes evaluating the effectiveness of input sanitization, output filtering, instruction demarcation (e.g., XML tagging), contextual awareness checks, model fine-tuning for resistance, and applying the principle of least privilege to LLM capabilities and tool access.\n\nLearn more from the following resources:", "links": [ + { + "title": "Prompt Hacking Defensive Measures", + "url": "https://learnprompting.org/docs/prompt_hacking/defensive_measures/introduction", + "type": "article" + }, { "title": "Mitigating Prompt Injection Attacks (NCC Group Research)", "url": "https://research.nccgroup.com/2023/12/01/mitigating-prompt-injection-attacks/", @@ -516,8 +507,8 @@ "type": "article" }, { - "title": "Secure Plugin Sandboxing (OpenAI Plugins)", - "url": "https://platform.openai.com/docs/plugins/production/security-requirements", + "title": "Code Injection", + "url": "https://learnprompting.org/docs/prompt_hacking/offensive_measures/code_injection", "type": "article" }, { @@ -537,8 +528,8 @@ "type": "article" }, { - "title": "Attacking AI Models (Trail of Bits Blog Series)", - "url": "https://blog.trailofbits.com/category/ai-security/", + "title": "Weaknesses in Modern AI", + "url": "https://insights.sei.cmu.edu/blog/weaknesses-and-vulnerabilities-in-modern-ai-why-security-and-safety-are-so-challenging/", "type": "article" }, { @@ -562,11 +553,6 @@ "url": "https://skycryptor.com/blog/how-to-steal-a-machine-learning-model", "type": "article" }, - { - "title": "Defense Against Model Stealing (Microsoft Research)", - "url": "https://www.microsoft.com/en-us/research/publication/defense-against-model-stealing-attacks/", - "type": "article" - }, { "title": "On the Limitations of Model Stealing with Uncertainty Quantification Models", "url": "https://openreview.net/pdf?id=ONRFHoUzNk", @@ -579,8 +565,8 @@ "description": "AI Red Teamers test if vulnerabilities in the AI system or its interfaces allow attackers to gain unauthorized access to data, functionalities, or underlying infrastructure. This includes attempting privilege escalation via prompts, exploiting insecure API endpoints connected to the AI, or manipulating the AI to access restricted system resources.\n\nLearn more from the following resources:", "links": [ { - "title": "Unauthorized Data Access via LLMs (Security Boulevard)", - "url": "https://securityboulevard.com/2023/11/unauthorized-data-access-via-llms/", + "title": "Defending Model Files from Unauthorized Access", + "url": "https://developer.nvidia.com/blog/defending-ai-model-files-from-unauthorized-access-with-canaries/", "type": "article" }, { @@ -589,8 +575,8 @@ "type": "article" }, { - "title": "AI System Abuse Cases (Harvard Belfer Center)", - "url": "https://www.belfercenter.org/publication/ai-system-abuse-cases", + "title": "Detecting Unauthorized Usage", + "url": "https://www.unr.edu/digital-learning/instructional-strategies/understanding-and-integrating-generative-ai-in-teaching/how-can-i-detect-unauthorized-ai-usage", "type": "article" } ] @@ -604,11 +590,6 @@ "url": "https://www.aiblade.net/p/ai-poisoning-is-it-really-a-threat", "type": "article" }, - { - "title": "Data Poisoning Attacks in ML (Towards Data Science)", - "url": "https://towardsdatascience.com/data-poisoning-attacks-in-machine-learning-542169587b7f", - "type": "article" - }, { "title": "Detecting and Preventing Data Poisoning Attacks on AI Models", "url": "https://arxiv.org/abs/2503.09302", @@ -625,11 +606,6 @@ "title": "Adversarial Examples", "description": "A core AI Red Teaming activity involves generating adversarial examples – inputs slightly perturbed to cause misclassification or bypass safety filters – to test model robustness. Red teamers use various techniques (gradient-based, optimization-based, or black-box methods) to find inputs that exploit model weaknesses, informing developers on how to harden the model.\n\nLearn more from the following resources:", "links": [ - { - "title": "Adversarial Examples Explained (OpenAI Blog)", - "url": "https://openai.com/research/adversarial-examples", - "type": "article" - }, { "title": "Adversarial Examples – Interpretable Machine Learning Book", "url": "https://christophm.github.io/interpretable-ml-book/adversarial.html", @@ -651,11 +627,6 @@ "title": "Model Inversion", "description": "AI Red Teamers perform model inversion tests to assess if an attacker can reconstruct sensitive training data (like images, text snippets, or personal attributes) by repeatedly querying the model and analyzing its outputs. Success indicates privacy risks due to data memorization, requiring mitigation techniques like differential privacy or output filtering.\n\nLearn more from the following resources:", "links": [ - { - "title": "Model Inversion Attacks for ML (Medium)", - "url": "https://medium.com/@ODSC/model-inversion-attacks-for-machine-learning-ff407a1b10d1", - "type": "article" - }, { "title": "Model inversion and membership inference: Understanding new AI security risks", "url": "https://www.hoganlovells.com/en/publications/model-inversion-and-membership-inference-understanding-new-ai-security-risks-and-mitigating-vulnerabilities", @@ -775,11 +746,6 @@ "title": "What is remote code execution?", "url": "https://www.cloudflare.com/learning/security/what-is-remote-code-execution/", "type": "article" - }, - { - "title": "DEFCON 31 - AI Village - Hacking an LLM embedded system (agent) - Johann Rehberger", - "url": "https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3D6u04C1N69ks?v=1FfYnF2GXVU", - "type": "video" } ] }, @@ -808,11 +774,6 @@ "title": "API Protection", "description": "AI Red Teamers rigorously test the security of APIs providing access to AI models. They probe for OWASP API Top 10 vulnerabilities like broken authentication/authorization, injection flaws, security misconfigurations, and lack of rate limiting, specifically evaluating how these could lead to misuse or compromise of the AI model itself.\n\nLearn more from the following resources:", "links": [ - { - "title": "API Protection for AI Factories: The First Step to AI Security", - "url": "https://www.f5.com/company/blog/api-security-for-ai-factories", - "type": "article" - }, { "title": "Securing APIs with AI for Advanced Threat Protection", "url": "https://adevait.com/artificial-intelligence/securing-apis-with-ai", @@ -845,9 +806,9 @@ "type": "article" }, { - "title": "How JWTs are used for Authentication (and how to bypass it)", - "url": "https://www.google.com/search?q=https://www.youtube.com/watch%3Fv%3Dexample_video_panel_url?v=3OpQi65s_ME", - "type": "video" + "title": "JWT Attacks", + "url": "https://portswigger.net/web-security/jwt", + "type": "article" } ] }, @@ -903,13 +864,13 @@ "type": "article" }, { - "title": "White-Box Adversarial Examples (OpenAI Blog)", - "url": "https://openai.com/research/adversarial-robustness-toolbox", + "title": "What is White Box Penetration Testing", + "url": "https://www.getastra.com/blog/security-audit/white-box-penetration-testing/", "type": "article" }, { - "title": "LLM red teaming guide (open source)", - "url": "https://www.promptfoo.dev/docs/red-team/", + "title": "The Art of White Box Pentesting", + "url": "https://infosecwriteups.com/cracking-the-code-the-art-of-white-box-pentesting-de296bc22c67", "type": "article" } ] @@ -950,8 +911,8 @@ "type": "article" }, { - "title": "LLM red teaming guide (open source)", - "url": "https://www.promptfoo.dev/docs/red-team/", + "title": "Spikee", + "url": "https://spikee.ai", "type": "article" } ] @@ -1041,8 +1002,13 @@ }, "et1Xrr8ez-fmB0mAq8W_a": { "title": "Benchmark Datasets", - "description": "AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models.\n\nLearn more from the following resources:", + "description": "AI Red Teamers may use or contribute to benchmark datasets specifically designed to evaluate AI security. These datasets (like HackAprompt, SecBench, NYU CTF Bench, CySecBench) contain prompts or scenarios targeting vulnerabilities, safety issues, or specific cybersecurity capabilities, allowing for standardized testing of models.\n\nLearn more from the following resources:", "links": [ + { + "title": "HackAPrompt Dataset", + "url": "https://huggingface.co/datasets/hackaprompt/hackaprompt-dataset", + "type": "article" + }, { "title": "CySecBench: Generative AI-based CyberSecurity-focused Prompt Dataset", "url": "https://github.com/cysecbench/dataset", @@ -1116,11 +1082,6 @@ "url": "https://www.coursera.org/learn/ai-security", "type": "course" }, - { - "title": "Exploring Adversarial Machine Learning", - "url": "https://www.nvidia.com/en-us/training/instructor-led-workshops/exploring-adversarial-machine-learning/", - "type": "course" - }, { "title": "Free Online Cyber Security Courses with Certificates in 2025", "url": "https://www.eccouncil.org/cybersecurity-exchange/cyber-novice/free-cybersecurity-courses-beginners/", @@ -1133,13 +1094,13 @@ "description": "Beyond formal certifications, recognition in the AI Red Teaming field comes from practical achievements like finding significant vulnerabilities (responsible disclosure), winning AI-focused CTFs or hackathons (like HackAPrompt), contributing to AI security research, or building open-source testing tools.\n\nLearn more from the following resources:", "links": [ { - "title": "DEF CON - Wikipedia (Mentions Black Badge)", - "url": "https://en.wikipedia.org/wiki/DEF_CON#Black_Badge", + "title": "HackAPrompt", + "url": "https://hackaprompt.com", "type": "article" }, { - "title": "HackAPrompt (Learn Prompting)", - "url": "https://learnprompting.org/hackaprompt", + "title": "RedTeam Arena", + "url": "https://redarena.ai", "type": "article" } ] @@ -1148,6 +1109,16 @@ "title": "Lab Environments", "description": "AI Red Teamers need environments to practice attacking vulnerable systems safely. While traditional labs (HTB, THM, VulnHub) build general pentesting skills, platforms are emerging with labs specifically focused on AI/LLM vulnerabilities, prompt injection, or adversarial ML challenges.\n\nLearn more from the following resources:", "links": [ + { + "title": "HackAPrompt Playground", + "url": "https://learnprompting.org/hackaprompt-playground", + "type": "article" + }, + { + "title": "InjectPrompt Playground", + "url": "https://playground.injectprompt.com/", + "type": "article" + }, { "title": "Gandalf AI Prompt Injection Lab", "url": "https://gandalf.lakera.ai/", @@ -1162,11 +1133,6 @@ "title": "TryHackMe: Learn Cyber Security", "url": "https://tryhackme.com/", "type": "article" - }, - { - "title": "VulnHub", - "url": "https://www.vulnhub.com/", - "type": "article" } ] }, @@ -1175,8 +1141,8 @@ "description": "Capture The Flag competitions increasingly include AI/ML security challenges. Participating in CTFs (tracked on CTFtime) or platforms like picoCTF helps AI Red Teamers hone skills in reverse engineering, web exploitation, and cryptography applied to AI systems, including specialized AI safety CTFs.\n\nLearn more from the following resources:", "links": [ { - "title": "https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)", - "url": "https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)", + "title": "HackAPrompt", + "url": "https://www.hackaprompt.com/", "type": "article" }, { @@ -1188,11 +1154,6 @@ "title": "CTFtime.org", "url": "https://ctftime.org/", "type": "article" - }, - { - "title": "picoCTF", - "url": "https://picoctf.org/", - "type": "article" } ] }, @@ -1274,13 +1235,13 @@ "description": "Engaging in online forums, mailing lists, Discord servers, or subreddits dedicated to AI security, adversarial ML, prompt engineering, or general cybersecurity helps AI Red Teamers exchange knowledge, ask questions, learn about new tools/techniques, and find collaboration opportunities.\n\nLearn more from the following resources:", "links": [ { - "title": "List of Cybersecurity Discord Servers", - "url": "https://www.dfir.training/dfir-groups/discord?category%5B0%5D=17&category_children=1", + "title": "LearnPrompting Prompt Hacking Discord", + "url": "https://discord.com/channels/1046228027434086460/1349689482651369492", "type": "article" }, { - "title": "Reddit - r/MachineLearning", - "url": "https://www.reddit.com/r/MachineLearning/", + "title": "Reddit - r/ChatGPTJailbreak", + "url": "https://www.reddit.com/r/ChatGPTJailbreak/", "type": "article" }, { @@ -1320,19 +1281,14 @@ "title": "Agentic AI Security", "description": "As AI agents capable of autonomous action become more common, AI Red Teamers must test their unique security implications. This involves assessing risks related to goal hijacking, unintended actions through tool use, exploitation of planning mechanisms, and ensuring agents operate safely within their designated boundaries.\n\nLearn more from the following resources:", "links": [ - { - "title": "Certified AI Red Team Operator – Autonomous Systems (CAIRTO-AS) from Tonex, Inc.", - "url": "https://niccs.cisa.gov/education-training/catalog/tonex-inc/certified-ai-red-team-operator-autonomous-systems-cairto", - "type": "course" - }, { "title": "AI Agents - Learn Prompting", "url": "https://learnprompting.org/docs/intermediate/ai_agents", "type": "article" }, { - "title": "Reasoning models don't always say what they think", - "url": "https://www.anthropic.com/research/reasoning-models-dont-always-say-what-they-think", + "title": "EmbraceTheRed", + "url": "https://embracethered.com/", "type": "article" } ] @@ -1342,13 +1298,13 @@ "description": "A critical practice for AI Red Teamers is responsible disclosure: privately reporting discovered AI vulnerabilities (e.g., a successful jailbreak, data leak method, or severe bias) to the model developers or system owners, allowing them time to remediate before any public discussion, thus preventing malicious exploitation.\n\nLearn more from the following resources:", "links": [ { - "title": "Responsible Disclosure of AI Vulnerabilities", - "url": "https://www.preamble.com/blog/responsible-disclosure-of-ai-vulnerabilities", + "title": "0din.ai Policy", + "url": "https://0din.ai/policy", "type": "article" }, { - "title": "Vulnerability Disclosure Program", - "url": "https://www.cisa.gov/resources-tools/programs/vulnerability-disclosure-program-vdp", + "title": "Huntr Guidelines", + "url": "https://huntr.com/guidelines", "type": "article" }, { diff --git a/public/roadmap-content/cyber-security.json b/public/roadmap-content/cyber-security.json index 4cfaade79..bc837e9d8 100644 --- a/public/roadmap-content/cyber-security.json +++ b/public/roadmap-content/cyber-security.json @@ -4,9 +4,19 @@ "description": "Fundamental IT skills form the backbone of cybersecurity proficiency and encompass a broad range of technical knowledge. These skills include understanding computer hardware and software, networking concepts, and operating systems (particularly Windows and Linux). Proficiency in at least one programming language, such as Python or JavaScript, is increasingly important for automation and scripting tasks. Database management, including SQL, is crucial for handling and securing data. Knowledge of cloud computing platforms like AWS or Azure is becoming essential as organizations migrate to cloud environments. Familiarity with basic cybersecurity concepts such as encryption, access control, and common attack vectors provides a foundation for more advanced security work. Additionally, troubleshooting skills, the ability to interpret logs, and a basic understanding of web technologies are vital. These fundamental IT skills enable cybersecurity professionals to effectively protect systems, identify vulnerabilities, and respond to incidents in increasingly complex technological landscapes.\n\nLearn more from the following resources:", "links": [ { - "title": "Top 10 in demand IT skills", + "title": "7 In-Demand IT Skills to Boost Your Resume in 2025", + "url": "https://www.coursera.org/articles/key-it-skills-for-your-career", + "type": "article" + }, + { + "title": "Top 10 in Demand IT Skills", "url": "https://www.comptia.org/blog/top-it-skills-in-demand", "type": "article" + }, + { + "title": "IT Skills: Definition and Examples", + "url": "https://www.indeed.com/career-advice/finding-a-job/it-skills", + "type": "article" } ] }, @@ -200,7 +210,7 @@ "description": "Google Workspace, formerly known as G Suite, is a collection of cloud-based productivity and collaboration tools developed by Google. It includes popular applications such as Gmail for email, Google Drive for file storage and sharing, Google Docs for document creation and editing, Google Sheets for spreadsheets, and Google Meet for video conferencing. From a cybersecurity perspective, Google Workspace presents both advantages and challenges. It offers robust built-in security features like two-factor authentication, encryption of data in transit and at rest, and advanced threat protection. However, its cloud-based nature means organizations must carefully manage access controls, data sharing policies, and compliance with various regulations. Security professionals must be vigilant about potential phishing attacks targeting Google accounts, data leakage through improper sharing settings, and the risks associated with third-party app integrations. Understanding how to properly configure and monitor Google Workspace is crucial for maintaining the security of an organization's collaborative environment and protecting sensitive information stored within these widely-used tools.\n\nLearn more from the following resources:", "links": [ { - "title": "Google Workspace Website", + "title": "Google Workspace", "url": "https://workspace.google.com/intl/en_uk/", "type": "article" } @@ -435,7 +445,7 @@ "description": "The GIAC Security Essentials Certification (GSEC) is an advanced cybersecurity certification that demonstrates an individual's knowledge and skills in addressing security threats and vulnerabilities in various systems. Developed by the Global Information Assurance Certification (GIAC), this certification is suitable for security professionals, IT managers, and network administrators who want to enhance their expertise in the core cybersecurity concepts and practices.\n\nLearn more from the following resources:", "links": [ { - "title": "GSEC Certification Website", + "title": "GSEC Certification", "url": "https://www.giac.org/certifications/security-essentials-gsec/", "type": "article" } @@ -446,7 +456,7 @@ "description": "The GIAC Penetration Tester (GPEN) certification is an advanced-level credential designed for professionals who want to demonstrate their expertise in the field of penetration testing and ethical hacking. Created by the Global Information Assurance Certification (GIAC) organization, GPEN validates an individual's ability to conduct legal, systematic, and effective penetration tests to assess the security of computer networks, systems, and applications.\n\nLearn more from the following resources:", "links": [ { - "title": "GPEN Certification Website", + "title": "GPEN Certification", "url": "https://www.giac.org/certifications/penetration-tester-gpen/", "type": "article" }, @@ -462,7 +472,7 @@ "description": "The GIAC Web Application Penetration Tester (GWAPT) certification validates an individual's ability to perform in-depth web application security assessments and exploit vulnerabilities. GWAPT focuses on using ethical hacking methodologies to conduct web application penetration testing with the goal of identifying, evaluating, and mitigating security risks.\n\nLearn more from the following resources:", "links": [ { - "title": "GWAPT Certification Website", + "title": "GWAPT Certification", "url": "https://www.giac.org/certifications/web-application-penetration-tester-gwapt/", "type": "article" } @@ -473,9 +483,14 @@ "description": "GIAC is a globally recognized organization that provides certifications for information security professionals. Established in 1999, its primary aim is to validate the knowledge and skills of professionals in various cybersecurity domains. GIAC certifications focus on practical and hands-on abilities to ensure that certified individuals possess the necessary expertise to tackle real-world cybersecurity challenges.\n\nLearn more from the following resources:", "links": [ { - "title": "GIAC Website", + "title": "GIAC", "url": "https://www.giac.org/", "type": "article" + }, + { + "title": "Get Certified - GIAC", + "url": "https://www.giac.org/get-certified/?msc=main-nav", + "type": "article" } ] }, @@ -917,7 +932,7 @@ "description": "A default gateway is a network node, typically a router or a firewall, that serves as the access point or intermediary between a local network and external networks, such as the internet. When a device on a local network needs to communicate with a device outside its own subnet—such as accessing a website or sending an email—it sends the data to the default gateway, which then routes it to the appropriate external destination. The default gateway acts as a traffic director, ensuring that data packets are correctly forwarded between the internal network and external networks, making it a crucial component for enabling communication beyond the local network's boundaries.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a default gateway?", + "title": "What is a Default Gateway?", "url": "https://nordvpn.com/blog/what-is-a-default-gateway/?srsltid=AfmBOoosi5g4acnT9Gv_B86FMGr72hWDhk8J-4jr1HvxPCSu96FikCyw", "type": "article" }, @@ -949,7 +964,7 @@ "description": "A **DMZ**, also known as a **Demilitarized Zone**, is a specific part of a network that functions as a buffer or separation between an organization's internal, trusted network and the external, untrusted networks like the internet. The primary purpose of a DMZ is to isolate critical systems and data from the potentially hostile external environment and provide an extra layer of security.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a DMZ network?", + "title": "What is a DMZ Network?", "url": "https://www.fortinet.com/resources/cyberglossary/what-is-dmz", "type": "article" }, @@ -1377,6 +1392,11 @@ "title": "FTP", "description": "FTP is a standard network protocol used to transfer files from one host to another host over a TCP-based network, such as the Internet. Originally developed in the 1970s, it's one of the earliest protocols for transferring files between computers and remains widely used today.\n\nFTP operates on a client-server model, where one computer acts as the client (the sender or requester) and the other acts as the server (the receiver or provider). The client initiates a connection to the server, usually by providing a username and password for authentication, and then requests a file transfer.\n\nLearn more from the following resources:", "links": [ + { + "title": "File Transfer Protocol", + "url": "https://en.wikipedia.org/wiki/File_Transfer_Protocol", + "type": "article" + }, { "title": "FTP meaning and uses", "url": "https://www.investopedia.com/terms/f/ftp-file-transfer-protocol.asp", @@ -1701,11 +1721,6 @@ "title": "dig", "description": "`dig`, short for the Domain Information Groper, is a powerful and flexible command-line tool used to perform DNS queries and obtain valuable information about domains, IPs, and DNS records. This utility, available on UNIX-based systems like Linux and macOS, provides an essential function to help diagnose and resolve various issues related to domain name resolution and network connectivity. It is highly useful for network administrators and cybersecurity professionals when troubleshooting DNS-related problems.\n\nLearn more from the following resources:", "links": [ - { - "title": "How to use Linux dig command", - "url": "https://www.google.com/search?client=firefox-b-d&q=linux+dig+command", - "type": "article" - }, { "title": "How to look up DNS records with dig", "url": "https://www.youtube.com/watch?v=3AOKomsmeUY", @@ -2336,6 +2351,11 @@ "title": "False Negative / False Positive", "description": "A false positive happens when the security tool mistakenly identifies a non-threat as a threat. For example, it might raise an alarm for a legitimate user's activity, indicating a potential attack when there isn't any. A high number of false positives can cause unnecessary diverting of resources and time, investigating false alarms. Additionally, it could lead to user frustration if legitimate activities are being blocked.\n\nA false negative occurs when the security tool fails to detect an actual threat or attack. This could result in a real attack going unnoticed, causing damage to the system, data breaches, or other negative consequences. A high number of false negatives indicate that the security system needs to be improved to capture real threats effectively.\n\nTo have an effective cybersecurity system, security professionals aim to maximize true positives and true negatives, while minimizing false positives and false negatives. Balancing these aspects ensures that the security tools maintain their effectiveness without causing undue disruptions to a user's experience.\n\nLearn more from the following resources:", "links": [ + { + "title": "Difference Between False Positive and False Negative", + "url": "https://www.differencebetween.net/science/difference-between-false-positive-and-false-negative/", + "type": "article" + }, { "title": "What is a false positive virus?", "url": "https://www.youtube.com/watch?v=WrcAGBvIT14", @@ -3112,7 +3132,7 @@ "description": "Event logs are digital records that document activities and occurrences within computer systems and networks. They serve as a crucial resource for cybersecurity professionals, providing a chronological trail of system operations, user actions, and security-related events. These logs capture a wide range of information, including login attempts, file access, system changes, and application errors. In the context of security, event logs play a vital role in threat detection, incident response, and forensic analysis. They help identify unusual patterns, track potential security breaches, and reconstruct the sequence of events during an attack. Effective log management involves collecting logs from various sources, securely storing them, and implementing tools for log analysis and correlation. However, the sheer volume of log data can be challenging to manage, requiring advanced analytics and automation to extract meaningful insights and detect security incidents in real-time.\n\nLearn more from the following resources:", "links": [ { - "title": "What is an event log?", + "title": "What is an Event Log?", "url": "https://www.crowdstrike.com/cybersecurity-101/observability/event-log/", "type": "article" }, @@ -3176,12 +3196,12 @@ "description": "Firewall logs are detailed records of network traffic and security events captured by firewall devices. These logs provide crucial information about connection attempts, allowed and blocked traffic, and potential security incidents. They typically include data such as source and destination IP addresses, ports, protocols, timestamps, and the action taken by the firewall. Security professionals analyze these logs to monitor network activity, detect unusual patterns, investigate security breaches, and ensure policy compliance. Firewall logs are essential for troubleshooting network issues, optimizing security rules, and conducting forensic analysis after an incident. However, the volume of log data generated can be overwhelming, necessitating the use of log management tools and security information and event management (SIEM) systems to effectively process, correlate, and derive actionable insights from the logs. Regular review and analysis of firewall logs are critical practices in maintaining a robust security posture and responding promptly to potential threats.\n\nLearn more from the following resources:", "links": [ { - "title": "What is firewall logging and why is it important?", + "title": "What is Firewall Logging and Why is it Important?", "url": "https://cybriant.com/what-is-firewall-logging-and-why-is-it-important/", "type": "article" }, { - "title": "Reviewing firewall logs", + "title": "Reviewing Firewall Logs", "url": "https://www.youtube.com/watch?v=XiJ30f8V_T4", "type": "video" } @@ -3320,7 +3340,7 @@ "type": "article" }, { - "title": "Endpoints are the IT frontdoor - Gaurd them!", + "title": "Endpoints are the IT Frontdoor - Guard them!", "url": "https://www.youtube.com/watch?v=Njqid_JpqTs", "type": "video" } @@ -3491,13 +3511,13 @@ "description": "Data Loss Prevention (DLP) refers to a set of strategies, tools, and processes used by organizations to ensure that sensitive data is not lost, accessed, or misused by unauthorized users. DLP solutions monitor, detect, and block the movement of critical information outside an organization’s network, helping to prevent data breaches, leaks, and other security incidents.\n\nVisit the following resources to learn more:", "links": [ { - "title": "What is data loss prevention (DLP)?", - "url": "https://www.techtarget.com/whatis/definition/data-loss-prevention-DLP", + "title": "What is DLP (data loss prevention)?", + "url": "https://www.cloudflare.com/es-es/learning/access-management/what-is-dlp/", "type": "article" }, { - "title": "What is DLP (data loss prevention)?", - "url": "https://www.cloudflare.com/es-es/learning/access-management/what-is-dlp/", + "title": "What is Data Loss Prevention (DLP)?", + "url": "https://www.techtarget.com/whatis/definition/data-loss-prevention-DLP", "type": "article" } ] @@ -3523,7 +3543,7 @@ "description": "Firewalls are network security devices that monitor and control incoming and outgoing traffic based on predetermined security rules. Traditional firewalls operate at the network layer, filtering traffic based on IP addresses, ports, and protocols. They provide basic protection by creating a barrier between trusted internal networks and untrusted external networks.\n\nNext-generation firewalls (NGFWs) build upon this foundation, offering more advanced features to address modern cyber threats. NGFWs incorporate deep packet inspection, application-level filtering, and integrated intrusion prevention systems. They can identify and control applications regardless of port or protocol, enabling more granular security policies. NGFWs often include additional security functions such as SSL/TLS inspection, antivirus scanning, and threat intelligence integration. This evolution allows for more comprehensive network protection, better visibility into network traffic, and improved defense against sophisticated attacks in today's complex and dynamic threat landscape.\n\nLearn more from the following resources:", "links": [ { - "title": "What is a firewall?", + "title": "What is a Firewall?", "url": "https://www.kaspersky.com/resource-center/definitions/firewall", "type": "article" }, @@ -4021,13 +4041,18 @@ "title": "Dumpster Diving", "description": "Dumpster Diving in the context of cybersecurity refers to the practice of searching through discarded materials in trash or recycling bins to find confidential information. This technique may seem unsophisticated, but it can be extremely effective in obtaining valuable data such as passwords, account information, network diagrams, or any other sensitive information that has not been properly destroyed.\n\nVisit the following resources to learn more:", "links": [ + { + "title": "Dumpster Diving", + "url": "https://www.techtarget.com/searchsecurity/definition/dumpster-diving", + "type": "article" + }, { "title": "What is Dumpster Diving", "url": "https://powerdmarc.com/dumpster-diving-in-cybersecurity/", "type": "article" }, { - "title": "Dumpster diving for sensitive information", + "title": "Dumpster Diving for Sensitive Information", "url": "https://www.youtube.com/watch?v=Pom86gq4mk4", "type": "video" } @@ -4239,7 +4264,23 @@ "urtsyYWViEzbqYLoNfQAh": { "title": "DNS Poisoning", "description": "DNS spoofing or DNS cache poisoning, occurs when fake information is inserted into a DNS server’s cache.This causes DNS queries to return incorrect IP addresses, directing users to the wrong websites. Hackers exploit this to reroute traffic to malicious sites. The issue persists until the cached information is corrected.When the cache is poisoned, it misdirects traffic until the incorrect information is fixed. This technique exploits vulnerabilities in the DNS system and can spread to other servers, causing widespread issues.\n\nVisit the following resources to learn more:", - "links": [] + "links": [ + { + "title": "What is DNS Cache Poisoning? | DNS spoofing", + "url": "https://www.cloudflare.com/learning/dns/dns-cache-poisoning/", + "type": "article" + }, + { + "title": "What Is DNS Poisoning?", + "url": "https://www.fortinet.com/resources/cyberglossary/dns-poisoning", + "type": "article" + }, + { + "title": "DNS Poisoning (DNS Spoofing): Definition, Technique & Defense", + "url": "https://www.okta.com/identity-101/dns-poisoning/", + "type": "article" + } + ] }, "LfWJJaT3fv0p6fUeS8b84": { "title": "Deauth Attack", @@ -4764,15 +4805,20 @@ "title": "GCP", "description": "Google Cloud Platform (GCP) is a collection of cloud computing services offered by Google, which provides infrastructure and platform services to businesses or individuals. It enables users to either build their own applications or services on the provided resources, or utilize ready-to-use services provided by Google. GCP covers a wide range of services, including (but not limited to) compute, storage, databases, networking, and many more.\n\nLearn more from the following resources:", "links": [ - { - "title": "Google Cloud Platform Video Course", - "url": "https://www.youtube.com/watch?v=fZOz13joN0o", - "type": "course" - }, { "title": "Google Cloud Platform", "url": "https://cloud.google.com", "type": "article" + }, + { + "title": "Cloud Computing, Hosting Services, and APIs", + "url": "https://cloud.google.com/gcp", + "type": "article" + }, + { + "title": "Google Cloud Platform Video Course", + "url": "https://www.youtube.com/watch?v=fZOz13joN0o", + "type": "video" } ] }, @@ -4823,9 +4869,19 @@ "description": "Dropbox is a widely used cloud storage service that allows you to store, access, and share files, documents, and media with ease across various devices. Launched in 2007, Dropbox has become one of the most popular cloud storage solutions, catering to both individual users and businesses. The service is available on multiple platforms, including Windows, macOS, Linux, iOS, and Android.\n\nLearn more from the following resources:", "links": [ { - "title": "Dropbox Website", + "title": "Dropbox", "url": "https://dropbox.com", "type": "article" + }, + { + "title": "How to Use Dropbox - a guide to your account", + "url": "https://learn.dropbox.com/self-guided-learning/dropbox-fundamentals-course/how-to-use-dropbox", + "type": "article" + }, + { + "title": "Dropbox Tutorial for Beginners", + "url": "https://www.youtube.com/watch?v=b0Nk9muiUcQ", + "type": "video" } ] }, @@ -4866,7 +4922,7 @@ "description": "Google Drive is a cloud-based storage solution provided by Google, which offers users the ability to store, share, and collaborate on files and documents across different platforms and devices. It is integrated with Google's productivity suite, including Google Docs, Sheets, Slides, and Forms, allowing seamless collaboration with team members in real-time.\n\nLearn more from the following resources:", "links": [ { - "title": "Google Drive Website", + "title": "Google Drive", "url": "https://drive.google.com", "type": "article" } @@ -4945,12 +5001,7 @@ "description": "Go, also known as Golang, is an open-source programming language created by Google. Launched in 2009, it was designed to overcome issues present in other languages and offer a more secure, robust, and efficient development experience.\n\nLearn more from the following resources:", "links": [ { - "title": "Go tutorial for beginners", - "url": "https://www.youtube.com/watch?v=yyUHQIec83I", - "type": "course" - }, - { - "title": "Go Roadmap", + "title": "Visit Dedicated Go Roadmap", "url": "https://roadmap.sh/golang", "type": "article" }, @@ -4958,6 +5009,11 @@ "title": "Go in 100 seconds", "url": "https://www.youtube.com/watch?v=446E-r0rXHI", "type": "video" + }, + { + "title": "Go Tutorial for beginners", + "url": "https://www.youtube.com/watch?v=yyUHQIec83I", + "type": "video" } ] }, From 74267a60613dac4d797deef4d45247ccc0fbf5e5 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Wed, 30 Apr 2025 21:32:12 +0600 Subject: [PATCH 27/31] fix: handle syntax error (#8506) --- .astro/types.d.ts | 1 + src/hooks/use-custom-roadmap.ts | 28 ++++++++++++++++++---------- src/lib/query-http.ts | 17 ++++++++++++----- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/.astro/types.d.ts b/.astro/types.d.ts index f964fe0cf..03d7cc43f 100644 --- a/.astro/types.d.ts +++ b/.astro/types.d.ts @@ -1 +1,2 @@ /// +/// \ No newline at end of file diff --git a/src/hooks/use-custom-roadmap.ts b/src/hooks/use-custom-roadmap.ts index 2a9858835..77a996b5d 100644 --- a/src/hooks/use-custom-roadmap.ts +++ b/src/hooks/use-custom-roadmap.ts @@ -1,6 +1,6 @@ import { useQuery } from '@tanstack/react-query'; import type { GetRoadmapResponse } from '../components/CustomRoadmap/CustomRoadmap'; -import { httpGet, type FetchError } from '../lib/query-http'; +import { httpGet, FetchError } from '../lib/query-http'; import { queryClient } from '../stores/query-client'; type UseCustomRoadmapOptions = { @@ -22,17 +22,25 @@ export function useCustomRoadmap(options: UseCustomRoadmapOptions) { }, ], queryFn: async () => { - const roadmapUrl = slug - ? new URL( - `${import.meta.env.PUBLIC_API_URL}/v1-get-roadmap-by-slug/${slug}`, - ) - : new URL(`${import.meta.env.PUBLIC_API_URL}/v1-get-roadmap/${id}`); + try { + const roadmapUrl = slug + ? new URL( + `${import.meta.env.PUBLIC_API_URL}/v1-get-roadmap-by-slug/${slug}`, + ) + : new URL(`${import.meta.env.PUBLIC_API_URL}/v1-get-roadmap/${id}`); - if (secret) { - roadmapUrl.searchParams.set('secret', secret); - } + if (secret) { + roadmapUrl.searchParams.set('secret', secret); + } + + return await httpGet(roadmapUrl.toString()); + } catch (error) { + if (error instanceof SyntaxError) { + throw new FetchError(404, 'Roadmap not found'); + } - return httpGet(roadmapUrl.toString()); + throw error; + } }, retry: false, enabled: !!(slug || id), diff --git a/src/lib/query-http.ts b/src/lib/query-http.ts index 64ba4db7c..48737bb64 100644 --- a/src/lib/query-http.ts +++ b/src/lib/query-http.ts @@ -6,9 +6,19 @@ type HttpOptionsType = RequestInit; type AppResponse = Record; -export interface FetchError extends Error { +export class FetchError extends Error { status: number; message: string; + + constructor(status: number, message: string) { + super(message); + this.status = status; + this.message = message; + } + + static isFetchError(error: any): error is FetchError { + return error instanceof FetchError; + } } type AppError = { @@ -69,10 +79,7 @@ export async function httpCall( if (!response.ok) { if (data.errors) { - const error = new Error() as FetchError; - error.message = data.message; - error.status = response?.status; - throw error; + throw new FetchError(response?.status, data.message); } else { throw new Error('An unexpected error occurred'); } From ab5cc9dd6d9b6afa5536e5436953a77cdd224d3c Mon Sep 17 00:00:00 2001 From: Vedansh Date: Thu, 1 May 2025 17:57:01 +0530 Subject: [PATCH 28/31] refactor (ai-agents): improve topic content resources (#8581) * refactor first 27 topics. * refactor next 28 topics * finalize remaining 44 topics. * Update src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md * Update src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md * Update src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md * Update src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md * Update src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md --------- Co-authored-by: Kamran Ahmed --- src/data/roadmaps/ai-agents/ai-agents.md | 5 +++-- ...acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md | 3 +++ .../content/agent-loop@Eih4eybuYB3C2So8K0AT3.md | 4 +++- .../anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md | 4 +++- .../content/api-requests@52qxjZILV-X1isup6dazC.md | 7 ++++++- .../content/autogen@7YtnQ9-KIvGPSpDzEDexl.md | 7 ++++++- ...sic-backend-development@VPI89s-m885r2YrXjYxdd.md | 10 +++++++++- ...ecific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md | 8 +++++++- ...as--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md | 7 ++++++- .../chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md | 7 ++++++- .../closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md | 10 +++++++++- .../code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md | 9 ++++++++- .../code-generation@PK8w31GlvtmAuU92sHaqr.md | 8 +++++++- .../context-windows@dyn1LSioema-Bf9lLTgUZ.md | 10 +++++++++- .../creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md | 7 ++++++- .../content/crewai@uFPJqgU4qGvZyxTv-osZA.md | 9 ++++++++- .../content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md | 8 +++++++- .../content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md | 9 +++++++-- ...-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md | 8 +++++++- .../database-queries@sV1BnA2-qBnXoKpUn-8Ub.md | 6 +++++- .../content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md | 9 ++++++++- .../email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md | 7 ++++++- ...dings-and-vector-search@UIm54UmICKgep6s8Itcyv.md | 7 ++++++- ...odic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md | 8 +++++++- .../file-system-access@BoJqZvdGam4cd6G6yK2IV.md | 9 ++++++++- ...g-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md | 8 +++++++- ...tting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md | 7 ++++++- .../frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md | 7 ++++++- ...gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md | 7 ++++++- .../git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md | 10 +++++++++- .../content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md | 8 +++++++- .../content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md | 8 +++++++- ...-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md | 9 ++++++++- ...ation-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md | 8 +++++++- ...e-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md | 8 +++++++- .../content/langchain@Ka6VpCEnqABvwiF9vba7t.md | 12 ++++++++++-- .../content/langfuse@UoIheaJlShiceafrWALEH.md | 9 ++++++++- .../content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md | 9 ++++++++- .../content/langsmith@xp7TCTRE9HP60_rGzTUF6.md | 9 ++++++++- .../content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md | 11 ++++++++++- ...native-function-calling@aafZxtjxiwzJH1lwHBODi.md | 8 +++++++- .../content/local-desktop@iBtJp24F_kJE3YlBsW60s.md | 9 ++++++++- .../long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md | 10 +++++++++- .../manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md | 9 ++++++++- .../content/max-length@Bn_BkthrVX_vOuwQzvPZa.md | 11 ++++++++++- .../content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md | 9 ++++++++- .../content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md | 9 ++++++++- .../content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md | 9 ++++++++- .../metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md | 9 ++++++++- ...el-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md | 9 ++++++++- .../content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md | 7 ++++++- ...observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md | 7 ++++++- .../open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md | 10 +++++++++- .../openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md | 9 ++++++++- ...penai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md | 10 +++++++++- .../content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md | 9 ++++++++- .../perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md | 7 ++++++- .../personal-assistant@PPdAutqJF5G60Eg9lYBND.md | 7 ++++++- .../planner-executor@6YLCMWzystao6byCYCTPO.md | 7 ++++++- .../presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md | 8 +++++++- ...ricing-of-common-models@B8dzg61TGaknuruBgkEJd.md | 8 +++++++- ...t-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md | 8 +++++++- ...vide-additional-context@6I42CoeWX-kkFXTKAY7rw.md | 8 +++++++- .../content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md | 7 ++++++- ...ag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md | 8 +++++++- .../content/ragas@YzEDtGEaMaMWVt0W03HRt.md | 8 +++++++- .../react-reason--act@53xDks6JQ33fHMa3XcuCd.md | 7 ++++++- .../reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md | 7 ++++++- ...ning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md | 7 ++++++- .../content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md | 8 +++++++- .../rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md | 9 ++++++++- ...afety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md | 9 ++++++++- .../short-term--memory@M3U6RfIqaiut2nuOibY8W.md | 13 ++++++++++--- .../content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md | 8 +++++++- ...ecify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md | 9 +++++++-- .../stopping-criteria@K0G-Lw069jXUJwZqHtybd.md | 7 ++++++- ...vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md | 10 +++++++++- ...ctured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md | 10 ++++++++-- ...marization--compression@jTDC19BTWCqxqMizrIJHr.md | 7 ++++++- .../content/temperature@L1zL1GzqjSAjF06pIIXhy.md | 9 ++++++++- .../token-based-pricing@1fiWPBV99E2YncqdCgUw2.md | 8 +++++++- .../content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md | 7 ++++++- .../tool-definition@qakbxB8xe7Y8gejC5cZnK.md | 7 ++++++- ...ndboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md | 8 +++++++- .../content/top-p@icbp1NjurQfdM0dHnz6v2.md | 8 +++++++- ...sformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md | 8 +++++++- .../tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md | 8 +++++++- .../tree-of-thought@hj1adjkG9nalXKZ-Youn0.md | 8 +++++++- ...stand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md | 8 +++++++- ...ng-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md | 8 +++++++- ...examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md | 8 +++++++- ...elevant-technical-terms@sUwdtOX550tSdceaeFPmF.md | 8 +++++++- .../user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md | 7 ++++++- .../web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md | 9 ++++++++- .../content/web-search@kBtqT8AduLoYDWopj-V9_.md | 7 ++++++- .../what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md | 8 +++++++- .../content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md | 7 ++++++- .../what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md | 10 +++++++++- ...t-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md | 8 +++++++- 99 files changed, 701 insertions(+), 105 deletions(-) diff --git a/src/data/roadmaps/ai-agents/ai-agents.md b/src/data/roadmaps/ai-agents/ai-agents.md index 2c98869ae..a0df7e5b0 100644 --- a/src/data/roadmaps/ai-agents/ai-agents.md +++ b/src/data/roadmaps/ai-agents/ai-agents.md @@ -23,12 +23,12 @@ seo: title: 'AI Agents Roadmap - roadmap.sh' description: 'Step by step guide to learn AI Agents in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.' keywords: - - 'ai agents tutorial' - 'step by step guide for ai agents' - 'how to learn ai agents' - 'use ai agents in production' - - 'ai agents roadmap 2025' - 'guide to learning ai agents' + - 'ai agents roadmap 2025' + - 'ai agents tutorial' - 'ai agents for beginners' - 'ai agents roadmap' - 'ai agents learning path' @@ -44,6 +44,7 @@ seo: - 'learn ai agents for development' - 'become an ai agents expert' - 'what is ai agents' + - 'what is ai agent' relatedRoadmaps: - 'ai-engineer' - 'ai-data-scientist' diff --git a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md index 9b51ef51c..ad6dd25df 100644 --- a/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md +++ b/src/data/roadmaps/ai-agents/content/acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md @@ -2,4 +2,7 @@ Acting, also called tool invocation, is the step where the AI chooses a tool and runs it to get real-world data or to change something. The agent looks at its current goal and the plan it just made. It then picks the best tool, such as a web search, a database query, or a calculator. The agent fills in the needed inputs and sends the call. The external system does the heavy work and returns a result. Acting ends when the agent stores that result so it can think about the next move. +Visit the following resources to learn more: + - [@article@What are Tools in AI Agents?](https://huggingface.co/learn/agents-course/en/unit1/tools) +- [@article@What is Tool Calling in Agents?](https://www.useparagon.com/blog/ai-building-blocks-what-is-tool-calling-a-guide-for-pms) diff --git a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md index 8e883bc7a..d4778d187 100644 --- a/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md +++ b/src/data/roadmaps/ai-agents/content/agent-loop@Eih4eybuYB3C2So8K0AT3.md @@ -2,5 +2,7 @@ An agent loop is the cycle that lets an AI agent keep working toward a goal. First, the agent gathers fresh data from its tools, sensors, or memory. Next, it updates its internal state and decides what to do, often by running a planning or reasoning step. Then it carries out the chosen action, such as calling an API, writing to a file, or sending a message. After acting, it checks the result and stores new information. The loop starts again with the latest data, so the agent can adjust to changes and improve over time. This fast repeat of observe–decide–act gives the agent its power. +Visit the following resources to learn more: + - [@article@What is an Agent Loop?](https://huggingface.co/learn/agents-course/en/unit1/agent-steps-and-structure) -- [@article@Let's Build your Own Agentic Loop](https://www.reddit.com/r/AI_Agents/comments/1js1xjz/lets_build_our_own_agentic_loop_running_in_our/) \ No newline at end of file +- [@article@Let's Build your Own Agentic Loop](https://www.reddit.com/r/AI_Agents/comments/1js1xjz/lets_build_our_own_agentic_loop_running_in_our/) diff --git a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md index 56965b950..e691713dc 100644 --- a/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md +++ b/src/data/roadmaps/ai-agents/content/anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md @@ -2,4 +2,6 @@ Anthropic Tool Use lets you connect a Claude model to real software functions so the agent can do useful tasks on its own. You give Claude a list of tools, each with a name, a short description, and a strict JSON schema that shows the allowed input fields. During a chat you send user text plus this tool list. Claude decides if a tool should run, picks one, and returns a JSON block that matches the schema. Your code reads the JSON, calls the matching function, and sends the result back to Claude for the next step. This loop repeats until no more tool calls are needed. Clear schemas, small field sets, and helpful examples make the calls accurate. By keeping the model in charge of choosing tools while your code controls real actions, you gain both flexibility and safety. -- [@article@Anthropic Tool Use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview) \ No newline at end of file +Visit the following resources to learn more: + +- [@official@Anthropic Tool Use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview) diff --git a/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md b/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md index e2389b98e..f1dae1ac7 100644 --- a/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md +++ b/src/data/roadmaps/ai-agents/content/api-requests@52qxjZILV-X1isup6dazC.md @@ -1,3 +1,8 @@ # API Requests -API requests let an AI agent ask another service for data or for an action. The agent builds a short message that follows the service’s rules, sends it over the internet, and waits for a reply. For example, it can call a weather API to get today’s forecast or a payment API to charge a customer. Each request has a method like GET or POST, a URL, and often a small block of JSON with needed details. The service answers with another JSON block that the agent reads and uses. Because API requests are fast and clear, they are a common tool for connecting the agent to many other systems without extra work. \ No newline at end of file +API requests let an AI agent ask another service for data or for an action. The agent builds a short message that follows the service’s rules, sends it over the internet, and waits for a reply. For example, it can call a weather API to get today’s forecast or a payment API to charge a customer. Each request has a method like GET or POST, a URL, and often a small block of JSON with needed details. The service answers with another JSON block that the agent reads and uses. Because API requests are fast and clear, they are a common tool for connecting the agent to many other systems without extra work. + +Visit the following resources to learn more: + +- [@article@Introduction to APIs - MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/Introduction_to_APIs) +- [@article@How APIs Power AI Agents: A Comprehensive Guide](https://blog.treblle.com/api-guide-for-ai-agents/) diff --git a/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md b/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md index faaa242dc..9a4f21b1f 100644 --- a/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md +++ b/src/data/roadmaps/ai-agents/content/autogen@7YtnQ9-KIvGPSpDzEDexl.md @@ -1,3 +1,8 @@ # AutoGen -AutoGen is an open-source Python framework that helps you build AI agents without starting from scratch. It lets you define each agent with a role, goals, and tools, then handles the chat flow between them and a large language model such as GPT-4. You can chain several agents so they plan, code, review, and run tasks together. The library includes ready-made modules for memory, task planning, tool calling, and function execution, so you only write the parts that are unique to your app. AutoGen connects to OpenAI, Azure, or local models through a simple settings file. Logs, cost tracking, and step-by-step debugging come built in, which makes testing easy. Because the agents are plain Python objects, you can mix them with other libraries or your own code. AutoGen is still young, so expect fast changes and keep an eye on usage costs, but it is a strong choice when you want to turn a prompt into a working multi-agent system in hours instead of weeks. \ No newline at end of file +AutoGen is an open-source Python framework that helps you build AI agents without starting from scratch. It lets you define each agent with a role, goals, and tools, then handles the chat flow between them and a large language model such as GPT-4. You can chain several agents so they plan, code, review, and run tasks together. The library includes ready-made modules for memory, task planning, tool calling, and function execution, so you only write the parts that are unique to your app. AutoGen connects to OpenAI, Azure, or local models through a simple settings file. Logs, cost tracking, and step-by-step debugging come built in, which makes testing easy. Because the agents are plain Python objects, you can mix them with other libraries or your own code. AutoGen is still young, so expect fast changes and keep an eye on usage costs, but it is a strong choice when you want to turn a prompt into a working multi-agent system in hours instead of weeks. + +Visit the following resources to learn more: + +- [@official@AutoGen - Microsoft Research](https://www.microsoft.com/en-us/research/project/autogen/) +- [@opensource@GitHub - microsoft/autogen](https://github.com/microsoft/autogen) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md b/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md index c051e107e..2e7179109 100644 --- a/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md +++ b/src/data/roadmaps/ai-agents/content/basic-backend-development@VPI89s-m885r2YrXjYxdd.md @@ -1 +1,9 @@ -# Basic Backend Development \ No newline at end of file +# Basic Backend Development + +Before you start learning how to build AI agents, we would recommend you to have a basic knowledge of Backend development. This includes, programming language knowledge, interacting with database and basics of APIs at minimum. + +Visit the following resources to learn more: + +- [@article@Introduction to the server-side](https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps/Introduction) +- [@article@What is a REST API? - Red Hat](https://www.redhat.com/en/topics/api/what-is-a-rest-api) +- [@article@What is a Database? - Oracle](https://www.oracle.com/database/what-is-database/) diff --git a/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md b/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md index 1b23a55ad..402081619 100644 --- a/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md +++ b/src/data/roadmaps/ai-agents/content/be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md @@ -1,3 +1,9 @@ # Be specific in what you want -When you ask an AI to do something, clear and exact words help it give the answer you want. State the goal, the format, and any limits up front. Say who the answer is for, how long it should be, and what to leave out. If numbers, dates, or sources matter, name them. For example, rather than “Explain World War II,” try “List three key events of World War II with dates and one short fact for each.” Being this precise cuts down on guesswork, avoids unwanted extra detail, and saves time by reducing follow-up questions. \ No newline at end of file +When you ask an AI to do something, clear and exact words help it give the answer you want. State the goal, the format, and any limits up front. Say who the answer is for, how long it should be, and what to leave out. If numbers, dates, or sources matter, name them. For example, rather than “Explain World War II,” try “List three key events of World War II with dates and one short fact for each.” Being this precise cuts down on guesswork, avoids unwanted extra detail, and saves time by reducing follow-up questions. + +Visit the following resources to learn more: + +- [@article@Prompt Engineering Guide](https://www.promptingguide.ai/) +- [@article@AI Prompting Examples, Templates, and Tips For Educators](https://honorlock.com/blog/education-ai-prompt-writing/) +- [@article@How to Ask AI for Anything: The Art of Prompting](https://sixtyandme.com/using-ai-prompts/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md b/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md index a0375e5b3..96c25a45d 100644 --- a/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md +++ b/src/data/roadmaps/ai-agents/content/bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md @@ -1,3 +1,8 @@ # Bias & Toxicity Guardrails -Bias and toxicity guardrails keep an AI agent from giving unfair or harmful results. Bias shows up when training data favors certain groups or views. Toxicity is language that is hateful, violent, or rude. To stop this, start with clean and balanced data. Remove slurs, stereotypes, and spam. Add examples from many voices so the model learns fair patterns. During training, test the model often and adjust weights or rules that lean one way. After training, put filters in place that block toxic words or flag unfair answers before users see them. Keep logs, run audits, and ask users for feedback to catch new issues early. Write down every step so builders and users know the limits and risks. These actions protect people, follow laws, and help users trust the AI. \ No newline at end of file +Bias and toxicity guardrails keep an AI agent from giving unfair or harmful results. Bias shows up when training data favors certain groups or views. Toxicity is language that is hateful, violent, or rude. To stop this, start with clean and balanced data. Remove slurs, stereotypes, and spam. Add examples from many voices so the model learns fair patterns. During training, test the model often and adjust weights or rules that lean one way. After training, put filters in place that block toxic words or flag unfair answers before users see them. Keep logs, run audits, and ask users for feedback to catch new issues early. Write down every step so builders and users know the limits and risks. These actions protect people, follow laws, and help users trust the AI. + +Visit the following resources to learn more: + +- [@article@Define the Agent Guardrails](https://trailhead.salesforce.com/content/learn/modules/agentforce-agent-planning/define-the-agent-guardrails) +- [@article@How to Build Safe AI Agents: Best Practices for Guardrails](https://medium.com/@sahin.samia/how-to-build-safe-ai-agents-best-practices-for-guardrails-and-oversight-a0085b50c022) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md b/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md index fa6186462..19d828c8c 100644 --- a/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md +++ b/src/data/roadmaps/ai-agents/content/chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md @@ -1,3 +1,8 @@ # Chain of Thought (CoT) -Chain of Thought (CoT) is a way for an AI agent to think out loud. Before giving its final answer, the agent writes short notes that show each step it takes. These notes can list facts, name sub-tasks, or do small bits of math. By seeing the steps, the agent stays organized and is less likely to make a mistake. People who read the answer can also check the logic and spot any weak points. The same written steps can be fed back into the agent so it can plan, reflect, or fix itself. Because it is easy to use and boosts trust, CoT is one of the most common designs for language-based agents today. \ No newline at end of file +Chain of Thought (CoT) is a way for an AI agent to think out loud. Before giving its final answer, the agent writes short notes that show each step it takes. These notes can list facts, name sub-tasks, or do small bits of math. By seeing the steps, the agent stays organized and is less likely to make a mistake. People who read the answer can also check the logic and spot any weak points. The same written steps can be fed back into the agent so it can plan, reflect, or fix itself. Because it is easy to use and boosts trust, CoT is one of the most common designs for language-based agents today. + +Visit the following resources to learn more: + +- [@article@Chain-of-Thought Prompting Elicits Reasoning in Large Language Models](https://arxiv.org/abs/2201.11903) +- [@article@Evoking Chain of Thought Reasoning in LLMs - Prompting Guide](https://www.promptingguide.ai/techniques/cot) diff --git a/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md b/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md index db58573c2..d162774c8 100644 --- a/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md +++ b/src/data/roadmaps/ai-agents/content/closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md @@ -1,3 +1,11 @@ # Closed Weight Models -Closed-weight models are AI systems whose trained parameters—the numbers that hold what the model has learned—are not shared with the public. You can send prompts to these models through an online service or a software kit, but you cannot download the weights, inspect them, or fine-tune them on your own computer. The company that owns the model keeps control and sets the rules for use, often through paid APIs or tight licences. This approach helps the owner protect trade secrets, reduce misuse, and keep a steady income stream. The downside is less freedom for users, higher costs over time, and limited ability to audit or adapt the model. Well-known examples include GPT-4, Claude, and Gemini. \ No newline at end of file +Closed-weight models are AI systems whose trained parameters—the numbers that hold what the model has learned—are not shared with the public. You can send prompts to these models through an online service or a software kit, but you cannot download the weights, inspect them, or fine-tune them on your own computer. The company that owns the model keeps control and sets the rules for use, often through paid APIs or tight licences. This approach helps the owner protect trade secrets, reduce misuse, and keep a steady income stream. The downside is less freedom for users, higher costs over time, and limited ability to audit or adapt the model. Well-known examples include GPT-4, Claude, and Gemini. + +Visit the following resources to learn more: + +- [@article@Open-Source LLMs vs Closed LLMs](https://hatchworks.com/blog/gen-ai/open-source-vs-closed-llms-guide/) +- [@article@2024 Comparison of Open-Source Vs Closed-Source LLMs](https://blog.spheron.network/choosing-the-right-llm-2024-comparison-of-open-source-vs-closed-source-llms) +- [@official@Open AI's GPT-4](https://openai.com/gpt-4) +- [@official@Claude](https://www.anthropic.com/claude) +- [@official@Gemini](https://deepmind.google/technologies/gemini/) diff --git a/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md b/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md index 0b7490fa1..947e586eb 100644 --- a/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md +++ b/src/data/roadmaps/ai-agents/content/code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md @@ -1,3 +1,10 @@ # Code Execution / REPL -Code Execution or REPL (Read-Eval-Print Loop) lets an AI agent run small pieces of code on demand, see the result right away, and use that result to decide what to do next. The agent “reads” the code, “evaluates” it in a safe sandbox, “prints” the output, and then loops back for more input. With this tool the agent can test ideas, perform math, transform text, call APIs, or inspect data without waiting for a full build or deployment. Python, JavaScript, or even shell commands are common choices because they start fast and have many libraries. Quick feedback helps the agent catch errors early and refine its plan step by step. Sandboxing keeps the host system safe by blocking dangerous actions such as deleting files or making forbidden network calls. Overall, a Code Execution / REPL tool gives the agent a fast, flexible workbench for problem-solving. \ No newline at end of file +Code Execution or REPL (Read-Eval-Print Loop) lets an AI agent run small pieces of code on demand, see the result right away, and use that result to decide what to do next. The agent “reads” the code, “evaluates” it in a safe sandbox, “prints” the output, and then loops back for more input. With this tool the agent can test ideas, perform math, transform text, call APIs, or inspect data without waiting for a full build or deployment. Python, JavaScript, or even shell commands are common choices because they start fast and have many libraries. Quick feedback helps the agent catch errors early and refine its plan step by step. Sandboxing keeps the host system safe by blocking dangerous actions such as deleting files or making forbidden network calls. Overall, a Code Execution / REPL tool gives the agent a fast, flexible workbench for problem-solving. + +Visit the following resources to learn more: + +- [@article@What is a REPL?](https://docs.replit.com/getting-started/intro-replit) +- [@article@Code Execution AI Agent](https://docs.praison.ai/features/codeagent) +- [@article@Building an AI Agent's Code Execution Environment](https://murraycole.com/posts/ai-code-execution-environment) +- [@article@Python Code Tool](https://python.langchain.com/docs/integrations/tools/python/) diff --git a/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md b/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md index e6616e83b..8ad02f421 100644 --- a/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md +++ b/src/data/roadmaps/ai-agents/content/code-generation@PK8w31GlvtmAuU92sHaqr.md @@ -1,3 +1,9 @@ # Code generation -Code-generation agents take a plain language request, understand the goal, and then write or edit source code to meet it. They can build small apps, add features, fix bugs, refactor old code, write tests, or translate code from one language to another. This saves time for developers, helps beginners learn, and reduces human error. Teams use these agents inside code editors, chat tools, and automated pipelines. By handling routine coding tasks, the agents free people to focus on design, logic, and user needs. \ No newline at end of file +Code-generation agents take a plain language request, understand the goal, and then write or edit source code to meet it. They can build small apps, add features, fix bugs, refactor old code, write tests, or translate code from one language to another. This saves time for developers, helps beginners learn, and reduces human error. Teams use these agents inside code editors, chat tools, and automated pipelines. By handling routine coding tasks, the agents free people to focus on design, logic, and user needs. + +Visit the following resources to learn more: + +- [@article@Multi-Agent-based Code Generation](https://arxiv.org/abs/2312.13010) +- [@article@From Prompt to Production: Github Blog](https://github.blog/ai-and-ml/github-copilot/from-prompt-to-production-building-a-landing-page-with-copilot-agent-mode/) +- [@official@Github Copilot](https://github.com/features/copilot) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md b/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md index f0f99c74f..b4dd221ca 100644 --- a/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md +++ b/src/data/roadmaps/ai-agents/content/context-windows@dyn1LSioema-Bf9lLTgUZ.md @@ -1,3 +1,11 @@ # Context Windows -A context window is the chunk of text a large language model can read at one time. It is measured in tokens, which are pieces of words. If a model has a 4,000-token window, it can only “look at” up to about 3,000 words before it must forget or shorten earlier parts. New tokens push old ones out, like a sliding window moving over text. The window size sets hard limits on how long a prompt, chat history, or document can be. A small window forces you to keep inputs short or split them, while a large window lets the model follow longer stories and hold more facts. Choosing the right window size balances cost, speed, and how much detail the model can keep in mind at once. \ No newline at end of file +A context window is the chunk of text a large language model can read at one time. It is measured in tokens, which are pieces of words. If a model has a 4,000-token window, it can only “look at” up to about 3,000 words before it must forget or shorten earlier parts. New tokens push old ones out, like a sliding window moving over text. The window size sets hard limits on how long a prompt, chat history, or document can be. A small window forces you to keep inputs short or split them, while a large window lets the model follow longer stories and hold more facts. Choosing the right window size balances cost, speed, and how much detail the model can keep in mind at once. + +New techniques, like retrieval-augmented generation (RAG) and long-context transformers (e.g., Claude 3, Gemini 1.5), aim to extend usable context without hitting model limits directly. + +Visit the following resources to learn more: + +- [@article@What is a Context Window in AI?](https://www.ibm.com/think/topics/context-window) +- [@article@Scaling Language Models with Retrieval-Augmented Generation (RAG)](https://arxiv.org/abs/2005.11401) +- [@article@Long Context in Language Models - Anthropic's Claude 3](https://www.anthropic.com/news/claude-3-family) diff --git a/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md b/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md index e73de78e7..b74900147 100644 --- a/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md +++ b/src/data/roadmaps/ai-agents/content/creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md @@ -1,3 +1,8 @@ # Creating MCP Servers -Creating an MCP server means building a program that stores and shares conversation data for AI agents using the Model Context Protocol. Start by choosing a language and web framework, then set up REST endpoints such as /messages, /state, and /health. Each endpoint sends or receives JSON that follows the MCP schema. Use a database or an in-memory store to keep session logs, and tag every entry with a session ID, role, and timestamp. Add token-based authentication so only trusted agents can read or write. Include filters and range queries so an agent can ask for just the parts of the log it needs. Limit message size and request rate to avoid overload. Finish by writing unit tests, adding monitoring, and running load checks to be sure the server stays reliable as traffic grows. \ No newline at end of file +An MCP server stores and shares conversation data for AI agents using the Model Context Protocol (MCP), a standard for agent memory management. Start by picking a language and web framework, then create REST endpoints like `/messages`, `/state`, and `/health`. Each endpoint exchanges JSON following the MCP schema. Store session logs with a session ID, role, and timestamp using a database or in-memory store. Add token-based authentication and filters so agents can fetch only what they need. Set limits on message size and request rates to avoid overload. Finally, write unit tests, add monitoring, and run load tests to ensure stability. + +Visit the following resources to learn more: + +- [@official@Model Context Protocol (MCP) Specification](https://www.anthropic.com/news/model-context-protocol) +- [@article@How to Build and Host Your Own MCP Servers in Easy Steps?](https://collabnix.com/how-to-build-and-host-your-own-mcp-servers-in-easy-steps/) diff --git a/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md b/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md index 7890a8a88..944ef9379 100644 --- a/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md +++ b/src/data/roadmaps/ai-agents/content/crewai@uFPJqgU4qGvZyxTv-osZA.md @@ -1,3 +1,10 @@ # CrewAI -CrewAI is an open-source Python framework that lets you join several language-model agents into one team, called a crew. Each agent gets a name, a role, and a set of skills, and the library handles planning, task routing, and chat among them. To use it, you install the package, import it, define your agents in a few lines of code, link them with a Crew object, and give the crew a mission prompt. CrewAI then talks to an LLM such as OpenAI GPT-4 or Claude, passes messages between agents, runs any tools you attach, and returns a single answer. You can plug in web search, Python functions, or vector stores for memory, and you can tune settings like temperature or max tokens. Built-in logs show every step so you can debug and improve the workflow. The result is a fast way to build multi-step agent systems for tasks like research, code review, or content creation without writing a lot of low-level glue code. \ No newline at end of file +CrewAI is an open-source Python framework for creating teams of AI agents, called a crew. Each agent is assigned a name, role, and set of tools, and the system manages planning, communication, and execution between them. To use it, install the package, define agents in code, connect them with a `Crew` object, and assign a mission prompt. CrewAI interacts with an LLM like GPT-4 or Claude, passes messages, runs tools, and returns a final output. You can also add web search, custom functions, or memory stores. Logs are built-in to help debug and optimize workflows. + +Visit the following resources to learn more: + +- [@official@CrewAI](https://crewai.com/) +- [@official@CrewAI Documentation](https://docs.crewai.com/) +- [@article@Getting Started with CrewAI: Building AI Agents That Work Together](https://medium.com/@cammilo/getting-started-with-crewai-building-ai-agents-that-work-together-9c1f47f185ca) +- [@video@Crew AI Full Tutorial For Beginners](https://www.youtube.com/watch?v=q6QLGS306d0) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md b/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md index 9e75edefe..6f0c2c380 100644 --- a/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md +++ b/src/data/roadmaps/ai-agents/content/dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md @@ -1,3 +1,9 @@ # DAG Agents -A DAG (Directed Acyclic Graph) agent is built from many small parts, called nodes, that form a one-way graph with no loops. Each node does a clear task, then passes its result to the next node along a directed edge. Because the graph has no cycles, data always moves forward and never gets stuck in endless repeats. This makes the flow of work easy to follow and test. The layout lets you run nodes that do not depend on each other at the same time, so the agent can work faster. If one node fails, you can see the exact path it took and fix just that part. DAG agents work well for jobs like data cleaning, multi-step reasoning, or any long chain of steps where order matters and backtracking is not needed. \ No newline at end of file +A DAG (Directed Acyclic Graph) agent is made of small parts called nodes that form a one-way graph with no loops. Each node does a task and passes its result to the next. Because there are no cycles, data always moves forward, making workflows easy to follow and debug. Independent nodes can run in parallel, speeding up tasks. If a node fails, you can trace and fix that part without touching the rest. DAG agents are ideal for jobs like data cleaning, multi-step reasoning, or workflows where backtracking isn’t needed. + +Visit the following resources to learn more: + +- [@official@Airflow: Directed Acyclic Graphs Documentation](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html) +- [@article@What are DAGs in AI Systems?](https://www.restack.io/p/version-control-for-ai-answer-what-is-dag-in-ai-cat-ai) +- [@video@DAGs Explained Simply](https://www.youtube.com/watch?v=1Yh5S-S6wsI) diff --git a/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md b/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md index bb7000ba4..28d5842cb 100644 --- a/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md +++ b/src/data/roadmaps/ai-agents/content/data-analysis@wKYEaPWNsR30TIpHaxSsq.md @@ -1,3 +1,8 @@ -# Data analysis +# Data Analysis -AI agents can automate many steps of data analysis. They pull data from files, databases, or live streams and put it into a tidy shape. They spot missing entries, flag odd numbers, and fill gaps with smart guesses. Once the data is clean, the agent looks for patterns, such as spikes in sales or drops in sensor readings. It can build simple charts or full dashboards, saving hours of manual work. Some agents run basic statistics, while others use machine learning to forecast next week’s demand. They also send alerts if the numbers move outside set limits. This keeps people informed without constant checking. \ No newline at end of file +AI agents can automate data analysis by pulling information from files, databases, or live streams. They clean the data by spotting missing values, outliers, and making smart corrections. After cleaning, agents find patterns like sales spikes or sensor drops and can build charts or dashboards. Some run basic statistics, others apply machine learning to predict trends. Agents can also send alerts if numbers go beyond set limits, helping people stay informed without constant monitoring. + +Visit the following resources to learn more: + +- [@article@How AI Will Transform Data Analysis in 2025](https://www.devfi.com/ai-transform-data-analysis-2025/) +- [@article@How AI Has Changed The World Of Analytics And Data Science](https://www.forbes.com/councils/forbestechcouncil/2025/01/28/how-ai-has-changed-the-world-of-analytics-and-data-science/k) diff --git a/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md b/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md index 66a02f4a7..678517f6b 100644 --- a/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md +++ b/src/data/roadmaps/ai-agents/content/data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md @@ -1,3 +1,9 @@ # Data Privacy + PII Redaction -AI agents often handle user text, images, and logs that carry personal data such as names, phone numbers, addresses, or ID numbers. If this data leaks, people may face fraud, stalking, or other harm. Privacy laws like GDPR and CCPA require teams to keep such data safe and to use it only for clear, lawful reasons. A key safeguard is PII redaction: the system scans each input and output, finds any detail that can identify a person, and masks or deletes it before storage or sharing. Redaction methods include simple pattern rules, machine-learning models, or a mix of both. Keep audit trails, set strong access limits, and test the redaction flow often to be sure no private detail slips through. \ No newline at end of file +AI agents often process text, images, and logs that include personal data like names, phone numbers, or addresses. Leaks can cause fraud, stalking, or other harm, so laws like GDPR and CCPA require strict protections. A key method is PII redaction: scanning inputs and outputs to find and mask any personal details before storage or sharing. Redaction uses pattern rules, machine learning, or both. Teams should also keep audit logs, enforce access controls, and test their redaction flows often to prevent leaks. + +Visit the following resources to learn more: + +- [@official@GDPR Compliance Overview](https://gdpr.eu/) +- [@article@Protect Sensitive Data with PII Redaction Software](https://redactor.ai/blog/pii-redaction-software-guide) +- [@article@A Complete Guide on PII Redaction](https://enthu.ai/blog/what-is-pii-redaction/) diff --git a/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md b/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md index 0a5830cd3..afbdd1c93 100644 --- a/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md +++ b/src/data/roadmaps/ai-agents/content/database-queries@sV1BnA2-qBnXoKpUn-8Ub.md @@ -1,3 +1,7 @@ # Database Queries -Database queries let an AI agent fetch, add, change, or remove data stored in a database. The agent sends a request written in a query language, most often SQL. The database engine then looks through its tables and returns only the rows and columns that match the rules in the request. With this tool, the agent can answer questions that need up-to-date numbers, user records, or other stored facts. It can also write new entries or adjust old ones to keep the data current. Because queries work in real time and follow clear rules, they give the agent a reliable way to handle large sets of structured information. \ No newline at end of file +Database queries let an AI agent fetch, add, change, or remove data stored in a database. The agent sends a request written in a query language, most often SQL. The database engine then looks through its tables and returns only the rows and columns that match the rules in the request. With this tool, the agent can answer questions that need up-to-date numbers, user records, or other stored facts. It can also write new entries or adjust old ones to keep the data current. Because queries work in real time and follow clear rules, they give the agent a reliable way to handle large sets of structured information. + +Visit the following resources to learn more: + +- [@article@Building Your Own Database Agent](https://www.deeplearning.ai/short-courses/building-your-own-database-agent/) diff --git a/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md b/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md index e0df4d6cf..9e1dc202e 100644 --- a/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md +++ b/src/data/roadmaps/ai-agents/content/deepeval@0924QUH1wV7Mp-Xu0FAhF.md @@ -1,3 +1,10 @@ # DeepEval -DeepEval is an open-source tool that helps you test and score the answers your AI agent gives. You write small test cases that show an input and the reply you hope to get, or a rule the reply must follow. DeepEval runs the agent, checks the reply with built-in measures such as similarity, accuracy, or safety, and then marks each test as pass or fail. You can add your own checks, store tests in code or YAML files, and run them in a CI pipeline so every new model or prompt version gets the same quick audit. The fast feedback makes it easy to spot errors, cut down on hallucinations, and compare different models before you ship. \ No newline at end of file +DeepEval is an open-source tool that helps you test and score the answers your AI agent gives. You write small test cases that show an input and the reply you hope to get, or a rule the reply must follow. DeepEval runs the agent, checks the reply with built-in measures such as similarity, accuracy, or safety, and then marks each test as pass or fail. You can add your own checks, store tests in code or YAML files, and run them in a CI pipeline so every new model or prompt version gets the same quick audit. The fast feedback makes it easy to spot errors, cut down on hallucinations, and compare different models before you ship. + +Visit the following resources to learn more: + +- [@official@DeepEval - The Open-Source LLM Evaluation Framework](https://www.deepeval.com/) +- [@opensource@DeepEval GitHub Repository](https://github.com/confident-ai/deepeval) +- [@article@Evaluate LLMs Effectively Using DeepEval: A Pratical Guide](https://www.datacamp.com/tutorial/deepeval) +- [@video@DeepEval - LLM Evaluation Framework](https://www.youtube.com/watch?v=ZNs2dCXHlfo) diff --git a/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md b/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md index 68d069499..488120a6c 100644 --- a/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md +++ b/src/data/roadmaps/ai-agents/content/email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md @@ -1,3 +1,8 @@ # Email / Slack / SMS -Email, Slack, and SMS are message channels an AI agent can use to act on tasks and share updates. The agent writes and sends emails to give detailed reports or collect files. It posts to Slack to chat with a team, answer questions, or trigger alerts inside a workspace. It sends SMS texts for quick notices such as reminders, confirmations, or warnings when a fast response is needed. By picking the right channel, the agent reaches users where they already communicate, makes sure important information arrives on time, and can even gather replies to keep a task moving forward. \ No newline at end of file +Email, Slack, and SMS are message channels an AI agent can use to act on tasks and share updates. The agent writes and sends emails to give detailed reports or collect files. It posts to Slack to chat with a team, answer questions, or trigger alerts inside a workspace. It sends SMS texts for quick notices such as reminders, confirmations, or warnings when a fast response is needed. By picking the right channel, the agent reaches users where they already communicate, makes sure important information arrives on time, and can even gather replies to keep a task moving forward. + +Visit the following resources to learn more: + +- [@official@Twilio Messaging API](https://www.twilio.com/docs/usage/api) +- [@official@Slack AI Agents](https://slack.com/ai-agents) diff --git a/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md b/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md index 2aa8b7db4..b39b569e8 100644 --- a/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md +++ b/src/data/roadmaps/ai-agents/content/embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md @@ -1,3 +1,8 @@ # Embeddings and Vector Search -Embeddings turn words, pictures, or other data into lists of numbers called vectors. Each vector keeps the meaning of the original item. Things with similar meaning get vectors that sit close together in this number space. Vector search scans a large set of vectors and finds the ones nearest to a query vector, even if the exact words differ. This lets AI agents match questions with answers, suggest related items, and link ideas quickly. \ No newline at end of file +Embeddings turn words, pictures, or other data into lists of numbers called vectors. Each vector keeps the meaning of the original item. Things with similar meaning get vectors that sit close together in this number space. Vector search scans a large set of vectors and finds the ones nearest to a query vector, even if the exact words differ. This lets AI agents match questions with answers, suggest related items, and link ideas quickly. + +Visit the following resources to learn more: + +- [@official@OpenAI Embeddings API Documentation](https://platform.openai.com/docs/guides/embeddings/what-are-embeddings) +- [@article@Understanding Embeddings and Vector Search (Pinecone Blog)](https://www.pinecone.io/learn/vector-embeddings/) diff --git a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md index 028b9779c..d7b8dabf3 100644 --- a/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md +++ b/src/data/roadmaps/ai-agents/content/episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md @@ -1,3 +1,9 @@ # Episodic vs Semantic Memory -Agent memory often has two parts. Episodic memory is relevant to the context of the current conversation and may be lost after the conversation ends. Semantic memory is relevant to the broader knowledge of the agent and is persistent. \ No newline at end of file +Agent memory often has two parts. Episodic memory is relevant to the context of the current conversation and may be lost after the conversation ends. Semantic memory is relevant to the broader knowledge of the agent and is persistent. + +Visit the following resources to learn more: + +- [@article@What Is AI Agent Memory? - IBM](https://www.ibm.com/think/topics/ai-agent-memory) +- [@article@Episodic Memory vs. Semantic Memory: The Key Differences](https://www.magneticmemorymethod.com/episodic-vs-semantic-memory/) +- [@article@Memory Systems in LangChain](https://python.langchain.com/docs/how_to/chatbots_memory/) diff --git a/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md b/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md index 9cca53487..901810e94 100644 --- a/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md +++ b/src/data/roadmaps/ai-agents/content/file-system-access@BoJqZvdGam4cd6G6yK2IV.md @@ -1,3 +1,10 @@ # File System Access -File system access lets an AI agent read, create, change, or delete files and folders on a computer or server. With this power, the agent can open a text file to pull data, write a new report, save logs, or tidy up old files without human help. It can also move files between folders to keep things organised. This tool is useful for tasks such as data processing, report generation, and backup jobs. Strong safety checks are needed so the agent touches only the right files, avoids private data, and cannot harm the system by mistake. \ No newline at end of file +File system access lets an AI agent read, create, change, or delete files and folders on a computer or server. With this power, the agent can open a text file to pull data, write a new report, save logs, or tidy up old files without human help. It can also move files between folders to keep things organized. This tool is useful for tasks such as data processing, report generation, and backup jobs. Strong safety checks are needed so the agent touches only the right files, avoids private data, and cannot harm the system by mistake. + +Visit the following resources to learn more: + +- [@article@Filesystem MCP server for AI Agents](https://playbooks.com/mcp/mateicanavra-filesystem) +- [@article@File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) +- [@article@Understanding File Permissions and Security](https://linuxize.com/post/understanding-linux-file-permissions/) +- [@video@How File Systems Work?](https://www.youtube.com/watch?v=KN8YgJnShPM) diff --git a/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md b/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md index 83831a911..3ab0c4209 100644 --- a/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md +++ b/src/data/roadmaps/ai-agents/content/fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md @@ -1,3 +1,9 @@ # Fine-tuning vs Prompt Engineering -Fine-tuning and prompt engineering are two ways to get better answers from a large language model. Fine-tuning means you take an existing model and train it more on your own examples so it adapts to a narrow task. You need extra data, computer power, and time, but the model then learns the style and facts you want. Prompt engineering means you leave the model as it is and adjust the words you send to it. You give clear instructions, show examples, or set rules inside the prompt so the model follows them right away. This is faster, cheaper, and safer if you have no special data. Fine-tuning is best when you need deep knowledge of a field or a fixed voice across many calls. Prompt engineering is enough when you want quick control, small changes, or are still testing ideas. \ No newline at end of file +Fine-tuning and prompt engineering are two ways to get better outputs from a language model. Fine-tuning means training an existing model further with your own examples so it adapts to specific tasks. It needs extra data, computing power, and time but creates deeply specialized models. Prompt engineering, in contrast, leaves the model unchanged and focuses on crafting better instructions or examples in the prompt itself. It is faster, cheaper, and safer when no custom data is available. Fine-tuning suits deep domain needs; prompt engineering fits quick control and prototyping. + +Visit the following resources to learn more: + +- [@article@OpenAI Fine Tuning](https://platform.openai.com/docs/guides/fine-tuning) +- [@article@Prompt Engineering Guide](https://www.promptingguide.ai/) +- [@article@Prompt Engineering vs Prompt Tuning: A Detailed Explanation](https://medium.com/@aabhi02/prompt-engineering-vs-prompt-tuning-a-detailed-explanation-19ea8ce62ac4) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md b/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md index c3e0c2dc8..a1555cabb 100644 --- a/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md +++ b/src/data/roadmaps/ai-agents/content/forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md @@ -1,3 +1,8 @@ # Forgetting / Aging Strategies -Forgetting or aging strategies help an AI agent keep only the useful parts of its memory and drop the rest over time. The agent may tag each memory with a time stamp and lower its importance as it gets older, or it may remove items that have not been used for a while, much like a “least-recently-used” list. Some systems give each memory a relevance score; when space runs low, they erase the lowest-scoring items first. Others keep a fixed-length sliding window of the most recent events or create short summaries and store those instead of raw details. These methods stop the memory store from growing without limits, cut storage costs, and let the agent focus on current goals. Choosing the right mix of aging rules is a trade-off: forget too fast and the agent loses context, forget too slow and it wastes resources or reacts to outdated facts. \ No newline at end of file +Forgetting or aging strategies help an AI agent keep only the useful parts of its memory and drop the rest over time. The agent may tag each memory with a time stamp and lower its importance as it gets older, or it may remove items that have not been used for a while, much like a “least-recently-used” list. Some systems give each memory a relevance score; when space runs low, they erase the lowest-scoring items first. Others keep a fixed-length sliding window of the most recent events or create short summaries and store those instead of raw details. These methods stop the memory store from growing without limits, cut storage costs, and let the agent focus on current goals. Choosing the right mix of aging rules is a trade-off: forget too fast and the agent loses context, forget too slow and it wastes resources or reacts to outdated facts. + +Visit the following resources to learn more: + +- [@article@Memory Management](https://python.langchain.com/docs/how_to/chatbots_memory/) +- [@article@Memory Management for AI Agents](https://techcommunity.microsoft.com/blog/azure-ai-services-blog/memory-management-for-ai-agents/4406359) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md b/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md index 34f71ee9b..01db5dd36 100644 --- a/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md +++ b/src/data/roadmaps/ai-agents/content/frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md @@ -1,3 +1,8 @@ # Frequency Penalty -Frequency penalty is a setting that tells a language model, “Stop repeating yourself.” As the model writes, it keeps track of how many times it has already used each word. A positive frequency-penalty value lowers the chance of picking a word again if it has been seen many times in the current reply. This helps cut down on loops like “very very very” or long blocks that echo the same phrase. A value of 0 turns the rule off, while higher numbers make the model avoid repeats more strongly. If the penalty is too high, the text may miss common words that are still needed, so you often start low (for example 0.2) and adjust. Frequency penalty works together with other controls such as temperature and top-p to shape output that is clear, varied, and not boring. \ No newline at end of file +Frequency penalty is a setting that tells a language model, “Stop repeating yourself.” As the model writes, it keeps track of how many times it has already used each word. A positive frequency-penalty value lowers the chance of picking a word again if it has been seen many times in the current reply. This helps cut down on loops like “very very very” or long blocks that echo the same phrase. A value of 0 turns the rule off, while higher numbers make the model avoid repeats more strongly. If the penalty is too high, the text may miss common words that are still needed, so you often start low (for example 0.2) and adjust. Frequency penalty works together with other controls such as temperature and top-p to shape output that is clear, varied, and not boring. + +Visit the following resources to learn more: + +- [@article@Frequency Penalty Explanation](https://docs.aipower.org/docs/ai-engine/openai/frequency-penalty) +- [@article@Understanding Frequency Penalty and Presence Penalty](https://medium.com/@the_tori_report/understanding-frequency-penalty-and-presence-penalty-how-to-fine-tune-ai-generated-text-e5e4f5e779cd) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md b/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md index 67afa78e5..3a3670a89 100644 --- a/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md +++ b/src/data/roadmaps/ai-agents/content/gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md @@ -1,3 +1,8 @@ # Gemini Function Calling -Gemini function calling lets you hook the Gemini language model to real code in a safe and simple way. You first list the functions you want it to use, each with a name, a short note about what it does, and a JSON schema for the needed arguments. When the user speaks, Gemini checks this list and, if a match makes sense, answers with a tiny JSON block that holds the chosen function name and the filled-in arguments. Your program then runs that function, sends the result back, and the chat moves on. Because the reply is strict JSON and not free text, you do not have to guess at what the model means, and you avoid many errors. This flow lets you build agents that pull data, call APIs, or carry out long action chains while keeping control of business logic on your side. \ No newline at end of file +Gemini function calling lets you hook the Gemini language model to real code in a safe and simple way. You first list the functions you want it to use, each with a name, a short note about what it does, and a JSON schema for the needed arguments. When the user speaks, Gemini checks this list and, if a match makes sense, answers with a tiny JSON block that holds the chosen function name and the filled-in arguments. Your program then runs that function, sends the result back, and the chat moves on. Because the reply is strict JSON and not free text, you do not have to guess at what the model means, and you avoid many errors. This flow lets you build agents that pull data, call APIs, or carry out long action chains while keeping control of business logic on your side. + +Visit the following resources to learn more: + +- [@official@Function Calling with the Gemini API](https://ai.google.dev/gemini-api/docs/function-calling) +- [@article@Understanding Function Calling in Gemini](https://medium.com/google-cloud/understanding-function-calling-in-gemini-3097937f1905) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md b/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md index d302d208c..a9190e4ba 100644 --- a/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md +++ b/src/data/roadmaps/ai-agents/content/git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md @@ -1 +1,9 @@ -# Git and Terminal Usage \ No newline at end of file +# Git and Terminal Usage + +Git and the terminal are key tools for AI agents and developers. Git lets you track changes in code, work with branches, and collaborate safely with others. It stores snapshots of your work so you can undo mistakes or merge ideas. The terminal (command line) lets you move around files, run programs, set up servers, and control tools like Git quickly without a GUI. + +Visit the following resources to learn more: + +- [@official@Git Basics](https://git-scm.com/doc) +- [@official@Introduction to the Terminal](https://ubuntu.com/tutorials/command-line-for-beginners#1-overview) +- [@video@Git and Terminal Basics Crash Course (YouTube)](https://www.youtube.com/watch?v=HVsySz-h9r4) diff --git a/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md b/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md index f61d46cbe..a57208cbc 100644 --- a/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md +++ b/src/data/roadmaps/ai-agents/content/haystack@XS-FsvtrXGZ8DPrwOsnlI.md @@ -1,3 +1,9 @@ # Haystack -Haystack is an open-source Python framework that helps you build search and question-answering agents fast. You connect your data sources, pick a language model, and set up pipelines that find the best answer to a user’s query. Haystack handles tasks such as indexing documents, retrieving passages, running the model, and ranking results. It works with many back-ends like Elasticsearch, OpenSearch, FAISS, and Pinecone, so you can scale from a laptop to a cluster. You can add features like summarization, translation, and document chat by dropping extra nodes into the pipeline. The framework also offers REST APIs, a web UI, and clear tutorials, making it easy to test and deploy your agent in production. \ No newline at end of file +Haystack is an open-source Python framework that helps you build search and question-answering agents fast. You connect your data sources, pick a language model, and set up pipelines that find the best answer to a user’s query. Haystack handles tasks such as indexing documents, retrieving passages, running the model, and ranking results. It works with many back-ends like Elasticsearch, OpenSearch, FAISS, and Pinecone, so you can scale from a laptop to a cluster. You can add features like summarization, translation, and document chat by dropping extra nodes into the pipeline. The framework also offers REST APIs, a web UI, and clear tutorials, making it easy to test and deploy your agent in production. + +Visit the following resources to learn more: + +- [@official@Haystack](https://haystack.deepset.ai/) +- [@official@Haystack Overview](https://docs.haystack.deepset.ai/docs/intro) +- [@opensource@deepset-ai/haystack](https://github.com/deepset-ai/haystack) diff --git a/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md b/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md index 66e2352ce..7ddb3fef6 100644 --- a/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md +++ b/src/data/roadmaps/ai-agents/content/helicone@MLxP5N0Vrmwh-kyvNeGXn.md @@ -1,3 +1,9 @@ # Helicone -Helicone is an open-source tool that helps you watch and understand how your AI agents talk to large language models. You send your model calls through Helicone’s proxy, and it records each request and response without changing the result. A clear web dashboard then shows logs, latency, token counts, error rates, and cost for every call. You can filter, search, and trace a single user journey, which makes it easy to spot slow prompts or rising costs. Helicone also lets you set alerts and share traces with your team, so problems get fixed fast and future changes are safer. \ No newline at end of file +Helicone is an open-source tool that helps you watch and understand how your AI agents talk to large language models. You send your model calls through Helicone’s proxy, and it records each request and response without changing the result. A clear web dashboard then shows logs, latency, token counts, error rates, and cost for every call. You can filter, search, and trace a single user journey, which makes it easy to spot slow prompts or rising costs. Helicone also lets you set alerts and share traces with your team, so problems get fixed fast and future changes are safer. + +Visit the following resources to learn more: + +- [@official@Helicone](https://www.helicone.ai/) +- [@official@Helicone OSS LLM Observability](https://docs.helicone.ai/getting-started/quick-start) +- [@opensource@Helicone/helicone](https://github.com/Helicone/helicone) diff --git a/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md b/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md index 2c6503c02..f2ef51002 100644 --- a/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md +++ b/src/data/roadmaps/ai-agents/content/human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md @@ -1,3 +1,10 @@ # Human in the Loop Evaluation -Human-in-the-loop evaluation checks an AI agent by letting real people judge its output and behavior. Instead of trusting only automated scores, testers invite users, domain experts, or crowd workers to watch tasks, label answers, flag errors, and rate clarity, fairness, or safety. Their feedback shows problems that numbers alone miss, such as hidden bias, confusing language, or actions that feel wrong to a person. Teams study these notes, adjust the model, and run another round, repeating until the agent meets quality and trust goals. Mixing human judgment with data leads to a system that is more accurate, useful, and safe for everyday use. \ No newline at end of file +Human-in-the-loop evaluation checks an AI agent by letting real people judge its output and behavior. Instead of trusting only automated scores, testers invite users, domain experts, or crowd workers to watch tasks, label answers, flag errors, and rate clarity, fairness, or safety. Their feedback shows problems that numbers alone miss, such as hidden bias, confusing language, or actions that feel wrong to a person. Teams study these notes, adjust the model, and run another round, repeating until the agent meets quality and trust goals. Mixing human judgment with data leads to a system that is more accurate, useful, and safe for everyday use. + +Visit the following resources to learn more: + +- [@article@Human in the Loop · Cloudflare Agents](https://developers.cloudflare.com/agents/concepts/human-in-the-loop/) +- [@article@What is Human-in-the-Loop: A Guide](https://logifusion.com/what-is-human-in-the-loop-htil/) +- [@article@Human-in-the-Loop ML](https://docs.aws.amazon.com/sagemaker/latest/dg/sms-human-review-workflow.html) +- [@article@The Importance of Human Feedback in AI (Hugging Face Blog)](https://huggingface.co/blog/rlhf) diff --git a/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md b/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md index d6f5b7cf5..b6cc18dc3 100644 --- a/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md +++ b/src/data/roadmaps/ai-agents/content/integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md @@ -1,3 +1,9 @@ # Integration Testing for Flows -Integration testing for flows checks that an AI agent works well from the first user input to the final action, across every step in between. It joins all parts of the system—natural-language understanding, planning, memory, tools, and output—and runs them together in real scenarios. Test cases follow common and edge-case paths a user might take. The goal is to catch errors that only appear when parts interact, such as wrong data passed between modules or timing issues. Good practice includes building automated test suites, using real or mock services, and logging each step for easy debugging. When integration tests pass, you gain confidence that the whole flow feels smooth and reliable for users. \ No newline at end of file +Integration testing for flows checks that an AI agent works well from the first user input to the final action, across every step in between. It joins all parts of the system—natural-language understanding, planning, memory, tools, and output—and runs them together in real scenarios. Test cases follow common and edge-case paths a user might take. The goal is to catch errors that only appear when parts interact, such as wrong data passed between modules or timing issues. Good practice includes building automated test suites, using real or mock services, and logging each step for easy debugging. When integration tests pass, you gain confidence that the whole flow feels smooth and reliable for users. + +Visit the following resources to learn more: + +- [@article@Integration Testing for AI-based Features with Humans](https://www.microsoft.com/en-us/research/publication/hint-integration-testing-for-ai-based-features-with-humans-in-the-loop/) +- [@article@Integration Testing and Unit Testing in AI](https://www.aviator.co/blog/integration-testing-and-unit-testing-in-the-age-of-ai/) +- [@article@Integration Testing](https://www.guru99.com/integration-testing.html) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md b/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md index 82e1e1ab7..ad757837a 100644 --- a/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md +++ b/src/data/roadmaps/ai-agents/content/iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md @@ -1,3 +1,9 @@ # Iterate and Test your Prompts -After you write a first prompt, treat it as a draft, not the final version. Run it with the AI, check the output, and note what is missing, wrong, or confusing. Change one thing at a time, such as adding an example, a limit on length, or a tone request. Test again and see if the result gets closer to what you want. Keep a record of each change and its effect, so you can learn patterns that work. Stop when the output is clear, correct, and repeatable. This loop of try, observe, adjust, and retry turns a rough prompt into a strong one. \ No newline at end of file +After you write a first prompt, treat it as a draft, not the final version. Run it with the AI, check the output, and note what is missing, wrong, or confusing. Change one thing at a time, such as adding an example, a limit on length, or a tone request. Test again and see if the result gets closer to what you want. Keep a record of each change and its effect, so you can learn patterns that work. Stop when the output is clear, correct, and repeatable. This loop of try, observe, adjust, and retry turns a rough prompt into a strong one. + +Visit the following resources to learn more: + +- [@article@Master Iterative Prompting: A Guide](https://blogs.vreamer.space/master-iterative-prompting-a-guide-to-more-effective-interactions-with-ai-50a736eaec38) +- [@course@Prompt Engineering Best Practices](https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/) +- [@video@Prompt Engineering: The Iterative Process](https://www.youtube.com/watch?v=dOxUroR57xs) diff --git a/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md b/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md index c2bca1885..1c595ce75 100644 --- a/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md +++ b/src/data/roadmaps/ai-agents/content/langchain@Ka6VpCEnqABvwiF9vba7t.md @@ -1,3 +1,11 @@ -# Langchain +# LangChain -LangChain is a Python and JavaScript library that helps you put large language models to work in real products. It gives ready-made parts for common agent tasks such as talking to many tools, keeping short-term memory, and calling an external API when the model needs fresh data. You combine these parts like Lego blocks: pick a model, add a prompt template, chain the steps, then wrap the chain in an “agent” that can choose what step to run next. Built-in connectors link to OpenAI, Hugging Face, vector stores, and SQL databases, so you can search documents or pull company data without writing a lot of glue code. This lets you move fast from idea to working bot, while still letting you swap out parts if your needs change. \ No newline at end of file +LangChain is a Python and JavaScript library that helps you put large language models to work in real products. It gives ready-made parts for common agent tasks such as talking to many tools, keeping short-term memory, and calling an external API when the model needs fresh data. You combine these parts like Lego blocks: pick a model, add a prompt template, chain the steps, then wrap the chain in an “agent” that can choose what step to run next. Built-in connectors link to OpenAI, Hugging Face, vector stores, and SQL databases, so you can search documents or pull company data without writing a lot of glue code. This lets you move fast from idea to working bot, while still letting you swap out parts if your needs change. + +Visit the following resources to learn more: + +- [@official@LangChain Documentation](https://python.langchain.com/docs/introduction/) +- [@opensource@langchain-ai/langchain](https://github.com/langchain-ai/langchain) +- [@article@Building Applications with LLMs using LangChain](https://www.pinecone.io/learn/series/langchain/) +- [@article@AI Agents with LangChain and LangGraph](https://www.udacity.com/course/ai-agents-with-langchain-and-langgraph--cd13764) +- [@video@LangChain Crash Course - Build LLM Apps Fast (YouTube)](https://www.youtube.com/watch?v=nAmC7SoVLd8) diff --git a/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md b/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md index b0924dba9..a20edda17 100644 --- a/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md +++ b/src/data/roadmaps/ai-agents/content/langfuse@UoIheaJlShiceafrWALEH.md @@ -1,3 +1,10 @@ # LangFuse -LangFuse is a free, open-source tool that lets you watch and debug AI agents while they run. You add a small code snippet to your agent, and LangFuse starts collecting every prompt, model response, and user input. It shows this data as neat timelines, so you can see each step the agent takes, how long the calls cost, and where errors happen. You can tag runs, search through them, and compare different prompt versions to find what works best. The dashboard also tracks token usage and latency, helping you cut cost and improve speed. Because LangFuse stores data in your own database, you keep full control of sensitive text. It works well with popular frameworks like LangChain and can send alerts to Slack or email when something breaks. \ No newline at end of file +LangFuse is a free, open-source tool that lets you watch and debug AI agents while they run. You add a small code snippet to your agent, and LangFuse starts collecting every prompt, model response, and user input. It shows this data as neat timelines, so you can see each step the agent takes, how long the calls cost, and where errors happen. You can tag runs, search through them, and compare different prompt versions to find what works best. The dashboard also tracks token usage and latency, helping you cut cost and improve speed. Because LangFuse stores data in your own database, you keep full control of sensitive text. It works well with popular frameworks like LangChain and can send alerts to Slack or email when something breaks. + +Visit the following resources to learn more: + +- [@official@LangFuse](https://langfuse.com/) +- [@official@LangFuse Documentation](https://langfuse.com/docs) +- [@opensource@langfuse/langfuse](https://github.com/langfuse/langfuse) +- [@article@Langfuse: Open Source LLM Engineering Platform](https://www.ycombinator.com/companies/langfuse) diff --git a/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md b/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md index 661e31227..e8b70f440 100644 --- a/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md +++ b/src/data/roadmaps/ai-agents/content/langsmith@SS8mGqf9wfrNqenIWvN8Z.md @@ -1,3 +1,10 @@ # LangSmith -LangSmith is a web tool that helps you see and fix what your AI agents are doing. It records each call that the agent makes to a language model, the input it used, and the answer it got back. You can replay any step, compare different prompts, measure cost, speed, and error rates, and tag runs for easy search. It also lets you store test sets and run quick checks so you know if new code makes the agent worse. By showing clear traces and charts, LangSmith makes it easier to debug, improve, and trust AI systems built with LangChain or other frameworks. \ No newline at end of file +LangSmith is a web tool that helps you see and fix what your AI agents are doing. It records each call that the agent makes to a language model, the input it used, and the answer it got back. You can replay any step, compare different prompts, measure cost, speed, and error rates, and tag runs for easy search. It also lets you store test sets and run quick checks so you know if new code makes the agent worse. By showing clear traces and charts, LangSmith makes it easier to debug, improve, and trust AI systems built with LangChain or other frameworks. + +Visit the following resources to learn more: + +- [@official@LangSmith](https://smith.langchain.com/) +- [@official@LangSmith Documentation](https://docs.smith.langchain.com/) +- [@official@Harden your application with LangSmith Evaluation](https://www.langchain.com/evaluation) +- [@article@What is LangSmith and Why should I care as a developer?](https://medium.com/around-the-prompt/what-is-langsmith-and-why-should-i-care-as-a-developer-e5921deb54b5) diff --git a/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md b/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md index 08eb10efd..a2231686f 100644 --- a/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md +++ b/src/data/roadmaps/ai-agents/content/langsmith@xp7TCTRE9HP60_rGzTUF6.md @@ -1,3 +1,10 @@ # LangSmith -LangSmith is a tool that helps you see how well your AI agents work. It lets you record every step the agent takes, from the first input to the final answer. You can replay these steps to find places where the agent goes wrong. LangSmith also lets you create test sets with real user prompts and compare new model versions against them. It shows clear numbers on speed, cost, and accuracy so you can spot trade-offs. Because LangSmith links to LangChain, you can add it with only a few extra lines of code. The web dashboard then gives charts, error logs, and side-by-side result views. This makes it easy to track progress, fix bugs, and prove that your agent is getting better over time. \ No newline at end of file +LangSmith is a tool that helps you see how well your AI agents work. It lets you record every step the agent takes, from the first input to the final answer. You can replay these steps to find places where the agent goes wrong. LangSmith also lets you create test sets with real user prompts and compare new model versions against them. It shows clear numbers on speed, cost, and accuracy so you can spot trade-offs. Because LangSmith links to LangChain, you can add it with only a few extra lines of code. The web dashboard then gives charts, error logs, and side-by-side result views. This makes it easy to track progress, fix bugs, and prove that your agent is getting better over time. + +Visit the following resources to learn more: + +- [@official@LangSmith](https://smith.langchain.com/) +- [@official@LangSmith Documentation](https://docs.smith.langchain.com/) +- [@official@Harden your application with LangSmith Evaluation](https://www.langchain.com/evaluation) +- [@article@What is LangSmith and Why should I care as a developer?](https://medium.com/around-the-prompt/what-is-langsmith-and-why-should-i-care-as-a-developer-e5921deb54b5) diff --git a/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md b/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md index c5f656961..ca798d7d1 100644 --- a/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md +++ b/src/data/roadmaps/ai-agents/content/llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md @@ -1,3 +1,12 @@ # LlamaIndex -LlamaIndex is an open-source Python toolkit that helps you give a language model access to your own data. You load files such as PDFs, web pages, or database rows. The toolkit breaks the text into chunks, turns them into vectors, and stores them in a chosen vector store like FAISS or Pinecone. When a user asks a question, LlamaIndex finds the best chunks, adds them to the prompt, and sends the prompt to the model. This flow is called retrieval-augmented generation and it lets an agent give answers grounded in your content. The library offers simple classes for loading, indexing, querying, and composing tools, so you write less boilerplate code. It also works with other frameworks, including LangChain, and supports models from OpenAI or Hugging Face. With a few lines of code you can build a chatbot, Q&A system, or other agent that knows your documents. \ No newline at end of file +LlamaIndex is an open-source Python toolkit that helps you give a language model access to your own data. You load files such as PDFs, web pages, or database rows. The toolkit breaks the text into chunks, turns them into vectors, and stores them in a chosen vector store like FAISS or Pinecone. When a user asks a question, LlamaIndex finds the best chunks, adds them to the prompt, and sends the prompt to the model. This flow is called retrieval-augmented generation and it lets an agent give answers grounded in your content. The library offers simple classes for loading, indexing, querying, and composing tools, so you write less boilerplate code. It also works with other frameworks, including LangChain, and supports models from OpenAI or Hugging Face. With a few lines of code you can build a chatbot, Q&A system, or other agent that knows your documents. + +Visit the following resources to learn more: + +- [@official@LlamaIndex](https://llamaindex.ai/) +- [@official@LlamaIndex Documentation](https://docs.smith.langchain.com/) +- [@official@What is LlamaIndex.TS](https://ts.llamaindex.ai/docs/llamaindex) +- [@opensource@run-llama/llama_index](https://github.com/run-llama/llama_index) +- [@article@What is LlamaIndex? - IBM](https://www.ibm.com/think/topics/llamaindex) +- [@article@LlamaIndex - Hugging Face](https://huggingface.co/llamaindex) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md b/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md index 4c381ced7..6c67855ab 100644 --- a/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md +++ b/src/data/roadmaps/ai-agents/content/llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md @@ -1,3 +1,9 @@ # LLM Native "Function Calling" -LLM native “function calling” lets a large language model decide when to run a piece of code and which inputs to pass to it. You first tell the model what functions are available. For each one you give a short name, a short description, and a list of arguments with their types. During a chat, the model can answer in JSON that matches this schema instead of plain text. Your wrapper program reads the JSON, calls the real function, and then feeds the result back to the model so it can keep going. This loop helps an agent search the web, look up data, send an email, or do any other task you expose. Because the output is structured, you get fewer mistakes than when the model tries to write raw code or natural-language commands. You also keep tight control over what the agent can and cannot do. Most current API providers support this method, so you can add new tools by only editing the schema and a handler, not the model itself. \ No newline at end of file +LLM native “function calling” lets a large language model decide when to run a piece of code and which inputs to pass to it. You first tell the model what functions are available. For each one you give a short name, a short description, and a list of arguments with their types. During a chat, the model can answer in JSON that matches this schema instead of plain text. Your wrapper program reads the JSON, calls the real function, and then feeds the result back to the model so it can keep going. This loop helps an agent search the web, look up data, send an email, or do any other task you expose. Because the output is structured, you get fewer mistakes than when the model tries to write raw code or natural-language commands. + +Visit the following resources to learn more: + +- [@article@A Comprehensive Guide to Function Calling in LLMs](https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/) +- [@article@Function Calling with LLMs | Prompt Engineering Guide](https://www.promptingguide.ai/applications/function_calling) +- [@article@Function Calling with Open-Source LLMs](https://medium.com/@rushing_andrei/function-calling-with-open-source-llms-594aa5b3a304) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md b/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md index d6d4acb7d..385ba32d4 100644 --- a/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md +++ b/src/data/roadmaps/ai-agents/content/local-desktop@iBtJp24F_kJE3YlBsW60s.md @@ -1,3 +1,10 @@ # Local Desktop -A Local Desktop deployment means you run the MCP server on your own computer instead of on a remote machine or cloud service. You install the MCP software, any language runtimes it needs, and the model files all on your desktop or laptop. When you start the server, it listens on a port such as 127.0.0.1:8000, which is only reachable from the same computer unless you change network settings. This setup is handy for quick tests, small demos, or private work because you control the files and can restart the server at any time. It also avoids extra cost from cloud hosting. The main limits are the power of your hardware and the fact that other people cannot reach the service unless you expose it through port forwarding or a tunnel. \ No newline at end of file +A Local Desktop deployment means running the MCP server directly on your own computer instead of a remote cloud or server. You install the MCP software, needed runtimes, and model files onto your desktop or laptop. The server then listens on a local address like `127.0.0.1:8000`, accessible only from the same machine unless you open ports manually. This setup is great for fast tests, personal demos, or private experiments since you keep full control and avoid cloud costs. However, it's limited by your hardware's speed and memory, and others cannot access it without tunneling tools like ngrok or local port forwarding. + +Visit the following resources to learn more: + +- [@article@Build a Simple Local MCP Server](https://blog.stackademic.com/build-simple-local-mcp-server-5434d19572a4) +- [@article@How to Build and Host Your Own MCP Servers in Easy Steps](https://collabnix.com/how-to-build-and-host-your-own-mcp-servers-in-easy-steps/) +- [@article@Expose localhost to Internet](https://ngrok.com/docs) +- [@video@Run a Local Server on Your Machine](https://www.youtube.com/watch?v=ldGl6L4Vktk) diff --git a/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md b/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md index 59cd404b9..a5dbbe044 100644 --- a/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md +++ b/src/data/roadmaps/ai-agents/content/long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md @@ -1,3 +1,11 @@ # Long Term Memory -Long term memory in an AI agent is the part of its storage where information is kept for long periods so it can be used again in the future. It works like a notebook that the agent can write to and read from whenever needed. The agent saves facts, past events, user preferences, and learned skills in this space. When a similar event happens later, the agent looks up this stored data to make better choices and respond in a consistent way. Long term memory lets the agent grow smarter over time because it does not forget important details after the current task ends. This memory usually lives in a database or file system and may include text, numbers, or compressed states of past conversations. \ No newline at end of file +Long term memory in an AI agent stores important information for future use, like a digital notebook. It saves facts, past events, user preferences, and learned skills so the agent can make smarter and more consistent decisions over time. Unlike short-term memory, this data survives across sessions. When a similar situation comes up, the agent can look back and use what it already knows. Long term memory usually lives in a database, file system, or vector store and may hold text, numbers, embeddings, or past conversation states. Good management of long-term memory is key for building agents that feel personalized and get better with experience. + +Visit the following resources to learn more: + +- [@article@Long Term Memory in AI Agents](https://medium.com/@alozie_igbokwe/ai-101-long-term-memory-in-ai-agents-35f87f2d0ce0) +- [@article@Memory Management in AI Agents](https://python.langchain.com/docs/how_to/chatbots_memory/) +- [@article@Storing and Retrieving Knowledge for Agents](https://www.pinecone.io/learn/langchain-retrieval-augmentation/) +- [@article@Short-Term vs Long-Term Memory in AI Agents](https://adasci.org/short-term-vs-long-term-memory-in-ai-agents/) +- [@video@Building Brain-Like Memory for AI Agents](https://www.youtube.com/watch?v=VKPngyO0iKg) diff --git a/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md b/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md index 275537904..9e895322e 100644 --- a/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md +++ b/src/data/roadmaps/ai-agents/content/manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md @@ -1,3 +1,10 @@ # Manual (from scratch) -Building an AI agent from scratch means you write every part of the system yourself instead of using ready-made tools. You decide how the agent senses the world, saves data, learns, and makes choices. First, you choose a goal, like playing a game or answering questions. Then you design the inputs, for example keyboard moves or text. You code the logic that turns these inputs into actions. You may add a learning part, such as a basic neural network or a set of rules that update over time. You also build memory so the agent can use past facts. Testing is key: run the agent, watch what it does, and fix mistakes. This path is slow and hard, but it teaches you how each piece works and gives you full control. \ No newline at end of file +Building an AI agent from scratch means writing every part of the system yourself, without ready-made libraries. You define how the agent senses inputs, stores memory, makes decisions, and learns over time. First, you pick a clear goal, like solving puzzles or chatting. Then you code the inputs (keyboard, mouse, text), decision logic (rules or neural networks), and memory (saving facts from past events). Testing is critical: you run the agent, watch its actions, debug, and improve. Though it takes longer, this approach gives deep understanding and full control over how the agent works and evolves. + +Visit the following resources to learn more: + +- [@article@A Step-by-Step Guide to Building an AI Agent From Scratch](https://www.neurond.com/blog/how-to-build-an-ai-agent) +- [@article@How to Build AI Agents](https://wotnot.io/blog/build-ai-agents) +- [@article@Build Your Own AI Agent from Scratch in 30 Minutes](https://medium.com/@gurpartap.sandhu3/build-you-own-ai-agent-from-scratch-in-30-mins-using-simple-python-1458f8099da0) +- [@video@Building an AI Agent From Scratch](https://www.youtube.com/watch?v=bTMPwUgLZf0) diff --git a/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md b/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md index e6fd28cda..79ad555f2 100644 --- a/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md +++ b/src/data/roadmaps/ai-agents/content/max-length@Bn_BkthrVX_vOuwQzvPZa.md @@ -1,3 +1,12 @@ # Max Length -Max Length is the setting that tells a language model the biggest number of tokens it may write in one go. A token is a small piece of text, usually a short word or part of a word, so 100 tokens roughly equals a short paragraph. When the model reaches the limit, it stops and returns the answer. A small limit keeps replies short, saves money, and runs fast, but it can cut ideas in half. A large limit lets the model finish long thoughts, yet it needs more time, more processing power, and can wander off topic. Choose the value to fit the job: a tweet might need 50 tokens, a long guide might need 1,000 or more. Good tuning finds a balance between cost, speed, and clear, complete answers. \ No newline at end of file +Max Length sets the maximum number of tokens a language model can generate in one reply. Tokens are pieces of text—roughly 100 tokens equals a short paragraph. A small limit saves time and cost but risks cutting answers short. A large limit allows full, detailed replies but needs more compute and can lose focus. Choose limits based on the task: short limits for tweets, longer ones for articles. Tuning Max Length carefully helps balance clarity, speed, and cost. + +Visit the following resources to learn more: + +- [@official@OpenAI Token Usage](https://platform.openai.com/docs/guides/gpt/managing-tokens) +- [@official@Size and Max Token Limits](https://docs.anthropic.com/claude/docs/size-and-token-limits) +- [@article@Utilising Max Token Context Window of Anthropic Claude](https://medium.com/@nampreetsingh/utilising-max-token-context-window-of-anthropic-claude-on-amazon-bedrock-7377d94b2dfa) +- [@article@Controlling the Length of OpenAI Model Responses](https://help.openai.com/en/articles/5072518-controlling-the-length-of-openai-model-responses) +- [@article@Max Model Length in AI](https://www.restack.io/p/ai-model-answer-max-model-length-cat-ai) +- [@video@Understanding ChatGPT/OpenAI Tokens](https://youtu.be/Mo3NV5n1yZk) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md b/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md index c44750170..5be36321f 100644 --- a/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md +++ b/src/data/roadmaps/ai-agents/content/mcp-client@CGVstUxVXLJcYZrwk3iNQ.md @@ -1,3 +1,10 @@ # MCP Client -The MCP Client is the part of an AI agent that talks directly to the large-language-model service. It gathers all messages, files, and tool signals that make up the current working state, packs them into the format defined by the Model Context Protocol, and sends the bundle to the model’s API. After the model answers, the client unpacks the reply, checks that it follows protocol rules, and hands the result to other modules, such as planners or tool runners. It also tracks tokens, applies privacy filters, retries on network errors, and logs key events for debugging. In short, the MCP Client is the gateway that turns local agent data into a valid model request and turns the model’s response into something the rest of the system can use. \ No newline at end of file +The MCP Client is the part of an AI agent that talks to the language model API. It collects messages, files, and tool signals, packs them using the Model Context Protocol, and sends them to the model. When a reply comes back, it unpacks it, checks the format, and passes the result to other modules. It also tracks token usage, filters private data, retries failed calls, and logs important events for debugging. + +Visit the following resources to learn more: + +- [@opensource@Model Context Protocol](https://github.com/modelcontextprotocol/modelcontextprotocol) +- [@official@Model Context Protocol](https://modelcontextprotocol.io/introduction) +- [@official@OpenAI API Reference](https://platform.openai.com/docs/api-reference) +- [@official@Anthropic API Documentation](https://docs.anthropic.com/claude/reference) diff --git a/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md b/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md index aa0ab9d05..39854edfa 100644 --- a/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md +++ b/src/data/roadmaps/ai-agents/content/mcp-hosts@9FryAIrWRHh8YlzKX3et5.md @@ -1,3 +1,10 @@ # MCP Hosts -MCP Hosts are the computers or cloud services that run the Model Context Protocol. They keep the protocol code alive, listen for incoming calls, and pass data between users, tools, and language models. A host loads the MCP manifest, checks that requests follow the rules, and stores any state that needs to last between calls. It may cache recent messages, track token use, and add safety or billing checks before it forwards a prompt to the model. Hosts also expose an API endpoint so that outside apps can connect without knowing the low-level details of the protocol. You can run a host on your own laptop for testing or deploy it on a serverless platform for scale; either way, it provides the same trusted place where MCP agents, tools, and data meet. \ No newline at end of file +MCP Hosts are computers or services that run the Model Context Protocol. They handle incoming calls, load the MCP manifest, check requests, and pass data between users, tools, and language models. Hosts may cache recent messages, track token usage, and add safety or billing checks before sending prompts to the model. They expose an API endpoint so apps can connect easily. You can run a host on your laptop for testing or deploy it on cloud platforms for scale. The host acts as the trusted bridge where agents, tools, and data meet. + +Visit the following resources to learn more: + +- [@official@Vercel Serverless Hosting](https://vercel.com/docs) +- [@article@The Ultimate Guide to MCP](https://guangzhengli.com/blog/en/model-context-protocol) +- [@article@AWS MCP Servers for Code Assistants](https://aws.amazon.com/blogs/machine-learning/introducing-aws-mcp-servers-for-code-assistants-part-1/) +- [@opensource@punkeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md b/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md index 9ef0c0db1..6ac91f9e7 100644 --- a/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md +++ b/src/data/roadmaps/ai-agents/content/mcp-servers@yv_-87FVM7WKn5iv6LW9q.md @@ -1,3 +1,10 @@ # MCP Servers -An MCP Server is the main machine or cloud service that runs the Model Context Protocol. It keeps the shared “memory” that different AI agents need so they stay on the same page. When an agent sends a request, the server checks who is asking, pulls the right context from its store, and sends it back fast. It also saves new facts and task results so the next agent can use them. An MCP Server must handle many users at once, protect private data with strict access rules, and log every change for easy roll-back. Good servers break work into small tasks, spread them across many computers, and add backups so they never lose data. In short, the MCP Server is the hub that makes sure all agents share fresh, safe, and correct context. \ No newline at end of file +An MCP Server is the main machine or cloud service that runs the Model Context Protocol. It keeps the shared “memory” that different AI agents need so they stay on the same page. When an agent sends a request, the server checks who is asking, pulls the right context from its store, and sends it back fast. It also saves new facts and task results so the next agent can use them. An MCP Server must handle many users at once, protect private data with strict access rules, and log every change for easy roll-back. Good servers break work into small tasks, spread them across many computers, and add backups so they never lose data. In short, the MCP Server is the hub that makes sure all agents share fresh, safe, and correct context. + +Visit the following resources to learn more: + +- [@article@Introducing the Azure MCP Server ](https://devblogs.microsoft.com/azure-sdk/introducing-the-azure-mcp-server/) +- [@article@The Ultimate Guide to MCP](https://guangzhengli.com/blog/en/model-context-protocol) +- [@article@AWS MCP Servers for Code Assistants](https://aws.amazon.com/blogs/machine-learning/introducing-aws-mcp-servers-for-code-assistants-part-1/) +- [@opensource@punkeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md b/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md index 5985b117e..c6d0ef6a2 100644 --- a/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md +++ b/src/data/roadmaps/ai-agents/content/metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md @@ -1,3 +1,10 @@ # Metrics to Track -To know if an AI agent works well, you need numbers that tell the story. Track accuracy, precision, recall, and F1 score to see how often the agent is right. For ranking tasks, record mean average precision or ROC-AUC. If users interact with the agent, measure response time, latency, and the share of failed requests. Safety metrics count toxic or biased outputs, while robustness tests see how the agent copes with noisy or tricky inputs. Resource metrics—memory, CPU, and energy—show if the system can run at scale. Choose the metrics that fit the task, compare results to a baseline, and watch the trend with every new version. \ No newline at end of file +To judge how well an AI agent works, you need clear numbers. Track accuracy, precision, recall, and F1 score to measure correctness. For ranking tasks, use metrics like mean average precision or ROC-AUC. If users interact with the agent, monitor response time, latency, and failure rates. Safety metrics count toxic or biased outputs, while robustness tests check how the agent handles messy or tricky inputs. Resource metrics—memory, CPU, and energy—show if it can scale. Pick the metrics that match your goal, compare against a baseline, and track trends across versions. + +Visit the following resources to learn more: + +- [@article@Robustness Testing for AI](https://mitibmwatsonailab.mit.edu/category/robustness/) +- [@article@Complete Guide to Machine Learning Evaluation Metrics](https://medium.com/analytics-vidhya/complete-guide-to-machine-learning-evaluation-metrics-615c2864d916) +- [@article@Measuring Model Performance](https://developers.google.com/machine-learning/crash-course/classification/accuracy) +- [@article@A Practical Framework for (Gen)AI Value Measurement](https://medium.com/google-cloud/a-practical-framework-for-gen-ai-value-measurement-5fccf3b66c43) diff --git a/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md b/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md index 6eec69a0b..67d9b849b 100644 --- a/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md +++ b/src/data/roadmaps/ai-agents/content/model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md @@ -1,3 +1,10 @@ # Model Context Protocol (MCP) -Model Context Protocol (MCP) is a rulebook that tells an AI agent how to pack background information before it sends a prompt to a language model. It lists what pieces go into the prompt—things like the system role, the user’s request, past memory, tool calls, or code snippets—and fixes their order. Clear tags mark each piece, so both humans and machines can see where one part ends and the next begins. Keeping the format steady cuts confusion, lets different tools work together, and makes it easier to test or swap models later. When agents follow MCP, the model gets a clean, complete prompt and can give better answers. \ No newline at end of file +Model Context Protocol (MCP) is a rulebook that tells an AI agent how to pack background information before it sends a prompt to a language model. It lists what pieces go into the prompt—things like the system role, the user’s request, past memory, tool calls, or code snippets—and fixes their order. Clear tags mark each piece, so both humans and machines can see where one part ends and the next begins. Keeping the format steady cuts confusion, lets different tools work together, and makes it easier to test or swap models later. When agents follow MCP, the model gets a clean, complete prompt and can give better answers. + +Visit the following resources to learn more: + +- [@opensource@Model Context Protocol](https://github.com/modelcontextprotocol/modelcontextprotocol) +- [@official@Model Context Protocol](https://modelcontextprotocol.io/introduction) +- [@article@Introducing the Azure MCP Server ](https://devblogs.microsoft.com/azure-sdk/introducing-the-azure-mcp-server/) +- [@article@The Ultimate Guide to MCP](https://guangzhengli.com/blog/en/model-context-protocol) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md b/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md index d5cab7215..166ba7b37 100644 --- a/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md +++ b/src/data/roadmaps/ai-agents/content/npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md @@ -1,3 +1,8 @@ # NPC / Game AI -Game studios often use AI agents to control non-player characters (NPCs). The agent watches the game state and picks actions such as moving, speaking, or fighting. It can switch tactics when the player changes strategy, so battles feel fresh instead of scripted. A quest giver can also use an agent to offer hints that fit the player’s progress. In open-world games, agents help crowds walk around objects, pick new goals, and react to danger, which makes towns feel alive. Designers save time because they write broad rules and let the agent fill in details instead of hand-coding every scene. Better NPC behavior keeps players engaged and raises replay value. \ No newline at end of file +Game studios use AI agents to control non-player characters (NPCs). The agent observes the game state and decides actions like moving, speaking, or fighting. It can shift tactics when the player changes strategy, keeping battles fresh instead of predictable. A quest giver might use an agent to offer hints that fit the player’s progress. In open-world games, agents guide crowds to move around obstacles, set new goals, and react to threats, making towns feel alive. Designers save time by writing broad rules and letting agents fill in details instead of hand-coding every scene. Smarter NPC behavior keeps players engaged and boosts replay value. + +Visit the following resources to learn more: + +- [@official@Unity – AI for NPCs](https://dev.epicgames.com/documentation/en-us/unreal-engine/artificial-intelligence-in-unreal-engine?application_version=5.3) +- [@article@AI-Driven NPCs: The Future of Gaming Explained](https://www.capermint.com/blog/everything-you-need-to-know-about-non-player-character-npc/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md b/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md index eb73b0304..3ff4c147c 100644 --- a/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md +++ b/src/data/roadmaps/ai-agents/content/observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md @@ -1,3 +1,8 @@ # Observation & Reflection -Observation and reflection form the thinking pause in an AI agent’s loop. First, the agent looks at the world around it, gathers fresh data, and sees what has changed. It then pauses to ask, “What does this new information mean for my goal?” During this short check, the agent updates its memory, spots errors, and ranks what matters most. These steps guide wiser plans and actions in the next cycle. Without careful observation and reflection, the agent would rely on old or wrong facts and soon drift off course. \ No newline at end of file +Observation and reflection form the thinking pause in an AI agent’s loop. First, the agent looks at the world around it, gathers fresh data, and sees what has changed. It then pauses to ask, “What does this new information mean for my goal?” During this short check, the agent updates its memory, spots errors, and ranks what matters most. These steps guide wiser plans and actions in the next cycle. Without careful observation and reflection, the agent would rely on old or wrong facts and soon drift off course. + +Visit the following resources to learn more: + +- [@official@Best Practices for Prompting and Self-checking](https://platform.openai.com/docs/guides/prompt-engineering) +- [@article@Self-Reflective AI: Building Agents That Learn by Observing Themselves](https://arxiv.org/abs/2302.14045) diff --git a/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md b/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md index 3a9bc2f54..e70b9d146 100644 --- a/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md +++ b/src/data/roadmaps/ai-agents/content/open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md @@ -1,3 +1,11 @@ # Open Weight Models -Open-weight models are neural networks whose trained parameters, also called weights, are shared with everyone. Anyone can download the files, run the model, fine-tune it, or build tools on top of it. The licence that comes with the model spells out what you are allowed to do. Some licences are very permissive and even let you use the model for commercial work. Others allow only research or personal projects. Because the weights are public, the community can inspect how the model works, check for bias, and suggest fixes. Open weights also lower costs, since teams do not have to train a large model from scratch. Well-known examples include BLOOM, Falcon, and Llama 2. \ No newline at end of file +Open-weight models are neural networks whose trained parameters, also called weights, are shared with everyone. Anyone can download the files, run the model, fine-tune it, or build tools on top of it. The licence that comes with the model spells out what you are allowed to do. Some licences are very permissive and even let you use the model for commercial work. Others allow only research or personal projects. Because the weights are public, the community can inspect how the model works, check for bias, and suggest fixes. Open weights also lower costs, since teams do not have to train a large model from scratch. Well-known examples include BLOOM, Falcon, and Llama 2. + +Visit the following resources to learn more: + +- [@official@BLOOM BigScience](https://bigscience.huggingface.co/) +- [@official@Falcon LLM – Technology Innovation Institute (TII)](https://falconllm.tii.ae/) +- [@official@Llama 2 – Meta's Official Announcement](https://ai.meta.com/llama/) +- [@official@Hugging Face – Open LLM Leaderboard (Top Open Models)](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard) +- [@official@EleutherAI – Open Research Collective (GPT-Neo, GPT-J, etc.)](https://www.eleuther.ai/) diff --git a/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md b/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md index d6586b31d..8568b9405 100644 --- a/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md +++ b/src/data/roadmaps/ai-agents/content/openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md @@ -1,3 +1,10 @@ # OpenAI Assistant API -The OpenAI Assistants API lets you add clear, task-specific actions to a chat with a large language model. You first describe each action you want the model to use, giving it a name, a short purpose, and a list of inputs in JSON form. During the chat, the model may decide that one of these actions will help. It then returns the name of the action and a JSON object with the input values it thinks are right. Your code receives this call, runs real work such as a database query or a web request, and sends the result back to the model. The model reads the result and continues the chat, now armed with fresh facts. This loop lets you keep control of what real work happens while still letting the model plan and talk in natural language. \ No newline at end of file +The OpenAI Assistants API lets you add clear, task-specific actions to a chat with a large language model. You first describe each action you want the model to use, giving it a name, a short purpose, and a list of inputs in JSON form. During the chat, the model may decide that one of these actions will help. It then returns the name of the action and a JSON object with the input values it thinks are right. Your code receives this call, runs real work such as a database query or a web request, and sends the result back to the model. The model reads the result and continues the chat, now armed with fresh facts. This loop lets you keep control of what real work happens while still letting the model plan and talk in natural language. + +Visit the following resources to learn more: + +- [@official@OpenAI Documentation – Assistants API Overview](https://platform.openai.com/docs/assistants/overview) +- [@official@OpenAI Blog – Introducing the Assistants API](https://openai.com/blog/assistants-api) +- [@official@OpenAI Cookbook – Assistants API Example](https://github.com/openai/openai-cookbook/blob/main/examples/Assistants_API_overview_python.ipynb) +- [@official@OpenAI API Reference – Assistants Endpoints](https://platform.openai.com/docs/api-reference/assistants) diff --git a/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md b/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md index 24e547cc5..240658a05 100644 --- a/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md +++ b/src/data/roadmaps/ai-agents/content/openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md @@ -1,3 +1,11 @@ # OpenAI Functions Calling -OpenAI Function Calling lets you give a language model a list of tools and have it decide which one to use and with what data. You describe each tool with a short name, what it does, and the shape of its inputs in a small JSON-like schema. You then pass the user message and this tool list to the model. Instead of normal text, the model can reply with a JSON block that names the tool and fills in the needed arguments. Your program reads this block, runs the real function, and can send the result back for the next step. This pattern makes agent actions clear, easy to parse, and hard to abuse, because the model cannot run code on its own and all calls go through your checks. It also cuts down on prompt hacks and wrong formats, so agents work faster and more safely. \ No newline at end of file +OpenAI Function Calling lets you give a language model a list of tools and have it decide which one to use and with what data. You describe each tool with a short name, what it does, and the shape of its inputs in a small JSON-like schema. You then pass the user message and this tool list to the model. Instead of normal text, the model can reply with a JSON block that names the tool and fills in the needed arguments. Your program reads this block, runs the real function, and can send the result back for the next step. This pattern makes agent actions clear, easy to parse, and hard to abuse, because the model cannot run code on its own and all calls go through your checks. It also cuts down on prompt hacks and wrong formats, so agents work faster and more safely. + +Visit the following resources to learn more: + +- [@official@OpenAI Documentation – Function Calling](https://platform.openai.com/docs/guides/function-calling) +- [@official@OpenAI Cookbook – Using Functions with GPT Models](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb) +- [@officialOpenAI Blog – Announcing Function Calling and Other Updates](https://openai.com/blog/function-calling-and-other-api-updates) +- [@officialOpenAI API Reference – Functions Section](https://platform.openai.com/docs/api-reference/chat/create#functions) +- [@officialOpenAI Community – Discussions and Examples on Function Calling](https://community.openai.com/tag/function-calling) diff --git a/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md b/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md index 6914fbd8b..0a0a97dee 100644 --- a/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md +++ b/src/data/roadmaps/ai-agents/content/openllmetry@7UqPXUzqKYXklnB3x-tsv.md @@ -1,3 +1,10 @@ # openllmetry -openllmetry is a small Python library that makes it easy to watch what your AI agent is doing and how well it is working. It wraps calls to large-language-model APIs, vector stores, and other tools, then sends logs, traces, and simple metrics to any backend that speaks the OpenTelemetry standard, such as Jaeger, Zipkin, or Grafana. You add one or two lines of code at start-up, and the library captures prompt text, model name, latency, token counts, and costs each time the agent asks the model for an answer. The data helps you spot slow steps, high spend, or bad answers, and it lets you play back full traces to debug agent chains. Because it follows OpenTelemetry, you can mix these AI traces with normal service traces and see the whole flow in one place. \ No newline at end of file +openllmetry is a small Python library that makes it easy to watch what your AI agent is doing and how well it is working. It wraps calls to large-language-model APIs, vector stores, and other tools, then sends logs, traces, and simple metrics to any backend that speaks the OpenTelemetry standard, such as Jaeger, Zipkin, or Grafana. You add one or two lines of code at start-up, and the library captures prompt text, model name, latency, token counts, and costs each time the agent asks the model for an answer. The data helps you spot slow steps, high spend, or bad answers, and it lets you play back full traces to debug agent chains. Because it follows OpenTelemetry, you can mix these AI traces with normal service traces and see the whole flow in one place. + +Visit the following resources to learn more: + +- [@official@OpenTelemetry Documentation](https://www.traceloop.com/blog/openllmetry) +- [@official@What is OpenLLMetry? - traceloop](https://www.traceloop.com/docs/openllmetry/introduction) +- [@official@Use Traceloop with Python](https://www.traceloop.com/docs/openllmetry/getting-started-python) +- [@opensource@traceloop/openllmetry](https://github.com/traceloop/openllmetry) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md b/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md index cf3028029..fa5a2c0e7 100644 --- a/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md +++ b/src/data/roadmaps/ai-agents/content/perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md @@ -1,3 +1,8 @@ # Perception / User Input -Perception, also called user input, is the first step in an agent loop. The agent listens and gathers data from the outside world. This data can be text typed by a user, spoken words, camera images, sensor readings, or web content pulled through an API. The goal is to turn raw signals into a clear, usable form. The agent may clean the text, translate speech to text, resize an image, or drop noise from sensor values. Good perception means the agent starts its loop with facts, not guesses. If the input is wrong or unclear, later steps will also fail. So careful handling of perception keeps the whole agent loop on track. \ No newline at end of file +Perception, also called user input, is the first step in an agent loop. The agent listens and gathers data from the outside world. This data can be text typed by a user, spoken words, camera images, sensor readings, or web content pulled through an API. The goal is to turn raw signals into a clear, usable form. The agent may clean the text, translate speech to text, resize an image, or drop noise from sensor values. Good perception means the agent starts its loop with facts, not guesses. If the input is wrong or unclear, later steps will also fail. So careful handling of perception keeps the whole agent loop on track. + +Visit the following resources to learn more: + +- [@article@Perception in AI: Understanding Its Types and Importance](https://marktalks.com/perception-in-ai-understanding-its-types-and-importance/) +- [@article@What Is AI Agent Perception? - IBM](https://www.ibm.com/think/topics/ai-agent-perception) diff --git a/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md b/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md index 85fc11790..e464e3c1a 100644 --- a/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md +++ b/src/data/roadmaps/ai-agents/content/personal-assistant@PPdAutqJF5G60Eg9lYBND.md @@ -1,3 +1,8 @@ # Personal assistant -A personal assistant AI agent is a smart program that helps one person manage daily tasks. It can check a calendar, set reminders, and send alerts so you never miss a meeting. It can read emails, highlight key points, and even draft quick replies. If you ask a question, it searches trusted sources and gives a short answer. It can order food, book rides, or shop online when you give simple voice or text commands. Because it learns your habits, it suggests the best time to work, rest, or travel. All these actions run in the background, saving you time and reducing stress. \ No newline at end of file +A personal assistant AI agent is a smart program that helps one person manage daily tasks. It can check a calendar, set reminders, and send alerts so you never miss a meeting. It can read emails, highlight key points, and even draft quick replies. If you ask a question, it searches trusted sources and gives a short answer. It can order food, book rides, or shop online when you give simple voice or text commands. Because it learns your habits, it suggests the best time to work, rest, or travel. All these actions run in the background, saving you time and reducing stress. + +Visit the following resources to learn more: + +- [@article@A Complete Guide on AI-powered Personal Assistants](https://medium.com/@alexander_clifford/a-complete-guide-on-ai-powered-personal-assistants-with-examples-2f5cd894d566) +- [@article@9 Best AI Personal Assistants for Work, Chat and Home](https://saner.ai/best-ai-personal-assistants/) diff --git a/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md b/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md index 39dadfdde..3d51c6d19 100644 --- a/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md +++ b/src/data/roadmaps/ai-agents/content/planner-executor@6YLCMWzystao6byCYCTPO.md @@ -1,3 +1,8 @@ # Planner Executor -A planner-executor agent splits its work into two clear parts. First, the planner thinks ahead. It looks at a goal, lists the steps needed, and puts them in the best order. Second, the executor acts. It takes each planned step and carries it out, checking results as it goes. If something fails or the world changes, the planner may update the plan, and the executor follows the new steps. This divide-and-conquer style lets the agent handle big tasks without losing track of small actions. It is easy to debug, supports reuse of plans, and helps keep the agent’s behavior clear and steady. \ No newline at end of file +A **planner-executor agent** is a type of AI agent that splits its work into two clear parts: planning and execution. The **planner** thinks ahead, taking a goal and breaking it down into a sequence of steps, ordering them in a logical and efficient manner. The **executor**, on the other hand, takes each planned step and carries it out, monitoring the results and reporting back to the planner. If something fails or the world changes, the planner may update the plan, and the executor follows the new steps. This modular approach allows the agent to handle complex tasks by dividing them into manageable parts, making it easier to debug, reuse plans, and maintain clear and consistent behavior. + +Visit the following resources to learn more: + +- [@article@Plan-and-Execute Agents](https://blog.langchain.dev/planning-agents/) +- [@article@Plan and Execute: AI Agents Architecture](https://medium.com/@shubham.ksingh.cer14/plan-and-execute-ai-agents-architecture-f6c60b5b9598) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md b/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md index f0d3a9d19..de9a6ec45 100644 --- a/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md +++ b/src/data/roadmaps/ai-agents/content/presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md @@ -1,3 +1,9 @@ # Presence Penalty -Presence penalty is a setting you can adjust when you ask a large language model to write. It pushes the model to choose words it has not used yet. Each time a word has already appeared, the model gets a small score cut for picking it again. A higher penalty gives bigger cuts, so the model looks for new words and fresh ideas. A lower penalty lets the model reuse words more often, which can help with repeats like rhymes or bullet lists. Tuning this control helps you steer the output toward either more variety or more consistency. \ No newline at end of file +Presence penalty is a setting you can adjust when you ask a large language model to write. It pushes the model to choose words it has not used yet. Each time a word has already appeared, the model gets a small score cut for picking it again. A higher penalty gives bigger cuts, so the model looks for new words and fresh ideas. A lower penalty lets the model reuse words more often, which can help with repeats like rhymes or bullet lists. Tuning this control helps you steer the output toward either more variety or more consistency. + +Visit the following resources to learn more: + +- [@article@Understanding Presence Penalty and Frequency Penalty](https://medium.com/@pushparajgenai2025/understanding-presence-penalty-and-frequency-penalty-in-openai-chat-completion-api-calls-2e3a22547b48) +- [@article@Difference between Frequency and Presence Penalties?](https://community.openai.com/t/difference-between-frequency-and-presence-penalties/2777) +- [@article@LLM Parameters Explained: A Practical Guide with Examples](https://learnprompting.org/blog/llm-parameters) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md b/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md index b4ce11142..2ab11b079 100644 --- a/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md +++ b/src/data/roadmaps/ai-agents/content/pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md @@ -1,3 +1,9 @@ # Pricing of Common Models -When you use a large language model, you usually pay by the amount of text it reads and writes, counted in “tokens.” A token is about four characters or three-quarters of a word. Providers list a price per 1,000 tokens. For example, GPT-3.5 Turbo may cost around $0.002 per 1,000 tokens, while GPT-4 is much higher, such as $0.03 to $0.06 for prompts and $0.06 to $0.12 for replies. Smaller open-source models like Llama-2 can be free to use if you run them on your own computer, but you still pay for the hardware or cloud time. Vision or audio models often have extra fees because they use more compute. When planning costs, estimate the tokens in each call, multiply by the price, and add any hosting or storage charges. \ No newline at end of file +When you use a large language model, you usually pay by the amount of text it reads and writes, counted in “tokens.” A token is about four characters or three-quarters of a word. Providers list a price per 1,000 tokens. For example, GPT-3.5 Turbo may cost around $0.002 per 1,000 tokens, while GPT-4 is much higher, such as $0.03 to $0.06 for prompts and $0.06 to $0.12 for replies. Smaller open-source models like Llama-2 can be free to use if you run them on your own computer, but you still pay for the hardware or cloud time. Vision or audio models often have extra fees because they use more compute. When planning costs, estimate the tokens in each call, multiply by the price, and add any hosting or storage charges. + +Visit the following resources to learn more: + +- [@official@OpenAI Pricing](https://openai.com/api/pricing/) +- [@article@Executive Guide To AI Agent Pricing](https://www.forbes.com/councils/forbesbusinesscouncil/2025/01/28/executive-guide-to-ai-agent-pricing-winning-strategies-and-models-to-drive-growth/) +- [@article@AI Pricing: How Much Does Artificial Intelligence Cost In 2025?](https://www.internetsearchinc.com/ai-pricing-how-much-does-artificial-intelligence-cost/) diff --git a/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md b/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md index 836916649..7889e45bf 100644 --- a/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md +++ b/src/data/roadmaps/ai-agents/content/prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md @@ -1,3 +1,9 @@ # Prompt Injection / Jailbreaks -Prompt injection, also called a jailbreak, is a trick that makes an AI system break its own rules. An attacker hides special words or symbols inside normal-looking text. When the AI reads this text, it follows the hidden instructions instead of its safety rules. The attacker might force the AI to reveal private data, produce harmful content, or give wrong advice. This risk grows when the AI talks to other software or pulls text from the internet, because harmful prompts can slip in without warning. Good defenses include cleaning user input, setting strong guardrails inside the model, checking outputs for policy breaks, and keeping humans in the loop for high-risk tasks. \ No newline at end of file +Prompt injection, also called a jailbreak, is a trick that makes an AI system break its own rules. An attacker hides special words or symbols inside normal-looking text. When the AI reads this text, it follows the hidden instructions instead of its safety rules. The attacker might force the AI to reveal private data, produce harmful content, or give wrong advice. This risk grows when the AI talks to other software or pulls text from the internet, because harmful prompts can slip in without warning. Good defenses include cleaning user input, setting strong guardrails inside the model, checking outputs for policy breaks, and keeping humans in the loop for high-risk tasks. + +Visit the following resources to learn more: + +- [@article@Prompt Injection vs. Jailbreaking: What's the Difference?](https://learnprompting.org/blog/injection_jailbreaking) +- [@article@Prompt Injection vs Prompt Jailbreak](https://codoid.com/ai/prompt-injection-vs-prompt-jailbreak-a-detailed-comparison/) +- [@article@How Prompt Attacks Exploit GenAI and How to Fight Back](https://unit42.paloaltonetworks.com/new-frontier-of-genai-threats-a-comprehensive-guide-to-prompt-attacks/) diff --git a/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md b/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md index 925c75936..d50ff61ed 100644 --- a/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md +++ b/src/data/roadmaps/ai-agents/content/provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md @@ -1,3 +1,9 @@ # Provide additional context -Provide additional context means giving the AI enough background facts, constraints, and goals so it can reply in the way you need. Start by naming the topic and the purpose of the answer. Add who the answer is for, the tone you want, and any limits such as length, format, or style. List key facts, data, or examples that matter to the task. This extra detail stops the model from guessing and keeps replies on target. Think of it like guiding a new teammate: share the details they need, but keep them short and clear. \ No newline at end of file +Provide additional context means giving the AI enough background facts, constraints, and goals so it can reply in the way you need. Start by naming the topic and the purpose of the answer. Add who the answer is for, the tone you want, and any limits such as length, format, or style. List key facts, data, or examples that matter to the task. This extra detail stops the model from guessing and keeps replies on target. Think of it like guiding a new teammate: share the details they need, but keep them short and clear. + +Visit the following resources to learn more: + +- [@article@What is Context in Prompt Engineering?](https://www.godofprompt.ai/blog/what-is-context-in-prompt-engineering) +- [@article@The Importance of Context for Reliable AI Systems](https://medium.com/mathco-ai/the-importance-of-context-for-reliable-ai-systems-and-how-to-provide-context-009bd1ac7189/) +- [@article@Context Engineering: Why Feeding AI the Right Context Matters](https://inspirednonsense.com/context-engineering-why-feeding-ai-the-right-context-matters-353e8f87d6d3) diff --git a/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md b/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md index 577be6360..239ac0567 100644 --- a/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md +++ b/src/data/roadmaps/ai-agents/content/rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md @@ -1,3 +1,8 @@ # RAG Agent -A RAG (Retrieval-Augmented Generation) agent mixes search with language generation so it can answer questions using fresh and reliable facts. When a user sends a query, the agent first turns that query into an embedding—basically a number list that captures its meaning. It then looks up similar embeddings in a vector database that holds passages from web pages, PDFs, or other text. The best-matching passages come back as context. The agent puts the original question and those passages into a large language model. The model writes the final reply, grounding every sentence in the retrieved text. This setup keeps the model smaller, reduces wrong guesses, and lets the system update its knowledge just by adding new documents to the database. Common tools for building a RAG agent include an embedding model, a vector store like FAISS or Pinecone, and an LLM connected through a framework such as LangChain or LlamaIndex. \ No newline at end of file +A RAG (Retrieval-Augmented Generation) agent mixes search with language generation so it can answer questions using fresh and reliable facts. When a user sends a query, the agent first turns that query into an embedding—basically a number list that captures its meaning. It then looks up similar embeddings in a vector database that holds passages from web pages, PDFs, or other text. The best-matching passages come back as context. The agent puts the original question and those passages into a large language model. The model writes the final reply, grounding every sentence in the retrieved text. This setup keeps the model smaller, reduces wrong guesses, and lets the system update its knowledge just by adding new documents to the database. Common tools for building a RAG agent include an embedding model, a vector store like FAISS or Pinecone, and an LLM connected through a framework such as LangChain or LlamaIndex. + +Visit the following resources to learn more: + +- [@article@What is RAG? - Retrieval-Augmented Generation AI Explained](https://aws.amazon.com/what-is/retrieval-augmented-generation/) +- [@article@What Is Retrieval-Augmented Generation, aka RAG?](https://blogs.nvidia.com/blog/what-is-retrieval-augmented-generation/) diff --git a/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md b/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md index 1ab108780..2c5e6173c 100644 --- a/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md +++ b/src/data/roadmaps/ai-agents/content/rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md @@ -1,3 +1,9 @@ # RAG and Vector Databases -RAG, short for Retrieval-Augmented Generation, lets an AI agent pull facts from stored data each time it answers. The data sits in a vector database. In that database, every text chunk is turned into a number list called a vector. Similar ideas create vectors that lie close together, so the agent can find related chunks fast. When the user asks a question, the agent turns the question into its own vector, finds the nearest chunks, and reads them. It then writes a reply that mixes the new prompt with those chunks. Because the data store can hold a lot of past chats, documents, or notes, this process gives the agent a working memory without stuffing everything into the prompt. It lowers token cost, keeps answers on topic, and allows the memory to grow over time. \ No newline at end of file +RAG, short for Retrieval-Augmented Generation, lets an AI agent pull facts from stored data each time it answers. The data sits in a vector database. In that database, every text chunk is turned into a number list called a vector. Similar ideas create vectors that lie close together, so the agent can find related chunks fast. When the user asks a question, the agent turns the question into its own vector, finds the nearest chunks, and reads them. It then writes a reply that mixes the new prompt with those chunks. Because the data store can hold a lot of past chats, documents, or notes, this process gives the agent a working memory without stuffing everything into the prompt. It lowers token cost, keeps answers on topic, and allows the memory to grow over time. + +Visit the following resources to learn more: + +- [@article@Understanding Retrieval-Augmented Generation (RAG) and Vector Databases](https://pureai.com/Articles/2025/03/03/Understanding-RAG.aspx) +- [@article@Build Advanced Retrieval-Augmented Generation Systems](https://learn.microsoft.com/en-us/azure/developer/ai/advanced-retrieval-augmented-generation) +- [@article@What Is Retrieval-Augmented Generation, aka RAG?](https://blogs.nvidia.com/blog/what-is-retrieval-augmented-generation/) diff --git a/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md b/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md index 734b4806d..f072d6577 100644 --- a/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md +++ b/src/data/roadmaps/ai-agents/content/ragas@YzEDtGEaMaMWVt0W03HRt.md @@ -1,3 +1,9 @@ # Ragas -Ragas is an open-source tool used to check how well a Retrieval-Augmented Generation (RAG) agent works. You give it the user question, the passages the agent pulled from a knowledge base, and the final answer. Ragas then scores the answer for things like correctness, relevance, and whether the cited passages really support the words in the answer. It uses large language models under the hood, so you do not need to write your own scoring rules. Results appear in a clear report that shows strong and weak spots in the pipeline. With this feedback you can change prompts, retriever settings, or model choices and quickly see if quality goes up. This makes testing RAG systems faster, repeatable, and less guess-based. \ No newline at end of file +Ragas is an open-source tool used to check how well a Retrieval-Augmented Generation (RAG) agent works. You give it the user question, the passages the agent pulled from a knowledge base, and the final answer. Ragas then scores the answer for things like correctness, relevance, and whether the cited passages really support the words in the answer. It uses large language models under the hood, so you do not need to write your own scoring rules. Results appear in a clear report that shows strong and weak spots in the pipeline. With this feedback you can change prompts, retriever settings, or model choices and quickly see if quality goes up. This makes testing RAG systems faster, repeatable, and less guess-based. + +Visit the following resources to learn more: + +- [@official@Ragas Documentation](https://docs.ragas.io/en/latest/) +- [@article@Evaluating RAG Applications with RAGAs](https://towardsdatascience.com/evaluating-rag-applications-with-ragas-81d67b0ee31a/n) +- [@opensource@explodinggradients/ragas](https://github.com/explodinggradients/ragas) diff --git a/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md b/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md index 8bd3e54a8..b63fc4447 100644 --- a/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md +++ b/src/data/roadmaps/ai-agents/content/react-reason--act@53xDks6JQ33fHMa3XcuCd.md @@ -1,3 +1,8 @@ # ReAct (Reason + Act) -ReAct is an agent pattern that makes a model alternate between two simple steps: Reason and Act. First, the agent writes a short thought that sums up what it knows and what it should try next. Then it performs an action such as calling an API, running code, or searching a document. The result of that action is fed back, giving the agent fresh facts to think about. This loop repeats until the task is done. By showing its thoughts in plain text, the agent can be inspected, debugged, and even corrected on the fly. The clear split between thinking and doing also cuts wasted moves and guides the model toward steady progress. ReAct works well with large language models because they can both generate the chain of thoughts and choose the next tool in the very same response. \ No newline at end of file +ReAct is an agent pattern that makes a model alternate between two simple steps: Reason and Act. First, the agent writes a short thought that sums up what it knows and what it should try next. Then it performs an action such as calling an API, running code, or searching a document. The result of that action is fed back, giving the agent fresh facts to think about. This loop repeats until the task is done. By showing its thoughts in plain text, the agent can be inspected, debugged, and even corrected on the fly. The clear split between thinking and doing also cuts wasted moves and guides the model toward steady progress. ReAct works well with large language models because they can both generate the chain of thoughts and choose the next tool in the very same response. + +Visit the following resources to learn more: + +- [@official@ReAct: Synergizing Reasoning and Acting in Language Models](https://react-lm.github.io/) +- [@article@ReAct Systems: Enhancing LLMs with Reasoning and Action](https://learnprompting.org/docs/agents/react) diff --git a/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md b/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md index 888b093da..17de6661f 100644 --- a/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md +++ b/src/data/roadmaps/ai-agents/content/reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md @@ -1,3 +1,8 @@ # Reason and Plan -Reason and Plan is the moment when an AI agent thinks before it acts. The agent starts with a goal and the facts it already knows. It looks at these facts and asks, “What do I need to do next to reach the goal?” It breaks the goal into smaller steps, checks if each step makes sense, and orders them in a clear path. The agent may also guess what could go wrong and prepare backup steps. Once the plan feels solid, the agent is ready to move on and take the first action. \ No newline at end of file +Reason and Plan is the moment when an AI agent thinks before it acts. The agent starts with a goal and the facts it already knows. It looks at these facts and asks, “What do I need to do next to reach the goal?” It breaks the goal into smaller steps, checks if each step makes sense, and orders them in a clear path. The agent may also guess what could go wrong and prepare backup steps. Once the plan feels solid, the agent is ready to move on and take the first action. + +Visit the following resources to learn more: + +- [@official@ReAct: Synergizing Reasoning and Acting in Language Models](https://react-lm.github.io/) +- [@article@ReAct Systems: Enhancing LLMs with Reasoning and Action](https://learnprompting.org/docs/agents/react) diff --git a/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md b/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md index 6e82fa024..863f6b276 100644 --- a/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md +++ b/src/data/roadmaps/ai-agents/content/reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md @@ -1,3 +1,8 @@ # Reasoning vs Standard Models -Reasoning models break a task into clear steps and follow a line of logic, while standard models give an answer in one quick move. A reasoning model might write down short notes, check each note, and then combine them to reach the final reply. This helps it solve math problems, plan actions, and spot errors that simple pattern matching would miss. A standard model depends on patterns it learned during training and often guesses the most likely next word. That works well for everyday chat, summaries, or common facts, but it can fail on tricky puzzles or tasks with many linked parts. Reasoning takes more time and computer power, yet it brings higher accuracy and makes the agent easier to debug because you can see its thought steps. Many new AI agents mix both styles: they use quick pattern recall for simple parts and switch to step-by-step reasoning when a goal needs deeper thought. \ No newline at end of file +Reasoning models break a task into clear steps and follow a line of logic, while standard models give an answer in one quick move. A reasoning model might write down short notes, check each note, and then combine them to reach the final reply. This helps it solve math problems, plan actions, and spot errors that simple pattern matching would miss. A standard model depends on patterns it learned during training and often guesses the most likely next word. That works well for everyday chat, summaries, or common facts, but it can fail on tricky puzzles or tasks with many linked parts. Reasoning takes more time and computer power, yet it brings higher accuracy and makes the agent easier to debug because you can see its thought steps. Many new AI agents mix both styles: they use quick pattern recall for simple parts and switch to step-by-step reasoning when a goal needs deeper thought. + +Visit the following resources to learn more: + +- [@official@ReAct: Synergizing Reasoning and Acting in Language Models](https://react-lm.github.io/) +- [@article@ReAct Systems: Enhancing LLMs with Reasoning and Action](https://learnprompting.org/docs/agents/react) diff --git a/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md b/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md index 504d4c618..fce31491b 100644 --- a/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md +++ b/src/data/roadmaps/ai-agents/content/remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md @@ -1,3 +1,9 @@ # Remote / Cloud -Remote or cloud deployment places the MCP server on a cloud provider instead of a local machine. You package the server as a container or virtual machine, choose a service like AWS, Azure, or GCP, and give it compute, storage, and a public HTTPS address. A load balancer spreads traffic, while auto-scaling adds or removes copies of the server as demand changes. You secure the endpoint with TLS, API keys, and firewalls, and you send logs and metrics to the provider’s monitoring tools. This setup lets the server handle many users, updates are easier, and you avoid local hardware limits, though you must watch costs and protect sensitive data. \ No newline at end of file +Remote or cloud deployment places the MCP server on a cloud provider instead of a local machine. You package the server as a container or virtual machine, choose a service like AWS, Azure, or GCP, and give it compute, storage, and a public HTTPS address. A load balancer spreads traffic, while auto-scaling adds or removes copies of the server as demand changes. You secure the endpoint with TLS, API keys, and firewalls, and you send logs and metrics to the provider’s monitoring tools. This setup lets the server handle many users, updates are easier, and you avoid local hardware limits, though you must watch costs and protect sensitive data. + +Visit the following resources to learn more: + +- [@official@Edge AI vs. Cloud AI: Real-Time Intelligence Models](https://medium.com/@hassaanidrees7/edge-ai-vs-cloud-ai-real-time-intelligence-vs-centralized-processing-df8c6e94fd11) +- [@article@Cloud AI vs. On-premises AI](https://www.pluralsight.com/resources/blog/ai-and-data/ai-on-premises-vs-in-cloud) +- [@article@Cloud vs On-Premises AI Deployment](https://toxigon.com/cloud-vs-on-premises-ai-deployment) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md b/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md index 376aadfea..dfdd00a65 100644 --- a/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md +++ b/src/data/roadmaps/ai-agents/content/rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md @@ -1 +1,8 @@ -# REST API Knowledge \ No newline at end of file +# REST API Knowledge + +A **REST API** (Representational State Transfer) is an architectural style for designing networked applications. In AI agents, REST APIs enable communication between the agent and external systems, allowing for data exchange and integration. The agent can use REST APIs to retrieve data from external sources, send data to external systems, and interact with other AI agents or services. This provides a flexible and scalable way to integrate with various systems, enabling the agent to access a wide range of data and services. REST APIs in AI agents support a variety of functions, including data retrieval, data sending, and system interaction. They play a crucial role in facilitating communication between AI agents and external systems, making them a fundamental component of AI agent architecture. + +Visit the following resources to learn more: + +- [@article@What is RESTful API? - RESTful API Explained - AWS](https://aws.amazon.com/what-is/restful-api/) +- [@article@What Is a REST API? Examples, Uses & Challenges ](https://blog.postman.com/rest-api-examples/) diff --git a/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md b/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md index 51a9a036e..4019905b7 100644 --- a/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md +++ b/src/data/roadmaps/ai-agents/content/safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md @@ -1,3 +1,10 @@ # Safety + Red Team Testing -Safety + Red Team Testing is the practice of checking an AI agent for harmful or risky behavior before and after release. Safety work sets rules, guardrails, and alarms so the agent follows laws, keeps data private, and treats people fairly. Red team testing sends skilled testers to act like attackers or troublemakers. They type tricky prompts, try to leak private data, force biased outputs, or cause the agent to give dangerous advice. Every weakness they find is logged and fixed by adding filters, better training data, stronger limits, or live monitoring. Running these tests often lowers the chance of real-world harm and builds trust with users and regulators. \ No newline at end of file +Safety + Red Team Testing is the practice of checking an AI agent for harmful or risky behavior before and after release. Safety work sets rules, guardrails, and alarms so the agent follows laws, keeps data private, and treats people fairly. Red team testing sends skilled testers to act like attackers or troublemakers. They type tricky prompts, try to leak private data, force biased outputs, or cause the agent to give dangerous advice. Every weakness they find is logged and fixed by adding filters, better training data, stronger limits, or live monitoring. Running these tests often lowers the chance of real-world harm and builds trust with users and regulators. + +Visit the following resources to learn more: + +- [@roadmap@Visit Dedicated AI Red Teaming Roadmap](https://roadmap.sh/ai-red-teaming) +- [@article@Enhancing AI safety: Insights and lessons from red teaming](https://www.microsoft.com/en-us/microsoft-cloud/blog/2025/01/14/enhancing-ai-safety-insights-and-lessons-from-red-teaming/) +- [@article@AI Safety Testing in the Absence of Regulations](https://aisecuritycentral.com/ai-safety-testing/) +- [@article@A Guide to AI Red Teaming - HiddenLayer](https://hiddenlayer.com/innovation-hub/a-guide-to-ai-red-teaming/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md index ae9acd4dc..f179678aa 100644 --- a/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md +++ b/src/data/roadmaps/ai-agents/content/short-term--memory@M3U6RfIqaiut2nuOibY8W.md @@ -2,8 +2,7 @@ Short term memory are the facts which are passed as a part of the prompt to the LLM e.g. there might be a prompt like below: - -``` +```text Users Profile: - name: {name} - age: {age} @@ -17,4 +16,12 @@ User is currently learning about {current_topic}. User has some goals in mind wh Help the user achieve the goals. ``` -Notice how we injected the user's profile, current topic and goals in the prompt. These are all short term memories. \ No newline at end of file +Notice how we injected the user's profile, current topic and goals in the prompt. These are all short term memories. + +Visit the following resources to learn more: + +- [@article@Memory Management in AI Agents](https://python.langchain.com/docs/how_to/chatbots_memory/) +- [@article@Build Smarter AI Agents: Manage Short-term and Long-term Memory](https://redis.io/blog/build-smarter-ai-agents-manage-short-term-and-long-term-memory-with-redis/) +- [@article@Storing and Retrieving Knowledge for Agents](https://www.pinecone.io/learn/langchain-retrieval-augmentation/) +- [@article@Short-Term vs Long-Term Memory in AI Agents](https://adasci.org/short-term-vs-long-term-memory-in-ai-agents/) +- [@video@Building Brain-Like Memory for AI Agents](https://www.youtube.com/watch?v=VKPngyO0iKg) diff --git a/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md b/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md index 1e90dc2f1..0a6c2b141 100644 --- a/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md +++ b/src/data/roadmaps/ai-agents/content/smol-depot@eWxQiBrxIUG2JNcrdfIHS.md @@ -1,3 +1,9 @@ # Smol Depot -Smol Depot is an open-source kit that lets you bundle all the parts of a small AI agent in one place. You keep prompts, settings, and code files together in a single folder, then point the Depot tool at that folder to spin the agent up. The tool handles tasks such as loading models, saving chat history, and calling outside APIs, so you do not have to write that glue code yourself. A simple command can copy a starter template, letting you focus on the logic and prompts that make your agent special. Because everything lives in plain files, you can track changes with Git and share the agent like any other project. This makes Smol Depot a quick way to build, test, and ship lightweight agents without a heavy framework. \ No newline at end of file +Smol Depot is an open-source kit that lets you bundle all the parts of a small AI agent in one place. You keep prompts, settings, and code files together in a single folder, then point the Depot tool at that folder to spin the agent up. The tool handles tasks such as loading models, saving chat history, and calling outside APIs, so you do not have to write that glue code yourself. A simple command can copy a starter template, letting you focus on the logic and prompts that make your agent special. Because everything lives in plain files, you can track changes with Git and share the agent like any other project. + +Visit the following resources to learn more: + +- [@official@smol.ai - Continuous Fine-tuning Platform for AI Engineers](https://smol.candycode.dev/) +- [@article@5-min Smol AI Tutorial](https://www.ai-jason.com/learning-ai/smol-ai-tutorial) +- [@video@Smol AI Full Beginner Course](https://www.youtube.com/watch?v=d7qFVrpLh34) diff --git a/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md b/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md index 4ed5f8133..246e3dad7 100644 --- a/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md +++ b/src/data/roadmaps/ai-agents/content/specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md @@ -1,3 +1,8 @@ -# Specify Length, format etc +# Specify Length & Format -When you give a task to an AI, make clear how long the answer should be and what shape it must take. Say “Write 120 words” or “Give the steps as a numbered list.” If you need a table, state the column names and order. If you want bullet points, mention that. Telling the AI to use plain text, JSON, or markdown stops guesswork and saves time. Clear limits on length keep the reply focused. A fixed format makes it easier for people or other software to read and use the result. Always put these rules near the start of your prompt so the AI sees them as important. \ No newline at end of file +When you give a task to an AI, make clear how long the answer should be and what shape it must take. Say “Write 120 words” or “Give the steps as a numbered list.” If you need a table, state the column names and order. If you want bullet points, mention that. Telling the AI to use plain text, JSON, or markdown stops guesswork and saves time. Clear limits on length keep the reply focused. A fixed format makes it easier for people or other software to read and use the result. Always put these rules near the start of your prompt so the AI sees them as important. + +Visit the following resources to learn more: + +- [@article@Mastering Prompt Engineering: Format, Length, and Audience](https://techlasi.com/savvy/mastering-prompt-engineering-format-length-and-audience-examples-for-2024/) +- [@article@Ultimate Guide to Prompt Engineering](https://promptdrive.ai/prompt-engineering/) diff --git a/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md b/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md index a2b91d715..714aa40b2 100644 --- a/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md +++ b/src/data/roadmaps/ai-agents/content/stopping-criteria@K0G-Lw069jXUJwZqHtybd.md @@ -1,3 +1,8 @@ # Stopping Criteria -Stopping criteria tell the language model when to stop writing more text. Without them, the model could keep adding words forever, waste time, or spill past the point we care about. Common rules include a maximum number of tokens, a special end-of-sequence token, or a custom string such as “\n\n”. We can also stop when the answer starts to repeat or reaches a score that means it is off topic. Good stopping rules save cost, speed up replies, and avoid nonsense or unsafe content. \ No newline at end of file +Stopping criteria tell the language model when to stop writing more text. Without them, the model could keep adding words forever, waste time, or spill past the point we care about. Common rules include a maximum number of tokens, a special end-of-sequence token, or a custom string such as `“\n\n”`. We can also stop when the answer starts to repeat or reaches a score that means it is off topic. Good stopping rules save cost, speed up replies, and avoid nonsense or unsafe content. + +Visit the following resources to learn more: + +- [@article@Defining Stopping Criteria in Large Language Models](https://www.metriccoders.com/post/defining-stopping-criteria-in-large-language-models-a-practical-guide) +- [@article@Stopping Criteria for Decision Tree Algorithm and Tree Plots](https://aieagle.in/stopping-criteria-for-decision-tree-algorithm-and-tree-plots/) diff --git a/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md b/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md index feed93b98..faee5632a 100644 --- a/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md +++ b/src/data/roadmaps/ai-agents/content/streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md @@ -1,3 +1,11 @@ # Streamed vs Unstreamed Responses -Streamed and unstreamed responses describe how an AI agent sends its answer to the user. With a streamed response, the agent starts sending words as soon as it generates them. The user sees the text grow on the screen in real time. This feels fast and lets the user stop or change the request early. It is useful for long answers and chat-like apps. An unstreamed response waits until the whole answer is ready, then sends it all at once. This makes the code on the client side simpler and is easier to cache or log, but the user must wait longer, especially for big outputs. Choosing between the two depends on the need for speed, the length of the answer, and how complex you want the client and server to be. \ No newline at end of file +Streamed and unstreamed responses describe how an AI agent sends its answer to the user. With a streamed response, the agent starts sending words as soon as it generates them. The user sees the text grow on the screen in real time. This feels fast and lets the user stop or change the request early. It is useful for long answers and chat-like apps. + +An unstreamed response waits until the whole answer is ready, then sends it all at once. This makes the code on the client side simpler and is easier to cache or log, but the user must wait longer, especially for big outputs. Choosing between the two depends on the need for speed, the length of the answer, and how complex you want the client and server to be. + +Visit the following resources to learn more: + +- [@article@Streaming Responses in AI: How AI Outputs Are Generated in Real Time](https://dev.to/pranshu_kabra_fe98a73547a/streaming-responses-in-ai-how-ai-outputs-are-generated-in-real-time-18kb) +- [@article@AI for Web Devs: Faster Responses with HTTP Streaming](https://austingil.com/ai-for-web-devs-streaming/) +- [@article@Master the OpenAI API: Stream Responses](https://www.toolify.ai/gpts/master-the-openai-api-stream-responses-139447) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md b/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md index d07894e93..3ac29004d 100644 --- a/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md +++ b/src/data/roadmaps/ai-agents/content/structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md @@ -1,3 +1,9 @@ -# Structured logging & tracing +# Structured Logging & Tracing -Structured logging and tracing are ways to record what an AI agent does so you can find and fix problems fast. Instead of dumping plain text, the agent writes logs in a fixed key-value format, such as time, user_id, step, and message. Because every entry follows the same shape, search tools can filter, sort, and count events with ease. Tracing links those log lines into a chain that follows one request or task across many functions, threads, or microservices. By adding a unique trace ID to each step, you can see how long each part took and where errors happened. Together, structured logs and traces offer clear, machine-readable data that helps developers spot slow code paths, unusual behavior, and hidden bugs without endless manual scans. \ No newline at end of file +Structured logging and tracing are ways to record what an AI agent does so you can find and fix problems fast. Instead of dumping plain text, the agent writes logs in a fixed key-value format, such as time, user_id, step, and message. Because every entry follows the same shape, search tools can filter, sort, and count events with ease. Tracing links those log lines into a chain that follows one request or task across many functions, threads, or microservices. By adding a unique trace ID to each step, you can see how long each part took and where errors happened. Together, structured logs and traces offer clear, machine-readable data that helps developers spot slow code paths, unusual behavior, and hidden bugs without endless manual scans. + +Visit the following resources to learn more: + +- [@article@Understanding Structured Logging: A Comprehensive Guide](https://www.graphapp.ai/blog/understanding-structured-logging-a-comprehensive-guide) +- [@article@Structured Logging & Cloud Logging](https://cloud.google.com/logging/docs/structured-logging) +- [@article@Best Practices for Logging in AI Applications](https://www.restack.io/p/best-ai-practices-software-compliance-answer-logging-best-practices-cat-ai) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md b/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md index c1e51a1c3..5fead131d 100644 --- a/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md +++ b/src/data/roadmaps/ai-agents/content/summarization--compression@jTDC19BTWCqxqMizrIJHr.md @@ -1,3 +1,8 @@ # Summarization / Compression -Summarization or compression lets an AI agent keep the gist of past chats without saving every line. After a talk, the agent runs a small model or rule set that pulls out key facts, goals, and feelings and writes them in a short note. This note goes into long-term memory, while the full chat can be dropped or stored elsewhere. Because the note is short, the agent spends fewer tokens when it loads memory into the next prompt, so costs stay low and speed stays high. Good summaries leave out side jokes and filler but keep names, dates, open tasks, and user preferences. The agent can update the note after each session, overwriting old points that are no longer true. This process lets the agent remember what matters even after hundreds of turns. \ No newline at end of file +Summarization or compression lets an AI agent keep the gist of past chats without saving every line. After a talk, the agent runs a small model or rule set that pulls out key facts, goals, and feelings and writes them in a short note. This note goes into long-term memory, while the full chat can be dropped or stored elsewhere. Because the note is short, the agent spends fewer tokens when it loads memory into the next prompt, so costs stay low and speed stays high. Good summaries leave out side jokes and filler but keep names, dates, open tasks, and user preferences. The agent can update the note after each session, overwriting old points that are no longer true. This process lets the agent remember what matters even after hundreds of turns. + +Visit the following resources to learn more: + +- [@article@Evaluating LLMs for Text Summarization](https://insights.sei.cmu.edu/blog/evaluating-llms-for-text-summarization-introduction/) +- [@article@The Ultimate Guide to AI Document Summarization](https://www.documentllm.com/blog/ai-document-summarization-guide) diff --git a/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md b/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md index 02f32a4d9..6cc1215e2 100644 --- a/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md +++ b/src/data/roadmaps/ai-agents/content/temperature@L1zL1GzqjSAjF06pIIXhy.md @@ -1,3 +1,10 @@ # Temperature -Temperature is a setting that changes how random or predictable an AI model’s text output is. The value usually goes from 0 to 1, sometimes higher. A low temperature, close to 0, makes the model pick the most likely next word almost every time, so the answer is steady and safe but can feel dull or repetitive. A high temperature, like 0.9 or 1.0, lets the model explore less-likely word choices, which can give fresh and creative replies, but it may also add mistakes or drift off topic. By adjusting temperature, you balance reliability and creativity to fit the goal of your task. \ No newline at end of file +Temperature is a setting that changes how random or predictable an AI model’s text output is. The value usually goes from 0 to 1, sometimes higher. A low temperature, close to 0, makes the model pick the most likely next word almost every time, so the answer is steady and safe but can feel dull or repetitive. A high temperature, like 0.9 or 1.0, lets the model explore less-likely word choices, which can give fresh and creative replies, but it may also add mistakes or drift off topic. By adjusting temperature, you balance reliability and creativity to fit the goal of your task. + +Visit the following resources to learn more: + +- [@roadmap@What Temperature Means in Natural Language Processing and AI](https://thenewstack.io/what-temperature-means-in-natural-language-processing-and-ai/) +- [@article@LLM Temperature: How It Works and When You Should Use It](https://www.vellum.ai/llm-parameters/temperature) +- [@article@What is LLM Temperature? - IBM](https://www.ibm.com/think/topics/llm-temperature) +- [@article@How Temperature Settings Transform Your AI Agent's Responses](https://docsbot.ai/article/how-temperature-settings-transform-your-ai-agents-responses) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md b/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md index e9340aa96..3d399af06 100644 --- a/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md +++ b/src/data/roadmaps/ai-agents/content/token-based-pricing@1fiWPBV99E2YncqdCgUw2.md @@ -1,3 +1,9 @@ # Token Based Pricing -Token-based pricing is how many language-model services charge for use. A token is a small chunk of text, roughly four characters or part of a word. The service counts every token that goes into the model (your prompt) and every token that comes out (the reply). It then multiplies this total by a listed price per thousand tokens. Some plans set one price for input tokens and a higher or lower price for output tokens. Because the bill grows with each token, users often shorten prompts, trim extra words, or cap response length to spend less. \ No newline at end of file +Token-based pricing is how many language-model services charge for use. A token is a small chunk of text, roughly four characters or part of a word. The service counts every token that goes into the model (your prompt) and every token that comes out (the reply). It then multiplies this total by a listed price per thousand tokens. Some plans set one price for input tokens and a higher or lower price for output tokens. Because the bill grows with each token, users often shorten prompts, trim extra words, or cap response length to spend less. + +Visit the following resources to learn more: + +- [@article@Explaining Tokens — the Language and Currency of AI](https://blogs.nvidia.com/blog/ai-tokens-explained/) +- [@article@What Are AI Tokens?](https://methodshop.com/what-are-ai-tokens/) +- [@article@Pricing - OpenAI](https://openai.com/api/pricing/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md b/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md index e49bba972..d42a680e8 100644 --- a/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md +++ b/src/data/roadmaps/ai-agents/content/tokenization@GAjuWyJl9CI1nqXBp6XCf.md @@ -1,3 +1,8 @@ # Tokenization -Tokenization is the step where raw text is broken into small pieces called tokens, and each token is given a unique number. A token can be a whole word, part of a word, a punctuation mark, or even a space. The list of all possible tokens is the model’s vocabulary. Once text is turned into these numbered tokens, the model can look up an embedding for each number and start its math. By working with tokens instead of full sentences, the model keeps the input size steady and can handle new or rare words by slicing them into familiar sub-pieces. After the model finishes its work, the numbered tokens are turned back into text through the same vocabulary map, letting the user read the result. \ No newline at end of file +Tokenization is the step where raw text is broken into small pieces called tokens, and each token is given a unique number. A token can be a whole word, part of a word, a punctuation mark, or even a space. The list of all possible tokens is the model’s vocabulary. Once text is turned into these numbered tokens, the model can look up an embedding for each number and start its math. By working with tokens instead of full sentences, the model keeps the input size steady and can handle new or rare words by slicing them into familiar sub-pieces. After the model finishes its work, the numbered tokens are turned back into text through the same vocabulary map, letting the user read the result. + +Visit the following resources to learn more: + +- [@article@Explaining Tokens — the Language and Currency of AI](https://blogs.nvidia.com/blog/ai-tokens-explained/) +- [@article@What is Tokenization? Types, Use Cases, Implementation](https://www.datacamp.com/blog/what-is-tokenization) diff --git a/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md b/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md index 3ffdf9478..2e893538e 100644 --- a/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md +++ b/src/data/roadmaps/ai-agents/content/tool-definition@qakbxB8xe7Y8gejC5cZnK.md @@ -1,3 +1,8 @@ # Tool Definition -A tool is any skill or function that an AI agent can call to get a job done. It can be as simple as a calculator for math or as complex as an API that fetches live weather data. Each tool has a name, a short description of what it does, and a clear list of the inputs it needs and the outputs it returns. The agent’s planner reads this definition to decide when to use the tool. Good tool definitions are precise and leave no room for doubt, so the agent will not guess or misuse them. They also set limits, like how many times a tool can be called or how much data can be pulled, which helps control cost and errors. Think of a tool definition as a recipe card the agent follows every time it needs that skill. \ No newline at end of file +A tool is any skill or function that an AI agent can call to get a job done. It can be as simple as a calculator for math or as complex as an API that fetches live weather data. Each tool has a name, a short description of what it does, and a clear list of the inputs it needs and the outputs it returns. The agent’s planner reads this definition to decide when to use the tool. Good tool definitions are precise and leave no room for doubt, so the agent will not guess or misuse them. They also set limits, like how many times a tool can be called or how much data can be pulled, which helps control cost and errors. Think of a tool definition as a recipe card the agent follows every time it needs that skill. + +Visit the following resources to learn more: + +- [@article@Understanding the Agent Function in AI: Key Roles and Responsibilities](https://pingax.com/ai/agent/function/understanding-the-agent-function-in-ai-key-roles-and-responsibilities/) +- [@article@What is an AI Tool?](https://www.synthesia.io/glossary/ai-tool) diff --git a/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md b/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md index 415d5d734..fb4fab3a5 100644 --- a/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md +++ b/src/data/roadmaps/ai-agents/content/tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md @@ -1,3 +1,9 @@ # Tool sandboxing / Permissioning -Tool sandboxing keeps the AI agent inside a safe zone where it can only run approved actions and cannot touch the wider system. Permissioning sets clear rules that say which files, networks, or commands the agent may use. Together they stop errors, leaks, or abuse by limiting what the agent can reach and do. Developers grant the smallest set of rights, watch activity, and block anything outside the plan. If the agent needs new access, it must ask and get a fresh permit. This simple fence protects user data, reduces harm, and builds trust in the agent’s work. \ No newline at end of file +Tool sandboxing keeps the AI agent inside a safe zone where it can only run approved actions and cannot touch the wider system. Permissioning sets clear rules that say which files, networks, or commands the agent may use. Together they stop errors, leaks, or abuse by limiting what the agent can reach and do. Developers grant the smallest set of rights, watch activity, and block anything outside the plan. If the agent needs new access, it must ask and get a fresh permit. This simple fence protects user data, reduces harm, and builds trust in the agent’s work. + +Visit the following resources to learn more: + +- [@article@AI Sandbox | Harvard University Information Technology](https://www.huit.harvard.edu/ai-sandbox) +- [@article@How to Set Up AI Sandboxes to Maximize Adoption](https://medium.com/@emilholmegaard/how-to-set-up-ai-sandboxes-to-maximize-adoption-without-compromising-ethics-and-values-637c70626130) +- [@article@Sandboxes for AI - The Datasphere Initiative](https://www.thedatasphere.org/datasphere-publish/sandboxes-for-ai/) diff --git a/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md b/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md index 3d55b7a49..c4e154bef 100644 --- a/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md +++ b/src/data/roadmaps/ai-agents/content/top-p@icbp1NjurQfdM0dHnz6v2.md @@ -1,3 +1,9 @@ # Top-p -Top-p, also called nucleus sampling, is a setting that guides how an LLM picks its next word. The model lists many possible words and sorts them by probability. It then finds the smallest group of top words whose combined chance adds up to the chosen p value, such as 0.9. Only words inside this group stay in the running; the rest are dropped. The model picks one word from the kept group at random, weighted by their original chances. A lower p keeps only the very likely words, so output is safer and more focused. A higher p lets in less likely words, adding surprise and creativity but also more risk of error. \ No newline at end of file +Top-p, also called nucleus sampling, is a setting that guides how an LLM picks its next word. The model lists many possible words and sorts them by probability. It then finds the smallest group of top words whose combined chance adds up to the chosen p value, such as 0.9. Only words inside this group stay in the running; the rest are dropped. The model picks one word from the kept group at random, weighted by their original chances. A lower p keeps only the very likely words, so output is safer and more focused. A higher p lets in less likely words, adding surprise and creativity but also more risk of error. + +Visit the following resources to learn more: + +- [@article@Nucleus Sampling](https://nn.labml.ai/sampling/nucleus.html) +- [@article@Sampling Techniques in Large Language Models (LLMs)](https://medium.com/@shashankag14/understanding-sampling-techniques-in-large-language-models-llms-dfc28b93f518) +- [@article@Temperature, top_p and top_k for chatbot responses](https://community.openai.com/t/temperature-top-p-and-top-k-for-chatbot-responses/295542) diff --git a/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md b/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md index 77e3e3251..083a96934 100644 --- a/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md +++ b/src/data/roadmaps/ai-agents/content/transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md @@ -1,3 +1,9 @@ # Transformer Models and LLMs -Transformer models are a type of neural network that read input data—like words in a sentence—all at once instead of one piece at a time. They use “attention” to find which parts of the input matter most for each other part. This lets them learn patterns in language very well. When a transformer has been trained on a very large set of text, we call it a Large Language Model (LLM). An LLM can answer questions, write text, translate languages, and code because it has seen many examples during training. AI agents use these models as their “brains.” They feed tasks or prompts to the LLM, get back text or plans, and then act on those results. This structure helps agents understand goals, break them into steps, and adjust based on feedback, making them useful for chatbots, research helpers, and automation tools. \ No newline at end of file +Transformer models are a type of neural network that read input data—like words in a sentence—all at once instead of one piece at a time. They use “attention” to find which parts of the input matter most for each other part. This lets them learn patterns in language very well. When a transformer has been trained on a very large set of text, we call it a Large Language Model (LLM). An LLM can answer questions, write text, translate languages, and code because it has seen many examples during training. AI agents use these models as their “brains.” They feed tasks or prompts to the LLM, get back text or plans, and then act on those results. This structure helps agents understand goals, break them into steps, and adjust based on feedback, making them useful for chatbots, research helpers, and automation tools. + +Visit the following resources to learn more: + +- [@article@Exploring Open Source AI Models: LLMs and Transformer Architectures](https://llmmodels.org/blog/exploring-open-source-ai-models-llms-and-transformer-architectures/) +- [@article@Transformer Models Vs Llm Comparison](https://www.restack.io/p/transformer-models-answer-vs-llm-cat-ai) +- [@article@How Transformer LLMs Work](https://www.deeplearning.ai/short-courses/how-transformer-llms-work/) diff --git a/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md b/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md index f56009b4b..6ec56c8a3 100644 --- a/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md +++ b/src/data/roadmaps/ai-agents/content/tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md @@ -1,3 +1,9 @@ # Tree-of-Thought -Tree-of-Thought is a way to organize an AI agent’s reasoning as a branching tree. At the root, the agent states the main problem. Each branch is a small idea, step, or guess that could lead to a solution. The agent expands the most promising branches, checks if they make sense, and prunes paths that look wrong or unhelpful. This setup helps the agent explore many possible answers while staying focused on the best ones. Because the agent can compare different branches side by side, it is less likely to get stuck on a bad line of thought. The result is more reliable and creative problem solving. \ No newline at end of file +Tree-of-Thought is a way to organize an AI agent’s reasoning as a branching tree. At the root, the agent states the main problem. Each branch is a small idea, step, or guess that could lead to a solution. The agent expands the most promising branches, checks if they make sense, and prunes paths that look wrong or unhelpful. This setup helps the agent explore many possible answers while staying focused on the best ones. Because the agent can compare different branches side by side, it is less likely to get stuck on a bad line of thought. The result is more reliable and creative problem solving. + +Visit the following resources to learn more: + +- [@article@Tree of Thoughts (ToT) | Prompt Engineering Guide](https://www.promptingguide.ai/techniques/tot) +- [@article@What is tree-of-thoughts? - IBM](https://www.ibm.com/think/topics/tree-of-thoughts) +- [@article@The Revolutionary Approach of Tree-of-Thought Prompting in AI](https://medium.com/@WeavePlatform/the-revolutionary-approach-of-tree-of-thought-prompting-in-ai-eb7c0872247b) diff --git a/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md b/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md index d58c69bf3..ce092e07e 100644 --- a/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md +++ b/src/data/roadmaps/ai-agents/content/tree-of-thought@hj1adjkG9nalXKZ-Youn0.md @@ -1,3 +1,9 @@ # Tree-of-Thought -Tree-of-Thought is a way to let an AI agent plan its steps like branches on a tree. The agent writes down one “thought” at a time, then splits into several follow-up thoughts, each leading to new branches. It can look ahead, compare branches, and drop weak paths while keeping strong ones. This helps the agent explore many ideas without getting stuck on the first answer. The method is useful for tasks that need careful reasoning, such as solving puzzles, coding, or writing. Because the agent can backtrack and revise earlier thoughts, it often finds better solutions than a straight, single-line chain of steps. \ No newline at end of file +Tree-of-Thought is a way to let an AI agent plan its steps like branches on a tree. The agent writes down one “thought” at a time, then splits into several follow-up thoughts, each leading to new branches. It can look ahead, compare branches, and drop weak paths while keeping strong ones. This helps the agent explore many ideas without getting stuck on the first answer. The method is useful for tasks that need careful reasoning, such as solving puzzles, coding, or writing. Because the agent can backtrack and revise earlier thoughts, it often finds better solutions than a straight, single-line chain of steps. + +Visit the following resources to learn more: + +- [@article@Tree of Thoughts (ToT) | Prompt Engineering Guide](https://www.promptingguide.ai/techniques/tot) +- [@article@What is tree-of-thoughts? - IBM](https://www.ibm.com/think/topics/tree-of-thoughts) +- [@article@The Revolutionary Approach of Tree-of-Thought Prompting in AI](https://medium.com/@WeavePlatform/the-revolutionary-approach-of-tree-of-thought-prompting-in-ai-eb7c0872247b) diff --git a/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md b/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md index 076b2f705..031c70499 100644 --- a/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md +++ b/src/data/roadmaps/ai-agents/content/understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md @@ -1,3 +1,9 @@ # Understand the Basics of RAG -RAG, short for Retrieval-Augmented Generation, is a way to make language models give better answers by letting them look things up before they reply. First, the system turns the user’s question into a search query and scans a knowledge source, such as a set of documents or a database. It then pulls back the most relevant passages, called “retrievals.” Next, the language model reads those passages and uses them, plus its own trained knowledge, to write the final answer. This mix of search and generation helps the model stay up to date, reduce guesswork, and cite real facts. Because it adds outside information on demand, RAG often needs less fine-tuning and can handle topics the base model never saw during training. \ No newline at end of file +RAG, short for Retrieval-Augmented Generation, is a way to make language models give better answers by letting them look things up before they reply. First, the system turns the user’s question into a search query and scans a knowledge source, such as a set of documents or a database. It then pulls back the most relevant passages, called “retrievals.” Next, the language model reads those passages and uses them, plus its own trained knowledge, to write the final answer. This mix of search and generation helps the model stay up to date, reduce guesswork, and cite real facts. Because it adds outside information on demand, RAG often needs less fine-tuning and can handle topics the base model never saw during training. + +Visit the following resources to learn more: + +- [@article@What Is RAG in AI and How to Use It?](https://www.v7labs.com/blog/what-is-rag) +- [@article@An Introduction to RAG and Simple & Complex RAG](https://medium.com/enterprise-rag/an-introduction-to-rag-and-simple-complex-rag-9c3aa9bd017b) +- [@video@Learn RAG From Scratch](https://www.youtube.com/watch?v=sVcwVQRHIc8) diff --git a/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md b/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md index f2da7e248..2d2b4487f 100644 --- a/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md +++ b/src/data/roadmaps/ai-agents/content/unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md @@ -1,3 +1,9 @@ # Unit Testing for Individual Tools -Unit testing checks that each tool an AI agent uses works as expected when it stands alone. You write small tests that feed the tool clear input and then compare its output to a known correct answer. If the tool is a function that parses dates, you test many date strings and see if the function gives the right results. Good tests cover normal cases, edge cases, and error cases. Run the tests every time you change the code. When a test fails, fix the tool before moving on. This habit keeps bugs from spreading into larger agent workflows and makes later debugging faster. \ No newline at end of file +Unit testing checks that each tool an AI agent uses works as expected when it stands alone. You write small tests that feed the tool clear input and then compare its output to a known correct answer. If the tool is a function that parses dates, you test many date strings and see if the function gives the right results. Good tests cover normal cases, edge cases, and error cases. Run the tests every time you change the code. When a test fails, fix the tool before moving on. This habit keeps bugs from spreading into larger agent workflows and makes later debugging faster. + +Visit the following resources to learn more: + +- [@article@Unit Testing Agents](https://docs.patronus.ai/docs/agent_evals/unit_testing) +- [@article@Best AI Tools for Unit Testing: A Look at Top 14 AI Tools](https://thetrendchaser.com/best-ai-tools-for-unit-testing/) +- [@article@AI for Unit Testing: Revolutionizing Developer Productivity](https://www.diffblue.com/resources/ai-for-unit-testing-revolutionizing-developer-productivity/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md b/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md index 3fc1d4b10..4e49e8d33 100644 --- a/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md +++ b/src/data/roadmaps/ai-agents/content/use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md @@ -1,3 +1,9 @@ # Use Examples in your Prompt -A clear way to guide an AI is to place one or two short samples inside your prompt. Show a small input and the exact output you expect. The AI studies these pairs and copies their pattern. Use plain words in the sample, keep the format steady, and label each part so the model knows which is which. If you need a list, show a list; if you need a table, include a small table. Good examples cut guesswork, reduce errors, and save you from writing long rules. \ No newline at end of file +A clear way to guide an AI is to place one or two short samples inside your prompt. Show a small input and the exact output you expect. The AI studies these pairs and copies their pattern. Use plain words in the sample, keep the format steady, and label each part so the model knows which is which. If you need a list, show a list; if you need a table, include a small table. Good examples cut guesswork, reduce errors, and save you from writing long rules. + +Visit the following resources to learn more: + +- [@article@10 Real-World AI Agent Examples in 2025](https://www.chatbase.co/blog/ai-agent-examples) +- [@article@GPT-4.1 Prompting Guide](https://cookbook.openai.com/examples/gpt4-1_prompting_guide) +- [@article@AI Agent Examples & Use Cases: Real Applications in 2025](https://eastgate-software.com/ai-agent-examples-use-cases-real-applications-in-2025/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md b/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md index 2e9d92734..e4ca54e28 100644 --- a/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md +++ b/src/data/roadmaps/ai-agents/content/use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md @@ -1,3 +1,9 @@ # Use relevant technical terms -When a task involves a special field such as law, medicine, or computer science, include the correct domain words in your prompt so the AI knows exactly what you mean. Ask for “O(n log n) sorting algorithms” instead of just “fast sorts,” or “HTTP status code 404” instead of “page not found error.” The right term narrows the topic, removes guesswork, and points the model toward the knowledge base you need. It also keeps the answer at the right level, because the model sees you understand the field and will reply with matching depth. Check spelling and letter case; “SQL” and “sql” are seen the same, but “Sequel” is not. Do not overload the prompt with buzzwords—add only the words that truly matter. The goal is clear language plus the exact technical labels the subject uses. \ No newline at end of file +When a task involves a special field such as law, medicine, or computer science, include the correct domain words in your prompt so the AI knows exactly what you mean. Ask for “O(n log n) sorting algorithms” instead of just “fast sorts,” or “HTTP status code 404” instead of “page not found error.” The right term narrows the topic, removes guesswork, and points the model toward the knowledge base you need. It also keeps the answer at the right level, because the model sees you understand the field and will reply with matching depth. Check spelling and letter case; “SQL” and “sql” are seen the same, but “Sequel” is not. Do not overload the prompt with buzzwords—add only the words that truly matter. The goal is clear language plus the exact technical labels the subject uses. + +Visit the following resources to learn more: + +- [@article@AI Terms Glossary: AI Terms To Know In 2024](https://www.moveworks.com/us/en/resources/ai-terms-glossary) +- [@article@15 Essential AI Agent Terms You Must Know](https://shivammore.medium.com/15-essential-ai-agent-terms-you-must-know-6bfc2f332f6d) +- [@article@AI Agent Examples & Use Cases: Real Applications in 2025](https://eastgate-software.com/ai-agent-examples-use-cases-real-applications-in-2025/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md b/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md index e39f7556b..1a6944f66 100644 --- a/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md +++ b/src/data/roadmaps/ai-agents/content/user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md @@ -1,3 +1,8 @@ # User Profile Storage -User profile storage is the part of an AI agent’s memory that holds stable facts about each user, such as name, age group, language, past choices, and long-term goals. The agent saves this data in a file or small database so it can load it each time the same user returns. By keeping the profile separate from short-term conversation logs, the agent can remember preferences without mixing them with temporary chat history. The profile is updated only when the user states a new lasting preference or when old information changes, which helps prevent drift or bloat. Secure storage, access controls, and encryption protect the data so that only the agent and the user can see it. Good profile storage lets the agent give answers that feel personal and consistent. \ No newline at end of file +User profile storage is the part of an AI agent’s memory that holds stable facts about each user, such as name, age group, language, past choices, and long-term goals. The agent saves this data in a file or small database so it can load it each time the same user returns. By keeping the profile separate from short-term conversation logs, the agent can remember preferences without mixing them with temporary chat history. The profile is updated only when the user states a new lasting preference or when old information changes, which helps prevent drift or bloat. + +Visit the following resources to learn more: + +- [@article@Storage Technology Explained: AI and Data Storage](https://www.computerweekly.com/feature/Storage-technology-explained-AI-and-the-data-storage-it-needs) +- [@partner@The Architect's Guide to Storage for AI - The New Stack](https://thenewstack.io/the-architects-guide-to-storage-for-ai/) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md b/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md index 70748dc1f..c8c11dd95 100644 --- a/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md +++ b/src/data/roadmaps/ai-agents/content/web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md @@ -1,3 +1,10 @@ # Web Scraping / Crawling -Web scraping and crawling let an AI agent collect data from many web pages without human help. The agent sends a request to a page, reads the HTML, and pulls out parts you ask for, such as prices, news headlines, or product details. It can then follow links on the page to reach more pages and repeat the same steps. This loop builds a large, up-to-date dataset in minutes or hours instead of days. Companies use it to track market prices, researchers use it to gather facts or trends, and developers use it to feed fresh data into other AI models. Good scraping code also respects site rules like robots.txt and avoids hitting servers too fast, so it works smoothly and fairly. \ No newline at end of file +Web scraping and crawling let an AI agent collect data from many web pages without human help. The agent sends a request to a page, reads the HTML, and pulls out parts you ask for, such as prices, news headlines, or product details. It can then follow links on the page to reach more pages and repeat the same steps. This loop builds a large, up-to-date dataset in minutes or hours instead of days. Companies use it to track market prices, researchers use it to gather facts or trends, and developers use it to feed fresh data into other AI models. Good scraping code also respects site rules like robots.txt and avoids hitting servers too fast, so it works smoothly and fairly. + +Visit the following resources to learn more: + +- [@article@Crawl AI - Build Your AI With One Prompt](https://www.crawlai.org/) +- [@article@AI-Powered Web Scraper with Crawl4AI and DeepSeek](https://brightdata.com/blog/web-data/crawl4ai-and-deepseek-web-scraping) +- [@article@Best Web Scraping Tools for AI Applications](https://www.thetoolnerd.com/p/best-web-scraping-tools-for-ai-applications) +- [@article@8 Best AI Web Scraping Tools I Tried - HubSpot Blog](https://blog.hubspot.com/website/ai-web-scraping) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md b/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md index 9545943d5..1c7f6b114 100644 --- a/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md +++ b/src/data/roadmaps/ai-agents/content/web-search@kBtqT8AduLoYDWopj-V9_.md @@ -1,3 +1,8 @@ # Web Search -Web search lets an AI agent pull fresh facts, news, and examples from the internet while it is working. The agent turns a user request into search words, sends them to a search engine, and reads the list of results. It then follows the most promising links, grabs the page text, and picks out the parts that answer the task. This helps the agent handle topics that were not in its training data, update old knowledge, or double-check details. Web search covers almost any subject and is much faster than manual research, but the agent must watch for ads, bias, or wrong pages and cross-check sources to stay accurate. \ No newline at end of file +Web search lets an AI agent pull fresh facts, news, and examples from the internet while it is working. The agent turns a user request into search words, sends them to a search engine, and reads the list of results. It then follows the most promising links, grabs the page text, and picks out the parts that answer the task. This helps the agent handle topics that were not in its training data, update old knowledge, or double-check details. Web search covers almost any subject and is much faster than manual research, but the agent must watch for ads, bias, or wrong pages and cross-check sources to stay accurate. + +Visit the following resources to learn more: + +- [@article@8 Best AI Search Engines for 2025](https://usefulai.com/tools/ai-search-engines) +- [@article@Web Search Agent - PraisonAI Documentation](https://docs.praison.ai/agents/websearch) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md b/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md index 8598c6cce..e7c23c382 100644 --- a/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md +++ b/src/data/roadmaps/ai-agents/content/what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md @@ -1,3 +1,9 @@ # What are AI Agents? -An AI agent is a computer program or robot that can sense its surroundings, think about what it senses, and then act to reach a goal. It gathers data through cameras, microphones, or software inputs, decides what the data means using rules or learned patterns, and picks the best action to move closer to its goal. After acting, it checks the results and learns from them, so it can do better next time. Chatbots, self-driving cars, and game characters are all examples. \ No newline at end of file +An AI agent is a computer program or robot that can sense its surroundings, think about what it senses, and then act to reach a goal. It gathers data through cameras, microphones, or software inputs, decides what the data means using rules or learned patterns, and picks the best action to move closer to its goal. After acting, it checks the results and learns from them, so it can do better next time. Chatbots, self-driving cars, and game characters are all examples. + +Visit the following resources to learn more: + +- [@article@What are AI Agents? - Agents in Artificial Intelligence Explained](https://aws.amazon.com/what-is/ai-agents/) +- [@article@AI Agents Explained in Simple Terms for Beginners](https://www.geeky-gadgets.com/ai-agents-explained-for-beginners/) +- [@video@What are AI Agents?](https://www.youtube.com/watch?v=F8NKVhkZZWI) \ No newline at end of file diff --git a/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md b/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md index d7da1fd4e..ff795036a 100644 --- a/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md +++ b/src/data/roadmaps/ai-agents/content/what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md @@ -1,3 +1,8 @@ # What are Tools? -Tools are extra skills or resources that an AI agent can call on to finish a job. A tool can be anything from a web search API to a calculator, a database, or a language-translation engine. The agent sends a request to the tool, gets the result, and then uses that result to move forward. Tools let a small core model handle tasks that would be hard or slow on its own. They also help keep answers current, accurate, and grounded in real data. Choosing the right tool and knowing when to use it are key parts of building a smart agent. \ No newline at end of file +Tools are extra skills or resources that an AI agent can call on to finish a job. A tool can be anything from a web search API to a calculator, a database, or a language-translation engine. The agent sends a request to the tool, gets the result, and then uses that result to move forward. Tools let a small core model handle tasks that would be hard or slow on its own. They also help keep answers current, accurate, and grounded in real data. Choosing the right tool and knowing when to use it are key parts of building a smart agent. + +Visit the following resources to learn more: + +- [@article@Compare 50+ AI Agent Tools in 2025 - AIMultiple](https://research.aimultiple.com/ai-agent-tools/) +- [@article@AI Agents Explained in Simple Terms for Beginners](https://www.geeky-gadgets.com/ai-agents-explained-for-beginners/) diff --git a/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md b/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md index 3613feaf1..d25238633 100644 --- a/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md +++ b/src/data/roadmaps/ai-agents/content/what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md @@ -1,3 +1,11 @@ # What is Agent Memory? -Agent memory is the part of an AI agent that keeps track of what has already happened. It stores past user messages, facts the agent has learned, and its own previous steps. This helps the agent remember goals, user likes and dislikes, and important details across turns or sessions. Memory can be short-term, lasting only for one conversation, or long-term, lasting across many. With a good memory the agent avoids repeating questions, stays consistent, and plans better actions. Without it, the agent would forget everything each time and feel unfocused. \ No newline at end of file +Agent memory is the part of an AI agent that keeps track of what has already happened. It stores past user messages, facts the agent has learned, and its own previous steps. This helps the agent remember goals, user likes and dislikes, and important details across turns or sessions. Memory can be short-term, lasting only for one conversation, or long-term, lasting across many. With a good memory the agent avoids repeating questions, stays consistent, and plans better actions. Without it, the agent would forget everything each time and feel unfocused. + +Visit the following resources to learn more: + +- [@article@Agentic Memory for LLM Agents](https://arxiv.org/abs/2502.12110) +- [@article@Memory Management in AI Agents](https://python.langchain.com/docs/how_to/chatbots_memory/) +- [@article@Storing and Retrieving Knowledge for Agents](https://www.pinecone.io/learn/langchain-retrieval-augmentation/) +- [@article@Short-Term vs Long-Term Memory in AI Agents](https://adasci.org/short-term-vs-long-term-memory-in-ai-agents/) +- [@video@Building Brain-Like Memory for AI Agents](https://www.youtube.com/watch?v=VKPngyO0iKg) diff --git a/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md b/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md index 8d5a942da..9e217c8d4 100644 --- a/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md +++ b/src/data/roadmaps/ai-agents/content/what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md @@ -1,3 +1,9 @@ # What is Prompt Engineering -Prompt engineering is the skill of writing clear questions or instructions so that an AI system gives the answer you want. It means choosing the right words, adding enough detail, and giving examples when needed. A good prompt tells the AI what role to play, what style to use, and what facts to include or avoid. By testing and refining the prompt, you can improve the quality, accuracy, and usefulness of the AI’s response. In short, prompt engineering is guiding the AI with well-designed text so it can help you better. \ No newline at end of file +Prompt engineering is the skill of writing clear questions or instructions so that an AI system gives the answer you want. It means choosing the right words, adding enough detail, and giving examples when needed. A good prompt tells the AI what role to play, what style to use, and what facts to include or avoid. By testing and refining the prompt, you can improve the quality, accuracy, and usefulness of the AI’s response. In short, prompt engineering is guiding the AI with well-designed text so it can help you better. + +Visit the following resources to learn more: + +- [@roadmap@Visit Dedicated Prompt Engineering Roadmap](https://roadmap.sh/prompt-engineering) +- [@article@What is Prompt Engineering? - AI Prompt Engineering Explained - AWS](https://aws.amazon.com/what-is/prompt-engineering/) +- [@article@What is Prompt Engineering? A Detailed Guide For 2025](https://www.datacamp.com/blog/what-is-prompt-engineering-the-future-of-ai-communication) From c2e1d8fd28d31bdff64b9b0fddee9d12cc14a7c0 Mon Sep 17 00:00:00 2001 From: Vedansh Date: Thu, 1 May 2025 17:59:23 +0530 Subject: [PATCH 29/31] cleanup and refactor Computer Science roadmap topics (#8561) --- src/data/roadmaps/computer-science/computer-science.md | 4 +++- .../content/architectural-styles@X1wv7xV69IEzepg8bF8oZ.md | 2 +- .../content/array@TwW6SO2IXqkxJXVjLzdwU.md | 8 ++++---- .../content/avl-trees@OUistS7H7hQQxVV-lOg39.md | 1 + .../balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md | 2 +- .../content/base@q3nRhTYS5wg9tYnQe2sCF.md | 5 +++++ .../content/big-o@c-NrTtJuNihbHzyPEOKTW.md | 5 +++-- .../content/binary-search@8kTg4O9MrTHRUrp6U-ctA.md | 4 ++-- .../content/boyer-moore@p6qub32jcaGloHXUDUrlG.md | 1 + .../content/brute-force-search@g3b0kt1fCAjjYyS2WelWi.md | 2 +- .../computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md | 2 +- .../content/cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md | 2 +- .../content/co-np@pLBfkzi0qfgVRqi_4AmMI.md | 3 --- .../content/combinatorics@lWnAY0DgrUOmT6yqnxeBN.md | 2 +- .../content/common-uml-diagrams@DMuMsEowpevTCALtziwTB.md | 1 + .../content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md | 3 --- .../content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md | 1 + .../content/depth-first-search@chzP5_t2gMi6MstxEzCi5.md | 2 +- .../content/design-patterns@-De1hU2ONGwhQmUpsyrCO.md | 2 +- .../content/factorial@m0umGQNdvg95UiNpQZsQN.md | 5 +++++ .../ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md | 2 +- .../computer-science/content/go@mWW88VnkqWgDz02qw5zU-.md | 2 +- .../content/graphql@DeE_dZecLmKCjePovTfFS.md | 2 ++ .../content/hash-table@G2dN2FO0SN_I-5AhO_EUk.md | 5 +---- .../content/hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md | 1 + .../content/heap@pw3ZCC3HKU7D5SQwte4vE.md | 5 +++-- .../how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md | 3 ++- .../content/how-computers-work@-emdKpD5uRNuvem5rbFXJ.md | 4 ++-- .../content/in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md | 1 + .../content/indexes@BEbsUA39kZ5itqCwD585f.md | 3 ++- .../content/insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md | 2 +- .../content/java@1lQSUFrrIGq19nUnM92-I.md | 2 +- .../content/lfu-cache@n11ujPI3of-52l2KW2CDQ.md | 1 + .../content/linear@jymhjv8GiFALQpox6aZeu.md | 1 + .../content/little-endian@rD_5n5bjiNMVC0cPhEVyG.md | 2 +- .../content/load-balancing@xDiS0HmrEoPjkQg9x2O3o.md | 1 + .../content/np-complete@Lwkz7qozXRlVNA20zJbSw.md | 3 --- .../computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md | 3 --- .../content/pick-a-language@tU4Umtnfu01t9gLlnlK6b.md | 1 + .../content/post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md | 1 + .../content/process-forking@RbdT5MOE4L-E7PPWKRITX.md | 1 + .../content/proxy@qLLJ_ehC8tSRfXsorYMQz.md | 2 +- .../content/queue@JI990pDX2jjNe6IH_Y_t0.md | 2 +- .../content/registers-and-ram@U3379F4AO1KSmGtVmPr27.md | 2 +- .../content/rust@1bDjg-KBDKRmE6f1MWY8l.md | 4 ++-- .../scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md | 4 ++++ .../search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md | 1 + .../content/selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md | 1 + .../content/skip-lists@K96ggeWqd5OwoNnkL04pc.md | 2 +- .../string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md | 2 +- .../content/suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md | 5 +++-- .../content/system-design@w-fvEiSJysywR3AOAB0ve.md | 4 ++-- .../the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md | 2 +- .../content/tls--https@3pu2bGhoCLFIs6kNanwtz.md | 2 ++ .../content/transactions@KhvYJtSCUBOpEZXjHpQde.md | 1 + .../travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md | 1 + .../content/tree@_eWqiWUmOj0zUo_Ix3j1O.md | 1 + .../content/unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md | 3 ++- 58 files changed, 85 insertions(+), 57 deletions(-) diff --git a/src/data/roadmaps/computer-science/computer-science.md b/src/data/roadmaps/computer-science/computer-science.md index 47644a4ef..949f0edc8 100644 --- a/src/data/roadmaps/computer-science/computer-science.md +++ b/src/data/roadmaps/computer-science/computer-science.md @@ -22,12 +22,14 @@ seo: title: 'Computer Science Roadmap: Curriculum for the self taught developer' description: 'Computer Science study plan with free resources for the self-taught and bootcamp grads wanting to learn Computer Science.' keywords: - - 'computer science roadmap' - 'computer science' + - 'computer science roadmap' - 'computer science roadmap 2024' + - 'computer science roadmap 2025' - 'guide to computer science' - 'software engineer roadmap' - 'software engineer roadmap 2024' + - 'software engineer roadmap 2025' - 'self-taught computer science roadmap' - 'computer science skills' - 'computer science skills test' diff --git a/src/data/roadmaps/computer-science/content/architectural-styles@X1wv7xV69IEzepg8bF8oZ.md b/src/data/roadmaps/computer-science/content/architectural-styles@X1wv7xV69IEzepg8bF8oZ.md index 7af58e120..7f7499730 100644 --- a/src/data/roadmaps/computer-science/content/architectural-styles@X1wv7xV69IEzepg8bF8oZ.md +++ b/src/data/roadmaps/computer-science/content/architectural-styles@X1wv7xV69IEzepg8bF8oZ.md @@ -4,4 +4,4 @@ Architectural patterns are the fundamental organization of a system, defining ho Visit the following resources to learn more: -- [@article@List of software architecture styles and patterns](https://en.wikipedia.org/wiki/List_of_software_architecture_styles_and_patterns) +- [@article@List of Software Architecture Styles and Patterns](https://en.wikipedia.org/wiki/List_of_software_architecture_styles_and_patterns) diff --git a/src/data/roadmaps/computer-science/content/array@TwW6SO2IXqkxJXVjLzdwU.md b/src/data/roadmaps/computer-science/content/array@TwW6SO2IXqkxJXVjLzdwU.md index 04d85c576..c7bd34938 100644 --- a/src/data/roadmaps/computer-science/content/array@TwW6SO2IXqkxJXVjLzdwU.md +++ b/src/data/roadmaps/computer-science/content/array@TwW6SO2IXqkxJXVjLzdwU.md @@ -4,10 +4,10 @@ Arrays store elements in contiguous memory locations, resulting in easily calcul Visit the following resources to learn more: +- [@article@What is Array in Data Structure? Types & Syntax](https://www.simplilearn.com/tutorials/data-structure-tutorial/arrays-in-data-structure) - [@video@Array Data Structure | Illustrated Data Structures](https://www.youtube.com/watch?v=QJNwK2uJyGs) -- [@course@Array Data Structure - Coursera](https://www.coursera.org/lecture/data-structures/arrays-OsBSF) -- [@course@Dynamic Arrays - Coursera](https://www.coursera.org/lecture/data-structures/dynamic-arrays-EwbnV) -- [@video@UC Berkeley CS61B - Linear and Multi-Dim Arrays (Start watching from 15m 32s)](https://archive.org/details/ucberkeley_webcast_Wp8oiO_CZZE) +- [@video@Jagged Arrays](https://www.youtube.com/watch?v=1jtrQqYpt7g) - [@video@Dynamic and Static Arrays](https://www.youtube.com/watch?v=PEnFFiQe1pM&list=PLDV1Zeh2NRsB6SWUrDFW2RmDotAfPbeHu&index=6) - [@video@Dynamic Array Code](https://www.youtube.com/watch?v=tvw4v7FEF1w&list=PLDV1Zeh2NRsB6SWUrDFW2RmDotAfPbeHu&index=5) -- [@video@Jagged Arrays](https://www.youtube.com/watch?v=1jtrQqYpt7g) +- [@video@UC Berkeley CS61B - Linear and Multi-Dim Arrays (Start watching from 15m 32s)](https://archive.org/details/ucberkeley_webcast_Wp8oiO_CZZE) +- [@course@Array Data Structure - Coursera](https://www.coursera.org/lecture/data-structures/arrays-OsBSF) diff --git a/src/data/roadmaps/computer-science/content/avl-trees@OUistS7H7hQQxVV-lOg39.md b/src/data/roadmaps/computer-science/content/avl-trees@OUistS7H7hQQxVV-lOg39.md index 219f7d13d..dd527b435 100644 --- a/src/data/roadmaps/computer-science/content/avl-trees@OUistS7H7hQQxVV-lOg39.md +++ b/src/data/roadmaps/computer-science/content/avl-trees@OUistS7H7hQQxVV-lOg39.md @@ -6,6 +6,7 @@ In practice: From what I can tell, these aren't used much in practice, but I cou Visit the following resources to learn more: +- [@article@AVL Tree - Programiz](https://www.programiz.com/dsa/avl-tree) - [@video@MIT AVL Trees / AVL Sort](https://www.youtube.com/watch?v=FNeL18KsWPc&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=6) - [@course@AVL Trees](https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees) - [@course@AVL Tree Implementation](https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation) diff --git a/src/data/roadmaps/computer-science/content/balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md b/src/data/roadmaps/computer-science/content/balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md index 179daf56f..a05329b4a 100644 --- a/src/data/roadmaps/computer-science/content/balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md +++ b/src/data/roadmaps/computer-science/content/balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md @@ -4,6 +4,6 @@ Balanced search trees are a type of data structure that allow for fast insertion Visit the following resources to learn more: -- [@article@Self-balancing binary search tree - Wikipedia](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree) +- [@article@Self-balancing Binary Search Tree - Wikipedia](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree) - [@video@Balanced Search Trees Operations and Applications 11 min](https://www.youtube.com/watch?v=IbNZ-x1I2IM) - [@video@Balanced binary search tree rotations](https://www.youtube.com/watch?v=q4fnJZr8ztY) diff --git a/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md b/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md index 2ebe4eed3..7f869e8b6 100644 --- a/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md +++ b/src/data/roadmaps/computer-science/content/base@q3nRhTYS5wg9tYnQe2sCF.md @@ -5,3 +5,8 @@ The rise in popularity of NoSQL databases provided a flexible and fluidity with - **B**asically **A**vailable - **S**oft state - **E**ventual consistency + +Visit the following resources to learn more: + +- [@article@ACID vs. BASE Database Model](https://phoenixnap.com/kb/acid-vs-base) +- [@article@What Is BASE in Database Engineering?](https://www.lifewire.com/abandoning-acid-in-favor-of-base-1019674) \ No newline at end of file diff --git a/src/data/roadmaps/computer-science/content/big-o@c-NrTtJuNihbHzyPEOKTW.md b/src/data/roadmaps/computer-science/content/big-o@c-NrTtJuNihbHzyPEOKTW.md index 110914c36..4fa321a1c 100644 --- a/src/data/roadmaps/computer-science/content/big-o@c-NrTtJuNihbHzyPEOKTW.md +++ b/src/data/roadmaps/computer-science/content/big-o@c-NrTtJuNihbHzyPEOKTW.md @@ -4,8 +4,9 @@ The Big O notation can be used to describe how the running time of an algorithm Visit the following resources to learn more: +- [@article@Big-O Notation: A Simple Explanation with Examples](https://medium.com/better-programming/big-o-notation-a-simple-explanation-with-examples-a56347d1daca) +- [@article@CS 61B Lecture 19: Asymptotic Analysis](https://archive.org/details/ucberkeley_webcast_VIS4YDpuP98) +- [@article@Big O Notation | Brilliant Math & Science Wiki](https://brilliant.org/wiki/big-o-notation/) - [@video@Big O Notation — Calculating Time Complexity](https://www.youtube.com/watch?v=Z0bH0cMY0E8) - [@video@Big O Notations](https://www.youtube.com/watch?v=V6mKVRU1evU) -- [@article@moviesCS 61B Lecture 19: Asymptotic Analysis](https://archive.org/details/ucberkeley_webcast_VIS4YDpuP98) - [@video@Big Oh Notation (and Omega and Theta)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN&index=3) -- [@article@Big O Notation | Brilliant Math & Science Wiki](https://brilliant.org/wiki/big-o-notation/) diff --git a/src/data/roadmaps/computer-science/content/binary-search@8kTg4O9MrTHRUrp6U-ctA.md b/src/data/roadmaps/computer-science/content/binary-search@8kTg4O9MrTHRUrp6U-ctA.md index 00dfca5d7..377ef44e0 100644 --- a/src/data/roadmaps/computer-science/content/binary-search@8kTg4O9MrTHRUrp6U-ctA.md +++ b/src/data/roadmaps/computer-science/content/binary-search@8kTg4O9MrTHRUrp6U-ctA.md @@ -4,8 +4,8 @@ Binary search is a search algorithm that finds the position of a target value wi Visit the following resources to learn more: -- [@video@Binary Search in 4 Minutes](https://www.youtube.com/watch?v=fDKIpRe8GW4\&feature=youtu.be) -- [@video@Binary Search - CS50](https://www.youtube.com/watch?v=D5SrAga1pno) - [@article@Binary Search - Khan Academy](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search) - [@article@Binary Search](https://www.topcoder.com/thrive/articles/Binary%20Search) +- [@video@Binary Search in 4 Minutes](https://www.youtube.com/watch?v=fDKIpRe8GW4\&feature=youtu.be) +- [@video@Binary Search - CS50](https://www.youtube.com/watch?v=D5SrAga1pno) - [@feed@Explore top posts about Binary Search](https://app.daily.dev/tags/binary-search?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/boyer-moore@p6qub32jcaGloHXUDUrlG.md b/src/data/roadmaps/computer-science/content/boyer-moore@p6qub32jcaGloHXUDUrlG.md index d1f4d3b65..491dcf49e 100644 --- a/src/data/roadmaps/computer-science/content/boyer-moore@p6qub32jcaGloHXUDUrlG.md +++ b/src/data/roadmaps/computer-science/content/boyer-moore@p6qub32jcaGloHXUDUrlG.md @@ -4,4 +4,5 @@ Boyer Moore algorithm is a string searching algorithm that is used to find the i Visit the following resources to learn more: +- [@article@Boyer-Moore String-search Algorithm](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm) - [@course@Boyer Moore Algorithm](https://www.coursera.org/learn/algorithms-part2/lecture/CYxOT/boyer-moore) diff --git a/src/data/roadmaps/computer-science/content/brute-force-search@g3b0kt1fCAjjYyS2WelWi.md b/src/data/roadmaps/computer-science/content/brute-force-search@g3b0kt1fCAjjYyS2WelWi.md index af3e6fda6..08f786106 100644 --- a/src/data/roadmaps/computer-science/content/brute-force-search@g3b0kt1fCAjjYyS2WelWi.md +++ b/src/data/roadmaps/computer-science/content/brute-force-search@g3b0kt1fCAjjYyS2WelWi.md @@ -4,6 +4,6 @@ Brute force search is a simple algorithm that checks for a pattern in a string b Visit the following resources to learn more: -- [@article@A beginner guide to Brute Force Algorithm for substring search](https://nulpointerexception.com/2019/02/10/a-beginner-guide-to-brute-force-algorithm-for-substring-search/) +- [@article@A Beginner Guide to Brute Force Algorithm for Substring Search](https://nulpointerexception.com/2019/02/10/a-beginner-guide-to-brute-force-algorithm-for-substring-search/) - [@article@Brute Force Algorithm in Cybersecurity and String Search](https://www.baeldung.com/cs/brute-force-cybersecurity-string-search) - [@course@Brute-Force Substring Search](https://www.coursera.org/learn/algorithms-part2/lecture/2Kn5i/brute-force-substring-search) diff --git a/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md b/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md index 61fe1d913..ef65aa619 100644 --- a/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md +++ b/src/data/roadmaps/computer-science/content/c@1kQJs-3Aw8Bi7d_Xh67zS.md @@ -4,7 +4,7 @@ C++ is a powerful general-purpose programming language. It can be used to develo Visit the following resources to learn more: -- [@roadmap@C++ Roadmap](https://roadmap.sh/cpp) +- [@roadmap@Visit Dedicated C++ Roadmap](https://roadmap.sh/cpp) - [@article@Learn C++](https://learncpp.com/) - [@article@Cpp Reference](https://en.cppreference.com/) - [@article@CPlusPlus](https://cplusplus.com/) diff --git a/src/data/roadmaps/computer-science/content/cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md b/src/data/roadmaps/computer-science/content/cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md index 8f1e14221..fda63011c 100644 --- a/src/data/roadmaps/computer-science/content/cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md +++ b/src/data/roadmaps/computer-science/content/cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md @@ -4,5 +4,5 @@ The CAP theorem states that it is impossible for a distributed data store to sim Visit the following resources to learn more: +- [@article@CAP Theorem](https://en.wikipedia.org/wiki/CAP_theorem) - [@video@What is CAP Theorem?](https://www.youtube.com/watch?v=_RbsFXWRZ10) -- [@article@CAP Theorem - Wikipedia](https://en.wikipedia.org/wiki/CAP_theorem) diff --git a/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md b/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md index 1d0824f6c..4a5f04b31 100644 --- a/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md +++ b/src/data/roadmaps/computer-science/content/co-np@pLBfkzi0qfgVRqi_4AmMI.md @@ -10,6 +10,3 @@ Visit the following resources to learn more: - [@video@Complexity: Fixed-Parameter Algorithms](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) - [@video@Lecture 23: Computational Complexity](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=24) - [@video@Greedy Algs. II & Intro to NP Completeness](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939) -- [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) -- [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) -- [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18) diff --git a/src/data/roadmaps/computer-science/content/combinatorics@lWnAY0DgrUOmT6yqnxeBN.md b/src/data/roadmaps/computer-science/content/combinatorics@lWnAY0DgrUOmT6yqnxeBN.md index f3dd598d4..3b11e505d 100644 --- a/src/data/roadmaps/computer-science/content/combinatorics@lWnAY0DgrUOmT6yqnxeBN.md +++ b/src/data/roadmaps/computer-science/content/combinatorics@lWnAY0DgrUOmT6yqnxeBN.md @@ -4,7 +4,7 @@ Combinatorics is the study of counting. It is a branch of mathematics that is us Visit the following resources to learn more: +- [@article@Probability and Combinatorics](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic) - [@video@Math Skills: How to find Factorial, Permutation and Combination](https://www.youtube.com/watch?v=8RRo6Ti9d0U) - [@video@Make School: Probability](https://www.youtube.com/watch?v=sZkAAk9Wwa4) - [@video@Make School: More Probability and Markov Chains](https://www.youtube.com/watch?v=dNaJg-mLobQ) -- [@article@Probability and Combinatorics Topic](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic) diff --git a/src/data/roadmaps/computer-science/content/common-uml-diagrams@DMuMsEowpevTCALtziwTB.md b/src/data/roadmaps/computer-science/content/common-uml-diagrams@DMuMsEowpevTCALtziwTB.md index aebfb3e02..2dbe2015d 100644 --- a/src/data/roadmaps/computer-science/content/common-uml-diagrams@DMuMsEowpevTCALtziwTB.md +++ b/src/data/roadmaps/computer-science/content/common-uml-diagrams@DMuMsEowpevTCALtziwTB.md @@ -4,4 +4,5 @@ UML is a standard way of visualizing a software system. It is a general-purpose, Visit the following resources to learn more: +- [@article@Unified Modeling Language (UML) Description](https://www.uml-diagrams.org/) - [@video@UML Diagrams Full Course (Unified Modeling Language)](https://www.youtube.com/watch?v=WnMQ8HlmeXc) diff --git a/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md b/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md index 0d33cd275..d13ce1107 100644 --- a/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md +++ b/src/data/roadmaps/computer-science/content/complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md @@ -10,6 +10,3 @@ Visit the following resources to learn more: - [@video@Complexity: Fixed-Parameter Algorithms](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) - [@video@Lecture 23: Computational Complexity](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=24) - [@video@Greedy Algs. II & Intro to NP Completeness](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939) -- [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) -- [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) -- [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18) diff --git a/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md b/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md index 01245d850..1ec5f6fca 100644 --- a/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md +++ b/src/data/roadmaps/computer-science/content/cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md @@ -4,5 +4,6 @@ CPU Interrupts are a way for the CPU to communicate with the rest of the compute Visit the following resources to learn more: +- [@article@System Interrupts 100% CPU](https://www.wikihow.com/System-Interrupts-100-Cpu) - [@video@Interrupts](https://youtu.be/iKlAWIKEyuw) - [@feed@Explore top posts about Computing](https://app.daily.dev/tags/computing?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/depth-first-search@chzP5_t2gMi6MstxEzCi5.md b/src/data/roadmaps/computer-science/content/depth-first-search@chzP5_t2gMi6MstxEzCi5.md index 442b7dd72..ddf02a411 100644 --- a/src/data/roadmaps/computer-science/content/depth-first-search@chzP5_t2gMi6MstxEzCi5.md +++ b/src/data/roadmaps/computer-science/content/depth-first-search@chzP5_t2gMi6MstxEzCi5.md @@ -4,6 +4,6 @@ Depth first search is a graph traversal algorithm that starts at a root node and Visit the following resources to learn more: -- [@video@BFS and DFS in a Binary Tree](https://www.youtube.com/watch?v=uWL6FJhq5fM) - [@article@Breadth-First Search (BFS) and Depth-First Search (DFS) for Binary Trees in Java](https://www.digitalocean.com/community/tutorials/breadth-first-search-depth-first-search-bfs-dfs) +- [@video@BFS and DFS in a Binary Tree](https://www.youtube.com/watch?v=uWL6FJhq5fM) - [@video@Depth First Search in 4 Minutes](https://www.youtube.com/watch?v=Urx87-NMm6c) diff --git a/src/data/roadmaps/computer-science/content/design-patterns@-De1hU2ONGwhQmUpsyrCO.md b/src/data/roadmaps/computer-science/content/design-patterns@-De1hU2ONGwhQmUpsyrCO.md index 2a3c2dcdf..922e39bd2 100644 --- a/src/data/roadmaps/computer-science/content/design-patterns@-De1hU2ONGwhQmUpsyrCO.md +++ b/src/data/roadmaps/computer-science/content/design-patterns@-De1hU2ONGwhQmUpsyrCO.md @@ -4,7 +4,7 @@ Design patterns are solutions to common problems in software design. They are fo Visit the following resources to learn more: -- [@article@Design Patterns - Wikipedia](https://en.wikipedia.org/wiki/Software_design_pattern) +- [@article@Design Patterns](https://en.wikipedia.org/wiki/Software_design_pattern) - [@opensource@Design Patterns for Humans](https://github.com/kamranahmedse/design-patterns-for-humans) - [@article@Refactoring Guru - Design Patterns](https://refactoring.guru/design-patterns/) - [@feed@Explore top posts about Design Patterns](https://app.daily.dev/tags/design-patterns?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/factorial@m0umGQNdvg95UiNpQZsQN.md b/src/data/roadmaps/computer-science/content/factorial@m0umGQNdvg95UiNpQZsQN.md index afd691f80..16097522f 100644 --- a/src/data/roadmaps/computer-science/content/factorial@m0umGQNdvg95UiNpQZsQN.md +++ b/src/data/roadmaps/computer-science/content/factorial@m0umGQNdvg95UiNpQZsQN.md @@ -24,3 +24,8 @@ def generate_permutations(s): return permutations ``` + +Visit the following resources to learn more: + +- [@article@Big O Cheat Sheet - Time Complexity Chart](https://www.freecodecamp.org/news/big-o-cheat-sheet-time-complexity-chart/) +- [@video@Factorial Explained](https://www.youtube.com/watch?v=pxh__ugRKz8) diff --git a/src/data/roadmaps/computer-science/content/ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md b/src/data/roadmaps/computer-science/content/ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md index d6ba4268e..e53f63fc4 100644 --- a/src/data/roadmaps/computer-science/content/ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md +++ b/src/data/roadmaps/computer-science/content/ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md @@ -4,6 +4,6 @@ Ford Fulkerson Algorithm is a greedy algorithm that is used to find the maximum Visit the following resources to learn more: -- [@video@Ford-Fulkerson in 5 minutes](https://www.youtube.com/watch?v=Tl90tNtKvxs) - [@article@Ford-Fulkerson Algorithm](https://www.programiz.com/dsa/ford-fulkerson-algorithm) +- [@video@Ford-Fulkerson in 5 minutes](https://www.youtube.com/watch?v=Tl90tNtKvxs) - [@feed@Explore top posts about Data Science](https://app.daily.dev/tags/data-science?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/go@mWW88VnkqWgDz02qw5zU-.md b/src/data/roadmaps/computer-science/content/go@mWW88VnkqWgDz02qw5zU-.md index af338149e..364c541ba 100644 --- a/src/data/roadmaps/computer-science/content/go@mWW88VnkqWgDz02qw5zU-.md +++ b/src/data/roadmaps/computer-science/content/go@mWW88VnkqWgDz02qw5zU-.md @@ -8,7 +8,7 @@ Visit the following resources to learn more: - [@official@A Tour of Go – Go Basics](https://go.dev/tour/welcome/1) - [@official@Go Reference Documentation](https://go.dev/doc/) - [@article@Go by Example - annotated example programs](https://gobyexample.com/) -- [@article@W3Schools Go Tutorial ](https://www.w3schools.com/go/) +- [@article@W3Schools Go Tutorial](https://www.w3schools.com/go/) - [@article@Making a RESTful JSON API in Go](https://thenewstack.io/make-a-restful-json-api-go/) - [@article@Go, the Programming Language of the Cloud](https://thenewstack.io/go-the-programming-language-of-the-cloud/) - [@feed@Explore top posts about Golang](https://app.daily.dev/tags/golang?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md b/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md index 69abb658e..ac3186b68 100644 --- a/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md +++ b/src/data/roadmaps/computer-science/content/graphql@DeE_dZecLmKCjePovTfFS.md @@ -5,5 +5,7 @@ GraphQL is a query language for APIs and a runtime for fulfilling those queries Visit the following resources to learn more: - [@roadmap@Visit Dedicated GraphQL Roadmap](https://roadmap.sh/graphql) +- [@official@GraphQL](https://graphql.org/) +- [@official@GraphQL Documentation](https://graphql.org/learn/) - [@article@Apollo GraphQL Tutorials](https://www.apollographql.com/tutorials/) - [@feed@Explore top posts about GraphQL](https://app.daily.dev/tags/graphql?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/hash-table@G2dN2FO0SN_I-5AhO_EUk.md b/src/data/roadmaps/computer-science/content/hash-table@G2dN2FO0SN_I-5AhO_EUk.md index d37f438a3..ad4f9593a 100644 --- a/src/data/roadmaps/computer-science/content/hash-table@G2dN2FO0SN_I-5AhO_EUk.md +++ b/src/data/roadmaps/computer-science/content/hash-table@G2dN2FO0SN_I-5AhO_EUk.md @@ -4,12 +4,9 @@ Hash Table, Map, HashMap, Dictionary or Associative are all the names of the sam Visit the following resources to learn more: +- [@article@Hash Tables - Princeton University](https://algs4.cs.princeton.edu/34hash/) - [@video@Hash Table | Illustrated Data Structures](https://www.youtube.com/watch?v=jalSiaIi8j4) - [@video@Hash Table in 4 Minutes](https://youtu.be/knV86FlSXJ8) - [@video@Hashing with Chaining](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=9) -- [@video@Table Doubling, Karp-Rabin](https://www.youtube.com/watch?v=BRO7mVIFt08&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=10) -- [@video@Open Addressing, Cryptographic Hashing](https://www.youtube.com/watch?v=rvdJDijO2Ro&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=11) -- [@video@PyCon 2010: The Mighty Dictionary](https://www.youtube.com/watch?v=C4Kc8xzcA68) -- [@video@PyCon 2017: The Dictionary Even Mightier](https://www.youtube.com/watch?v=66P5FMkWoVU) - [@video@(Advanced) Randomization: Universal & Perfect Hashing](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11) - [@video@(Advanced) Perfect hashing](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4) diff --git a/src/data/roadmaps/computer-science/content/hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md b/src/data/roadmaps/computer-science/content/hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md index ff2bf13a0..afb1b8581 100644 --- a/src/data/roadmaps/computer-science/content/hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md +++ b/src/data/roadmaps/computer-science/content/hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md @@ -4,6 +4,7 @@ Hashing algorithms are used to generate a unique value for a given input. This v Visit the following resources to learn more: +- [@article@Hashing Algorithm Overview:](https://www.okta.com/identity-101/hashing-algorithms/) - [@video@Hashing Algorithms and Security - Computerphile](https://www.youtube.com/watch?v=b4b8ktEV4Bg) - [@video@Top Hashing Algorithms In Cryptography | MD5 and SHA 256 Algorithms Expalined | Simplilearn](https://www.youtube.com/watch?v=Plp4F3ZfC7A) - [@video@SHA: Secure Hashing Algorithm - Computerphile](https://www.youtube.com/watch?v=DMtFhACPnTY) diff --git a/src/data/roadmaps/computer-science/content/heap@pw3ZCC3HKU7D5SQwte4vE.md b/src/data/roadmaps/computer-science/content/heap@pw3ZCC3HKU7D5SQwte4vE.md index 3dd8fca96..f78a19961 100644 --- a/src/data/roadmaps/computer-science/content/heap@pw3ZCC3HKU7D5SQwte4vE.md +++ b/src/data/roadmaps/computer-science/content/heap@pw3ZCC3HKU7D5SQwte4vE.md @@ -4,7 +4,8 @@ Heap is a tree-based data structure that follows the properties of a complete bi Visit the following resources to learn more: +- [@article@Heap Data Structure](https://www.programiz.com/dsa/heap-data-structure) +- [@article@CS 61B Lecture 24: Priority Queues](https://archive.org/details/ucberkeley_webcast_yIUFT6AKBGE) - [@video@Heap | Illustrated Data Structures](https://www.youtube.com/watch?v=F_r0sJ1RqWk) -- [@course@Priority Queue - Introduction](https://www.coursera.org/lecture/data-structures/introduction-2OpTs) - [@video@Heaps and Heap Sort](https://www.youtube.com/watch?v=B7hVxCmfPtM&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=5) -- [@article@CS 61B Lecture 24: Priority Queues](https://archive.org/details/ucberkeley_webcast_yIUFT6AKBGE) +- [@course@Priority Queue - Introduction](https://www.coursera.org/lecture/data-structures/introduction-2OpTs) diff --git a/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md b/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md index d8e41f626..97b9a4990 100644 --- a/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md +++ b/src/data/roadmaps/computer-science/content/how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md @@ -4,4 +4,5 @@ Computers calculate using the binary system, where all data is represented as 0s Visit the following resources to learn more: -- [@video@How computers calculate - ALU](https://youtu.be/1I5ZMmrOfnA) +- [@article@How Does A Computer Calculate Numbers?](https://www.sciencing.com/computer-calculate-numbers-4705975/) +- [@video@How Computers Calculate - ALU](https://youtu.be/1I5ZMmrOfnA) diff --git a/src/data/roadmaps/computer-science/content/how-computers-work@-emdKpD5uRNuvem5rbFXJ.md b/src/data/roadmaps/computer-science/content/how-computers-work@-emdKpD5uRNuvem5rbFXJ.md index a41843c9f..ba1d52da9 100644 --- a/src/data/roadmaps/computer-science/content/how-computers-work@-emdKpD5uRNuvem5rbFXJ.md +++ b/src/data/roadmaps/computer-science/content/how-computers-work@-emdKpD5uRNuvem5rbFXJ.md @@ -4,8 +4,8 @@ Computers are everywhere. They are in our phones, our cars, our homes, and even Visit the following resources to learn more: -- [@video@How CPU executes a program](https://www.youtube.com/watch?v=XM4lGflQFvA) -- [@video@How computers calculate - ALU](https://youtu.be/1I5ZMmrOfnA) +- [@video@How CPU Executes A Program](https://www.youtube.com/watch?v=XM4lGflQFvA) +- [@video@How Computers Calculate - ALU](https://youtu.be/1I5ZMmrOfnA) - [@video@Registers and RAM](https://youtu.be/fpnE6UAfbtU) - [@video@The Central Processing Unit (CPU)](https://youtu.be/FZGugFqdr60) - [@video@Instructions and Programs](https://youtu.be/zltgXvg6r3k) diff --git a/src/data/roadmaps/computer-science/content/in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md b/src/data/roadmaps/computer-science/content/in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md index 26bc73b90..6cd678114 100644 --- a/src/data/roadmaps/computer-science/content/in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md +++ b/src/data/roadmaps/computer-science/content/in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md @@ -4,4 +4,5 @@ In-order traversal is a tree traversal algorithm that visits the left subtree, t Visit the following resources to learn more: +- [@article@Tree Traversal Techniques](https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/) - [@video@Tree | Illustrated Data Structures](https://www.youtube.com/watch?v=S2W3SXGPVyU) diff --git a/src/data/roadmaps/computer-science/content/indexes@BEbsUA39kZ5itqCwD585f.md b/src/data/roadmaps/computer-science/content/indexes@BEbsUA39kZ5itqCwD585f.md index efd30cac9..12d0421f2 100644 --- a/src/data/roadmaps/computer-science/content/indexes@BEbsUA39kZ5itqCwD585f.md +++ b/src/data/roadmaps/computer-science/content/indexes@BEbsUA39kZ5itqCwD585f.md @@ -4,4 +4,5 @@ An index is a data structure that you build and assign on top of an existing tab Visit the following resources to learn more: -- [@video@Database Indexing Explained](https://www.youtube.com/watch?v=-qNSXK7s7_w) +- [@article@Database Indexes Explained](https://www.essentialsql.com/what-is-a-database-index/) +- [@video@Database Indexing Explained](https://www.youtube.com/watch?v=-qNSXK7s7_w) \ No newline at end of file diff --git a/src/data/roadmaps/computer-science/content/insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md b/src/data/roadmaps/computer-science/content/insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md index aa99affac..11c4b08a6 100644 --- a/src/data/roadmaps/computer-science/content/insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md +++ b/src/data/roadmaps/computer-science/content/insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md @@ -4,6 +4,6 @@ Insertion sort is a simple sorting algorithm that builds the final sorted array Visit the following resources to learn more: +- [@article@Insertion Sort](https://www.programiz.com/dsa/insertion-sort) - [@video@Insertion Sort — MIT](https://www.youtube.com/watch?v=Kg4bqzAqRBM&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=4) - [@video@Insertion Sort in 3 Minutes](https://www.youtube.com/watch?v=JU767SDMDvA) -- [@article@Insertion Sort Algorithm](https://www.programiz.com/dsa/insertion-sort) diff --git a/src/data/roadmaps/computer-science/content/java@1lQSUFrrIGq19nUnM92-I.md b/src/data/roadmaps/computer-science/content/java@1lQSUFrrIGq19nUnM92-I.md index fabf09755..f2bec6c83 100644 --- a/src/data/roadmaps/computer-science/content/java@1lQSUFrrIGq19nUnM92-I.md +++ b/src/data/roadmaps/computer-science/content/java@1lQSUFrrIGq19nUnM92-I.md @@ -6,7 +6,7 @@ It was created in 1995 by James Gosling at Sun Microsystems and is one of the mo Visit the following resources to learn more: - [@roadmap@Visit Dedicated Java Roadmap](https://roadmap.sh/java) -- [@official@Java Website](https://www.java.com/) +- [@official@Java](https://www.java.com/) - [@article@W3 Schools Tutorials](https://www.w3schools.com/java/) - [@video@Java Crash Course](https://www.youtube.com/watch?v=eIrMbAQSU34) - [@feed@Explore top posts about Java](https://app.daily.dev/tags/java?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/lfu-cache@n11ujPI3of-52l2KW2CDQ.md b/src/data/roadmaps/computer-science/content/lfu-cache@n11ujPI3of-52l2KW2CDQ.md index a8b7120c1..ca17bb9ed 100644 --- a/src/data/roadmaps/computer-science/content/lfu-cache@n11ujPI3of-52l2KW2CDQ.md +++ b/src/data/roadmaps/computer-science/content/lfu-cache@n11ujPI3of-52l2KW2CDQ.md @@ -4,4 +4,5 @@ LFU Cache is a data structure that stores key-value pairs. It has a fixed size a Visit the following resources to learn more: +- [@article@Least Frequently Used (LFU) Cache Implementation](https://www.geeksforgeeks.org/least-frequently-used-lfu-cache-implementation/) - [@article@1117. Data Structure - LFU Cache](https://jojozhuang.github.io/algorithm/data-structure-lfu-cache/) diff --git a/src/data/roadmaps/computer-science/content/linear@jymhjv8GiFALQpox6aZeu.md b/src/data/roadmaps/computer-science/content/linear@jymhjv8GiFALQpox6aZeu.md index 481f30045..d43646ff1 100644 --- a/src/data/roadmaps/computer-science/content/linear@jymhjv8GiFALQpox6aZeu.md +++ b/src/data/roadmaps/computer-science/content/linear@jymhjv8GiFALQpox6aZeu.md @@ -4,5 +4,6 @@ Linear algorithms are algorithms that have a runtime that is directly proportion Visit the following resources to learn more: +- [@article@Linear Search Algorithm](https://www.geeksforgeeks.org/linear-search/) - [@video@Big O Notation — Calculating Time Complexity](https://www.youtube.com/watch?v=Z0bH0cMY0E8) - [@video@Big O Notations](https://www.youtube.com/watch?v=V6mKVRU1evU) diff --git a/src/data/roadmaps/computer-science/content/little-endian@rD_5n5bjiNMVC0cPhEVyG.md b/src/data/roadmaps/computer-science/content/little-endian@rD_5n5bjiNMVC0cPhEVyG.md index e55a54e11..f6fef937e 100644 --- a/src/data/roadmaps/computer-science/content/little-endian@rD_5n5bjiNMVC0cPhEVyG.md +++ b/src/data/roadmaps/computer-science/content/little-endian@rD_5n5bjiNMVC0cPhEVyG.md @@ -4,5 +4,5 @@ Little Endian is a way of storing data in memory. It is the opposite of Big Endi Visit the following resources to learn more: -- [@video@Big Endian vs Little Endian.mp4](https://www.youtube.com/watch?v=JrNF0KRAlyo) +- [@video@Big Endian vs Little Endian](https://www.youtube.com/watch?v=JrNF0KRAlyo) - [@video@Endianness Explained With an Egg - Computerphile](https://www.youtube.com/watch?v=NcaiHcBvDR4) diff --git a/src/data/roadmaps/computer-science/content/load-balancing@xDiS0HmrEoPjkQg9x2O3o.md b/src/data/roadmaps/computer-science/content/load-balancing@xDiS0HmrEoPjkQg9x2O3o.md index d1d40bc51..0d38adaeb 100644 --- a/src/data/roadmaps/computer-science/content/load-balancing@xDiS0HmrEoPjkQg9x2O3o.md +++ b/src/data/roadmaps/computer-science/content/load-balancing@xDiS0HmrEoPjkQg9x2O3o.md @@ -4,5 +4,6 @@ Load balancing is the process of distributing network or application traffic acr Visit the following resources to learn more: +- [@article@What is Load Balancing? | How load balancers work](https://www.cloudflare.com/learning/performance/what-is-load-balancing/) - [@video@Load Balancers 101](https://www.youtube.com/watch?v=galcDRNd5Ow) - [@video@What is Load Balancing?](https://www.youtube.com/watch?v=gGLophKzJs8) diff --git a/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md b/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md index e1ef4851c..0f4bc832d 100644 --- a/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md +++ b/src/data/roadmaps/computer-science/content/np-complete@Lwkz7qozXRlVNA20zJbSw.md @@ -7,9 +7,6 @@ Visit the following resources to learn more: - [@article@Trying to understand P vs NP vs NP Complete vs NP Hard](https://softwareengineering.stackexchange.com/questions/308178/trying-to-understand-p-vs-np-vs-np-complete-vs-np-hard) - [@video@Complexity: P, NP, NP-completeness, Reductions](https://www.youtube.com/watch?v=eHZifpgyH_4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=22) - [@video@P vs. NP and the Computational Complexity Zoo](https://www.youtube.com/watch?v=YX40hbAHx3s) -- [@video@Complexity: Approximation Algorithms](https://www.youtube.com/watch?v=MEz1J9wY2iM&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=24) -- [@video@Complexity: Fixed-Parameter Algorithms](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) -- [@video@Lecture 23: Computational Complexity](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=24) - [@video@Greedy Algs. II & Intro to NP Completeness](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939) - [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) - [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) diff --git a/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md b/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md index b74cc70dc..65f895aa8 100644 --- a/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md +++ b/src/data/roadmaps/computer-science/content/p@3aM17dPKNi8tRJsW8lesI.md @@ -10,6 +10,3 @@ Visit the following resources to learn more: - [@video@Complexity: Fixed-Parameter Algorithms](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) - [@video@Lecture 23: Computational Complexity](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=24) - [@video@Greedy Algs. II & Intro to NP Completeness](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939) -- [@video@NP Completeness II & Reductions](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) -- [@video@NP Completeness III](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) -- [@video@NP Completeness IV](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18) diff --git a/src/data/roadmaps/computer-science/content/pick-a-language@tU4Umtnfu01t9gLlnlK6b.md b/src/data/roadmaps/computer-science/content/pick-a-language@tU4Umtnfu01t9gLlnlK6b.md index d78c44888..5dc67553e 100644 --- a/src/data/roadmaps/computer-science/content/pick-a-language@tU4Umtnfu01t9gLlnlK6b.md +++ b/src/data/roadmaps/computer-science/content/pick-a-language@tU4Umtnfu01t9gLlnlK6b.md @@ -9,6 +9,7 @@ Given below is the list of resources; pick ones relevant to the language of your Visit the following resources to learn more: +- [@roadmap@Visit Dedicated C++ Roadmap](https://roadmap.sh/cpp) - [@article@Learn C++ - W3Schools](https://www.w3schools.com/cpp/) - [@article@Learn C++ - Tutorials Point](https://www.tutorialspoint.com/cplusplus/index.htm) - [@video@C++ Programming Course - Beginner to Advanced](https://www.youtube.com/watch?v=8jLOx1hD3_o) diff --git a/src/data/roadmaps/computer-science/content/post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md b/src/data/roadmaps/computer-science/content/post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md index 13f83bf69..267335c03 100644 --- a/src/data/roadmaps/computer-science/content/post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md +++ b/src/data/roadmaps/computer-science/content/post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md @@ -4,4 +4,5 @@ Post-order traversal is a type of tree traversal that visits the left subtree, t Visit the following resources to learn more: +- [@article@Postorder Traversal of Binary Tree](https://www.geeksforgeeks.org/postorder-traversal-of-binary-tree/) - [@video@Tree | Illustrated Data Structures](https://www.youtube.com/watch?v=S2W3SXGPVyU) diff --git a/src/data/roadmaps/computer-science/content/process-forking@RbdT5MOE4L-E7PPWKRITX.md b/src/data/roadmaps/computer-science/content/process-forking@RbdT5MOE4L-E7PPWKRITX.md index e5ac26f79..f5e2577d2 100644 --- a/src/data/roadmaps/computer-science/content/process-forking@RbdT5MOE4L-E7PPWKRITX.md +++ b/src/data/roadmaps/computer-science/content/process-forking@RbdT5MOE4L-E7PPWKRITX.md @@ -4,6 +4,7 @@ Process forking is a way to create a new process from an existing process. The n Visit the following resources to learn more: +- [@article@Fork System Call in Operating System](https://www.geeksforgeeks.org/fork-system-call-in-operating-system/) - [@video@Understanding fork() system call for new process creation](https://www.youtube.com/watch?v=PwxTbksJ2fo) - [@video@fork() and exec() System Calls](https://www.youtube.com/watch?v=IFEFVXvjiHY) - [@video@The fork() function in C](https://www.youtube.com/watch?v=cex9XrZCU14) diff --git a/src/data/roadmaps/computer-science/content/proxy@qLLJ_ehC8tSRfXsorYMQz.md b/src/data/roadmaps/computer-science/content/proxy@qLLJ_ehC8tSRfXsorYMQz.md index 96303d8ca..c97708919 100644 --- a/src/data/roadmaps/computer-science/content/proxy@qLLJ_ehC8tSRfXsorYMQz.md +++ b/src/data/roadmaps/computer-science/content/proxy@qLLJ_ehC8tSRfXsorYMQz.md @@ -4,5 +4,5 @@ A proxy server is an intermediary piece of hardware/software sitting between the Visit the following resources to learn more: -- [@article@Proxy - System Design](https://dev.to/karanpratapsingh/system-design-the-complete-course-10fo#proxy) - [@roadmap.sh@Proxy Servers](https://roadmap.sh/guides/proxy-servers) +- [@article@Proxy - System Design](https://dev.to/karanpratapsingh/system-design-the-complete-course-10fo#proxy) diff --git a/src/data/roadmaps/computer-science/content/queue@JI990pDX2jjNe6IH_Y_t0.md b/src/data/roadmaps/computer-science/content/queue@JI990pDX2jjNe6IH_Y_t0.md index 427f28809..21f38545e 100644 --- a/src/data/roadmaps/computer-science/content/queue@JI990pDX2jjNe6IH_Y_t0.md +++ b/src/data/roadmaps/computer-science/content/queue@JI990pDX2jjNe6IH_Y_t0.md @@ -4,7 +4,7 @@ Queue is a linear collection of items where items are inserted and removed in a Visit the following resources to learn more: +- [@article@Circular Buffer - Wikipedia](https://en.wikipedia.org/wiki/Circular_buffer) - [@video@Queue Data Structure | Illustrated Data Structures](https://www.youtube.com/watch?v=mDCi1lXd9hc) - [@video@Queue in 3 Minutes](https://www.youtube.com/watch?v=D6gu-_tmEpQ) - [@course@Queues - Coursera](https://www.coursera.org/lecture/data-structures/queues-EShpq) -- [@article@Circular Buffer - Wikipedia](https://en.wikipedia.org/wiki/Circular_buffer) diff --git a/src/data/roadmaps/computer-science/content/registers-and-ram@U3379F4AO1KSmGtVmPr27.md b/src/data/roadmaps/computer-science/content/registers-and-ram@U3379F4AO1KSmGtVmPr27.md index cc100f12e..8d17e9ac7 100644 --- a/src/data/roadmaps/computer-science/content/registers-and-ram@U3379F4AO1KSmGtVmPr27.md +++ b/src/data/roadmaps/computer-science/content/registers-and-ram@U3379F4AO1KSmGtVmPr27.md @@ -5,8 +5,8 @@ Registers are the high-speed accessible storage elements. The processor accesses the registers within one CPU clock cycle. The processor can decode the instructions and perform operations on the register contents at more than one operation per CPU clock cycle. **_Memory_** is a hardware device that stores computer programs, instructions, and data. The memory that is internal to the processor is primary memory (RAM), and the memory that is external to the processor is secondary (**Hard Drive**). -Primary memory or RAM is a volatile memory, meaning the primary memory data exist when the system's power is on, and the data vanishes as the system is switched off. The primary memory contains the data required by the currently executing program in the CPU. If the data required by the processor is not in primary memory, then the data is transferred from secondary storage to primary memory, and then it is fetched by the processor. Visit the following resources to learn more: +- [@article@RAM vs. Registers - What's the Difference?](https://thisvsthat.io/ram-vs-registers) - [@video@Registers and RAM](https://youtu.be/fpnE6UAfbtU) diff --git a/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md b/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md index b3a9e16b3..df733f8ad 100644 --- a/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md +++ b/src/data/roadmaps/computer-science/content/rust@1bDjg-KBDKRmE6f1MWY8l.md @@ -5,8 +5,8 @@ Rust is a modern systems programming language focusing on safety, speed, and con Visit the following resources to learn more: - [@roadmap@Visit Dedicated Rust Roadmap](https://roadmap.sh/rust) -- [@article@The Rust Programming Language - online book](https://doc.rust-lang.org/book/) -- [@article@Rust by Example - collection of runnable examples](https://doc.rust-lang.org/stable/rust-by-example/index.html) +- [@official@The Rust Programming Language - online book](https://doc.rust-lang.org/book/) +- [@official@Rust by Example - collection of runnable examples](https://doc.rust-lang.org/stable/rust-by-example/index.html) - [@article@Rust vs. Go: Why They’re Better Together](https://thenewstack.io/rust-vs-go-why-theyre-better-together/) - [@article@Rust by the Numbers: The Rust Programming Language in 2021](https://thenewstack.io/rust-by-the-numbers-the-rust-programming-language-in-2021/) - [@feed@Explore top posts about Rust](https://app.daily.dev/tags/rust?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md b/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md index 35a026358..82e991ebf 100644 --- a/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md +++ b/src/data/roadmaps/computer-science/content/scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md @@ -13,3 +13,7 @@ Here is the list of some of the most commonly used scheduling algorithms: - **Multi-level Feedback Queue Scheduling:** The processes are divided into different queues based on their priority. The process with the highest priority is allocated the CPU first. If a process is preempted, it is moved to the next queue. It is a preemptive algorithm. - **Highest Response Ratio Next(HRRN):** CPU is allotted to the next process which has the highest response ratio and not to the process having less burst time. It is a Non-Preemptive algorithm. - **Lottery Scheduling:** The process is allocated the CPU based on a lottery system. It is a preemptive algorithm. + +Visit the following resources to learn more: + +- [@article@CPU Scheduling in Operating System](https://www.scaler.com/topics/operating-system/cpu-scheduling/) \ No newline at end of file diff --git a/src/data/roadmaps/computer-science/content/search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md b/src/data/roadmaps/computer-science/content/search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md index 3b017c9fc..52687f2c9 100644 --- a/src/data/roadmaps/computer-science/content/search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md +++ b/src/data/roadmaps/computer-science/content/search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md @@ -4,4 +4,5 @@ Searching pattern in text is a very common task in computer science. It is used Visit the following resources to learn more: +- [@article@Pattern Searching](https://www.geeksforgeeks.org/pattern-searching/) - [@course@Search Pattern in Text](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text) diff --git a/src/data/roadmaps/computer-science/content/selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md b/src/data/roadmaps/computer-science/content/selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md index 441964d9f..1fd353bf3 100644 --- a/src/data/roadmaps/computer-science/content/selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md +++ b/src/data/roadmaps/computer-science/content/selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md @@ -4,5 +4,6 @@ Selection sort is a sorting algorithm that selects the smallest unsorted item in Visit the following resources to learn more: +- [@article@Selection Sort](https://en.wikipedia.org/wiki/Selection_sort) - [@video@Selection Sort in 3 Minutes](https://www.youtube.com/watch?v=g-PGLbMth_g) - [@course@Selection Sort](https://www.coursera.org/lecture/algorithms-part1/selection-UQxFT) diff --git a/src/data/roadmaps/computer-science/content/skip-lists@K96ggeWqd5OwoNnkL04pc.md b/src/data/roadmaps/computer-science/content/skip-lists@K96ggeWqd5OwoNnkL04pc.md index e948c7f0d..4e88ed43a 100644 --- a/src/data/roadmaps/computer-science/content/skip-lists@K96ggeWqd5OwoNnkL04pc.md +++ b/src/data/roadmaps/computer-science/content/skip-lists@K96ggeWqd5OwoNnkL04pc.md @@ -4,5 +4,5 @@ Skip lists are a data structure that allows you to perform operations on a sorte Visit the following resources to learn more: +- [@article@Skip Lists](https://en.wikipedia.org/wiki/Skip_list) - [@video@Randomization: Skip Lists](https://www.youtube.com/watch?v=2g9OSRKJuzM&index=10&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) -- [@article@Skip Lists - Wikipedia](https://en.wikipedia.org/wiki/Skip_list) diff --git a/src/data/roadmaps/computer-science/content/string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md b/src/data/roadmaps/computer-science/content/string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md index 820604858..531d5ab74 100644 --- a/src/data/roadmaps/computer-science/content/string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md +++ b/src/data/roadmaps/computer-science/content/string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md @@ -4,4 +4,4 @@ String search and manipulation is a very important topic in computer science. It Visit the following resources to learn more: -- [@article@String-searching algorithm](https://en.wikipedia.org/wiki/String-searching_algorithm) +- [@article@String-searching Algorithm](https://en.wikipedia.org/wiki/String-searching_algorithm) diff --git a/src/data/roadmaps/computer-science/content/suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md b/src/data/roadmaps/computer-science/content/suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md index 2f1a526dd..f4eddd96c 100644 --- a/src/data/roadmaps/computer-science/content/suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md +++ b/src/data/roadmaps/computer-science/content/suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md @@ -4,7 +4,8 @@ Suffix arrays are a data structure that allows us to quickly find all the suffix Visit the following resources to learn more: -- [@video@Suffix array introduction](https://www.youtube.com/watch?v=zqKlL3ZpTqs) +- [@article@Suffix Arrays - Princeton University](https://algs4.cs.princeton.edu/63suffix/) +- [@video@Suffix Array Introduction](https://www.youtube.com/watch?v=zqKlL3ZpTqs) - [@video@Advanced Data Structures: Suffix Arrays](https://www.youtube.com/watch?v=IzMxbboPcqQ) -- [@video@Suffix arrays: building](https://www.youtube.com/watch?v=ZWlbhBjjwyA) +- [@video@Suffix Arrays: building](https://www.youtube.com/watch?v=ZWlbhBjjwyA) - [@course@Suffix Arrays - Coursera](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays) diff --git a/src/data/roadmaps/computer-science/content/system-design@w-fvEiSJysywR3AOAB0ve.md b/src/data/roadmaps/computer-science/content/system-design@w-fvEiSJysywR3AOAB0ve.md index 89e52aba7..51110c2a4 100644 --- a/src/data/roadmaps/computer-science/content/system-design@w-fvEiSJysywR3AOAB0ve.md +++ b/src/data/roadmaps/computer-science/content/system-design@w-fvEiSJysywR3AOAB0ve.md @@ -5,8 +5,8 @@ System design is the process of defining the architecture, modules, interfaces, Visit the following resources to learn more: - [@opensource@System Design Primer](https://github.com/donnemartin/system-design-primer) -- [@article@System Design: The complete course](https://dev.to/karanpratapsingh/system-design-the-complete-course-10fo) +- [@article@System Design: The Complete Course](https://dev.to/karanpratapsingh/system-design-the-complete-course-10fo) - [@video@System Design 101](https://www.youtube.com/watch?v=Y-Gl4HEyeUQ) - [@video@Scaling the Unscalable](https://www.youtube.com/watch?v=a2rcgzludDU) -- [@video@System design interview: Scale to 1 million users](https://www.youtube.com/watch?v=YkGHxOg9d3M) +- [@video@System Design interview: Scale to 1 million users](https://www.youtube.com/watch?v=YkGHxOg9d3M) - [@feed@Explore top posts about Career](https://app.daily.dev/tags/career?ref=roadmapsh) diff --git a/src/data/roadmaps/computer-science/content/the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md b/src/data/roadmaps/computer-science/content/the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md index a0c7c5f5c..9d4bf08f5 100644 --- a/src/data/roadmaps/computer-science/content/the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md +++ b/src/data/roadmaps/computer-science/content/the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md @@ -5,5 +5,5 @@ Knight's Tour Problem is a problem where we have to find a path for a knight to Visit the following resources to learn more: - [@article@Knights Tour](https://bradfieldcs.com/algos/graphs/knights-tour/) -- [@article@Knights Tour Proble](https://www.codesdope.com/course/algorithms-knights-tour-problem/) +- [@article@Knights Tour Problem](https://www.codesdope.com/course/algorithms-knights-tour-problem/) - [@article@Backtracking: The Knight’s Tour Problem](https://www.codingninjas.com/codestudio/library/backtracking-the-knights-tour-problem) diff --git a/src/data/roadmaps/computer-science/content/tls--https@3pu2bGhoCLFIs6kNanwtz.md b/src/data/roadmaps/computer-science/content/tls--https@3pu2bGhoCLFIs6kNanwtz.md index 37362b58a..9d5f3cdcf 100644 --- a/src/data/roadmaps/computer-science/content/tls--https@3pu2bGhoCLFIs6kNanwtz.md +++ b/src/data/roadmaps/computer-science/content/tls--https@3pu2bGhoCLFIs6kNanwtz.md @@ -4,5 +4,7 @@ TLS (Transport Layer Security) is a cryptographic protocol that provides privacy Visit the following resources to learn more: +- [@article@What is TLS & How Does it Work? - Internet Society](https://www.internetsociety.org/deploy360/tls/basics/) +- [@article@What is TLS (Transport Layer Security)? - Cloudflare](https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/) - [@video@SSL and HTTPS](https://www.youtube.com/watch?v=S2iBR2ZlZf0) - [@video@SSL/TLS - Cristina Formaini](https://www.youtube.com/watch?v=Rp3iZUvXWlM) diff --git a/src/data/roadmaps/computer-science/content/transactions@KhvYJtSCUBOpEZXjHpQde.md b/src/data/roadmaps/computer-science/content/transactions@KhvYJtSCUBOpEZXjHpQde.md index b7868df1a..ed0453f85 100644 --- a/src/data/roadmaps/computer-science/content/transactions@KhvYJtSCUBOpEZXjHpQde.md +++ b/src/data/roadmaps/computer-science/content/transactions@KhvYJtSCUBOpEZXjHpQde.md @@ -5,3 +5,4 @@ In short, a database transaction is a sequence of multiple operations performed Visit the following resources to learn more: - [@article@What are Transactions?](https://fauna.com/blog/database-transaction) +- [@article@Database Transaction](https://en.wikipedia.org/wiki/Database_transaction) \ No newline at end of file diff --git a/src/data/roadmaps/computer-science/content/travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md b/src/data/roadmaps/computer-science/content/travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md index b285e580c..1534aef62 100644 --- a/src/data/roadmaps/computer-science/content/travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md +++ b/src/data/roadmaps/computer-science/content/travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md @@ -4,6 +4,7 @@ The Travelling Salesman Problem (TSP) is a classic problem in computer science. Visit the following resources to learn more: +- [@article@Traveling Salesman Problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) - [@video@What is the Traveling Salesman Problem?](https://www.youtube.com/watch?v=1pmBjIZ20pE) - [@video@4.7 Traveling Salesperson Problem - Dynamic Programming](https://www.youtube.com/watch?v=XaXsJJh-Q5Y) - [@video@Traveling Salesman Problem | Dynamic Programming | Graph Theory](https://www.youtube.com/watch?v=cY4HiiFHO1o) diff --git a/src/data/roadmaps/computer-science/content/tree@_eWqiWUmOj0zUo_Ix3j1O.md b/src/data/roadmaps/computer-science/content/tree@_eWqiWUmOj0zUo_Ix3j1O.md index 225cca4a5..8684a4809 100644 --- a/src/data/roadmaps/computer-science/content/tree@_eWqiWUmOj0zUo_Ix3j1O.md +++ b/src/data/roadmaps/computer-science/content/tree@_eWqiWUmOj0zUo_Ix3j1O.md @@ -4,4 +4,5 @@ A tree is non-linear and a hierarchical data structure consisting of a collectio Visit the following resources to learn more: +- [@article@Tree Data Structure](https://www.programiz.com/dsa/trees) - [@video@Tree | Illustrated Data Structures](https://www.youtube.com/watch?v=S2W3SXGPVyU) diff --git a/src/data/roadmaps/computer-science/content/unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md b/src/data/roadmaps/computer-science/content/unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md index 8604ea7ed..29c888f55 100644 --- a/src/data/roadmaps/computer-science/content/unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md +++ b/src/data/roadmaps/computer-science/content/unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md @@ -4,4 +4,5 @@ An unbalanced binary tree is one that is not balanced. Visit the following resources to learn more: -- [@article@Balanced Binary Tree](https://www.programiz.com/dsa/balanced-binary-tree) +- [@article@Balanced vs Unbalanced Binary Tree](https://stackoverflow.com/questions/59206128/balanced-vs-unbalanced-binary-tree-clarification-needed) +- [@article@Unbalanced Binary Tree](https://eng.libretexts.org/Bookshelves/Computer_Science/Databases_and_Data_Structures/Open_Data_Structures_-_An_Introduction_(Morin)/06%3A_Binary_Trees/6.02%3A_BinarySearchTree_-_An_Unbalanced_Binary_Search_Treee) From ca30955e9fcf8c8f65ff6d8e907ff8603c1d3998 Mon Sep 17 00:00:00 2001 From: Vedansh Date: Thu, 1 May 2025 17:59:47 +0530 Subject: [PATCH 30/31] Adjust few topics in CyberSecurity roadmap (#8537) --- .../content/hackthebox@wkuE_cChPZT2MHyGjUuU4.md | 2 +- .../cyber-security/content/hashing@0UZmAECMnfioi-VeXcvg8.md | 4 +++- .../cyber-security/content/hips@l5EnhOCnkN-RKvgrS9ylH.md | 1 + .../cyber-security/content/hping@Cclbt4bNfkHwFwZOvJuLK.md | 2 +- .../content/http--https@3Awm221OJHxXNLiL9yxfd.md | 2 +- .../content/hypervisor@CIoLaRv5I3sCr9tBnZHEi.md | 6 ------ .../cyber-security/content/icloud@E7yfALgu9E2auOYDOTmex.md | 2 +- .../cyber-security/content/icloud@Wqy6ki13hP5c0VhGYEhHj.md | 2 +- .../cyber-security/content/ip@FdoqB2---uDAyz6xZjk_u.md | 3 ++- .../cyber-security/content/iso@oRssaVG-K-JwlL6TAHhXw.md | 2 +- .../content/javascript@2SThr6mHpX6rpW-gmsqxG.md | 2 +- .../content/joe-sandbox@h__KxKa0Q74_egY7GOe-L.md | 2 +- .../content/jump-server@UF3BV1sEEOrqh5ilnfM1B.md | 4 ++-- .../content/kali-linux@w6wXkoLrv0_d-Ah0txUHd.md | 2 ++ .../content/known-vs-unknown@HPlPGKs7NLqmBidHJkOZg.md | 2 ++ 15 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/data/roadmaps/cyber-security/content/hackthebox@wkuE_cChPZT2MHyGjUuU4.md b/src/data/roadmaps/cyber-security/content/hackthebox@wkuE_cChPZT2MHyGjUuU4.md index b72d899cd..c25d56871 100644 --- a/src/data/roadmaps/cyber-security/content/hackthebox@wkuE_cChPZT2MHyGjUuU4.md +++ b/src/data/roadmaps/cyber-security/content/hackthebox@wkuE_cChPZT2MHyGjUuU4.md @@ -4,5 +4,5 @@ Hack The Box (HTB) is a popular online platform designed for security enthusiast Learn more from the following resources: -- [@official@Hack The Box Website](https://www.hackthebox.com/) +- [@official@Hack The Box](https://www.hackthebox.com/) - [@video@I played HTB for 30 days, heres what I learnt](https://www.youtube.com/watch?v=bPv5pb7AcYs) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/hashing@0UZmAECMnfioi-VeXcvg8.md b/src/data/roadmaps/cyber-security/content/hashing@0UZmAECMnfioi-VeXcvg8.md index bd40506ed..2d338f146 100644 --- a/src/data/roadmaps/cyber-security/content/hashing@0UZmAECMnfioi-VeXcvg8.md +++ b/src/data/roadmaps/cyber-security/content/hashing@0UZmAECMnfioi-VeXcvg8.md @@ -5,4 +5,6 @@ Hashing is a cryptographic process that converts input data of any size into a f Learn more from the following resources: - [@video@Hashing Explained](https://www.youtube.com/watch?v=EOe1XUykdP4) -- [@article@What is hashing and how does it work?](https://www.techtarget.com/searchdatamanagement/definition/hashing) \ No newline at end of file +- [@article@What is hashing and how does it work?](https://www.techtarget.com/searchdatamanagement/definition/hashing) +- [@article@Hashing Algorithm Overview: Types, Methodologies & Usage](https://www.okta.com/identity-101/hashing-algorithms/) +- [@article@Understanding Cryptography Types:](https://geekflare.com/cybersecurity/cryptography-types/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/hips@l5EnhOCnkN-RKvgrS9ylH.md b/src/data/roadmaps/cyber-security/content/hips@l5EnhOCnkN-RKvgrS9ylH.md index 4a3bd13cd..0850c34b6 100644 --- a/src/data/roadmaps/cyber-security/content/hips@l5EnhOCnkN-RKvgrS9ylH.md +++ b/src/data/roadmaps/cyber-security/content/hips@l5EnhOCnkN-RKvgrS9ylH.md @@ -5,5 +5,6 @@ A Host Intrusion Prevention System (HIPS) is a security solution designed to mon HIPS operates at the host level, providing a last line of defense by securing the individual endpoints within a network. It is capable of preventing a wide range of attacks, including zero-day exploits, malware infections, unauthorized access attempts, and policy violations. Visit the following resources to learn more: + - [@article@What is an Intrusion Prevention System?](https://www.paloaltonetworks.com/cyberpedia/what-is-an-intrusion-prevention-system-ips) - [@article@What is Host intrusion prevention system (HIPS)?](https://cyberpedia.reasonlabs.com/EN/host%20intrusion%20prevention%20system%20(hips).html) diff --git a/src/data/roadmaps/cyber-security/content/hping@Cclbt4bNfkHwFwZOvJuLK.md b/src/data/roadmaps/cyber-security/content/hping@Cclbt4bNfkHwFwZOvJuLK.md index 519ef41d0..ce86ce535 100644 --- a/src/data/roadmaps/cyber-security/content/hping@Cclbt4bNfkHwFwZOvJuLK.md +++ b/src/data/roadmaps/cyber-security/content/hping@Cclbt4bNfkHwFwZOvJuLK.md @@ -4,5 +4,5 @@ hping is a versatile and powerful command-line based packet crafting tool that a Learn more from the following resources: -- [@official@hping source code](https://salsa.debian.org/debian/hping3) +- [@official@hping](https://salsa.debian.org/debian/hping3) - [@article@What is hping?](https://www.okta.com/uk/identity-101/hping/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/http--https@3Awm221OJHxXNLiL9yxfd.md b/src/data/roadmaps/cyber-security/content/http--https@3Awm221OJHxXNLiL9yxfd.md index ba8c91a8d..5412a5823 100644 --- a/src/data/roadmaps/cyber-security/content/http--https@3Awm221OJHxXNLiL9yxfd.md +++ b/src/data/roadmaps/cyber-security/content/http--https@3Awm221OJHxXNLiL9yxfd.md @@ -4,5 +4,5 @@ HTTP (Hypertext Transfer Protocol) and HTTPS (HTTP Secure) are fundamental proto Learn more from the following resources: -- [@article@An overview of HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview) +- [@article@An Overview of HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview) - [@article@What is HTTPS?](https://www.cloudflare.com/en-gb/learning/ssl/what-is-https/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/hypervisor@CIoLaRv5I3sCr9tBnZHEi.md b/src/data/roadmaps/cyber-security/content/hypervisor@CIoLaRv5I3sCr9tBnZHEi.md index d553e7aac..364e153ba 100644 --- a/src/data/roadmaps/cyber-security/content/hypervisor@CIoLaRv5I3sCr9tBnZHEi.md +++ b/src/data/roadmaps/cyber-security/content/hypervisor@CIoLaRv5I3sCr9tBnZHEi.md @@ -2,12 +2,6 @@ A hypervisor, also known as a virtual machine monitor (VMM), is software or firmware that enables the creation and management of virtual machines (VMs) by abstracting the underlying hardware. It allows multiple VMs to run on a single physical machine, each operating independently with its own operating system and applications. Hypervisors facilitate better resource utilization by allowing a physical server to host several virtual environments, optimizing hardware efficiency. -There are two types of hypervisors: -- **Type 1 hypervisor**, or bare-metal hypervisor, runs directly on the physical hardware without a host operating system. It provides better performance and is commonly used in enterprise environments. Examples include VMware ESXi and Microsoft Hyper-V. -- **Type 2 hypervisor** runs on top of an existing operating system, relying on the host OS for resource management. These are typically used for personal or development purposes, with examples like VMware Workstation and Oracle VirtualBox. - -Hypervisors are fundamental in cloud computing, virtualization, and server consolidation, allowing for flexible and efficient resource management and isolation between virtual environments. - Learn more from the following resources: - [@article@What is a hypervisor?](https://www.redhat.com/en/topics/virtualization/what-is-a-hypervisor) diff --git a/src/data/roadmaps/cyber-security/content/icloud@E7yfALgu9E2auOYDOTmex.md b/src/data/roadmaps/cyber-security/content/icloud@E7yfALgu9E2auOYDOTmex.md index 50bf40a73..5c694926f 100644 --- a/src/data/roadmaps/cyber-security/content/icloud@E7yfALgu9E2auOYDOTmex.md +++ b/src/data/roadmaps/cyber-security/content/icloud@E7yfALgu9E2auOYDOTmex.md @@ -4,4 +4,4 @@ iCloud is a cloud storage and cloud computing service provided by Apple Inc. It Learn more from the following resources: -- [@official@iCloud Website](https://www.icloud.com/) \ No newline at end of file +- [@official@iCloud](https://www.icloud.com/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/icloud@Wqy6ki13hP5c0VhGYEhHj.md b/src/data/roadmaps/cyber-security/content/icloud@Wqy6ki13hP5c0VhGYEhHj.md index 50bf40a73..5c694926f 100644 --- a/src/data/roadmaps/cyber-security/content/icloud@Wqy6ki13hP5c0VhGYEhHj.md +++ b/src/data/roadmaps/cyber-security/content/icloud@Wqy6ki13hP5c0VhGYEhHj.md @@ -4,4 +4,4 @@ iCloud is a cloud storage and cloud computing service provided by Apple Inc. It Learn more from the following resources: -- [@official@iCloud Website](https://www.icloud.com/) \ No newline at end of file +- [@official@iCloud](https://www.icloud.com/) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/ip@FdoqB2---uDAyz6xZjk_u.md b/src/data/roadmaps/cyber-security/content/ip@FdoqB2---uDAyz6xZjk_u.md index de3d9aaeb..cc659f698 100644 --- a/src/data/roadmaps/cyber-security/content/ip@FdoqB2---uDAyz6xZjk_u.md +++ b/src/data/roadmaps/cyber-security/content/ip@FdoqB2---uDAyz6xZjk_u.md @@ -4,5 +4,6 @@ IP, or Internet Protocol, is a fundamental concept in cybersecurity that refers Learn more from the following resources: -- [@article@What is an IP address and what does it mean?](https://www.kaspersky.com/resource-center/definitions/what-is-an-ip-address) +- [@website@Check Your IP Address](https://ipleak.net) +- [@article@What is an IP Address and What does it mean?](https://www.kaspersky.com/resource-center/definitions/what-is-an-ip-address) - [@video@Whats an IP address?](https://www.youtube.com/watch?v=6is6Gulh7qE) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/iso@oRssaVG-K-JwlL6TAHhXw.md b/src/data/roadmaps/cyber-security/content/iso@oRssaVG-K-JwlL6TAHhXw.md index 491ce8307..15f9b307f 100644 --- a/src/data/roadmaps/cyber-security/content/iso@oRssaVG-K-JwlL6TAHhXw.md +++ b/src/data/roadmaps/cyber-security/content/iso@oRssaVG-K-JwlL6TAHhXw.md @@ -4,5 +4,5 @@ The International Organization for Standardization (ISO) is an international sta Learn more from the following resources: -- [@official@ISO Website](https://www.iso.org/home.html) +- [@official@International Organization for Standardization](https://www.iso.org/home.html) - [@article@What is the ISO?](https://www.techtarget.com/searchdatacenter/definition/ISO#:~:text=ISO%20(International%20Organization%20for%20Standardization)%20is%20a%20worldwide,federation%20of%20national%20standards%20bodies.) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/javascript@2SThr6mHpX6rpW-gmsqxG.md b/src/data/roadmaps/cyber-security/content/javascript@2SThr6mHpX6rpW-gmsqxG.md index 4985a7eaf..6049d2537 100644 --- a/src/data/roadmaps/cyber-security/content/javascript@2SThr6mHpX6rpW-gmsqxG.md +++ b/src/data/roadmaps/cyber-security/content/javascript@2SThr6mHpX6rpW-gmsqxG.md @@ -4,6 +4,6 @@ JavaScript (often abbreviated as JS) is a widely-used, high-level programming la Learn more from the following resources: -- [@roadmap@JavaScript Roadmap](https://roadmap.sh/javascript) +- [@roadmap@Visit Dedicated JavaScript Roadmap](https://roadmap.sh/javascript) - [@article@What is JavaScript?](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript) - [@video@100 JavaScript concepts you need to know](https://www.youtube.com/watch?v=lkIFF4maKMU) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/joe-sandbox@h__KxKa0Q74_egY7GOe-L.md b/src/data/roadmaps/cyber-security/content/joe-sandbox@h__KxKa0Q74_egY7GOe-L.md index b1f6448a4..937a3d631 100644 --- a/src/data/roadmaps/cyber-security/content/joe-sandbox@h__KxKa0Q74_egY7GOe-L.md +++ b/src/data/roadmaps/cyber-security/content/joe-sandbox@h__KxKa0Q74_egY7GOe-L.md @@ -4,5 +4,5 @@ Joe Sandbox is an advanced malware analysis platform that allows security profes Learn more from the following resources: -- [@official@Joe Sandbox Website](https://www.joesandbox.com/#windows) +- [@official@Joe Sandbox](https://www.joesandbox.com/#windows) - [@video@Cybersecurity Sandbox for Security Analysts](https://www.youtube.com/watch?v=FJGmRzY1igY) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/jump-server@UF3BV1sEEOrqh5ilnfM1B.md b/src/data/roadmaps/cyber-security/content/jump-server@UF3BV1sEEOrqh5ilnfM1B.md index 1e5441992..23e131a93 100644 --- a/src/data/roadmaps/cyber-security/content/jump-server@UF3BV1sEEOrqh5ilnfM1B.md +++ b/src/data/roadmaps/cyber-security/content/jump-server@UF3BV1sEEOrqh5ilnfM1B.md @@ -4,5 +4,5 @@ A **jump server**, also known as a **bastion host** or **jump host**, is a criti Learn more from the following resources: -- [@article@What is a jump server?](https://www.ssh.com/academy/iam/jump-server) -- [@video@What is a bastion host and why is it so important?](https://www.youtube.com/watch?v=pI6glWVEkcY) \ No newline at end of file +- [@article@What is a Jump Server?](https://www.ssh.com/academy/iam/jump-server) +- [@video@What is a Bastion Host and Why is it so important?](https://www.youtube.com/watch?v=pI6glWVEkcY) \ No newline at end of file diff --git a/src/data/roadmaps/cyber-security/content/kali-linux@w6wXkoLrv0_d-Ah0txUHd.md b/src/data/roadmaps/cyber-security/content/kali-linux@w6wXkoLrv0_d-Ah0txUHd.md index f41dd7575..9a0e35941 100644 --- a/src/data/roadmaps/cyber-security/content/kali-linux@w6wXkoLrv0_d-Ah0txUHd.md +++ b/src/data/roadmaps/cyber-security/content/kali-linux@w6wXkoLrv0_d-Ah0txUHd.md @@ -5,3 +5,5 @@ Kali Linux is a specialized Linux distribution that is designed for penetration With over 600 pre-installed penetration-testing programs, Kali Linux offers tools for various security-related tasks, such as network analysis, vulnerability scanning, and forensic analysis. Its development is overseen by Offensive Security, a company known for their contributions to the field of information security. Kali Linux is highly customizable, allowing users to tailor the system to their specific needs, and supports a wide range of hardware platforms. It is a powerful resource for professionals in the cybersecurity field, as well as for those who are passionate about learning and practicing ethical hacking techniques. - [@official@Kali Linux](https://www.kali.org/) +- [@official@Kali Tools](https://www.kali.org/tools) +- [@official@Kali Docs](https://www.kali.org/docs/) diff --git a/src/data/roadmaps/cyber-security/content/known-vs-unknown@HPlPGKs7NLqmBidHJkOZg.md b/src/data/roadmaps/cyber-security/content/known-vs-unknown@HPlPGKs7NLqmBidHJkOZg.md index 1462d9630..cb7fdfcf2 100644 --- a/src/data/roadmaps/cyber-security/content/known-vs-unknown@HPlPGKs7NLqmBidHJkOZg.md +++ b/src/data/roadmaps/cyber-security/content/known-vs-unknown@HPlPGKs7NLqmBidHJkOZg.md @@ -8,5 +8,7 @@ Learn more from the following resources: +- [@article@From Known to Unknown](https://securitysandman.com/2025/01/06/from-known-to-unknown-shifting-cybersecurity-to-proactive-ai-detection/) +- [@article@Catching all Threats - Known, Unknown, and Unknown Unknown](https://www.scworld.com/perspective/catching-all-threats-known-unknown-and-unknown-unknown-before-they-can-harm-you) - [@video@Detecting known threats](https://www.youtube.com/watch?v=hOaHDVMQ9_s) - [@video@How to deal with unknown threats](https://www.youtube.com/watch?v=CH4tX_MVLh0) \ No newline at end of file From 2ba3e64c1c7f6da5e29f7b19679989b791defec3 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Thu, 1 May 2025 22:30:50 +0100 Subject: [PATCH 31/31] Update ai agents roadmap links --- src/data/roadmaps/ai-agents/ai-agents.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/roadmaps/ai-agents/ai-agents.json b/src/data/roadmaps/ai-agents/ai-agents.json index 198303c54..a4b5b1297 100644 --- a/src/data/roadmaps/ai-agents/ai-agents.json +++ b/src/data/roadmaps/ai-agents/ai-agents.json @@ -721,7 +721,7 @@ "data": { "label": "Git and GitHub Roadmap", "style": { "fontSize": 17 }, - "href": "https://roadmap.sh/backend?r=backend-beginner", + "href": "https://roadmap.sh/git-github?r=git-github-beginner", "color": "#ffffff", "backgroundColor": "#4036d6", "oldId": "Ynvi5skgC85lgm96V_p42" @@ -745,7 +745,7 @@ "data": { "label": "API Design Roadmap", "style": { "fontSize": 17 }, - "href": "https://roadmap.sh/backend?r=backend-beginner", + "href": "https://roadmap.sh/api-design", "color": "#ffffff", "backgroundColor": "#4036d6" },