From 7fba9522d4f8421e0800f7114b6f04ca5ca1b4b7 Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Thu, 22 May 2025 08:22:44 -0600 Subject: [PATCH 1/3] Task/raw model answer (#1947) * Add full_response to llm provider output * Semver * Small leftover cleanup * Add pyi to suppress Pyright errors. full_content is optional * Format * Add missing stubs --- .../patch-20250522003454958473.json | 4 ++ .../language_model/providers/fnllm/models.py | 10 +++- graphrag/language_model/response/base.py | 9 ++++ graphrag/language_model/response/base.pyi | 50 +++++++++++++++++++ .../language_model/test_factory.py | 8 ++- 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 .semversioner/next-release/patch-20250522003454958473.json create mode 100644 graphrag/language_model/response/base.pyi diff --git a/.semversioner/next-release/patch-20250522003454958473.json b/.semversioner/next-release/patch-20250522003454958473.json new file mode 100644 index 00000000..7a7feaf0 --- /dev/null +++ b/.semversioner/next-release/patch-20250522003454958473.json @@ -0,0 +1,4 @@ +{ + "type": "patch", + "description": "Add full llm response to LLM PRovider output" +} diff --git a/graphrag/language_model/providers/fnllm/models.py b/graphrag/language_model/providers/fnllm/models.py index fda91c96..059b0412 100644 --- a/graphrag/language_model/providers/fnllm/models.py +++ b/graphrag/language_model/providers/fnllm/models.py @@ -83,7 +83,10 @@ class OpenAIChatFNLLM: else: response = await self.model(prompt, history=history, **kwargs) return BaseModelResponse( - output=BaseModelOutput(content=response.output.content), + output=BaseModelOutput( + content=response.output.content, + full_response=response.output.raw_model.to_dict(), + ), parsed_response=response.parsed_json, history=response.history, cache_hit=response.cache_hit, @@ -282,7 +285,10 @@ class AzureOpenAIChatFNLLM: else: response = await self.model(prompt, history=history, **kwargs) return BaseModelResponse( - output=BaseModelOutput(content=response.output.content), + output=BaseModelOutput( + content=response.output.content, + full_response=response.output.raw_model.to_dict(), + ), parsed_response=response.parsed_json, history=response.history, cache_hit=response.cache_hit, diff --git a/graphrag/language_model/response/base.py b/graphrag/language_model/response/base.py index abc17dda..178259c4 100644 --- a/graphrag/language_model/response/base.py +++ b/graphrag/language_model/response/base.py @@ -18,6 +18,11 @@ class ModelOutput(Protocol): """Return the textual content of the output.""" ... + @property + def full_response(self) -> dict[str, Any] | None: + """Return the complete JSON response returned by the model.""" + ... + class ModelResponse(Protocol, Generic[T]): """Protocol for LLM response.""" @@ -43,6 +48,10 @@ class BaseModelOutput(BaseModel): content: str = Field(..., description="The textual content of the output.") """The textual content of the output.""" + full_response: dict[str, Any] | None = Field( + None, description="The complete JSON response returned by the LLM provider." + ) + """The complete JSON response returned by the LLM provider.""" class BaseModelResponse(BaseModel, Generic[T]): diff --git a/graphrag/language_model/response/base.pyi b/graphrag/language_model/response/base.pyi new file mode 100644 index 00000000..7a33b0a3 --- /dev/null +++ b/graphrag/language_model/response/base.pyi @@ -0,0 +1,50 @@ +# Copyright (c) 2025 Microsoft Corporation. +# Licensed under the MIT License + +from typing import Any, Generic, Protocol, TypeVar + +from pydantic import BaseModel + +_T = TypeVar("_T", bound=BaseModel, covariant=True) + +class ModelOutput(Protocol): + @property + def content(self) -> str: ... + @property + def full_response(self) -> dict[str, Any] | None: ... + +class ModelResponse(Protocol, Generic[_T]): + @property + def output(self) -> ModelOutput: ... + @property + def parsed_response(self) -> _T | None: ... + @property + def history(self) -> list[Any]: ... + +class BaseModelOutput(BaseModel): + content: str + full_response: dict[str, Any] | None + + def __init__( + self, + content: str, + full_response: dict[str, Any] | None = None, + ) -> None: ... + +class BaseModelResponse(BaseModel, Generic[_T]): + output: BaseModelOutput + parsed_response: _T | None + history: list[Any] + tool_calls: list[Any] + metrics: Any | None + cache_hit: bool | None + + def __init__( + self, + output: BaseModelOutput, + parsed_response: _T | None = None, + history: list[Any] = ..., # default provided by Pydantic + tool_calls: list[Any] = ..., # default provided by Pydantic + metrics: Any | None = None, + cache_hit: bool | None = None, + ) -> None: ... diff --git a/tests/integration/language_model/test_factory.py b/tests/integration/language_model/test_factory.py index e25e4e24..af503265 100644 --- a/tests/integration/language_model/test_factory.py +++ b/tests/integration/language_model/test_factory.py @@ -33,7 +33,11 @@ async def test_create_custom_chat_model(): def chat( self, prompt: str, history: list | None = None, **kwargs: Any ) -> ModelResponse: - return BaseModelResponse(output=BaseModelOutput(content="content")) + return BaseModelResponse( + output=BaseModelOutput( + content="content", full_response={"key": "value"} + ) + ) async def achat_stream( self, prompt: str, history: list | None = None, **kwargs: Any @@ -49,9 +53,11 @@ async def test_create_custom_chat_model(): assert isinstance(model, CustomChatModel) response = await model.achat("prompt") assert response.output.content == "content" + assert response.output.full_response is None response = model.chat("prompt") assert response.output.content == "content" + assert response.output.full_response == {"key": "value"} async def test_create_custom_embedding_llm(): From f1e2041f077c7078b51da2e12fe3724fd2978976 Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Fri, 23 May 2025 08:07:09 -0600 Subject: [PATCH 2/3] Fix/drift search reduce (#1948) * Fix Reduce Response for non streaming calls * Semver --- .semversioner/next-release/patch-20250522234310308717.json | 4 ++++ graphrag/query/structured_search/drift_search/search.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .semversioner/next-release/patch-20250522234310308717.json diff --git a/.semversioner/next-release/patch-20250522234310308717.json b/.semversioner/next-release/patch-20250522234310308717.json new file mode 100644 index 00000000..2c36e56f --- /dev/null +++ b/.semversioner/next-release/patch-20250522234310308717.json @@ -0,0 +1,4 @@ +{ + "type": "patch", + "description": "Fix Drift Reduce Response for non streaming calls" +} diff --git a/graphrag/query/structured_search/drift_search/search.py b/graphrag/query/structured_search/drift_search/search.py index 10d62343..a452cf1d 100644 --- a/graphrag/query/structured_search/drift_search/search.py +++ b/graphrag/query/structured_search/drift_search/search.py @@ -386,7 +386,7 @@ class DRIFTSearch(BaseSearch[DRIFTSearchContextBuilder]): model_response = await self.model.achat( prompt=query, history=search_messages, - model_parameters=llm_kwargs, + model_parameters=llm_kwargs.get("model_params", {}), ) reduced_response = model_response.output.content From 4a42ac81afade8392586ad3d4f879b3c4789d9d1 Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Fri, 23 May 2025 15:19:29 -0600 Subject: [PATCH 3/3] Release v2.3.0 (#1951) --- .semversioner/2.3.0.json | 34 +++++++++++++++++++ .../minor-20250514234228008828.json | 4 --- .../minor-20250520014004743256.json | 4 --- .../patch-20250515212234042330.json | 4 --- .../patch-20250519191613388970.json | 4 --- .../patch-20250520214513426940.json | 4 --- .../patch-20250522003454958473.json | 4 --- .../patch-20250522234310308717.json | 4 --- CHANGELOG.md | 10 ++++++ pyproject.toml | 2 +- 10 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 .semversioner/2.3.0.json delete mode 100644 .semversioner/next-release/minor-20250514234228008828.json delete mode 100644 .semversioner/next-release/minor-20250520014004743256.json delete mode 100644 .semversioner/next-release/patch-20250515212234042330.json delete mode 100644 .semversioner/next-release/patch-20250519191613388970.json delete mode 100644 .semversioner/next-release/patch-20250520214513426940.json delete mode 100644 .semversioner/next-release/patch-20250522003454958473.json delete mode 100644 .semversioner/next-release/patch-20250522234310308717.json diff --git a/.semversioner/2.3.0.json b/.semversioner/2.3.0.json new file mode 100644 index 00000000..4f6c826e --- /dev/null +++ b/.semversioner/2.3.0.json @@ -0,0 +1,34 @@ +{ + "changes": [ + { + "description": "Remove Dynamic Max Retries support. Refactor typer typing in cli interface", + "type": "minor" + }, + { + "description": "Update fnllm to latest. Update default graphrag configuration", + "type": "minor" + }, + { + "description": "A few fixes and enhancements for better reuse and flow.", + "type": "patch" + }, + { + "description": "Add full llm response to LLM PRovider output", + "type": "patch" + }, + { + "description": "Fix Drift Reduce Response for non streaming calls", + "type": "patch" + }, + { + "description": "Fix global search prompt to include missing formatting key", + "type": "patch" + }, + { + "description": "Upgrade pyarrow dependency to >=17.0.0 to fix CVE-2024-52338", + "type": "patch" + } + ], + "created_at": "2025-05-23T21:02:47+00:00", + "version": "2.3.0" +} \ No newline at end of file diff --git a/.semversioner/next-release/minor-20250514234228008828.json b/.semversioner/next-release/minor-20250514234228008828.json deleted file mode 100644 index 4aac8748..00000000 --- a/.semversioner/next-release/minor-20250514234228008828.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "minor", - "description": "Update fnllm to latest. Update default graphrag configuration" -} diff --git a/.semversioner/next-release/minor-20250520014004743256.json b/.semversioner/next-release/minor-20250520014004743256.json deleted file mode 100644 index d95f02f6..00000000 --- a/.semversioner/next-release/minor-20250520014004743256.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "minor", - "description": "Remove Dynamic Max Retries support. Refactor typer typing in cli interface" -} diff --git a/.semversioner/next-release/patch-20250515212234042330.json b/.semversioner/next-release/patch-20250515212234042330.json deleted file mode 100644 index d0199eb5..00000000 --- a/.semversioner/next-release/patch-20250515212234042330.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "A few fixes and enhancements for better reuse and flow." -} diff --git a/.semversioner/next-release/patch-20250519191613388970.json b/.semversioner/next-release/patch-20250519191613388970.json deleted file mode 100644 index 354d2a88..00000000 --- a/.semversioner/next-release/patch-20250519191613388970.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Upgrade pyarrow dependency to >=17.0.0 to fix CVE-2024-52338" -} diff --git a/.semversioner/next-release/patch-20250520214513426940.json b/.semversioner/next-release/patch-20250520214513426940.json deleted file mode 100644 index f6894305..00000000 --- a/.semversioner/next-release/patch-20250520214513426940.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Fix global search prompt to include missing formatting key" -} diff --git a/.semversioner/next-release/patch-20250522003454958473.json b/.semversioner/next-release/patch-20250522003454958473.json deleted file mode 100644 index 7a7feaf0..00000000 --- a/.semversioner/next-release/patch-20250522003454958473.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Add full llm response to LLM PRovider output" -} diff --git a/.semversioner/next-release/patch-20250522234310308717.json b/.semversioner/next-release/patch-20250522234310308717.json deleted file mode 100644 index 2c36e56f..00000000 --- a/.semversioner/next-release/patch-20250522234310308717.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Fix Drift Reduce Response for non streaming calls" -} diff --git a/CHANGELOG.md b/CHANGELOG.md index c7f0d766..0ccbefc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ # Changelog Note: version releases in the 0.x.y range may introduce breaking changes. +## 2.3.0 + +- minor: Remove Dynamic Max Retries support. Refactor typer typing in cli interface +- minor: Update fnllm to latest. Update default graphrag configuration +- patch: A few fixes and enhancements for better reuse and flow. +- patch: Add full llm response to LLM PRovider output +- patch: Fix Drift Reduce Response for non streaming calls +- patch: Fix global search prompt to include missing formatting key +- patch: Upgrade pyarrow dependency to >=17.0.0 to fix CVE-2024-52338 + ## 2.2.1 - patch: Fix Community Report prompt tuning response diff --git a/pyproject.toml b/pyproject.toml index 34881e25..d7ab266f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "graphrag" # Maintainers: do not change the version here manually, use ./scripts/release.sh -version = "2.2.1" +version = "2.3.0" description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." authors = [ "Alonso Guevara Fernández ",