langchain-timbr 2.1.5__tar.gz → 2.1.7__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.
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/PKG-INFO +3 -4
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/pyproject.toml +2 -3
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/requirements.txt +1 -1
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/requirements310.txt +2 -2
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/requirements311.txt +1 -1
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/__init__.py +1 -1
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/_version.py +2 -2
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/config.py +5 -1
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/execute_timbr_query_chain.py +11 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/generate_timbr_sql_chain.py +10 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/timbr_sql_agent.py +19 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/validate_timbr_sql_chain.py +11 -1
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langgraph/execute_timbr_query_node.py +7 -1
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langgraph/generate_timbr_sql_node.py +7 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langgraph/validate_timbr_query_node.py +6 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/utils/prompt_service.py +26 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/utils/timbr_llm_utils.py +399 -115
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/utils/timbr_utils.py +39 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/conftest.py +1 -0
- langchain_timbr-2.1.7/tests/integration/test_chain_reasoning.py +84 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_langchain_chains.py +9 -8
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.github/dependabot.yml +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.github/pull_request_template.md +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.github/workflows/_codespell.yml +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.github/workflows/_fossa.yml +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.github/workflows/install-dependencies-and-run-tests.yml +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.github/workflows/publish.yml +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/.gitignore +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/LICENSE +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/README.md +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/SECURITY.md +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/pytest.ini +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/__init__.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/generate_answer_chain.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/identify_concept_chain.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langgraph/__init__.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langgraph/generate_response_node.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langgraph/identify_concept_node.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/llm_wrapper/llm_wrapper.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/llm_wrapper/timbr_llm_wrapper.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/timbr_llm_connector.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/utils/general.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/utils/temperature_supported_models.json +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/README.md +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_agent_integration.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_azure_databricks_provider.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_azure_openai_model.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_chain_pipeline.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_jwt_token.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_langgraph_nodes.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/integration/test_timeout_functionality.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/conftest.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/test_chain_documentation.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/test_connection_validation.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/test_llm_wrapper_optional_params.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/test_optional_llm_integration.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/test_standard_chain_requirements.py +0 -0
- {langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/tests/standard/test_unit_tests.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langchain-timbr
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.7
|
|
4
4
|
Summary: LangChain & LangGraph extensions that parse LLM prompts into Timbr semantic SQL and execute them.
|
|
5
5
|
Project-URL: Homepage, https://github.com/WPSemantix/langchain-timbr
|
|
6
6
|
Project-URL: Documentation, https://docs.timbr.ai/doc/docs/integration/langchain-sdk/
|
|
@@ -23,14 +23,13 @@ Requires-Dist: cryptography==45.0.7; python_version >= '3.11'
|
|
|
23
23
|
Requires-Dist: cryptography>=44.0.3; python_version == '3.10'
|
|
24
24
|
Requires-Dist: langchain-community==0.3.30; python_version >= '3.11'
|
|
25
25
|
Requires-Dist: langchain-community>=0.3.27; python_version == '3.10'
|
|
26
|
-
Requires-Dist: langchain-core>=0.3.
|
|
27
|
-
Requires-Dist: langchain-core>=0.3.80; python_version >= '3.11'
|
|
26
|
+
Requires-Dist: langchain-core>=0.3.80
|
|
28
27
|
Requires-Dist: langchain==0.3.27; python_version >= '3.11'
|
|
29
28
|
Requires-Dist: langchain>=0.3.25; python_version == '3.10'
|
|
30
29
|
Requires-Dist: langgraph==0.6.8; python_version >= '3.11'
|
|
31
30
|
Requires-Dist: langgraph>=0.3.20; python_version == '3.10'
|
|
32
31
|
Requires-Dist: pydantic==2.10.4
|
|
33
|
-
Requires-Dist: pytimbr-api>=2.
|
|
32
|
+
Requires-Dist: pytimbr-api>=2.1.0
|
|
34
33
|
Requires-Dist: tiktoken==0.8.0
|
|
35
34
|
Requires-Dist: transformers==4.57.0; python_version >= '3.11'
|
|
36
35
|
Requires-Dist: transformers>=4.53; python_version == '3.10'
|
|
@@ -27,13 +27,13 @@ dependencies = [
|
|
|
27
27
|
"pydantic==2.10.4",
|
|
28
28
|
"tiktoken==0.8.0",
|
|
29
29
|
"uvicorn==0.34.0",
|
|
30
|
-
"pytimbr-api>=2.
|
|
30
|
+
"pytimbr-api>=2.1.0",
|
|
31
|
+
"langchain-core>=0.3.80",
|
|
31
32
|
|
|
32
33
|
# Python 3.11+ versions (same for 3.11 and 3.12+)
|
|
33
34
|
"cryptography==45.0.7; python_version>='3.11'",
|
|
34
35
|
"langchain==0.3.27; python_version>='3.11'",
|
|
35
36
|
"langchain-community==0.3.30; python_version>='3.11'",
|
|
36
|
-
"langchain-core>=0.3.80; python_version>='3.11'",
|
|
37
37
|
"langgraph==0.6.8; python_version>='3.11'",
|
|
38
38
|
"transformers==4.57.0; python_version>='3.11'",
|
|
39
39
|
|
|
@@ -41,7 +41,6 @@ dependencies = [
|
|
|
41
41
|
"cryptography>=44.0.3; python_version=='3.10'",
|
|
42
42
|
"langchain>=0.3.25; python_version=='3.10'",
|
|
43
43
|
"langchain-community>=0.3.27; python_version=='3.10'",
|
|
44
|
-
"langchain-core>=0.3.58; python_version=='3.10'",
|
|
45
44
|
"langgraph>=0.3.20; python_version=='3.10'",
|
|
46
45
|
"transformers>=4.53; python_version=='3.10'",
|
|
47
46
|
]
|
|
@@ -8,7 +8,7 @@ langchain>=0.3.25
|
|
|
8
8
|
langchain-anthropic>=0.3.1
|
|
9
9
|
langchain-aws==0.2.35
|
|
10
10
|
langchain-community>=0.3.27
|
|
11
|
-
langchain-core>=0.3.
|
|
11
|
+
langchain-core>=0.3.80
|
|
12
12
|
langchain-google-genai>=2.0.9
|
|
13
13
|
langchain-google-vertexai>=2.0.28
|
|
14
14
|
langchain-openai>=0.3.16
|
|
@@ -19,7 +19,7 @@ opentelemetry-api==1.38.0 # Required when using snowflake with Python under 3.12
|
|
|
19
19
|
opentelemetry-sdk==1.38.0 # Required when using snowflake with Python under 3.12
|
|
20
20
|
pydantic==2.10.4
|
|
21
21
|
pytest==8.3.4
|
|
22
|
-
pytimbr-api>=2.
|
|
22
|
+
pytimbr-api>=2.1.0
|
|
23
23
|
snowflake>=1.8.0
|
|
24
24
|
snowflake-snowpark-python>=1.23.0
|
|
25
25
|
snowflake-connector-python[pandas]>=3.13.1,<4
|
|
@@ -19,7 +19,7 @@ opentelemetry-api==1.38.0 # Required when using snowflake with Python under 3.12
|
|
|
19
19
|
opentelemetry-sdk==1.38.0 # Required when using snowflake with Python under 3.12
|
|
20
20
|
pydantic==2.10.4
|
|
21
21
|
pytest==8.3.4
|
|
22
|
-
|
|
22
|
+
pytimbr-api>=2.1.0
|
|
23
23
|
snowflake==1.8.0
|
|
24
24
|
snowflake-snowpark-python==1.39.1
|
|
25
25
|
tiktoken==0.8.0
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '2.1.
|
|
32
|
-
__version_tuple__ = version_tuple = (2, 1,
|
|
31
|
+
__version__ = version = '2.1.7'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 1, 7)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -27,4 +27,8 @@ llm_client_id = os.environ.get('LLM_CLIENT_ID', None)
|
|
|
27
27
|
llm_client_secret = os.environ.get('LLM_CLIENT_SECRET', None)
|
|
28
28
|
llm_endpoint = os.environ.get('LLM_ENDPOINT', None)
|
|
29
29
|
llm_api_version = os.environ.get('LLM_API_VERSION', None)
|
|
30
|
-
llm_scope = os.environ.get('LLM_SCOPE', "https://cognitiveservices.azure.com/.default") # e.g. "api://<your-client-id>/.default"
|
|
30
|
+
llm_scope = os.environ.get('LLM_SCOPE', "https://cognitiveservices.azure.com/.default") # e.g. "api://<your-client-id>/.default"
|
|
31
|
+
|
|
32
|
+
# Whether to enable reasoning during SQL generation
|
|
33
|
+
enable_reasoning = to_boolean(os.environ.get('ENABLE_REASONING', 'false'))
|
|
34
|
+
reasoning_steps = to_integer(os.environ.get('REASONING_STEPS', 2))
|
|
@@ -42,6 +42,8 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
42
42
|
is_jwt: Optional[bool] = False,
|
|
43
43
|
jwt_tenant_id: Optional[str] = None,
|
|
44
44
|
conn_params: Optional[dict] = None,
|
|
45
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
46
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
45
47
|
debug: Optional[bool] = False,
|
|
46
48
|
**kwargs,
|
|
47
49
|
):
|
|
@@ -69,6 +71,8 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
69
71
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
70
72
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
71
73
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
74
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
75
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
72
76
|
:param kwargs: Additional arguments to pass to the base
|
|
73
77
|
:return: A list of rows from the Timbr query
|
|
74
78
|
|
|
@@ -137,6 +141,8 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
137
141
|
self._jwt_tenant_id = jwt_tenant_id
|
|
138
142
|
self._debug = to_boolean(debug)
|
|
139
143
|
self._conn_params = conn_params or {}
|
|
144
|
+
self._enable_reasoning = to_boolean(enable_reasoning)
|
|
145
|
+
self._reasoning_steps = to_integer(reasoning_steps)
|
|
140
146
|
|
|
141
147
|
|
|
142
148
|
@property
|
|
@@ -209,6 +215,8 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
209
215
|
note=(self._note or '') + err_txt,
|
|
210
216
|
db_is_case_sensitive=self._db_is_case_sensitive,
|
|
211
217
|
graph_depth=self._graph_depth,
|
|
218
|
+
enable_reasoning=self._enable_reasoning,
|
|
219
|
+
reasoning_steps=self._reasoning_steps,
|
|
212
220
|
debug=self._debug,
|
|
213
221
|
)
|
|
214
222
|
|
|
@@ -239,6 +247,7 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
239
247
|
concept_name = inputs.get("concept", self._concept)
|
|
240
248
|
is_sql_valid = True
|
|
241
249
|
error = None
|
|
250
|
+
reasoning_status = None
|
|
242
251
|
usage_metadata = {}
|
|
243
252
|
|
|
244
253
|
if sql and self._should_validate_sql:
|
|
@@ -255,6 +264,7 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
255
264
|
schema_name = generate_res.get("schema", schema_name)
|
|
256
265
|
concept_name = generate_res.get("concept", concept_name)
|
|
257
266
|
is_sql_valid = generate_res.get("is_sql_valid")
|
|
267
|
+
reasoning_status = generate_res.get("reasoning_status")
|
|
258
268
|
if not is_sql_valid and not self._should_validate_sql:
|
|
259
269
|
is_sql_valid = True
|
|
260
270
|
|
|
@@ -293,6 +303,7 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
293
303
|
"schema": schema_name,
|
|
294
304
|
"concept": concept_name,
|
|
295
305
|
"error": error if not is_sql_valid else None,
|
|
306
|
+
"reasoning_status": reasoning_status,
|
|
296
307
|
self.usage_metadata_key: usage_metadata,
|
|
297
308
|
}
|
|
298
309
|
|
|
@@ -39,6 +39,8 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
39
39
|
is_jwt: Optional[bool] = False,
|
|
40
40
|
jwt_tenant_id: Optional[str] = None,
|
|
41
41
|
conn_params: Optional[dict] = None,
|
|
42
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
43
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
42
44
|
debug: Optional[bool] = False,
|
|
43
45
|
**kwargs,
|
|
44
46
|
):
|
|
@@ -64,6 +66,9 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
64
66
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
65
67
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
66
68
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
69
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
70
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
71
|
+
:param debug: Whether to enable debug mode for detailed logging
|
|
67
72
|
:param kwargs: Additional arguments to pass to the base
|
|
68
73
|
|
|
69
74
|
## Example
|
|
@@ -129,6 +134,8 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
129
134
|
self._jwt_tenant_id = jwt_tenant_id
|
|
130
135
|
self._debug = to_boolean(debug)
|
|
131
136
|
self._conn_params = conn_params or {}
|
|
137
|
+
self._enable_reasoning = to_boolean(enable_reasoning)
|
|
138
|
+
self._reasoning_steps = to_integer(reasoning_steps)
|
|
132
139
|
|
|
133
140
|
|
|
134
141
|
@property
|
|
@@ -184,6 +191,8 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
184
191
|
note=self._note,
|
|
185
192
|
db_is_case_sensitive=self._db_is_case_sensitive,
|
|
186
193
|
graph_depth=self._graph_depth,
|
|
194
|
+
enable_reasoning=self._enable_reasoning,
|
|
195
|
+
reasoning_steps=self._reasoning_steps,
|
|
187
196
|
debug=self._debug,
|
|
188
197
|
)
|
|
189
198
|
|
|
@@ -197,5 +206,6 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
197
206
|
"concept": concept,
|
|
198
207
|
"is_sql_valid": generate_res.get("is_sql_valid"),
|
|
199
208
|
"error": generate_res.get("error"),
|
|
209
|
+
"reasoning_status": generate_res.get("reasoning_status"),
|
|
200
210
|
self.usage_metadata_key: generate_res.get("usage_metadata"),
|
|
201
211
|
}
|
{langchain_timbr-2.1.5 → langchain_timbr-2.1.7}/src/langchain_timbr/langchain/timbr_sql_agent.py
RENAMED
|
@@ -6,6 +6,7 @@ from langchain.schema import AgentAction, AgentFinish
|
|
|
6
6
|
from ..utils.general import parse_list, to_boolean, to_integer
|
|
7
7
|
from .execute_timbr_query_chain import ExecuteTimbrQueryChain
|
|
8
8
|
from .generate_answer_chain import GenerateAnswerChain
|
|
9
|
+
from .. import config
|
|
9
10
|
|
|
10
11
|
class TimbrSqlAgent(BaseSingleActionAgent):
|
|
11
12
|
def __init__(
|
|
@@ -34,6 +35,8 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
34
35
|
is_jwt: Optional[bool] = False,
|
|
35
36
|
jwt_tenant_id: Optional[str] = None,
|
|
36
37
|
conn_params: Optional[dict] = None,
|
|
38
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
39
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
37
40
|
debug: Optional[bool] = False
|
|
38
41
|
):
|
|
39
42
|
"""
|
|
@@ -61,6 +64,8 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
61
64
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
62
65
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
63
66
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
67
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
68
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
64
69
|
|
|
65
70
|
## Example
|
|
66
71
|
```
|
|
@@ -113,6 +118,8 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
113
118
|
is_jwt=to_boolean(is_jwt),
|
|
114
119
|
jwt_tenant_id=jwt_tenant_id,
|
|
115
120
|
conn_params=conn_params,
|
|
121
|
+
enable_reasoning=to_boolean(enable_reasoning),
|
|
122
|
+
reasoning_steps=to_integer(reasoning_steps),
|
|
116
123
|
debug=to_boolean(debug),
|
|
117
124
|
)
|
|
118
125
|
self._generate_answer = to_boolean(generate_answer)
|
|
@@ -173,6 +180,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
173
180
|
"sql": None,
|
|
174
181
|
"schema": None,
|
|
175
182
|
"concept": None,
|
|
183
|
+
"reasoning_status": None,
|
|
176
184
|
"usage_metadata": {},
|
|
177
185
|
},
|
|
178
186
|
log="Empty input received"
|
|
@@ -200,6 +208,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
200
208
|
"schema": result.get("schema", ""),
|
|
201
209
|
"concept": result.get("concept", ""),
|
|
202
210
|
"error": result.get("error", None),
|
|
211
|
+
"reasoning_status": result.get("reasoning_status", None),
|
|
203
212
|
"usage_metadata": usage_metadata,
|
|
204
213
|
},
|
|
205
214
|
log=f"Successfully executed query on concept: {result.get('concept', '')}"
|
|
@@ -214,6 +223,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
214
223
|
"sql": None,
|
|
215
224
|
"schema": None,
|
|
216
225
|
"concept": None,
|
|
226
|
+
"reasoning_status": None,
|
|
217
227
|
"usage_metadata": {},
|
|
218
228
|
},
|
|
219
229
|
log=error_context
|
|
@@ -234,6 +244,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
234
244
|
"sql": None,
|
|
235
245
|
"schema": None,
|
|
236
246
|
"concept": None,
|
|
247
|
+
"reasoning_status": None,
|
|
237
248
|
"usage_metadata": {},
|
|
238
249
|
},
|
|
239
250
|
log="Empty or whitespace-only input received"
|
|
@@ -274,6 +285,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
274
285
|
"schema": result.get("schema", ""),
|
|
275
286
|
"concept": result.get("concept", ""),
|
|
276
287
|
"error": result.get("error", None),
|
|
288
|
+
"reasoning_status": result.get("reasoning_status", None),
|
|
277
289
|
"usage_metadata": usage_metadata,
|
|
278
290
|
},
|
|
279
291
|
log=f"Successfully executed query on concept: {result.get('concept', '')}"
|
|
@@ -288,6 +300,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
288
300
|
"sql": None,
|
|
289
301
|
"schema": None,
|
|
290
302
|
"concept": None,
|
|
303
|
+
"reasoning_status": None,
|
|
291
304
|
"usage_metadata": {},
|
|
292
305
|
},
|
|
293
306
|
log=error_context
|
|
@@ -332,6 +345,8 @@ def create_timbr_sql_agent(
|
|
|
332
345
|
is_jwt: Optional[bool] = False,
|
|
333
346
|
jwt_tenant_id: Optional[str] = None,
|
|
334
347
|
conn_params: Optional[dict] = None,
|
|
348
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
349
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
335
350
|
debug: Optional[bool] = False
|
|
336
351
|
) -> AgentExecutor:
|
|
337
352
|
"""
|
|
@@ -361,6 +376,8 @@ def create_timbr_sql_agent(
|
|
|
361
376
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
362
377
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
363
378
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
379
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
380
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
364
381
|
|
|
365
382
|
Returns:
|
|
366
383
|
AgentExecutor: Configured agent executor ready to use
|
|
@@ -427,6 +444,8 @@ def create_timbr_sql_agent(
|
|
|
427
444
|
is_jwt=is_jwt,
|
|
428
445
|
jwt_tenant_id=jwt_tenant_id,
|
|
429
446
|
conn_params=conn_params,
|
|
447
|
+
enable_reasoning=enable_reasoning,
|
|
448
|
+
reasoning_steps=reasoning_steps,
|
|
430
449
|
debug=debug,
|
|
431
450
|
)
|
|
432
451
|
|
|
@@ -40,6 +40,8 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
40
40
|
is_jwt: Optional[bool] = False,
|
|
41
41
|
jwt_tenant_id: Optional[str] = None,
|
|
42
42
|
conn_params: Optional[dict] = None,
|
|
43
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
44
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
43
45
|
debug: Optional[bool] = False,
|
|
44
46
|
**kwargs,
|
|
45
47
|
):
|
|
@@ -64,6 +66,8 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
64
66
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
65
67
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
66
68
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
69
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
70
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
67
71
|
:param kwargs: Additional arguments to pass to the base
|
|
68
72
|
|
|
69
73
|
## Example
|
|
@@ -127,8 +131,10 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
127
131
|
self._verify_ssl = to_boolean(verify_ssl)
|
|
128
132
|
self._is_jwt = to_boolean(is_jwt)
|
|
129
133
|
self._jwt_tenant_id = jwt_tenant_id
|
|
130
|
-
self._debug = to_boolean(debug)
|
|
131
134
|
self._conn_params = conn_params or {}
|
|
135
|
+
self._enable_reasoning = to_boolean(enable_reasoning)
|
|
136
|
+
self._reasoning_steps = to_integer(reasoning_steps)
|
|
137
|
+
self._debug = to_boolean(debug)
|
|
132
138
|
|
|
133
139
|
|
|
134
140
|
@property
|
|
@@ -193,6 +199,8 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
193
199
|
note=f"{prompt_extension}The original SQL query (`{sql}`) was invalid with this error from query {error}. Please take this in consideration while generating the query.",
|
|
194
200
|
db_is_case_sensitive=self._db_is_case_sensitive,
|
|
195
201
|
graph_depth=self._graph_depth,
|
|
202
|
+
enable_reasoning=self._enable_reasoning,
|
|
203
|
+
reasoning_steps=self._reasoning_steps,
|
|
196
204
|
debug=self._debug,
|
|
197
205
|
)
|
|
198
206
|
sql = generate_res.get("sql", "")
|
|
@@ -200,6 +208,7 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
200
208
|
concept = generate_res.get("concept", self._concept)
|
|
201
209
|
usage_metadata.update(generate_res.get("usage_metadata", {}))
|
|
202
210
|
is_sql_valid = generate_res.get("is_sql_valid")
|
|
211
|
+
reasoning_status = generate_res.get("reasoning_status")
|
|
203
212
|
error = generate_res.get("error")
|
|
204
213
|
|
|
205
214
|
return {
|
|
@@ -208,5 +217,6 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
208
217
|
"concept": concept,
|
|
209
218
|
"is_sql_valid": is_sql_valid,
|
|
210
219
|
"error": error,
|
|
220
|
+
"reasoning_status": reasoning_status,
|
|
211
221
|
self.usage_metadata_key: usage_metadata,
|
|
212
222
|
}
|
|
@@ -3,7 +3,7 @@ from langchain.llms.base import LLM
|
|
|
3
3
|
from langgraph.graph import StateGraph
|
|
4
4
|
|
|
5
5
|
from ..langchain.execute_timbr_query_chain import ExecuteTimbrQueryChain
|
|
6
|
-
|
|
6
|
+
from .. import config
|
|
7
7
|
|
|
8
8
|
class ExecuteSemanticQueryNode:
|
|
9
9
|
"""
|
|
@@ -36,6 +36,8 @@ class ExecuteSemanticQueryNode:
|
|
|
36
36
|
is_jwt: Optional[bool] = False,
|
|
37
37
|
jwt_tenant_id: Optional[str] = None,
|
|
38
38
|
conn_params: Optional[dict] = None,
|
|
39
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
40
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
39
41
|
debug: Optional[bool] = False,
|
|
40
42
|
**kwargs,
|
|
41
43
|
):
|
|
@@ -63,6 +65,8 @@ class ExecuteSemanticQueryNode:
|
|
|
63
65
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
64
66
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
65
67
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
68
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
69
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
66
70
|
:return: A list of rows from the Timbr query
|
|
67
71
|
"""
|
|
68
72
|
self.chain = ExecuteTimbrQueryChain(
|
|
@@ -89,6 +93,8 @@ class ExecuteSemanticQueryNode:
|
|
|
89
93
|
is_jwt=is_jwt,
|
|
90
94
|
jwt_tenant_id=jwt_tenant_id,
|
|
91
95
|
conn_params=conn_params,
|
|
96
|
+
enable_reasoning=enable_reasoning,
|
|
97
|
+
reasoning_steps=reasoning_steps,
|
|
92
98
|
debug=debug,
|
|
93
99
|
**kwargs,
|
|
94
100
|
)
|
|
@@ -3,6 +3,7 @@ from langchain.llms.base import LLM
|
|
|
3
3
|
from langgraph.graph import StateGraph
|
|
4
4
|
|
|
5
5
|
from ..langchain.generate_timbr_sql_chain import GenerateTimbrSqlChain
|
|
6
|
+
from .. import config
|
|
6
7
|
|
|
7
8
|
class GenerateTimbrSqlNode:
|
|
8
9
|
"""
|
|
@@ -32,6 +33,8 @@ class GenerateTimbrSqlNode:
|
|
|
32
33
|
is_jwt: Optional[bool] = False,
|
|
33
34
|
jwt_tenant_id: Optional[str] = None,
|
|
34
35
|
conn_params: Optional[dict] = None,
|
|
36
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
37
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
35
38
|
debug: Optional[bool] = False,
|
|
36
39
|
**kwargs,
|
|
37
40
|
):
|
|
@@ -57,6 +60,8 @@ class GenerateTimbrSqlNode:
|
|
|
57
60
|
:param is_jwt: Whether to use JWT authentication (default: False)
|
|
58
61
|
:param jwt_tenant_id: Tenant ID for JWT authentication when using multi-tenant setup
|
|
59
62
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
63
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
64
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
60
65
|
"""
|
|
61
66
|
self.chain = GenerateTimbrSqlChain(
|
|
62
67
|
llm=llm,
|
|
@@ -80,6 +85,8 @@ class GenerateTimbrSqlNode:
|
|
|
80
85
|
is_jwt=is_jwt,
|
|
81
86
|
jwt_tenant_id=jwt_tenant_id,
|
|
82
87
|
conn_params=conn_params,
|
|
88
|
+
enable_reasoning=enable_reasoning,
|
|
89
|
+
reasoning_steps=reasoning_steps,
|
|
83
90
|
debug=debug,
|
|
84
91
|
**kwargs,
|
|
85
92
|
)
|
|
@@ -33,6 +33,8 @@ class ValidateSemanticSqlNode:
|
|
|
33
33
|
is_jwt: Optional[bool] = False,
|
|
34
34
|
jwt_tenant_id: Optional[str] = None,
|
|
35
35
|
conn_params: Optional[dict] = None,
|
|
36
|
+
enable_reasoning: Optional[bool] = False,
|
|
37
|
+
reasoning_steps: Optional[int] = 2,
|
|
36
38
|
debug: Optional[bool] = False,
|
|
37
39
|
**kwargs,
|
|
38
40
|
):
|
|
@@ -57,6 +59,8 @@ class ValidateSemanticSqlNode:
|
|
|
57
59
|
:param is_jwt: Whether to use JWT authentication (default: False)
|
|
58
60
|
:param jwt_tenant_id: Tenant ID for JWT authentication when using multi-tenant setup
|
|
59
61
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
62
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
63
|
+
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
60
64
|
"""
|
|
61
65
|
self.chain = ValidateTimbrSqlChain(
|
|
62
66
|
llm=llm,
|
|
@@ -79,6 +83,8 @@ class ValidateSemanticSqlNode:
|
|
|
79
83
|
is_jwt=is_jwt,
|
|
80
84
|
jwt_tenant_id=jwt_tenant_id,
|
|
81
85
|
conn_params=conn_params,
|
|
86
|
+
enable_reasoning=enable_reasoning,
|
|
87
|
+
reasoning_steps=reasoning_steps,
|
|
82
88
|
debug=debug,
|
|
83
89
|
**kwargs,
|
|
84
90
|
)
|
|
@@ -184,6 +184,16 @@ class PromptService:
|
|
|
184
184
|
return self._fetch_template("llm_prompts/generate_sql")
|
|
185
185
|
|
|
186
186
|
|
|
187
|
+
def get_generate_sql_reasoning_template(self) -> ChatPromptTemplate:
|
|
188
|
+
"""
|
|
189
|
+
Get generate SQL reasoning template from API service (cached)
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
ChatPromptTemplate object
|
|
193
|
+
"""
|
|
194
|
+
return self._fetch_template("llm_prompts/generate_sql_reasoning")
|
|
195
|
+
|
|
196
|
+
|
|
187
197
|
def get_generate_answer_template(self) -> ChatPromptTemplate:
|
|
188
198
|
"""
|
|
189
199
|
Get generate answer template from API service (cached)
|
|
@@ -264,6 +274,22 @@ def get_generate_sql_prompt_template(
|
|
|
264
274
|
return PromptTemplateWrapper(prompt_service, "get_generate_sql_template")
|
|
265
275
|
|
|
266
276
|
|
|
277
|
+
def get_generate_sql_reasoning_prompt_template(
|
|
278
|
+
conn_params: Optional[dict] = None
|
|
279
|
+
) -> PromptTemplateWrapper:
|
|
280
|
+
"""
|
|
281
|
+
Get generate SQL reasoning prompt template wrapper
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
conn_params: Connection parameters including url, token, is_jwt, and jwt_tenant_id
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
PromptTemplateWrapper for generate SQL reasoning
|
|
288
|
+
"""
|
|
289
|
+
prompt_service = PromptService(conn_params=conn_params)
|
|
290
|
+
return PromptTemplateWrapper(prompt_service, "get_generate_sql_reasoning_template")
|
|
291
|
+
|
|
292
|
+
|
|
267
293
|
def get_qa_prompt_template(
|
|
268
294
|
conn_params: Optional[dict] = None
|
|
269
295
|
) -> PromptTemplateWrapper:
|