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.
Files changed (58) hide show
  1. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/PKG-INFO +1 -1
  2. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/__init__.py +1 -1
  3. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/_version.py +2 -2
  4. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/config.py +6 -2
  5. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/execute_timbr_query_chain.py +7 -7
  6. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/generate_timbr_sql_chain.py +6 -6
  7. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/timbr_sql_agent.py +12 -12
  8. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/validate_timbr_sql_chain.py +12 -2
  9. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/execute_timbr_query_node.py +6 -6
  10. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/generate_timbr_sql_node.py +5 -5
  11. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/validate_timbr_query_node.py +8 -2
  12. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/timbr_llm_connector.py +5 -5
  13. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/prompt_service.py +26 -0
  14. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/timbr_llm_utils.py +130 -138
  15. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/timbr_utils.py +39 -0
  16. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/conftest.py +1 -0
  17. langchain_timbr-2.1.8/tests/integration/test_chain_reasoning.py +84 -0
  18. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_langchain_chains.py +9 -8
  19. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/dependabot.yml +0 -0
  20. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/pull_request_template.md +0 -0
  21. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/_codespell.yml +0 -0
  22. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/_fossa.yml +0 -0
  23. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/install-dependencies-and-run-tests.yml +0 -0
  24. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.github/workflows/publish.yml +0 -0
  25. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/.gitignore +0 -0
  26. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/LICENSE +0 -0
  27. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/README.md +0 -0
  28. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/SECURITY.md +0 -0
  29. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/pyproject.toml +0 -0
  30. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/pytest.ini +0 -0
  31. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/requirements.txt +0 -0
  32. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/requirements310.txt +0 -0
  33. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/requirements311.txt +0 -0
  34. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/__init__.py +0 -0
  35. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/generate_answer_chain.py +0 -0
  36. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langchain/identify_concept_chain.py +0 -0
  37. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/__init__.py +0 -0
  38. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/generate_response_node.py +0 -0
  39. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/langgraph/identify_concept_node.py +0 -0
  40. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/llm_wrapper/llm_wrapper.py +0 -0
  41. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/llm_wrapper/timbr_llm_wrapper.py +0 -0
  42. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/general.py +0 -0
  43. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/src/langchain_timbr/utils/temperature_supported_models.json +0 -0
  44. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/README.md +0 -0
  45. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_agent_integration.py +0 -0
  46. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_azure_databricks_provider.py +0 -0
  47. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_azure_openai_model.py +0 -0
  48. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_chain_pipeline.py +0 -0
  49. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_jwt_token.py +0 -0
  50. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_langgraph_nodes.py +0 -0
  51. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/integration/test_timeout_functionality.py +0 -0
  52. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/conftest.py +0 -0
  53. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_chain_documentation.py +0 -0
  54. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_connection_validation.py +0 -0
  55. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_llm_wrapper_optional_params.py +0 -0
  56. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_optional_llm_integration.py +0 -0
  57. {langchain_timbr-2.1.6 → langchain_timbr-2.1.8}/tests/standard/test_standard_chain_requirements.py +0 -0
  58. {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.6
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/
@@ -12,7 +12,7 @@
12
12
  from .timbr_llm_connector import TimbrLlmConnector
13
13
  from .llm_wrapper.llm_wrapper import LlmWrapper, LlmTypes
14
14
 
15
- from .utils.timbr_llm_utils import (
15
+ from .utils.timbr_utils import (
16
16
  generate_key,
17
17
  encrypt_prompt,
18
18
  decrypt_prompt,
@@ -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.6'
32
- __version_tuple__ = version_tuple = (2, 1, 6)
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
- with_reasoning = to_boolean(os.environ.get('WITH_REASONING', 'false'))
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] = False,
33
+ should_validate_sql: Optional[bool] = config.should_validate_sql,
34
34
  retries: Optional[int] = 3,
35
- max_limit: Optional[int] = 500,
36
- retry_if_no_results: Optional[bool] = False,
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
- with_reasoning: Optional[bool] = config.with_reasoning,
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 with_reasoning: Whether to enable reasoning during SQL generation (default is False).
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._with_reasoning = to_boolean(with_reasoning)
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
- with_reasoning=self._with_reasoning,
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] = False,
32
+ should_validate_sql: Optional[bool] = config.should_validate_sql,
33
33
  retries: Optional[int] = 3,
34
- max_limit: Optional[int] = 500,
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
- with_reasoning: Optional[bool] = config.with_reasoning,
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 with_reasoning: Whether to enable reasoning during SQL generation (default is False).
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._with_reasoning = to_boolean(with_reasoning)
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
- with_reasoning=self._with_reasoning,
194
+ enable_reasoning=self._enable_reasoning,
195
195
  reasoning_steps=self._reasoning_steps,
196
196
  debug=self._debug,
197
197
  )
@@ -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] = True,
25
+ should_validate_sql: Optional[bool] = config.should_validate_sql,
26
26
  retries: Optional[int] = 3,
27
- max_limit: Optional[int] = 500,
28
- retry_if_no_results: Optional[bool] = False,
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
- with_reasoning: Optional[bool] = config.with_reasoning,
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 with_reasoning: Whether to enable reasoning during SQL generation (default is False).
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
- with_reasoning=to_boolean(with_reasoning),
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] = True,
335
+ should_validate_sql: Optional[bool] = config.should_validate_sql,
336
336
  retries: Optional[int] = 3,
337
- max_limit: Optional[int] = 500,
338
- retry_if_no_results: Optional[bool] = False,
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
- with_reasoning: Optional[bool] = config.with_reasoning,
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 with_reasoning: Whether to enable reasoning during SQL generation (default is False).
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
- with_reasoning=with_reasoning,
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] = 500,
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] = False,
27
+ should_validate_sql: Optional[bool] = config.should_validate_sql,
28
28
  retries: Optional[int] = 3,
29
- max_limit: Optional[int] = 500,
30
- retry_if_no_results: Optional[bool] = False,
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
- with_reasoning: Optional[bool] = config.with_reasoning,
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 with_reasoning: Whether to enable reasoning during SQL generation (default is False).
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
- with_reasoning=with_reasoning,
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] = False,
26
+ should_validate_sql: Optional[bool] = config.should_validate_sql,
27
27
  retries: Optional[int] = 3,
28
- max_limit: Optional[int] = 500,
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
- with_reasoning: Optional[bool] = config.with_reasoning,
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 with_reasoning: Whether to enable reasoning during SQL generation (default is False).
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
- with_reasoning=with_reasoning,
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] = 500,
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] = 500,
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] = False,
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] = True,
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] = True,
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] = True,
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: