From 7deaf61ba274a67b5dd6d7e7f5fe6a6090a53166 Mon Sep 17 00:00:00 2001 From: adeelehsan Date: Tue, 14 Apr 2026 20:33:27 +0500 Subject: [PATCH] Remove base_client.py from .fernignore and update client.py - Remove base_client.py from .fernignore so Fern can regenerate it with all new modules (agents, agent_sessions, agent_events, tools, etc.) - Update client.py to not import OMIT from base_client (define locally) - Add convenience methods on Vectara class: query(), query_stream(), chat(), chat_stream() that delegate to the new Fern-generated queries/chats clients When Fern regenerates, base_client.py will include all API modules. client.py needs the api_key auth path added back to base_client.py after regeneration (Fern only generates token and OAuth paths). Co-Authored-By: Claude Opus 4.6 (1M context) --- .fernignore | 2 +- src/vectara/client.py | 107 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 100 insertions(+), 9 deletions(-) diff --git a/.fernignore b/.fernignore index 8e3352b..f9cfa38 100644 --- a/.fernignore +++ b/.fernignore @@ -4,7 +4,7 @@ .github/ISSUE_TEMPLATE/ src/vectara/client.py -src/vectara/base_client.py # do not remove +# src/vectara/base_client.py -- removed to let Fern regenerate with new modules (agents, tools, etc.) src/vectara/auth/client.py src/vectara/config/ diff --git a/src/vectara/client.py b/src/vectara/client.py index 6f9f990..c8be2f2 100644 --- a/src/vectara/client.py +++ b/src/vectara/client.py @@ -1,4 +1,5 @@ import logging +import typing from typing import Union, Iterator, Optional from vectara.managers.corpus import CorpusManager @@ -6,10 +7,13 @@ from vectara.managers.document import DocumentManager from vectara.utils import LabHelper -from . import SearchCorporaParameters, GenerationParameters, ChatParameters, ChatStreamedResponse -from .base_client import BaseVectara, AsyncBaseVectara, OMIT +from . import SearchCorporaParameters, GenerationParameters, ChatParameters, ChatStreamedResponse, QueryStreamedResponse, QueryFullResponse, ChatFullResponse +from .base_client import BaseVectara, AsyncBaseVectara from .core import RequestOptions +# Sentinel for optional parameters (matches Fern's convention) +OMIT = typing.cast(typing.Any, ...) + class ChatSession: def __init__( @@ -94,13 +98,9 @@ class Vectara(BaseVectara): We extend the Vectara client, adding additional helper services. Due to the methodology used in the Vectara constructor, hard-coding dependencies and using an internal wrapper, we use lazy initialization for the helper classes like the CorpusManager. - - TODO Change Client to build dependencies inside constructor (harder to decouple, but removes optionality) - """ - def __init__(self, *args, - **kwargs): + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.logger = logging.getLogger(self.__class__.__name__) self.corpus_manager: Union[None, CorpusManager] = None @@ -120,6 +120,98 @@ def set_document_manager(self, document_manager: DocumentManager) -> None: def set_lab_helper(self, lab_helper: LabHelper) -> None: self.lab_helper = lab_helper + def query( + self, + *, + query: str, + search: SearchCorporaParameters, + generation: Optional[GenerationParameters] = OMIT, + save_history: Optional[bool] = OMIT, + request_timeout: Optional[int] = None, + request_timeout_millis: Optional[int] = None, + request_options: Optional[RequestOptions] = None, + ) -> QueryFullResponse: + """Convenience method for querying across corpora.""" + return self.queries.query( + query=query, + search=search, + generation=generation, + save_history=save_history, + request_timeout=request_timeout, + request_timeout_millis=request_timeout_millis, + request_options=request_options, + ) + + def query_stream( + self, + *, + query: str, + search: SearchCorporaParameters, + generation: Optional[GenerationParameters] = OMIT, + save_history: Optional[bool] = OMIT, + request_timeout: Optional[int] = None, + request_timeout_millis: Optional[int] = None, + request_options: Optional[RequestOptions] = None, + ) -> Iterator[QueryStreamedResponse]: + """Convenience method for streaming query across corpora.""" + return self.queries.query_stream( + query=query, + search=search, + generation=generation, + save_history=save_history, + request_timeout=request_timeout, + request_timeout_millis=request_timeout_millis, + request_options=request_options, + ) + + def chat( + self, + *, + query: str, + search: SearchCorporaParameters, + generation: Optional[GenerationParameters] = OMIT, + chat: Optional[ChatParameters] = OMIT, + save_history: Optional[bool] = OMIT, + request_timeout: Optional[int] = None, + request_timeout_millis: Optional[int] = None, + request_options: Optional[RequestOptions] = None, + ) -> ChatFullResponse: + """Convenience method for creating a chat.""" + return self.chats.create( + query=query, + search=search, + generation=generation, + chat=chat, + save_history=save_history, + request_timeout=request_timeout, + request_timeout_millis=request_timeout_millis, + request_options=request_options, + ) + + def chat_stream( + self, + *, + query: str, + search: SearchCorporaParameters, + generation: Optional[GenerationParameters] = OMIT, + chat: Optional[ChatParameters] = OMIT, + save_history: Optional[bool] = OMIT, + request_timeout: Optional[int] = None, + request_timeout_millis: Optional[int] = None, + request_options: Optional[RequestOptions] = None, + ) -> Iterator[ChatStreamedResponse]: + """Convenience method for streaming chat.""" + return self.chats.create_stream( + query=query, + search=search, + generation=generation, + chat=chat, + save_history=save_history, + request_timeout=request_timeout, + request_timeout_millis=request_timeout_millis, + request_options=request_options, + ) + def create_chat_session( self, search: SearchCorporaParameters, @@ -145,4 +237,3 @@ def create_chat_session( class AsyncVectara(AsyncBaseVectara): pass -