lumis-ai 0.1.1a1__tar.gz → 0.1.1a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/PKG-INFO +6 -4
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/README.md +1 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/scraper.py +0 -10
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/arxiv.py +22 -6
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/pytrends.py +7 -1
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/yahoofinance.py +16 -7
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/pyproject.toml +6 -4
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/.github/workflows/publish.yml +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/.gitignore +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/.python-version +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/.vscode/settings.json +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/LICENSE +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/cookbook/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/cookbook/information_extraction.ipynb +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/cookbook/nlp.ipynb +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/cookbook/utils/config.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/cookbook/utils/helper.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/base/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/base/base_agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/base/core_agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/base/graph_based_agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/prompt_refinement_pipeline.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/qa_research_agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/react_agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/source_models.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/source_tracker.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/tools/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/tools/search.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/research_agent/types.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/storm/agent.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/storm/interview_graph.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/storm/models/outline.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/agents/storm/models/survey_subjects.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/common/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/common/coloured_logger.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/common/logger_mixin.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/django/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/django/models/chat_memory.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/document.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/event_emitter.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/coroutine.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/helpers.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/inference.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/number.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/status_manager.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/string.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/thread_runner.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/thread_safe_cache.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/time.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/core/utils/types.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/embedding/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/embedding/base_embedding.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/embedding/huggingface_embedding.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/embedding/openai_embedding.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/evaluators/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/evaluators/conciseness_and_clarity_analyzer.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/evaluators/relevancy.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/graph.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/nodes/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/nodes/llm_chat_node.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/nodes/llm_node.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/nodes/llm_structured_node.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/kit/utils.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/llm/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/llm/base_llm.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/llm/gemini_llm.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/llm/ollama_llm.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/llm/openai_llm.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/llm/perplexity_llm.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/memory/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/memory/base_memory.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/memory/simple_memory.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/information_extraction/FactExtractor.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/ner/config/entity_rel_extraction.cfg +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/ner/config/fill-config.cfg +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/ner/ner.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/semantic_parser.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/spacy_summarizer.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/summarizer.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/nlp/vector_similarity_retriever.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/reader/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/reader/pdf.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/storage/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/storage/base_vector_db.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/storage/chroma_vector_db.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/storage/faiss_vector_db.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/search_engine_client.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/vector_search_retrieval_engine.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis/tools/search/wiki.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/lumis.code-workspace +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/poetry.lock +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/poetry.toml +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/ruff.toml +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/tests/__init__.py +0 -0
- {lumis_ai-0.1.1a1 → lumis_ai-0.1.1a2}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lumis-ai
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1a2
|
|
4
4
|
Summary: An AI agent framework for building LLM-powered applications
|
|
5
5
|
Project-URL: Homepage, https://github.com/tareksanger/lumis
|
|
6
6
|
Project-URL: Repository, https://github.com/tareksanger/lumis
|
|
@@ -20,7 +20,6 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
|
20
20
|
Classifier: Topic :: Software Development :: Libraries
|
|
21
21
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
22
|
Requires-Python: >=3.11
|
|
23
|
-
Requires-Dist: arxiv>=0.5.0
|
|
24
23
|
Requires-Dist: asgiref>=3.8.1
|
|
25
24
|
Requires-Dist: beautifulsoup4>=4.12.0
|
|
26
25
|
Requires-Dist: deepmerge>=2.0.0
|
|
@@ -42,7 +41,6 @@ Requires-Dist: pydantic>=2.9.2
|
|
|
42
41
|
Requires-Dist: pymupdf>=1.22.0
|
|
43
42
|
Requires-Dist: pypdf2>=3.0.0
|
|
44
43
|
Requires-Dist: python-dateutil>=2.8.0
|
|
45
|
-
Requires-Dist: pytrends>=5.1.0
|
|
46
44
|
Requires-Dist: pyvis>=0.3.0
|
|
47
45
|
Requires-Dist: readability-lxml>=3.3.0
|
|
48
46
|
Requires-Dist: redis>=5.0.0
|
|
@@ -57,9 +55,12 @@ Requires-Dist: torch>=2.5.0
|
|
|
57
55
|
Requires-Dist: transformers>=4.0.0
|
|
58
56
|
Requires-Dist: typing-extensions>=4.0.0
|
|
59
57
|
Requires-Dist: wikipedia>=1.4.0
|
|
60
|
-
Requires-Dist: yfinance>=0.2.0
|
|
61
58
|
Provides-Extra: django
|
|
62
59
|
Requires-Dist: django>=4.2; extra == 'django'
|
|
60
|
+
Provides-Extra: search
|
|
61
|
+
Requires-Dist: arxiv>=0.5.0; extra == 'search'
|
|
62
|
+
Requires-Dist: pytrends>=5.1.0; extra == 'search'
|
|
63
|
+
Requires-Dist: yfinance>=0.2.0; extra == 'search'
|
|
63
64
|
Provides-Extra: spacy
|
|
64
65
|
Requires-Dist: coreferee-model-en>=1.0.0; extra == 'spacy'
|
|
65
66
|
Requires-Dist: coreferee>=1.3.0; extra == 'spacy'
|
|
@@ -97,6 +98,7 @@ Some integrations are opt-in to keep the base install lighter:
|
|
|
97
98
|
| Extra | What it adds | Install |
|
|
98
99
|
|------------|-----------------------------------------------|-----------------------------------|
|
|
99
100
|
| `spacy` | NER, fact extraction, coreference resolution | `pip install lumis-ai[spacy]` |
|
|
101
|
+
| `search` | arXiv, Google Trends, Yahoo Finance | `pip install lumis-ai[search]` |
|
|
100
102
|
| `django` | Django ORM memory backend | `pip install lumis-ai[django]` |
|
|
101
103
|
|
|
102
104
|
The `spacy` extra requires language models. After installing, download them:
|
|
@@ -26,6 +26,7 @@ Some integrations are opt-in to keep the base install lighter:
|
|
|
26
26
|
| Extra | What it adds | Install |
|
|
27
27
|
|------------|-----------------------------------------------|-----------------------------------|
|
|
28
28
|
| `spacy` | NER, fact extraction, coreference resolution | `pip install lumis-ai[spacy]` |
|
|
29
|
+
| `search` | arXiv, Google Trends, Yahoo Finance | `pip install lumis-ai[search]` |
|
|
29
30
|
| `django` | Django ORM memory backend | `pip install lumis-ai[django]` |
|
|
30
31
|
|
|
31
32
|
The `spacy` extra requires language models. After installing, download them:
|
|
@@ -278,16 +278,6 @@ class WebScrapper:
|
|
|
278
278
|
raise e
|
|
279
279
|
|
|
280
280
|
return None
|
|
281
|
-
|
|
282
|
-
# async def from_gotenberg(self, url: str, metadata: Optional[dict]) -> Optional[Document]:
|
|
283
|
-
# # Same logic as before, but uses injected gb_client
|
|
284
|
-
# try:
|
|
285
|
-
# response = await self.gb_client.afrom_url(url)
|
|
286
|
-
# return await self.parse_pdf(response.content, metadata)
|
|
287
|
-
# except Exception as e:
|
|
288
|
-
# logger.debug(f"Gotenberg failed for {url}: {e}")
|
|
289
|
-
# return None
|
|
290
|
-
|
|
291
281
|
def _url_with_protocol(self, url: str):
|
|
292
282
|
if not url.startswith("http://") and not url.startswith("https://"):
|
|
293
283
|
url = "https://" + url
|
|
@@ -7,12 +7,15 @@ import logging
|
|
|
7
7
|
from typing import Any, Dict, Optional
|
|
8
8
|
import xml.etree.ElementTree as ET
|
|
9
9
|
|
|
10
|
-
import
|
|
11
|
-
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
12
|
import httpx
|
|
13
13
|
from lumis.core.document import Document
|
|
14
14
|
import pymupdf
|
|
15
15
|
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from arxiv import SortCriterion, SortOrder
|
|
18
|
+
|
|
16
19
|
logger = logging.getLogger(__name__)
|
|
17
20
|
|
|
18
21
|
|
|
@@ -36,8 +39,16 @@ class ArxivResult:
|
|
|
36
39
|
|
|
37
40
|
class ArxivSearcher:
|
|
38
41
|
def __init__(self, max_results: int = 10, max_concurrent_pdfs: int = 5) -> None:
|
|
42
|
+
try:
|
|
43
|
+
import arxiv
|
|
44
|
+
except ImportError:
|
|
45
|
+
raise ImportError(
|
|
46
|
+
"arxiv is required for ArxivSearcher. "
|
|
47
|
+
"Install it with: pip install lumis-ai[search]"
|
|
48
|
+
)
|
|
49
|
+
self._arxiv = arxiv
|
|
39
50
|
self.max_results: int = max_results
|
|
40
|
-
self.client = Client()
|
|
51
|
+
self.client = arxiv.Client()
|
|
41
52
|
self._http_client = httpx.AsyncClient()
|
|
42
53
|
self._result_cache: dict[str, ArxivResult] = {} # Cache for results by arxiv_id
|
|
43
54
|
self._pdf_semaphore = asyncio.Semaphore(max_concurrent_pdfs)
|
|
@@ -46,8 +57,8 @@ class ArxivSearcher:
|
|
|
46
57
|
self,
|
|
47
58
|
query: str,
|
|
48
59
|
max_results: Optional[int] = None,
|
|
49
|
-
sort_by: SortCriterion =
|
|
50
|
-
sort_order: SortOrder =
|
|
60
|
+
sort_by: SortCriterion | None = None,
|
|
61
|
+
sort_order: SortOrder | None = None,
|
|
51
62
|
id_list: Optional[list[str]] = None,
|
|
52
63
|
read_pdfs: bool = False,
|
|
53
64
|
) -> list[ArxivResult]:
|
|
@@ -65,8 +76,13 @@ class ArxivSearcher:
|
|
|
65
76
|
Returns:
|
|
66
77
|
list of ArxivResult objects
|
|
67
78
|
"""
|
|
79
|
+
if sort_by is None:
|
|
80
|
+
sort_by = self._arxiv.SortCriterion.SubmittedDate
|
|
81
|
+
if sort_order is None:
|
|
82
|
+
sort_order = self._arxiv.SortOrder.Descending
|
|
83
|
+
|
|
68
84
|
# Create search object with all available options
|
|
69
|
-
search =
|
|
85
|
+
search = self._arxiv.Search(query=query, max_results=max_results or self.max_results, sort_by=sort_by, sort_order=sort_order, id_list=id_list or [])
|
|
70
86
|
|
|
71
87
|
results: list[ArxivResult] = []
|
|
72
88
|
pdf_tasks = []
|
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
from typing import Any, Dict, List
|
|
4
4
|
|
|
5
5
|
from asgiref.sync import sync_to_async
|
|
6
|
-
from pytrends.request import TrendReq
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
class PyTrends:
|
|
@@ -12,6 +11,13 @@ class PyTrends:
|
|
|
12
11
|
"""
|
|
13
12
|
|
|
14
13
|
def __init__(self, tz: int = 0, retries: int = 3, backoff: float = 0.1):
|
|
14
|
+
try:
|
|
15
|
+
from pytrends.request import TrendReq
|
|
16
|
+
except ImportError:
|
|
17
|
+
raise ImportError(
|
|
18
|
+
"pytrends is required for PyTrends. "
|
|
19
|
+
"Install it with: pip install lumis-ai[search]"
|
|
20
|
+
)
|
|
15
21
|
self.pytrends = TrendReq(retries=retries, backoff_factor=backoff, tz=tz) # type: ignore
|
|
16
22
|
|
|
17
23
|
@sync_to_async
|
|
@@ -7,7 +7,6 @@ from typing import Any, cast, Optional
|
|
|
7
7
|
from asgiref.sync import sync_to_async
|
|
8
8
|
import pandas as pd
|
|
9
9
|
from pydantic import BaseModel, Field
|
|
10
|
-
import yfinance as yf
|
|
11
10
|
|
|
12
11
|
logger = logging.getLogger(__name__)
|
|
13
12
|
|
|
@@ -53,6 +52,16 @@ class YahooFinance:
|
|
|
53
52
|
with async codebases.
|
|
54
53
|
"""
|
|
55
54
|
|
|
55
|
+
def __init__(self):
|
|
56
|
+
try:
|
|
57
|
+
import yfinance as yf
|
|
58
|
+
except ImportError:
|
|
59
|
+
raise ImportError(
|
|
60
|
+
"yfinance is required for YahooFinance. "
|
|
61
|
+
"Install it with: pip install lumis-ai[search]"
|
|
62
|
+
)
|
|
63
|
+
self._yf = yf
|
|
64
|
+
|
|
56
65
|
@sync_to_async
|
|
57
66
|
def get_quote(self, ticker: str) -> QuoteData:
|
|
58
67
|
"""
|
|
@@ -70,7 +79,7 @@ class YahooFinance:
|
|
|
70
79
|
"""
|
|
71
80
|
try:
|
|
72
81
|
logger.debug(f"Fetching quote data for ticker: {ticker}")
|
|
73
|
-
t =
|
|
82
|
+
t = self._yf.Ticker(ticker)
|
|
74
83
|
info = t.info
|
|
75
84
|
|
|
76
85
|
return QuoteData(
|
|
@@ -114,7 +123,7 @@ class YahooFinance:
|
|
|
114
123
|
"""
|
|
115
124
|
try:
|
|
116
125
|
logger.debug(f"Fetching historical data for {ticker} with period={period}, interval={interval}")
|
|
117
|
-
t =
|
|
126
|
+
t = self._yf.Ticker(ticker)
|
|
118
127
|
hist = t.history(period=period, interval=interval, start=start, end=end)
|
|
119
128
|
|
|
120
129
|
return [
|
|
@@ -149,8 +158,8 @@ class YahooFinance:
|
|
|
149
158
|
"""
|
|
150
159
|
try:
|
|
151
160
|
logger.debug(f"Searching for tickers matching: {query}")
|
|
152
|
-
# Using
|
|
153
|
-
tickers =
|
|
161
|
+
# Using self._yf.Tickers() as get_tickers_by_search is deprecated
|
|
162
|
+
tickers = self._yf.Tickers(query)
|
|
154
163
|
return [{"symbol": symbol, "name": ticker.info.get("shortName", symbol)} for symbol, ticker in tickers.tickers.items()]
|
|
155
164
|
except Exception as e:
|
|
156
165
|
logger.error(f"Error searching tickers for {query}: {str(e)}")
|
|
@@ -172,7 +181,7 @@ class YahooFinance:
|
|
|
172
181
|
"""
|
|
173
182
|
try:
|
|
174
183
|
logger.debug(f"Fetching recommendations for {ticker}")
|
|
175
|
-
t =
|
|
184
|
+
t = self._yf.Ticker(ticker)
|
|
176
185
|
if t.recommendations is None:
|
|
177
186
|
return []
|
|
178
187
|
df = cast(pd.DataFrame, t.recommendations)
|
|
@@ -197,7 +206,7 @@ class YahooFinance:
|
|
|
197
206
|
"""
|
|
198
207
|
try:
|
|
199
208
|
logger.debug(f"Fetching major holders for {ticker}")
|
|
200
|
-
t =
|
|
209
|
+
t = self._yf.Ticker(ticker)
|
|
201
210
|
if t.major_holders is None:
|
|
202
211
|
return {}
|
|
203
212
|
df = cast(pd.DataFrame, t.major_holders)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "lumis-ai"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.1a2"
|
|
4
4
|
description = "An AI agent framework for building LLM-powered applications"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -22,7 +22,6 @@ classifiers = [
|
|
|
22
22
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
23
23
|
]
|
|
24
24
|
dependencies = [
|
|
25
|
-
"arxiv>=0.5.0",
|
|
26
25
|
"asgiref>=3.8.1",
|
|
27
26
|
"beautifulsoup4>=4.12.0",
|
|
28
27
|
"deepmerge>=2.0.0",
|
|
@@ -44,7 +43,6 @@ dependencies = [
|
|
|
44
43
|
"PyPDF2>=3.0.0",
|
|
45
44
|
"pydantic>=2.9.2",
|
|
46
45
|
"python-dateutil>=2.8.0",
|
|
47
|
-
"pytrends>=5.1.0",
|
|
48
46
|
"pyvis>=0.3.0",
|
|
49
47
|
"readability-lxml>=3.3.0",
|
|
50
48
|
"redis>=5.0.0",
|
|
@@ -59,13 +57,17 @@ dependencies = [
|
|
|
59
57
|
"transformers>=4.0.0",
|
|
60
58
|
"typing-extensions>=4.0.0",
|
|
61
59
|
"wikipedia>=1.4.0",
|
|
62
|
-
"yfinance>=0.2.0",
|
|
63
60
|
]
|
|
64
61
|
|
|
65
62
|
[project.optional-dependencies]
|
|
66
63
|
django = [
|
|
67
64
|
"django>=4.2",
|
|
68
65
|
]
|
|
66
|
+
search = [
|
|
67
|
+
"arxiv>=0.5.0",
|
|
68
|
+
"pytrends>=5.1.0",
|
|
69
|
+
"yfinance>=0.2.0",
|
|
70
|
+
]
|
|
69
71
|
spacy = [
|
|
70
72
|
"coreferee>=1.3.0",
|
|
71
73
|
"coreferee-model-en>=1.0.0",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|