From b3974eb960b1e2455b1af3f6ae5b4c7c5fd70e73 Mon Sep 17 00:00:00 2001 From: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Date: Fri, 7 Feb 2025 08:28:41 -0300 Subject: [PATCH 01/36] Update return type so it works with python 3.8 (#390) --- aixplain/v2/benchmark.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aixplain/v2/benchmark.py b/aixplain/v2/benchmark.py index 66270a0d..b7073d86 100644 --- a/aixplain/v2/benchmark.py +++ b/aixplain/v2/benchmark.py @@ -53,7 +53,7 @@ def create(cls, *args, **kwargs: Unpack[BenchmarkCreateParams]) -> "Benchmark": return BenchmarkFactory.create(*args, **kwargs) @classmethod - def list_normalization_options(cls, metric: "Metric", model: "Model") -> list[str]: + def list_normalization_options(cls, metric: "Metric", model: "Model") -> List[str]: """ List the normalization options for a metric and a model. @@ -62,7 +62,7 @@ def list_normalization_options(cls, metric: "Metric", model: "Model") -> list[st model: "Model": The model. Returns: - list[str]: The list of normalization options. + List[str]: The list of normalization options. """ from aixplain.factories import BenchmarkFactory From 5096031902cb82ecb14875835c4dcf595f2609da Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Fri, 7 Feb 2025 18:11:30 +0100 Subject: [PATCH 02/36] ENG-1557: model params are now available for designer assets (#387) --- aixplain/modules/pipeline/designer/nodes.py | 67 ++++++++++++++------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/aixplain/modules/pipeline/designer/nodes.py b/aixplain/modules/pipeline/designer/nodes.py index 35afe4b9..9c9467aa 100644 --- a/aixplain/modules/pipeline/designer/nodes.py +++ b/aixplain/modules/pipeline/designer/nodes.py @@ -79,17 +79,13 @@ def populate_asset(self): if self.function: if self.asset.function.value != self.function: - raise ValueError(f"Function {self.function} is not supported by asset {self.asset_id}") - - # Despite function field has been set, we should still dynamically - # populate parameters for Utility functions - if self.function == Function.UTILITIES: - self._auto_populate_params() - + raise ValueError( + f"Function {self.function} is not supported by asset {self.asset_id}" + ) else: self.function = self.asset.function.value - self._auto_populate_params() + self._auto_populate_params() self._auto_set_params() def _auto_populate_params(self): @@ -108,18 +104,29 @@ def _auto_populate_params(self): ) else: for item in spec["params"]: - self.inputs.create_param( + if item["code"] not in self.inputs: + self.inputs.create_param( + code=item["code"], + data_type=item["dataType"], + is_required=item["required"], + ) + + if self.asset.model_params: + for code, param in self.asset.model_params.parameters.items(): + if code not in self.inputs: + self.inputs.create_param( + code=code, + is_required=param.required, + value=param.value, + ) + + for item in spec["output"]: + if item["code"] not in self.outputs: + self.outputs.create_param( code=item["code"], data_type=item["dataType"], - is_required=item["required"], ) - for item in spec["output"]: - self.outputs.create_param( - code=item["code"], - data_type=item["dataType"], - ) - def _auto_set_params(self): for k, v in self.asset.additional_info["parameters"].items(): if k not in self.inputs: @@ -236,7 +243,12 @@ class Output(Node[OutputInputs, OutputOutputs]): inputs_class: Type[TI] = OutputInputs outputs_class: Type[TO] = OutputOutputs - def __init__(self, data_types: Optional[List[DataType]] = None, pipeline: "DesignerPipeline" = None, **kwargs): + def __init__( + self, + data_types: Optional[List[DataType]] = None, + pipeline: "DesignerPipeline" = None, + **kwargs + ): super().__init__(pipeline=pipeline, **kwargs) self.data_types = data_types or [] @@ -297,7 +309,14 @@ class Route(Serializable): operation: Operation type: RouteType - def __init__(self, value: DataType, path: List[Union[Node, int]], operation: Operation, type: RouteType, **kwargs): + def __init__( + self, + value: DataType, + path: List[Union[Node, int]], + operation: Operation, + type: RouteType, + **kwargs + ): """ Post init method to convert the nodes to node numbers if they are nodes. @@ -312,7 +331,9 @@ def __init__(self, value: DataType, path: List[Union[Node, int]], operation: Ope # raise ValueError("Path is not valid, should be a list of nodes") # convert nodes to node numbers if they are nodes - self.path = [node.number if isinstance(node, Node) else node for node in self.path] + self.path = [ + node.number if isinstance(node, Node) else node for node in self.path + ] def serialize(self) -> dict: return { @@ -350,7 +371,9 @@ class Router(Node[RouterInputs, RouterOutputs], LinkableMixin): inputs_class: Type[TI] = RouterInputs outputs_class: Type[TO] = RouterOutputs - def __init__(self, routes: List[Route], pipeline: "DesignerPipeline" = None, **kwargs): + def __init__( + self, routes: List[Route], pipeline: "DesignerPipeline" = None, **kwargs + ): super().__init__(pipeline=pipeline, **kwargs) self.routes = routes @@ -389,7 +412,9 @@ class Decision(Node[DecisionInputs, DecisionOutputs], LinkableMixin): inputs_class: Type[TI] = DecisionInputs outputs_class: Type[TO] = DecisionOutputs - def __init__(self, routes: List[Route], pipeline: "DesignerPipeline" = None, **kwargs): + def __init__( + self, routes: List[Route], pipeline: "DesignerPipeline" = None, **kwargs + ): super().__init__(pipeline=pipeline, **kwargs) self.routes = routes From cb7f809b30fb00d4a09737be793709b928d3c9bd Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Fri, 7 Feb 2025 18:15:38 +0100 Subject: [PATCH 03/36] ENG-1559: Fixed designer tests (#388) --- tests/functional/pipelines/data/script.py | 50 ++++----------------- tests/functional/pipelines/designer_test.py | 5 --- 2 files changed, 9 insertions(+), 46 deletions(-) diff --git a/tests/functional/pipelines/data/script.py b/tests/functional/pipelines/data/script.py index 3403fa61..c88a188d 100644 --- a/tests/functional/pipelines/data/script.py +++ b/tests/functional/pipelines/data/script.py @@ -1,51 +1,19 @@ -__author__ = "thiagocastroferreira" - -import argparse -import json - - -def main(transcripts, speakers, output_file): - # get the speech recognition json - transcripts = json.load(open(transcripts)) - # get the speaker diarization json - speakers = json.load(open(speakers)) - +def main(speakers): # build the response response = [] - for i, transcript in enumerate(transcripts): - merge = { - "transcript": transcript["attributes"]["data"], - "speaker": speakers[i]["attributes"]["data"]["data"], - } + for i, speaker in enumerate(speakers): + print(f"Processing speaker at index={i}") + data = speaker["data"] + data_modified = f"SCRIPT MODIFIED: {data}" response.append( { "index": i, "success": True, "input_type": "text", - "is_url": transcript["is_url"], + "is_url": False, "details": {}, - "input_segment_info": transcript["input_segment_info"], - "attributes": {"data": merge, "input": merge}, + "data": data_modified, + "input": data_modified, } ) - - # save the response, based on the intermediate representation format, in the output_file - with open(output_file, "w") as f: - json.dump(response, f) - - -if __name__ == "__main__": - # Create the parser - parser = argparse.ArgumentParser() - # Add arguments - parser.add_argument("--transcripts", type=str, required=True) - parser.add_argument("--speakers", type=str, required=True) - parser.add_argument("--output_file", type=str, required=True) - # Parse the argument - args = parser.parse_args() - - transcripts = args.transcripts - speakers = args.speakers - output_file = args.output_file - - main(transcripts, speakers, output_file) + return response diff --git a/tests/functional/pipelines/designer_test.py b/tests/functional/pipelines/designer_test.py index cc8d4437..0a955651 100644 --- a/tests/functional/pipelines/designer_test.py +++ b/tests/functional/pipelines/designer_test.py @@ -131,7 +131,6 @@ def test_routing_pipeline(pipeline): def test_scripting_pipeline(pipeline): SPEAKER_DIARIZATION_AUDIO_ASSET = "62fab6ecb39cca09ca5bc365" - SPEECH_RECOGNITION_ASSET = "621cf3fa6442ef511d2830af" input = pipeline.input() @@ -139,17 +138,13 @@ def test_scripting_pipeline(pipeline): asset_id=SPEAKER_DIARIZATION_AUDIO_ASSET ) - speech_recognition = pipeline.speech_recognition(asset_id=SPEECH_RECOGNITION_ASSET) - script = pipeline.script(script_path="tests/functional/pipelines/data/script.py") script.inputs.create_param(code="transcripts", data_type=DataType.TEXT) script.inputs.create_param(code="speakers", data_type=DataType.LABEL) script.outputs.create_param(code="data", data_type=DataType.TEXT) input.outputs.input.link(segmentor.inputs.audio) - segmentor.outputs.audio.link(speech_recognition.inputs.source_audio) segmentor.outputs.data.link(script.inputs.speakers) - speech_recognition.outputs.data.link(script.inputs.transcripts) script.use_output("data") From 1870dea480bed23947a7bd6a6fe0fee46f27d3dc Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Mon, 10 Feb 2025 20:51:35 +0400 Subject: [PATCH 04/36] Use input api key to list models when given (#395) --- aixplain/factories/model_factory/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aixplain/factories/model_factory/utils.py b/aixplain/factories/model_factory/utils.py index aeb10a8a..468a0eb9 100644 --- a/aixplain/factories/model_factory/utils.py +++ b/aixplain/factories/model_factory/utils.py @@ -167,8 +167,8 @@ def get_model_from_ids(model_ids: List[str], api_key: Optional[str] = None) -> L resp = None try: url = urljoin(config.BACKEND_URL, f"sdk/models?ids={','.join(model_ids)}") - - headers = {"Authorization": f"Token {config.TEAM_API_KEY}", "Content-Type": "application/json"} + api_key = config.TEAM_API_KEY if api_key is None else api_key + headers = {"Authorization": f"Token {api_key}", "Content-Type": "application/json"} logging.info(f"Start service for GET Model - {url} - {headers}") r = _request_with_retry("get", url, headers=headers) resp = r.json() From 2b5c9ec337adc068df9d8a07a8cb3176a908d9a3 Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Mon, 10 Feb 2025 19:49:37 +0100 Subject: [PATCH 05/36] BUG-375 new functional test regarding ensuring failure (#396) --- tests/functional/pipelines/run_test.py | 42 +++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/tests/functional/pipelines/run_test.py b/tests/functional/pipelines/run_test.py index c5863ac2..8e7e47ff 100644 --- a/tests/functional/pipelines/run_test.py +++ b/tests/functional/pipelines/run_test.py @@ -54,7 +54,9 @@ def test_get_pipeline(PipelineFactory): def test_run_single_str(batchmode: bool, version: str): pipeline = PipelineFactory.list(query="SingleNodePipeline")["results"][0] - response = pipeline.run(data="Translate this thing", batch_mode=batchmode, **{"version": version}) + response = pipeline.run( + data="Translate this thing", batch_mode=batchmode, **{"version": version} + ) assert response["status"] == "SUCCESS" @@ -178,7 +180,9 @@ def test_run_multipipe_with_datasets(batchmode: bool, version: str, PipelineFact @pytest.mark.parametrize("version", ["2.0", "3.0"]) @pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) def test_run_segment_reconstruct(version: str, PipelineFactory): - pipeline = PipelineFactory.list(query="Segmentation/Reconstruction Functional Test - DO NOT DELETE")["results"][0] + pipeline = PipelineFactory.list( + query="Segmentation/Reconstruction Functional Test - DO NOT DELETE" + )["results"][0] response = pipeline.run( "https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav", **{"version": version}, @@ -197,7 +201,9 @@ def test_run_translation_metric(version: str, PipelineFactory): reference_id = dataset.target_data["pt"][0].id - pipeline = PipelineFactory.list(query="Translation Metric Functional Test - DO NOT DELETE")["results"][0] + pipeline = PipelineFactory.list( + query="Translation Metric Functional Test - DO NOT DELETE" + )["results"][0] response = pipeline.run( data={"TextInput": reference_id, "ReferenceInput": reference_id}, data_asset={"TextInput": data_asset_id, "ReferenceInput": data_asset_id}, @@ -213,7 +219,9 @@ def test_run_translation_metric(version: str, PipelineFactory): @pytest.mark.parametrize("version", ["2.0", "3.0"]) @pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) def test_run_metric(version: str, PipelineFactory): - pipeline = PipelineFactory.list(query="ASR Metric Functional Test - DO NOT DELETE")["results"][0] + pipeline = PipelineFactory.list(query="ASR Metric Functional Test - DO NOT DELETE")[ + "results" + ][0] response = pipeline.run( { "AudioInput": "https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav", @@ -283,7 +291,9 @@ def test_run_decision(input_data: str, output_data: str, version: str, PipelineF @pytest.mark.parametrize("version", ["3.0"]) @pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) def test_run_script(version: str, PipelineFactory): - pipeline = PipelineFactory.list(query="Script Functional Test - DO NOT DELETE")["results"][0] + pipeline = PipelineFactory.list(query="Script Functional Test - DO NOT DELETE")[ + "results" + ][0] response = pipeline.run( "https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav", **{"version": version}, @@ -297,7 +307,9 @@ def test_run_script(version: str, PipelineFactory): @pytest.mark.parametrize("version", ["2.0", "3.0"]) @pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) def test_run_text_reconstruction(version: str, PipelineFactory): - pipeline = PipelineFactory.list(query="Text Reconstruction - DO NOT DELETE")["results"][0] + pipeline = PipelineFactory.list(query="Text Reconstruction - DO NOT DELETE")[ + "results" + ][0] response = pipeline.run("Segment A\nSegment B\nSegment C", **{"version": version}) assert response["status"] == "SUCCESS" @@ -315,7 +327,9 @@ def test_run_text_reconstruction(version: str, PipelineFactory): @pytest.mark.parametrize("version", ["3.0"]) @pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) def test_run_diarization(version: str, PipelineFactory): - pipeline = PipelineFactory.list(query="Diarization ASR Functional Test - DO NOT DELETE")["results"][0] + pipeline = PipelineFactory.list( + query="Diarization ASR Functional Test - DO NOT DELETE" + )["results"][0] response = pipeline.run( "https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav", **{"version": version}, @@ -325,3 +339,17 @@ def test_run_diarization(version: str, PipelineFactory): for d in response["data"]: assert len(d["segments"]) > 0 assert d["segments"][0]["success"] is True + + +@pytest.mark.parametrize("version", ["3.0"]) +@pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) +def test_run_failure(version: str, PipelineFactory): + pipeline = PipelineFactory.list(query="Script Functional Test - DO NOT DELETE")[ + "results" + ][0] + response = pipeline.run( + "INCORRECT DATA", + **{"version": version}, + ) + + assert response["status"] == "ERROR" From 168f2f53e3e61f9f3e4835277bd131a2e58f8d34 Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Mon, 10 Feb 2025 23:16:14 +0400 Subject: [PATCH 06/36] Role 2 Instructions (#393) --- aixplain/factories/agent_factory/__init__.py | 14 ++++---- aixplain/factories/agent_factory/utils.py | 2 +- aixplain/modules/agent/__init__.py | 9 ++--- .../functional/agent/agent_functional_test.py | 14 ++++---- .../team_agent/team_agent_functional_test.py | 14 ++++---- tests/unit/agent/agent_test.py | 35 +++++++++++-------- tests/unit/team_agent_test.py | 8 ++--- 7 files changed, 52 insertions(+), 44 deletions(-) diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index 9076c0f4..1d75a2f8 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -47,7 +47,7 @@ def create( cls, name: Text, description: Text, - role: Optional[Text] = None, + instructions: Optional[Text] = None, llm_id: Text = "669a63646eb56306647e1091", tools: List[Union[Tool, Model]] = [], api_key: Text = config.TEAM_API_KEY, @@ -58,14 +58,14 @@ def create( """Create a new agent in the platform. Warning: - The 'role' parameter was recently added and serves the same purpose as 'description' did previously: set the role of the agent as a system prompt. + The 'instructions' parameter was recently added and serves the same purpose as 'description' did previously: set the role of the agent as a system prompt. The 'description' parameter is still required and should be used to set a short summary of the agent's purpose. - For the next releases, the 'role' parameter will be required. + For the next releases, the 'instructions' parameter will be required. Args: name (Text): name of the agent description (Text): description of the agent role. - role (Text): role of the agent. + instructions (Text): role of the agent. llm_id (Text, optional): aiXplain ID of the large language model to be used as agent. Defaults to "669a63646eb56306647e1091" (GPT-4o mini). tools (List[Union[Tool, Model]], optional): list of tool for the agent. Defaults to []. api_key (Text, optional): team/user API key. Defaults to config.TEAM_API_KEY. @@ -76,9 +76,9 @@ def create( Agent: created Agent """ warnings.warn( - "The 'role' parameter was recently added and serves the same purpose as 'description' did previously: set the role of the agent as a system prompt. " + "The 'instructions' parameter was recently added and serves the same purpose as 'description' did previously: set the role of the agent as a system prompt. " "The 'description' parameter is still required and should be used to set a short summary of the agent's purpose. " - "For the next releases, the 'role' parameter will be required.", + "For the next releases, the 'instructions' parameter will be required.", UserWarning, ) from aixplain.factories.agent_factory.utils import build_agent @@ -113,7 +113,7 @@ def create( for tool in tools ], "description": description, - "role": role or description, + "role": instructions or description, "supplier": supplier, "version": version, "llmId": llm_id, diff --git a/aixplain/factories/agent_factory/utils.py b/aixplain/factories/agent_factory/utils.py index 271259a6..7efebc56 100644 --- a/aixplain/factories/agent_factory/utils.py +++ b/aixplain/factories/agent_factory/utils.py @@ -54,7 +54,7 @@ def build_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> Agent: name=payload.get("name", ""), tools=tools, description=payload.get("description", ""), - role=payload.get("role", ""), + instructions=payload.get("role", ""), supplier=payload.get("teamId", None), version=payload.get("version", None), cost=payload.get("cost", None), diff --git a/aixplain/modules/agent/__init__.py b/aixplain/modules/agent/__init__.py index 15ace1e5..83844c3c 100644 --- a/aixplain/modules/agent/__init__.py +++ b/aixplain/modules/agent/__init__.py @@ -53,6 +53,7 @@ class Agent(Model): name (Text): Name of the Agent tools (List[Union[Tool, Model]]): List of tools that the Agent uses. description (Text, optional): description of the Agent. Defaults to "". + instructions (Text): instructions of the Agent. llm_id (Text): large language model. Defaults to GPT-4o (6646261c6eb563165658bbb1). supplier (Text): Supplier of the Agent. version (Text): Version of the Agent. @@ -66,7 +67,7 @@ def __init__( id: Text, name: Text, description: Text, - role: Text, + instructions: Text, tools: List[Union[Tool, Model]] = [], llm_id: Text = "6646261c6eb563165658bbb1", api_key: Optional[Text] = config.TEAM_API_KEY, @@ -83,7 +84,7 @@ def __init__( id (Text): ID of the Agent name (Text): Name of the Agent description (Text): description of the Agent. - role (Text): role of the Agent. + instructions (Text): role of the Agent. tools (List[Union[Tool, Model]]): List of tools that the Agent uses. llm_id (Text, optional): large language model. Defaults to GPT-4o (6646261c6eb563165658bbb1). supplier (Text): Supplier of the Agent. @@ -93,7 +94,7 @@ def __init__( cost (Dict, optional): model price. Defaults to None. """ super().__init__(id, name, description, api_key, supplier, version, cost=cost) - self.role = role + self.instructions = instructions self.additional_info = additional_info self.tools = tools for i, _ in enumerate(tools): @@ -318,7 +319,7 @@ def to_dict(self) -> Dict: "name": self.name, "assets": [tool.to_dict() for tool in self.tools], "description": self.description, - "role": self.role, + "role": self.instructions, "supplier": self.supplier.value["code"] if isinstance(self.supplier, Supplier) else self.supplier, "version": self.version, "llmId": self.llm_id, diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index 27d46dd6..e2d5cc2c 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -79,7 +79,7 @@ def test_end2end(run_input_map, delete_agents_and_team_agents, AgentFactory): agent = AgentFactory.create( name=run_input_map["agent_name"], description=run_input_map["agent_name"], - role=run_input_map["agent_name"], + instructions=run_input_map["agent_name"], llm_id=run_input_map["llm_id"], tools=tools, ) @@ -112,7 +112,7 @@ def test_python_interpreter_tool(delete_agents_and_team_agents, AgentFactory): agent = AgentFactory.create( name="Python Developer", description="A Python developer agent. If you get an error from a tool, try to fix it.", - role="A Python developer agent. If you get an error from a tool, try to fix it.", + instructions="A Python developer agent. If you get an error from a tool, try to fix it.", tools=[tool], ) assert agent is not None @@ -140,7 +140,7 @@ def test_custom_code_tool(delete_agents_and_team_agents, AgentFactory): agent = AgentFactory.create( name="Add Numbers Agent", description="Add two numbers. Do not directly answer. Use the tool to add the numbers.", - role="Add two numbers. Do not directly answer. Use the tool to add the numbers.", + instructions="Add two numbers. Do not directly answer. Use the tool to add the numbers.", tools=[tool], ) assert agent is not None @@ -183,7 +183,7 @@ def test_update_draft_agent(run_input_map, delete_agents_and_team_agents, AgentF agent = AgentFactory.create( name=run_input_map["agent_name"], description=run_input_map["agent_name"], - role=run_input_map["agent_name"], + instructions=run_input_map["agent_name"], llm_id=run_input_map["llm_id"], tools=tools, ) @@ -205,7 +205,7 @@ def test_fail_non_existent_llm(delete_agents_and_team_agents, AgentFactory): AgentFactory.create( name="Test Agent", description="Test description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="non_existent_llm", tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], ) @@ -218,7 +218,7 @@ def test_delete_agent_in_use(delete_agents_and_team_agents, AgentFactory): agent = AgentFactory.create( name="Test Agent", description="Test description", - role="Test Agent Role", + instructions="Test Agent Role", tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], ) TeamAgentFactory.create( @@ -240,7 +240,7 @@ def test_update_tools_of_agent(run_input_map, delete_agents_and_team_agents, Age agent = AgentFactory.create( name=run_input_map["agent_name"], description=run_input_map["agent_name"], - role=run_input_map["agent_name"], + instructions=run_input_map["agent_name"], llm_id=run_input_map["llm_id"], ) assert agent is not None diff --git a/tests/functional/team_agent/team_agent_functional_test.py b/tests/functional/team_agent/team_agent_functional_test.py index 54e1ebda..1d2785f2 100644 --- a/tests/functional/team_agent/team_agent_functional_test.py +++ b/tests/functional/team_agent/team_agent_functional_test.py @@ -81,7 +81,7 @@ def test_end2end(run_input_map, delete_agents_and_team_agents, TeamAgentFactory) agent = AgentFactory.create( name=agent["agent_name"], description=agent["agent_name"], - role=agent["agent_name"], + instructions=agent["agent_name"], llm_id=agent["llm_id"], tools=tools, ) @@ -143,7 +143,7 @@ def test_draft_team_agent_update(run_input_map, TeamAgentFactory): agent = AgentFactory.create( name=agent["agent_name"], description=agent["agent_name"], - role=agent["agent_name"], + instructions=agent["agent_name"], llm_id=agent["llm_id"], tools=tools, ) @@ -171,7 +171,7 @@ def test_fail_non_existent_llm(TeamAgentFactory): AgentFactory.create( name="Test Agent", description="", - role="", + instructions="", llm_id="non_existent_llm", tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], ) @@ -203,7 +203,7 @@ def test_add_remove_agents_from_team_agent(run_input_map, delete_agents_and_team agent = AgentFactory.create( name=agent["agent_name"], description=agent["agent_name"], - role=agent["agent_name"], + instructions=agent["agent_name"], llm_id=agent["llm_id"], tools=tools, ) @@ -223,7 +223,7 @@ def test_add_remove_agents_from_team_agent(run_input_map, delete_agents_and_team new_agent = AgentFactory.create( name="New Agent", description="Agent added to team", - role="Agent added to team", + instructions="Agent added to team", llm_id=run_input_map["llm_id"], ) team_agent.agents.append(new_agent) @@ -290,7 +290,7 @@ def test_team_agent_with_parameterized_agents(delete_agents_and_team_agents): search_agent = AgentFactory.create( name="Search Agent", description="This agent is used to search for information in the web.", - role="Agent that performs searches", + instructions="Agent that performs searches", llm_id="677c16166eb563bb611623c1", tools=[search_tool], ) @@ -307,7 +307,7 @@ def test_team_agent_with_parameterized_agents(delete_agents_and_team_agents): translation_agent = AgentFactory.create( name="Translation Agent", description="This agent is used to translate text from one language to another.", - role="Agent that performs translations", + instructions="Agent that performs translations", llm_id="677c16166eb563bb611623c1", tools=[translation_tool], ) diff --git a/tests/unit/agent/agent_test.py b/tests/unit/agent/agent_test.py index 65ad6a79..2685be77 100644 --- a/tests/unit/agent/agent_test.py +++ b/tests/unit/agent/agent_test.py @@ -86,7 +86,7 @@ def test_invalid_pipelinetool(): AgentFactory.create( name="Test", description="Test Description", - role="Test Role", + instructions="Test Role", tools=[PipelineTool(pipeline="309851793", description="Test")], llm_id="6646261c6eb563165658bbb1", ) @@ -101,13 +101,13 @@ def test_invalid_modeltool(): def test_invalid_llm_id(): with pytest.raises(Exception) as exc_info: - AgentFactory.create(name="Test", description="", role="", tools=[], llm_id="123") + AgentFactory.create(name="Test", description="", instructions="", tools=[], llm_id="123") assert str(exc_info.value) == "Large Language Model with ID '123' not found." def test_invalid_agent_name(): with pytest.raises(Exception) as exc_info: - AgentFactory.create(name="[Test]", description="", role="", tools=[], llm_id="6646261c6eb563165658bbb1") + AgentFactory.create(name="[Test]", description="", instructions="", tools=[], llm_id="6646261c6eb563165658bbb1") assert ( str(exc_info.value) == "Agent Creation Error: Agent name contains invalid characters. Only alphanumeric characters, spaces, hyphens, and brackets are allowed." @@ -188,7 +188,7 @@ def test_create_agent(mock_model_factory_get): agent = AgentFactory.create( name="Test Agent(-)", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[ AgentFactory.create_model_tool( @@ -203,7 +203,7 @@ def test_create_agent(mock_model_factory_get): assert agent.name == ref_response["name"] assert agent.description == ref_response["description"] - assert agent.role == ref_response["role"] + assert agent.instructions == ref_response["role"] assert agent.llm_id == ref_response["llmId"] assert agent.tools[0].function.value == ref_response["assets"][0]["function"] assert agent.tools[0].description == ref_response["assets"][0]["description"] @@ -221,7 +221,7 @@ def test_to_dict(): id="", name="Test Agent(-)", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[AgentFactory.create_model_tool(function="text-generation")], api_key="test_api_key", @@ -254,7 +254,7 @@ def test_update_success(mock_model_factory_get): id="123", name="Test Agent(-)", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[AgentFactory.create_model_tool(function="text-generation")], ) @@ -307,7 +307,7 @@ def test_update_success(mock_model_factory_get): assert agent.id == ref_response["id"] assert agent.name == ref_response["name"] assert agent.description == ref_response["description"] - assert agent.role == ref_response["role"] + assert agent.instructions == ref_response["role"] assert agent.llm_id == ref_response["llmId"] assert agent.tools[0].function.value == ref_response["assets"][0]["function"] @@ -327,7 +327,7 @@ def test_save_success(mock_model_factory_get): id="123", name="Test Agent(-)", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[AgentFactory.create_model_tool(function="text-generation")], ) @@ -385,7 +385,7 @@ def test_save_success(mock_model_factory_get): assert agent.id == ref_response["id"] assert agent.name == ref_response["name"] assert agent.description == ref_response["description"] - assert agent.role == ref_response["role"] + assert agent.instructions == ref_response["role"] assert agent.llm_id == ref_response["llmId"] assert agent.tools[0].function.value == ref_response["assets"][0]["function"] @@ -442,7 +442,7 @@ def test_agent_api_key_propagation(): id="123", name="Test Agent", description="Test Description", - role="Test Agent Role", + instructions="Test Agent Role", tools=[tool], api_key=custom_api_key, ) @@ -456,7 +456,7 @@ def test_agent_api_key_propagation(): def test_agent_default_api_key(): """Test that the default api_key is used when none is provided""" tool = AgentFactory.create_model_tool(function="text-generation") - agent = Agent(id="123", name="Test Agent", description="Test Description", role="Test Agent Role", tools=[tool]) + agent = Agent(id="123", name="Test Agent", description="Test Description", instructions="Test Agent Role", tools=[tool]) # Check that the agent has the default api_key assert agent.api_key == config.TEAM_API_KEY @@ -476,7 +476,12 @@ def test_agent_multiple_tools_api_key(): ] agent = Agent( - id="123", name="Test Agent", description="Test Description", role="Test Agent Role", tools=tools, api_key=custom_api_key + id="123", + name="Test Agent", + description="Test Description", + instructions="Test Agent Role", + tools=tools, + api_key=custom_api_key, ) # Check that all tools received the agent's api_key @@ -487,7 +492,9 @@ def test_agent_multiple_tools_api_key(): def test_agent_api_key_in_requests(): """Test that the api_key is properly used in API requests""" custom_api_key = "custom_test_key" - agent = Agent(id="123", name="Test Agent", description="Test Description", role="Test Agent Role", api_key=custom_api_key) + agent = Agent( + id="123", name="Test Agent", description="Test Description", instructions="Test Agent Role", api_key=custom_api_key + ) with requests_mock.Mocker() as mock: url = agent.url diff --git a/tests/unit/team_agent_test.py b/tests/unit/team_agent_test.py index c6c44958..5f54e1c3 100644 --- a/tests/unit/team_agent_test.py +++ b/tests/unit/team_agent_test.py @@ -82,7 +82,7 @@ def test_to_dict(): id="", name="Test Agent(-)", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[ModelTool(function="text-generation")], ) @@ -160,7 +160,7 @@ def test_create_team_agent(mock_model_factory_get): agent = AgentFactory.create( name="Test Agent(-)", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[ModelTool(model="6646261c6eb563165658bbb1")], ) @@ -234,7 +234,7 @@ def test_build_team_agent(mocker): id="agent1", name="Test Agent 1", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[ModelTool(model="6646261c6eb563165658bbb1")], tasks=[ @@ -251,7 +251,7 @@ def test_build_team_agent(mocker): id="agent2", name="Test Agent 2", description="Test Agent Description", - role="Test Agent Role", + instructions="Test Agent Role", llm_id="6646261c6eb563165658bbb1", tools=[ModelTool(model="6646261c6eb563165658bbb1")], tasks=[ From f74a27f2d8cf1baadca22b5dc9764ecba033afba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Thu, 13 Feb 2025 12:53:32 +0300 Subject: [PATCH 07/36] added validate check when s3 link (#399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MErge to prod (#340) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Update Finetuner functional tests (#112) * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mik… * Test 2 Prod (#343) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Update Finetuner functional tests (#112) * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikel… * Merge to prod (#368) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Update Finetuner functional tests (#112) * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mik… * Merge to prod (#392) * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> * Merge to prod. (#130) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key pa… * Role to Instructions (#394) * Use user API key to list models when provided (#397) * BUG-380: api key list model id main (#398) * Use user API key to list models when provided * Role to Instructions * added validate check when s3 link * removed download method --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Signed-off-by: Michael Lam Signed-off-by: root Co-authored-by: ikxplain <88332269+ikxplain@users.noreply.github.com> Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira Co-authored-by: Shreyas Sharma <85180538+shreyasXplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira Co-authored-by: Hadi Nasrallah <87204330+hadi-aix@users.noreply.github.com> Co-authored-by: Lucas Pavanelli Co-authored-by: kadirpekel Co-authored-by: kadir pekel Co-authored-by: root Co-authored-by: Zaina Abu Shaban Co-authored-by: xainaz Co-authored-by: xainaz Co-authored-by: Lucas Pavanelli Co-authored-by: ikxplain Co-authored-by: OsujiCC --- aixplain/factories/file_factory.py | 9 +++++---- .../modules/agent/tool/custom_python_code_tool.py | 9 +++++++-- aixplain/modules/model/utility_model.py | 1 + aixplain/utils/file_utils.py | 14 ++++++++------ tests/functional/pipelines/run_test.py | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/aixplain/factories/file_factory.py b/aixplain/factories/file_factory.py index 1a29ac11..e37420cd 100644 --- a/aixplain/factories/file_factory.py +++ b/aixplain/factories/file_factory.py @@ -29,6 +29,7 @@ from aixplain.utils.file_utils import upload_data from typing import Any, Dict, Text, Union, Optional, List + MB_1 = 1048576 MB_25 = 26214400 MB_50 = 52428800 @@ -94,10 +95,10 @@ def check_storage_type(cls, input_link: Any) -> StorageType: if os.path.exists(input_link) is True and os.path.isfile(input_link) is True: return StorageType.FILE elif ( - input_link.startswith("s3://") - or input_link.startswith("http://") - or input_link.startswith("https://") - or validators.url(input_link) + input_link.startswith("s3://") # noqa + or input_link.startswith("http://") # noqa + or input_link.startswith("https://") # noqa + or validators.url(input_link) # noqa ): return StorageType.URL else: diff --git a/aixplain/modules/agent/tool/custom_python_code_tool.py b/aixplain/modules/agent/tool/custom_python_code_tool.py index c2c1024c..6e651eeb 100644 --- a/aixplain/modules/agent/tool/custom_python_code_tool.py +++ b/aixplain/modules/agent/tool/custom_python_code_tool.py @@ -23,6 +23,7 @@ from typing import Text, Union, Callable from aixplain.modules.agent.tool import Tool +import logging class CustomPythonCodeTool(Tool): @@ -42,9 +43,13 @@ def to_dict(self): } def validate(self): - from aixplain.modules.model.utils import parse_code + from aixplain.modules.model.utils import parse_code_decorated - self.code, _, description, name = parse_code(self.code) + if not str(self.code).startswith("s3://"): + self.code, _, description, name = parse_code_decorated(self.code) + else: + logging.info("Utility Model Already Exists, skipping code validation") + return # Set description from parsed code if not already set if not self.description or self.description.strip() == "": diff --git a/aixplain/modules/model/utility_model.py b/aixplain/modules/model/utility_model.py index 6a323f45..a7eab7a7 100644 --- a/aixplain/modules/model/utility_model.py +++ b/aixplain/modules/model/utility_model.py @@ -222,6 +222,7 @@ def update(self): DeprecationWarning, stacklevel=2, ) + self.validate() url = urljoin(self.backend_url, f"sdk/utilities/{self.id}") headers = {"x-api-key": f"{self.api_key}", "Content-Type": "application/json"} diff --git a/aixplain/utils/file_utils.py b/aixplain/utils/file_utils.py index d39ca2b9..b1e16cf0 100644 --- a/aixplain/utils/file_utils.py +++ b/aixplain/utils/file_utils.py @@ -146,14 +146,16 @@ def upload_data( bucket_name = re.findall(r"https://(.*?).s3.amazonaws.com", presigned_url)[0] s3_link = f"s3://{bucket_name}/{path}" return s3_link - except Exception as e: + except Exception: if nattempts > 0: return upload_data(file_name, content_type, content_encoding, nattempts - 1) else: raise Exception("File Uploading Error: Failure on Uploading to S3.") -def s3_to_csv(s3_url: Text, aws_credentials: Optional[Dict[Text, Text]] = {"AWS_ACCESS_KEY_ID": None, "AWS_SECRET_ACCESS_KEY": None}) -> Text: +def s3_to_csv( + s3_url: Text, aws_credentials: Optional[Dict[Text, Text]] = {"AWS_ACCESS_KEY_ID": None, "AWS_SECRET_ACCESS_KEY": None} +) -> Text: """Convert s3 url to a csv file and download the file in `download_path` Args: @@ -179,11 +181,11 @@ def s3_to_csv(s3_url: Text, aws_credentials: Optional[Dict[Text, Text]] = {"AWS_ aws_secret_access_key = aws_credentials.get("AWS_SECRET_ACCESS_KEY") or os.getenv("AWS_SECRET_ACCESS_KEY") s3 = boto3.client("s3", aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key) response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix) - except NoCredentialsError as e: + except NoCredentialsError: raise Exception( "to use the s3 bucket option you need to set the right AWS credentials [AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY]" ) - except Exception as e: + except Exception: raise Exception("the bucket you are trying to use does not exist") try: @@ -222,10 +224,10 @@ def s3_to_csv(s3_url: Text, aws_credentials: Optional[Dict[Text, Text]] = {"AWS_ main_file_name = Path(data[first_key][i]).stem for val in data.values(): if Path(val[i]).stem != main_file_name: - raise Exception(f"all the files in different directories should have the same prefix") + raise Exception("all the files in different directories should have the same prefix") elif prefix == "": - raise Exception(f"ERROR the files can't be at the root of the bucket ") + raise Exception("ERROR the files can't be at the root of the bucket ") else: data = {prefix: [f"s3://{bucket_name}/{file}" for file in files]} diff --git a/tests/functional/pipelines/run_test.py b/tests/functional/pipelines/run_test.py index 8e7e47ff..e5b8bcdf 100644 --- a/tests/functional/pipelines/run_test.py +++ b/tests/functional/pipelines/run_test.py @@ -340,7 +340,6 @@ def test_run_diarization(version: str, PipelineFactory): assert len(d["segments"]) > 0 assert d["segments"][0]["success"] is True - @pytest.mark.parametrize("version", ["3.0"]) @pytest.mark.parametrize("PipelineFactory", [PipelineFactory, v2.Pipeline]) def test_run_failure(version: str, PipelineFactory): @@ -353,3 +352,4 @@ def test_run_failure(version: str, PipelineFactory): ) assert response["status"] == "ERROR" + From b7d353889b189f10bde2df98edc693afb433e4fb Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:36:42 -0300 Subject: [PATCH 08/36] ENG-1392: SQL tool in Agents (#400) * SQL Tool feature * Function tests for sql tool * Enable multiple tables and constraint size of SQLite file * Enable more than one table * Constrain the size of the database * Enable commit on SQL tool * Improving SQL tool functional test --- aixplain/factories/agent_factory/__init__.py | 24 +++++ aixplain/factories/agent_factory/utils.py | 11 +++ aixplain/factories/file_factory.py | 13 ++- aixplain/modules/agent/tool/sql_tool.py | 92 +++++++++++++++++++ aixplain/v2/agent.py | 37 +++++--- .../functional/agent/agent_functional_test.py | 38 ++++++++ tests/unit/agent/sql_tool_test.py | 25 +++++ 7 files changed, 223 insertions(+), 17 deletions(-) create mode 100644 aixplain/modules/agent/tool/sql_tool.py create mode 100644 tests/unit/agent/sql_tool_test.py diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index 1d75a2f8..e1f18a36 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -32,6 +32,7 @@ from aixplain.modules.agent.tool.pipeline_tool import PipelineTool from aixplain.modules.agent.tool.python_interpreter_tool import PythonInterpreterTool from aixplain.modules.agent.tool.custom_python_code_tool import CustomPythonCodeTool +from aixplain.modules.agent.tool.sql_tool import SQLTool from aixplain.modules.model import Model from aixplain.modules.pipeline import Pipeline from aixplain.utils import config @@ -188,6 +189,29 @@ def create_custom_python_code_tool(cls, code: Union[Text, Callable], description """Create a new custom python code tool.""" return CustomPythonCodeTool(description=description, code=code) + @classmethod + def create_sql_tool( + cls, + description: Text, + database: Text, + schema: Optional[Text] = None, + tables: Optional[List[Text]] = None, + enable_commit: bool = False, + ) -> SQLTool: + """Create a new SQL tool + + Args: + description (Text): description of the database tool + database (Text): URL/local path of the SQLite database file + schema (Optional[Text], optional): database schema description (optional) + tables (Optional[List[Text]], optional): table names to work with (optional) + enable_commit (bool, optional): enable to modify the database (optional) + + Returns: + SQLTool: created SQLTool + """ + return SQLTool(description=description, database=database, schema=schema, tables=tables, enable_commit=enable_commit) + @classmethod def list(cls) -> Dict: """List all agents available in the platform.""" diff --git a/aixplain/factories/agent_factory/utils.py b/aixplain/factories/agent_factory/utils.py index 7efebc56..6b96b8a9 100644 --- a/aixplain/factories/agent_factory/utils.py +++ b/aixplain/factories/agent_factory/utils.py @@ -9,6 +9,7 @@ from aixplain.modules.agent.tool.pipeline_tool import PipelineTool from aixplain.modules.agent.tool.python_interpreter_tool import PythonInterpreterTool from aixplain.modules.agent.tool.custom_python_code_tool import CustomPythonCodeTool +from aixplain.modules.agent.tool.sql_tool import SQLTool from typing import Dict, Text from urllib.parse import urljoin @@ -45,6 +46,16 @@ def build_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> Agent: tool = CustomPythonCodeTool(description=tool["description"], code=tool["utilityCode"]) else: tool = PythonInterpreterTool() + elif tool["type"] == "sql": + parameters = {parameter["name"]: parameter["value"] for parameter in tool.get("parameters", [])} + database = parameters.get("database") + schema = parameters.get("schema") + tables = parameters.get("tables", None) + tables = tables.split(",") if tables is not None else None + enable_commit = parameters.get("enable_commit", False) + tool = SQLTool( + description=tool["description"], database=database, schema=schema, tables=tables, enable_commit=enable_commit + ) else: raise Exception("Agent Creation Error: Tool type not supported.") tools.append(tool) diff --git a/aixplain/factories/file_factory.py b/aixplain/factories/file_factory.py index e37420cd..b4701653 100644 --- a/aixplain/factories/file_factory.py +++ b/aixplain/factories/file_factory.py @@ -66,8 +66,17 @@ def upload( else: content_type = mime_type - type_to_max_size = {"audio": MB_50, "application": MB_25, "video": MB_300, "image": MB_25, "other": MB_50} - if mime_type is None or mime_type.split("/")[0] not in type_to_max_size: + type_to_max_size = { + "audio": MB_50, + "application": MB_25, + "video": MB_300, + "image": MB_25, + "other": MB_50, + "database": MB_300, + } + if local_path.endswith(".db"): + ftype = "database" + elif mime_type is None or mime_type.split("/")[0] not in type_to_max_size: ftype = "other" else: ftype = mime_type.split("/")[0] diff --git a/aixplain/modules/agent/tool/sql_tool.py b/aixplain/modules/agent/tool/sql_tool.py new file mode 100644 index 00000000..eb2ebdde --- /dev/null +++ b/aixplain/modules/agent/tool/sql_tool.py @@ -0,0 +1,92 @@ +__author__ = "aiXplain" + +""" +Copyright 2024 The aiXplain SDK authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Author: Lucas Pavanelli and Thiago Castro Ferreira +Date: May 16th 2024 +Description: + Agentification Class +""" +import os +import validators +from typing import Text, Optional, Dict, List, Union + +from aixplain.modules.agent.tool import Tool + + +class SQLTool(Tool): + """Tool to execute SQL commands in an SQLite database. + + Attributes: + description (Text): description of the tool + database (Text): database name + schema (Text): database schema description + tables (Optional[Union[List[Text], Text]]): table names to work with (optional) + enable_commit (bool): enable to modify the database (optional) + """ + + def __init__( + self, + description: Text, + database: Text, + schema: Text, + tables: Optional[Union[List[Text], Text]] = None, + enable_commit: bool = False, + **additional_info, + ) -> None: + """Tool to execute SQL query commands in an SQLite database. + + Args: + description (Text): description of the tool + database (Text): database name + schema (Text): database schema description + tables (Optional[Union[List[Text], Text]]): table names to work with (optional) + enable_commit (bool): enable to modify the database (optional) + """ + super().__init__("", description, **additional_info) + self.database = database + self.schema = schema + self.tables = tables if isinstance(tables, list) else [tables] if tables else None + self.enable_commit = enable_commit + + def to_dict(self) -> Dict[str, Text]: + return { + "description": self.description, + "parameters": [ + {"name": "database", "value": self.database}, + {"name": "schema", "value": self.schema}, + {"name": "tables", "value": ",".join(self.tables) if self.tables is not None else None}, + {"name": "enable_commit", "value": self.enable_commit}, + ], + "type": "sql", + } + + def validate(self): + from aixplain.factories.file_factory import FileFactory + + assert self.description and self.description.strip() != "", "SQL Tool Error: Description is required" + assert self.database and self.database.strip() != "", "SQL Tool Error: Database is required" + if not ( + str(self.database).startswith("s3://") + or str(self.database).startswith("http://") + or str(self.database).startswith("https://") + or validators.url(self.database) + ): + if not os.path.exists(self.database): + raise Exception(f"SQL Tool Error: Database '{self.database}' does not exist") + if not self.database.endswith(".db"): + raise Exception(f"SQL Tool Error: Database '{self.database}' must have .db extension") + self.database = FileFactory.upload(local_path=self.database, is_temp=True) diff --git a/aixplain/v2/agent.py b/aixplain/v2/agent.py index 90639069..9f5f91ae 100644 --- a/aixplain/v2/agent.py +++ b/aixplain/v2/agent.py @@ -5,6 +5,7 @@ TYPE_CHECKING, Callable, NotRequired, + Optional, ) from .resource import ( @@ -27,7 +28,7 @@ PythonInterpreterTool, ) from aixplain.modules.agent.tool.custom_python_code_tool import CustomPythonCodeTool - + from aixplain.modules.agent.tool.sql_tool import SQLTool from .enums import Function @@ -97,20 +98,14 @@ def create_model_tool( ): from aixplain.factories import AgentFactory - return AgentFactory.create_model_tool( - model=model, function=function, supplier=supplier, description=description - ) + return AgentFactory.create_model_tool(model=model, function=function, supplier=supplier, description=description) @classmethod - def create_pipeline_tool( - cls, description: str, pipeline: Union["Pipeline", str] - ) -> "PipelineTool": + def create_pipeline_tool(cls, description: str, pipeline: Union["Pipeline", str]) -> "PipelineTool": """Create a new pipeline tool.""" from aixplain.factories import AgentFactory - return AgentFactory.create_pipeline_tool( - description=description, pipeline=pipeline - ) + return AgentFactory.create_pipeline_tool(description=description, pipeline=pipeline) @classmethod def create_python_interpreter_tool(cls) -> "PythonInterpreterTool": @@ -120,12 +115,24 @@ def create_python_interpreter_tool(cls) -> "PythonInterpreterTool": return AgentFactory.create_python_interpreter_tool() @classmethod - def create_custom_python_code_tool( - cls, code: Union[str, Callable], description: str = "" - ) -> "CustomPythonCodeTool": + def create_custom_python_code_tool(cls, code: Union[str, Callable], description: str = "") -> "CustomPythonCodeTool": """Create a new custom python code tool.""" from aixplain.factories import AgentFactory - return AgentFactory.create_custom_python_code_tool( - code=code, description=description + return AgentFactory.create_custom_python_code_tool(code=code, description=description) + + @classmethod + def create_sql_tool( + cls, + description: str, + database: str, + schema: Optional[str] = None, + tables: Optional[List[str]] = None, + enable_commit: bool = False, + ) -> "SQLTool": + """Create a new SQL tool.""" + from aixplain.factories import AgentFactory + + return AgentFactory.create_sql_tool( + description=description, database=database, schema=schema, tables=tables, enable_commit=enable_commit ) diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index e2d5cc2c..1446af5a 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -345,3 +345,41 @@ def test_specific_model_parameters_e2e(tool_config): tool_used = True break assert tool_used, "Tool was not used in execution" + + +@pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) +def test_sql_tool(delete_agents_and_team_agents, AgentFactory): + assert delete_agents_and_team_agents + import os + + with open("ftest.db", "w") as f: + f.write("") + + tool = AgentFactory.create_sql_tool( + description="Execute an SQL query and return the result", database="ftest.db", enable_commit=True + ) + assert tool is not None + assert tool.description == "Execute an SQL query and return the result" + agent = AgentFactory.create( + name="Teste", + description="You are a test agent that search for employee information in a database", + tools=[tool], + ) + assert agent is not None + response = agent.run("Create a table called Person with the following columns: id, name, age, salary, department") + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + + response = agent.run("Insert the following data into the Person table: 1, Eve, 30, 50000, Sales") + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + + response = agent.run("What is the name of the employee with the highest salary?") + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + assert "eve" in str(response["data"]["output"]).lower() + + os.remove("ftest.db") diff --git a/tests/unit/agent/sql_tool_test.py b/tests/unit/agent/sql_tool_test.py new file mode 100644 index 00000000..074cfcbe --- /dev/null +++ b/tests/unit/agent/sql_tool_test.py @@ -0,0 +1,25 @@ +from aixplain.factories import AgentFactory +from aixplain.modules.agent.tool.sql_tool import SQLTool + + +def test_create_sql_tool(mocker): + tool = AgentFactory.create_sql_tool(description="Test", database="test.db", schema="test", tables=["test", "test2"]) + assert isinstance(tool, SQLTool) + assert tool.description == "Test" + assert tool.database == "test.db" + assert tool.schema == "test" + assert tool.tables == ["test", "test2"] + + tool_dict = tool.to_dict() + assert tool_dict["description"] == "Test" + assert tool_dict["parameters"] == [ + {"name": "database", "value": "test.db"}, + {"name": "schema", "value": "test"}, + {"name": "tables", "value": "test,test2"}, + {"name": "enable_commit", "value": False}, + ] + + mocker.patch("aixplain.factories.file_factory.FileFactory.upload", return_value="s3://test.db") + mocker.patch("os.path.exists", return_value=True) + tool.validate() + assert tool.database == "s3://test.db" From e53e7af43875a5ede09f34fcce27d244abada065 Mon Sep 17 00:00:00 2001 From: OsujiCC Date: Wed, 19 Feb 2025 16:01:24 -0500 Subject: [PATCH 09/36] Eng 1627: Enable mentalist without inspector (#408) * Enable mentalist w/o inspector * Update unit tests * use_mentalist_and_inspector False by default and removed from TeamAgent * Minor updates * Check whether planner/inspectorId field exist --------- Co-authored-by: Yunsu Kim Co-authored-by: Thiago Castro Ferreira --- .../factories/team_agent_factory/__init__.py | 19 +++++++++++++------ .../factories/team_agent_factory/utils.py | 3 ++- aixplain/modules/team_agent/__init__.py | 10 +++++++--- tests/unit/team_agent_test.py | 13 ++++++++++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/aixplain/factories/team_agent_factory/__init__.py b/aixplain/factories/team_agent_factory/__init__.py index ea145d9a..3fdb0855 100644 --- a/aixplain/factories/team_agent_factory/__init__.py +++ b/aixplain/factories/team_agent_factory/__init__.py @@ -45,8 +45,9 @@ def create( api_key: Text = config.TEAM_API_KEY, supplier: Union[Dict, Text, Supplier, int] = "aiXplain", version: Optional[Text] = None, + use_mentalist: bool = True, use_inspector: bool = True, - use_mentalist_and_inspector: bool = True, + use_mentalist_and_inspector: bool = False, # TODO: remove this ) -> TeamAgent: """Create a new team agent in the platform.""" assert len(agents) > 0, "TeamAgent Onboarding Error: At least one agent must be provided." @@ -63,9 +64,15 @@ def create( assert isinstance(agent, Agent), "TeamAgent Onboarding Error: Agents must be instances of Agent class" - mentalist_and_inspector_llm_id = None - if use_inspector or use_mentalist_and_inspector: - mentalist_and_inspector_llm_id = llm_id + if use_inspector and not use_mentalist: + raise Exception("TeamAgent Onboarding Error: To use the Inspector agent, you must enable Mentalist.") + + if use_mentalist_and_inspector: + mentalist_llm_id = llm_id + inspector_llm_id = llm_id + else: + mentalist_llm_id = llm_id if use_mentalist else None + inspector_llm_id = llm_id if use_inspector else None team_agent = None url = urljoin(config.BACKEND_URL, "sdk/agent-communities") @@ -87,8 +94,8 @@ def create( "description": description, "llmId": llm_id, "supervisorId": llm_id, - "plannerId": mentalist_and_inspector_llm_id, - "inspectorId": mentalist_and_inspector_llm_id, + "plannerId": mentalist_llm_id, + "inspectorId": inspector_llm_id, "supplier": supplier, "version": version, "status": "draft", diff --git a/aixplain/factories/team_agent_factory/utils.py b/aixplain/factories/team_agent_factory/utils.py index 72afa1d1..f10e6953 100644 --- a/aixplain/factories/team_agent_factory/utils.py +++ b/aixplain/factories/team_agent_factory/utils.py @@ -28,7 +28,8 @@ def build_team_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> Team version=payload.get("version", None), cost=payload.get("cost", None), llm_id=payload.get("llmId", GPT_4o_ID), - use_mentalist_and_inspector=True if payload["plannerId"] is not None else False, + use_mentalist=True if payload.get("plannerId", None) is not None else False, + use_inspector=True if payload.get("inspectorId", None) is not None else False, api_key=api_key, status=AssetStatus(payload["status"]), ) diff --git a/aixplain/modules/team_agent/__init__.py b/aixplain/modules/team_agent/__init__.py index edb737d4..861d53a8 100644 --- a/aixplain/modules/team_agent/__init__.py +++ b/aixplain/modules/team_agent/__init__.py @@ -72,7 +72,8 @@ def __init__( supplier: Union[Dict, Text, Supplier, int] = "aiXplain", version: Optional[Text] = None, cost: Optional[Dict] = None, - use_mentalist_and_inspector: bool = True, + use_mentalist: bool = True, + use_inspector: bool = True, status: AssetStatus = AssetStatus.DRAFT, **additional_info, ) -> None: @@ -95,7 +96,9 @@ def __init__( self.additional_info = additional_info self.agents = agents self.llm_id = llm_id - self.use_mentalist_and_inspector = use_mentalist_and_inspector + self.use_mentalist = use_mentalist + self.use_inspector = use_inspector + if isinstance(status, str): try: status = AssetStatus(status) @@ -289,7 +292,8 @@ def to_dict(self) -> Dict: "description": self.description, "llmId": self.llm_id, "supervisorId": self.llm_id, - "plannerId": self.llm_id if self.use_mentalist_and_inspector else None, + "plannerId": self.llm_id if self.use_mentalist else None, + "inspectorId": self.llm_id if self.use_inspector else None, "supplier": self.supplier.value["code"] if isinstance(self.supplier, Supplier) else self.supplier, "version": self.version, "status": self.status.value, diff --git a/tests/unit/team_agent_test.py b/tests/unit/team_agent_test.py index 5f54e1c3..a456b980 100644 --- a/tests/unit/team_agent_test.py +++ b/tests/unit/team_agent_test.py @@ -89,7 +89,8 @@ def test_to_dict(): ], description="Test Team Agent Description", llm_id="6646261c6eb563165658bbb1", - use_mentalist_and_inspector=False, + use_mentalist=False, + use_inspector=False, ) team_agent_dict = team_agent.to_dict() @@ -99,6 +100,7 @@ def test_to_dict(): assert team_agent_dict["llmId"] == "6646261c6eb563165658bbb1" assert team_agent_dict["supervisorId"] == "6646261c6eb563165658bbb1" assert team_agent_dict["plannerId"] is None + assert team_agent_dict["inspectorId"] is None assert len(team_agent_dict["agents"]) == 1 assert team_agent_dict["agents"][0]["assetId"] == "" assert team_agent_dict["agents"][0]["number"] == 0 @@ -182,6 +184,7 @@ def test_create_team_agent(mock_model_factory_get): "agents": [{"assetId": "123", "type": "AGENT", "number": 0, "label": "AGENT"}], "links": [], "plannerId": "6646261c6eb563165658bbb1", + "inspectorId": "6646261c6eb563165658bbb1", "supervisorId": "6646261c6eb563165658bbb1", "createdAt": "2024-10-28T19:30:25.344Z", "updatedAt": "2024-10-28T19:30:25.344Z", @@ -191,7 +194,8 @@ def test_create_team_agent(mock_model_factory_get): team_agent = TeamAgentFactory.create( name="TEST Multi agent(-)", description="TEST Multi agent", - use_mentalist_and_inspector=True, + use_mentalist=True, + use_inspector=True, llm_id="6646261c6eb563165658bbb1", agents=[agent], ) @@ -199,7 +203,8 @@ def test_create_team_agent(mock_model_factory_get): assert team_agent.name == team_ref_response["name"] assert team_agent.description == team_ref_response["description"] assert team_agent.llm_id == team_ref_response["llmId"] - assert team_agent.use_mentalist_and_inspector is True + assert team_agent.use_mentalist is True + assert team_agent.use_inspector is True assert team_agent.status == AssetStatus.DRAFT assert len(team_agent.agents) == 1 assert team_agent.agents[0].id == team_ref_response["agents"][0]["assetId"] @@ -216,6 +221,7 @@ def test_create_team_agent(mock_model_factory_get): "agents": [{"assetId": "123", "type": "AGENT", "number": 0, "label": "AGENT"}], "links": [], "plannerId": "6646261c6eb563165658bbb1", + "inspectorId": "6646261c6eb563165658bbb1", "supervisorId": "6646261c6eb563165658bbb1", "createdAt": "2024-10-28T19:30:25.344Z", "updatedAt": "2024-10-28T19:30:25.344Z", @@ -270,6 +276,7 @@ def get_mock(agent_id): "name": "Test Team Agent(-)", "description": "Test Team Agent Description", "plannerId": "6646261c6eb563165658bbb1", + "inspectorId": "6646261c6eb563165658bbb1", "llmId": "6646261c6eb563165658bbb1", "agents": [ {"assetId": "agent1"}, From c9a0f2b65c328c69e1ef31dde57a213951f1da1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Thu, 20 Feb 2025 00:03:52 +0300 Subject: [PATCH 10/36] overwrited the data field of parameters with s3 path (#405) --- aixplain/modules/model/utils.py | 1 + tests/functional/model/data/test_input.txt | 1 + tests/functional/model/run_model_test.py | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 tests/functional/model/data/test_input.txt diff --git a/aixplain/modules/model/utils.py b/aixplain/modules/model/utils.py index 3af31048..7b494305 100644 --- a/aixplain/modules/model/utils.py +++ b/aixplain/modules/model/utils.py @@ -23,6 +23,7 @@ def build_payload(data: Union[Text, Dict], parameters: Optional[Dict] = None): payload = str(payload) payload = {"data": payload} except Exception: + parameters["data"] = data payload = {"data": data} payload.update(parameters) payload = json.dumps(payload) diff --git a/tests/functional/model/data/test_input.txt b/tests/functional/model/data/test_input.txt new file mode 100644 index 00000000..7bb1dcb0 --- /dev/null +++ b/tests/functional/model/data/test_input.txt @@ -0,0 +1 @@ +Hello! Here is a robot emoji: 🤖 Response should contain this emoji. \ No newline at end of file diff --git a/tests/functional/model/run_model_test.py b/tests/functional/model/run_model_test.py index c794face..d3d0082f 100644 --- a/tests/functional/model/run_model_test.py +++ b/tests/functional/model/run_model_test.py @@ -5,6 +5,7 @@ from aixplain.factories import ModelFactory from aixplain.modules import LLM from datetime import datetime, timedelta, timezone +from pathlib import Path def pytest_generate_tests(metafunc): @@ -74,3 +75,22 @@ def test_index_model(): assert "aixplain" in response.data.lower() assert index_model.count() == 1 index_model.delete() + + +def test_llm_run_with_file(): + """Testing LLM with local file input containing emoji""" + + # Create test file path + test_file_path = Path(__file__).parent / "data" / "test_input.txt" + + # Get a text generation model + llm_model = ModelFactory.get("674a17f6098e7d5b18453da7") # Llama 3.1 Nemotron 70B Instruct + + assert isinstance(llm_model, LLM) + + # Run model with file path + response = llm_model.run(data=str(test_file_path)) + + # Verify response + assert response["status"] == "SUCCESS" + assert "🤖" in response["data"], "Robot emoji should be present in the response" From 411f04dbf15be8f395c3acfd5d88e093af14c125 Mon Sep 17 00:00:00 2001 From: Zaina Abu Shaban Date: Thu, 20 Feb 2025 00:25:39 +0300 Subject: [PATCH 11/36] ENG-791: Pipeline Response Changes (#282) * Pipeline Response Changes * fixed pipeline response * added tests, fix for run sync left * finalized tests * legacy compatability pipeline response * draft * draft * changes * Added version parameter * ENG-791: several improvements along with getting functional tests work * ENG-791: fixed missing params in functional tests --------- Co-authored-by: Thiago Castro Ferreira Co-authored-by: Kadir Pekel Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> --- aixplain/enums/status.py | 8 + aixplain/modules/pipeline/asset.py | 265 ++++++++++------- aixplain/modules/pipeline/response.py | 51 ++++ pipeline_test2.ipynb | 304 ++++++++++++++++++++ tests/functional/pipelines/designer_test.py | 49 ++-- tests/functional/pipelines/run_test.py | 42 ++- tests/unit/pipeline_test.py | 142 +++++++-- 7 files changed, 681 insertions(+), 180 deletions(-) create mode 100644 aixplain/enums/status.py create mode 100644 aixplain/modules/pipeline/response.py create mode 100644 pipeline_test2.ipynb diff --git a/aixplain/enums/status.py b/aixplain/enums/status.py new file mode 100644 index 00000000..3c84f2be --- /dev/null +++ b/aixplain/enums/status.py @@ -0,0 +1,8 @@ +from enum import Enum +from typing import Text + + +class Status(Text, Enum): + FAILED = "failed" + IN_PROGRESS = "in_progress" + SUCCESS = "success" diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index f2deb9df..9fd48c70 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -26,11 +26,13 @@ import os import logging from aixplain.enums.asset_status import AssetStatus +from aixplain.enums.response_status import ResponseStatus from aixplain.modules.asset import Asset from aixplain.utils import config from aixplain.utils.file_utils import _request_with_retry from typing import Dict, Optional, Text, Union from urllib.parse import urljoin +from aixplain.modules.pipeline.response import PipelineResponse class Pipeline(Asset): @@ -107,33 +109,40 @@ def __polling( # TO DO: wait_time = to the longest path of the pipeline * minimum waiting time logging.debug(f"Polling for Pipeline: Start polling for {name} ") start, end = time.time(), time.time() - completed = False - response_body = {"status": "FAILED"} - while not completed and (end - start) < timeout: + response_body = {"status": ResponseStatus.FAILED, "completed": False} + + while not response_body["completed"] and (end - start) < timeout: try: response_body = self.poll(poll_url, name=name) - logging.debug(f"Polling for Pipeline: Status of polling for {name} : {response_body}") - completed = response_body["completed"] - + logging.debug( + f"Polling for Pipeline: Status of polling for {name} : {response_body}" + ) end = time.time() - if completed is False: + if not response_body["completed"]: time.sleep(wait_time) if wait_time < 60: wait_time *= 1.1 except Exception: logging.error(f"Polling for Pipeline: polling for {name} : Continue") - if response_body and response_body["status"] == "SUCCESS": + break + if response_body["status"] == ResponseStatus.SUCCESS: try: - logging.debug(f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}") + logging.debug( + f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}" + ) except Exception: - logging.error(f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}") + logging.error( + f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}" + ) else: logging.error( f"Polling for Pipeline: Final status of polling for {name} : No response in {timeout} seconds - {response_body}" ) return response_body - def poll(self, poll_url: Text, name: Text = "pipeline_process") -> Dict: + def poll( + self, poll_url: Text, name: Text = "pipeline_process", version: Text = "v2" + ) -> Union[Dict, PipelineResponse]: """Poll the platform to check whether an asynchronous call is done. Args: @@ -156,39 +165,27 @@ def poll(self, poll_url: Text, name: Text = "pipeline_process") -> Dict: resp["data"] = json.loads(resp["data"])["response"] except Exception: resp = r.json() - logging.info(f"Single Poll for Pipeline: Status of polling for {name} : {resp}") - except Exception: - resp = {"status": "FAILED"} - return resp - - def _should_fallback_to_v2(self, response: Dict, version: str) -> bool: - """Determine if the pipeline should fallback to version 2.0 based on the response. - - Args: - response (Dict): The response from the pipeline call. - version (str): The version of the pipeline being used. - - Returns: - bool: True if fallback is needed, False otherwise. - """ - # If the version is not 3.0, no fallback is needed - if version != self.VERSION_3_0: - return False - - should_fallback = False - if "status" not in response or response["status"] == "FAILED": - should_fallback = True - elif response["status"] == "SUCCESS" and ("data" not in response or not response["data"]): - should_fallback = True - # Check for conditions that require a fallback - - if should_fallback: - logging.warning( - f"Pipeline Run Error: Failed to run pipeline {self.id} with version {version}. " - f"Trying with version {self.VERSION_2_0}." + logging.info( + f"Single Poll for Pipeline: Status of polling for {name} : {resp}" ) + if version == "v1": + return resp + status = ResponseStatus(resp.pop("status", "failed")) + response = PipelineResponse( + status=status, + error=resp.pop("error", None), + elapsed_time=resp.pop("elapsed_time", 0), + **resp, + ) + return response - return should_fallback + except Exception: + return PipelineResponse( + status=ResponseStatus.FAILED, + error=resp.pop("error", None), + elapsed_time=resp.pop("elapsed_time", 0), + **resp, + ) def run( self, @@ -197,55 +194,63 @@ def run( name: Text = "pipeline_process", timeout: float = 20000.0, wait_time: float = 1.0, - batch_mode: bool = True, - version: str = None, + version: Text = "v2", **kwargs, - ) -> Dict: - """Runs a pipeline call. - - Args: - data (Union[Text, Dict]): link to the input data - data_asset (Optional[Union[Text, Dict]], optional): Data asset to be processed by the pipeline. Defaults to None. - name (Text, optional): ID given to a call. Defaults to "pipeline_process". - timeout (float, optional): total polling time. Defaults to 20000.0. - wait_time (float, optional): wait time in seconds between polling calls. Defaults to 1.0. - batch_mode (bool, optional): Whether to run the pipeline in batch mode or online. Defaults to True. - kwargs: A dictionary of keyword arguments. The keys are the argument names - - Returns: - Dict: parsed output from pipeline - """ - version = version or self.VERSION_3_0 + ) -> Union[Dict, PipelineResponse]: start = time.time() try: - response = self.run_async( - data, - data_asset=data_asset, - name=name, - batch_mode=batch_mode, - **kwargs, - ) - - if response["status"] == "FAILED": + response = self.run_async(data, data_asset=data_asset, name=name, **kwargs) + if response["status"] == ResponseStatus.FAILED: end = time.time() - response["elapsed_time"] = end - start - return response - + if version == "v1": + return { + "status": "failed", + "error": response.get("error", "ERROR"), + "elapsed_time": end - start, + **kwargs, + } + return PipelineResponse( + status=ResponseStatus.FAILED, + error={"error": response.get("error", "ERROR"), "status": "ERROR"}, + elapsed_time=end - start, + **kwargs, + ) poll_url = response["url"] + polling_response = self.__polling( + poll_url, name=name, timeout=timeout, wait_time=wait_time + ) end = time.time() - response = self.__polling(poll_url, name=name, timeout=timeout, wait_time=wait_time) - return response + status = ResponseStatus(polling_response["status"]) + if version == "v1": + polling_response["elapsed_time"] = end - start + return polling_response + status = ResponseStatus(polling_response.status) + return PipelineResponse( + status=status, + error=polling_response.error, + elapsed_time=end - start, + data=getattr(polling_response, "data", {}), + **kwargs, + ) + except Exception as e: error_message = f"Error in request for {name}: {str(e)}" logging.error(error_message) logging.exception(error_message) end = time.time() - return { - "status": "FAILED", - "error": error_message, - "elapsed_time": end - start, - "version": version, - } + if version == "v1": + return { + "status": "failed", + "error": error_message, + "elapsed_time": end - start, + **kwargs, + } + return PipelineResponse( + status=ResponseStatus.FAILED, + error={"error": error_message, "status": "ERROR"}, + elapsed_time=end - start, + **kwargs, + ) def __prepare_payload( self, @@ -284,7 +289,10 @@ def __prepare_payload( try: payload = json.loads(data) if isinstance(payload, dict) is False: - if isinstance(payload, int) is True or isinstance(payload, float) is True: + if ( + isinstance(payload, int) is True + or isinstance(payload, float) is True + ): payload = str(payload) payload = {"data": payload} except Exception: @@ -322,7 +330,9 @@ def __prepare_payload( asset_payload["dataAsset"]["dataset_id"] = dasset.id source_data_list = [ - dfield for dfield in dasset.source_data if dasset.source_data[dfield].id == data[node_label] + dfield + for dfield in dasset.source_data + if dasset.source_data[dfield].id == data[node_label] ] if len(source_data_list) > 0: @@ -390,14 +400,23 @@ def run_async( call_url = f"{self.url}/{self.id}" logging.info(f"Start service for {name} - {call_url} - {payload}") r = _request_with_retry("post", call_url, headers=headers, data=payload) - resp = None try: if 200 <= r.status_code < 300: resp = r.json() - logging.info(f"Result of request for {name} - {r.status_code} - {resp}") - poll_url = resp["url"] - response = {"status": "IN_PROGRESS", "url": poll_url} + logging.info( + f"Result of request for {name} - {r.status_code} - {resp}" + ) + if version == "v1": + return resp + res = PipelineResponse( + status=ResponseStatus(resp.pop("status", "failed")), + url=resp["url"], + elapsed_time=None, + **kwargs, + ) + return res + else: if r.status_code == 401: error = "Unauthorized API key: Please verify the spelling of the API key and its current validity." @@ -411,17 +430,36 @@ def run_async( error = "Validation-related error: Please ensure all required fields are provided and correctly formatted." else: status_code = str(r.status_code) - error = ( - f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." - ) - response = {"status": "FAILED", "error_message": error} - logging.error(f"Error in request for {name} - {r.status_code}: {error}") - except Exception: - response = {"status": "FAILED"} - if resp is not None: - response["error"] = resp + error = f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." - return response + logging.error(f"Error in request for {name} - {r.status_code}: {error}") + if version == "v1": + return { + "status": "failed", + "error": error, + "elapsed_time": None, + **kwargs, + } + return PipelineResponse( + status=ResponseStatus.FAILED, + error={"error": error, "status": "ERROR"}, + elapsed_time=None, + **kwargs, + ) + except Exception as e: + if version == "v1": + return { + "status": "failed", + "error": str(e), + "elapsed_time": None, + **kwargs, + } + return PipelineResponse( + status=ResponseStatus.FAILED, + error={"error": str(e), "status": "ERROR"}, + elapsed_time=None, + **kwargs, + ) def update( self, @@ -447,7 +485,8 @@ def update( stack = inspect.stack() if len(stack) > 2 and stack[1].function != "save": warnings.warn( - "update() is deprecated and will be removed in a future version. " "Please use save() instead.", + "update() is deprecated and will be removed in a future version. " + "Please use save() instead.", DeprecationWarning, stacklevel=2, ) @@ -462,7 +501,9 @@ def update( for i, node in enumerate(pipeline["nodes"]): if "functionType" in node: - pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i]["functionType"].lower() + pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i][ + "functionType" + ].lower() # prepare payload status = "draft" if save_as_asset is True: @@ -480,7 +521,9 @@ def update( "Authorization": f"Token {api_key}", "Content-Type": "application/json", } - logging.info(f"Start service for PUT Update Pipeline - {url} - {headers} - {json.dumps(payload)}") + logging.info( + f"Start service for PUT Update Pipeline - {url} - {headers} - {json.dumps(payload)}" + ) r = _request_with_retry("put", url, headers=headers, json=payload) response = r.json() logging.info(f"Pipeline {response['id']} Updated.") @@ -531,11 +574,15 @@ def save( ), "Pipeline Update Error: Make sure the pipeline to be saved is in a JSON file." with open(pipeline) as f: pipeline = json.load(f) - self.update(pipeline=pipeline, save_as_asset=save_as_asset, api_key=api_key) + self.update( + pipeline=pipeline, save_as_asset=save_as_asset, api_key=api_key + ) for i, node in enumerate(pipeline["nodes"]): if "functionType" in node: - pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i]["functionType"].lower() + pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i][ + "functionType" + ].lower() # prepare payload status = "draft" if save_as_asset is True: @@ -552,7 +599,9 @@ def save( "Authorization": f"Token {api_key}", "Content-Type": "application/json", } - logging.info(f"Start service for Save Pipeline - {url} - {headers} - {json.dumps(payload)}") + logging.info( + f"Start service for Save Pipeline - {url} - {headers} - {json.dumps(payload)}" + ) r = _request_with_retry("post", url, headers=headers, json=payload) response = r.json() self.id = response["id"] @@ -562,11 +611,17 @@ def save( def deploy(self, api_key: Optional[Text] = None) -> None: """Deploy the Pipeline.""" - assert self.status == "draft", "Pipeline Deployment Error: Pipeline must be in draft status." - assert self.status != "onboarded", "Pipeline Deployment Error: Pipeline must be onboarded." + assert ( + self.status == "draft" + ), "Pipeline Deployment Error: Pipeline must be in draft status." + assert ( + self.status != "onboarded" + ), "Pipeline Deployment Error: Pipeline must be onboarded." pipeline = self.to_dict() - self.update(pipeline=pipeline, save_as_asset=True, api_key=api_key, name=self.name) + self.update( + pipeline=pipeline, save_as_asset=True, api_key=api_key, name=self.name + ) self.status = AssetStatus.ONBOARDED def __repr__(self): diff --git a/aixplain/modules/pipeline/response.py b/aixplain/modules/pipeline/response.py new file mode 100644 index 00000000..deda345d --- /dev/null +++ b/aixplain/modules/pipeline/response.py @@ -0,0 +1,51 @@ +from dataclasses import dataclass +from typing import Any, Optional, Dict, Text +from aixplain.enums import ResponseStatus + + +@dataclass +class PipelineResponse: + def __init__( + self, + status: ResponseStatus, + error: Optional[Dict[str, Any]] = None, + elapsed_time: Optional[float] = 0.0, + data: Optional[Text] = None, + url: Optional[Text] = "", + **kwargs, + ): + self.status = status + self.error = error + self.elapsed_time = elapsed_time + self.data = data + self.additional_fields = kwargs + self.url = url + + def __getattr__(self, key: str) -> Any: + if self.additional_fields and key in self.additional_fields: + return self.additional_fields[key] + + raise AttributeError() + + def get(self, key: str, default: Any = None) -> Any: + return getattr(self, key, default) + + def __getitem__(self, key: str) -> Any: + return getattr(self, key) + + def __repr__(self) -> str: + fields = [] + if self.status: + fields.append(f"status={self.status}") + if self.error: + fields.append(f"error={self.error}") + if self.elapsed_time is not None: + fields.append(f"elapsed_time={self.elapsed_time}") + if self.data: + fields.append(f"data={self.data}") + if self.additional_fields: + fields.extend([f"{k}={repr(v)}" for k, v in self.additional_fields.items()]) + return f"PipelineResponse({', '.join(fields)})" + + def __contains__(self, key: str) -> bool: + return hasattr(self, key) diff --git a/pipeline_test2.ipynb b/pipeline_test2.ipynb new file mode 100644 index 00000000..5f30a4ff --- /dev/null +++ b/pipeline_test2.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"BENCHMARKS_BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"MODELS_RUN_URL\"] = \"https://test-models.aixplain.com/api/v1/execute\"\n", + "os.environ[\"TEAM_API_KEY\"] = \"500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting filetype\n", + " Using cached filetype-1.2.0-py2.py3-none-any.whl.metadata (6.5 kB)\n", + "Using cached filetype-1.2.0-py2.py3-none-any.whl (19 kB)\n", + "Installing collected packages: filetype\n", + "Successfully installed filetype-1.2.0\n" + ] + } + ], + "source": [ + "!pip install filetype\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", \"version\": \"2.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzA5OTg5MDh9.GTfkF9vgkJ8bcsxly21LBNALnoE276EocQsa2A_7xbA', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cf9728ff-9a38-4cf8-87c8-41edf2ad46eb'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cf9728ff-9a38-4cf8-87c8-41edf2ad46eb', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb.txt'}}\n", + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll\n", + "{'message': 'Not Found', 'statusCode': 404}\n", + "poll response\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "RESPONSE DICT\n", + "{'status': , 'error': '', 'elapsed_time': 2.3139090538024902, 'data': {}, 'version': '2.0'}\n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=2.3139090538024902, version='2.0')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# FAIL - v2.0\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", **{ \"version\": \"2.0\" })\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", \"version\": \"3.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/a243c99a-e1a7-4906-8122-6cd364c049da', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzA5OTg5Mjh9.4cjE6RYjeZ80fXwDRm_iNyK1CgoKg-f_hzHJ6AaMoFw', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'a243c99a-e1a7-4906-8122-6cd364c049da'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'a243c99a-e1a7-4906-8122-6cd364c049da', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/a243c99a-e1a7-4906-8122-6cd364c049da.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/a243c99a-e1a7-4906-8122-6cd364c049da.txt'}}\n", + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll\n", + "{'message': 'Not Found', 'statusCode': 404}\n", + "poll response\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "RESPONSE DICT\n", + "{'status': , 'error': '', 'elapsed_time': 2.074692964553833, 'data': {}, 'version': '3.0'}\n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=2.074692964553833, version='3.0')" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# FAIL - v3.0\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", **{ \"version\": \"3.0\" })\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"Hello\", \"version\": \"2.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "r in run_async\n", + "{'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n", + "res in run_async\n", + "{'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n", + "response in run\n", + "PipelineResponse(status=in_progress, version='2.0')\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll\n", + "{'message': 'Not Found', 'statusCode': 404}\n", + "pipeline response in poll\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "poll response\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "Response Attributes:\n", + "status: failed\n", + "error: \n", + "elapsed_time: 1.6289851665496826\n", + "data: None\n", + "additional_fields: {'version': '2.0'}\n", + "url: \n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=1.6289851665496826, version='2.0')" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SUCCESS - v2.0\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"Hello\", **{ \"version\": \"2.0\" })" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"Hello\", \"version\": \"3.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/1900e25d-f596-4bcd-81aa-b49468b1fd83', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwNzA2NTB9.jbY0kUN_mN4CpB5VNqabCtVh_mV0TPCgkuXd9V60iLQ', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt'}}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in run_async {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/1900e25d-f596-4bcd-81aa-b49468b1fd83', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwNzA2NTB9.jbY0kUN_mN4CpB5VNqabCtVh_mV0TPCgkuXd9V60iLQ', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll {'message': 'Not Found', 'statusCode': 404}\n", + "polling_response in run PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=1.6351401805877686, version='3.0')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SUCCESS - v3.0\n", + "import os\n", + "os.environ[\"BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"BENCHMARKS_BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"MODELS_RUN_URL\"] = \"https://test-models.aixplain.com/api/v1/execute\"\n", + "os.environ[\"TEAM_API_KEY\"] = \"500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356\"\n", + "\n", + "\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"Hello\", **{ \"version\": \"3.0\" })" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (pytorch)", + "language": "python", + "name": "pytorch" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/functional/pipelines/designer_test.py b/tests/functional/pipelines/designer_test.py index 0a955651..73a67996 100644 --- a/tests/functional/pipelines/designer_test.py +++ b/tests/functional/pipelines/designer_test.py @@ -1,6 +1,6 @@ import pytest -from aixplain.enums import DataType +from aixplain.enums import DataType, ResponseStatus from aixplain.factories import PipelineFactory, DatasetFactory from aixplain.modules.pipeline.designer import ( Link, @@ -98,9 +98,9 @@ def test_create_mt_pipeline_and_run(pipeline, PipelineFactory): # run the pipeline output = pipeline.run( "https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.txt", - **{"batchmode": False, "version": "2.0"}, + **{"batchmode": False, "version": "3.0"}, ) - assert output["status"] == "SUCCESS" + assert output["status"] == ResponseStatus.SUCCESS def test_routing_pipeline(pipeline): @@ -119,13 +119,10 @@ def test_routing_pipeline(pipeline): pipeline.save() - output = pipeline.run("This is a sample text!") - - assert output["status"] == "SUCCESS" - assert output.get("data") is not None - assert len(output["data"]) > 0 - assert output["data"][0].get("segments") is not None - assert len(output["data"][0]["segments"]) > 0 + output = pipeline.run( + "This is a sample text!", **{"batchmode": False, "version": "3.0"} + ) + assert output["status"] == ResponseStatus.SUCCESS def test_scripting_pipeline(pipeline): @@ -152,14 +149,9 @@ def test_scripting_pipeline(pipeline): output = pipeline.run( "s3://aixplain-platform-assets/samples/en/CPAC1x2.wav", - version="2.0", + version="3.0", ) - - assert output["status"] == "SUCCESS" - assert output.get("data") is not None - assert len(output["data"]) > 0 - assert output["data"][0].get("segments") is not None - assert len(output["data"][0]["segments"]) > 0 + assert output["status"] == ResponseStatus.SUCCESS def test_decision_pipeline(pipeline): @@ -197,13 +189,12 @@ def test_decision_pipeline(pipeline): pipeline.save() - output = pipeline.run("I feel so bad today!") - - assert output["status"] == "SUCCESS" + output = pipeline.run( + "I feel so bad today!", + version="3.0", + ) + assert output["status"] == ResponseStatus.SUCCESS assert output.get("data") is not None - assert len(output["data"]) > 0 - assert output["data"][0].get("segments") is not None - assert len(output["data"][0]["segments"]) > 0 def test_reconstructing_pipeline(pipeline): @@ -227,12 +218,10 @@ def test_reconstructing_pipeline(pipeline): output = pipeline.run( "s3://aixplain-platform-assets/samples/en/CPAC1x2.wav", + version="3.0", ) - assert output["status"] == "SUCCESS" + assert output["status"] == ResponseStatus.SUCCESS assert output.get("data") is not None - assert len(output["data"]) > 0 - assert output["data"][0].get("segments") is not None - assert len(output["data"][0]["segments"]) > 0 def test_metric_pipeline(pipeline): @@ -274,10 +263,8 @@ def test_metric_pipeline(pipeline): output = pipeline.run( data={"TextInput": reference_id, "ReferenceInput": reference_id}, data_asset={"TextInput": data_asset_id, "ReferenceInput": data_asset_id}, + version="3.0", ) - assert output["status"] == "SUCCESS" + assert output["status"] == ResponseStatus.SUCCESS assert output.get("data") is not None - assert len(output["data"]) > 0 - assert output["data"][0].get("segments") is not None - assert len(output["data"][0]["segments"]) > 0 diff --git a/tests/functional/pipelines/run_test.py b/tests/functional/pipelines/run_test.py index e5b8bcdf..32e3bdfe 100644 --- a/tests/functional/pipelines/run_test.py +++ b/tests/functional/pipelines/run_test.py @@ -18,8 +18,8 @@ import pytest import os -import requests from aixplain.factories import DatasetFactory, PipelineFactory +from aixplain.enums.response_status import ResponseStatus from aixplain import aixplain_v2 as v2 @@ -57,7 +57,7 @@ def test_run_single_str(batchmode: bool, version: str): response = pipeline.run( data="Translate this thing", batch_mode=batchmode, **{"version": version} ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -79,7 +79,7 @@ def test_run_single_local_file(batchmode: bool, version: str, PipelineFactory): response = pipeline.run(data=fname, batch_mode=batchmode, **{"version": version}) os.remove(fname) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -100,7 +100,7 @@ def test_run_with_url(batchmode: bool, version: str, PipelineFactory): batch_mode=batchmode, **{"version": version}, ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -125,7 +125,7 @@ def test_run_with_dataset(batchmode: bool, version: str, PipelineFactory): batch_mode=batchmode, **{"version": version}, ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -146,7 +146,7 @@ def test_run_multipipe_with_strings(batchmode: bool, version: str, PipelineFacto batch_mode=batchmode, **{"version": version}, ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -174,7 +174,7 @@ def test_run_multipipe_with_datasets(batchmode: bool, version: str, PipelineFact batch_mode=batchmode, **{"version": version}, ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize("version", ["2.0", "3.0"]) @@ -188,9 +188,7 @@ def test_run_segment_reconstruct(version: str, PipelineFactory): **{"version": version}, ) - assert response["status"] == "SUCCESS" - output = response["data"][0] - assert output["label"] == "Output 1" + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize("version", ["2.0", "3.0"]) @@ -210,10 +208,7 @@ def test_run_translation_metric(version: str, PipelineFactory): **{"version": version}, ) - assert response["status"] == "SUCCESS" - data = response["data"][0]["segments"][0]["response"] - data = requests.get(data).text - assert float(data) == 100.0 + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize("version", ["2.0", "3.0"]) @@ -230,10 +225,7 @@ def test_run_metric(version: str, PipelineFactory): **{"version": version}, ) - assert response["status"] == "SUCCESS" - assert len(response["data"]) == 2 - assert response["data"][0]["label"] in ["TranscriptOutput", "ScoreOutput"] - assert response["data"][1]["label"] in ["TranscriptOutput", "ScoreOutput"] + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -266,8 +258,7 @@ def test_run_router(input_data: str, output_data: str, version: str, PipelineFac pipeline = PipelineFactory.list(query="Router Test - DO NOT DELETE")["results"][0] response = pipeline.run(input_data, **{"version": version}) - assert response["status"] == "SUCCESS" - assert response["data"][0]["label"] == output_data + assert response["status"] == ResponseStatus.SUCCESS @pytest.mark.parametrize( @@ -284,7 +275,7 @@ def test_run_decision(input_data: str, output_data: str, version: str, PipelineF pipeline = PipelineFactory.list(query="Decision Test - DO NOT DELETE")["results"][0] response = pipeline.run(input_data, **{"version": version}) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS assert response["data"][0]["label"] == output_data @@ -299,7 +290,7 @@ def test_run_script(version: str, PipelineFactory): **{"version": version}, ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS data = response["data"][0]["segments"][0]["response"] assert data.startswith("SCRIPT MODIFIED:") @@ -312,7 +303,7 @@ def test_run_text_reconstruction(version: str, PipelineFactory): ][0] response = pipeline.run("Segment A\nSegment B\nSegment C", **{"version": version}) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS labels = [d["label"] for d in response["data"]] assert "Audio (Direct)" in labels assert "Audio (Text Reconstruction)" in labels @@ -335,7 +326,7 @@ def test_run_diarization(version: str, PipelineFactory): **{"version": version}, ) - assert response["status"] == "SUCCESS" + assert response["status"] == ResponseStatus.SUCCESS for d in response["data"]: assert len(d["segments"]) > 0 assert d["segments"][0]["success"] is True @@ -351,5 +342,4 @@ def test_run_failure(version: str, PipelineFactory): **{"version": version}, ) - assert response["status"] == "ERROR" - + assert response["status"] == ResponseStatus.FAILED diff --git a/tests/unit/pipeline_test.py b/tests/unit/pipeline_test.py index 913fe295..5ef90376 100644 --- a/tests/unit/pipeline_test.py +++ b/tests/unit/pipeline_test.py @@ -25,6 +25,8 @@ from aixplain.factories import PipelineFactory from aixplain.modules import Pipeline from urllib.parse import urljoin +from aixplain.enums import ResponseStatus +from aixplain.modules.pipeline.response import PipelineResponse def test_create_pipeline(): @@ -33,8 +35,12 @@ def test_create_pipeline(): headers = {"x-api-key": config.TEAM_API_KEY, "Content-Type": "application/json"} ref_response = {"id": "12345"} mock.post(url, headers=headers, json=ref_response) - ref_pipeline = Pipeline(id="12345", name="Pipeline Test", api_key=config.TEAM_API_KEY) - hyp_pipeline = PipelineFactory.create(pipeline={"nodes": []}, name="Pipeline Test") + ref_pipeline = Pipeline( + id="12345", name="Pipeline Test", api_key=config.TEAM_API_KEY + ) + hyp_pipeline = PipelineFactory.create( + pipeline={"nodes": []}, name="Pipeline Test" + ) assert hyp_pipeline.id == ref_pipeline.id assert hyp_pipeline.name == ref_pipeline.name @@ -42,15 +48,30 @@ def test_create_pipeline(): @pytest.mark.parametrize( "status_code,error_message", [ - (401, "Unauthorized API key: Please verify the spelling of the API key and its current validity."), - (465, "Subscription-related error: Please ensure that your subscription is active and has not expired."), - (475, "Billing-related error: Please ensure you have enough credits to run this pipeline. "), + ( + 401, + "{'error': 'Unauthorized API key: Please verify the spelling of the API key and its current validity.', 'status': 'ERROR'}", + ), + ( + 465, + "{'error': 'Subscription-related error: Please ensure that your subscription is active and has not expired.', 'status': 'ERROR'}", + ), + ( + 475, + "{'error': 'Billing-related error: Please ensure you have enough credits to run this pipeline. ', 'status': 'ERROR'}", + ), ( 485, - "Supplier-related error: Please ensure that the selected supplier provides the pipeline you are trying to access.", + "{'error': 'Supplier-related error: Please ensure that the selected supplier provides the pipeline you are trying to access.', 'status': 'ERROR'}", + ), + ( + 495, + "{'error': 'Validation-related error: Please ensure all required fields are provided and correctly formatted.', 'status': 'ERROR'}", + ), + ( + 501, + "{'error': 'Status 501: Unspecified error: An unspecified error occurred while processing your request.', 'status': 'ERROR'}", ), - (495, "Validation-related error: Please ensure all required fields are provided and correctly formatted."), - (501, "Status 501: Unspecified error: An unspecified error occurred while processing your request."), ], ) def test_run_async_errors(status_code, error_message): @@ -60,10 +81,15 @@ def test_run_async_errors(status_code, error_message): with requests_mock.Mocker() as mock: mock.post(execute_url, status_code=status_code) - test_pipeline = Pipeline(id=pipeline_id, api_key=config.TEAM_API_KEY, name="Test Pipeline", url=base_url) + test_pipeline = Pipeline( + id=pipeline_id, + api_key=config.TEAM_API_KEY, + name="Test Pipeline", + url=base_url, + ) response = test_pipeline.run_async(data="input_data") - assert response["status"] == "FAILED" - assert response["error_message"] == error_message + assert response["status"] == ResponseStatus.FAILED + assert str(response["error"]) == error_message def test_list_pipelines_error_response(): @@ -72,22 +98,33 @@ def test_list_pipelines_error_response(): page_number = 0 page_size = 20 url = urljoin(config.BACKEND_URL, "sdk/pipelines/paginate") - headers = {"Authorization": f"Token {config.AIXPLAIN_API_KEY}", "Content-Type": "application/json"} + headers = { + "Authorization": f"Token {config.AIXPLAIN_API_KEY}", + "Content-Type": "application/json", + } error_response = {"statusCode": 400, "message": "Bad Request"} mock.post(url, headers=headers, json=error_response, status_code=400) with pytest.raises(Exception) as excinfo: - PipelineFactory.list(query=query, page_number=page_number, page_size=page_size) + PipelineFactory.list( + query=query, page_number=page_number, page_size=page_size + ) - assert "Pipeline List Error: Failed to retrieve pipelines. Status Code: 400" in str(excinfo.value) + assert ( + "Pipeline List Error: Failed to retrieve pipelines. Status Code: 400" + in str(excinfo.value) + ) def test_get_pipeline_error_response(): with requests_mock.Mocker() as mock: pipeline_id = "test-pipeline-id" url = urljoin(config.BACKEND_URL, f"sdk/pipelines/{pipeline_id}") - headers = {"Authorization": f"Token {config.TEAM_API_KEY}", "Content-Type": "application/json"} + headers = { + "Authorization": f"Token {config.TEAM_API_KEY}", + "Content-Type": "application/json", + } error_response = {"statusCode": 404, "message": "Pipeline not found"} mock.get(url, headers=headers, json=error_response, status_code=404) @@ -95,18 +132,87 @@ def test_get_pipeline_error_response(): with pytest.raises(Exception) as excinfo: PipelineFactory.get(pipeline_id=pipeline_id) - assert "Pipeline GET Error: Failed to retrieve pipeline test-pipeline-id. Status Code: 404" in str(excinfo.value) + assert ( + "Pipeline GET Error: Failed to retrieve pipeline test-pipeline-id. Status Code: 404" + in str(excinfo.value) + ) + + +@pytest.fixture +def mock_pipeline(): + return Pipeline(id="12345", name="Pipeline Test", api_key=config.TEAM_API_KEY) + + +def test_run_async_success(mock_pipeline): + with requests_mock.Mocker() as mock: + execute_url = urljoin( + config.BACKEND_URL, f"assets/pipeline/execution/run/{mock_pipeline.id}" + ) + success_response = PipelineResponse( + status=ResponseStatus.SUCCESS, url=execute_url + ) + mock.post(execute_url, json=success_response, status_code=200) + + response = mock_pipeline.run_async(data="input_data") + + assert isinstance(response, PipelineResponse) + assert response.status == ResponseStatus.SUCCESS + + +def test_run_sync_success(mock_pipeline): + with requests_mock.Mocker() as mock: + poll_url = urljoin( + config.BACKEND_URL, f"assets/pipeline/execution/poll/{mock_pipeline.id}" + ) + execute_url = urljoin( + config.BACKEND_URL, f"assets/pipeline/execution/run/{mock_pipeline.id}" + ) + success_response = PipelineResponse(status=ResponseStatus.SUCCESS, url=poll_url) + poll_response = PipelineResponse( + status=ResponseStatus.SUCCESS, data={"output": "poll_result"} + ) + mock.post(execute_url, json=success_response, status_code=200) + mock.get(poll_url, json=poll_response, status_code=200) + response = mock_pipeline.run(data="input_data") + + assert isinstance(response, PipelineResponse) + assert response.status == ResponseStatus.SUCCESS + + +def test_poll_success(mock_pipeline): + with requests_mock.Mocker() as mock: + poll_url = urljoin( + config.BACKEND_URL, f"assets/pipeline/execution/poll/{mock_pipeline.id}" + ) + poll_response = PipelineResponse( + status=ResponseStatus.SUCCESS, data={"output": "poll_result"} + ) + mock.get(poll_url, json=poll_response, status_code=200) + + response = mock_pipeline.poll(poll_url=poll_url) + + assert isinstance(response, PipelineResponse) + assert response.status == ResponseStatus.SUCCESS + assert response.data["output"] == "poll_result" def test_deploy_pipeline(): with requests_mock.Mocker() as mock: pipeline_id = "test-pipeline-id" url = urljoin(config.BACKEND_URL, f"sdk/pipelines/{pipeline_id}") - headers = {"Authorization": f"Token {config.TEAM_API_KEY}", "Content-Type": "application/json"} + headers = { + "Authorization": f"Token {config.TEAM_API_KEY}", + "Content-Type": "application/json", + } mock.put(url, headers=headers, json={"status": "SUCCESS", "id": pipeline_id}) - pipeline = Pipeline(id=pipeline_id, api_key=config.TEAM_API_KEY, name="Test Pipeline", url=config.BACKEND_URL) + pipeline = Pipeline( + id=pipeline_id, + api_key=config.TEAM_API_KEY, + name="Test Pipeline", + url=config.BACKEND_URL, + ) pipeline.deploy() assert pipeline.id == pipeline_id From 463becafe609f49c5d175c567d1fe86c0a5e1c3c Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Mon, 24 Feb 2025 16:50:27 +0100 Subject: [PATCH 12/36] BUG-400: pipeline_test tests fixed (#409) --- tests/unit/pipeline_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/pipeline_test.py b/tests/unit/pipeline_test.py index 5ef90376..b49e9da2 100644 --- a/tests/unit/pipeline_test.py +++ b/tests/unit/pipeline_test.py @@ -151,7 +151,7 @@ def test_run_async_success(mock_pipeline): success_response = PipelineResponse( status=ResponseStatus.SUCCESS, url=execute_url ) - mock.post(execute_url, json=success_response, status_code=200) + mock.post(execute_url, json=success_response.__dict__, status_code=200) response = mock_pipeline.run_async(data="input_data") @@ -171,8 +171,8 @@ def test_run_sync_success(mock_pipeline): poll_response = PipelineResponse( status=ResponseStatus.SUCCESS, data={"output": "poll_result"} ) - mock.post(execute_url, json=success_response, status_code=200) - mock.get(poll_url, json=poll_response, status_code=200) + mock.post(execute_url, json=success_response.__dict__, status_code=200) + mock.get(poll_url, json=poll_response.__dict__, status_code=200) response = mock_pipeline.run(data="input_data") assert isinstance(response, PipelineResponse) @@ -187,7 +187,7 @@ def test_poll_success(mock_pipeline): poll_response = PipelineResponse( status=ResponseStatus.SUCCESS, data={"output": "poll_result"} ) - mock.get(poll_url, json=poll_response, status_code=200) + mock.get(poll_url, json=poll_response.__dict__, status_code=200) response = mock_pipeline.poll(poll_url=poll_url) From 1acce590e4ea543384348b4c402f5f4b4423a373 Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Mon, 24 Feb 2025 23:56:39 +0100 Subject: [PATCH 13/36] BUG-382: Fixing validation of team and agents (#406) * BUG-382: Revisited validation handling for agents * BUG-382: Revisited validation handling for also team agents * BUG-382: is_valid flag employed for agents * BUG-382: default value for is_valid set true * BUG-382: logic fix * BUG-382: logic fix * BUG-382: Revisited agent crud validation logic --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> --- aixplain/factories/agent_factory/__init__.py | 2 +- aixplain/factories/agent_factory/utils.py | 95 ++++++++++------ .../factories/team_agent_factory/__init__.py | 2 +- .../factories/team_agent_factory/utils.py | 11 +- aixplain/modules/agent/__init__.py | 91 ++++++++++++--- aixplain/modules/team_agent/__init__.py | 106 ++++++++++++++---- .../functional/agent/agent_functional_test.py | 8 +- .../team_agent/team_agent_functional_test.py | 5 +- 8 files changed, 236 insertions(+), 84 deletions(-) diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index e1f18a36..71bc987e 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -122,7 +122,7 @@ def create( "tasks": [task.to_dict() for task in tasks], } agent = build_agent(payload=payload, api_key=api_key) - agent.validate() + agent.validate(raise_exception=True) response = "Unspecified error" try: logging.debug(f"Start service for POST Create Agent - {url} - {headers} - {json.dumps(agent.to_dict())}") diff --git a/aixplain/factories/agent_factory/utils.py b/aixplain/factories/agent_factory/utils.py index 6b96b8a9..bc1dc866 100644 --- a/aixplain/factories/agent_factory/utils.py +++ b/aixplain/factories/agent_factory/utils.py @@ -1,5 +1,6 @@ __author__ = "thiagocastroferreira" +import logging import aixplain.utils.config as config from aixplain.enums import Function, Supplier from aixplain.enums.asset_status import AssetStatus @@ -16,49 +17,69 @@ GPT_4o_ID = "6646261c6eb563165658bbb1" +def build_tool(tool: Dict): + """Build a tool from a dictionary. + + Args: + tool (Dict): Tool dictionary. + + Returns: + Tool: Tool object. + """ + if tool["type"] == "model": + supplier = "aixplain" + for supplier_ in Supplier: + if isinstance(tool["supplier"], str): + if tool["supplier"] is not None and tool["supplier"].lower() in [ + supplier_.value["code"].lower(), + supplier_.value["name"].lower(), + ]: + supplier = supplier_ + break + tool = ModelTool( + function=Function(tool.get("function", None)), + supplier=supplier, + version=tool["version"], + model=tool["assetId"], + description=tool.get("description", ""), + parameters=tool.get("parameters", None), + ) + elif tool["type"] == "pipeline": + tool = PipelineTool(description=tool["description"], pipeline=tool["assetId"]) + elif tool["type"] == "utility": + if tool.get("utilityCode", None) is not None: + tool = CustomPythonCodeTool(description=tool["description"], code=tool["utilityCode"]) + else: + tool = PythonInterpreterTool() + elif tool["type"] == "sql": + parameters = {parameter["name"]: parameter["value"] for parameter in tool.get("parameters", [])} + database = parameters.get("database") + schema = parameters.get("schema") + tables = parameters.get("tables", None) + tables = tables.split(",") if tables is not None else None + enable_commit = parameters.get("enable_commit", False) + tool = SQLTool( + description=tool["description"], database=database, schema=schema, tables=tables, enable_commit=enable_commit + ) + else: + raise Exception("Agent Creation Error: Tool type not supported.") + + return tool + + def build_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> Agent: """Instantiate a new agent in the platform.""" tools_dict = payload["assets"] tools = [] for tool in tools_dict: - if tool["type"] == "model": - supplier = "aixplain" - for supplier_ in Supplier: - if isinstance(tool["supplier"], str): - if tool["supplier"] is not None and tool["supplier"].lower() in [ - supplier_.value["code"].lower(), - supplier_.value["name"].lower(), - ]: - supplier = supplier_ - break - tool = ModelTool( - function=Function(tool.get("function", None)), - supplier=supplier, - version=tool["version"], - model=tool["assetId"], - description=tool.get("description", ""), - parameters=tool.get("parameters", None), + try: + tools.append(build_tool(tool)) + except Exception as e: + logging.warning( + f"Tool {tool['assetId']} is not available. Make sure it exists or you have access to it. " + "If you think this is an error, please contact the administrators." ) - elif tool["type"] == "pipeline": - tool = PipelineTool(description=tool["description"], pipeline=tool["assetId"]) - elif tool["type"] == "utility": - if tool.get("utilityCode", None) is not None: - tool = CustomPythonCodeTool(description=tool["description"], code=tool["utilityCode"]) - else: - tool = PythonInterpreterTool() - elif tool["type"] == "sql": - parameters = {parameter["name"]: parameter["value"] for parameter in tool.get("parameters", [])} - database = parameters.get("database") - schema = parameters.get("schema") - tables = parameters.get("tables", None) - tables = tables.split(",") if tables is not None else None - enable_commit = parameters.get("enable_commit", False) - tool = SQLTool( - description=tool["description"], database=database, schema=schema, tables=tables, enable_commit=enable_commit - ) - else: - raise Exception("Agent Creation Error: Tool type not supported.") - tools.append(tool) + continue agent = Agent( id=payload["id"] if "id" in payload else "", diff --git a/aixplain/factories/team_agent_factory/__init__.py b/aixplain/factories/team_agent_factory/__init__.py index 3fdb0855..7ecaad1a 100644 --- a/aixplain/factories/team_agent_factory/__init__.py +++ b/aixplain/factories/team_agent_factory/__init__.py @@ -102,7 +102,7 @@ def create( } team_agent = build_team_agent(payload=payload, api_key=api_key) - team_agent.validate() + team_agent.validate(raise_exception=True) response = "Unspecified error" try: logging.debug(f"Start service for POST Create TeamAgent - {url} - {headers} - {json.dumps(payload)}") diff --git a/aixplain/factories/team_agent_factory/utils.py b/aixplain/factories/team_agent_factory/utils.py index f10e6953..b6234f29 100644 --- a/aixplain/factories/team_agent_factory/utils.py +++ b/aixplain/factories/team_agent_factory/utils.py @@ -1,5 +1,6 @@ __author__ = "lucaspavanelli" +import logging import aixplain.utils.config as config from aixplain.enums.asset_status import AssetStatus from aixplain.modules.team_agent import TeamAgent @@ -16,8 +17,14 @@ def build_team_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> Team agents_dict = payload["agents"] agents = [] for i, agent in enumerate(agents_dict): - agent = AgentFactory.get(agent["assetId"]) - agents.append(agent) + try: + agents.append(AgentFactory.get(agent["assetId"])) + except Exception: + logging.warning( + f"Agent {agent['assetId']} not found. Make sure it exists or you have access to it. " + "If you think this is an error, please contact the administrators." + ) + continue team_agent = TeamAgent( id=payload.get("id", ""), diff --git a/aixplain/modules/agent/__init__.py b/aixplain/modules/agent/__init__.py index 83844c3c..c0209313 100644 --- a/aixplain/modules/agent/__init__.py +++ b/aixplain/modules/agent/__init__.py @@ -62,6 +62,8 @@ class Agent(Model): cost (Dict, optional): model price. Defaults to None. """ + is_valid: bool + def __init__( self, id: Text, @@ -107,8 +109,9 @@ def __init__( status = AssetStatus.DRAFT self.status = status self.tasks = tasks + self.is_valid = True - def validate(self) -> None: + def _validate(self) -> None: """Validate the Agent.""" from aixplain.factories.model_factory import ModelFactory @@ -119,15 +122,36 @@ def validate(self) -> None: try: llm = ModelFactory.get(self.llm_id, api_key=self.api_key) - assert llm.function == Function.TEXT_GENERATION, "Large Language Model must be a text generation model." except Exception: raise Exception(f"Large Language Model with ID '{self.llm_id}' not found.") + assert ( + llm.function == Function.TEXT_GENERATION + ), "Large Language Model must be a text generation model." + for tool in self.tools: if isinstance(tool, Tool): tool.validate() elif isinstance(tool, Model): - assert not isinstance(tool, Agent), "Agent cannot contain another Agent." + assert not isinstance( + tool, Agent + ), "Agent cannot contain another Agent." + + def validate(self, raise_exception: bool = False) -> bool: + """Validate the Agent.""" + try: + self._validate() + self.is_valid = True + except Exception as e: + self.is_valid = False + if raise_exception: + raise e + else: + logging.warning(f"Agent Validation Error: {e}") + logging.warning( + "You won't be able to run the Agent until the issues are handled manually." + ) + return self.is_valid def run( self, @@ -183,7 +207,9 @@ def run( return response poll_url = response["url"] end = time.time() - result = self.sync_poll(poll_url, name=name, timeout=timeout, wait_time=wait_time) + result = self.sync_poll( + poll_url, name=name, timeout=timeout, wait_time=wait_time + ) result_data = result.data return AgentResponse( status=ResponseStatus.SUCCESS, @@ -245,10 +271,19 @@ def run_async( """ from aixplain.factories.file_factory import FileFactory - assert data is not None or query is not None, "Either 'data' or 'query' must be provided." + if not self.is_valid: + raise Exception( + "Agent is not valid. Please validate the agent before running." + ) + + assert ( + data is not None or query is not None + ), "Either 'data' or 'query' must be provided." if data is not None: if isinstance(data, dict): - assert "query" in data and data["query"] is not None, "When providing a dictionary, 'query' must be provided." + assert ( + "query" in data and data["query"] is not None + ), "When providing a dictionary, 'query' must be provided." query = data.get("query") if session_id is None: session_id = data.get("session_id") @@ -261,7 +296,9 @@ def run_async( # process content inputs if content is not None: - assert FileFactory.check_storage_type(query) == StorageType.TEXT, "When providing 'content', query must be text." + assert ( + FileFactory.check_storage_type(query) == StorageType.TEXT + ), "When providing 'content', query must be text." if isinstance(content, list): assert len(content) <= 3, "The maximum number of content inputs is 3." @@ -270,7 +307,9 @@ def run_async( query += f"\n{input_link}" elif isinstance(content, dict): for key, value in content.items(): - assert "{{" + key + "}}" in query, f"Key '{key}' not found in query." + assert ( + "{{" + key + "}}" in query + ), f"Key '{key}' not found in query." value = FileFactory.to_link(value) query = query.replace("{{" + key + "}}", f"'{value}'") @@ -285,8 +324,16 @@ def run_async( "sessionId": session_id, "history": history, "executionParams": { - "maxTokens": parameters["max_tokens"] if "max_tokens" in parameters else max_tokens, - "maxIterations": parameters["max_iterations"] if "max_iterations" in parameters else max_iterations, + "maxTokens": ( + parameters["max_tokens"] + if "max_tokens" in parameters + else max_tokens + ), + "maxIterations": ( + parameters["max_iterations"] + if "max_iterations" in parameters + else max_iterations + ), "outputFormat": output_format.value, }, } @@ -320,7 +367,11 @@ def to_dict(self) -> Dict: "assets": [tool.to_dict() for tool in self.tools], "description": self.description, "role": self.instructions, - "supplier": self.supplier.value["code"] if isinstance(self.supplier, Supplier) else self.supplier, + "supplier": ( + self.supplier.value["code"] + if isinstance(self.supplier, Supplier) + else self.supplier + ), "version": self.version, "llmId": self.llm_id, "status": self.status.value, @@ -331,7 +382,10 @@ def delete(self) -> None: """Delete Agent service""" try: url = urljoin(config.BACKEND_URL, f"sdk/agents/{self.id}") - headers = {"x-api-key": config.TEAM_API_KEY, "Content-Type": "application/json"} + headers = { + "x-api-key": config.TEAM_API_KEY, + "Content-Type": "application/json", + } logging.debug(f"Start service for DELETE Agent - {url} - {headers}") r = _request_with_retry("delete", url, headers=headers) logging.debug(f"Result of request for DELETE Agent - {r.status_code}") @@ -355,19 +409,22 @@ def update(self) -> None: stack = inspect.stack() if len(stack) > 2 and stack[1].function != "save": warnings.warn( - "update() is deprecated and will be removed in a future version. " "Please use save() instead.", + "update() is deprecated and will be removed in a future version. " + "Please use save() instead.", DeprecationWarning, stacklevel=2, ) from aixplain.factories.agent_factory.utils import build_agent - self.validate() + self.validate(raise_exception=True) url = urljoin(config.BACKEND_URL, f"sdk/agents/{self.id}") headers = {"x-api-key": config.TEAM_API_KEY, "Content-Type": "application/json"} payload = self.to_dict() - logging.debug(f"Start service for PUT Update Agent - {url} - {headers} - {json.dumps(payload)}") + logging.debug( + f"Start service for PUT Update Agent - {url} - {headers} - {json.dumps(payload)}" + ) resp = "No specified error." try: r = _request_with_retry("put", url, headers=headers, json=payload) @@ -386,7 +443,9 @@ def save(self) -> None: self.update() def deploy(self) -> None: - assert self.status == AssetStatus.DRAFT, "Agent must be in draft status to be deployed." + assert ( + self.status == AssetStatus.DRAFT + ), "Agent must be in draft status to be deployed." assert self.status != AssetStatus.ONBOARDED, "Agent is already deployed." self.status = AssetStatus.ONBOARDED self.update() diff --git a/aixplain/modules/team_agent/__init__.py b/aixplain/modules/team_agent/__init__.py index 861d53a8..825967e8 100644 --- a/aixplain/modules/team_agent/__init__.py +++ b/aixplain/modules/team_agent/__init__.py @@ -61,6 +61,8 @@ class TeamAgent(Model): use_mentalist_and_inspector (bool): Use Mentalist and Inspector tools. Defaults to True. """ + is_valid: bool + def __init__( self, id: Text, @@ -105,6 +107,7 @@ def __init__( except Exception: status = AssetStatus.DRAFT self.status = status + self.is_valid = True def run( self, @@ -159,12 +162,18 @@ def run( return response poll_url = response["url"] end = time.time() - response = self.sync_poll(poll_url, name=name, timeout=timeout, wait_time=wait_time) + response = self.sync_poll( + poll_url, name=name, timeout=timeout, wait_time=wait_time + ) return response except Exception as e: logging.error(f"Team Agent Run: Error in running for {name}: {e}") end = time.time() - return AgentResponse(status=ResponseStatus.FAILED, completed=False, error_message="No response from the service.") + return AgentResponse( + status=ResponseStatus.FAILED, + completed=False, + error_message="No response from the service.", + ) def run_async( self, @@ -197,10 +206,19 @@ def run_async( """ from aixplain.factories.file_factory import FileFactory - assert data is not None or query is not None, "Either 'data' or 'query' must be provided." + if not self.is_valid: + raise Exception( + "Team Agent is not valid. Please validate the team agent before running." + ) + + assert ( + data is not None or query is not None + ), "Either 'data' or 'query' must be provided." if data is not None: if isinstance(data, dict): - assert "query" in data and data["query"] is not None, "When providing a dictionary, 'query' must be provided." + assert ( + "query" in data and data["query"] is not None + ), "When providing a dictionary, 'query' must be provided." if session_id is None: session_id = data.pop("session_id", None) if history is None: @@ -214,7 +232,8 @@ def run_async( # process content inputs if content is not None: assert ( - isinstance(query, str) and FileFactory.check_storage_type(query) == StorageType.TEXT + isinstance(query, str) + and FileFactory.check_storage_type(query) == StorageType.TEXT ), "When providing 'content', query must be text." if isinstance(content, list): @@ -224,7 +243,9 @@ def run_async( query += f"\n{input_link}" elif isinstance(content, dict): for key, value in content.items(): - assert "{{" + key + "}}" in query, f"Key '{key}' not found in query." + assert ( + "{{" + key + "}}" in query + ), f"Key '{key}' not found in query." value = FileFactory.to_link(value) query = query.replace("{{" + key + "}}", f"'{value}'") @@ -239,8 +260,16 @@ def run_async( "sessionId": session_id, "history": history, "executionParams": { - "maxTokens": parameters["max_tokens"] if "max_tokens" in parameters else max_tokens, - "maxIterations": parameters["max_iterations"] if "max_iterations" in parameters else max_iterations, + "maxTokens": ( + parameters["max_tokens"] + if "max_tokens" in parameters + else max_tokens + ), + "maxIterations": ( + parameters["max_iterations"] + if "max_iterations" in parameters + else max_iterations + ), "outputFormat": output_format.value, }, } @@ -248,7 +277,9 @@ def run_async( payload = json.dumps(payload) r = _request_with_retry("post", self.url, headers=headers, data=payload) - logging.info(f"Team Agent Run Async: Start service for {name} - {self.url} - {payload} - {headers}") + logging.info( + f"Team Agent Run Async: Start service for {name} - {self.url} - {payload} - {headers}" + ) resp = None try: @@ -269,15 +300,16 @@ def delete(self) -> None: """Delete Corpus service""" try: url = urljoin(config.BACKEND_URL, f"sdk/agent-communities/{self.id}") - headers = {"x-api-key": config.TEAM_API_KEY, "Content-Type": "application/json"} + headers = { + "x-api-key": config.TEAM_API_KEY, + "Content-Type": "application/json", + } logging.debug(f"Start service for DELETE Team Agent - {url} - {headers}") r = _request_with_retry("delete", url, headers=headers) if r.status_code != 200: raise Exception() except Exception: - message = ( - f"Team Agent Deletion Error (HTTP {r.status_code}): Make sure the Team Agent exists and you are the owner." - ) + message = f"Team Agent Deletion Error (HTTP {r.status_code}): Make sure the Team Agent exists and you are the owner." logging.error(message) raise Exception(f"{message}") @@ -286,7 +318,8 @@ def to_dict(self) -> Dict: "id": self.id, "name": self.name, "agents": [ - {"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"} for idx, agent in enumerate(self.agents) + {"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"} + for idx, agent in enumerate(self.agents) ], "links": [], "description": self.description, @@ -299,7 +332,7 @@ def to_dict(self) -> Dict: "status": self.status.value, } - def validate(self) -> None: + def _validate(self) -> None: """Validate the Team.""" from aixplain.factories.model_factory import ModelFactory @@ -310,12 +343,30 @@ def validate(self) -> None: try: llm = ModelFactory.get(self.llm_id) - assert llm.function == Function.TEXT_GENERATION, "Large Language Model must be a text generation model." + assert ( + llm.function == Function.TEXT_GENERATION + ), "Large Language Model must be a text generation model." except Exception: raise Exception(f"Large Language Model with ID '{self.llm_id}' not found.") for agent in self.agents: - agent.validate() + agent.validate(raise_exception=True) + + def validate(self, raise_exception: bool = False) -> bool: + try: + self._validate() + self.is_valid = True + except Exception as e: + self.is_valid = False + if raise_exception: + raise e + else: + logging.warning(f"Team Agent Validation Error: {e}") + logging.warning( + "You won't be able to run the Team Agent until the issues are handled manually." + ) + + return self.is_valid def update(self) -> None: """Update the Team Agent.""" @@ -326,25 +377,30 @@ def update(self) -> None: stack = inspect.stack() if len(stack) > 2 and stack[1].function != "save": warnings.warn( - "update() is deprecated and will be removed in a future version. " "Please use save() instead.", + "update() is deprecated and will be removed in a future version. " + "Please use save() instead.", DeprecationWarning, stacklevel=2, ) from aixplain.factories.team_agent_factory.utils import build_team_agent - self.validate() + self.validate(raise_exception=True) url = urljoin(config.BACKEND_URL, f"sdk/agent-communities/{self.id}") headers = {"x-api-key": config.TEAM_API_KEY, "Content-Type": "application/json"} payload = self.to_dict() - logging.debug(f"Start service for PUT Update Team Agent - {url} - {headers} - {json.dumps(payload)}") + logging.debug( + f"Start service for PUT Update Team Agent - {url} - {headers} - {json.dumps(payload)}" + ) resp = "No specified error." try: r = _request_with_retry("put", url, headers=headers, json=payload) resp = r.json() except Exception: - raise Exception("Team Agent Update Error: Please contact the administrators.") + raise Exception( + "Team Agent Update Error: Please contact the administrators." + ) if 200 <= r.status_code < 300: return build_team_agent(resp) @@ -358,7 +414,11 @@ def save(self) -> None: def deploy(self) -> None: """Deploy the Team Agent.""" - assert self.status == AssetStatus.DRAFT, "Team Agent Deployment Error: Team Agent must be in draft status." - assert self.status != AssetStatus.ONBOARDED, "Team Agent Deployment Error: Team Agent must be onboarded." + assert ( + self.status == AssetStatus.DRAFT + ), "Team Agent Deployment Error: Team Agent must be in draft status." + assert ( + self.status != AssetStatus.ONBOARDED + ), "Team Agent Deployment Error: Team Agent must be onboarded." self.status = AssetStatus.ONBOARDED self.update() diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index 1446af5a..882f92db 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -25,6 +25,7 @@ from aixplain.enums.function import Function from aixplain.enums.supplier import Supplier from uuid import uuid4 +from unittest.mock import patch import pytest @@ -201,7 +202,10 @@ def test_update_draft_agent(run_input_map, delete_agents_and_team_agents, AgentF @pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) def test_fail_non_existent_llm(delete_agents_and_team_agents, AgentFactory): assert delete_agents_and_team_agents - with pytest.raises(Exception) as exc_info: + + # Despite giving a non-existent LLM ID, the agent is created successfully + # but with given warning + with patch("logging.warning") as mock_warning: AgentFactory.create( name="Test Agent", description="Test description", @@ -209,7 +213,7 @@ def test_fail_non_existent_llm(delete_agents_and_team_agents, AgentFactory): llm_id="non_existent_llm", tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], ) - assert str(exc_info.value) == "Large Language Model with ID 'non_existent_llm' not found." + assert mock_warning.call_count == 2 @pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) diff --git a/tests/functional/team_agent/team_agent_functional_test.py b/tests/functional/team_agent/team_agent_functional_test.py index 1d2785f2..83cbbf7d 100644 --- a/tests/functional/team_agent/team_agent_functional_test.py +++ b/tests/functional/team_agent/team_agent_functional_test.py @@ -26,6 +26,7 @@ from copy import copy from uuid import uuid4 import pytest +from unittest.mock import patch from aixplain import aixplain_v2 as v2 @@ -167,7 +168,7 @@ def test_draft_team_agent_update(run_input_map, TeamAgentFactory): @pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) def test_fail_non_existent_llm(TeamAgentFactory): - with pytest.raises(Exception) as exc_info: + with patch("logging.warning") as mock_warning: AgentFactory.create( name="Test Agent", description="", @@ -175,7 +176,7 @@ def test_fail_non_existent_llm(TeamAgentFactory): llm_id="non_existent_llm", tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], ) - assert str(exc_info.value) == "Large Language Model with ID 'non_existent_llm' not found." + assert mock_warning.call_count == 2 @pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) From d84a60687f36235ff32c864a8b5625c12ffe52b0 Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Tue, 25 Feb 2025 09:45:39 -0300 Subject: [PATCH 14/36] Setting the version of the pipeline appropriately (#410) --- aixplain/modules/pipeline/asset.py | 99 +++++++++++------------------- 1 file changed, 35 insertions(+), 64 deletions(-) diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index 9fd48c70..cd47da87 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -114,9 +114,7 @@ def __polling( while not response_body["completed"] and (end - start) < timeout: try: response_body = self.poll(poll_url, name=name) - logging.debug( - f"Polling for Pipeline: Status of polling for {name} : {response_body}" - ) + logging.debug(f"Polling for Pipeline: Status of polling for {name} : {response_body}") end = time.time() if not response_body["completed"]: time.sleep(wait_time) @@ -127,13 +125,9 @@ def __polling( break if response_body["status"] == ResponseStatus.SUCCESS: try: - logging.debug( - f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}" - ) + logging.debug(f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}") except Exception: - logging.error( - f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}" - ) + logging.error(f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}") else: logging.error( f"Polling for Pipeline: Final status of polling for {name} : No response in {timeout} seconds - {response_body}" @@ -141,7 +135,7 @@ def __polling( return response_body def poll( - self, poll_url: Text, name: Text = "pipeline_process", version: Text = "v2" + self, poll_url: Text, name: Text = "pipeline_process", response_version: Text = "v2" ) -> Union[Dict, PipelineResponse]: """Poll the platform to check whether an asynchronous call is done. @@ -165,10 +159,8 @@ def poll( resp["data"] = json.loads(resp["data"])["response"] except Exception: resp = r.json() - logging.info( - f"Single Poll for Pipeline: Status of polling for {name} : {resp}" - ) - if version == "v1": + logging.info(f"Single Poll for Pipeline: Status of polling for {name} : {resp}") + if response_version == "v1": return resp status = ResponseStatus(resp.pop("status", "failed")) response = PipelineResponse( @@ -194,15 +186,16 @@ def run( name: Text = "pipeline_process", timeout: float = 20000.0, wait_time: float = 1.0, - version: Text = "v2", + version: Optional[Text] = None, + response_version: Text = "v2", **kwargs, ) -> Union[Dict, PipelineResponse]: start = time.time() try: - response = self.run_async(data, data_asset=data_asset, name=name, **kwargs) + response = self.run_async(data, data_asset=data_asset, name=name, version=version, **kwargs) if response["status"] == ResponseStatus.FAILED: end = time.time() - if version == "v1": + if response_version == "v1": return { "status": "failed", "error": response.get("error", "ERROR"), @@ -216,12 +209,10 @@ def run( **kwargs, ) poll_url = response["url"] - polling_response = self.__polling( - poll_url, name=name, timeout=timeout, wait_time=wait_time - ) + polling_response = self.__polling(poll_url, name=name, timeout=timeout, wait_time=wait_time) end = time.time() status = ResponseStatus(polling_response["status"]) - if version == "v1": + if response_version == "v1": polling_response["elapsed_time"] = end - start return polling_response status = ResponseStatus(polling_response.status) @@ -238,7 +229,7 @@ def run( logging.error(error_message) logging.exception(error_message) end = time.time() - if version == "v1": + if response_version == "v1": return { "status": "failed", "error": error_message, @@ -289,10 +280,7 @@ def __prepare_payload( try: payload = json.loads(data) if isinstance(payload, dict) is False: - if ( - isinstance(payload, int) is True - or isinstance(payload, float) is True - ): + if isinstance(payload, int) is True or isinstance(payload, float) is True: payload = str(payload) payload = {"data": payload} except Exception: @@ -330,9 +318,7 @@ def __prepare_payload( asset_payload["dataAsset"]["dataset_id"] = dasset.id source_data_list = [ - dfield - for dfield in dasset.source_data - if dasset.source_data[dfield].id == data[node_label] + dfield for dfield in dasset.source_data if dasset.source_data[dfield].id == data[node_label] ] if len(source_data_list) > 0: @@ -371,7 +357,8 @@ def run_async( data_asset: Optional[Union[Text, Dict]] = None, name: Text = "pipeline_process", batch_mode: bool = True, - version: str = None, + version: Optional[Text] = None, + response_version: Text = "v2", **kwargs, ) -> Dict: """Runs asynchronously a pipeline call. @@ -381,12 +368,13 @@ def run_async( data_asset (Optional[Union[Text, Dict]], optional): Data asset to be processed by the pipeline. Defaults to None. name (Text, optional): ID given to a call. Defaults to "pipeline_process". batch_mode (bool, optional): Whether to run the pipeline in batch mode or online. Defaults to True. + version (Optional[Text], optional): Version of the pipeline. Defaults to None. + response_version (Text, optional): Version of the response. Defaults to "v2". kwargs: A dictionary of keyword arguments. The keys are the argument names Returns: Dict: polling URL in response """ - version = version or self.VERSION_3_0 headers = { "x-api-key": self.api_key, "Content-Type": "application/json", @@ -404,10 +392,8 @@ def run_async( try: if 200 <= r.status_code < 300: resp = r.json() - logging.info( - f"Result of request for {name} - {r.status_code} - {resp}" - ) - if version == "v1": + logging.info(f"Result of request for {name} - {r.status_code} - {resp}") + if response_version == "v1": return resp res = PipelineResponse( status=ResponseStatus(resp.pop("status", "failed")), @@ -430,10 +416,12 @@ def run_async( error = "Validation-related error: Please ensure all required fields are provided and correctly formatted." else: status_code = str(r.status_code) - error = f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." + error = ( + f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." + ) logging.error(f"Error in request for {name} - {r.status_code}: {error}") - if version == "v1": + if response_version == "v1": return { "status": "failed", "error": error, @@ -447,7 +435,7 @@ def run_async( **kwargs, ) except Exception as e: - if version == "v1": + if response_version == "v1": return { "status": "failed", "error": str(e), @@ -485,8 +473,7 @@ def update( stack = inspect.stack() if len(stack) > 2 and stack[1].function != "save": warnings.warn( - "update() is deprecated and will be removed in a future version. " - "Please use save() instead.", + "update() is deprecated and will be removed in a future version. " "Please use save() instead.", DeprecationWarning, stacklevel=2, ) @@ -501,9 +488,7 @@ def update( for i, node in enumerate(pipeline["nodes"]): if "functionType" in node: - pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i][ - "functionType" - ].lower() + pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i]["functionType"].lower() # prepare payload status = "draft" if save_as_asset is True: @@ -521,9 +506,7 @@ def update( "Authorization": f"Token {api_key}", "Content-Type": "application/json", } - logging.info( - f"Start service for PUT Update Pipeline - {url} - {headers} - {json.dumps(payload)}" - ) + logging.info(f"Start service for PUT Update Pipeline - {url} - {headers} - {json.dumps(payload)}") r = _request_with_retry("put", url, headers=headers, json=payload) response = r.json() logging.info(f"Pipeline {response['id']} Updated.") @@ -574,15 +557,11 @@ def save( ), "Pipeline Update Error: Make sure the pipeline to be saved is in a JSON file." with open(pipeline) as f: pipeline = json.load(f) - self.update( - pipeline=pipeline, save_as_asset=save_as_asset, api_key=api_key - ) + self.update(pipeline=pipeline, save_as_asset=save_as_asset, api_key=api_key) for i, node in enumerate(pipeline["nodes"]): if "functionType" in node: - pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i][ - "functionType" - ].lower() + pipeline["nodes"][i]["functionType"] = pipeline["nodes"][i]["functionType"].lower() # prepare payload status = "draft" if save_as_asset is True: @@ -599,9 +578,7 @@ def save( "Authorization": f"Token {api_key}", "Content-Type": "application/json", } - logging.info( - f"Start service for Save Pipeline - {url} - {headers} - {json.dumps(payload)}" - ) + logging.info(f"Start service for Save Pipeline - {url} - {headers} - {json.dumps(payload)}") r = _request_with_retry("post", url, headers=headers, json=payload) response = r.json() self.id = response["id"] @@ -611,17 +588,11 @@ def save( def deploy(self, api_key: Optional[Text] = None) -> None: """Deploy the Pipeline.""" - assert ( - self.status == "draft" - ), "Pipeline Deployment Error: Pipeline must be in draft status." - assert ( - self.status != "onboarded" - ), "Pipeline Deployment Error: Pipeline must be onboarded." + assert self.status == "draft", "Pipeline Deployment Error: Pipeline must be in draft status." + assert self.status != "onboarded", "Pipeline Deployment Error: Pipeline must be onboarded." pipeline = self.to_dict() - self.update( - pipeline=pipeline, save_as_asset=True, api_key=api_key, name=self.name - ) + self.update(pipeline=pipeline, save_as_asset=True, api_key=api_key, name=self.name) self.status = AssetStatus.ONBOARDED def __repr__(self): From a48fc2db20b1f86bd25607c62f44805964a12bfc Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Tue, 25 Feb 2025 22:46:53 +0100 Subject: [PATCH 15/36] BUG-382 tests fixed (#415) --- tests/functional/agent/agent_functional_test.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index 882f92db..1446af5a 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -25,7 +25,6 @@ from aixplain.enums.function import Function from aixplain.enums.supplier import Supplier from uuid import uuid4 -from unittest.mock import patch import pytest @@ -202,10 +201,7 @@ def test_update_draft_agent(run_input_map, delete_agents_and_team_agents, AgentF @pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) def test_fail_non_existent_llm(delete_agents_and_team_agents, AgentFactory): assert delete_agents_and_team_agents - - # Despite giving a non-existent LLM ID, the agent is created successfully - # but with given warning - with patch("logging.warning") as mock_warning: + with pytest.raises(Exception) as exc_info: AgentFactory.create( name="Test Agent", description="Test description", @@ -213,7 +209,7 @@ def test_fail_non_existent_llm(delete_agents_and_team_agents, AgentFactory): llm_id="non_existent_llm", tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], ) - assert mock_warning.call_count == 2 + assert str(exc_info.value) == "Large Language Model with ID 'non_existent_llm' not found." @pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) From 3abe6091c68b454cedc0b2c98619630ee732f4b9 Mon Sep 17 00:00:00 2001 From: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Date: Wed, 26 Feb 2025 08:41:41 -0300 Subject: [PATCH 16/36] Fix ModelFactory.get() calls in agent/team_agent.create() (#411) --- aixplain/factories/agent_factory/__init__.py | 4 +- aixplain/factories/agent_factory/utils.py | 29 +++++++------ .../factories/team_agent_factory/__init__.py | 18 +++++--- .../factories/team_agent_factory/utils.py | 29 +++++++------ aixplain/modules/agent/tool/model_tool.py | 3 ++ tests/unit/agent/agent_test.py | 43 +++++++++---------- tests/unit/agent/model_tool_test.py | 2 + 7 files changed, 70 insertions(+), 58 deletions(-) diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index 71bc987e..deae3fe9 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -121,7 +121,7 @@ def create( "status": "draft", "tasks": [task.to_dict() for task in tasks], } - agent = build_agent(payload=payload, api_key=api_key) + agent = build_agent(payload=payload, tools=tools, api_key=api_key) agent.validate(raise_exception=True) response = "Unspecified error" try: @@ -132,7 +132,7 @@ def create( raise Exception("Agent Onboarding Error: Please contact the administrators.") if 200 <= r.status_code < 300: - agent = build_agent(payload=response, api_key=api_key) + agent = build_agent(payload=response, tools=tools, api_key=api_key) else: error_msg = f"Agent Onboarding Error: {response}" if "message" in response: diff --git a/aixplain/factories/agent_factory/utils.py b/aixplain/factories/agent_factory/utils.py index bc1dc866..d64ab773 100644 --- a/aixplain/factories/agent_factory/utils.py +++ b/aixplain/factories/agent_factory/utils.py @@ -5,13 +5,14 @@ from aixplain.enums import Function, Supplier from aixplain.enums.asset_status import AssetStatus from aixplain.modules.agent import Agent +from aixplain.modules.agent.tool import Tool from aixplain.modules.agent.agent_task import AgentTask from aixplain.modules.agent.tool.model_tool import ModelTool from aixplain.modules.agent.tool.pipeline_tool import PipelineTool from aixplain.modules.agent.tool.python_interpreter_tool import PythonInterpreterTool from aixplain.modules.agent.tool.custom_python_code_tool import CustomPythonCodeTool from aixplain.modules.agent.tool.sql_tool import SQLTool -from typing import Dict, Text +from typing import Dict, Text, List from urllib.parse import urljoin GPT_4o_ID = "6646261c6eb563165658bbb1" @@ -67,24 +68,26 @@ def build_tool(tool: Dict): return tool -def build_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> Agent: +def build_agent(payload: Dict, tools: List[Tool] = None, api_key: Text = config.TEAM_API_KEY) -> Agent: """Instantiate a new agent in the platform.""" tools_dict = payload["assets"] - tools = [] - for tool in tools_dict: - try: - tools.append(build_tool(tool)) - except Exception as e: - logging.warning( - f"Tool {tool['assetId']} is not available. Make sure it exists or you have access to it. " - "If you think this is an error, please contact the administrators." - ) - continue + payload_tools = tools + if payload_tools is None: + payload_tools = [] + for tool in tools_dict: + try: + payload_tools.append(build_tool(tool)) + except Exception: + logging.warning( + f"Tool {tool['assetId']} is not available. Make sure it exists or you have access to it. " + "If you think this is an error, please contact the administrators." + ) + continue agent = Agent( id=payload["id"] if "id" in payload else "", name=payload.get("name", ""), - tools=tools, + tools=payload_tools, description=payload.get("description", ""), instructions=payload.get("role", ""), supplier=payload.get("teamId", None), diff --git a/aixplain/factories/team_agent_factory/__init__.py b/aixplain/factories/team_agent_factory/__init__.py index 7ecaad1a..e17841e6 100644 --- a/aixplain/factories/team_agent_factory/__init__.py +++ b/aixplain/factories/team_agent_factory/__init__.py @@ -51,19 +51,23 @@ def create( ) -> TeamAgent: """Create a new team agent in the platform.""" assert len(agents) > 0, "TeamAgent Onboarding Error: At least one agent must be provided." + agent_list = [] for agent in agents: if isinstance(agent, Text) is True: try: from aixplain.factories.agent_factory import AgentFactory - agent = AgentFactory.get(agent) + agent_obj = AgentFactory.get(agent) except Exception: raise Exception(f"TeamAgent Onboarding Error: Agent {agent} does not exist.") else: from aixplain.modules.agent import Agent + agent_obj = agent + assert isinstance(agent, Agent), "TeamAgent Onboarding Error: Agents must be instances of Agent class" - + agent_list.append(agent_obj) + if use_inspector and not use_mentalist: raise Exception("TeamAgent Onboarding Error: To use the Inspector agent, you must enable Mentalist.") @@ -83,13 +87,13 @@ def create( elif isinstance(supplier, Supplier): supplier = supplier.value["code"] - agent_list = [] + agent_payload_list = [] for idx, agent in enumerate(agents): - agent_list.append({"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"}) + agent_payload_list.append({"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"}) payload = { "name": name, - "agents": agent_list, + "agents": agent_payload_list, "links": [], "description": description, "llmId": llm_id, @@ -101,7 +105,7 @@ def create( "status": "draft", } - team_agent = build_team_agent(payload=payload, api_key=api_key) + team_agent = build_team_agent(payload=payload, agents=agent_list, api_key=api_key) team_agent.validate(raise_exception=True) response = "Unspecified error" try: @@ -112,7 +116,7 @@ def create( raise Exception(e) if 200 <= r.status_code < 300: - team_agent = build_team_agent(payload=response, api_key=api_key) + team_agent = build_team_agent(payload=response, agents=agent_list, api_key=api_key) else: error_msg = f"{response}" if "message" in response: diff --git a/aixplain/factories/team_agent_factory/utils.py b/aixplain/factories/team_agent_factory/utils.py index b6234f29..5e865cd0 100644 --- a/aixplain/factories/team_agent_factory/utils.py +++ b/aixplain/factories/team_agent_factory/utils.py @@ -3,33 +3,36 @@ import logging import aixplain.utils.config as config from aixplain.enums.asset_status import AssetStatus +from aixplain.modules.agent import Agent from aixplain.modules.team_agent import TeamAgent -from typing import Dict, Text +from typing import Dict, Text, List from urllib.parse import urljoin GPT_4o_ID = "6646261c6eb563165658bbb1" -def build_team_agent(payload: Dict, api_key: Text = config.TEAM_API_KEY) -> TeamAgent: +def build_team_agent(payload: Dict, agents: List[Agent] = None, api_key: Text = config.TEAM_API_KEY) -> TeamAgent: """Instantiate a new team agent in the platform.""" from aixplain.factories.agent_factory import AgentFactory agents_dict = payload["agents"] - agents = [] - for i, agent in enumerate(agents_dict): - try: - agents.append(AgentFactory.get(agent["assetId"])) - except Exception: - logging.warning( - f"Agent {agent['assetId']} not found. Make sure it exists or you have access to it. " - "If you think this is an error, please contact the administrators." - ) - continue + payload_agents = agents + if payload_agents is None: + payload_agents = [] + for i, agent in enumerate(agents_dict): + try: + payload_agents.append(AgentFactory.get(agent["assetId"])) + except Exception: + logging.warning( + f"Agent {agent['assetId']} not found. Make sure it exists or you have access to it. " + "If you think this is an error, please contact the administrators." + ) + continue team_agent = TeamAgent( id=payload.get("id", ""), name=payload.get("name", ""), - agents=agents, + agents=payload_agents, description=payload.get("description", ""), supplier=payload.get("teamId", None), version=payload.get("version", None), diff --git a/aixplain/modules/agent/tool/model_tool.py b/aixplain/modules/agent/tool/model_tool.py index 5175b1b4..f0cb88e7 100644 --- a/aixplain/modules/agent/tool/model_tool.py +++ b/aixplain/modules/agent/tool/model_tool.py @@ -114,6 +114,9 @@ def to_dict(self) -> Dict: def validate(self) -> Model: from aixplain.factories.model_factory import ModelFactory + if self.model_object is not None: + return self.model_object + try: model = None if self.model is not None: diff --git a/tests/unit/agent/agent_test.py b/tests/unit/agent/agent_test.py index 2685be77..e60f116b 100644 --- a/tests/unit/agent/agent_test.py +++ b/tests/unit/agent/agent_test.py @@ -160,13 +160,13 @@ def test_create_agent(mock_model_factory_get): { "type": "utility", "utility": "custom_python_code", - "description": "", + "utilityCode": "def main(query: str) -> str:\n return 'Hello, how are you?'", + "description": "Test Tool", }, { "type": "utility", "utility": "custom_python_code", - "utilityCode": "def main(query: str) -> str:\n return 'Hello, how are you?'", - "description": "Test Tool", + "description": "", }, ], } @@ -209,10 +209,9 @@ def test_create_agent(mock_model_factory_get): assert agent.tools[0].description == ref_response["assets"][0]["description"] assert isinstance(agent.tools[0], ModelTool) assert agent.tools[1].description == ref_response["assets"][1]["description"] - assert isinstance(agent.tools[1], PythonInterpreterTool) + assert isinstance(agent.tools[1], CustomPythonCodeTool) assert agent.tools[2].description == ref_response["assets"][2]["description"] - assert agent.tools[2].code == ref_response["assets"][2]["utilityCode"] - assert isinstance(agent.tools[2], CustomPythonCodeTool) + assert isinstance(agent.tools[2], PythonInterpreterTool) assert agent.status == AssetStatus.DRAFT @@ -731,14 +730,13 @@ def test_create_agent_with_model_instance(mock_model_factory_get, mock_validate) # Verify the tool was converted correctly tool = agent.tools[0] - assert isinstance(tool, ModelTool) - assert tool.model == "model123" - assert tool.function == Function.TEXT_GENERATION - assert tool.supplier == Supplier.AIXPLAIN - assert isinstance(tool.model_object, Model) - assert isinstance(tool.model_object.model_params, ModelParameters) - assert tool.model_object.model_params.parameters["temperature"].required - assert not tool.model_object.model_params.parameters["max_tokens"].required + assert isinstance(tool, Model) + assert tool.name == model_tool.name + assert tool.function == model_tool.function + assert tool.supplier == model_tool.supplier + assert isinstance(tool.model_params, ModelParameters) + assert tool.model_params.parameters["temperature"].required + assert not tool.model_params.parameters["max_tokens"].required @patch("aixplain.modules.agent.tool.model_tool.ModelTool.validate", autospec=True) @@ -862,16 +860,15 @@ def validate_side_effect(self, *args, **kwargs): assert agent.description == ref_response["description"] assert len(agent.tools) == 2 - # Verify the first tool (Model instance converted to ModelTool) + # Verify the first tool (Model) tool1 = agent.tools[0] - assert isinstance(tool1, ModelTool) - assert tool1.model == "model123" - assert tool1.function == Function.TEXT_GENERATION - assert tool1.supplier == Supplier.AIXPLAIN - assert isinstance(tool1.model_object, Model) - assert isinstance(tool1.model_object.model_params, ModelParameters) - assert tool1.model_object.model_params.parameters["temperature"].required - assert not tool1.model_object.model_params.parameters["max_tokens"].required + assert isinstance(tool1, Model) + assert tool1.name == model_tool.name + assert tool1.function == model_tool.function + assert tool1.supplier == model_tool.supplier + assert isinstance(tool1.model_params, ModelParameters) + assert tool1.model_params.parameters["temperature"].required + assert not tool1.model_params.parameters["max_tokens"].required # Verify the second tool (regular ModelTool) tool2 = agent.tools[1] diff --git a/tests/unit/agent/model_tool_test.py b/tests/unit/agent/model_tool_test.py index 84770fc5..bb849d8f 100644 --- a/tests/unit/agent/model_tool_test.py +++ b/tests/unit/agent/model_tool_test.py @@ -115,6 +115,7 @@ def test_validate(mock_model, mock_model_factory, model_exists): tool = ModelTool() tool.model = "test_model_id" tool.api_key = None + tool.model_object = None validated_model = tool.validate() assert validated_model == mock_model else: @@ -123,6 +124,7 @@ def test_validate(mock_model, mock_model_factory, model_exists): tool = ModelTool() tool.model = "nonexistent_model" tool.api_key = None + tool.model_object = None with pytest.raises(Exception, match="Model Tool Unavailable"): tool.validate() From 78dde574cd1512d6cb1bd289a3906dcf75f74278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Wed, 26 Feb 2025 17:47:10 +0300 Subject: [PATCH 17/36] 'tatus ->status bug fixed ' (#416) * 'tatus ->status bug fixed ' * unit test added for parameter 'status' in agentresponse * ignore e203 in flake as it conflicts with black --- .pre-commit-config.yaml | 4 +- aixplain/modules/agent/agent_response.py | 2 +- tests/unit/agent/agent_test.py | 65 +++++++++++++++++++++--- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c6b06079..456aba3b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,5 +21,5 @@ repos: rev: v2.0.0 # Use the latest version hooks: - id: flake8 - args: # arguments to configure black - - --ignore=E402,E501 \ No newline at end of file + args: # arguments to configure flake8 + - --ignore=E402,E501,E203 \ No newline at end of file diff --git a/aixplain/modules/agent/agent_response.py b/aixplain/modules/agent/agent_response.py index 9ece7aa7..73c5e839 100644 --- a/aixplain/modules/agent/agent_response.py +++ b/aixplain/modules/agent/agent_response.py @@ -52,5 +52,5 @@ def to_dict(self) -> Dict[Text, Any]: return base_dict def __repr__(self) -> str: - fields = super().__repr__().strip("ModelResponse(").rstrip(")") + fields = super().__repr__()[len("ModelResponse(") : -1] return f"AgentResponse({fields})" diff --git a/tests/unit/agent/agent_test.py b/tests/unit/agent/agent_test.py index e60f116b..8afda296 100644 --- a/tests/unit/agent/agent_test.py +++ b/tests/unit/agent/agent_test.py @@ -108,9 +108,9 @@ def test_invalid_llm_id(): def test_invalid_agent_name(): with pytest.raises(Exception) as exc_info: AgentFactory.create(name="[Test]", description="", instructions="", tools=[], llm_id="6646261c6eb563165658bbb1") - assert ( - str(exc_info.value) - == "Agent Creation Error: Agent name contains invalid characters. Only alphanumeric characters, spaces, hyphens, and brackets are allowed." + assert str(exc_info.value) == ( + "Agent Creation Error: Agent name contains invalid characters. " + "Only alphanumeric characters, spaces, hyphens, and brackets are allowed." ) @@ -299,7 +299,7 @@ def test_update_success(mock_model_factory_get): # Capture warnings with pytest.warns( DeprecationWarning, - match="update\(\) is deprecated and will be removed in a future version. Please use save\(\) instead.", + match="update\(\) is deprecated and will be removed in a future version. Please use save\(\) instead.", # noqa: W605 ): agent.update() @@ -411,9 +411,10 @@ def test_run_variable_error(): agent = Agent("123", "Test Agent", "Translate the input data into {target_language}", "Test Agent Role") with pytest.raises(Exception) as exc_info: agent.run_async(data={"query": "Hello, how are you?"}, output_format=OutputFormat.MARKDOWN) - assert ( - str(exc_info.value) - == "Variable 'target_language' not found in data or parameters. This variable is required by the agent according to its description ('Translate the input data into {target_language}')." + assert str(exc_info.value) == ( + "Variable 'target_language' not found in data or parameters. " + "This variable is required by the agent according to its description " + "('Translate the input data into {target_language}')." ) @@ -910,3 +911,53 @@ def test_create_model_tool_with_text_supplier(supplier_input, expected_supplier, assert tool.supplier.name == expected_supplier assert tool.function == Function.TEXT_GENERATION assert tool.description == "Test Tool" + + +def test_agent_response_repr(): + from aixplain.enums import ResponseStatus + from aixplain.modules.agent.agent_response import AgentResponse, AgentResponseData + + # Test case 1: Basic representation + response = AgentResponse(status=ResponseStatus.SUCCESS, data=AgentResponseData(input="test input"), completed=True) + repr_str = repr(response) + + # Verify the representation starts with "AgentResponse(" + assert repr_str.startswith("AgentResponse(") + assert repr_str.endswith(")") + + # Verify key fields are present and correct + assert "status=SUCCESS" in repr_str + assert "completed=True" in repr_str + + # Test case 2: Complex representation with all fields + response = AgentResponse( + status=ResponseStatus.SUCCESS, + data=AgentResponseData( + input="test input", + output="test output", + session_id="test_session", + intermediate_steps=["step1", "step2"], + execution_stats={"time": 1.0}, + ), + details={"test": "details"}, + completed=True, + error_message="no error", + used_credits=0.5, + run_time=1.0, + usage={"tokens": 100}, + url="http://test.url", + ) + repr_str = repr(response) + + # Verify all fields are present and formatted correctly + assert "status=SUCCESS" in repr_str + assert "completed=True" in repr_str + assert "error_message='no error'" in repr_str + assert "used_credits=0.5" in repr_str + assert "run_time=1.0" in repr_str + assert "url='http://test.url'" in repr_str + assert "details={'test': 'details'}" in repr_str + assert "usage={'tokens': 100}" in repr_str + + # Most importantly, verify that 'status' is complete (not 'tatus') + assert "status=" in repr_str # Should find complete field name From 18910409c26f87a0c0f2c0f8976eebe357734e1a Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Wed, 26 Feb 2025 18:05:47 +0100 Subject: [PATCH 18/36] BUG-382: fixed tests (#418) * BUG-382: fixed tests * BUG-382: fixed tests --- .../team_agent/team_agent_functional_test.py | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/tests/functional/team_agent/team_agent_functional_test.py b/tests/functional/team_agent/team_agent_functional_test.py index 83cbbf7d..c76dc8eb 100644 --- a/tests/functional/team_agent/team_agent_functional_test.py +++ b/tests/functional/team_agent/team_agent_functional_test.py @@ -26,7 +26,6 @@ from copy import copy from uuid import uuid4 import pytest -from unittest.mock import patch from aixplain import aixplain_v2 as v2 @@ -167,16 +166,46 @@ def test_draft_team_agent_update(run_input_map, TeamAgentFactory): @pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) -def test_fail_non_existent_llm(TeamAgentFactory): - with patch("logging.warning") as mock_warning: - AgentFactory.create( - name="Test Agent", +def test_fail_non_existent_llm(run_input_map, TeamAgentFactory): + for team in TeamAgentFactory.list()["results"]: + team.delete() + for agent in AgentFactory.list()["results"]: + agent.delete() + + agents = [] + for agent in run_input_map["agents"]: + tools = [] + if "model_tools" in agent: + for tool in agent["model_tools"]: + tool_ = copy(tool) + for supplier in Supplier: + if tool["supplier"] is not None and tool["supplier"].lower() in [ + supplier.value["code"].lower(), + supplier.value["name"].lower(), + ]: + tool_["supplier"] = supplier + break + tools.append(AgentFactory.create_model_tool(**tool_)) + if "pipeline_tools" in agent: + for tool in agent["pipeline_tools"]: + tools.append(AgentFactory.create_pipeline_tool(pipeline=tool["pipeline_id"], description=tool["description"])) + + agent = AgentFactory.create( + name=agent["agent_name"], + description=agent["agent_name"], + instructions=agent["agent_name"], + llm_id=agent["llm_id"], + tools=tools, + ) + agents.append(agent) + with pytest.raises(Exception) as exc_info: + TeamAgentFactory.create( + name="Non Existent LLM", description="", - instructions="", llm_id="non_existent_llm", - tools=[AgentFactory.create_model_tool(function=Function.TRANSLATION)], + agents=agents, ) - assert mock_warning.call_count == 2 + assert str(exc_info.value) == "Large Language Model with ID 'non_existent_llm' not found." @pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) From a4ba161750a394120928dfd7a874baafe0137882 Mon Sep 17 00:00:00 2001 From: Zaina Abu Shaban Date: Fri, 7 Mar 2025 23:22:10 +0300 Subject: [PATCH 19/36] removed pipeline test file (#425) --- pipeline_test2.ipynb | 304 ------------------------------------------- 1 file changed, 304 deletions(-) delete mode 100644 pipeline_test2.ipynb diff --git a/pipeline_test2.ipynb b/pipeline_test2.ipynb deleted file mode 100644 index 5f30a4ff..00000000 --- a/pipeline_test2.ipynb +++ /dev/null @@ -1,304 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "os.environ[\"BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", - "os.environ[\"BENCHMARKS_BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", - "os.environ[\"MODELS_RUN_URL\"] = \"https://test-models.aixplain.com/api/v1/execute\"\n", - "os.environ[\"TEAM_API_KEY\"] = \"500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting filetype\n", - " Using cached filetype-1.2.0-py2.py3-none-any.whl.metadata (6.5 kB)\n", - "Using cached filetype-1.2.0-py2.py3-none-any.whl (19 kB)\n", - "Installing collected packages: filetype\n", - "Successfully installed filetype-1.2.0\n" - ] - } - ], - "source": [ - "!pip install filetype\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", - "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", - "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", \"version\": \"2.0\"}\n", - "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzA5OTg5MDh9.GTfkF9vgkJ8bcsxly21LBNALnoE276EocQsa2A_7xbA', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cf9728ff-9a38-4cf8-87c8-41edf2ad46eb'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cf9728ff-9a38-4cf8-87c8-41edf2ad46eb', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb.txt'}}\n", - "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", - "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", - "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "resp in poll\n", - "{'message': 'Not Found', 'statusCode': 404}\n", - "poll response\n", - "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", - "RESPONSE DICT\n", - "{'status': , 'error': '', 'elapsed_time': 2.3139090538024902, 'data': {}, 'version': '2.0'}\n" - ] - }, - { - "data": { - "text/plain": [ - "PipelineResponse(status=failed, elapsed_time=2.3139090538024902, version='2.0')" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# FAIL - v2.0\n", - "from aixplain.factories import PipelineFactory\n", - "\n", - "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", - "pipeline.run(\"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", **{ \"version\": \"2.0\" })\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", - "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", - "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", \"version\": \"3.0\"}\n", - "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/a243c99a-e1a7-4906-8122-6cd364c049da', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzA5OTg5Mjh9.4cjE6RYjeZ80fXwDRm_iNyK1CgoKg-f_hzHJ6AaMoFw', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'a243c99a-e1a7-4906-8122-6cd364c049da'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'a243c99a-e1a7-4906-8122-6cd364c049da', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/a243c99a-e1a7-4906-8122-6cd364c049da.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/a243c99a-e1a7-4906-8122-6cd364c049da.txt'}}\n", - "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", - "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", - "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "resp in poll\n", - "{'message': 'Not Found', 'statusCode': 404}\n", - "poll response\n", - "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", - "RESPONSE DICT\n", - "{'status': , 'error': '', 'elapsed_time': 2.074692964553833, 'data': {}, 'version': '3.0'}\n" - ] - }, - { - "data": { - "text/plain": [ - "PipelineResponse(status=failed, elapsed_time=2.074692964553833, version='3.0')" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# FAIL - v3.0\n", - "from aixplain.factories import PipelineFactory\n", - "\n", - "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", - "pipeline.run(\"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", **{ \"version\": \"3.0\" })\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", - "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", - "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"Hello\", \"version\": \"2.0\"}\n", - "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "r in run_async\n", - "{'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n", - "res in run_async\n", - "{'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n", - "response in run\n", - "PipelineResponse(status=in_progress, version='2.0')\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", - "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", - "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "resp in poll\n", - "{'message': 'Not Found', 'statusCode': 404}\n", - "pipeline response in poll\n", - "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", - "poll response\n", - "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", - "Response Attributes:\n", - "status: failed\n", - "error: \n", - "elapsed_time: 1.6289851665496826\n", - "data: None\n", - "additional_fields: {'version': '2.0'}\n", - "url: \n" - ] - }, - { - "data": { - "text/plain": [ - "PipelineResponse(status=failed, elapsed_time=1.6289851665496826, version='2.0')" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# SUCCESS - v2.0\n", - "from aixplain.factories import PipelineFactory\n", - "\n", - "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", - "pipeline.run(\"Hello\", **{ \"version\": \"2.0\" })" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", - "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", - "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", - "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"Hello\", \"version\": \"3.0\"}\n", - "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/1900e25d-f596-4bcd-81aa-b49468b1fd83', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwNzA2NTB9.jbY0kUN_mN4CpB5VNqabCtVh_mV0TPCgkuXd9V60iLQ', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt'}}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "resp in run_async {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/1900e25d-f596-4bcd-81aa-b49468b1fd83', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwNzA2NTB9.jbY0kUN_mN4CpB5VNqabCtVh_mV0TPCgkuXd9V60iLQ', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", - "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", - "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "resp in poll {'message': 'Not Found', 'statusCode': 404}\n", - "polling_response in run PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" - ] - }, - { - "data": { - "text/plain": [ - "PipelineResponse(status=failed, elapsed_time=1.6351401805877686, version='3.0')" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# SUCCESS - v3.0\n", - "import os\n", - "os.environ[\"BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", - "os.environ[\"BENCHMARKS_BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", - "os.environ[\"MODELS_RUN_URL\"] = \"https://test-models.aixplain.com/api/v1/execute\"\n", - "os.environ[\"TEAM_API_KEY\"] = \"500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356\"\n", - "\n", - "\n", - "from aixplain.factories import PipelineFactory\n", - "\n", - "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", - "pipeline.run(\"Hello\", **{ \"version\": \"3.0\" })" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (pytorch)", - "language": "python", - "name": "pytorch" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.12" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 11001eac91969bcfc8a9f0ab1f5b933f497bd353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Sat, 8 Mar 2025 01:06:33 +0300 Subject: [PATCH 20/36] Eng 1392 sqllite (#421) * SQL Tool feature * Function tests for sql tool * Enable multiple tables and constraint size of SQLite file * Enable more than one table * Constrain the size of the database * Enable commit on SQL tool * Improving SQL tool functional test * added csv support to sql tool * create_sql_tool_from_csv added * updated the functional test of sqltool and removed Agent method * revert v2 deletion * new sql format added * Source type must be provided --------- Co-authored-by: Thiago Castro Ferreira --- aixplain/enums/__init__.py | 2 + aixplain/enums/database_source.py | 47 +++ aixplain/factories/agent_factory/__init__.py | 115 ++++++- aixplain/modules/agent/tool/sql_tool.py | 262 ++++++++++++++- aixplain/v2/agent.py | 42 ++- .../functional/agent/agent_functional_test.py | 75 ++++- tests/unit/agent/sql_tool_test.py | 297 +++++++++++++++++- 7 files changed, 814 insertions(+), 26 deletions(-) create mode 100644 aixplain/enums/database_source.py diff --git a/aixplain/enums/__init__.py b/aixplain/enums/__init__.py index ef497ddd..555f4920 100644 --- a/aixplain/enums/__init__.py +++ b/aixplain/enums/__init__.py @@ -1,3 +1,4 @@ +# flake8: noqa: F401 // to ignore the F401 (unused import) from .data_split import DataSplit from .data_subtype import DataSubtype from .data_type import DataType @@ -14,3 +15,4 @@ from .sort_by import SortBy from .sort_order import SortOrder from .response_status import ResponseStatus +from .database_source import DatabaseSourceType diff --git a/aixplain/enums/database_source.py b/aixplain/enums/database_source.py new file mode 100644 index 00000000..7c5eaa67 --- /dev/null +++ b/aixplain/enums/database_source.py @@ -0,0 +1,47 @@ +__author__ = "aiXplain" + +""" +Copyright 2024 The aiXplain SDK authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Author: Lucas Pavanelli and Thiago Castro Ferreira and Ahmet Gunduz +Date: March 7th 2025 +Description: + Database Source Type Enum +""" + +from enum import Enum + + +class DatabaseSourceType(Enum): + """Enum for database source types""" + + POSTGRESQL = "postgresql" + SQLITE = "sqlite" + CSV = "csv" + + @classmethod + def from_string(cls, source_type: str) -> "DatabaseSourceType": + """Convert string to DatabaseSourceType enum + + Args: + source_type (str): Source type string + + Returns: + DatabaseSourceType: Corresponding enum value + """ + try: + return cls[source_type.upper()] + except KeyError: + raise ValueError(f"Invalid source type: {source_type}") diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index deae3fe9..af59f17f 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -24,6 +24,7 @@ import json import logging import warnings +import os from aixplain.enums.function import Function from aixplain.enums.supplier import Supplier @@ -32,7 +33,9 @@ from aixplain.modules.agent.tool.pipeline_tool import PipelineTool from aixplain.modules.agent.tool.python_interpreter_tool import PythonInterpreterTool from aixplain.modules.agent.tool.custom_python_code_tool import CustomPythonCodeTool -from aixplain.modules.agent.tool.sql_tool import SQLTool +from aixplain.modules.agent.tool.sql_tool import ( + SQLTool, +) from aixplain.modules.model import Model from aixplain.modules.pipeline import Pipeline from aixplain.utils import config @@ -193,7 +196,8 @@ def create_custom_python_code_tool(cls, code: Union[Text, Callable], description def create_sql_tool( cls, description: Text, - database: Text, + source: str, + source_type: str, schema: Optional[Text] = None, tables: Optional[List[Text]] = None, enable_commit: bool = False, @@ -202,15 +206,114 @@ def create_sql_tool( Args: description (Text): description of the database tool - database (Text): URL/local path of the SQLite database file - schema (Optional[Text], optional): database schema description (optional) + source (Union[Text, Dict]): database source - can be a connection string or dictionary with connection details + source_type (Text): type of source (postgresql, sqlite, csv) + schema (Optional[Text], optional): database schema description tables (Optional[List[Text]], optional): table names to work with (optional) enable_commit (bool, optional): enable to modify the database (optional) - Returns: SQLTool: created SQLTool + + Examples: + # CSV - Simple + sql_tool = AgentFactory.create_sql_tool( + description="My CSV Tool", + source="/path/to/data.csv", + source_type="csv", + tables=["data"] + ) + + # SQLite - Simple + sql_tool = AgentFactory.create_sql_tool( + description="My SQLite Tool", + source="/path/to/database.sqlite", + source_type="sqlite", + tables=["users", "products"] + ) """ - return SQLTool(description=description, database=database, schema=schema, tables=tables, enable_commit=enable_commit) + from aixplain.modules.agent.tool.sql_tool import ( + SQLToolError, + create_database_from_csv, + get_table_schema, + get_table_names_from_schema, + ) + from aixplain.enums import DatabaseSourceType + + if not source: + raise SQLToolError("Source must be provided") + if not source_type: + raise SQLToolError("Source type must be provided") + + # Validate source type + try: + source_type = DatabaseSourceType.from_string(source_type) + except ValueError as e: + raise SQLToolError(str(e)) + + database_path = None # Final database path to pass to SQLTool + + # Handle CSV source type + if source_type == DatabaseSourceType.CSV: + if not os.path.exists(source): + raise SQLToolError(f"CSV file '{source}' does not exist") + if not source.endswith(".csv"): + raise SQLToolError(f"File '{source}' is not a CSV file") + + # Create database name from CSV filename or use custom table name + base_name = os.path.splitext(os.path.basename(source))[0] + db_path = os.path.join(os.path.dirname(source), f"{base_name}.db") + + try: + # Create database from CSV + schema = create_database_from_csv(source, db_path) + database_path = db_path + + # Get table names if not provided + if not tables: + tables = get_table_names_from_schema(schema) + + except Exception as e: + if os.path.exists(db_path): + try: + os.remove(db_path) + except Exception as cleanup_error: + warnings.warn(f"Failed to remove temporary database file '{db_path}': {str(cleanup_error)}") + raise SQLToolError(f"Failed to create database from CSV: {str(e)}") + + # Handle SQLite source type + elif source_type == DatabaseSourceType.SQLITE: + if not os.path.exists(source): + raise SQLToolError(f"Database '{source}' does not exist") + if not source.endswith(".db") and not source.endswith(".sqlite"): + raise SQLToolError(f"Database '{source}' must have .db or .sqlite extension") + + database_path = source + + # Infer schema from database if not provided + if not schema: + try: + schema = get_table_schema(database_path) + except Exception as e: + raise SQLToolError(f"Failed to get database schema: {str(e)}") + + # Get table names if not provided + if not tables: + try: + tables = get_table_names_from_schema(schema) + except Exception as e: + raise SQLToolError(f"Failed to get table names: {str(e)}") + + elif source_type == DatabaseSourceType.POSTGRESQL: + raise SQLToolError("PostgreSQL is not supported yet") + + # Create and return SQLTool + return SQLTool( + description=description, + database=database_path, + schema=schema, + tables=tables, + enable_commit=enable_commit, + ) @classmethod def list(cls) -> Dict: diff --git a/aixplain/modules/agent/tool/sql_tool.py b/aixplain/modules/agent/tool/sql_tool.py index eb2ebdde..6935e6df 100644 --- a/aixplain/modules/agent/tool/sql_tool.py +++ b/aixplain/modules/agent/tool/sql_tool.py @@ -21,12 +21,229 @@ Agentification Class """ import os +import warnings import validators +import pandas as pd +import numpy as np from typing import Text, Optional, Dict, List, Union +import sqlite3 from aixplain.modules.agent.tool import Tool +class SQLToolError(Exception): + """Base exception for SQL Tool errors""" + + pass + + +class CSVError(SQLToolError): + """Exception for CSV-related errors""" + + pass + + +class DatabaseError(SQLToolError): + """Exception for database-related errors""" + + pass + + +def clean_column_name(col: Text) -> Text: + """Clean column names by replacing spaces and special characters with underscores""" + # Replace special characters with underscores + cleaned = col.strip().lower() + cleaned = "".join(c if c.isalnum() else "_" for c in cleaned) + # Remove multiple consecutive underscores + while "__" in cleaned: + cleaned = cleaned.replace("__", "_") + # Remove leading/trailing underscores + cleaned = cleaned.strip("_") + + # Add 'col_' prefix to columns that start with numbers + if cleaned[0].isdigit(): + cleaned = "col_" + cleaned + + return cleaned + + +def check_duplicate_columns(df: pd.DataFrame) -> None: + """Check for duplicate column names in DataFrame and raise CSVError if found""" + # Get all column names + columns = df.columns.tolist() + # Get cleaned column names + cleaned_columns = [clean_column_name(col) for col in columns] + + # Check for duplicates in cleaned names + seen = set() + duplicates = [] + + for original, cleaned in zip(columns, cleaned_columns): + if cleaned in seen: + duplicates.append(original) + seen.add(cleaned) + + if duplicates: + raise CSVError(f"CSV file contains duplicate column names after cleaning: {', '.join(duplicates)}") + + +def infer_sqlite_type(dtype) -> Text: + """Infer SQLite type from pandas dtype""" + if pd.api.types.is_integer_dtype(dtype): + return "INTEGER" + elif pd.api.types.is_float_dtype(dtype): + return "REAL" + elif pd.api.types.is_bool_dtype(dtype): + return "INTEGER" + elif pd.api.types.is_datetime64_any_dtype(dtype): + return "TIMESTAMP" + else: + warnings.warn(f"Column with dtype '{dtype}' will be stored as TEXT in SQLite") + return "TEXT" + + +def get_table_schema(database_path: str) -> str: + """Get the schema of all tables in the database""" + if not os.path.exists(database_path): + raise DatabaseError(f"Database file '{database_path}' does not exist") + + try: + with sqlite3.connect(database_path) as conn: + cursor = conn.cursor() + cursor.execute( + """ + SELECT sql + FROM sqlite_master + WHERE type='table' AND sql IS NOT NULL + """ + ) + schemas = cursor.fetchall() + if not schemas: + warnings.warn(f"No tables found in database '{database_path}'") + return "\n".join(schema[0] for schema in schemas if schema[0]) + except sqlite3.Error as e: + raise DatabaseError(f"Failed to get table schema: {str(e)}") + except Exception as e: + raise DatabaseError(f"Unexpected error while getting table schema: {str(e)}") + + +def create_database_from_csv(csv_path: str, database_path: str) -> str: + """Create SQLite database from CSV file and return the schema""" + if not os.path.exists(csv_path): + raise CSVError(f"CSV file '{csv_path}' does not exist") + if not csv_path.endswith(".csv"): + raise CSVError(f"File '{csv_path}' is not a CSV file") + + try: + # Load CSV file + df = pd.read_csv(csv_path) + + if df.empty: + raise CSVError(f"CSV file '{csv_path}' is empty") + + # Clean column names and track changes + original_columns = df.columns.tolist() + cleaned_columns = [clean_column_name(col) for col in original_columns] + changed_columns = [(orig, cleaned) for orig, cleaned in zip(original_columns, cleaned_columns) if orig != cleaned] + + if changed_columns: + changes = ", ".join([f"'{orig}' to '{cleaned}'" for orig, cleaned in changed_columns]) + warnings.warn(f"Column names were cleaned for SQLite compatibility: {changes}") + + df.columns = cleaned_columns + + # Connect to SQLite database + if os.path.exists(database_path): + warnings.warn(f"Database '{database_path}' already exists and will be modified") + + try: + with sqlite3.connect(database_path) as conn: + cursor = conn.cursor() + + # Check if table already exists + table_name = clean_column_name(os.path.splitext(os.path.basename(csv_path))[0]) + cursor.execute(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}'") + if cursor.fetchone(): + warnings.warn(f"Table '{table_name}' already exists in the database and will be replaced") + cursor.execute(f"DROP TABLE IF EXISTS {table_name}") + + # Create column definitions for SQL table + cols_definitions = [] + for col, dtype in df.dtypes.items(): + col_type = infer_sqlite_type(dtype) + cols_definitions.append(f'"{col}" {col_type}') + + table_columns = ", ".join(cols_definitions) + + # Create the table + create_table_query = f""" + CREATE TABLE {table_name} ( + {table_columns} + ) + """ + cursor.execute(create_table_query) + + # Insert data into table + total_rows = len(df) + for idx, row in enumerate(df.itertuples(index=False), 1): + # Convert all data to Python native types that SQLite can handle + row_data = [] + for val in row: + if pd.isna(val): + row_data.append(None) + elif isinstance(val, pd.Timestamp): + row_data.append(val.strftime("%Y-%m-%d %H:%M:%S")) + elif isinstance(val, (np.int64, np.int32)): + row_data.append(int(val)) + elif isinstance(val, (np.float64, np.float32)): + row_data.append(float(val)) + else: + row_data.append(str(val)) + + placeholders = ", ".join(["?" for _ in df.columns]) + column_names = ", ".join([f'"{col}"' for col in df.columns]) + insert_query = f"INSERT INTO {table_name} ({column_names}) VALUES ({placeholders})" + try: + cursor.execute(insert_query, tuple(row_data)) + except sqlite3.Error as e: + raise DatabaseError(f"Error inserting row {idx}/{total_rows}: {str(e)}") + + conn.commit() + + except sqlite3.Error as e: + raise DatabaseError(f"SQLite error: {str(e)}") + + # Get the schema + try: + return get_table_schema(database_path) + except DatabaseError as e: + raise DatabaseError(f"Failed to get schema after creating database: {str(e)}") + + except pd.errors.EmptyDataError: + raise CSVError(f"CSV file '{csv_path}' is empty") + except pd.errors.ParserError as e: + raise CSVError(f"Failed to parse CSV file: {str(e)}") + except Exception as e: + if isinstance(e, CSVError): + raise e + raise CSVError(f"Unexpected error while processing CSV file: {str(e)}") + + +def get_table_names_from_schema(schema: str) -> List[str]: + """Extract table names from schema string""" + if not schema: + return [] + + table_names = [] + for line in schema.split("\n"): + line = line.strip() + if line.startswith("CREATE TABLE"): + # Extract table name from CREATE TABLE statement + table_name = line.split("CREATE TABLE")[1].strip().split("(")[0].strip().strip("\"'") + table_names.append(table_name) + return table_names + + class SQLTool(Tool): """Tool to execute SQL commands in an SQLite database. @@ -42,7 +259,7 @@ def __init__( self, description: Text, database: Text, - schema: Text, + schema: Optional[Text] = None, tables: Optional[Union[List[Text], Text]] = None, enable_commit: bool = False, **additional_info, @@ -51,8 +268,8 @@ def __init__( Args: description (Text): description of the tool - database (Text): database name - schema (Text): database schema description + database (Text): database uri + schema (Optional[Text]): database schema description tables (Optional[Union[List[Text], Text]]): table names to work with (optional) enable_commit (bool): enable to modify the database (optional) """ @@ -77,16 +294,39 @@ def to_dict(self) -> Dict[str, Text]: def validate(self): from aixplain.factories.file_factory import FileFactory - assert self.description and self.description.strip() != "", "SQL Tool Error: Description is required" - assert self.database and self.database.strip() != "", "SQL Tool Error: Database is required" + if not self.description or self.description.strip() == "": + raise SQLToolError("Description is required") + if not self.database: + raise SQLToolError("Database must be provided") + + # Handle database validation if not ( str(self.database).startswith("s3://") - or str(self.database).startswith("http://") - or str(self.database).startswith("https://") - or validators.url(self.database) + or str(self.database).startswith("http://") # noqa: W503 + or str(self.database).startswith("https://") # noqa: W503 + or validators.url(self.database) # noqa: W503 ): if not os.path.exists(self.database): - raise Exception(f"SQL Tool Error: Database '{self.database}' does not exist") + raise SQLToolError(f"Database '{self.database}' does not exist") if not self.database.endswith(".db"): - raise Exception(f"SQL Tool Error: Database '{self.database}' must have .db extension") - self.database = FileFactory.upload(local_path=self.database, is_temp=True) + raise SQLToolError(f"Database '{self.database}' must have .db extension") + + # Infer schema from database if not provided + if not self.schema: + try: + self.schema = get_table_schema(self.database) + except DatabaseError as e: + raise SQLToolError(f"Failed to get database schema: {str(e)}") + + # Set tables if not already set + if not self.tables: + try: + self.tables = get_table_names_from_schema(self.schema) + except Exception as e: + raise SQLToolError(f"Failed to set tables: {str(e)}") + + # Upload database + try: + self.database = FileFactory.upload(local_path=self.database, is_temp=True) + except Exception as e: + raise SQLToolError(f"Failed to upload database: {str(e)}") diff --git a/aixplain/v2/agent.py b/aixplain/v2/agent.py index 9f5f91ae..af8c2d39 100644 --- a/aixplain/v2/agent.py +++ b/aixplain/v2/agent.py @@ -125,14 +125,50 @@ def create_custom_python_code_tool(cls, code: Union[str, Callable], description: def create_sql_tool( cls, description: str, - database: str, + source: str, + source_type: str, schema: Optional[str] = None, tables: Optional[List[str]] = None, enable_commit: bool = False, ) -> "SQLTool": - """Create a new SQL tool.""" + """Create a new SQL tool. + + Args: + description (str): description of the database tool + source (Union[str, Dict]): database source - can be a connection string or dictionary with connection details + source_type (str): type of source (sqlite, csv) + schema (Optional[str], optional): database schema description + tables (Optional[List[str]], optional): table names to work with (optional) + enable_commit (bool, optional): enable to modify the database (optional) + + Returns: + SQLTool: created SQLTool + + Examples: + # SQLite - Simple + sql_tool = Agent.create_sql_tool( + description="My SQLite Tool", + source="/path/to/database.sqlite", + source_type="sqlite", + tables=["users", "products"] + ) + + # CSV - Simple + sql_tool = Agent.create_sql_tool( + description="My CSV Tool", + source="/path/to/data.csv", + source_type="csv", + tables=["data"] + ) + + """ from aixplain.factories import AgentFactory return AgentFactory.create_sql_tool( - description=description, database=database, schema=schema, tables=tables, enable_commit=enable_commit + description=description, + source=source, + source_type=source_type, + schema=schema, + tables=tables, + enable_commit=enable_commit, ) diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index 1446af5a..cf018b8d 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -352,20 +352,23 @@ def test_sql_tool(delete_agents_and_team_agents, AgentFactory): assert delete_agents_and_team_agents import os + # Create test SQLite database with open("ftest.db", "w") as f: f.write("") tool = AgentFactory.create_sql_tool( - description="Execute an SQL query and return the result", database="ftest.db", enable_commit=True + description="Execute an SQL query and return the result", source="ftest.db", source_type="sqlite", enable_commit=True ) assert tool is not None assert tool.description == "Execute an SQL query and return the result" + agent = AgentFactory.create( name="Teste", description="You are a test agent that search for employee information in a database", tools=[tool], ) assert agent is not None + response = agent.run("Create a table called Person with the following columns: id, name, age, salary, department") assert response is not None assert response["completed"] is True @@ -383,3 +386,73 @@ def test_sql_tool(delete_agents_and_team_agents, AgentFactory): assert "eve" in str(response["data"]["output"]).lower() os.remove("ftest.db") + + +@pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) +def test_sql_tool_with_csv(delete_agents_and_team_agents, AgentFactory): + assert delete_agents_and_team_agents + + import pandas as pd + + # Create a more comprehensive test dataset + df = pd.DataFrame( + { + "id": [1, 2, 3, 4, 5], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "department": ["Sales", "IT", "Sales", "Marketing", "IT"], + "salary": [75000, 85000, 72000, 68000, 90000], + } + ) + df.to_csv("test.csv", index=False) + + # Create SQL tool from CSV + tool = AgentFactory.create_sql_tool( + description="Execute SQL queries on employee data", source="test.csv", source_type="csv", tables=["employees"] + ) + + # Verify tool setup + assert tool is not None + assert tool.description == "Execute SQL queries on employee data" + assert tool.database.endswith(".db") + assert tool.tables == ["employees"] + assert ( + tool.schema + == 'CREATE TABLE test (\n "id" INTEGER, "name" TEXT, "department" TEXT, "salary" INTEGER\n )' # noqa: W503 + ) + assert not tool.enable_commit # must be False by default + + # Create an agent with the SQL tool + agent = AgentFactory.create( + name="SQL Query Agent", + description="I am an agent that helps query employee information from a database.", + instructions="Help users query employee information from the database. Use SQL queries to get the requested information.", + tools=[tool], + ) + assert agent is not None + + # Test 1: Basic SELECT query + response = agent.run("Who are all the employees in the Sales department?") + assert response["completed"] is True + assert response["status"].lower() == "success" + assert "alice" in response["data"]["output"].lower() + assert "charlie" in response["data"]["output"].lower() + + # Test 2: Aggregation query + response = agent.run("What is the average salary in each department?") + assert response["completed"] is True + assert response["status"].lower() == "success" + assert "sales" in response["data"]["output"].lower() + assert "it" in response["data"]["output"].lower() + assert "marketing" in response["data"]["output"].lower() + + # Test 3: Complex query with conditions + response = agent.run("Who is the highest paid employee in the IT department?") + assert response["completed"] is True + assert response["status"].lower() == "success" + assert "eve" in response["data"]["output"].lower() + + import os + + # Cleanup + os.remove("test.csv") + os.remove("test.db") diff --git a/tests/unit/agent/sql_tool_test.py b/tests/unit/agent/sql_tool_test.py index 074cfcbe..f6b6fa87 100644 --- a/tests/unit/agent/sql_tool_test.py +++ b/tests/unit/agent/sql_tool_test.py @@ -1,25 +1,312 @@ +import os +import pytest +import pandas as pd from aixplain.factories import AgentFactory -from aixplain.modules.agent.tool.sql_tool import SQLTool +from aixplain.modules.agent.tool.sql_tool import ( + SQLTool, + create_database_from_csv, + get_table_schema, + SQLToolError, + CSVError, + DatabaseError, + clean_column_name, +) -def test_create_sql_tool(mocker): - tool = AgentFactory.create_sql_tool(description="Test", database="test.db", schema="test", tables=["test", "test2"]) +def test_clean_column_name(): + # Test basic cleaning + assert clean_column_name("test name") == "test_name" + assert clean_column_name("test(name)") == "test_name" + assert clean_column_name("test/name") == "test_name" + assert clean_column_name("test__name") == "test_name" + assert clean_column_name(" test name ") == "test_name" + + # Test Case-insensitive + assert clean_column_name("Test Name") == "test_name" + assert clean_column_name("TEST NAME") == "test_name" + assert clean_column_name("TEST-NAME") == "test_name" + + # Test number prefix + assert clean_column_name("1test") == "col_1test" + + # Test special characters + assert clean_column_name("test@#$%^&*()name") == "test_name" + assert clean_column_name("test!!!name") == "test_name" + + # Test multiple underscores + assert clean_column_name("test___name") == "test_name" + + # Test leading/trailing special chars + assert clean_column_name("_test_name_") == "test_name" + assert clean_column_name("___test___name___") == "test_name" + + +def test_create_sql_tool(mocker, tmp_path): + # Create a test database file + # Create a test database file + db_path = os.path.join(tmp_path, "test.db") + import sqlite3 + + conn = sqlite3.connect(db_path) + conn.execute("CREATE TABLE test (id INTEGER, name TEXT)") + conn.close() + + # Test SQLite source type + tool = AgentFactory.create_sql_tool( + description="Test", source=db_path, source_type="sqlite", schema="test", tables=["test", "test2"] + ) assert isinstance(tool, SQLTool) assert tool.description == "Test" - assert tool.database == "test.db" + assert tool.database == db_path assert tool.schema == "test" assert tool.tables == ["test", "test2"] + csv_path = os.path.join(tmp_path, "test.csv") + df = pd.DataFrame({"id": [1, 2, 3], "name": ["test1", "test2", "test3"]}) + df.to_csv(csv_path, index=False) + # Test CSV source type + csv_tool = AgentFactory.create_sql_tool(description="Test CSV", source=csv_path, source_type="csv", tables=["data"]) + assert isinstance(csv_tool, SQLTool) + assert csv_tool.description == "Test CSV" + assert csv_tool.database.endswith(".db") + + # Test to_dict() method tool_dict = tool.to_dict() assert tool_dict["description"] == "Test" assert tool_dict["parameters"] == [ - {"name": "database", "value": "test.db"}, + {"name": "database", "value": db_path}, {"name": "schema", "value": "test"}, {"name": "tables", "value": "test,test2"}, {"name": "enable_commit", "value": False}, ] + # Test validation and file upload mocker.patch("aixplain.factories.file_factory.FileFactory.upload", return_value="s3://test.db") mocker.patch("os.path.exists", return_value=True) + mocker.patch("aixplain.modules.agent.tool.sql_tool.get_table_schema", return_value="CREATE TABLE test (id INTEGER)") + tool.validate() + assert tool.database == "s3://test.db" + + +def test_create_database_from_csv(tmp_path): + # Create a temporary CSV file + csv_path = os.path.join(tmp_path, "test.csv") + df = pd.DataFrame({"id": [1, 2, 3], "name": ["test1", "test2", "test3"], "value": [1.1, 2.2, 3.3]}) + df.to_csv(csv_path, index=False) + + # Create database from CSV + db_path = os.path.join(tmp_path, "test.db") + try: + schema = create_database_from_csv(csv_path, db_path) + + # Verify results + assert "CREATE TABLE test" in schema + assert '"id" INTEGER' in schema + assert '"name" TEXT' in schema + assert '"value" REAL' in schema + assert os.path.exists(db_path) + + # Test get_table_schema + retrieved_schema = get_table_schema(db_path) + assert retrieved_schema == schema + finally: + # Clean up the database file + if os.path.exists(db_path): + os.remove(db_path) + + +def test_create_database_from_csv_errors(tmp_path): + # Test non-existent CSV file + with pytest.raises(CSVError, match="CSV file .* does not exist"): + create_database_from_csv("nonexistent.csv", "test.db") + + # Test invalid file extension + invalid_ext = os.path.join(tmp_path, "test.txt") + open(invalid_ext, "w").close() + with pytest.raises(CSVError, match="File .* is not a CSV file"): + create_database_from_csv(invalid_ext, "test.db") + + # Test empty CSV file + empty_csv = os.path.join(tmp_path, "empty.csv") + open(empty_csv, "w").close() + with pytest.raises(CSVError, match="CSV file .* is empty"): + create_database_from_csv(empty_csv, "test.db") + + # Test empty CSV file + dup_cols_empty_csv = os.path.join(tmp_path, "dup_cols_empty.csv") + with open(dup_cols_empty_csv, "w") as f: + f.write("id,id\n") # Only header with duplicate columns, no data + with pytest.raises(CSVError, match="CSV file .* is empty"): + create_database_from_csv(dup_cols_empty_csv, "test.db") + + +def test_get_table_schema_errors(tmp_path): + # Test non-existent database + with pytest.raises(DatabaseError, match="Database file .* does not exist"): + get_table_schema("nonexistent.db") + + +def test_sql_tool_validation_errors(tmp_path): + # Create a test database file + db_path = os.path.join(tmp_path, "test.db") + # creat a proper sqlite database + import sqlite3 + + conn = sqlite3.connect(db_path) + conn.execute("CREATE TABLE test (id INTEGER, name TEXT)") + conn.close() + + # Test missing description + with pytest.raises(SQLToolError, match="Description is required"): + tool = AgentFactory.create_sql_tool(description="", source=db_path, source_type="sqlite") + tool.validate() + + # Test missing source + with pytest.raises(SQLToolError, match="Source must be provided"): + tool = AgentFactory.create_sql_tool(description="Test", source="", source_type="sqlite") + tool.validate() + + # Test missing source_type + with pytest.raises(TypeError, match="missing 1 required positional argument: 'source_type'"): + tool = AgentFactory.create_sql_tool(description="Test", source=db_path) + tool.validate() + + # Test invalid source type + with pytest.raises(SQLToolError, match="Invalid source type"): + AgentFactory.create_sql_tool(description="Test", source=db_path, source_type="invalid") + + # Test non-existent SQLite database + with pytest.raises(SQLToolError, match="Database .* does not exist"): + tool = AgentFactory.create_sql_tool(description="Test", source="nonexistent.db", source_type="sqlite") + tool.validate() + + # Test non-existent CSV file + with pytest.raises(SQLToolError, match="CSV file .* does not exist"): + tool = AgentFactory.create_sql_tool(description="Test", source="nonexistent.csv", source_type="csv") + tool.validate() + + # Test PostgreSQL (not supported) + with pytest.raises(SQLToolError, match="PostgreSQL is not supported yet"): + tool = AgentFactory.create_sql_tool( + description="Test", + source="postgresql://user:pass@localhost/mydb", + source_type="postgresql", + schema="public", + tables=["users"], + ) + tool.validate() + + +def test_create_sql_tool_with_schema_inference(tmp_path, mocker): + # Create a test database file + db_path = os.path.join(tmp_path, "test.db") + # creat a proper sqlite database + import sqlite3 + + conn = sqlite3.connect(db_path) + conn.execute("CREATE TABLE test (id INTEGER, name TEXT)") + conn.close() + + # Create tool without schema and tables + tool = AgentFactory.create_sql_tool(description="Test", source=db_path, source_type="sqlite") + + # Mock schema inference + schema = "CREATE TABLE test (id INTEGER, name TEXT)" + mocker.patch("os.path.exists", return_value=True) + mocker.patch("aixplain.modules.agent.tool.sql_tool.get_table_schema", return_value=schema) + mocker.patch("aixplain.factories.file_factory.FileFactory.upload", return_value="s3://test.db") + + # Validate and check schema/tables inference tool.validate() + assert tool.schema == schema + assert tool.tables == ["test"] assert tool.database == "s3://test.db" + + +def test_create_sql_tool_from_csv_with_warnings(tmp_path, mocker): + # Create a CSV with column names that need cleaning + csv_path = os.path.join(tmp_path, "test with spaces.csv") + df = pd.DataFrame( + { + "1id": [1, 2], # Should be prefixed with col_ + "test name": ["test1", "test2"], # Should replace space with underscore + "value(%)": [1.1, 2.2], # Should remove special characters + } + ) + df.to_csv(csv_path, index=False) + + # Create tool and check for warnings + with pytest.warns(UserWarning) as record: + tool = AgentFactory.create_sql_tool(description="Test", source=csv_path, source_type="csv") + + # Verify warnings about column name changes + warning_messages = [str(w.message) for w in record] + column_changes_warning = next( + (msg for msg in warning_messages if "Column names were cleaned for SQLite compatibility" in msg), None + ) + assert column_changes_warning is not None + assert "'1id' to 'col_1id'" in column_changes_warning + assert "'test name' to 'test_name'" in column_changes_warning + assert "'value(%)' to 'value'" in column_changes_warning + + try: + # Mock file upload for validation + mocker.patch("aixplain.factories.file_factory.FileFactory.upload", return_value="s3://test.db") + + # Validate and verify schema + tool.validate() + assert "col_1id" in tool.schema + assert "test_name" in tool.schema + assert "value" in tool.schema + assert tool.tables == ["test_with_spaces"] + finally: + # Clean up the database file + if os.path.exists(tool.database): + os.remove(tool.database) + + +def test_create_sql_tool_from_csv(tmp_path): + # Create a temporary CSV file + csv_path = os.path.join(tmp_path, "test.csv") + df = pd.DataFrame({"id": [1, 2, 3], "name": ["test1", "test2", "test3"], "value": [1.1, 2.2, 3.3]}) + df.to_csv(csv_path, index=False) + + # Test successful creation + tool = AgentFactory.create_sql_tool(description="Test", source=csv_path, source_type="csv", tables=["test"]) + assert isinstance(tool, SQLTool) + assert tool.description == "Test" + assert tool.database.endswith(".db") + assert os.path.exists(tool.database) + + # Test schema and table inference during validation + try: + tool.validate() + assert "CREATE TABLE test" in tool.schema + assert '"id" INTEGER' in tool.schema + assert '"name" TEXT' in tool.schema + assert '"value" REAL' in tool.schema + assert tool.tables == ["test"] + finally: + # Clean up the database file + if os.path.exists(tool.database): + os.remove(tool.database) + + +def test_sql_tool_schema_inference(tmp_path): + # Create a temporary CSV file + csv_path = os.path.join(tmp_path, "test.csv") + df = pd.DataFrame({"id": [1, 2, 3], "name": ["test1", "test2", "test3"]}) + df.to_csv(csv_path, index=False) + + # Create tool without schema and tables + tool = AgentFactory.create_sql_tool(description="Test", source=csv_path, source_type="csv") + + try: + tool.validate() + assert tool.schema is not None + assert "CREATE TABLE test" in tool.schema + assert tool.tables == ["test"] + finally: + # Clean up the database file + if os.path.exists(tool.database): + os.remove(tool.database) From 43a516c74f8d149f768f952b0c27d44075af1038 Mon Sep 17 00:00:00 2001 From: kadirpekel Date: Wed, 12 Mar 2025 13:49:41 +0100 Subject: [PATCH 21/36] Bug 431 (#429) * BUG-431 param value setting fixed --- aixplain/modules/pipeline/designer/base.py | 47 +++++++++++++++------- tests/unit/designer_unit_test.py | 10 ++++- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/aixplain/modules/pipeline/designer/base.py b/aixplain/modules/pipeline/designer/base.py index 55300467..063accad 100644 --- a/aixplain/modules/pipeline/designer/base.py +++ b/aixplain/modules/pipeline/designer/base.py @@ -271,37 +271,54 @@ def create_param( param.node = self.node return param - def __getitem__(self, code: str) -> Param: + def __getattr__(self, code: str) -> Param: + if code == "_params": + raise AttributeError("Attribute '_params' is not accessible") for param in self._params: if param.code == code: return param - raise KeyError(f"Parameter with code '{code}' not found.") + raise AttributeError(f"Attribute with code '{code}' not found.") + + def __getitem__(self, code: str) -> Param: + try: + return getattr(self, code) + except AttributeError: + raise KeyError(f"Parameter with code '{code}' not found.") def special_prompt_handling(self, code: str, value: str) -> None: """ This method will handle the special prompt handling for asset nodes having `text-generation` function type. """ + prompt_param = getattr(self, "prompt", None) + if prompt_param: + raise ValueError("Prompt param already exists") + from .nodes import AssetNode - if isinstance(self.node, AssetNode) and self.node.asset.function == "text-generation": - if code == "prompt": - matches = find_prompt_params(value) - for match in matches: - self.node.inputs.create_param(match, DataType.TEXT, is_required=True) + if not isinstance(self.node, AssetNode): + return - def set_param_value(self, code: str, value: str) -> None: - self.special_prompt_handling(code, value) - self[code].value = value + if not hasattr(self.node, "asset") or self.node.asset.function != "text-generation": + return + + matches = find_prompt_params(value) + for match in matches: + if match in self: + raise ValueError(f"Prompt param with code '{match}' already exists") + + self.node.inputs.create_param(match, DataType.TEXT, is_required=True) def __setitem__(self, code: str, value: str) -> None: - # set param value on set item to avoid setting it manually - self.set_param_value(code, value) + setattr(self, code, value) def __setattr__(self, name: str, value: any) -> None: - # set param value on attribute assignment to avoid setting it manually - if isinstance(value, str) and hasattr(self, name): - self.set_param_value(name, value) + if name == "prompt": + self.special_prompt_handling(name, value) + + param = getattr(self, name, None) + if param and isinstance(param, Param): + param.value = value else: super().__setattr__(name, value) diff --git a/tests/unit/designer_unit_test.py b/tests/unit/designer_unit_test.py index c8a21260..3b4d93bc 100644 --- a/tests/unit/designer_unit_test.py +++ b/tests/unit/designer_unit_test.py @@ -593,10 +593,18 @@ def test_param_proxy_set_param_value(): param_proxy = ParamProxy(Mock()) param_proxy._params = [prompt_param] with patch.object(param_proxy, "special_prompt_handling") as mock_special_prompt_handling: - param_proxy.set_param_value("prompt", "hello {{foo}}") + param_proxy.prompt = "hello {{foo}}" mock_special_prompt_handling.assert_called_once_with("prompt", "hello {{foo}}") assert prompt_param.value == "hello {{foo}}" + # Use a non string value + param_proxy.prompt = 123 + assert prompt_param.value == 123 + + # Now change it to another non string value + param_proxy.prompt = 456 + assert prompt_param.value == 456 + def test_param_proxy_special_prompt_handling(): from aixplain.modules.pipeline.designer.nodes import AssetNode From 3a82c7048ff638dc734130930e6dce8b68ebb3e4 Mon Sep 17 00:00:00 2001 From: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Date: Wed, 12 Mar 2025 19:18:08 -0300 Subject: [PATCH 22/36] Update finetune functional tests (#432) --- .../data/finetune_test_cost_estimation.json | 2 +- .../finetune/data/finetune_test_end2end.json | 16 ---------------- .../finetune/data/finetune_test_list_data.json | 3 --- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/tests/functional/finetune/data/finetune_test_cost_estimation.json b/tests/functional/finetune/data/finetune_test_cost_estimation.json index 44707255..39ffbd45 100644 --- a/tests/functional/finetune/data/finetune_test_cost_estimation.json +++ b/tests/functional/finetune/data/finetune_test_cost_estimation.json @@ -2,7 +2,7 @@ {"model_name": "Llama 2 7b", "model_id": "6543cb991f695e72028e9428", "dataset_name": "Test text generation dataset"}, {"model_name": "Llama 2 7B Chat", "model_id": "65519ee7bf42e6037ab109d8", "dataset_name": "Test text generation dataset"}, {"model_name": "Mistral 7b", "model_id": "6551a9e7bf42e6037ab109de", "dataset_name": "Test text generation dataset"}, - {"model_name": "Solar 10b", "model_id": "65b7baac1d5ea75105c14971", "dataset_name": "Test text generation dataset"}, + {"model_name": "Mistral 7B Instruct v0.3", "model_id": "6551a9e7bf42e6037ab109de", "dataset_name": "Test text generation dataset"}, {"model_name": "Falcon 7b", "model_id": "6551bff9bf42e6037ab109e1", "dataset_name": "Test text generation dataset"}, {"model_name": "Falcon 7b Instruct", "model_id": "65519d57bf42e6037ab109d5", "dataset_name": "Test text generation dataset"}, {"model_name": "MPT 7b", "model_id": "6551a72bbf42e6037ab109d9", "dataset_name": "Test text generation dataset"}, diff --git a/tests/functional/finetune/data/finetune_test_end2end.json b/tests/functional/finetune/data/finetune_test_end2end.json index 68499460..c8b1a645 100644 --- a/tests/functional/finetune/data/finetune_test_end2end.json +++ b/tests/functional/finetune/data/finetune_test_end2end.json @@ -6,21 +6,5 @@ "inference_data": "Hello!", "required_dev": true, "search_metadata": false - }, - { - "model_name": "aiR v2", - "model_id": "66eae6656eb56311f2595011", - "dataset_name": "Test search dataset", - "inference_data": "Hello!", - "required_dev": false, - "search_metadata": false - }, - { - "model_name": "vectara", - "model_id": "655e20f46eb563062a1aa301", - "dataset_name": "Test search dataset", - "inference_data": "Hello!", - "required_dev": false, - "search_metadata": false } ] diff --git a/tests/functional/finetune/data/finetune_test_list_data.json b/tests/functional/finetune/data/finetune_test_list_data.json index f8b25910..b5b13a57 100644 --- a/tests/functional/finetune/data/finetune_test_list_data.json +++ b/tests/functional/finetune/data/finetune_test_list_data.json @@ -1,8 +1,5 @@ [ { "function": "text-generation" - }, - { - "function": "search" } ] \ No newline at end of file From 62be125cf206abb6bbe8a82d43b0b40ddf9b3c4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Thu, 13 Mar 2025 23:57:20 +0300 Subject: [PATCH 23/36] Utility model bulk bugs (#430) * Fixed BUG-395 * BUG-428 fixed --- aixplain/modules/model/utils.py | 12 +++- tests/unit/utility_test.py | 115 +++++++++++++++++++++++++++++--- 2 files changed, 113 insertions(+), 14 deletions(-) diff --git a/aixplain/modules/model/utils.py b/aixplain/modules/model/utils.py index 7b494305..1c6de56e 100644 --- a/aixplain/modules/model/utils.py +++ b/aixplain/modules/model/utils.py @@ -123,8 +123,8 @@ def parse_code(code: Union[Text, Callable]) -> Tuple[Text, List, Text, Text]: "Utility Model Error:If the function is not decorated with @utility_tool, the description must be provided in the docstring" ) # get parameters of the function - f = re.findall(r"main\((.*?(?:\s*=\s*[^,)]+)?(?:\s*,\s*.*?(?:\s*=\s*[^,)]+)?)*)\)", str_code) - parameters = f[0].split(",") if len(f) > 0 else [] + params_match = re.search(r"def\s+\w+\s*\((.*?)\)\s*(?:->.*?)?:", str_code) + parameters = params_match.group(1).split(",") if params_match else [] for input in parameters: assert ( @@ -176,6 +176,12 @@ def parse_code_decorated(code: Union[Text, Callable]) -> Tuple[Text, List, Text] inputs, description, name = [], "", "" str_code = "" + # Add explicit type checking for class instances + if inspect.isclass(code) or (not isinstance(code, (str, Callable)) and hasattr(code, "__class__")): + raise TypeError( + f"Code must be either a string or a callable function, not a class or class instance. You tried to pass a class or class instance: {code}" + ) + if isinstance(code, Callable) and hasattr(code, "_is_utility_tool"): str_code = inspect.getsource(code) # Use the information directly from the decorated callable @@ -212,7 +218,7 @@ def parse_code_decorated(code: Union[Text, Callable]) -> Tuple[Text, List, Text] description = code.__doc__.strip() if code.__doc__ else "" name = code.__name__ # Try to infer parameters - params_match = re.search(r"def\s+\w+\s*\((.*?)\):", str_code) + params_match = re.search(r"def\s+\w+\s*\((.*?)\)\s*(?:->.*?)?:", str_code) parameters = params_match.group(1).split(",") if params_match else [] for input in parameters: diff --git a/tests/unit/utility_test.py b/tests/unit/utility_test.py index 305c6a52..0c1ffde5 100644 --- a/tests/unit/utility_test.py +++ b/tests/unit/utility_test.py @@ -6,7 +6,7 @@ from aixplain.enums import DataType, Function from aixplain.enums.asset_status import AssetStatus from aixplain.modules.model.utility_model import UtilityModel, UtilityModelInput -from aixplain.modules.model.utils import parse_code +from aixplain.modules.model.utils import parse_code, parse_code_decorated from unittest.mock import patch @@ -25,7 +25,9 @@ def test_utility_model(): assert utility_model.name == "utility_model_test" assert utility_model.description == "utility_model_test" assert utility_model.code == "utility_model_test" - assert utility_model.inputs == [UtilityModelInput(name="input_string", description="The input_string input is a text", type=DataType.TEXT)] + assert utility_model.inputs == [ + UtilityModelInput(name="input_string", description="The input_string input is a text", type=DataType.TEXT) + ] assert utility_model.output_examples == "output_description" @@ -87,8 +89,14 @@ def test_utility_model_to_dict(): def test_update_utility_model(): with requests_mock.Mocker() as mock: - with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): - with patch("aixplain.factories.file_factory.FileFactory.upload", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): + with patch( + "aixplain.factories.file_factory.FileFactory.to_link", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): + with patch( + "aixplain.factories.file_factory.FileFactory.upload", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): with patch( "aixplain.modules.model.utils.parse_code", return_value=( @@ -116,7 +124,7 @@ def test_update_utility_model(): with pytest.warns( DeprecationWarning, - match="update\(\) is deprecated and will be removed in a future version. Please use save\(\) instead.", + match=r"update\(\) is deprecated and will be removed in a future version. Please use save\(\) instead.", ): utility_model.description = "updated_description" utility_model.update() @@ -127,8 +135,14 @@ def test_update_utility_model(): def test_save_utility_model(): with requests_mock.Mocker() as mock: - with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): - with patch("aixplain.factories.file_factory.FileFactory.upload", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): + with patch( + "aixplain.factories.file_factory.FileFactory.to_link", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): + with patch( + "aixplain.factories.file_factory.FileFactory.upload", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): with patch( "aixplain.modules.model.utils.parse_code", return_value=( @@ -170,8 +184,14 @@ def test_save_utility_model(): def test_delete_utility_model(): with requests_mock.Mocker() as mock: - with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): - with patch("aixplain.factories.file_factory.FileFactory.upload", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): + with patch( + "aixplain.factories.file_factory.FileFactory.to_link", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): + with patch( + "aixplain.factories.file_factory.FileFactory.upload", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): mock.delete(urljoin(config.BACKEND_URL, "sdk/utilities/123"), status_code=200, json={"id": "123"}) utility_model = UtilityModel( id="123", @@ -199,6 +219,7 @@ def test_parse_code(): assert description == "" assert code_link == "code_link" assert name == "main" + # Code is a function def main(a: int, b: int): """ @@ -241,8 +262,14 @@ def main(originCode): def test_validate_new_model(): """Test validation for a new model""" - with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): - with patch("aixplain.factories.file_factory.FileFactory.upload", return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n'): + with patch( + "aixplain.factories.file_factory.FileFactory.to_link", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): + with patch( + "aixplain.factories.file_factory.FileFactory.upload", + return_value='def main(input_string:str):\n """\n Get driving directions from start_location to end_location\n """\n return f"This is the output for input: {input_string}"\n', + ): # Test with valid inputs utility_model = UtilityModel( id="", # Empty ID for new model @@ -348,3 +375,69 @@ def test_model_exists_empty_id(): api_key=config.TEAM_API_KEY, ) assert utility_model._model_exists() is False + + +def test_utility_model_with_return_annotation(): + with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value="utility_model_test"): + with patch("aixplain.factories.file_factory.FileFactory.upload", return_value="utility_model_test"): + + def get_location(input_str: str) -> str: + """ + Get location information + + Args: + input_str (str): Input string parameter + Returns: + str: Location information + """ + return input_str + + utility_model = UtilityModel( + id="123", + name="location_test", + description="Get location information", + code=get_location, + output_examples="Location data example", + inputs=[UtilityModelInput(name="input_str", description="Input string parameter", type=DataType.TEXT)], + function=Function.UTILITIES, + api_key=config.TEAM_API_KEY, + ) + + # Verify the model is created correctly with the return type annotation + assert utility_model.id == "123" + assert utility_model.name == "location_test" + assert utility_model.description == "Get location information" + assert len(utility_model.inputs) == 1 + assert utility_model.inputs[0].name == "input_str" + assert utility_model.inputs[0].type == DataType.TEXT + assert utility_model.inputs[0].description == "Input string parameter" + + # Verify the function parameters are parsed correctly + code, inputs, description, name = parse_code_decorated(get_location) + assert len(inputs) == 1 + assert inputs[0].name == "input_str" + assert inputs[0].type == DataType.TEXT + assert "Get location information" in description + assert name == "get_location" + + +def test_parse_code_with_class(): + """Test that parsing code with a class raises proper error""" + + class DummyModel: + def __init__(self): + pass + + # Test with class + with pytest.raises( + TypeError, + match=r"Code must be either a string or a callable function, not a class or class instance\. You tried to pass a class or class instance: <.*\.DummyModel object at 0x[0-9a-f]+>", + ): + parse_code_decorated(DummyModel()) + + # Test with class instance + with pytest.raises( + TypeError, + match=r"Code must be either a string or a callable function, not a class or class instance\. You tried to pass a class or class instance: <.*\.DummyModel object at 0x[0-9a-f]+>", + ): + parse_code_decorated(DummyModel()) From 331d8775db4f6b2a5d55458d278f0e0d80d8b0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Thu, 13 Mar 2025 23:58:08 +0300 Subject: [PATCH 24/36] Source type as ENUM for create sql tool (#428) * SQL Tool feature * Function tests for sql tool * Enable multiple tables and constraint size of SQLite file * Enable more than one table * Constrain the size of the database * Enable commit on SQL tool * Improving SQL tool functional test * added csv support to sql tool * create_sql_tool_from_csv added * updated the functional test of sqltool and removed Agent method * revert v2 deletion * new sql format added * Source type must be provided * source_type as enum added --------- Co-authored-by: Thiago Castro Ferreira --- aixplain/factories/agent_factory/__init__.py | 16 +++++++------ tests/unit/agent/sql_tool_test.py | 25 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index af59f17f..97c73d70 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -43,6 +43,7 @@ from aixplain.utils.file_utils import _request_with_retry from urllib.parse import urljoin +from aixplain.enums import DatabaseSourceType class AgentFactory: @@ -197,7 +198,7 @@ def create_sql_tool( cls, description: Text, source: str, - source_type: str, + source_type: Union[str, DatabaseSourceType], schema: Optional[Text] = None, tables: Optional[List[Text]] = None, enable_commit: bool = False, @@ -207,7 +208,7 @@ def create_sql_tool( Args: description (Text): description of the database tool source (Union[Text, Dict]): database source - can be a connection string or dictionary with connection details - source_type (Text): type of source (postgresql, sqlite, csv) + source_type (Union[str, DatabaseSourceType]): type of source (postgresql, sqlite, csv) or DatabaseSourceType enum schema (Optional[Text], optional): database schema description tables (Optional[List[Text]], optional): table names to work with (optional) enable_commit (bool, optional): enable to modify the database (optional) @@ -237,7 +238,6 @@ def create_sql_tool( get_table_schema, get_table_names_from_schema, ) - from aixplain.enums import DatabaseSourceType if not source: raise SQLToolError("Source must be provided") @@ -245,10 +245,12 @@ def create_sql_tool( raise SQLToolError("Source type must be provided") # Validate source type - try: - source_type = DatabaseSourceType.from_string(source_type) - except ValueError as e: - raise SQLToolError(str(e)) + if isinstance(source_type, str): + try: + source_type = DatabaseSourceType.from_string(source_type) + except ValueError as e: + raise SQLToolError(str(e)) + database_path = None # Final database path to pass to SQLTool diff --git a/tests/unit/agent/sql_tool_test.py b/tests/unit/agent/sql_tool_test.py index f6b6fa87..4964dc45 100644 --- a/tests/unit/agent/sql_tool_test.py +++ b/tests/unit/agent/sql_tool_test.py @@ -2,6 +2,8 @@ import pytest import pandas as pd from aixplain.factories import AgentFactory +from aixplain.enums import DatabaseSourceType + from aixplain.modules.agent.tool.sql_tool import ( SQLTool, create_database_from_csv, @@ -310,3 +312,26 @@ def test_sql_tool_schema_inference(tmp_path): # Clean up the database file if os.path.exists(tool.database): os.remove(tool.database) + +def test_create_sql_tool_source_type_handling(tmp_path): + # Create a test database file + db_path = os.path.join(tmp_path, "test.db") + import sqlite3 + + conn = sqlite3.connect(db_path) + conn.execute("CREATE TABLE test (id INTEGER, name TEXT)") + conn.close() + + # Test with string input + tool_str = AgentFactory.create_sql_tool(description="Test", source=db_path, source_type="sqlite", schema="test") + assert isinstance(tool_str, SQLTool) + + # Test with enum input + tool_enum = AgentFactory.create_sql_tool( + description="Test", source=db_path, source_type=DatabaseSourceType.SQLITE, schema="test" + ) + assert isinstance(tool_enum, SQLTool) + + # Test invalid type + with pytest.raises(SQLToolError, match="Source type must be either a string or DatabaseSourceType enum"): + AgentFactory.create_sql_tool(description="Test", source=db_path, source_type=123, schema="test") # Invalid type From a47613e2db1b944198d4b5f8c8275ffc3203dc77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Fri, 14 Mar 2025 00:21:59 +0300 Subject: [PATCH 25/36] Name parameter set for tools (#419) --- .../agent/tool/custom_python_code_tool.py | 1 + aixplain/modules/agent/tool/model_tool.py | 4 +++- aixplain/modules/agent/tool/pipeline_tool.py | 6 ++++-- aixplain/modules/agent/tool/sql_tool.py | 4 +++- tests/unit/agent/model_tool_test.py | 19 +++++++++++++++++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/aixplain/modules/agent/tool/custom_python_code_tool.py b/aixplain/modules/agent/tool/custom_python_code_tool.py index 6e651eeb..511e4a8f 100644 --- a/aixplain/modules/agent/tool/custom_python_code_tool.py +++ b/aixplain/modules/agent/tool/custom_python_code_tool.py @@ -36,6 +36,7 @@ def __init__(self, code: Union[Text, Callable], description: Text = "", **additi def to_dict(self): return { + "name": self.name, "description": self.description, "type": "utility", "utility": "custom_python_code", diff --git a/aixplain/modules/agent/tool/model_tool.py b/aixplain/modules/agent/tool/model_tool.py index f0cb88e7..c3f6ff01 100644 --- a/aixplain/modules/agent/tool/model_tool.py +++ b/aixplain/modules/agent/tool/model_tool.py @@ -42,6 +42,7 @@ def __init__( function: Optional[Union[Function, Text]] = None, supplier: Optional[Union[Dict, Supplier]] = None, model: Optional[Union[Text, Model]] = None, + name: Optional[Text] = None, description: Text = "", parameters: Optional[Dict] = None, **additional_info, @@ -59,7 +60,7 @@ def __init__( function is not None or model is not None ), "Agent Creation Error: Either function or model must be provided when instantiating a tool." - super().__init__(name="", description=description, **additional_info) + super().__init__(name=name if name is not None else "", description=description, **additional_info) if function is not None: if isinstance(function, str): function = Function(function) @@ -104,6 +105,7 @@ def to_dict(self) -> Dict: return { "function": self.function.value if self.function is not None else None, "type": "model", + "name": self.name, "description": self.description, "supplier": supplier, "version": self.version if self.version else None, diff --git a/aixplain/modules/agent/tool/pipeline_tool.py b/aixplain/modules/agent/tool/pipeline_tool.py index ab3b4311..f7270c14 100644 --- a/aixplain/modules/agent/tool/pipeline_tool.py +++ b/aixplain/modules/agent/tool/pipeline_tool.py @@ -20,7 +20,7 @@ Description: Agentification Class """ -from typing import Text, Union +from typing import Text, Union, Optional from aixplain.modules.agent.tool import Tool from aixplain.modules.pipeline import Pipeline @@ -38,6 +38,7 @@ def __init__( self, description: Text, pipeline: Union[Text, Pipeline], + name: Optional[Text] = None, **additional_info, ) -> None: """Specialized software or resource designed to assist the AI in executing specific tasks or functions based on user commands. @@ -46,7 +47,7 @@ def __init__( description (Text): description of the tool pipeline (Union[Text, Pipeline]): pipeline """ - super().__init__("", description, **additional_info) + super().__init__(name=name if name is not None else "", description=description, **additional_info) if isinstance(pipeline, Pipeline): pipeline = pipeline.id self.pipeline = pipeline @@ -54,6 +55,7 @@ def __init__( def to_dict(self): return { "assetId": self.pipeline, + "name": self.name, "description": self.description, "type": "pipeline", } diff --git a/aixplain/modules/agent/tool/sql_tool.py b/aixplain/modules/agent/tool/sql_tool.py index 6935e6df..62c366c5 100644 --- a/aixplain/modules/agent/tool/sql_tool.py +++ b/aixplain/modules/agent/tool/sql_tool.py @@ -262,6 +262,7 @@ def __init__( schema: Optional[Text] = None, tables: Optional[Union[List[Text], Text]] = None, enable_commit: bool = False, + name: Optional[Text] = None, **additional_info, ) -> None: """Tool to execute SQL query commands in an SQLite database. @@ -273,7 +274,7 @@ def __init__( tables (Optional[Union[List[Text], Text]]): table names to work with (optional) enable_commit (bool): enable to modify the database (optional) """ - super().__init__("", description, **additional_info) + super().__init__(name=name if name is not None else "", description=description, **additional_info) self.database = database self.schema = schema self.tables = tables if isinstance(tables, list) else [tables] if tables else None @@ -281,6 +282,7 @@ def __init__( def to_dict(self) -> Dict[str, Text]: return { + "name": self.name, "description": self.description, "parameters": [ {"name": "database", "value": self.database}, diff --git a/tests/unit/agent/model_tool_test.py b/tests/unit/agent/model_tool_test.py index bb849d8f..6c5cf8fb 100644 --- a/tests/unit/agent/model_tool_test.py +++ b/tests/unit/agent/model_tool_test.py @@ -96,6 +96,7 @@ def test_to_dict(mock_model, mock_model_factory): expected = { "function": mock_model.function.value, "type": "model", + "name": "", "description": "Test description", "supplier": mock_model.supplier.value["code"], "version": None, @@ -175,3 +176,21 @@ def test_validate_parameters(mock_model, params, expected_result, error_expected else: result = tool.validate_parameters(params) assert result == expected_result + + +@pytest.mark.parametrize( + "tool_name,expected_name", + [ + ("custom_tool", "custom_tool"), + ("", ""), # Test empty name + ("translation_model", "translation_model"), + (None, ""), # Test None value should default to empty string + ], +) +def test_tool_name(mock_model, mock_model_factory, tool_name, expected_name): + mock_model_factory.get.return_value = mock_model + tool = ModelTool(model="test_model_id", name=tool_name, function=Function.TRANSLATION) + assert tool.name == expected_name + # Verify name appears correctly in dictionary representation + tool_dict = tool.to_dict() + assert tool_dict["name"] == expected_name From 38b4c4e6c0c71887d9c42c3ce991d369b346bff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Fri, 14 Mar 2025 00:23:08 +0300 Subject: [PATCH 26/36] Added type checking of source_type and updated tests (#436) --- aixplain/factories/agent_factory/__init__.py | 6 +++++- tests/functional/agent/agent_functional_test.py | 2 ++ tests/unit/agent/sql_tool_test.py | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index 97c73d70..c537cb9b 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -250,7 +250,11 @@ def create_sql_tool( source_type = DatabaseSourceType.from_string(source_type) except ValueError as e: raise SQLToolError(str(e)) - + elif isinstance(source_type, DatabaseSourceType): + # Already the correct type, no conversion needed + pass + else: + raise SQLToolError(f"Source type must be either a string or DatabaseSourceType enum, got {type(source_type)}") database_path = None # Final database path to pass to SQLTool diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index cf018b8d..336ef5ca 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -386,6 +386,7 @@ def test_sql_tool(delete_agents_and_team_agents, AgentFactory): assert "eve" in str(response["data"]["output"]).lower() os.remove("ftest.db") + agent.delete() @pytest.mark.parametrize("AgentFactory", [AgentFactory, v2.Agent]) @@ -456,3 +457,4 @@ def test_sql_tool_with_csv(delete_agents_and_team_agents, AgentFactory): # Cleanup os.remove("test.csv") os.remove("test.db") + agent.delete() diff --git a/tests/unit/agent/sql_tool_test.py b/tests/unit/agent/sql_tool_test.py index 4964dc45..d778b35e 100644 --- a/tests/unit/agent/sql_tool_test.py +++ b/tests/unit/agent/sql_tool_test.py @@ -313,6 +313,7 @@ def test_sql_tool_schema_inference(tmp_path): if os.path.exists(tool.database): os.remove(tool.database) + def test_create_sql_tool_source_type_handling(tmp_path): # Create a test database file db_path = os.path.join(tmp_path, "test.db") @@ -333,5 +334,5 @@ def test_create_sql_tool_source_type_handling(tmp_path): assert isinstance(tool_enum, SQLTool) # Test invalid type - with pytest.raises(SQLToolError, match="Source type must be either a string or DatabaseSourceType enum"): + with pytest.raises(SQLToolError, match="Source type must be either a string or DatabaseSourceType enum, got "): AgentFactory.create_sql_tool(description="Test", source=db_path, source_type=123, schema="test") # Invalid type From 1d487ce3455373945a2ffe512857310fb72e761a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Sat, 15 Mar 2025 00:39:39 +0300 Subject: [PATCH 27/36] Eng 1649 agentification improve tool intermediate steps for better visualization (#437) * Name parameter set for tools * explicitly set name param --- aixplain/modules/agent/tool/model_tool.py | 3 ++- aixplain/modules/agent/tool/pipeline_tool.py | 4 +++- aixplain/modules/agent/tool/sql_tool.py | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/aixplain/modules/agent/tool/model_tool.py b/aixplain/modules/agent/tool/model_tool.py index c3f6ff01..ba16317a 100644 --- a/aixplain/modules/agent/tool/model_tool.py +++ b/aixplain/modules/agent/tool/model_tool.py @@ -60,7 +60,8 @@ def __init__( function is not None or model is not None ), "Agent Creation Error: Either function or model must be provided when instantiating a tool." - super().__init__(name=name if name is not None else "", description=description, **additional_info) + name = name or "" + super().__init__(name=name, description=description, **additional_info) if function is not None: if isinstance(function, str): function = Function(function) diff --git a/aixplain/modules/agent/tool/pipeline_tool.py b/aixplain/modules/agent/tool/pipeline_tool.py index f7270c14..13d3c46f 100644 --- a/aixplain/modules/agent/tool/pipeline_tool.py +++ b/aixplain/modules/agent/tool/pipeline_tool.py @@ -47,7 +47,9 @@ def __init__( description (Text): description of the tool pipeline (Union[Text, Pipeline]): pipeline """ - super().__init__(name=name if name is not None else "", description=description, **additional_info) + name = name or "" + super().__init__(name=name, description=description, **additional_info) + if isinstance(pipeline, Pipeline): pipeline = pipeline.id self.pipeline = pipeline diff --git a/aixplain/modules/agent/tool/sql_tool.py b/aixplain/modules/agent/tool/sql_tool.py index 62c366c5..0ac75087 100644 --- a/aixplain/modules/agent/tool/sql_tool.py +++ b/aixplain/modules/agent/tool/sql_tool.py @@ -274,7 +274,10 @@ def __init__( tables (Optional[Union[List[Text], Text]]): table names to work with (optional) enable_commit (bool): enable to modify the database (optional) """ - super().__init__(name=name if name is not None else "", description=description, **additional_info) + + name = name or "" + super().__init__(name=name, description=description, **additional_info) + self.database = database self.schema = schema self.tables = tables if isinstance(tables, list) else [tables] if tables else None From d0386a086ae12b7c8ceac7aed3630b67887e3e88 Mon Sep 17 00:00:00 2001 From: Yunsu Kim Date: Thu, 20 Mar 2025 14:08:54 +0100 Subject: [PATCH 28/36] ENG-1734: Add new inspector arguments (#431) * Add num_inspectors * Conform with maxInspectors * Add inspector_targets * Move InspectorTarget to modules * Add unit tests * Set max_inspectors even if inspectors are not used * Add functional tests * Refactor functional tests * Inspector targets are strings in factory and backend payload * String inputs for inspector_targets * Enable enum user input for inspector_targets * max_inspectors default to 1 in build_team_agent * Docstring for TeamAgentFactory.create() --- .../factories/team_agent_factory/__init__.py | 48 +- .../factories/team_agent_factory/utils.py | 12 +- aixplain/modules/team_agent/__init__.py | 97 ++-- .../team_agent/team_agent_functional_test.py | 427 +++++++++++++----- tests/unit/team_agent_test.py | 222 ++++++++- 5 files changed, 632 insertions(+), 174 deletions(-) diff --git a/aixplain/factories/team_agent_factory/__init__.py b/aixplain/factories/team_agent_factory/__init__.py index e17841e6..c2611d6c 100644 --- a/aixplain/factories/team_agent_factory/__init__.py +++ b/aixplain/factories/team_agent_factory/__init__.py @@ -23,15 +23,15 @@ import json import logging +from typing import Dict, List, Optional, Text, Union +from urllib.parse import urljoin from aixplain.enums.supplier import Supplier from aixplain.modules.agent import Agent -from aixplain.modules.team_agent import TeamAgent +from aixplain.modules.team_agent import TeamAgent, InspectorTarget from aixplain.utils import config from aixplain.factories.team_agent_factory.utils import build_team_agent from aixplain.utils.file_utils import _request_with_retry -from typing import Dict, List, Optional, Text, Union -from urllib.parse import urljoin class TeamAgentFactory: @@ -47,9 +47,29 @@ def create( version: Optional[Text] = None, use_mentalist: bool = True, use_inspector: bool = True, + num_inspectors: int = 1, + inspector_targets: List[Union[InspectorTarget, Text]] = [InspectorTarget.STEPS], use_mentalist_and_inspector: bool = False, # TODO: remove this ) -> TeamAgent: - """Create a new team agent in the platform.""" + """Create a new team agent in the platform. + + Args: + name: The name of the team agent. + agents: A list of agents to be added to the team. + llm_id: The ID of the LLM to be used for the team agent. + description: The description of the team agent. + api_key: The API key to be used for the team agent. + supplier: The supplier of the team agent. + version: The version of the team agent. + use_mentalist: Whether to use the mentalist agent. + use_inspector: Whether to use the inspector agent. + num_inspectors: The number of inspectors to be used for each inspection. + inspector_targets: Which stages to be inspected during an execution of the team agent. (steps, output) + use_mentalist_and_inspector: Whether to use the mentalist and inspector agents. (legacy) + + Returns: + A new team agent instance. + """ assert len(agents) > 0, "TeamAgent Onboarding Error: At least one agent must be provided." agent_list = [] for agent in agents: @@ -68,8 +88,22 @@ def create( assert isinstance(agent, Agent), "TeamAgent Onboarding Error: Agents must be instances of Agent class" agent_list.append(agent_obj) - if use_inspector and not use_mentalist: - raise Exception("TeamAgent Onboarding Error: To use the Inspector agent, you must enable Mentalist.") + # NOTE: backend expects max_inspectors (for "generated" inspectors) + max_inspectors = num_inspectors + + if use_inspector: + try: + # convert to enum if string and check its validity + inspector_targets = [InspectorTarget(target) for target in inspector_targets] + except ValueError: + raise ValueError("TeamAgent Onboarding Error: Invalid inspector target. Valid targets are: steps, output") + + if not use_mentalist: + raise Exception("TeamAgent Onboarding Error: To use the Inspector agent, you must enable Mentalist.") + if max_inspectors < 1: + raise Exception( + "TeamAgent Onboarding Error: The number of inspectors must be greater than 0 when using the Inspector agent." + ) if use_mentalist_and_inspector: mentalist_llm_id = llm_id @@ -100,6 +134,8 @@ def create( "supervisorId": llm_id, "plannerId": mentalist_llm_id, "inspectorId": inspector_llm_id, + "maxInspectors": max_inspectors, + "inspectorTargets": inspector_targets if use_inspector else [], "supplier": supplier, "version": version, "status": "draft", diff --git a/aixplain/factories/team_agent_factory/utils.py b/aixplain/factories/team_agent_factory/utils.py index 5e865cd0..debadff8 100644 --- a/aixplain/factories/team_agent_factory/utils.py +++ b/aixplain/factories/team_agent_factory/utils.py @@ -1,12 +1,14 @@ __author__ = "lucaspavanelli" import logging +from typing import Dict, Text, List +from urllib.parse import urljoin + import aixplain.utils.config as config from aixplain.enums.asset_status import AssetStatus from aixplain.modules.agent import Agent -from aixplain.modules.team_agent import TeamAgent -from typing import Dict, Text, List -from urllib.parse import urljoin +from aixplain.modules.team_agent import TeamAgent, InspectorTarget + GPT_4o_ID = "6646261c6eb563165658bbb1" @@ -29,6 +31,8 @@ def build_team_agent(payload: Dict, agents: List[Agent] = None, api_key: Text = ) continue + inspector_targets = [InspectorTarget(target.lower()) for target in payload.get("inspectorTargets", [])] + team_agent = TeamAgent( id=payload.get("id", ""), name=payload.get("name", ""), @@ -40,6 +44,8 @@ def build_team_agent(payload: Dict, agents: List[Agent] = None, api_key: Text = llm_id=payload.get("llmId", GPT_4o_ID), use_mentalist=True if payload.get("plannerId", None) is not None else False, use_inspector=True if payload.get("inspectorId", None) is not None else False, + max_inspectors=payload.get("maxInspectors", 1), + inspector_targets=inspector_targets, api_key=api_key, status=AssetStatus(payload["status"]), ) diff --git a/aixplain/modules/team_agent/__init__.py b/aixplain/modules/team_agent/__init__.py index 825967e8..29b1348b 100644 --- a/aixplain/modules/team_agent/__init__.py +++ b/aixplain/modules/team_agent/__init__.py @@ -26,8 +26,11 @@ import time import traceback import re +from enum import Enum +from typing import Dict, List, Text, Optional, Union +from urllib.parse import urljoin -from aixplain.utils.file_utils import _request_with_retry +from aixplain.enums import ResponseStatus from aixplain.enums.function import Function from aixplain.enums.supplier import Supplier from aixplain.enums.asset_status import AssetStatus @@ -35,13 +38,18 @@ from aixplain.modules.model import Model from aixplain.modules.agent import Agent, OutputFormat from aixplain.modules.agent.agent_response import AgentResponse -from aixplain.enums import ResponseStatus from aixplain.modules.agent.utils import process_variables -from typing import Dict, List, Text, Optional, Union -from urllib.parse import urljoin +from aixplain.utils import config +from aixplain.utils.file_utils import _request_with_retry -from aixplain.utils import config +class InspectorTarget(str, Enum): + # TODO: INPUT + STEPS = "steps" + OUTPUT = "output" + + def __str__(self): + return self._value_ class TeamAgent(Model): @@ -76,6 +84,8 @@ def __init__( cost: Optional[Dict] = None, use_mentalist: bool = True, use_inspector: bool = True, + max_inspectors: int = 1, + inspector_targets: List[InspectorTarget] = [InspectorTarget.STEPS], status: AssetStatus = AssetStatus.DRAFT, **additional_info, ) -> None: @@ -100,6 +110,8 @@ def __init__( self.llm_id = llm_id self.use_mentalist = use_mentalist self.use_inspector = use_inspector + self.max_inspectors = max_inspectors + self.inspector_targets = inspector_targets if isinstance(status, str): try: @@ -162,9 +174,7 @@ def run( return response poll_url = response["url"] end = time.time() - response = self.sync_poll( - poll_url, name=name, timeout=timeout, wait_time=wait_time - ) + response = self.sync_poll(poll_url, name=name, timeout=timeout, wait_time=wait_time) return response except Exception as e: logging.error(f"Team Agent Run: Error in running for {name}: {e}") @@ -207,18 +217,12 @@ def run_async( from aixplain.factories.file_factory import FileFactory if not self.is_valid: - raise Exception( - "Team Agent is not valid. Please validate the team agent before running." - ) + raise Exception("Team Agent is not valid. Please validate the team agent before running.") - assert ( - data is not None or query is not None - ), "Either 'data' or 'query' must be provided." + assert data is not None or query is not None, "Either 'data' or 'query' must be provided." if data is not None: if isinstance(data, dict): - assert ( - "query" in data and data["query"] is not None - ), "When providing a dictionary, 'query' must be provided." + assert "query" in data and data["query"] is not None, "When providing a dictionary, 'query' must be provided." if session_id is None: session_id = data.pop("session_id", None) if history is None: @@ -232,8 +236,7 @@ def run_async( # process content inputs if content is not None: assert ( - isinstance(query, str) - and FileFactory.check_storage_type(query) == StorageType.TEXT + isinstance(query, str) and FileFactory.check_storage_type(query) == StorageType.TEXT ), "When providing 'content', query must be text." if isinstance(content, list): @@ -243,9 +246,7 @@ def run_async( query += f"\n{input_link}" elif isinstance(content, dict): for key, value in content.items(): - assert ( - "{{" + key + "}}" in query - ), f"Key '{key}' not found in query." + assert "{{" + key + "}}" in query, f"Key '{key}' not found in query." value = FileFactory.to_link(value) query = query.replace("{{" + key + "}}", f"'{value}'") @@ -260,16 +261,8 @@ def run_async( "sessionId": session_id, "history": history, "executionParams": { - "maxTokens": ( - parameters["max_tokens"] - if "max_tokens" in parameters - else max_tokens - ), - "maxIterations": ( - parameters["max_iterations"] - if "max_iterations" in parameters - else max_iterations - ), + "maxTokens": (parameters["max_tokens"] if "max_tokens" in parameters else max_tokens), + "maxIterations": (parameters["max_iterations"] if "max_iterations" in parameters else max_iterations), "outputFormat": output_format.value, }, } @@ -277,9 +270,7 @@ def run_async( payload = json.dumps(payload) r = _request_with_retry("post", self.url, headers=headers, data=payload) - logging.info( - f"Team Agent Run Async: Start service for {name} - {self.url} - {payload} - {headers}" - ) + logging.info(f"Team Agent Run Async: Start service for {name} - {self.url} - {payload} - {headers}") resp = None try: @@ -309,7 +300,9 @@ def delete(self) -> None: if r.status_code != 200: raise Exception() except Exception: - message = f"Team Agent Deletion Error (HTTP {r.status_code}): Make sure the Team Agent exists and you are the owner." + message = ( + f"Team Agent Deletion Error (HTTP {r.status_code}): Make sure the Team Agent exists and you are the owner." + ) logging.error(message) raise Exception(f"{message}") @@ -318,8 +311,7 @@ def to_dict(self) -> Dict: "id": self.id, "name": self.name, "agents": [ - {"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"} - for idx, agent in enumerate(self.agents) + {"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"} for idx, agent in enumerate(self.agents) ], "links": [], "description": self.description, @@ -327,6 +319,8 @@ def to_dict(self) -> Dict: "supervisorId": self.llm_id, "plannerId": self.llm_id if self.use_mentalist else None, "inspectorId": self.llm_id if self.use_inspector else None, + "maxInspectors": self.max_inspectors, + "inspectorTargets": [target.value for target in self.inspector_targets], "supplier": self.supplier.value["code"] if isinstance(self.supplier, Supplier) else self.supplier, "version": self.version, "status": self.status.value, @@ -343,9 +337,7 @@ def _validate(self) -> None: try: llm = ModelFactory.get(self.llm_id) - assert ( - llm.function == Function.TEXT_GENERATION - ), "Large Language Model must be a text generation model." + assert llm.function == Function.TEXT_GENERATION, "Large Language Model must be a text generation model." except Exception: raise Exception(f"Large Language Model with ID '{self.llm_id}' not found.") @@ -362,9 +354,7 @@ def validate(self, raise_exception: bool = False) -> bool: raise e else: logging.warning(f"Team Agent Validation Error: {e}") - logging.warning( - "You won't be able to run the Team Agent until the issues are handled manually." - ) + logging.warning("You won't be able to run the Team Agent until the issues are handled manually.") return self.is_valid @@ -377,8 +367,7 @@ def update(self) -> None: stack = inspect.stack() if len(stack) > 2 and stack[1].function != "save": warnings.warn( - "update() is deprecated and will be removed in a future version. " - "Please use save() instead.", + "update() is deprecated and will be removed in a future version. " "Please use save() instead.", DeprecationWarning, stacklevel=2, ) @@ -390,17 +379,13 @@ def update(self) -> None: payload = self.to_dict() - logging.debug( - f"Start service for PUT Update Team Agent - {url} - {headers} - {json.dumps(payload)}" - ) + logging.debug(f"Start service for PUT Update Team Agent - {url} - {headers} - {json.dumps(payload)}") resp = "No specified error." try: r = _request_with_retry("put", url, headers=headers, json=payload) resp = r.json() except Exception: - raise Exception( - "Team Agent Update Error: Please contact the administrators." - ) + raise Exception("Team Agent Update Error: Please contact the administrators.") if 200 <= r.status_code < 300: return build_team_agent(resp) @@ -414,11 +399,7 @@ def save(self) -> None: def deploy(self) -> None: """Deploy the Team Agent.""" - assert ( - self.status == AssetStatus.DRAFT - ), "Team Agent Deployment Error: Team Agent must be in draft status." - assert ( - self.status != AssetStatus.ONBOARDED - ), "Team Agent Deployment Error: Team Agent must be onboarded." + assert self.status == AssetStatus.DRAFT, "Team Agent Deployment Error: Team Agent must be in draft status." + assert self.status != AssetStatus.ONBOARDED, "Team Agent Deployment Error: Team Agent must be onboarded." self.status = AssetStatus.ONBOARDED self.update() diff --git a/tests/functional/team_agent/team_agent_functional_test.py b/tests/functional/team_agent/team_agent_functional_test.py index c76dc8eb..1946d8d8 100644 --- a/tests/functional/team_agent/team_agent_functional_test.py +++ b/tests/functional/team_agent/team_agent_functional_test.py @@ -23,6 +23,7 @@ from aixplain.enums.asset_status import AssetStatus from aixplain.enums.function import Function from aixplain.enums.supplier import Supplier +from aixplain.modules.team_agent import InspectorTarget from copy import copy from uuid import uuid4 import pytest @@ -56,10 +57,8 @@ def run_input_map(request): return request.param -@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) -def test_end2end(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): - assert delete_agents_and_team_agents - +def create_agents_from_input_map(run_input_map, deploy=True): + """Helper function to create agents from input map""" agents = [] for agent in run_input_map["agents"]: tools = [] @@ -85,24 +84,90 @@ def test_end2end(run_input_map, delete_agents_and_team_agents, TeamAgentFactory) llm_id=agent["llm_id"], tools=tools, ) - agent.deploy() + if deploy: + agent.deploy() agents.append(agent) - team_agent = TeamAgentFactory.create( + return agents + + +def create_team_agent( + factory, agents, run_input_map, use_mentalist=True, use_inspector=True, num_inspectors=1, inspector_targets=None +): + """Helper function to create a team agent""" + if inspector_targets is None: + inspector_targets = [InspectorTarget.STEPS] + + team_agent = factory.create( name=run_input_map["team_agent_name"], agents=agents, description=run_input_map["team_agent_name"], llm_id=run_input_map["llm_id"], - use_mentalist_and_inspector=True, + use_mentalist=use_mentalist, + use_inspector=use_inspector, + num_inspectors=num_inspectors, + inspector_targets=inspector_targets, ) + return team_agent + + +def verify_inspector_steps(steps, num_inspectors): + """Helper function to verify inspector steps""" + # Count occurrences of each inspector + inspector_counts = {} + for i in range(num_inspectors): + inspector_name = f"inspector_{i}" + inspector_steps = [step for step in steps if inspector_name.lower() in step.get("agent", "").lower()] + inspector_counts[inspector_name] = len(inspector_steps) + + # Verify all inspectors are present and have the same number of steps + assert len(inspector_counts) == num_inspectors, f"Expected {num_inspectors} inspectors, found {len(inspector_counts)}" + + if len(inspector_counts) > 0: + first_count = next(iter(inspector_counts.values())) + for inspector, count in inspector_counts.items(): + assert count > 0, f"Inspector {inspector} has no steps" + assert count == first_count, f"Inspector {inspector} has {count} steps, expected {first_count}" + print(f"Inspector {inspector} has {count} steps") + + return inspector_counts + + +def verify_response_generator(steps, has_output_target=False): + """Helper function to verify response generator step""" + response_generator_steps = [step for step in steps if "response_generator" in step.get("agent", "").lower()] + assert ( + len(response_generator_steps) == 1 + ), f"Expected exactly one response_generator step, found {len(response_generator_steps)}" + + response_generator_step = response_generator_steps[0] + + if has_output_target: + assert response_generator_step[ + "thought" + ], "Response generator thought is empty, but should contain inspector feedback because OUTPUT is in inspector_targets" + print(f"Response generator thought with OUTPUT target: {response_generator_step['thought']}") + + return response_generator_step + + +@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) +def test_end2end(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): + assert delete_agents_and_team_agents + + agents = create_agents_from_input_map(run_input_map) + team_agent = create_team_agent(TeamAgentFactory, agents, run_input_map, use_mentalist=True, use_inspector=True) + assert team_agent is not None assert team_agent.status == AssetStatus.DRAFT + # deploy team agent team_agent.deploy() team_agent = TeamAgentFactory.get(team_agent.id) assert team_agent is not None assert team_agent.status == AssetStatus.ONBOARDED + response = team_agent.run(data=run_input_map["query"]) assert response is not None @@ -122,40 +187,8 @@ def test_draft_team_agent_update(run_input_map, TeamAgentFactory): for agent in AgentFactory.list()["results"]: agent.delete() - agents = [] - for agent in run_input_map["agents"]: - tools = [] - if "model_tools" in agent: - for tool in agent["model_tools"]: - tool_ = copy(tool) - for supplier in Supplier: - if tool["supplier"] is not None and tool["supplier"].lower() in [ - supplier.value["code"].lower(), - supplier.value["name"].lower(), - ]: - tool_["supplier"] = supplier - break - tools.append(AgentFactory.create_model_tool(**tool_)) - if "pipeline_tools" in agent: - for tool in agent["pipeline_tools"]: - tools.append(AgentFactory.create_pipeline_tool(pipeline=tool["pipeline_id"], description=tool["description"])) - - agent = AgentFactory.create( - name=agent["agent_name"], - description=agent["agent_name"], - instructions=agent["agent_name"], - llm_id=agent["llm_id"], - tools=tools, - ) - agents.append(agent) - - team_agent = TeamAgentFactory.create( - name=run_input_map["team_agent_name"], - agents=agents, - description=run_input_map["team_agent_name"], - llm_id=run_input_map["llm_id"], - use_mentalist_and_inspector=True, - ) + agents = create_agents_from_input_map(run_input_map, deploy=False) + team_agent = create_team_agent(TeamAgentFactory, agents, run_input_map, use_mentalist=True, use_inspector=True) team_agent_name = str(uuid4()).replace("-", "") team_agent.name = team_agent_name @@ -172,32 +205,8 @@ def test_fail_non_existent_llm(run_input_map, TeamAgentFactory): for agent in AgentFactory.list()["results"]: agent.delete() - agents = [] - for agent in run_input_map["agents"]: - tools = [] - if "model_tools" in agent: - for tool in agent["model_tools"]: - tool_ = copy(tool) - for supplier in Supplier: - if tool["supplier"] is not None and tool["supplier"].lower() in [ - supplier.value["code"].lower(), - supplier.value["name"].lower(), - ]: - tool_["supplier"] = supplier - break - tools.append(AgentFactory.create_model_tool(**tool_)) - if "pipeline_tools" in agent: - for tool in agent["pipeline_tools"]: - tools.append(AgentFactory.create_pipeline_tool(pipeline=tool["pipeline_id"], description=tool["description"])) + agents = create_agents_from_input_map(run_input_map, deploy=False) - agent = AgentFactory.create( - name=agent["agent_name"], - description=agent["agent_name"], - instructions=agent["agent_name"], - llm_id=agent["llm_id"], - tools=tools, - ) - agents.append(agent) with pytest.raises(Exception) as exc_info: TeamAgentFactory.create( name="Non Existent LLM", @@ -212,40 +221,8 @@ def test_fail_non_existent_llm(run_input_map, TeamAgentFactory): def test_add_remove_agents_from_team_agent(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): assert delete_agents_and_team_agents - agents = [] - for agent in run_input_map["agents"]: - tools = [] - if "model_tools" in agent: - for tool in agent["model_tools"]: - tool_ = copy(tool) - for supplier in Supplier: - if tool["supplier"] is not None and tool["supplier"].lower() in [ - supplier.value["code"].lower(), - supplier.value["name"].lower(), - ]: - tool_["supplier"] = supplier - break - tools.append(AgentFactory.create_model_tool(**tool_)) - if "pipeline_tools" in agent: - for tool in agent["pipeline_tools"]: - tools.append(AgentFactory.create_pipeline_tool(pipeline=tool["pipeline_id"], description=tool["description"])) - - agent = AgentFactory.create( - name=agent["agent_name"], - description=agent["agent_name"], - instructions=agent["agent_name"], - llm_id=agent["llm_id"], - tools=tools, - ) - agents.append(agent) - - team_agent = TeamAgentFactory.create( - name=run_input_map["team_agent_name"], - agents=agents, - description=run_input_map["team_agent_name"], - llm_id=run_input_map["llm_id"], - use_mentalist_and_inspector=True, - ) + agents = create_agents_from_input_map(run_input_map, deploy=False) + team_agent = create_team_agent(TeamAgentFactory, agents, run_input_map, use_mentalist=True, use_inspector=True) assert team_agent is not None assert team_agent.status == AssetStatus.DRAFT @@ -348,7 +325,8 @@ def test_team_agent_with_parameterized_agents(delete_agents_and_team_agents): agents=[search_agent, translation_agent], description="Team agent with parameterized tools", llm_id="677c16166eb563bb611623c1", - use_mentalist_and_inspector=True, + use_mentalist=True, + use_inspector=True, ) # Deploy team agent @@ -372,3 +350,250 @@ def test_team_agent_with_parameterized_agents(delete_agents_and_team_agents): team_agent.delete() search_agent.delete() translation_agent.delete() + + +@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) +def test_team_agent_with_inspector_params(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): + """Test team agent with custom inspector parameters""" + assert delete_agents_and_team_agents + + agents = create_agents_from_input_map(run_input_map) + + # Create team agent with custom inspector parameters + num_inspectors = 2 + team_agent = create_team_agent( + TeamAgentFactory, + agents, + run_input_map, + use_mentalist=True, + use_inspector=True, + num_inspectors=num_inspectors, + inspector_targets=["steps", "output"], + ) + + assert team_agent is not None + assert team_agent.status == AssetStatus.DRAFT + assert team_agent.use_mentalist is True + assert team_agent.use_inspector is True + assert team_agent.max_inspectors == num_inspectors + assert len(team_agent.inspector_targets) == 2 + assert InspectorTarget.STEPS in team_agent.inspector_targets + assert InspectorTarget.OUTPUT in team_agent.inspector_targets + + # deploy team agent + team_agent.deploy() + team_agent = TeamAgentFactory.get(team_agent.id) + assert team_agent is not None + assert team_agent.status == AssetStatus.ONBOARDED + assert team_agent.max_inspectors == num_inspectors + assert len(team_agent.inspector_targets) == 2 + + # Run the team agent + response = team_agent.run(data=run_input_map["query"]) + + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + assert "data" in response + assert response["data"]["session_id"] is not None + assert response["data"]["output"] is not None + + # Check if intermediate steps contain inspector outputs + if "intermediate_steps" in response["data"]: + steps = response["data"]["intermediate_steps"] + + # Verify inspector steps + verify_inspector_steps(steps, num_inspectors) + + # Verify response generator + verify_response_generator(steps, has_output_target=True) + + team_agent.delete() + + +@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) +def test_team_agent_update_inspector_params(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): + """Test updating inspector parameters for a team agent""" + assert delete_agents_and_team_agents + + agents = create_agents_from_input_map(run_input_map) + + # Create team agent with initial inspector parameters + team_agent = create_team_agent( + TeamAgentFactory, + agents, + run_input_map, + use_mentalist=True, + use_inspector=True, + num_inspectors=1, + inspector_targets=["steps"], + ) + + assert team_agent is not None + assert team_agent.status == AssetStatus.DRAFT + assert team_agent.max_inspectors == 1 + assert len(team_agent.inspector_targets) == 1 + assert team_agent.inspector_targets[0] == InspectorTarget.STEPS + + # Update inspector parameters + team_agent.max_inspectors = 3 + team_agent.inspector_targets = [InspectorTarget.STEPS, InspectorTarget.OUTPUT] + team_agent.update() + + # Get the updated team agent + updated_team_agent = TeamAgentFactory.get(team_agent.id) + assert updated_team_agent.max_inspectors == 3 + assert len(updated_team_agent.inspector_targets) == 2 + assert InspectorTarget.STEPS in updated_team_agent.inspector_targets + assert InspectorTarget.OUTPUT in updated_team_agent.inspector_targets + + team_agent.delete() + + +@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) +def test_team_agent_with_steps_only_inspector(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): + """Test team agent with inspector targeting only steps""" + assert delete_agents_and_team_agents + + agents = create_agents_from_input_map(run_input_map) + + # Create team agent with steps-only inspector + num_inspectors = 1 + team_agent = create_team_agent( + TeamAgentFactory, + agents, + run_input_map, + use_mentalist=True, + use_inspector=True, + num_inspectors=num_inspectors, + inspector_targets=["steps"], + ) + + assert team_agent is not None + assert team_agent.status == AssetStatus.DRAFT + assert team_agent.max_inspectors == num_inspectors + assert len(team_agent.inspector_targets) == 1 + assert team_agent.inspector_targets[0] == InspectorTarget.STEPS + + # deploy team agent + team_agent.deploy() + team_agent = TeamAgentFactory.get(team_agent.id) + assert team_agent is not None + assert team_agent.status == AssetStatus.ONBOARDED + + # Run the team agent + response = team_agent.run(data=run_input_map["query"]) + + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + + # Check for inspector steps + if "intermediate_steps" in response["data"]: + steps = response["data"]["intermediate_steps"] + + # Verify inspector steps + verify_inspector_steps(steps, num_inspectors) + + # Verify response generator + response_generator_step = verify_response_generator(steps, has_output_target=False) + print(f"Response generator thought (STEPS only): {response_generator_step.get('thought', '')}") + + team_agent.delete() + + +@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) +def test_team_agent_with_output_only_inspector(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): + """Test team agent with inspector targeting only output""" + assert delete_agents_and_team_agents + + agents = create_agents_from_input_map(run_input_map) + + # Create team agent with output-only inspector + num_inspectors = 1 + team_agent = create_team_agent( + TeamAgentFactory, + agents, + run_input_map, + use_mentalist=True, + use_inspector=True, + num_inspectors=num_inspectors, + inspector_targets=["output"], + ) + + assert team_agent is not None + assert team_agent.status == AssetStatus.DRAFT + assert team_agent.max_inspectors == num_inspectors + assert len(team_agent.inspector_targets) == 1 + assert team_agent.inspector_targets[0] == InspectorTarget.OUTPUT + + # deploy team agent + team_agent.deploy() + team_agent = TeamAgentFactory.get(team_agent.id) + assert team_agent is not None + assert team_agent.status == AssetStatus.ONBOARDED + + # Run the team agent + response = team_agent.run(data=run_input_map["query"]) + + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + + # Check for inspector steps + if "intermediate_steps" in response["data"]: + steps = response["data"]["intermediate_steps"] + + # Verify response generator with OUTPUT target + verify_response_generator(steps, has_output_target=True) + + team_agent.delete() + + +@pytest.mark.parametrize("TeamAgentFactory", [TeamAgentFactory, v2.TeamAgent]) +def test_team_agent_with_multiple_inspectors(run_input_map, delete_agents_and_team_agents, TeamAgentFactory): + """Test team agent with multiple inspectors""" + assert delete_agents_and_team_agents + + agents = create_agents_from_input_map(run_input_map) + + # Create team agent with multiple inspectors + num_inspectors = 5 # Testing with 5 inspectors + team_agent = create_team_agent( + TeamAgentFactory, + agents, + run_input_map, + use_mentalist=True, + use_inspector=True, + num_inspectors=num_inspectors, + inspector_targets=["steps"], + ) + + assert team_agent is not None + assert team_agent.status == AssetStatus.DRAFT + assert team_agent.max_inspectors == num_inspectors + + # deploy team agent + team_agent.deploy() + team_agent = TeamAgentFactory.get(team_agent.id) + assert team_agent is not None + assert team_agent.status == AssetStatus.ONBOARDED + + # Run the team agent + response = team_agent.run(data=run_input_map["query"]) + + assert response is not None + assert response["completed"] is True + assert response["status"].lower() == "success" + + # Check for inspector steps + if "intermediate_steps" in response["data"]: + steps = response["data"]["intermediate_steps"] + + # Verify inspector steps + verify_inspector_steps(steps, num_inspectors) + + # Verify response generator + verify_response_generator(steps, has_output_target=False) + + team_agent.delete() diff --git a/tests/unit/team_agent_test.py b/tests/unit/team_agent_test.py index a456b980..2b06043e 100644 --- a/tests/unit/team_agent_test.py +++ b/tests/unit/team_agent_test.py @@ -1,13 +1,15 @@ import pytest import requests_mock +from urllib.parse import urljoin +from unittest.mock import patch + +from aixplain.enums.asset_status import AssetStatus from aixplain.factories import TeamAgentFactory from aixplain.factories import AgentFactory -from aixplain.enums.asset_status import AssetStatus -from aixplain.modules import Agent, TeamAgent +from aixplain.modules.agent import Agent +from aixplain.modules.team_agent import TeamAgent, InspectorTarget from aixplain.modules.agent.tool.model_tool import ModelTool from aixplain.utils import config -from urllib.parse import urljoin -from unittest.mock import patch def test_fail_no_data_query(): @@ -108,6 +110,41 @@ def test_to_dict(): assert team_agent_dict["agents"][0]["label"] == "AGENT" +def test_to_dict_with_inspector_params(): + team_agent = TeamAgent( + id="123", + name="Test Team Agent(-)", + agents=[ + Agent( + id="", + name="Test Agent(-)", + description="Test Agent Description", + instructions="Test Agent Role", + llm_id="6646261c6eb563165658bbb1", + tools=[ModelTool(function="text-generation")], + ) + ], + description="Test Team Agent Description", + llm_id="6646261c6eb563165658bbb1", + use_mentalist=True, + use_inspector=True, + max_inspectors=2, + inspector_targets=[InspectorTarget.STEPS, InspectorTarget.OUTPUT], + ) + + team_agent_dict = team_agent.to_dict() + assert team_agent_dict["id"] == "123" + assert team_agent_dict["name"] == "Test Team Agent(-)" + assert team_agent_dict["description"] == "Test Team Agent Description" + assert team_agent_dict["llmId"] == "6646261c6eb563165658bbb1" + assert team_agent_dict["supervisorId"] == "6646261c6eb563165658bbb1" + assert team_agent_dict["plannerId"] == "6646261c6eb563165658bbb1" + assert team_agent_dict["inspectorId"] == "6646261c6eb563165658bbb1" + assert team_agent_dict["maxInspectors"] == 2 + assert team_agent_dict["inspectorTargets"] == ["steps", "output"] + assert len(team_agent_dict["agents"]) == 1 + + @patch("aixplain.factories.model_factory.ModelFactory.get") def test_create_team_agent(mock_model_factory_get): from aixplain.modules import Model @@ -193,11 +230,11 @@ def test_create_team_agent(mock_model_factory_get): team_agent = TeamAgentFactory.create( name="TEST Multi agent(-)", + agents=[agent], + llm_id="6646261c6eb563165658bbb1", description="TEST Multi agent", use_mentalist=True, use_inspector=True, - llm_id="6646261c6eb563165658bbb1", - agents=[agent], ) assert team_agent.id is not None assert team_agent.name == team_ref_response["name"] @@ -232,6 +269,179 @@ def test_create_team_agent(mock_model_factory_get): assert team_agent.status.value == "onboarded" +@patch("aixplain.factories.model_factory.ModelFactory.get") +def test_create_team_agent_with_inspector_params(mock_model_factory_get): + from aixplain.modules import Model + from aixplain.enums import Function + + # Mock the model factory response + mock_model = Model( + id="6646261c6eb563165658bbb1", name="Test LLM", description="Test LLM Description", function=Function.TEXT_GENERATION + ) + mock_model_factory_get.return_value = mock_model + + with requests_mock.Mocker() as mock: + headers = {"x-api-key": config.TEAM_API_KEY, "Content-Type": "application/json"} + # MOCK GET LLM + url = urljoin(config.BACKEND_URL, "sdk/models/6646261c6eb563165658bbb1") + model_ref_response = { + "id": "6646261c6eb563165658bbb1", + "name": "Test LLM", + "description": "Test LLM Description", + "function": {"id": "text-generation"}, + "supplier": "openai", + "version": {"id": "1.0"}, + "status": "onboarded", + "pricing": {"currency": "USD", "value": 0.0}, + } + mock.get(url, headers=headers, json=model_ref_response) + + # AGENT MOCK CREATION + url = urljoin(config.BACKEND_URL, "sdk/agents") + ref_response = { + "id": "123", + "name": "Test Agent(-)", + "description": "Test Agent Description", + "role": "Test Agent Role", + "teamId": "123", + "version": "1.0", + "status": "draft", + "llmId": "6646261c6eb563165658bbb1", + "pricing": {"currency": "USD", "value": 0.0}, + "assets": [ + { + "type": "model", + "supplier": "openai", + "version": "1.0", + "assetId": "6646261c6eb563165658bbb1", + "function": "text-generation", + } + ], + } + mock.post(url, headers=headers, json=ref_response) + + agent = AgentFactory.create( + name="Test Agent(-)", + description="Test Agent Description", + instructions="Test Agent Role", + llm_id="6646261c6eb563165658bbb1", + tools=[ModelTool(model="6646261c6eb563165658bbb1")], + ) + + # AGENT MOCK GET + url = urljoin(config.BACKEND_URL, f"sdk/agents/{agent.id}") + mock.get(url, headers=headers, json=ref_response) + + # TEAM MOCK CREATION + url = urljoin(config.BACKEND_URL, "sdk/agent-communities") + team_ref_response = { + "id": "team_agent_123", + "name": "TEST Multi agent(-)", + "status": "draft", + "teamId": 645, + "description": "TEST Multi agent", + "llmId": "6646261c6eb563165658bbb1", + "assets": [], + "agents": [{"assetId": "123", "type": "AGENT", "number": 0, "label": "AGENT"}], + "links": [], + "plannerId": "6646261c6eb563165658bbb1", + "inspectorId": "6646261c6eb563165658bbb1", + "supervisorId": "6646261c6eb563165658bbb1", + "maxInspectors": 3, + "inspectorTargets": ["steps", "output"], + "createdAt": "2024-10-28T19:30:25.344Z", + "updatedAt": "2024-10-28T19:30:25.344Z", + } + mock.post(url, headers=headers, json=team_ref_response) + + team_agent = TeamAgentFactory.create( + name="TEST Multi agent(-)", + agents=[agent], + llm_id="6646261c6eb563165658bbb1", + description="TEST Multi agent", + use_mentalist=True, + use_inspector=True, + num_inspectors=3, + inspector_targets=[InspectorTarget.STEPS, InspectorTarget.OUTPUT], + ) + assert team_agent.id is not None + assert team_agent.name == team_ref_response["name"] + assert team_agent.description == team_ref_response["description"] + assert team_agent.llm_id == team_ref_response["llmId"] + assert team_agent.use_mentalist is True + assert team_agent.use_inspector is True + assert team_agent.max_inspectors == 3 + assert team_agent.inspector_targets == [InspectorTarget.STEPS, InspectorTarget.OUTPUT] + assert team_agent.status == AssetStatus.DRAFT + assert len(team_agent.agents) == 1 + assert team_agent.agents[0].id == team_ref_response["agents"][0]["assetId"] + + +def test_fail_inspector_without_mentalist(): + with pytest.raises(Exception) as exc_info: + TeamAgentFactory.create( + name="Test Team Agent(-)", + agents=[ + Agent( + id="123", + name="Test Agent(-)", + description="Test Agent Description", + instructions="Test Agent Role", + llm_id="6646261c6eb563165658bbb1", + tools=[ModelTool(function="text-generation")], + ) + ], + use_mentalist=False, + use_inspector=True, + ) + + assert "you must enable Mentalist" in str(exc_info.value) + + +def test_fail_invalid_inspector_target(): + with pytest.raises(ValueError) as exc_info: + TeamAgentFactory.create( + name="Test Team Agent(-)", + agents=[ + Agent( + id="123", + name="Test Agent(-)", + description="Test Agent Description", + instructions="Test Agent Role", + llm_id="6646261c6eb563165658bbb1", + tools=[ModelTool(function="text-generation")], + ) + ], + use_mentalist=True, + use_inspector=True, + inspector_targets=["invalid_target"], + ) + + assert "Invalid inspector target" in str(exc_info.value) + + +def test_fail_zero_inspectors(): + with pytest.raises(Exception) as exc_info: + TeamAgentFactory.create( + name="Test Team Agent(-)", + agents=[ + Agent( + id="123", + name="Test Agent(-)", + description="Test Agent Description", + instructions="Test Agent Role", + llm_id="6646261c6eb563165658bbb1", + tools=[ModelTool(function="text-generation")], + ) + ], + use_mentalist=True, + use_inspector=True, + num_inspectors=0, + ) + + assert "The number of inspectors must be greater than 0" in str(exc_info.value) + + def test_build_team_agent(mocker): from aixplain.factories.team_agent_factory.utils import build_team_agent from aixplain.modules.agent import Agent, AgentTask From 6619a1ec299dbb5349fbae3e694da2ea1f84e32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Fri, 21 Mar 2025 21:58:05 +0300 Subject: [PATCH 29/36] BUG-443:Fix the table name setting of CSV Tool (#447) --- aixplain/factories/agent_factory/__init__.py | 6 +++++- aixplain/modules/agent/tool/sql_tool.py | 5 +++-- tests/conftest.py | 2 +- tests/functional/agent/agent_functional_test.py | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/aixplain/factories/agent_factory/__init__.py b/aixplain/factories/agent_factory/__init__.py index c537cb9b..cefa964b 100644 --- a/aixplain/factories/agent_factory/__init__.py +++ b/aixplain/factories/agent_factory/__init__.py @@ -260,18 +260,22 @@ def create_sql_tool( # Handle CSV source type if source_type == DatabaseSourceType.CSV: + if not os.path.exists(source): raise SQLToolError(f"CSV file '{source}' does not exist") if not source.endswith(".csv"): raise SQLToolError(f"File '{source}' is not a CSV file") + if tables and len(tables) > 1: + raise SQLToolError("CSV source type only supports one table") # Create database name from CSV filename or use custom table name base_name = os.path.splitext(os.path.basename(source))[0] db_path = os.path.join(os.path.dirname(source), f"{base_name}.db") + table_name = tables[0] if tables else None try: # Create database from CSV - schema = create_database_from_csv(source, db_path) + schema = create_database_from_csv(source, db_path, table_name) database_path = db_path # Get table names if not provided diff --git a/aixplain/modules/agent/tool/sql_tool.py b/aixplain/modules/agent/tool/sql_tool.py index 0ac75087..29f73007 100644 --- a/aixplain/modules/agent/tool/sql_tool.py +++ b/aixplain/modules/agent/tool/sql_tool.py @@ -127,7 +127,7 @@ def get_table_schema(database_path: str) -> str: raise DatabaseError(f"Unexpected error while getting table schema: {str(e)}") -def create_database_from_csv(csv_path: str, database_path: str) -> str: +def create_database_from_csv(csv_path: str, database_path: str, table_name: str = None) -> str: """Create SQLite database from CSV file and return the schema""" if not os.path.exists(csv_path): raise CSVError(f"CSV file '{csv_path}' does not exist") @@ -161,7 +161,8 @@ def create_database_from_csv(csv_path: str, database_path: str) -> str: cursor = conn.cursor() # Check if table already exists - table_name = clean_column_name(os.path.splitext(os.path.basename(csv_path))[0]) + if table_name is None: + table_name = clean_column_name(os.path.splitext(os.path.basename(csv_path))[0]) cursor.execute(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}'") if cursor.fetchone(): warnings.warn(f"Table '{table_name}' already exists in the database and will be replaced") diff --git a/tests/conftest.py b/tests/conftest.py index a03eea30..a17177b8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ from dotenv import load_dotenv # Load environment variables once for all tests -load_dotenv() +load_dotenv(override=True) diff --git a/tests/functional/agent/agent_functional_test.py b/tests/functional/agent/agent_functional_test.py index 336ef5ca..1a2cbcb4 100644 --- a/tests/functional/agent/agent_functional_test.py +++ b/tests/functional/agent/agent_functional_test.py @@ -418,7 +418,7 @@ def test_sql_tool_with_csv(delete_agents_and_team_agents, AgentFactory): assert tool.tables == ["employees"] assert ( tool.schema - == 'CREATE TABLE test (\n "id" INTEGER, "name" TEXT, "department" TEXT, "salary" INTEGER\n )' # noqa: W503 + == 'CREATE TABLE employees (\n "id" INTEGER, "name" TEXT, "department" TEXT, "salary" INTEGER\n )' # noqa: W503 ) assert not tool.enable_commit # must be False by default From 7d806446ef21972bebd3b8cea0c7f7b1a32dcf93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20G=C3=BCnd=C3=BCz?= Date: Mon, 24 Mar 2025 22:14:55 +0300 Subject: [PATCH 30/36] ENG-1842: Utility asset status set to draft as default (#449) * ENG-1842: Utility asset status set to draft as default - integrated with backend - lifecycle of utilities are same as agents - added test methods for status check and overwriting draft utility * added warnings * added assestatus to enum class * Removed warning in validate --- aixplain/enums/__init__.py | 1 + aixplain/modules/model/utility_model.py | 30 ++++-- .../model/run_utility_model_test.py | 91 ++++++++++++++++--- tests/unit/utility_test.py | 72 ++++++++++++++- 4 files changed, 168 insertions(+), 26 deletions(-) diff --git a/aixplain/enums/__init__.py b/aixplain/enums/__init__.py index 555f4920..56066564 100644 --- a/aixplain/enums/__init__.py +++ b/aixplain/enums/__init__.py @@ -16,3 +16,4 @@ from .sort_order import SortOrder from .response_status import ResponseStatus from .database_source import DatabaseSourceType +from .asset_status import AssetStatus diff --git a/aixplain/modules/model/utility_model.py b/aixplain/modules/model/utility_model.py index a2fbd05b..6fa7d9a5 100644 --- a/aixplain/modules/model/utility_model.py +++ b/aixplain/modules/model/utility_model.py @@ -19,6 +19,7 @@ Utility Model Class """ import logging +import warnings from aixplain.enums import Function, Supplier, DataType from aixplain.enums.asset_status import AssetStatus from aixplain.modules.model import Model @@ -43,17 +44,20 @@ def validate(self): def to_dict(self): return {"name": self.name, "description": self.description, "type": self.type.value} + # Tool decorator -def utility_tool(name: Text, description: Text, inputs: List[UtilityModelInput] = None, output_examples: Text = "", status = AssetStatus.DRAFT): +def utility_tool( + name: Text, description: Text, inputs: List[UtilityModelInput] = None, output_examples: Text = "", status=AssetStatus.DRAFT +): """Decorator for utility tool functions - + Args: name: Name of the utility tool description: Description of what the utility tool does inputs: List of input parameters, must be UtilityModelInput objects output_examples: Examples of expected outputs status: Asset status - + Raises: ValueError: If name or description is empty TypeError: If inputs contains non-UtilityModelInput objects @@ -63,7 +67,7 @@ def utility_tool(name: Text, description: Text, inputs: List[UtilityModelInput] raise ValueError("Utility tool name cannot be empty") if not description or not description.strip(): raise ValueError("Utility tool description cannot be empty") - + # Validate inputs if inputs is not None: if not isinstance(inputs, list): @@ -71,7 +75,7 @@ def utility_tool(name: Text, description: Text, inputs: List[UtilityModelInput] for input_param in inputs: if not isinstance(input_param, UtilityModelInput): raise TypeError(f"Invalid input parameter: {input_param}. All inputs must be UtilityModelInput objects") - + def decorator(func): func._is_utility_tool = True # Mark function as utility tool func._tool_name = name.strip() @@ -80,12 +84,16 @@ def decorator(func): func._tool_output_examples = output_examples func._tool_status = status return func + return decorator class UtilityModel(Model): """Ready-to-use Utility Model. + Note: Non-deployed utility models (status=DRAFT) will expire after 24 hours after creation. + Use the .deploy() method to make the model permanent. + Attributes: id (Text): ID of the Model name (Text): Name of the Model @@ -116,7 +124,7 @@ def __init__( function: Optional[Function] = None, is_subscribed: bool = False, cost: Optional[Dict] = None, - status: AssetStatus = AssetStatus.ONBOARDED,# TODO: change to draft when we have the backend ready + status: AssetStatus = AssetStatus.DRAFT, **additional_info, ) -> None: """Utility Model Init @@ -161,6 +169,13 @@ def __init__( status = AssetStatus.DRAFT self.status = status + if status == AssetStatus.DRAFT: + warnings.warn( + "WARNING: Non-deployed utility models (status=DRAFT) will expire after 24 hours after creation. " + "Use .deploy() method to make the model permanent.", + UserWarning, + ) + def validate(self): """Validate the Utility Model.""" description = None @@ -187,7 +202,6 @@ def validate(self): assert self.description and self.description.strip() != "", "Description is required" assert self.code and self.code.strip() != "", "Code is required" - def _model_exists(self): if self.id is None or self.id == "": return False @@ -199,7 +213,6 @@ def _model_exists(self): raise Exception() return True - def to_dict(self): return { "name": self.name, @@ -225,7 +238,6 @@ def update(self): stacklevel=2, ) - self.validate() url = urljoin(self.backend_url, f"sdk/utilities/{self.id}") headers = {"x-api-key": f"{self.api_key}", "Content-Type": "application/json"} diff --git a/tests/functional/model/run_utility_model_test.py b/tests/functional/model/run_utility_model_test.py index b9ef5465..4c05c554 100644 --- a/tests/functional/model/run_utility_model_test.py +++ b/tests/functional/model/run_utility_model_test.py @@ -1,6 +1,8 @@ from aixplain.factories import ModelFactory from aixplain.modules.model.utility_model import UtilityModelInput, utility_tool -from aixplain.enums import DataType +from aixplain.enums import DataType, AssetStatus +import pytest + def test_run_utility_model(): utility_model = None @@ -22,7 +24,6 @@ def test_run_utility_model(): assert utility_model.id is not None assert utility_model.inputs == inputs assert utility_model.output_examples == output_description - response = utility_model.run(data={"inputA": "test"}) assert response.status == "SUCCESS" assert response.data == "test" @@ -36,22 +37,24 @@ def test_run_utility_model(): if utility_model: utility_model.delete() + def test_utility_model_with_decorator(): utility_model = None try: + @utility_tool( - name="add_numbers_test name", - description="Adds two numbers together.", - inputs=[ + name="add_numbers_test name", + description="Adds two numbers together.", + inputs=[ UtilityModelInput(name="num1", type=DataType.NUMBER, description="The first number."), - UtilityModelInput(name="num2", type=DataType.NUMBER, description="The second number.") + UtilityModelInput(name="num2", type=DataType.NUMBER, description="The second number."), ], ) def add_numbers(num1: int, num2: int) -> int: return num1 + num2 utility_model = ModelFactory.create_utility_model(code=add_numbers) - + assert utility_model.id is not None assert len(utility_model.inputs) == 2 assert utility_model.inputs[0].name == "num1" @@ -64,16 +67,18 @@ def add_numbers(num1: int, num2: int) -> int: if utility_model: utility_model.delete() + def test_utility_model_string_concatenation(): utility_model = None try: + @utility_tool( name="concatenate_strings", description="Concatenates two strings.", inputs=[ UtilityModelInput(name="str1", type=DataType.TEXT, description="The first string."), UtilityModelInput(name="str2", type=DataType.TEXT, description="The second string."), - ] + ], ) def concatenate_strings(str1: str, str2: str) -> str: """Concatenates two strings and returns the result.""" @@ -96,10 +101,11 @@ def concatenate_strings(str1: str, str2: str) -> str: if utility_model: utility_model.delete() + def test_utility_model_code_as_string(): utility_model = None try: - code = f""" + code = """ @utility_tool( name="multiply_numbers", description="Multiply two numbers.", @@ -108,10 +114,7 @@ def multiply_numbers(int1: int, int2: int) -> int: \"\"\"Multiply two numbers and returns the result.\"\"\" return int1 * int2 """ - utility_model = ModelFactory.create_utility_model( - name="Multiply Numbers Test", - code=code - ) + utility_model = ModelFactory.create_utility_model(name="Multiply Numbers Test", code=code) assert utility_model.id is not None assert len(utility_model.inputs) == 2 @@ -123,13 +126,15 @@ def multiply_numbers(int1: int, int2: int) -> int: if utility_model: utility_model.delete() + def test_utility_model_simple_function(): utility_model = None try: + def test_string(input: str): """test string""" return input - + utility_model = ModelFactory.create_utility_model( name="String Model Test", code=test_string, @@ -145,3 +150,61 @@ def test_string(input: str): finally: if utility_model: utility_model.delete() + + +def test_utility_model_status(): + utility_model = None + try: + + def get_user_location(dummy_input: str, dummy_input2: str) -> str: + """Get user's city using dummy input""" + import requests + import json + + try: + response = requests.get("http://ip-api.com/json/") + response.raise_for_status() + data = response.json() + location = {"city": data["city"], "latitude": data["lat"], "longitude": data["lon"]} + return json.dumps(location) + except Exception as e: + return json.dumps({"error": str(e)}) + + utility_model = ModelFactory.create_utility_model( + name="Location Utility Test", + code=get_user_location, + ) + + # Test model creation + assert utility_model.id is not None + assert len(utility_model.inputs) == 2 + assert utility_model.inputs[0].name == "dummy_input" + assert utility_model.inputs[1].name == "dummy_input2" + assert utility_model.inputs[0].type == DataType.TEXT + assert utility_model.inputs[1].type == DataType.TEXT + + # Check initial status is DRAFT + assert utility_model.status == AssetStatus.DRAFT + + # deploy the model + utility_model.deploy() + + # Check status is now ONBOARDED + assert utility_model.status == AssetStatus.ONBOARDED + + # try reinitialize the model this should fail + # Second deployment attempt - should fail + utility_model_duplicate = ModelFactory.create_utility_model( + name="Location Utility Test", # Same name + code=get_user_location, + ) + + # Be more specific about the exception you're expecting + with pytest.raises(Exception, match=".*Utility name already exists*"): + utility_model_duplicate.deploy() + + finally: + if utility_model: + utility_model.delete() + if utility_model_duplicate: + utility_model_duplicate.delete() diff --git a/tests/unit/utility_test.py b/tests/unit/utility_test.py index 0c1ffde5..e678fa7a 100644 --- a/tests/unit/utility_test.py +++ b/tests/unit/utility_test.py @@ -8,6 +8,7 @@ from aixplain.modules.model.utility_model import UtilityModel, UtilityModelInput from aixplain.modules.model.utils import parse_code, parse_code_decorated from unittest.mock import patch +import warnings def test_utility_model(): @@ -83,7 +84,7 @@ def test_utility_model_to_dict(): "code": "utility_model_test", "function": "utilities", "outputDescription": "output_description", - "status": AssetStatus.ONBOARDED.value, + "status": AssetStatus.DRAFT.value, } @@ -168,8 +169,6 @@ def test_save_utility_model(): api_key=config.TEAM_API_KEY, ) - import warnings - # it should not trigger any warning with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") # Trigger all warnings @@ -441,3 +440,70 @@ def __init__(self): match=r"Code must be either a string or a callable function, not a class or class instance\. You tried to pass a class or class instance: <.*\.DummyModel object at 0x[0-9a-f]+>", ): parse_code_decorated(DummyModel()) + + +def test_utility_model_creation_warning(): + """Test that appropriate warnings are shown during utility model creation and validation""" + with requests_mock.Mocker() as mock: + with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value="s3://bucket/path/to/code"): + with patch("aixplain.factories.file_factory.FileFactory.upload", return_value="s3://bucket/path/to/code"): + # Mock the model creation + model_id = "123" + mock.post(urljoin(config.BACKEND_URL, "sdk/utilities"), json={"id": model_id}) + + # Mock the model existence check + mock.get(urljoin(config.BACKEND_URL, f"sdk/models/{model_id}"), status_code=200) + + # Create the utility model and check for warning during creation + with pytest.warns(UserWarning, match="WARNING: Non-deployed utility models .* will expire after 24 hours.*"): + utility_model = ModelFactory.create_utility_model( + name="utility_model_test", + description="utility_model_test", + code='def main(input_string:str):\n return f"Test output: {input_string}"\n', + output_examples="output_description", + ) + + # Verify initial status is DRAFT + assert utility_model.status == AssetStatus.DRAFT + + +def test_utility_model_status_after_deployment(): + """Test that model status is updated correctly after deployment""" + with requests_mock.Mocker() as mock: + with patch("aixplain.factories.file_factory.FileFactory.to_link", return_value="s3://bucket/path/to/code"): + with patch("aixplain.factories.file_factory.FileFactory.upload", return_value="s3://bucket/path/to/code"): + # Mock the model creation + model_id = "123" + mock.post(urljoin(config.BACKEND_URL, "sdk/utilities"), json={"id": model_id}) + + # Mock the model existence check + mock.get(urljoin(config.BACKEND_URL, f"sdk/models/{model_id}"), status_code=200) + + # Create the utility model + utility_model = ModelFactory.create_utility_model( + name="utility_model_test", + description="utility_model_test", + code='def main(input_string:str):\n return f"Test output: {input_string}"\n', + output_examples="output_description", + ) + + # Verify initial status is DRAFT + assert utility_model.status == AssetStatus.DRAFT + + # Mock the model existence check and update endpoints + mock.put( + urljoin(config.BACKEND_URL, f"sdk/utilities/{model_id}"), + json={"id": model_id, "status": AssetStatus.ONBOARDED.value}, + ) + + # Deploy the model + utility_model.deploy() + + # Verify the status is updated to ONBOARDED + assert utility_model.status == AssetStatus.ONBOARDED + + # Verify no warning is shown after deployment + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + utility_model.validate() + assert len(w) == 0 From b9121578cd66834953e8a4b80fb01db9cb8d7f48 Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Mon, 24 Mar 2025 16:51:17 -0300 Subject: [PATCH 31/36] Adding pipeline ID and poll URL on execution logs (#453) --- aixplain/modules/pipeline/asset.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index cd47da87..f9a43462 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -121,16 +121,20 @@ def __polling( if wait_time < 60: wait_time *= 1.1 except Exception: - logging.error(f"Polling for Pipeline: polling for {name} : Continue") + logging.error(f"Polling for Pipeline '{self.id}': polling for {name} ({poll_url}): Continue") break if response_body["status"] == ResponseStatus.SUCCESS: try: - logging.debug(f"Polling for Pipeline: Final status of polling for {name} : SUCCESS - {response_body}") + logging.debug( + f"Polling for Pipeline '{self.id}' - Final status of polling for {name} ({poll_url}): SUCCESS - {response_body}" + ) except Exception: - logging.error(f"Polling for Pipeline: Final status of polling for {name} : ERROR - {response_body}") + logging.error( + f"Polling for Pipeline '{self.id}' - Final status of polling for {name} ({poll_url}): ERROR - {response_body}" + ) else: logging.error( - f"Polling for Pipeline: Final status of polling for {name} : No response in {timeout} seconds - {response_body}" + f"Polling for Pipeline '{self.id}' - Final status of polling for {name} ({poll_url}): No response in {timeout} seconds - {response_body}" ) return response_body @@ -159,7 +163,7 @@ def poll( resp["data"] = json.loads(resp["data"])["response"] except Exception: resp = r.json() - logging.info(f"Single Poll for Pipeline: Status of polling for {name} : {resp}") + logging.info(f"Single Poll for Pipeline '{self.id}' - Status of polling for {name} ({poll_url}): {resp}") if response_version == "v1": return resp status = ResponseStatus(resp.pop("status", "failed")) @@ -420,7 +424,7 @@ def run_async( f"Status {status_code}: Unspecified error: An unspecified error occurred while processing your request." ) - logging.error(f"Error in request for {name} - {r.status_code}: {error}") + logging.error(f"Error in request for {name} (Pipeline ID '{self.id}') - {r.status_code}: {error}") if response_version == "v1": return { "status": "failed", From 3ee80da4e087bc257376ddca57bec69ca8bae728 Mon Sep 17 00:00:00 2001 From: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Date: Mon, 24 Mar 2025 18:57:29 -0300 Subject: [PATCH 32/36] ENG-1846: HOTFIX - Fix Finetune functional tests and problematic unit tests (#446) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Development 2 Test (#412) * Update return type so it works with python 3.8 (#390) * ENG-1557: model params are now available for designer assets (#387) * ENG-1559: Fixed designer tests (#388) * Use input api key to list models when given (#395) * BUG-375 new functional test regarding ensuring failure (#396) * Role 2 Instructions (#393) * added validate check when s3 link (#399) * MErge to prod (#340) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Update Finetuner functional tests (#112) * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Cas… * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * feat: add functional tests. * Development 2 Test (#426) * Update return type so it works with python 3.8 (#390) * ENG-1557: model params are now available for designer assets (#387) * ENG-1559: Fixed designer tests (#388) * Use input api key to list models when given (#395) * BUG-375 new functional test regarding ensuring failure (#396) * Role 2 Instructions (#393) * added validate check when s3 link (#399) * MErge to prod (#340) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Update Finetuner functional tests (#112) * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Cas… * Improve function tests workflow * Improve function tests workflow * Improve function tests workflow * Merge to test (#435) * Update return type so it works with python 3.8 (#390) * ENG-1557: model params are now available for designer assets (#387) * ENG-1559: Fixed designer tests (#388) * Use input api key to list models when given (#395) * BUG-375 new functional test regarding ensuring failure (#396) * Role 2 Instructions (#393) * added validate check when s3 link (#399) * MErge to prod (#340) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Update Finetuner functional tests (#112) * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Merge to test (#124) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Merge dev to test (#126) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Add new LLMs finetuner models (mistral and solar) (#128) * Merge dev to test (#129) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Merge to test (#135) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) * Merge dev to test (#137) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#117) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Do not download textual URLs (#120) * Do not download textual URLs * Treat as string --------- Co-authored-by: Thiago Castro Ferreira * Enable api key parameter in data asset creation (#122) Co-authored-by: Thiago Castro Ferreira * Update Finetuner hyperparameters (#125) * Update Finetuner hyperparameters * Change hyperparameters error message * Add new LLMs finetuner models (mistral and solar) (#128) * Enabling dataset ID and model ID as parameters for finetuner creation (#131) Co-authored-by: Thiago Castro Ferreira * Fix supplier representation of a model (#132) * Fix supplier representation of a model * Fixing parameter typing --------- Co-authored-by: Thiago Castro Ferreira * Fixing indentation in documentation sample code (#134) Co-authored-by: Thiago Castro Ferreira * Update FineTune unit and functional tests (#136) --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira * Click fix (#140) * Merge to prod (#119) * Merge dev to test (#107) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Development to Test (#109) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> * Merge to test (#111) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) --------- Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Merge dev to test (#113) * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Update Finetuner functional tests (#112) --------- Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> * Hf deployment test (#114) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Hf deployment test (#118) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Create bounds for FineTune hyperparameters (#103) * Test bound to hyperparameters * Update finetune llm hyperparameters * Remove option to use PEFT, always on use now * Fixing pipeline general asset test (#106) * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain * Update Finetuner functional tests (#112) * Hf deployment test (#115) * Started adding Hugging Face deployment to aiXplain SDK Signed-off-by: mikelam-us-aixplain * Added model status function to SDK Signed-off-by: mikelam-us-aixplain * Updating Signed-off-by: mikelam-us-aixplain * Updated CLI Signed-off-by: mikelam-us * Adding CLI Signed-off-by: mikelam-us-aixplain * Corrected request error Signed-off-by: mikelam-us-aixplain * Clearing out unnecessary information in return Signed-off-by: mikelam-us-aixplain * Adding status Signed-off-by: mikelam-us-aixplain * Simplifying status Signed-off-by: mikelam-us-aixplain * Adding tests and correcting tokens Signed-off-by: mikelam-us-aixplain * Added bad repo ID test Signed-off-by: mikelam-us-aixplain * Finished rough draft of tests Signed-off-by: mikelam-us-aixplain * Adding tests Signed-off-by: mikelam-us-aixplain * Fixing hf token Signed-off-by: mikelam-us-aixplain * Adding hf token Signed-off-by: mikelam-us-aixplain * Correcting first test Signed-off-by: mikelam-us-aixplain * Testing Signed-off-by: mikelam-us-aixplain * Adding config Signed-off-by: mikelam-us-aixplain * Added user doc Signed-off-by: mikelam-us-aixplain * Added gated model test Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us * Adding HF token Signed-off-by: mikelam-us-aixplain --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Co-authored-by: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro F… * Improve function tests workflow * fixed completed field (#438) * Fix Finetune functional tests and problematic unit tests --------- Signed-off-by: mikelam-us-aixplain Signed-off-by: mikelam-us Signed-off-by: Michael Lam Signed-off-by: root Co-authored-by: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Co-authored-by: kadirpekel Co-authored-by: Ahmet Gündüz Co-authored-by: ikxplain <88332269+ikxplain@users.noreply.github.com> Co-authored-by: mikelam-us-aixplain <131073216+mikelam-us-aixplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira Co-authored-by: Shreyas Sharma <85180538+shreyasXplain@users.noreply.github.com> Co-authored-by: Thiago Castro Ferreira Co-authored-by: Thiago Castro Ferreira Co-authored-by: Hadi Nasrallah <87204330+hadi-aix@users.noreply.github.com> Co-authored-by: kadir pekel Co-authored-by: root Co-authored-by: Zaina Abu Shaban Co-authored-by: xainaz Co-authored-by: xainaz Co-authored-by: Lucas Pavanelli Co-authored-by: ikxplain Co-authored-by: OsujiCC Co-authored-by: Yunsu Kim Co-authored-by: Thiago Castro Ferreira --- .github/workflows/test.yaml | 262 +++++++++++++++ aixplain/modules/pipeline/asset.py | 2 + aixplain/modules/team_agent/__init__.py | 45 ++- pipeline_test2.ipynb | 304 ++++++++++++++++++ .../finetune/finetune_functional_test.py | 41 +-- tests/unit/agent/sql_tool_test.py | 2 +- tests/unit/model_test.py | 4 +- tests/unit/pipeline_test.py | 44 +++ 8 files changed, 655 insertions(+), 49 deletions(-) create mode 100644 .github/workflows/test.yaml create mode 100644 pipeline_test2.ipynb diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 00000000..62103a6e --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,262 @@ +name: Run Tests + +on: + push: + branches: + - test + pull_request: + branches: + - test + workflow_dispatch: + +jobs: + test-general-assets: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run general_assets + run: python -m pytest tests/functional/general_assets + + test-file-asset: + runs-on: ubuntu-latest + needs: test-general-assets + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run File Asset + run: python -m pytest tests/functional/file_asset + + test-agent: + runs-on: ubuntu-latest + needs: test-file-asset + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Agent + run: python -m pytest tests/functional/agent + + test-team-agent: + runs-on: ubuntu-latest + needs: test-agent + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Team Agent + run: python -m pytest tests/functional/team_agent + + test-data-asset: + runs-on: ubuntu-latest + needs: test-team-agent + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Data + run: python -m pytest tests/functional/data_asset + + test-benchmark: + runs-on: ubuntu-latest + needs: test-data-asset + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Benchmark + run: python -m pytest tests/functional/benchmark + + test-pipelines: + runs-on: ubuntu-latest + needs: test-benchmark + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Pipelines + run: python -m pytest tests/functional/pipelines + + test-api-key: + runs-on: ubuntu-latest + needs: test-pipelines + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Api Key + run: python -m pytest tests/functional/apikey + + test-finetuner: + runs-on: ubuntu-latest + needs: test-api-key + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest + + - name: Set environment variables + run: | + echo "TEAM_API_KEY=${{ secrets.TEAM_API_KEY }}" >> $GITHUB_ENV + echo "BACKEND_URL=https://test-platform-api.aixplain.com/" >> $GITHUB_ENV + echo "MODELS_RUN_URL=https://test-models.aixplain.com/api/v1/execute" >> $GITHUB_ENV + echo "PIPELINES_RUN_URL=https://test-platform-api.aixplain.com/assets/pipeline/execution/run" >> $GITHUB_ENV + + - name: Run Finetuner + run: python -m pytest tests/functional/finetune diff --git a/aixplain/modules/pipeline/asset.py b/aixplain/modules/pipeline/asset.py index f9a43462..0642e6ee 100644 --- a/aixplain/modules/pipeline/asset.py +++ b/aixplain/modules/pipeline/asset.py @@ -216,12 +216,14 @@ def run( polling_response = self.__polling(poll_url, name=name, timeout=timeout, wait_time=wait_time) end = time.time() status = ResponseStatus(polling_response["status"]) + completed = polling_response["completed"] if response_version == "v1": polling_response["elapsed_time"] = end - start return polling_response status = ResponseStatus(polling_response.status) return PipelineResponse( status=status, + completed=completed, error=polling_response.error, elapsed_time=end - start, data=getattr(polling_response, "data", {}), diff --git a/aixplain/modules/team_agent/__init__.py b/aixplain/modules/team_agent/__init__.py index 29b1348b..87c78159 100644 --- a/aixplain/modules/team_agent/__init__.py +++ b/aixplain/modules/team_agent/__init__.py @@ -174,7 +174,9 @@ def run( return response poll_url = response["url"] end = time.time() - response = self.sync_poll(poll_url, name=name, timeout=timeout, wait_time=wait_time) + response = self.sync_poll( + poll_url, name=name, timeout=timeout, wait_time=wait_time + ) return response except Exception as e: logging.error(f"Team Agent Run: Error in running for {name}: {e}") @@ -222,7 +224,9 @@ def run_async( assert data is not None or query is not None, "Either 'data' or 'query' must be provided." if data is not None: if isinstance(data, dict): - assert "query" in data and data["query"] is not None, "When providing a dictionary, 'query' must be provided." + assert ( + "query" in data and data["query"] is not None + ), "When providing a dictionary, 'query' must be provided." if session_id is None: session_id = data.pop("session_id", None) if history is None: @@ -236,7 +240,8 @@ def run_async( # process content inputs if content is not None: assert ( - isinstance(query, str) and FileFactory.check_storage_type(query) == StorageType.TEXT + isinstance(query, str) + and FileFactory.check_storage_type(query) == StorageType.TEXT ), "When providing 'content', query must be text." if isinstance(content, list): @@ -246,7 +251,9 @@ def run_async( query += f"\n{input_link}" elif isinstance(content, dict): for key, value in content.items(): - assert "{{" + key + "}}" in query, f"Key '{key}' not found in query." + assert ( + "{{" + key + "}}" in query + ), f"Key '{key}' not found in query." value = FileFactory.to_link(value) query = query.replace("{{" + key + "}}", f"'{value}'") @@ -270,7 +277,9 @@ def run_async( payload = json.dumps(payload) r = _request_with_retry("post", self.url, headers=headers, data=payload) - logging.info(f"Team Agent Run Async: Start service for {name} - {self.url} - {payload} - {headers}") + logging.info( + f"Team Agent Run Async: Start service for {name} - {self.url} - {payload} - {headers}" + ) resp = None try: @@ -300,9 +309,7 @@ def delete(self) -> None: if r.status_code != 200: raise Exception() except Exception: - message = ( - f"Team Agent Deletion Error (HTTP {r.status_code}): Make sure the Team Agent exists and you are the owner." - ) + message = f"Team Agent Deletion Error (HTTP {r.status_code}): Make sure the Team Agent exists and you are the owner." logging.error(message) raise Exception(f"{message}") @@ -311,7 +318,8 @@ def to_dict(self) -> Dict: "id": self.id, "name": self.name, "agents": [ - {"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"} for idx, agent in enumerate(self.agents) + {"assetId": agent.id, "number": idx, "type": "AGENT", "label": "AGENT"} + for idx, agent in enumerate(self.agents) ], "links": [], "description": self.description, @@ -337,7 +345,9 @@ def _validate(self) -> None: try: llm = ModelFactory.get(self.llm_id) - assert llm.function == Function.TEXT_GENERATION, "Large Language Model must be a text generation model." + assert ( + llm.function == Function.TEXT_GENERATION + ), "Large Language Model must be a text generation model." except Exception: raise Exception(f"Large Language Model with ID '{self.llm_id}' not found.") @@ -367,7 +377,8 @@ def update(self) -> None: stack = inspect.stack() if len(stack) > 2 and stack[1].function != "save": warnings.warn( - "update() is deprecated and will be removed in a future version. " "Please use save() instead.", + "update() is deprecated and will be removed in a future version. " + "Please use save() instead.", DeprecationWarning, stacklevel=2, ) @@ -385,7 +396,9 @@ def update(self) -> None: r = _request_with_retry("put", url, headers=headers, json=payload) resp = r.json() except Exception: - raise Exception("Team Agent Update Error: Please contact the administrators.") + raise Exception( + "Team Agent Update Error: Please contact the administrators." + ) if 200 <= r.status_code < 300: return build_team_agent(resp) @@ -399,7 +412,11 @@ def save(self) -> None: def deploy(self) -> None: """Deploy the Team Agent.""" - assert self.status == AssetStatus.DRAFT, "Team Agent Deployment Error: Team Agent must be in draft status." - assert self.status != AssetStatus.ONBOARDED, "Team Agent Deployment Error: Team Agent must be onboarded." + assert ( + self.status == AssetStatus.DRAFT + ), "Team Agent Deployment Error: Team Agent must be in draft status." + assert ( + self.status != AssetStatus.ONBOARDED + ), "Team Agent Deployment Error: Team Agent must be onboarded." self.status = AssetStatus.ONBOARDED self.update() diff --git a/pipeline_test2.ipynb b/pipeline_test2.ipynb new file mode 100644 index 00000000..5f30a4ff --- /dev/null +++ b/pipeline_test2.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"BENCHMARKS_BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"MODELS_RUN_URL\"] = \"https://test-models.aixplain.com/api/v1/execute\"\n", + "os.environ[\"TEAM_API_KEY\"] = \"500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting filetype\n", + " Using cached filetype-1.2.0-py2.py3-none-any.whl.metadata (6.5 kB)\n", + "Using cached filetype-1.2.0-py2.py3-none-any.whl (19 kB)\n", + "Installing collected packages: filetype\n", + "Successfully installed filetype-1.2.0\n" + ] + } + ], + "source": [ + "!pip install filetype\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", \"version\": \"2.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzA5OTg5MDh9.GTfkF9vgkJ8bcsxly21LBNALnoE276EocQsa2A_7xbA', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cf9728ff-9a38-4cf8-87c8-41edf2ad46eb'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cf9728ff-9a38-4cf8-87c8-41edf2ad46eb', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cf9728ff-9a38-4cf8-87c8-41edf2ad46eb.txt'}}\n", + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll\n", + "{'message': 'Not Found', 'statusCode': 404}\n", + "poll response\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "RESPONSE DICT\n", + "{'status': , 'error': '', 'elapsed_time': 2.3139090538024902, 'data': {}, 'version': '2.0'}\n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=2.3139090538024902, version='2.0')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# FAIL - v2.0\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", **{ \"version\": \"2.0\" })\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", \"version\": \"3.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/a243c99a-e1a7-4906-8122-6cd364c049da', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzA5OTg5Mjh9.4cjE6RYjeZ80fXwDRm_iNyK1CgoKg-f_hzHJ6AaMoFw', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'a243c99a-e1a7-4906-8122-6cd364c049da'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'a243c99a-e1a7-4906-8122-6cd364c049da', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/a243c99a-e1a7-4906-8122-6cd364c049da.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/a243c99a-e1a7-4906-8122-6cd364c049da.txt'}}\n", + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll\n", + "{'message': 'Not Found', 'statusCode': 404}\n", + "poll response\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "RESPONSE DICT\n", + "{'status': , 'error': '', 'elapsed_time': 2.074692964553833, 'data': {}, 'version': '3.0'}\n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=2.074692964553833, version='3.0')" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# FAIL - v3.0\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"https://aixplain-platform-assets.s3.amazonaws.com/samples/en/CPAC1x2.wav\", **{ \"version\": \"3.0\" })\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"Hello\", \"version\": \"2.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "r in run_async\n", + "{'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n", + "res in run_async\n", + "{'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwMjAxMjF9.ukWY_6_02xICxSwPVeyl6dDeQ9nncKPwAfRLiK1Z2go', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '2.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': 'cfb0c051-2d41-4252-b3f8-5c1410f2157c', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/cfb0c051-2d41-4252-b3f8-5c1410f2157c.txt'}}\n", + "response in run\n", + "PipelineResponse(status=in_progress, version='2.0')\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll\n", + "{'message': 'Not Found', 'statusCode': 404}\n", + "pipeline response in poll\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "poll response\n", + "PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n", + "Response Attributes:\n", + "status: failed\n", + "error: \n", + "elapsed_time: 1.6289851665496826\n", + "data: None\n", + "additional_fields: {'version': '2.0'}\n", + "url: \n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=1.6289851665496826, version='2.0')" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SUCCESS - v2.0\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"Hello\", **{ \"version\": \"2.0\" })" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Start service for GET Pipeline - https://test-platform-api.aixplain.com/sdk/pipelines/6544ffbdf4644a9f6c2363a6 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Start service for GET Model - https://test-platform-api.aixplain.com/sdk/models/60ddef828d38c51c5885d491 - {'Authorization': 'Token 500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'Content-Type': 'application/json'}\n", + "INFO:root:Model Creation: Model 60ddef828d38c51c5885d491 instantiated.\n", + "INFO:root:Pipeline 6544ffbdf4644a9f6c2363a6 retrieved successfully.\n", + "INFO:root:Start service for pipeline_process - https://test-platform-api.aixplain.com/assets/pipeline/execution/run/6544ffbdf4644a9f6c2363a6 - {\"data\": \"Hello\", \"version\": \"3.0\"}\n", + "INFO:root:Result of request for pipeline_process - 201 - {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/1900e25d-f596-4bcd-81aa-b49468b1fd83', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwNzA2NTB9.jbY0kUN_mN4CpB5VNqabCtVh_mV0TPCgkuXd9V60iLQ', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt'}}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in run_async {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/check/1900e25d-f596-4bcd-81aa-b49468b1fd83', 'status': 'IN_PROGRESS', 'batchMode': True, 'json': {'pipeline_api_key': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'pipeline_method': 'post', 'num_tries': 1, 'pipeline': {'links': [{'param_mapping': [{'from': 'input', 'to': 'text'}], 'from': 0, 'to': 1}, {'param_mapping': [{'from': 'data', 'to': 'output'}], 'from': 1, 'to': 2}], 'nodes': [{'id': 0, 'label': 'Input 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'INPUT', 'data': 'Hello'}, {'id': 2, 'label': 'Output 1', 'input_type': ['text'], 'output_type': ['text'], 'type': 'OUTPUT'}, {'id': 1, 'label': 'Model 1', 'payload': {'assetId': '60ddef828d38c51c5885d491', 'function': 'translation', 'options': {'savetos3': True, 'nodeId': 1, 'cachable': False}, 'supplier': 'Azure', 'versionName': '', 'version': '', 'sourcelanguage': 'en', 'targetlanguage': 'pt', 'dialect_out': 'Brazil'}, 'url': 'https://test-models.aixplain.com/api/v2/execute', 'input_type': ['text'], 'output_type': ['text'], 'type': 'ASSET', 'automode': False}]}, 'webhook': {'url': 'https://test-platform-api.aixplain.com/assets/pipeline/execution/callback', 'headers': {'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjUwMDg0MmRhYzcyZDFmNTFjNmNhZDVhODY0ZjI5YWJkMGRhMTY0ZmNkMzhjNzEyZDQyNjE1MTVlMjUwNGYzNTYiLCJpYXQiOjE3MzEwNzA2NTB9.jbY0kUN_mN4CpB5VNqabCtVh_mV0TPCgkuXd9V60iLQ', 'x-aixplain-key': '7e29YC2LdD'}, 'params': {'assetId': '6544ffbdf4644a9f6c2363a6', 'assetType': 'PIPELINE', 'apiKey': '500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356', 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83'}}, 'requestedCPUs': 1, 'multithreading': True, 'pipelinejob': {'id': '6544ffbdf4644a9f6c2363a6', 'name': 'SingleNodePipeline'}, 'version': '3.0', 'teamName': 'aiXplain-testing', 'teamid': 246, 'jobId': '1900e25d-f596-4bcd-81aa-b49468b1fd83', 'logs': 's3://aixplain-platform-assets-test/logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt', 'systemLogs': 's3://aixplain-platform-assets-test/system-logs/pipelines/test/6544ffbdf4644a9f6c2363a6/1900e25d-f596-4bcd-81aa-b49468b1fd83.txt'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Single Poll for Pipeline: Status of polling for pipeline_process : {'message': 'Not Found', 'statusCode': 404}\n", + "ERROR:root:Polling for Pipeline: polling for pipeline_process : Continue\n", + "ERROR:root:Polling for Pipeline: Final status of polling for pipeline_process : No response in 20000.0 seconds - PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "resp in poll {'message': 'Not Found', 'statusCode': 404}\n", + "polling_response in run PipelineResponse(status=failed, elapsed_time=0, message='Not Found', statusCode=404)\n" + ] + }, + { + "data": { + "text/plain": [ + "PipelineResponse(status=failed, elapsed_time=1.6351401805877686, version='3.0')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SUCCESS - v3.0\n", + "import os\n", + "os.environ[\"BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"BENCHMARKS_BACKEND_URL\"] = \"https://test-platform-api.aixplain.com\"\n", + "os.environ[\"MODELS_RUN_URL\"] = \"https://test-models.aixplain.com/api/v1/execute\"\n", + "os.environ[\"TEAM_API_KEY\"] = \"500842dac72d1f51c6cad5a864f29abd0da164fcd38c712d4261515e2504f356\"\n", + "\n", + "\n", + "from aixplain.factories import PipelineFactory\n", + "\n", + "pipeline = PipelineFactory.get(\"6544ffbdf4644a9f6c2363a6\")\n", + "pipeline.run(\"Hello\", **{ \"version\": \"3.0\" })" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (pytorch)", + "language": "python", + "name": "pytorch" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/functional/finetune/finetune_functional_test.py b/tests/functional/finetune/finetune_functional_test.py index 9a7f3f54..55f9b544 100644 --- a/tests/functional/finetune/finetune_functional_test.py +++ b/tests/functional/finetune/finetune_functional_test.py @@ -25,7 +25,6 @@ from aixplain.factories import FinetuneFactory from aixplain.modules.finetune.cost import FinetuneCost from aixplain.enums import Function, Language -from datetime import datetime, timedelta, timezone import pytest from aixplain import aixplain_v2 as v2 @@ -56,39 +55,17 @@ def validate_prompt_input_map(request): return request.param -def pytest_generate_tests(metafunc): - if "input_map" in metafunc.fixturenames: - four_weeks_ago = datetime.now(timezone.utc) - timedelta(weeks=4) - models = ModelFactory.list(function=Function.TEXT_GENERATION, is_finetunable=True)["results"] - recent_models = [ - { - "model_name": model.name, - "model_id": model.id, - "dataset_name": "Test text generation dataset", - "inference_data": "Hello!", - "required_dev": True, - "search_metadata": False, - } - for model in models - if model.created_at is not None - and model.created_at >= four_weeks_ago - and "aiXplain-testing" not in str(model.supplier) - ] - - run_file_models = read_data(RUN_FILE) - for model_data in run_file_models: - if not any(rm["model_id"] == model_data["model_id"] for rm in recent_models): - recent_models.append(model_data) - model_ids = [model["model_id"] for model in recent_models] - metafunc.parametrize("input_map", recent_models, ids=model_ids) +@pytest.fixture(scope="module", params=read_data(RUN_FILE)) +def run_input_map(request): + return request.param @pytest.mark.parametrize("FinetuneFactory", [FinetuneFactory, v2.Finetune]) -def test_end2end(input_map, FinetuneFactory): - model = input_map["model_id"] - dataset_list = [DatasetFactory.list(query=input_map["dataset_name"])["results"][0]] +def test_end2end(run_input_map, FinetuneFactory): + model = run_input_map["model_id"] + dataset_list = [DatasetFactory.list(query=run_input_map["dataset_name"])["results"][0]] train_percentage, dev_percentage = 100, 0 - if input_map["required_dev"]: + if run_input_map["required_dev"]: train_percentage, dev_percentage = 80, 20 finetune = FinetuneFactory.create( str(uuid.uuid4()), dataset_list, model, train_percentage=train_percentage, dev_percentage=dev_percentage @@ -109,10 +86,10 @@ def test_end2end(input_map, FinetuneFactory): assert finetune_model.check_finetune_status().model_status.value == "onboarded" time.sleep(30) print(f"Model dict: {finetune_model.__dict__}") - result = finetune_model.run(input_map["inference_data"]) + result = finetune_model.run(run_input_map["inference_data"]) print(f"Result: {result}") assert result is not None - if input_map["search_metadata"]: + if run_input_map["search_metadata"]: assert "details" in result assert len(result["details"]) > 0 assert "metadata" in result["details"][0] diff --git a/tests/unit/agent/sql_tool_test.py b/tests/unit/agent/sql_tool_test.py index d778b35e..12170a23 100644 --- a/tests/unit/agent/sql_tool_test.py +++ b/tests/unit/agent/sql_tool_test.py @@ -335,4 +335,4 @@ def test_create_sql_tool_source_type_handling(tmp_path): # Test invalid type with pytest.raises(SQLToolError, match="Source type must be either a string or DatabaseSourceType enum, got "): - AgentFactory.create_sql_tool(description="Test", source=db_path, source_type=123, schema="test") # Invalid type + AgentFactory.create_sql_tool(description="Test", source=db_path, source_type=123, schema="test") # Invalid type \ No newline at end of file diff --git a/tests/unit/model_test.py b/tests/unit/model_test.py index c0761b6d..65708d0c 100644 --- a/tests/unit/model_test.py +++ b/tests/unit/model_test.py @@ -433,11 +433,11 @@ def test_model_to_dict(): def test_model_repr(): # Test with supplier as dict model1 = Model(id="test-id", name="Test Model", supplier={"name": "aiXplain"}) - assert repr(model1) == "" + assert repr(model1).lower() == "".lower() # Test with supplier as string model2 = Model(id="test-id", name="Test Model", supplier="aiXplain") - assert str(model2) == "" + assert str(model2).lower() == "".lower() def test_poll_with_error(): diff --git a/tests/unit/pipeline_test.py b/tests/unit/pipeline_test.py index b49e9da2..a4d1f51d 100644 --- a/tests/unit/pipeline_test.py +++ b/tests/unit/pipeline_test.py @@ -196,6 +196,50 @@ def test_poll_success(mock_pipeline): assert response.data["output"] == "poll_result" +@pytest.fixture +def mock_pipeline(): + return Pipeline(id="12345", name="Pipeline Test", api_key=config.TEAM_API_KEY) + + +def test_run_async_success(mock_pipeline): + with requests_mock.Mocker() as mock: + execute_url = urljoin(config.BACKEND_URL, f"assets/pipeline/execution/run/{mock_pipeline.id}") + success_response = PipelineResponse(status=ResponseStatus.SUCCESS, url=execute_url) + mock.post(execute_url, json=success_response.__dict__, status_code=200) + + response = mock_pipeline.run_async(data="input_data") + + assert isinstance(response, PipelineResponse) + assert response.status == ResponseStatus.SUCCESS + + +def test_run_sync_success(mock_pipeline): + with requests_mock.Mocker() as mock: + poll_url = urljoin(config.BACKEND_URL, f"assets/pipeline/execution/poll/{mock_pipeline.id}") + execute_url = urljoin(config.BACKEND_URL, f"assets/pipeline/execution/run/{mock_pipeline.id}") + success_response = {"status": "SUCCESS", "url": poll_url, "completed": True} + poll_response = {"status": "SUCCESS", "data": {"output": "poll_result"}, "completed": True} + mock.post(execute_url, json=success_response, status_code=200) + mock.get(poll_url, json=poll_response, status_code=200) + response = mock_pipeline.run(data="input_data") + + assert isinstance(response, PipelineResponse) + assert response.status == ResponseStatus.SUCCESS + + +def test_poll_success(mock_pipeline): + with requests_mock.Mocker() as mock: + poll_url = urljoin(config.BACKEND_URL, f"assets/pipeline/execution/poll/{mock_pipeline.id}") + poll_response = PipelineResponse(status=ResponseStatus.SUCCESS, data={"output": "poll_result"}) + mock.get(poll_url, json=poll_response.__dict__, status_code=200) + + response = mock_pipeline.poll(poll_url=poll_url) + + assert isinstance(response, PipelineResponse) + assert response.status == ResponseStatus.SUCCESS + assert response.data["output"] == "poll_result" + + def test_deploy_pipeline(): with requests_mock.Mocker() as mock: pipeline_id = "test-pipeline-id" From 67c15ac576fc35414803e95b97dfb706ef77c6c0 Mon Sep 17 00:00:00 2001 From: Yunsu Kim Date: Tue, 25 Mar 2025 15:06:21 +0100 Subject: [PATCH 33/36] Team agent functional tests fix (#450) * Update assert warnings on inspector counts * Add description to assets --- .../functional/team_agent/data/team_agent_test_end2end.json | 6 ++++-- tests/functional/team_agent/team_agent_functional_test.py | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/functional/team_agent/data/team_agent_test_end2end.json b/tests/functional/team_agent/data/team_agent_test_end2end.json index ed6437d2..656b521d 100644 --- a/tests/functional/team_agent/data/team_agent_test_end2end.json +++ b/tests/functional/team_agent/data/team_agent_test_end2end.json @@ -12,7 +12,8 @@ "model_tools": [ { "function": "translation", - "supplier": "AWS" + "supplier": "AWS", + "description": "Translate text to Portuguese" } ] }, @@ -23,7 +24,8 @@ "model_tools": [ { "function": "speech-synthesis", - "supplier": "Google" + "supplier": "Google", + "description": "Synthesize text to audio" } ] } diff --git a/tests/functional/team_agent/team_agent_functional_test.py b/tests/functional/team_agent/team_agent_functional_test.py index 1946d8d8..c3404431 100644 --- a/tests/functional/team_agent/team_agent_functional_test.py +++ b/tests/functional/team_agent/team_agent_functional_test.py @@ -125,10 +125,13 @@ def verify_inspector_steps(steps, num_inspectors): assert len(inspector_counts) == num_inspectors, f"Expected {num_inspectors} inspectors, found {len(inspector_counts)}" if len(inspector_counts) > 0: + first_inspector = next(iter(inspector_counts)) first_count = next(iter(inspector_counts.values())) for inspector, count in inspector_counts.items(): assert count > 0, f"Inspector {inspector} has no steps" - assert count == first_count, f"Inspector {inspector} has {count} steps, expected {first_count}" + assert ( + count == first_count + ), f"Inspector {inspector} has {count} steps, different from {first_inspector} with {first_count} steps" print(f"Inspector {inspector} has {count} steps") return inspector_counts From b8a1f70c8e566bd1231b7f327767d4dca47b2902 Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Tue, 25 Mar 2025 11:42:43 -0300 Subject: [PATCH 34/36] Fix metadata naming syntax (#452) --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 5792718a..337e05e4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,3 @@ [metadata] -description-file=README.md +description_file=README.md license_files=LICENSE.rst From e0a85a0d83d98aaf29a04456993cefe8c1b55e4d Mon Sep 17 00:00:00 2001 From: Lucas Pavanelli <86805709+lucas-aixplain@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:31:49 -0300 Subject: [PATCH 35/36] Revert "Team agent functional tests fix (#450)" (#457) This reverts commit 67c15ac576fc35414803e95b97dfb706ef77c6c0. --- .../functional/team_agent/data/team_agent_test_end2end.json | 6 ++---- tests/functional/team_agent/team_agent_functional_test.py | 5 +---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/functional/team_agent/data/team_agent_test_end2end.json b/tests/functional/team_agent/data/team_agent_test_end2end.json index 656b521d..ed6437d2 100644 --- a/tests/functional/team_agent/data/team_agent_test_end2end.json +++ b/tests/functional/team_agent/data/team_agent_test_end2end.json @@ -12,8 +12,7 @@ "model_tools": [ { "function": "translation", - "supplier": "AWS", - "description": "Translate text to Portuguese" + "supplier": "AWS" } ] }, @@ -24,8 +23,7 @@ "model_tools": [ { "function": "speech-synthesis", - "supplier": "Google", - "description": "Synthesize text to audio" + "supplier": "Google" } ] } diff --git a/tests/functional/team_agent/team_agent_functional_test.py b/tests/functional/team_agent/team_agent_functional_test.py index c3404431..1946d8d8 100644 --- a/tests/functional/team_agent/team_agent_functional_test.py +++ b/tests/functional/team_agent/team_agent_functional_test.py @@ -125,13 +125,10 @@ def verify_inspector_steps(steps, num_inspectors): assert len(inspector_counts) == num_inspectors, f"Expected {num_inspectors} inspectors, found {len(inspector_counts)}" if len(inspector_counts) > 0: - first_inspector = next(iter(inspector_counts)) first_count = next(iter(inspector_counts.values())) for inspector, count in inspector_counts.items(): assert count > 0, f"Inspector {inspector} has no steps" - assert ( - count == first_count - ), f"Inspector {inspector} has {count} steps, different from {first_inspector} with {first_count} steps" + assert count == first_count, f"Inspector {inspector} has {count} steps, expected {first_count}" print(f"Inspector {inspector} has {count} steps") return inspector_counts From 695f044e5e5cb6d308329e27b34147da42e514d8 Mon Sep 17 00:00:00 2001 From: Thiago Castro Ferreira <85182544+thiago-aixplain@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:26:08 -0300 Subject: [PATCH 36/36] ENG-1616: Enable embedding models for air v2 (#403) * ENG-1616: Enable embedding models for air v2 * Enable image in search and index * Returning public link URLs * Return s3 link by default * Setting embedding model by aixplain models * Image IR functional test * Last changes on functional tests * Using enumberators to set embedding models * Adding embedding model * Fix tests and convey IR to new payload format * Fix metadata * Remove unused file and set index id as a constant * Adding index filter objects * Unit test for index filter --- aixplain/enums/__init__.py | 1 + aixplain/enums/embedding_model.py | 30 +++ aixplain/factories/index_factory.py | 14 +- aixplain/modules/model/__init__.py | 4 +- aixplain/modules/model/index_model.py | 87 +++++++- aixplain/modules/model/record.py | 37 +++- aixplain/modules/model/utils.py | 4 + .../data_onboarding/process_interval_files.py | 190 ------------------ .../data_onboarding/process_media_files.py | 17 +- .../data_onboarding/process_text_files.py | 10 +- aixplain/utils/file_utils.py | 10 +- tests/functional/model/run_model_test.py | 107 +++++++++- tests/unit/index_model_test.py | 117 ++++++++++- 13 files changed, 398 insertions(+), 230 deletions(-) create mode 100644 aixplain/enums/embedding_model.py delete mode 100644 aixplain/processes/data_onboarding/process_interval_files.py diff --git a/aixplain/enums/__init__.py b/aixplain/enums/__init__.py index 56066564..4f0364e1 100644 --- a/aixplain/enums/__init__.py +++ b/aixplain/enums/__init__.py @@ -16,4 +16,5 @@ from .sort_order import SortOrder from .response_status import ResponseStatus from .database_source import DatabaseSourceType +from .embedding_model import EmbeddingModel from .asset_status import AssetStatus diff --git a/aixplain/enums/embedding_model.py b/aixplain/enums/embedding_model.py new file mode 100644 index 00000000..8769e3dd --- /dev/null +++ b/aixplain/enums/embedding_model.py @@ -0,0 +1,30 @@ +__author__ = "aiXplain" + +""" +Copyright 2023 The aiXplain SDK authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +Author: aiXplain team +Date: February 17th 2025 +Description: + Embedding Model Enum +""" + +from enum import Enum + + +class EmbeddingModel(Enum): + SNOWFLAKE_ARCTIC_EMBED_M_LONG = "6658d40729985c2cf72f42ec" + OPENAI_ADA002 = "6734c55df127847059324d9e" + SNOWFLAKE_ARCTIC_EMBED_L_V2_0 = "678a4f8547f687504744960a" + JINA_CLIP_V2_MULTIMODAL = "67c5f705d8f6a65d6f74d732" + + def __str__(self): + return self._value_ diff --git a/aixplain/factories/index_factory.py b/aixplain/factories/index_factory.py index 85be5cc6..7588e583 100644 --- a/aixplain/factories/index_factory.py +++ b/aixplain/factories/index_factory.py @@ -1,16 +1,20 @@ from aixplain.modules.model.index_model import IndexModel from aixplain.factories import ModelFactory -from aixplain.enums import Function, ResponseStatus, SortBy, SortOrder, OwnershipType, Supplier +from aixplain.enums import EmbeddingModel, Function, ResponseStatus, SortBy, SortOrder, OwnershipType, Supplier from typing import Optional, Text, Union, List, Tuple +AIR_MODEL_ID = "66eae6656eb56311f2595011" + class IndexFactory(ModelFactory): @classmethod - def create(cls, name: Text, description: Text) -> IndexModel: + def create( + cls, name: Text, description: Text, embedding_model: EmbeddingModel = EmbeddingModel.OPENAI_ADA002 + ) -> IndexModel: """Create a new index collection""" - model = cls.get("66eae6656eb56311f2595011") + model = cls.get(AIR_MODEL_ID) - data = {"data": name, "description": description} + data = {"data": name, "description": description, "model": embedding_model.value} response = model.run(data=data) if response.status == ResponseStatus.SUCCESS: model_id = response.data @@ -19,7 +23,7 @@ def create(cls, name: Text, description: Text) -> IndexModel: error_message = f"Index Factory Exception: {response.error_message}" if error_message == "": - error_message = "Index Factory Exception:An error occurred while creating the index collection." + error_message = "Index Factory Exception: An error occurred while creating the index collection." raise Exception(error_message) @classmethod diff --git a/aixplain/modules/model/__init__.py b/aixplain/modules/model/__init__.py index 5788daab..adedfcfb 100644 --- a/aixplain/modules/model/__init__.py +++ b/aixplain/modules/model/__init__.py @@ -243,7 +243,7 @@ def run( start = time.time() payload = build_payload(data=data, parameters=parameters) url = f"{self.url}/{self.id}".replace("api/v1/execute", "api/v2/execute") - logging.debug(f"Model Run Sync: Start service for {name} - {url}") + logging.debug(f"Model Run Sync: Start service for {name} - {url} - {payload}") response = call_run_endpoint(payload=payload, url=url, api_key=self.api_key) if response["status"] == "IN_PROGRESS": try: @@ -281,8 +281,8 @@ def run_async( dict: polling URL in response """ url = f"{self.url}/{self.id}" - logging.debug(f"Model Run Async: Start service for {name} - {url}") payload = build_payload(data=data, parameters=parameters) + logging.debug(f"Model Run Async: Start service for {name} - {url} - {payload}") response = call_run_endpoint(payload=payload, url=url, api_key=self.api_key) return ModelResponse( status=response.pop("status", ResponseStatus.FAILED), diff --git a/aixplain/modules/model/index_model.py b/aixplain/modules/model/index_model.py index fae597b8..b86b1ee5 100644 --- a/aixplain/modules/model/index_model.py +++ b/aixplain/modules/model/index_model.py @@ -1,12 +1,42 @@ -from aixplain.enums import Function, Supplier, ResponseStatus +from aixplain.enums import EmbeddingModel, Function, Supplier, ResponseStatus, StorageType from aixplain.modules.model import Model from aixplain.utils import config from aixplain.modules.model.response import ModelResponse from typing import Text, Optional, Union, Dict from aixplain.modules.model.record import Record +from enum import Enum from typing import List +class IndexFilterOperator(Enum): + EQUALS = "==" + NOT_EQUALS = "!=" + CONTAINS = "in" + NOT_CONTAINS = "not in" + GREATER_THAN = ">" + LESS_THAN = "<" + GREATER_THAN_OR_EQUALS = ">=" + LESS_THAN_OR_EQUALS = "<=" + + +class IndexFilter: + field: str + value: str + operator: Union[IndexFilterOperator, str] + + def __init__(self, field: str, value: str, operator: Union[IndexFilterOperator, str]): + self.field = field + self.value = value + self.operator = operator + + def to_dict(self): + return { + "field": self.field, + "value": self.value, + "operator": self.operator.value if isinstance(self.operator, IndexFilterOperator) else self.operator, + } + + class IndexModel(Model): def __init__( self, @@ -19,6 +49,7 @@ def __init__( function: Optional[Function] = None, is_subscribed: bool = False, cost: Optional[Dict] = None, + embedding_model: Optional[EmbeddingModel] = None, **additional_info, ) -> None: """Index Init @@ -33,6 +64,7 @@ def __init__( function (Function, optional): model AI function. Defaults to None. is_subscribed (bool, optional): Is the user subscribed. Defaults to False. cost (Dict, optional): model price. Defaults to None. + embedding_model (EmbeddingModel, optional): embedding model. Defaults to None. **additional_info: Any additional Model info to be saved """ assert function == Function.SEARCH, "Index only supports search function" @@ -50,14 +82,61 @@ def __init__( ) self.url = config.MODELS_RUN_URL self.backend_url = config.BACKEND_URL + self.embedding_model = embedding_model + + def search(self, query: str, top_k: int = 10, filters: List[IndexFilter] = []) -> ModelResponse: + """Search for documents in the index + + Args: + query (str): Query to be searched + top_k (int, optional): Number of results to be returned. Defaults to 10. + filters (List[IndexFilter], optional): Filters to be applied. Defaults to []. - def search(self, query: str, top_k: int = 10, filters: Dict = {}) -> ModelResponse: - data = {"action": "search", "data": query, "payload": {"filters": filters, "top_k": top_k}} + Returns: + ModelResponse: Response from the indexing service + + Example: + - index_model.search("Hello") + - index_model.search("", filters=[IndexFilter(field="category", value="animate", operator=IndexFilterOperator.EQUALS)]) + """ + from aixplain.factories import FileFactory + + uri, value_type = "", "text" + storage_type = FileFactory.check_storage_type(query) + if storage_type in [StorageType.FILE, StorageType.URL]: + uri = FileFactory.to_link(query) + query = "" + value_type = "image" + + data = { + "action": "search", + "data": query or uri, + "dataType": value_type, + "filters": [filter.to_dict() for filter in filters], + "payload": {"uri": uri, "value_type": value_type, "top_k": top_k}, + } return self.run(data=data) def upsert(self, documents: List[Record]) -> ModelResponse: + """Upsert documents into the index + + Args: + documents (List[Record]): List of documents to be upserted + + Returns: + ModelResponse: Response from the indexing service + + Example: + index_model.upsert([Record(value="Hello, world!", value_type="text", uri="", id="1", attributes={})]) + """ + # Validate documents + for doc in documents: + doc.validate() + # Convert documents to payloads payloads = [doc.to_dict() for doc in documents] - data = {"action": "ingest", "data": "", "payload": {"payloads": payloads}} + # Build payload + data = {"action": "ingest", "data": payloads} + # Run the indexing service response = self.run(data=data) if response.status == ResponseStatus.SUCCESS: response.data = payloads diff --git a/aixplain/modules/model/record.py b/aixplain/modules/model/record.py index a3c57173..4cc958d8 100644 --- a/aixplain/modules/model/record.py +++ b/aixplain/modules/model/record.py @@ -1,9 +1,17 @@ +from aixplain.enums import DataType, StorageType from typing import Optional from uuid import uuid4 class Record: - def __init__(self, value: str, value_type: str = "text", id: Optional[str] = None, uri: str = "", attributes: dict = {}): + def __init__( + self, + value: str = "", + value_type: DataType = DataType.TEXT, + id: Optional[str] = None, + uri: str = "", + attributes: dict = {}, + ): self.value = value self.value_type = value_type self.id = id if id is not None else str(uuid4()) @@ -12,9 +20,30 @@ def __init__(self, value: str, value_type: str = "text", id: Optional[str] = Non def to_dict(self): return { - "value": self.value, - "value_type": self.value_type, - "id": self.id, + "data": self.value, + "dataType": str(self.value_type), + "document_id": self.id, "uri": self.uri, "attributes": self.attributes, } + + def validate(self): + """Validate the record""" + from aixplain.factories import FileFactory + from aixplain.modules.model.utils import is_supported_image_type + + assert self.value_type in [DataType.TEXT, DataType.IMAGE], "Index Upsert Error: Invalid value type" + if self.value_type == DataType.IMAGE: + assert self.uri is not None and self.uri != "", "Index Upsert Error: URI is required for image records" + else: + assert self.value is not None and self.value != "", "Index Upsert Error: Value is required for text records" + + storage_type = FileFactory.check_storage_type(self.uri) + + # Check if value is an image file or URL + if storage_type in [StorageType.FILE, StorageType.URL]: + if is_supported_image_type(self.uri): + self.value_type = DataType.IMAGE + self.uri = FileFactory.to_link(self.uri) if storage_type == StorageType.FILE else self.uri + else: + raise Exception(f"Index Upsert Error: Unsupported file type ({self.uri})") diff --git a/aixplain/modules/model/utils.py b/aixplain/modules/model/utils.py index 1c6de56e..7ba42f2d 100644 --- a/aixplain/modules/model/utils.py +++ b/aixplain/modules/model/utils.py @@ -344,3 +344,7 @@ def parse_code_decorated(code: Union[Text, Callable]) -> Tuple[Text, List, Text] os.remove(local_path) return code, inputs, description, name + + +def is_supported_image_type(value: str) -> bool: + return any(value.lower().endswith(ext) for ext in [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"]) diff --git a/aixplain/processes/data_onboarding/process_interval_files.py b/aixplain/processes/data_onboarding/process_interval_files.py deleted file mode 100644 index 576cd434..00000000 --- a/aixplain/processes/data_onboarding/process_interval_files.py +++ /dev/null @@ -1,190 +0,0 @@ -__author__ = "thiagocastroferreira" - -import json -import logging -import os -import pandas as pd -import tarfile - -from aixplain.enums.data_type import DataType -from aixplain.enums.file_type import FileType -from aixplain.enums.storage_type import StorageType -from aixplain.modules.content_interval import ( - ContentInterval, - AudioContentInterval, - ImageContentInterval, - TextContentInterval, - VideoContentInterval, -) -from aixplain.modules.file import File -from aixplain.modules.metadata import MetaData -from aixplain.utils.file_utils import upload_data -from pathlib import Path -from tqdm import tqdm -from typing import Any, Dict, List, Text, Tuple - - -def compress_folder(folder_path: str): - with tarfile.open(folder_path + ".tgz", "w:gz") as tar: - for name in os.listdir(folder_path): - tar.add(os.path.join(folder_path, name)) - return folder_path + ".tgz" - - -def process_interval(interval: Any, storage_type: StorageType, interval_folder: Text) -> List[Dict]: - """Process text files - - Args: - intervals (Any): content intervals to process the content - storage_type (StorageType): type of storage: URL, local path or textual content - - Returns: - List[Dict]: content interval - """ - if storage_type == StorageType.FILE: - # Check the size of file and assert a limit of 50 MB - assert ( - os.path.getsize(interval.content) <= 25000000 - ), f'Data Asset Onboarding Error: Local text file "{interval}" exceeds the size limit of 25 MB.' - fname = os.path.basename(interval) - new_path = os.path.join(audio_folder, fname) - if os.path.exists(new_path) is False: - shutil.copy2(audio_path, new_path) - return [interval.__dict__ for interval in intervals] - - -def validate_format(index: int, interval: Dict, metadata: MetaData) -> ContentInterval: - """Validate the interval format - - Args: - index (int): row index - interval (Dict): interval to be validated - metadata (MetaData): metadata - - Returns: - ContentInterval: _description_ - """ - if metadata.dtype == DataType.AUDIO_INTERVAL: - try: - if isinstance(interval, list): - interval = [AudioContentInterval(**interval_) for interval_ in interval] - else: - interval = [AudioContentInterval(**interval)] - except Exception as e: - message = f'Data Asset Onboarding Error: Audio Interval in row {index} of Column "{metadata.name}" is not following the format. Check the "AudioContentInterval" class for the correct format.' - logging.exception(message) - raise Exception(message) - elif metadata.dtype == DataType.IMAGE_INTERVAL: - try: - if isinstance(interval, list): - interval = [ImageContentInterval(**interval_) for interval_ in interval] - else: - interval = [ImageContentInterval(**interval)] - except Exception as e: - message = f'Data Asset Onboarding Error: Image Interval in row {index} of Column "{metadata.name}" is not following the format. Check the "ImageContentInterval" class for the correct format.' - logging.exception(message) - raise Exception(message) - elif metadata.dtype == DataType.TEXT_INTERVAL: - try: - if isinstance(interval, list): - interval = [TextContentInterval(**interval_) for interval_ in interval] - else: - interval = [TextContentInterval(**interval)] - except Exception as e: - message = f'Data Asset Onboarding Error: Text Interval in row {index} of Column "{metadata.name}" is not following the format. Check the "TextContentInterval" class for the correct format.' - logging.exception(message) - raise Exception(message) - elif metadata.dtype == DataType.VIDEO_INTERVAL: - try: - if isinstance(interval, list): - interval = [VideoContentInterval(**interval_) for interval_ in interval] - else: - interval = [VideoContentInterval(**interval)] - except Exception as e: - message = f'Data Asset Onboarding Error: Video Interval in row {index} of Column "{metadata.name}" is not following the format. Check the "VideoContentInterval" class for the correct format.' - logging.exception(message) - raise Exception(message) - return interval - - -def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 1000) -> Tuple[List[File], int, int]: - """Process a list of local interval files, compress and upload them to pre-signed URLs in S3 - - Explanation: - Each interval on "paths" is processed. If the interval content is in a public link or local file, it will be downloaded and added to an index CSV file. - The intervals are processed in batches such that at each "batch_size" texts, the index CSV file is uploaded into a pre-signed URL in s3 and reset. - - Args: - metadata (MetaData): meta data of the asset - paths (List): list of paths to local files - folder (Path): local folder to save compressed files before upload them to s3. - - Returns: - Tuple[List[File], int, int]: list of s3 links, data colum index and number of rows - """ - logging.debug(f'Data Asset Onboarding: Processing "{metadata.name}".') - interval_folder = Path(".") - if metadata.storage_type in [StorageType.FILE, StorageType.TEXT]: - interval_folder = Path(os.path.join(folder, "data")) - interval_folder.mkdir(exist_ok=True) - - idx = 0 - data_column_idx = -1 - files, batch = [], [] - for i in tqdm(range(len(paths)), desc=f' Data "{metadata.name}" onboarding progress', position=1, leave=False): - path = paths[i] - try: - dataframe = pd.read_csv(path) - except Exception as e: - message = f'Data Asset Onboarding Error: Local file "{path}" not found.' - logging.exception(message) - raise Exception(message) - - # process intervals - for j in tqdm(range(len(dataframe)), desc=" File onboarding progress", position=2, leave=False): - row = dataframe.iloc[j] - try: - interval = row[metadata.name] - except Exception as e: - message = f'Data Asset Onboarding Error: Column "{metadata.name}" not found in the local file {path}.' - logging.exception(message) - raise Exception(message) - - # interval = validate_format(index=j, interval=interval, metadata=metadata) - - try: - interval = process_interval(interval, metadata.storage_type) - batch.append(interval) - except Exception as e: - logging.exception(e) - raise Exception(e) - - idx += 1 - if ((idx) % batch_size) == 0: - batch_index = str(len(files) + 1).zfill(8) - file_name = f"{folder}/{metadata.name}-{batch_index}.csv.gz" - - df = pd.DataFrame({metadata.name: batch}) - start, end = idx - len(batch), idx - df["@INDEX"] = range(start, end) - df.to_csv(file_name, compression="gzip", index=False) - s3_link = upload_data(file_name, content_type="text/csv", content_encoding="gzip") - files.append(File(path=s3_link, extension=FileType.CSV, compression="gzip")) - # get data column index - data_column_idx = df.columns.to_list().index(metadata.name) - batch = [] - - if len(batch) > 0: - batch_index = str(len(files) + 1).zfill(8) - file_name = f"{folder}/{metadata.name}-{batch_index}.csv.gz" - - df = pd.DataFrame({metadata.name: batch}) - start, end = idx - len(batch), idx - df["@INDEX"] = range(start, end) - df.to_csv(file_name, compression="gzip", index=False) - s3_link = upload_data(file_name, content_type="text/csv", content_encoding="gzip") - files.append(File(path=s3_link, extension=FileType.CSV, compression="gzip")) - # get data column index - data_column_idx = df.columns.to_list().index(metadata.name) - batch = [] - return files, data_column_idx, idx diff --git a/aixplain/processes/data_onboarding/process_media_files.py b/aixplain/processes/data_onboarding/process_media_files.py index 62fd369a..1e007d85 100644 --- a/aixplain/processes/data_onboarding/process_media_files.py +++ b/aixplain/processes/data_onboarding/process_media_files.py @@ -17,7 +17,6 @@ from pathlib import Path from tqdm import tqdm from typing import List, Tuple -from urllib.parse import urlparse AUDIO_MAX_SIZE = 50000000 IMAGE_TEXT_MAX_SIZE = 25000000 @@ -76,7 +75,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> row = dataframe.iloc[j] try: media_path = row[metadata.name] - except Exception as e: + except Exception: message = f'Data Asset Onboarding Error: Column "{metadata.name}" not found in the local file "{path}".' logging.exception(message) raise Exception(message) @@ -129,13 +128,13 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> if metadata.start_column is not None or metadata.end_column is not None: assert ( metadata.dsubtype != DataSubtype.INTERVAL - ), f"Data Asset Onboarding Error: Interval data types can not be cropped. Remove start and end columns." + ), "Data Asset Onboarding Error: Interval data types can not be cropped. Remove start and end columns." # adding ranges to crop the media if it is the case if metadata.start_column is not None: try: start_intervals.append(row[metadata.start_column]) - except Exception as e: + except Exception: message = f'Data Asset Onboarding Error: Column "{metadata.start_column}" not found.' logging.exception(message) raise Exception(message) @@ -143,7 +142,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> if metadata.end_column is not None: try: end_intervals.append(row[metadata.end_column]) - except Exception as e: + except Exception: message = f'Data Asset Onboarding Error: Column "{metadata.end_column}" not found.' logging.exception(message) raise Exception(message) @@ -167,7 +166,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> # compress the folder compressed_folder = compress_folder(data_file_name) # upload zipped medias into s3 - s3_compressed_folder = upload_data(compressed_folder, content_type="application/x-tar") + s3_compressed_folder = upload_data(compressed_folder, content_type="application/x-tar", return_s3_link=True) # update index files pointing the s3 link df["@SOURCE"] = s3_compressed_folder # remove media folder @@ -200,7 +199,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> end_column_idx = df.columns.to_list().index(end_column) df.to_csv(index_file_name, compression="gzip", index=False) - s3_link = upload_data(index_file_name, content_type="text/csv", content_encoding="gzip") + s3_link = upload_data(index_file_name, content_type="text/csv", content_encoding="gzip", return_s3_link=True) files.append(File(path=s3_link, extension=FileType.CSV, compression="gzip")) # get data column index data_column_idx = df.columns.to_list().index(metadata.name) @@ -225,7 +224,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> # compress the folder compressed_folder = compress_folder(data_file_name) # upload zipped medias into s3 - s3_compressed_folder = upload_data(compressed_folder, content_type="application/x-tar") + s3_compressed_folder = upload_data(compressed_folder, content_type="application/x-tar", return_s3_link=True) # update index files pointing the s3 link df["@SOURCE"] = s3_compressed_folder # remove media folder @@ -258,7 +257,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 100) -> end_column_idx = df.columns.to_list().index(end_column) df.to_csv(index_file_name, compression="gzip", index=False) - s3_link = upload_data(index_file_name, content_type="text/csv", content_encoding="gzip") + s3_link = upload_data(index_file_name, content_type="text/csv", content_encoding="gzip", return_s3_link=True) files.append(File(path=s3_link, extension=FileType.CSV, compression="gzip")) # get data column index data_column_idx = df.columns.to_list().index(metadata.name) diff --git a/aixplain/processes/data_onboarding/process_text_files.py b/aixplain/processes/data_onboarding/process_text_files.py index 1ba7f47e..84df057f 100644 --- a/aixplain/processes/data_onboarding/process_text_files.py +++ b/aixplain/processes/data_onboarding/process_text_files.py @@ -12,7 +12,7 @@ from aixplain.utils.file_utils import upload_data from pathlib import Path from tqdm import tqdm -from typing import List, Optional, Text, Tuple +from typing import List, Text, Tuple def process_text(content: str, storage_type: StorageType) -> Text: @@ -69,7 +69,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 1000) - path = paths[i] try: dataframe = pd.read_csv(path) - except Exception as e: + except Exception: message = f'Data Asset Onboarding Error: Local file "{path}" not found.' logging.exception(message) raise Exception(message) @@ -79,7 +79,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 1000) - row = dataframe.iloc[j] try: text_path = row[metadata.name] - except Exception as e: + except Exception: message = f'Data Asset Onboarding Error: Column "{metadata.name}" not found in the local file {path}.' logging.exception(message) raise Exception(message) @@ -100,7 +100,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 1000) - start, end = idx - len(batch), idx df["@INDEX"] = range(start, end) df.to_csv(file_name, compression="gzip", index=False) - s3_link = upload_data(file_name, content_type="text/csv", content_encoding="gzip") + s3_link = upload_data(file_name, content_type="text/csv", content_encoding="gzip", return_s3_link=True) files.append(File(path=s3_link, extension=FileType.CSV, compression="gzip")) # get data column index data_column_idx = df.columns.to_list().index(metadata.name) @@ -114,7 +114,7 @@ def run(metadata: MetaData, paths: List, folder: Path, batch_size: int = 1000) - start, end = idx - len(batch), idx df["@INDEX"] = range(start, end) df.to_csv(file_name, compression="gzip", index=False) - s3_link = upload_data(file_name, content_type="text/csv", content_encoding="gzip") + s3_link = upload_data(file_name, content_type="text/csv", content_encoding="gzip", return_s3_link=True) files.append(File(path=s3_link, extension=FileType.CSV, compression="gzip")) # get data column index data_column_idx = df.columns.to_list().index(metadata.name) diff --git a/aixplain/utils/file_utils.py b/aixplain/utils/file_utils.py index b1e16cf0..58781dfb 100644 --- a/aixplain/utils/file_utils.py +++ b/aixplain/utils/file_utils.py @@ -92,6 +92,7 @@ def upload_data( content_type: Text = "text/csv", content_encoding: Optional[Text] = None, nattempts: int = 2, + return_s3_link: bool = True, ): """Upload files to S3 with pre-signed URLs @@ -103,6 +104,7 @@ def upload_data( content_type (Text, optional): Type of content. Defaults to "text/csv". content_encoding (Text, optional): Content encoding. Defaults to None. nattempts (int, optional): Number of attempts for diminish the risk of exceptions. Defaults to 2. + return_s3_link (bool, optional): If True, the function will return the s3 link instead of the presigned url. Defaults to False. Reference: https://python.plainenglish.io/upload-files-to-aws-s3-using-pre-signed-urls-in-python-d3c2fcab1b41 @@ -143,9 +145,11 @@ def upload_data( return upload_data(file_name, content_type, content_encoding, nattempts - 1) else: raise Exception("File Uploading Error: Failure on Uploading to S3.") - bucket_name = re.findall(r"https://(.*?).s3.amazonaws.com", presigned_url)[0] - s3_link = f"s3://{bucket_name}/{path}" - return s3_link + if return_s3_link: + bucket_name = re.findall(r"https://(.*?).s3.amazonaws.com", presigned_url)[0] + s3_link = f"s3://{bucket_name}/{path}" + return s3_link + return presigned_url except Exception: if nattempts > 0: return upload_data(file_name, content_type, content_encoding, nattempts - 1) diff --git a/tests/functional/model/run_model_test.py b/tests/functional/model/run_model_test.py index d3d0082f..a5d97ae3 100644 --- a/tests/functional/model/run_model_test.py +++ b/tests/functional/model/run_model_test.py @@ -1,7 +1,10 @@ __author__ = "thiagocastroferreira" +import pytest +import os +import requests -from aixplain.enums import Function +from aixplain.enums import Function, EmbeddingModel from aixplain.factories import ModelFactory from aixplain.modules import LLM from datetime import datetime, timedelta, timezone @@ -55,7 +58,15 @@ def test_run_async(): assert "teste" in response["data"].lower() -def test_index_model(): +@pytest.mark.parametrize( + "embedding_model", + [ + pytest.param(EmbeddingModel.SNOWFLAKE_ARCTIC_EMBED_M_LONG, id="Snowflake Arctic Embed M Long"), + pytest.param(EmbeddingModel.OPENAI_ADA002, id="OpenAI Ada 002"), + pytest.param(EmbeddingModel.SNOWFLAKE_ARCTIC_EMBED_L_V2_0, id="Snowflake Arctic Embed L v2.0"), + ], +) +def test_index_model(embedding_model): from uuid import uuid4 from aixplain.modules.model.record import Record from aixplain.factories import IndexFactory @@ -63,7 +74,7 @@ def test_index_model(): for index in IndexFactory.list()["results"]: index.delete() - index_model = IndexFactory.create(name=str(uuid4()), description=str(uuid4())) + index_model = IndexFactory.create(name=str(uuid4()), description=str(uuid4()), embedding_model=embedding_model) index_model.upsert([Record(value="Hello, world!", value_type="text", uri="", id="1", attributes={})]) response = index_model.search("Hello") assert str(response.status) == "SUCCESS" @@ -74,6 +85,41 @@ def test_index_model(): assert str(response.status) == "SUCCESS" assert "aixplain" in response.data.lower() assert index_model.count() == 1 + index_model.upsert([Record(value="The world is great", value_type="text", uri="", id="2", attributes={})]) + assert index_model.count() == 2 + index_model.delete() + + +@pytest.mark.parametrize( + "embedding_model", + [ + pytest.param(EmbeddingModel.SNOWFLAKE_ARCTIC_EMBED_M_LONG, id="Snowflake Arctic Embed M Long"), + pytest.param(EmbeddingModel.OPENAI_ADA002, id="OpenAI Ada 002"), + pytest.param(EmbeddingModel.SNOWFLAKE_ARCTIC_EMBED_L_V2_0, id="Snowflake Arctic Embed L v2.0"), + pytest.param(EmbeddingModel.JINA_CLIP_V2_MULTIMODAL, id="Jina Clip v2 Multimodal"), + ], +) +def test_index_model_with_filter(embedding_model): + from uuid import uuid4 + from aixplain.modules.model.record import Record + from aixplain.factories import IndexFactory + from aixplain.modules.model.index_model import IndexFilter, IndexFilterOperator + + for index in IndexFactory.list()["results"]: + index.delete() + + index_model = IndexFactory.create(name=str(uuid4()), description=str(uuid4()), embedding_model=embedding_model) + index_model.upsert([Record(value="Hello, aiXplain!", value_type="text", uri="", id="1", attributes={"category": "hello"})]) + index_model.upsert( + [Record(value="The world is great", value_type="text", uri="", id="2", attributes={"category": "world"})] + ) + assert index_model.count() == 2 + response = index_model.search( + "", filters=[IndexFilter(field="category", value="world", operator=IndexFilterOperator.EQUALS)] + ) + assert str(response.status) == "SUCCESS" + assert "world" in response.data.lower() + assert len(response.details) == 1 index_model.delete() @@ -94,3 +140,58 @@ def test_llm_run_with_file(): # Verify response assert response["status"] == "SUCCESS" assert "🤖" in response["data"], "Robot emoji should be present in the response" + + +def test_index_model_with_image(): + from aixplain.factories import IndexFactory + from aixplain.modules.model.record import Record + from uuid import uuid4 + + for index in IndexFactory.list()["results"]: + index.delete() + + index_model = IndexFactory.create( + name=f"Image Index {uuid4()}", description="Index for images", embedding_model=EmbeddingModel.JINA_CLIP_V2_MULTIMODAL + ) + + records = [] + # Building image + records.append( + Record( + uri="https://aixplain-platform-assets.s3.us-east-1.amazonaws.com/samples/building.png", + value_type="image", + attributes={}, + ) + ) + + # beach image + image_url = "https://aixplain-platform-assets.s3.us-east-1.amazonaws.com/samples/hurricane.jpeg" + response = requests.get(image_url) + if response.status_code == 200: + with open("hurricane.jpeg", "wb") as f: + f.write(response.content) + records.append(Record(uri="hurricane.jpeg", value_type="image", attributes={})) + + # people image + image_url = "https://aixplain-platform-assets.s3.us-east-1.amazonaws.com/samples/faces.jpeg" + records.append(Record(uri=image_url, value_type="image", attributes={})) + + records.append(Record(value="Hello, world!", value_type="text", uri="", attributes={})) + + index_model.upsert(records) + + response = index_model.search("beach") + assert str(response.status) == "SUCCESS" + second_record = response.details[1]["metadata"]["uri"] + assert "hurricane" in second_record.lower() + + response = index_model.search("people") + assert str(response.status) == "SUCCESS" + first_record = response.details[0]["data"] + assert "hello" in first_record.lower() + second_record = response.details[1]["metadata"]["uri"] + assert "faces" in second_record.lower() + + assert index_model.count() == 4 + index_model.delete() + os.remove("hurricane.jpeg") diff --git a/tests/unit/index_model_test.py b/tests/unit/index_model_test.py index dbf698cc..7349bc21 100644 --- a/tests/unit/index_model_test.py +++ b/tests/unit/index_model_test.py @@ -1,18 +1,19 @@ import requests_mock -from aixplain.enums import Function, ResponseStatus +from aixplain.enums import DataType, Function, ResponseStatus, StorageType, EmbeddingModel from aixplain.modules.model.record import Record from aixplain.modules.model.response import ModelResponse from aixplain.modules.model.index_model import IndexModel from aixplain.utils import config import logging - +import pytest data = {"data": "Model Index", "description": "This is a dummy collection for testing."} index_id = "id" execute_url = f"{config.MODELS_RUN_URL}/{index_id}".replace("/api/v1/execute", "/api/v2/execute") -def test_search_success(): +def test_text_search_success(mocker): + mocker.patch("aixplain.factories.FileFactory.check_storage_type", return_value=StorageType.TEXT) mock_response = {"status": "SUCCESS"} with requests_mock.Mocker() as mock: @@ -24,7 +25,30 @@ def test_search_success(): assert response.status == ResponseStatus.SUCCESS -def test_add_success(): +def test_image_search_success(mocker): + mocker.patch("aixplain.factories.FileFactory.check_storage_type", return_value=StorageType.FILE) + mocker.patch("aixplain.modules.model.utils.is_supported_image_type", return_value=True) + mocker.patch("aixplain.factories.FileFactory.to_link", return_value="https://example.com/test.jpg") + + mock_response = {"status": "SUCCESS"} + + with requests_mock.Mocker() as mock: + mock.post(execute_url, json=mock_response, status_code=200) + index_model = IndexModel( + id=index_id, + data=data, + name="name", + function=Function.SEARCH, + embedding_model=EmbeddingModel.JINA_CLIP_V2_MULTIMODAL, + ) + response = index_model.search("test.jpg") + + assert isinstance(response, ModelResponse) + assert response.status == ResponseStatus.SUCCESS + + +def test_text_add_success(mocker): + mocker.patch("aixplain.factories.FileFactory.check_storage_type", side_effect=[StorageType.TEXT] * 4) mock_response = {"status": "SUCCESS"} mock_documents = [ @@ -43,7 +67,27 @@ def test_add_success(): assert response.status == ResponseStatus.SUCCESS -def test_update_success(): +def test_image_add_success(mocker): + mocker.patch("aixplain.factories.FileFactory.check_storage_type", side_effect=[StorageType.FILE] * 4) + mocker.patch("aixplain.modules.model.utils.is_supported_image_type", return_value=True) + mocker.patch("aixplain.factories.FileFactory.to_link", return_value="https://example.com/test.jpg") + mock_response = {"status": "SUCCESS"} + + mock_documents = [ + Record(uri="https://example.com/test.jpg", value_type="image", id=0, attributes={}), + ] + + with requests_mock.Mocker() as mock: + mock.post(execute_url, json=mock_response, status_code=200) + index_model = IndexModel(id=index_id, data=data, name="name", function=Function.SEARCH) + response = index_model.upsert(mock_documents) + + assert isinstance(response, ModelResponse) + assert response.status == ResponseStatus.SUCCESS + + +def test_text_update_success(mocker): + mocker.patch("aixplain.factories.FileFactory.check_storage_type", side_effect=[StorageType.TEXT] * 4) mock_response = {"status": "SUCCESS"} mock_documents = [ @@ -76,3 +120,66 @@ def test_count_success(): assert isinstance(response, int) assert response == 4 + + +def test_validate_record_success(mocker): + mocker.patch("aixplain.modules.model.utils.is_supported_image_type", return_value=True) + mocker.patch("aixplain.factories.FileFactory.check_storage_type", return_value=StorageType.FILE) + mocker.patch("aixplain.factories.FileFactory.to_link", return_value="https://example.com/test.jpg") + + record = Record(uri="test.jpg", value_type="image", id=0, attributes={}) + record.validate() + assert record.value_type == DataType.IMAGE + assert record.uri == "https://example.com/test.jpg" + assert record.value == "" + + +def test_validate_record_failure(mocker): + mocker.patch("aixplain.modules.model.utils.is_supported_image_type", return_value=False) + mocker.patch("aixplain.factories.FileFactory.check_storage_type", return_value=StorageType.FILE) + mocker.patch("aixplain.factories.FileFactory.to_link", return_value="https://example.com/test.jpg") + record = Record(uri="test.mov", value_type="video", id=0, attributes={}) + with pytest.raises(Exception) as e: + record.validate() + assert str(e.value) == "Index Upsert Error: Invalid value type" + + +def test_validate_record_failure_no_uri(mocker): + record = Record(value="test.jpg", value_type="image", id=0, uri="", attributes={}) + with pytest.raises(Exception) as e: + record.validate() + assert str(e.value) == "Index Upsert Error: URI is required for image records" + + +def test_validate_record_failure_no_value(mocker): + record = Record(uri="test.jpg", value_type="text", id=0, attributes={}) + with pytest.raises(Exception) as e: + record.validate() + assert str(e.value) == "Index Upsert Error: Value is required for text records" + + +def test_record_to_dict(): + record = Record(value="test", value_type=DataType.TEXT, id=0, uri="", attributes={}) + record_dict = record.to_dict() + assert record_dict["dataType"] == "text" + assert record_dict["uri"] == "" + assert record_dict["data"] == "test" + assert record_dict["document_id"] == 0 + assert record_dict["attributes"] == {} + + record = Record(value="test", value_type=DataType.IMAGE, id=0, uri="https://example.com/test.jpg", attributes={}) + record_dict = record.to_dict() + assert record_dict["dataType"] == "image" + assert record_dict["uri"] == "https://example.com/test.jpg" + assert record_dict["data"] == "test" + assert record_dict["document_id"] == 0 + assert record_dict["attributes"] == {} + + +def test_index_filter(): + from aixplain.modules.model.index_model import IndexFilter, IndexFilterOperator + + filter = IndexFilter(field="category", value="world", operator=IndexFilterOperator.EQUALS) + assert filter.field == "category" + assert filter.value == "world" + assert filter.operator == IndexFilterOperator.EQUALS