| | """ |
| | 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()) |
| |
|