langchain-timbr 2.1.6__tar.gz → 2.1.8__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.6 → langchain_timbr-2.1.8}/PKG-INFO +1 -1
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/__init__.py +1 -1
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/_version.py +2 -2
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/config.py +6 -2
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/execute_timbr_query_chain.py +7 -7
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/generate_timbr_sql_chain.py +6 -6
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/timbr_sql_agent.py +12 -12
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/validate_timbr_sql_chain.py +12 -2
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/execute_timbr_query_node.py +6 -6
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/generate_timbr_sql_node.py +5 -5
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/validate_timbr_query_node.py +8 -2
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/timbr_llm_connector.py +5 -5
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/prompt_service.py +26 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/timbr_llm_utils.py +130 -138
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/timbr_utils.py +39 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/conftest.py +1 -0
- langchain_timbr-2.1.8/tests/integration/test_chain_reasoning.py +84 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_langchain_chains.py +9 -8
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/dependabot.yml +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/pull_request_template.md +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/_codespell.yml +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/_fossa.yml +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/install-dependencies-and-run-tests.yml +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/publish.yml +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.gitignore +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/LICENSE +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/README.md +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/SECURITY.md +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/pyproject.toml +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/pytest.ini +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/requirements.txt +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/requirements310.txt +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/requirements311.txt +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/__init__.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/generate_answer_chain.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/identify_concept_chain.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/__init__.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/generate_response_node.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/identify_concept_node.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/llm_wrapper/llm_wrapper.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/llm_wrapper/timbr_llm_wrapper.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/general.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/temperature_supported_models.json +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/README.md +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_agent_integration.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_azure_databricks_provider.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_azure_openai_model.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_chain_pipeline.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_jwt_token.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_langgraph_nodes.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_timeout_functionality.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/conftest.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_chain_documentation.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_connection_validation.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_llm_wrapper_optional_params.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_optional_llm_integration.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_standard_chain_requirements.py +0 -0
- {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/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.8
|
|
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/
|
|
@@ -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.8'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 1, 8)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -30,5 +30,9 @@ llm_api_version = os.environ.get('LLM_API_VERSION', None)
|
|
|
30
30
|
llm_scope = os.environ.get('LLM_SCOPE', "https://cognitiveservices.azure.com/.default") # e.g. "api://<your-client-id>/.default"
|
|
31
31
|
|
|
32
32
|
# Whether to enable reasoning during SQL generation
|
|
33
|
-
|
|
34
|
-
reasoning_steps = to_integer(os.environ.get('REASONING_STEPS', 2))
|
|
33
|
+
enable_reasoning = to_boolean(os.environ.get('ENABLE_REASONING', 'false'))
|
|
34
|
+
reasoning_steps = to_integer(os.environ.get('REASONING_STEPS', 2))
|
|
35
|
+
|
|
36
|
+
should_validate_sql = to_boolean(os.environ.get('SHOULD_VALIDATE_SQL', os.environ.get('LLM_SHOULD_VALIDATE_SQL', 'true')))
|
|
37
|
+
retry_if_no_results = to_boolean(os.environ.get('RETRY_IF_NO_RESULTS', os.environ.get('LLM_RETRY_IF_NO_RESULTS', 'true')))
|
|
38
|
+
llm_default_limit = to_integer(os.environ.get('LLM_DEFAULT_LIMIT', 500)) # Default max tokens limit for LLM responses
|
|
@@ -30,10 +30,10 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
30
30
|
include_logic_concepts: Optional[bool] = False,
|
|
31
31
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
32
32
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
33
|
-
should_validate_sql: Optional[bool] =
|
|
33
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
34
34
|
retries: Optional[int] = 3,
|
|
35
|
-
max_limit: Optional[int] =
|
|
36
|
-
retry_if_no_results: Optional[bool] =
|
|
35
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
36
|
+
retry_if_no_results: Optional[bool] = config.retry_if_no_results,
|
|
37
37
|
no_results_max_retries: Optional[int] = 2,
|
|
38
38
|
note: Optional[str] = '',
|
|
39
39
|
db_is_case_sensitive: Optional[bool] = False,
|
|
@@ -42,7 +42,7 @@ 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
|
-
|
|
45
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
46
46
|
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
47
47
|
debug: Optional[bool] = False,
|
|
48
48
|
**kwargs,
|
|
@@ -71,7 +71,7 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
71
71
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
72
72
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
73
73
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
74
|
-
:param
|
|
74
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
75
75
|
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
76
76
|
:param kwargs: Additional arguments to pass to the base
|
|
77
77
|
:return: A list of rows from the Timbr query
|
|
@@ -141,7 +141,7 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
141
141
|
self._jwt_tenant_id = jwt_tenant_id
|
|
142
142
|
self._debug = to_boolean(debug)
|
|
143
143
|
self._conn_params = conn_params or {}
|
|
144
|
-
self.
|
|
144
|
+
self._enable_reasoning = to_boolean(enable_reasoning)
|
|
145
145
|
self._reasoning_steps = to_integer(reasoning_steps)
|
|
146
146
|
|
|
147
147
|
|
|
@@ -215,7 +215,7 @@ class ExecuteTimbrQueryChain(Chain):
|
|
|
215
215
|
note=(self._note or '') + err_txt,
|
|
216
216
|
db_is_case_sensitive=self._db_is_case_sensitive,
|
|
217
217
|
graph_depth=self._graph_depth,
|
|
218
|
-
|
|
218
|
+
enable_reasoning=self._enable_reasoning,
|
|
219
219
|
reasoning_steps=self._reasoning_steps,
|
|
220
220
|
debug=self._debug,
|
|
221
221
|
)
|
|
@@ -29,9 +29,9 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
29
29
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
30
30
|
include_logic_concepts: Optional[bool] = False,
|
|
31
31
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
32
|
-
should_validate_sql: Optional[bool] =
|
|
32
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
33
33
|
retries: Optional[int] = 3,
|
|
34
|
-
max_limit: Optional[int] =
|
|
34
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
35
35
|
note: Optional[str] = '',
|
|
36
36
|
db_is_case_sensitive: Optional[bool] = False,
|
|
37
37
|
graph_depth: Optional[int] = 1,
|
|
@@ -39,7 +39,7 @@ 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
|
-
|
|
42
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
43
43
|
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
44
44
|
debug: Optional[bool] = False,
|
|
45
45
|
**kwargs,
|
|
@@ -66,7 +66,7 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
66
66
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
67
67
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
68
68
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
69
|
-
:param
|
|
69
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
70
70
|
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
71
71
|
:param debug: Whether to enable debug mode for detailed logging
|
|
72
72
|
:param kwargs: Additional arguments to pass to the base
|
|
@@ -134,7 +134,7 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
134
134
|
self._jwt_tenant_id = jwt_tenant_id
|
|
135
135
|
self._debug = to_boolean(debug)
|
|
136
136
|
self._conn_params = conn_params or {}
|
|
137
|
-
self.
|
|
137
|
+
self._enable_reasoning = to_boolean(enable_reasoning)
|
|
138
138
|
self._reasoning_steps = to_integer(reasoning_steps)
|
|
139
139
|
|
|
140
140
|
|
|
@@ -191,7 +191,7 @@ class GenerateTimbrSqlChain(Chain):
|
|
|
191
191
|
note=self._note,
|
|
192
192
|
db_is_case_sensitive=self._db_is_case_sensitive,
|
|
193
193
|
graph_depth=self._graph_depth,
|
|
194
|
-
|
|
194
|
+
enable_reasoning=self._enable_reasoning,
|
|
195
195
|
reasoning_steps=self._reasoning_steps,
|
|
196
196
|
debug=self._debug,
|
|
197
197
|
)
|
{langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/timbr_sql_agent.py
RENAMED
|
@@ -22,10 +22,10 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
22
22
|
include_logic_concepts: Optional[bool] = False,
|
|
23
23
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
24
24
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
25
|
-
should_validate_sql: Optional[bool] =
|
|
25
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
26
26
|
retries: Optional[int] = 3,
|
|
27
|
-
max_limit: Optional[int] =
|
|
28
|
-
retry_if_no_results: Optional[bool] =
|
|
27
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
28
|
+
retry_if_no_results: Optional[bool] = config.retry_if_no_results,
|
|
29
29
|
no_results_max_retries: Optional[int] = 2,
|
|
30
30
|
generate_answer: Optional[bool] = False,
|
|
31
31
|
note: Optional[str] = '',
|
|
@@ -35,7 +35,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
35
35
|
is_jwt: Optional[bool] = False,
|
|
36
36
|
jwt_tenant_id: Optional[str] = None,
|
|
37
37
|
conn_params: Optional[dict] = None,
|
|
38
|
-
|
|
38
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
39
39
|
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
40
40
|
debug: Optional[bool] = False
|
|
41
41
|
):
|
|
@@ -64,7 +64,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
64
64
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
65
65
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
66
66
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
67
|
-
:param
|
|
67
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
68
68
|
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
69
69
|
|
|
70
70
|
## Example
|
|
@@ -118,7 +118,7 @@ class TimbrSqlAgent(BaseSingleActionAgent):
|
|
|
118
118
|
is_jwt=to_boolean(is_jwt),
|
|
119
119
|
jwt_tenant_id=jwt_tenant_id,
|
|
120
120
|
conn_params=conn_params,
|
|
121
|
-
|
|
121
|
+
enable_reasoning=to_boolean(enable_reasoning),
|
|
122
122
|
reasoning_steps=to_integer(reasoning_steps),
|
|
123
123
|
debug=to_boolean(debug),
|
|
124
124
|
)
|
|
@@ -332,10 +332,10 @@ def create_timbr_sql_agent(
|
|
|
332
332
|
include_logic_concepts: Optional[bool] = False,
|
|
333
333
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
334
334
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
335
|
-
should_validate_sql: Optional[bool] =
|
|
335
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
336
336
|
retries: Optional[int] = 3,
|
|
337
|
-
max_limit: Optional[int] =
|
|
338
|
-
retry_if_no_results: Optional[bool] =
|
|
337
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
338
|
+
retry_if_no_results: Optional[bool] = config.retry_if_no_results,
|
|
339
339
|
no_results_max_retries: Optional[int] = 2,
|
|
340
340
|
generate_answer: Optional[bool] = False,
|
|
341
341
|
note: Optional[str] = '',
|
|
@@ -345,7 +345,7 @@ def create_timbr_sql_agent(
|
|
|
345
345
|
is_jwt: Optional[bool] = False,
|
|
346
346
|
jwt_tenant_id: Optional[str] = None,
|
|
347
347
|
conn_params: Optional[dict] = None,
|
|
348
|
-
|
|
348
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
349
349
|
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
350
350
|
debug: Optional[bool] = False
|
|
351
351
|
) -> AgentExecutor:
|
|
@@ -376,7 +376,7 @@ def create_timbr_sql_agent(
|
|
|
376
376
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
377
377
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
378
378
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
379
|
-
:param
|
|
379
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
380
380
|
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
381
381
|
|
|
382
382
|
Returns:
|
|
@@ -444,7 +444,7 @@ def create_timbr_sql_agent(
|
|
|
444
444
|
is_jwt=is_jwt,
|
|
445
445
|
jwt_tenant_id=jwt_tenant_id,
|
|
446
446
|
conn_params=conn_params,
|
|
447
|
-
|
|
447
|
+
enable_reasoning=enable_reasoning,
|
|
448
448
|
reasoning_steps=reasoning_steps,
|
|
449
449
|
debug=debug,
|
|
450
450
|
)
|
|
@@ -32,7 +32,7 @@ class ValidateTimbrSqlChain(Chain):
|
|
|
32
32
|
include_logic_concepts: Optional[bool] = False,
|
|
33
33
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
34
34
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
35
|
-
max_limit: Optional[int] =
|
|
35
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
36
36
|
note: Optional[str] = '',
|
|
37
37
|
db_is_case_sensitive: Optional[bool] = False,
|
|
38
38
|
graph_depth: Optional[int] = 1,
|
|
@@ -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
|
}
|
|
@@ -24,10 +24,10 @@ class ExecuteSemanticQueryNode:
|
|
|
24
24
|
include_logic_concepts: Optional[bool] = False,
|
|
25
25
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
26
26
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
27
|
-
should_validate_sql: Optional[bool] =
|
|
27
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
28
28
|
retries: Optional[int] = 3,
|
|
29
|
-
max_limit: Optional[int] =
|
|
30
|
-
retry_if_no_results: Optional[bool] =
|
|
29
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
30
|
+
retry_if_no_results: Optional[bool] = config.retry_if_no_results,
|
|
31
31
|
no_results_max_retries: Optional[int] = 2,
|
|
32
32
|
note: Optional[str] = '',
|
|
33
33
|
db_is_case_sensitive: Optional[bool] = False,
|
|
@@ -36,7 +36,7 @@ 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
|
-
|
|
39
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
40
40
|
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
41
41
|
debug: Optional[bool] = False,
|
|
42
42
|
**kwargs,
|
|
@@ -65,7 +65,7 @@ class ExecuteSemanticQueryNode:
|
|
|
65
65
|
:param is_jwt: Whether to use JWT authentication (default is False).
|
|
66
66
|
:param jwt_tenant_id: JWT tenant ID for multi-tenant environments (required when is_jwt=True).
|
|
67
67
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
68
|
-
:param
|
|
68
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
69
69
|
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
70
70
|
:return: A list of rows from the Timbr query
|
|
71
71
|
"""
|
|
@@ -93,7 +93,7 @@ class ExecuteSemanticQueryNode:
|
|
|
93
93
|
is_jwt=is_jwt,
|
|
94
94
|
jwt_tenant_id=jwt_tenant_id,
|
|
95
95
|
conn_params=conn_params,
|
|
96
|
-
|
|
96
|
+
enable_reasoning=enable_reasoning,
|
|
97
97
|
reasoning_steps=reasoning_steps,
|
|
98
98
|
debug=debug,
|
|
99
99
|
**kwargs,
|
|
@@ -23,9 +23,9 @@ class GenerateTimbrSqlNode:
|
|
|
23
23
|
include_logic_concepts: Optional[bool] = False,
|
|
24
24
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
25
25
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
26
|
-
should_validate_sql: Optional[bool] =
|
|
26
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
27
27
|
retries: Optional[int] = 3,
|
|
28
|
-
max_limit: Optional[int] =
|
|
28
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
29
29
|
note: Optional[str] = '',
|
|
30
30
|
db_is_case_sensitive: Optional[bool] = False,
|
|
31
31
|
graph_depth: Optional[int] = 1,
|
|
@@ -33,7 +33,7 @@ class GenerateTimbrSqlNode:
|
|
|
33
33
|
is_jwt: Optional[bool] = False,
|
|
34
34
|
jwt_tenant_id: Optional[str] = None,
|
|
35
35
|
conn_params: Optional[dict] = None,
|
|
36
|
-
|
|
36
|
+
enable_reasoning: Optional[bool] = config.enable_reasoning,
|
|
37
37
|
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
38
38
|
debug: Optional[bool] = False,
|
|
39
39
|
**kwargs,
|
|
@@ -60,7 +60,7 @@ class GenerateTimbrSqlNode:
|
|
|
60
60
|
:param is_jwt: Whether to use JWT authentication (default: False)
|
|
61
61
|
:param jwt_tenant_id: Tenant ID for JWT authentication when using multi-tenant setup
|
|
62
62
|
:param conn_params: Extra Timbr connection parameters sent with every request (e.g., 'x-api-impersonate-user').
|
|
63
|
-
:param
|
|
63
|
+
:param enable_reasoning: Whether to enable reasoning during SQL generation (default is False).
|
|
64
64
|
:param reasoning_steps: Number of reasoning steps to perform if reasoning is enabled (default is 2).
|
|
65
65
|
"""
|
|
66
66
|
self.chain = GenerateTimbrSqlChain(
|
|
@@ -85,7 +85,7 @@ class GenerateTimbrSqlNode:
|
|
|
85
85
|
is_jwt=is_jwt,
|
|
86
86
|
jwt_tenant_id=jwt_tenant_id,
|
|
87
87
|
conn_params=conn_params,
|
|
88
|
-
|
|
88
|
+
enable_reasoning=enable_reasoning,
|
|
89
89
|
reasoning_steps=reasoning_steps,
|
|
90
90
|
debug=debug,
|
|
91
91
|
**kwargs,
|
|
@@ -3,7 +3,7 @@ from langchain.llms.base import LLM
|
|
|
3
3
|
from langgraph.graph import StateGraph
|
|
4
4
|
|
|
5
5
|
from ..langchain.validate_timbr_sql_chain import ValidateTimbrSqlChain
|
|
6
|
-
|
|
6
|
+
from .. import config
|
|
7
7
|
|
|
8
8
|
class ValidateSemanticSqlNode:
|
|
9
9
|
"""
|
|
@@ -25,7 +25,7 @@ class ValidateSemanticSqlNode:
|
|
|
25
25
|
include_logic_concepts: Optional[bool] = False,
|
|
26
26
|
include_tags: Optional[Union[list[str], str]] = None,
|
|
27
27
|
exclude_properties: Optional[Union[list[str], str]] = ['entity_id', 'entity_type', 'entity_label'],
|
|
28
|
-
max_limit: Optional[int] =
|
|
28
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
29
29
|
note: Optional[str] = None,
|
|
30
30
|
db_is_case_sensitive: Optional[bool] = False,
|
|
31
31
|
graph_depth: Optional[int] = 1,
|
|
@@ -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] = config.enable_reasoning,
|
|
37
|
+
reasoning_steps: Optional[int] = config.reasoning_steps,
|
|
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
|
)
|
|
@@ -30,7 +30,7 @@ class TimbrLlmConnector:
|
|
|
30
30
|
url: Optional[str] = config.url,
|
|
31
31
|
token: Optional[str] = config.token,
|
|
32
32
|
ontology: Optional[str] = config.ontology,
|
|
33
|
-
max_limit: Optional[int] =
|
|
33
|
+
max_limit: Optional[int] = config.llm_default_limit,
|
|
34
34
|
verify_ssl: Optional[bool] = True,
|
|
35
35
|
is_jwt: Optional[bool] = False,
|
|
36
36
|
jwt_tenant_id: Optional[str] = None,
|
|
@@ -185,7 +185,7 @@ class TimbrLlmConnector:
|
|
|
185
185
|
views_list: Optional[list] = None,
|
|
186
186
|
include_logic_concepts: Optional[bool] = False,
|
|
187
187
|
include_tags: Optional[str] = None,
|
|
188
|
-
should_validate_sql: Optional[bool] =
|
|
188
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
189
189
|
retries: Optional[int] = 3,
|
|
190
190
|
note: Optional[str] = '',
|
|
191
191
|
**chain_kwargs: Any,
|
|
@@ -243,7 +243,7 @@ class TimbrLlmConnector:
|
|
|
243
243
|
views_list: Optional[list] = None,
|
|
244
244
|
include_logic_concepts: Optional[bool] = False,
|
|
245
245
|
include_tags: Optional[str] = None,
|
|
246
|
-
should_validate_sql: Optional[bool] =
|
|
246
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
247
247
|
retries: Optional[int] = 3,
|
|
248
248
|
note: Optional[str] = '',
|
|
249
249
|
**chain_kwargs: Any,
|
|
@@ -272,7 +272,7 @@ class TimbrLlmConnector:
|
|
|
272
272
|
views_list: Optional[list] = None,
|
|
273
273
|
include_logic_concepts: Optional[bool] = False,
|
|
274
274
|
include_tags: Optional[str] = None,
|
|
275
|
-
should_validate_sql: Optional[bool] =
|
|
275
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
276
276
|
retries: Optional[int] = 3,
|
|
277
277
|
note: Optional[str] = '',
|
|
278
278
|
**agent_kwargs: Any,
|
|
@@ -302,7 +302,7 @@ class TimbrLlmConnector:
|
|
|
302
302
|
views_list: Optional[list] = None,
|
|
303
303
|
include_logic_concepts: Optional[bool] = False,
|
|
304
304
|
include_tags: Optional[str] = None,
|
|
305
|
-
should_validate_sql: Optional[bool] =
|
|
305
|
+
should_validate_sql: Optional[bool] = config.should_validate_sql,
|
|
306
306
|
retries: Optional[int] = 3,
|
|
307
307
|
note: Optional[str] = '',
|
|
308
308
|
**nodes_kwargs: Any,
|
|
@@ -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:
|