vectara-agentic 0.2.12__py3-none-any.whl → 0.2.14__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.

@@ -10,7 +10,8 @@ from pydantic import Field
10
10
 
11
11
  from .types import LLMRole
12
12
  from .agent_config import AgentConfig
13
- from .utils import get_llm, remove_self_from_signature
13
+ from .llm_utils import get_llm
14
+ from .utils import remove_self_from_signature
14
15
 
15
16
  req_session = requests.Session()
16
17
 
vectara_agentic/utils.py CHANGED
@@ -2,148 +2,11 @@
2
2
  Utilities for the Vectara agentic.
3
3
  """
4
4
 
5
- from typing import Tuple, Callable, Optional
6
- from functools import lru_cache
7
5
  from inspect import signature
8
6
  import json
9
7
  import asyncio
10
- import tiktoken
11
8
  import aiohttp
12
9
 
13
- from llama_index.core.llms import LLM
14
- from llama_index.llms.openai import OpenAI
15
- from llama_index.llms.anthropic import Anthropic
16
-
17
- from .types import LLMRole, AgentType, ModelProvider
18
- from .agent_config import AgentConfig
19
-
20
- provider_to_default_model_name = {
21
- ModelProvider.OPENAI: "gpt-4o",
22
- ModelProvider.ANTHROPIC: "claude-3-7-sonnet-20250219",
23
- ModelProvider.TOGETHER: "meta-llama/Llama-3.3-70B-Instruct-Turbo",
24
- ModelProvider.GROQ: "llama-3.3-70b-versatile",
25
- ModelProvider.FIREWORKS: "accounts/fireworks/models/firefunction-v2",
26
- ModelProvider.BEDROCK: "anthropic.claude-3-5-sonnet-20241022-v2:0",
27
- ModelProvider.COHERE: "command-r-plus",
28
- ModelProvider.GEMINI: "models/gemini-2.0-flash",
29
- }
30
-
31
- DEFAULT_MODEL_PROVIDER = ModelProvider.OPENAI
32
-
33
- @lru_cache(maxsize=None)
34
- def _get_llm_params_for_role(
35
- role: LLMRole,
36
- config: Optional[AgentConfig] = None
37
- ) -> Tuple[ModelProvider, str]:
38
- """
39
- Get the model provider and model name for the specified role.
40
-
41
- If config is None, a new AgentConfig() is instantiated using environment defaults.
42
- """
43
- config = config or AgentConfig() # fallback to default config
44
-
45
- if role == LLMRole.TOOL:
46
- model_provider = ModelProvider(config.tool_llm_provider)
47
- # If the user hasn’t explicitly set a tool_llm_model_name,
48
- # fallback to provider default from provider_to_default_model_name
49
- model_name = (
50
- config.tool_llm_model_name
51
- or provider_to_default_model_name.get(model_provider)
52
- )
53
- else:
54
- model_provider = ModelProvider(config.main_llm_provider)
55
- model_name = (
56
- config.main_llm_model_name
57
- or provider_to_default_model_name.get(model_provider)
58
- )
59
-
60
- # If the agent type is OpenAI, check that the main LLM provider is also OpenAI.
61
- if role == LLMRole.MAIN and config.agent_type == AgentType.OPENAI:
62
- if model_provider != ModelProvider.OPENAI:
63
- raise ValueError(
64
- "OpenAI agent requested but main model provider is not OpenAI."
65
- )
66
-
67
- return model_provider, model_name
68
-
69
- @lru_cache(maxsize=None)
70
- def get_tokenizer_for_model(
71
- role: LLMRole,
72
- config: Optional[AgentConfig] = None
73
- ) -> Optional[Callable]:
74
- """
75
- Get the tokenizer for the specified model, as determined by the role & config.
76
- """
77
- model_provider, model_name = _get_llm_params_for_role(role, config)
78
- if model_provider == ModelProvider.OPENAI:
79
- # This might raise an exception if the model_name is unknown to tiktoken
80
- return tiktoken.encoding_for_model(model_name).encode
81
- if model_provider == ModelProvider.ANTHROPIC:
82
- return Anthropic().tokenizer
83
- return None
84
-
85
-
86
- @lru_cache(maxsize=None)
87
- def get_llm(
88
- role: LLMRole,
89
- config: Optional[AgentConfig] = None
90
- ) -> LLM:
91
- """
92
- Get the LLM for the specified role, using the provided config
93
- or a default if none is provided.
94
- """
95
- max_tokens = 8192
96
- model_provider, model_name = _get_llm_params_for_role(role, config)
97
- if model_provider == ModelProvider.OPENAI:
98
- llm = OpenAI(model=model_name, temperature=0,
99
- is_function_calling_model=True,
100
- strict=True,
101
- max_tokens=max_tokens
102
- )
103
- elif model_provider == ModelProvider.ANTHROPIC:
104
- llm = Anthropic(
105
- model=model_name, temperature=0,
106
- max_tokens=max_tokens,
107
- )
108
- elif model_provider == ModelProvider.GEMINI:
109
- from llama_index.llms.gemini import Gemini
110
- llm = Gemini(
111
- model=model_name, temperature=0,
112
- is_function_calling_model=True,
113
- allow_parallel_tool_calls=True,
114
- max_tokens=max_tokens,
115
- )
116
- elif model_provider == ModelProvider.TOGETHER:
117
- from llama_index.llms.together import TogetherLLM
118
- llm = TogetherLLM(
119
- model=model_name, temperature=0,
120
- is_function_calling_model=True,
121
- max_tokens=max_tokens
122
- )
123
- elif model_provider == ModelProvider.GROQ:
124
- from llama_index.llms.groq import Groq
125
- llm = Groq(
126
- model=model_name, temperature=0,
127
- is_function_calling_model=True,
128
- max_tokens=max_tokens
129
- )
130
- elif model_provider == ModelProvider.FIREWORKS:
131
- from llama_index.llms.fireworks import Fireworks
132
- llm = Fireworks(model=model_name, temperature=0, max_tokens=max_tokens)
133
- elif model_provider == ModelProvider.BEDROCK:
134
- from llama_index.llms.bedrock import Bedrock
135
- llm = Bedrock(model=model_name, temperature=0, max_tokens=max_tokens)
136
- elif model_provider == ModelProvider.COHERE:
137
- from llama_index.llms.cohere import Cohere
138
- llm = Cohere(model=model_name, temperature=0, max_tokens=max_tokens)
139
- elif model_provider == ModelProvider.PRIVATE:
140
- from llama_index.llms.openai_like import OpenAILike
141
- llm = OpenAILike(model=model_name, temperature=0, is_function_calling_model=True,is_chat_model=True,
142
- api_base=config.private_llm_api_base, api_key=config.private_llm_api_key,
143
- max_tokens=max_tokens)
144
- else:
145
- raise ValueError(f"Unknown LLM provider: {model_provider}")
146
- return llm
147
10
 
148
11
  def is_float(value: str) -> bool:
149
12
  """Check if a string can be converted to a float."""
@@ -153,6 +16,7 @@ def is_float(value: str) -> bool:
153
16
  except ValueError:
154
17
  return False
155
18
 
19
+
156
20
  def remove_self_from_signature(func):
157
21
  """Decorator to remove 'self' from a method's signature for introspection."""
