| """ |
| Test LangChain Tools for SPARKNET |
| Tests all tools individually and as part of the VISTA registry |
| """ |
|
|
| import asyncio |
| from pathlib import Path |
| from src.tools.langchain_tools import ( |
| pdf_extractor_tool, |
| patent_parser_tool, |
| web_search_tool, |
| wikipedia_tool, |
| arxiv_tool, |
| document_generator_tool, |
| gpu_monitor_tool, |
| VISTAToolRegistry, |
| get_vista_tools, |
| ) |
|
|
|
|
| async def test_gpu_monitor(): |
| """Test GPU monitoring tool.""" |
| print("=" * 80) |
| print("TEST 1: GPU Monitor Tool") |
| print("=" * 80) |
|
|
| try: |
| |
| result = await gpu_monitor_tool.ainvoke({"gpu_id": None}) |
| print(result) |
| print("\n✓ GPU monitor test passed\n") |
| return True |
| except Exception as e: |
| print(f"✗ GPU monitor test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_web_search(): |
| """Test web search tool.""" |
| print("=" * 80) |
| print("TEST 2: Web Search Tool") |
| print("=" * 80) |
|
|
| try: |
| result = await web_search_tool.ainvoke({ |
| "query": "artificial intelligence patent commercialization", |
| "max_results": 3 |
| }) |
| print(result[:500] + "..." if len(result) > 500 else result) |
| print("\n✓ Web search test passed\n") |
| return True |
| except Exception as e: |
| print(f"✗ Web search test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_wikipedia(): |
| """Test Wikipedia tool.""" |
| print("=" * 80) |
| print("TEST 3: Wikipedia Tool") |
| print("=" * 80) |
|
|
| try: |
| result = await wikipedia_tool.ainvoke({ |
| "query": "Technology transfer", |
| "sentences": 2 |
| }) |
| print(result) |
| print("\n✓ Wikipedia test passed\n") |
| return True |
| except Exception as e: |
| print(f"✗ Wikipedia test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_arxiv(): |
| """Test Arxiv search tool.""" |
| print("=" * 80) |
| print("TEST 4: Arxiv Tool") |
| print("=" * 80) |
|
|
| try: |
| result = await arxiv_tool.ainvoke({ |
| "query": "machine learning patent analysis", |
| "max_results": 2, |
| "sort_by": "relevance" |
| }) |
| print(result[:500] + "..." if len(result) > 500 else result) |
| print("\n✓ Arxiv test passed\n") |
| return True |
| except Exception as e: |
| print(f"✗ Arxiv test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_document_generator(): |
| """Test PDF document generation.""" |
| print("=" * 80) |
| print("TEST 5: Document Generator Tool") |
| print("=" * 80) |
|
|
| try: |
| output_path = "/tmp/test_sparknet_doc.pdf" |
| result = await document_generator_tool.ainvoke({ |
| "output_path": output_path, |
| "title": "SPARKNET Test Report", |
| "content": """ |
| # Introduction |
| |
| This is a test document generated by SPARKNET's document generator tool. |
| |
| ## Features |
| |
| - LangChain integration |
| - PDF generation |
| - Markdown-like formatting |
| |
| This tool is useful for creating valorization reports, patent briefs, and outreach materials. |
| """, |
| "author": "SPARKNET System" |
| }) |
| print(result) |
|
|
| |
| if Path(output_path).exists(): |
| print(f"✓ PDF file created: {output_path}") |
| print("\n✓ Document generator test passed\n") |
| return True |
| else: |
| print("✗ PDF file not created") |
| return False |
|
|
| except Exception as e: |
| print(f"✗ Document generator test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_patent_parser(): |
| """Test patent parser tool.""" |
| print("=" * 80) |
| print("TEST 6: Patent Parser Tool") |
| print("=" * 80) |
|
|
| |
| patent_text = """ |
| PATENT NUMBER: US1234567B2 |
| |
| ABSTRACT |
| |
| A method and system for automated patent analysis using machine learning techniques. |
| The invention provides a novel approach to extracting and categorizing patent claims. |
| |
| CLAIMS |
| |
| 1. A method for patent analysis comprising: |
| (a) extracting text from patent documents |
| (b) identifying key sections using natural language processing |
| (c) categorizing claims by technical domain |
| |
| 2. The method of claim 1, wherein the natural language processing uses |
| transformer-based models. |
| |
| 3. The method of claim 1, wherein the system operates on a distributed |
| computing infrastructure. |
| |
| DETAILED DESCRIPTION |
| |
| The present invention relates to patent analysis systems. In particular, |
| it provides an automated method for processing large volumes of patent |
| documents and extracting relevant information for commercialization assessment. |
| |
| The system comprises multiple components including document processors, |
| machine learning models, and visualization tools. |
| """ |
|
|
| try: |
| result = await patent_parser_tool.ainvoke({ |
| "text": patent_text, |
| "extract_claims": True, |
| "extract_abstract": True, |
| "extract_description": True |
| }) |
| print(result[:800] + "..." if len(result) > 800 else result) |
| print("\n✓ Patent parser test passed\n") |
| return True |
| except Exception as e: |
| print(f"✗ Patent parser test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_pdf_extractor(): |
| """Test PDF extraction (if test PDF exists).""" |
| print("=" * 80) |
| print("TEST 7: PDF Extractor Tool") |
| print("=" * 80) |
|
|
| |
| test_pdf = "/tmp/test_sparknet_extract.pdf" |
|
|
| try: |
| |
| await document_generator_tool.ainvoke({ |
| "output_path": test_pdf, |
| "title": "Test Patent Document", |
| "content": """ |
| # Abstract |
| |
| This is a test patent document for PDF extraction testing. |
| |
| # Claims |
| |
| 1. A method for testing PDF extraction tools. |
| 2. The method of claim 1, wherein the extraction preserves formatting. |
| |
| # Description |
| |
| The PDF extraction tool uses PyMuPDF for robust text extraction |
| from patent documents and research papers. |
| """, |
| "author": "Test Author" |
| }) |
|
|
| |
| result = await pdf_extractor_tool.ainvoke({ |
| "file_path": test_pdf, |
| "page_range": "all", |
| "extract_metadata": True |
| }) |
| print(result[:500] + "..." if len(result) > 500 else result) |
| print("\n✓ PDF extractor test passed\n") |
| return True |
|
|
| except Exception as e: |
| print(f"Note: PDF extractor test skipped (no test file): {e}\n") |
| return True |
|
|
|
|
| async def test_vista_registry(): |
| """Test VISTA tool registry.""" |
| print("=" * 80) |
| print("TEST 8: VISTA Tool Registry") |
| print("=" * 80) |
|
|
| try: |
| |
| scenarios = VISTAToolRegistry.list_scenarios() |
| print(f"Available scenarios: {scenarios}") |
|
|
| |
| for scenario in scenarios: |
| tools = VISTAToolRegistry.get_tools(scenario) |
| print(f"\n{scenario}: {len(tools)} tools") |
| for tool in tools: |
| print(f" - {tool.name}: {tool.description[:60]}...") |
|
|
| |
| patent_tools = get_vista_tools("patent_wakeup") |
| print(f"\nPatent Wake-Up tools: {len(patent_tools)}") |
|
|
| print("\n✓ VISTA registry test passed\n") |
| return True |
|
|
| except Exception as e: |
| print(f"✗ VISTA registry test failed: {e}\n") |
| return False |
|
|
|
|
| async def test_tool_schemas(): |
| """Test tool schemas for LLM integration.""" |
| print("=" * 80) |
| print("TEST 9: Tool Schemas") |
| print("=" * 80) |
|
|
| try: |
| all_tools = VISTAToolRegistry.get_all_tools() |
|
|
| for tool in all_tools: |
| print(f"\nTool: {tool.name}") |
| print(f" Description: {tool.description[:80]}...") |
| print(f" Args Schema: {tool.args_schema.__name__}") |
|
|
| |
| schema_fields = tool.args_schema.model_fields |
| print(f" Parameters: {list(schema_fields.keys())}") |
|
|
| print("\n✓ Tool schemas test passed\n") |
| return True |
|
|
| except Exception as e: |
| print(f"✗ Tool schemas test failed: {e}\n") |
| return False |
|
|
|
|
| async def main(): |
| """Run all tests.""" |
| print("\n") |
| print("=" * 80) |
| print("TESTING LANGCHAIN TOOLS FOR SPARKNET") |
| print("=" * 80) |
| print("\n") |
|
|
| results = [] |
|
|
| |
| results.append(("GPU Monitor", await test_gpu_monitor())) |
| results.append(("Web Search", await test_web_search())) |
| results.append(("Wikipedia", await test_wikipedia())) |
| results.append(("Arxiv", await test_arxiv())) |
| results.append(("Document Generator", await test_document_generator())) |
| results.append(("Patent Parser", await test_patent_parser())) |
| results.append(("PDF Extractor", await test_pdf_extractor())) |
| results.append(("VISTA Registry", await test_vista_registry())) |
| results.append(("Tool Schemas", await test_tool_schemas())) |
|
|
| |
| print("=" * 80) |
| print("TEST SUMMARY") |
| print("=" * 80) |
|
|
| passed = sum(1 for _, result in results if result) |
| total = len(results) |
|
|
| for test_name, result in results: |
| status = "✓ PASSED" if result else "✗ FAILED" |
| print(f"{status}: {test_name}") |
|
|
| print(f"\nTotal: {passed}/{total} tests passed ({passed/total*100:.1f}%)") |
|
|
| if passed == total: |
| print("\n✓ ALL TESTS PASSED!") |
| else: |
| print(f"\n✗ {total - passed} test(s) failed") |
|
|
| print("\n" + "=" * 80) |
| print("LangChain tools are ready for VISTA workflows!") |
| print("=" * 80 + "\n") |
|
|
|
|
| if __name__ == "__main__": |
| asyncio.run(main()) |
|
|