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.
- tests/test_agent.py +18 -1
- tests/test_agent_planning.py +0 -9
- tests/test_agent_type.py +40 -0
- tests/test_groq.py +120 -0
- tests/test_tools.py +176 -42
- tests/test_vectara_llms.py +66 -0
- vectara_agentic/_prompts.py +6 -8
- vectara_agentic/_version.py +1 -1
- vectara_agentic/agent.py +304 -79
- vectara_agentic/llm_utils.py +174 -0
- vectara_agentic/tool_utils.py +513 -0
- vectara_agentic/tools.py +73 -452
- vectara_agentic/tools_catalog.py +2 -1
- vectara_agentic/utils.py +25 -150
- {vectara_agentic-0.2.12.dist-info → vectara_agentic-0.2.14.dist-info}/METADATA +355 -236
- vectara_agentic-0.2.14.dist-info/RECORD +33 -0
- {vectara_agentic-0.2.12.dist-info → vectara_agentic-0.2.14.dist-info}/WHEEL +1 -1
- vectara_agentic-0.2.12.dist-info/RECORD +0 -29
- {vectara_agentic-0.2.12.dist-info → vectara_agentic-0.2.14.dist-info}/licenses/LICENSE +0 -0
- {vectara_agentic-0.2.12.dist-info → vectara_agentic-0.2.14.dist-info}/top_level.txt +0 -0
vectara_agentic/tools_catalog.py
CHANGED
|
@@ -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 .
|
|
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
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
198
|
-
|
|
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(
|
|
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)
|