vectara-agentic 0.2.24__py3-none-any.whl → 0.3.1__py3-none-any.whl

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.

Potentially problematic release.


This version of vectara-agentic might be problematic. Click here for more details.

vectara_agentic/tools.py CHANGED
@@ -14,7 +14,6 @@ from pydantic import BaseModel, Field
14
14
  from llama_index.core.tools import FunctionTool
15
15
  from llama_index.indices.managed.vectara import VectaraIndex
16
16
  from llama_index.core.utilities.sql_wrapper import SQLDatabase
17
- from llama_index.core.tools.types import ToolOutput
18
17
 
19
18
  from .types import ToolType
20
19
  from .tools_catalog import ToolsCatalog, get_bad_topics
@@ -25,6 +24,7 @@ from .tool_utils import (
25
24
  create_tool_from_dynamic_function,
26
25
  build_filter_string,
27
26
  VectaraTool,
27
+ create_human_readable_output,
28
28
  )
29
29
 
30
30
  LI_packages = {
@@ -170,7 +170,7 @@ class VectaraToolFactory:
170
170
  )
171
171
 
172
172
  # Dynamically generate the search function
173
- def search_function(*args: Any, **kwargs: Any) -> ToolOutput:
173
+ def search_function(*args: Any, **kwargs: Any) -> list[dict]:
174
174
  """
175
175
  Dynamically generated function for semantic search Vectara.
176
176
  """
@@ -192,12 +192,11 @@ class VectaraToolFactory:
192
192
  kwargs, tool_args_type, fixed_filter
193
193
  )
194
194
  except ValueError as e:
195
- return ToolOutput(
196
- tool_name=search_function.__name__,
197
- content=str(e),
198
- raw_input={"args": args, "kwargs": kwargs},
199
- raw_output={"response": str(e)},
195
+ msg = (
196
+ f"Building filter string failed in search tool due to invalid input or configuration ({e}). "
197
+ "Please verify the input arguments and ensure they meet the expected format or conditions."
200
198
  )
199
+ return [{"text": msg, "metadata": {"args": args, "kwargs": kwargs}}]
201
200
 
202
201
  vectara_retriever = vectara.as_retriever(
203
202
  summary_enabled=False,
@@ -228,12 +227,7 @@ class VectaraToolFactory:
228
227
 
229
228
  if len(response) == 0:
230
229
  msg = "Vectara Tool failed to retrieve any results for the query."
231
- return ToolOutput(
232
- tool_name=search_function.__name__,
233
- content=msg,
234
- raw_input={"args": args, "kwargs": kwargs},
235
- raw_output={"response": msg},
236
- )
230
+ return [{"text": msg, "metadata": {"args": args, "kwargs": kwargs}}]
237
231
  unique_ids = set()
238
232
  docs = []
239
233
  doc_matches = {}
@@ -244,7 +238,8 @@ class VectaraToolFactory:
244
238
  unique_ids.add(doc.id_)
245
239
  doc_matches[doc.id_] = [doc.node.get_content()]
246
240
  docs.append((doc.id_, doc.metadata))
247
- tool_output = "Matching documents:\n"
241
+
242
+ res = []
248
243
  if summarize:
249
244
  summaries_dict = asyncio.run(
250
245
  summarize_documents(
@@ -254,35 +249,45 @@ class VectaraToolFactory:
254
249
  doc_ids=list(unique_ids),
255
250
  )
256
251
  )
257
- for doc_id, metadata in docs:
258
- summary = summaries_dict.get(doc_id, "")
259
- matching_text = "\n".join(
260
- f"<match {i}>{piece}</match {i}>"
261
- for i, piece in enumerate(doc_matches[doc_id], start=1)
262
- )
263
- tool_output += (
264
- f"document_id: '{doc_id}'\nmetadata: '{metadata}'\n"
265
- f"matching texts: '{matching_text}'\n"
266
- f"summary: '{summary}'\n\n"
267
- )
268
252
  else:
269
- for doc_id, metadata in docs:
270
- matching_text = "\n".join(
271
- f"<match {i}>{piece}</match {i}>"
272
- for i, piece in enumerate(doc_matches[doc_id], start=1)
273
- )
274
- tool_output += (
275
- f"document_id: '{doc_id}'\nmetadata: '{metadata}'\n"
276
- f"matching texts: '{matching_text}'\n"
277
- )
253
+ summaries_dict = {}
254
+
255
+ for doc_id, metadata in docs:
256
+ res.append(
257
+ {
258
+ "text": summaries_dict.get(doc_id, "") if summarize else "",
259
+ "metadata": {
260
+ "document_id": doc_id,
261
+ "metadata": metadata,
262
+ "matching_text": doc_matches[doc_id],
263
+ },
264
+ }
265
+ )
278
266
 
279
- out = ToolOutput(
280
- tool_name=search_function.__name__,
281
- content=tool_output,
282
- raw_input={"args": args, "kwargs": kwargs},
283
- raw_output=response,
284
- )
285
- return out
267
+ # Create human-readable output using sequential format
268
+ def format_search_results(results):
269
+ if not results:
270
+ return "No search results found"
271
+
272
+ # Create a sequential view for human reading
273
+ formatted_results = []
274
+ for i, result in enumerate(results, 1):
275
+ result_str = f"**Result #{i}**\n"
276
+ result_str += f"Document ID: {result['metadata']['document_id']}\n"
277
+ if summarize and result["text"]:
278
+ result_str += f"Summary: {result['text']}\n"
279
+
280
+ # Add all matching text if available
281
+ matches = result["metadata"]["matching_text"]
282
+ if matches:
283
+ result_str += ''.join(
284
+ f"Match #{inx} Text: {match}\n"
285
+ for inx, match in enumerate(matches, 1)
286
+ )
287
+ formatted_results.append(result_str)
288
+ return "\n".join(formatted_results)
289
+
290
+ return create_human_readable_output(res, format_search_results)
286
291
 
287
292
  class SearchToolBaseParams(BaseModel):
288
293
  """Model for the base parameters of the search tool."""
@@ -362,6 +367,7 @@ class VectaraToolFactory:
362
367
  frequency_penalty: Optional[float] = None,
363
368
  presence_penalty: Optional[float] = None,
364
369
  include_citations: bool = True,
370
+ citation_pattern: str = "{doc.url}",
365
371
  save_history: bool = False,
366
372
  fcs_threshold: float = 0.0,
367
373
  return_direct: bool = False,
@@ -415,6 +421,9 @@ class VectaraToolFactory:
415
421
  higher values increasing the diversity of topics.
416
422
  include_citations (bool, optional): Whether to include citations in the response.
417
423
  If True, uses markdown vectara citations that requires the Vectara scale plan.
424
+ citation_pattern (str, optional): The pattern for the citations in the response.
425
+ Default is "{doc.url}" which uses the document URL.
426
+ If include_citations is False, this parameter is ignored.
418
427
  save_history (bool, optional): Whether to save the query in history.
419
428
  fcs_threshold (float, optional): A threshold for factual consistency.
420
429
  If set above 0, the tool notifies the calling agent that it "cannot respond" if FCS is too low.
@@ -434,9 +443,10 @@ class VectaraToolFactory:
434
443
  vectara_base_url=vectara_base_url,
435
444
  vectara_verify_ssl=vectara_verify_ssl,
436
445
  )
446
+ keys_to_ignore = ["lang", "offset", "len"]
437
447
 
438
448
  # Dynamically generate the RAG function
439
- def rag_function(*args: Any, **kwargs: Any) -> ToolOutput:
449
+ def rag_function(*args: Any, **kwargs: Any) -> dict:
440
450
  """
441
451
  Dynamically generated function for RAG query with Vectara.
442
452
  """
@@ -452,12 +462,12 @@ class VectaraToolFactory:
452
462
  kwargs, tool_args_type, fixed_filter
453
463
  )
