mirror of
https://github.com/MervinPraison/PraisonAI.git
synced 2026-11-08 17:31:00 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98874da689 | ||
|
|
6f019de05c | ||
|
|
a03d288e01 | ||
|
|
03c23021ab | ||
|
|
0178ec807e | ||
|
|
922362bd4c | ||
|
|
2e8b9cbf29 | ||
|
|
b79197b3a6 | ||
|
|
c056c3b65d | ||
|
|
965df5296f | ||
|
|
a8810cf4de | ||
|
|
4e50fab7f8 | ||
|
|
041feb6ec9 | ||
|
|
1fafaf8758 | ||
|
|
a056015b4b | ||
|
|
80e27a7cb7 | ||
|
|
ac59fcf65e | ||
|
|
a55db3f2c1 | ||
|
|
feafe6185d | ||
|
|
e052f4ab97 | ||
|
|
a8b94c8c8e | ||
|
|
d5270d5f13 | ||
|
|
9462b2409e | ||
|
|
5da1ba7387 | ||
|
|
7567145042 | ||
|
|
ca83ea5548 | ||
|
|
84e880ccdb | ||
|
|
d20247f628 | ||
|
|
9794047182 | ||
|
|
7292182a16 | ||
|
|
94f2f92577 | ||
|
|
f6ae1d2c5f | ||
|
|
cfe948e7ef | ||
|
|
3e18a5c591 | ||
|
|
498e6a4dbf | ||
|
|
5ff64d2c10 | ||
|
|
af5556a235 | ||
|
|
2d27264bab | ||
|
|
ed443583b2 | ||
|
|
54da62213a | ||
|
|
9efed5b4c7 | ||
|
|
f1cb5df3aa | ||
|
|
ab7d5cc5cc | ||
|
|
8b03c399f6 | ||
|
|
8ca1104850 | ||
|
|
952e59e07a | ||
|
|
370a51dc86 | ||
|
|
9757e3dea7 |
No files matched your search
+1
-1
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
|
||||
# Install Python packages (using latest versions)
|
||||
RUN pip install --no-cache-dir \
|
||||
flask \
|
||||
"praisonai>=2.2.37" \
|
||||
"praisonai>=2.2.39" \
|
||||
"praisonai[api]" \
|
||||
gunicorn \
|
||||
markdown
|
||||
|
||||
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
|
||||
# Install Python packages (using latest versions)
|
||||
RUN pip install --no-cache-dir \
|
||||
praisonai_tools \
|
||||
"praisonai>=2.2.37" \
|
||||
"praisonai>=2.2.39" \
|
||||
"praisonai[chat]" \
|
||||
"embedchain[github,youtube]"
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ RUN mkdir -p /root/.praison
|
||||
# Install Python packages (using latest versions)
|
||||
RUN pip install --no-cache-dir \
|
||||
praisonai_tools \
|
||||
"praisonai>=2.2.37" \
|
||||
"praisonai>=2.2.39" \
|
||||
"praisonai[ui]" \
|
||||
"praisonai[chat]" \
|
||||
"praisonai[realtime]" \
|
||||
|
||||
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
|
||||
# Install Python packages (using latest versions)
|
||||
RUN pip install --no-cache-dir \
|
||||
praisonai_tools \
|
||||
"praisonai>=2.2.37" \
|
||||
"praisonai>=2.2.39" \
|
||||
"praisonai[ui]" \
|
||||
"praisonai[crewai]"
|
||||
|
||||
|
||||
+2
-2
@@ -121,7 +121,7 @@ healthcheck:
|
||||
## 📦 Package Versions
|
||||
|
||||
All Docker images use consistent, up-to-date versions:
|
||||
- PraisonAI: `>=2.2.37`
|
||||
- PraisonAI: `>=2.2.39`
|
||||
- PraisonAI Agents: `>=0.0.92`
|
||||
- Python: `3.11-slim`
|
||||
|
||||
@@ -218,7 +218,7 @@ docker-compose up -d
|
||||
### Version Pinning
|
||||
To use specific versions, update the Dockerfile:
|
||||
```dockerfile
|
||||
RUN pip install "praisonai==2.2.37" "praisonaiagents==0.0.92"
|
||||
RUN pip install "praisonai==2.2.39" "praisonaiagents==0.0.92"
|
||||
```
|
||||
|
||||
## 🌐 Production Deployment
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,467 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "bLeMxwWimvzX"
|
||||
},
|
||||
"source": [
|
||||
"# Code Analysis Agent\n",
|
||||
"Learn how to create AI agents for comprehensive code analysis and quality assessment."
|
||||
],
|
||||
"id": "bLeMxwWimvzX"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
|
||||
"[](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/Code_Analysis_Agent.ipynb)\n"
|
||||
=======
|
||||
"[](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/code_analysis_agent.ipynb)\n"
|
||||
|
||||
],
|
||||
"metadata": {
|
||||
"id": "P3X8PXPyojnL"
|
||||
},
|
||||
"id": "P3X8PXPyojnL"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "xEs8bwWfmvza"
|
||||
},
|
||||
"source": [
|
||||
"## Dependencies\n",
|
||||
"Install the required packages."
|
||||
],
|
||||
"id": "xEs8bwWfmvza"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "_RPiU3j6mvzb"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonaiagents gitingest"
|
||||
],
|
||||
"id": "_RPiU3j6mvzb"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "81-orTkzmvzc"
|
||||
},
|
||||
"source": [
|
||||
"## Set API Key\n",
|
||||
"Set your OpenAI API key as an environment variable in your terminal:"
|
||||
],
|
||||
"id": "81-orTkzmvzc"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "84iL7rGimvzc"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"os.environ['OPENAI_API_KEY'] = 'your_api_key_here'"
|
||||
],
|
||||
"id": "84iL7rGimvzc"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "TV15GFsRmvzc"
|
||||
},
|
||||
"source": [
|
||||
"## Tools and Data Models\n",
|
||||
"Define the agent, task, and output schema."
|
||||
],
|
||||
"id": "TV15GFsRmvzc"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "0Wq_g0pNmvzd"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from praisonaiagents import Agent, Task, PraisonAIAgents\n",
|
||||
"from pydantic import BaseModel\n",
|
||||
"from typing import List, Dict\n",
|
||||
"from gitingest import ingest\n",
|
||||
"\n",
|
||||
"class CodeMetrics(BaseModel):\n",
|
||||
" category: str\n",
|
||||
" score: int\n",
|
||||
" findings: List[str]\n",
|
||||
"\n",
|
||||
"class CodeAnalysisReport(BaseModel):\n",
|
||||
" overall_quality: int\n",
|
||||
" code_metrics: List[CodeMetrics]\n",
|
||||
" architecture_score: int\n",
|
||||
" maintainability_score: int\n",
|
||||
" performance_score: int\n",
|
||||
" security_score: int\n",
|
||||
" test_coverage: int\n",
|
||||
" key_strengths: List[str]\n",
|
||||
" improvement_areas: List[str]\n",
|
||||
" tech_stack: List[str]\n",
|
||||
" recommendations: List[str]\n",
|
||||
" complexity_metrics: Dict[str, int]\n",
|
||||
" best_practices: List[Dict[str, str]]\n",
|
||||
" potential_risks: List[str]\n",
|
||||
" documentation_quality: int"
|
||||
],
|
||||
"id": "0Wq_g0pNmvzd"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "EatrK7-wmvzd"
|
||||
},
|
||||
"source": [
|
||||
"## YAML Prompt Setup\n",
|
||||
"Define the agent and task with expectations."
|
||||
],
|
||||
"id": "EatrK7-wmvzd"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "EdZNSOy-mvze"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"code_analyzer = Agent(\n",
|
||||
" role=\"Code Analysis Expert\",\n",
|
||||
" goal=\"Provide comprehensive code evaluation and recommendations\",\n",
|
||||
" backstory=\"\"\"Expert code analyst specializing in architecture review,\n",
|
||||
" best practices, and technical debt assessment.\"\"\",\n",
|
||||
" verbose=True\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"code_analysis_task = Task(\n",
|
||||
" description=\"\"\"Analyze code repository and provide structured evaluation:\n",
|
||||
"\n",
|
||||
" 1. Overall Quality (0-100)\n",
|
||||
" 2. Core Metrics Analysis:\n",
|
||||
" - Architecture and Design\n",
|
||||
" - Code Maintainability\n",
|
||||
" - Performance Optimization\n",
|
||||
" - Security Practices\n",
|
||||
" - Test Coverage\n",
|
||||
" 3. Technical Assessment:\n",
|
||||
" - Technology Stack Review\n",
|
||||
" - Code Complexity Analysis\n",
|
||||
" - Best Practices Adherence\n",
|
||||
" - Risk Assessment\n",
|
||||
" 4. Recommendations:\n",
|
||||
" - Key Improvements\n",
|
||||
" - Architecture Suggestions\n",
|
||||
" - Security Enhancements\"\"\",\n",
|
||||
" expected_output=\"Detailed code analysis report with metrics and recommendations\",\n",
|
||||
" agent=code_analyzer,\n",
|
||||
" output_pydantic=CodeAnalysisReport\n",
|
||||
")"
|
||||
],
|
||||
"id": "EdZNSOy-mvze"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "CeLS55ROmvzf"
|
||||
},
|
||||
"source": [
|
||||
"## Main Function\n",
|
||||
"Function to analyze code from GitHub URL or local path."
|
||||
],
|
||||
"id": "CeLS55ROmvzf"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "3Eo6LEOxmvzf"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def analyze_code(code_source: str) -> CodeAnalysisReport:\n",
|
||||
" \"\"\"\n",
|
||||
" Analyze code from directory path or GitHub URL\n",
|
||||
" \"\"\"\n",
|
||||
" # Ingest code content\n",
|
||||
" summary, tree, content = ingest(code_source)\n",
|
||||
"\n",
|
||||
" # Concatenate context into structured format\n",
|
||||
" context_text = f\"\"\"\n",
|
||||
" CODE REPOSITORY ANALYSIS\n",
|
||||
" =======================\n",
|
||||
"\n",
|
||||
" SUMMARY\n",
|
||||
" -------\n",
|
||||
" {summary}\n",
|
||||
"\n",
|
||||
" REPOSITORY STRUCTURE\n",
|
||||
" -------------------\n",
|
||||
" {tree}\n",
|
||||
"\n",
|
||||
" SOURCE CODE\n",
|
||||
" -----------\n",
|
||||
" {content}\n",
|
||||
" \"\"\"\n",
|
||||
"\n",
|
||||
" # Initialize and run analysis\n",
|
||||
" agents = PraisonAIAgents(\n",
|
||||
" agents=[code_analyzer],\n",
|
||||
" tasks=[code_analysis_task]\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" return agents.start(context_text)"
|
||||
],
|
||||
"id": "3Eo6LEOxmvzf"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "v25nLA0pmvzf"
|
||||
},
|
||||
"source": [
|
||||
"## Output\n",
|
||||
"Example usage to run the analysis and view results."
|
||||
],
|
||||
"id": "v25nLA0pmvzf"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 1000
|
||||
},
|
||||
"id": "5BzccaeFmvzg",
|
||||
"outputId": "8b4cddae-b6b3-4a92-8a13-30694cd09c52"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Markdown object>"
|
||||
],
|
||||
"text/markdown": "\n### 👤 Agent: Code Analysis Expert\n\n**Role**: Provides comprehensive code evaluation and recommendations \n**Backstory**: Expert in architecture, best practices, and technical assessment \n"
|
||||
},
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"─── 📊 AGENT CODE ANALYSIS REPORT ───\n",
|
||||
"{\n",
|
||||
" \"overall_quality\": 85,\n",
|
||||
" \"code_metrics\": [\n",
|
||||
" {\n",
|
||||
" \"category\": \"Architecture and Design\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Modular structure with clear separation of concerns.\",\n",
|
||||
" \"Use of type annotations improves code readability and maintainability.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Code Maintainability\",\n",
|
||||
" \"score\": 85,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Consistent use of type hints and NamedTuple for structured data.\",\n",
|
||||
" \"Logical organization of functions and classes.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Performance Optimization\",\n",
|
||||
" \"score\": 75,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Potential performance overhead due to repeated sys.stdout.write calls.\",\n",
|
||||
" \"Efficient use of optional parameters to control execution flow.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Security Practices\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"No obvious security vulnerabilities in the code.\",\n",
|
||||
" \"Proper encapsulation of functionality.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Test Coverage\",\n",
|
||||
" \"score\": 70,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Lack of explicit test cases in the provided code.\",\n",
|
||||
" \"Use of type checking suggests some level of validation.\"\n",
|
||||
" ]\n",
|
||||
" }\n",
|
||||
" ],\n",
|
||||
" \"architecture_score\": 80,\n",
|
||||
" \"maintainability_score\": 85,\n",
|
||||
" \"performance_score\": 75,\n",
|
||||
" \"security_score\": 80,\n",
|
||||
" \"test_coverage\": 70,\n",
|
||||
" \"key_strengths\": [\n",
|
||||
" \"Strong use of type annotations and typing extensions.\",\n",
|
||||
" \"Clear separation of CLI argument parsing and business logic.\"\n",
|
||||
" ],\n",
|
||||
" \"improvement_areas\": [\n",
|
||||
" \"Increase test coverage to ensure robustness.\",\n",
|
||||
" \"Optimize I/O operations to improve performance.\"\n",
|
||||
" ],\n",
|
||||
" \"tech_stack\": [\n",
|
||||
" \"Python\",\n",
|
||||
" \"argparse\",\n",
|
||||
" \"typing_extensions\"\n",
|
||||
" ],\n",
|
||||
" \"recommendations\": [\n",
|
||||
" \"Add unit tests to improve reliability.\",\n",
|
||||
" \"Consider async I/O for improved performance in CLI tools.\"\n",
|
||||
" ]\n",
|
||||
"}\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import json\n",
|
||||
"from IPython.display import display, Markdown\n",
|
||||
"\n",
|
||||
"# Optional: Define agent info\n",
|
||||
"agent_info = \"\"\"\n",
|
||||
"### 👤 Agent: Code Analysis Expert\n",
|
||||
"\n",
|
||||
"**Role**: Provides comprehensive code evaluation and recommendations\n",
|
||||
"**Backstory**: Expert in architecture, best practices, and technical assessment\n",
|
||||
"\"\"\"\n",
|
||||
"\n",
|
||||
"# Analysis Result Data\n",
|
||||
"analysis_result = {\n",
|
||||
" \"overall_quality\": 85,\n",
|
||||
" \"code_metrics\": [\n",
|
||||
" {\n",
|
||||
" \"category\": \"Architecture and Design\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Modular structure with clear separation of concerns.\",\n",
|
||||
" \"Use of type annotations improves code readability and maintainability.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Code Maintainability\",\n",
|
||||
" \"score\": 85,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Consistent use of type hints and NamedTuple for structured data.\",\n",
|
||||
" \"Logical organization of functions and classes.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Performance Optimization\",\n",
|
||||
" \"score\": 75,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Potential performance overhead due to repeated sys.stdout.write calls.\",\n",
|
||||
" \"Efficient use of optional parameters to control execution flow.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Security Practices\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"No obvious security vulnerabilities in the code.\",\n",
|
||||
" \"Proper encapsulation of functionality.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Test Coverage\",\n",
|
||||
" \"score\": 70,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Lack of explicit test cases in the provided code.\",\n",
|
||||
" \"Use of type checking suggests some level of validation.\"\n",
|
||||
" ]\n",
|
||||
" }\n",
|
||||
" ],\n",
|
||||
" \"architecture_score\": 80,\n",
|
||||
" \"maintainability_score\": 85,\n",
|
||||
" \"performance_score\": 75,\n",
|
||||
" \"security_score\": 80,\n",
|
||||
" \"test_coverage\": 70,\n",
|
||||
" \"key_strengths\": [\n",
|
||||
" \"Strong use of type annotations and typing extensions.\",\n",
|
||||
" \"Clear separation of CLI argument parsing and business logic.\"\n",
|
||||
" ],\n",
|
||||
" \"improvement_areas\": [\n",
|
||||
" \"Increase test coverage to ensure robustness.\",\n",
|
||||
" \"Optimize I/O operations to improve performance.\"\n",
|
||||
" ],\n",
|
||||
" \"tech_stack\": [\"Python\", \"argparse\", \"typing_extensions\"],\n",
|
||||
" \"recommendations\": [\n",
|
||||
" \"Add unit tests to improve reliability.\",\n",
|
||||
" \"Consider async I/O for improved performance in CLI tools.\"\n",
|
||||
" ]\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"# Display Agent Info and Analysis Report\n",
|
||||
"display(Markdown(agent_info))\n",
|
||||
"print(\"─── 📊 AGENT CODE ANALYSIS REPORT ───\")\n",
|
||||
"print(json.dumps(analysis_result, indent=4))\n"
|
||||
],
|
||||
"id": "5BzccaeFmvzg"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"%cd PraisonAI"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "mNZjZLedorlu",
|
||||
"outputId": "82c96cdf-e2e5-4a9c-e633-f0fc225ad973"
|
||||
},
|
||||
"id": "mNZjZLedorlu",
|
||||
"execution_count": 5,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"/content/PraisonAI\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.10"
|
||||
},
|
||||
"colab": {
|
||||
"provenance": []
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
|
||||
}
|
||||
=======
|
||||
}
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,331 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "IY0bHc5lF46I",
|
||||
"metadata": {
|
||||
"id": "IY0bHc5lF46I"
|
||||
},
|
||||
"source": [
|
||||
"# 🤖 Qwen Model Agent\n",
|
||||
"This notebook runs a chatbot agent using the `Qwen/Qwen1.5-1.8B` model via the `transformers` library in Google Colab.\n",
|
||||
"\n",
|
||||
"✅ Lightweight model (1.8B) so it runs on Colab Free.\n",
|
||||
"⚙️ No extra setup needed beyond `transformers` and `torch`.\n",
|
||||
"---"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "k37CX_LeeY_1",
|
||||
"metadata": {
|
||||
"id": "k37CX_LeeY_1"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/qwen_colab_agent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "r8_iKyw_cbIx",
|
||||
"metadata": {
|
||||
"id": "r8_iKyw_cbIx"
|
||||
},
|
||||
"source": [
|
||||
"# Install required libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "qOiX2hqlF46K",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "qOiX2hqlF46K",
|
||||
"outputId": "c9781e74-cb79-4512-87ab-4805a14b240e"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m36.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m31.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m23.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m1.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m2.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m15.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m7.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m81.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[?25h"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"!pip install -q transformers accelerate torch\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "PvTxUutEce5s",
|
||||
"metadata": {
|
||||
"id": "PvTxUutEce5s"
|
||||
},
|
||||
"source": [
|
||||
"# ✅ Use the official BERT Large model"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "q898nxgyF46L",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 177,
|
||||
"referenced_widgets": [
|
||||
"7dfb60f8868d49d08a38cafd31f9801b",
|
||||
"d59ec5856d294b1aa35e543b4e5cb542",
|
||||
"1457a5a7e1774b8a9b857d5612d17dab",
|
||||
"deb60e57aa994fc9b35f3cfdc1ccc773",
|
||||
"52a33ecf50024111b7cd38aec15e7a24",
|
||||
"a187d524446c4d2384e2bf1f3e95e7f4",
|
||||
"3c294b94c6494727a202771ced455cc5",
|
||||
"6265eaa200c74ad1a71cf0d9687d96b5",
|
||||
"f95ef373d5bf47659081f7dd5451da10",
|
||||
"8a7e9defb4564e3e8bd81fa8c64a511b",
|
||||
"0ec0f49489e042bb9979d1908ddd88bc",
|
||||
"d264ba22bcd247fdbfcfc920d525769b",
|
||||
"63246722cf6f4ff2a86077dd81cf6fe1",
|
||||
"300a704a527f40e4ac1aa42b3cfe73de",
|
||||
"697ad21a2440459ba2fe58970018ab36",
|
||||
"f473043a0c174c72a7e370bef9446d64",
|
||||
"85e681d7a00344df96dbbae0f6959822",
|
||||
"e4ae9e23561642a7a9b637a573e15638",
|
||||
"6acca0b962a745cb8801005757dd5814",
|
||||
"a785e8ee00ba47c3b267cbf9af23c308",
|
||||
"cf28774ceb87469687299e358fbcd458",
|
||||
"ee1fff0b490d40dd859dbced838983b1",
|
||||
"c40fd1a2e60a42b686e33a4476dc9100",
|
||||
"a798a3704a234a65a124050666b6b990",
|
||||
"d16fa1087f6747e0a1618bb269a2680b",
|
||||
"cca65a59559d4440a210d0b402a70656",
|
||||
"d0a59c8d2bc048d4bbec5c9ab76b387b",
|
||||
"a45c0d091c334f60b81d95ecee27ec7d",
|
||||
"70680996ad7743c8bcf732f6fad29f11",
|
||||
"b5ca16637f4e41ecbdbceb7cb7efa9dd",
|
||||
"9ce4a0d49355444c927cea148e095581",
|
||||
"5c0cb655347246548e97187512083ef6",
|
||||
"2cf395b2a0ab4fcf9679c5a2063b138e",
|
||||
"d41037046f8f43ccb008e6796a107a18",
|
||||
"304646ee1ed74c03b4962628a80618b9",
|
||||
"812518655bc04923972b18a6963e4c07",
|
||||
"f814bc25369e46d6b5a1ee0717f95bdb",
|
||||
"4e6e66ce7ca54447871899683f80cf05",
|
||||
"eccca4ade2404c84b787ffe45e625e99",
|
||||
"a1c746f57c9b4dacba349257bd3598ad",
|
||||
"acbe0aff4b6249c28636cdcf97445a28",
|
||||
"fdee9e7c52de42278364b228cb1fdda2",
|
||||
"f59346d4b3ce4e5896f4ec2b5600fd9a",
|
||||
"177feb0a5c9340ce8d8b8ca7f1539bf0",
|
||||
"d33ea2cd6c964b0da990c11fcc811359",
|
||||
"0a60b58528a8444fab2a1551f430a9ac",
|
||||
"dc11385d525445bd972c4de432de0d6a",
|
||||
"7bd7dc33413f4f3b86214a52d68db591",
|
||||
"fe3b7d8f9f514666b851771f77cfb1e7",
|
||||
"7d4d2c277a8746c7aebfbaaf21b59734",
|
||||
"33f354ddd9f54e02975dde2d0631ae04",
|
||||
"85ae7ced25884771a0a3f0b9871190e5",
|
||||
"a6db2526ea5a4c519ad2e4276b6f2e80",
|
||||
"fc771570af3644cc86a5305642cdb42b",
|
||||
"0964039f89604e7bbdc168fbddbfe620"
|
||||
]
|
||||
},
|
||||
"id": "q898nxgyF46L",
|
||||
"outputId": "144b0e69-680e-4633-8875-a3e23cccbcc1"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "7dfb60f8868d49d08a38cafd31f9801b",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"config.json: 0%| | 0.00/762 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "d264ba22bcd247fdbfcfc920d525769b",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"model.safetensors: 0%| | 0.00/1.34G [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "c40fd1a2e60a42b686e33a4476dc9100",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer_config.json: 0%| | 0.00/49.0 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "d41037046f8f43ccb008e6796a107a18",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"vocab.txt: 0%| | 0.00/213k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "d33ea2cd6c964b0da990c11fcc811359",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer.json: 0%| | 0.00/436k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from transformers import AutoTokenizer, AutoModel\n",
|
||||
"import torch\n",
|
||||
"\n",
|
||||
"bert_model = AutoModel.from_pretrained(\"bert-large-cased\")\n",
|
||||
"bert_tokenizer = AutoTokenizer.from_pretrained(\"bert-large-cased\")\n",
|
||||
"\n",
|
||||
"def classify_text(text):\n",
|
||||
" inputs = bert_tokenizer(text, return_tensors=\"pt\")\n",
|
||||
" with torch.no_grad():\n",
|
||||
" outputs = bert_model(**inputs)\n",
|
||||
" return outputs.last_hidden_state.mean(dim=1)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "jCvfJT7pcg7P",
|
||||
"metadata": {
|
||||
"id": "jCvfJT7pcg7P"
|
||||
},
|
||||
"source": [
|
||||
"# Agent Function"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "RGVb7FBdF46L",
|
||||
"metadata": {
|
||||
"id": "RGVb7FBdF46L"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"\n",
|
||||
"def chat_with_qwen(prompt: str, max_length: int = 256):\n",
|
||||
" inputs = tokenizer(prompt, return_tensors=\"pt\").to(model.device)\n",
|
||||
" with torch.no_grad():\n",
|
||||
" outputs = model.generate(**inputs, max_new_tokens=max_length)\n",
|
||||
" return tokenizer.decode(outputs[0], skip_special_tokens=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "JRx9L-oYcixp",
|
||||
"metadata": {
|
||||
"id": "JRx9L-oYcixp"
|
||||
},
|
||||
"source": [
|
||||
"# Example prompt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0atGDbNAF46M",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "0atGDbNAF46M",
|
||||
"outputId": "8878d6fe-aff7-4e9d-d359-e1f219c4dc47"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Setting `pad_token_id` to `eos_token_id`:151643 for open-end generation.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"What are the benefits of using transformers library? The transformers library is a Python library that provides a set of tools for working with data in a more efficient and organized way. Here are some of the benefits of using the transformers library:\n",
|
||||
"\n",
|
||||
"1. Improved data processing: The transformers library provides a set of tools for processing data in a more efficient and organized way. This can help to reduce the amount of time and resources required to process data, making it easier to work with large datasets.\n",
|
||||
"2. Better data organization: The transformers library provides a set of tools for organizing data in a more efficient and organized way. This can help to reduce the amount of time and resources required to work with large datasets, making it easier to analyze and visualize data.\n",
|
||||
"3. Improved data analysis: The transformers library provides a set of tools for analyzing data in a more efficient and organized way. This can help to reduce the amount of time and resources required to analyze data, making it easier to identify patterns and trends.\n",
|
||||
"4. Better data visualization: The transformers library provides a set of tools for creating more efficient and organized data visualizations. This can help to make it easier to understand and communicate complex data sets.\n",
|
||||
"5. Improved data security: The transformers library provides a set of tools for improving data security. This can help to reduce the risk of data\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"response = chat_with_qwen(\"What are the benefits of using transformers library?\")\n",
|
||||
"print(response)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.10"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
File renamed without changes.
+2836
File diff suppressed because it is too large.
Load diff
+11
-11
@@ -55,16 +55,16 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m3.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m29.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m29.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m20.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m45.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m3.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m29.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m29.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m20.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m45.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[?25h"
|
||||
]
|
||||
}
|
||||
@@ -361,4 +361,4 @@
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
}
|
||||
@@ -1,558 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e722180e",
|
||||
"metadata": {
|
||||
"id": "e722180e"
|
||||
},
|
||||
"source": [
|
||||
"# E-commerce Shopping Assistant\n",
|
||||
"\n",
|
||||
"Helps users discover, compare, and decide on product purchases online."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "vcl39flucPf5",
|
||||
"metadata": {
|
||||
"id": "vcl39flucPf5"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/E_commerce_Shopping_Assistant.ipynb)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fPf-zKw9b2s2",
|
||||
"metadata": {
|
||||
"id": "fPf-zKw9b2s2"
|
||||
},
|
||||
"source": [
|
||||
"# Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "f6e9a03f",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "f6e9a03f",
|
||||
"outputId": "55cd3cef-266d-4e53-edde-4ceab0b456cd"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/3.3 MB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r",
|
||||
"\u001b[2K \u001b[91m━━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.3/3.3 MB\u001b[0m \u001b[31m9.1 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r",
|
||||
"\u001b[2K \u001b[91m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━\u001b[0m \u001b[32m2.4/3.3 MB\u001b[0m \u001b[31m35.1 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.3/3.3 MB\u001b[0m \u001b[31m32.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[?25h"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!pip install -q praisonaiagents openai duckduckgo_search"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ryXTdYdRb6l7",
|
||||
"metadata": {
|
||||
"id": "ryXTdYdRb6l7"
|
||||
},
|
||||
"source": [
|
||||
"# set OpenAI API key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "a91f87c8",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "a91f87c8",
|
||||
"outputId": "25405986-1ac7-4002-f0ab-76a312e2b3f8"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Enter your OpenAI API key: ··········\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"from getpass import getpass\n",
|
||||
"\n",
|
||||
"os.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter your OpenAI API key: \")\n",
|
||||
"import openai\n",
|
||||
"openai.api_key = os.getenv(\"OPENAI_API_KEY\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0OW7ml8HcAnh",
|
||||
"metadata": {
|
||||
"id": "0OW7ml8HcAnh"
|
||||
},
|
||||
"source": [
|
||||
"# Import PraisonAI Agent tools"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "3c1fdf11",
|
||||
"metadata": {
|
||||
"id": "3c1fdf11"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from praisonaiagents import Agent, Task, PraisonAIAgents"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "Z0rtEk9VcDvt",
|
||||
"metadata": {
|
||||
"id": "Z0rtEk9VcDvt"
|
||||
},
|
||||
"source": [
|
||||
"# Define the Shopping Assistant Agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "71731420",
|
||||
"metadata": {
|
||||
"id": "71731420"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"shopping_assistant = Agent(\n",
|
||||
" name=\"EcommerceShoppingAgent\",\n",
|
||||
" instructions=(\n",
|
||||
" \"You are a smart e-commerce shopping assistant. \"\n",
|
||||
" \"Your goal is to help users find the best product deals, recommend items, and compare features from online sources. \"\n",
|
||||
" \"Use research and product comparison strategies.\"\n",
|
||||
" ),\n",
|
||||
" verbose=True,\n",
|
||||
" markdown=True\n",
|
||||
")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "jipAX79fcHXy",
|
||||
"metadata": {
|
||||
"id": "jipAX79fcHXy"
|
||||
},
|
||||
"source": [
|
||||
"# Define a Task for Shopping Assistant"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "9b55dbe3",
|
||||
"metadata": {
|
||||
"id": "9b55dbe3"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"shopping_task = Task(\n",
|
||||
" name=\"FindProductDeals\",\n",
|
||||
" description=\"Find the best deals and compare features for the latest wireless earbuds under $100\",\n",
|
||||
" expected_output=\"A list of recommended wireless earbuds under $100 with pros, cons, and prices\",\n",
|
||||
" agent=shopping_assistant\n",
|
||||
")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6lKHyYwycKXr",
|
||||
"metadata": {
|
||||
"id": "6lKHyYwycKXr"
|
||||
},
|
||||
"source": [
|
||||
"# Create the Assistant System"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "zEpJ7IkFbvKW",
|
||||
"metadata": {
|
||||
"id": "zEpJ7IkFbvKW"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"assistant_system = PraisonAIAgents(\n",
|
||||
" agents=[shopping_assistant],\n",
|
||||
" tasks=[shopping_task],\n",
|
||||
" process=\"sequential\",\n",
|
||||
" verbose=True\n",
|
||||
")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "yuTZ2fWpcNI8",
|
||||
"metadata": {
|
||||
"id": "yuTZ2fWpcNI8"
|
||||
},
|
||||
"source": [
|
||||
"# Run the Agent System"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "NQKri37Ubw-S",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 1000,
|
||||
"referenced_widgets": [
|
||||
"8f64ad3584b74928b9069fe84ff178db",
|
||||
"2e4b43c537924f8e8ab8d17696a90330"
|
||||
]
|
||||
},
|
||||
"id": "NQKri37Ubw-S",
|
||||
"outputId": "6741cd08-37c6-4d5a-aacd-a6ca44104dc1"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╭─ </span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8; font-weight: bold\">Agent Info</span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\"> ────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #ff9b9b; text-decoration-color: #ff9b9b; font-weight: bold\">👤 Agent:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">EcommerceShoppingAgent</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #b4b4b3; text-decoration-color: #b4b4b3; font-weight: bold\">Role:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">Assistant</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[38;2;210;227;200m╭─\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[1;38;2;210;227;200mAgent Info\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[38;2;210;227;200m───────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[38;2;210;227;200m─╮\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;255;155;155m👤 Agent:\u001b[0m \u001b[38;2;255;229;229mEcommerceShoppingAgent\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;180;180;179mRole:\u001b[0m \u001b[38;2;255;229;229mAssistant\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "8f64ad3584b74928b9069fe84ff178db",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Output()"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
||||
],
|
||||
"text/plain": []
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">Response generated in 7.8s</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[2mResponse generated in 7.8s\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭───────────────────────────────────────────────────── Task ──────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> You need to do the following task: Find the best deals and compare features for the latest wireless earbuds <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> under $100. Expected Output: A list of recommended wireless earbuds under $100 with pros, cons, and prices. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> Please provide only the final result of your work. Do not add any conversation or extra explanation. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m────────────────────────────────────────────────────\u001b[0m\u001b[36m Task \u001b[0m\u001b[36m─────────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m You need to do the following task: Find the best deals and compare features for the latest wireless earbuds \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m under $100. Expected Output: A list of recommended wireless earbuds under $100 with pros, cons, and prices. \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m Please provide only the final result of your work. Do not add any conversation or extra explanation. \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭─────────────────────────────────────────────────── Response ────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold\">1. Anker Soundcore Life P2</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Price:</span> $49.99 <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Pros:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Excellent battery life (up to 40 hours with case) <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>IPX7 waterproof rating <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Good sound quality with graphene drivers <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>USB-C charging <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Cons:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>No active noise cancellation <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Limited touch controls <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold\">2. TOZO T6</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Price:</span> $29.99 <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Pros:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Affordable price <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>IPX8 waterproof rating <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Touch controls <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Good sound quality for the price <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Cons:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Average battery life (up to 6 hours per charge) <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>No active noise cancellation <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold\">3. JLab Audio JBuds Air</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Price:</span> $49.99 <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Pros:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Custom EQ3 sound settings <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>IP55 sweat resistance <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Good fit with multiple ear tips <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Integrated charging cable in the case <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Cons:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Bulky charging case <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>No active noise cancellation <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold\">4. Skullcandy Sesh Evo</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Price:</span> $49.99 <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Pros:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Tile tracking feature <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>IP55 sweat, water, and dust resistance <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Decent sound quality <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Good battery life (up to 24 hours with case) <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Cons:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Limited touch controls <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>No active noise cancellation <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold\">5. SoundPEATS TrueFree2</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Price:</span> $39.99 <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Pros:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Secure fit with ear fins <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>IPX7 waterproof rating <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Good sound quality <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>USB-C charging <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span><span style=\"font-weight: bold\">Cons:</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>No active noise cancellation <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\"> • </span>Average battery life (up to 4 hours per charge) <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> These options provide a range of features and prices, allowing you to choose based on your specific needs and <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> preferences. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m──────────────────────────────────────────────────\u001b[0m\u001b[36m Response \u001b[0m\u001b[36m───────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1m1. Anker Soundcore Life P2\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPrice:\u001b[0m $49.99 \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPros:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mExcellent battery life (up to 40 hours with case) \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIPX7 waterproof rating \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mGood sound quality with graphene drivers \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mUSB-C charging \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mCons:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mNo active noise cancellation \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mLimited touch controls \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1m2. TOZO T6\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPrice:\u001b[0m $29.99 \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPros:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mAffordable price \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIPX8 waterproof rating \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mTouch controls \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mGood sound quality for the price \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mCons:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mAverage battery life (up to 6 hours per charge) \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mNo active noise cancellation \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1m3. JLab Audio JBuds Air\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPrice:\u001b[0m $49.99 \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPros:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mCustom EQ3 sound settings \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIP55 sweat resistance \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mGood fit with multiple ear tips \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIntegrated charging cable in the case \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mCons:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mBulky charging case \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mNo active noise cancellation \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1m4. Skullcandy Sesh Evo\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPrice:\u001b[0m $49.99 \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPros:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mTile tracking feature \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIP55 sweat, water, and dust resistance \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mDecent sound quality \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mGood battery life (up to 24 hours with case) \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mCons:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mLimited touch controls \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mNo active noise cancellation \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1m5. SoundPEATS TrueFree2\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPrice:\u001b[0m $39.99 \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mPros:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mSecure fit with ear fins \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIPX7 waterproof rating \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mGood sound quality \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mUSB-C charging \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m • \u001b[0m\u001b[1mCons:\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mNo active noise cancellation \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mAverage battery life (up to 4 hours per charge) \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m These options provide a range of features and prices, allowing you to choose based on your specific needs and \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m preferences. \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"🛍️ Shopping Assistant Output:\n",
|
||||
" **1. Anker Soundcore Life P2**\n",
|
||||
"\n",
|
||||
"- **Price:** $49.99\n",
|
||||
"- **Pros:** \n",
|
||||
" - Excellent battery life (up to 40 hours with case)\n",
|
||||
" - IPX7 waterproof rating\n",
|
||||
" - Good sound quality with graphene drivers\n",
|
||||
" - USB-C charging\n",
|
||||
"- **Cons:** \n",
|
||||
" - No active noise cancellation\n",
|
||||
" - Limited touch controls\n",
|
||||
"\n",
|
||||
"**2. TOZO T6**\n",
|
||||
"\n",
|
||||
"- **Price:** $29.99\n",
|
||||
"- **Pros:** \n",
|
||||
" - Affordable price\n",
|
||||
" - IPX8 waterproof rating\n",
|
||||
" - Touch controls\n",
|
||||
" - Good sound quality for the price\n",
|
||||
"- **Cons:** \n",
|
||||
" - Average battery life (up to 6 hours per charge)\n",
|
||||
" - No active noise cancellation\n",
|
||||
"\n",
|
||||
"**3. JLab Audio JBuds Air**\n",
|
||||
"\n",
|
||||
"- **Price:** $49.99\n",
|
||||
"- **Pros:** \n",
|
||||
" - Custom EQ3 sound settings\n",
|
||||
" - IP55 sweat resistance\n",
|
||||
" - Good fit with multiple ear tips\n",
|
||||
" - Integrated charging cable in the case\n",
|
||||
"- **Cons:** \n",
|
||||
" - Bulky charging case\n",
|
||||
" - No active noise cancellation\n",
|
||||
"\n",
|
||||
"**4. Skullcandy Sesh Evo**\n",
|
||||
"\n",
|
||||
"- **Price:** $49.99\n",
|
||||
"- **Pros:** \n",
|
||||
" - Tile tracking feature\n",
|
||||
" - IP55 sweat, water, and dust resistance\n",
|
||||
" - Decent sound quality\n",
|
||||
" - Good battery life (up to 24 hours with case)\n",
|
||||
"- **Cons:** \n",
|
||||
" - Limited touch controls\n",
|
||||
" - No active noise cancellation\n",
|
||||
"\n",
|
||||
"**5. SoundPEATS TrueFree2**\n",
|
||||
"\n",
|
||||
"- **Price:** $39.99\n",
|
||||
"- **Pros:** \n",
|
||||
" - Secure fit with ear fins\n",
|
||||
" - IPX7 waterproof rating\n",
|
||||
" - Good sound quality\n",
|
||||
" - USB-C charging\n",
|
||||
"- **Cons:** \n",
|
||||
" - No active noise cancellation\n",
|
||||
" - Average battery life (up to 4 hours per charge)\n",
|
||||
"\n",
|
||||
"These options provide a range of features and prices, allowing you to choose based on your specific needs and preferences.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"query = \"Find the best wireless earbuds under $100 with noise cancellation\"\n",
|
||||
"output = assistant_system.start(input=query)\n",
|
||||
"\n",
|
||||
"# 📄 Display Output\n",
|
||||
"print(\"🛍️ Shopping Assistant Output:\\n\", output)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
File renamed without changes.
+445
-1
@@ -1,4 +1,448 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "g3aOhTmXMX8W"
|
||||
},
|
||||
"source": [
|
||||
"# 🎓 AI Enrollment Counselor – Intelligent University Admissions Automation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "_4IXzY5oMZHZ"
|
||||
},
|
||||
"source": [
|
||||
"This notebook demonstrates an AI Enrollment Counselor agent that helps automate university admissions. The agent can answer applicant questions, check application completeness, and provide personalized guidance. It uses PraisonAI Agents and a custom tool to validate required documents."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "rL-UiB5NOspT"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/AI_Enrollment_Counselor.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "uPbtGiQmOF4Q"
|
||||
},
|
||||
"source": [
|
||||
"# Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"id": "HeTyAS59MlNI"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonaiagents openai --quiet"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "JtNXPqR-OIwM"
|
||||
},
|
||||
"source": [
|
||||
"# Set Up API Key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"id": "BqxfwYKsMrkX"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"os.environ[\"OPENAI_API_KEY\"] = \"sk-...\" # <-- Replace with your actual OpenAI API key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "gsA7ERuYOLMw"
|
||||
},
|
||||
"source": [
|
||||
"# Tools (Imports)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"id": "yN-89djDMydt"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from praisonaiagents import Agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "SOHBWRdWONo1"
|
||||
},
|
||||
"source": [
|
||||
"# YAML Prompt (Role, Goal, Instructions)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {
|
||||
"id": "ZOid3qvbM1kx"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"ROLE = (\n",
|
||||
" \"AI Enrollment Counselor. Expert in university admissions, document validation, and applicant guidance.\"\n",
|
||||
")\n",
|
||||
"GOAL = (\n",
|
||||
" \"Help applicants with admissions, check application completeness, and provide personalized advice.\"\n",
|
||||
")\n",
|
||||
"INSTRUCTIONS = (\n",
|
||||
" \"Given applicant questions or application data, answer clearly. \"\n",
|
||||
" \"If asked to check documents, list which required documents are missing from the provided list. \"\n",
|
||||
" \"Always be friendly, helpful, and accurate.\"\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "BYrWJTqNOQir"
|
||||
},
|
||||
"source": [
|
||||
"# Main (Agent Setup & Example)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 688,
|
||||
"referenced_widgets": [
|
||||
"b53cc2ccefec4862bd0951005998e0cc",
|
||||
"96120ef853404e0a995b4b425c4cc1d7",
|
||||
"71d29f64b5b74d37bd92ea2e0c38fbcd",
|
||||
"2974c3f12e704a3595f252433bdded8d"
|
||||
]
|
||||
},
|
||||
"id": "ySEhe-G_M3aj",
|
||||
"outputId": "328ed274-2026-4c5d-9ea0-afd7cc400616"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╭─ </span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8; font-weight: bold\">Agent Info</span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\"> ────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #ff9b9b; text-decoration-color: #ff9b9b; font-weight: bold\">👤 Agent:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">Agent</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #b4b4b3; text-decoration-color: #b4b4b3; font-weight: bold\">Role:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">AI Enrollment Counselor. Expert in university admissions, document validation, and applicant guidance.</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[38;2;210;227;200m╭─\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[1;38;2;210;227;200mAgent Info\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[38;2;210;227;200m───────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[38;2;210;227;200m─╮\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;255;155;155m👤 Agent:\u001b[0m \u001b[38;2;255;229;229mAgent\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;180;180;179mRole:\u001b[0m \u001b[38;2;255;229;229mAI Enrollment Counselor. Expert in university admissions, document validation, and applicant guidance.\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "b53cc2ccefec4862bd0951005998e0cc",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Output()"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
||||
],
|
||||
"text/plain": []
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">Response generated in 3.0s</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[2mResponse generated in 3.0s\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭───────────────────────────────────────────────────── Task ──────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> Applicant submitted documents: ['transcript', 'passport', 'SOP'] Required documents: ['transcript', 'passport', <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> 'SOP', 'recommendation letter'] Check which documents are missing. List any missing documents and provide <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> guidance. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m────────────────────────────────────────────────────\u001b[0m\u001b[36m Task \u001b[0m\u001b[36m─────────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m Applicant submitted documents: ['transcript', 'passport', 'SOP'] Required documents: ['transcript', 'passport', \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m 'SOP', 'recommendation letter'] Check which documents are missing. List any missing documents and provide \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m guidance. \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭─────────────────────────────────────────────────── Response ────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> It looks like the applicant is missing the \"recommendation letter\" from the list of required documents. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> To complete your application, please ensure you obtain a recommendation letter. This can typically be from a <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> teacher, professor, or professional who can speak to your qualifications and character. If you need further <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> guidance on how to request a recommendation letter or whom to ask, feel free to ask! <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m──────────────────────────────────────────────────\u001b[0m\u001b[36m Response \u001b[0m\u001b[36m───────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m It looks like the applicant is missing the \"recommendation letter\" from the list of required documents. \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m To complete your application, please ensure you obtain a recommendation letter. This can typically be from a \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m teacher, professor, or professional who can speak to your qualifications and character. If you need further \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m guidance on how to request a recommendation letter or whom to ask, feel free to ask! \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It looks like the applicant is missing the \"recommendation letter\" from the list of required documents. \n",
|
||||
"\n",
|
||||
"To complete your application, please ensure you obtain a recommendation letter. This can typically be from a teacher, professor, or professional who can speak to your qualifications and character. If you need further guidance on how to request a recommendation letter or whom to ask, feel free to ask!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╭─ </span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8; font-weight: bold\">Agent Info</span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\"> ────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #ff9b9b; text-decoration-color: #ff9b9b; font-weight: bold\">👤 Agent:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">Agent</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #b4b4b3; text-decoration-color: #b4b4b3; font-weight: bold\">Role:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">AI Enrollment Counselor. Expert in university admissions, document validation, and applicant guidance.</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[38;2;210;227;200m╭─\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[1;38;2;210;227;200mAgent Info\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[38;2;210;227;200m───────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[38;2;210;227;200m─╮\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;255;155;155m👤 Agent:\u001b[0m \u001b[38;2;255;229;229mAgent\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;180;180;179mRole:\u001b[0m \u001b[38;2;255;229;229mAI Enrollment Counselor. Expert in university admissions, document validation, and applicant guidance.\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "71d29f64b5b74d37bd92ea2e0c38fbcd",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Output()"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
||||
],
|
||||
"text/plain": []
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">Response generated in 3.2s</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[2mResponse generated in 3.2s\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭───────────────────────────────────────────────────── Task ──────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> What is the deadline for undergraduate applications? <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m────────────────────────────────────────────────────\u001b[0m\u001b[36m Task \u001b[0m\u001b[36m─────────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m What is the deadline for undergraduate applications? \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭─────────────────────────────────────────────────── Response ────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> The deadline for undergraduate applications can vary depending on the university and the specific program you <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> are applying to. Generally, many universities have deadlines around January 1st for regular decision <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> applications, but some may have earlier deadlines for early action or early decision, often in November. It's <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> important to check the specific deadlines for the university you are interested in, as they can differ. If you <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> have a particular university in mind, I can help you find more detailed information! <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m──────────────────────────────────────────────────\u001b[0m\u001b[36m Response \u001b[0m\u001b[36m───────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m The deadline for undergraduate applications can vary depending on the university and the specific program you \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m are applying to. Generally, many universities have deadlines around January 1st for regular decision \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m applications, but some may have earlier deadlines for early action or early decision, often in November. It's \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m important to check the specific deadlines for the university you are interested in, as they can differ. If you \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m have a particular university in mind, I can help you find more detailed information! \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"The deadline for undergraduate applications can vary depending on the university and the specific program you are applying to. Generally, many universities have deadlines around January 1st for regular decision applications, but some may have earlier deadlines for early action or early decision, often in November. It's important to check the specific deadlines for the university you are interested in, as they can differ. If you have a particular university in mind, I can help you find more detailed information!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Create the enrollment counselor agent (prompt-only, no custom tools)\n",
|
||||
"enrollment_agent = Agent(\n",
|
||||
" role=ROLE,\n",
|
||||
" goal=GOAL,\n",
|
||||
" instructions=INSTRUCTIONS\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"def ask_enrollment_agent(query, submitted=None, required=None):\n",
|
||||
" if submitted and required:\n",
|
||||
" prompt = (\n",
|
||||
" f\"Applicant submitted documents: {submitted}\\n\"\n",
|
||||
" f\"Required documents: {required}\\n\"\n",
|
||||
" f\"{query}\\n\"\n",
|
||||
" \"List any missing documents and provide guidance.\"\n",
|
||||
" )\n",
|
||||
" return enrollment_agent.start(prompt)\n",
|
||||
" else:\n",
|
||||
" return enrollment_agent.start(query)\n",
|
||||
"\n",
|
||||
"# Try a sample document check\n",
|
||||
"submitted_docs = [\"transcript\", \"passport\", \"SOP\"]\n",
|
||||
"required_docs = [\"transcript\", \"passport\", \"SOP\", \"recommendation letter\"]\n",
|
||||
"print(ask_enrollment_agent(\n",
|
||||
" \"Check which documents are missing.\", submitted=submitted_docs, required=required_docs))\n",
|
||||
"\n",
|
||||
"# Try a general admissions question\n",
|
||||
"print(ask_enrollment_agent(\"What is the deadline for undergraduate applications?\"))"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
=======
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0,
|
||||
"metadata": {
|
||||
@@ -603,4 +1047,4 @@
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,402 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "Fi_y0ooAzjjy"
|
||||
},
|
||||
"source": [
|
||||
"# AI Market & Startup Trend Agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "M18iBcPYzl9d"
|
||||
},
|
||||
"source": [
|
||||
"* An AI-powered agent that analyzes current market and startup trends using real-time news, web search, and multi-agent collaboration.\n",
|
||||
"* The agent collects recent articles, summarizes key insights, and identifies emerging opportunities for entrepreneurs and investors.\n",
|
||||
"* Features include automated news gathering, trend summarization, and actionable reports on startup opportunities in any area of interest."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "SfsvzoD_3JtE"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/ai_market_startup_trend_agent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "6par7OlW0KVF"
|
||||
},
|
||||
"source": [
|
||||
"# Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "oJA89ujM0OSd"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonai streamlit duckduckgo-search \"newspaper3k[lxml]\" anthropic lxml_html_clean"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "bK4r7sQ_0hz0"
|
||||
},
|
||||
"source": [
|
||||
"# Setup Key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "9UViB-oJ0izp",
|
||||
"outputId": "f1db522f-5e30-4f14-8fc1-5c5b814a10c7"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ Anthropic API key configured!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Setup Key\n",
|
||||
"import os\n",
|
||||
"\n",
|
||||
"# Set your Anthropic API key\n",
|
||||
"anthropic_key = \"your_anthropic_key_here\" # Get from https://console.anthropic.com\n",
|
||||
"\n",
|
||||
"# Set environment variable\n",
|
||||
"os.environ[\"ANTHROPIC_API_KEY\"] = anthropic_key\n",
|
||||
"\n",
|
||||
"print(\"✅ Anthropic API key configured!\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "TX6AKmiE0sK3"
|
||||
},
|
||||
"source": [
|
||||
"# Tools"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"id": "afU4kjcz0tCk"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Custom News & Trend Analysis Tools\n",
|
||||
"\n",
|
||||
"from duckduckgo_search import DDGS\n",
|
||||
"from newspaper import Article\n",
|
||||
"from typing import List, Dict, Any\n",
|
||||
"\n",
|
||||
"class NewsSearchTool:\n",
|
||||
" def __init__(self, max_results: int = 5):\n",
|
||||
" self.max_results = max_results\n",
|
||||
"\n",
|
||||
" def search_news(self, topic: str) -> List[Dict[str, Any]]:\n",
|
||||
" \"\"\"Search for recent news articles on a topic using DuckDuckGo.\"\"\"\n",
|
||||
" results = []\n",
|
||||
" with DDGS() as ddgs:\n",
|
||||
" for r in ddgs.news(topic, max_results=self.max_results):\n",
|
||||
" results.append({\n",
|
||||
" \"title\": r.get(\"title\"),\n",
|
||||
" \"url\": r.get(\"url\"),\n",
|
||||
" \"date\": r.get(\"date\"),\n",
|
||||
" \"body\": r.get(\"body\")\n",
|
||||
" })\n",
|
||||
" return results\n",
|
||||
"\n",
|
||||
"class ArticleSummaryTool:\n",
|
||||
" def summarize_articles(self, articles: List[Dict[str, Any]]) -> List[Dict[str, Any]]:\n",
|
||||
" \"\"\"Summarize the content of news articles using Newspaper3k.\"\"\"\n",
|
||||
" summaries = []\n",
|
||||
" for article in articles:\n",
|
||||
" try:\n",
|
||||
" a = Article(article[\"url\"])\n",
|
||||
" a.download()\n",
|
||||
" a.parse()\n",
|
||||
" a.nlp()\n",
|
||||
" summaries.append({\n",
|
||||
" \"title\": article[\"title\"],\n",
|
||||
" \"summary\": a.summary,\n",
|
||||
" \"url\": article[\"url\"]\n",
|
||||
" })\n",
|
||||
" except Exception as e:\n",
|
||||
" summaries.append({\n",
|
||||
" \"title\": article[\"title\"],\n",
|
||||
" \"summary\": f\"Error summarizing article: {str(e)}\",\n",
|
||||
" \"url\": article[\"url\"]\n",
|
||||
" })\n",
|
||||
" return summaries\n",
|
||||
"\n",
|
||||
"class TrendInsightTool:\n",
|
||||
" def extract_trends(self, summaries: List[Dict[str, Any]]) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Extract and aggregate trend insights from article summaries.\"\"\"\n",
|
||||
" all_text = \" \".join([s[\"summary\"] for s in summaries if \"summary\" in s])\n",
|
||||
" # For demo: just return the combined summaries\n",
|
||||
" # In production: use LLM to extract trends and opportunities\n",
|
||||
" return {\n",
|
||||
" \"trend_report\": all_text[:2000] + (\"...\" if len(all_text) > 2000 else \"\")\n",
|
||||
" }"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "CVCoaGTO0-Ue"
|
||||
},
|
||||
"source": [
|
||||
"# YAML Prompt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "6xu0NeHy0_ZV",
|
||||
"outputId": "2d85f20a-8af4-49a4-ec76-9db4102e0d51"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ YAML Prompt configured!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# YAML Prompt\n",
|
||||
"yaml_prompt = \"\"\"\n",
|
||||
"name: \"AI Market & Startup Trend Agent\"\n",
|
||||
"description: \"Expert market analyst that gathers, summarizes, and analyzes startup and market trends from real-time news sources\"\n",
|
||||
"instructions:\n",
|
||||
" - \"You are an expert market and startup trend analyst\"\n",
|
||||
" - \"Search for the latest news and articles on the user's topic of interest\"\n",
|
||||
" - \"Summarize the key points and insights from each article\"\n",
|
||||
" - \"Aggregate the summaries to identify emerging trends and startup opportunities\"\n",
|
||||
" - \"Present findings in a clear, actionable report for entrepreneurs and investors\"\n",
|
||||
" - \"Cite sources and provide links to original articles\"\n",
|
||||
" - \"Highlight any patterns, risks, or opportunities you discover\"\n",
|
||||
" - \"Use bullet points and markdown formatting for clarity\"\n",
|
||||
"\n",
|
||||
"tools:\n",
|
||||
" - name: \"NewsSearchTool\"\n",
|
||||
" description: \"Searches for recent news articles on a given topic using DuckDuckGo\"\n",
|
||||
" - name: \"ArticleSummaryTool\"\n",
|
||||
" description: \"Summarizes the content of news articles using Newspaper3k\"\n",
|
||||
" - name: \"TrendInsightTool\"\n",
|
||||
" description: \"Extracts and aggregates trend insights from article summaries\"\n",
|
||||
"\n",
|
||||
"output_format:\n",
|
||||
" - \"Provide a trend analysis report with actionable insights\"\n",
|
||||
" - \"Include a list of summarized articles with links\"\n",
|
||||
" - \"Highlight key opportunities and risks\"\n",
|
||||
" - \"Use clear, structured formatting with sections for news, summaries, and trends\"\n",
|
||||
"\n",
|
||||
"temperature: 0.4\n",
|
||||
"max_tokens: 3500\n",
|
||||
"model: \"claude-3-5-sonnet\"\n",
|
||||
"\"\"\"\n",
|
||||
"\n",
|
||||
"print(\"✅ YAML Prompt configured!\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "MaX_eyRB1jtF"
|
||||
},
|
||||
"source": [
|
||||
"# Main"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"collapsed": true,
|
||||
"id": "fmMkG5hR1lS7",
|
||||
"outputId": "0833615c-c919-406e-9646-9cd8d74f78ed"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[nltk_data] Error loading tokenizers/punkt: Package 'tokenizers/punkt'\n",
|
||||
"[nltk_data] not found in index\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"📈 AI Market & Startup Trend Agent\n",
|
||||
"Analyze current market and startup trends using real-time news and AI summarization!\n",
|
||||
"\n",
|
||||
"Enter the area of interest for your Startup or Market Trend Analysis: Chennai\n",
|
||||
"\n",
|
||||
"🔍 Searching for recent news on: Chennai\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/tmp/ipython-input-6-1293765785.py:14: RuntimeWarning: This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.\n",
|
||||
" with DDGS() as ddgs:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ Found 5 articles. Summarizing...\n",
|
||||
"\n",
|
||||
"📰 Article Summaries:\n",
|
||||
"1. Chennai woman breaks down in front of traffic cop, shares the reason in viral post\n",
|
||||
" \n",
|
||||
" [Read more](https://www.msn.com/en-in/news/other/chennai-woman-breaks-down-in-front-of-traffic-cop-shares-the-reason-in-viral-post/ar-AA1IalYh)\n",
|
||||
"\n",
|
||||
"2. Chennai founder breaks down in front of traffic police after his unexpected question: 'And that's when the tears came'\n",
|
||||
" \n",
|
||||
" [Read more](https://www.msn.com/en-in/news/India/chennai-founder-breaks-down-in-front-of-traffic-police-after-his-unexpected-question-and-that-s-when-the-tears-came/ar-AA1Ia579)\n",
|
||||
"\n",
|
||||
"3. Explore India's coastal flavours at this Chennai food fest\n",
|
||||
" \n",
|
||||
" [Read more](https://www.msn.com/en-in/foodanddrink/other/explore-indias-coastal-flavours-at-this-chennai-food-fest/ar-AA1Iax3e)\n",
|
||||
"\n",
|
||||
"4. Chennai weather update: Expect patchy rain and a warm summer day\n",
|
||||
" \n",
|
||||
" [Read more](https://www.msn.com/en-in/news/india/chennai-weather-update-expect-patchy-rain-and-a-warm-summer-day/ar-AA1I9ECV)\n",
|
||||
"\n",
|
||||
"5. Chennai Power Outage Alert: Check Areas That Will Face Supply Disruption On July 8 For Maintenance Work\n",
|
||||
" \n",
|
||||
" [Read more](https://www.msn.com/en-in/autos/photos/chennai-power-outage-alert-check-areas-that-will-face-supply-disruption-on-july-8-for-maintenance-work/ar-AA1I9KIg)\n",
|
||||
"\n",
|
||||
"📊 Analyzing trends and opportunities...\n",
|
||||
"\n",
|
||||
"=== Trend Analysis Report ===\n",
|
||||
" \n",
|
||||
"\n",
|
||||
"🧪 Sample Topics for Testing\n",
|
||||
"1. AI in healthcare\n",
|
||||
"2. Sustainable energy startups\n",
|
||||
"3. Fintech innovation\n",
|
||||
"4. Remote work technology\n",
|
||||
"5. Climate tech investments\n",
|
||||
"\n",
|
||||
"==================================================\n",
|
||||
"📈 Powered by AI Market & Startup Trend Agent | Built with PraisonAI\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Main Application (Google Colab Version)\n",
|
||||
"import os\n",
|
||||
"import warnings\n",
|
||||
"warnings.filterwarnings(\"ignore\", category=ImportWarning)\n",
|
||||
"\n",
|
||||
"# Download all necessary NLTK data for newspaper3k\n",
|
||||
"import nltk\n",
|
||||
"nltk.download('tokenizers/punkt')\n",
|
||||
"nltk.download('averaged_perceptron_tagger', quiet=True)\n",
|
||||
"nltk.download('maxent_ne_chunker', quiet=True)\n",
|
||||
"nltk.download('words', quiet=True)\n",
|
||||
"\n",
|
||||
"# Initialize tools\n",
|
||||
"news_tool = NewsSearchTool()\n",
|
||||
"summary_tool = ArticleSummaryTool()\n",
|
||||
"trend_tool = TrendInsightTool()\n",
|
||||
"\n",
|
||||
"print(\"📈 AI Market & Startup Trend Agent\")\n",
|
||||
"print(\"Analyze current market and startup trends using real-time news and AI summarization!\")\n",
|
||||
"\n",
|
||||
"# User input\n",
|
||||
"topic = input(\"\\nEnter the area of interest for your Startup or Market Trend Analysis: \").strip()\n",
|
||||
"\n",
|
||||
"if topic:\n",
|
||||
" print(f\"\\n🔍 Searching for recent news on: {topic}\")\n",
|
||||
" articles = news_tool.search_news(topic)\n",
|
||||
" if articles:\n",
|
||||
" print(f\"✅ Found {len(articles)} articles. Summarizing...\")\n",
|
||||
" summaries = summary_tool.summarize_articles(articles)\n",
|
||||
" print(\"\\n📰 Article Summaries:\")\n",
|
||||
" for i, s in enumerate(summaries, 1):\n",
|
||||
" print(f\"{i}. {s['title']}\")\n",
|
||||
" print(f\" {s['summary']}\")\n",
|
||||
" print(f\" [Read more]({s['url']})\\n\")\n",
|
||||
"\n",
|
||||
" print(\"📊 Analyzing trends and opportunities...\")\n",
|
||||
" trend_report = trend_tool.extract_trends(summaries)\n",
|
||||
" print(\"\\n=== Trend Analysis Report ===\")\n",
|
||||
" print(trend_report[\"trend_report\"])\n",
|
||||
" else:\n",
|
||||
" print(\"❌ No news articles found for this topic.\")\n",
|
||||
"else:\n",
|
||||
" print(\"❌ No topic entered. Please provide a topic to analyze.\")\n",
|
||||
"\n",
|
||||
"# Sample topics for testing\n",
|
||||
"print(\"\\n🧪 Sample Topics for Testing\")\n",
|
||||
"sample_topics = [\n",
|
||||
" \"AI in healthcare\",\n",
|
||||
" \"Sustainable energy startups\",\n",
|
||||
" \"Fintech innovation\",\n",
|
||||
" \"Remote work technology\",\n",
|
||||
" \"Climate tech investments\"\n",
|
||||
"]\n",
|
||||
"for i, t in enumerate(sample_topics, 1):\n",
|
||||
" print(f\"{i}. {t}\")\n",
|
||||
"\n",
|
||||
"# Footer\n",
|
||||
"print(\"\\n\" + \"=\"*50)\n",
|
||||
"print(\"📈 Powered by AI Market & Startup Trend Agent | Built with PraisonAI\")"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,441 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bLeMxwWimvzX",
|
||||
"metadata": {
|
||||
"id": "bLeMxwWimvzX"
|
||||
},
|
||||
"source": [
|
||||
"# Code Analysis Agent\n",
|
||||
"Learn how to create AI agents for comprehensive code analysis and quality assessment."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "P3X8PXPyojnL",
|
||||
"metadata": {
|
||||
"id": "P3X8PXPyojnL"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/code_analysis_agent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "xEs8bwWfmvza",
|
||||
"metadata": {
|
||||
"id": "xEs8bwWfmvza"
|
||||
},
|
||||
"source": [
|
||||
"## Dependencies\n",
|
||||
"Install the required packages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "_RPiU3j6mvzb",
|
||||
"metadata": {
|
||||
"id": "_RPiU3j6mvzb"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonaiagents gitingest"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "81-orTkzmvzc",
|
||||
"metadata": {
|
||||
"id": "81-orTkzmvzc"
|
||||
},
|
||||
"source": [
|
||||
"## Set API Key\n",
|
||||
"Set your OpenAI API key as an environment variable in your terminal:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "84iL7rGimvzc",
|
||||
"metadata": {
|
||||
"id": "84iL7rGimvzc"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"os.environ['OPENAI_API_KEY'] = 'your_api_key_here'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "TV15GFsRmvzc",
|
||||
"metadata": {
|
||||
"id": "TV15GFsRmvzc"
|
||||
},
|
||||
"source": [
|
||||
"## Tools and Data Models\n",
|
||||
"Define the agent, task, and output schema."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0Wq_g0pNmvzd",
|
||||
"metadata": {
|
||||
"id": "0Wq_g0pNmvzd"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from praisonaiagents import Agent, Task, PraisonAIAgents\n",
|
||||
"from pydantic import BaseModel\n",
|
||||
"from typing import List, Dict\n",
|
||||
"from gitingest import ingest\n",
|
||||
"\n",
|
||||
"class CodeMetrics(BaseModel):\n",
|
||||
" category: str\n",
|
||||
" score: int\n",
|
||||
" findings: List[str]\n",
|
||||
"\n",
|
||||
"class CodeAnalysisReport(BaseModel):\n",
|
||||
" overall_quality: int\n",
|
||||
" code_metrics: List[CodeMetrics]\n",
|
||||
" architecture_score: int\n",
|
||||
" maintainability_score: int\n",
|
||||
" performance_score: int\n",
|
||||
" security_score: int\n",
|
||||
" test_coverage: int\n",
|
||||
" key_strengths: List[str]\n",
|
||||
" improvement_areas: List[str]\n",
|
||||
" tech_stack: List[str]\n",
|
||||
" recommendations: List[str]\n",
|
||||
" complexity_metrics: Dict[str, int]\n",
|
||||
" best_practices: List[Dict[str, str]]\n",
|
||||
" potential_risks: List[str]\n",
|
||||
" documentation_quality: int"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "EatrK7-wmvzd",
|
||||
"metadata": {
|
||||
"id": "EatrK7-wmvzd"
|
||||
},
|
||||
"source": [
|
||||
"## YAML Prompt Setup\n",
|
||||
"Define the agent and task with expectations."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "EdZNSOy-mvze",
|
||||
"metadata": {
|
||||
"id": "EdZNSOy-mvze"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"code_analyzer = Agent(\n",
|
||||
" role=\"Code Analysis Expert\",\n",
|
||||
" goal=\"Provide comprehensive code evaluation and recommendations\",\n",
|
||||
" backstory=\"\"\"Expert code analyst specializing in architecture review,\n",
|
||||
" best practices, and technical debt assessment.\"\"\",\n",
|
||||
" verbose=True\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"code_analysis_task = Task(\n",
|
||||
" description=\"\"\"Analyze code repository and provide structured evaluation:\n",
|
||||
"\n",
|
||||
" 1. Overall Quality (0-100)\n",
|
||||
" 2. Core Metrics Analysis:\n",
|
||||
" - Architecture and Design\n",
|
||||
" - Code Maintainability\n",
|
||||
" - Performance Optimization\n",
|
||||
" - Security Practices\n",
|
||||
" - Test Coverage\n",
|
||||
" 3. Technical Assessment:\n",
|
||||
" - Technology Stack Review\n",
|
||||
" - Code Complexity Analysis\n",
|
||||
" - Best Practices Adherence\n",
|
||||
" - Risk Assessment\n",
|
||||
" 4. Recommendations:\n",
|
||||
" - Key Improvements\n",
|
||||
" - Architecture Suggestions\n",
|
||||
" - Security Enhancements\"\"\",\n",
|
||||
" expected_output=\"Detailed code analysis report with metrics and recommendations\",\n",
|
||||
" agent=code_analyzer,\n",
|
||||
" output_pydantic=CodeAnalysisReport\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "CeLS55ROmvzf",
|
||||
"metadata": {
|
||||
"id": "CeLS55ROmvzf"
|
||||
},
|
||||
"source": [
|
||||
"## Main Function\n",
|
||||
"Function to analyze code from GitHub URL or local path."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3Eo6LEOxmvzf",
|
||||
"metadata": {
|
||||
"id": "3Eo6LEOxmvzf"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def analyze_code(code_source: str) -> CodeAnalysisReport:\n",
|
||||
" \"\"\"\n",
|
||||
" Analyze code from directory path or GitHub URL\n",
|
||||
" \"\"\"\n",
|
||||
" # Ingest code content\n",
|
||||
" summary, tree, content = ingest(code_source)\n",
|
||||
"\n",
|
||||
" # Concatenate context into structured format\n",
|
||||
" context_text = f\"\"\"\n",
|
||||
" CODE REPOSITORY ANALYSIS\n",
|
||||
" =======================\n",
|
||||
"\n",
|
||||
" SUMMARY\n",
|
||||
" -------\n",
|
||||
" {summary}\n",
|
||||
"\n",
|
||||
" REPOSITORY STRUCTURE\n",
|
||||
" -------------------\n",
|
||||
" {tree}\n",
|
||||
"\n",
|
||||
" SOURCE CODE\n",
|
||||
" -----------\n",
|
||||
" {content}\n",
|
||||
" \"\"\"\n",
|
||||
"\n",
|
||||
" # Initialize and run analysis\n",
|
||||
" agents = PraisonAIAgents(\n",
|
||||
" agents=[code_analyzer],\n",
|
||||
" tasks=[code_analysis_task]\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" return agents.start(context_text)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "v25nLA0pmvzf",
|
||||
"metadata": {
|
||||
"id": "v25nLA0pmvzf"
|
||||
},
|
||||
"source": [
|
||||
"## Output\n",
|
||||
"Example usage to run the analysis and view results."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "5BzccaeFmvzg",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 1000
|
||||
},
|
||||
"id": "5BzccaeFmvzg",
|
||||
"outputId": "8b4cddae-b6b3-4a92-8a13-30694cd09c52"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/markdown": [
|
||||
"\n",
|
||||
"### 👤 Agent: Code Analysis Expert\n",
|
||||
"\n",
|
||||
"**Role**: Provides comprehensive code evaluation and recommendations \n",
|
||||
"**Backstory**: Expert in architecture, best practices, and technical assessment \n"
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Markdown object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"─── 📊 AGENT CODE ANALYSIS REPORT ───\n",
|
||||
"{\n",
|
||||
" \"overall_quality\": 85,\n",
|
||||
" \"code_metrics\": [\n",
|
||||
" {\n",
|
||||
" \"category\": \"Architecture and Design\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Modular structure with clear separation of concerns.\",\n",
|
||||
" \"Use of type annotations improves code readability and maintainability.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Code Maintainability\",\n",
|
||||
" \"score\": 85,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Consistent use of type hints and NamedTuple for structured data.\",\n",
|
||||
" \"Logical organization of functions and classes.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Performance Optimization\",\n",
|
||||
" \"score\": 75,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Potential performance overhead due to repeated sys.stdout.write calls.\",\n",
|
||||
" \"Efficient use of optional parameters to control execution flow.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Security Practices\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"No obvious security vulnerabilities in the code.\",\n",
|
||||
" \"Proper encapsulation of functionality.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Test Coverage\",\n",
|
||||
" \"score\": 70,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Lack of explicit test cases in the provided code.\",\n",
|
||||
" \"Use of type checking suggests some level of validation.\"\n",
|
||||
" ]\n",
|
||||
" }\n",
|
||||
" ],\n",
|
||||
" \"architecture_score\": 80,\n",
|
||||
" \"maintainability_score\": 85,\n",
|
||||
" \"performance_score\": 75,\n",
|
||||
" \"security_score\": 80,\n",
|
||||
" \"test_coverage\": 70,\n",
|
||||
" \"key_strengths\": [\n",
|
||||
" \"Strong use of type annotations and typing extensions.\",\n",
|
||||
" \"Clear separation of CLI argument parsing and business logic.\"\n",
|
||||
" ],\n",
|
||||
" \"improvement_areas\": [\n",
|
||||
" \"Increase test coverage to ensure robustness.\",\n",
|
||||
" \"Optimize I/O operations to improve performance.\"\n",
|
||||
" ],\n",
|
||||
" \"tech_stack\": [\n",
|
||||
" \"Python\",\n",
|
||||
" \"argparse\",\n",
|
||||
" \"typing_extensions\"\n",
|
||||
" ],\n",
|
||||
" \"recommendations\": [\n",
|
||||
" \"Add unit tests to improve reliability.\",\n",
|
||||
" \"Consider async I/O for improved performance in CLI tools.\"\n",
|
||||
" ]\n",
|
||||
"}\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import json\n",
|
||||
"from IPython.display import display, Markdown\n",
|
||||
"\n",
|
||||
"# Optional: Define agent info\n",
|
||||
"agent_info = \"\"\"\n",
|
||||
"### 👤 Agent: Code Analysis Expert\n",
|
||||
"\n",
|
||||
"**Role**: Provides comprehensive code evaluation and recommendations\n",
|
||||
"**Backstory**: Expert in architecture, best practices, and technical assessment\n",
|
||||
"\"\"\"\n",
|
||||
"\n",
|
||||
"# Analysis Result Data\n",
|
||||
"analysis_result = {\n",
|
||||
" \"overall_quality\": 85,\n",
|
||||
" \"code_metrics\": [\n",
|
||||
" {\n",
|
||||
" \"category\": \"Architecture and Design\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Modular structure with clear separation of concerns.\",\n",
|
||||
" \"Use of type annotations improves code readability and maintainability.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Code Maintainability\",\n",
|
||||
" \"score\": 85,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Consistent use of type hints and NamedTuple for structured data.\",\n",
|
||||
" \"Logical organization of functions and classes.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Performance Optimization\",\n",
|
||||
" \"score\": 75,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Potential performance overhead due to repeated sys.stdout.write calls.\",\n",
|
||||
" \"Efficient use of optional parameters to control execution flow.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Security Practices\",\n",
|
||||
" \"score\": 80,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"No obvious security vulnerabilities in the code.\",\n",
|
||||
" \"Proper encapsulation of functionality.\"\n",
|
||||
" ]\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" \"category\": \"Test Coverage\",\n",
|
||||
" \"score\": 70,\n",
|
||||
" \"findings\": [\n",
|
||||
" \"Lack of explicit test cases in the provided code.\",\n",
|
||||
" \"Use of type checking suggests some level of validation.\"\n",
|
||||
" ]\n",
|
||||
" }\n",
|
||||
" ],\n",
|
||||
" \"architecture_score\": 80,\n",
|
||||
" \"maintainability_score\": 85,\n",
|
||||
" \"performance_score\": 75,\n",
|
||||
" \"security_score\": 80,\n",
|
||||
" \"test_coverage\": 70,\n",
|
||||
" \"key_strengths\": [\n",
|
||||
" \"Strong use of type annotations and typing extensions.\",\n",
|
||||
" \"Clear separation of CLI argument parsing and business logic.\"\n",
|
||||
" ],\n",
|
||||
" \"improvement_areas\": [\n",
|
||||
" \"Increase test coverage to ensure robustness.\",\n",
|
||||
" \"Optimize I/O operations to improve performance.\"\n",
|
||||
" ],\n",
|
||||
" \"tech_stack\": [\"Python\", \"argparse\", \"typing_extensions\"],\n",
|
||||
" \"recommendations\": [\n",
|
||||
" \"Add unit tests to improve reliability.\",\n",
|
||||
" \"Consider async I/O for improved performance in CLI tools.\"\n",
|
||||
" ]\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"# Display Agent Info and Analysis Report\n",
|
||||
"display(Markdown(agent_info))\n",
|
||||
"print(\"─── 📊 AGENT CODE ANALYSIS REPORT ───\")\n",
|
||||
"print(json.dumps(analysis_result, indent=4))\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.10"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,617 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6UeqOiyEijl3",
|
||||
"metadata": {
|
||||
"id": "6UeqOiyEijl3"
|
||||
},
|
||||
"source": [
|
||||
"**MistralTechAgent Lightweight Technical Assistant Using Mistral-7B-Instruct**"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fYuCNTAtiuD3",
|
||||
"metadata": {
|
||||
"id": "fYuCNTAtiuD3"
|
||||
},
|
||||
"source": [
|
||||
"# 📄 Description:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "hmbRZinQivwt",
|
||||
"metadata": {
|
||||
"id": "hmbRZinQivwt"
|
||||
},
|
||||
"source": [
|
||||
"MistralTechAgent is a simple and efficient AI assistant powered by the Mistral-7B-Instruct model. It is designed to provide accurate and easy-to-understand answers to technical questions. This agent uses a lightweight instruction-tuned model that runs smoothly on limited hardware while delivering high-quality responses. It also supports a customizable prompt format for structured queries."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8qf1K5ycjU1r",
|
||||
"metadata": {
|
||||
"id": "8qf1K5ycjU1r"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/MistralTechAgent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6oVNaoxbfsCP",
|
||||
"metadata": {
|
||||
"id": "6oVNaoxbfsCP"
|
||||
},
|
||||
"source": [
|
||||
"# SETUP: Install Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "af21b3c7",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "af21b3c7",
|
||||
"outputId": "3c900128-c9c1-4688-9f83-eaa2f9d2872e"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.0/67.0 MB\u001b[0m \u001b[31m13.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m5.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m78.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m70.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m57.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m5.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m13.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m88.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[?25h"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!pip install -q transformers accelerate bitsandbytes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "xjXmh8sQf476",
|
||||
"metadata": {
|
||||
"id": "xjXmh8sQf476"
|
||||
},
|
||||
"source": [
|
||||
"# SETUP: Hugging Face Token"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8405c936",
|
||||
"metadata": {
|
||||
"id": "8405c936"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"os.environ[\"HF_TOKEN\"] = \"Enter your hugging api key\"\n",
|
||||
"os.environ[\"TRANSFORMERS_CACHE\"] = \"/content/hf_cache\" # Optional: Faster repeat runs\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "PfKEoHt3haFV",
|
||||
"metadata": {
|
||||
"id": "PfKEoHt3haFV"
|
||||
},
|
||||
"source": [
|
||||
"# YAML Prompt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "iNfVRVN_hJOn",
|
||||
"metadata": {
|
||||
"id": "iNfVRVN_hJOn"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"prompt_template = {\n",
|
||||
" \"role\": \"system\",\n",
|
||||
" \"content\": \"\"\"You are MistralTechAgent, an expert AI model assistant.\n",
|
||||
"You provide clear, concise, and technically correct answers.\"\"\",\n",
|
||||
" \"user_prompt\": \"{{ user_input }}\"\n",
|
||||
"}\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "LJAKEnSQf8gq",
|
||||
"metadata": {
|
||||
"id": "LJAKEnSQf8gq"
|
||||
},
|
||||
"source": [
|
||||
"# Load the Model (Fallback Safe)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d6a29e6a",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 545,
|
||||
"referenced_widgets": [
|
||||
"d84722f34b2847f29f5d72690fc4dac6",
|
||||
"cff68559d8ad46c190e7fe7f9403b9ee",
|
||||
"36abbc31f97041b6a7786ccc3214e6ff",
|
||||
"07d8084255bb465ab1eac565b9f8752f",
|
||||
"9deaf08dabdf4679a2a44bb76e9a90f7",
|
||||
"d07f025f4fe44db082fdf9ffc460ef63",
|
||||
"56f8056ba6964bef922831ba1d4b1c1f",
|
||||
"4f0419a3b0ab450aac64c1cd0ff12e5b",
|
||||
"fe77c87b1caa40ae841bd65f499fc83a",
|
||||
"83ba36ab3e5b455887f5d1fa5594ab78",
|
||||
"005ec31a3aed4dc9b6083a59a9868bbd",
|
||||
"15321d3071894e1c8948664d4e9066d2",
|
||||
"4b43fc4bbce14f98bf8fc253fa3ed054",
|
||||
"5d1662cd47b9477c84e77c29ce5ceeef",
|
||||
"0be07a3e7a094dd09672bea04df7bc80",
|
||||
"4b01774127fc4cf0b67baf13583ba8ed",
|
||||
"ef2f3f069ade44fa8000cfd560b618a9",
|
||||
"21b4e8cefdee4c5e8a2ba142d503fc87",
|
||||
"d426d2480422465eb8b625ebb584feb1",
|
||||
"8c4a7ec3cf8b462eaa5c9df357e216ee",
|
||||
"b80e114ea4e6475297b61f9693d231c1",
|
||||
"7c94da36524d402a81326a49a30cbbb5",
|
||||
"f005c11730fd499bb8f81aaf56c653d9",
|
||||
"c88dca8e5c164bd1a655adf7ced0e86a",
|
||||
"104aa6d812164a76be60cd7d39dd8cde",
|
||||
"f2729ef32b5d48bc8fb5a90f72d5ada2",
|
||||
"38fa0e67450e40ecaf0a35feacb26186",
|
||||
"0a74dde6fe1b45ef9c454dc23e4ccc9e",
|
||||
"238917a3bcc24b5fa68fe2c7edc9234b",
|
||||
"c6484ba3a50b4bec9086d8497b8c2692",
|
||||
"41f62ed77f0449c99362997b36a866ed",
|
||||
"ac54271d234f451eb793f7da28a8b802",
|
||||
"d1574df5392c4bb2a2a6dece0cc30679",
|
||||
"3a8da99cdb184f68b51d9706a867654b",
|
||||
"0e32a6e4428f4ef3afa9a487c1524f89",
|
||||
"b88cc5c73c734d15a4f8e073c8f3355a",
|
||||
"0dde4efd517d422cbc70f9379cf831f6",
|
||||
"4ffe478a8f654f008453fcb1e159b5c7",
|
||||
"053d6a80586e41ba88299b55570922ac",
|
||||
"f84040d89eb14f2ca2f3a88121c02182",
|
||||
"7536d676b440429cb157919373401266",
|
||||
"d2bada90caee4a37a6172ea6b046aec8",
|
||||
"0c84482a056a4dd89f0369fc0ce33a89",
|
||||
"648e7a00926845cd91344ce8cec2f8c7",
|
||||
"ffa6acc3f9ba41dc8a3b57716cd9e040",
|
||||
"a875f5aaea024290b2c347bdc9216b0c",
|
||||
"a60321d756a54737ba37053a43890129",
|
||||
"4aba7d0dd458437ab2d38d615fce9fc2",
|
||||
"7b2205697a1b41cdbe363c56345b8d01",
|
||||
"e2c0fd4a5436449cb3adca1f2204088e",
|
||||
"0e3fa8394aa749498e2898049fad0536",
|
||||
"fec704faaa5945b9917e730d2db8dd41",
|
||||
"6a117742183c4b7d8011df4b8a1a4a76",
|
||||
"60284b7ab8d845389419c7ac13d3cd3f",
|
||||
"2f36f3edcdd14cdbafa6217758ce99f6",
|
||||
"b9a0aeb8daf24fbd901a13cf728a7f31",
|
||||
"d769287686274598b83c6d4f3adf86eb",
|
||||
"6092a601fee7400187e85322d8c392d4",
|
||||
"3e397abc9c704ddb8b7bc8e0dcbee6bc",
|
||||
"ea3d99ef60e048fab9b9fb8c4c8c30b8",
|
||||
"8bb3bacb95b447a8b3c58edf8f61e787",
|
||||
"f586830e76dc42cd960b3f0b85103307",
|
||||
"6ad155c4df5d4f30a481e5041e45edd2",
|
||||
"31f8ebe87ae34e42ae0a78a6f9099191",
|
||||
"87bd98a893ca4a8eae7c8e1a12449b52",
|
||||
"3c3ccb3c9cbf4cacace8e24abb0a91ea",
|
||||
"1edd5f953fd04bc7b8d20b5ffceabb3c",
|
||||
"4df5649528874b209439c0c228dfabc0",
|
||||
"fd76767d90c14fa596ee606ce4ed04da",
|
||||
"259ecb69082644418e64abeb668ac24a",
|
||||
"31d294d5e1ec4b229cf6f84f4d5ae1b0",
|
||||
"24b5318baf2e4a45bda8fc93168b8a14",
|
||||
"503c7ac86036420ba69af49ac8b3b9c6",
|
||||
"13ad3a362cf341c1923abb4b3b1cd680",
|
||||
"1eb86202e6aa4fe39e8de1f0af54b794",
|
||||
"c24ffdfc0cd44a18b32803f93951029d",
|
||||
"99190548afb445b9bcc552ec16971a8f",
|
||||
"5b59bb8867b74cd28f342b5750232986",
|
||||
"cd1b87d6fdd94f92ad015506b2ba2c5e",
|
||||
"9a47c5378bce4a619409df36231ada16",
|
||||
"a9cac4aa7fc243238c17c3fa76d3fdfb",
|
||||
"d0da7d1ddbeb45deaeca52b1a8446ce1",
|
||||
"4c30d02b0b7947c4ad60bb822dac264e",
|
||||
"7a62762db5f84a6782663e36565f7cea",
|
||||
"64c0dff073c24b15b9a211112ccc2d47",
|
||||
"d6d5d90e878e4aa3a9d5c09d1ac8cd92",
|
||||
"c9fef86db14d4e8e9a127c1dd1edc729",
|
||||
"212f60982a33493497050c3d12c2363d",
|
||||
"05010758eed94155887ee707b3648ca0",
|
||||
"43f71ce03f874002afcabf2b64f946be",
|
||||
"5282b4041f064cbc890dcdaa3bbd6104",
|
||||
"07cb2d7c0c0f4bfd8ec7a3857a731390",
|
||||
"3a8973062f654466925d40e35fe5e063",
|
||||
"ded64c09b9b44838bc86e0e648c1c52b",
|
||||
"0eb43a6eb7aa484a9e07309479978586",
|
||||
"bbe209e71cad4c6d99a073bc900cf880",
|
||||
"8cb9fb71cbd64904bbad6c2c5f7d1ffe",
|
||||
"e8a986f524aa40339ab1f9fc5c92c0d4",
|
||||
"02a5f1682b5e4afb875f3542b4b26c74",
|
||||
"a7d0ecbe717f4427a99296ce2054e3fc",
|
||||
"ed0039d420fa47518e2bc4626a549c86",
|
||||
"0e14815b8e4d4fb2a39a97ca1e743a69",
|
||||
"022675075da14683b86d4e56d29e291e",
|
||||
"550b21f1e49e4cefa4a68d5b5e9bac01",
|
||||
"0b598550b4234654a8454d5f9c70b1e4",
|
||||
"880f0cf380fc4b499468db81b063a27e",
|
||||
"758ce764b5294a5ab0c97e439a172cb2",
|
||||
"410954f602984cd7bf39d2b12c5105c4",
|
||||
"8eab2746f98e4d57b148969f9af8b17f",
|
||||
"b622a9fb49fb43a6ae12004823b9b6e9",
|
||||
"53a30b0dc2034bf0aa28c853b9c0e270",
|
||||
"174544c42508419a9ea1dec2b5a48eec",
|
||||
"aaa735b347074f02b9b174724beabfce",
|
||||
"66fd00b5b01f46f1b362013d022ad437",
|
||||
"734c206c4bbb4cc08da0a061a0671baa",
|
||||
"5a185bcc5f814b1c829fa7a702a763a2",
|
||||
"c1928ef5ac3841a8a97c69b11ea8a6da",
|
||||
"2c318f2f01fc4271a890ec6b8238c9ad",
|
||||
"2d7ff096493b425eafb671f6d23de282",
|
||||
"493fd41d50bc4ed5aa33e58a50254edb",
|
||||
"5016341a1d0d4e59ad263aa81f81d5fd"
|
||||
]
|
||||
},
|
||||
"id": "d6a29e6a",
|
||||
"outputId": "9417ca92-9348-427d-e8e1-aabf3e716dbd"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/usr/local/lib/python3.11/dist-packages/transformers/utils/hub.py:111: FutureWarning: Using `TRANSFORMERS_CACHE` is deprecated and will be removed in v5 of Transformers. Use `HF_HOME` instead.\n",
|
||||
" warnings.warn(\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"🔄 Loading model: mistralai/Mistral-7B-Instruct-v0.1\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/usr/local/lib/python3.11/dist-packages/transformers/models/auto/tokenization_auto.py:902: FutureWarning: The `use_auth_token` argument is deprecated and will be removed in v5 of Transformers. Please use `token` instead.\n",
|
||||
" warnings.warn(\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "d84722f34b2847f29f5d72690fc4dac6",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer_config.json: 0%| | 0.00/2.10k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "15321d3071894e1c8948664d4e9066d2",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer.model: 0%| | 0.00/493k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "f005c11730fd499bb8f81aaf56c653d9",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer.json: 0%| | 0.00/1.80M [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "3a8da99cdb184f68b51d9706a867654b",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"special_tokens_map.json: 0%| | 0.00/414 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/usr/local/lib/python3.11/dist-packages/transformers/models/auto/auto_factory.py:476: FutureWarning: The `use_auth_token` argument is deprecated and will be removed in v5 of Transformers. Please use `token` instead.\n",
|
||||
" warnings.warn(\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "ffa6acc3f9ba41dc8a3b57716cd9e040",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"config.json: 0%| | 0.00/571 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "b9a0aeb8daf24fbd901a13cf728a7f31",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"model.safetensors.index.json: 0%| | 0.00/25.1k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "1edd5f953fd04bc7b8d20b5ffceabb3c",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Fetching 2 files: 0%| | 0/2 [00:00<?, ?it/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "5b59bb8867b74cd28f342b5750232986",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"model-00002-of-00002.safetensors: 0%| | 0.00/4.54G [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "05010758eed94155887ee707b3648ca0",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"model-00001-of-00002.safetensors: 0%| | 0.00/9.94G [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "a7d0ecbe717f4427a99296ce2054e3fc",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Loading checkpoint shards: 0%| | 0/2 [00:00<?, ?it/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "53a30b0dc2034bf0aa28c853b9c0e270",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"generation_config.json: 0%| | 0.00/116 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:accelerate.big_modeling:Some parameters are on the meta device because they were offloaded to the cpu.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ Model loaded successfully!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
|
||||
"import torch\n",
|
||||
"\n",
|
||||
"model_name = \"mistralai/Mistral-7B-Instruct-v0.1\"\n",
|
||||
"\n",
|
||||
"try:\n",
|
||||
" print(f\"🔄 Loading model: {model_name}\")\n",
|
||||
" tokenizer = AutoTokenizer.from_pretrained(\n",
|
||||
" model_name, use_auth_token=os.environ[\"HF_TOKEN\"], trust_remote_code=True\n",
|
||||
" )\n",
|
||||
" model = AutoModelForCausalLM.from_pretrained(\n",
|
||||
" model_name,\n",
|
||||
" use_auth_token=os.environ[\"HF_TOKEN\"],\n",
|
||||
" trust_remote_code=True,\n",
|
||||
" device_map=\"auto\",\n",
|
||||
" torch_dtype=torch.float16\n",
|
||||
" )\n",
|
||||
" model.eval()\n",
|
||||
" print(\"✅ Model loaded successfully!\")\n",
|
||||
"\n",
|
||||
"except Exception as e:\n",
|
||||
" print(f\"❌ Failed to load {model_name}\\nError: {e}\")\n",
|
||||
" model_name = \"distilgpt2\"\n",
|
||||
" tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
||||
" model = AutoModelForCausalLM.from_pretrained(model_name)\n",
|
||||
" model.eval()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "GWj9n1cVg5xj",
|
||||
"metadata": {
|
||||
"id": "GWj9n1cVg5xj"
|
||||
},
|
||||
"source": [
|
||||
"# Define the MistralTechAgent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "83492929",
|
||||
"metadata": {
|
||||
"id": "83492929"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"\n",
|
||||
"class MistralTechAgent:\n",
|
||||
" def __init__(self, model, tokenizer):\n",
|
||||
" self.model = model\n",
|
||||
" self.tokenizer = tokenizer\n",
|
||||
"\n",
|
||||
" def chat(self, prompt: str, max_new_tokens=256) -> str:\n",
|
||||
" inputs = self.tokenizer(prompt, return_tensors=\"pt\").to(self.model.device)\n",
|
||||
" with torch.no_grad():\n",
|
||||
" outputs = self.model.generate(\n",
|
||||
" **inputs,\n",
|
||||
" max_new_tokens=max_new_tokens,\n",
|
||||
" do_sample=False, # DETERMINISTIC output\n",
|
||||
" temperature=1.0,\n",
|
||||
" top_p=1.0,\n",
|
||||
" pad_token_id=self.tokenizer.eos_token_id\n",
|
||||
" )\n",
|
||||
" full_output = self.tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
||||
" return full_output[len(prompt):].strip()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "QZC6QzA4hB8m",
|
||||
"metadata": {
|
||||
"id": "QZC6QzA4hB8m"
|
||||
},
|
||||
"source": [
|
||||
"# Test the Agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "83a3388e",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "83a3388e",
|
||||
"outputId": "ebfc13f5-bae9-4647-fc7c-78c386afa03c"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"=== Agent Response ===\n",
|
||||
"A language model is a type of artificial intelligence (AI) model that is designed to understand, interpret, and generate human language. It is a machine learning model that is trained on large amounts of text data to learn the patterns and structures of language, including grammar, vocabulary, and syntax.\n",
|
||||
"\n",
|
||||
"Language models can be used for a variety of tasks, such as language translation, sentiment analysis, text summarization, and speech recognition. They are often used in natural language processing (NLP) applications, where they help machines to understand and interact with humans in a more natural and intuitive way.\n",
|
||||
"\n",
|
||||
"There are several types of language models, including statistical language models, neural language models, and transformer-based language models. These models differ in their architecture, training methods, and performance on different NLP tasks.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"agent = MistralTechAgent(model, tokenizer)\n",
|
||||
"\n",
|
||||
"prompt = \"You are an AI agent helping with technical queries. Explain what a language model is.\"\n",
|
||||
"response = agent.chat(prompt)\n",
|
||||
"\n",
|
||||
"print(\"=== Agent Response ===\")\n",
|
||||
"print(response)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"accelerator": "GPU",
|
||||
"colab": {
|
||||
"gpuType": "T4",
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,922 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "uJ93P7ksa2Nn"
|
||||
},
|
||||
"source": [
|
||||
"# Local RAG Document Agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "vxe5gDW0a4pC"
|
||||
},
|
||||
"source": [
|
||||
"* A Retrieval-Augmented Generation agent that uses local models and vector databases for document-based question answering.\n",
|
||||
"* The agent can process PDF documents, extract knowledge, and answer questions using local LLM inference without external API calls.\n",
|
||||
"* Features include document upload, vector embedding, similarity search, and intelligent Q&A with source attribution and context awareness."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "K3HdvvEid5wP"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/local_rag_document_qa_agent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "xaXT3inobISk"
|
||||
},
|
||||
"source": [
|
||||
"# Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "VBIlMa0vbBWm"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonai streamlit qdrant-client ollama pypdf PyPDF2 chromadb sentence-transformers"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "FttFP60zb30i"
|
||||
},
|
||||
"source": [
|
||||
"# Setup Key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "smr-FEPhb3Yx",
|
||||
"outputId": "526779e1-94ed-46f9-9288-6d9ee5b25a19"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ API key configured!\n",
|
||||
"✅ Using local Ollama models for RAG operations\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Setup Key\n",
|
||||
"import os\n",
|
||||
"openai_key = \"sk-..\"\n",
|
||||
"\n",
|
||||
"os.environ[\"OPENAI_API_KEY\"] = openai_key\n",
|
||||
"\n",
|
||||
"# Ollama setup (for local models)\n",
|
||||
"# Make sure Ollama is installed and running locally\n",
|
||||
"# Available models: llama3.2, llama3.1, mistral, codellama, etc.\n",
|
||||
"\n",
|
||||
"print(\"✅ API key configured!\")\n",
|
||||
"print(\"✅ Using local Ollama models for RAG operations\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "4hEC_bn1cGOH"
|
||||
},
|
||||
"source": [
|
||||
"# Tools"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {
|
||||
"id": "bXEhVTwocH1J"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Custom Document Processing Tool\n",
|
||||
"import PyPDF2\n",
|
||||
"import tempfile\n",
|
||||
"import os\n",
|
||||
"from typing import Dict, Any, List\n",
|
||||
"import pandas as pd\n",
|
||||
"\n",
|
||||
"class DocumentProcessingTool:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.supported_formats = ['.pdf', '.txt', '.md', '.csv']\n",
|
||||
"\n",
|
||||
" def process_document(self, file_path: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Process different document formats and extract text\"\"\"\n",
|
||||
" try:\n",
|
||||
" file_ext = os.path.splitext(file_path)[1].lower()\n",
|
||||
"\n",
|
||||
" if file_ext == '.pdf':\n",
|
||||
" return self._process_pdf(file_path)\n",
|
||||
" elif file_ext == '.txt':\n",
|
||||
" return self._process_txt(file_path)\n",
|
||||
" elif file_ext == '.md':\n",
|
||||
" return self._process_md(file_path)\n",
|
||||
" elif file_ext == '.csv':\n",
|
||||
" return self._process_csv(file_path)\n",
|
||||
" else:\n",
|
||||
" return {\"error\": f\"Unsupported file format: {file_ext}\"}\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error processing document: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _process_pdf(self, file_path: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Process PDF files\"\"\"\n",
|
||||
" try:\n",
|
||||
" with open(file_path, 'rb') as file:\n",
|
||||
" pdf_reader = PyPDF2.PdfReader(file)\n",
|
||||
" text = \"\"\n",
|
||||
" for page in pdf_reader.pages:\n",
|
||||
" text += page.extract_text() + \"\\n\"\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"text\": text,\n",
|
||||
" \"pages\": len(pdf_reader.pages),\n",
|
||||
" \"format\": \"pdf\",\n",
|
||||
" \"file_path\": file_path\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"PDF processing error: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _process_txt(self, file_path: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Process text files\"\"\"\n",
|
||||
" try:\n",
|
||||
" with open(file_path, 'r', encoding='utf-8') as file:\n",
|
||||
" text = file.read()\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"text\": text,\n",
|
||||
" \"format\": \"txt\",\n",
|
||||
" \"file_path\": file_path\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Text processing error: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _process_md(self, file_path: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Process markdown files\"\"\"\n",
|
||||
" try:\n",
|
||||
" with open(file_path, 'r', encoding='utf-8') as file:\n",
|
||||
" text = file.read()\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"text\": text,\n",
|
||||
" \"format\": \"md\",\n",
|
||||
" \"file_path\": file_path\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Markdown processing error: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _process_csv(self, file_path: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Process CSV files\"\"\"\n",
|
||||
" try:\n",
|
||||
" df = pd.read_csv(file_path)\n",
|
||||
" text = df.to_string(index=False)\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"text\": text,\n",
|
||||
" \"format\": \"csv\",\n",
|
||||
" \"rows\": len(df),\n",
|
||||
" \"columns\": len(df.columns),\n",
|
||||
" \"file_path\": file_path\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"CSV processing error: {str(e)}\"}\n",
|
||||
"\n",
|
||||
"# Custom Vector Database Tool (Fixed for new ChromaDB)\n",
|
||||
"import chromadb\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"class VectorDatabaseTool:\n",
|
||||
" def __init__(self, collection_name: str = \"document_qa\"):\n",
|
||||
" self.collection_name = collection_name\n",
|
||||
" # Use new ChromaDB client configuration\n",
|
||||
" self.client = chromadb.PersistentClient(path=\"./chroma_db\")\n",
|
||||
" self.collection = self.client.get_or_create_collection(name=collection_name)\n",
|
||||
"\n",
|
||||
" def add_documents(self, documents: List[str], metadatas: List[Dict] = None, ids: List[str] = None) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Add documents to the vector database\"\"\"\n",
|
||||
" try:\n",
|
||||
" if ids is None:\n",
|
||||
" ids = [f\"doc_{i}\" for i in range(len(documents))]\n",
|
||||
" if metadatas is None:\n",
|
||||
" metadatas = [{\"source\": f\"document_{i}\"} for i in range(len(documents))]\n",
|
||||
"\n",
|
||||
" self.collection.add(\n",
|
||||
" documents=documents,\n",
|
||||
" metadatas=metadatas,\n",
|
||||
" ids=ids\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"success\": True,\n",
|
||||
" \"documents_added\": len(documents),\n",
|
||||
" \"collection_name\": self.collection_name\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error adding documents: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def search_documents(self, query: str, n_results: int = 5) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Search for relevant documents\"\"\"\n",
|
||||
" try:\n",
|
||||
" results = self.collection.query(\n",
|
||||
" query_texts=[query],\n",
|
||||
" n_results=n_results\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"success\": True,\n",
|
||||
" \"query\": query,\n",
|
||||
" \"results\": results,\n",
|
||||
" \"num_results\": len(results['documents'][0]) if results['documents'] else 0\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error searching documents: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def get_collection_info(self) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Get information about the collection\"\"\"\n",
|
||||
" try:\n",
|
||||
" count = self.collection.count()\n",
|
||||
" return {\n",
|
||||
" \"success\": True,\n",
|
||||
" \"collection_name\": self.collection_name,\n",
|
||||
" \"document_count\": count\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error getting collection info: {str(e)}\"}\n",
|
||||
"\n",
|
||||
"# Custom Text Chunking Tool\n",
|
||||
"import re\n",
|
||||
"from typing import List\n",
|
||||
"\n",
|
||||
"class TextChunkingTool:\n",
|
||||
" def __init__(self, chunk_size: int = 1000, chunk_overlap: int = 200):\n",
|
||||
" self.chunk_size = chunk_size\n",
|
||||
" self.chunk_overlap = chunk_overlap\n",
|
||||
"\n",
|
||||
" def chunk_text(self, text: str) -> List[str]:\n",
|
||||
" \"\"\"Split text into overlapping chunks\"\"\"\n",
|
||||
" try:\n",
|
||||
" # Clean the text\n",
|
||||
" text = re.sub(r'\\s+', ' ', text).strip()\n",
|
||||
"\n",
|
||||
" # Split into sentences first\n",
|
||||
" sentences = re.split(r'[.!?]+', text)\n",
|
||||
" sentences = [s.strip() for s in sentences if s.strip()]\n",
|
||||
"\n",
|
||||
" chunks = []\n",
|
||||
" current_chunk = \"\"\n",
|
||||
"\n",
|
||||
" for sentence in sentences:\n",
|
||||
" # If adding this sentence would exceed chunk size\n",
|
||||
" if len(current_chunk) + len(sentence) > self.chunk_size and current_chunk:\n",
|
||||
" chunks.append(current_chunk.strip())\n",
|
||||
" # Start new chunk with overlap\n",
|
||||
" overlap_start = max(0, len(current_chunk) - self.chunk_overlap)\n",
|
||||
" current_chunk = current_chunk[overlap_start:] + \" \" + sentence\n",
|
||||
" else:\n",
|
||||
" current_chunk += \" \" + sentence if current_chunk else sentence\n",
|
||||
"\n",
|
||||
" # Add the last chunk\n",
|
||||
" if current_chunk:\n",
|
||||
" chunks.append(current_chunk.strip())\n",
|
||||
"\n",
|
||||
" return chunks\n",
|
||||
" except Exception as e:\n",
|
||||
" return [f\"Error chunking text: {str(e)}\"]\n",
|
||||
"\n",
|
||||
" def chunk_text_by_paragraphs(self, text: str) -> List[str]:\n",
|
||||
" \"\"\"Split text by paragraphs\"\"\"\n",
|
||||
" try:\n",
|
||||
" paragraphs = text.split('\\n\\n')\n",
|
||||
" chunks = []\n",
|
||||
"\n",
|
||||
" for paragraph in paragraphs:\n",
|
||||
" paragraph = paragraph.strip()\n",
|
||||
" if paragraph:\n",
|
||||
" # If paragraph is too long, split it further\n",
|
||||
" if len(paragraph) > self.chunk_size:\n",
|
||||
" sub_chunks = self.chunk_text(paragraph)\n",
|
||||
" chunks.extend(sub_chunks)\n",
|
||||
" else:\n",
|
||||
" chunks.append(paragraph)\n",
|
||||
"\n",
|
||||
" return chunks\n",
|
||||
" except Exception as e:\n",
|
||||
" return [f\"Error chunking paragraphs: {str(e)}\"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "vuE2noGJc5UM"
|
||||
},
|
||||
"source": [
|
||||
"# YAML Prompt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "9okcME5dc6g5",
|
||||
"outputId": "04372512-a187-4db2-e578-d6964b9b0ee7"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ YAML Prompt configured!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# YAML Prompt\n",
|
||||
"yaml_prompt = \"\"\"\n",
|
||||
"name: \"Local RAG Document Agent\"\n",
|
||||
"description: \"Expert document analyst with local LLM capabilities and vector search\"\n",
|
||||
"instructions:\n",
|
||||
" - \"You are an expert document analyst that processes and analyzes documents using local LLM models\"\n",
|
||||
" - \"Use vector database search to find relevant document chunks for answering questions\"\n",
|
||||
" - \"Process uploaded documents and extract meaningful information\"\n",
|
||||
" - \"Provide accurate answers based on document content with source attribution\"\n",
|
||||
" - \"Chunk documents appropriately for optimal vector search performance\"\n",
|
||||
" - \"Always cite the source document when providing answers\"\n",
|
||||
" - \"Use markdown formatting for better readability\"\n",
|
||||
" - \"Handle multiple document formats (PDF, TXT, MD, CSV)\"\n",
|
||||
" - \"Provide context-aware responses based on document content\"\n",
|
||||
"\n",
|
||||
"tools:\n",
|
||||
" - name: \"DocumentProcessingTool\"\n",
|
||||
" description: \"Processes different document formats (PDF, TXT, MD, CSV) and extracts text content\"\n",
|
||||
" - name: \"VectorDatabaseTool\"\n",
|
||||
" description: \"Manages vector database operations for document storage and similarity search\"\n",
|
||||
" - name: \"TextChunkingTool\"\n",
|
||||
" description: \"Splits text into appropriate chunks for vector embedding and retrieval\"\n",
|
||||
"\n",
|
||||
"output_format:\n",
|
||||
" - \"Provide clear, document-based answers\"\n",
|
||||
" - \"Include source attribution when possible\"\n",
|
||||
" - \"Summarize key information from documents\"\n",
|
||||
" - \"Suggest follow-up questions if relevant\"\n",
|
||||
" - \"Use bullet points and structured formatting\"\n",
|
||||
" - \"Highlight important findings from the documents\"\n",
|
||||
"\n",
|
||||
"temperature: 0.3\n",
|
||||
"max_tokens: 4000\n",
|
||||
"model: \"local-llama3.2\"\n",
|
||||
"\"\"\"\n",
|
||||
"\n",
|
||||
"print(\"✅ YAML Prompt configured!\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "fF-XYF0UdEnT"
|
||||
},
|
||||
"source": [
|
||||
"# Main"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 1000
|
||||
},
|
||||
"id": "AoZrQUyLdGCT",
|
||||
"outputId": "069a3115-b6c0-4111-b1ca-080466048f30"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"�� Local RAG Document Agent\n",
|
||||
"Document-based Q&A powered by local LLM and vector search!\n",
|
||||
"\n",
|
||||
"📁 Upload Your Documents\n",
|
||||
"Please upload PDF, TXT, MD, or CSV files:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"\n",
|
||||
" <input type=\"file\" id=\"files-bc658477-fb0b-4b0b-a549-501485fe7cab\" name=\"files[]\" multiple disabled\n",
|
||||
" style=\"border:none\" />\n",
|
||||
" <output id=\"result-bc658477-fb0b-4b0b-a549-501485fe7cab\">\n",
|
||||
" Upload widget is only available when the cell has been executed in the\n",
|
||||
" current browser session. Please rerun this cell to enable.\n",
|
||||
" </output>\n",
|
||||
" <script>// Copyright 2017 Google LLC\n",
|
||||
"//\n",
|
||||
"// Licensed under the Apache License, Version 2.0 (the \"License\");\n",
|
||||
"// you may not use this file except in compliance with the License.\n",
|
||||
"// You may obtain a copy of the License at\n",
|
||||
"//\n",
|
||||
"// http://www.apache.org/licenses/LICENSE-2.0\n",
|
||||
"//\n",
|
||||
"// Unless required by applicable law or agreed to in writing, software\n",
|
||||
"// distributed under the License is distributed on an \"AS IS\" BASIS,\n",
|
||||
"// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
|
||||
"// See the License for the specific language governing permissions and\n",
|
||||
"// limitations under the License.\n",
|
||||
"\n",
|
||||
"/**\n",
|
||||
" * @fileoverview Helpers for google.colab Python module.\n",
|
||||
" */\n",
|
||||
"(function(scope) {\n",
|
||||
"function span(text, styleAttributes = {}) {\n",
|
||||
" const element = document.createElement('span');\n",
|
||||
" element.textContent = text;\n",
|
||||
" for (const key of Object.keys(styleAttributes)) {\n",
|
||||
" element.style[key] = styleAttributes[key];\n",
|
||||
" }\n",
|
||||
" return element;\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"// Max number of bytes which will be uploaded at a time.\n",
|
||||
"const MAX_PAYLOAD_SIZE = 100 * 1024;\n",
|
||||
"\n",
|
||||
"function _uploadFiles(inputId, outputId) {\n",
|
||||
" const steps = uploadFilesStep(inputId, outputId);\n",
|
||||
" const outputElement = document.getElementById(outputId);\n",
|
||||
" // Cache steps on the outputElement to make it available for the next call\n",
|
||||
" // to uploadFilesContinue from Python.\n",
|
||||
" outputElement.steps = steps;\n",
|
||||
"\n",
|
||||
" return _uploadFilesContinue(outputId);\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"// This is roughly an async generator (not supported in the browser yet),\n",
|
||||
"// where there are multiple asynchronous steps and the Python side is going\n",
|
||||
"// to poll for completion of each step.\n",
|
||||
"// This uses a Promise to block the python side on completion of each step,\n",
|
||||
"// then passes the result of the previous step as the input to the next step.\n",
|
||||
"function _uploadFilesContinue(outputId) {\n",
|
||||
" const outputElement = document.getElementById(outputId);\n",
|
||||
" const steps = outputElement.steps;\n",
|
||||
"\n",
|
||||
" const next = steps.next(outputElement.lastPromiseValue);\n",
|
||||
" return Promise.resolve(next.value.promise).then((value) => {\n",
|
||||
" // Cache the last promise value to make it available to the next\n",
|
||||
" // step of the generator.\n",
|
||||
" outputElement.lastPromiseValue = value;\n",
|
||||
" return next.value.response;\n",
|
||||
" });\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"/**\n",
|
||||
" * Generator function which is called between each async step of the upload\n",
|
||||
" * process.\n",
|
||||
" * @param {string} inputId Element ID of the input file picker element.\n",
|
||||
" * @param {string} outputId Element ID of the output display.\n",
|
||||
" * @return {!Iterable<!Object>} Iterable of next steps.\n",
|
||||
" */\n",
|
||||
"function* uploadFilesStep(inputId, outputId) {\n",
|
||||
" const inputElement = document.getElementById(inputId);\n",
|
||||
" inputElement.disabled = false;\n",
|
||||
"\n",
|
||||
" const outputElement = document.getElementById(outputId);\n",
|
||||
" outputElement.innerHTML = '';\n",
|
||||
"\n",
|
||||
" const pickedPromise = new Promise((resolve) => {\n",
|
||||
" inputElement.addEventListener('change', (e) => {\n",
|
||||
" resolve(e.target.files);\n",
|
||||
" });\n",
|
||||
" });\n",
|
||||
"\n",
|
||||
" const cancel = document.createElement('button');\n",
|
||||
" inputElement.parentElement.appendChild(cancel);\n",
|
||||
" cancel.textContent = 'Cancel upload';\n",
|
||||
" const cancelPromise = new Promise((resolve) => {\n",
|
||||
" cancel.onclick = () => {\n",
|
||||
" resolve(null);\n",
|
||||
" };\n",
|
||||
" });\n",
|
||||
"\n",
|
||||
" // Wait for the user to pick the files.\n",
|
||||
" const files = yield {\n",
|
||||
" promise: Promise.race([pickedPromise, cancelPromise]),\n",
|
||||
" response: {\n",
|
||||
" action: 'starting',\n",
|
||||
" }\n",
|
||||
" };\n",
|
||||
"\n",
|
||||
" cancel.remove();\n",
|
||||
"\n",
|
||||
" // Disable the input element since further picks are not allowed.\n",
|
||||
" inputElement.disabled = true;\n",
|
||||
"\n",
|
||||
" if (!files) {\n",
|
||||
" return {\n",
|
||||
" response: {\n",
|
||||
" action: 'complete',\n",
|
||||
" }\n",
|
||||
" };\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" for (const file of files) {\n",
|
||||
" const li = document.createElement('li');\n",
|
||||
" li.append(span(file.name, {fontWeight: 'bold'}));\n",
|
||||
" li.append(span(\n",
|
||||
" `(${file.type || 'n/a'}) - ${file.size} bytes, ` +\n",
|
||||
" `last modified: ${\n",
|
||||
" file.lastModifiedDate ? file.lastModifiedDate.toLocaleDateString() :\n",
|
||||
" 'n/a'} - `));\n",
|
||||
" const percent = span('0% done');\n",
|
||||
" li.appendChild(percent);\n",
|
||||
"\n",
|
||||
" outputElement.appendChild(li);\n",
|
||||
"\n",
|
||||
" const fileDataPromise = new Promise((resolve) => {\n",
|
||||
" const reader = new FileReader();\n",
|
||||
" reader.onload = (e) => {\n",
|
||||
" resolve(e.target.result);\n",
|
||||
" };\n",
|
||||
" reader.readAsArrayBuffer(file);\n",
|
||||
" });\n",
|
||||
" // Wait for the data to be ready.\n",
|
||||
" let fileData = yield {\n",
|
||||
" promise: fileDataPromise,\n",
|
||||
" response: {\n",
|
||||
" action: 'continue',\n",
|
||||
" }\n",
|
||||
" };\n",
|
||||
"\n",
|
||||
" // Use a chunked sending to avoid message size limits. See b/62115660.\n",
|
||||
" let position = 0;\n",
|
||||
" do {\n",
|
||||
" const length = Math.min(fileData.byteLength - position, MAX_PAYLOAD_SIZE);\n",
|
||||
" const chunk = new Uint8Array(fileData, position, length);\n",
|
||||
" position += length;\n",
|
||||
"\n",
|
||||
" const base64 = btoa(String.fromCharCode.apply(null, chunk));\n",
|
||||
" yield {\n",
|
||||
" response: {\n",
|
||||
" action: 'append',\n",
|
||||
" file: file.name,\n",
|
||||
" data: base64,\n",
|
||||
" },\n",
|
||||
" };\n",
|
||||
"\n",
|
||||
" let percentDone = fileData.byteLength === 0 ?\n",
|
||||
" 100 :\n",
|
||||
" Math.round((position / fileData.byteLength) * 100);\n",
|
||||
" percent.textContent = `${percentDone}% done`;\n",
|
||||
"\n",
|
||||
" } while (position < fileData.byteLength);\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" // All done.\n",
|
||||
" yield {\n",
|
||||
" response: {\n",
|
||||
" action: 'complete',\n",
|
||||
" }\n",
|
||||
" };\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"scope.google = scope.google || {};\n",
|
||||
"scope.google.colab = scope.google.colab || {};\n",
|
||||
"scope.google.colab._files = {\n",
|
||||
" _uploadFiles,\n",
|
||||
" _uploadFilesContinue,\n",
|
||||
"};\n",
|
||||
"})(self);\n",
|
||||
"</script> "
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Saving customers-100.csv to customers-100.csv\n",
|
||||
"\n",
|
||||
"📄 Processing: customers-100.csv\n",
|
||||
"✅ Successfully processed customers-100.csv\n",
|
||||
" - Format: csv\n",
|
||||
" - Text length: 27875 characters\n",
|
||||
"\n",
|
||||
"�� Processing Summary:\n",
|
||||
"- Total documents processed: 1\n",
|
||||
"\n",
|
||||
"�� Chunking documents for vector storage...\n",
|
||||
"- Total chunks created: 23\n",
|
||||
"\n",
|
||||
"🗄️ Adding documents to vector database...\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/root/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx.tar.gz: 100%|██████████| 79.3M/79.3M [00:01<00:00, 70.7MiB/s]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ Successfully added 23 chunks to vector database\n",
|
||||
"📈 Vector database now contains 23 total chunks\n",
|
||||
"\n",
|
||||
"🤔 Interactive Q&A Session\n",
|
||||
"Ask questions about your documents (type 'quit' to exit):\n",
|
||||
"\n",
|
||||
"❓ Your question: what is that\n",
|
||||
"🔍 Searching for relevant information...\n",
|
||||
"📚 Found 3 relevant chunks:\n",
|
||||
"\n",
|
||||
"--- Chunk 1 ---\n",
|
||||
"Source: /tmp/tmp7yzm_3y4.csv\n",
|
||||
"Format: csv\n",
|
||||
"Content: ank com 2020-03-26 https://www pugh com/ 92 98b3aeDcC3B9FF3 Shane Foley Rocha-Hart South Dannymouth Hungary +1-822-569-0302 001-626-114-5844x55073 nsteele@sparks com 2021-07-06 https://www holt-sparks...\n",
|
||||
"\n",
|
||||
"--- Chunk 2 ---\n",
|
||||
"Source: /tmp/tmp7yzm_3y4.csv\n",
|
||||
"Format: csv\n",
|
||||
"Content: Robersonstad Cyprus 854-138-4911x5772 +1-448-910-2276x729 mariokhan@ryan-pope org 2020-01-13 https://www bullock net/ 10 8C2811a503C7c5a Michelle Gallagher Beck-Hendrix Elaineberg Timor-Leste 739 218 ...\n",
|
||||
"\n",
|
||||
"--- Chunk 3 ---\n",
|
||||
"Source: /tmp/tmp7yzm_3y4.csv\n",
|
||||
"Format: csv\n",
|
||||
"Content: x58692 001-841-293-3519x614 hhart@jensen com 2022-01-30 http://hayes-perez com/ 97 CeD220bdAaCfaDf Lynn Atkinson Ware, Burns and Oneal New Bradview Sri Lanka +1-846-706-2218 605 413 3198 vkemp@ferrell...\n",
|
||||
"\n",
|
||||
"💡 AI Answer (using local LLM):\n",
|
||||
"Based on the document content, here's what I found...\n",
|
||||
"(This would be generated by the local LLM model)\n",
|
||||
"\n",
|
||||
"❓ Your question: how much total text length\n",
|
||||
"🔍 Searching for relevant information...\n",
|
||||
"📚 Found 3 relevant chunks:\n",
|
||||
"\n",
|
||||
"--- Chunk 1 ---\n",
|
||||
"Source: /tmp/tmp7yzm_3y4.csv\n",
|
||||
"Format: csv\n",
|
||||
"Content: 2-13 https://gillespie-holder com/ 44 D3fC11A9C235Dc6 Luis Greer Cross PLC North Drew Bulgaria 001-336-025-6849x701 684 698 2911x6092 bstuart@williamson-mcclure com 2022-05-15 https://fletcher-nielsen...\n",
|
||||
"\n",
|
||||
"--- Chunk 2 ---\n",
|
||||
"Source: /tmp/tmp7yzm_3y4.csv\n",
|
||||
"Format: csv\n",
|
||||
"Content: 3x7288 (203)287-1003x5932 kmercer@wagner com 2020-07-21 http://murray org/ 88 E4Bbcd8AD81fC5f Alison Vargas Vaughn, Watts and Leach East Cristinabury Benin 365-273-8144 053-308-7653x6287 vcantu@norton...\n",
|
||||
"\n",
|
||||
"--- Chunk 3 ---\n",
|
||||
"Source: /tmp/tmp7yzm_3y4.csv\n",
|
||||
"Format: csv\n",
|
||||
"Content: rt com 2021-03-10 http://www benson-roth com/ 18 F8Aa9d6DfcBeeF8 Greg Mata Valentine LLC Lake Leslie Mozambique (701)087-2415 (195)156-1861x26241 jaredjuarez@carroll org 2022-03-26 http://pitts-cherry...\n",
|
||||
"\n",
|
||||
"💡 AI Answer (using local LLM):\n",
|
||||
"Based on the document content, here's what I found...\n",
|
||||
"(This would be generated by the local LLM model)\n",
|
||||
"\n",
|
||||
"❓ Your question: quit\n",
|
||||
"\n",
|
||||
"👋 Q&A session ended.\n",
|
||||
"\n",
|
||||
"🧪 Sample Document for Testing\n",
|
||||
"Creating sample document...\n",
|
||||
"✅ Sample document created!\n",
|
||||
"📄 Sample document content:\n",
|
||||
"\n",
|
||||
"# Sample Document\n",
|
||||
"\n",
|
||||
"This is a sample document for testing the Local RAG Document Agent.\n",
|
||||
"\n",
|
||||
"## Introduction\n",
|
||||
"The Local RAG Document Agent is designed to process and analyze documents using local LLM model...\n",
|
||||
"\n",
|
||||
"==================================================\n",
|
||||
"�� Powered by Local RAG Document Agent | Built with PraisonAI\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Main Application (Google Colab Version)\n",
|
||||
"import streamlit as st\n",
|
||||
"import pandas as pd\n",
|
||||
"import tempfile\n",
|
||||
"import os\n",
|
||||
"from typing import Dict, Any, List\n",
|
||||
"from google.colab import files\n",
|
||||
"import io\n",
|
||||
"\n",
|
||||
"# Initialize tools\n",
|
||||
"doc_tool = DocumentProcessingTool()\n",
|
||||
"vector_tool = VectorDatabaseTool()\n",
|
||||
"chunk_tool = TextChunkingTool()\n",
|
||||
"\n",
|
||||
"print(\"�� Local RAG Document Agent\")\n",
|
||||
"print(\"Document-based Q&A powered by local LLM and vector search!\")\n",
|
||||
"\n",
|
||||
"# Document upload section for Google Colab\n",
|
||||
"print(\"\\n📁 Upload Your Documents\")\n",
|
||||
"print(\"Please upload PDF, TXT, MD, or CSV files:\")\n",
|
||||
"\n",
|
||||
"uploaded = files.upload()\n",
|
||||
"\n",
|
||||
"if uploaded:\n",
|
||||
" # Process each uploaded file\n",
|
||||
" processed_docs = []\n",
|
||||
"\n",
|
||||
" for file_name, file_content in uploaded.items():\n",
|
||||
" print(f\"\\n📄 Processing: {file_name}\")\n",
|
||||
"\n",
|
||||
" # Save file temporarily\n",
|
||||
" with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file_name)[1]) as temp_file:\n",
|
||||
" temp_file.write(file_content)\n",
|
||||
" temp_path = temp_file.name\n",
|
||||
"\n",
|
||||
" # Process document\n",
|
||||
" doc_result = doc_tool.process_document(temp_path)\n",
|
||||
"\n",
|
||||
" if \"error\" not in doc_result:\n",
|
||||
" processed_docs.append(doc_result)\n",
|
||||
" print(f\"✅ Successfully processed {file_name}\")\n",
|
||||
" print(f\" - Format: {doc_result.get('format', 'unknown')}\")\n",
|
||||
" print(f\" - Text length: {len(doc_result['text'])} characters\")\n",
|
||||
"\n",
|
||||
" if 'pages' in doc_result:\n",
|
||||
" print(f\" - Pages: {doc_result['pages']}\")\n",
|
||||
" else:\n",
|
||||
" print(f\"❌ Error processing {file_name}: {doc_result['error']}\")\n",
|
||||
"\n",
|
||||
" # Clean up temp file\n",
|
||||
" os.unlink(temp_path)\n",
|
||||
"\n",
|
||||
" if processed_docs:\n",
|
||||
" print(f\"\\n�� Processing Summary:\")\n",
|
||||
" print(f\"- Total documents processed: {len(processed_docs)}\")\n",
|
||||
"\n",
|
||||
" # Chunk documents\n",
|
||||
" print(\"\\n�� Chunking documents for vector storage...\")\n",
|
||||
" all_chunks = []\n",
|
||||
" chunk_metadata = []\n",
|
||||
"\n",
|
||||
" for i, doc in enumerate(processed_docs):\n",
|
||||
" chunks = chunk_tool.chunk_text(doc['text'])\n",
|
||||
" all_chunks.extend(chunks)\n",
|
||||
"\n",
|
||||
" # Create metadata for each chunk\n",
|
||||
" for j, chunk in enumerate(chunks):\n",
|
||||
" chunk_metadata.append({\n",
|
||||
" \"source\": doc.get('file_path', f'document_{i}'),\n",
|
||||
" \"format\": doc.get('format', 'unknown'),\n",
|
||||
" \"chunk_index\": j,\n",
|
||||
" \"total_chunks\": len(chunks)\n",
|
||||
" })\n",
|
||||
"\n",
|
||||
" print(f\"- Total chunks created: {len(all_chunks)}\")\n",
|
||||
"\n",
|
||||
" # Add to vector database\n",
|
||||
" print(\"\\n🗄️ Adding documents to vector database...\")\n",
|
||||
" vector_result = vector_tool.add_documents(all_chunks, chunk_metadata)\n",
|
||||
"\n",
|
||||
" if \"error\" not in vector_result:\n",
|
||||
" print(f\"✅ Successfully added {vector_result['documents_added']} chunks to vector database\")\n",
|
||||
"\n",
|
||||
" # Get collection info\n",
|
||||
" collection_info = vector_tool.get_collection_info()\n",
|
||||
" if \"error\" not in collection_info:\n",
|
||||
" print(f\"📈 Vector database now contains {collection_info['document_count']} total chunks\")\n",
|
||||
"\n",
|
||||
" # Interactive Q&A\n",
|
||||
" print(\"\\n🤔 Interactive Q&A Session\")\n",
|
||||
" print(\"Ask questions about your documents (type 'quit' to exit):\")\n",
|
||||
"\n",
|
||||
" while True:\n",
|
||||
" question = input(\"\\n❓ Your question: \")\n",
|
||||
"\n",
|
||||
" if question.lower() in ['quit', 'exit', 'q']:\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
" if question.strip():\n",
|
||||
" print(\"🔍 Searching for relevant information...\")\n",
|
||||
"\n",
|
||||
" # Search vector database\n",
|
||||
" search_result = vector_tool.search_documents(question, n_results=3)\n",
|
||||
"\n",
|
||||
" if \"error\" not in search_result and search_result['num_results'] > 0:\n",
|
||||
" print(f\"📚 Found {search_result['num_results']} relevant chunks:\")\n",
|
||||
"\n",
|
||||
" for i, (doc, metadata) in enumerate(zip(\n",
|
||||
" search_result['results']['documents'][0],\n",
|
||||
" search_result['results']['metadatas'][0]\n",
|
||||
" )):\n",
|
||||
" print(f\"\\n--- Chunk {i+1} ---\")\n",
|
||||
" print(f\"Source: {metadata.get('source', 'Unknown')}\")\n",
|
||||
" print(f\"Format: {metadata.get('format', 'Unknown')}\")\n",
|
||||
" print(f\"Content: {doc[:200]}...\")\n",
|
||||
"\n",
|
||||
" # Here you would integrate with local LLM for answer generation\n",
|
||||
" print(f\"\\n💡 AI Answer (using local LLM):\")\n",
|
||||
" print(\"Based on the document content, here's what I found...\")\n",
|
||||
" print(\"(This would be generated by the local LLM model)\")\n",
|
||||
"\n",
|
||||
" else:\n",
|
||||
" print(\"❌ No relevant information found in the documents.\")\n",
|
||||
" print(\"Try rephrasing your question or check if the documents contain the information you're looking for.\")\n",
|
||||
" else:\n",
|
||||
" print(\"Please enter a question.\")\n",
|
||||
"\n",
|
||||
" print(\"\\n👋 Q&A session ended.\")\n",
|
||||
"\n",
|
||||
" else:\n",
|
||||
" print(f\"❌ Error adding to vector database: {vector_result['error']}\")\n",
|
||||
"\n",
|
||||
" else:\n",
|
||||
" print(\"❌ No documents were successfully processed.\")\n",
|
||||
"\n",
|
||||
"else:\n",
|
||||
" print(\"❌ No files uploaded. Please upload documents to get started.\")\n",
|
||||
"\n",
|
||||
"# Sample document section\n",
|
||||
"print(\"\\n🧪 Sample Document for Testing\")\n",
|
||||
"print(\"Creating sample document...\")\n",
|
||||
"\n",
|
||||
"# Create sample document\n",
|
||||
"sample_text = \"\"\"\n",
|
||||
"# Sample Document\n",
|
||||
"\n",
|
||||
"This is a sample document for testing the Local RAG Document Agent.\n",
|
||||
"\n",
|
||||
"## Introduction\n",
|
||||
"The Local RAG Document Agent is designed to process and analyze documents using local LLM models and vector search capabilities.\n",
|
||||
"\n",
|
||||
"## Features\n",
|
||||
"- Document processing for multiple formats (PDF, TXT, MD, CSV)\n",
|
||||
"- Vector database storage and retrieval\n",
|
||||
"- Local LLM inference without external API calls\n",
|
||||
"- Intelligent Q&A with source attribution\n",
|
||||
"\n",
|
||||
"## Technical Details\n",
|
||||
"The agent uses ChromaDB for vector storage and Ollama for local LLM inference.\n",
|
||||
"It can handle various document formats and provides context-aware responses.\n",
|
||||
"\n",
|
||||
"## Usage\n",
|
||||
"1. Upload your documents\n",
|
||||
"2. Ask questions about the content\n",
|
||||
"3. Get AI-powered answers with source references\n",
|
||||
"\"\"\"\n",
|
||||
"\n",
|
||||
"# Save sample document\n",
|
||||
"with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.md') as temp_file:\n",
|
||||
" temp_file.write(sample_text)\n",
|
||||
" sample_path = temp_file.name\n",
|
||||
"\n",
|
||||
"print(\"✅ Sample document created!\")\n",
|
||||
"print(\"📄 Sample document content:\")\n",
|
||||
"print(sample_text[:200] + \"...\")\n",
|
||||
"\n",
|
||||
"# Footer\n",
|
||||
"print(\"\\n\" + \"=\"*50)\n",
|
||||
"print(\"�� Powered by Local RAG Document Agent | Built with PraisonAI\")"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,800 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "04dGdK2VftUM"
|
||||
},
|
||||
"source": [
|
||||
"# AI Meme Creator Agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "xUTYMeY9fvUA"
|
||||
},
|
||||
"source": [
|
||||
"* An AI agent that generates memes using browser automation and multiple LLM models.\n",
|
||||
"* The agent can create custom memes based on user prompts by navigating to meme creation websites, selecting templates, and generating captions.\n",
|
||||
"* Features include multi-model support (Claude, Deepseek, OpenAI), browser automation, template selection, and automatic meme generation with direct image links."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "_hI9XGsJicU8"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/ai_meme_creator_agent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "6rrl-ZHqgCj2"
|
||||
},
|
||||
"source": [
|
||||
"# Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "pP9B-OsCgDpr"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonai streamlit browser-use langchain-openai langchain-anthropic langchain-core"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "Xe0_c_lig5YJ"
|
||||
},
|
||||
"source": [
|
||||
"# Setup Key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "fsVpWSVHg64O",
|
||||
"outputId": "74d0ee0f-a3e2-413c-98cd-a410888eedb3"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ API keys configured!\n",
|
||||
"✅ Using model: OpenAI\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"\n",
|
||||
"# Set your API keys\n",
|
||||
"openai_key = \"Enter you api key here\"\n",
|
||||
"anthropic_key = \"Enter you api key here\" # Get from https://console.anthropic.com\n",
|
||||
"deepseek_key = \"Enter you api key here\" # Get from https://platform.deepseek.com\n",
|
||||
"\n",
|
||||
"# Set environment variables\n",
|
||||
"os.environ[\"OPENAI_API_KEY\"] = openai_key\n",
|
||||
"os.environ[\"ANTHROPIC_API_KEY\"] = anthropic_key\n",
|
||||
"os.environ[\"DEEPSEEK_API_KEY\"] = deepseek_key\n",
|
||||
"\n",
|
||||
"# Model selection\n",
|
||||
"model_choice = \"OpenAI\" # Options: \"OpenAI\", \"Claude\", \"Deepseek\"\n",
|
||||
"\n",
|
||||
"print(\"✅ API keys configured!\")\n",
|
||||
"print(f\"✅ Using model: {model_choice}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "rtqdR4Odhexu"
|
||||
},
|
||||
"source": [
|
||||
"# Tools"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"id": "I9uC9c97hgYg"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Custom Meme Template Search Tool\n",
|
||||
"import requests\n",
|
||||
"from typing import Dict, Any, List\n",
|
||||
"import re\n",
|
||||
"\n",
|
||||
"class MemeTemplateSearchTool:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.base_url = \"https://imgflip.com\"\n",
|
||||
" self.popular_templates = [\n",
|
||||
" \"distracted-boyfriend\", \"two-buttons\", \"one-does-not-simply\",\n",
|
||||
" \"drake-hotline-bling\", \"change-my-mind\", \"ancient-aliens\",\n",
|
||||
" \"y-u-no\", \"success-kid\", \"first-world-problems\", \"futurama-fry\"\n",
|
||||
" ]\n",
|
||||
"\n",
|
||||
" def search_templates(self, query: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Search for meme templates based on query\"\"\"\n",
|
||||
" try:\n",
|
||||
" # Extract key action words from query\n",
|
||||
" action_words = self._extract_action_words(query.lower())\n",
|
||||
"\n",
|
||||
" # Find relevant templates\n",
|
||||
" relevant_templates = []\n",
|
||||
" for template in self.popular_templates:\n",
|
||||
" if any(word in template for word in action_words):\n",
|
||||
" relevant_templates.append(template)\n",
|
||||
"\n",
|
||||
" # If no direct matches, return popular templates\n",
|
||||
" if not relevant_templates:\n",
|
||||
" relevant_templates = self.popular_templates[:5]\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"success\": True,\n",
|
||||
" \"query\": query,\n",
|
||||
" \"action_words\": action_words,\n",
|
||||
" \"suggested_templates\": relevant_templates,\n",
|
||||
" \"template_urls\": [f\"{self.base_url}/{template}\" for template in relevant_templates]\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error searching templates: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _extract_action_words(self, text: str) -> List[str]:\n",
|
||||
" \"\"\"Extract action words from text\"\"\"\n",
|
||||
" action_words = [\n",
|
||||
" \"laugh\", \"cry\", \"smile\", \"angry\", \"surprised\", \"confused\",\n",
|
||||
" \"happy\", \"sad\", \"excited\", \"worried\", \"thinking\", \"shocked\",\n",
|
||||
" \"bully\", \"fight\", \"work\", \"study\", \"sleep\", \"eat\", \"drink\",\n",
|
||||
" \"run\", \"walk\", \"sit\", \"stand\", \"look\", \"watch\", \"listen\"\n",
|
||||
" ]\n",
|
||||
"\n",
|
||||
" found_words = []\n",
|
||||
" for word in action_words:\n",
|
||||
" if word in text:\n",
|
||||
" found_words.append(word)\n",
|
||||
"\n",
|
||||
" return found_words\n",
|
||||
"\n",
|
||||
"# Custom Caption Generator Tool\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class CaptionGeneratorTool:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.caption_styles = {\n",
|
||||
" \"setup_punchline\": \"Top: {setup}\\nBottom: {punchline}\",\n",
|
||||
" \"comparison\": \"Top: {option1}\\nBottom: {option2}\",\n",
|
||||
" \"reaction\": \"Top: {situation}\\nBottom: {reaction}\",\n",
|
||||
" \"confession\": \"Top: {confession}\\nBottom: {reality}\"\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" def generate_captions(self, query: str, template: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Generate meme captions based on query and template\"\"\"\n",
|
||||
" try:\n",
|
||||
" # Analyze query for meme type\n",
|
||||
" meme_type = self._analyze_meme_type(query)\n",
|
||||
"\n",
|
||||
" # Generate captions based on type\n",
|
||||
" if meme_type == \"comparison\":\n",
|
||||
" captions = self._generate_comparison_captions(query)\n",
|
||||
" elif meme_type == \"reaction\":\n",
|
||||
" captions = self._generate_reaction_captions(query)\n",
|
||||
" elif meme_type == \"confession\":\n",
|
||||
" captions = self._generate_confession_captions(query)\n",
|
||||
" else:\n",
|
||||
" captions = self._generate_setup_punchline_captions(query)\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"success\": True,\n",
|
||||
" \"query\": query,\n",
|
||||
" \"template\": template,\n",
|
||||
" \"meme_type\": meme_type,\n",
|
||||
" \"captions\": captions,\n",
|
||||
" \"suggested_style\": self.caption_styles.get(meme_type, self.caption_styles[\"setup_punchline\"])\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error generating captions: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _analyze_meme_type(self, query: str) -> str:\n",
|
||||
" \"\"\"Analyze query to determine meme type\"\"\"\n",
|
||||
" query_lower = query.lower()\n",
|
||||
"\n",
|
||||
" if any(word in query_lower for word in [\"vs\", \"versus\", \"or\", \"either\", \"choose\"]):\n",
|
||||
" return \"comparison\"\n",
|
||||
" elif any(word in query_lower for word in [\"when\", \"reaction\", \"face\", \"look\"]):\n",
|
||||
" return \"reaction\"\n",
|
||||
" elif any(word in query_lower for word in [\"confess\", \"secret\", \"actually\", \"truth\"]):\n",
|
||||
" return \"confession\"\n",
|
||||
" else:\n",
|
||||
" return \"setup_punchline\"\n",
|
||||
"\n",
|
||||
" def _generate_setup_punchline_captions(self, query: str) -> List[Dict[str, str]]:\n",
|
||||
" \"\"\"Generate setup-punchline style captions\"\"\"\n",
|
||||
" captions = []\n",
|
||||
"\n",
|
||||
" # Extract key elements from query\n",
|
||||
" words = query.split()\n",
|
||||
" if len(words) >= 3:\n",
|
||||
" # Create variations\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"When {query}\",\n",
|
||||
" \"bottom\": \"But it actually works\"\n",
|
||||
" })\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"Me trying to {query}\",\n",
|
||||
" \"bottom\": \"Reality: Complete failure\"\n",
|
||||
" })\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"Everyone: {query}\",\n",
|
||||
" \"bottom\": \"Me: *confused*\"\n",
|
||||
" })\n",
|
||||
"\n",
|
||||
" return captions\n",
|
||||
"\n",
|
||||
" def _generate_comparison_captions(self, query: str) -> List[Dict[str, str]]:\n",
|
||||
" \"\"\"Generate comparison style captions\"\"\"\n",
|
||||
" captions = []\n",
|
||||
"\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": \"What I think will happen\",\n",
|
||||
" \"bottom\": \"What actually happens\"\n",
|
||||
" })\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": \"The plan\",\n",
|
||||
" \"bottom\": \"The execution\"\n",
|
||||
" })\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": \"Before\",\n",
|
||||
" \"bottom\": \"After\"\n",
|
||||
" })\n",
|
||||
"\n",
|
||||
" return captions\n",
|
||||
"\n",
|
||||
" def _generate_reaction_captions(self, query: str) -> List[Dict[str, str]]:\n",
|
||||
" \"\"\"Generate reaction style captions\"\"\"\n",
|
||||
" captions = []\n",
|
||||
"\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"When {query}\",\n",
|
||||
" \"bottom\": \"My face: 😱\"\n",
|
||||
" })\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"Me: {query}\",\n",
|
||||
" \"bottom\": \"Also me: *surprised pikachu*\"\n",
|
||||
" })\n",
|
||||
"\n",
|
||||
" return captions\n",
|
||||
"\n",
|
||||
" def _generate_confession_captions(self, query: str) -> List[Dict[str, str]]:\n",
|
||||
" \"\"\"Generate confession style captions\"\"\"\n",
|
||||
" captions = []\n",
|
||||
"\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"I confess: {query}\",\n",
|
||||
" \"bottom\": \"But I'm not sorry\"\n",
|
||||
" })\n",
|
||||
" captions.append({\n",
|
||||
" \"top\": f\"Everyone thinks {query}\",\n",
|
||||
" \"bottom\": \"But actually...\"\n",
|
||||
" })\n",
|
||||
"\n",
|
||||
" return captions\n",
|
||||
"\n",
|
||||
"# Custom Meme Validation Tool\n",
|
||||
"class MemeValidationTool:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.validation_criteria = {\n",
|
||||
" \"humor\": [\"funny\", \"amusing\", \"entertaining\"],\n",
|
||||
" \"relevance\": [\"related\", \"connected\", \"appropriate\"],\n",
|
||||
" \"clarity\": [\"clear\", \"understandable\", \"readable\"],\n",
|
||||
" \"creativity\": [\"original\", \"creative\", \"unique\"]\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" def validate_meme(self, query: str, captions: List[Dict[str, str]], template: str) -> Dict[str, Any]:\n",
|
||||
" \"\"\"Validate meme quality and suggest improvements\"\"\"\n",
|
||||
" try:\n",
|
||||
" scores = {}\n",
|
||||
" suggestions = []\n",
|
||||
"\n",
|
||||
" # Check humor\n",
|
||||
" humor_score = self._check_humor(query, captions)\n",
|
||||
" scores[\"humor\"] = humor_score\n",
|
||||
" if humor_score < 0.7:\n",
|
||||
" suggestions.append(\"Consider making the punchline more unexpected or relatable\")\n",
|
||||
"\n",
|
||||
" # Check relevance\n",
|
||||
" relevance_score = self._check_relevance(query, captions)\n",
|
||||
" scores[\"relevance\"] = relevance_score\n",
|
||||
" if relevance_score < 0.8:\n",
|
||||
" suggestions.append(\"Ensure captions directly relate to the query topic\")\n",
|
||||
"\n",
|
||||
" # Check clarity\n",
|
||||
" clarity_score = self._check_clarity(captions)\n",
|
||||
" scores[\"clarity\"] = clarity_score\n",
|
||||
" if clarity_score < 0.9:\n",
|
||||
" suggestions.append(\"Make sure text is short and easy to read\")\n",
|
||||
"\n",
|
||||
" # Check creativity\n",
|
||||
" creativity_score = self._check_creativity(query, captions)\n",
|
||||
" scores[\"creativity\"] = creativity_score\n",
|
||||
" if creativity_score < 0.6:\n",
|
||||
" suggestions.append(\"Try a more unique angle or unexpected twist\")\n",
|
||||
"\n",
|
||||
" # Overall score\n",
|
||||
" overall_score = sum(scores.values()) / len(scores)\n",
|
||||
"\n",
|
||||
" return {\n",
|
||||
" \"success\": True,\n",
|
||||
" \"scores\": scores,\n",
|
||||
" \"overall_score\": overall_score,\n",
|
||||
" \"suggestions\": suggestions,\n",
|
||||
" \"quality\": \"Excellent\" if overall_score >= 0.8 else \"Good\" if overall_score >= 0.6 else \"Needs Improvement\"\n",
|
||||
" }\n",
|
||||
" except Exception as e:\n",
|
||||
" return {\"error\": f\"Error validating meme: {str(e)}\"}\n",
|
||||
"\n",
|
||||
" def _check_humor(self, query: str, captions: List[Dict[str, str]]) -> float:\n",
|
||||
" \"\"\"Check humor quality\"\"\"\n",
|
||||
" # Simple heuristic - check for contrast, exaggeration, or relatable elements\n",
|
||||
" score = 0.5 # Base score\n",
|
||||
"\n",
|
||||
" for caption in captions:\n",
|
||||
" text = f\"{caption.get('top', '')} {caption.get('bottom', '')}\".lower()\n",
|
||||
"\n",
|
||||
" # Check for humor indicators\n",
|
||||
" if any(word in text for word in [\"but\", \"however\", \"actually\", \"reality\"]):\n",
|
||||
" score += 0.2 # Contrast\n",
|
||||
" if any(word in text for word in [\"everyone\", \"nobody\", \"always\", \"never\"]):\n",
|
||||
" score += 0.1 # Exaggeration\n",
|
||||
" if any(word in text for word in [\"me\", \"my\", \"i\", \"we\"]):\n",
|
||||
" score += 0.1 # Relatable\n",
|
||||
"\n",
|
||||
" return min(1.0, score)\n",
|
||||
"\n",
|
||||
" def _check_relevance(self, query: str, captions: List[Dict[str, str]]) -> float:\n",
|
||||
" \"\"\"Check relevance to query\"\"\"\n",
|
||||
" query_words = set(query.lower().split())\n",
|
||||
" score = 0.5 # Base score\n",
|
||||
"\n",
|
||||
" for caption in captions:\n",
|
||||
" caption_text = f\"{caption.get('top', '')} {caption.get('bottom', '')}\".lower()\n",
|
||||
" caption_words = set(caption_text.split())\n",
|
||||
"\n",
|
||||
" # Check word overlap\n",
|
||||
" overlap = len(query_words.intersection(caption_words))\n",
|
||||
" if overlap > 0:\n",
|
||||
" score += 0.3\n",
|
||||
" if overlap > 2:\n",
|
||||
" score += 0.2\n",
|
||||
"\n",
|
||||
" return min(1.0, score)\n",
|
||||
"\n",
|
||||
" def _check_clarity(self, captions: List[Dict[str, str]]) -> float:\n",
|
||||
" \"\"\"Check text clarity and readability\"\"\"\n",
|
||||
" score = 1.0 # Start with perfect score\n",
|
||||
"\n",
|
||||
" for caption in captions:\n",
|
||||
" top_text = caption.get('top', '')\n",
|
||||
" bottom_text = caption.get('bottom', '')\n",
|
||||
"\n",
|
||||
" # Penalize long text\n",
|
||||
" if len(top_text) > 50:\n",
|
||||
" score -= 0.1\n",
|
||||
" if len(bottom_text) > 50:\n",
|
||||
" score -= 0.1\n",
|
||||
"\n",
|
||||
" # Penalize complex words\n",
|
||||
" complex_words = [word for word in top_text.split() if len(word) > 10]\n",
|
||||
" if len(complex_words) > 0:\n",
|
||||
" score -= 0.1\n",
|
||||
"\n",
|
||||
" return max(0.0, score)\n",
|
||||
"\n",
|
||||
" def _check_creativity(self, query: str, captions: List[Dict[str, str]]) -> float:\n",
|
||||
" \"\"\"Check creativity and originality\"\"\"\n",
|
||||
" score = 0.5 # Base score\n",
|
||||
"\n",
|
||||
" # Check for common meme phrases (penalize)\n",
|
||||
" common_phrases = [\n",
|
||||
" \"surprised pikachu\", \"change my mind\", \"one does not simply\",\n",
|
||||
" \"ancient aliens\", \"distracted boyfriend\", \"drake\"\n",
|
||||
" ]\n",
|
||||
"\n",
|
||||
" for caption in captions:\n",
|
||||
" caption_text = f\"{caption.get('top', '')} {caption.get('bottom', '')}\".lower()\n",
|
||||
"\n",
|
||||
" # Reward for avoiding common phrases\n",
|
||||
" if not any(phrase in caption_text for phrase in common_phrases):\n",
|
||||
" score += 0.3\n",
|
||||
"\n",
|
||||
" # Reward for unique word combinations\n",
|
||||
" unique_words = len(set(caption_text.split()))\n",
|
||||
" if unique_words > 8:\n",
|
||||
" score += 0.2\n",
|
||||
"\n",
|
||||
" return min(1.0, score)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "MnaRLR7rhkxd"
|
||||
},
|
||||
"source": [
|
||||
"# YAML Prompt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "gfjRa17thl_i",
|
||||
"outputId": "09440897-7b9a-4b04-f535-55abf1240e5c"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ YAML Prompt configured!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# YAML Prompt\n",
|
||||
"yaml_prompt = \"\"\"\n",
|
||||
"name: \"AI Meme Creator Agent\"\n",
|
||||
"description: \"Expert meme generator with browser automation and multi-model support\"\n",
|
||||
"instructions:\n",
|
||||
" - \"You are an expert meme creator that generates funny and relevant memes based on user prompts\"\n",
|
||||
" - \"Use browser automation to navigate meme creation websites and select appropriate templates\"\n",
|
||||
" - \"Generate creative captions that match the meme template and user's request\"\n",
|
||||
" - \"Ensure memes are humorous, relevant, and visually appealing\"\n",
|
||||
" - \"Provide multiple caption options for different meme styles\"\n",
|
||||
" - \"Validate meme quality and suggest improvements when needed\"\n",
|
||||
" - \"Use appropriate meme templates that fit the context and emotion\"\n",
|
||||
" - \"Create captions that are short, readable, and impactful\"\n",
|
||||
" - \"Consider current trends and popular meme formats\"\n",
|
||||
"\n",
|
||||
"tools:\n",
|
||||
" - name: \"MemeTemplateSearchTool\"\n",
|
||||
" description: \"Searches for appropriate meme templates based on user query and action words\"\n",
|
||||
" - name: \"CaptionGeneratorTool\"\n",
|
||||
" description: \"Generates creative captions for memes based on query, template, and meme type\"\n",
|
||||
" - name: \"MemeValidationTool\"\n",
|
||||
" description: \"Validates meme quality and provides suggestions for improvement\"\n",
|
||||
"\n",
|
||||
"output_format:\n",
|
||||
" - \"Provide the generated meme image URL\"\n",
|
||||
" - \"Include caption suggestions and template recommendations\"\n",
|
||||
" - \"Offer quality assessment and improvement tips\"\n",
|
||||
" - \"Explain the meme concept and why it works\"\n",
|
||||
" - \"Provide alternative caption options if available\"\n",
|
||||
"\n",
|
||||
"temperature: 0.7\n",
|
||||
"max_tokens: 3000\n",
|
||||
"model: \"gpt-4o-mini\"\n",
|
||||
"\"\"\"\n",
|
||||
"\n",
|
||||
"print(\"✅ YAML Prompt configured!\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "BlJzii7Whtro"
|
||||
},
|
||||
"source": [
|
||||
"# Main"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "eMA38MJvhvJC",
|
||||
"outputId": "744230d3-7fce-444f-af78-7bdb98aa8a61"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"🥸 AI Meme Creator Agent\n",
|
||||
"Generate hilarious memes using AI and browser automation!\n",
|
||||
"\n",
|
||||
"⚙️ Model Configuration\n",
|
||||
"✅ Using model: OpenAI\n",
|
||||
"\n",
|
||||
"🎨 Meme Creation Interface\n",
|
||||
"Enter your meme idea:\n",
|
||||
"Meme Idea: When you finally understand the code after 3 hours of debugging\n",
|
||||
"\n",
|
||||
"🚀 Generating meme for: 'When you finally understand the code after 3 hours of debugging'\n",
|
||||
"\n",
|
||||
"🔍 Step 1: Searching for meme templates...\n",
|
||||
"✅ Found 5 relevant templates\n",
|
||||
"Action words: stand\n",
|
||||
"\n",
|
||||
"✍️ Step 2: Generating captions...\n",
|
||||
"✅ Generated 2 caption options\n",
|
||||
"Meme type: reaction\n",
|
||||
"\n",
|
||||
"📝 Caption Options:\n",
|
||||
"Option 1:\n",
|
||||
" Top: When When you finally understand the code after 3 hours of debugging\n",
|
||||
" Bottom: My face: 😱\n",
|
||||
"Option 2:\n",
|
||||
" Top: Me: When you finally understand the code after 3 hours of debugging\n",
|
||||
" Bottom: Also me: *surprised pikachu*\n",
|
||||
"\n",
|
||||
"�� Step 3: Validating meme quality...\n",
|
||||
"✅ Quality Assessment: Excellent\n",
|
||||
"Overall Score: 0.88/1.0\n",
|
||||
"💡 Suggestions for improvement:\n",
|
||||
" - Make sure text is short and easy to read\n",
|
||||
"\n",
|
||||
"�� Step 4: Generating meme with browser automation...\n",
|
||||
"🔄 Starting browser automation...\n",
|
||||
"Error in meme generation: \"ChatOpenAI\" object has no field \"ainvoke\"\n",
|
||||
"❌ Failed to generate meme. This might be due to:\n",
|
||||
" - Browser automation issues\n",
|
||||
" - Website changes\n",
|
||||
" - Network connectivity\n",
|
||||
" - API rate limits\n",
|
||||
"\n",
|
||||
"💡 Manual Meme Creation Instructions:\n",
|
||||
"1. Go to https://imgflip.com/memetemplates\n",
|
||||
"2. Search for a template related to your query\n",
|
||||
"3. Use one of the generated captions:\n",
|
||||
" Option 1: Top='When When you finally understand the code after 3 hours of debugging', Bottom='My face: 😱'\n",
|
||||
" Option 2: Top='Me: When you finally understand the code after 3 hours of debugging', Bottom='Also me: *surprised pikachu*'\n",
|
||||
"\n",
|
||||
"🧪 Sample Meme Ideas for Testing\n",
|
||||
"Try these sample ideas:\n",
|
||||
"1. When you finally understand the code after 3 hours of debugging\n",
|
||||
"2. Me trying to explain AI to my grandparents\n",
|
||||
"3. The difference between what I plan to do vs what I actually do\n",
|
||||
"4. When someone asks if I'm free this weekend\n",
|
||||
"5. My brain at 3 AM thinking about that embarrassing thing from 5 years ago\n",
|
||||
"\n",
|
||||
"==================================================\n",
|
||||
"�� Powered by AI Meme Creator Agent | Built with PraisonAI\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import asyncio\n",
|
||||
"import streamlit as st\n",
|
||||
"from browser_use import Agent, SystemPrompt\n",
|
||||
"from langchain_openai import ChatOpenAI\n",
|
||||
"from langchain_anthropic import ChatAnthropic\n",
|
||||
"from langchain_core.messages import HumanMessage\n",
|
||||
"import re\n",
|
||||
"import os\n",
|
||||
"from typing import Dict, Any, List\n",
|
||||
"\n",
|
||||
"# Initialize tools\n",
|
||||
"template_tool = MemeTemplateSearchTool()\n",
|
||||
"caption_tool = CaptionGeneratorTool()\n",
|
||||
"validation_tool = MemeValidationTool()\n",
|
||||
"\n",
|
||||
"print(\"🥸 AI Meme Creator Agent\")\n",
|
||||
"print(\"Generate hilarious memes using AI and browser automation!\")\n",
|
||||
"\n",
|
||||
"# Model configuration\n",
|
||||
"print(\"\\n⚙️ Model Configuration\")\n",
|
||||
"model_choice = \"OpenAI\" # Options: \"OpenAI\", \"Claude\", \"Deepseek\"\n",
|
||||
"print(f\"✅ Using model: {model_choice}\")\n",
|
||||
"\n",
|
||||
"# Meme generation function\n",
|
||||
"async def generate_meme(query: str, model_choice: str, api_key: str) -> str:\n",
|
||||
" \"\"\"Generate meme using browser automation\"\"\"\n",
|
||||
" try:\n",
|
||||
" # Initialize the appropriate LLM based on user selection\n",
|
||||
" if model_choice == \"Claude\":\n",
|
||||
" llm = ChatAnthropic(\n",
|
||||
" model=\"claude-3-5-sonnet-20241022\",\n",
|
||||
" api_key=api_key\n",
|
||||
" )\n",
|
||||
" elif model_choice == \"Deepseek\":\n",
|
||||
" llm = ChatOpenAI(\n",
|
||||
" base_url='https://api.deepseek.com/v1',\n",
|
||||
" model='deepseek-chat',\n",
|
||||
" api_key=api_key,\n",
|
||||
" temperature=0.3\n",
|
||||
" )\n",
|
||||
" else: # OpenAI\n",
|
||||
" llm = ChatOpenAI(\n",
|
||||
" model=\"gpt-4o\",\n",
|
||||
" api_key=api_key,\n",
|
||||
" temperature=0.0\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" task_description = (\n",
|
||||
" \"You are a meme generator expert. You are given a query and you need to generate a meme for it.\\n\"\n",
|
||||
" \"1. Go to https://imgflip.com/memetemplates \\n\"\n",
|
||||
" \"2. Click on the Search bar in the middle and search for ONLY ONE MAIN ACTION VERB (like 'bully', 'laugh', 'cry') in this query: '{0}'\\n\"\n",
|
||||
" \"3. Choose any meme template that metaphorically fits the meme topic: '{0}'\\n\"\n",
|
||||
" \" by clicking on the 'Add Caption' button below it\\n\"\n",
|
||||
" \"4. Write a Top Text (setup/context) and Bottom Text (punchline/outcome) related to '{0}'.\\n\"\n",
|
||||
" \"5. Check the preview making sure it is funny and a meaningful meme. Adjust text directly if needed. \\n\"\n",
|
||||
" \"6. Look at the meme and text on it, if it doesnt make sense, PLEASE retry by filling the text boxes with different text. \\n\"\n",
|
||||
" \"7. Click on the Generate meme button to generate the meme\\n\"\n",
|
||||
" \"8. Copy the image link and give it as the output\\n\"\n",
|
||||
" ).format(query)\n",
|
||||
"\n",
|
||||
" agent = Agent(\n",
|
||||
" task=task_description,\n",
|
||||
" llm=llm,\n",
|
||||
" max_actions_per_step=5,\n",
|
||||
" max_failures=25,\n",
|
||||
" use_vision=(model_choice != \"Deepseek\")\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" history = await agent.run()\n",
|
||||
"\n",
|
||||
" # Extract final result from agent history\n",
|
||||
" final_result = history.final_result()\n",
|
||||
"\n",
|
||||
" # Use regex to find the meme URL in the result\n",
|
||||
" url_match = re.search(r'https://imgflip\\.com/i/(\\w+)', final_result)\n",
|
||||
" if url_match:\n",
|
||||
" meme_id = url_match.group(1)\n",
|
||||
" return f\"https://i.imgflip.com/{meme_id}.jpg\"\n",
|
||||
" return None\n",
|
||||
" except Exception as e:\n",
|
||||
" print(f\"Error in meme generation: {str(e)}\")\n",
|
||||
" return None\n",
|
||||
"\n",
|
||||
"# Interactive meme creation\n",
|
||||
"print(\"\\n🎨 Meme Creation Interface\")\n",
|
||||
"print(\"Enter your meme idea:\")\n",
|
||||
"\n",
|
||||
"query = input(\"Meme Idea: \")\n",
|
||||
"\n",
|
||||
"if query.strip():\n",
|
||||
" print(f\"\\n🚀 Generating meme for: '{query}'\")\n",
|
||||
"\n",
|
||||
" # Step 1: Search for templates\n",
|
||||
" print(\"\\n🔍 Step 1: Searching for meme templates...\")\n",
|
||||
" template_result = template_tool.search_templates(query)\n",
|
||||
"\n",
|
||||
" if \"error\" not in template_result:\n",
|
||||
" print(f\"✅ Found {len(template_result['suggested_templates'])} relevant templates\")\n",
|
||||
" print(f\"Action words: {', '.join(template_result['action_words'])}\")\n",
|
||||
"\n",
|
||||
" # Step 2: Generate captions\n",
|
||||
" print(\"\\n✍️ Step 2: Generating captions...\")\n",
|
||||
" selected_template = template_result['suggested_templates'][0]\n",
|
||||
" caption_result = caption_tool.generate_captions(query, selected_template)\n",
|
||||
"\n",
|
||||
" if \"error\" not in caption_result:\n",
|
||||
" print(f\"✅ Generated {len(caption_result['captions'])} caption options\")\n",
|
||||
" print(f\"Meme type: {caption_result['meme_type']}\")\n",
|
||||
"\n",
|
||||
" # Display caption options\n",
|
||||
" print(\"\\n📝 Caption Options:\")\n",
|
||||
" for i, caption in enumerate(caption_result['captions'], 1):\n",
|
||||
" print(f\"Option {i}:\")\n",
|
||||
" print(f\" Top: {caption.get('top', 'N/A')}\")\n",
|
||||
" print(f\" Bottom: {caption.get('bottom', 'N/A')}\")\n",
|
||||
"\n",
|
||||
" # Step 3: Validate meme quality\n",
|
||||
" print(\"\\n�� Step 3: Validating meme quality...\")\n",
|
||||
" validation_result = validation_tool.validate_meme(\n",
|
||||
" query, caption_result['captions'], selected_template\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" if \"error\" not in validation_result:\n",
|
||||
" print(f\"✅ Quality Assessment: {validation_result['quality']}\")\n",
|
||||
" print(f\"Overall Score: {validation_result['overall_score']:.2f}/1.0\")\n",
|
||||
"\n",
|
||||
" if validation_result['suggestions']:\n",
|
||||
" print(\"💡 Suggestions for improvement:\")\n",
|
||||
" for suggestion in validation_result['suggestions']:\n",
|
||||
" print(f\" - {suggestion}\")\n",
|
||||
"\n",
|
||||
" # Step 4: Generate actual meme (if API key is available)\n",
|
||||
" print(\"\\n�� Step 4: Generating meme with browser automation...\")\n",
|
||||
"\n",
|
||||
" # Check if we have the required API key\n",
|
||||
" api_key = os.getenv(\"OPENAI_API_KEY\")\n",
|
||||
" if api_key and api_key != \"your_openai_key_here\":\n",
|
||||
" try:\n",
|
||||
" print(\"🔄 Starting browser automation...\")\n",
|
||||
" meme_url = await generate_meme(query, model_choice, api_key)\n",
|
||||
"\n",
|
||||
" if meme_url:\n",
|
||||
" print(\"✅ Meme Generated Successfully!\")\n",
|
||||
" print(f\"📸 Meme URL: {meme_url}\")\n",
|
||||
" print(f\"�� Direct Link: {meme_url}\")\n",
|
||||
"\n",
|
||||
" # Display meme (in Colab, we can use HTML)\n",
|
||||
" from IPython.display import Image, display\n",
|
||||
" display(Image(url=meme_url))\n",
|
||||
" else:\n",
|
||||
" print(\"❌ Failed to generate meme. This might be due to:\")\n",
|
||||
" print(\" - Browser automation issues\")\n",
|
||||
" print(\" - Website changes\")\n",
|
||||
" print(\" - Network connectivity\")\n",
|
||||
" print(\" - API rate limits\")\n",
|
||||
"\n",
|
||||
" # Provide manual instructions\n",
|
||||
" print(\"\\n💡 Manual Meme Creation Instructions:\")\n",
|
||||
" print(\"1. Go to https://imgflip.com/memetemplates\")\n",
|
||||
" print(\"2. Search for a template related to your query\")\n",
|
||||
" print(\"3. Use one of the generated captions:\")\n",
|
||||
" for i, caption in enumerate(caption_result['captions'], 1):\n",
|
||||
" print(f\" Option {i}: Top='{caption.get('top', '')}', Bottom='{caption.get('bottom', '')}'\")\n",
|
||||
"\n",
|
||||
" except Exception as e:\n",
|
||||
" print(f\"❌ Error during meme generation: {str(e)}\")\n",
|
||||
" print(\"💡 Try using the manual instructions above\")\n",
|
||||
" else:\n",
|
||||
" print(\"⚠️ API key not configured for browser automation\")\n",
|
||||
" print(\"💡 Using generated captions for manual meme creation:\")\n",
|
||||
" for i, caption in enumerate(caption_result['captions'], 1):\n",
|
||||
" print(f\" Option {i}: Top='{caption.get('top', '')}', Bottom='{caption.get('bottom', '')}'\")\n",
|
||||
" else:\n",
|
||||
" print(f\"❌ Error generating captions: {caption_result['error']}\")\n",
|
||||
" else:\n",
|
||||
" print(f\"❌ Error searching templates: {template_result['error']}\")\n",
|
||||
"\n",
|
||||
"else:\n",
|
||||
" print(\"❌ No meme idea provided.\")\n",
|
||||
"\n",
|
||||
"print(\"\\n🧪 Sample Meme Ideas for Testing\")\n",
|
||||
"sample_ideas = [\n",
|
||||
" \"When you finally understand the code after 3 hours of debugging\",\n",
|
||||
" \"Me trying to explain AI to my grandparents\",\n",
|
||||
" \"The difference between what I plan to do vs what I actually do\",\n",
|
||||
" \"When someone asks if I'm free this weekend\",\n",
|
||||
" \"My brain at 3 AM thinking about that embarrassing thing from 5 years ago\"\n",
|
||||
"]\n",
|
||||
"\n",
|
||||
"print(\"Try these sample ideas:\")\n",
|
||||
"for i, idea in enumerate(sample_ideas, 1):\n",
|
||||
" print(f\"{i}. {idea}\")\n",
|
||||
"\n",
|
||||
"print(\"\\n\" + \"=\"*50)\n",
|
||||
"print(\"�� Powered by AI Meme Creator Agent | Built with PraisonAI\")"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File renamed without changes.
@@ -0,0 +1,618 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "wd6157NQTqfU",
|
||||
"metadata": {
|
||||
"id": "wd6157NQTqfU"
|
||||
},
|
||||
"source": [
|
||||
"# 🔍 NLP + ASR Agent (Official BERT Large + Whisper Large V3)\n",
|
||||
"This notebook runs an agent with:\n",
|
||||
"- 🤖 **BERT Large Cased** for text classification or embedding\n",
|
||||
"- 🎙️ **Whisper Large V3** for audio transcription\n",
|
||||
"\n",
|
||||
"✅ Compatible with Google Colab Free (if Whisper uses fp16 and BERT is used efficiently)\n",
|
||||
"---"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "TD8pkIV8er1I",
|
||||
"metadata": {
|
||||
"id": "TD8pkIV8er1I"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/bert_whisper_agent.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "xQ1v5o47ejyu",
|
||||
"metadata": {
|
||||
"id": "xQ1v5o47ejyu"
|
||||
},
|
||||
"source": [
|
||||
"# Install required libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8yb2sVk7TqfX",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "8yb2sVk7TqfX",
|
||||
"outputId": "13896ab6-f048-4850-d601-68435d0e0e8f"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m3.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m30.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m18.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m23.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m10.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m26.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[?25h"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"!pip install -q transformers torchaudio accelerate torch"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "-YcKPAAhelsQ",
|
||||
"metadata": {
|
||||
"id": "-YcKPAAhelsQ"
|
||||
},
|
||||
"source": [
|
||||
"# Load BERT Large for text analysis"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "Ppdx98tJTqfY",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 177,
|
||||
"referenced_widgets": [
|
||||
"ef64ca729ce24516b53f811439c922de",
|
||||
"d86e086af653488bb3bb4daa1bc420fa",
|
||||
"18c04cece0c54cbb87cbb2391cc7150c",
|
||||
"62ad256a8769475daf4e8aacbdb10379",
|
||||
"0b1a3559484845c68d11951e9016a359",
|
||||
"293bdc33534349088e329d186645f643",
|
||||
"5da3f8d139a141a7b5ae2b87b8ab3a46",
|
||||
"083de2b5fc4843f99e778e8aa453c1b8",
|
||||
"41d9cffa0ec94a0f99c6a3e27dc97017",
|
||||
"bbc1dcfe4d0c4cef8574d6a09db2a32a",
|
||||
"ca9a87cbd99d491194edc4572ef7dc80",
|
||||
"7ea44cea34114e6784ebc339d78a8cb0",
|
||||
"0e0b43792f6e40aba2db124c465eb112",
|
||||
"2c36bed80a05477b85c7fdd07824a0d5",
|
||||
"0489bdfa20794a36a2757e75930fdeca",
|
||||
"9833eb7529f1470a95c67134c198ed70",
|
||||
"5986111ae7a34d9aa66278a6c9925960",
|
||||
"408c73a369194ca2b6585dba212727c2",
|
||||
"aec9f86597c842e388bfc7e495b702ab",
|
||||
"2b5a6970568d46f5a12d6f1c7bb9e4ee",
|
||||
"41597e7ccca34bc5ae22562260e764d1",
|
||||
"8b3f68f1e84e4af9a29c57447ff94027",
|
||||
"71296dd2da5e4c3d92d28204718d1d13",
|
||||
"ba135575d04048bea21a7ae63085e89f",
|
||||
"56bf69ca381f4c1895a15b61db7957e0",
|
||||
"16178169fc7a4b4b8ba39038b332bfb2",
|
||||
"692da53093d74e9bbba1c650ac7e6039",
|
||||
"4419b35b980c401997962e7c2bfe4672",
|
||||
"52c86dc445a24c5c9e2b8a02f12b9fb3",
|
||||
"858e97e2461d4b69bce55afac2a91c9b",
|
||||
"9a616db2cadb4618aa6492f1a1bef867",
|
||||
"2631be99ee604ca6859060402811e990",
|
||||
"b015448b956347b3867f19a8d5189517",
|
||||
"5a1baf78fe7e43f1bef9349959c643b2",
|
||||
"8aa423668aa545bbb6c3f332668b9bf5",
|
||||
"818e6bb7bb8b4f36ab47b511d8eea4f2",
|
||||
"879036aa5880478c80175ae0862cafc0",
|
||||
"1e61b33581e9499e81bc710e4d09d856",
|
||||
"ca424a49bdaa4653921f04f66295df8e",
|
||||
"3841511d0a714a328b58deeb4f185b3b",
|
||||
"ea6303e7aa264f739950572ec3eae4aa",
|
||||
"761736c6489e458fad5d258ed8e6485e",
|
||||
"15e90216f6c24b578106a08846739fcb",
|
||||
"f787c65d91b8477f8a6a199c57075dc8",
|
||||
"1ed0be1c90814e2c9f44b30f81db86b8",
|
||||
"80a88d56d5094e9ab4a21c68f02548e9",
|
||||
"1e0a05a8ca454a49addd483ee686d868",
|
||||
"9c933fdac2df4769bba416b241ce78ed",
|
||||
"a034c602568e4174a003045319c4f7ee",
|
||||
"db3c2fc0735d463694876e49ccbbd9d3",
|
||||
"1eaed0a8fdd94fd696431895e257c725",
|
||||
"94b7fba203734eca84683d121cac4197",
|
||||
"a0eb239bc63d44fd9866bd7b459a4bad",
|
||||
"c48ddcd435f547818779302134f21e66",
|
||||
"0c8d80a1ed8c4ad2b8921865064a9d3a"
|
||||
]
|
||||
},
|
||||
"id": "Ppdx98tJTqfY",
|
||||
"outputId": "cb35f398-ef79-4864-f5e9-4556fd05a936"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "ef64ca729ce24516b53f811439c922de",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"config.json: 0%| | 0.00/762 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "7ea44cea34114e6784ebc339d78a8cb0",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"model.safetensors: 0%| | 0.00/1.34G [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "71296dd2da5e4c3d92d28204718d1d13",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer_config.json: 0%| | 0.00/49.0 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "5a1baf78fe7e43f1bef9349959c643b2",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"vocab.txt: 0%| | 0.00/213k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "1ed0be1c90814e2c9f44b30f81db86b8",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer.json: 0%| | 0.00/436k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"from transformers import AutoTokenizer, AutoModel\n",
|
||||
"import torch\n",
|
||||
"\n",
|
||||
"bert_model = AutoModel.from_pretrained(\"bert-large-cased\")\n",
|
||||
"bert_tokenizer = AutoTokenizer.from_pretrained(\"bert-large-cased\")\n",
|
||||
"\n",
|
||||
"def classify_text(text):\n",
|
||||
" inputs = bert_tokenizer(text, return_tensors=\"pt\")\n",
|
||||
" with torch.no_grad():\n",
|
||||
" outputs = bert_model(**inputs)\n",
|
||||
" return outputs.last_hidden_state.mean(dim=1) # Sentence embedding"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bEjDTqPrens-",
|
||||
"metadata": {
|
||||
"id": "bEjDTqPrens-"
|
||||
},
|
||||
"source": [
|
||||
"# Load Whisper Large V3 for audio transcription"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "R0AGFFqTTqfY",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 369,
|
||||
"referenced_widgets": [
|
||||
"012a21936d6c4884a7b84b2767584b58",
|
||||
"99d6c0fad4b748aa8738fa9a35f4e96f",
|
||||
"8ddf19cbbe724f58800c702b28e37801",
|
||||
"f2881943ec1b48e8b5ace9484815820c",
|
||||
"d6882c4c225a4b04af77d282bd7ce548",
|
||||
"8ae9c3217d4242bb913f6c2af6e0e19b",
|
||||
"0620a81309e249f490509ad62ce8afb6",
|
||||
"7debeb90d88546478719e8a625cb38fb",
|
||||
"07e65c48f16d4f9295ac639dd4b0b5c9",
|
||||
"036a8f64dc44488cabd463e1c15c4c91",
|
||||
"a9cb91371c374c288ee9b06d68327362",
|
||||
"350dbbd7e33d4a38865a41a85f0da780",
|
||||
"abbf7218263e44109604bac835e9e313",
|
||||
"294dd7f394114d8d893e9a5242099f71",
|
||||
"f4cc15dc389049c2b779439de6a59468",
|
||||
"c4480e04078a4c4cb65f7eeb87bd2183",
|
||||
"6a60214efc17431fac99e020321ddb64",
|
||||
"d24212a4256a436fbb5ae2eac6cb8c74",
|
||||
"bc6495fabaf6473a83c0c3a8a1b08422",
|
||||
"fdf9507288f34b578f59afb403e8a899",
|
||||
"c4c9f720c9eb4a71ad46bdf732273ed9",
|
||||
"567034a346624e1896bca65ea663ad08",
|
||||
"d5c0f34255d04845acee22ab2fd11275",
|
||||
"0d58eb843d174c15aee2f4877295d115",
|
||||
"0fd2307c7b894d68889f71345f48a2ad",
|
||||
"0ef40308eecb4817be0b56cdda125c38",
|
||||
"d673a07a18a54c5b915a8fa6580583bc",
|
||||
"2b73ef94e8f94aa1ab5e28cf3ae09a30",
|
||||
"75ad342121b3429aae7bbcf3aaf04fef",
|
||||
"dbb026b79b724d68a5eecbf6bf5fd957",
|
||||
"4d1c52a7062846ad8faf47d7aafb4127",
|
||||
"50c1e37bb01340ee8fbd09a4d9510fe9",
|
||||
"b29fb4842efc453b8f76e15859c091d9",
|
||||
"49cfe6d1837f4e16b8d7a9f7a622977b",
|
||||
"a75a0c15bc194163af7091e40ff31aa0",
|
||||
"598aebd58dae453d9be0bd515b2b6cd6",
|
||||
"98c7dbcdaf114ef0818c6a29200f414d",
|
||||
"6a0dc52da74949ffb8a5f4d8b81ba69e",
|
||||
"67adcfbdf31b4606b5b123402bbf1829",
|
||||
"db13444109ba4a4f828f402a1798f44f",
|
||||
"772e4b8bf52a4e098e76445a65487a4e",
|
||||
"79712d86e8fa432a8cdd055097429d81",
|
||||
"6b6a84ea89a64b208ef6989173e7b6c5",
|
||||
"fee4b1fe846c4c90b5a81f7344d9d2fa",
|
||||
"1859b8e9773d490880fb8f482bb2df7f",
|
||||
"3739191045f749209730cba003eb6ea0",
|
||||
"b9d5984462a243bbb490152374f00164",
|
||||
"d42b2cf9e5c849aa8297d85978340fa4",
|
||||
"4efc347cbbc54c1eb63edf2d1dd997c3",
|
||||
"be19baf94af44562b2392094688dff8c",
|
||||
"2d29827b9e154631bb2fdfbba8ad2e4f",
|
||||
"d82000f2e8524367b11b1736e4eed376",
|
||||
"a9e75f229ab04b1fb062d3dabe40d02e",
|
||||
"06445a9779894cef921650facc3cb915",
|
||||
"f9f294ebc94c40eab79b061bda373d60",
|
||||
"8549e6d45d904cb9860807c2114939f6",
|
||||
"329eb033407541e9a2c5854378d5bba9",
|
||||
"635ca5b07be2495eaafa5126637ee427",
|
||||
"43b284140ef14a0db4d9164d12333540",
|
||||
"902398ce9f8143478a3889c1af9693e9",
|
||||
"0bc9e112c9a2485fba38cad1e620d6d4",
|
||||
"dcdb799810e84d0b8de6a471b256fe46",
|
||||
"8b726a505b43413d853b1f5ba0404fd9",
|
||||
"b6b50da93bab490f8abf19930fa28f46",
|
||||
"2883a49d53fd4c0c9d4e97edf0005b9b",
|
||||
"0f88de1a2bce4af6be5c3cb88d0c0b17",
|
||||
"05d137a7667346abafdc2290320fedc2",
|
||||
"d1de71b61b6b442ab60e5c9d8d745cbe",
|
||||
"3662758074254935846f6eef56e6afd9",
|
||||
"43aa89322bc94fc3ab06ec84cf9b80b6",
|
||||
"9da6ad199a574479a75010da5b1a22dc",
|
||||
"6826f0af1489463f9e5bebcf422cf000",
|
||||
"486accbedd1648fe877cbafe9ceaf5a3",
|
||||
"ff7b49296a6440bf84f8734afc9a8a7b",
|
||||
"cb3b611a6ef04cd7a6a781dee1d0128d",
|
||||
"963c8f0e2cbb4a6a857a05e41b9cdc41",
|
||||
"4e551605bba34d12af90a9edb443e334",
|
||||
"87a22b9d9c9a4e0691a77fd34f15be4a",
|
||||
"327ba03562814fffaa695770e1f50235",
|
||||
"76551436a17f482fa16131b4985720a4",
|
||||
"86558c51b63b42fc9372779dd777379c",
|
||||
"b52881719c6a49a1a2dbbc906571d996",
|
||||
"71bd0c63a6564923b6c12cfd95bd0f99",
|
||||
"8126ef033a5d4beb9fe5ecb126d817b8",
|
||||
"557d5fa2a6404473960c9ad2d8ac9f61",
|
||||
"2d21c4ff75f549308297f7d38238ba60",
|
||||
"0a8b5af0b1e547ca9373b63f23724a52",
|
||||
"41448615087f4344a58a862d00ab7b60",
|
||||
"e801569aba0b4f51814d7498a362ae69",
|
||||
"259fd1045f3c451fb5b2bd8df2ff47fc",
|
||||
"cb885f28dcee412381d52e063a5d058b",
|
||||
"c5728b07bb224c4fb0ca656fa64b1137",
|
||||
"7b75953a78c847688eed9106a38bfec7",
|
||||
"e330f81594ea46cea5c4e94206144605",
|
||||
"bddcbf3209db4872aee6a7a6d8e57fdc",
|
||||
"32154e90fdbf4ca1a293a8c6c5d8ffd9",
|
||||
"ebc78e4a82d9430d8cc9047986e96185",
|
||||
"d0d664ee23ad47c6b6bb193eafcdfbf1",
|
||||
"1c39b174d83146e8a05b0af82c0191ef",
|
||||
"7972b5df2e4e465d868dbc827850e7a4",
|
||||
"e31441e745c04c308be3e81ebacf31c4",
|
||||
"f7a2d47725fc45d0b2f65b81b8cfa925",
|
||||
"f3f13df2d56a445ca472633188318b33",
|
||||
"37b8a1408f284eefb36be7c7babd3aa7",
|
||||
"0a2b79b882154b54bfd13090bf67af07",
|
||||
"eddcb5465f5648b69ac37c03887e494c",
|
||||
"49626d83e7c1403880ce17324fa7a514",
|
||||
"ddc300dd7e504840bc9dffd4666c0984",
|
||||
"b134fdc0b30445fa819a39bde44704d3",
|
||||
"61ce458fc45e4c709f6e4e2af9b4c881",
|
||||
"459a2c675632454c83a62b564853a6f3",
|
||||
"8b90fbbf1d234202b6aaec0a624874d9",
|
||||
"f104a1f9546e4f54ab86a44a4649ea33",
|
||||
"ae01037b6e084a15b0310cedfc0a6d53",
|
||||
"5050d0dbcfcc426f925fe39ecc975a72",
|
||||
"f2855e5586ce429da7472c9bcef8a88b",
|
||||
"05442b45864d417ab37710e2b3a9d05b",
|
||||
"68f72ed9e852416798a42c6a1147e540",
|
||||
"a6230b708cc24e9c85b9704ec0ece351",
|
||||
"62ff7ab4106648d4a2bc07b3048e1857",
|
||||
"3b1be73a026a4ea0b5686f10db107e3c"
|
||||
]
|
||||
},
|
||||
"id": "R0AGFFqTTqfY",
|
||||
"outputId": "31805e6b-a58c-49cc-ae17-a2c20c5e0077"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "012a21936d6c4884a7b84b2767584b58",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"preprocessor_config.json: 0%| | 0.00/340 [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "350dbbd7e33d4a38865a41a85f0da780",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer_config.json: 0%| | 0.00/283k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "d5c0f34255d04845acee22ab2fd11275",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"vocab.json: 0%| | 0.00/1.04M [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "49cfe6d1837f4e16b8d7a9f7a622977b",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"tokenizer.json: 0%| | 0.00/2.48M [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "1859b8e9773d490880fb8f482bb2df7f",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"merges.txt: 0%| | 0.00/494k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "8549e6d45d904cb9860807c2114939f6",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"normalizer.json: 0%| | 0.00/52.7k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "05d137a7667346abafdc2290320fedc2",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"added_tokens.json: 0%| | 0.00/34.6k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "87a22b9d9c9a4e0691a77fd34f15be4a",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"special_tokens_map.json: 0%| | 0.00/2.07k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "e801569aba0b4f51814d7498a362ae69",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"config.json: 0%| | 0.00/1.27k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "7972b5df2e4e465d868dbc827850e7a4",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"model.safetensors: 0%| | 0.00/3.09G [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "459a2c675632454c83a62b564853a6f3",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"generation_config.json: 0%| | 0.00/3.90k [00:00<?, ?B/s]"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"import torchaudio\n",
|
||||
"from transformers import WhisperProcessor, WhisperForConditionalGeneration\n",
|
||||
"\n",
|
||||
"processor = WhisperProcessor.from_pretrained(\"openai/whisper-large-v3\")\n",
|
||||
"model = WhisperForConditionalGeneration.from_pretrained(\"openai/whisper-large-v3\")\n",
|
||||
"model = model.to(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
||||
"\n",
|
||||
"def transcribe_audio(file_path):\n",
|
||||
" audio, rate = torchaudio.load(file_path)\n",
|
||||
" if rate != 16000:\n",
|
||||
" resampler = torchaudio.transforms.Resample(orig_freq=rate, new_freq=16000)\n",
|
||||
" audio = resampler(audio)\n",
|
||||
" input_features = processor(audio.squeeze().numpy(), sampling_rate=16000, return_tensors=\"pt\").input_features\n",
|
||||
" input_features = input_features.to(model.device)\n",
|
||||
" predicted_ids = model.generate(input_features)\n",
|
||||
" return processor.batch_decode(predicted_ids, skip_special_tokens=True)[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "dSQGzAiGeqUS",
|
||||
"metadata": {
|
||||
"id": "dSQGzAiGeqUS"
|
||||
},
|
||||
"source": [
|
||||
"# Example BERT"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "7Q40yeA_TqfZ",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "7Q40yeA_TqfZ",
|
||||
"outputId": "64785b48-77e1-4cd9-9d9b-6dec9e34b45c"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"BERT embedding shape: torch.Size([1, 1024])\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Example usage (requires uploaded audio file like sample.wav)\n",
|
||||
"# from google.colab import files\n",
|
||||
"# uploaded = files.upload()\n",
|
||||
"# print(transcribe_audio(\"sample.wav\"))\n",
|
||||
"\n",
|
||||
"embedding = classify_text(\"Google Colab is a great place to run small-scale NLP models.\")\n",
|
||||
"print(\"BERT embedding shape:\", embedding.shape)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.10"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,401 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "W5cYeCT1jIBS",
|
||||
"metadata": {
|
||||
"id": "W5cYeCT1jIBS"
|
||||
},
|
||||
"source": [
|
||||
"# 🗣️ Talk2Find: Voice-Driven Knowledge Agent (with Synthetic Audio)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "uTxgPYvKjJty",
|
||||
"metadata": {
|
||||
"id": "uTxgPYvKjJty"
|
||||
},
|
||||
"source": [
|
||||
"This notebook demonstrates a voice-driven knowledge agent using PraisonAI Agents. It generates a valid WAV file from text using gTTS and pydub, transcribes the audio with SpeechRecognition, and then uses PraisonAI Agents to answer the spoken question. This workflow is robust, reproducible, and does not require manual audio uploads."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "CJdIonVMjgU7",
|
||||
"metadata": {
|
||||
"id": "CJdIonVMjgU7"
|
||||
},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/talk2find_voice_agent_demo.ipynb)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "wjVE-KWwjQxP",
|
||||
"metadata": {
|
||||
"id": "wjVE-KWwjQxP"
|
||||
},
|
||||
"source": [
|
||||
"# Dependencies"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "RFG1v766idiL",
|
||||
"metadata": {
|
||||
"id": "RFG1v766idiL"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install praisonaiagents openai SpeechRecognition pydub gTTS --quiet"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0IYiVLgsjTJf",
|
||||
"metadata": {
|
||||
"id": "0IYiVLgsjTJf"
|
||||
},
|
||||
"source": [
|
||||
"# Set API Key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "3AVzmY5FilJ9",
|
||||
"metadata": {
|
||||
"id": "3AVzmY5FilJ9"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"os.environ[\"OPENAI_API_KEY\"] = \"Enter your api key\" # <-- Replace with your actual OpenAI API key"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "SfHMkOTHjVMa",
|
||||
"metadata": {
|
||||
"id": "SfHMkOTHjVMa"
|
||||
},
|
||||
"source": [
|
||||
"# Tools"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "Hj28HfsNip9V",
|
||||
"metadata": {
|
||||
"id": "Hj28HfsNip9V"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from praisonaiagents import Agent\n",
|
||||
"import speech_recognition as sr\n",
|
||||
"from gtts import gTTS\n",
|
||||
"from pydub import AudioSegment\n",
|
||||
"from IPython.display import Audio"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8BIPQ6fzjXu4",
|
||||
"metadata": {
|
||||
"id": "8BIPQ6fzjXu4"
|
||||
},
|
||||
"source": [
|
||||
"# Generate a Valid WAV File from Text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "rdcn-AiYisHb",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 92
|
||||
},
|
||||
"id": "rdcn-AiYisHb",
|
||||
"outputId": "2daf8cb4-93f6-4e02-ab2b-3e449d7deee0"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"✅ WAV file 'question.wav' has been created.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"\n",
|
||||
" <audio controls=\"controls\" >\n",
|
||||
" <source src=\"data:audio/x-wav;base64,UklGRiRfAQBXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAAZGF0YQBfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAEAAQAAAAAAAAABAAEAAQAAAAEAAQABAAAA//8AAP//AAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAA//8BAP////8AAAAAAAAAAAAA//8AAAAAAAAAAAAAAAD//wEAAAAAAP//AAAAAAAA//8AAAAA//8AAP//AAAAAAAAAAAAAAAA/////wAAAAAAAAAA//8AAAAAAQABAAAAAAAAAAEAAQAAAAEAAQABAP//AQAAAP//AQAAAAEAAQAAAAAAAQABAAEAAAACAAIAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAAABAAEAAQABAAAAAAD/////AAD//wAAAAAAAP///v8AAAAA/////wEA//////////8AAAAAAAD//wAA/v8AAAAA//8AAAAAAAAAAAAAAAAAAP//AQAAAAAAAAAAAAAAAAAAAAgABwD+/wEAAQD7//7/AgACAAEAAgAEAAQAAwABAAEAAAABAAEAAQD//wAA/v/8//3//f/+//7//v/9//3//v///////f/9/wAA/////wAAAQAAAP7////9/wEAAAD///3//P/8//7////+/wEA///+//7//v/+//z//v8AAP///v/9//z//v/8//r//f/9//v/+v/5//v/+//7//z/+v/7//r//P/6//n/+//6//z/+f/4//n/+v/8//3///////z/+///////AAAAAAIA///+//////8CAP7///8BAAMAAAD9//7/AQABAAEA///8/////P8AAP3/+//+//v//P/9//z/9f/4//3/+f/9//r/9f/5//j/9f/5//3/+P/7//b/9//2/Line truncated
|
||||
" Your browser does not support the audio element.\n",
|
||||
" </audio>\n",
|
||||
" "
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.lib.display.Audio object>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Step 1: Define the text you want to convert to speech\n",
|
||||
"text = \"What time is the meeting?\"\n",
|
||||
"\n",
|
||||
"# Step 2: Generate speech from text and save as MP3\n",
|
||||
"tts = gTTS(text=text, lang='en')\n",
|
||||
"tts.save(\"question.mp3\")\n",
|
||||
"\n",
|
||||
"# Step 3: Convert MP3 to WAV using pydub\n",
|
||||
"sound = AudioSegment.from_mp3(\"question.mp3\")\n",
|
||||
"sound.export(\"question.wav\", format=\"wav\")\n",
|
||||
"\n",
|
||||
"print(\"✅ WAV file 'question.wav' has been created.\")\n",
|
||||
"\n",
|
||||
"# Optional: Play the audio (works in Jupyter/Colab)\n",
|
||||
"try:\n",
|
||||
" display(Audio(\"question.wav\"))\n",
|
||||
"except:\n",
|
||||
" print(\"You can now play 'question.wav' manually.\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "AuA3Cj7mjamh",
|
||||
"metadata": {
|
||||
"id": "AuA3Cj7mjamh"
|
||||
},
|
||||
"source": [
|
||||
"# YAML Prompt (Role, Goal, Instructions)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "Au5fg-6UiwDP",
|
||||
"metadata": {
|
||||
"id": "Au5fg-6UiwDP"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"ROLE = \"Voice-driven knowledge assistant. Expert in understanding spoken queries and providing accurate, concise answers.\"\n",
|
||||
"GOAL = \"Transcribe the user's voice input and answer their question or find relevant information.\"\n",
|
||||
"INSTRUCTIONS = \"Given a transcribed user question, provide a clear, factual, and helpful answer. If the question is unclear, ask for clarification.\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "yz4P9xvpjc4b",
|
||||
"metadata": {
|
||||
"id": "yz4P9xvpjc4b"
|
||||
},
|
||||
"source": [
|
||||
"# Main (Transcription + Agent)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "ubYuWOYCiyCx",
|
||||
"metadata": {
|
||||
"id": "ubYuWOYCiyCx"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def transcribe_audio(audio_file):\n",
|
||||
" recognizer = sr.Recognizer()\n",
|
||||
" with sr.AudioFile(audio_file) as source:\n",
|
||||
" audio = recognizer.record(source)\n",
|
||||
" try:\n",
|
||||
" return recognizer.recognize_google(audio)\n",
|
||||
" except Exception as e:\n",
|
||||
" print(\"Transcription error:\", e)\n",
|
||||
" return None\n",
|
||||
"\n",
|
||||
"def talk2find_agent(audio_file):\n",
|
||||
" query = transcribe_audio(audio_file)\n",
|
||||
" if not query:\n",
|
||||
" return {\"error\": \"Could not transcribe audio.\"}\n",
|
||||
" print(\"Transcribed text:\", query)\n",
|
||||
" agent = Agent(role=ROLE, goal=GOAL, instructions=INSTRUCTIONS)\n",
|
||||
" return agent.start(query)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "VDMMruvCiz8r",
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 314,
|
||||
"referenced_widgets": [
|
||||
"b72c0f15f2e24a678edcf696b7cc13a3",
|
||||
"99867a03f5474e4c9f22ec5ea948a6ed"
|
||||
]
|
||||
},
|
||||
"id": "VDMMruvCiz8r",
|
||||
"outputId": "14354595-25ef-4600-c3c8-8b1ff9c4aba0"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Transcribed text: what time is the meeting\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╭─ </span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8; font-weight: bold\">Agent Info</span><span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\"> ────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #ff9b9b; text-decoration-color: #ff9b9b; font-weight: bold\">👤 Agent:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">Agent</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #b4b4b3; text-decoration-color: #b4b4b3; font-weight: bold\">Role:</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">Voice-driven knowledge assistant. Expert in understanding spoken queries and providing accurate, </span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #ffe5e5; text-decoration-color: #ffe5e5\">concise answers.</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span> <span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">│</span>\n",
|
||||
"<span style=\"color: #d2e3c8; text-decoration-color: #d2e3c8\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[38;2;210;227;200m╭─\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[1;38;2;210;227;200mAgent Info\u001b[0m\u001b[38;2;210;227;200m \u001b[0m\u001b[38;2;210;227;200m───────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[38;2;210;227;200m─╮\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;255;155;155m👤 Agent:\u001b[0m \u001b[38;2;255;229;229mAgent\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[1;38;2;180;180;179mRole:\u001b[0m \u001b[38;2;255;229;229mVoice-driven knowledge assistant. Expert in understanding spoken queries and providing accurate, \u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;255;229;229mconcise answers.\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m│\u001b[0m \u001b[38;2;210;227;200m│\u001b[0m\n",
|
||||
"\u001b[38;2;210;227;200m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "b72c0f15f2e24a678edcf696b7cc13a3",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Output()"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
||||
],
|
||||
"text/plain": []
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">Response generated in 2.3s</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[2mResponse generated in 2.3s\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭───────────────────────────────────────────────────── Task ──────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> what time is the meeting <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m────────────────────────────────────────────────────\u001b[0m\u001b[36m Task \u001b[0m\u001b[36m─────────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m what time is the meeting \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080\">╭─────────────────────────────────────────────────── Response ────────────────────────────────────────────────────╮</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> I'm sorry, I don't have access to your schedule or specific meeting details. Could you provide more information <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> about which meeting you're referring to? <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
|
||||
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
|
||||
"</pre>\n"
|
||||
],
|
||||
"text/plain": [
|
||||
"\u001b[36m╭─\u001b[0m\u001b[36m──────────────────────────────────────────────────\u001b[0m\u001b[36m Response \u001b[0m\u001b[36m───────────────────────────────────────────────────\u001b[0m\u001b[36m─╮\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m I'm sorry, I don't have access to your schedule or specific meeting details. Could you provide more information \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m│\u001b[0m about which meeting you're referring to? \u001b[36m│\u001b[0m\n",
|
||||
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"I'm sorry, I don't have access to your schedule or specific meeting details. Could you provide more information about which meeting you're referring to?\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"audio_path = \"question.wav\"\n",
|
||||
"result = talk2find_agent(audio_path)\n",
|
||||
"print(result)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.x"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import asyncio
|
||||
from praisonaiagents import Agent
|
||||
|
||||
async def main():
|
||||
agent = Agent(
|
||||
instructions="You are a helpful assistant",
|
||||
llm="gemini/gemini-1.5-flash-8b",
|
||||
self_reflect=True,
|
||||
verbose=True
|
||||
)
|
||||
|
||||
# Use achat instead of start/chat for async operation
|
||||
response = await agent.achat("Why sky is Blue in 1000 words?")
|
||||
print(response)
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Run the async main function
|
||||
asyncio.run(main())
|
||||
@@ -0,0 +1,127 @@
|
||||
import asyncio
|
||||
import logging
|
||||
from typing import List, Dict, Any
|
||||
from pydantic import BaseModel
|
||||
from praisonaiagents import Agent, Task, PraisonAIAgents, TaskOutput
|
||||
from tavily import AsyncTavilyClient
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
llm_config = {
|
||||
"model": "gemini/gemini-1.5-flash-8b",
|
||||
"response_format": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
|
||||
# Define output model
|
||||
class SearchResult(BaseModel):
|
||||
query: str
|
||||
results: List[Dict[str, Any]]
|
||||
total_results: int
|
||||
|
||||
# Define Tavily search tool
|
||||
async def tavily_search(query) -> Dict[str, Any]:
|
||||
"""Async Tavily search tool that returns structured results"""
|
||||
client = AsyncTavilyClient()
|
||||
try:
|
||||
results = await client.search(query)
|
||||
print(f"Tavily search results: {results}")
|
||||
return {
|
||||
"query": query,
|
||||
"results": results.get("results", []),
|
||||
"total_results": len(results.get("results", []))
|
||||
}
|
||||
except Exception as e:
|
||||
logging.error(f"Tavily search error: {e}")
|
||||
return {
|
||||
"query": query,
|
||||
"results": [],
|
||||
"total_results": 0
|
||||
}
|
||||
|
||||
# Define async callback
|
||||
async def async_callback(output: TaskOutput):
|
||||
if output.output_format == "JSON":
|
||||
logging.info(f"Search completed: {output.json_dict.get('query', '')}")
|
||||
elif output.output_format == "Pydantic":
|
||||
logging.info(f"Search completed: {output.pydantic}")
|
||||
|
||||
async def run_parallel_searches():
|
||||
# Create search agent with direct tool function
|
||||
search_agent = Agent(
|
||||
name="TavilySearchAgent",
|
||||
role="Search Specialist",
|
||||
goal="Perform parallel web searches with high accuracy",
|
||||
backstory="Expert in web search and information retrieval",
|
||||
tools=[tavily_search],
|
||||
llm=llm_config
|
||||
)
|
||||
|
||||
# Create summary agent
|
||||
summary_agent = Agent(
|
||||
name="ContentSynthesizer",
|
||||
role="Research Analyst",
|
||||
goal="Synthesize search results into coherent insights",
|
||||
backstory="Expert in analyzing and combining multiple sources of information",
|
||||
llm=llm_config
|
||||
)
|
||||
|
||||
# Define search topics
|
||||
search_topics = [
|
||||
"Latest AI breakthroughs 2024",
|
||||
"Future of quantum computing",
|
||||
"Advancements in robotics"
|
||||
]
|
||||
|
||||
# Create parallel search tasks
|
||||
search_tasks = [
|
||||
Task(
|
||||
name=f"search_{i}",
|
||||
description=f"Search and analyze: {topic}",
|
||||
expected_output="Comprehensive search results with analysis",
|
||||
agent=search_agent,
|
||||
async_execution=True,
|
||||
callback=async_callback,
|
||||
) for i, topic in enumerate(search_topics)
|
||||
]
|
||||
|
||||
# Create summary task
|
||||
summary_task = Task(
|
||||
name="synthesize_results",
|
||||
description="Create a comprehensive summary of all search findings",
|
||||
expected_output="Synthesized insights from all searches",
|
||||
agent=summary_agent,
|
||||
async_execution=False,
|
||||
context=search_tasks
|
||||
)
|
||||
|
||||
# Initialize agents manager
|
||||
agents = PraisonAIAgents(
|
||||
agents=[search_agent, summary_agent],
|
||||
tasks=search_tasks + [summary_task]
|
||||
)
|
||||
|
||||
# Execute tasks - FIXED: Added return_dict=True
|
||||
results = await agents.astart(return_dict=True)
|
||||
return {
|
||||
"search_results": [str(results["task_results"][i]) for i in range(len(search_tasks))],
|
||||
"summary": str(results["task_results"][summary_task.id]),
|
||||
"topics": search_topics
|
||||
}
|
||||
|
||||
async def main():
|
||||
try:
|
||||
logging.info("Starting parallel Tavily searches...")
|
||||
results = await run_parallel_searches()
|
||||
logging.info("Search process completed successfully")
|
||||
print("\nResults Summary:")
|
||||
for topic, result in zip(results["topics"], results["search_results"]):
|
||||
print(f"\n{topic}:\n{result}")
|
||||
print(f"\nFinal Summary:\n{results['summary']}")
|
||||
except Exception as e:
|
||||
logging.error(f"Error in execution: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
@@ -0,0 +1,8 @@
|
||||
from praisonaiagents import Agent
|
||||
|
||||
agent = Agent(
|
||||
instructions="You are a helpful assistant",
|
||||
llm="gpt-4o-mini"
|
||||
)
|
||||
|
||||
agent.start("Why sky is Blue?")
|
||||
@@ -0,0 +1,30 @@
|
||||
from praisonaiagents import Agent, Task, PraisonAIAgents
|
||||
from langchain_community.tools import YouTubeSearchTool
|
||||
from langchain_community.utilities import WikipediaAPIWrapper
|
||||
|
||||
# Create an agent with both tools
|
||||
agent = Agent(
|
||||
name="SearchAgent",
|
||||
role="Research Assistant",
|
||||
goal="Search for information from multiple sources",
|
||||
backstory="I am an AI assistant that can search YouTube and Wikipedia.",
|
||||
tools=[YouTubeSearchTool, WikipediaAPIWrapper],
|
||||
self_reflect=False
|
||||
)
|
||||
|
||||
# Create tasks to demonstrate both tools
|
||||
task = Task(
|
||||
name="search_task",
|
||||
description="Search for information about 'AI advancements' on both YouTube and Wikipedia",
|
||||
expected_output="Combined information from YouTube videos and Wikipedia articles",
|
||||
agent=agent
|
||||
)
|
||||
|
||||
# Create and start the workflow
|
||||
agents = PraisonAIAgents(
|
||||
agents=[agent],
|
||||
tasks=[task],
|
||||
verbose=True
|
||||
)
|
||||
|
||||
agents.start()
|
||||
@@ -0,0 +1,45 @@
|
||||
from praisonaiagents import Agent
|
||||
|
||||
# Detailed LLM configuration
|
||||
llm_config = {
|
||||
"model": "gemini/gemini-1.5-flash-latest", # Model name without provider prefix
|
||||
|
||||
# Core settings
|
||||
"temperature": 0.7, # Controls randomness (like temperature)
|
||||
"timeout": 30, # Timeout in seconds
|
||||
"top_p": 0.9, # Nucleus sampling parameter
|
||||
"max_tokens": 1000, # Max tokens in response
|
||||
|
||||
# Advanced parameters
|
||||
"presence_penalty": 0.1, # Penalize repetition of topics (-2.0 to 2.0)
|
||||
"frequency_penalty": 0.1, # Penalize token repetition (-2.0 to 2.0)
|
||||
|
||||
# API settings (optional)
|
||||
"api_key": None, # Your API key (or use environment variable)
|
||||
"base_url": None, # Custom API endpoint if needed
|
||||
|
||||
# Response formatting
|
||||
"response_format": { # Force specific response format
|
||||
"type": "text" # Options: "text", "json_object"
|
||||
},
|
||||
|
||||
# Additional controls
|
||||
"seed": 42, # For reproducible responses
|
||||
"stop_phrases": ["##", "END"], # Custom stop sequences
|
||||
}
|
||||
|
||||
agent = Agent(
|
||||
instructions="You are a helpful Assistant specialized in scientific explanations. "
|
||||
"Provide clear, accurate, and engaging responses.",
|
||||
llm=llm_config, # Pass the detailed configuration
|
||||
verbose=True, # Enable detailed output
|
||||
markdown=True, # Format responses in markdown
|
||||
self_reflect=True, # Enable self-reflection
|
||||
max_reflect=3, # Maximum reflection iterations
|
||||
min_reflect=1 # Minimum reflection iterations
|
||||
)
|
||||
|
||||
# Test the agent
|
||||
response = agent.start("Why is the sky blue? Please explain in simple terms.")
|
||||
|
||||
print(response)
|
||||
@@ -0,0 +1,10 @@
|
||||
from praisonaiagents import Agent, MCP
|
||||
|
||||
agent = Agent(
|
||||
instructions="""You are a helpful assistant that can check stock prices and perform other tasks.
|
||||
Use the available tools when relevant to answer user questions.""",
|
||||
llm="gpt-4o-mini",
|
||||
tools = MCP("/Users/praison/miniconda3/envs/mcp/bin/python /Users/praison/stockprice/app.py")
|
||||
)
|
||||
|
||||
agent.start("What is the stock price of Tesla?")
|
||||
@@ -311,6 +311,58 @@ class LLM:
|
||||
# This ensures we make a single non-streaming call rather than risk
|
||||
# missing tool calls or making duplicate calls
|
||||
return False
|
||||
|
||||
def _build_messages(self, prompt, system_prompt=None, chat_history=None, output_json=None, output_pydantic=None):
|
||||
"""Build messages list for LLM completion. Works for both sync and async.
|
||||
|
||||
Args:
|
||||
prompt: The user prompt (str or list)
|
||||
system_prompt: Optional system prompt
|
||||
chat_history: Optional list of previous messages
|
||||
output_json: Optional Pydantic model for JSON output
|
||||
output_pydantic: Optional Pydantic model for JSON output (alias)
|
||||
|
||||
Returns:
|
||||
tuple: (messages list, original prompt)
|
||||
"""
|
||||
messages = []
|
||||
|
||||
# Handle system prompt
|
||||
if system_prompt:
|
||||
# Append JSON schema if needed
|
||||
if output_json:
|
||||
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {json.dumps(output_json.model_json_schema())}"
|
||||
elif output_pydantic:
|
||||
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {json.dumps(output_pydantic.model_json_schema())}"
|
||||
|
||||
# Skip system messages for legacy o1 models as they don't support them
|
||||
if not self._needs_system_message_skip():
|
||||
messages.append({"role": "system", "content": system_prompt})
|
||||
|
||||
# Add chat history if provided
|
||||
if chat_history:
|
||||
messages.extend(chat_history)
|
||||
|
||||
# Handle prompt modifications for JSON output
|
||||
original_prompt = prompt
|
||||
if output_json or output_pydantic:
|
||||
if isinstance(prompt, str):
|
||||
prompt = prompt + "\nReturn ONLY a valid JSON object. No other text or explanation."
|
||||
elif isinstance(prompt, list):
|
||||
# Create a copy to avoid modifying the original
|
||||
prompt = prompt.copy()
|
||||
for item in prompt:
|
||||
if item.get("type") == "text":
|
||||
item["text"] = item["text"] + "\nReturn ONLY a valid JSON object. No other text or explanation."
|
||||
break
|
||||
|
||||
# Add prompt to messages
|
||||
if isinstance(prompt, list):
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
else:
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
|
||||
return messages, original_prompt
|
||||
|
||||
def get_response(
|
||||
self,
|
||||
@@ -421,36 +473,14 @@ class LLM:
|
||||
if not formatted_tools:
|
||||
formatted_tools = None
|
||||
|
||||
# Build messages list
|
||||
messages = []
|
||||
if system_prompt:
|
||||
if output_json:
|
||||
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {json.dumps(output_json.model_json_schema())}"
|
||||
elif output_pydantic:
|
||||
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {json.dumps(output_pydantic.model_json_schema())}"
|
||||
# Skip system messages for legacy o1 models as they don't support them
|
||||
if not self._needs_system_message_skip():
|
||||
messages.append({"role": "system", "content": system_prompt})
|
||||
|
||||
if chat_history:
|
||||
messages.extend(chat_history)
|
||||
|
||||
# Handle prompt modifications for JSON output
|
||||
original_prompt = prompt
|
||||
if output_json or output_pydantic:
|
||||
if isinstance(prompt, str):
|
||||
prompt += "\nReturn ONLY a valid JSON object. No other text or explanation."
|
||||
elif isinstance(prompt, list):
|
||||
for item in prompt:
|
||||
if item["type"] == "text":
|
||||
item["text"] += "\nReturn ONLY a valid JSON object. No other text or explanation."
|
||||
break
|
||||
|
||||
# Add prompt to messages
|
||||
if isinstance(prompt, list):
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
else:
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
# Build messages list using shared helper
|
||||
messages, original_prompt = self._build_messages(
|
||||
prompt=prompt,
|
||||
system_prompt=system_prompt,
|
||||
chat_history=chat_history,
|
||||
output_json=output_json,
|
||||
output_pydantic=output_pydantic
|
||||
)
|
||||
|
||||
start_time = time.time()
|
||||
reflection_count = 0
|
||||
@@ -1160,36 +1190,14 @@ Output MUST be JSON with 'reflection' and 'satisfactory'.
|
||||
reasoning_steps = kwargs.pop('reasoning_steps', self.reasoning_steps)
|
||||
litellm.set_verbose = False
|
||||
|
||||
# Build messages list
|
||||
messages = []
|
||||
if system_prompt:
|
||||
if output_json:
|
||||
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {json.dumps(output_json.model_json_schema())}"
|
||||
elif output_pydantic:
|
||||
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {json.dumps(output_pydantic.model_json_schema())}"
|
||||
# Skip system messages for legacy o1 models as they don't support them
|
||||
if not self._needs_system_message_skip():
|
||||
messages.append({"role": "system", "content": system_prompt})
|
||||
|
||||
if chat_history:
|
||||
messages.extend(chat_history)
|
||||
|
||||
# Handle prompt modifications for JSON output
|
||||
original_prompt = prompt
|
||||
if output_json or output_pydantic:
|
||||
if isinstance(prompt, str):
|
||||
prompt += "\nReturn ONLY a valid JSON object. No other text or explanation."
|
||||
elif isinstance(prompt, list):
|
||||
for item in prompt:
|
||||
if item["type"] == "text":
|
||||
item["text"] += "\nReturn ONLY a valid JSON object. No other text or explanation."
|
||||
break
|
||||
|
||||
# Add prompt to messages
|
||||
if isinstance(prompt, list):
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
else:
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
# Build messages list using shared helper
|
||||
messages, original_prompt = self._build_messages(
|
||||
prompt=prompt,
|
||||
system_prompt=system_prompt,
|
||||
chat_history=chat_history,
|
||||
output_json=output_json,
|
||||
output_pydantic=output_pydantic
|
||||
)
|
||||
|
||||
start_time = time.time()
|
||||
reflection_count = 0
|
||||
@@ -1901,18 +1909,11 @@ Output MUST be JSON with 'reflection' and 'satisfactory'.
|
||||
}
|
||||
logger.debug(f"Response method configuration: {json.dumps(debug_info, indent=2, default=str)}")
|
||||
|
||||
# Build messages list
|
||||
messages = []
|
||||
if system_prompt:
|
||||
# Skip system messages for legacy o1 models as they don't support them
|
||||
if not self._needs_system_message_skip():
|
||||
messages.append({"role": "system", "content": system_prompt})
|
||||
|
||||
# Add prompt to messages
|
||||
if isinstance(prompt, list):
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
else:
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
# Build messages list using shared helper (simplified version without JSON output)
|
||||
messages, _ = self._build_messages(
|
||||
prompt=prompt,
|
||||
system_prompt=system_prompt
|
||||
)
|
||||
|
||||
# Get response from LiteLLM
|
||||
if stream:
|
||||
@@ -2009,18 +2010,11 @@ Output MUST be JSON with 'reflection' and 'satisfactory'.
|
||||
}
|
||||
logger.debug(f"Async response method configuration: {json.dumps(debug_info, indent=2, default=str)}")
|
||||
|
||||
# Build messages list
|
||||
messages = []
|
||||
if system_prompt:
|
||||
# Skip system messages for legacy o1 models as they don't support them
|
||||
if not self._needs_system_message_skip():
|
||||
messages.append({"role": "system", "content": system_prompt})
|
||||
|
||||
# Add prompt to messages
|
||||
if isinstance(prompt, list):
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
else:
|
||||
messages.append({"role": "user", "content": prompt})
|
||||
# Build messages list using shared helper (simplified version without JSON output)
|
||||
messages, _ = self._build_messages(
|
||||
prompt=prompt,
|
||||
system_prompt=system_prompt
|
||||
)
|
||||
|
||||
# Get response from LiteLLM
|
||||
if stream:
|
||||
|
||||
@@ -140,7 +140,7 @@ def instrument_workflow(workflow: 'PraisonAIAgents', telemetry: Optional['Minima
|
||||
task = None
|
||||
try:
|
||||
# Get task info
|
||||
if hasattr(workflow, 'tasks') and task_id < len(workflow.tasks):
|
||||
if hasattr(workflow, 'tasks') and isinstance(task_id, int) and task_id < len(workflow.tasks):
|
||||
task = workflow.tasks[task_id]
|
||||
|
||||
result = original_execute_task(task_id, *args, **kwargs)
|
||||
|
||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "praisonaiagents"
|
||||
version = "0.0.110"
|
||||
version = "0.0.112"
|
||||
description = "Praison AI agents for completing complex tasks with Self Reflection Agents"
|
||||
requires-python = ">=3.10"
|
||||
authors = [
|
||||
|
||||
@@ -103,8 +103,8 @@ async def run_parallel_searches():
|
||||
tasks=search_tasks + [summary_task]
|
||||
)
|
||||
|
||||
# Execute tasks
|
||||
results = await agents.astart()
|
||||
# Execute tasks - FIXED: Added return_dict=True
|
||||
results = await agents.astart(return_dict=True)
|
||||
return {
|
||||
"search_results": [str(results["task_results"][i]) for i in range(len(search_tasks))],
|
||||
"summary": str(results["task_results"][summary_task.id]),
|
||||
|
||||
Generated
+1
-1
@@ -2375,7 +2375,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "praisonaiagents"
|
||||
version = "0.0.110"
|
||||
version = "0.0.112"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "mcp" },
|
||||
|
||||
@@ -3,8 +3,8 @@ class Praisonai < Formula
|
||||
|
||||
desc "AI tools for various AI applications"
|
||||
homepage "https://github.com/MervinPraison/PraisonAI"
|
||||
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.37.tar.gz"
|
||||
sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.37.tar.gz | shasum -a 256`.split.first
|
||||
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.39.tar.gz"
|
||||
sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.39.tar.gz | shasum -a 256`.split.first
|
||||
license "MIT"
|
||||
|
||||
depends_on "[email protected]"
|
||||
|
||||
@@ -57,7 +57,7 @@ class CloudDeployer:
|
||||
file.write("FROM python:3.11-slim\n")
|
||||
file.write("WORKDIR /app\n")
|
||||
file.write("COPY . .\n")
|
||||
file.write("RUN pip install flask praisonai==2.2.37 gunicorn markdown\n")
|
||||
file.write("RUN pip install flask praisonai==2.2.39 gunicorn markdown\n")
|
||||
file.write("EXPOSE 8080\n")
|
||||
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "PraisonAI"
|
||||
version = "2.2.37"
|
||||
version = "2.2.39"
|
||||
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration."
|
||||
readme = "README.md"
|
||||
license = ""
|
||||
@@ -12,7 +12,7 @@ dependencies = [
|
||||
"rich>=13.7",
|
||||
"markdown>=3.5",
|
||||
"pyparsing>=3.0.0",
|
||||
"praisonaiagents>=0.0.110",
|
||||
"praisonaiagents>=0.0.112",
|
||||
"python-dotenv>=0.19.0",
|
||||
"instructor>=1.3.3",
|
||||
"PyYAML>=6.0",
|
||||
@@ -95,7 +95,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.15", "crewai"]
|
||||
|
||||
[tool.poetry]
|
||||
name = "PraisonAI"
|
||||
version = "2.2.37"
|
||||
version = "2.2.39"
|
||||
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration."
|
||||
authors = ["Mervin Praison"]
|
||||
license = ""
|
||||
@@ -113,7 +113,7 @@ python = ">=3.10,<3.13"
|
||||
rich = ">=13.7"
|
||||
markdown = ">=3.5"
|
||||
pyparsing = ">=3.0.0"
|
||||
praisonaiagents = ">=0.0.110"
|
||||
praisonaiagents = ">=0.0.112"
|
||||
python-dotenv = ">=0.19.0"
|
||||
instructor = ">=1.3.3"
|
||||
PyYAML = ">=6.0"
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Test script to verify Phase 2 refactoring maintains backward compatibility"""
|
||||
|
||||
import asyncio
|
||||
from src.praisonai_agents.praisonaiagents.llm.llm import LLM
|
||||
|
||||
def test_sync_methods():
|
||||
"""Test synchronous methods still work correctly"""
|
||||
print("Testing synchronous methods...")
|
||||
|
||||
# Test basic response
|
||||
llm = LLM(model="gpt-3.5-turbo")
|
||||
|
||||
# Test simple prompt
|
||||
print("1. Testing simple prompt...")
|
||||
response = llm.response(
|
||||
prompt="What is 2+2?",
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response}")
|
||||
assert response, "Should get a response"
|
||||
|
||||
# Test with system prompt
|
||||
print("2. Testing with system prompt...")
|
||||
response = llm.response(
|
||||
prompt="Hello",
|
||||
system_prompt="You are a helpful assistant. Always respond politely.",
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response[:50]}...")
|
||||
assert response, "Should get a response with system prompt"
|
||||
|
||||
# Test with chat history
|
||||
print("3. Testing with chat history...")
|
||||
chat_history = [
|
||||
{"role": "user", "content": "My name is Alice"},
|
||||
{"role": "assistant", "content": "Nice to meet you, Alice!"}
|
||||
]
|
||||
response = llm.get_response(
|
||||
prompt="What's my name?",
|
||||
chat_history=chat_history,
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response}")
|
||||
assert response, "Should get a response with chat history"
|
||||
|
||||
print("✅ Synchronous methods working correctly\n")
|
||||
|
||||
async def test_async_methods():
|
||||
"""Test asynchronous methods still work correctly"""
|
||||
print("Testing asynchronous methods...")
|
||||
|
||||
# Test basic async response
|
||||
llm = LLM(model="gpt-3.5-turbo")
|
||||
|
||||
# Test simple prompt
|
||||
print("1. Testing async simple prompt...")
|
||||
response = await llm.aresponse(
|
||||
prompt="What is 3+3?",
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response}")
|
||||
assert response, "Should get an async response"
|
||||
|
||||
# Test with system prompt
|
||||
print("2. Testing async with system prompt...")
|
||||
response = await llm.aresponse(
|
||||
prompt="Goodbye",
|
||||
system_prompt="You are a helpful assistant. Always respond politely.",
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response[:50]}...")
|
||||
assert response, "Should get an async response with system prompt"
|
||||
|
||||
# Test with chat history
|
||||
print("3. Testing async with chat history...")
|
||||
chat_history = [
|
||||
{"role": "user", "content": "My favorite color is blue"},
|
||||
{"role": "assistant", "content": "Blue is a nice color!"}
|
||||
]
|
||||
response = await llm.get_response_async(
|
||||
prompt="What's my favorite color?",
|
||||
chat_history=chat_history,
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response}")
|
||||
assert response, "Should get an async response with chat history"
|
||||
|
||||
print("✅ Asynchronous methods working correctly\n")
|
||||
|
||||
def test_edge_cases():
|
||||
"""Test edge cases and special scenarios"""
|
||||
print("Testing edge cases...")
|
||||
|
||||
llm = LLM(model="gpt-3.5-turbo")
|
||||
|
||||
# Test with list prompt (multimodal-style)
|
||||
print("1. Testing list-style prompt...")
|
||||
prompt = [{"type": "text", "text": "What is 4+4?"}]
|
||||
response = llm.response(
|
||||
prompt=prompt,
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response}")
|
||||
assert response, "Should handle list-style prompts"
|
||||
|
||||
# Test with legacy o1 model (system message should be skipped)
|
||||
print("2. Testing legacy o1 model handling...")
|
||||
llm_o1 = LLM(model="o1-mini")
|
||||
response = llm_o1.response(
|
||||
prompt="Hello",
|
||||
system_prompt="This should be skipped",
|
||||
verbose=False
|
||||
)
|
||||
print(f" Response: {response[:50]}...")
|
||||
assert response, "Should handle legacy o1 models"
|
||||
|
||||
print("✅ Edge cases handled correctly\n")
|
||||
|
||||
def main():
|
||||
"""Run all tests"""
|
||||
print("=== Phase 2 Refactoring Verification ===\n")
|
||||
|
||||
try:
|
||||
# Test sync methods
|
||||
test_sync_methods()
|
||||
|
||||
# Test async methods
|
||||
asyncio.run(test_async_methods())
|
||||
|
||||
# Test edge cases
|
||||
test_edge_cases()
|
||||
|
||||
print("✅ ALL TESTS PASSED! The refactoring maintains backward compatibility.")
|
||||
print("\nSummary:")
|
||||
print("- Message building logic successfully extracted to _build_messages()")
|
||||
print("- All 4 methods (get_response, response, get_response_async, aresponse) updated")
|
||||
print("- ~40 lines of duplicated code removed")
|
||||
print("- No breaking changes detected")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ TEST FAILED: {str(e)}")
|
||||
raise
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Generated
+5
-5
@@ -3931,7 +3931,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "praisonai"
|
||||
version = "2.2.37"
|
||||
version = "2.2.39"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "instructor" },
|
||||
@@ -4073,7 +4073,7 @@ requires-dist = [
|
||||
{ name = "plotly", marker = "extra == 'realtime'", specifier = ">=5.24.0" },
|
||||
{ name = "praisonai-tools", marker = "extra == 'autogen'", specifier = ">=0.0.15" },
|
||||
{ name = "praisonai-tools", marker = "extra == 'crewai'", specifier = ">=0.0.15" },
|
||||
{ name = "praisonaiagents", specifier = ">=0.0.110" },
|
||||
{ name = "praisonaiagents", specifier = ">=0.0.112" },
|
||||
{ name = "pyautogen", marker = "extra == 'autogen'", specifier = ">=0.2.19" },
|
||||
{ name = "pydantic", marker = "extra == 'chat'", specifier = "<=2.10.1" },
|
||||
{ name = "pydantic", marker = "extra == 'code'", specifier = "<=2.10.1" },
|
||||
@@ -4130,7 +4130,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "praisonaiagents"
|
||||
version = "0.0.110"
|
||||
version = "0.0.112"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "mcp" },
|
||||
@@ -4139,9 +4139,9 @@ dependencies = [
|
||||
{ name = "pydantic" },
|
||||
{ name = "rich" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a4/29/e17d321fa7d126d414c597a4bca5dbd2eb7adcd44351629b00b7030b878e/praisonaiagents-0.0.110.tar.gz", hash = "sha256:a086cd8d7b63b8210ff182b53831e9e8803673226742d47c87f58cf51006a22e", size = 166878 }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b8/f0/f03a2e64ee0f78824a78275b8a2350f2086a37dd75601b43e740f7a55c3b/praisonaiagents-0.0.112.tar.gz", hash = "sha256:504efc8a427b80a2e4865831c651c834239fb33b7766792e2f3d1157518ac09a", size = 166924 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/64/37/e2ed16ecc84bf2971badbb7ed73bb33a31051d67da4dbccf00824250aec3/praisonaiagents-0.0.110-py3-none-any.whl", hash = "sha256:77152a77955fb26fccc3cf21baac97e09d4189558d22f5a293d9db20a186f3f9", size = 186345 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f8/da/83271d3671e468f855e225c9c23fe19b7a5be654ab8f8b0fc305bf1b10f1/praisonaiagents-0.0.112-py3-none-any.whl", hash = "sha256:b402af5eb7e3ffca702aeae89ca01f8f4c223aa194b743a3d9d1feb71e5efd6e", size = 186397 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
Reference in new issue
Block a user