158
22
  sig = signature(func)
@@ -164,21 +28,26 @@ def remove_self_from_signature(func):
164
28
  func.__signature__ = new_sig
165
29
  return func
166
30
 
167
- async def summarize_vectara_document(corpus_key: str, vectara_api_key: str, doc_id: str) -> str:
31
+
32
+ async def summarize_vectara_document(
33
+ llm_name: str, corpus_key: str, api_key: str, doc_id: str
34
+ ) -> str:
168
35
  """
169
36
  Summarize a document in a Vectara corpus using the Vectara API.
170
37
  """
171
38
  url = f"https://api.vectara.io/v2/corpora/{corpus_key}/documents/{doc_id}/summarize"
172
39
 
173
- payload = json.dumps({
174
- "llm_name": "gpt-4o",
175
- "model_parameters": {},
176
- "stream_response": False
177
- })
40
+ payload = json.dumps(
41
+ {
42
+ "llm_name": llm_name,
43
+ "model_parameters": {"temperature": 0.0},
44
+ "stream_response": False,
45
+ }
46
+ )
178
47
  headers = {
179
- 'Content-Type': 'application/json',
180
- 'Accept': 'application/json',
181
- 'x-api-key': vectara_api_key
48
+ "Content-Type": "application/json",
49
+ "Accept": "application/json",
50
+ "x-api-key": api_key,
182
51
  }
183
52
  timeout = aiohttp.ClientTimeout(total=60)
184
53
  async with aiohttp.ClientSession(timeout=timeout) as session:
@@ -193,18 +62,24 @@ async def summarize_vectara_document(corpus_key: str, vectara_api_key: str, doc_
193
62
  return data["summary"]
194
63
  return json.loads(response.text)["summary"]
195
64
 
65
+
196
66
  async def summarize_documents(
197
- vectara_corpus_key: str,
198
- vectara_api_key: str,
199
- doc_ids: list[str]
67
+ corpus_key: str,
68
+ api_key: str,
69
+ doc_ids: list[str],
70
+ llm_name: str = "gpt-4o",
200
71
  ) -> dict[str, str]:
201
72
  """
202
73
  Summarize multiple documents in a Vectara corpus using the Vectara API.
203
74
  """
204
75
  if not doc_ids:
205
76
  return {}
77
+ if llm_name is None:
78
+ llm_name = "gpt-4o"
206
79
  tasks = [
207
- summarize_vectara_document(vectara_corpus_key, vectara_api_key, doc_id)
80
+ summarize_vectara_document(
81
+ corpus_key=corpus_key, api_key=api_key, llm_name=llm_name, doc_id=doc_id
82
+ )
208
83
  for doc_id in doc_ids
209
84
  ]
210
85
  summaries = await asyncio.gather(*tasks, return_exceptions=True)