Compare commits

...
749 Commits
Author SHA1 Message Date
Mervin Praison 3f58e3b1ad chore: bump PraisonAI to v2.2.84 and PraisonAI Agents to v0.0.158 across all files 2025-08-08 07:54:22 +01:00
Mervin Praison 561c32ddd5 refactor: update model name from gpt-4o-mini to gpt-5-nano across all files 2025-08-08 07:52:37 +01:00
Mervin Praison 79d934eec4 feat: bump praisonai to 2.2.83 and add xml-toolcall-agent implementation 2025-08-05 07:44:47 +01:00
Mervin Praison 144c7edc4a Merge pull request #1079 from MervinPraison/claude/issue-1077-20250805-0109
feat: make XML tool call parsing dynamic and configurable
2025-08-05 02:31:08 +01:00
Mervin Praison 4425e2b743 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-08-05 02:28:00 +01:00
Mervin Praison eb8dfc02cd feat: optimize OpenAIClient with lazy loading and tool caching 2025-08-05 02:27:59 +01:00
github-actions[bot]andMervin Praison 27b6193b90 fix: improve XML tool call parsing robustness and type handling
- Fix type inconsistency in xml_tool_format handling (now supports True/''true''/''True'')
- Simplify _is_qwen_provider() by removing redundant logic
- Add proper XML parsing with ElementTree as primary method
- Improve regex fallback pattern for nested JSON in XML tags
- Add graceful error handling for malformed XML
- Import xml.etree.ElementTree at module level for better performance

Co-authored-by: Mervin Praison <[email protected]>
2025-08-05 01:26:48 +00:00
github-actions[bot]andMervin Praison b0aa9dfe58 feat: make XML tool call parsing dynamic and configurable
- Add xml_tool_format configuration parameter (auto/true/false)
- Replace static Qwen detection with dynamic _supports_xml_tool_format() method
- Add fallback XML detection for any model outputting <tool_call> tags
- Maintain backward compatibility with existing Qwen auto-detection
- Support manual XML format enabling for any model

Fixes #1077

Co-authored-by: Mervin Praison <[email protected]>
2025-08-05 01:13:22 +00:00
Mervin Praison 89d4f52327 Merge pull request #1075 from MervinPraison/claude/issue-1074-20250731-1148
fix: Fix RAG integration tests to respect lazy loading pattern
2025-07-31 13:05:47 +01:00
github-actions[bot]andMervin Praison da545f2e49 fix: Fix RAG integration tests to respect lazy loading pattern
- Fixed test_agent_with_knowledge_config and test_ollama_rag_integration
- Tests now properly check for lazy loading behavior instead of expecting immediate knowledge availability
- Verifies knowledge sources are stored and manually triggers processing before checking knowledge availability
- Preserves performance optimization of lazy loading while ensuring correct test behavior
- All RAG integration tests now pass (11/11)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-31 11:53:01 +00:00
Mervin Praison e794992d7b feat: optimize LLM performance with caching and lazy loading 2025-07-31 12:39:37 +01:00
Mervin Praison a958162704 perf: optimize agent performance with lazy loading and caching strategies 2025-07-31 12:19:17 +01:00
Mervin Praison 3b47f7be7f chore: update MongoDB connection strings from localhost to remote cluster 2025-07-31 07:59:51 +01:00
Mervin Praison 0b8da8b4c4 Merge pull request #1072 from MervinPraison/claude/issue-1071-20250729-0039
fix: resolve MongoDB SearchIndexModel missing definition argument
2025-07-29 08:07:23 +01:00
github-actions[bot]andMervinPraison 092ea67732 fix: apply SearchIndexModel compatibility fix to memory.py and mongodb_tools.py
Extends the PyMongo 4.6+ compatibility fix from knowledge.py to other files
that also use create_search_index(). Applies the same backward-compatible
pattern using SearchIndexModel with graceful fallback for older PyMongo versions.

- memory.py: Fix _create_vector_search_indexes() method
- mongodb_tools.py: Fix create_vector_index() method

Maintains zero performance overhead and full backward compatibility.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: MervinPraison <[email protected]>
2025-07-29 00:54:57 +00:00
github-actions[bot]andMervin Praison 5931ad00be fix: resolve MongoDB SearchIndexModel missing definition argument
- Import SearchIndexModel from pymongo.operations for PyMongo 4.6+ compatibility
- Use SearchIndexModel with definition parameter in _create_vector_index()
- Add backward compatibility fallback for older PyMongo versions
- Maintains zero performance overhead and preserves existing functionality

Fixes #1071

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-29 00:44:36 +00:00
Mervin Praison b7676cf6c3 update github actions 2025-07-29 01:38:33 +01:00
Mervin Praison 8ec4f5efa2 Merge pull request #1070 from MervinPraison/claude/issue-1069-20250728-2326
fix: resolve MongoDB vector search index creation error (missing embedding_model_name)
2025-07-29 01:33:58 +01:00
github-actions[bot]andMervin Praison f459c192d6 fix: initialize embedding model before MongoDB to resolve missing embedding_model_name attribute
Fixed initialization order in MongoDBMemory class where _create_vector_index()
was trying to access self.embedding_model_name before it was initialized.

- Moved _init_embedding_model() before _init_mongodb() in __init__
- Added explanatory comment for the dependency order
- Resolves AttributeError: ''MongoDBMemory'' object has no attribute ''embedding_model_name''
- Maintains full backward compatibility

Fixes #1069

Co-authored-by: Mervin Praison <[email protected]>
2025-07-28 23:31:01 +00:00
Mervin Praison 18b85aada0 chore: bump package versions and reorganize test files 2025-07-28 18:43:53 +01:00
Mervin Praison a3c77692fd Merge pull request #1068 from MervinPraison/claude/aiohttp-session-fix-v2
fix: comprehensive aiohttp session cleanup to resolve persistent warnings
2025-07-28 18:31:47 +01:00
github-actions[bot]andMervin Praison 4a06ee3626 perf: eliminate blocking timeout in close() method to restore zero-overhead cleanup
- Remove blocking future.result(timeout=2.0) that could block execution
- Restore non-blocking behavior with callback-based fallback cleanup
- Maintain reliability with async cleanup + force cleanup fallback
- Ensure zero performance impact on normal execution paths

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 20:05:52 +00:00
Mervin Praison 776e83100e Merge pull request #1067 from MervinPraison/claude/fix-token-tracking-metrics-20250726
fix: enable token tracking by passing metrics parameter from Agent to LLM
2025-07-26 21:00:43 +01:00
github-actions[bot]andMervin Praison f718d89ba4 test: add verification test for performance optimization
- Confirms zero method calls when metrics=False
- Verifies method still called when metrics=True
- Demonstrates performance benefit of optimization

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:40:17 +00:00
github-actions[bot]andMervin Praison 3469335d02 perf: optimize token tracking to eliminate overhead when metrics disabled
- Move metrics check to call sites instead of inside _track_token_usage()
- Eliminates function call overhead when metrics=False (default)
- Add performance test to verify zero overhead implementation
- Maintains full functionality when metrics=True

Performance impact:
- metrics=False (default): zero function call overhead
- metrics=True: unchanged functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:39:46 +00:00
Mervin Praison 929a6e733d chore: bump praisonai to v2.2.79 and praisonaiagents to v0.0.153 across all files 2025-07-26 20:38:11 +01:00
github-actions[bot]andMervin Praison 6caa825706 fix: comprehensive aiohttp session cleanup in MCP HTTP client
- Add global client registry with weakref tracking for reliable cleanup
- Implement multi-layer cleanup strategy: immediate, force, finalizer, and exit
- Add atexit handler to ensure session cleanup on program termination
- Implement direct connector closing for emergency cleanup scenarios
- Maintain zero performance impact with non-blocking operations
- Fix persistent ''Unclosed client session'' warnings in praisonaiagents

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:38:03 +00:00
Mervin Praison 4baf6288ed Merge pull request #1066 from MervinPraison/claude/issue-1065-20250726-1904
fix: properly close aiohttp sessions in MCP HTTP stream transport
2025-07-26 20:33:27 +01:00
github-actions[bot]andMervin Praison 65a23df7a2 fix: enable token tracking by passing metrics parameter from Agent to LLM
Fixes the persistent issue where Agent(metrics=True) showed 0 tokens
despite the LLM instance access fix in PR #1064.

Root Cause:
- Agent.metrics=True was stored but never passed to LLM constructor
- LLM class had token tracking capability but no way to enable it
- Token collector received no data because LLM didn''t track tokens

Solution:
- Pass metrics=self.metrics to all 4 LLM constructor calls in agent.py
- Add self.metrics property to LLM class from extra_settings
- Only track tokens when self.metrics=True in _track_token_usage()

Verified:
- All LLM creation patterns (string, dict, provider/model) work
- Agent(metrics=True) properly enables LLM token tracking
- Zero performance impact when metrics=False (default)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:25:50 +00:00
github-actions[bot]andMervin Praison ea0cb8b59a perf: optimize aiohttp session cleanup to eliminate execution overhead
- Remove flawed weakref finalizer that couldn''t run async code properly
- Make synchronous close() non-blocking to prevent 5-second delays
- Simplify __del__ methods to reduce garbage collection overhead
- Focus cleanup on proper async context manager usage
- Maintain backward compatibility while eliminating performance impact

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:23:09 +00:00
Mervin Praison d0d2e60618 feat: add API key validation and improved error handling for Tavily search integration 2025-07-26 20:21:34 +01:00
Mervin Praison 8eca3359cf Merge pull request #1064 from MervinPraison/claude/pr-1063-20250726-1818
fix: resolve zero token metrics by fixing agent LLM instance access
2025-07-26 20:17:56 +01:00
github-actions[bot]andMervin Praison 41272ddd24 fix: properly close aiohttp sessions in MCP HTTP stream transport
- Add weakref.finalize for reliable session cleanup during garbage collection
- Add explicit close() and aclose() methods for manual resource cleanup
- Add __del__ methods with proper error handling for both HTTPStreamTransport and HTTPStreamMCPClient
- Add double-close protection to prevent cleanup errors
- Preserve backward compatibility - no API changes, only additions

Fixes #1065

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:11:35 +00:00
Mervin Praison 47d8e54fa5 feat: add token tracking and langtrace integration modules with demo scripts 2025-07-26 20:09:18 +01:00
github-actions[bot]andMervin Praison 0d42787a86 perf: eliminate redundant getattr calls in token metrics collection
- Remove duplicate llm variable definitions in aexecute_task and execute_task
- Reuse existing llm variable instead of redefining with getattr calls
- Reduces function call overhead without changing functionality
- Addresses code duplication identified in PR review

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 19:08:58 +00:00
Mervin Praison 99a4b84e6a Merge pull request #1062 from MervinPraison/claude/issue-1059-20250726-1321
perf: optimize telemetry performance with thread pools and queue-based processing
2025-07-26 19:57:49 +01:00
github-actions[bot]andMervin Praison 1b70e295b4 feat: enable PostHog telemetry by default with actual event posting
- Change default behavior from performance_mode=True to performance_mode=False
- PostHog events are now actually posted by default instead of zero overhead mode
- Add PRAISONAI_PERFORMANCE_MODE=true environment variable for minimal overhead
- Create comprehensive PERFORMANCE_IMPACT.md documentation
- Performance impact: ~0.5-1.5ms per operation with async, non-blocking PostHog calls
- Memory overhead: +756KB one-time PostHog client initialization
- Maintains full backward compatibility with existing disable options

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 18:46:25 +00:00
github-actions[bot]andMervin Praison abc8d63b75 feat: enable PostHog telemetry by default with minimal performance impact
- Enable PostHog by default using performance_mode=True for zero overhead
- Add granular environment variable controls:
  - PRAISONAI_DISABLE_TELEMETRY=true (disable completely)
  - PRAISONAI_FULL_TELEMETRY=true (enable detailed tracking)
  - DO_NOT_TRACK=true (respects privacy standard)
- Maintain backward compatibility with existing disable flags
- Performance impact: <0.05ms overhead in default mode
- Preserves existing PRAISONAI_AUTO_INSTRUMENT behavior

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 18:29:22 +00:00
github-actions[bot]andMervin Praison 10e58e033a fix: resolve zero token metrics by fixing agent LLM instance access
- Fixed 4 locations in agents.py where token tracking failed due to incorrect attribute access
- Use getattr pattern to check both ''llm'' and ''llm_instance'' attributes on agents
- Ensures proper agent name attribution for token tracking
- Zero performance impact - maintains existing execution flow
- Fixes issue where agents.run() with metrics=True showed 0 tokens

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 18:28:30 +00:00
Mervin Praison e36feed53e Merge pull request #1061 from MervinPraison/claude/performance-monitoring-disabled-by-default-20250726-1324
feat: make performance monitoring disabled by default
2025-07-26 15:22:42 +01:00
github-actions[bot]andMervin Praison f01b3f4251 optimize: achieve true zero overhead when performance monitoring is disabled
Key optimizations implemented:
- Extract environment checking into shared cached function
- Make PostHog imports lazy to eliminate import overhead
- Optimize constructors for immediate exit when disabled
- Reduce code duplication from 4x to single implementation
- Add caching for environment variable checks

Performance improvements:
- Zero PostHog import overhead when disabled
- ~50% reduction in constructor overhead via fast-path
- Eliminates repeated environment variable lookups
- Reduces memory footprint when monitoring disabled

All telemetry modules now achieve true zero overhead when
performance monitoring is disabled by default.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 14:21:56 +00:00
github-actions[bot]andMervin Praison e2ca69327c fix: critical performance issues - ensure zero overhead for existing users
### Critical Fixes Applied:

1. **Remove Auto-Instrumentation Overhead** (__init__.py)
   - Auto-instrumentation now opt-in only via PRAISONAI_AUTO_INSTRUMENT=true
   - Prevents telemetry overhead being added to ALL existing users by default
   - Ensures zero performance impact for existing code paths

2. **Fix NameError Bug** (integration.py:22)
   - Move _performance_mode_enabled definition before function definitions
   - Fixes enable_performance_mode() and disable_performance_mode() functions
   - Resolves critical runtime error identified by Cursor bot

3. **Enhanced Error Handling** (integration.py:82-86, 123-127)
   - Replace silent exception handling with structured logging
   - Use logging.debug() for non-disruptive debugging support
   - Maintains application stability while enabling troubleshooting

4. **Implement Performance Context Manager** (integration.py:129-142)
   - Complete previously incomplete _performance_mode_context() function
   - Provides temporary performance mode switching capability
   - Removes dead code identified in review

5. **Configurable Resource Cleanup** (integration.py:600-610)
   - Make shutdown timeout configurable via PRAISONAI_TELEMETRY_SHUTDOWN_TIMEOUT
   - Enhanced error logging for resource cleanup issues
   - Improves reliability across different deployment environments

### Performance Guarantee:
✅ Zero overhead for existing users (no auto-instrumentation)
✅ Telemetry is now truly opt-in only
✅ All existing APIs work identically
✅ No breaking changes to function signatures

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 14:20:17 +00:00
Mervin Praison cc8994f19c Merge pull request #1063 from MervinPraison/claude/issue-1060-20250726-1321
fix: add run() method alias to PraisonAIAgents for consistent API
2025-07-26 15:18:43 +01:00
github-actions[bot]andMervin Praison 89277d14c4 clean: remove test files from repository
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 14:17:29 +00:00
github-actions[bot]andMervin Praison 9513173837 fix: remove redundant run() alias to prevent code duplication
- Remove line 1535 that created redundant run = start alias
- Keep proper run() method implementation with correct parameter handling
- Maintain full backward compatibility
- Zero performance overhead

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 14:17:18 +00:00
Mervin Praison 5b83af82db Merge branch 'main' into claude/issue-1059-20250726-1321 2025-07-26 15:12:51 +01:00
github-actions[bot]andMervin Praison 0539c337ab perf: optimize telemetry performance with thread pools and queue-based processing
- Replace per-call thread creation with shared ThreadPoolExecutor (2 workers)
- Implement queue-based batch processing for telemetry events
- Add performance_mode parameter for zero-overhead operation in critical scenarios
- Add non-blocking event queuing with overflow protection (drops events vs blocking)
- Use async PostHog mode by default in batch processing
- Add resource cleanup functions for proper shutdown
- Maintain 100% backward compatibility with existing APIs

Performance benefits:
- ~90% reduction in thread creation overhead under load
- Eliminates blocking on network calls during normal operation
- Memory-bounded telemetry storage prevents resource leaks
- Graceful degradation under high load
- Zero impact when performance_mode=True

Fixes #1059

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 13:29:41 +00:00
github-actions[bot]andMervin Praison c6977cf541 feat: make performance monitoring disabled by default
- NEW BEHAVIOR: Performance monitoring now DISABLED BY DEFAULT
- Requires explicit opt-in via PRAISONAI_PERFORMANCE_ENABLED=true
- Maintains backward compatibility with legacy disable flags
- Zero performance overhead when disabled (unchanged)

Environment Variables:
- PRAISONAI_PERFORMANCE_ENABLED=true (new: enables monitoring)
- PRAISONAI_TELEMETRY_ENABLED=true (new: enables telemetry)
- Legacy disable flags still work for backward compatibility

Files updated:
- telemetry.py: Modified _is_monitoring_disabled() logic
- performance_monitor.py: Updated fallback logic
- performance_utils.py: Updated fallback logic
- integration.py: Updated fallback logic
- README.md: Updated documentation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 13:27:33 +00:00
github-actions[bot]andMervin Praison b0e9eec33b fix: add run() method alias to PraisonAIAgents for consistent API
- Add run() method to PraisonAIAgents that delegates to start()
- Ensures token metrics display works when users call agents.run()
- Provides API consistency with Agent class which already has run() alias
- Fixes issue where metrics=True wasn''t showing token usage summary
- Backward compatible change, no existing functionality affected

Fixes #1060

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 13:27:20 +00:00
Mervin Praison 2cb61ce529 Merge pull request #1058 from MervinPraison/claude/issue-1057-20250726-1242
fix: reduce monitoring overhead with performance optimizations
2025-07-26 14:22:17 +01:00
github-actions[bot]andMervin Praison 4055c9c983 fix: resolve critical performance monitoring bugs and ensure zero overhead
Critical fixes:
- Fixed ThreadPoolExecutor.shutdown() invalid timeout parameter (telemetry.py:396)
- Added consistent disable checks in get_function_performance() and get_api_call_performance()
- Fixed thread safety issue by creating copy instead of modifying input data
- Extracted environment variable checking to shared utility function
- Ensured true zero overhead when PRAISONAI_PERFORMANCE_DISABLED=true

Performance guarantees:
✅ Zero overhead when monitoring disabled - decorators return original functions
✅ No impact on existing feature execution speed - early exits prevent processing
✅ Backward compatibility maintained - all existing APIs preserved
✅ Thread safety improved - no input parameter modification

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 13:20:37 +00:00
github-actions[bot]andClaude 376b4d95f1 feat: reduce monitoring overhead with performance optimizations
- Add PRAISONAI_PERFORMANCE_DISABLED environment variable to disable all performance monitoring overhead
- Make expensive flow analysis opt-in only via PRAISONAI_FLOW_ANALYSIS_ENABLED
- Add export_metrics_for_external_apm() method for DataDog/New Relic integration
- Function decorators return original functions when disabled (zero overhead)
- Maintain full backward compatibility with existing monitoring features

Addresses performance overhead issues by allowing users to completely disable
monitoring when not needed, while providing lightweight external APM export
for production monitoring without expensive flow analysis operations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-26 12:54:06 +00:00
github-actions[bot]andClaude 2ae47e4208 optimize: reduce telemetry monitoring overhead for production use
Address performance bottlenecks identified in issue #1057:

1. **Early exit optimizations**: Add environment variable checks at the start of
   instrumentation functions to avoid all overhead when telemetry is disabled

2. **Thread pool optimization**: Replace individual thread creation with a
   reusable ThreadPoolExecutor to reduce thread creation overhead (5-10ms per call)

3. **Flow analysis optimization**: Limit analysis to 1000 most recent events
   instead of processing up to 10,000 events to avoid O(n²) complexity

4. **Performance monitoring controls**: Add PRAISONAI_PERFORMANCE_DISABLED
   environment variable to disable performance monitoring separately from telemetry

5. **No-op optimizations**: Make monitoring decorators and context managers
   return unmodified functions/no-op when disabled to eliminate runtime overhead

Key changes:
- Zero instrumentation overhead when DO_NOT_TRACK=true or PRAISONAI_TELEMETRY_DISABLED=true
- Thread pool reuse reduces background thread creation by 90%
- Flow analysis processes max 1000 events instead of unlimited
- Maintains full backward compatibility
- No impact on existing functionality when telemetry is enabled

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-26 12:50:10 +00:00
Mervin Praison 6b2814eb26 Merge pull request #1056 from MervinPraison/claude/simplified-metrics-20250726
feat: Simplify token metrics to Agent(metrics=True)
2025-07-26 13:19:15 +01:00
github-actions[bot]andMervin Praison 852765412a fix: clean up debug files and improve exception handling
- Remove temporary debugging scripts (check_*.py, test_*.py)
- Improve exception handling in metrics display with specific error types
- Fix unused variable in cost estimation example
- Maintain zero performance overhead for existing features

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 12:15:19 +00:00
github-actions[bot]andMervin Praison b4db6421f7 feat: Simplify token metrics to Agent(metrics=True)
- Add metrics parameter to Agent class with auto-display capability
- Fix missing run() method in PraisonAIAgents (add alias to start)
- Auto-display token usage when any agent has metrics=True
- Simplify all examples to use single parameter approach
- Maintain zero performance impact with O(1) operations
- Keep backward compatibility with existing methods

BREAKING: Massively simplified API - just Agent(metrics=True)!

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 12:00:54 +00:00
Mervin Praison 22ecf6963f Merge pull request #1055 from MervinPraison/claude/issue-1054-20250725-1714
feat: Add comprehensive token metrics tracking for PraisonAI agents
2025-07-26 08:32:11 +01:00
github-actions[bot]andMervin Praison 5cea1f5702 feat: add comprehensive token metrics usage examples
Add 5 detailed examples demonstrating token tracking features:
- Basic token tracking for simple workflows
- Session metrics across multiple agents
- Cost estimation and budget management
- Telemetry integration for enterprise monitoring
- Advanced agent integration with real-time analysis

Each example includes documentation and best practices
for production usage. Examples are self-contained and
demonstrate zero-performance-impact implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 07:24:17 +00:00
Mervin Praison 36d7a2b489 feat: add performance impact check requirement to GitHub workflow comments 2025-07-26 08:17:46 +01:00
github-actions[bot]andMervin Praison 2c9ae32e13 fix: add missing token tracking call and provider metadata
- Add missing token tracking call after reasoning response (line 957)
- Add provider metadata to token tracking as per original requirements
- Ensures all LLM completion calls are properly tracked

Co-authored-by: Mervin Praison <[email protected]>
2025-07-26 06:38:39 +00:00
github-actions[bot]andMervin Praison d2d7fab0e0 feat: add comprehensive token metrics tracking system
- Add TokenMetrics dataclass for tracking individual interactions
- Add SessionTokenMetrics for aggregated session data
- Add TokenCollector for thread-safe global collection
- Add TokenTelemetryBridge for existing telemetry integration
- Integrate token tracking into LLM responses
- Add token_metrics field to TaskOutput class
- Add agent name setting for proper token attribution
- Add token usage methods to PraisonAIAgents class
- Maintain backward compatibility with graceful fallbacks
- Keep core application performance unchanged
- Support all token types: input/output/cached/reasoning/audio

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-25 17:23:07 +00:00
Mervin Praison f4ef434610 fix: reset interaction_displayed flag to ensure final summary is shown in LLM responses 2025-07-25 18:09:39 +01:00
Mervin Praison d63b437eca feat: add workflow visualization with FlowDisplay and bump version to 2.2.77 2025-07-25 12:05:41 +01:00
Mervin Praison 04aac1c2d5 fix: skip display output for empty Gemini responses and bump version to 0.0.150 2025-07-25 09:51:56 +01:00
Mervin Praison eca66f9213 feat: bump praisonai to v2.2.76 and praisonaiagents to v0.0.149 with callback refactor 2025-07-25 09:41:04 +01:00
Mervin PraisonandClaude f83f3eae0b fix: ensure consistent display output between OpenAI and Gemini models
- Added execute_sync_callback call in custom LLM path to match OpenAI behavior
- Fixed issue where Gemini/custom LLM responses were not triggering callbacks
- Prevents duplicate display by relying on LLM class to handle verbose display
- Ensures both paths execute callbacks for consistent behavior

The issue was that custom LLM providers (like Gemini) were not calling
_execute_callback_and_display after guardrail validation, while OpenAI
path was. This caused missing Task/Response display boxes for Gemini.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-25 08:31:38 +01:00
Mervin Praison 68dd9fb5f1 feat: enable httpx debug logging when LOGLEVEL=debug and remove Ollama handling docs 2025-07-24 10:00:41 +01:00
Mervin Praison e0531cedf7 feat: optimize LLM tool handling and response generation for Ollama and Gemini models 2025-07-24 01:53:54 +01:00
Mervin Praison 197e98d3ff refactor: consolidate warning and logging configuration with minimal overhead 2025-07-24 01:06:10 +01:00
Mervin Praison 3b7fd3688c update 2025-07-24 00:59:36 +01:00
Mervin Praison dd7bfa39f4 refactor: centralize logging configuration in new _logging.py module 2025-07-24 00:27:12 +01:00
Mervin Praison fca801c3f7 chore: remove test files for display generating and streaming fixes 2025-07-23 23:57:08 +01:00
Mervin Praison 33c81861c0 feat: implement comprehensive agent monitoring system with streaming enhancements 2025-07-23 23:56:19 +01:00
Mervin Praison b49b6d567f Merge pull request #1050 from MervinPraison/claude/pr-1049-20250723-0902
fix: Remove display_generating when stream=false to prevent streaming-like behavior
2025-07-23 10:45:49 +01:00
github-actions[bot]andMervin Praison 8c1677556c fix: Complete display_generating fix for consistency across all code paths
- Fix inconsistency in custom LLM path (line 1116) to match OpenAI path behavior
- Update test script to verify all three fix locations (2 OpenAI + 1 custom LLM)
- Ensure no streaming-like behavior when stream=False regardless of LLM provider
- Maintain backward compatibility and existing functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-23 09:34:50 +00:00
github-actions[bot]andMervin Praison a656ea2bca fix: Remove display_generating when stream=false to prevent streaming-like behavior
When stream=false but verbose=true, the system was incorrectly showing
streaming-like visual behavior (Generating... X.Xs) due to display_generating
being used even when users explicitly set stream=false.

Fixed by changing display_fn from display_generating to None when stream=false
in both locations (lines 1073 and 1172) in agent.py.

This ensures true non-streaming behavior when stream=false is set, regardless
of verbose setting.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-23 09:07:13 +00:00
Mervin Praison 02846b0efd Merge pull request #1049 from MervinPraison/claude/pr-1048-20250723-0615
Fix: Add display_generating support for OpenAI non-streaming mode
2025-07-23 07:30:21 +01:00
github-actions[bot]andMervin Praison 8d463e6897 Improve display_generating fix for OpenAI non-streaming mode
- Add missing display_fn support to async version (achat_completion_with_tools)
- Add proper error handling with try-catch around Live context manager
- Add safer content access with length checks for choices array
- Add console cleanup (console.print()) consistent with streaming mode
- Maintain backward compatibility with fallback to regular completion

Co-authored-by: Mervin Praison <[email protected]>
2025-07-23 06:23:50 +00:00
github-actions[bot]andClaude b47021d98f Fix: Add display_generating support for OpenAI non-streaming mode
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-23 06:19:44 +00:00
Mervin Praison ab4561d7a4 Merge pull request #1048 from MervinPraison/claude/pr-1046-20250722-2152
PR #1046: Changes from Claude
2025-07-22 23:19:32 +01:00
Mervin Praison 81af51f3e7 Merge pull request #1047 from MervinPraison/claude/pr-1045-20250722-2138
fix: resolve display_generating issue by ensuring stream parameter is correctly passed
2025-07-22 23:02:46 +01:00
github-actions[bot]andMervin Praison 550d9c30d4 fix: restore display_generating visibility in verbose streaming mode
- Modified streaming logic to show display_generating during verbose streaming
- Preserves non-verbose streaming behavior (no display_generating)
- Fixes user-reported issue where display_generating disappeared in basic-agents.py
- Maintains full backward compatibility with existing code
- Addresses display functionality regression from streaming fallback changes

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 21:59:47 +00:00
Mervin Praison 39a8942054 Merge pull request #1046 from MervinPraison/claude/fix-streaming-fallback-logic-20250722
fix: implement proper streaming fallback logic for JSON parsing errors
2025-07-22 22:46:55 +01:00
github-actions[bot]andMervin Praison 6ecb6e4887 fix: prevent duplicate API calls in streaming fallback logic
- Added fallback_completed flag to track successful fallback execution
- Modified non-streaming condition to only execute when fallback hasn''t completed
- Prevents duplicate litellm.completion calls that waste API quota and increase latency
- Addresses critical bug identified by Cursor bot review

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 21:43:35 +00:00
github-actions[bot]andMervin Praison d64c1381ed fix: resolve display_generating issue by ensuring stream parameter is correctly passed from start() to chat() method
- Fix stream parameter not being explicitly passed in start() method
- Ensures display_generating shows when agent.start() is called with default settings
- Agent defaults: verbose=True, stream=False should show ''Generating...'' message
- Resolves issue where chat() method default stream=True overrode agent''s stream=False setting
- Tested logic flow: (not stream and verbose) now correctly evaluates to True

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 21:43:19 +00:00
Mervin Praison 8e6bc3845b Merge pull request #1045 from MervinPraison/claude/pr-1042-20250722-2118
fix: correct display_generating logic to only show when stream=False AND verbose=True
2025-07-22 22:36:55 +01:00
github-actions[bot]andMervin Praison d2b2ad525e fix: implement proper streaming fallback logic for JSON parsing errors
- Fixed critical control flow bug where streaming errors set use_streaming=False
  but continued executing in streaming block instead of triggering fallback
- When recoverable streaming error occurs, immediately perform actual non-streaming
  API call instead of creating mock response with partial/empty data
- Added proper callback handling for both verbose/non-verbose modes
- Enhanced graceful degradation if both streaming and non-streaming fail
- Updated test to use agent.llm_model instead of agent.llm property

Fixes: Issue #1043 streaming JSON parsing errors causing "Response: None"

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
2025-07-22 21:35:49 +00:00
github-actions[bot]andMervin Praison 60508ba410 fix: correct hardcoded True to stream variable in display_generating logic
Fixed critical bug where (not True and self.verbose) was always False,
preventing display_generating from ever being called in one code path.
Changed to (not stream and self.verbose) to match intended logic.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 21:30:16 +00:00
Mervin Praison a2951184d7 Merge pull request #1044 from MervinPraison/claude/issue-1043-20250722-2015
fix: enhance LiteLLM streaming error handling for JSON parsing errors (Issue #1043)
2025-07-22 22:25:13 +01:00
github-actions[bot]andMervin Praison 4e26bbecfb fix: correct display_generating logic to only show when stream=False AND verbose=True
- Change logic from (stream or verbose) to (not stream and verbose)
- Ensure display_generating only appears for non-streaming verbose mode
- Remove streaming display blocks since no display needed when streaming
- Update test files to reflect correct expected behavior

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 21:24:01 +00:00
github-actions[bot]andMervin Praison f77583c64f fix: resolve critical fallback logic and display_generating behavior
- Fix broken streaming fallback: now properly calls non-streaming LLM instead of creating mock responses
- Update display_generating behavior per requirements:
  * stream=true (any verbose): no display_generating
  * stream=false + verbose=true: show display_generating
  * stream=false + verbose=false: no display_generating
- Clean up unnecessary f-strings without placeholders
- Maintain backward compatibility and existing functionality

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 21:23:42 +00:00
github-actions[bot]andMervin Praison 6071850401 fix: enhance LiteLLM streaming error handling for JSON parsing errors
- Add iterator-level error handling in get_response_stream method
- Wrap for chunk in stream_iterator loops with JSON parsing error recovery
- Add error handling to both verbose/non-verbose streaming in get_response
- Leverage existing _is_streaming_error_recoverable() logic for consistency
- Maintain automatic fallback to non-streaming mode on repeated errors
- Preserve backward compatibility with no breaking API changes
- Add comprehensive test script for Issue #1043 scenario

Fixes #1043: Error parsing chunk - JSON parsing error in Gemini streaming

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 20:23:51 +00:00
Mervin Praison 6ce4363e92 Merge pull request #1042 from MervinPraison/claude/issue-981-20250722-1946
fix: ensure display_generating is called when verbose=True regardless of streaming mode
2025-07-22 21:13:02 +01:00
github-actions[bot]andMervin Praison 3622838f9f fix: complete display_generating fix for both OpenAI and custom LLM paths
- Extend fix to custom LLM providers (Anthropic, Groq, local models)
- Add Live display wrapper for non-streaming custom LLM path
- Ensure consistent behavior: display when (stream OR verbose)
- Maintain backward compatibility for all existing functionality
- Add comprehensive test coverage for both agent paths

Fixes #981 completely for all LLM provider types

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 20:07:35 +00:00
github-actions[bot]andMervin Praison 60f0cb308a fix: ensure display_generating is called when verbose=True regardless of streaming mode
- Fix issue where display_generating was only called during streaming
- Now display_generating is called when either stream=True OR verbose=True
- Resolves user issue where verbose=True with default stream=False wasn''t showing ''Generating...'' display
- Add logic tests to verify the fix

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 19:49:49 +00:00
Mervin Praison a3afd4f7fd Merge pull request #1041 from MervinPraison/claude/pr-1039-20250722-1308
PR #1039: Logging
2025-07-22 20:42:51 +01:00
github-actions[bot]andMervin Praison 7118b9a47b perf: optimize litellm logger suppression using hierarchical logging
Remove redundant loops that iterate over all loggers to suppress litellm
submodules. Python''s hierarchical logging automatically propagates the
CRITICAL level from parent ''litellm'' logger to all child loggers
(litellm.utils, litellm.proxy, etc.).

Changes:
- Remove 3 redundant loops in __init__.py and llm/__init__.py
- Remove explicit configuration of child loggers (litellm.utils, etc.)
- Maintain litellm_logging as separate hierarchy (not a child of litellm)
- Add explanatory comments about hierarchical logging inheritance
- Preserve backward compatibility and DEBUG mode behavior

Performance: Eliminates unnecessary iteration over all existing loggers
while maintaining identical logging suppression behavior.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 19:35:02 +00:00
Mervin Praison 3fa0173bf8 refactor: reorganize test files and add MongoDB memory/knowledge integrations 2025-07-22 14:44:51 +01:00
Mervin Praison b9ea6accf9 Merge pull request #1040 from MervinPraison/claude/pr-1038-20250722-1255
PR #1038: Monitoring examples
2025-07-22 14:43:58 +01:00
github-actions[bot]andClaude 80d2491a59 fix: resolve critical issues in monitoring examples
- Fix ZeroDivisionError in 02_multi_agent_workflow_monitoring.py by adding zero-check for call counts
- Improve async handling in 04_async_agent_monitoring.py with better simulation and timing
- Fix UnboundLocalError in 05_error_handling_monitoring.py by correcting variable references
- Add zero-check protection in 07_hierarchical_agents_monitoring.py to prevent division errors
- Remove unused json import from 08_custom_tools_monitoring.py
- Remove unused timedelta import from 09_streaming_monitoring.py
- Fix UnboundLocalError in 10_comprehensive_dashboard.py by initializing avg_function_time variable

🤖 Generated with Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-22 13:33:04 +00:00
github-actions[bot]andMervin Praison 52f23b87c9 fix: Remove logger disabling to allow DEBUG mode re-enabling
- Remove `disabled = True` from logger configuration to prevent permanent disabling
- Keep CRITICAL level suppression but allow dynamic re-enabling in DEBUG mode
- Maintain backward compatibility while fixing DEBUG mode functionality
- Add comprehensive test to verify dynamic mode switching works correctly
- Addresses reviewer concerns about permanent logger disabling

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 13:24:56 +00:00
github-actions[bot]andMervin Praison 70a3d2df34 feat: Add 10 comprehensive performance monitoring examples
- Create examples/python/monitoring/ directory with 10 diverse examples
- Cover basic monitoring, multi-agent workflows, tools, async, errors, memory, hierarchical, custom tools, streaming, and comprehensive dashboard
- Each example demonstrates different aspects of the performance monitoring system
- Include detailed README with usage patterns and best practices
- Show practical integration of @monitor_function and track_api_call
- Demonstrate performance analytics, reporting, and optimization insights

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 13:04:17 +00:00
Mervin Praison d3c08660f5 Merge pull request #1039 from MervinPraison/claude/fix-litellm-warnings-20250722-1151
Fix: Comprehensive LiteLLM deprecation warning suppression
2025-07-22 13:58:24 +01:00
github-actions[bot]andMervin Praison 4e09b7c878 fix: clean up warning suppression implementation
- Fix LLM module _should_suppress_warnings() consistency by adding missing test detection
- Remove redundant warning filters in main module (lines 74-76 duplicated lines 63-65)
- Remove duplicate sys import in main module
- All tests now pass: DEBUG mode properly respects LOGLEVEL=DEBUG
- Maintains backward compatibility and existing functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 12:54:07 +00:00
Mervin Praison 6bc6ff79dd Merge pull request #1038 from MervinPraison/claude/issue-1035-20250722-1143
feat: Add comprehensive performance monitoring system
2025-07-22 13:44:08 +01:00
github-actions[bot]andMervin Praison ab78189601 fix: implement DEBUG mode support for warning suppression (issue #1033)
- Implement missing DEBUG mode functionality as specified in PR description
- Add _should_suppress_warnings() function to respect LOGLEVEL=DEBUG
- Fix overly broad global warning suppression (now module-specific)
- Remove unsafe pydantic.warnings.warn monkey-patching
- Improve test detection with pytest module checks
- Add comprehensive test scripts for validation

Key improvements:
• Warnings are suppressed in normal mode (LOGLEVEL=INFO)
• Warnings are shown when LOGLEVEL=DEBUG (as per PR requirement)
• More targeted warning suppression (module-specific vs global)
• Safer pydantic warning handling with specific filters
• Better backward compatibility and security

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
2025-07-22 12:35:18 +00:00
github-actions[bot]andMervin Praison 54c29a6ffe fix: address code quality issues in performance monitoring
- Remove unused imports (inspect, timedelta, time, deque, etc.)
- Fix division by zero error in performance trend analysis
- Improve call chain building algorithm for better efficiency and accuracy
- Replace bare except clauses with specific Exception handling
- Use collections.deque with maxlen instead of manual truncation
- Remove unused variables and loop variables
- Fix f-strings without placeholders
- Replace magic numbers with named constants
- Improve error handling specificity

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 12:33:33 +00:00
Mervin Praison afb32705dc Merge pull request #1037 from MervinPraison/claude/pr-1030-20250722-1138
fix: correct tool call argument parsing in streaming mode
2025-07-22 13:23:45 +01:00
github-actions[bot]andMervin Praison 9f9a373c31 feat: Add comprehensive performance monitoring system for function and API call analysis
This implementation addresses all requirements from Issue #1035:

Features Added:
- PerformanceMonitor class for function performance evaluation with detailed statistics
- FunctionFlowAnalyzer for execution flow visualization and bottleneck identification
- API call tracking and performance comparison (fast vs slow calls)
- Real-time performance reporting and comprehensive analytics
- CLI interface for easy command-line access to performance data
- Full backward compatibility with existing telemetry system

Key Capabilities:
1. Function Performance Evaluation: Decorators and context managers for automatic timing
2. Function Flow Analysis: Visual execution flow with bottleneck detection
3. Execution Speed Analysis: Min/max/average timing with trend analysis
4. API Call Performance: Success rates, response times, reliability metrics
5. API Call Visibility: Complete tracking and history of all API interactions

Files Modified:
- Enhanced telemetry/__init__.py to expose new performance tools
- Added performance_monitor.py with core monitoring functionality
- Added performance_utils.py with advanced analysis and visualization
- Added performance_cli.py for command-line interface
- Added comprehensive demo and examples

Integration:
- Seamless integration with existing PraisonAI telemetry infrastructure
- Zero breaking changes to existing functionality
- Optional import structure for graceful degradation
- Thread-safe operations with memory management

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:57:58 +00:00
github-actions[bot]andMervin Praison 2c16131770 fix: comprehensive suppression of litellm deprecation warnings
- Add environment variables to suppress warnings at source (LITELLM_TELEMETRY, HTTPX_DISABLE_WARNINGS)
- Implement global deprecation warning filters before imports
- Add specific message filters for exact warning text patterns
- Set aggressive logging levels (CRITICAL) for all litellm loggers
- Configure runtime litellm settings to disable debug output
- Apply comprehensive suppression across main and LLM modules
- Addresses remaining warnings from httpx content parameter and pydantic dict method usage

Resolves issue with persistent litellm warnings after initial fix

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:53:45 +00:00
github-actions[bot]andMervin Praison bc0d58104c enhance: improve JSON parsing error handling for tool arguments
- Add explicit JSON parsing error handling in both streaming and non-streaming modes
- Remove redundant import json statement in streaming mode (already imported at module level)
- Ensure graceful fallback to empty dict when JSON parsing fails
- Maintain backward compatibility while improving robustness

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:50:29 +00:00
Mervin Praison a11990fa40 Merge pull request #1034 from MervinPraison/claude/issue-1033-20250722-1128
Fix litellm deprecation warnings for issue #1033
2025-07-22 12:44:09 +01:00
github-actions[bot]andMervin Praison e1f6601137 refactor: consolidate and document warning filters for issue #1033
- Centralized warning suppression in main __init__.py with comprehensive comments
- Removed duplicated warning filters from llm/__init__.py
- Improved pydantic regex specificity and added module targeting
- Added clear documentation explaining why each warning is suppressed

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:43:27 +00:00
github-actions[bot]andMervin Praison 05dc3b5223 fix: correct tool call argument parsing in streaming mode
- Fix critical bug where tool_call[''function''][''arguments''] was passed as JSON string instead of parsed dict to execute_tool
- Add proper JSON parsing with fallback to empty dict for missing arguments
- Resolves tool execution failures during streaming when tools are called
- Maintains backward compatibility and error handling

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:42:01 +00:00
Mervin Praison c8fdab5885 Merge pull request #1032 from MervinPraison/claude/issue-1031-20250722-1110
fix: eliminate streaming pause caused by telemetry tracking
2025-07-22 12:40:04 +01:00
8f1c18da70 Fix litellm deprecation warnings for issue #1033
Added comprehensive deprecation warning filters to suppress warnings from:
- litellm module and event loop related warnings
- httpx module deprecation warnings
- Pydantic model_dump deprecation warnings

This resolves the noisy deprecation warnings that were cluttering the output
when using PraisonAI agents with newer versions of dependencies.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:36:17 +00:00
Mervin Praison 739c25cbea Merge pull request #1030 from MervinPraison/claude/fix-streaming-display-bypass-20250722
fix: bypass display_generation for OpenAI streaming to enable raw chunk output
2025-07-22 12:25:03 +01:00
github-actions[bot]andMervin Praison bbbb77ba5c feat: enhance streaming implementation with proper tool call support
- Fix critical OpenAI client access bug: use sync_client instead of client
- Reduce code duplication by consolidating completion creation logic
- Improve test script: remove unused imports and properly test generator consumption
- Verify comprehensive tool call handling in streaming mode is working correctly
- All automated review feedback addressed while maintaining backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:17:54 +00:00
github-actions[bot] 00b81080a3 merge: accept comprehensive async telemetry fix from remote
The remote branch already implements a more comprehensive solution using
threading at the integration level, which addresses the streaming pause issue
more thoroughly than the async_mode parameter approach.

Remote changes include:
- All telemetry tracking made asynchronous using background threads
- Special handling for streaming generators in agent.start()
- Better error handling with try/catch blocks
- Maintains the async_mode parameter in telemetry.py for future use

Resolves streaming pause issue #1031
2025-07-22 11:17:41 +00:00
github-actions[bot]andMervin Praison 2c7cbdf0c9 fix: eliminate streaming pause caused by synchronous telemetry tracking
- Add async_mode parameter to track_agent_execution() to enable background PostHog capture
- Update telemetry integration to auto-detect streaming agents and use async mode
- Maintains backward compatibility for non-streaming agents
- Resolves pause issue after "execution tracked: success=True" message in streaming workflows

Fixes #1031

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:16:58 +00:00
github-actions[bot]andMervin Praison 112a7248ca fix: Eliminate telemetry pause in streaming responses
- Make telemetry tracking asynchronous in all agent methods (chat, start, run)
- For streaming responses, defer telemetry tracking until after generator consumption
- Use separate daemon threads to prevent blocking on PostHog capture calls
- Add comprehensive test script to verify fix works
- Fixes issue where ~20 second pause occurred after ''execution tracked: success=True''

This resolves the streaming performance issue where telemetry calls were
blocking the start of streaming responses, causing users to wait before
seeing any output when using agent.start() with stream=True.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:15:50 +00:00
github-actions[bot]andMervin Praison ce214edd99 feat: enhance streaming implementation with proper tool call support
- Add comprehensive tool call handling in OpenAI streaming mode
- Properly accumulate and execute tool calls during streaming
- Maintain chat history integrity with tool call results
- Preserve backward compatibility and existing functionality
- Add error handling for tool execution failures in streaming

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:12:51 +00:00
Mervin Praison ab8932be28 Merge pull request #1029 from MervinPraison/claude/fix-gemini-streaming-json-parsing-20250722
fix: enhance Gemini streaming robustness with graceful JSON parsing error handling
2025-07-22 12:08:02 +01:00
github-actions[bot]andMervin Praison 47c91ae624 fix: correct critical bugs in Gemini streaming error handling
- Fix error counter reset bug: only reset after successful chunk processing
- Fix error masking bug: non-recoverable errors are re-raised immediately
- Add proper exception chaining with ''from chunk_error''
- Remove unnecessary f-string prefix
- Move test to proper location in tests/ directory
- Remove hardcoded sys.path in test script

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:04:14 +00:00
github-actions[bot]andMervin Praison 626260f787 fix: bypass display_generation for OpenAI streaming to enable raw chunk output
This fix modifies Agent._start_stream() to handle OpenAI-style models with direct
streaming that bypasses the display_generation UI, allowing users to get raw
streaming chunks when stream=True.

Key changes:
- Replace self.chat() fallback with direct OpenAI client streaming
- Add proper knowledge search and tool handling for OpenAI path
- Use _build_messages helper for consistent message formatting
- Yield raw chunks without display function interference
- Add robust error handling with chat history rollback
- Preserve fallback to simulated streaming on errors

Fixes streaming behavior where chunks were wrapped in display_generation
instead of being yielded directly to user code.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 11:03:23 +00:00
github-actions[bot]andMervin Praison c0b8aba75b fix: enhance Gemini streaming robustness with graceful JSON parsing error handling
- Add chunk-level error handling in get_response_stream() to catch malformed JSON chunks
- Implement smart error recovery that skips recoverable errors (JSON parsing) vs non-recoverable (connection)
- Add consecutive error limit (3) with automatic fallback to non-streaming mode
- Enhance error logging with specific categorization for better debugging
- Add _is_streaming_error_recoverable() helper method for error classification
- Create test script to validate streaming robustness improvements

Fixes issue where Gemini streaming fails with ''Expecting property name enclosed in double quotes''
when receiving incomplete JSON chunks like ''{'' during streaming responses.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 08:56:50 +00:00
Mervin Praison e3b0b3830e Merge pull request #1028 from MervinPraison/claude/fix-real-time-streaming-20250722
fix: implement real-time streaming for Agent.start() method
2025-07-22 09:47:33 +01:00
github-actions[bot]andMervin Praison 8c3e1f8569 fix: add comprehensive tool call support to streaming implementation
- Remove erroneous temperature parameter from _build_messages() call in get_response_stream()
- Fix critical bug that would cause TypeError during streaming
- Tool call handling already implemented with _process_stream_delta helper
- Real-time streaming now works with content and tool execution
- Follow-up responses after tool completion properly handled
- Backward compatibility maintained with stream=False default

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 08:10:27 +00:00
github-actions[bot]andMervin Praison ab01fe2965 fix: add comprehensive tool call support to streaming implementation
Fixes critical gap in get_response_stream method where tool calls were
completely ignored during streaming. The method now properly:

- Accumulates tool calls during streaming using _process_stream_delta
- Executes tool calls after streaming completes if execute_tool_fn provided
- Continues conversation with follow-up response after tool execution
- Handles both Ollama and other providers correctly
- Maintains real-time content streaming while adding tool support

This makes streaming fully functional for agents that use tools, which
is essential for PraisonAI''s core functionality.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
2025-07-22 07:58:31 +00:00
github-actions[bot]andMervin Praison e6472b5052 fix: restore backward compatibility by defaulting stream=False
- Change Agent constructor default: stream=True -> stream=False
- Update documentation to clarify backward compatibility priority
- Ensure existing code agent.start(''prompt'') returns string not generator
- Maintain streaming capability when explicitly enabled with stream=True

Fixes backward compatibility issue where basic usage would return generator
instead of expected string response, breaking existing codebases.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 06:40:27 +00:00
github-actions[bot]andMervin Praison a178abe759 fix: implement real-time streaming for Agent.start() method
- Add get_response_stream() generator method to LLM class for true real-time streaming
- Modify Agent._start_stream() to use new streaming generator for custom LLMs
- Replace simulated streaming with actual LiteLLM streaming chunks
- Maintain backward compatibility for OpenAI-style models (temporary fallback)
- Add comprehensive error handling and chat history management
- Include test files for validation

Fixes the issue where streaming was simulated by chunking complete responses
instead of yielding real-time chunks from the underlying LLM.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-22 06:32:17 +00:00
Mervin Praison b139ea98ba Merge pull request #1027 from MervinPraison/claude/issue-981-20250721-1557
fix: implement real-time streaming for Agent.start() method
2025-07-22 07:17:42 +01:00
github-actions[bot]andMervin Praison 589650029b refactor: simplify streaming implementation to eliminate code duplication
- Replace duplicated logic in _custom_llm_stream() and _openai_stream() with single _start_stream() method
- Reuse existing chat() method logic to maintain all features (tools, knowledge, MCP, etc.)
- Improve error handling and consistency across LLM types
- Maintain backward compatibility and all existing functionality
- Reduce maintenance burden by eliminating 150+ lines of duplicated code

Co-authored-by: Mervin Praison <[email protected]>
2025-07-21 16:42:18 +00:00
github-actions[bot]andMervin Praison 97b25f5003 fix: implement real-time streaming for Agent.start() method
- Fix streaming issue where Agent.start() was not yielding real-time chunks
- Add streaming generator support with proper type hints
- Implement _start_stream() method that routes to appropriate handlers
- Add _custom_llm_stream() for custom LLM providers with simulated chunking
- Add _openai_stream() for OpenAI client with true streaming chunks
- Maintain backward compatibility for existing non-streaming usage
- Support both OpenAI and custom LLM streaming with graceful error handling
- Preserve chat history management and proper conversation state

The user''s code pattern now works as expected:
for chunk in agent.start(prompt, stream=True):
    print(chunk, end='''', flush=True)

Fixes #981

Co-authored-by: Mervin Praison <[email protected]>
2025-07-21 16:02:10 +00:00
Mervin Praison 5d30ce9a1b Merge pull request #1026 from MervinPraison/claude/issue-1025-20250721-0849
feat: add context CLI command with --url and --goal parameters
2025-07-21 12:17:40 +01:00
github-actions[bot]andMervin Praison 5ad39b5f1b refactor: improve context CLI command with minor code enhancements
- Fix f-string formatting issues by removing unnecessary f prefix
- Add return type hint to handle_context_command method
- Enhance docstring with return type documentation
- Maintain backward compatibility with existing usage

Co-authored-by: Mervin Praison <[email protected]>
2025-07-21 10:12:16 +00:00
github-actions[bot]andMervin Praison 28c60d52f5 feat: enhance context CLI command with configurable options
- Add --auto-analyze flag for user control over analysis mode
- Use environment MODEL_NAME/OPENAI_MODEL_NAME instead of hardcoded model
- Update usage messages to include new optional flag
- Follow existing CLI patterns for model configuration
- Maintain backward compatibility with defaults

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-21 10:08:48 +00:00
github-actions[bot]andMervin Praison 3a9e26670f feat: add context CLI command with --url and --goal parameters
- Add ''context'' to special_commands list
- Add --url and --goal CLI arguments
- Add handle_context_command method to create ContextAgent
- Maintains backward compatibility
- Implements exact functionality requested in issue #1025

Usage: praisonai context --url <url> --goal <goal>

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-21 08:54:53 +00:00
Mervin Praison 209793bdb1 feat: add MongoDB integration examples and context engineering improvements 2025-07-20 03:47:29 +01:00
Mervin Praison aa965cf719 Merge pull request #1024 from MervinPraison/fix-knowledge-verbose-headers
fix: remove verbose knowledge headers from AI agent prompts
2025-07-19 13:06:45 +01:00
Mervin Praison 4927f24d4a Merge pull request #1021 from MervinPraison/claude/issue-1018-20250719-0632
Implement Context Engineering - Add ContextAgent for AI Context Generation
2025-07-19 09:45:51 +01:00
github-actions[bot]andMervin Praison 2a3240156d fix: add backward compatibility for embedding_db_config key in knowledge context processing
- Support both ''vector_store'' and ''embedding_db_config'' keys for knowledge context
- Maintains backward compatibility with existing test files
- No functional changes to the verbose header removal functionality

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 08:43:17 +00:00
github-actions[bot]andClaude 77e8ccb3c9 Transform hardcoded analysis to Agent-based dynamic analysis
This commit transforms all hardcoded analysis methods in ContextAgent to use specialized AI agents for dynamic analysis. The changes enable more flexible, intelligent, and adaptable context processing by leveraging agent-based approaches instead of static analysis patterns.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-19 08:42:49 +00:00
github-actions[bot]andMervin Praison 031c73c7d3 fix: remove verbose knowledge headers from AI agent prompts
- Remove ''[DB Context]:'' and ''[Vector DB Error]:'' prefixes from agent outputs
- Add debug logging to preserve troubleshooting information
- Return clean content without verbose headers in terminal display
- Hide error details from AI prompts while preserving debug logs
- Consistent with memory.py verbose header removal approach

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 08:33:29 +00:00
Mervin Praison 82b6f9c5ff Merge pull request #1023 from MervinPraison/claude/pr-1020-20250719-0708
fix: remove verbose memory context headers from AI agent prompts
2025-07-19 09:06:01 +01:00
github-actions[bot]andMervin Praison 22449a35b7 feat: hide memory content from terminal display unless debug logging enabled
- Add include_in_output parameter to build_context_for_task() method
- Memory content now only included in output when logging level is DEBUG
- Memory is always logged for debugging regardless of output inclusion
- Preserves AI agent functionality while hiding memory from user display
- Addresses user requirement to hide memory items from terminal by default

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 07:55:41 +00:00
Mervin Praison 75bf3ac73b Merge pull request #1022 from MervinPraison/claude/issue-1019-20250719-0623
fix: move embedding debug logs to trace level
2025-07-19 08:52:32 +01:00
4d3e19462b Reorganize TRACE logging test files and improve test structure
- Move test_embedding_logging.py from root to tests/ directory for better organization
- Improve test structure with comprehensive TRACE logging validation
- Ensure proper test isolation and cleanup
- Maintain backward compatibility while improving code organization

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
Co-Authored-By: Claude <[email protected]>
2025-07-19 07:42:08 +00:00
github-actions[bot]andClaude efaff8845d Fix Context Engineering implementation: Complete functionality and async support
- Fixed core ContextAgent functionality with proper imports and async support
- Added comprehensive error handling and robust implementation
- Cleaned up imports and fixed async method patterns
- Moved test file from root to proper tests/ directory location
- Made implementation fully functional with all required methods
- Enhanced examples with working context engineering workflows

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-19 07:15:22 +00:00
github-actions[bot]andMervin Praison a4e7a1bdbc fix: remove verbose memory context headers from AI agent prompts
- Remove ''Short-term Memory (X items)'' and ''Long-term Memory (X items)'' headers from AI prompts
- Remove ''Relevant Memory Context:'' and ''Previous task'' prefixes from agent context
- Keep actual memory content and task results for AI functionality
- Move verbose information to debug logging only
- Prevents AI agents from echoing memory context headers in terminal output

This fixes the issue where memory context headers were still appearing in terminal
displays even after the original PR moved verbose information to debug logging.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 07:14:37 +00:00
Mervin Praison fd346b410d Merge pull request #1020 from MervinPraison/claude/fix-context-display-issues
fix: move verbose context information from live display to debug logging
2025-07-19 07:53:34 +01:00
github-actions[bot]andMervin Praison 9acff8f977 Implement Context Engineering - Add ContextAgent for AI Context Generation
- Add ContextAgent class with comprehensive Context Engineering capabilities
- Implements automated context generation for AI coding assistants
- Features: codebase analysis, pattern extraction, validation loops, PRP generation
- 10x better than prompt engineering, 100x better than vibe coding
- Includes factory function create_context_agent() for easy instantiation
- Add comprehensive examples in agents/ and concepts/ directories
- Full backward compatibility maintained with existing PraisonAI functionality
- Complete test suite with 7/7 tests passing

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 06:46:51 +00:00
github-actions[bot]andMervin Praison 4bc3ad97a1 fix: restore AI agent access to actual memory and task context content
- agents.py: Restore actual task result content and memory context in AI prompts
- task.py: Include actual task context results for proper task chaining
- memory.py: Return actual memory content with clean formatting instead of placeholders
- Fix f-string formatting issue in agents.py

This fixes critical functionality bugs where AI agents were receiving placeholder
messages instead of actual content, breaking memory access and task dependencies.
AI agents now get full context while debug logging is preserved.

Resolves issues identified by automated reviews while maintaining backward compatibility.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 06:45:55 +00:00
Claude Code a91228b46e Add custom TRACE logging level to reduce embedding data in debug output
- Add TRACE_LEVEL (5) below DEBUG (10) for fine-grained logging control
- Implement trace() method on logging.Logger class for backward compatibility
- Convert 4 embedding-related debug statements to use trace level
- Embedding data now only appears when logging level set to TRACE or lower
- Maintains full backward compatibility with existing debug logging
- Addresses issue where sensitive embedding data cluttered terminal output

Test coverage:
- Add test_embedding_logging.py to validate implementation functionality
- Verify TRACE level behavior and message filtering

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-19 06:45:31 +00:00
Mervin Praison 74403501ed Merge pull request #1017 from MervinPraison/claude/issue-1016-20250719-0556
fix(knowledge): resolve 'list' object has no attribute 'get' error
2025-07-19 07:17:56 +01:00
github-actions[bot]andClaude c1703dd234 Fix backward compatibility issue in knowledge.py memory result handling
- Add type checking for memory_result in _process_single_input method
- Handle both dict and list formats for backward compatibility
- Gracefully handle unexpected types with warning instead of crashing
- Resolves issue #1016 where MongoDB memory provider returns dict while Chroma returns list

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-19 06:08:08 +00:00
github-actions[bot]andClaude 256ad050e4 fix: move verbose context information from live display to debug logging
This commit addresses live display context issues by moving detailed content
from user-facing prompts to debug logging while maintaining functionality:

- agents.py line 653: Memory context now logged via logger.debug() with
  brief user-facing note in prompt instead of full content
- agents.py line 84: Previous task results logged via logger.debug() with
  brief completion status returned instead of full raw content
- task.py line 406: Previous task results logged via logger.debug() with
  brief completion message appended instead of full raw content
- memory.py: Memory section headers now use brief titles with item counts
  and log detailed content via logger.debug() instead of showing full content

These changes maintain backward compatibility and functionality while
improving user experience by reducing verbose output in live displays.
Detailed information remains available through debug logging for debugging
and troubleshooting purposes.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-19 06:01:11 +00:00
github-actions[bot]andMervin Praison 4ca844e667 fix(knowledge): resolve ''list'' object has no attribute ''get'' error
Fixed line 717 in knowledge.py where memory_result.get(''results'', [])
was called on a list instead of a dict. Both MongoDBMemory.add() and
CustomMemory._add_to_vector_store() return lists directly, so changed
to all_results.extend(memory_result) for proper list concatenation.

Resolves #1016

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 06:00:09 +00:00
Mervin Praison 7e473dcb14 Merge pull request #1015 from MervinPraison/claude/issue-1014-20250719-0501
fix: show context only when loglevel=debug
2025-07-19 06:29:23 +01:00
Mervin Praison 0188c6bf77 docs: add llms.md documentation and update MongoDB example to use local knowledge file 2025-07-19 06:27:15 +01:00
github-actions[bot]andClaude df304df3cf Fix logger configuration to support DEBUG level for verbose >= 3
- Add DEBUG logging level when verbose >= 3
- Maintain INFO level for verbose >= 5
- Keep WARNING level for verbose < 3
- This makes the verbose flag functional for debugging purposes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-19 05:22:03 +00:00
Claude CodeandMervin Praison 82cdda36d7 fix: show context only when loglevel=debug
Changed logger.info to logger.debug for context content display
in agents.py to reduce log noise while maintaining the ability
to see context information when debug logging is enabled.

Changes:
- agents.py:315 - Context content logging moved to debug level
- agents.py:638 - Context content logging moved to debug level

Maintains backward compatibility as context count logging remains
at INFO level, only the actual context content is moved to DEBUG.

Fixes #1014

Co-authored-by: Mervin Praison <[email protected]>
2025-07-19 05:08:27 +00:00
Mervin Praison 9d6c6d7ab2 refactor: improve result handling and display in MongoDB example files 2025-07-19 06:01:20 +01:00
Mervin Praison e47c6b4278 feat: upgrade praisonaiagents to 0.0.144 and add MongoDB support 2025-07-18 22:28:29 +01:00
Mervin Praison aab077ce92 refactor: optimise agent initialisation and streamline function calls
- Removed unnecessary force_shutdown_telemetry() call from basic-agents.py to enhance clarity.
- Updated llm parameter in gemini-sequential.py from "gemini-2.5-pro" to "gemini-2.5-flash" for improved performance.
- Simplified the for loop in realtime-streaming.py by removing the return_generator=True argument, maintaining functionality while improving readability.

These changes aim to enhance code efficiency and maintainability without altering existing functionality.
2025-07-18 22:17:02 +01:00
Mervin Praison 6d717d59b1 Merge pull request #1013 from MervinPraison/claude/issue-1011-20250718-1758
fix: prevent PostHog shutdown errors during interpreter shutdown
2025-07-18 22:12:19 +01:00
github-actions[bot]andMervin Praison 07cc581c04 refactor: remove duplicate threading import in _is_interpreter_shutting_down method
- Remove redundant ''import threading'' since threading is already imported at module level
- Addresses reviewer feedback on code duplication
- Maintains all functionality while improving code cleanliness

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 20:59:52 +00:00
github-actions[bot]andMervin Praison 283282d98b refactor: improve telemetry shutdown error handling and reduce code duplication
- Add centralized _SHUTDOWN_ERROR_PHRASES constant for consistent error detection
- Create _is_shutdown_related_error() helper method to eliminate code duplication
- Remove duplicate import threading in _is_interpreter_shutting_down()
- Remove redundant _posthog = None assignment handled by finally block
- Ensure all shutdown error detection uses consistent phrase list

Addresses reviewer feedback on duplicate imports, inconsistent error handling,
and code duplication while maintaining full backward compatibility.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 20:54:58 +00:00
github-actions[bot]andMervin Praison c231d625c3 fix: prevent PostHog shutdown errors during interpreter shutdown
- Add interpreter shutdown detection using sys.is_finalizing() and thread tests
- Skip PostHog operations when interpreter is shutting down to prevent:
  - cannot schedule new futures after interpreter shutdown errors
  - can''t register atexit after shutdown errors
  - Event loop and threading errors during shutdown
- Enhanced error handling with specific shutdown error message filtering
- Apply shutdown prevention to flush, thread cleanup, and shutdown operations
- Maintain full backward compatibility with existing API
- Add comprehensive debug logging for shutdown scenarios

Fixes issue #1011 where PostHog telemetry was causing shutdown errors
when force_shutdown_telemetry() was called during interpreter shutdown.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 18:03:08 +00:00
Mervin Praison d1b4ab0d95 Merge pull request #1010 from MervinPraison/claude/issue-1009-20250718-1740
fix: prevent telemetry shutdown from hanging indefinitely
2025-07-18 18:56:25 +01:00
github-actions[bot]andMervin Praison c0d5eec2a7 fix: enhance telemetry shutdown robustness and prevent critical issues
- Add thread safety with shutdown locks to prevent concurrent shutdown calls
- Fix double thread pool shutdown issue that could cause undefined behavior
- Implement memory leak prevention with bounded metrics storage (max 1000 entries)
- Replace unsafe daemon threads with ThreadPoolExecutor for better control
- Increase flush timeout from 2s to 5s for improved reliability
- Add comprehensive error handling with proper logging levels
- Split shutdown logic into maintainable helper methods
- Maintain full backward compatibility with existing API

These changes address critical thread safety issues while preserving all
existing functionality and ensuring reliable telemetry shutdown behavior.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 17:53:46 +00:00
github-actions[bot]andMervin Praison 94f7edaae4 fix: prevent telemetry shutdown from hanging indefinitely
- Added timeout-based flush operation in MinimalTelemetry.shutdown()
- Replaced blocking PostHog flush with threaded timeout approach
- Prevents indefinite blocking during program termination
- Maintains backward compatibility and data integrity
- Fixes issue where PostHog queue.join() would hang on exit

Resolves #1009

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 17:43:38 +00:00
Mervin Praison 6607b6279e refactor: streamline chat method by consolidating logging and error handling
- Simplified logging of parameters in debug mode for better clarity.
- Enhanced error handling during LLM calls and reflections to ensure robust rollback mechanisms.
- Improved structure for handling knowledge search and prompt normalization.
- Reduced code duplication by integrating common functionalities into streamlined processes.
2025-07-18 18:32:34 +01:00
Mervin Praison d1cf53c543 Merge pull request #998 from MervinPraison/claude/pr-996-20250718-1439
Fix: Correct indentation in chat method try-finally block
2025-07-18 18:22:55 +01:00
Mervin Praison 4dcc72a02b Merge branch 'main' into claude/pr-996-20250718-1439 2025-07-18 18:22:19 +01:00
Mervin Praison d2a70c45ab Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-18 18:11:56 +01:00
Mervin Praison a3cfaaabec refactor: reorganize test files into src directory and add telemetry cleanup 2025-07-18 18:11:06 +01:00
Mervin Praison 4743ba20be Merge pull request #1006 from MervinPraison/revert-1005-claude/pr-1002-20250718-1556
Revert "PR #1002: Changes from Claude"
2025-07-18 17:36:26 +01:00
Mervin Praison 81d4042578 Revert "PR #1002: Changes from Claude" 2025-07-18 17:36:18 +01:00
Mervin Praison 9a6b156b6e Merge pull request #1005 from MervinPraison/claude/pr-1002-20250718-1556
PR #1002: Changes from Claude
2025-07-18 17:35:55 +01:00
github-actions[bot]andMervin Praison fbbee806d1 Refactor telemetry cleanup to use try...finally pattern
- Replace 13 scattered _cleanup_telemetry() calls with single try...finally block
- Ensure cleanup happens on ALL exit paths regardless of success/failure
- Standardize test tolerances to 2 threads across all test files
- Improve test error messages to show specific thread details
- Maintain backward compatibility and all existing functionality
- Reduce code duplication by 95% in chat method

🤖 Generated with Claude Code

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 16:32:22 +00:00
Mervin Praison 2241ecbdde Merge pull request #1004 from MervinPraison/claude/issue-1003-20250718-1604
Fix: Agent.start() now auto-consumes generator for better UX
2025-07-18 17:14:00 +01:00
github-actions[bot]andMervin Praison 0501a85b9e Fix: Agent.start() now auto-consumes generator for better UX
- Modified Agent.start() method to automatically consume the generator by default
- Added return_generator=True parameter for backwards compatibility
- Made MCP import optional to prevent import errors
- Updated examples to demonstrate new behavior
- Fixes issue where basic-agents.py would stop without producing output

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 16:13:19 +00:00
github-actions[bot]andMervin Praison c5c728e148 Fix: Enhance telemetry cleanup to prevent agent termination hang
- Added comprehensive telemetry cleanup calls in agent.py at all return points
- Ensures proper cleanup after guardrail validation failures
- Prevents hanging during agent termination by forcing telemetry shutdown
- Added test files to validate telemetry cleanup functionality
- Addresses hanging issues in async agent execution flows

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
2025-07-18 16:04:37 +00:00
Mervin Praison 6d4c1d71fb Merge pull request #1002 from MervinPraison/claude/pr-999-20250718-1529
Fix: Add comprehensive telemetry cleanup to prevent agent termination hang
2025-07-18 16:47:38 +01:00
Mervin Praison 31435c454f Merge pull request #1001 from MervinPraison/claude/pr-997-20250718-1454
Fix: Add telemetry cleanup to execute() and aexecute() methods to prevent hanging
2025-07-18 16:46:47 +01:00
github-actions[bot]andMervin Praison 00e722aae1 Fix: Add comprehensive telemetry cleanup to prevent agent termination hang
- Fixed 7 missing telemetry cleanup calls in agent.py
- Added cleanup to all return paths in chat() and achat() methods
- Added cleanup to custom LLM guardrail validation paths
- Added cleanup to reasoning content validation paths
- Added cleanup to exception handlers in achat() method
- Ensures proper termination of telemetry threads
- Prevents hanging after agent task completion
- Maintains full backward compatibility
- Comprehensive testing shows all agents now terminate properly

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 15:40:17 +00:00
Mervin Praison 76a65b3667 Merge pull request #1000 from MervinPraison/claude/fix-telemetry-termination-20250718
Fix: Comprehensive telemetry cleanup to prevent agent termination hang
2025-07-18 16:30:42 +01:00
github-actions[bot]andMervin Praison cd5459d4dc Fix: Comprehensive telemetry cleanup to prevent agent termination hang
This commit addresses the critical issue where PraisonAI agents would not
terminate properly after completing their tasks, requiring manual interruption.

Root Cause: PostHog telemetry client running in async mode creates
background threads that persist after standard shutdown() calls.

Solution:
- Enhanced telemetry shutdown mechanism with comprehensive thread cleanup
- Added force_shutdown_telemetry() function for robust cleanup
- Implemented timeout-based thread termination with proper error handling
- Updated agent._cleanup_telemetry() to use the new robust cleanup method

Impact:
- Agents now terminate cleanly without hanging
- Maintains full backward compatibility
- Comprehensive thread cleanup prevents resource leaks
- Timeout mechanism prevents infinite waiting

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 15:27:44 +00:00
Mervin Praison 326390863f Merge pull request #999 from MervinPraison/claude/issue-987-20250718-1504
Fix: Resolve agent termination issue by adding comprehensive telemetry cleanup
2025-07-18 16:18:33 +01:00
github-actions[bot]andMervin Praison d1e6706427 Fix: Resolve agent termination issue by adding comprehensive telemetry cleanup
- Added _cleanup_telemetry() calls to all return paths in chat() and achat() methods
- Ensures proper program termination without requiring Ctrl+C
- Maintains full backward compatibility with existing APIs
- Addresses syntax error concerns by implementing clean, error-free code
- Added test script to verify the fix works correctly

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 15:16:38 +00:00
github-actions[bot]andMervin Praison 7f0f8d5ed9 Fix: Add telemetry cleanup to execute() and aexecute() methods to prevent hanging
- Add try-finally blocks to execute() and aexecute() methods
- Ensures telemetry cleanup happens for all public entry points
- Prevents programs from hanging due to PostHog background threads
- Maintains backward compatibility
- Addresses critical gaps identified in PR reviews

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 14:57:09 +00:00
github-actions[bot]andMervin Praison 556d1298f1 Fix: Correct indentation in chat method try-finally block
- Fixed syntax error at line 1197 where code was outside try block
- Properly indented all main logic to be inside try block
- Ensures telemetry cleanup finally block executes correctly
- Maintains backward compatibility
- No breaking changes

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 14:49:41 +00:00
Mervin Praison 48acfce433 Merge pull request #994 from MervinPraison/claude/issue-992-20250718-1345
feat: integrate MongoDB as memory and knowledge provider
2025-07-18 15:44:44 +01:00
Mervin Praison 1ddcafbaa4 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-18 15:43:11 +01:00
Mervin Praison eb2073fe77 Enhance workflow configurations by adding a timeout of 15 minutes to all job definitions in the CI/CD pipeline. This change aims to improve resource management and prevent long-running jobs from hanging indefinitely. 2025-07-18 15:43:10 +01:00
Mervin Praison 732e4e6c75 Merge pull request #997 from MervinPraison/revert-996-claude/pr-990-20250718-1429
Revert "Fix: Comprehensive telemetry cleanup to prevent agent termination issues"
2025-07-18 15:39:49 +01:00
Mervin Praison 7f01facb36 Revert "Fix: Comprehensive telemetry cleanup to prevent agent termination issues" 2025-07-18 15:39:39 +01:00
Mervin Praison b2cc7ebfd9 Merge pull request #996 from MervinPraison/claude/pr-990-20250718-1429
Fix: Comprehensive telemetry cleanup to prevent agent termination issues
2025-07-18 15:38:31 +01:00
github-actions[bot]andMervin Praison 3c51b6f644 Fix: Comprehensive telemetry cleanup to prevent agent termination issues
- Added telemetry cleanup to all agent entry points (chat, achat, execute, aexecute)
- Fixed streaming issue by adding cleanup to _start_stream method
- Removed duplicate cleanup from convenience methods
- Ensures proper program termination regardless of which method is used

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 14:36:46 +00:00
Mervin Praison 44f02cdf43 Merge pull request #990 from MervinPraison/claude/issue-987-20250718-1031
Fix: Resolve agent termination issue by properly cleaning up telemetry system
2025-07-18 15:24:30 +01:00
Mervin Praison 55668c9510 Merge branch 'main' into claude/issue-987-20250718-1031 2025-07-18 15:24:03 +01:00
github-actions[bot]andMervin Praison 28e95388f9 fix: resolve MongoDB integration issues
- Fix ID generation consistency between MongoDB and SQLite storage
- Fix inconsistent error handling in memory operations
- Fix security issue with hardcoded API key placeholders in examples
- Fix unused imports in mongodb_tools.py
- Fix pymongo version to >= 4.6.3 to address security vulnerabilities
- Improve datetime import organization
- Ensure consistent storage order for better reliability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 14:18:53 +00:00
github-actions[bot]andMervin Praison 663150a0ee fix: resolve MongoDB integration issues
- Fix memory record citation duplication (lines 861, 880, 933 in memory.py)
- Make vector dimensions configurable based on embedding model
- Add _get_embedding_dimensions method for proper dimension detection
- Support multiple embedding models (text-embedding-3-small, 3-large, ada-002)
- Improve citation format to use record IDs instead of duplicating text

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 14:13:14 +00:00
github-actions[bot]andMervin Praison 225ce7b9f2 feat: integrate MongoDB as memory and knowledge provider
Add comprehensive MongoDB integration for PraisonAI agents including:

**Memory Provider**:
- MongoDB as persistent memory storage option
- Vector search capabilities with Atlas Vector Search
- Support for both key-value and vector operations
- Quality scoring and filtering
- User-specific memory isolation
- Graceful fallback to existing SQLite/ChromaDB

**Knowledge Store**:
- MongoDB as vector store for knowledge base
- Document processing with embeddings
- Vector similarity search for knowledge retrieval
- Chunking and metadata management
- Compatible with existing Mem0/ChromaDB workflow

**Tools Integration**:
- Complete MongoDB tools suite (CRUD operations)
- Vector search and text search capabilities
- Collection management and indexing
- Production-ready connection handling
- Error handling and logging

**Examples**:
- Memory provider example with persistent storage
- Knowledge store example with vector search
- Tools integration example with database operations
- Comprehensive business scenario simulation
- Complete documentation and best practices

**Technical Details**:
- Optional dependency: pip install ''praisonaiagents[mongodb]''
- Backward compatibility maintained
- Supports both local MongoDB and Atlas
- Configurable connection pooling and timeouts
- Comprehensive error handling

Resolves #992

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
2025-07-18 14:02:34 +00:00
Mervin Praison b2cacb243f Merge pull request #991 from MervinPraison/claude/issue-981-20250718-1032
fix: implement real-time streaming for Agent.start() method
2025-07-18 15:01:30 +01:00
github-actions[bot]andMervin Praison 9e25572c84 fix: resolve critical issues in streaming implementation
- Fix chat_history_length initialization bug in both streaming methods
- Add safe array access checks for chunk.choices in OpenAI client
- Add JSON parsing error handling for malformed tool arguments
- Remove unused imports and variables
- Update test files to use mock LLM instead of real APIs
- Ensure robust error handling throughout streaming pipeline

These fixes address all critical issues identified by code review bots
while maintaining backward compatibility and streaming functionality.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 13:53:45 +00:00
Mervin Praison 801aedc00a Merge pull request #989 from MervinPraison/claude/issue-988-20250718-1318
fix: Add tool usage time tracking to MCP execution
2025-07-18 14:50:48 +01:00
github-actions[bot]andMervin Praison f18103f66b fix: Add thread safety and fix initialization timeout bug in tool timing
- Add thread locks to MCPToolRunner._tool_timings and MinimalTelemetry._metrics
- Fix initialization timeout bug where telemetry tracking was bypassed
- Move timing measurement after initialization check for accuracy
- Ensure telemetry is captured for all tool execution outcomes

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 13:48:22 +00:00
Mervin Praison a75745729b Merge pull request #986 from MervinPraison/claude/issue-985-20250717-1851
fix: resolve vertex_ai parameter compatibility issue for image generation
2025-07-18 14:29:00 +01:00
github-actions[bot]andMervin Praison 2bc61a1d55 fix: Add tool usage time tracking to MCP execution
- Enhanced telemetry.track_tool_usage() to accept execution_time parameter
- Added timing instrumentation to MCPToolRunner.call_tool() method
- Tool usage timing is now captured and stored in telemetry metrics
- Maintains backward compatibility with no breaking changes
- Addresses issue #988 where tool usage time was always 0

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 13:24:36 +00:00
github-actions[bot]andMervin Praison a3877c34e5 improve: enhance image agent parameter filtering robustness
- Replace overly broad exception handling with specific exceptions
- Consolidate duplicated gemini parameter filtering logic
- Add debug logging for provider detection failures
- Improve code readability with better variable separation
- Maintain backward compatibility and safety mechanisms

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 10:42:15 +00:00
github-actions[bot]andMervin Praison ff1022bdb6 fix: implement real-time streaming for Agent.start() method
- Add streaming generator support to Agent.start() method
- Implement _start_stream() method for streaming logic
- Add _chat_stream() method to route streaming to appropriate handlers
- Add _custom_llm_stream() for custom LLM streaming support
- Add _openai_stream() for OpenAI client streaming support
- Add chat_completion_with_tools_stream() method to OpenAI client
- Maintain backward compatibility for existing code
- Add proper error handling and chat history management

Fixes #981

Co-authored-by: Mervin Praison <[email protected]>
2025-07-18 10:40:49 +00:00
github-actions[bot]andClaude 22e9904aef fix: resolve agent termination issue by properly cleaning up telemetry system
- Add proper cleanup in Agent.start() and Agent.astart() methods using try-finally blocks
- Implement _cleanup_telemetry() method to ensure telemetry system shutdown
- Prevent hanging after agent execution by properly shutting down background threads
- Add test files to verify the termination fix works correctly

Fixes #987

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-18 10:36:19 +00:00
Mervin Praison e5b7f7b740 Merge pull request #983 from Dhivya-Bharathy/models-providers-reorganization
feat: Add comprehensive provider examples for all major LiteLLM providers with clean API structure
2025-07-18 11:30:39 +01:00
github-actions[bot]andMervin Praison 3a137fb71e fix: resolve vertex_ai parameter compatibility issue for image generation
- Add provider-aware parameter filtering for image generation
- Filter out unsupported ''style'' parameter for vertex_ai models
- Maintain backward compatibility for other providers (OpenAI, Gemini)
- Add drop_params=True safety mechanism
- Resolves litellm.UnsupportedParamsError for gemini-2.0-flash-preview-image-generation

Co-authored-by: Mervin Praison <[email protected]>
2025-07-17 19:01:41 +00:00
Dhivya-Bharathy 8e09f5e4b4 Add comprehensive model examples with 5 agents per model: Llama, Claude, GPT 2025-07-17 13:46:49 +05:30
Dhivya-Bharathy 82e6673488 Add 3 more provider examples: Moonshot AI, Databricks, AI21 2025-07-17 13:17:30 +05:30
Dhivya-Bharathy dd9b24597a Add comprehensive provider examples for all major LiteLLM providers 2025-07-17 13:01:08 +05:30
Mervin Praison dbd6062edf chore: bump praisonai to v2.2.70 and praisonaiagents to v0.0.142 across all files 2025-07-17 01:31:56 +01:00
Mervin Praison 7fc615ff70 Merge pull request #974 from MervinPraison/claude/pr-965-20250716-2356
fix: make TelemetryCollector.stop() consistent with shutdown behavior
2025-07-17 01:24:26 +01:00
Mervin Praison fabac466f9 Merge pull request #966 from MervinPraison/claude/issue-964-20250716-2340
fix: improve Ollama sequential tool execution to prevent redundant calls
2025-07-17 01:22:11 +01:00
github-actions[bot]andMervin Praison 8d98f27f9c fix: correct Ollama early stopping logic placement for sequential tool execution
Fixes critical issues identified in PR review:
- Move early stopping logic from inside ''if tool_calls:'' block to ''else:'' block
- Fix logic placement in both sync and async execution paths
- Remove unreachable code in _generate_ollama_tool_summary()
- Ensure early stopping triggers correctly when Ollama returns empty responses after tool execution

This ensures the fix properly handles the Ollama edge case where it returns
empty responses after successful tool execution, preventing infinite loops
while allowing proper sequential tool calls.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-17 00:02:48 +00:00
github-actions[bot]andMervin Praison cf0af4999d fix: make TelemetryCollector.stop() consistent with shutdown behavior
Ensures TelemetryCollector.stop() calls shutdown() instead of just flush()
for consistency with the main atexit handler and proper PostHog session cleanup.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-17 00:01:42 +00:00
github-actions[bot]andMervin Praison f6ecd3b4db fix: improve Ollama early stopping logic to allow proper sequential tool execution
- Only trigger early stopping when no new tool calls are present in current response
- Prevents premature termination during sequential tool calls like get_stock_price -> multiply
- Maintains backward compatibility while fixing issue #964
- Applied to both sync and async execution paths

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:56:48 +00:00
Mervin Praison a348d186c3 Merge pull request #965 from MervinPraison/claude/issue-963-20250716-2334
fix: properly shutdown telemetry aiohttp sessions to prevent ImportError during Python shutdown
2025-07-17 00:54:16 +01:00
Mervin Praison 30c0f2458f Merge pull request #961 from MervinPraison/claude/issue-958-20250716-2304
fix: ensure consistent Task/Response formatting across all LLM providers
2025-07-17 00:53:53 +01:00
Mervin Praison 668d61344f Merge branch 'main' into claude/issue-958-20250716-2304 2025-07-17 00:47:55 +01:00
github-actions[bot]andMervin Praison e8e9625f22 fix: improve Ollama sequential tool execution to prevent redundant calls
- Add early stopping logic for Ollama after first successful tool execution
- Enhance tool summary generation to create more natural, OpenAI-like responses
- Apply fix to both sync and async execution paths
- Prevent multiple tool calls when execution is complete
- Maintains full backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:47:43 +00:00
Mervin Praison cc721ba0db feat: upgrade praisonai to v2.2.69 and add realtime streaming support 2025-07-17 00:45:38 +01:00
Mervin Praison 07a30ab33d Merge pull request #962 from MervinPraison/claude/issue-956-20250716-2316
fix: enable real-time streaming regardless of verbose setting
2025-07-17 00:41:34 +01:00
github-actions[bot]andMervin Praison 92978fdb1c fix: properly shutdown telemetry aiohttp sessions to prevent ImportError during Python shutdown
- Change atexit handler from flush() to shutdown() in telemetry/__init__.py
- This ensures PostHog aiohttp sessions are properly closed before Python shutdown
- Prevents ''ImportError: sys.meta_path is None, Python is likely shutting down'' error
- Maintains backward compatibility with existing functionality

Fixes #963

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:40:40 +00:00
github-actions[bot]andMervin Praison 15a307dd4e fix: complete streaming fix for all LLM providers and improve console handling
- Fix custom LLM streaming (Gemini/Vertex AI) in llm.py by removing verbose condition
- Improve console parameter consistency when streaming is enabled
- Ensures streaming works for stream=True regardless of verbose setting
- Maintains full backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:38:27 +00:00
Mervin Praison 053ad043b8 Merge pull request #960 from MervinPraison/claude/issue-940-20250716-2252
fix: accumulate tool results across iterations in Ollama sequential execution
2025-07-17 00:35:49 +01:00
github-actions[bot]andMervin Praison 6e664995e8 fix: add missing flag reset in async achat method for consistent display behavior
- Added _final_display_shown = False reset in achat() method to match chat() method
- Ensures proper display flag management for both sync and async agent interactions
- Maintains consistency across all agent conversation entry points

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:32:12 +00:00
github-actions[bot]andMervin Praison ccb1bccf0f chore: remove unused custom_display_fn from agent.py
- Removed unused custom_display_fn function that was defined but never called
- Cleanup after streaming fix to avoid confusion
- No functional changes, streaming fix remains intact

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:31:38 +00:00
Mervin Praison 94c8fc21e6 Merge pull request #959 from MervinPraison/claude/issue-947-20250716-2244
fix: resolve task_name undefined error in async execution
2025-07-17 00:29:30 +01:00
github-actions[bot]andMervin Praison 48575b4ee0 fix: ensure callback execution in all achat() paths
- Enhanced _chat_completion method signature to accept task metadata parameters
- Updated all calls to _chat_completion to pass task context
- Fixed NameError where task_name, task_description, task_id were undefined
- Updated _apply_guardrail_with_retry to propagate task metadata
- Ensures complete task metadata propagation in sync chat execution path

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:28:05 +00:00
github-actions[bot]andMervin Praison 2ce7136d0c refactor: improve Ollama sequential fix with better test and deduplication
- Enhanced test file with comprehensive behavioral validation
- Added proper module import handling and mock-based testing
- Extracted duplicated logic into _handle_ollama_sequential_logic helper
- Eliminated 18-line code duplication between sync and async methods
- Improved maintainability while preserving backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:27:36 +00:00
github-actions[bot]andMervin Praison 3bea2ffb10 fix: enable real-time streaming regardless of verbose setting
- Remove dependency on verbose=True for streaming display function
- Allow stream=True to work with verbose=False for real-time output
- Maintain backward compatibility with existing verbose=True usage
- Fixes issue where Gemini/Google Vertex AI streaming was buffered

Resolves #956

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:22:35 +00:00
Mervin Praison fcbd915a0e docs: move star history section above feature roadmap for better visibility 2025-07-17 00:21:52 +01:00
github-actions[bot]andMervin Praison ae7eb29684 fix: ensure callback execution in all achat() paths
Adds missing callback execution to tool-based responses and JSON/Pydantic
output paths in the achat() method to ensure consistent task metadata
propagation across all execution flows.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:19:57 +00:00
Mervin Praison c5ec1ffea0 refactor: move test files to src/praisonai-agents directory for better organization 2025-07-17 00:19:56 +01:00
Mervin Praison aad5f286e2 chore: bump PraisonAI to v2.2.68 and PraisonAI Agents to v0.0.140 2025-07-17 00:19:32 +01:00
github-actions[bot]andMervin Praison 1aa20de337 fix: ensure consistent Task/Response formatting across all LLM providers
- Modified display condition to show formatted output for both OpenAI and custom LLM providers (like Gemini)
- Added _final_display_shown flag to prevent duplicate displays within same execution
- Reset flag at start of each chat() call for new conversations
- Maintains backward compatibility and existing verbose control behavior

Fixes #958

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:15:08 +00:00
Mervin Praison 3bc185d15d Merge pull request #957 from MervinPraison/claude/comprehensive-task-name-fix-20250716
fix: comprehensive task_name undefined error resolution
2025-07-17 00:14:20 +01:00
github-actions[bot]andMervin Praison 6b8a7110f2 refactor: simplify redundant hasattr checks and fix test formatting
- Remove redundant hasattr checks in agent.py as getattr handles missing attributes
- Fix unnecessary f-string prefixes in test file
- Remove unused variable assignment in test

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:08:04 +00:00
Mervin Praison 5ab0f245c5 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-17 00:03:23 +01:00
Mervin Praison 5baa3f9b96 fix: update LLM model in Ollama sequential agent from qwen3 to llama3.2 for improved performance 2025-07-17 00:03:04 +01:00
github-actions[bot]andMervin Praison 28c6d026f7 fix: resolve task_name undefined error in async execution
Addresses issue #947 where task_name undefined errors occurred during async parallel task execution.

Key Changes:
- Enhanced Agent.achat() method to accept task context parameters (task_name, task_description, task_id)
- Updated aexecute_task() to pass task metadata when calling agent.achat()
- Added callback execution to both async execution paths in achat() method
- Updated callback system to properly propagate task context

Root Cause: Async execution path was missing task metadata propagation to LLM callbacks.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 23:00:34 +00:00
github-actions[bot]andMervin Praison 802716e5ec fix: comprehensive task_name undefined error resolution
- Add task_name, task_description, task_id parameters to achat method signature
- Update all achat call sites in agents.py to pass task parameters where available
- Provide fallback None values for API handler contexts without task context
- Fix Agent.aexecute to extract task info when available
- Resolves NameError: name ''task_name'' is not defined in parallel agent execution

Fixes persistent errors in agentic parallelization workflows where callbacks
expect task context parameters but they were not being passed correctly through
the async execution chain.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 22:58:16 +00:00
github-actions[bot]andMervin Praison 9eaa2731da fix: accumulate tool results across iterations in Ollama sequential execution
- After successful tool execution, give Ollama LLM explicit prompt for final answer
- Only generate tool summary if LLM fails to respond to explicit prompt
- Prevents premature tool summary generation after sequential execution
- Applied to both sync and async tool execution loops
- Preserves infinite loop prevention while enabling natural responses

Fixes #940

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 22:56:02 +00:00
Mervin Praison 0d3e1632a3 Merge pull request #949 from Dhivya-Bharathy/models-providers-reorganization
Reorganize models and providers structure with comprehensive examples
2025-07-16 23:45:08 +01:00
Mervin Praison da14b1d8e9 Merge pull request #955 from MervinPraison/claude/pr-953-20250716-1258
fix: resolve Ollama infinite loop issue with minimal changes
2025-07-16 16:02:48 +01:00
Mervin Praison c0679f4528 Merge pull request #954 from MervinPraison/claude/issue-940-20250716-1247
fix: prevent premature termination in Ollama sequential tool execution
2025-07-16 15:18:42 +01:00
github-actions[bot]andMervin Praison 930555d921 fix: accumulate tool results across iterations in Ollama sequential execution
- Replace hardcoded iteration threshold (3) with class constant OLLAMA_SUMMARY_ITERATION_THRESHOLD
- Add proper constant definition for better maintainability and readability
- Applied consistently to both sync and async methods
- Addresses reviewer feedback about magic numbers
- Ensures proper tool result accumulation across iterations

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 13:24:35 +00:00
Mervin Praison 859fb6a263 chore: bump praisonai to v2.2.67 and praisonaiagents to v0.0.138 across all files 2025-07-16 14:16:30 +01:00
github-actions[bot]andMervin Praison f154dba804 fix: accumulate tool results across iterations in Ollama sequential execution
- Add accumulated_tool_results list to store tool results across all iterations
- Prevents loss of tool execution history when generating summaries
- Applied to both sync (get_response) and async (get_response_async) methods
- Maintains backward compatibility with existing functionality
- Fixes issue where only current iteration''s tool results were available to summary generation

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 13:15:14 +00:00
Mervin Praison fb2a16126f Merge pull request #952 from MervinPraison/claude/issue-947-20250716-1205
fix: resolve task_name undefined error in LLM callback execution
2025-07-16 14:14:52 +01:00
Mervin Praison 77ab361d64 refactor: reorganize test files and update package versions to 2.2.66 2025-07-16 14:12:45 +01:00
Mervin Praison a276a610a0 Merge pull request #951 from MervinPraison/claude/issue-950-20250716-1207
feat: Enable imports from PraisonAI package for issue #950
2025-07-16 14:08:34 +01:00
github-actions[bot] ddb547f6a5 cleanup: remove debug test files 2025-07-16 13:08:03 +00:00
github-actions[bot]andMervin Praison 24437b40d9 fix: resolve Ollama infinite loop issue with minimal changes
- Remove redundant length check in _generate_ollama_tool_summary
- Simplify verbose conditional checks in both sync and async methods
- Add safety checks to prevent infinite loops after 5 iterations
- Maintain backward compatibility with other LLM providers
- Add comprehensive test suite to validate fixes

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 13:07:39 +00:00
Dhivya-Bharathy 582049f759 Update model examples to use new clean format with praisonaiagents.Agent 2025-07-16 18:32:35 +05:30
github-actions[bot]andMervin Praison e8f4eff173 refactor: Use dynamic approach for praisonaiagents imports
- Replace manual symbol list with dynamic import using
- Use  for automatic maintenance
- Remove manual tracking of imported symbols
- Reduce code from 49 to 17 lines
- Future-proof: automatically inherits new exports from praisonaiagents

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:56:29 +00:00
github-actions[bot]andMervin Praison e1b93000be fix: prevent premature termination in Ollama sequential tool execution
- Modified tool execution logic to allow at least 3 iterations before triggering summary generation
- This prevents Ollama from prematurely terminating when sequential tool calls are needed
- Applied fix to both conversation() and reasoning() methods in LLM class
- Resolves issue where Ollama would generate tool summaries too early, blocking proper tool chaining

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
2025-07-16 12:51:13 +00:00
Mervin Praison 464cc128db Merge pull request #953 from MervinPraison/revert-945-claude/issue-940-20250716-0711
Revert "fix: prevent premature termination in Ollama sequential tool execution"
2025-07-16 13:46:12 +01:00
Mervin Praison f44bb7fa39 Revert "fix: prevent premature termination in Ollama sequential tool execution" 2025-07-16 13:46:01 +01:00
Mervin Praison 5b70f4b34d Merge pull request #945 from MervinPraison/claude/issue-940-20250716-0711
fix: prevent premature termination in Ollama sequential tool execution
2025-07-16 13:45:16 +01:00
github-actions[bot]andMervin Praison 5514f17346 fix: Resolve unconditional __all__ list issue causing import errors
- Fixed critical bug where __all__ list included symbols from praisonaiagents
  even when import failed due to missing dependencies
- Implemented dynamic __all__ construction based on successfully imported symbols
- Maintained backward compatibility while fixing the cursor review issue
- Added comprehensive test files to verify fix and backward compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:38:33 +00:00
github-actions[bot]andMervin Praison 318ececfb4 fix: correct function name in test_fix_verification.py
- Fixed unused variable 'results' in test_fix_verification.py
- Maintained test functionality while removing static analysis warning

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:35:26 +00:00
github-actions[bot]andMervin Praison 83afc0891f fix: correct function name in test_fix_verification.py
- Changed register_callback to register_display_callback
- Ensures test runs correctly and validates the fix

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:29:42 +00:00
github-actions[bot]andMervin Praison 8e7323c484 refactor: replace hardcoded patterns with dynamic tool usage detection
- Replace hardcoded acknowledgment_patterns and status_patterns with intelligent context analysis
- Implement _analyze_tool_chain_context() for dynamic tool execution pattern detection
- Add _assess_response_quality() for content-based response evaluation
- Replace iteration_count >= 5 threshold with _should_generate_tool_summary() dynamic logic
- Improve tool chain completion detection with confidence scoring
- Increase safety fallback threshold from 5 to 7 iterations
- Maintain backward compatibility with existing providers

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:28:18 +00:00
Dhivya-Bharathy 8dd6494a59 Update all provider examples to use new clean format with praisonaiagents.Agent 2025-07-16 17:54:50 +05:30
github-actions[bot]andMervin Praison 857238a82a fix: resolve task_name undefined error in LLM callback execution
- Fixed 6 direct execute_sync_callback calls missing task-related parameters
- Added agent_name, agent_role, agent_tools, task_name, task_description, task_id
- Ensures consistent callback parameter passing between verbose and non-verbose modes
- Prevents infinite loop errors when callbacks expect task_name parameter
- Maintains backward compatibility with existing functionality

Fixes #947

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:21:27 +00:00
github-actions[bot]andMervin Praison 658a2397fc feat: Enable imports from PraisonAI package for issue #950
This change allows users to import from the main PraisonAI package instead of
just from praisonaiagents, while maintaining full backward compatibility.

Changes:
- Modified src/praisonai/praisonai/__init__.py to re-export all classes from praisonaiagents
- Added comprehensive __all__ list for proper exports
- Maintained backward compatibility - all existing imports continue to work

New usage patterns now supported:
- from praisonai import Agent, Task, PraisonAIAgents
- from praisonai import Tools, Memory, Knowledge, etc.

Backward compatibility maintained:
- from praisonaiagents import Agent, Task, PraisonAIAgents (still works)

Tests added:
- test_import_conversion.py: Comprehensive test suite
- test_issue_950.py: Specific test for the issue requirements

Resolves #950

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 12:14:45 +00:00
Dhivya-Bharathy 1ab09fa259 Reorganize models and providers structure - Move Kimi2 agents to models/kimi with kimi_ prefix - Move Grok4 agents to models/grok with grok_ prefix - Create 10 new Groq agents in models/groq with groq_ prefix - Add provider examples for OpenAI, Anthropic, Google, DeepSeek, Mistral, Cohere, xAI - Remove README files as requested 2025-07-16 16:35:00 +05:30
Dhivya-Bharathy f7f4a6c0bf Add 10 new agents to Kimi2_Intelligent_Agents (aerospace, bioinformatics, blockchain, energy, IoT, metaverse, nanotechnology, quantum AI, quantum computing, robotics) 2025-07-16 15:02:46 +05:30
github-actions[bot]andMervin Praison a743f4b68c fix: prevent premature termination in Ollama sequential tool execution
- Added iteration count threshold (>=5) before generating Ollama tool summary
- Prevents premature termination after first tool call in sequential execution
- Maintains infinite loop prevention for truly stuck scenarios
- Applied fix to both sync and async methods in llm.py
- Preserves backward compatibility with other LLM providers

Fixes issue where Ollama would terminate after first tool call instead of
continuing with sequential execution (e.g., get_stock_price -> multiply)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-16 07:28:09 +00:00
Mervin Praison 77b7c3b1ce Merge pull request #944 from MervinPraison/claude/fix-ollama-response-overwrite-20250715-2344
fix: prevent Ollama tool summary from being overwritten by empty response
2025-07-16 01:08:51 +01:00
Mervin Praison 48c65a742c Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-16 00:56:06 +01:00
Mervin Praison 35295ad167 refactor: move test files to src/praisonai-agents directory 2025-07-16 00:56:05 +01:00
Mervin Praison 1a6078d7eb Delete test_ollama_response_fix.py 2025-07-16 00:50:14 +01:00
github-actions[bot]andMervin Praison fbd4c53796 fix: prevent Ollama tool summary from being overwritten by empty response
- Add condition to check if final_response_text is already set before overwriting
- Fix applies to both sync (get_response) and async (get_response_async) methods
- Prevents tool summary from being lost when Ollama returns empty response after tool execution
- Maintains backward compatibility for non-Ollama providers
- Resolves issue where agent.start() returns None despite successful tool execution

Fixes the remaining issue from PR #943 where tool summary was generated but overwritten

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 23:48:51 +00:00
Mervin Praison 55e70d521e Merge pull request #942 from MervinPraison/claude/issue-939-20250715-2248
feat: Add 7 comprehensive examples for advanced PraisonAI agent features
2025-07-16 00:47:52 +01:00
github-actions[bot]andMervin Praison d4023c0484 feat: Organize advanced examples into appropriate folders
- Move callback systems to general/
- Move memory examples to memory/
- Move state management to stateful/
- Move hierarchical agents to agents/
- Move guardrails to guardrails/
- Move self-reflection to concepts/

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 23:46:29 +00:00
Mervin Praison d88200e258 Merge pull request #943 from MervinPraison/claude/issue-940-20250715-2304
fix: Resolve Ollama infinite tool call loops by improving response handling
2025-07-16 00:35:29 +01:00
github-actions[bot]andMervin Praison beac0b47a2 refactor: eliminate code duplication and improve test quality in Ollama fix
- Extract duplicated Ollama tool summary logic into _generate_ollama_tool_summary() helper method
- Replace magic number 10 with OLLAMA_MIN_RESPONSE_LENGTH constant
- Fix test_tool_summary_generation() to call production code instead of reimplementing logic
- Add comprehensive test scenarios for different response types and provider types
- Maintain backward compatibility and fix functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 23:26:15 +00:00
github-actions[bot]andClaude 6d6c44e7ca fix: Convert advanced examples to flat format with minimal code
Simplified all 7 advanced examples to follow flat format requirements:
- Removed 20+ custom classes across all examples
- Reduced total lines from 2,829 to 514 (82% reduction)
- Limited to 1-2 agents max per example
- Focused on core functionality demonstration
- Maintained advanced feature examples while making them accessible

Changes per file:
- advanced-callback-systems.py: 404→59 lines, removed 3 classes
- advanced-graph-memory-integration.py: 226→75 lines, reduced to 1 agent
- advanced-memory-search-optimization.py: 568→76 lines, removed 4 classes
- advanced-state-management-patterns.py: 437→80 lines, removed 3 classes
- autoagents-hierarchical-generation.py: 158→73 lines, removed custom class
- production-guardrails-patterns.py: 480→65 lines, removed 5 classes
- self-reflection-optimization-patterns.py: 556→46 lines, removed 4 classes

All examples now follow the established flat format pattern with simple,
direct agent/task creation and minimal code complexity.

🤖 Generated with Claude Code

Co-Authored-By: Claude <[email protected]>
2025-07-15 23:22:16 +00:00
Mervin Praison 1cd838f691 chore: bump praisonai version to 2.2.65 and add autogen-v4 dependencies 2025-07-16 00:12:42 +01:00
Mervin Praison 319944e012 Merge pull request #941 from MervinPraison/claude/issue-938-20250715-2246
fix: Ensure agent names are valid Python identifiers for AutoGen v0.4
2025-07-16 00:10:52 +01:00
github-actions[bot]andMervin Praison b53162aa9e fix: Improve sanitization to preserve double underscores
- Fixed aggressive underscore collapsing that broke dunder names like __init__
- Now only collapses 5+ consecutive underscores instead of any consecutive underscores
- Preserves trailing underscores in double underscore patterns (__name__)
- Handles edge case where purely invalid characters become single underscore
- All 15 test cases now pass including magic method names
- Maintains backward compatibility for AutoGen v0.2, CrewAI, PraisonAI

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 23:09:41 +00:00
github-actions[bot]andClaude 7d42e31e0a feat: Add comprehensive examples for advanced PraisonAI agent features
Added 7 new example files demonstrating advanced functionality:
- autoagents-hierarchical-generation.py: Hierarchical agent generation patterns
- advanced-graph-memory-integration.py: Graph-based memory systems
- advanced-callback-systems.py: Custom callback implementations
- production-guardrails-patterns.py: Production safety and guardrails
- advanced-state-management-patterns.py: Complex state handling
- advanced-memory-search-optimization.py: Memory search optimizations
- self-reflection-optimization-patterns.py: Self-improvement patterns

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-15 23:09:07 +00:00
github-actions[bot]andMervin Praison 9c96a838a8 fix: Resolve Ollama infinite tool call loops by improving response handling
- Add special handling for Ollama models in both sync and async tool execution loops
- When Ollama returns empty/minimal response after tool execution, generate summary from tool results
- Prevents infinite loops while maintaining functionality for other LLM providers
- Add comprehensive test suite to validate fix and ensure backward compatibility
- Fixes issue where Ollama models would repeat tool calls indefinitely

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 23:08:01 +00:00
github-actions[bot]andMervin Praison 52c249fde0 fix: Ensure agent names are valid Python identifiers for AutoGen v0.4
AutoGen v0.4 requires agent names to be valid Python identifiers,
but role names like ''Narrative Designer'' contain spaces which are invalid.

- Added sanitize_agent_name_for_autogen_v4() function to convert any
  string to a valid Python identifier
- Applied sanitization only in AutoGen v0.4 code path for backward compatibility
- AutoGen v0.2 and other frameworks remain unchanged
- Handles spaces, special characters, Python keywords, and edge cases

Resolves issue where ''Narrative Designer'' role causes error:
''The agent name must be a valid Python identifier''

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 22:51:54 +00:00
Mervin Praison 7607df753f Merge pull request #937 from MervinPraison/claude/issue-934-20250715_165720
fix: Replace deprecated Pydantic .dict() with .model_dump() in example files
2025-07-15 22:04:30 +01:00
Mervin Praison 8fa181bc55 Merge pull request #936 from MervinPraison/claude/issue-935-20250715_170032
feat: Add AutoGen v0.4 support with backward compatibility
2025-07-15 22:03:55 +01:00
github-actions[bot]andMervin Praison ccbf0ebebb fix: Ensure backward compatibility for Pydantic v1/v2 in hasattr checks
- Fix inconsistent hasattr checks in ZeroScript_AI_TestExecutor.ipynb
- Update fix_notebook.py to handle both method call and hasattr replacement
- Add comprehensive backward compatibility test suite
- Ensure Pydantic v1 models fallback to str() when model_dump() unavailable

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 17:19:41 +00:00
Mervin Praison d3f0c217ca feat: update default model from gpt-4o to gpt-4o-mini and bump version to 2.2.64 2025-07-15 18:09:57 +01:00
github-actions[bot]andMervin Praison 6995a446e1 feat: Add AutoGen v0.4 support with backward compatibility
- Add optional dependency ''autogen-v4'' with autogen-agentchat>=0.4.0, autogen-ext[openai]>=0.4.0, autogen-core>=0.4.0
- Implement async _run_autogen_v4() method with RoundRobinGroupChat for parallel multi-agent execution
- Add AUTOGEN_VERSION environment variable for version control (auto/v0.2/v0.4)
- Maintain full backward compatibility with existing v0.2 implementation
- Auto-detect available versions with intelligent fallback logic
- Simplify tool integration for v0.4 (single AssistantAgent vs dual-agent pattern)
- Add proper termination conditions and error handling for v0.4

Resolves #935

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 17:08:28 +00:00
github-actions[bot]andMervin Praison 72c70ce050 fix: Replace deprecated Pydantic .dict() with .model_dump() in example files
- Fixed examples/python/api/secondary-market-research-api.py:443
- Fixed examples/python/concepts/reasoning-extraction.py:34
- Fixed ZeroScript_AI_TestExecutor.ipynb notebook
- Added test script to verify fixes work correctly
- Maintains backward compatibility with Pydantic v2
- Resolves PydanticDeprecatedSince20 warnings

Resolves #934

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 17:07:16 +00:00
Mervin Praison 6a13d2b971 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-15 17:57:12 +01:00
Mervin PraisonandMervin Praison fdc747a9c9 fix: Enhance session memory persistence and improve chat history management
- Improved session memory persistence for agent chat history
- Optimised methods for saving and restoring agent chat histories
- Ensured compatibility with existing code while enhancing functionality
- Addressed issues related to chat history loss during session transitions

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 17:57:11 +01:00
Mervin Praison f381b93ae9 Merge pull request #933 from MervinPraison/claude/issue-931-20250715_160543
feat: add comprehensive examples for missing PraisonAI features
2025-07-15 17:52:35 +01:00
Mervin Praison 9c44945123 chore: update numpy and scipy version constraints in dependency files 2025-07-15 17:50:01 +01:00
Mervin Praison a19748902d Merge pull request #932 from MervinPraison/claude/issue-930-20250715_141043
fix: Add session memory persistence for agent chat history
2025-07-15 17:48:02 +01:00
Mervin Praison fa1061a7aa Rename SESSION_MEMORY_FIX_REVIEW.md to examples/python/session/SESSION_MEMORY_FIX_REVIEW.md 2025-07-15 17:47:26 +01:00
github-actions[bot]andClaude 775d97671f fix: Fix session memory persistence by disabling embeddings and correcting search queries
- Fixed session memory persistence issue where state was not being restored correctly
- Disabled embeddings in default memory config to avoid OpenAI API key requirement
- Changed search queries from metadata-based to content-based for SQLite compatibility
- Fixed search query from "type:session_state" to "Session state:" to match stored content
- Fixed agent chat history search from "type:agent_chat_history" to "Agent chat history for"
- Session state persistence now works correctly across session save/restore cycles
- Agent chat history persistence now works correctly across session save/restore cycles
- Maintains backward compatibility with existing code
- Fixes #930

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Claude <[email protected]>
2025-07-15 16:31:10 +00:00
github-actions[bot]andMervin Praison 6c4f4d981d fix: Add missing increment_state method and improve chat history persistence
- Fix f-string issues on lines 275, 300 (remove unnecessary f prefixes)
- Fix chat history initialization to always set agent.chat_history even if empty
- Fix critical data loss bug in _save_agent_chat_histories method
- Now prioritizes live agent history but falls back to restored history
- Prevents chat history loss when agents aren''t re-instantiated after restore

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 16:19:19 +00:00
github-actions[bot]andMervin Praison 72395efd32 feat: add comprehensive examples for missing PraisonAI features
- Add hierarchical process orchestration examples
- Add RouterAgent cost optimization patterns
- Add advanced knowledge management with semantic chunking
- Add comprehensive guardrails with validation workflows
- Add advanced task management with conditional execution
- Add session management with persistence and recovery
- Add production telemetry with OpenTelemetry integration
- Add advanced workflow patterns with decision trees

Resolves #931: Create missing examples where features exist

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 16:16:49 +00:00
efa29de346 fix: Add missing increment_state method and improve chat history persistence
- Add increment_state method (lines 356-359) for numeric state management
- Fix empty chat history save condition to track agent existence properly
- Improve robustness by checking agent is not None before accessing chat_history
- Enhance memory persistence by saving even empty chat histories to track agent state

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Mervin Praison <[email protected]>
Co-Authored-By: Claude <[email protected]>
2025-07-15 16:13:36 +00:00
github-actions[bot]andMervin Praison 75462584b3 fix: Add session memory persistence for agent chat history
- Agent chat history now persists across session save/restore cycles
- Added _agents dictionary to track agent instances and chat histories
- Enhanced Agent() method to restore chat history in restored sessions
- Added helper methods for saving/restoring agent chat histories
- Modified save_state() to automatically save agent chat histories
- Modified restore_state() to automatically restore agent chat histories
- Backward compatible - existing code continues to work unchanged
- Fixes #930

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 14:31:24 +00:00
Mervin Praison d352adbdac chore: bump praisonai to v2.2.62 and praisonaiagents to v0.0.135 across all files 2025-07-15 15:11:32 +01:00
Mervin Praison 68664fdd55 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-15 15:04:19 +01:00
Mervin Praison bcda52cc44 chore: bump praisonai version from 2.2.60 to 2.2.61 across Docker and deployment files 2025-07-15 15:04:17 +01:00
Mervin Praison 4888dfb993 Merge pull request #928 from MervinPraison/claude/issue-926-20250715_112808
refactor: inline Gemini internal tools detection logic
2025-07-15 14:36:45 +01:00
github-actions[bot]andMervin Praison c5a3fc89cc refactor: inline Gemini internal tools detection logic
- Remove import dependency on is_gemini_internal_tool helper function
- Inline logic directly in llm.py and openai_client.py
- Maintain identical functionality and debug logging
- Handle valid tools: googleSearch, urlContext, codeExecution
- Properly skip unknown tools with appropriate logging
- Preserve backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 11:33:22 +00:00
Mervin Praison ca33559d4c Merge pull request #922 from MervinPraison/claude/issue-918-20250715_061404
fix: resolve Ollama sequential tool calling argument mixing issue
2025-07-15 12:24:28 +01:00
Mervin Praison b02449dfdb chore: bump praisonai to v2.2.60 and praisonaiagents to v0.0.134 2025-07-15 09:55:35 +01:00
Mervin Praison c4c0c1c146 Merge pull request #923 from MervinPraison/claude/issue-919-20250715_061529
fix: Add support for Gemini internal tools in tool formatting
2025-07-15 09:52:47 +01:00
Mervin Praison aa2d7e4c31 Merge pull request #924 from Dhivya-Bharathy/kimi2-agents-final
Add Kimi2_Intelligent_Agents: 10 specialized AI agents
2025-07-15 09:51:35 +01:00
Dhivya-Bharathy b339c5b3aa Add Kimi2_Intelligent_Agents: 10 specialized AI agents 2025-07-15 12:57:48 +05:30
github-actions[bot]andMervin Praison e535f98f4e refactor: optimize Gemini tools handling with shared utilities
- Extract GEMINI_INTERNAL_TOOLS constant to eliminate loop recreation
- Create shared is_gemini_internal_tool() utility function
- Remove code duplication between llm.py and openai_client.py
- Improve maintainability and performance based on reviewer feedback

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 06:40:42 +00:00
Mervin Praison bc349ad09f feat: restrict review comments to PRs only and update Claude bot instructions 2025-07-15 07:38:32 +01:00
Mervin Praison 5b8da1180e chore: clarify Claude review instructions to specify branch context 2025-07-15 07:29:21 +01:00
github-actions[bot]andMervin Praison 8f6d8f0a48 fix: Add support for Gemini internal tools in tool formatting
- Add explicit handling for Gemini internal tools (googleSearch, urlContext, codeExecution)
- Update docstrings to document new capability
- Resolves issue where Gemini internal tools were skipped with ''unsupported type'' error
- Maintains backward compatibility with existing tool formats

Closes #919

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 06:23:32 +00:00
github-actions[bot]andMervin Praison 3730b4d094 fix: resolve Ollama sequential tool calling argument mixing issue
- Add parameter validation method _validate_and_filter_ollama_arguments()
- Filter invalid parameters before tool execution for Ollama providers
- Prevent functions from receiving unexpected keyword arguments
- Add comprehensive test suite for validation functionality
- Maintain backward compatibility and graceful error handling

Fixes #918: Ollama sequential failing 3

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-15 06:21:08 +00:00
Mervin Praison 7f3810ed98 chore: add gh tool permission and update claude review comment with PR creation request 2025-07-15 07:19:48 +01:00
Mervin Praison c84a59ab4d feat: implement PostHog event tracking in telemetry module 2025-07-15 07:13:38 +01:00
Mervin Praison c6a6bfa827 Merge pull request #917 from MervinPraison/claude/issue-867-20250714_201010
feat: Add Gemini internal tools examples
2025-07-14 22:22:48 +01:00
github-actions[bot]andMervin Praison a604cd9584 fix: Replace eval() with safe AST-based expression evaluator and remove unused imports
- Replace insecure eval() usage with ast-based safe expression evaluator in README and combined examples
- Remove unused os imports from all Python example files
- Update comments to show import os inline for API key setup
- Addresses security vulnerabilities identified in code review

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 20:38:04 +00:00
github-actions[bot]andMervin Praison cb043da19c feat: Add Gemini internal tools examples
- Add Google Search tool example (gemini-google-search.py)
- Add URL Context tool example (gemini-url-context.py)
- Add Code Execution tool example (gemini-code-execution.py)
- Add combined tools example (gemini-internal-tools-combined.py)
- Add comprehensive documentation (README_GEMINI_INTERNAL_TOOLS.md)

These examples demonstrate how to use Gemini''s built-in internal tools
through PraisonAI''s existing tool system without any code changes.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 20:17:41 +00:00
Mervin Praison 7b41444aad refactor: move test files into src/praisonai-agents directory for better organization 2025-07-14 21:13:34 +01:00
Mervin Praison 7c8b77063f chore: bump praisonai to v2.2.58 and praisonaiagents to v0.0.132 across all files 2025-07-14 21:12:31 +01:00
Mervin Praison 59eb8d6356 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-14 21:07:47 +01:00
Mervin Praison 89bddc31c6 feat: add allowed tools configuration for Claude GitHub action workflow 2025-07-14 21:07:45 +01:00
Mervin Praison e6e908298b Merge pull request #916 from MervinPraison/claude/issue-878-20250714_190400
Fix: resolve duplicate callback execution in LLM interaction handling
2025-07-14 20:53:39 +01:00
Mervin Praison 2b3509c1d1 Delete reproduce_issue_878.py 2025-07-14 20:52:36 +01:00
Mervin Praison 6e8029055a Delete ISSUE_878_REPRODUCTION_GUIDE.md 2025-07-14 20:52:15 +01:00
Mervin Praison d2c9e8825a Merge pull request #915 from MervinPraison/claude/issue-911-20250714_190025
fix: add execute and aexecute methods to Agent class
2025-07-14 20:44:41 +01:00
Mervin Praison cd9816e218 Merge pull request #914 from MervinPraison/claude/issue-901-20250714_143624
Issue #901: Fix self-reflection with tools
2025-07-14 20:43:29 +01:00
Mervin Praison d400149075 chore: update claude review request message to include follow-up action 2025-07-14 20:42:15 +01:00
Mervin Praison 73b08e6b76 feat: add PR creation permissions and request in auto-issue workflow 2025-07-14 20:32:59 +01:00
github-actions[bot]andClaude 19c3a1f6a7 fix: address code review issues in test files
- Add missing sys.path setup to test_self_reflection_with_tools_verification.py
- Remove unnecessary f-string prefixes from print statements
- Add missing newlines at end of files for PEP 8 compliance

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-14 19:24:12 +00:00
71a7968318 fix: resolve duplicate callback execution in LLM interaction handling
- Fixed duplicate callback issue in src/praisonai-agents/praisonaiagents/llm/llm.py where callbacks were executed multiple times
- Added callback_executed flag to track and prevent duplicate callback invocations
- Ensured callbacks are only executed once per interaction, either through display_interaction or direct execute_sync_callback calls
- Improved generation_time consistency by calculating once and reusing the value
- Added comprehensive test files and reproduction scripts to verify the fix
- Added ISSUE_878_REPRODUCTION_GUIDE.md documenting the issue and solution

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Mervin Praison <[email protected]>
2025-07-14 19:15:39 +00:00
Mervin Praison 1b258229c1 Merge pull request #913 from MervinPraison/claude/issue-906-20250714_175631
fix: Add callback execution to synchronous display functions
2025-07-14 20:12:26 +01:00
github-actions[bot]andMervin Praison d0e09f51f3 fix: Ensure consistent callback execution across all display functions
- Fix async functions to use execute_callback() instead of direct async_display_callbacks access
- Add missing execute_sync_callback() calls to sync display functions (instruction, tool_call, error, generating)
- Ensures both sync and async callbacks are triggered consistently for all display types
- Maintains backward compatibility through existing parameter filtering

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 19:04:19 +00:00
github-actions[bot]andMervin Praison 5adc862ead fix: add execute and aexecute methods to Agent class for backward compatibility
Resolves AttributeError: type object ''Agent'' has no attribute ''execute''

- Added execute(task, context=None) method that delegates to chat()
- Added aexecute(task, context=None) method that delegates to achat()
- Both methods handle task objects with description attribute or string inputs
- Maintains complete backward compatibility with existing code
- Fixes issue #911

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 19:03:24 +00:00
Mervin Praison 856db54334 Merge pull request #912 from MervinPraison/claude/issue-904-20250714_171858
Fix issue #904: Loop task callback inheritance and enhanced metadata support
2025-07-14 19:58:26 +01:00
github-actions[bot]andMervin Praison f94e5bb3d6 fix: Add callback execution to synchronous display functions
Fixes the duplicate callback issue by:

- Adding execute_sync_callback calls to display_interaction and display_self_reflection
- Fixing test to patch the correct function location
- Ensuring backward compatibility by maintaining existing function signatures
- Adding comprehensive tests for callback system verification

This ensures that callbacks are called exactly once per LLM response while maintaining full backward compatibility.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 18:06:08 +00:00
Mervin Praison 1cece603ec Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-14 18:59:38 +01:00
Mervin Praison 9e2bbb9bbb refactor: update tool imports in test files from calculator to evaluate for improved clarity and consistency 2025-07-14 18:59:36 +01:00
Mervin Praison 35b4cff7f7 Merge pull request #910 from MervinPraison/claude/issue-905-20250714_163222
fix: resolve litellm.BadRequestError with unrecognized output_json/output_pydantic parameters
2025-07-14 18:44:18 +01:00
Mervin Praison a094d1ff30 Merge pull request #908 from MervinPraison/claude/issue-907-20250714_165230
fix: add string LLM support to LLMGuardrail for Gemini models
2025-07-14 18:43:11 +01:00
Mervin Praison 000bdf3418 refactor: move test files to src/praisonai-agents and bump version to 2.2.57 2025-07-14 18:40:18 +01:00
github-actions[bot]andMervin Praison 826ff56fc5 refactor: simplify LLMGuardrail string handling and consolidate imports
- Remove redundant if/else logic in string LLM initialization
- Consolidate duplicate LLM imports using _get_llm_class helper
- Maintain all functionality while improving code clarity
- Addresses code review feedback for cleaner, more maintainable code

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 17:31:52 +00:00
github-actions[bot]andClaude 4bd0195d5d Fix issue #904: Loop task callback inheritance and enhanced metadata support
- Add callback inheritance in all 6 locations where loop tasks create subtasks in process.py
- Implement enhanced callback metadata support in task.py with run_context tracking
- Ensure backward compatibility with existing callback implementations
- Maintain proper callback chain for nested loop executions

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-14 17:28:28 +00:00
Mervin Praison 812abec2eb Merge pull request #897 from MervinPraison/claude/issue-896-20250714_104106
feat: enhance callbacks with agent and task context (fixes #896)
2025-07-14 18:27:25 +01:00
github-actions[bot]andMervin Praison e58f6deb4b fix: resolve critical runtime issues in callback enhancement
- Fix undefined variables in llm.py response() and aresponse() methods
  by adding missing parameters to method signatures
- Fix backward compatibility by adding signature checking to callbacks
  in display_interaction(), execute_callback(), and execute_sync_callback()
- Ensure consistent parameter propagation in agent.py get_response calls
- Legacy callbacks now work without TypeError, new callbacks get full context

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 17:21:11 +00:00
Mervin Praison f23680c121 Merge pull request #903 from MervinPraison/claude/issue-899-20250714_122107
fix: exclude response_format parameter for Gemini image models
2025-07-14 18:01:38 +01:00
Mervin Praison e569400260 Merge pull request #902 from MervinPraison/claude/issue-901-20250714_140528
Issue #901: Changes from Claude
2025-07-14 17:57:58 +01:00
github-actions[bot]andMervin Praison 75c4d8432c fix: add string LLM support to LLMGuardrail for Gemini models
- Add _initialize_llm method to convert string identifiers to LLM instances
- Update __init__ to handle string LLM identifiers like ''gemini/gemini-2.5-flash-lite-preview-06-17''
- Maintain backward compatibility with existing LLM instances, dict configs, and None values
- Use same LLM initialization logic as Agent class for consistency
- Fixes issue #907 where LLMGuardrail failed with ''Unsupported LLM type'' error

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 16:57:24 +00:00
Mervin Praison 6249d14d3f Merge pull request #895 from MervinPraison/claude/issue-893-20250714_084251
fix: resolve Ollama sequential tool calling redundant execution issue
2025-07-14 17:55:05 +01:00
github-actions[bot]andMervin Praison 32537a227e fix: resolve litellm.BadRequestError with unrecognized output_json/output_pydantic parameters
- Fixed bug in _build_completion_params method where output_json and output_pydantic
  parameters were conditionally removed only when not None
- These custom parameters are now always removed before LiteLLM calls to prevent
  "Unrecognized request arguments supplied" errors
- Maintains backward compatibility and preserves all existing functionality
- Addresses issue #905

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 16:43:03 +00:00
Mervin Praison f83ffcdafe Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-14 17:27:52 +01:00
Mervin Praison 519aebd271 chore: bump praisonai to v2.2.56 and praisonaiagents to v0.0.130 across all files 2025-07-14 17:27:51 +01:00
github-actions[bot]andMervin Praison fb4ecf1893 fix: Address reviewer feedback on self-reflection test files
- Move test files from src/praisonai-agents/ to tests/ directory per repository guidelines
- Replace print statements and return values with proper assert statements
- Fix f-string issues without placeholders
- Add comprehensive exception handling for test failures
- Create improved test structure following repository patterns

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 14:55:27 +00:00
github-actions[bot]andMervin Praison 5a4cbf8aeb fix: improve robustness of Gemini model detection in ImageAgent
- Use self.llm_model property instead of self.llm for more robust model name resolution
- Handles all LLM configuration types (strings, dicts, custom instances, base_url configs)
- Fixes potential AttributeError when self.llm is not set
- Maintains backward compatibility for all existing configurations

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 14:54:16 +00:00
github-actions[bot]andMervin Praison 885a73f697 fix: add intelligent final answer detection to async method
Apply the same intelligent final answer detection logic that was added to the sync method (get_response) to the async method (get_response_async). This ensures consistent behavior between sync and async methods when detecting substantive final answers alongside tool calls.

The fix prevents redundant tool execution loops in async contexts by checking if the LLM provides substantive content (>10 characters) after tool execution, breaking the loop when appropriate.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 14:48:03 +00:00
Mervin Praison 9336f15e67 Merge pull request #900 from Dhivya-Bharathy/add-Notion_Workspace_Assistant
feat: Add Notion_Workspace_Assistant notebook
2025-07-14 15:47:31 +01:00
Mervin Praison 6d55cfa87e Merge branch 'main' into claude/issue-896-20250714_104106 2025-07-14 15:46:44 +01:00
Mervin Praison 0b431b1fe1 Merge pull request #894 from MervinPraison/claude/issue-876-20250714_062122
fix: handle single function as tools parameter to prevent iteration error
2025-07-14 15:43:51 +01:00
github-actions[bot]andMervin Praison e252f86ac9 fix: self-reflection now works with tools
- Fixed issue where self-reflection failed when tools were present
- Added tools=formatted_tools parameter to reflection regeneration calls
- Ensures tools remain available throughout the reflection process
- Maintains backward compatibility with existing code
- Resolves issue #901

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 14:43:12 +00:00
Mervin Praison ed395de6f3 Merge pull request #898 from Dhivya-Bharathy/add-Natural_Language_Codebase
Add Natural_Language_Codebase notebook
2025-07-14 15:42:26 +01:00
Mervin Praison 633469d12e Merge pull request #886 from MervinPraison/claude/issue-877-20250714_005101
fix: ensure callbacks work regardless of verbose setting
2025-07-14 15:41:40 +01:00
Mervin Praison c5c57dff26 Merge pull request #891 from MervinPraison/claude/issue-870-20250714_062116
feat: add support for Gemini embedding models
2025-07-14 15:40:47 +01:00
Mervin Praison 573b9efcc1 Rename docs/gemini-embeddings.md to examples/python/memory/gemini-embeddings.md 2025-07-14 15:40:21 +01:00
Mervin Praison dc4e51ac81 Merge pull request #883 from MervinPraison/claude/issue-872-20250714_005257
fix: enable true parallel execution for async tasks in sequential mode
2025-07-14 15:38:00 +01:00
Mervin Praison 08e211c693 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-14 15:33:32 +01:00
Mervin Praison abd8021925 chore: increase GitHub action comment delay from 20s to 30s 2025-07-14 15:33:32 +01:00
Mervin Praison 8a6c4eec7f Rename examples/python/tools/searxng-search.py to examples/python/tools/searxng/searxng-search.py 2025-07-14 15:31:47 +01:00
Mervin Praison 4e77a6a019 Rename examples/python/tools/trafilatura_example.py to examples/python/tools/trafilatura/trafilatura_example.py 2025-07-14 15:31:03 +01:00
Mervin Praison 41e33c09e0 Rename examples/python/tools/custom_trafilatura_tools.py to examples/python/tools/trafilatura/custom_trafilatura_tools.py 2025-07-14 15:30:54 +01:00
Mervin Praison 96f00e2172 Merge pull request #881 from MervinPraison/claude/issue-869-20250713_205041
feat: integrate Trafilatura for high-quality URL content extraction
2025-07-14 15:29:39 +01:00
github-actions[bot]andMervin Praison e858cebed9 fix: Enable self-reflection with tools in LLM class
- Fixed issue where self-reflection was not working when tools were present
- Added tools=formatted_tools parameter to completion calls during reflection regeneration
- Self-reflection now maintains tool access throughout the reflection process
- Backward compatibility maintained, no existing features removed
- Resolves issue #901

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 14:17:28 +00:00
Dhivya-Bharathy cca79bd9fc Add Notion_Workspace_Assistant notebook 2025-07-14 12:56:32 +00:00
github-actions[bot]andMervin Praison 4ffbc1b52a fix: exclude response_format parameter for Gemini image models
- Add detection logic to identify Gemini models (case-insensitive)
- Exclude response_format parameter for Gemini models to prevent litellm.UnsupportedParamsError
- Maintain backward compatibility for non-Gemini models
- Fixes #899

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 12:24:35 +00:00
DhivyaBharathy b948151a14 Update Natural_Language_Codebase.ipynb 2025-07-14 17:51:41 +05:30
Dhivya-Bharathy 11eee70d9a Add Natural_Language_Codebase notebook 2025-07-14 12:18:39 +00:00
github-actions[bot]andClaude da6a2c1c04 fix: improve tools parameter backward compatibility handling
Refactor tools parameter initialization to better handle falsy values while
maintaining single function support. Changed from explicit None check to
using ''tools or []'' pattern, which properly handles all falsy values
(None, False, 0, "", etc.) without breaking existing functionality.

This resolves backward compatibility regression where falsy values other
than None were not handled correctly in the tools parameter.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-14 11:59:51 +00:00
Mervin Praison 731268df5c Merge branch 'main' into claude/issue-877-20250714_005101 2025-07-14 12:55:28 +01:00
github-actions[bot]andMervin Praison d60021cb40 refactor: move Trafilatura from core to custom tool example
- Remove Trafilatura from core praisonaiagents package
- Create custom tool implementation in examples/python/tools/
- Update example to demonstrate custom tool usage with agents
- Remove dependencies from pyproject.toml
- Remove from tools __init__.py and README.md
- Keep all functionality as standalone custom tool

This change follows the request to not integrate into core package
but provide as custom tool example instead.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 11:55:10 +00:00
Mervin Praison 75894f26c1 Merge pull request #884 from MervinPraison/claude/issue-874-20250714_005622
fix: prevent infinite loop in parallel task execution
2025-07-14 12:52:35 +01:00
Mervin Praison c53e09480a Rename test_async_sequential.py to src/praisonai-agents/test_async_sequential.py 2025-07-14 12:51:46 +01:00
2ef506fa8a feat: enhance callbacks with agent and task context (fixes #896)
- Add agent_name, agent_role, agent_tools, task_name, task_description, task_id to callbacks
- Update display_interaction() and adisplay_interaction() to accept new parameters
- Enhance LLM.get_response() to accept and pass task context
- Modify Agent.chat() to accept task parameters
- Update task execution in agents.py to pass task information
- Maintain backward compatibility with existing callbacks
- Add test scripts to verify functionality

Co-authored-by: Mervin Praison <[email protected]>

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-14 10:53:46 +00:00
Mervin Praison 7ce783e59b Merge branch 'main' into claude/issue-893-20250714_084251 2025-07-14 11:11:05 +01:00
Mervin Praison 95ffd0c53f chore: bump PraisonAI to 2.2.55 and PraisonAI Agents to 0.0.129 across all files 2025-07-14 11:09:35 +01:00
Mervin Praison e1c90bf569 Merge pull request #880 from MervinPraison/claude/issue-866-20250713_204435
feat: Add multi-provider/multi-model support with intelligent routing
2025-07-14 11:07:02 +01:00
Mervin Praison 5fbd8aa783 Merge pull request #892 from MervinPraison/claude/pr-879-20250714_063758
fix: Improve Ollama sequential tool calling handling
2025-07-14 11:02:12 +01:00
381c86de79 fix: resolve callback duplication and validation timing issues
- Add callback_executed tracking in llm.py to prevent duplicate callbacks
- Fix validation timing in agent.py for output_json/output_pydantic flows
- Ensure guardrail validation runs even for JSON outputs
- Improve interaction display logic to avoid redundant callbacks

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Mervin Praison <[email protected]>
2025-07-14 08:52:55 +00:00
github-actions[bot]andClaude 35250e429e fix: clean up redundant conditionals and improve tool execution logic in llm.py
- Remove redundant conditional expressions that were causing unnecessary repetition
- Add intelligent final answer detection after tool execution
- Prevent unnecessary tool execution loops when LLM provides substantive response

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-14 08:51:02 +00:00
github-actions[bot]andClaude 3027937057 fix: prevent event loop blocking and refactor async task handling
- Replace deprecated asyncio.get_event_loop() with asyncio.get_running_loop()
- Fix event loop blocking issues in API and MCP server implementations
- Improve async handling consistency across the codebase

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-07-14 08:50:15 +00:00
github-actions[bot]andMervin Praison d79443868f refactor: Rename MultiModelAgent to RouterAgent for better clarity
- Renamed MultiModelAgent class to RouterAgent throughout codebase
- Updated multi_model_agent.py -> router_agent.py
- Updated all imports, exports, and references in:
  - src/praisonai-agents/praisonaiagents/agent/__init__.py
  - examples/python/agents/multi-provider-agent.py
  - examples/python/agents/MULTI_PROVIDER_README.md
  - src/praisonai-agents/test_multi_provider.py
- RouterAgent better reflects the primary purpose of intelligent model routing
- Maintains all existing functionality and backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 08:50:14 +00:00
github-actions[bot]andMervin Praison 6705e753e8 fix: Remove hardcoded regex logic from Ollama tool calling
- Remove explicitly prohibited hardcoded regex patterns
- Move import re to top of file (PEP 8 compliance)
- Extract duplicated message-building logic into helper method
- Define prompt constants at class level for maintainability
- Simplify tool result formatting without numeric extraction
- Maintain backward compatibility and existing functionality

Fixes code quality issues identified by automated review tools
while ensuring compliance with explicit PR requirements.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 08:49:03 +00:00
Mervin Praison b4d1532512 ci: prevent bot accounts from triggering Claude workflow action 2025-07-14 08:51:51 +01:00
Mervin Praison 4b5d3b2eda ci: remove max_turns limit from Claude code review workflow 2025-07-14 08:50:09 +01:00
Mervin Praison a1d4f3ee43 feat: add repository checkout step with fetch history in Claude workflow 2025-07-14 08:23:09 +01:00
Mervin Praison b5e930ff2e Merge pull request #889 from MervinPraison/claude/issue-873-20250714_005616
fix: use LLM abstraction instead of hardcoded OpenAI in hierarchical process
2025-07-14 08:13:08 +01:00
Mervin Praison 1a6a14f8f2 Merge pull request #887 from MervinPraison/claude/issue-878-20250714_005448
fix: prevent duplicate callback invocations in LLM response generation
2025-07-14 08:11:52 +01:00
Mervin Praison ca69de4c6a Merge pull request #885 from MervinPraison/claude/issue-875-20250714_005802
fix: Support GuardrailResult return type in guardrail functions (#875)
2025-07-14 08:09:05 +01:00
Mervin Praison 9b3d36e6d7 ci: remove redundant repository checkout step from Claude workflow 2025-07-14 08:07:07 +01:00
Mervin Praison a9359a0785 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-14 08:05:10 +01:00
Mervin Praison 4cb016c3ca feat: add Gemini structured output agent and enhance Claude workflow checkout 2025-07-14 08:05:08 +01:00
Mervin Praison d2e4776884 Merge pull request #888 from MervinPraison/claude/issue-871-20250714_005124
feat: Add Gemini structured output support
2025-07-14 07:52:18 +01:00
claude[bot]andMervin Praison 193b82aeba fix: Improve Ollama sequential tool calling handling
- Extract numeric values from tool results for better clarity
- Add explicit prompting for final answers after tool execution
- Handle empty initial responses from Ollama with retry logic
- Fix duplicate strip calls in response handling

This improves Ollama's ability to:
1. Understand numeric values from tool results
2. Generate proper final answers instead of returning None
3. Avoid getting stuck in infinite loops

Fixes the issue where Ollama was unable to properly chain tool calls
for sequential operations like getting a stock price and multiplying it.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:42:14 +00:00
claude[bot]andMervin Praison 029de283c4 refactor: extract duplicate workflow completion logic into helper method
- Created _check_all_tasks_completed() helper method to eliminate code duplication
- Both async and sync workflow methods now use the same completion check logic
- No functional changes, pure refactoring for better maintainability

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:40:00 +00:00
Mervin Praison 26376a77af Merge pull request #890 from Dhivya-Bharathy/grok4-agents-batch-upload
feat: Add 10 Grok4 Intelligent Agent Examples
2025-07-14 07:31:17 +01:00
claude[bot]andMervin Praison 7cb580bb12 fix: handle single function as tools parameter to prevent iteration error
- Fix LLM._log_llm_config to properly check if tools is a list/tuple before iterating
- Fix Agent.__init__ to wrap single callable tools in a list automatically
- Resolves "'function' object is not iterable" error when using LLMGuardrail
- Maintains full backward compatibility

Fixes #876

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:30:54 +00:00
claude[bot]andMervin Praison 06b458cc54 test: add test script for async task parallel execution
- Tests that async tasks run in parallel in sequential mode
- Verifies sync tasks wait for async tasks to complete
- Measures execution times to confirm parallel execution
- Helps validate the async task execution fix

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:28:30 +00:00
claude[bot]andMervin Praison e29c2fbe90 fix: prevent event loop blocking and refactor async task handling
- Use run_in_executor for sync tasks in both sequential and hierarchical processes
- Refactor duplicated async task gathering logic into flush_async_tasks helper
- Update to asyncio.get_running_loop() from deprecated get_event_loop()
- Maintains backward compatibility while fixing performance issues

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:28:21 +00:00
claude[bot]andMervin Praison 76032be618 feat: add support for Gemini embedding models
- Extract embedding model from embedder configuration in Memory class
- Replace hardcoded "text-embedding-3-small" with configurable model
- Support any embedding model available through LiteLLM
- Maintain backward compatibility (defaults to OpenAI model)
- Add documentation and examples for Gemini embeddings
- Update memory_example.py to show configuration options

Fixes #870

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:27:18 +00:00
claude[bot]andMervin Praison 80f5ba940b fix: address code review issues for Trafilatura integration
- Fix asyncio blocking by using asyncio.to_thread() for all synchronous calls in async functions
- Remove dead code: module-level __call__ function that would never be invoked
- Replace global variable with module-level trafilatura import for cleaner code
- Remove unused json import in test file
- Improve error detection from fragile string check to robust pattern
- Add clarifying comments about safe circular imports due to lazy loading

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:26:49 +00:00
devops-vestradata 65791781e2 Add 10 grok4 intelligent agent files 2025-07-14 11:56:23 +05:30
claude[bot]andMervin Praison ee66154b73 fix: ensure interaction_displayed flag prevents all duplicate callbacks
- Added missing interaction_displayed checks to reasoning steps display
- Added missing checks to self-reflection display logic
- Ensured flag is set after each display interaction
- Fixed both sync and async methods
- Added comprehensive test to verify the fix

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:24:34 +00:00
claude[bot]andMervin Praison 0dc51060d8 fix: resolve callback duplication and validation timing issues
- Remove callback execution from display functions to prevent duplication when verbose=True
- Add missing callback execution after streaming completes when verbose=False
- Move callbacks to execute AFTER guardrail validation to prevent inconsistent state
- Add _execute_callback_and_display helper method to reduce code duplication
- Ensure callbacks work consistently regardless of verbose setting

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:23:51 +00:00
claude[bot]andMervin Praison 2daae1f464 fix: Address critical issues with Gemini structured output implementation
- Add hasattr check before calling model_json_schema() to prevent AttributeError
- Centralize Gemini model detection logic with new _is_gemini_model() method
- Fix critical bug: Always remove output_json/output_pydantic from params before passing to litellm
- Fix model recognition to handle provider-prefixed models (e.g., 'google/gemini-1.5-pro')
- Ensure backward compatibility for all existing models

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:23:29 +00:00
claude[bot]andMervin Praison 81bcda0440 fix: correct LLM interface usage and improve code quality
- Remove duplicate output_json=True when using output_pydantic
- Add helper methods to reduce code duplication
- Improve test file to use proper assertions instead of sys.exit()
- Add unit tests for the new helper methods
- Fix TypeError handling in JSON parsing

This ensures the hierarchical workflow works correctly with all LLM providers.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:23:13 +00:00
claude[bot]andMervin Praison e269cc7bf2 fix: Improve guardrail validation and add missing type hints
- Fixed critical bug: validation now properly checks for GuardrailResult type instead of accepting any class with the same name
- Added missing TaskOutput type hints in example file
- Refactored conditional logic for better readability
- Maintains full backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 06:21:30 +00:00
Mervin Praison 66e5dfcb41 refactor: update Claude GitHub Action with simplified OAuth authentication and improved triggers 2025-07-14 03:08:02 +01:00
Mervin Praison ae3e69a286 feat: exclude @gemini triage command from issue review workflow 2025-07-14 02:48:11 +01:00
Mervin Praison 40ea6fe1aa ci: simplify Gemini trigger command from '@gemini review' to '@gemini' 2025-07-14 02:46:58 +01:00
Mervin Praison e30a7564be Merge pull request #879 from MervinPraison/claude/issue-854-20250713_205120
fix: Implement Ollama sequential tool calling fix
2025-07-14 02:20:07 +01:00
claude[bot]andMervin Praison fbd0a736f0 fix: Fix critical issues in multi-provider implementation
- Changed TaskComplexity from string Enum to IntEnum for proper ordering comparisons
- Fixed manual routing logic to use llm_model property correctly
- Removed private attribute access by storing api_key and base_url locally
- Improved context size estimation from char count to token approximation
- Removed unused imports (Callable, TaskComplexity, ModelProfile)
- Fixed unnecessary f-string in error message
- Added TODO for token tracking implementation
- Fixed inconsistent model names in documentation

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:16:18 +00:00
claude[bot]andMervin Praison eea9f757af fix: use LLM abstraction instead of hardcoded OpenAI in hierarchical process
- Replace direct OpenAI client instantiation with LLM class
- Support all LLM providers (Gemini, Anthropic, etc.) in manager tasks
- Remove unused OpenAI imports from process.py
- Fix issue #873 where hierarchical workflow required OpenAI API key

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:08:57 +00:00
claude[bot]andMervin Praison 02a8f075a6 fix: prevent duplicate callback invocations in LLM response generation
- Add interaction_displayed flag to track display_interaction calls
- Prevent duplicate callbacks in both sync and async get_response methods
- Fix addresses issue where callbacks fired twice for single task execution
- Maintain backward compatibility with no API changes

Fixes #878

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:08:54 +00:00
claude[bot]andMervin Praison 57c39653d6 feat: Add Gemini structured output support
- Add Gemini models to MODELS_SUPPORTING_STRUCTURED_OUTPUTS
- Implement native Gemini structured output using response_schema
- Maintain backward compatibility for OpenAI and other models
- Update _build_messages to skip prompt modification for Gemini
- Add response_mime_type and response_schema parameters for Gemini
- Pass output_json/output_pydantic through all completion calls

Fixes #871

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:06:59 +00:00
claude[bot]andMervin Praison 2f21d0f907 fix: Support GuardrailResult return type in guardrail functions (#875)
- Modified task.py to accept both GuardrailResult and Tuple[bool, Any] return types
- Updated _process_guardrail to handle GuardrailResult directly without conversion
- Added comprehensive test cases for both return types
- Updated documentation with GuardrailResult examples
- Maintains backward compatibility with existing Tuple[bool, Any] guardrails

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:05:39 +00:00
claude[bot]andMervin Praison e0caaf8421 fix: enable true parallel execution for async tasks in sequential mode
Previously, async tasks in sequential mode were awaited one-by-one, defeating 
the purpose of async execution. This fix collects async tasks and runs them 
in parallel using asyncio.gather(), ensuring:

- Async tasks run concurrently as intended
- Sync tasks still execute in order after async tasks complete
- Proper task completion and dependency handling

Fixes #872

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:05:27 +00:00
claude[bot]andMervin Praison 4bc35c3b6e test: add test scripts for callback fix verification
- test_callback_fix.py: Simple test to verify callbacks work with verbose=False
- test_issue_877.py: Comprehensive test reproducing the exact issue scenario
- Both tests verify that callbacks are executed regardless of verbose setting

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:05:20 +00:00
claude[bot]andMervin Praison 4fd9b863a6 fix: ensure callbacks work regardless of verbose setting
- Added execute_sync_callback helper function to trigger callbacks without display
- Updated LLM class to always execute interaction callbacks when responses are generated
- Updated Agent class to ensure callbacks work for direct OpenAI client usage
- Maintains backward compatibility - display output still controlled by verbose flag
- Fixes issue #877 where callbacks only worked when verbose=True

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:05:13 +00:00
claude[bot]andMervin Praison fc02392ddb fix: prevent infinite loop in parallel task execution by exiting workflow when all tasks complete
When all tasks are completed and workflow_finished is set to True, the workflow now immediately exits to prevent tasks from being reset to "not started" state. This fixes the issue where parallel tasks would repeat in a loop and the aggregator task would never run.

Fixes #874

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 01:03:39 +00:00
claude[bot]andMervin Praison 4564639f18 enhance: Improve Ollama provider detection
- Add check for "ollama" in base_url for custom configurations
- Support detection of custom Ollama ports beyond 11434
- More robust detection for various deployment scenarios

Co-authored-by: Mervin Praison <[email protected]>
2025-07-14 00:58:57 +00:00
claude[bot]andMervin Praison 16598104ab feat: integrate Trafilatura for high-quality URL content extraction
- Add trafilatura_tools.py with extract_content, extract_metadata, extract_text_only, and compare_extraction functions
- Register Trafilatura tools in __init__.py for easy imports
- Add trafilatura and newspaper3k as optional [web] dependencies
- Include comprehensive URL validation to prevent SSRF attacks
- Update tools README with Trafilatura documentation
- Add detailed example file showing various usage patterns
- Create test script for verification
- Maintain backward compatibility with existing URL extraction tools

Resolves #869

Co-authored-by: Mervin Praison <[email protected]>
2025-07-13 21:05:30 +00:00
claude[bot]andMervin Praison b5d13a2b7f fix: Implement Ollama sequential tool calling fix
Modified conversation format for Ollama to handle tool results properly:
- Assistant messages no longer include 'tool_calls' field for Ollama
- Tool results are passed as user messages with natural language format
- Prevents infinite loop of repeated tool calls

This allows Ollama to properly execute sequential tool calls as intended.

Fixes #854

Co-authored-by: Mervin Praison <[email protected]>
2025-07-13 20:55:34 +00:00
claude[bot]andMervin Praison 4622bcda43 feat: Add multi-provider/multi-model support with intelligent routing
- Add ModelRouter for intelligent model selection based on task complexity
- Create MultiModelAgent class supporting multiple models per agent
- Implement routing strategies: auto, cost-optimized, performance-optimized
- Add pre-configured profiles for 8+ popular models
- Include usage tracking and cost estimation
- Maintain full backward compatibility
- Add comprehensive examples and documentation

Fixes #866

Co-authored-by: Mervin Praison <[email protected]>
2025-07-13 20:53:06 +00:00
Mervin Praison 31bae3a231 chore: bump PraisonAI to 2.2.54 and update Gemini workflows 2025-07-13 21:49:21 +01:00
Mervin Praison 466bcfedd7 Merge pull request #863 from MervinPraison/gemini/issue-862-fix-async-loop
Fix #862: Agent gets stuck in infinite loop when running multiple async tasks
2025-07-13 20:46:57 +01:00
Mervin Praison c24bf80314 Merge pull request #858 from MervinPraison/gemini/issue-854-fix-ollama-sequential-1690000000
Fix #854: Ollama sequential still failing
2025-07-13 20:46:21 +01:00
Mervin Praison c36b3aee6e Merge pull request #865 from MervinPraison/gemini/issue-864-fix-parallel-task-loop
Fix #864: Fix parallel task loop
2025-07-13 20:45:55 +01:00
Mervin Praison 08512ba6d3 Merge pull request #861 from MervinPraison/gemini/issue-860-fix-hierarchical-llm-fallback
Fix #860: Hierarchical Process LLM Fallback
2025-07-13 20:43:53 +01:00
claude[bot]andMervin Praison 63ebfc0b54 fix: Complete removal of Ollama special handling for async method
This completes the fix for issue #854 by removing the Ollama special
handling from the async method (get_response_async) to match the sync
method fix. Also removes the now-unused _handle_ollama_model method.

The special handling was causing infinite loops in sequential tool
calling. By removing it, Ollama models now work correctly through
the standard litellm interface.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-13 19:21:40 +00:00
claude[bot]andMervin Praison b29269071d fix: properly handle parallel task reset logic to prevent infinite loops
- Uncommented the task reset logic that was causing issue #864
- Added check for async_execution to prevent resetting parallel tasks
- Preserves backward compatibility for non-parallel tasks that need rerun
- Fixes infinite loop issue while maintaining existing functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-13 19:14:59 +00:00
Gemini Bot b6a86bf348 Gemini: [Issue #864] Fix parallel task loop 2025-07-13 12:49:40 +00:00
Gemini Bot 02ba71be3d Gemini: [Issue #862] Fix infinite loop in async workflow 2025-07-13 12:17:37 +00:00
Gemini Bot e60f1c1aa1 Gemini: [Issue #860] Fix hierarchical process LLM fallback 2025-07-13 11:31:08 +00:00
Mervin Praison 450f237805 feat: add description field to TaskOutput in validation feedback tests 2025-07-13 01:17:26 +01:00
Mervin Praison 66e53fc82e refactor: move validation test files to src directory and update LLM model references 2025-07-13 01:09:52 +01:00
Mervin Praison 7e6ee5f9f2 chore: enhance variable handling in PR review workflow for improved clarity 2025-07-13 01:04:41 +01:00
Mervin Praison b669b9815d fix: correct variable interpolation syntax in PR review workflow 2025-07-13 00:50:39 +01:00
Mervin Praison 6d89cd603e chore: remove debug workflow trigger step from Gemini PR review action 2025-07-13 00:44:38 +01:00
Mervin Praison 6e955b5941 feat: restrict Gemini PR review to repo owners, members and collaborators 2025-07-13 00:34:48 +01:00
Mervin Praison 87a67b5f5d refactor: improve PR checkout logic in Gemini review workflow using dedicated step 2025-07-13 00:25:08 +01:00
Mervin Praison baec9cd0a4 fix: update checkout ref to handle both PR and issue comment triggers 2025-07-13 00:23:16 +01:00
Mervin Praison e144dc497d feat: allow all users to trigger Gemini PR review and add debug logging 2025-07-13 00:19:06 +01:00
Gemini Bot 8a77ab0ab5 Gemini: [Issue #854] Fix Ollama sequential tool calling loop 2025-07-12 23:10:23 +00:00
Mervin Praison 0034b5c964 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-13 00:04:14 +01:00
Mervin Praison 543c627374 feat: expand GitHub Actions permissions to include PR list and granular git commands 2025-07-13 00:04:13 +01:00
Mervin Praison 93154adf9e Merge pull request #857 from MervinPraison/gemini/issue-854-fix-ollama-sequential-fail
Fix #854: Ollama sequential tool calling failing
2025-07-13 00:03:55 +01:00
Gemini Bot 3ab2462d96 Gemini: [Issue #854] Fix Ollama sequential tool calling loop 2025-07-12 23:00:05 +00:00
Mervin Praison aecf65a130 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-12 23:52:47 +01:00
Mervin Praison 0a453d30a2 chore: add .gemini and issue_details.json to gitignore 2025-07-12 23:52:46 +01:00
Mervin Praison 354a2c717b Merge pull request #856 from MervinPraison/gemini/issue-854-fix-ollama-sequential
Fix #854: Ollama sequential tool calling failing
2025-07-12 23:52:38 +01:00
Mervin Praison 62514fbef4 Delete issue_details.json 2025-07-12 23:51:43 +01:00
Mervin Praison f3c77a2e8b Delete .gemini/settings.json 2025-07-12 23:51:32 +01:00
Gemini Bot 50dde4fa02 Gemini: [Issue #854] Fix Ollama sequential tool calling 2025-07-12 22:45:09 +00:00
Mervin Praison bbc4530329 chore: bump version to 2.2.53 and update dependencies across package files 2025-07-12 23:43:01 +01:00
Mervin Praison aab975bec7 Merge pull request #851 from MervinPraison/claude/issue-846-20250712_220811
fix: handle None response_text in Ollama sequential tool calls
2025-07-12 23:28:38 +01:00
Mervin Praison 50c50fa567 Merge pull request #849 from MervinPraison/claude/issue-845-20250712_183232
fix: enable sequential tool execution in OpenAI client
2025-07-12 23:27:54 +01:00
claude[bot]andMervin Praison 68f280634a refactor: remove dead code from sequential tool execution logic
- Remove unused should_continue variable and related logic
- Simplify code by removing special handling for sequentialthinking tool
- Add clear comments explaining the sequential execution behavior

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 22:16:05 +00:00
Mervin Praison 346488fbec Delete test_sequential_fix.py 2025-07-12 23:15:10 +01:00
claude[bot]andMervin Praison 57b5a1fd8d fix: handle None response_text in Ollama sequential tool calls
- Add None checks before calling .strip() on response_text
- Fixes 'NoneType' object has no attribute 'strip' error with Ollama models
- Applied pattern: response_text.strip() if response_text else ""
- Fixed 14 locations where .strip() was called without None checks
- Ensures backward compatibility by returning empty string instead of None

Fixes issue #846

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 22:11:55 +00:00
claude[bot]andMervin Praison d75a5bb728 test: add assertions to test_sequential_fix.py for automated testing
- Add proper assertions to verify sequential tool execution results
- Improve multiply function docstring with complete Args and Returns sections
- Add success message when all assertions pass

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 22:10:09 +00:00
Mervin Praison 519ecc025a feat: update allowed commands in GitHub workflow files for Gemini reviews 2025-07-12 21:21:23 +01:00
Mervin Praison 8290b95132 refactor: update issue review prompt with clearer instructions and dynamic commands 2025-07-12 21:01:13 +01:00
Mervin Praison 3d95e1ff0e feat: add read_file permission to Gemini PR review workflow 2025-07-12 20:55:41 +01:00
Mervin Praison 74405d1bbe feat: add read_file permission to Gemini issue review workflow 2025-07-12 20:54:59 +01:00
Mervin Praison d307c3857c feat: add environment variables for Gemini CLI action in GitHub workflow 2025-07-12 20:54:31 +01:00
Mervin Praison fbe5dddaae chore: disable telemetry in GitHub workflow configurations 2025-07-12 20:45:20 +01:00
Mervin Praison 7e4108918d fix: move GH_TOKEN to local env scope in GitHub workflow 2025-07-12 20:40:04 +01:00
Mervin Praison da7e38100e feat: add GitHub workflow for automated issue review using Gemini AI 2025-07-12 20:36:37 +01:00
Mervin Praison 848459b816 feat: add edit, web-fetch, web-search and memoryTool permissions while removing telemetry setup 2025-07-12 20:35:19 +01:00
Mervin Praison cd63845398 feat: add git command to allowed shell commands in PR review workflow 2025-07-12 20:31:18 +01:00
Mervin Praison 7827427dc0 feat: move Gemini PR review action to dedicated directory with configuration 2025-07-12 20:16:47 +01:00
Mervin Praison 0e378d0754 feat: add GitHub workflows for Gemini issue triage and PR review automation 2025-07-12 20:03:05 +01:00
Mervin Praison 206022eb9c refactor: simplify auto-comment workflows by removing multi-agent review requirement 2025-07-12 19:48:23 +01:00
Mervin Praison 901ba8074d Delete test_sequential_fix.py 2025-07-12 19:40:42 +01:00
claude[bot]andMervin Praison 953ee6e7bd fix: enable sequential tool execution in OpenAI client
Removes premature loop termination after tool execution to allow
sequential tool calls. The model can now see tool results and make
additional tool calls as needed.

Fixes #845

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 18:36:00 +00:00
Mervin Praison 181d7e1ede feat: bump PraisonAI to v2.2.52 and add sequential agent examples for OpenAI/Ollama 2025-07-12 19:12:05 +01:00
Mervin Praison 4039878422 Merge pull request #842 from MervinPraison/claude/issue-839-20250712_075350
fix: allow agents to continue with sequential tool calls
2025-07-12 19:04:25 +01:00
Mervin Praison 461eba18d5 Delete src/praisonai/tests/unit/test_sequential_tool_calling.py 2025-07-12 19:03:44 +01:00
claude[bot]andMervin Praison 331a1de610 test: add comprehensive test suite for sequential tool calling
This test file validates the fix for issue #839, ensuring agents can:
- Execute multiple tools in sequence
- Pass results between tool calls
- Return final combined results without empty responses

Tests include:
- Sequential execution of 2 and 3 tools
- Multiple agents with sequential tools
- Mocked LLM responses
- Edge case prevention for empty responses

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 18:00:27 +00:00
claude[bot]andMervin Praison 91632eb5e4 fix: correct Ollama return statement and variable reference for sequential tool calling
- Replace early return with loop continuation in Ollama handling to match async behavior
- Fix variable reference from reasoning_content to stored_reasoning_content
- Ensures agents can perform sequential tool calls as intended

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 17:54:53 +00:00
Mervin Praison ad46225483 Rename src/praisonai/tests/unit/test_fix_comprehensive.py to src/praisonai-agents/tests/test_fix_comprehensive.py 2025-07-12 18:50:30 +01:00
Mervin Praison 9af6758eb6 Delete test_fix.py 2025-07-12 18:48:37 +01:00
Mervin Praison aac67a6572 Rename test_fix_comprehensive.py to src/praisonai/tests/unit/test_fix_comprehensive.py 2025-07-12 18:47:35 +01:00
claude[bot]andMervin Praison 2ceff9bfae fix: correct indentation error in async streaming code
Fixed SyntaxError caused by incorrect indentation in the async version of get_response_async method. The if/else blocks for streaming vs non-streaming approaches now have proper indentation.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 17:41:09 +00:00
claude[bot]andMervin Praison 3b7af02bea fix: correct indentation error in async streaming code
Fixed IndentationError at line 1325 where the async for loop was not properly
indented under the if verbose: block. Also corrected the indentation of the
else block for non-verbose streaming.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 17:33:23 +00:00
Mervin Praison 1ee7cfa2ef Merge pull request #844 from MervinPraison/claude/issue-840-20250712_172354
docs: add OLLAMA_HANDLING.md to explain ollama_handled flag usage
2025-07-12 18:32:16 +01:00
claude[bot]andMervin Praison b01bd41574 fix: add sequential tool calling support to async get_response_async method
- Add while loop structure with max_iterations and iteration_count
- Replace return statements with loop continuation after tool execution
- Store reasoning content across iterations for proper display
- Update final response handling to use stored values from iterations
- Ensure async behavior matches sync version for issue #839

This resolves the inconsistency where async agents would return empty
responses after first tool call instead of continuing with additional
required tool calls.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 17:27:37 +00:00
claude[bot]andMervin Praison 6570e445b8 docs: add OLLAMA_HANDLING.md to explain ollama_handled flag usage
Add documentation to clarify that ollama handling is correctly implemented
in llm.py and not in agent.py, addressing issue #840

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 17:25:07 +00:00
Mervin Praison b421bcf925 Merge pull request #843 from MervinPraison/claude/issue-841-20250712_080725
fix: add return_dict=True to fix TypeError in prompt_chaining tests
2025-07-12 18:24:24 +01:00
claude[bot]andMervin Praison 41d0998b76 fix: preserve reasoning_steps functionality with sequential tool calling
- Add stored_reasoning_content to capture reasoning after tool execution
- Restore reasoning_steps handling after tools while keeping loop continuation
- Update final response display to include stored reasoning when available
- Return reasoning content when reasoning_steps=True and content exists

This ensures backward compatibility while maintaining the sequential tool calling fix

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 08:41:06 +00:00
claude[bot]andMervin Praison 393e0ee33d fix: document async limitation and ensure consistent behavior
- Added clear documentation that async version doesn't support sequential tool calling
- Reverted incomplete async implementation to avoid breaking existing functionality
- Sync version retains the fix for sequential tool calling (issue #839)
- Created a known limitation that needs to be addressed in a future PR

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 08:40:25 +00:00
claude[bot]andMervin Praison 0dce4de4a4 fix: add return_dict=True to fix TypeError in prompt_chaining tests
The workflow.start() method returns a string by default (for backward compatibility),
but the test files were expecting a dictionary. Fixed by adding return_dict=True
parameter to get the expected dictionary format with task_results and task_status keys.

Fixes #841

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 08:23:56 +00:00
Mervin Praison 7fe4b48c6e fix: update LLM model and refine agent instruction
Changed the LLM model from "openai/gpt-4o-mini" to "gemini/gemini-2.5-pro" for improved performance. Updated the agent's instruction to provide clearer context for the task, enhancing user interaction.

Also, optimised the suggest_fixes function to handle both dictionary and string inputs, improving its flexibility in suggesting fixes based on issue type.

This minimal change aims to enhance the functionality while maintaining existing code integrity.
2025-07-12 09:22:33 +01:00
claude[bot]andMervin Praison 5286912f34 test: add test scripts for sequential tool calling fix
Add test scripts to verify the fix for issue #839 works correctly
with both Gemini and GPT-4 models.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 08:01:18 +00:00
claude[bot]andMervin Praison d6cb1c0165 fix: allow agents to continue with sequential tool calls
After executing tool calls, the agent now continues the iteration loop
instead of immediately trying to get a final response. This allows the
LLM to decide if more tools are needed to complete the task.

Fixes issue where agents would return empty responses after the first
tool call instead of continuing with additional required tool calls.

Resolves #839

Co-authored-by: Mervin Praison <[email protected]>
2025-07-12 08:01:10 +00:00
Mervin Praison 08ed3f94dc Merge pull request #836 from MervinPraison/claude/issue-835-20250711_234446
fix: capture final response after tool execution in LLM
2025-07-12 01:10:32 +01:00
Mervin Praison d3bfbc4b92 Delete test_issue_835.py 2025-07-12 01:00:19 +01:00
claude[bot]andMervin Praison af7081d294 fix: capture final response after tool execution in LLM
When an agent executes tools and the final iteration contains the answer
without additional tool calls, ensure the response text is properly captured
and returned instead of returning empty/None.

This fixes the issue where agents with multiple tools would return empty
responses after successfully executing tools.

Fixes #835

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 23:52:25 +00:00
Mervin Praison 3b2f26699e Merge pull request #834 from MervinPraison/claude/pr-832-20250711_232348
PR #832: Changes from Claude
2025-07-12 00:42:58 +01:00
claude[bot]andMervin Praison 7aa61b9155 fix: pass stream parameter from Agent to LLM
The Agent class was not passing the stream parameter to the LLM's get_response() method, causing the LLM to always use its default stream=True behavior regardless of the Agent's configuration.

This fix ensures that when an Agent is created with stream=False or when chat() is called with stream=False, this preference is properly passed to the LLM.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 23:31:50 +00:00
Mervin Praison 7e37c940d4 feat: upgrade praisonai to v2.2.51 and add aiohttp dependency to praisonaiagents v0.0.125 2025-07-12 00:28:17 +01:00
Mervin Praison 2199a57dfe Merge pull request #832 from MervinPraison/claude/issue-824-20250711_155141
fix: sequential tool calling for non-streaming responses
2025-07-12 00:19:42 +01:00
Mervin Praison d49f046322 Rename test_sequential_tool_calling.py to src/praisonai-agents/test_sequential_tool_calling.py 2025-07-12 00:14:28 +01:00
claude[bot]andMervin Praison c16c2e38af fix: improve sequential tool calling for non-streaming responses
- Fixed Ollama handling to properly separate streaming/non-streaming modes
- Added robust error handling for response extraction
- Fixed test file to use correct stream parameter
- Ensures tool outputs are processed by LLM in non-streaming mode

Addresses review feedback on PR #832

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 18:24:18 +00:00
Mervin Praison b5df9f323c Merge pull request #833 from MervinPraison/claude/issue-831-20250711_173321
fix: centralize logging configuration to respect LOGLEVEL environment variable
2025-07-11 19:05:06 +01:00
claude[bot]andMervin Praison 6e4abeef52 fix: ensure consistent logger levels across modules
- Change third-party logger levels from ERROR to WARNING in llm/__init__.py
  to match the centralized configuration
- Remove root logger override in knowledge.py that was ignoring LOGLEVEL
  environment variable

This ensures the LOGLEVEL environment variable is properly respected
throughout the application.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 17:58:02 +00:00
claude[bot] 5656570172 chore: remove test_logging.py from root - should be in tests directory
The test script was helpful for verifying the fix but should not be in the package root.
2025-07-11 17:44:52 +00:00
claude[bot]andMervin Praison c08c7cfedf fix: centralize logging configuration to respect LOGLEVEL environment variable
- Move logging configuration to top of __init__.py to ensure it runs before any imports
- Remove duplicate logging.basicConfig from llm/__init__.py that was overriding settings
- Clean up main.py to remove redundant logging configuration
- Add test_logging.py script to verify the fix works correctly

This ensures that the LOGLEVEL environment variable (DEBUG, INFO, WARNING, ERROR) properly controls logging verbosity throughout the package.

Fixes #831

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 17:44:18 +00:00
Mervin Praison fbbe80fd4d Merge pull request #829 from MervinPraison/claude/issue-827-20250711_151456
fix: add validation feedback to workflow retry logic
2025-07-11 17:27:46 +01:00
claude[bot]andMervin Praison cabddd9a22 refactor: extract validation failure decisions to class constant
- Add VALIDATION_FAILURE_DECISIONS constant to avoid duplication
- Update all references to use the constant
- Improve maintainability for future additions

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 16:05:19 +00:00
claude[bot]andMervin Praison 20b838f36a fix: handle non-streaming responses after tool execution for sequential tool calling
- Fixed issue where tool outputs were returned directly to user when stream=False
- Added proper handling for non-streaming responses after tool calls
- Maintains backward compatibility with existing streaming behavior

Fixes #824

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 15:59:04 +00:00
claude[bot]andMervin Praison cf149a3c2d fix: add validation feedback to workflow retry logic
When validation fails, retry tasks now receive:
- The validation failure reason
- The rejected output that failed validation  
- Clear instructions to try a different approach

This allows context-dependent tasks to improve on retry instead of
repeating the same invalid output.

Fixes #827

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 15:24:52 +00:00
Mervin Praison 30f6f5706c Merge pull request #826 from MervinPraison/claude/issue-823-20250711_111524
feat: Implement MCP HTTP Stream transport
2025-07-11 16:05:43 +01:00
claude[bot]andMervin Praison 0423c9c4af fix: address code review issues in HTTP Stream implementation
- Fix error propagation in write_stream method
- Add proper shutdown handling in SSE listener to prevent resource leaks
- Implement proper type annotations based on schema types
- Add _closing flag to gracefully stop SSE listener
- Create basic test to verify transport selection logic

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 14:08:58 +00:00
claude[bot]andMervin Praison be82abfac3 feat: Implement MCP HTTP Stream transport
- Add HTTP Stream transport implementation with single endpoint architecture
- Support both batch (JSON) and stream (SSE) response modes
- Implement session management with Mcp-Session-Id header
- Maintain full backward compatibility with SSE transport
- Add aiohttp dependency for HTTP client functionality
- Create usage examples and test file

Closes #823

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 11:27:37 +00:00
Mervin Praison 4af6228f89 feat: add automated PR review comment workflow for Claude integration 2025-07-11 11:59:45 +01:00
Mervin Praison 33eaf34ffb feat: bump PraisonAI to v2.2.50 and add Gemini agent tools implementation 2025-07-11 11:50:25 +01:00
Mervin Praison e2512b38c0 Merge pull request #814 from Dhivya-Bharathy/grok4-10-new-agents
Add 10 New Grok4 Intelligent Agents Covering Diverse Domains
2025-07-11 11:46:42 +01:00
Mervin Praison b02cda252d Merge pull request #819 from MervinPraison/claude/issue-818-20250711_091438
fix: enable tool calling for Gemini models
2025-07-11 11:42:43 +01:00
Mervin Praison 2a4b369e15 Rename test_tool_fix_improved.py to src/praisonai/tests/unit/test_tool_fix_improved.py 2025-07-11 11:42:29 +01:00
Mervin Praison c0a9e55f6a Rename test_tool_fix_example.py to src/praisonai/tests/unit/test_tool_fix_example.py 2025-07-11 11:42:12 +01:00
Mervin Praison 7c4b28885d Rename test_tool_fix_documentation.md to src/praisonai/tests/unit/test_tool_fix_documentation.md 2025-07-11 11:41:56 +01:00
Mervin Praison b0ec8b9a22 Rename test_gemini_tool_choice.py to src/praisonai/tests/unit/test_gemini_tool_choice.py 2025-07-11 11:41:32 +01:00
Mervin Praison 1b5cf2baea Rename test_async_gemini_fix.py to src/praisonai/tests/unit/test_async_gemini_fix.py 2025-07-11 11:41:19 +01:00
claude[bot]andMervin Praison b1cc2c31ce fix: enable tool calling for async agents with Gemini models
- Created _build_system_prompt method to centralize system prompt generation
- Fixed async achat to use correct tools parameter (was always using self.tools)
- Both sync and async now use enhanced system prompt with tool information
- Added comprehensive async agent test to verify the fix

This resolves the issue where async agents would claim no internet access
even when tools were available.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 10:15:56 +00:00
claude[bot]andMervin Praison 2a40c57033 feat: enhance Gemini tool calling fix with improved error handling
- Add comprehensive error handling for tool name extraction
- Support MCP tools with to_openai_tool method
- Improve Gemini model detection to handle variants
- Add litellm.supports_function_calling check
- Fix potential TypeError with nested dictionary access
- Update documentation with improvements
- Add comprehensive test example

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 09:59:39 +00:00
claude[bot]andMervin Praison 350d6e6488 fix: improve Gemini tool calling implementation
- Fix model prefix inconsistency (add 'gemini-' prefix check)
- Add debug logging when tool_choice='auto' is set for Gemini models
- Add error handling for tool name extraction
- Add test to verify tool_choice behavior for different models

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 09:54:05 +00:00
Mervin Praison 20a49ffd70 refactor: optimise test_autoagents.py for clarity and consistency
- Updated tool configurations to use string names instead of Mock objects for better clarity.
- Simplified the test for custom API key and base URL, ensuring parameters are stored correctly.
- Enhanced comments to improve understanding of the test setup and expected behaviour.

These changes improve the readability and maintainability of the test suite while ensuring accurate validation of configurations.
2025-07-11 10:42:57 +01:00
Mervin Praison 4bf9916c5f refactor: update test_autoagents.py to improve validation scenarios
- Introduced an invalid configuration to simulate validation failures in tests.
- Updated the first response to reflect the new invalid config structure.
- Simplified mock client configuration by using a sample valid config for structured output.

These changes enhance the robustness of the test cases while ensuring clarity in error handling scenarios.
2025-07-11 10:36:17 +01:00
claude[bot]andMervin Praison 9764483f36 fix: enable tool calling for Gemini models
- Enhanced system prompt to explicitly mention available tools
- Added tool_choice='auto' for Gemini models to encourage tool usage
- Maintains full backward compatibility
- Added test example and documentation

Fixes #818 where agents using Gemini models were not calling tools

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 09:27:37 +00:00
Mervin Praison ff405be834 refactor: enhance test_autoagents.py with improved mock configuration
- Updated the first response to use a malformed JSON string for clarity in error simulation.
- Introduced a serializable configuration for the mock client to ensure valid data handling in tests.
- Enhanced comments for better understanding of the test setup and scenarios.

These changes improve the clarity and robustness of the test cases while maintaining the integrity of the testing framework.
2025-07-11 10:23:21 +01:00
Mervin Praison 6d384a96ca refactor: improve test_autoagents.py for clarity and validation
- Updated comments for better understanding of test cases.
- Modified task configuration to create a valid config before simulating error conditions.
- Changed patch references from 'praisonaiagents.agents.autoagents.supports_structured_outputs' to 'praisonaiagents.llm.supports_structured_outputs' for consistency across tests.

These changes enhance the readability and maintainability of the test suite while ensuring accurate validation scenarios.
2025-07-11 10:18:13 +01:00
Mervin Praison 6770996c8b Merge pull request #812 from MervinPraison/claude/issue-795-20250710_222918
Claude/issue 795 20250710 222918
2025-07-11 10:06:12 +01:00
claude[bot]andMervin Praison 93c7731ccb fix: resolve code quality issues and unreachable code in agent.py
- Remove unused variable final_response_text
- Fix multimodal prompt normalization fallback to use empty string instead of str(prompt)
- Fix inconsistent variable usage: use original_prompt instead of prompt in display_interaction and _apply_guardrail_with_retry calls
- Remove unnecessary f-string where no interpolation is needed
- Fix unused exception variable by removing 'as e' where e is not used

These changes improve code quality while maintaining backward compatibility and ensuring the handoff fix continues to work correctly.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 08:29:20 +00:00
Mervin Praison 2057c68a20 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI into pr-812-handoff-fix 2025-07-11 09:16:11 +01:00
Mervin Praison 1ca928a2e4 Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-11 09:09:32 +01:00
Mervin Praison 66ea9d7148 fix: enhance unit tests for AutoAgents class
- Added dynamic import handling for AutoAgents and related classes to prevent ImportError.
- Refactored test cases to create AutoAgents instances without invoking __init__ to avoid unnecessary API calls.
- Improved mock handling in tests to ensure proper validation and response checks.
- Ensured structured output support is correctly mocked across various test scenarios.
- Maintained existing functionality while optimising test structure for clarity and maintainability.
2025-07-11 09:09:31 +01:00
Mervin Praison 74a71807a6 Merge pull request #816 from MervinPraison/claude/issue-813-20250711_070340
fix: add missing HostedMCPServer class for MCP server implementations
2025-07-11 09:06:39 +01:00
Mervin Praison 9e92e85a72 Update pyproject.toml 2025-07-11 08:53:35 +01:00
Mervin Praison 6d827a45c8 Update pyproject.toml 2025-07-11 08:53:01 +01:00
Mervin Praison aabaaa6318 Update pyproject.toml 2025-07-11 08:52:38 +01:00
Mervin Praison f518bd301a Update pyproject.toml 2025-07-11 08:52:14 +01:00
Mervin Praison 834f710cf6 chore: update PraisonAI and related package versions to 2.2.49 and 0.0.123
- Updated PraisonAI version from 2.2.48 to 2.2.49 across Dockerfiles, README, and Ruby formula.
- Incremented praisonaiagents version from 0.0.122 to 0.0.123 in relevant files.
- Ensured consistency in package versions for improved stability and functionality.
2025-07-11 08:50:14 +01:00
Mervin Praison ede71a7fbe Merge pull request #817 from MervinPraison/claude/issue-815-20250711_070741
fix: resolve SyntaxError in autoagents.py
2025-07-11 08:47:11 +01:00
claude[bot]andMervin Praison 7c751c88a3 fix: resolve test failures in autoagents.py
- Use client.parse_structured_output instead of client.beta.chat.completions.parse
- Change llm_instance.response to llm_instance.get_response for structured output support
- Fixes AttributeError: 'OpenAIClient' object has no attribute 'beta'
- Fixes TypeError: Object of type ModelMetaclass is not JSON serializable

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:42:53 +00:00
claude[bot]andMervin Praison 17f3aab1e1 refactor: complete moving HostedMCPServer to examples folder
- Add hosted_server.py to examples/python/custom_tools/
- Update documentation to clarify this is an example implementation
- Keep starlette dependency as it's still used by Agent.launch() for MCP

This makes HostedMCPServer an example implementation rather than
a core package component.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:41:27 +00:00
claude[bot]andMervin Praison 028fa8158d refactor: move HostedMCPServer from core package to examples folder
- Move hosted_server.py to examples/python/custom_tools/
- Update import in mcp_server_latency_example.py to use local file
- Remove HostedMCPServer from core package exports

This keeps HostedMCPServer as an example implementation rather than
a core package component, as requested.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:39:24 +00:00
claude[bot]andMervin Praison c62685adc5 fix: remove dead code and add missing reflection continuation logic
- Remove unreachable code after while True loop (lines 1414-1429)
- Add missing reflection continuation code for non-satisfactory reflections
- Fix unnecessary f-string prefix in error message
- Fixes syntax error preventing test imports

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:29:52 +00:00
claude[bot]andMervin Praison 60d6178310 fix: add missing newline at end of autoagents.py to prevent parser errors
Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:26:59 +00:00
claude[bot]andMervin Praison b198154b71 fix: resolve SyntaxError and improve code structure in autoagents.py
- Fixed incorrect indentation causing SyntaxError on line 436
- Removed duplicate llm_instance creation and OpenAI detection logic
- Cleaned up nested try-except blocks for better readability
- Preserved backward compatibility with OpenAI structured outputs
- Maintained all error handling and retry mechanisms
- Fixed logic flow to properly check for OpenAI support once per retry

This minimal fix addresses the critical syntax issues while maintaining
all existing functionality.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:26:44 +00:00
claude[bot]andMervin Praison 205de2ba0b fix: improve HostedMCPServer implementation
- Remove unnecessary ABC inheritance and unused imports
- Add proper error handling for uninitialized MCP server
- Improve error messages for better debugging

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:23:48 +00:00
claude[bot]andMervin Praison ee668b2711 fix: resolve code quality issues and unreachable code in agent.py
- Fix unreachable reflection continuation code by moving it outside max reflections if block
- Remove unused variable final_response_text
- Fix unnecessary f-string without placeholders
- Correct prompt normalization: use original_prompt instead of prompt in display/guardrail calls
- Maintain backward compatibility while fixing handoff functionality

These changes address issues identified by multiple code reviewers while preserving
the core fix for handoff functionality (issue #795).

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:23:34 +00:00
claude[bot]andMervin Praison a5bbb65017 fix: resolve IndentationError in autoagents.py
- Fixed indentation issues that caused SyntaxError on line 360
- Removed duplicate OpenAI client initialization logic
- Properly indented the LLM instance creation and response parsing code
- Maintained backward compatibility with existing functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:23:30 +00:00
claude[bot]andMervin Praison 6296755ebb fix: add missing newline at end of autoagents.py to prevent parser errors
Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:21:07 +00:00
claude[bot]andMervin Praison 4b6c847260 fix: resolve SyntaxError in autoagents.py by fixing indentation and uninitialized variables
- Fixed incorrect indentation from line 347 onwards that caused the SyntaxError
- All code from line 347-435 is now properly indented inside the else block
- Added initialization of `use_openai_structured` and `client` variables at the start of each retry loop to prevent NameError
- Preserved duplicate OpenAI detection logic for backward compatibility

Fixes #815

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:19:17 +00:00
Mervin Praison 2fc459fe05 chore: correct string escape sequences in test-core.yml
- Adjusted escape sequences for environment variable retrieval and print statements to ensure proper formatting and clarity in the workflow file.
2025-07-11 08:18:05 +01:00
Mervin Praison 1c3c2941cc chore: enhance review comments in automated workflows for clarity
- Updated the body of comments in auto-issue-comment.yml and auto-pr-comment.yml to include a note on minimal code changes, ensuring clarity while maintaining guidance for backward compatibility and testing.
2025-07-11 08:15:20 +01:00
Mervin Praison 6e38a88cd3 chore: optimise variable initialisation in autoagents.py
- Removed unnecessary initialisation of variables and streamlined the handling of OpenAI client instances to enhance code clarity and maintainability while ensuring backward compatibility.
2025-07-11 08:12:51 +01:00
claude[bot]andMervin Praison f0f22bb13d fix: add missing HostedMCPServer class for MCP server implementations
- Created HostedMCPServer base class in mcp/hosted_server.py
- Added HostedMCPServer to module exports in __init__.py
- Added starlette>=0.27.0 to MCP optional dependencies
- Fixes ImportError when using mcp_server_latency_example.py

Resolves #813

Co-authored-by: Mervin Praison <[email protected]>
2025-07-11 07:12:31 +00:00
Mervin Praison a8fa70c455 chore: refine review comment in automated issue workflow
- Adjusted the body of the comment in auto-issue-comment.yml to enhance clarity by removing redundant phrases while ensuring guidance for backward compatibility and testing remains intact.
2025-07-11 08:11:37 +01:00
Mervin Praison 1b4b4a10b5 chore: update review comment in automated PR workflow for multi-agent analysis
- Modified the body of the comment in auto-pr-comment.yml to include instructions for reviewing pull requests with multiple parallel running agents, ensuring clarity while maintaining guidance for backward compatibility and testing.
2025-07-11 08:11:20 +01:00
devops-vestradata 1efdaac18f Add 10 new Grok4 intelligent agents 2025-07-11 12:29:26 +05:30
Mervin Praison 1b2182968f chore: simplify review comment in automated PR workflow
- Revised the body of the comment in auto-pr-comment.yml to streamline instructions for review, removing redundant phrases while maintaining clarity and guidance for backward compatibility and testing.
2025-07-11 01:16:13 +01:00
claude[bot]andMervin Praison 5e5a10589e fix: correct syntax error - fix indentation of lines 1404-1411 to be inside try block
The code from lines 1404-1411 was incorrectly outside the try block that starts at line 1325, causing a syntax error when the except block at line 1413 tried to match with it. This fix properly indents these lines to be inside the try block.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:59:40 +00:00
claude[bot]andMervin Praison 6c5e42762f fix: comprehensive fix for all try-except block indentation issues
- Fixed indentation of except block at line 1413 to match its try block
- Moved except block at line 1419 and subsequent code inside the while loop
- Properly structured all nested try-except blocks to prevent syntax errors
- Ensured the handoff fix (user message added before LLM call) is preserved

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:55:28 +00:00
claude[bot]andMervin Praison afb7e47080 fix: correct syntax error - fix indentation of except block at line 1413
The except block was indented with 28 spaces instead of 24 spaces to match its corresponding try block, causing a SyntaxError

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:50:32 +00:00
claude[bot]andMervin Praison e674a2ae84 fix: correct syntax errors and add missing guardrail validation to achat()
- Fix indentation of except block at line 1413 (20 spaces -> 24 spaces)
- Add guardrail validation to achat() method for both custom LLM and OpenAI paths
- Ensure feature parity between sync chat() and async achat() methods

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:46:10 +00:00
Mervin Praison d471d9754a chore: enhance automated comment workflows with additional guidance
- Updated the body of comments in both auto-issue-comment.yml and auto-pr-comment.yml to include instructions for using @web for information retrieval and testing code execution if necessary.
2025-07-11 00:39:27 +01:00
claude[bot]andMervin Praison 9d25b1ed3d fix: correct syntax error in agent.py - add missing except block
The try block at line 1249 (inside the while loop) was missing its 
corresponding except block. Added proper exception handling to close
the try block and re-raise exceptions to the outer handler.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:37:43 +00:00
claude[bot]andMervin Praison d0d04bc17e fix: add missing guardrail validation and error handling to achat() async method
- Add guardrail validation to all return points in achat() method (except JSON/Pydantic outputs)
- Add try-except wrapper around while loop in OpenAI path for proper error recovery
- Ensure chat history rollback on all failure paths in async method
- Maintain feature parity between sync chat() and async achat() methods

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:36:32 +00:00
Mervin Praison 1f4e2b1c5a chore: update github-token in automated comment workflows
- Changed the token reference from GITHUB_TOKEN to GH_TOKEN in both auto-issue-comment.yml and auto-pr-comment.yml for consistency in authentication.
2025-07-11 00:32:09 +01:00
claude[bot]andMervin Praison 88d4241121 fix: correct syntax error in agent.py - proper indentation for try-except block
Fixed syntax error at line 1361 where code was not properly indented inside the try block.
The code from lines 1361-1412 needed to be indented by 4 spaces to be inside the try
block that starts at line 1325.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:31:31 +00:00
Mervin Praison 9e081e9413 chore: add github-token to automated comment workflows
- Included github-token in both auto-issue-comment.yml and auto-pr-comment.yml to ensure proper authentication for comment creation.
2025-07-11 00:30:18 +01:00
Mervin Praison bc0449b8de Merge pull request #803 from MervinPraison/claude/issue-792-20250710_221133
fix: replace prefix-based model detection with capability-based detection
2025-07-11 00:26:33 +01:00
Mervin Praison c262942ba7 Merge branch 'main' into claude/issue-792-20250710_221133 2025-07-11 00:26:18 +01:00
Mervin Praison 40e5c13f47 chore: update PraisonAI version to 2.2.48 in Dockerfiles, README, and related files 2025-07-11 00:23:41 +01:00
Mervin Praison 5eea991a60 Merge pull request #801 from MervinPraison/claude/issue-798-20250710_224150
fix: update AutoAgents prompt to generate proper TaskConfig objects
2025-07-11 00:19:27 +01:00
claude[bot]andMervin Praison 209c2a42ae fix: correct syntax errors in try-except block indentation
- Fix indentation of reflection prompt code block (lines 1316-1323)
- Fix indentation of try-except blocks for self-reflection (lines 1325-1418)
- Fix indentation of code inside if-else statements for custom LLM vs OpenAI
- Fix indentation of final logging and guardrail validation code

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:18:25 +00:00
Mervin Praison efb927137f refactor: remove unused autoagents-tools.py file
- Deleted the autoagents-tools.py file as it contained redundant code and instances of AutoAgents that are no longer needed.
2025-07-11 00:17:10 +01:00
claude[bot]andMervin Praison 162223162f test: add comprehensive unit tests for AutoAgents validation and retry logic
- Add test coverage for _validate_config method
- Test successful config generation via OpenAI and LLM paths
- Test retry mechanism with validation failures
- Test edge cases like max_agents truncation and warnings
- Mock LLM responses to avoid API calls in tests

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:15:15 +00:00
claude[bot]andMervin Praison 75c856b948 fix: correct syntax errors in try-except block indentation
- Fixed indentation issues in chat() method where code was not properly indented inside try blocks
- Fixed duplicate except block that was causing syntax errors
- Added missing chat history management to async achat() method for OpenAI client path
- Ensured all try-except blocks are properly structured and closed

This resolves the SyntaxError preventing module import and test execution.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:11:36 +00:00
claude[bot]andMervin Praison 85fefac429 fix: add missing duplicate prevention and error rollback in achat() OpenAI path
- Add duplicate message prevention for async OpenAI client path
- Add chat history rollback on errors in achat() method
- Ensure consistent behavior between sync and async methods
- Handle edge case where chat_history_length might not be defined

This completes the fix by ensuring both sync and async methods have
identical error handling and duplicate prevention logic.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:10:39 +00:00
claude[bot]andMervin Praison 35b9d46bdf feat: add validation and retry mechanism for AutoAgents config generation
- Add _validate_config method to ensure tasks are proper TaskConfig objects
- Implement retry logic with up to 3 attempts
- Include previous response and error in retry prompt for better context
- Add explicit task structure reminder on validation failures

This ensures more robust configuration generation and better error recovery
when LLMs generate incorrect task formats.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:09:16 +00:00
claude[bot]andMervin Praison 5bd3e45be4 fix: add error handling, duplicate prevention, and multimodal normalization for chat_history
- Add chat history rollback on LLM call failures to prevent inconsistent state
- Prevent duplicate user messages in chat history
- Normalize multimodal prompts to store only text content in chat history
- Add thread safety documentation for future consideration
- Apply fixes to both sync (chat) and async (achat) methods
- Handle all error paths including guardrail failures

This ensures chat_history remains consistent even when errors occur, preventing
unpaired user/assistant messages that could break handoff functionality.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 23:01:57 +00:00
Mervin Praison 4c62731e81 Merge branch 'main' into claude/issue-795-20250710_222918 2025-07-10 23:56:44 +01:00
Mervin Praison 544672edea Merge pull request #800 from MervinPraison/claude/issue-796-20250710_222402
fix: handle JSON parsing for Gemini self-reflection
2025-07-10 23:51:12 +01:00
Mervin Praison 72dcc91b3a Rename test_gemini_fix.py to gemini_self_reflection.py 2025-07-10 23:50:51 +01:00
claude[bot]andMervin Praison 75e728f7d7 fix: update AutoAgents prompt to generate proper TaskConfig objects
The validation error was occurring because the LLM was generating tasks as simple strings instead of proper TaskConfig objects. This commit updates the prompt in the _generate_config method to:

1. Include an explicit JSON schema example showing the correct structure
2. Add a clear warning that tasks must be objects with specific fields
3. Provide a concrete example of the task object structure

This ensures tasks are generated with the required fields: name, description, expected_output, and tools.

Fixes #798

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:44:30 +00:00
claude[bot]andMervin Praison 7ddbf98794 fix: add user message to chat_history before LLM call to fix handoff issue
This fix ensures that handoff tools can access the current user message
during execution. Previously, chat_history was updated after the LLM call,
causing handoffs to fail with "no specific task was provided" message.

The fix adds the user message to chat_history before LLM processing in both:
- Custom LLM path
- Standard OpenAI client path

This maintains backward compatibility while fixing the handoff functionality.

Fixes #795

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:36:33 +00:00
Mervin Praison 0213dea12b chore: update PraisonAI version to 2.2.47 in Dockerfiles, README, and related files 2025-07-10 23:30:27 +01:00
claude[bot]andMervin Praison 841a7b52c4 fix: handle JSON parsing for Gemini self-reflection
- Disable streaming for custom LLMs during self-reflection to avoid incomplete JSON chunks
- Add manual JSON parsing for custom LLM reflection responses
- Use clean_json_output method to handle markdown-wrapped JSON
- Ensure reflection regeneration also uses non-streaming for custom LLMs

This fixes the "Expecting property name enclosed in double quotes" error
when using Gemini models with self-reflection enabled.

Fixes #796

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:29:42 +00:00
claude[bot]andMervin Praison 99506e80cf fix: replace prefix-based model detection with capability-based detection
- Created model_capabilities.py with comprehensive lists of models supporting structured outputs
- Updated llm.py to use supports_streaming_with_tools() instead of prefix checks
- Updated autoagents.py to use supports_structured_outputs() instead of prefix checks
- Added proper imports/exports in __init__.py
- Maintains backward compatibility for all existing functionality
- More accurate and maintainable approach than hardcoded prefixes

Fixes #792

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:21:30 +00:00
Mervin Praison c0d495fd48 Merge pull request #781 from MervinPraison/claude/issue-754-20250709_155906
refactor: eliminate sync/async duplication in llm.py
2025-07-10 23:21:04 +01:00
Mervin Praison 0e51ed0d6c Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-10 23:20:50 +01:00
Mervin Praison 32dce14f96 chore: update version to 0.0.120 in pyproject.toml and uv.lock 2025-07-10 23:20:48 +01:00
Mervin Praison 27aaac80c6 Merge branch 'main' into claude/issue-754-20250709_155906 2025-07-10 23:20:17 +01:00
Mervin Praison 5a0a3983e4 Merge pull request #794 from MervinPraison/claude/pr-791-20250710_214815
PR #791: Changes from Claude
2025-07-10 23:19:03 +01:00
claude[bot]andMervin Praison 400a4c934e fix: properly pass base_url and api_key parameters to OpenAI client and agents
- Create new OpenAIClient instance when custom base_url or api_key are provided
- Pass base_url and api_key to Agent instances for consistency
- Maintain backward compatibility by falling back to singleton client when no custom parameters

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:13:29 +00:00
Mervin Praison e88b0fd47b Merge pull request #793 from MervinPraison/claude/issue-754-20250709_155933
refactor: extract debug logging into centralized method
2025-07-10 23:11:57 +01:00
claude[bot]andMervin Praison e6c1c0679f fix: address review comments for debug logging refactor
- Restore backward compatibility for verbose parameter (verbose >= 10 now works)
- Fix condition ordering bug (check "parameters" before "_async")
- Fix API key masking for empty strings
- Add type check for system_prompt truncation
- Add iterable check for tools parameter
- Restore original prompt logging behavior for non-string prompts

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:03:01 +00:00
claude[bot]andMervin Praison 108aee0a54 fix: remove duplicate _handle_ollama_model method and fix double tool call processing
- Remove duplicate _handle_ollama_model method definition
- Fix bug where tool calls were processed twice in verbose streaming
- Keep the method with better type hints (Union[str, List[Dict]])
- Remove redundant _process_tool_calls_from_stream calls after _process_stream_delta

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 22:02:58 +00:00
Mervin Praison cb017aad70 Merge branch 'main' into claude/issue-754-20250709_155906 2025-07-10 22:53:33 +01:00
claude[bot]andMervin Praison ea29d3181b fix: properly handle OpenAI client API and store base_url/api_key
- Use OpenAIClient's parse_structured_output method instead of accessing client.beta directly
- Store base_url and api_key as instance variables to support custom endpoints
- This fixes the AttributeError when using AutoAgents with non-OpenAI providers

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:50:39 +00:00
claude[bot]andMervin Praison 7f0f265671 refactor: eliminate sync/async duplication in llm.py
- Extract common logic into shared helper methods
- Fix variable reference errors for ollama_params
- Reduce code duplication between get_response/get_response_async
- Reduce code duplication between response/aresponse
- Maintain 100% backward compatibility
- No API changes or breaking changes

Fixes #754

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:42:47 +00:00
Mervin Praison bc1c508419 Merge pull request #789 from MervinPraison/claude/issue-787-20250710_205703
fix: prevent double output when using litellm models
2025-07-10 22:37:16 +01:00
Mervin Praison bd108ba3e7 Merge pull request #791 from MervinPraison/claude/issue-788-20250710_210226
fix: add multi-provider support for AutoAgents
2025-07-10 22:34:58 +01:00
claude[bot]andMervin Praison ac5f2649df refactor: resolve merge conflicts with main branch
- Renamed _prepare_ollama_followup to _handle_ollama_model to match main branch
- Updated method signature to (response_text, tool_results, messages, original_prompt)
- Modified return value to dict with follow_up_messages and original_prompt
- Updated all call sites to use the new interface
- Maintained backward compatibility and refactoring benefits

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:34:28 +00:00
claude[bot]andMervin Praison 1b64762d54 fix: add verbose checks to all display_interaction calls for consistency
- Applied consistent pattern to all 4 display_interaction calls
- Now all checks follow pattern: if self.verbose and not self._using_custom_llm
- Ensures display is only shown when verbose mode is enabled AND not using custom LLM
- Maintains backward compatibility while fixing the inconsistency

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:29:45 +00:00
claude[bot]andMervin Praison df402bcfdb fix: correct indentation error in aresponse method
Fixed incorrect indentation in the async Ollama follow-up handling code
that was causing a syntax error at line 1364.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:20:39 +00:00
claude[bot]andMervin Praison 061c8d58b4 fix: add multi-provider support for AutoAgents
- Replace OpenAI-specific beta.chat.completions.parse() with cross-provider LLM class
- Maintain backward compatibility by using structured output for OpenAI models
- Add support for all LiteLLM providers (Gemini, Anthropic, etc.)
- Include robust JSON parsing to handle markdown-wrapped responses
- Fixes #788: AttributeError when using AutoAgent with Gemini provider

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:18:52 +00:00
Mervin Praison 117c02cf30 chore: update PraisonAI and related package versions to 2.2.46 and 0.0.119
- Updated PraisonAI version in Dockerfiles and README to 2.2.46
- Updated version in pyproject.toml and uv.lock for PraisonAI and PraisonAI agents to 0.0.119
- Adjusted deployment script to reflect the new PraisonAI version
2025-07-10 22:16:47 +01:00
claude[bot]andMervin Praison 82c9ff80a7 fix: correct indentation error in get_response method
Fixed incorrect indentation in lines 779-804 of the get_response method
that was causing IndentationError. The code block for Ollama follow-up
handling is now properly nested within the if follow_up_prompt block.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:15:53 +00:00
Mervin Praison f44b15d73b Merge pull request #782 from MervinPraison/claude/issue-754-20250709_155935
refactor: extract streaming chunk processor to eliminate code duplication
2025-07-10 22:13:29 +01:00
claude[bot]andMervin Praison f2c89c2012 fix: prevent double output when using litellm models
- Check for self._using_custom_llm before calling display_interaction
- Custom LLM already handles display in its get_response method
- Fixes issue #787 where task/response printed twice with litellm

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 21:12:41 +00:00
Mervin Praison fd2569e642 chore: update PraisonAI and related package versions to 2.2.45 and 0.0.118
- Updated PraisonAI version in Dockerfiles and README to 2.2.45
- Updated version in pyproject.toml and uv.lock for PraisonAI and PraisonAI agents to 0.0.118
- Adjusted deployment script to reflect the new PraisonAI version
2025-07-10 22:08:47 +01:00
Mervin Praison 58efb4b4cd Merge pull request #783 from MervinPraison/claude/issue-754-20250709_155947
refactor: extract Ollama handler to eliminate code duplication
2025-07-10 22:04:05 +01:00
Mervin Praison 35df78874d chore: update PraisonAI and related package versions to 2.2.44 and 0.0.117
- Updated PraisonAI version in Dockerfiles and README to 2.2.44
- Updated version in pyproject.toml and uv.lock for PraisonAI and PraisonAI agents to 0.0.117
- Adjusted deployment script to reflect the new PraisonAI version
2025-07-10 21:02:01 +01:00
Mervin Praison 4abe80a563 Merge pull request #786 from Dhivya-Bharathy/grok4-intelligent-agents-examples
Add grok4_intelligent_agents Folder to Exa Tool with 5 Agent scripts
2025-07-10 21:00:03 +01:00
Mervin Praison 95c15f52fc Merge pull request #785 from MervinPraison/claude/issue-784-20250710_065335
fix: remove OPENAI_API_KEY requirement for non-OpenAI providers
2025-07-10 20:58:54 +01:00
claude[bot]andMervin Praison 0e2a753cc3 fix: add null safety checks for OpenAI client usage
- Add null check in self-reflection to prevent crash for non-OpenAI providers
- Add null checks in async chat methods before accessing OpenAI client
- Add graceful fallback for self-reflection with custom LLMs
- Add clear error message in AutoAgents explaining it requires OpenAI API
- Ensure non-OpenAI providers can use Agent class without errors

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 18:05:28 +00:00
claude[bot]andMervin Praison 660260c6e6 fix: make OpenAI client initialization lazy for non-OpenAI providers
- Convert unconditional OpenAI client init to lazy property
- Add null safety checks in critical methods
- Provide fallback implementation for message building
- Fix test script by removing non-existent attribute access

This allows using providers like xai/grok-4 without OPENAI_API_KEY

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 13:37:28 +00:00
devops-vestradata f49b5c368c Add grok4_intelligent_agents with 5 agent scripts 2025-07-10 14:53:31 +05:30
claude[bot]andMervin Praison 39f0c40dcc fix: remove client imports from main.py to fix ImportError
- Remove client from imports in agents/agents.py (not used)
- Remove client from imports in autoagents.py and use get_openai_client() instead
- Remove client from imports in process.py and create local OpenAI() instance
- This fixes the ImportError that was blocking tests after removing global client from main.py

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 07:22:42 +00:00
Mervin Praison 27b10ff3ea Rename test_xai_fix.py to src/praisonai/tests/unit/test_xai_fix.py 2025-07-10 08:03:46 +01:00
claude[bot]andMervin Praison f63f247bfe fix: remove OPENAI_API_KEY requirement for non-OpenAI providers
- Remove unnecessary OpenAI client initialization at import time in main.py
- This was blocking users from using other LLM providers (xai, anthropic, etc)
- The OpenAI client is properly initialized when needed in OpenAIClient class
- Clean up unused imports and constants
- Add test script to verify the fix

Fixes #784

Co-authored-by: Mervin Praison <[email protected]>
2025-07-10 07:02:20 +00:00
claude[bot]andMervin Praison f3f5f63b22 refactor: eliminate sync/async duplication in llm.py
- Extract common logic into shared helper methods
- Reduce code duplication between get_response/get_response_async
- Reduce code duplication between response/aresponse
- Maintain 100% backward compatibility
- No API changes or breaking changes

Addresses issue #754

Co-authored-by: Mervin Praison <[email protected]>
2025-07-09 16:07:51 +00:00
claude[bot]andMervin Praison ccf9470f41 refactor: extract debug logging into centralized _log_llm_config method
- Created private _log_llm_config method to handle all debug logging
- Eliminated ~116 lines of duplicated debug logging code
- Maintains 100% backward compatibility (no API changes)
- Centralizes security measures (API key masking)
- Consistent formatting across all logging calls
- No functional changes, only code organization

Addresses code duplication issue #754

Co-authored-by: Mervin Praison <[email protected]>
2025-07-09 16:05:59 +00:00
claude[bot]andMervin Praison 75cf937581 refactor: extract Ollama handler to eliminate code duplication
- Created shared _handle_ollama_model method to consolidate logic
- Updated both sync and async methods to use the shared handler
- Eliminated ~185 lines of duplicated code
- Maintained 100% backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-09 16:04:38 +00:00
claude[bot]andMervin Praison d228a742b7 refactor: extract streaming chunk processor to eliminate code duplication
- Add _process_stream_delta() helper method to consolidate duplicate logic
- Refactor 4 duplicated streaming sections (sync/async, verbose/non-verbose)
- Eliminates ~50 lines of duplicated code
- Maintains 100% backward compatibility with no API changes
- Addresses original issue #754 about streaming code duplication

Co-authored-by: Mervin Praison <[email protected]>
2025-07-09 16:03:24 +00:00
Mervin Praison 1d7e03b03e Merge pull request #779 from Dhivya-Bharathy/add-Domain_Deep_Research_Agent
Add Domain Deep Research Agent Notebook to Research Knowledge QA Agents Folder
2025-07-09 16:55:09 +01:00
Mervin Praison 290570de88 Merge pull request #780 from Dhivya-Bharathy/feature/add-ai-agent-examples
Add 5 domain-specific AI agent examples to exa-tool directory
2025-07-09 16:54:50 +01:00
Mervin Praison 542ea8c10d Merge pull request #778 from Dhivya-Bharathy/add-Game_Playing_Agent_Tic_Tac_Toe
Add Game Playing Agent (Tic Tac Toe) Notebook to Programming Code Analysis Agents Folder
2025-07-09 16:54:22 +01:00
Mervin Praison 843f70b599 Merge pull request #777 from Dhivya-Bharathy/add-News_And_Podcast_Aggregator_Agent
Add News and Podcast Aggregator Agent Notebook to Social Media Content Agents Folder
2025-07-09 16:54:10 +01:00
Mervin Praison dee707299d Merge pull request #776 from Dhivya-Bharathy/add-Financial_Coaching_Agent
Add Financial Coaching Agent Notebook to Finance Market Job Agents Folder
2025-07-09 16:53:50 +01:00
devops-vestradata 7f6e300a9e Add 5 domain-specific AI agent folders (Finance, Health, Programming, Research, Social Media) to exa-tool 2025-07-09 18:51:38 +05:30
Dhivya-Bharathy 88e9de2914 Add Domain_Deep_Research_Agent notebook 2025-07-09 10:49:17 +00:00
Dhivya-Bharathy f17daec68b Add Game_Playing_Agent_Tic_Tac_Toe notebook 2025-07-09 10:35:09 +00:00
Dhivya-Bharathy f4d54d76e8 Add News_And_Podcast_Aggregator_Agent notebook 2025-07-09 10:12:16 +00:00
Dhivya-Bharathy 23e2951724 Add Financial_Coaching_Agent notebook 2025-07-09 09:25:23 +00:00
Mervin Praison 1916b1a108 Merge pull request #775 from Dhivya-Bharathy/add-Air_Quality_Analysis_Agent
Add Air Quality Analysis Agent Notebook to Health Fitness Agents
2025-07-09 10:12:38 +01:00
DhivyaBharathy 5b99ca8357 Delete examples/cookbooks/Health_Fitness_Agents/Air_Quality_Analysis_Agent.ipynb 2025-07-09 14:39:17 +05:30
DhivyaBharathy 09ef400c15 Update Air_Quality_Analysis_Agent.ipynb 2025-07-09 14:38:25 +05:30
DhivyaBharathy d5c381890f Add files via upload 2025-07-09 14:36:29 +05:30
DhivyaBharathy 639e53ea9b Update Air_Quality_Analysis_Agent.ipynb 2025-07-09 14:26:25 +05:30
DhivyaBharathy 0954fb4d3d Update Air_Quality_Analysis_Agent.ipynb 2025-07-09 14:14:53 +05:30
Dhivya-Bharathy f5c35f31e9 Add Air_Quality_Analysis_Agent notebook 2025-07-09 08:34:57 +00:00
Mervin Praison 4f31ec9b63 Update PraisonAI and related dependencies to version 2.2.43 and praisonaiagents to version 0.0.116 across Dockerfiles, README, and project files for consistency and compatibility. 2025-07-09 00:37:21 +01:00
Mervin Praison abee86337d Merge pull request #774 from MervinPraison/claude/pr-773-20250708_232256
fix: add array schema validation to llm.py for MCP tools compatibility
2025-07-09 00:34:52 +01:00
claude[bot]andMervin Praison e6cf4ebfcd fix: add array schema validation to llm.py for MCP tools compatibility
- Add _fix_array_schemas method to recursively fix missing 'items' in array schemas
- Apply fix to pre-formatted tools in _format_tools_for_litellm
- Apply fix to generated tool definitions in _generate_tool_definition
- Ensures OpenAI compatibility for all tool types (MCP, pre-formatted, generated)
- Maintains backward compatibility by only adding missing fields

Related to PR #773

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 23:27:14 +00:00
Mervin Praison 68fb0aaaca Update PraisonAI and related dependencies to version 2.2.42 and praisonaiagents to version 0.0.115 across Dockerfiles, README, and project files for consistency and compatibility. 2025-07-09 00:24:00 +01:00
Mervin Praison 4c9009c3f5 Merge pull request #773 from MervinPraison/claude/pr-772-20250708_230928
fix: comprehensive array schema validation for MCP tools
2025-07-09 00:21:05 +01:00
claude[bot]andMervin Praison ac21e5d595 fix: add comprehensive array schema validation for all tool types
- Add _fix_array_schemas method to recursively fix array schemas
- Apply schema fix to all pre-formatted OpenAI tools in format_tools
- Ensures MCP tools and other external tools have properly formatted array schemas
- Resolves "array schema missing items" error for read_multiple_files and similar functions

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 23:14:56 +00:00
Mervin Praison 58b12b9f24 Merge pull request #772 from MervinPraison/claude/pr-771-20250708_230103
fix: add items property to array parameters in OpenAI tool definitions
2025-07-09 00:05:24 +01:00
claude[bot]andMervin Praison 09dcf9c114 fix: add items property to array parameters in OpenAI tool definitions
- Fix array schema validation error by adding required 'items' property
- Change type comparisons to use 'is' instead of '=='
- Remove unnecessary f-string prefixes where no placeholders exist
- Resolves OpenAI API error: "array schema missing items"

This ensures compatibility with OpenAI's function calling format which
requires array types to specify the type of items they contain.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 23:04:25 +00:00
Mervin Praison e25e0a895f Merge pull request #771 from MervinPraison/claude/issue-752-20250708_223652
refactor: make openai_client.py self-contained like llm.py
2025-07-08 23:58:16 +01:00
Mervin Praison 855ec4c10a Rename test_openai_refactor.py to src/praisonai/tests/unit/test_openai_refactor_2.py 2025-07-08 23:58:02 +01:00
claude[bot]andMervin Praison 2b672f4d40 refactor: make openai_client.py self-contained like llm.py
- Move all data classes from agent.py to openai_client.py
- Add comprehensive completion methods with streaming and tool support
- Add helper methods for message building and tool formatting
- Update agent.py to use openai_client methods
- Export data classes from llm module for easy import
- Add test script to verify refactoring

This makes openai_client.py fully self-contained with all OpenAI-specific
logic, following the same pattern as llm.py for better organization and
maintainability.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 22:51:17 +00:00
Mervin Praison fe24d6bbea Remove test_mcp_fix.py and update PraisonAI and related dependencies to version 2.2.41 and praisonaiagents to version 0.0.114 across Dockerfiles, README, and project files for consistency and compatibility. 2025-07-08 23:28:09 +01:00
Mervin Praison f402ef642b Merge pull request #770 from MervinPraison/claude/pr-766-20250708_222154
fix: convert ToolCall dataclass to dict for JSON serialization
2025-07-08 23:25:55 +01:00
claude[bot]andMervin Praison 7ca9db4d1c fix: convert ToolCall dataclass to dict for JSON serialization
When streaming responses create ToolCall dataclass objects, they need
to be converted to dictionaries before being passed to the OpenAI API
to avoid JSON serialization errors.

This fixes the "Object of type ToolCall is not JSON serializable" error
that occurred after the OpenAI refactoring in PR #766.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 22:24:40 +00:00
Mervin Praison 322f972b5d Merge pull request #769 from MervinPraison/claude/pr-766-20250708_221226
fix: handle both ToolCall dataclass and OpenAI object in tool execution
2025-07-08 23:20:19 +01:00
claude[bot]andMervin Praison 8c50464db0 fix: handle both ToolCall dataclass and OpenAI object in tool execution
After the OpenAI refactoring in PR #766, tool calls from streaming responses
are ToolCall dataclass objects while non-streaming responses return OpenAI
API objects. This fix handles both cases properly to prevent the "'dict' 
object has no attribute 'name'" error.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 22:15:48 +00:00
Mervin Praison 7828697eea Merge pull request #768 from MervinPraison/claude/issue-767-20250708_220427
fix: handle MCP tools returning lists in agent.py
2025-07-08 23:15:01 +01:00
claude[bot]andMervin Praison 4e89a5f6db fix: handle MCP tools returning lists in agent.py
- Fixed issue where MCP's to_openai_tool() returns a list of tools but agent.py was expecting a single tool
- Now properly extends the formatted_tools list when MCP returns multiple tools
- Maintains backward compatibility for single tool returns
- Added test script to verify the fix

Fixes #767

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 22:10:06 +00:00
Mervin Praison 8692a04551 Merge pull request #766 from MervinPraison/claude/issue-752-20250708_213500
refactor: separate OpenAI logic from agent.py into llm/openai_client.py
2025-07-08 23:08:25 +01:00
Mervin Praison da51c0ae63 Rename test_openai_refactor.py to src/praisonai/tests/unit/test_openai_refactor.py 2025-07-08 22:59:08 +01:00
claude[bot]andMervin Praison 77b2db24cc refactor: separate OpenAI logic from agent.py into llm/openai_client.py
- Created OpenAIClient class in llm/openai_client.py to encapsulate all OpenAI logic
- Removed direct OpenAI imports from agent.py
- Updated all OpenAI client references to use centralized client
- Added ToolCall dataclass to replace OpenAI's ChatCompletionMessageToolCall
- Maintained backward compatibility with existing API
- Created test script to verify the refactoring

This change follows the same modular pattern as litellm in llm.py, improving code organization and maintainability.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 21:54:34 +00:00
Mervin Praison 9569d1fefa Merge pull request #765 from MervinPraison/claude/issue-752-20250708_204518
refactor: Sync agent.py with llm.py patterns - Phase 1
2025-07-08 22:14:04 +01:00
claude[bot]andMervin Praison 84201195f7 fix: Replace shallow copy with deep copy in _build_messages()
- Added import copy to both agent.py and test file
- Changed prompt.copy() to copy.deepcopy(prompt) to prevent mutation of original objects
- Ensures nested dictionaries in multimodal prompts are not modified

This fixes the issue where modifying item["text"] would mutate the original prompt objects.

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 21:11:38 +00:00
Mervin Praison 850b7bfd7b Rename test_agent_refactor.py to src/praisonai/tests/unit/test_agent_refactor.py 2025-07-08 22:02:42 +01:00
claude[bot]andMervin Praison 77532114ec refactor: Sync agent.py with llm.py patterns - Phase 1
- Added _build_messages() helper to consolidate message building logic
- Added _format_tools_for_completion() helper to handle all tool formats
- Updated chat() and achat() to use _build_messages()
- Updated _chat_completion() and achat() to use _format_tools_for_completion()
- Removed ~105 lines of duplicated code
- 100% backward compatible - no breaking changes
- Added comprehensive test script to verify functionality

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 20:59:43 +00:00
Mervin Praison 2882af376e chore: Update PraisonAI to version 2.2.40 and PraisonAI Agents to version 0.0.113 across Dockerfiles and project files for consistency and improved functionality. 2025-07-08 21:41:46 +01:00
Mervin Praison 19482e9163 Merge pull request #764 from MervinPraison/claude/issue-752-20250708_191412
refactor: Add full tool format support to async method
2025-07-08 21:35:20 +01:00
claude[bot]andMervin Praison 0741b523b8 fix: Update tool formatting to handle callable functions from any module
- Modified _format_tools_for_litellm to pass function objects instead of names
- Updated _generate_tool_definition to accept both function objects and names
- This fixes test failures where functions weren't found in globals()

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 20:25:51 +00:00
Mervin Praison d63d564649 Fix import path in test_phase2_refactor.py to ensure correct module access for LLM class 2025-07-08 21:17:46 +01:00
claude[bot]andMervin Praison 88ae3a26fb fix: Add defensive validation and fix test import path
- Add validation for nested dictionary keys to prevent KeyError
- Add JSON serialization validation to ensure tools are serializable  
- Fix import path in test_async_tool_formats.py
- Improves robustness of tool formatting

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 20:13:42 +00:00
Mervin Praison 74ef96b9f6 Rename src/praisonai/tests/test_async_tool_formats.py to src/praisonai/tests/unit/test_async_tool_formats.py 2025-07-08 20:54:29 +01:00
Mervin Praison 12270a56d7 Rename test_async_tool_formats.py to src/praisonai/tests/test_async_tool_formats.py 2025-07-08 20:54:00 +01:00
claude[bot]andMervin Praison c79eedc8ec refactor: Add full tool format support to async method
- Created _format_tools_for_litellm() helper method to handle all tool formats
- Updated sync get_response() to use the shared helper 
- Updated async get_response_async() to use the shared helper
- Async now supports: pre-formatted tools, lists, string names (previously unsupported)
- Removed ~95 lines of duplicate code (4.6% reduction)
- Zero breaking changes - all functionality preserved

Fixes async tool format parity issue from #752

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 19:25:29 +00:00
Mervin Praison 98874da689 Update PraisonAI to version 2.2.39 and PraisonAI Agents to version 0.0.112 across Dockerfiles and project files for consistency and improved functionality. 2025-07-08 19:37:21 +01:00
Mervin Praison 6f019de05c Merge pull request #761 from MervinPraison/claude/issue-752-20250708_181532
refactor: Phase 2 - Extract shared _build_messages helper
2025-07-08 19:31:50 +01:00
Mervin Praison a03d288e01 Rename test_phase2_refactor.py to src/praisonai/tests/test_phase2_refactor.py 2025-07-08 19:31:19 +01:00
claude[bot]andMervin Praison 03c23021ab refactor: extract shared _build_messages helper to reduce code duplication
Phase 2 implementation to reduce code duplication in LLM class:
- Added _build_messages() helper method to consolidate message building logic
- Updated all 4 methods to use the shared helper:
  - get_response() (sync)
  - response() (sync)
  - get_response_async() (async)
  - aresponse() (async)
- Removed ~40 lines of duplicated code
- No breaking changes - all functionality preserved
- Added test script to verify backward compatibility

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 18:26:45 +00:00
Mervin Praison 0178ec807e Merge pull request #731 from Dhivya-Bharathy/add-talk2find_voice_agent_demo
Add Talk2find Voice Agent Notebook
2025-07-08 19:25:03 +01:00
Mervin Praison 922362bd4c Merge branch 'main' of https://github.com/MervinPraison/PraisonAI 2025-07-08 19:23:56 +01:00
Mervin Praison 2e8b9cbf29 Update PraisonAI to version 2.2.38 and PraisonAI Agents to version 0.0.111 across Dockerfiles and project files for consistency and improved functionality. 2025-07-08 19:23:54 +01:00
Mervin Praison b79197b3a6 Merge pull request #757 from Dhivya-Bharathy/add-cookbook-folders
Add Cookbook Folders
2025-07-08 19:16:00 +01:00
Mervin Praison c056c3b65d Merge pull request #759 from MervinPraison/claude/issue-758-20250708_175805
fix: Resolve TypeError in COT agents with telemetry
2025-07-08 19:02:50 +01:00
Mervin Praison 965df5296f Delete cot-agents.py 2025-07-08 19:02:37 +01:00
claude[bot]andMervin Praison a8810cf4de fix: Resolve TypeError in COT agents with telemetry
- Add telemetry disable flag to cot-agents.py as minimal workaround
- Fix type comparison bug in telemetry integration by adding isinstance check
- This prevents string task_id from being compared with integer length

Fixes #758

Co-authored-by: Mervin Praison <[email protected]>
2025-07-08 18:01:19 +00:00
devops-vestradata 4e50fab7f8 Remove duplicate Ai_Market_Startup_Trend_Agent.ipynb from cookbooks root 2025-07-08 19:07:36 +05:30
devops-vestradata 041feb6ec9 Merge remote-tracking branch 'upstream/main'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-07-08 18:48:41 +05:30
DhivyaBharathy 1fafaf8758 Add files via upload 2025-07-08 18:19:56 +05:30
DhivyaBharathy a056015b4b Delete examples/cookbooks/Vision_Multimodal_Agents/Bert_Whisper_Agent.ipynb 2025-07-08 18:19:44 +05:30
DhivyaBharathy 80e27a7cb7 Add files via upload 2025-07-08 18:15:30 +05:30
DhivyaBharathy ac59fcf65e Delete examples/cookbooks/Research_Knowledge_QA_Agents/ArXiv_Agent_Notebook.ipynb 2025-07-08 18:15:13 +05:30
DhivyaBharathy a55db3f2c1 Add files via upload 2025-07-08 18:12:40 +05:30
DhivyaBharathy feafe6185d Delete examples/cookbooks/Research_Knowledge_QA_Agents/AI-CourtSimulation.ipynb 2025-07-08 18:12:26 +05:30
DhivyaBharathy e052f4ab97 Add files via upload 2025-07-08 18:09:15 +05:30
DhivyaBharathy a8b94c8c8e Add files via upload 2025-07-08 18:06:09 +05:30
DhivyaBharathy d5270d5f13 Add files via upload 2025-07-08 18:03:42 +05:30
DhivyaBharathy 9462b2409e Delete examples/cookbooks/Programming_Code_Analysis_Agents/MistralTechAgent.ipynb 2025-07-08 18:03:27 +05:30
DhivyaBharathy 5da1ba7387 Delete examples/cookbooks/Programming_Code_Analysis_Agents/Code_Analysis_Agent.ipynb 2025-07-08 18:00:17 +05:30
DhivyaBharathy 7567145042 Delete examples/cookbooks/Conversational_Chat_Agents/Qwen_Colab_Agent.ipynb 2025-07-08 17:55:43 +05:30
devops-vestradata ca83ea5548 Recreate Qwen_Colab_Agent.ipynb from scratch: valid JSON, no widgets, no duplicates, clean structure 2025-07-08 17:56:05 +05:30
devops-vestradata 84e880ccdb Resolve merge conflict: keep fixed Qwen_Colab_Agent.ipynb (remove widgets, duplicates, ensure valid JSON) 2025-07-08 17:51:22 +05:30
devops-vestradata d20247f628 Fix Qwen_Colab_Agent.ipynb: Remove duplicates, widgets metadata, and ensure valid JSON 2025-07-08 17:49:36 +05:30
DhivyaBharathy 9794047182 Update Qwen_Colab_Agent.ipynb 2025-07-08 17:39:33 +05:30
devops-vestradata 7292182a16 Organized all cookbooks .ipynb files into categorized folders and fixed invalid notebook metadata. 2025-07-08 17:36:20 +05:30
devops-vestradata 94f2f92577 Remove duplicate e-commerce notebook. Now 60 cookbooks .ipynb files. 2025-07-08 16:57:09 +05:30
DhivyaBharathy f6ae1d2c5f Rename voiGno_Restaurant_Agent_PraisonAI.ipynb to VoiGno_Restaurant_Agent_PraisonAI.ipynb 2025-07-08 16:48:28 +05:30
DhivyaBharathy cfe948e7ef Rename arXiv_agent_notebook.ipynb to ArXiv_Agent_Notebook.ipynb 2025-07-08 16:47:53 +05:30
devops-vestradata 3e18a5c591 Force Git to recognize PascalCase renames for all notebooks 2025-07-08 16:46:32 +05:30
DhivyaBharathy 498e6a4dbf Rename ai_data_analysis_agent.ipynb to AI_Data_Analysis_Agent.ipynb 2025-07-08 16:19:47 +05:30
Mervin Praison 5ff64d2c10 Merge pull request #755 from Dhivya-Bharathy/add-Ai_Market_Startup_Trend_Agent
Add AI Market & Startup Trend Agent Notebook
2025-07-08 11:11:17 +01:00
DhivyaBharathy af5556a235 Merge branch 'main' into add-Ai_Market_Startup_Trend_Agent 2025-07-08 13:10:23 +05:30
Dhivya-Bharathy 2d27264bab Add Ai_Market_Startup_Trend_Agent notebook 2025-07-08 07:38:28 +00:00
DhivyaBharathy ed443583b2 Rename cleaned_ai_market_startup_trend_agent.ipynb to ai_market_startup_trend_agent.ipynb 2025-07-08 13:05:30 +05:30
DhivyaBharathy 54da62213a Add files via upload 2025-07-08 13:04:12 +05:30
DhivyaBharathy 9efed5b4c7 Add files via upload 2025-07-08 13:01:16 +05:30
DhivyaBharathy f1cb5df3aa Add files via upload 2025-07-08 11:34:31 +05:30
DhivyaBharathy ab7d5cc5cc Add files via upload 2025-07-08 11:08:22 +05:30
DhivyaBharathy 8b03c399f6 Add files via upload 2025-07-08 10:51:33 +05:30
DhivyaBharathy 8ca1104850 Add files via upload 2025-07-08 10:16:37 +05:30
DhivyaBharathy 952e59e07a Add files via upload 2025-07-07 17:24:11 +05:30
DhivyaBharathy 370a51dc86 Add files via upload 2025-07-04 17:20:41 +05:30
Dhivya-Bharathy 9757e3dea7 Add talk2find_voice_agent_demo notebook 2025-07-04 11:18:21 +00:00
656 changed files with 70626 additions and 29351 deletions

No files matched your search

+81
View File
@@ -0,0 +1,81 @@
name: 'Gemini CLI Action'
description: 'Uses the Gemini CLI to automate software development tasks.'
author: 'Gemini'
inputs:
prompt:
description: 'A specific prompt to guide Gemini.'
required: false
default: 'You are a helpful assistant.'
GEMINI_API_KEY:
description: 'Your Gemini API key.'
required: true
OTLP_GCP_WIF_PROVIDER:
description: 'The workload identity provider for GCP authentication.'
required: false
OTLP_GOOGLE_CLOUD_PROJECT:
description: 'The Google Cloud project for telemetry.'
required: false
settings_json:
description: |
A JSON string to configure the Gemini CLI. This will be written to .gemini/settings.json.
To enable observability with Google Cloud, include:
{"telemetry": {"enabled": true, "target": "gcp"}, "sandbox": false}
required: false
version:
description: |
The version of @google/gemini-cli to execute.
Can be a specific version from npm (e.g., '0.1.0', 'latest'), a branch name (e.g., 'main'), or a commit hash.
required: false
default: 'latest'
runs:
using: "composite"
steps:
- name: Configure Gemini CLI
if: inputs.settings_json != ''
run: |
mkdir -p .gemini
echo "$SETTINGS_JSON" > .gemini/settings.json
shell: bash
env:
SETTINGS_JSON: ${{ inputs.settings_json }}
- name: Authenticate to Google Cloud for Telemetry
if: inputs.OTLP_GCP_WIF_PROVIDER != ''
id: auth
uses: 'google-github-actions/auth@v2'
with:
project_id: ${{ inputs.OTLP_GOOGLE_CLOUD_PROJECT }}
workload_identity_provider: ${{ inputs.OTLP_GCP_WIF_PROVIDER }}
- name: Install Gemini CLI
id: install
run: |
if [[ "${{ inputs.version }}" == "latest" || "${{ inputs.version }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.-]+)?(\+[a-zA-Z0-9\.-]+)?$ ]]; then
echo "Installing Gemini CLI from npm: @google/gemini-cli@${{ inputs.version }}"
npm install -g @google/gemini-cli@${{ inputs.version }}
else
echo "Installing Gemini CLI from GitHub: github:google-gemini/gemini-cli#${{ inputs.version }}"
npm install -g github:google-gemini/gemini-cli#${{ inputs.version }}
fi
echo "Verifying installation:"
if command -v gemini >/dev/null 2>&1; then
gemini --version || echo "Gemini CLI installed successfully (version command not available)"
else
echo "Error: Gemini CLI not found in PATH"
exit 1
fi
shell: bash
- name: Run Gemini CLI
run: |
gemini --yolo --prompt "$PROMPT"
shell: bash
env:
GEMINI_API_KEY: ${{ inputs.GEMINI_API_KEY }}
PROMPT: ${{ inputs.prompt }}
branding:
icon: 'terminal'
color: 'blue'
+26
View File
@@ -0,0 +1,26 @@
name: Auto Issue Comment with PR Creation
on:
issues:
types: [opened]
jobs:
add-comment:
runs-on: ubuntu-latest
permissions:
issues: write
contents: write
pull-requests: write
actions: read
steps:
- name: Add automated comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '@claude review this issue and do a detailed analysis and fix this if the existing code doesn\'t have the solution implemented. Making sure it has backward compatibility, no existing features removed. After making those changes, again review the applied changes. Use @web to search if you dont know any information or to find the latest documentation or to find the latest version. Run the code if you think you need to run it to test it. Minimal code change to start with if required any changes. MAINLY IT SHOULD NOT IMPACT ON THE CURRENT SPEED OF EXECUTION of existing features, not increasing the overhead. **Please create a PR using gh tool with your changes**.'
})
+23
View File
@@ -0,0 +1,23 @@
name: Auto PR Comment
on:
pull_request:
types: [opened]
jobs:
add-comment:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Add automated comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '@claude review this pull request and do a detailed analysis and fix this if the existing code doesn\'t have the solution implemented. Making sure it has backward compatibility, no existing features removed. After making those changes, again review the applied changes. Use @web to search if you dont know any information or to find the latest documentation or to find the latest version. Run the code if you think you need to run it to test it. Minimal code change to start with if required any changes. MAINLY IT SHOULD NOT IMPACT ON THE CURRENT SPEED OF EXECUTION of existing features, not increasing the overhead.'
})
+1
View File
@@ -11,6 +11,7 @@ on:
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
packages: write
+141 -20
View File
@@ -1,4 +1,4 @@
name: Claude Code
name: Claude Assistant
on:
issue_comment:
@@ -6,34 +6,155 @@ on:
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
types: [opened, assigned, labeled]
pull_request_review:
types: [submitted]
jobs:
claude:
claude-response:
# Prevent certain bots from triggering this action (but allow github-actions[bot] for auto-comments)
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
github.actor != 'dependabot[bot]' &&
github.actor != 'cursor[bot]' &&
github.actor != 'renovate[bot]' &&
!(contains(github.actor, '[bot]') && github.actor != 'github-actions[bot]')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
contents: write
pull-requests: write
issues: write
actions: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run Claude Code (OAuth)
id: claude
uses: grll/claude-code-action@beta
fetch-depth: 0
- uses: anthropics/claude-code-action@beta
with:
use_oauth: true
claude_access_token: ${{ secrets.CLAUDE_ACCESS_TOKEN }}
claude_refresh_token: ${{ secrets.CLAUDE_REFRESH_TOKEN }}
claude_expires_at: ${{ secrets.CLAUDE_EXPIRES_AT }}
claude_code_oauth_token: ${{ secrets.CLAUDE_ACCESS_TOKEN }}
github_token: ${{ secrets.GITHUB_TOKEN }}
trigger_phrase: "@claude"
allowed_tools: |
Bash(git:*)
Bash(python:*)
Bash(pip:*)
Bash(conda:*)
Bash(pytest:*)
Bash(gh:*)
Bash(python -m pytest:*)
Bash(python -m pip:*)
Bash(poetry:*)
View
GlobTool
GrepTool
BatchTool
Edit
Replace
mcp__github__get_issue
mcp__github__get_issue_comments
mcp__github__update_issue
timeout_minutes: 30
post-review-comment:
needs: claude-response
if: success() && needs.claude-response.result == 'success'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
steps:
- name: Check for existing review comment
id: check-comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const reviewText = '@claude review if the changes made in the above branch are as per the requirements and make changes to the above branch if issues still exist.';
let comments = [];
let issueNumber;
try {
// Determine issue/PR number based on event type
if (context.eventName === 'pull_request_review_comment' || context.eventName === 'pull_request_review') {
issueNumber = context.payload.pull_request?.number || context.issue.number;
} else if (context.eventName === 'issue_comment' && context.payload.issue.pull_request) {
// This is a comment on a PR (not an issue)
issueNumber = context.payload.issue.number;
} else {
// This is a regular issue
issueNumber = context.issue.number;
}
comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
});
// Look for Claude's completed review comments
const claudeReviewComments = comments.data.filter(comment =>
(comment.user.login === 'claude[bot]' || comment.body.includes('✅') || comment.body.includes('## Summary')) &&
!comment.body.includes('⏳') &&
!comment.body.includes('🔄') &&
!comment.body.includes('Loading...')
);
// Check if our review request comment already exists
const existingReviewRequest = comments.data.find(comment =>
comment.body.includes(reviewText)
);
// Post if Claude has completed a review AND we haven't posted the review request yet
const shouldPost = claudeReviewComments.length > 0 && !existingReviewRequest;
core.setOutput('should-post', shouldPost);
console.log(`Claude review completed: ${claudeReviewComments.length > 0}`);
console.log(`Review request exists: ${!!existingReviewRequest}`);
console.log(`Should post comment: ${shouldPost}`);
} catch (error) {
console.log('Error checking comments:', error);
core.setOutput('should-post', false); // If we can't check, don't post
}
- name: Wait 30 seconds before posting comment
if: steps.check-comment.outputs.should-post == 'true'
run: sleep 30
- name: Post review comment
if: steps.check-comment.outputs.should-post == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
let issueNumber;
let isPR = false;
// Determine issue/PR number and type based on event type
if (context.eventName === 'pull_request_review_comment' || context.eventName === 'pull_request_review') {
issueNumber = context.payload.pull_request?.number || context.issue.number;
isPR = true;
} else if (context.eventName === 'issue_comment' && context.payload.issue.pull_request) {
// This is a comment on a PR (not an issue)
issueNumber = context.payload.issue.number;
isPR = true;
} else {
// This is a regular issue - don't post review comment
issueNumber = context.issue.number;
isPR = false;
}
// Only post review comment on PRs, not regular issues
if (isPR) {
console.log(`Posting review comment on PR #${issueNumber}`);
await github.rest.issues.createComment({
issue_number: issueNumber,
owner: context.repo.owner,
repo: context.repo.repo,
body: '@claude review if the changes made in the above branch are as per the requirements and make changes to the above branch if issues still exist. MAINLY IT SHOULD NOT IMPACT ON THE CURRENT SPEED OF EXECUTION of existing features, not increasing the overhead.'
});
} else {
console.log(`Skipping review comment for regular issue #${issueNumber}`);
}
+2 -1
View File
@@ -10,6 +10,7 @@ jobs:
test:
name: Run tests and collect coverage
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
@@ -40,7 +41,7 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
echo "LOGLEVEL=DEBUG" >> $GITHUB_ENV
echo "PYTHONPATH=${{ github.workspace }}/src/praisonai-agents:$PYTHONPATH" >> $GITHUB_ENV
+1
View File
@@ -40,5 +40,6 @@ jobs:
uses: docker/build-push-action@v2
with:
context: .
file: ./docker/Dockerfile
push: true
tags: ghcr.io/mervinpraison/praisonai:latest
@@ -0,0 +1,76 @@
name: Gemini Automated Issue Triage
on:
issue_comment:
types: [created]
jobs:
triage-issue:
if: >
github.event_name == 'issue_comment' &&
!github.event.issue.pull_request &&
contains(github.event.comment.body, '@gemini triage') &&
(github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'COLLABORATOR')
timeout-minutes: 5
permissions:
issues: write
contents: read
id-token: write
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}
cancel-in-progress: true
runs-on: ubuntu-latest
steps:
- name: Generate GitHub App Token
id: generate_token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
- name: Run Gemini Issue Triage
uses: google-gemini/gemini-cli-action@main
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
ISSUE_TITLE: ${{ github.event.issue.title }}
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
REPOSITORY: ${{ github.repository }}
with:
version: 0.1.8-rc.0
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
OTLP_GCP_WIF_PROVIDER: ${{ secrets.OTLP_GCP_WIF_PROVIDER }}
OTLP_GOOGLE_CLOUD_PROJECT: ${{ secrets.OTLP_GOOGLE_CLOUD_PROJECT }}
settings_json: |
{
"coreTools": [
"run_shell_command(gh label list)",
"run_shell_command(gh issue edit)"
],
"telemetry": {
"enabled": true,
"target": "gcp"
},
"sandbox": false
}
prompt: |
You are an issue triage assistant. Analyze the current GitHub issue and apply the most appropriate existing labels.
Steps:
1. Run: `gh label list --limit 100` to get all available labels.
2. Review the issue title and body provided in the environment variables.
3. Select the most relevant labels from the existing labels, focusing on kind/*, area/*, and priority/*.
4. Apply the selected labels to this issue using: `gh issue edit ISSUE_NUMBER --add-label "label1,label2"`
Guidelines:
- Only use labels that already exist in the repository.
- Do not add comments or modify the issue content.
- Triage only the current issue.
- Assign all applicable kind/*, area/*, and priority/* labels based on the issue content.
+198
View File
@@ -0,0 +1,198 @@
name: Gemini Issue Review
on:
workflow_dispatch:
issue_comment:
types: [created]
permissions:
contents: write
issues: write
pull-requests: read
jobs:
review-issue:
if: >
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'issue_comment' &&
!github.event.issue.pull_request &&
contains(github.event.comment.body, '@gemini') &&
!contains(github.event.comment.body, '@gemini triage') &&
(github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'COLLABORATOR'))
runs-on: ubuntu-latest
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
steps:
- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
- name: Set up Git
run: |
git config --local user.email "[email protected]"
git config --local user.name "Gemini Bot"
- name: Get issue data
id: issue_data
env:
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
# Get issue number from event or context
if [ "${{ github.event_name }}" = "issue_comment" ]; then
ISSUE_NUMBER="${{ github.event.issue.number }}"
elif [ "${{ github.event_name }}" = "issues" ]; then
ISSUE_NUMBER="${{ github.event.issue.number }}"
else
echo "Unable to determine issue number"
exit 1
fi
# Get issue details
gh issue view $ISSUE_NUMBER --json title,body,labels,assignees > issue_details.json
# Extract additional instructions from comment if triggered by comment
ADDITIONAL_INSTRUCTIONS=""
if [ "${{ github.event_name }}" = "issue_comment" ]; then
COMMENT_BODY="${{ github.event.comment.body }}"
ADDITIONAL_INSTRUCTIONS=$(echo "$COMMENT_BODY" | sed -n 's/.*@gemini[[:space:]]*\(.*\)/\1/p' | head -1)
fi
echo "ISSUE_NUMBER=$ISSUE_NUMBER" >> $GITHUB_OUTPUT
echo "ADDITIONAL_INSTRUCTIONS=$ADDITIONAL_INSTRUCTIONS" >> $GITHUB_OUTPUT
- name: Run Gemini CLI
uses: ./.github/actions/gemini
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
ISSUE_NUMBER: ${{ steps.issue_data.outputs.ISSUE_NUMBER }}
ADDITIONAL_INSTRUCTIONS: ${{ steps.issue_data.outputs.ADDITIONAL_INSTRUCTIONS }}
REPOSITORY: ${{ github.repository }}
with:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
OTLP_GCP_WIF_PROVIDER: ${{ secrets.OTLP_GCP_WIF_PROVIDER }}
OTLP_GOOGLE_CLOUD_PROJECT: ${{ secrets.OTLP_GOOGLE_CLOUD_PROJECT }}
prompt: |
You are a helpful GitHub issue assistant. Your task is to analyze and help with GitHub issues.
**Issue Details:**
- Issue Number: #${ISSUE_NUMBER}
- Repository: ${REPOSITORY}
- Issue URL: ${{ github.event.issue.html_url }}
**Additional Instructions:** ${ADDITIONAL_INSTRUCTIONS}
**CRITICAL: When making code modifications, follow this EXACT workflow:**
**STEP 1: Analyze the Issue**
- Use: `gh issue view ${ISSUE_NUMBER} --json title,body,labels,assignees`
- Analyze issue content thoroughly
- Search codebase for related files using `glob`, `search_file_content`, `list_directory`
**STEP 2: If Code Changes Are Needed**
Create a new branch with 'gemini/' prefix:
- Use: `git checkout -b gemini/issue-${ISSUE_NUMBER}-description`
- Example: `git checkout -b gemini/issue-123-fix-sequential-tools`
**STEP 3: Make Code Modifications**
- Use `read_file` to examine existing code
- Use `write_file` or `replace` to make changes
- Use `search_file_content` to find related code
- Make focused, targeted changes to fix the issue
**STEP 4: Test Changes (if applicable)**
- Run relevant tests if test files exist
- Use `run_shell_command` to execute test commands
**STEP 5: Commit and Push Changes**
- Use: `git add .` (or specific files)
- Use: `git commit -m "Gemini: [Issue #${ISSUE_NUMBER}] Brief description of fix"`
- Use: `git push -u origin gemini/issue-${ISSUE_NUMBER}-description`
**STEP 6: Create Pull Request**
- Use: `gh pr create --title "Fix #${ISSUE_NUMBER}: Issue description" --body "Fixes #${ISSUE_NUMBER}\n\nSummary of changes:\n- Change 1\n- Change 2" --head gemini/issue-${ISSUE_NUMBER}-description --base main`
- This will return a PR URL like: https://github.com/repo/pull/123
**STEP 7: Comment on Issue with Results**
Use: `gh issue comment ${ISSUE_NUMBER} -b "MESSAGE"`
**Your final comment MUST include:**
- Summary of what was analyzed
- What changes were made (if any)
- Link to the created PR (if applicable)
- Brief explanation of the solution
**Example final comment:**
```
Hi! I've analyzed and fixed this issue.
**Problem:** Sequential tool calling was getting stuck after first tool call.
**Solution:** Added proper prompt handling after each tool call in the Ollama model integration.
**Changes Made:**
- Modified `src/praisonai-agents/ollama-sequential.py`
- Added continuation prompts for multi-step tool execution
**Pull Request:** https://github.com/MervinPraison/PraisonAI/pull/856
The fix is ready for review. Please test and let me know if you encounter any issues!
```
**IMPORTANT NOTES:**
- Always create branches with 'gemini/' prefix
- Always include issue number in branch name and commit message
- Always create PR that references the issue
- Always provide PR link in your final response
- Use the GITHUB_TOKEN environment variable for authentication
Please proceed with helping resolve this issue following this exact workflow.
settings_json: |
{
"coreTools": [
"run_shell_command(echo)",
"run_shell_command(gh issue view)",
"run_shell_command(gh issue comment)",
"run_shell_command(gh issue list)",
"run_shell_command(gh issue edit)",
"run_shell_command(gh pr create)",
"run_shell_command(gh pr view)",
"run_shell_command(gh pr list)",
"run_shell_command(cat)",
"run_shell_command(head)",
"run_shell_command(tail)",
"run_shell_command(grep)",
"run_shell_command(find)",
"run_shell_command(git checkout)",
"run_shell_command(git add)",
"run_shell_command(git commit)",
"run_shell_command(git push)",
"run_shell_command(git status)",
"run_shell_command(git branch)",
"list_directory",
"read_file",
"read_many_files",
"write_file",
"replace",
"glob",
"search_file_content",
"web_fetch",
"google_web_search",
"save_memory"
],
"telemetry": {
"enabled": false,
"otlpGcpWifProvider": "${{ secrets.OTLP_GCP_WIF_PROVIDER }}",
"googleCloudProject": "${{ secrets.OTLP_GOOGLE_CLOUD_PROJECT }}"
}
}
+242
View File
@@ -0,0 +1,242 @@
name: Gemini PR Review
on:
issue_comment:
types: [created]
workflow_dispatch:
inputs:
pr_number:
description: 'PR number to review'
required: true
type: number
jobs:
review-pr:
if: >
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
contains(github.event.comment.body, '@gemini') &&
(github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'COLLABORATOR'))
timeout-minutes: 15
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
pull-requests: write
issues: write
steps:
- name: Generate GitHub App Token
id: generate_token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
- name: Determine checkout ref
id: checkout_ref
run: |
if [ "${{ github.event_name }}" = "issue_comment" ]; then
echo "ref=refs/pull/${{ github.event.issue.number }}/head" >> "$GITHUB_OUTPUT"
else
echo "ref=${{ github.event.pull_request.head.sha }}" >> "$GITHUB_OUTPUT"
fi
- name: Checkout PR code
uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
ref: ${{ steps.checkout_ref.outputs.ref }}
fetch-depth: 0
- name: Get PR details
id: get_pr
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
PR_NUMBER=${{ github.event.inputs.pr_number }}
elif [ "${{ github.event_name }}" = "issue_comment" ]; then
PR_NUMBER=${{ github.event.issue.number }}
else
PR_NUMBER=${{ github.event.pull_request.number }}
fi
echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
# Extract additional instructions from comment (if triggered by comment)
ADDITIONAL_INSTRUCTIONS=""
if [ "${{ github.event_name }}" = "issue_comment" ]; then
COMMENT_BODY="${{ github.event.comment.body }}"
ADDITIONAL_INSTRUCTIONS=$(echo "$COMMENT_BODY" | sed 's/.*@gemini//' | xargs)
fi
echo "additional_instructions=$ADDITIONAL_INSTRUCTIONS" >> "$GITHUB_OUTPUT"
# Get PR details
PR_DATA=$(gh pr view $PR_NUMBER --json title,body,additions,deletions,changedFiles,baseRefName,headRefName)
echo "pr_data=$PR_DATA" >> "$GITHUB_OUTPUT"
# Get file changes
CHANGED_FILES=$(gh pr diff $PR_NUMBER --name-only)
echo "changed_files<<EOF" >> "$GITHUB_OUTPUT"
echo "$CHANGED_FILES" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
- name: Run Gemini PR Review
uses: ./.github/actions/gemini
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
PR_NUMBER: ${{ steps.get_pr.outputs.pr_number }}
PR_DATA: ${{ steps.get_pr.outputs.pr_data }}
CHANGED_FILES: ${{ steps.get_pr.outputs.changed_files }}
ADDITIONAL_INSTRUCTIONS: ${{ steps.get_pr.outputs.additional_instructions }}
REPOSITORY: ${{ github.repository }}
with:
version: 0.1.8-rc.0
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
OTLP_GCP_WIF_PROVIDER: ${{ secrets.OTLP_GCP_WIF_PROVIDER }}
OTLP_GOOGLE_CLOUD_PROJECT: ${{ secrets.OTLP_GOOGLE_CLOUD_PROJECT }}
settings_json: |
{
"coreTools": [
"run_shell_command(echo)",
"run_shell_command(gh pr view)",
"run_shell_command(gh pr diff)",
"run_shell_command(gh pr comment)",
"run_shell_command(gh pr list)",
"run_shell_command(cat)",
"run_shell_command(head)",
"run_shell_command(tail)",
"run_shell_command(grep)",
"run_shell_command(find)",
"run_shell_command(git checkout)",
"run_shell_command(git add)",
"run_shell_command(git commit)",
"run_shell_command(git push)",
"run_shell_command(git status)",
"run_shell_command(git branch)",
"run_shell_command(git fetch)",
"list_directory",
"read_file",
"read_many_files",
"write_file",
"replace",
"glob",
"search_file_content",
"web_fetch",
"google_web_search",
"save_memory"
],
"telemetry": {
"enabled": false,
"target": "gcp"
},
"sandbox": false
}
prompt: |
You are an expert code reviewer and AI assistant for Pull Requests. You can review code AND make modifications to improve the PR.
**PR Details:**
- PR Number: #$PR_NUMBER
- Repository: $REPOSITORY
- Additional Instructions: $ADDITIONAL_INSTRUCTIONS
**CRITICAL: When making code modifications, follow this EXACT workflow:**
**STEP 1: Analyze the PR**
- Use: `echo "$PR_DATA"` to get PR details (JSON format)
- Use: `echo "$CHANGED_FILES"` to get changed files list
- Use: `gh pr diff ${PR_NUMBER}` to see the full diff
- Use: `gh pr view ${PR_NUMBER} --json title,body,headRefName` to get PR info
- Analyze the code changes thoroughly
**STEP 2: If Code Improvements Are Needed**
**IMPORTANT:** DO NOT create a new branch! Work on the EXISTING PR branch.
- Use: `git fetch origin` to get latest changes
- Get PR branch name: `gh pr view ${PR_NUMBER} --json headRefName`
- Switch to PR branch: `git checkout BRANCH_NAME` (use actual branch name from PR)
- Use: `git pull origin BRANCH_NAME` to get latest PR changes
**STEP 3: Make Code Modifications**
- Use `read_file` to examine existing code
- Use `write_file` or `replace` to make improvements
- Use `search_file_content` to find related code
- Make focused, targeted improvements to the PR
**STEP 4: Test Changes (if applicable)**
- Run relevant tests if test files exist
- Use `run_shell_command` to execute test commands
**STEP 5: Commit and Push Changes to EXISTING PR Branch**
- Use: `git add .` (or specific files)
- Use: `git commit -m "Gemini: [PR #${PR_NUMBER}] Brief description of improvements"`
- Use: `git push origin BRANCH_NAME` (push to EXISTING PR branch)
**STEP 6: Review and Comment on PR**
Write comprehensive review and post comment with your analysis and any improvements made.
Use: `gh pr comment ${PR_NUMBER} -b "MESSAGE"`
Review Guidelines:
- Focus on code quality, security, performance, and maintainability
- Check for common issues: potential bugs, security vulnerabilities, performance bottlenecks
- Verify error handling and edge cases
- Look for code style and best practices
- Comment on architecture and design decisions if significant
- Be constructive and specific in feedback
- Highlight both issues and positive aspects
- Suggest improvements with examples when possible
Review Areas:
- **Security**: Authentication, authorization, input validation, data sanitization
- **Performance**: Algorithms, database queries, caching, resource usage
- **Reliability**: Error handling, logging, testing coverage, edge cases
- **Maintainability**: Code structure, documentation, naming conventions
- **Functionality**: Logic correctness, requirements fulfillment
Output Format:
Structure your review using this exact format with markdown:
## 📋 Review Summary
Provide a brief 2-3 sentence overview of the PR and overall assessment.
## 🔍 General Feedback
- List general observations about code quality
- Mention overall patterns or architectural decisions
- Highlight positive aspects of the implementation
- Note any recurring themes across files
## 🎯 Specific Feedback
Only include sections below that have actual issues. If there are no issues in a priority category, omit that entire section.
### 🔴 Critical
(Only include this section if there are critical issues)
Issues that must be addressed before merging (security vulnerabilities, breaking changes, major bugs):
- **File: `filename:line`** - Description of critical issue with specific recommendation
### 🟡 High
(Only include this section if there are high priority issues)
Important issues that should be addressed (performance problems, design flaws, significant bugs):
- **File: `filename:line`** - Description of high priority issue with suggested fix
### 🟢 Medium
(Only include this section if there are medium priority issues)
Improvements that would enhance code quality (style issues, minor optimizations, better practices):
- **File: `filename:line`** - Description of medium priority improvement
### 🔵 Low
(Only include this section if there are suggestions)
Nice-to-have improvements and suggestions (documentation, naming, minor refactoring):
- **File: `filename:line`** - Description of suggestion or enhancement
**Note**: If no specific issues are found in any category, simply state "No specific issues identified in this review."
## ✅ Highlights
(Only include this section if there are positive aspects to highlight)
- Mention specific good practices or implementations
- Acknowledge well-written code sections
- Note improvements from previous versions
---
*Review completed by Gemini CLI*
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
echo "LOGLEVEL=DEBUG" >> $GITHUB_ENV
- name: Install dependencies
+2 -1
View File
@@ -26,6 +26,7 @@ on:
jobs:
comprehensive-test:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
matrix:
python-version: ["3.11"]
@@ -58,7 +59,7 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
- name: Run Comprehensive Test Suite
run: |
+8 -7
View File
@@ -9,6 +9,7 @@ on:
jobs:
test-core:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
matrix:
python-version: [3.11]
@@ -41,13 +42,13 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
echo "LOGLEVEL=DEBUG" >> $GITHUB_ENV
echo "PYTHONPATH=${{ github.workspace }}/src/praisonai-agents:$PYTHONPATH" >> $GITHUB_ENV
# Also export to current shell session for immediate availability
export OPENAI_API_KEY="${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}"
export OPENAI_API_BASE="${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}"
export OPENAI_MODEL_NAME="${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}"
export OPENAI_MODEL_NAME="${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}"
export LOGLEVEL=DEBUG
# Verify immediate availability
echo "🔧 Immediate verification in same step:"
@@ -125,7 +126,7 @@ jobs:
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}
OPENAI_API_BASE: ${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}
OPENAI_MODEL_NAME: ${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}
OPENAI_MODEL_NAME: ${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}
LOGLEVEL: DEBUG
run: |
echo "🔍 Testing PraisonAI API key usage directly..."
@@ -151,7 +152,7 @@ jobs:
return 'INVALID_TYPE'
print('🔧 Direct PraisonAI API Key Check:')
env_api_key = os.environ.get(\\"OPENAI_API_KEY\\", \\"NOT_SET\\")
env_api_key = os.environ.get(\"OPENAI_API_KEY\", \"NOT_SET\")
print(f'Environment OPENAI_API_KEY: {get_key_display_value(env_api_key)}...')
from praisonai import PraisonAI
@@ -163,9 +164,9 @@ jobs:
from praisonai.inc.models import PraisonAIModel
print('\\\\n🧪 Testing PraisonAIModel with explicit API key (CrewAI method):')
print('\\n🧪 Testing PraisonAIModel with explicit API key (CrewAI method):')
model_with_explicit_key = PraisonAIModel(
model='openai/gpt-4o-mini',
model='openai/gpt-5-nano',
base_url=praisonai.config_list[0].get('base_url'),
api_key=api_key_from_config # This will be a string from praisonai.config_list
)
@@ -250,7 +251,7 @@ jobs:
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}
OPENAI_API_BASE: ${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}
OPENAI_MODEL_NAME: ${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}
OPENAI_MODEL_NAME: ${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}
LOGLEVEL: DEBUG
run: |
echo "🧪 Running legacy tests with real API key..."
+13 -2
View File
@@ -13,6 +13,7 @@ on:
jobs:
test-examples:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout code
@@ -41,8 +42,11 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
echo "PYTHONPATH=${{ github.workspace }}/src/praisonai-agents:$PYTHONPATH" >> $GITHUB_ENV
echo "PRAISONAI_TELEMETRY_DISABLED=true" >> $GITHUB_ENV
echo "PRAISONAI_DISABLE_TELEMETRY=true" >> $GITHUB_ENV
echo "DO_NOT_TRACK=true" >> $GITHUB_ENV
- name: Test Key Example Scripts
run: |
@@ -73,6 +77,7 @@ jobs:
performance-test:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout code
@@ -97,6 +102,12 @@ jobs:
# Install knowledge dependencies from praisonai-agents
uv pip install --system "praisonaiagents[knowledge]"
- name: Set environment variables
run: |
echo "PRAISONAI_TELEMETRY_DISABLED=true" >> $GITHUB_ENV
echo "PRAISONAI_DISABLE_TELEMETRY=true" >> $GITHUB_ENV
echo "DO_NOT_TRACK=true" >> $GITHUB_ENV
- name: Run Performance Benchmarks
run: |
echo "🏃 Running performance benchmarks..."
@@ -161,4 +172,4 @@ jobs:
with:
name: performance-report
path: performance_report.md
retention-days: 30
retention-days: 5
+2 -1
View File
@@ -24,6 +24,7 @@ on:
jobs:
framework-tests:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
matrix:
python-version: [3.11]
@@ -55,7 +56,7 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
- name: Test ${{ matrix.framework }} Framework
run: |
+1
View File
@@ -26,6 +26,7 @@ jobs:
real-tests:
runs-on: ubuntu-latest
if: ${{ github.event.inputs.confirm_costs == 'true' && github.event.inputs.framework != 'none' }}
timeout-minutes: 15
strategy:
matrix:
+4 -3
View File
@@ -5,6 +5,7 @@ on: [push, pull_request]
jobs:
quick-test:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout code
@@ -34,7 +35,7 @@ jobs:
run: |
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY || 'sk-test-key-for-github-actions-testing-only-not-real' }}" >> $GITHUB_ENV
echo "OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE || 'https://api.openai.com/v1' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-4o-mini' }}" >> $GITHUB_ENV
echo "OPENAI_MODEL_NAME=${{ secrets.OPENAI_MODEL_NAME || 'gpt-5-nano' }}" >> $GITHUB_ENV
echo "LOGLEVEL=DEBUG" >> $GITHUB_ENV
echo "PYTHONPATH=${{ github.workspace }}/src/praisonai-agents:$PYTHONPATH" >> $GITHUB_ENV
@@ -315,8 +316,8 @@ jobs:
try:
from praisonai.inc.models import PraisonAIModel
# Test PraisonAIModel with openai/gpt-4o-mini (from YAML)
model = PraisonAIModel(model='openai/gpt-4o-mini')
# Test PraisonAIModel with openai/gpt-5-nano (from YAML)
model = PraisonAIModel(model='openai/gpt-5-nano')
print('🤖 PraisonAIModel Configuration:')
print(f' model: {model.model}')
+3 -1
View File
@@ -75,4 +75,6 @@ agents/praisonaiagents/praisonaiagents.egg-info
# Local Netlify folder
.netlify
.qodo
CopilotKit*
CopilotKit*
.gemini
issue_details.json
+4 -4
View File
@@ -120,6 +120,10 @@ agent.start('Write a movie script about a robot in Mars');
![PraisonAI CLI Demo](docs/demo/praisonai-cli-demo.gif)
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=MervinPraison/PraisonAI&type=Date)](https://docs.praison.ai)
## AI Agents Flow
```mermaid
@@ -557,10 +561,6 @@ uv pip install -r pyproject.toml --extra "crewai,autogen"
- 🖼️ Vision Language Model (VLM) Support
- 🎙️ Real-time Voice Interaction
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=MervinPraison/PraisonAI&type=Date)](https://docs.praison.ai)
## Video Tutorials
| Topic | Video |
+1 -1
View File
@@ -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.84" \
"praisonai[api]" \
gunicorn \
markdown
+1 -1
View File
@@ -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.84" \
"praisonai[chat]" \
"embedchain[github,youtube]"
+1 -1
View File
@@ -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.84" \
"praisonai[ui]" \
"praisonai[chat]" \
"praisonai[realtime]" \
+1 -1
View File
@@ -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.84" \
"praisonai[ui]" \
"praisonai[crewai]"
+2 -2
View File
@@ -121,7 +121,7 @@ healthcheck:
## 📦 Package Versions
All Docker images use consistent, up-to-date versions:
- PraisonAI: `>=2.2.37`
- PraisonAI: `>=2.2.84`
- 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.84" "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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/Code_Analysis_Agent.ipynb)\n"
=======
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
=======
}
@@ -26,14 +26,14 @@
"\n",
"### ✨ Key Benefits:\n",
"- 🚀 **Scalable & Customizable** – Industry-agnostic design \n",
"- 💰 **Cost-Effective** – Runs on GPT-4o-mini \n",
"- 💰 **Cost-Effective** – Runs on gpt-5-nano \n",
"- 🛠️ **Production-Ready** – Realistic automation framework \n",
"- 🔄 **Complete Pipeline** – End-to-end flow\n",
"\n",
"---\n",
"\n",
"### 🔧 Technologies:\n",
"**PraisonAI** • **OpenAI GPT-4o-mini** • **Python** • **SQLite** \n",
"**PraisonAI** • **OpenAI gpt-5-nano** • **Python** • **SQLite** \n",
"**Multi-Agent Architecture**\n",
"\n",
"---\n",
@@ -100,7 +100,7 @@
"text": [
"📦 Dependencies installed!\n",
"🔄 Using PraisonAI Multi-Agent Framework\n",
"🤖 Powered by OpenAI GPT-4o-mini\n"
"🤖 Powered by OpenAI gpt-5-nano\n"
]
}
],
@@ -116,7 +116,7 @@
"\n",
"print(\"📦 Dependencies installed!\")\n",
"print(\"🔄 Using PraisonAI Multi-Agent Framework\")\n",
"print(\"🤖 Powered by OpenAI GPT-4o-mini\")"
"print(\"🤖 Powered by OpenAI gpt-5-nano\")"
]
},
{
@@ -5102,7 +5102,7 @@
"\n",
"🎊 BLENDER PRODUCTION STUDIO COMPLETE!\n",
"🎬 17-Agent AI System Successfully Executed\n",
"🤖 Powered by PraisonAI + OpenAI GPT-4o-mini\n"
"🤖 Powered by PraisonAI + OpenAI gpt-5-nano\n"
]
}
],
@@ -5149,7 +5149,7 @@
"\n",
"print(\"\\n🎊 BLENDER PRODUCTION STUDIO COMPLETE!\")\n",
"print(\"🎬 17-Agent AI System Successfully Executed\")\n",
"print(\"🤖 Powered by PraisonAI + OpenAI GPT-4o-mini\")"
"print(\"🤖 Powered by PraisonAI + OpenAI gpt-5-nano\")"
]
}
],
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -182,7 +182,7 @@
" ]\n",
" for turn in range(max_turns):\n",
" response = client.chat.completions.create(\n",
" model=\"gpt-4o-mini\",\n",
" model=\"gpt-5-nano\",\n",
" messages=history,\n",
" max_tokens=500\n",
" )\n",
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -1262,7 +1262,7 @@
"\n",
"🎊 AI SHOPPING ASSISTANT ACTIVE!\n",
"🛒 Ready to help customers with natural language shopping\n",
"🤖 Powered by PraisonAI + OpenAI GPT-4o-mini\n"
"🤖 Powered by PraisonAI + OpenAI gpt-5-nano\n"
]
}
],
@@ -1305,7 +1305,7 @@
"\n",
"print(\"\\n🎊 AI SHOPPING ASSISTANT ACTIVE!\")\n",
"print(\"🛒 Ready to help customers with natural language shopping\")\n",
"print(\"🤖 Powered by PraisonAI + OpenAI GPT-4o-mini\")"
"print(\"🤖 Powered by PraisonAI + OpenAI gpt-5-nano\")"
]
},
{
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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 @@
]
}
]
}
}
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -0,0 +1,482 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "y8L9VFhhdjhL"
},
"source": [
"# Financial Coaching Agent using PraisonAIAgents"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6UxqTg7pdkm-"
},
"source": [
"This notebook demonstrates how to build a Financial Coaching Agent using the `praisonaiagents` library.\n",
"The agent analyzes user financial data and provides actionable recommendations for budgeting, savings, and debt management.\n",
"The notebook is CI-friendly: it uses dummy data if API keys are not set, so all tests/checks will pass."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CNqB5dPffV3m"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/Finance_Market_Job_Agents/Financial_Coaching_Agent.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3cdm72N2doNq"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Pl85wGWzdpTK"
},
"outputs": [],
"source": [
"!pip install praisonaiagents pandas"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YOlEEkk4ePqy"
},
"source": [
"# Set up key"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "T9zKRkv_eRsc"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"# Try to get keys from environment variables, or use placeholders\n",
"OPENAI_API_KEY = os.environ.get(\"OPENAI_API_KEY\", \"sk-..\")\n",
"\n",
"# Set them in the environment for downstream code\n",
"os.environ[\"OPENAI_API_KEY\"] = OPENAI_API_KEY\n",
"\n",
"def is_valid_key(key, prefix):\n",
" return key and key != f\"{prefix}-..\" and key.startswith(prefix)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FGYJpB9eeaSY"
},
"source": [
"# Tool: Financial Summary"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "asLRt9gAecJ2"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"class FinancialSummaryTool:\n",
" \"\"\"\n",
" Custom tool to summarize financial data and calculate basic stats.\n",
" \"\"\"\n",
" def __init__(self, income, expenses, debts):\n",
" self.income = income\n",
" self.expenses = expenses\n",
" self.debts = debts\n",
"\n",
" def summary(self):\n",
" total_expenses = sum(self.expenses.values())\n",
" surplus = self.income - total_expenses\n",
" total_debt = sum(d['amount'] for d in self.debts)\n",
" return {\n",
" \"total_expenses\": total_expenses,\n",
" \"surplus\": surplus,\n",
" \"total_debt\": total_debt,\n",
" \"expense_breakdown\": self.expenses,\n",
" \"debts\": self.debts\n",
" }"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lIysLOOdef3b"
},
"source": [
"# YAML prompt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GDbWRmp2egsz",
"outputId": "cf4e4d15-7446-4613-9a20-298674f0b4d3"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'agent': {'name': 'Financial Coaching Agent', 'description': 'An agent that analyzes user financial data and provides actionable recommendations for budgeting, savings, and debt management.\\n', 'tools': [{'name': 'FinancialSummaryTool', 'description': 'Summarizes income, expenses, and debts for the agent.'}], 'workflow': [{'step': 'Summarize financial data using FinancialSummaryTool'}, {'step': 'Analyze summary and provide recommendations'}]}, 'inputs': ['monthly_income', 'expenses', 'debts'], 'outputs': ['recommendations']}\n"
]
}
],
"source": [
"import yaml\n",
"\n",
"yaml_prompt = \"\"\"\n",
"agent:\n",
" name: Financial Coaching Agent\n",
" description: |\n",
" An agent that analyzes user financial data and provides actionable recommendations for budgeting, savings, and debt management.\n",
" tools:\n",
" - name: FinancialSummaryTool\n",
" description: Summarizes income, expenses, and debts for the agent.\n",
" workflow:\n",
" - step: Summarize financial data using FinancialSummaryTool\n",
" - step: Analyze summary and provide recommendations\n",
"inputs:\n",
" - monthly_income\n",
" - expenses\n",
" - debts\n",
"outputs:\n",
" - recommendations\n",
"\"\"\"\n",
"print(yaml.safe_load(yaml_prompt))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C-FE-hTKekHK"
},
"source": [
"# Main"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000,
"referenced_widgets": [
"b27151e0a1ec47d8a36433ef503eede2",
"58e152a95c1d49d68b45aea3b837b6d3"
]
},
"id": "48oIH5LYek-q",
"outputId": "b501eae2-63c2-434d-f5c3-abba6b93956e"
},
"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\">Financial Coaching 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\">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;229mFinancial Coaching Agent\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": "b27151e0a1ec47d8a36433ef503eede2",
"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 11.0s</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[2mResponse generated in 11.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> You are a financial coach. Analyze the following summary and provide actionable recommendations: - Monthly <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> income: $3000 - Total expenses: $2350 - Surplus: $650 - Total debt: $10000 - Expense breakdown: {'Housing': <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> 1200, 'Food': 400, 'Transportation': 200, 'Entertainment': 150, 'Savings': 300, 'Other': 100} - Debts: <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> [{'name': 'Credit Card', 'amount': 2000, 'interest_rate': 18.0, 'min_payment': 50}, {'name': 'Student Loan', <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> 'amount': 8000, 'interest_rate': 5.0, 'min_payment': 100}] <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 are a financial coach. Analyze the following summary and provide actionable recommendations: - Monthly \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m income: $3000 - Total expenses: $2350 - Surplus: $650 - Total debt: $10000 - Expense breakdown: {'Housing': \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m 1200, 'Food': 400, 'Transportation': 200, 'Entertainment': 150, 'Savings': 300, 'Other': 100} - Debts: \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m [{'name': 'Credit Card', 'amount': 2000, 'interest_rate': 18.0, 'min_payment': 50}, {'name': 'Student Loan', \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m 'amount': 8000, 'interest_rate': 5.0, 'min_payment': 100}] \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> Based on the provided financial summary, here are some actionable recommendations to help manage your finances <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> more effectively and reduce your debt: <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\"> 1 </span><span style=\"font-weight: bold\">Prioritize Debt Repayment:</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>Focus on paying off the high-interest debt first, which is the credit card debt with an 18% interest <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>rate. Consider using the debt avalanche method, where you pay extra towards the debt with the highest <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>interest rate while making minimum payments on others. <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>With a surplus of $650, allocate a significant portion of this towards the credit card debt. For example, <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>you could pay $400 towards the credit card debt (including the $50 minimum payment), which would help <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>reduce the principal faster and save on interest. <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\"> 2 </span><span style=\"font-weight: bold\">Review and Adjust Expenses:</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\">Housing:</span> At $1200, housing is a significant portion of your expenses. If possible, explore options to <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>reduce this cost, such as negotiating rent, finding a roommate, or moving to a less expensive place. <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\">Food:</span> Consider meal planning, cooking at home, and reducing dining out to lower the $400 food expense. <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\">Entertainment:</span> At $150, see if you can cut back on discretionary spending. Look for free or low-cost <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>entertainment options. <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\">Other Expenses:</span> Review the $100 in 'Other' expenses to identify any non-essential spending that can be <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>reduced or eliminated. <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\"> 3 </span><span style=\"font-weight: bold\">Increase Savings:</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>While you are already saving $300 monthly, consider increasing this amount once the high-interest debt is <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>paid off. Building an emergency fund should be a priority to cover 3-6 months of expenses. <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\"> 4 </span><span style=\"font-weight: bold\">Boost Income:</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>Explore opportunities to increase your income, such as taking on a part-time job, freelancing, or selling <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>unused items. Any additional income can accelerate debt repayment and increase savings. <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\"> 5 </span><span style=\"font-weight: bold\">Monitor and Adjust:</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>Regularly review your budget and expenses to ensure you are on track with your financial goals. Adjust <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>your plan as needed to accommodate changes in income or expenses. <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\"> 6 </span><span style=\"font-weight: bold\">Consider Debt Consolidation:</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>If you have a good credit score, look into consolidating your credit card debt into a lower-interest <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>personal loan. This could reduce your overall interest payments and simplify your debt repayment process. <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> By implementing these recommendations, you can effectively manage your finances, reduce debt, and work towards <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> achieving greater financial stability. <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 Based on the provided financial summary, here are some actionable recommendations to help manage your finances \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m more effectively and reduce your debt: \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 1 \u001b[0m\u001b[1mPrioritize Debt Repayment:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mFocus on paying off the high-interest debt first, which is the credit card debt with an 18% interest \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mrate. Consider using the debt avalanche method, where you pay extra towards the debt with the highest \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0minterest rate while making minimum payments on others. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mWith a surplus of $650, allocate a significant portion of this towards the credit card debt. For example, \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0myou could pay $400 towards the credit card debt (including the $50 minimum payment), which would help \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mreduce the principal faster and save on interest. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 2 \u001b[0m\u001b[1mReview and Adjust Expenses:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0m\u001b[1mHousing:\u001b[0m At $1200, housing is a significant portion of your expenses. If possible, explore options to \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mreduce this cost, such as negotiating rent, finding a roommate, or moving to a less expensive place. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0m\u001b[1mFood:\u001b[0m Consider meal planning, cooking at home, and reducing dining out to lower the $400 food expense. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0m\u001b[1mEntertainment:\u001b[0m At $150, see if you can cut back on discretionary spending. Look for free or low-cost \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mentertainment options. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0m\u001b[1mOther Expenses:\u001b[0m Review the $100 in 'Other' expenses to identify any non-essential spending that can be \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mreduced or eliminated. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 3 \u001b[0m\u001b[1mIncrease Savings:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mWhile you are already saving $300 monthly, consider increasing this amount once the high-interest debt is \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mpaid off. Building an emergency fund should be a priority to cover 3-6 months of expenses. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 4 \u001b[0m\u001b[1mBoost Income:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mExplore opportunities to increase your income, such as taking on a part-time job, freelancing, or selling \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0munused items. Any additional income can accelerate debt repayment and increase savings. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 5 \u001b[0m\u001b[1mMonitor and Adjust:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mRegularly review your budget and expenses to ensure you are on track with your financial goals. Adjust \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0myour plan as needed to accommodate changes in income or expenses. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 6 \u001b[0m\u001b[1mConsider Debt Consolidation:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIf you have a good credit score, look into consolidating your credit card debt into a lower-interest \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mpersonal loan. This could reduce your overall interest payments and simplify your debt repayment process. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m By implementing these recommendations, you can effectively manage your finances, reduce debt, and work towards \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m achieving greater financial stability. \u001b[36m│\u001b[0m\n",
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=== Financial Coaching Agent Recommendations ===\n",
"Based on the provided financial summary, here are some actionable recommendations to help manage your finances more effectively and reduce your debt:\n",
"\n",
"1. **Prioritize Debt Repayment:**\n",
" - Focus on paying off the high-interest debt first, which is the credit card debt with an 18% interest rate. Consider using the debt avalanche method, where you pay extra towards the debt with the highest interest rate while making minimum payments on others.\n",
" - With a surplus of $650, allocate a significant portion of this towards the credit card debt. For example, you could pay $400 towards the credit card debt (including the $50 minimum payment), which would help reduce the principal faster and save on interest.\n",
"\n",
"2. **Review and Adjust Expenses:**\n",
" - **Housing:** At $1200, housing is a significant portion of your expenses. If possible, explore options to reduce this cost, such as negotiating rent, finding a roommate, or moving to a less expensive place.\n",
" - **Food:** Consider meal planning, cooking at home, and reducing dining out to lower the $400 food expense.\n",
" - **Entertainment:** At $150, see if you can cut back on discretionary spending. Look for free or low-cost entertainment options.\n",
" - **Other Expenses:** Review the $100 in 'Other' expenses to identify any non-essential spending that can be reduced or eliminated.\n",
"\n",
"3. **Increase Savings:**\n",
" - While you are already saving $300 monthly, consider increasing this amount once the high-interest debt is paid off. Building an emergency fund should be a priority to cover 3-6 months of expenses.\n",
"\n",
"4. **Boost Income:**\n",
" - Explore opportunities to increase your income, such as taking on a part-time job, freelancing, or selling unused items. Any additional income can accelerate debt repayment and increase savings.\n",
"\n",
"5. **Monitor and Adjust:**\n",
" - Regularly review your budget and expenses to ensure you are on track with your financial goals. Adjust your plan as needed to accommodate changes in income or expenses.\n",
"\n",
"6. **Consider Debt Consolidation:**\n",
" - If you have a good credit score, look into consolidating your credit card debt into a lower-interest personal loan. This could reduce your overall interest payments and simplify your debt repayment process.\n",
"\n",
"By implementing these recommendations, you can effectively manage your finances, reduce debt, and work towards achieving greater financial stability.\n"
]
}
],
"source": [
"from praisonaiagents import Agent\n",
"\n",
"# Dummy data for CI/public use\n",
"dummy_financial_data = {\n",
" \"monthly_income\": 3000,\n",
" \"expenses\": {\n",
" \"Housing\": 1200,\n",
" \"Food\": 400,\n",
" \"Transportation\": 200,\n",
" \"Entertainment\": 150,\n",
" \"Savings\": 300,\n",
" \"Other\": 100\n",
" },\n",
" \"debts\": [\n",
" {\"name\": \"Credit Card\", \"amount\": 2000, \"interest_rate\": 18.0, \"min_payment\": 50},\n",
" {\"name\": \"Student Loan\", \"amount\": 8000, \"interest_rate\": 5.0, \"min_payment\": 100}\n",
" ]\n",
"}\n",
"\n",
"income = dummy_financial_data[\"monthly_income\"]\n",
"expenses = dummy_financial_data[\"expenses\"]\n",
"debts = dummy_financial_data[\"debts\"]\n",
"\n",
"tool = FinancialSummaryTool(income, expenses, debts)\n",
"summary = tool.summary()\n",
"\n",
"if not is_valid_key(OPENAI_API_KEY, \"sk\"):\n",
" print(\"API key not set or is a placeholder. Using dummy recommendations for CI/testing.\")\n",
" recommendations = \"\"\"\n",
" - Review your monthly expenses and identify areas to cut back.\n",
" - Increase your monthly savings by at least 10%.\n",
" - Pay off high-interest debts first (e.g., Credit Card).\n",
" - Build an emergency fund covering at least 3-6 months of expenses.\n",
" \"\"\"\n",
"else:\n",
" prompt = f\"\"\"\n",
" You are a financial coach. Analyze the following summary and provide actionable recommendations:\n",
" - Monthly income: ${summary['surplus'] + summary['total_expenses']}\n",
" - Total expenses: ${summary['total_expenses']}\n",
" - Surplus: ${summary['surplus']}\n",
" - Total debt: ${summary['total_debt']}\n",
" - Expense breakdown: {summary['expense_breakdown']}\n",
" - Debts: {summary['debts']}\n",
" \"\"\"\n",
" agent = Agent(\n",
" name=\"Financial Coaching Agent\",\n",
" api_key=OPENAI_API_KEY\n",
" )\n",
" # Use start(prompt) instead of run()\n",
" recommendations = agent.start(prompt)\n",
"\n",
"print(\"=== Financial Coaching Agent Recommendations ===\")\n",
"print(recommendations)"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,573 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "vUS5f8IhI4Iw"
},
"source": [
"# Air Quality Analysis Agent using PraisonAIAgents"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IPiJvwVgI5hK"
},
"source": [
"## Description\n",
"\n",
"This notebook demonstrates how to build an Air Quality Analysis Agent using the `praisonaiagents` library. \n",
"The agent retrieves real-time air quality data for a specified location, analyzes the results, and provides actionable insights or health recommendations. \n",
"You will learn how to set up the environment, configure API keys, use custom tools, and orchestrate the agent workflow with a YAML prompt."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oqdL8WpNTKu5"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/MervinPraison/PraisonAI/blob/main/examples/cookbooks/Health_Fitness_Agents/Air_Quality_Analysis_Agent.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "p7CFp0tkJKmU"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "q6Aq57bqJKFc"
},
"outputs": [],
"source": [
"!pip install praisonaiagents firecrawl requests"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "NLJn9uGVJldu"
},
"source": [
"# Set up API Key"
]
},{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"id": "ZxHL7mJYJpVb"
},
"outputs": [],
"source": [
"# Replace with your actual API keys\n",
"FIRECRAWL_API_KEY = \"fc-...\" # Your Firecrawl API key\n",
"OPENAI_API_KEY = \"sk-...\" # Your OpenAI API key\n",
"\n",
"import os\n",
"os.environ[\"FIRECRAWL_API_KEY\"] = FIRECRAWL_API_KEY\n",
"os.environ[\"OPENAI_API_KEY\"] = OPENAI_API_KEY\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eVb00IhbJ60M"
},
"source": [
"# Tools"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"id": "3YgwDwyFLXlU"
},
"outputs": [],
"source": [
"import requests\n",
"from firecrawl import FirecrawlApp\n",
"from typing import Dict\n",
"\n",
"class AQIDataFetcher:\n",
" def __init__(self, firecrawl_key: str):\n",
" self.firecrawl = FirecrawlApp(api_key=firecrawl_key)\n",
"\n",
" def fetch(self, country: str, state: str, city: str) -> Dict:\n",
" country_clean = country.lower().replace(' ', '-')\n",
" city_clean = city.lower().replace(' ', '-')\n",
" if not state or state.lower() == 'none':\n",
" url = f\"https://www.aqi.in/dashboard/{country_clean}/{city_clean}\"\n",
" else:\n",
" state_clean = state.lower().replace(' ', '-')\n",
" url = f\"https://www.aqi.in/dashboard/{country_clean}/{state_clean}/{city_clean}\"\n",
"\n",
" # Check if the URL is valid and reachable\n",
" print(f\"Testing URL: {url}\")\n",
" try:\n",
" resp = requests.get(url)\n",
" print(f\"Status code: {resp.status_code}\")\n",
" if resp.status_code != 200:\n",
" print(f\"URL not reachable: {url} (status code: {resp.status_code})\")\n",
" return None\n",
" except Exception as e:\n",
" print(f\"Error: {e}\")\n",
" return None\n",
"\n",
" schema = {\n",
" \"type\": \"object\",\n",
" \"properties\": {\n",
" \"aqi\": {\"type\": \"number\", \"description\": \"Air Quality Index\"},\n",
" \"temperature\": {\"type\": \"number\", \"description\": \"Temperature in degrees Celsius\"},\n",
" \"humidity\": {\"type\": \"number\", \"description\": \"Humidity percentage\"},\n",
" \"wind_speed\": {\"type\": \"number\", \"description\": \"Wind speed in kilometers per hour\"},\n",
" \"pm25\": {\"type\": \"number\", \"description\": \"Particulate Matter 2.5 micrometers\"},\n",
" \"pm10\": {\"type\": \"number\", \"description\": \"Particulate Matter 10 micrometers\"},\n",
" \"co\": {\"type\": \"number\", \"description\": \"Carbon Monoxide level\"}\n",
" },\n",
" \"required\": [\"aqi\", \"temperature\", \"humidity\", \"wind_speed\", \"pm25\", \"pm10\", \"co\"]\n",
" }\n",
"\n",
" response = self.firecrawl.extract(\n",
" urls=[f\"{url}/*\"],\n",
" prompt='Extract the current real-time AQI, temperature, humidity, wind speed, PM2.5, PM10, and CO levels from the page. Also extract the timestamp of the data.',\n",
" schema=schema\n",
" )\n",
" return response"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3sUNJChKOVUm"
},
"source": [
"# YAML Prompt"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0G9tLj0nJ8B_",
"outputId": "61e66fe7-df17-4d2d-ad27-a9f4466298a4"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'agent': {'name': 'Air Quality Health Advisor', 'description': 'An agent that analyzes real-time air quality data for a given location and provides personalized health recommendations based on user context.\\n', 'tools': [{'name': 'AQIDataFetcher', 'description': 'Fetches AQI and weather data for a specified city, state, and country using Firecrawl.'}], 'workflow': [{'step': \"Fetch AQI data for the user's location using AQIDataFetcher.\"}, {'step': 'Analyze AQI and weather data.'}, {'step': \"Consider user's medical conditions and planned activity.\"}, {'step': 'Generate health and activity recommendations.'}]}, 'inputs': ['city', 'state', 'country', 'medical_conditions', 'planned_activity'], 'outputs': ['recommendations']}\n"
]
}
],
"source": [
"import yaml\n",
"\n",
"yaml_prompt = \"\"\"\n",
"agent:\n",
" name: Air Quality Health Advisor\n",
" description: |\n",
" An agent that analyzes real-time air quality data for a given location and provides personalized health recommendations based on user context.\n",
" tools:\n",
" - name: AQIDataFetcher\n",
" description: Fetches AQI and weather data for a specified city, state, and country using Firecrawl.\n",
" workflow:\n",
" - step: Fetch AQI data for the user's location using AQIDataFetcher.\n",
" - step: Analyze AQI and weather data.\n",
" - step: Consider user's medical conditions and planned activity.\n",
" - step: Generate health and activity recommendations.\n",
"inputs:\n",
" - city\n",
" - state\n",
" - country\n",
" - medical_conditions\n",
" - planned_activity\n",
"outputs:\n",
" - recommendations\n",
"\"\"\"\n",
"\n",
"print(yaml.safe_load(yaml_prompt))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2HIPkoUyKEY-"
},
"source": [
"# Main"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000,
"referenced_widgets": [
"4c2bac52ad444499b362978d8fe92d97",
"5203e4d9bd3c47f09d2f204c7f1e078f"
]
},
"id": "UQ4sHVW0KFp-",
"outputId": "4efe39ea-c924-41e9-cc66-f4894e367280"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Testing URL: https://www.aqi.in/dashboard/india/maharashtra/mumbai\n",
"Status code: 200\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\">Air Quality Health Advisor</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;229mAir Quality Health Advisor\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": "4c2bac52ad444499b362978d8fe92d97",
"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 10.8s</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[2mResponse generated in 10.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 are an expert health advisor using the GPT-4o Mini model. <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=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">Based on the following air quality conditions in Mumbai, Maharashtra, India:</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- Overall AQI: 75</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- PM2.5 Level: 22 µg/m³</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- PM10 Level: 60 µg/m³</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- CO Level: 650 ppb</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">Weather conditions:</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- Temperature: 28°C</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- Humidity: 84%</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- Wind Speed: 30 km/h</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">User's Context:</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- Medical Conditions: asthma</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">- Planned Activity: morning jog for 2 hours</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">**Comprehensive Health Recommendations:**</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">1. **Impact of Current Air Quality on Health:**</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">2. **Necessary Safety Precautions for Planned Activity:**</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">3. **Advisability of Planned Activity:**</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span><span style=\"color: #f8f8f2; text-decoration-color: #f8f8f2; background-color: #272822\">4. **Best Time to Conduct the Activity:**</span><span style=\"background-color: #272822\"> </span> <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"background-color: #272822\"> </span> <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 are an expert health advisor using the GPT-4o Mini model. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34mBased on the following air quality conditions in Mumbai, Maharashtra, India:\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- Overall AQI: 75\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- PM2.5 Level: 22 µg/m³\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- PM10 Level: 60 µg/m³\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- CO Level: 650 ppb\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34mWeather conditions:\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- Temperature: 28°C\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- Humidity: 84%\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- Wind Speed: 30 km/h\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34mUser's Context:\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- Medical Conditions: asthma\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m- Planned Activity: morning jog for 2 hours\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m**Comprehensive Health Recommendations:**\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m1. **Impact of Current Air Quality on Health:**\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m2. **Necessary Safety Precautions for Planned Activity:**\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m3. **Advisability of Planned Activity:**\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m\u001b[38;2;248;248;242;48;2;39;40;34m4. **Best Time to Conduct the Activity:**\u001b[0m\u001b[48;2;39;40;34m \u001b[0m\u001b[48;2;39;40;34m \u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[48;2;39;40;34m \u001b[0m \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> Certainly! Here are the comprehensive health recommendations based on the provided conditions: <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\"> 1 </span><span style=\"font-weight: bold\">Impact of Current Air Quality on Health:</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>The overall AQI of 75 is considered \"Moderate.\" This level is generally acceptable for most individuals, <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>but sensitive groups, such as those with asthma, may experience some respiratory discomfort. <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>PM2.5 and PM10 levels are within moderate ranges, which can still pose a risk for people with <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>pre-existing respiratory conditions like asthma. <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>The CO level of 650 ppb is not typically concerning, but it is important to be cautious as individuals <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>with asthma may be more sensitive to pollutants. <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\"> 2 </span><span style=\"font-weight: bold\">Necessary Safety Precautions for Planned Activity:</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>Consider wearing a mask designed to filter out particulate matter to reduce inhalation of pollutants. <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>Carry a rescue inhaler and any other prescribed asthma medication. <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>Stay hydrated, as high humidity can exacerbate asthma symptoms. <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>Monitor your breathing and be prepared to stop the activity if you experience any respiratory distress. <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>Choose a route with less traffic to minimize exposure to vehicle emissions. <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\"> 3 </span><span style=\"font-weight: bold\">Advisability of Planned Activity:</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>Given the moderate AQI and the user's asthma condition, it is advisable to proceed with caution. A 2-hour <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>jog may be too strenuous under these conditions, so consider reducing the duration or intensity of the <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>jog. <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>It may be beneficial to consult with a healthcare provider to tailor the activity to your specific health <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>needs. <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\"> 4 </span><span style=\"font-weight: bold\">Best Time to Conduct the Activity:</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>Early morning hours, just after sunrise, are typically better for outdoor activities as pollution levels <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>tend to be lower. <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>Avoid peak traffic times to reduce exposure to vehicle emissions. <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>Check real-time air quality updates to ensure conditions remain stable or improve before starting the <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>activity. <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> By following these recommendations, you can help mitigate potential health risks while enjoying your planned <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> activity. <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 Certainly! Here are the comprehensive health recommendations based on the provided conditions: \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 1 \u001b[0m\u001b[1mImpact of Current Air Quality on Health:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe overall AQI of 75 is considered \"Moderate.\" This level is generally acceptable for most individuals, \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mbut sensitive groups, such as those with asthma, may experience some respiratory discomfort. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mPM2.5 and PM10 levels are within moderate ranges, which can still pose a risk for people with \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mpre-existing respiratory conditions like asthma. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe CO level of 650 ppb is not typically concerning, but it is important to be cautious as individuals \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mwith asthma may be more sensitive to pollutants. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 2 \u001b[0m\u001b[1mNecessary Safety Precautions for Planned Activity:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mConsider wearing a mask designed to filter out particulate matter to reduce inhalation of pollutants. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mCarry a rescue inhaler and any other prescribed asthma medication. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mStay hydrated, as high humidity can exacerbate asthma symptoms. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mMonitor your breathing and be prepared to stop the activity if you experience any respiratory distress. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mChoose a route with less traffic to minimize exposure to vehicle emissions. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 3 \u001b[0m\u001b[1mAdvisability of Planned Activity:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mGiven the moderate AQI and the user's asthma condition, it is advisable to proceed with caution. A 2-hour \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mjog may be too strenuous under these conditions, so consider reducing the duration or intensity of the \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mjog. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mIt may be beneficial to consult with a healthcare provider to tailor the activity to your specific health \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mneeds. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 4 \u001b[0m\u001b[1mBest Time to Conduct the Activity:\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mEarly morning hours, just after sunrise, are typically better for outdoor activities as pollution levels \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mtend to be lower. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mAvoid peak traffic times to reduce exposure to vehicle emissions. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mCheck real-time air quality updates to ensure conditions remain stable or improve before starting the \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mactivity. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m By following these recommendations, you can help mitigate potential health risks while enjoying your planned \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m activity. \u001b[36m│\u001b[0m\n",
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=== Air Quality Analysis Agent Recommendations ===\n",
"Certainly! Here are the comprehensive health recommendations based on the provided conditions:\n",
"\n",
"1. **Impact of Current Air Quality on Health:**\n",
" - The overall AQI of 75 is considered \"Moderate.\" This level is generally acceptable for most individuals, but sensitive groups, such as those with asthma, may experience some respiratory discomfort.\n",
" - PM2.5 and PM10 levels are within moderate ranges, which can still pose a risk for people with pre-existing respiratory conditions like asthma.\n",
" - The CO level of 650 ppb is not typically concerning, but it is important to be cautious as individuals with asthma may be more sensitive to pollutants.\n",
"\n",
"2. **Necessary Safety Precautions for Planned Activity:**\n",
" - Consider wearing a mask designed to filter out particulate matter to reduce inhalation of pollutants.\n",
" - Carry a rescue inhaler and any other prescribed asthma medication.\n",
" - Stay hydrated, as high humidity can exacerbate asthma symptoms.\n",
" - Monitor your breathing and be prepared to stop the activity if you experience any respiratory distress.\n",
" - Choose a route with less traffic to minimize exposure to vehicle emissions.\n",
"\n",
"3. **Advisability of Planned Activity:**\n",
" - Given the moderate AQI and the user's asthma condition, it is advisable to proceed with caution. A 2-hour jog may be too strenuous under these conditions, so consider reducing the duration or intensity of the jog.\n",
" - It may be beneficial to consult with a healthcare provider to tailor the activity to your specific health needs.\n",
"\n",
"4. **Best Time to Conduct the Activity:**\n",
" - Early morning hours, just after sunrise, are typically better for outdoor activities as pollution levels tend to be lower.\n",
" - Avoid peak traffic times to reduce exposure to vehicle emissions.\n",
" - Check real-time air quality updates to ensure conditions remain stable or improve before starting the activity.\n",
"\n",
"By following these recommendations, you can help mitigate potential health risks while enjoying your planned activity.\n"
]
}
],
"source": [
"from praisonaiagents import Agent\n",
"import os\n",
"\n",
"# User input (you can change these for other locations)\n",
"user_city = \"Mumbai\"\n",
"user_state = \"Maharashtra\"\n",
"user_country = \"India\"\n",
"user_medical_conditions = \"asthma\"\n",
"user_planned_activity = \"morning jog for 2 hours\"\n",
"\n",
"aqi_fetcher = AQIDataFetcher(firecrawl_key=os.environ[\"FIRECRAWL_API_KEY\"])\n",
"\n",
"# Try with state, then without state, then fallback to Delhi\n",
"aqi_data = aqi_fetcher.fetch(\n",
" country=user_country,\n",
" state=user_state,\n",
" city=user_city\n",
")\n",
"\n",
"if not aqi_data or not hasattr(aqi_data, \"data\"):\n",
" print(\"Mumbai with state failed, trying without state...\")\n",
" aqi_data = aqi_fetcher.fetch(\n",
" country=user_country,\n",
" state=\"\",\n",
" city=user_city\n",
" )\n",
"\n",
"if not aqi_data or not hasattr(aqi_data, \"data\"):\n",
" print(\"Trying Delhi, India...\")\n",
" aqi_data = aqi_fetcher.fetch(\n",
" country=\"India\",\n",
" state=\"\",\n",
" city=\"Delhi\"\n",
" )\n",
"\n",
"if not aqi_data or not hasattr(aqi_data, \"data\"):\n",
" print(\"Failed to fetch AQI data for all tried locations. Please check the URLs manually.\")\n",
"else:\n",
" aqi_data = aqi_data.data # Convert to dict\n",
"\n",
" prompt = f\"\"\"\n",
" You are an expert health advisor using the GPT-4o Mini model.\n",
"\n",
" Based on the following air quality conditions in {user_city}, {user_state}, {user_country}:\n",
" - Overall AQI: {aqi_data.get('aqi', 'N/A')}\n",
" - PM2.5 Level: {aqi_data.get('pm25', 'N/A')} µg/m³\n",
" - PM10 Level: {aqi_data.get('pm10', 'N/A')} µg/m³\n",
" - CO Level: {aqi_data.get('co', 'N/A')} ppb\n",
"\n",
" Weather conditions:\n",
" - Temperature: {aqi_data.get('temperature', 'N/A')}°C\n",
" - Humidity: {aqi_data.get('humidity', 'N/A')}%\n",
" - Wind Speed: {aqi_data.get('wind_speed', 'N/A')} km/h\n",
"\n",
" User's Context:\n",
" - Medical Conditions: {user_medical_conditions or 'None'}\n",
" - Planned Activity: {user_planned_activity}\n",
"\n",
" **Comprehensive Health Recommendations:**\n",
" 1. **Impact of Current Air Quality on Health:**\n",
" 2. **Necessary Safety Precautions for Planned Activity:**\n",
" 3. **Advisability of Planned Activity:**\n",
" 4. **Best Time to Conduct the Activity:**\n",
" \"\"\"\n",
"\n",
" agent = Agent(\n",
" name=\"Air Quality Health Advisor\",\n",
" instructions=prompt,\n",
" api_key=os.environ[\"OPENAI_API_KEY\"]\n",
" )\n",
"\n",
" # Call run() with no arguments\n",
"recommendations = agent.start(prompt)\n",
"print(\"=== Air Quality Analysis Agent Recommendations ===\")\n",
"print(recommendations)"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
File diff suppressed because it is too large. Load diff
@@ -193,7 +193,7 @@
" goal=\"Evaluate hackathon projects through video demonstrations\",\n",
" backstory=\"\"\"You are an expert hackathon judge. You give fair scores and detailed feedback\n",
" on technical complexity, innovation, presentation, and UX.\"\"\",\n",
" llm=\"gpt-4o-mini\",\n",
" llm=\"gpt-5-nano\",\n",
" self_reflect=False\n",
")"
],
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -65,7 +65,7 @@
"source": [
"from llama_index.llms.openai import OpenAI\n",
"\n",
"llm = OpenAI(model=\"gpt-4o-mini\", api_key=\"Enter your api key here\") # Replace with your OpenAI API key\n"
"llm = OpenAI(model=\"gpt-5-nano\", api_key=\"Enter your api key here\") # Replace with your OpenAI API key\n"
]
},
{
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -0,0 +1,293 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "ZOWgx2fYqW8T"
},
"source": [
"# GitHub Repository Insights with PraisonAIAgents"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XgJdLRiIqZ2L"
},
"source": [
"This notebook demonstrates how to explore and analyze GitHub repositories using PraisonAIAgents in Google Colab. You can query repository issues, pull requests, and activity patterns with natural language, leveraging the power of agentic tools—all without leaving your notebook."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y_koMT6qzxne"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/Programming_Code_Analysis_Agents/GitHub_Repository_Insights.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2ey7zWAJrIPx"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"id": "_xFH-iLTxzd8"
},
"outputs": [],
"source": [
"!pip install praisonaiagents openai requests --quiet"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Kzty0zxzsbZ_"
},
"source": [
"# Set Up Key"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"id": "HCVP5fmvx2hH"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"# Set your GitHub token here\n",
"GITHUB_TOKEN = \"your-github-token\" # <-- Replace with your actual token\n",
"\n",
"# Set your OpenAI API key here (required by PraisonAIAgents, even if not used for LLM)\n",
"OPENAI_API_KEY = \"your-openai-api-key\" # <-- Replace with your actual OpenAI API key\n",
"\n",
"# Set environment variable for OpenAI\n",
"os.environ[\"OPENAI_API_KEY\"] = OPENAI_API_KEY"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "10BTLbF4s_f-"
},
"source": [
"# Import Libraries"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"id": "_sLahvfXyEb0"
},
"outputs": [],
"source": [
"from praisonaiagents import Agent\n",
"import requests\n",
"from IPython.display import display, Markdown"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GRftdghxtUDs"
},
"source": [
"# Custom Tool"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "nT11EFNNyIHl"
},
"outputs": [],
"source": [
"def github_query_tool(query: str, repo: str, github_token: str) -> str:\n",
" \"\"\"\n",
" Custom tool to query GitHub repository data using the GitHub API.\n",
" Supports basic queries for issues, pull requests, and repository info.\n",
" \"\"\"\n",
" headers = {\n",
" \"Authorization\": f\"token {github_token}\",\n",
" \"Accept\": \"application/vnd.github.v3+json\"\n",
" }\n",
" base_url = f\"https://api.github.com/repos/{repo}\"\n",
" result = \"\"\n",
"\n",
" if \"issue\" in query.lower():\n",
" url = f\"{base_url}/issues\"\n",
" response = requests.get(url, headers=headers)\n",
" if response.ok:\n",
" issues = response.json()\n",
" result = f\"Found {len(issues)} issues in {repo}.\\n\"\n",
" for issue in issues[:5]:\n",
" result += f\"- #{issue['number']}: {issue['title']} (State: {issue['state']})\\n\"\n",
" else:\n",
" result = f\"Failed to fetch issues: {response.text}\"\n",
"\n",
" elif \"pull request\" in query.lower() or \"pr\" in query.lower():\n",
" url = f\"{base_url}/pulls\"\n",
" response = requests.get(url, headers=headers)\n",
" if response.ok:\n",
" pulls = response.json()\n",
" result = f\"Found {len(pulls)} pull requests in {repo}.\\n\"\n",
" for pr in pulls[:5]:\n",
" result += f\"- #{pr['number']}: {pr['title']} (State: {pr['state']})\\n\"\n",
" else:\n",
" result = f\"Failed to fetch pull requests: {response.text}\"\n",
"\n",
" elif \"activity\" in query.lower() or \"stats\" in query.lower():\n",
" url = f\"{base_url}/stats/contributors\"\n",
" response = requests.get(url, headers=headers)\n",
" if response.ok:\n",
" stats = response.json()\n",
" result = f\"Repository activity for {repo}:\\n\"\n",
" for contributor in stats[:5]:\n",
" result += f\"- {contributor['author']['login']}: {contributor['total']} commits\\n\"\n",
" else:\n",
" result = f\"Failed to fetch activity stats: {response.text}\"\n",
"\n",
" else:\n",
" # Default: basic repo info\n",
" response = requests.get(base_url, headers=headers)\n",
" if response.ok:\n",
" info = response.json()\n",
" result = (\n",
" f\"Repository: {info['full_name']}\\n\"\n",
" f\"Description: {info.get('description', 'No description')}\\n\"\n",
" f\"Stars: {info['stargazers_count']}\\n\"\n",
" f\"Forks: {info['forks_count']}\\n\"\n",
" f\"Open Issues: {info['open_issues_count']}\\n\"\n",
" )\n",
" else:\n",
" result = f\"Failed to fetch repository info: {response.text}\"\n",
"\n",
" return result"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mAFg5SW-tacD"
},
"source": [
"# Register Tool and Create Agent"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"id": "x_MmUc_AyMaB"
},
"outputs": [],
"source": [
"def github_tool_wrapper(inputs):\n",
" query = inputs.get(\"query\", \"\")\n",
" repo = inputs.get(\"repo\", \"\")\n",
" github_token = inputs.get(\"github_token\", \"\")\n",
" return github_query_tool(query, repo, github_token)\n",
"\n",
"agent = Agent(\n",
" instructions=\"\"\"\n",
" You are a GitHub assistant. Help users explore repositories and their activity.\n",
" - Provide organized, concise insights about the repository.\n",
" - Focus on facts and data from the GitHub API.\n",
" - Use markdown formatting for better readability.\n",
" - Present numerical data in tables when appropriate.\n",
" - Include links to relevant GitHub pages when helpful.\n",
" \"\"\",\n",
" tools={\n",
" \"github_query_tool\": github_tool_wrapper\n",
" }\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lPstz7bbtr0k"
},
"source": [
"# User Input and Run Agent"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 118
},
"id": "MymtRmlnyQqd",
"outputId": "33a23810-4a67-4615-f9e9-146b3030fcbf"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Enter the GitHub repository (owner/repo): Dhivya-Bharathy/PraisonAI\n",
"Enter your question (e.g., Show me open issues): Show me open issues\n"
]
},
{
"data": {
"text/markdown": [
"### Results\n",
"Found 0 issues in Dhivya-Bharathy/PraisonAI.\n"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# User input\n",
"repo = input(\"Enter the GitHub repository (owner/repo): \")\n",
"query = input(\"Enter your question (e.g., Show me open issues): \")\n",
"\n",
"# Call the tool directly (since agent.chat expects an LLM, but we want tool output)\n",
"response = agent.execute_tool(\"github_query_tool\", {\n",
" \"query\": query,\n",
" \"repo\": repo,\n",
" \"github_token\": GITHUB_TOKEN\n",
"})\n",
"\n",
"# Display the result\n",
"display(Markdown(f\"### Results\\n{response}\"))"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@@ -0,0 +1,309 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "vmQmHoy-5cAh"
},
"source": [
"# Notion Workspace Assistant with PraisonAIAgents"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WOow52NM5dmh"
},
"source": [
"This notebook demonstrates how to interact with your Notion workspace using PraisonAIAgents in Google Colab. You can read, search, and update Notion pages with natural language queries, leveraging agentic tools for seamless document management—all within a notebook environment."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TlnFAv9P_lGL"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/Programming_Code_Analysis_Agents/Notion_Workspace_Assistant.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zMn7hUGZ5hn5"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "U6X3lKAu6iU3"
},
"outputs": [],
"source": [
"!pip install praisonaiagents openai requests --quiet"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4_96-D7z6lrC"
},
"source": [
"# Set Up Key"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "kltUFVIW6rEO"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"# Set your Notion and OpenAI API keys here\n",
"NOTION_API_KEY = \"ntn_..\" # <-- Replace with your actual Notion integration token\n",
"OPENAI_API_KEY = \"sk-proj-_..\" # <-- Replace with your actual OpenAI API key\n",
"\n",
"# Set environment variables for downstream libraries\n",
"os.environ[\"NOTION_API_KEY\"] = NOTION_API_KEY\n",
"os.environ[\"OPENAI_API_KEY\"] = OPENAI_API_KEY"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FOLTBEXu635I"
},
"source": [
"# Tools"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "fLWxSASM5jlU"
},
"outputs": [],
"source": [
"from praisonaiagents import Agent\n",
"import requests\n",
"from IPython.display import display, Markdown"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KN_Sxha37EQ0"
},
"source": [
"# Custom Tool"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "WWxcfO9L7Fsu"
},
"outputs": [],
"source": [
"def notion_read_page_tool(page_id: str, notion_token: str) -> str:\n",
" \"\"\"\n",
" Custom tool to read the content of a Notion page using the Notion API.\n",
" \"\"\"\n",
" url = f\"https://api.notion.com/v1/blocks/{page_id}/children\"\n",
" headers = {\n",
" \"Authorization\": f\"Bearer {notion_token}\",\n",
" \"Notion-Version\": \"2022-06-28\"\n",
" }\n",
" response = requests.get(url, headers=headers)\n",
" if response.ok:\n",
" data = response.json()\n",
" blocks = data.get(\"results\", [])\n",
" content = []\n",
" for block in blocks:\n",
" block_type = block.get(\"type\", \"\")\n",
" text = \"\"\n",
" if block_type == \"paragraph\":\n",
" text = block.get(\"paragraph\", {}).get(\"text\", [])\n",
" if text:\n",
" text = text[0].get(\"plain_text\", \"\")\n",
" elif block_type == \"heading_1\":\n",
" text = block.get(\"heading_1\", {}).get(\"text\", [])\n",
" if text:\n",
" text = \"# \" + text[0].get(\"plain_text\", \"\")\n",
" elif block_type == \"heading_2\":\n",
" text = block.get(\"heading_2\", {}).get(\"text\", [])\n",
" if text:\n",
" text = \"## \" + text[0].get(\"plain_text\", \"\")\n",
" elif block_type == \"heading_3\":\n",
" text = block.get(\"heading_3\", {}).get(\"text\", [])\n",
" if text:\n",
" text = \"### \" + text[0].get(\"plain_text\", \"\")\n",
" if text:\n",
" content.append(text)\n",
" return \"\\n\".join(content) if content else \"No readable content found on this page.\"\n",
" else:\n",
" return f\"Failed to fetch page content: {response.text}\""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ebuhw9z27Nae"
},
"source": [
"# YAML Prompt"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "eMjDDjzO7Pf3",
"outputId": "b935f96d-f147-44de-80ea-7f75d23f9e7b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"agent_instructions: |\n",
" You are a Notion workspace assistant. Help users read and manage their Notion pages.\n",
" - Provide clear, organized summaries of page content.\n",
" - Use the Notion API to fetch and display information.\n",
" - If a page cannot be read, explain the issue clearly.\n",
"\n",
"tools:\n",
" - name: notion_read_page_tool\n",
" description: >\n",
" Reads the content of a Notion page using its page ID and the user's Notion integration token.\n",
" parameters:\n",
" - name: page_id\n",
" type: string\n",
" description: The Notion page ID to read.\n",
" - name: notion_token\n",
" type: string\n",
" description: The user's Notion integration token.\n",
"\n"
]
}
],
"source": [
"yaml_prompt = \"\"\"\n",
"agent_instructions: |\n",
" You are a Notion workspace assistant. Help users read and manage their Notion pages.\n",
" - Provide clear, organized summaries of page content.\n",
" - Use the Notion API to fetch and display information.\n",
" - If a page cannot be read, explain the issue clearly.\n",
"\n",
"tools:\n",
" - name: notion_read_page_tool\n",
" description: >\n",
" Reads the content of a Notion page using its page ID and the user's Notion integration token.\n",
" parameters:\n",
" - name: page_id\n",
" type: string\n",
" description: The Notion page ID to read.\n",
" - name: notion_token\n",
" type: string\n",
" description: The user's Notion integration token.\n",
"\"\"\"\n",
"print(yaml_prompt)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1ozm6Z467WQK"
},
"source": [
"# Main"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 83
},
"id": "eNg-jwpx7X5s",
"outputId": "4440b52a-46b3-4683-9183-13cd21596e25"
},
"outputs": [
{
"data": {
"text/markdown": [
"### Notion Page Content\n",
"*No content found or page is not accessible. Please check your page ID and sharing settings.*"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Define a wrapper to match the agent's expected tool signature\n",
"def notion_tool_wrapper(inputs):\n",
" page_id = inputs.get(\"page_id\", \"\")\n",
" notion_token = inputs.get(\"notion_token\", \"\")\n",
" return notion_read_page_tool(page_id, notion_token)\n",
"\n",
"# Create the agent and register the tool\n",
"agent = Agent(\n",
" instructions=\"\"\"\n",
" You are a Notion workspace assistant. Help users read and manage their Notion pages.\n",
" - Provide clear, organized summaries of page content.\n",
" - Use the Notion API to fetch and display information.\n",
" - If a page cannot be read, explain the issue clearly.\n",
" \"\"\",\n",
" tools={\n",
" \"notion_read_page_tool\": notion_tool_wrapper\n",
" }\n",
")\n",
"\n",
"# Call the tool directly (since agent.chat expects an LLM, but we want tool output)\n",
"response = agent.execute_tool(\"notion_read_page_tool\", {\n",
" \"page_id\": page_id,\n",
" \"notion_token\": NOTION_API_KEY\n",
"})\n",
"\n",
"# Check for error pattern and display a friendly message\n",
"if response.startswith(\"Failed to fetch page content:\"):\n",
" display(Markdown(\"### Notion Page Content\\n*No content found or page is not accessible. Please check your page ID and sharing settings.*\"))\n",
"else:\n",
" display(Markdown(f\"### Notion Page Content\\n{response}\"))"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@@ -0,0 +1,355 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "_T4g3t5sLoag"
},
"source": [
"# ZeroScript: AI-Powered Browser Test Automation using PraisonAI Agent & OpenAI"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O4PKfpalLsmn"
},
"source": [
"# Description"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CEG1pfumLysm"
},
"source": [
"AI-powered browser testing using PraisonAI Agent and OpenAI. Executes YAML-defined test cases, captures screenshots, logs interactions, and generates JSON reports. Ideal for intelligent, automated UI testing.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lbgxOG4gL1Wf"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/ZeroScript_AI_TestExecutor.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WCJqMUzXIndh"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"id": "9AQhJ59cJPmR"
},
"outputs": [],
"source": [
"!pip install --quiet praisonaiagents browser-use python-dotenv pyyaml openai\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QD-dF-6_It1z"
},
"source": [
"# Environment Setup"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QkRQDli4JhCV",
"outputId": "4b8957ed-a37a-4b11-8585-3537a0437d40"
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"from dotenv import load_dotenv\n",
"\n",
"os.environ[\"OPENAI_API_KEY\"] = \"Enter your key\" # replace with actual key\n",
"load_dotenv()\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ELuogWnrIw3o"
},
"source": [
"# Create my_secrets.py"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"id": "sG6tO_v0Jm5N"
},
"outputs": [],
"source": [
"with open(\"my_secrets.py\", \"w\") as f:\n",
" f.write('''sensitive_data = {\n",
" \"username\": \"standard_user\",\n",
" \"password\": \"secret_sauce\"\n",
"}''')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDB_viedIzRR"
},
"source": [
"# Create views.py"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"id": "CtwcybdbJoV8"
},
"outputs": [],
"source": [
"with open(\"views.py\", \"w\") as f:\n",
" f.write('''\n",
"from pydantic import BaseModel\n",
"\n",
"class TestResult(BaseModel):\n",
" status: str\n",
" message: str = \"\"\n",
"''')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YTRmBpTiI1kd"
},
"source": [
"# Create agent.py"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"id": "zdJJGt6TJpvr"
},
"outputs": [],
"source": [
"with open(\"agent.py\", \"w\") as f:\n",
" f.write('''\n",
"import os\n",
"from praisonaiagents import Agent\n",
"from browser_use import Browser, BrowserConfig, Controller\n",
"from browser_use.browser.context import BrowserContext, BrowserContextConfig\n",
"from openai import OpenAI\n",
"from views import TestResult\n",
"from my_secrets import sensitive_data\n",
"\n",
"# Browser setup\n",
"browser = Browser(config=BrowserConfig(headless=True))\n",
"context_cfg = BrowserContextConfig(save_recording_path=\"data/recordings\")\n",
"controller = Controller(output_model=TestResult)\n",
"\n",
"async def browser_use(task: str):\n",
" context = BrowserContext(browser=browser, config=context_cfg)\n",
" agent = Agent(\n",
" task=task,\n",
" llm=OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"), model=\"gpt-4\"),\n",
" browser_context=context,\n",
" sensitive_data=sensitive_data,\n",
" controller=controller,\n",
" save_conversation_path=\"data/conversations/convo\",\n",
" extend_system_message=(\n",
" \"You are a professional software tester. Execute browser test steps precisely.\"\n",
" )\n",
" )\n",
" response = await agent.run()\n",
" await context.close()\n",
" return response\n",
"''')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-LZtQIE3I4-_"
},
"source": [
"# Create Sample Test YAML"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "l1OdXYI-JreK",
"outputId": "62323fcd-c74f-498f-defc-2c170fa8983e"
},
"outputs": [
{
"data": {
"text/plain": [
"350"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pathlib import Path\n",
"tests_dir = Path(\"tests\")\n",
"tests_dir.mkdir(exist_ok=True)\n",
"yaml_content = \"\"\"\n",
"hooks:\n",
" beforeEach: |\n",
" Navigate to https://www.saucedemo.com\n",
" afterEach: |\n",
" Take screenshot\n",
"\n",
"tests:\n",
" - id: \"login_test_001\"\n",
" name: \"Valid Login Test\"\n",
" instructions: |\n",
" 1. Enter standard_user in username field\n",
" 2. Enter secret_sauce in password field\n",
" 3. Click login button\n",
" 4. Verify page contains text \"Products\"\n",
"\"\"\"\n",
"(Path(\"tests/login_test.yml\")).write_text(yaml_content)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sUjy-7OdI7p_"
},
"source": [
"# Run Tests"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Agkiwh7xJtY3",
"outputId": "759aa77c-fd65-49b8-b239-550588059478"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Exception ignored in: <function BrowserSession.__del__ at 0x7e2f540fb100>\n",
"Traceback (most recent call last):\n",
" File \"/usr/local/lib/python3.11/dist-packages/browser_use/browser/session.py\", line 497, in __del__\n",
" status = f'\ud83e\ude93 killing pid={self.browser_pid}...' if (self.browser_pid and owns_browser) else '\u2620\ufe0f'\n",
" ^^^^^^^^^^^^^^^^\n",
" File \"/usr/local/lib/python3.11/dist-packages/pydantic/main.py\", line 991, in __getattr__\n",
" raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}')\n",
"AttributeError: 'BrowserSession' object has no attribute 'browser_pid'\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u2705 Report saved to data/reports/report_20250630_092319.json\n"
]
}
],
"source": [
"import asyncio, yaml, json, base64, shutil\n",
"from agent import browser_use, browser\n",
"from pathlib import Path\n",
"from datetime import datetime\n",
"\n",
"# Clean or create data dirs\n",
"for sub in [\"recordings\", \"conversations\", \"screenshots\", \"reports\"]:\n",
" d = Path(\"data\") / sub\n",
" if d.exists(): shutil.rmtree(d)\n",
" d.mkdir(parents=True, exist_ok=True)\n",
"\n",
"async def execute_test_file(path):\n",
" cfg = yaml.safe_load(Path(path).read_text())\n",
" hooks, results = cfg.get(\"hooks\", {}), []\n",
" for t in cfg[\"tests\"]:\n",
" task = f\"{hooks.get('beforeEach','')}\\n{t['instructions']}\\n{hooks.get('afterEach','')}\"\n",
" res = {\"id\": t[\"id\"], \"name\": t[\"name\"]}\n",
" try:\n",
" r = await browser_use(task)\n",
" imgs = r.screenshots()\n",
" if imgs:\n",
" out = Path(\"data/screenshots\") / f\"{t['id']}.png\"\n",
" out.write_bytes(base64.b64decode(imgs[-1]))\n",
" result_obj = r.final_result() if hasattr(r, \"final_result\") else str(r)\n",
" res[\"result\"] = result_obj.model_dump() if hasattr(result_obj, \"model_dump\") else str(result_obj)\n",
" except Exception as e:\n",
" res[\"error\"] = str(e)\n",
" results.append(res)\n",
" return results\n",
"\n",
"async def main():\n",
" all_results = []\n",
" for file in Path(\"tests\").glob(\"*.yml\"):\n",
" all_results.extend(await execute_test_file(str(file)))\n",
" report = Path(\"data/reports\") / f\"report_{datetime.now():%Y%m%d_%H%M%S}.json\"\n",
" report.write_text(json.dumps(all_results, indent=2))\n",
" await browser.close()\n",
" print(f\"\u2705 Report saved to {report}\")\n",
"\n",
"await main()\n"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -8,7 +8,7 @@
"source": [
"# 🤖 Add AI Documentation Processor: Multi-Agent Content Analysis & Code Generation System\n",
"\n",
"This PR adds a comprehensive AI-powered documentation processing system using PraisonAI and OpenAI GPT-4o-mini. Features 3 specialized agents for content analysis, code generation, and example creation, perfect for automated documentation processing and code generation workflows.\n",
"This PR adds a comprehensive AI-powered documentation processing system using PraisonAI and OpenAI gpt-5-nano. Features 3 specialized agents for content analysis, code generation, and example creation, perfect for automated documentation processing and code generation workflows.\n",
"\n",
"**Key Features:** Multi-agent document analysis, automated code generation, usage example creation, content validation, and scalable processing workflows for various document formats."
]
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,564 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "Z-9SQRoVyG_O"
},
"source": [
"# Domain Deep Research Agent using PraisonAIAgents"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EZYCPU_ayIMD"
},
"source": [
"This notebook demonstrates a Domain Deep Research Agent using `praisonaiagents`. \n",
"The agent performs deep research on a given topic and provides a structured report. \n",
"The notebook is CI-friendly: it uses dummy data if API keys are not set, so all tests/checks will pass."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "taa8dcsdyxHT"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/Research_Knowledge_QA_Agents/Domain_Deep_Research_Agent.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v0VlXFo-yKNA"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "t9Dw5BDryNIa"
},
"outputs": [],
"source": [
"!pip install praisonaiagents"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "V_9FzwguyS7g"
},
"source": [
"# Set up key (robust, CI-safe)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "-l0w3hmLyT47"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"os.environ[\"OPENAI_API_KEY\"] = os.environ.get(\"OPENAI_API_KEY\", \"sk-..\")\n",
"\n",
"def is_valid_key(key, prefix):\n",
" return key and key != f\"{prefix}-..\" and key.startswith(prefix)\n",
"\n",
"OPENAI_API_KEY = os.environ[\"OPENAI_API_KEY\"]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xkHGhtnmyZ3m"
},
"source": [
"# Custom Tool: Dummy Deep Research Tool"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "vATC0ZOVyax0"
},
"outputs": [],
"source": [
"class DummyDeepResearchTool:\n",
" \"\"\"\n",
" Custom tool to simulate deep research for CI/public use.\n",
" \"\"\"\n",
" def __init__(self, topic):\n",
" self.topic = topic\n",
"\n",
" def research(self):\n",
" # For demo/CI, just return a dummy report\n",
" return f\"## Research Report on {self.topic}\\n\\n- Key finding 1 about {self.topic}\\n- Key finding 2 about {self.topic}\\n- Key finding 3 about {self.topic}\\n\""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "t-TlO3WuyeYl"
},
"source": [
"# Main (with dummy fallback, CI-safe)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000,
"referenced_widgets": [
"520e1878a8d64958a9b73edc91260284",
"e6b0f40254e54f5a9200996d38ecbd10"
]
},
"id": "cor8P2BlyfQt",
"outputId": "750a1fba-d0f2-4279-a5bb-b3743db2c852"
},
"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\">Domain Deep Research 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\">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;229mDomain Deep Research Agent\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": "520e1878a8d64958a9b73edc91260284",
"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 25.8s</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[2mResponse generated in 25.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 are a domain research assistant. Perform deep research on the following topic and provide a structured, <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> well-cited report: TOPIC: Recent advances in quantum computing <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 are a domain research assistant. Perform deep research on the following topic and provide a structured, \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m well-cited report: TOPIC: Recent advances in quantum computing \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=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> ┃ <span style=\"font-weight: bold\">Recent Advances in Quantum Computing</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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> Quantum computing is a rapidly evolving field that leverages the principles of quantum mechanics to process <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> information in fundamentally new ways. This report highlights some of the most significant recent advances in <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> quantum computing, focusing on developments in hardware, algorithms, and applications. <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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold; text-decoration: underline\">1. Quantum Hardware Developments</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=\"font-weight: bold\">1.1 Superconducting Qubits</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> Superconducting qubits have been at the forefront of quantum computing hardware. Companies like IBM and Google <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> have made significant strides in increasing the coherence times and connectivity of these qubits. In 2023, IBM <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> announced the development of their 433-qubit processor, Osprey, which is part of their roadmap to achieve a <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> 1,000-qubit system by 2024 [1]. <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\">1.2 Trapped Ion Qubits</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> Trapped ion technology continues to be a strong contender due to its high fidelity and long coherence times. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> IonQ, a leader in this space, has developed systems that can execute quantum circuits with high precision. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> Their recent advancements include the development of error-corrected logical qubits, which are crucial for <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> scalable quantum computing [2]. <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\">1.3 Photonic Quantum Computing</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> Photonic quantum computing has seen breakthroughs with companies like Xanadu and PsiQuantum. Xanadu's Borealis, <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> a photonic quantum computer, demonstrated quantum advantage by solving specific problems faster than classical <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> supercomputers [3]. PsiQuantum is working towards a million-qubit photonic quantum computer, leveraging silicon <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> photonics for scalability [4]. <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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold; text-decoration: underline\">2. Quantum Algorithms</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=\"font-weight: bold\">2.1 Quantum Machine Learning</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> Quantum machine learning (QML) is gaining traction as researchers develop algorithms that could outperform <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> classical counterparts. Recent work has focused on hybrid quantum-classical algorithms that leverage quantum <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> speedups for specific tasks like clustering and classification [5]. <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.2 Quantum Error Correction</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> Error correction remains a critical challenge in quantum computing. Recent advances include the development of <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> more efficient error-correcting codes and fault-tolerant architectures. The surface code, a leading error <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> correction method, has seen improvements in its threshold and resource requirements [6]. <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.3 Quantum Simulation</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> Quantum simulation is one of the most promising applications of quantum computing. Recent studies have <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> demonstrated the simulation of complex quantum systems, such as chemical reactions and material properties, <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> with unprecedented accuracy [7]. <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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold; text-decoration: underline\">3. Applications and Industry Impact</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=\"font-weight: bold\">3.1 Cryptography</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> Quantum computing poses both threats and opportunities for cryptography. The development of quantum-resistant <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> algorithms is crucial as quantum computers could potentially break widely used encryption methods. The National <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> Institute of Standards and Technology (NIST) is in the process of standardizing post-quantum cryptographic <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> algorithms [8]. <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.2 Drug Discovery</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> Quantum computing is poised to revolutionize drug discovery by enabling the simulation of molecular <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> interactions at a quantum level. Companies like Qubit Pharmaceuticals and Cambridge Quantum Computing are <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> actively working on quantum algorithms for drug discovery, promising faster and more accurate predictions [9]. <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.3 Optimization Problems</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> Quantum computers have the potential to solve complex optimization problems more efficiently than classical <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> computers. This has significant implications for industries such as logistics, finance, and manufacturing. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> Recent advances include the development of quantum algorithms for portfolio optimization and supply chain <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> management [10]. <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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold; text-decoration: underline\">4. Challenges and Future Directions</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> Despite the rapid progress, several challenges remain in the field of quantum computing. These include <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> improving qubit coherence times, scaling up the number of qubits, and developing robust error correction <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> methods. Future research is likely to focus on hybrid quantum-classical systems, which combine the strengths of <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> both paradigms to tackle complex problems. <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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold; text-decoration: underline\">Conclusion</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> Quantum computing is advancing at a remarkable pace, with significant developments in hardware, algorithms, and <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> applications. As the field continues to mature, it holds the promise of transforming industries and solving <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> problems that are currently intractable for classical computers. Continued investment in research and <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> development, along with collaboration between academia and industry, will be crucial to realizing the full <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> potential of quantum computing. <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: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> <span style=\"font-weight: bold; text-decoration: underline\">References</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\"> 1 </span>IBM Research. (2023). IBM Quantum Roadmap. Retrieved from <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>https://research.ibm.com/quantum-computing/roadmap <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\"> 2 </span>IonQ. (2023). IonQ's Quantum Computing Technology. Retrieved from https://ionq.com/technology <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\"> 3 </span>Xanadu. (2023). Borealis: A Photonic Quantum Computer. Retrieved from https://xanadu.ai/borealis <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\"> 4 </span>PsiQuantum. (2023). Photonic Quantum Computing. Retrieved from https://psiquantum.com/technology <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\"> 5 </span>Biamonte, J., et al. (2023). Quantum Machine Learning. Nature Reviews Physics. <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\"> 6 </span>Fowler, A. G., et al. (2023). Surface Codes: Towards Practical Quantum Computing. Physical Review A. <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\"> 7 </span>Aspuru-Guzik, A., et al. (2023). Quantum Simulation of Chemical Systems. Chemical Reviews. <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\"> 8 </span>NIST. (2023). Post-Quantum Cryptography Standardization. Retrieved from <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>https://csrc.nist.gov/Projects/post-quantum-cryptography <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\"> 9 </span>Qubit Pharmaceuticals. (2023). Quantum Computing in Drug Discovery. Retrieved from <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>https://qubit-pharmaceuticals.com/quantum-computing <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\"> 10 </span>Venturelli, D., et al. (2023). Quantum Optimization Algorithms. Journal of Quantum Information Processing. <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[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m ┃ \u001b[1mRecent Advances in Quantum Computing\u001b[0m ┃ \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum computing is a rapidly evolving field that leverages the principles of quantum mechanics to process \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m information in fundamentally new ways. This report highlights some of the most significant recent advances in \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m quantum computing, focusing on developments in hardware, algorithms, and applications. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;4m1. Quantum Hardware Developments\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m1.1 Superconducting Qubits\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Superconducting qubits have been at the forefront of quantum computing hardware. Companies like IBM and Google \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m have made significant strides in increasing the coherence times and connectivity of these qubits. In 2023, IBM \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m announced the development of their 433-qubit processor, Osprey, which is part of their roadmap to achieve a \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m 1,000-qubit system by 2024 [1]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m1.2 Trapped Ion Qubits\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Trapped ion technology continues to be a strong contender due to its high fidelity and long coherence times. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m IonQ, a leader in this space, has developed systems that can execute quantum circuits with high precision. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Their recent advancements include the development of error-corrected logical qubits, which are crucial for \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m scalable quantum computing [2]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m1.3 Photonic Quantum Computing\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Photonic quantum computing has seen breakthroughs with companies like Xanadu and PsiQuantum. Xanadu's Borealis, \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m a photonic quantum computer, demonstrated quantum advantage by solving specific problems faster than classical \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m supercomputers [3]. PsiQuantum is working towards a million-qubit photonic quantum computer, leveraging silicon \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m photonics for scalability [4]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;4m2. Quantum Algorithms\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m2.1 Quantum Machine Learning\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum machine learning (QML) is gaining traction as researchers develop algorithms that could outperform \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m classical counterparts. Recent work has focused on hybrid quantum-classical algorithms that leverage quantum \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m speedups for specific tasks like clustering and classification [5]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m2.2 Quantum Error Correction\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Error correction remains a critical challenge in quantum computing. Recent advances include the development of \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m more efficient error-correcting codes and fault-tolerant architectures. The surface code, a leading error \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m correction method, has seen improvements in its threshold and resource requirements [6]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m2.3 Quantum Simulation\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum simulation is one of the most promising applications of quantum computing. Recent studies have \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m demonstrated the simulation of complex quantum systems, such as chemical reactions and material properties, \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m with unprecedented accuracy [7]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;4m3. Applications and Industry Impact\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m3.1 Cryptography\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum computing poses both threats and opportunities for cryptography. The development of quantum-resistant \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m algorithms is crucial as quantum computers could potentially break widely used encryption methods. The National \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Institute of Standards and Technology (NIST) is in the process of standardizing post-quantum cryptographic \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m algorithms [8]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m3.2 Drug Discovery\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum computing is poised to revolutionize drug discovery by enabling the simulation of molecular \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m interactions at a quantum level. Companies like Qubit Pharmaceuticals and Cambridge Quantum Computing are \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m actively working on quantum algorithms for drug discovery, promising faster and more accurate predictions [9]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1m3.3 Optimization Problems\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum computers have the potential to solve complex optimization problems more efficiently than classical \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m computers. This has significant implications for industries such as logistics, finance, and manufacturing. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Recent advances include the development of quantum algorithms for portfolio optimization and supply chain \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m management [10]. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;4m4. Challenges and Future Directions\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Despite the rapid progress, several challenges remain in the field of quantum computing. These include \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m improving qubit coherence times, scaling up the number of qubits, and developing robust error correction \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m methods. Future research is likely to focus on hybrid quantum-classical systems, which combine the strengths of \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m both paradigms to tackle complex problems. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;4mConclusion\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m Quantum computing is advancing at a remarkable pace, with significant developments in hardware, algorithms, and \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m applications. As the field continues to mature, it holds the promise of transforming industries and solving \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m problems that are currently intractable for classical computers. Continued investment in research and \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m development, along with collaboration between academia and industry, will be crucial to realizing the full \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m potential of quantum computing. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;4mReferences\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 1 \u001b[0mIBM Research. (2023). IBM Quantum Roadmap. Retrieved from \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0mhttps://research.ibm.com/quantum-computing/roadmap \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 2 \u001b[0mIonQ. (2023). IonQ's Quantum Computing Technology. Retrieved from https://ionq.com/technology \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 3 \u001b[0mXanadu. (2023). Borealis: A Photonic Quantum Computer. Retrieved from https://xanadu.ai/borealis \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 4 \u001b[0mPsiQuantum. (2023). Photonic Quantum Computing. Retrieved from https://psiquantum.com/technology \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 5 \u001b[0mBiamonte, J., et al. (2023). Quantum Machine Learning. Nature Reviews Physics. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 6 \u001b[0mFowler, A. G., et al. (2023). Surface Codes: Towards Practical Quantum Computing. Physical Review A. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 7 \u001b[0mAspuru-Guzik, A., et al. (2023). Quantum Simulation of Chemical Systems. Chemical Reviews. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 8 \u001b[0mNIST. (2023). Post-Quantum Cryptography Standardization. Retrieved from \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0mhttps://csrc.nist.gov/Projects/post-quantum-cryptography \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 9 \u001b[0mQubit Pharmaceuticals. (2023). Quantum Computing in Drug Discovery. Retrieved from \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m \u001b[0mhttps://qubit-pharmaceuticals.com/quantum-computing \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1;33m 10 \u001b[0mVenturelli, D., et al. (2023). Quantum Optimization Algorithms. Journal of Quantum Information Processing. \u001b[36m│\u001b[0m\n",
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"# Recent Advances in Quantum Computing\n",
"\n",
"Quantum computing is a rapidly evolving field that leverages the principles of quantum mechanics to process information in fundamentally new ways. This report highlights some of the most significant recent advances in quantum computing, focusing on developments in hardware, algorithms, and applications.\n",
"\n",
"## 1. Quantum Hardware Developments\n",
"\n",
"### 1.1 Superconducting Qubits\n",
"Superconducting qubits have been at the forefront of quantum computing hardware. Companies like IBM and Google have made significant strides in increasing the coherence times and connectivity of these qubits. In 2023, IBM announced the development of their 433-qubit processor, Osprey, which is part of their roadmap to achieve a 1,000-qubit system by 2024 [1].\n",
"\n",
"### 1.2 Trapped Ion Qubits\n",
"Trapped ion technology continues to be a strong contender due to its high fidelity and long coherence times. IonQ, a leader in this space, has developed systems that can execute quantum circuits with high precision. Their recent advancements include the development of error-corrected logical qubits, which are crucial for scalable quantum computing [2].\n",
"\n",
"### 1.3 Photonic Quantum Computing\n",
"Photonic quantum computing has seen breakthroughs with companies like Xanadu and PsiQuantum. Xanadu's Borealis, a photonic quantum computer, demonstrated quantum advantage by solving specific problems faster than classical supercomputers [3]. PsiQuantum is working towards a million-qubit photonic quantum computer, leveraging silicon photonics for scalability [4].\n",
"\n",
"## 2. Quantum Algorithms\n",
"\n",
"### 2.1 Quantum Machine Learning\n",
"Quantum machine learning (QML) is gaining traction as researchers develop algorithms that could outperform classical counterparts. Recent work has focused on hybrid quantum-classical algorithms that leverage quantum speedups for specific tasks like clustering and classification [5].\n",
"\n",
"### 2.2 Quantum Error Correction\n",
"Error correction remains a critical challenge in quantum computing. Recent advances include the development of more efficient error-correcting codes and fault-tolerant architectures. The surface code, a leading error correction method, has seen improvements in its threshold and resource requirements [6].\n",
"\n",
"### 2.3 Quantum Simulation\n",
"Quantum simulation is one of the most promising applications of quantum computing. Recent studies have demonstrated the simulation of complex quantum systems, such as chemical reactions and material properties, with unprecedented accuracy [7].\n",
"\n",
"## 3. Applications and Industry Impact\n",
"\n",
"### 3.1 Cryptography\n",
"Quantum computing poses both threats and opportunities for cryptography. The development of quantum-resistant algorithms is crucial as quantum computers could potentially break widely used encryption methods. The National Institute of Standards and Technology (NIST) is in the process of standardizing post-quantum cryptographic algorithms [8].\n",
"\n",
"### 3.2 Drug Discovery\n",
"Quantum computing is poised to revolutionize drug discovery by enabling the simulation of molecular interactions at a quantum level. Companies like Qubit Pharmaceuticals and Cambridge Quantum Computing are actively working on quantum algorithms for drug discovery, promising faster and more accurate predictions [9].\n",
"\n",
"### 3.3 Optimization Problems\n",
"Quantum computers have the potential to solve complex optimization problems more efficiently than classical computers. This has significant implications for industries such as logistics, finance, and manufacturing. Recent advances include the development of quantum algorithms for portfolio optimization and supply chain management [10].\n",
"\n",
"## 4. Challenges and Future Directions\n",
"\n",
"Despite the rapid progress, several challenges remain in the field of quantum computing. These include improving qubit coherence times, scaling up the number of qubits, and developing robust error correction methods. Future research is likely to focus on hybrid quantum-classical systems, which combine the strengths of both paradigms to tackle complex problems.\n",
"\n",
"## Conclusion\n",
"\n",
"Quantum computing is advancing at a remarkable pace, with significant developments in hardware, algorithms, and applications. As the field continues to mature, it holds the promise of transforming industries and solving problems that are currently intractable for classical computers. Continued investment in research and development, along with collaboration between academia and industry, will be crucial to realizing the full potential of quantum computing.\n",
"\n",
"## References\n",
"\n",
"1. IBM Research. (2023). IBM Quantum Roadmap. Retrieved from https://research.ibm.com/quantum-computing/roadmap\n",
"2. IonQ. (2023). IonQ's Quantum Computing Technology. Retrieved from https://ionq.com/technology\n",
"3. Xanadu. (2023). Borealis: A Photonic Quantum Computer. Retrieved from https://xanadu.ai/borealis\n",
"4. PsiQuantum. (2023). Photonic Quantum Computing. Retrieved from https://psiquantum.com/technology\n",
"5. Biamonte, J., et al. (2023). Quantum Machine Learning. Nature Reviews Physics.\n",
"6. Fowler, A. G., et al. (2023). Surface Codes: Towards Practical Quantum Computing. Physical Review A.\n",
"7. Aspuru-Guzik, A., et al. (2023). Quantum Simulation of Chemical Systems. Chemical Reviews.\n",
"8. NIST. (2023). Post-Quantum Cryptography Standardization. Retrieved from https://csrc.nist.gov/Projects/post-quantum-cryptography\n",
"9. Qubit Pharmaceuticals. (2023). Quantum Computing in Drug Discovery. Retrieved from https://qubit-pharmaceuticals.com/quantum-computing\n",
"10. Venturelli, D., et al. (2023). Quantum Optimization Algorithms. Journal of Quantum Information Processing.\n"
]
}
],
"source": [
"from praisonaiagents import Agent\n",
"\n",
"# User input (for demo, hardcoded; in real use, use input() or widgets)\n",
"topic = \"Recent advances in quantum computing\"\n",
"\n",
"# Use the custom tool\n",
"tool = DummyDeepResearchTool(topic)\n",
"dummy_report = tool.research()\n",
"\n",
"if not is_valid_key(OPENAI_API_KEY, \"sk\"):\n",
" print(\"API key not set or is a placeholder. Using dummy research report for CI/testing.\")\n",
" print(dummy_report)\n",
"else:\n",
" prompt = f\"\"\"\n",
" You are a domain research assistant. Perform deep research on the following topic and provide a structured, well-cited report:\n",
" TOPIC: {topic}\n",
" \"\"\"\n",
" agent = Agent(\n",
" name=\"Domain Deep Research Agent\",\n",
" instructions=prompt,\n",
" api_key=OPENAI_API_KEY\n",
" )\n",
" report = agent.start(prompt)\n",
" print(report)"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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-5-nano\"\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
}
@@ -120,7 +120,7 @@
"\n",
" def run(self, message: str):\n",
" response = client.chat.completions.create(\n",
" model=\"gpt-4o-mini\",\n",
" model=\"gpt-5-nano\",\n",
" messages=[\n",
" {\"role\": \"system\", \"content\": self.prompt},\n",
" {\"role\": \"user\", \"content\": message}\n",
@@ -0,0 +1,689 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"4ab88bfcb62e4f9a8db7e35aefbae00a": {
"model_module": "@jupyter-widgets/output",
"model_name": "OutputModel",
"model_module_version": "1.0.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/output",
"_model_module_version": "1.0.0",
"_model_name": "OutputModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/output",
"_view_module_version": "1.0.0",
"_view_name": "OutputView",
"layout": "IPY_MODEL_3d1ae7a6c0a947f985f6ef921b74ecf8",
"msg_id": "",
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "\u001b[32m╭─\u001b[0m\u001b[32m─────────────────────────────────────────────\u001b[0m\u001b[32m Generating... 23.2s \u001b[0m\u001b[32m─────────────────────────────────────────────\u001b[0m\u001b[32m─╮\u001b[0m\n\u001b[32m│\u001b[0m [INTRO MUSIC FADES IN] \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mAlex\u001b[0m: Hello and welcome to another episode of \"The World Today,\" where we dive into the latest in technology \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m and world news. I'm Alex, your go-to for all things analytical and fact-focused. \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mMorgan\u001b[0m: And I'm Morgan, here to explore the human impact and social context of today's stories. We've got a \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m fascinating lineup for you today, so let's dive right in! \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mAlex\u001b[0m: First up, we're talking about a topic that's been making waves across the healthcare industry: the role \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m of artificial intelligence. According to a recent article from \u001b]8;id=672819;https://news.example.com/ai-healthcare\u001b\\\u001b[4;34mNews Example\u001b[0m\u001b]8;;\u001b\\, AI is revolutionizing healthcare \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m in ways we could only dream of a decade ago. \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mMorgan\u001b[0m: That's right, Alex. AI is not just a buzzword anymore; it's actively changing how we approach \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m healthcare. From diagnostics to treatment plans, AI is helping doctors make more accurate decisions faster. But \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m what does this mean for patients and healthcare professionals? \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mAlex\u001b[0m: Well, Morgan, AI's ability to analyze vast amounts of data quickly means that doctors can diagnose \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m diseases earlier and more accurately. For instance, AI algorithms can now detect patterns in medical imaging \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m that might be too subtle for the human eye. This can lead to earlier interventions and better patient outcomes. \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mMorgan\u001b[0m: And let's not forget about the human side of things. For patients, this means less waiting time for \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m results and potentially more personalized treatment plans. But there's also a concern about the human touch in \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m healthcare. How do we balance the efficiency of AI with the empathy and understanding that only a human can \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m provide? \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m \u001b[1mAlex\u001b[0m: That's a great point. The integration of AI in healthcare does raise ethical questions. For example, who \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m is responsible if an AI system makes a mistake? And how do we ensure that these systems are free from bias? \u001b[32m│\u001b[0m\n\u001b[32m│\u001b[0m Line truncated
"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: #008000; text-decoration-color: #008000\">╭────────────────────────────────────────────── Generating... 23.2s ──────────────────────────────────────────────╮</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> [INTRO MUSIC FADES IN] <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"font-weight: bold\">Alex</span>: Hello and welcome to another episode of \"The World Today,\" where we dive into the latest in technology <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> and world news. I'm Alex, your go-to for all things analytical and fact-focused. <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"font-weight: bold\">Morgan</span>: And I'm Morgan, here to explore the human impact and social context of today's stories. We've got a <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> fascinating lineup for you today, so let's dive right in! <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"font-weight: bold\">Alex</span>: First up, we're talking about a topic that's been making waves across the healthcare industry: the role <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> of artificial intelligence. According to a recent article from <a href=\"https://news.example.com/ai-healthcare\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">News Example</span></a>, AI is revolutionizing healthcare <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> in ways we could only dream of a decade ago. <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"font-weight: bold\">Morgan</span>: That's right, Alex. AI is not just a buzzword anymore; it's actively changing how we approach <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> healthcare. From diagnostics to treatment plans, AI is helping doctors make more accurate decisions faster. But <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> what does this mean for patients and healthcare professionals? <span style=\"color: #008000; text-decoration-color: #008000\">│</span>\n<span style=\"color: #008000; text-decoration-color: #008000\">│</span> <span style=\"coloLine truncated
},
"metadata": {}
}
]
}
},
"3d1ae7a6c0a947f985f6ef921b74ecf8": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
}
}
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# News and Podcast Aggregator Agent using PraisonAIAgents"
],
"metadata": {
"id": "5DpLQOaCmYbu"
}
},
{
"cell_type": "markdown",
"source": [
"This notebook demonstrates a News and Podcast Aggregator Agent built with `praisonaiagents`. \n",
"It summarizes news articles and generates podcast-style discussion points. \n",
"The notebook is CI-friendly: it uses dummy data if API keys are not set, so all tests/checks will pass."
],
"metadata": {
"id": "qmVwAahwmYTZ"
}
},
{
"cell_type": "markdown",
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Dhivya-Bharathy/PraisonAI/blob/main/examples/cookbooks/SocialMedia_Content_Agents/News_And_Podcast_Aggregator_Agent.ipynb)\n"
],
"metadata": {
"id": "tYRRrgqHqbuN"
}
},
{
"cell_type": "markdown",
"source": [
"# Dependencies"
],
"metadata": {
"id": "baTmwAjYmfDg"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "IIm2awOXmXB9"
},
"outputs": [],
"source": [
"!pip install praisonaiagents pydantic"
]
},
{
"cell_type": "markdown",
"source": [
"# Imports and Setup"
],
"metadata": {
"id": "kqNfe5S2mjnn"
}
},
{
"cell_type": "code",
"source": [
"import os\n",
"\n",
"# Set up the OpenAI API key for praisonaiagents\n",
"os.environ[\"OPENAI_API_KEY\"] = os.environ.get(\"OPENAI_API_KEY\", \"sk-..\")\n",
"\n",
"def is_valid_key(key, prefix):\n",
" return key and key != f\"{prefix}-..\" and key.startswith(prefix)\n",
"\n",
"OPENAI_API_KEY = os.environ[\"OPENAI_API_KEY\"]"
],
"metadata": {
"id": "A-OXlt2gmpUS"
},
"execution_count": 3,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Tools"
],
"metadata": {
"id": "IJmdTrCDoufF"
}
},
{
"cell_type": "code",
"source": [
"from datetime import datetime\n",
"from typing import List\n",
"\n",
"def format_search_results_for_podcast(search_results: List[dict]) -> tuple[str, List[str]]:\n",
" \"\"\"\n",
" Custom tool to format search results for podcast script generation.\n",
" \"\"\"\n",
" created_at = datetime.now().strftime(\"%B %d, %Y at %I:%M %p\")\n",
" structured_content = []\n",
" structured_content.append(f\"PODCAST CREATION: {created_at}\\n\")\n",
" sources = []\n",
" for idx, search_result in enumerate(search_results):\n",
" try:\n",
" if search_result.get(\"confirmed\", False):\n",
" sources.append(search_result[\"url\"])\n",
" structured_content.append(\n",
" f\"\"\"\n",
" SOURCE {idx + 1}:\n",
" Title: {search_result['title']}\n",
" URL: {search_result['url']}\n",
" Content: {search_result.get('full_text') or search_result.get('description', '')}\n",
" ---END OF SOURCE {idx + 1}---\n",
" \"\"\".strip()\n",
" )\n",
" except Exception as e:\n",
" print(f\"Error processing search result: {e}\")\n",
" content_texts = \"\\n\\n\".join(structured_content)\n",
" return content_texts, sources"
],
"metadata": {
"id": "yHj7Grvmov4C"
},
"execution_count": 4,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Pydantic Models"
],
"metadata": {
"id": "eMYs7Oibo1M3"
}
},
{
"cell_type": "code",
"source": [
"from pydantic import BaseModel, Field\n",
"from typing import List, Optional\n",
"\n",
"class Dialog(BaseModel):\n",
" speaker: str = Field(..., description=\"The speaker name (SHOULD BE 'ALEX' OR 'MORGAN')\")\n",
" text: str = Field(..., description=\"The spoken text content for this speaker based on the requested language, default is English\")\n",
"\n",
"class Section(BaseModel):\n",
" type: str = Field(..., description=\"The section type (intro, headlines, article, outro)\")\n",
" title: Optional[str] = Field(None, description=\"Optional title for the section (required for article type)\")\n",
" dialog: List[Dialog] = Field(..., description=\"List of dialog exchanges between speakers\")\n",
"\n",
"class PodcastScript(BaseModel):\n",
" title: str = Field(..., description=\"The podcast episode title with date\")\n",
" sections: List[Section] = Field(..., description=\"List of podcast sections (intro, headlines, articles, outro)\")"
],
"metadata": {
"id": "Z4uBU68eo2L_"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Agent Instructions"
],
"metadata": {
"id": "sRTr9D35o-5D"
}
},
{
"cell_type": "code",
"source": [
"from textwrap import dedent\n",
"\n",
"PODCAST_AGENT_DESCRIPTION = \"You are a helpful assistant that can generate engaging podcast scripts for the given sources.\"\n",
"PODCAST_AGENT_INSTRUCTIONS = dedent(\"\"\"\n",
" You are a helpful assistant that can generate engaging podcast scripts for the given source content and query.\n",
" For given content, create an engaging podcast script that should be at least 15 minutes worth of content and you are allowed to enhance the script beyond given sources if you know something additional info will be interesting to the discussion or not enough content is available.\n",
" You use the provided sources to ground your podcast script generation process. Keep it engaging and interesting.\n",
" IMPORTANT: Generate the entire script in the provided language.\n",
" CONTENT GUIDELINES:\n",
" - Provide insightful analysis that helps the audience understand the significance\n",
" - Include discussions on potential implications and broader context of each story\n",
" - Explain complex concepts in an accessible but thorough manner\n",
" - Make connections between current and relevant historical developments when applicable\n",
" - Provide comparisons and contrasts with similar stories or trends when relevant\n",
" PERSONALITY NOTES:\n",
" - Alex is more analytical and fact-focused\n",
" - Morgan is more focused on human impact, social context, and practical applications\n",
" - Include natural, conversational banter and smooth transitions between topics\n",
" - Each article discussion should go beyond the basic summary to provide valuable insights\n",
" - Maintain a conversational but informed tone that would appeal to a general audience\n",
" IMPORTANT:\n",
" - MAKE SURE PODCAST SCRIPTS ARE AT LEAST 15 MINUTES LONG WHICH MEANS YOU NEED TO HAVE DETAILED DISCUSSIONS BUT KEEP IT INTERESTING AND ENGAGING.\n",
"\"\"\")"
],
"metadata": {
"id": "quslT1kFo_yc"
},
"execution_count": 6,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# Dummy Data and Main Logic"
],
"metadata": {
"id": "bicXivCipLZY"
}
},
{
"cell_type": "code",
"source": [
"from praisonaiagents import Agent\n",
"\n",
"# Dummy search results for CI/public use\n",
"dummy_search_results = [\n",
" {\n",
" \"confirmed\": True,\n",
" \"title\": \"AI Revolutionizes Healthcare\",\n",
" \"url\": \"https://news.example.com/ai-healthcare\",\n",
" \"full_text\": \"Artificial intelligence is transforming the healthcare industry by...\"\n",
" },\n",
" {\n",
" \"confirmed\": True,\n",
" \"title\": \"Climate Change and Global Policy\",\n",
" \"url\": \"https://news.example.com/climate-policy\",\n",
" \"full_text\": \"World leaders are meeting to discuss new policies for climate change...\"\n",
" }\n",
"]\n",
"\n",
"query = \"Latest technology and world news\"\n",
"language_name = \"English\"\n",
"\n",
"content_texts, sources = format_search_results_for_podcast(dummy_search_results)\n",
"\n",
"if not is_valid_key(OPENAI_API_KEY, \"sk\"):\n",
" print(\"API key not set or is a placeholder. Using dummy podcast script for CI/testing.\")\n",
" print(\"=== Podcast Script ===\")\n",
" print(f\"Podcast Title: Tech & World News Roundup ({datetime.now().strftime('%B %d, %Y')})\")\n",
" for idx, article in enumerate(dummy_search_results):\n",
" print(f\"\\nSection {idx+1}: {article['title']}\")\n",
" print(f\"Summary: {article['full_text'][:80]}...\")\n",
"else:\n",
" agent = Agent(\n",
" name=\"Podcast Script Agent\",\n",
" instructions=PODCAST_AGENT_INSTRUCTIONS,\n",
" api_key=OPENAI_API_KEY\n",
" )\n",
" prompt = f\"query: {query}\\nlanguage_name: {language_name}\\ncontent_texts: {content_texts}\\nIMPORTANT: texts should be in {language_name} language.\"\n",
" podcast_script = agent.start(prompt)\n",
" print(\"=== Podcast Script ===\")\n",
" print(podcast_script)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000,
"referenced_widgets": [
"4ab88bfcb62e4f9a8db7e35aefbae00a",
"3d1ae7a6c0a947f985f6ef921b74ecf8"
]
},
"id": "H4UoF8PApMUJ",
"outputId": "748c6a75-0a0e-494a-983c-fb539ff7641a"
},
"execution_count": 7,
"outputs": [
{
"output_type": "display_data",
"data": {
"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;229mPodcast Script Agent\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"
],
"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\">Podcast Script 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\">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"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Output()"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "4ab88bfcb62e4f9a8db7e35aefbae00a"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [],
"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"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\n"
],
"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"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[2mResponse generated in 23.5s\u001b[0m\n"
],
"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 23.5s</span>\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"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 query: Latest technology and world news language_name: English content_texts: PODCAST CREATION: July 09, 2025 \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m at 10:03 AM \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m SOURCE 1: Title: AI Revolutionizes Healthcare URL: https://news.example.com/ai-healthcare Content: Artificial \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m intelligence is transforming the healthcare industry by... ---END OF SOURCE 1--- \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m SOURCE 2: Title: Climate Change and Global Policy URL: https://news.example.com/climate-policy Content: World \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m leaders are meeting to discuss new policies for climate change... ---END OF SOURCE 2--- IMPORTANT: texts should \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m be in English language. \u001b[36m│\u001b[0m\n",
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
],
"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> query: Latest technology and world news language_name: English content_texts: PODCAST CREATION: July 09, 2025 <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> at 10:03 AM <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> SOURCE 1: Title: AI Revolutionizes Healthcare URL: https://news.example.com/ai-healthcare Content: Artificial <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> intelligence is transforming the healthcare industry by... ---END OF SOURCE 1--- <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> SOURCE 2: Title: Climate Change and Global Policy URL: https://news.example.com/climate-policy Content: World <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> leaders are meeting to discuss new policies for climate change... ---END OF SOURCE 2--- IMPORTANT: texts should <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> be in English language. <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"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 [INTRO MUSIC FADES IN] \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: Hello and welcome to another episode of \"The World Today,\" where we dive into the latest in technology \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m and world news. I'm Alex, your go-to for all things analytical and fact-focused. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: And I'm Morgan, here to explore the human impact and social context of today's stories. We've got a \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m fascinating lineup for you today, so let's dive right in! \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: First up, we're talking about a topic that's been making waves across the healthcare industry: the role \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m of artificial intelligence. According to a recent article from \u001b]8;id=890061;https://news.example.com/ai-healthcare\u001b\\\u001b[4;34mNews Example\u001b[0m\u001b]8;;\u001b\\, AI is revolutionizing healthcare \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m in ways we could only dream of a decade ago. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: That's right, Alex. AI is not just a buzzword anymore; it's actively changing how we approach \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m healthcare. From diagnostics to treatment plans, AI is helping doctors make more accurate decisions faster. But \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m what does this mean for patients and healthcare professionals? \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: Well, Morgan, AI's ability to analyze vast amounts of data quickly means that doctors can diagnose \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m diseases earlier and more accurately. For instance, AI algorithms can now detect patterns in medical imaging \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m that might be too subtle for the human eye. This can lead to earlier interventions and better patient outcomes. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: And let's not forget about the human side of things. For patients, this means less waiting time for \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m results and potentially more personalized treatment plans. But there's also a concern about the human touch in \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m healthcare. How do we balance the efficiency of AI with the empathy and understanding that only a human can \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m provide? \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: That's a great point. The integration of AI in healthcare does raise ethical questions. For example, who \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m is responsible if an AI system makes a mistake? And how do we ensure that these systems are free from bias? \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: Exactly. There's a lot to consider, but the potential benefits are enormous. Imagine a world where \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m healthcare is not only more efficient but also more accessible to people in remote areas thanks to AI-driven \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m telemedicine. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: It's a fascinating time for healthcare, no doubt. But let's shift gears a bit and talk about another \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m pressing issue: climate change and global policy. According to a report from \u001b]8;id=2198;https://news.example.com/climate-policy\u001b\\\u001b[4;34mNews Example\u001b[0m\u001b]8;;\u001b\\, world leaders are \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m currently meeting to discuss new policies to combat climate change. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: Climate change is one of those issues that affects everyone, regardless of where you live. These global \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m meetings are crucial because they set the stage for international cooperation. But what are the main challenges \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m these leaders face? \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: One of the biggest challenges is balancing economic growth with environmental sustainability. Many \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m developing countries argue that they need to prioritize economic development, which often relies on fossil \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m fuels. Meanwhile, developed countries are pushing for stricter environmental regulations. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: It's a classic case of differing priorities. But there's also a growing recognition that climate change \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m doesn't respect borders. Extreme weather events, rising sea levels, and shifting agricultural patterns affect \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m us all. So, there's a real urgency to find common ground. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: And technology plays a significant role here too. Innovations in renewable energy, carbon capture, and \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m sustainable agriculture are crucial in the fight against climate change. But implementing these technologies on \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m a global scale requires significant investment and political will. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: It's a complex issue, but it's encouraging to see world leaders coming together to address it. The \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m policies they create today will shape the future for generations to come. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: Absolutely. And it's not just about government action. Individuals and businesses also have a role to \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m play in reducing carbon footprints and advocating for sustainable practices. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: It's a collective effort, and every little bit helps. Before we wrap up, Alex, any final thoughts on \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m today's topics? \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: Just that both AI in healthcare and climate change policies highlight the intersection of technology and \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m society. They show us how innovation can drive progress but also remind us of the responsibilities that come \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m with it. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: Well said, Alex. It's all about finding that balance. And with that, we've reached the end of today's \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m episode. Thanks for tuning in to \"The World Today.\" \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mAlex\u001b[0m: Don't forget to subscribe and join us next time for more insights into the latest in technology and world \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m news. \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[1mMorgan\u001b[0m: Until then, stay informed and stay curious! \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m \u001b[36m│\u001b[0m\n",
"\u001b[36m│\u001b[0m [OUTRO MUSIC FADES OUT] \u001b[36m│\u001b[0m\n",
"\u001b[36m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
],
"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> [INTRO MUSIC FADES IN] <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\">Alex</span>: Hello and welcome to another episode of \"The World Today,\" where we dive into the latest in technology <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> and world news. I'm Alex, your go-to for all things analytical and fact-focused. <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\">Morgan</span>: And I'm Morgan, here to explore the human impact and social context of today's stories. We've got a <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> fascinating lineup for you today, so let's dive right in! <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\">Alex</span>: First up, we're talking about a topic that's been making waves across the healthcare industry: the role <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> of artificial intelligence. According to a recent article from <a href=\"https://news.example.com/ai-healthcare\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">News Example</span></a>, AI is revolutionizing healthcare <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> in ways we could only dream of a decade ago. <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\">Morgan</span>: That's right, Alex. AI is not just a buzzword anymore; it's actively changing how we approach <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> healthcare. From diagnostics to treatment plans, AI is helping doctors make more accurate decisions faster. But <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> what does this mean for patients and healthcare professionals? <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\">Alex</span>: Well, Morgan, AI's ability to analyze vast amounts of data quickly means that doctors can diagnose <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> diseases earlier and more accurately. For instance, AI algorithms can now detect patterns in medical imaging <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> that might be too subtle for the human eye. This can lead to earlier interventions and better patient outcomes. <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\">Morgan</span>: And let's not forget about the human side of things. For patients, this means less waiting time for <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> results and potentially more personalized treatment plans. But there's also a concern about the human touch in <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> healthcare. How do we balance the efficiency of AI with the empathy and understanding that only a human can <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> provide? <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\">Alex</span>: That's a great point. The integration of AI in healthcare does raise ethical questions. For example, who <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> is responsible if an AI system makes a mistake? And how do we ensure that these systems are free from bias? <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\">Morgan</span>: Exactly. There's a lot to consider, but the potential benefits are enormous. Imagine a world where <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> healthcare is not only more efficient but also more accessible to people in remote areas thanks to AI-driven <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> telemedicine. <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\">Alex</span>: It's a fascinating time for healthcare, no doubt. But let's shift gears a bit and talk about another <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> pressing issue: climate change and global policy. According to a report from <a href=\"https://news.example.com/climate-policy\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">News Example</span></a>, world leaders are <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> currently meeting to discuss new policies to combat climate change. <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\">Morgan</span>: Climate change is one of those issues that affects everyone, regardless of where you live. These global <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> meetings are crucial because they set the stage for international cooperation. But what are the main challenges <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> these leaders face? <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\">Alex</span>: One of the biggest challenges is balancing economic growth with environmental sustainability. Many <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> developing countries argue that they need to prioritize economic development, which often relies on fossil <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> fuels. Meanwhile, developed countries are pushing for stricter environmental regulations. <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\">Morgan</span>: It's a classic case of differing priorities. But there's also a growing recognition that climate change <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> doesn't respect borders. Extreme weather events, rising sea levels, and shifting agricultural patterns affect <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> us all. So, there's a real urgency to find common ground. <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\">Alex</span>: And technology plays a significant role here too. Innovations in renewable energy, carbon capture, and <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> sustainable agriculture are crucial in the fight against climate change. But implementing these technologies on <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> a global scale requires significant investment and political will. <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\">Morgan</span>: It's a complex issue, but it's encouraging to see world leaders coming together to address it. The <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> policies they create today will shape the future for generations to come. <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\">Alex</span>: Absolutely. And it's not just about government action. Individuals and businesses also have a role to <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> play in reducing carbon footprints and advocating for sustainable practices. <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\">Morgan</span>: It's a collective effort, and every little bit helps. Before we wrap up, Alex, any final thoughts on <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> today's topics? <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\">Alex</span>: Just that both AI in healthcare and climate change policies highlight the intersection of technology and <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> society. They show us how innovation can drive progress but also remind us of the responsibilities that come <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> with it. <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\">Morgan</span>: Well said, Alex. It's all about finding that balance. And with that, we've reached the end of today's <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> episode. Thanks for tuning in to \"The World Today.\" <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\">Alex</span>: Don't forget to subscribe and join us next time for more insights into the latest in technology and world <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">│</span> news. <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\">Morgan</span>: Until then, stay informed and stay curious! <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> [OUTRO MUSIC FADES OUT] <span style=\"color: #008080; text-decoration-color: #008080\">│</span>\n",
"<span style=\"color: #008080; text-decoration-color: #008080\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"=== Podcast Script ===\n",
"[INTRO MUSIC FADES IN]\n",
"\n",
"**Alex**: Hello and welcome to another episode of \"The World Today,\" where we dive into the latest in technology and world news. I'm Alex, your go-to for all things analytical and fact-focused.\n",
"\n",
"**Morgan**: And I'm Morgan, here to explore the human impact and social context of today's stories. We've got a fascinating lineup for you today, so let's dive right in!\n",
"\n",
"**Alex**: First up, we're talking about a topic that's been making waves across the healthcare industry: the role of artificial intelligence. According to a recent article from [News Example](https://news.example.com/ai-healthcare), AI is revolutionizing healthcare in ways we could only dream of a decade ago.\n",
"\n",
"**Morgan**: That's right, Alex. AI is not just a buzzword anymore; it's actively changing how we approach healthcare. From diagnostics to treatment plans, AI is helping doctors make more accurate decisions faster. But what does this mean for patients and healthcare professionals?\n",
"\n",
"**Alex**: Well, Morgan, AI's ability to analyze vast amounts of data quickly means that doctors can diagnose diseases earlier and more accurately. For instance, AI algorithms can now detect patterns in medical imaging that might be too subtle for the human eye. This can lead to earlier interventions and better patient outcomes.\n",
"\n",
"**Morgan**: And let's not forget about the human side of things. For patients, this means less waiting time for results and potentially more personalized treatment plans. But there's also a concern about the human touch in healthcare. How do we balance the efficiency of AI with the empathy and understanding that only a human can provide?\n",
"\n",
"**Alex**: That's a great point. The integration of AI in healthcare does raise ethical questions. For example, who is responsible if an AI system makes a mistake? And how do we ensure that these systems are free from bias?\n",
"\n",
"**Morgan**: Exactly. There's a lot to consider, but the potential benefits are enormous. Imagine a world where healthcare is not only more efficient but also more accessible to people in remote areas thanks to AI-driven telemedicine.\n",
"\n",
"**Alex**: It's a fascinating time for healthcare, no doubt. But let's shift gears a bit and talk about another pressing issue: climate change and global policy. According to a report from [News Example](https://news.example.com/climate-policy), world leaders are currently meeting to discuss new policies to combat climate change.\n",
"\n",
"**Morgan**: Climate change is one of those issues that affects everyone, regardless of where you live. These global meetings are crucial because they set the stage for international cooperation. But what are the main challenges these leaders face?\n",
"\n",
"**Alex**: One of the biggest challenges is balancing economic growth with environmental sustainability. Many developing countries argue that they need to prioritize economic development, which often relies on fossil fuels. Meanwhile, developed countries are pushing for stricter environmental regulations.\n",
"\n",
"**Morgan**: It's a classic case of differing priorities. But there's also a growing recognition that climate change doesn't respect borders. Extreme weather events, rising sea levels, and shifting agricultural patterns affect us all. So, there's a real urgency to find common ground.\n",
"\n",
"**Alex**: And technology plays a significant role here too. Innovations in renewable energy, carbon capture, and sustainable agriculture are crucial in the fight against climate change. But implementing these technologies on a global scale requires significant investment and political will.\n",
"\n",
"**Morgan**: It's a complex issue, but it's encouraging to see world leaders coming together to address it. The policies they create today will shape the future for generations to come.\n",
"\n",
"**Alex**: Absolutely. And it's not just about government action. Individuals and businesses also have a role to play in reducing carbon footprints and advocating for sustainable practices.\n",
"\n",
"**Morgan**: It's a collective effort, and every little bit helps. Before we wrap up, Alex, any final thoughts on today's topics?\n",
"\n",
"**Alex**: Just that both AI in healthcare and climate change policies highlight the intersection of technology and society. They show us how innovation can drive progress but also remind us of the responsibilities that come with it.\n",
"\n",
"**Morgan**: Well said, Alex. It's all about finding that balance. And with that, we've reached the end of today's episode. Thanks for tuning in to \"The World Today.\"\n",
"\n",
"**Alex**: Don't forget to subscribe and join us next time for more insights into the latest in technology and world news.\n",
"\n",
"**Morgan**: Until then, stay informed and stay curious!\n",
"\n",
"[OUTRO MUSIC FADES OUT]\n"
]
}
]
}
]
}
File diff suppressed because it is too large. Load diff
@@ -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": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
}
@@ -1,355 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "_T4g3t5sLoag"
},
"source": [
"# ZeroScript: AI-Powered Browser Test Automation using PraisonAI Agent & OpenAI"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O4PKfpalLsmn"
},
"source": [
"# Description"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CEG1pfumLysm"
},
"source": [
"AI-powered browser testing using PraisonAI Agent and OpenAI. Executes YAML-defined test cases, captures screenshots, logs interactions, and generates JSON reports. Ideal for intelligent, automated UI testing.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lbgxOG4gL1Wf"
},
"source": [
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/ZeroScript_AI_TestExecutor.ipynb)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WCJqMUzXIndh"
},
"source": [
"# Dependencies"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"id": "9AQhJ59cJPmR"
},
"outputs": [],
"source": [
"!pip install --quiet praisonaiagents browser-use python-dotenv pyyaml openai\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QD-dF-6_It1z"
},
"source": [
"# Environment Setup"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QkRQDli4JhCV",
"outputId": "4b8957ed-a37a-4b11-8585-3537a0437d40"
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"from dotenv import load_dotenv\n",
"\n",
"os.environ[\"OPENAI_API_KEY\"] = \"Enter your key\" # replace with actual key\n",
"load_dotenv()\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ELuogWnrIw3o"
},
"source": [
"# Create my_secrets.py"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"id": "sG6tO_v0Jm5N"
},
"outputs": [],
"source": [
"with open(\"my_secrets.py\", \"w\") as f:\n",
" f.write('''sensitive_data = {\n",
" \"username\": \"standard_user\",\n",
" \"password\": \"secret_sauce\"\n",
"}''')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDB_viedIzRR"
},
"source": [
"# Create views.py"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"id": "CtwcybdbJoV8"
},
"outputs": [],
"source": [
"with open(\"views.py\", \"w\") as f:\n",
" f.write('''\n",
"from pydantic import BaseModel\n",
"\n",
"class TestResult(BaseModel):\n",
" status: str\n",
" message: str = \"\"\n",
"''')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YTRmBpTiI1kd"
},
"source": [
"# Create agent.py"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"id": "zdJJGt6TJpvr"
},
"outputs": [],
"source": [
"with open(\"agent.py\", \"w\") as f:\n",
" f.write('''\n",
"import os\n",
"from praisonaiagents import Agent\n",
"from browser_use import Browser, BrowserConfig, Controller\n",
"from browser_use.browser.context import BrowserContext, BrowserContextConfig\n",
"from openai import OpenAI\n",
"from views import TestResult\n",
"from my_secrets import sensitive_data\n",
"\n",
"# Browser setup\n",
"browser = Browser(config=BrowserConfig(headless=True))\n",
"context_cfg = BrowserContextConfig(save_recording_path=\"data/recordings\")\n",
"controller = Controller(output_model=TestResult)\n",
"\n",
"async def browser_use(task: str):\n",
" context = BrowserContext(browser=browser, config=context_cfg)\n",
" agent = Agent(\n",
" task=task,\n",
" llm=OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"), model=\"gpt-4\"),\n",
" browser_context=context,\n",
" sensitive_data=sensitive_data,\n",
" controller=controller,\n",
" save_conversation_path=\"data/conversations/convo\",\n",
" extend_system_message=(\n",
" \"You are a professional software tester. Execute browser test steps precisely.\"\n",
" )\n",
" )\n",
" response = await agent.run()\n",
" await context.close()\n",
" return response\n",
"''')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-LZtQIE3I4-_"
},
"source": [
"# Create Sample Test YAML"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "l1OdXYI-JreK",
"outputId": "62323fcd-c74f-498f-defc-2c170fa8983e"
},
"outputs": [
{
"data": {
"text/plain": [
"350"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pathlib import Path\n",
"tests_dir = Path(\"tests\")\n",
"tests_dir.mkdir(exist_ok=True)\n",
"yaml_content = \"\"\"\n",
"hooks:\n",
" beforeEach: |\n",
" Navigate to https://www.saucedemo.com\n",
" afterEach: |\n",
" Take screenshot\n",
"\n",
"tests:\n",
" - id: \"login_test_001\"\n",
" name: \"Valid Login Test\"\n",
" instructions: |\n",
" 1. Enter standard_user in username field\n",
" 2. Enter secret_sauce in password field\n",
" 3. Click login button\n",
" 4. Verify page contains text \"Products\"\n",
"\"\"\"\n",
"(Path(\"tests/login_test.yml\")).write_text(yaml_content)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sUjy-7OdI7p_"
},
"source": [
"# Run Tests"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Agkiwh7xJtY3",
"outputId": "759aa77c-fd65-49b8-b239-550588059478"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Exception ignored in: <function BrowserSession.__del__ at 0x7e2f540fb100>\n",
"Traceback (most recent call last):\n",
" File \"/usr/local/lib/python3.11/dist-packages/browser_use/browser/session.py\", line 497, in __del__\n",
" status = f'🪓 killing pid={self.browser_pid}...' if (self.browser_pid and owns_browser) else '☠️'\n",
" ^^^^^^^^^^^^^^^^\n",
" File \"/usr/local/lib/python3.11/dist-packages/pydantic/main.py\", line 991, in __getattr__\n",
" raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}')\n",
"AttributeError: 'BrowserSession' object has no attribute 'browser_pid'\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"✅ Report saved to data/reports/report_20250630_092319.json\n"
]
}
],
"source": [
"import asyncio, yaml, json, base64, shutil\n",
"from agent import browser_use, browser\n",
"from pathlib import Path\n",
"from datetime import datetime\n",
"\n",
"# Clean or create data dirs\n",
"for sub in [\"recordings\", \"conversations\", \"screenshots\", \"reports\"]:\n",
" d = Path(\"data\") / sub\n",
" if d.exists(): shutil.rmtree(d)\n",
" d.mkdir(parents=True, exist_ok=True)\n",
"\n",
"async def execute_test_file(path):\n",
" cfg = yaml.safe_load(Path(path).read_text())\n",
" hooks, results = cfg.get(\"hooks\", {}), []\n",
" for t in cfg[\"tests\"]:\n",
" task = f\"{hooks.get('beforeEach','')}\\n{t['instructions']}\\n{hooks.get('afterEach','')}\"\n",
" res = {\"id\": t[\"id\"], \"name\": t[\"name\"]}\n",
" try:\n",
" r = await browser_use(task)\n",
" imgs = r.screenshots()\n",
" if imgs:\n",
" out = Path(\"data/screenshots\") / f\"{t['id']}.png\"\n",
" out.write_bytes(base64.b64decode(imgs[-1]))\n",
" result_obj = r.final_result() if hasattr(r, \"final_result\") else str(r)\n",
" res[\"result\"] = result_obj.dict() if hasattr(result_obj, \"dict\") else str(result_obj)\n",
" except Exception as e:\n",
" res[\"error\"] = str(e)\n",
" results.append(res)\n",
" return results\n",
"\n",
"async def main():\n",
" all_results = []\n",
" for file in Path(\"tests\").glob(\"*.yml\"):\n",
" all_results.extend(await execute_test_file(str(file)))\n",
" report = Path(\"data/reports\") / f\"report_{datetime.now():%Y%m%d_%H%M%S}.json\"\n",
" report.write_text(json.dumps(all_results, indent=2))\n",
" await browser.close()\n",
" print(f\"✅ Report saved to {report}\")\n",
"\n",
"await main()\n"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
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
Loaded 100 of 656 files, more files were not shown because too many files have changed in this diff. Show more