mirror of
https://github.com/microsoft/graphrag.git
synced 2026-02-09 04:32:36 +08:00
|
Some checks are pending
Python Build and Type Check / python-ci (ubuntu-latest, 3.11) (push) Waiting to run
Python Build and Type Check / python-ci (ubuntu-latest, 3.13) (push) Waiting to run
Python Build and Type Check / python-ci (windows-latest, 3.11) (push) Waiting to run
Python Build and Type Check / python-ci (windows-latest, 3.13) (push) Waiting to run
Python Integration Tests / python-ci (ubuntu-latest, 3.13) (push) Waiting to run
Python Integration Tests / python-ci (windows-latest, 3.13) (push) Waiting to run
Python Notebook Tests / python-ci (ubuntu-latest, 3.13) (push) Waiting to run
Python Notebook Tests / python-ci (windows-latest, 3.13) (push) Waiting to run
Python Smoke Tests / python-ci (ubuntu-latest, 3.13) (push) Waiting to run
Python Smoke Tests / python-ci (windows-latest, 3.13) (push) Waiting to run
Python Unit Tests / python-ci (ubuntu-latest, 3.13) (push) Waiting to run
Python Unit Tests / python-ci (windows-latest, 3.13) (push) Waiting to run
* Update to python 3.14 as default, with range down to 3.10 * Fix enum value in query cli * Update pyarrow * Update py version for storage package * Remove 3.10 * add fastuuid * Update Python support to 3.11-3.14 with stricter dependency constraints - Set minimum Python version to 3.11 (removed 3.10 support) - Added support for Python 3.14 - Updated CI workflows: single-version jobs use 3.14, matrix jobs use 3.11 and 3.14 - Fixed license format to use SPDX-compatible format for Python 3.14 - Updated pyarrow to >=22.0.0 for Python 3.14 wheel support - Added explicit fastuuid~=0.14 and blis~=1.3 for Python 3.14 compatibility - Replaced all loose version constraints (>=) with compatible release (~=) for better lock file control - Applied stricter versioning to all packages: graphrag, graphrag-common, graphrag-storage, unified-search-app * update uv lock * Pin blis to ~=1.3.3 to ensure Python 3.14 wheel availability * Update uv lock * Update numpy to >=2.0.0 for Python 3.14 Windows compatibility Numpy 1.25.x has access violation issues on Python 3.14 Windows. Numpy 2.x has proper Python 3.14 support including Windows wheels. * update uv lock * Update pandas to >=2.3.0 for numpy 2.x compatibility Pandas 2.2.x was compiled against numpy 1.x and causes ABI incompatibility errors with numpy 2.x. Pandas 2.3.0+ supports numpy 2.x properly. * update uv.lock * Add scipy>=1.15.0 for numpy 2.x compatibility Scipy versions < 1.15.0 have C extensions built against numpy 1.x and are incompatible with numpy 2.x, causing dtype size errors. * update uv lock * Update Python support to 3.11-3.13 with compatible dependencies - Set Python version range to 3.11-3.13 (removed 3.14 support) - Updated CI workflows: single-version jobs use 3.13, matrix jobs use 3.11 and 3.13 - Dependencies optimized for Python 3.13 compatibility: - pyarrow~=22.0 (has Python 3.13 wheels) - numpy~=1.26 - pandas~=2.2 - blis~=1.0 - fastuuid~=0.13 - Applied stricter version constraints using ~= operator throughout - Updated uv.lock with resolved dependencies * Update numpy to 2.1+ and pandas to 2.3+ for Python 3.13 Windows compatibility Numpy 1.26.x causes access violations on Python 3.13 Windows. Numpy 2.1+ has proper Python 3.13 support with Windows wheels. Pandas 2.3+ is required for numpy 2.x compatibility. * update vsts.yml python version |
||
|---|---|---|
| .. | ||
| graphrag_common | ||
| pyproject.toml | ||
| README.md | ||
GraphRAG Common
Factory module
from abc import ABC, abstractmethod
from graphrag_common.factory import Factory
class SampleABC(ABC):
@abstractmethod
def get_value(self) -> str:
msg = "Subclasses must implement the get_value method."
raise NotImplementedError(msg)
class ConcreteClass(SampleABC):
def __init__(self, value: str):
self._value = value
def get_value(self) -> str:
return self._value
class SampleFactory(Factory[SampleABC]):
"""A Factory for SampleABC classes."""
factory = SampleFactory()
# Registering transient services
# A new one is created for every request
factory.register("some_strategy", ConcreteTestClass)
trans1 = factory.create("some_strategy", {"value": "test1"})
trans2 = factory.create("some_strategy", {"value": "test2"})
assert trans1 is not trans2
assert trans1.get_value() == "test1"
assert trans2.get_value() == "test2"
# Registering singleton services
# After first creation, the same one is returned every time
factory.register("some_other_strategy", ConcreteTestClass, scope="singleton")
single1 = factory.create("some_other_strategy", {"value": "singleton"})
single2 = factory.create("some_other_strategy", {"value": "ignored"})
assert single1 is single2
assert single1.get_value() == "singleton"
assert single2.get_value() == "singleton"
Config module
from pydantic import BaseModel, Field
from graphrag_common.config import load_config
from pathlib import Path
class Logging(BaseModel):
"""Test nested model."""
directory: str = Field(default="output/logs")
filename: str = Field(default="logs.txt")
class Config(BaseModel):
"""Test configuration model."""
name: str = Field(description="Name field.")
logging: Logging = Field(description="Nested model field.")
# Basic - by default:
# - searches for Path.cwd() / settings.[yaml|yml|json]
# - sets the CWD to the directory containing the config file.
# so if no custom config path is provided than CWD remains unchanged.
# - loads config_directory/.env file
# - parses ${env} in the config file
config = load_config(Config)
# Custom file location
config = load_config(Config, "path_to_config_filename_or_directory_containing_settings.[yaml|yml|json]")
# Using a custom file extension with
# custom config parser (str) -> dict[str, Any]
config = load_config(
config_initializer=Config,
config_path="config.toml",
config_parser=lambda contents: toml.loads(contents) # Needs toml pypi package
)
# With overrides - provided values override whats in the config file
# Only overrides what is specified - recursively merges settings.
config = load_config(
config_initializer=Config,
overrides={
"name": "some name",
"logging": {
"filename": "my_logs.txt"
}
},
)
# By default, sets CWD to directory containing config file
# So custom config paths will change the CWD.
config = load_config(
config_initializer=Config,
config_path="some/path/to/config.yaml",
set_cwd=True # default
)
# now cwd == some/path/to
assert Path.cwd() == "some/path/to"
# And now throughout the codebase resolving relative paths in config
# will resolve relative to the config directory
Path(config.logging.directory) == "some/path/to/output/logs"