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