454
464
  except ValueError as e:
455
- return ToolOutput(
456
- tool_name=rag_function.__name__,
457
- content=str(e),
458
- raw_input={"args": args, "kwargs": kwargs},
459
- raw_output={"response": str(e)},
465
+ msg = (
466
+ f"Building filter string failed in rag tool. "
467
+ f"Reason: {e}. Ensure that the input arguments match the expected "
468
+ f"format and include all required fields. "
460
469
  )
470
+ return {"text": msg, "metadata": {"args": args, "kwargs": kwargs}}
461
471
 
462
472
  vectara_query_engine = vectara.as_query_engine(
463
473
  summary_enabled=True,
@@ -491,7 +501,7 @@ class VectaraToolFactory:
491
501
  frequency_penalty=frequency_penalty,
492
502
  presence_penalty=presence_penalty,
493
503
  citations_style="markdown" if include_citations else None,
494
- citations_url_pattern="{doc.url}" if include_citations else None,
504
+ citations_url_pattern=citation_pattern if include_citations else None,
495
505
  save_history=save_history,
496
506
  x_source_str="vectara-agentic",
497
507
  verbose=verbose,
@@ -503,73 +513,67 @@ class VectaraToolFactory:
503
513
  "Tool failed to generate a response since no matches were found. "
504
514
  "Please check the arguments and try again."
505
515
  )
506
- return ToolOutput(
507
- tool_name=rag_function.__name__,
508
- content=msg,
509
- raw_input={"args": args, "kwargs": kwargs},
510
- raw_output={"response": msg},
511
- )
516
+ return {"text": msg, "metadata": {"args": args, "kwargs": kwargs}}
512
517
  if str(response) == "None":
513
518
  msg = "Tool failed to generate a response."
514
- return ToolOutput(
515
- tool_name=rag_function.__name__,
516
- content=msg,
517
- raw_input={"args": args, "kwargs": kwargs},
518
- raw_output={"response": msg},
519
- )
519
+ return {"text": msg, "metadata": {"args": args, "kwargs": kwargs}}
520
520
 
521
521
  # Extract citation metadata
522
522
  pattern = r"\[(\d+)\]"
523
523
  matches = re.findall(pattern, response.response)
524
524
  citation_numbers = sorted(set(int(match) for match in matches))
525
- citation_metadata = ""
526
- keys_to_ignore = ["lang", "offset", "len"]
525
+ citation_metadata = {}
527
526
  for citation_number in citation_numbers:
528
- metadata = response.source_nodes[citation_number - 1].metadata
529
- citation_metadata += (
530
- f"[{citation_number}]: "
531
- + "; ".join(
532
- [
533
- f"{k}='{v}'"
534
- for k, v in metadata.items()
535
- if k not in keys_to_ignore
536
- ]
537
- )
538
- + ".\n"
539
- )
527
+ metadata = {
528
+ k: v
529
+ for k, v in response.source_nodes[
530
+ citation_number - 1
531
+ ].metadata.items()
532
+ if k not in keys_to_ignore
533
+ }
534
+ citation_metadata[str(citation_number)] = metadata
540
535
  fcs = 0.0
541
536
  fcs_str = response.metadata["fcs"] if "fcs" in response.metadata else "0.0"
542
537
  if fcs_str and is_float(fcs_str):
543
538
  fcs = float(fcs_str)
544
539
  if fcs < fcs_threshold:
545
540
  msg = f"Could not answer the query due to suspected hallucination (fcs={fcs})."
546
- return ToolOutput(
547
- tool_name=rag_function.__name__,
548
- content=msg,
549
- raw_input={"args": args, "kwargs": kwargs},
550
- raw_output={"response": msg},
551
- )
552
- res = {
553
- "response": response.response,
554
- "references_metadata": citation_metadata,
555
- "fcs_score": fcs,
556
- }
557
- if len(citation_metadata) > 0:
558
- tool_output = f"""
559
- Response: '''{res['response']}'''
560
- fcs_score: {res['fcs_score']:.4f}
561
- References:
562
- {res['references_metadata']}
563
- """
564
- else:
565
- tool_output = f"Response: '''{res['response']}'''"
566
- out = ToolOutput(
567
- tool_name=rag_function.__name__,
568
- content=tool_output,
569
- raw_input={"args": args, "kwargs": kwargs},
570
- raw_output=res,
571
- )
572
- return out
541
+ return {
542
+ "text": msg,
543
+ "metadata": {"args": args, "kwargs": kwargs, "fcs": fcs},
544
+ }
545
+ if fcs:
546
+ citation_metadata["fcs"] = fcs
547
+ res = {"text": response.response, "metadata": citation_metadata}
548
+
549
+ # Create human-readable output with citation formatting
550
+ def format_rag_response(result):
551
+ text = result["text"]
552
+
553
+ # Format citations if present
554
+ metadata = result["metadata"]
555
+ citation_info = []
556
+ for key, value in metadata.items():
557
+ if key.isdigit():
558
+ doc = value.get("document", {})
559
+ doc_metadata = f"{key}: " + "; ".join(
560
+ [
561
+ f"{k}='{v}'"
562
+ for k, v in doc.items()
563
+ ] +
564
+ [
565
+ f"{k}='{v}'"
566
+ for k, v in value.items()
567
+ if k not in ["document"] + keys_to_ignore
568
+ ]
569
+ )
570
+ citation_info.append(doc_metadata)
571
+ if citation_info:
572
+ text += "\n\nCitations:\n" + "\n".join(citation_info)
573
+
574
+ return text
575
+
576
+ return create_human_readable_output(res, format_rag_response)
573
577
 
574
578
  class RagToolBaseParams(BaseModel):
575
579
  """Model for the base parameters of the RAG tool."""
vectara_agentic/types.py CHANGED
@@ -1,11 +1,17 @@
1
1
  """
2
2
  This module contains the types used in the Vectara Agentic.
3
3
  """
4
+
4
5
  from enum import Enum
6
+ from typing import Protocol, Any
5
7
 
8
+ from llama_index.core.schema import Document as LI_Document
6
9
  from llama_index.core.tools.types import ToolOutput as LI_ToolOutput
7
10
  from llama_index.core.chat_engine.types import AgentChatResponse as LI_AgentChatResponse
8
- from llama_index.core.chat_engine.types import StreamingAgentChatResponse as LI_StreamingAgentChatResponse
11
+ from llama_index.core.chat_engine.types import (
12
+ StreamingAgentChatResponse as LI_StreamingAgentChatResponse,
13
+ )
14
+
9
15
 
10
16
  class AgentType(Enum):
11
17
  """Enumeration for different types of agents."""
@@ -16,6 +22,7 @@ class AgentType(Enum):
16
22
  LLMCOMPILER = "LLMCOMPILER"
17
23
  LATS = "LATS"
18
24
 
25
+
19
26
  class ObserverType(Enum):
20
27
  """Enumeration for different types of observability integrations."""
21
28
 
@@ -55,16 +62,30 @@ class LLMRole(Enum):
55
62
 
56
63
  class ToolType(Enum):
57
64
  """Enumeration for different types of tools."""
65
+
58
66
  QUERY = "query"
59
67
  ACTION = "action"
60
68
 
69
+
61
70
  class AgentConfigType(Enum):
62
71
  """Enumeration for different types of agent configurations."""
72
+
63
73
  DEFAULT = "default"
64
74
  FALLBACK = "fallback"
65
75
 
66
76
 
77
+ class HumanReadableOutput(Protocol):
78
+ """Protocol for tool outputs that can provide human-readable representations."""
79
+
80
+ def to_human_readable(self) -> str:
81
+ """Convert the output to a human-readable format."""
82
+
83
+ def get_raw_output(self) -> Any:
84
+ """Get the raw output data."""
85
+
86
+
67
87
  # classes for Agent responses
68
88
  ToolOutput = LI_ToolOutput
69
89
  AgentResponse = LI_AgentChatResponse
70
90
  AgentStreamingResponse = LI_StreamingAgentChatResponse
91
+ Document = LI_Document
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vectara_agentic
3
- Version: 0.2.24
3
+ Version: 0.3.1
4
4
  Summary: A Python package for creating AI Assistants and AI Agents with Vectara
5
5
  Home-page: https://github.com/vectara/py-vectara-agentic
6
6
  Author: Ofer Mendelevitch
@@ -49,7 +49,7 @@ Requires-Dist: llama-index-tools-bing-search==0.3.0
49
49
  Requires-Dist: openai>=1.82.1
50
50
  Requires-Dist: tavily-python==0.7.3
51
51
  Requires-Dist: exa-py==1.13.1
52
- Requires-Dist: openinference-instrumentation-llama-index==4.2.1
52
+ Requires-Dist: openinference-instrumentation-llama-index==4.3.1
53
53
  Requires-Dist: opentelemetry-proto>=1.31.0
54
54
  Requires-Dist: arize-phoenix==10.9.1
55
55
  Requires-Dist: arize-phoenix-otel==0.10.3
@@ -61,6 +61,7 @@ Requires-Dist: python-dotenv==1.0.1
61
61
  Requires-Dist: tiktoken==0.9.0
62
62
  Requires-Dist: cloudpickle>=3.1.1
63
63
  Requires-Dist: httpx==0.28.1
64
+ Requires-Dist: commonmark==0.9.1
64
65
  Dynamic: author
65
66
  Dynamic: author-email
66
67
  Dynamic: classifier
@@ -479,10 +480,32 @@ def mult_func(x, y):
479
480
  mult_tool = ToolsFactory().create_tool(mult_func)
480
481
  ```
481
482
 
483
+ #### Human-Readable Tool Output
484
+
485
+ Tools can provide both raw data and human-readable formatted output using the `create_human_readable_output` utility:
486
+
487
+ ```python
488
+ from vectara_agentic.tool_utils import create_human_readable_output, format_as_table
489
+
490
+ def my_data_tool(query: str):
491
+ """Tool that returns structured data with custom formatting."""
492
+ raw_data = [
493
+ {"name": "Alice", "age": 30, "city": "New York"},
494
+ {"name": "Bob", "age": 25, "city": "Boston"}
495
+ ]
496
+
497
+ # Return human-readable output with built-in table formatter
498
+ return create_human_readable_output(raw_data, format_as_table)
499
+ ```
500
+
501
+ Built-in formatters include `format_as_table`, `format_as_json`, and `format_as_markdown_list`. For detailed documentation and advanced usage, see [tools.md](docs/tools.md#human-readable-tool-output).
502
+
482
503
  > **Important:** When you define your own Python functions as tools, implement them at the top module level,
483
504
  > and not as nested functions. Nested functions are not supported if you use serialization
484
505
  > (dumps/loads or from_dict/to_dict).
485
506
 
507
+ The human-readable format, if available, is used when computing the factual consistency score.
508
+
486
509
  ### Tool Validation
487
510
 
488
511
  When creating an agent, you can enable tool validation by setting `validate_tools=True`. This will check that any tools mentioned in your custom instructions actually exist in the agent's tool set:
@@ -1,6 +1,6 @@
1
1
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  tests/endpoint.py,sha256=frnpdZQpnuQNNKNYgAn2rFTarNG8MCJaNA77Bw_W22A,1420
3
- tests/test_agent.py,sha256=BmpJrYN-BLwYasgPhY5Dji-kIpc723e2F6I-nj4EQgc,5510
3
+ tests/test_agent.py,sha256=4aRDhEVM1zARpSOevPR8PFGTkIaSw5g5WvoQDx-4sns,5496
4
4
  tests/test_agent_planning.py,sha256=JwEebGooROAvsQ9JZoaH6KEcrSyv1F0lL4TD4FjP8a8,2213
5
5
  tests/test_agent_type.py,sha256=9ZImIDw7Qz5EV2tX8bDD0tT1IFYghS3-SShpAezHO7s,7381
6
6
  tests/test_api_endpoint.py,sha256=M9YGFCy_Jphzq9JznP4ftHqxZ_yu6dgWdX1jRvdsORA,5002
@@ -8,30 +8,32 @@ tests/test_bedrock.py,sha256=23A5_2FRaEl47PzgfUPDL6dgFDPJ9iktz-A-B1UwIhg,1224
8
8
  tests/test_fallback.py,sha256=M5YD7NHZ0joVU1frYIr9_OiRAIje5mrXrYVcekzlyGs,2829
9
9
  tests/test_gemini.py,sha256=QUBYWhZkX9AjnhPn5qa7sREf6YHZWeJEmYzKwVC23Io,4081
10
10
  tests/test_groq.py,sha256=5yTlOLwpzGRmiBPExAuulK6SEO9O13cMJWVSSHX9CsE,1212
11
+ tests/test_hhem.py,sha256=XFUX3x0xOa9QsafzYNP8_ZsvzIiLnWee4hdsowzHft8,3250
11
12
  tests/test_private_llm.py,sha256=-bQBI69Z-SwhhQJGzyC9GGM4kz5c6T5kAbXLbqn_G7E,2248
12
- tests/test_return_direct.py,sha256=Y_K_v88eS_kJfxE6A0Yghma0nUT8u6COitj0SNnZGNs,1523
13
+ tests/test_return_direct.py,sha256=mgj1xJnvOX28aaidhZfH2DaI-kM0yfQ0P1PNV0iyLcw,1405
13
14
  tests/test_serialization.py,sha256=Ed23GN2zhSJNdPFrVK4aqLkOhJKviczR_o0t-r9TuRI,4762
14
- tests/test_tools.py,sha256=j6wY-jqeerE4Q7lxzuxbftRyzPLHE1scWKNFLgX7wSk,17138
15
+ tests/test_tools.py,sha256=bhhq49I3eEJyuNf5FU7M9IxPT0XtwRbRTs3gwoBHihk,17128
15
16
  tests/test_vectara_llms.py,sha256=gw5KQ4XT3L-_A6yj2jKqj-QomCjOb9VESKBtBH2Xb8s,2362
16
17
  tests/test_workflow.py,sha256=TmNBxBqSW5owk_Nz9LLtHvqryVNsFPkf-M1G_uFSsAM,3739
17
18
  vectara_agentic/__init__.py,sha256=2GLDS3U6KckK-dBRl9v_x1kSV507gEhjOfuMmmu0Qxg,850
18
- vectara_agentic/_callback.py,sha256=DMExGJPiZPowB0gL7Re_3406BHg75go1cgzetfGb-KQ,13074
19
+ vectara_agentic/_callback.py,sha256=c3848EMSpaQWXtuwdqRGbhgbZhiDwgGnemJkgm9yWAc,13238
19
20
  vectara_agentic/_observability.py,sha256=iZlByeQTyx6g3Y8aBYcdGcxdRkoYrfxHdcrTEKO26UE,4485
20
- vectara_agentic/_prompts.py,sha256=NbKloHQYc25IvtpxmPdRKHXIM-p-lAK-jyk41iafL60,10050
21
- vectara_agentic/_version.py,sha256=0nu9HU5L2IF3IL6m4qgh01FIE3SlzPwiUtSQI5-j0YI,66
22
- vectara_agentic/agent.py,sha256=M4hiHfrVBYIdknI5JMHezabF1QcM1jfHSCx2VXoVTQ4,55912
21
+ vectara_agentic/_prompts.py,sha256=7PY1XBqFM5JGXSw5JzhE2QJylLawIjFv3xAEJ2AA0LQ,10550
22
+ vectara_agentic/_version.py,sha256=_2691WFCS6Oetu4wBzc3283NHXo4gUI7OxlOWeNJwjI,65
23
+ vectara_agentic/agent.py,sha256=S1Rek9Dp9HabDQPqdQlkIMUR701-XTonyoXeCRE9WtA,58215
23
24
  vectara_agentic/agent_config.py,sha256=E-rtYMcpoGxnEAyy8231bizo2n0uGQ2qWxuSgTEfwdQ,4327
24
25
  vectara_agentic/agent_endpoint.py,sha256=PzIN7HhEHv8Mq_Zo5cZ2xYrgdv2AN6kx6dc_2AJq28I,7497
25
26
  vectara_agentic/db_tools.py,sha256=GUsQTZfRbT9F5K_e5HNaKXUkU6x8RErUyjDVKlZi1IA,11196
26
- vectara_agentic/llm_utils.py,sha256=oYm2S_xBCacN6GmFr_ASMIKEtRy2z2EQ_qDBfgSpiWE,7247
27
+ vectara_agentic/hhem.py,sha256=j4euBX24PSCQ8P_MhhsKKnm1kv6nHKAbduHsTwtQuR0,2774
28
+ vectara_agentic/llm_utils.py,sha256=g-8Ja4g8X67u02pi7mQrb3O1nRre9lgeC6gJqngl5ow,7668
27
29
  vectara_agentic/sub_query_workflow.py,sha256=JYwN0wK4QzHjTaFDsSCAQvMx9GD4g6CnqxZCnzi6xb4,13086
28
- vectara_agentic/tool_utils.py,sha256=FkwKY2IsMHXIb-uD-wef8vVB_eZKkReeb74CcXGo1cQ,19219
29
- vectara_agentic/tools.py,sha256=SMBQeNZxklEfcnFbrTxOxlC173gdgDAPxJ7BGf9K-PQ,34298
30
+ vectara_agentic/tool_utils.py,sha256=9xoqVPB97CIDXOxuFIw4yZ2RlXvdayCEGPUaUPC2Tbc,24168
31
+ vectara_agentic/tools.py,sha256=bj8Zn3Lv63vWxu7N6_kkvOk9Vr2ZtuiiBetXUCzsK0w,34860
30
32
  vectara_agentic/tools_catalog.py,sha256=cAN_kDOWZUoW4GNFwY5GdS6ImMUQNnF2sggx9OGK9Cg,4906
31
- vectara_agentic/types.py,sha256=HcS7vR8P2v2xQTlOc6ZFV2vvlr3OpzSNWhtcLMxqUZc,1792
33
+ vectara_agentic/types.py,sha256=3mrtshHiy-d5JHVxl-4tJk5DRspvYKwAYiI5LvKO1Bw,2226
32
34
  vectara_agentic/utils.py,sha256=R9HitEG5K3Q_p2M_teosT181OUxkhs1-hnj98qDYGbE,2545
33
- vectara_agentic-0.2.24.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
34
- vectara_agentic-0.2.24.dist-info/METADATA,sha256=l8iHPGRusQqBr0skx0j5DQ364CukPSdefsfZdVIqpcU,31127
35
- vectara_agentic-0.2.24.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
- vectara_agentic-0.2.24.dist-info/top_level.txt,sha256=Y7TQTFdOYGYodQRltUGRieZKIYuzeZj2kHqAUpfCUfg,22
37
- vectara_agentic-0.2.24.dist-info/RECORD,,
35
+ vectara_agentic-0.3.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
36
+ vectara_agentic-0.3.1.dist-info/METADATA,sha256=5QXewroE8dsANYXCoYr-MqAm0wlNhe205tVzWaCZnEw,32079
37
+ vectara_agentic-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
+ vectara_agentic-0.3.1.dist-info/top_level.txt,sha256=Y7TQTFdOYGYodQRltUGRieZKIYuzeZj2kHqAUpfCUfg,22
39
+ vectara_agentic-0.3.1.dist-info/RECORD,,